From 9b12ffa6d75ab843f0e90e7cba35b6316b1e9e58 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 11 Sep 2016 03:33:53 -0400 Subject: [PATCH 01/91] rework upnp discovery --- dashboard-ui/autoorganizetv.html | 3 --- .../emby-webcomponents/.bower.json | 8 +++--- .../emby-webcomponents/inputmanager.js | 6 +++++ .../metadataeditor/personeditor.js | 2 +- .../bower_components/polymer/.bower.json | 8 +++--- .../components/guestinviter/guestinviter.js | 7 +++--- dashboard-ui/connectlogin.html | 6 ++--- dashboard-ui/css/dashboard.css | 25 ------------------- dashboard-ui/notificationsettings.html | 4 +-- dashboard-ui/scripts/myprofile.js | 2 +- dashboard-ui/selectserver.html | 2 +- .../thirdparty/paper-button-style.css | 2 +- 12 files changed, 25 insertions(+), 50 deletions(-) diff --git a/dashboard-ui/autoorganizetv.html b/dashboard-ui/autoorganizetv.html index c7688684eb..2dad99fabe 100644 --- a/dashboard-ui/autoorganizetv.html +++ b/dashboard-ui/autoorganizetv.html @@ -6,7 +6,6 @@

${AutoOrganizeHelp}

-

${AutoOrganizeTvHelp}

-
-

diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index 3041ce57be..90c6a11469 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.236", - "_release": "1.4.236", + "version": "1.4.237", + "_release": "1.4.237", "_resolution": { "type": "version", - "tag": "1.4.236", - "commit": "d369818012719cb7fd38b052073428631937ae6f" + "tag": "1.4.237", + "commit": "41b1a7ea6d039a5e431ceb1295f7e50ba2e54c2c" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/dashboard-ui/bower_components/emby-webcomponents/inputmanager.js b/dashboard-ui/bower_components/emby-webcomponents/inputmanager.js index 07c8886e4e..076db957fe 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/inputmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/inputmanager.js @@ -153,6 +153,12 @@ define(['playbackManager', 'focusManager', 'embyRouter', 'dom'], function (playb case 'togglemute': playbackManager.toggleMute(); break; + case 'channelup': + playbackManager.nextTrack(); + break; + case 'channeldown': + playbackManager.previousTrack(); + break; case 'volumedown': playbackManager.volumeDown(); break; diff --git a/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/personeditor.js b/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/personeditor.js index 6bbfa24eea..9c35c107b5 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/personeditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/metadataeditor/personeditor.js @@ -20,7 +20,7 @@ if (layoutManager.tv) { dialogOptions.size = 'fullscreen'; } else { - dialogOptions.size = 'medium'; + dialogOptions.size = 'medium-tall'; } var dlg = dialogHelper.createDialog(dialogOptions); diff --git a/dashboard-ui/bower_components/polymer/.bower.json b/dashboard-ui/bower_components/polymer/.bower.json index bc60e6e941..25eb84c037 100644 --- a/dashboard-ui/bower_components/polymer/.bower.json +++ b/dashboard-ui/bower_components/polymer/.bower.json @@ -32,14 +32,14 @@ "iron-component-page": "polymerElements/iron-component-page#^1.1.6" }, "private": true, - "homepage": "https://github.com/Polymer/polymer", + "homepage": "https://github.com/polymer/polymer", "_release": "1.6.1", "_resolution": { "type": "version", "tag": "v1.6.1", "commit": "1f197d9d7874b1e5808b2a5c26f34446a7d912fc" }, - "_source": "git://github.com/Polymer/polymer.git", - "_target": "^1.2.0", - "_originalSource": "Polymer/polymer" + "_source": "git://github.com/polymer/polymer.git", + "_target": "^1.1.0", + "_originalSource": "polymer/polymer" } \ No newline at end of file diff --git a/dashboard-ui/components/guestinviter/guestinviter.js b/dashboard-ui/components/guestinviter/guestinviter.js index e12746667b..62417e1af8 100644 --- a/dashboard-ui/components/guestinviter/guestinviter.js +++ b/dashboard-ui/components/guestinviter/guestinviter.js @@ -1,10 +1,10 @@ -define(['dialogHelper', 'jQuery', 'emby-input', 'emby-button', 'emby-collapse', 'paper-checkbox', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper, $) { +define(['dialogHelper', 'jQuery', 'emby-input', 'emby-button', 'emby-collapse', 'emby-checkbox', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper, $) { function renderLibrarySharingList(context, result) { var folderHtml = ''; - folderHtml += '
'; + folderHtml += '
'; folderHtml += result.Items.map(function (i) { @@ -13,8 +13,7 @@ var isChecked = true; var checkedHtml = isChecked ? ' checked="checked"' : ''; - currentHtml += '' + i.Name + ''; - + currentHtml += ''; return currentHtml; }).join(''); diff --git a/dashboard-ui/connectlogin.html b/dashboard-ui/connectlogin.html index 0f38ccff26..f8aee7f4ab 100644 --- a/dashboard-ui/connectlogin.html +++ b/dashboard-ui/connectlogin.html @@ -61,11 +61,11 @@

- - @@ -98,7 +98,7 @@ - diff --git a/dashboard-ui/css/dashboard.css b/dashboard-ui/css/dashboard.css index 66f8229ba8..905657be57 100644 --- a/dashboard-ui/css/dashboard.css +++ b/dashboard-ui/css/dashboard.css @@ -146,26 +146,6 @@ } } -paper-checkbox #checkboxContainer { - width: 22px !important; - height: 22px !important; -} - -paper-checkbox paper-ripple { - top: -13px !important; - left: -13px !important; -} - -paper-checkbox #checkmark { - border-right-width: 4px !important; - border-bottom-width: 4px !important; -} - -.paperCheckboxList paper-checkbox { - display: block; - padding: .5em 0; -} - .paperListLabel { font-size: 16px; margin-bottom: .5em; @@ -175,11 +155,6 @@ paper-checkbox #checkmark { font-family: monospace !important; } -.ui-body-a paper-checkbox #checkbox.checked.paper-checkbox { - background-color: #52B54B; - border-color: #52B54B; -} - .paperList { padding: .5em 0; margin: 12px auto; diff --git a/dashboard-ui/notificationsettings.html b/dashboard-ui/notificationsettings.html index 9260adcf89..f87b411af7 100644 --- a/dashboard-ui/notificationsettings.html +++ b/dashboard-ui/notificationsettings.html @@ -4,10 +4,8 @@
-

${HeaderNotificationList}

-

${HeaderSendNotificationHelp}

-
+
diff --git a/dashboard-ui/scripts/myprofile.js b/dashboard-ui/scripts/myprofile.js index 31b30e6078..1643e57cbb 100644 --- a/dashboard-ui/scripts/myprofile.js +++ b/dashboard-ui/scripts/myprofile.js @@ -19,6 +19,7 @@ var imageUrl; + var fldImage = page.querySelector('#fldImage'); if (user.PrimaryImageTag) { imageUrl = ApiClient.getUserImageUrl(user.Id, { @@ -31,7 +32,6 @@ imageUrl = "css/images/logindefault.png"; } - var fldImage = page.querySelector('#fldImage'); fldImage.classList.remove('hide'); fldImage.innerHTML = ""; diff --git a/dashboard-ui/selectserver.html b/dashboard-ui/selectserver.html index c938edfaf1..92811a2c1c 100644 --- a/dashboard-ui/selectserver.html +++ b/dashboard-ui/selectserver.html @@ -7,7 +7,7 @@

${HeaderSelectServer}

- diff --git a/dashboard-ui/thirdparty/paper-button-style.css b/dashboard-ui/thirdparty/paper-button-style.css index be7cbb2b44..0c22a4df0b 100644 --- a/dashboard-ui/thirdparty/paper-button-style.css +++ b/dashboard-ui/thirdparty/paper-button-style.css @@ -92,7 +92,7 @@ div.dialogHeader { } .ui-body-a div.formDialogFooter { - background-color: #fff; + background-color: #f0f0f0; border-top: 1px solid #ddd; color: inherit; } From 13096410b08df6ff4a59e47b0fcf87fc30d7138c Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 11 Sep 2016 11:30:04 -0400 Subject: [PATCH 02/91] reduce use of paper-checkbox --- dashboard-ui/dashboard/librarysettings.js | 2 +- dashboard-ui/librarysettings.html | 58 +++++++++++++++-------- dashboard-ui/scripts/site.js | 2 +- 3 files changed, 39 insertions(+), 23 deletions(-) diff --git a/dashboard-ui/dashboard/librarysettings.js b/dashboard-ui/dashboard/librarysettings.js index bcff55a11c..97e880457a 100644 --- a/dashboard-ui/dashboard/librarysettings.js +++ b/dashboard-ui/dashboard/librarysettings.js @@ -1,4 +1,4 @@ -define(['jQuery'], function ($) { +define(['jQuery', 'fnchecked', 'emby-checkbox'], function ($) { function loadPage(page, config) { diff --git a/dashboard-ui/librarysettings.html b/dashboard-ui/librarysettings.html index b4d6b85d0f..3bce2020ca 100644 --- a/dashboard-ui/librarysettings.html +++ b/dashboard-ui/librarysettings.html @@ -20,34 +20,50 @@
${LabelMetadataPathHelp}
-
- ${OptionSaveMetadataAsHidden} -
${OptionSaveMetadataAsHiddenHelp}
-
+
+ +
${OptionSaveMetadataAsHiddenHelp}
-

-
${HeaderDownloadPeopleMetadataFor}
-
- ${OptionActors} - - ${OptionComposers} - - ${OptionDirectors} - - ${OptionGuestStars} - - ${OptionProducers} - - ${OptionWriters} - - ${OptionOthers} +

${HeaderDownloadPeopleMetadataFor}

+
+ + + + + + +
-
${HeaderDownloadPeopleMetadataForHelp}
+
${HeaderDownloadPeopleMetadataForHelp}
diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 01b30b4514..c32d23fbc9 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -2121,7 +2121,7 @@ var AppInfo = {}; defineRoute({ path: '/librarysettings.html', - dependencies: ['emby-collapse', 'emby-input', 'paper-checkbox', 'emby-button', 'emby-select'], + dependencies: ['emby-collapse', 'emby-input', 'emby-button', 'emby-select'], autoFocus: false, roles: 'admin', controller: 'dashboard/librarysettings' From 7a2ba6f1319e124cbaa5a548ab22475e98b904dc Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 11 Sep 2016 13:09:10 -0400 Subject: [PATCH 03/91] move download images in advance option from global to per library --- .../libraryoptionseditor/libraryoptionseditor.js | 12 ++++++++++-- .../libraryoptionseditor.template.html | 8 ++++++++ dashboard-ui/metadata.html | 7 ------- dashboard-ui/scripts/metadataconfigurationpage.js | 2 -- dashboard-ui/strings/en-US.json | 4 ++-- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.js b/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.js index 0c34e9452d..058cef342f 100644 --- a/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.js +++ b/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.js @@ -33,12 +33,18 @@ parent.querySelector('.chkArhiveAsMediaContainer').classList.add('hide'); } - if (contentType == 'homevideos') { + if (contentType == 'homevideos' || contentType == 'photos') { parent.querySelector('.chkEnablePhotosContainer').classList.remove('hide'); } else { parent.querySelector('.chkEnablePhotosContainer').classList.add('hide'); } + if (contentType == 'homevideos') { + parent.querySelector('.chkDownloadImagesInAdvanceContainer').classList.add('hide'); + } else { + parent.querySelector('.chkDownloadImagesInAdvanceContainer').classList.remove('hide'); + } + if (contentType == 'tvshows' || contentType == 'movies' || contentType == 'homevideos' || contentType == 'musicvideos' || contentType == 'mixed' || !contentType) { parent.querySelector('.fldExtractChaptersDuringLibraryScan').classList.remove('hide'); parent.querySelector('.fldExtractChapterImages').classList.remove('hide'); @@ -55,7 +61,8 @@ EnablePhotos: parent.querySelector('.chkEnablePhotos').checked, EnableRealtimeMonitor: parent.querySelector('.chkEnableRealtimeMonitor').checked, ExtractChapterImagesDuringLibraryScan: parent.querySelector('.chkExtractChaptersDuringLibraryScan').checked, - EnableChapterImageExtraction: parent.querySelector('.chkExtractChapterImages').checked + EnableChapterImageExtraction: parent.querySelector('.chkExtractChapterImages').checked, + DownloadImagesInAdvance: parent.querySelector('#chkDownloadImagesInAdvance').checked }; return options; @@ -68,6 +75,7 @@ parent.querySelector('.chkEnableRealtimeMonitor').checked = options.EnableRealtimeMonitor; parent.querySelector('.chkExtractChaptersDuringLibraryScan').checked = options.ExtractChapterImagesDuringLibraryScan; parent.querySelector('.chkExtractChapterImages').checked = options.EnableChapterImageExtraction; + parent.querySelector('#chkDownloadImagesInAdvance').checked = options.DownloadImagesInAdvance; } return { diff --git a/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.template.html b/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.template.html index 4de83a3589..1f0dc400df 100644 --- a/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.template.html +++ b/dashboard-ui/components/libraryoptionseditor/libraryoptionseditor.template.html @@ -14,6 +14,14 @@
${LabelEnableRealtimeMonitorHelp}
+
+ +
${OptionDownloadImagesInAdvanceHelp}
+
+
${LabelSaveLocalMetadataHelp}
-
- -
${OptionDownloadImagesInAdvanceHelp}
-
diff --git a/dashboard-ui/scripts/metadataconfigurationpage.js b/dashboard-ui/scripts/metadataconfigurationpage.js index d8ecdd8450..f405fa42f7 100644 --- a/dashboard-ui/scripts/metadataconfigurationpage.js +++ b/dashboard-ui/scripts/metadataconfigurationpage.js @@ -9,7 +9,6 @@ page.querySelector('#chkSaveLocal').checked = config.SaveLocalMeta; $('#selectLanguage', page).val(config.PreferredMetadataLanguage); $('#selectCountry', page).val(config.MetadataCountryCode); - $('#chkDownloadImagesInAdvance', page).checked(config.DownloadImagesInAdvance); Dashboard.hideLoadingMsg(); } @@ -25,7 +24,6 @@ config.SaveLocalMeta = form.querySelector('#chkSaveLocal').checked; config.PreferredMetadataLanguage = $('#selectLanguage', form).val(); config.MetadataCountryCode = $('#selectCountry', form).val(); - config.DownloadImagesInAdvance = $('#chkDownloadImagesInAdvance', form).checked(); ApiClient.updateServerConfiguration(config).then(function() { Dashboard.processServerConfigurationUpdateResult(); diff --git a/dashboard-ui/strings/en-US.json b/dashboard-ui/strings/en-US.json index 9af2328772..da1a45c932 100644 --- a/dashboard-ui/strings/en-US.json +++ b/dashboard-ui/strings/en-US.json @@ -1342,9 +1342,9 @@ "FileExtension": "File extension", "OptionReplaceExistingImages": "Replace existing images", "OptionPlayNextEpisodeAutomatically": "Play next episode automatically", - "OptionDownloadImagesInAdvance": "Download all images in advance", + "OptionDownloadImagesInAdvance": "Download images in advance", "SettingsSaved": "Settings saved.", - "OptionDownloadImagesInAdvanceHelp": "By default, most secondary images are only downloaded when requested by an Emby app. Enable this option to download all images in advance, as new media is imported.", + "OptionDownloadImagesInAdvanceHelp": "By default, most images are only downloaded when requested by an Emby app. Enable this option to download all images in advance, as new media is imported.", "Users": "Users", "Delete": "Delete", "Password": "Password", From 47e35cc5dcf1e56b0ba794d7282af4890e0b2516 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 11 Sep 2016 17:02:32 -0400 Subject: [PATCH 04/91] reduce uses of paper-checkbox --- .../emby-webcomponents/prompt/prompt.js | 4 +- .../components/channelmapper/channelmapper.js | 2 +- .../components/guestinviter/connectlink.js | 2 +- dashboard-ui/components/viewcontainer-lite.js | 2 +- dashboard-ui/dashboard/dashboardhosting.js | 2 +- dashboard-ui/dashboard/devicesupload.js | 2 +- dashboard-ui/dashboardhosting.html | 24 +- dashboard-ui/devicesupload.html | 17 +- dashboard-ui/dlnaprofile.html | 2 +- dashboard-ui/dlnasettings.html | 66 ++-- dashboard-ui/legacy/fnchecked.js | 4 + .../livetvtunerprovider-hdhomerun.html | 40 +- dashboard-ui/plugincatalog.html | 11 +- dashboard-ui/reports.html | 2 +- dashboard-ui/scripts/dlnaprofile.js | 20 +- dashboard-ui/scripts/dlnasettings.js | 2 +- dashboard-ui/scripts/reports.js | 44 +-- dashboard-ui/scripts/site.js | 5 +- dashboard-ui/strings/en-US.json | 2 +- .../jquerymobile-1.4.5/jqm.checkbox.css | 52 --- .../jquerymobile-1.4.5/jqm.checkbox.js | 360 ------------------ 21 files changed, 141 insertions(+), 524 deletions(-) delete mode 100644 dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.checkbox.css delete mode 100644 dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.checkbox.js diff --git a/dashboard-ui/bower_components/emby-webcomponents/prompt/prompt.js b/dashboard-ui/bower_components/emby-webcomponents/prompt/prompt.js index abdb383a6d..089a2af351 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/prompt/prompt.js +++ b/dashboard-ui/bower_components/emby-webcomponents/prompt/prompt.js @@ -1,4 +1,4 @@ -define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function (dialogHelper, layoutManager, scrollHelper, globalize, require) { +define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function (dialogHelper, layoutManager, scrollHelper, globalize, dom, require) { function setInputProperties(dlg, options) { var txtInput = dlg.querySelector('#txtInput'); @@ -61,6 +61,8 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'require', return false; }); + dlg.style.minWidth = (Math.min(400, dom.getWindowSize().innerWidth - 50)) + 'px'; + return dialogHelper.open(dlg).then(function () { if (layoutManager.tv) { diff --git a/dashboard-ui/components/channelmapper/channelmapper.js b/dashboard-ui/components/channelmapper/channelmapper.js index 2a6ab5e43a..da3c83b8a6 100644 --- a/dashboard-ui/components/channelmapper/channelmapper.js +++ b/dashboard-ui/components/channelmapper/channelmapper.js @@ -1,4 +1,4 @@ -define(['dialogHelper', 'loading', 'connectionManager', 'globalize', 'actionsheet', 'paper-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-button', 'listViewStyle', 'material-icons', 'formDialogStyle'], +define(['dialogHelper', 'loading', 'connectionManager', 'globalize', 'actionsheet', 'emby-input', 'paper-icon-button-light', 'emby-button', 'listViewStyle', 'material-icons', 'formDialogStyle'], function (dialogHelper, loading, connectionManager, globalize, actionsheet) { return function (options) { diff --git a/dashboard-ui/components/guestinviter/connectlink.js b/dashboard-ui/components/guestinviter/connectlink.js index b88c2ac634..2208392fd3 100644 --- a/dashboard-ui/components/guestinviter/connectlink.js +++ b/dashboard-ui/components/guestinviter/connectlink.js @@ -1,4 +1,4 @@ -define(['dialogHelper', 'jQuery', 'emby-input', 'emby-button', 'emby-collapse', 'paper-checkbox', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper, $) { +define(['dialogHelper', 'jQuery', 'emby-input', 'emby-button', 'emby-collapse', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper, $) { function updateUserInfo(user, newConnectUsername, actionCallback, noActionCallback) { var currentConnectUsername = user.ConnectUserName || ''; diff --git a/dashboard-ui/components/viewcontainer-lite.js b/dashboard-ui/components/viewcontainer-lite.js index 37c36a5fe8..a9b60ce15a 100644 --- a/dashboard-ui/components/viewcontainer-lite.js +++ b/dashboard-ui/components/viewcontainer-lite.js @@ -46,11 +46,11 @@ define(['browser'], function (browser) { if (isPluginpage) { dependencies.push('jqmpopup'); dependencies.push('jqmcollapsible'); - dependencies.push('jqmcheckbox'); dependencies.push('legacy/dashboard'); dependencies.push('legacy/selectmenu'); dependencies.push('jqmcontrolgroup'); dependencies.push('jqmlistview'); + dependencies.push('fnchecked'); } if (isPluginpage || (newView.classList && newView.classList.contains('type-interior'))) { diff --git a/dashboard-ui/dashboard/dashboardhosting.js b/dashboard-ui/dashboard/dashboardhosting.js index b2d9450590..2dce166c73 100644 --- a/dashboard-ui/dashboard/dashboardhosting.js +++ b/dashboard-ui/dashboard/dashboardhosting.js @@ -1,4 +1,4 @@ -define(['jQuery'], function ($) { +define(['jQuery', 'fnchecked', 'emby-checkbox'], function ($) { function onSubmit() { var form = this; diff --git a/dashboard-ui/dashboard/devicesupload.js b/dashboard-ui/dashboard/devicesupload.js index 02f27edbc8..1d3ebb2e5d 100644 --- a/dashboard-ui/dashboard/devicesupload.js +++ b/dashboard-ui/dashboard/devicesupload.js @@ -1,4 +1,4 @@ -define(['jQuery'], function ($) { +define(['jQuery', 'fnchecked'], function ($) { function load(page, config) { diff --git a/dashboard-ui/dashboardhosting.html b/dashboard-ui/dashboardhosting.html index bb6fbb74d3..0d96c90696 100644 --- a/dashboard-ui/dashboardhosting.html +++ b/dashboard-ui/dashboardhosting.html @@ -41,19 +41,25 @@
${LabelExternalDDNSHelp}
-
- ${LabelEnableHttps} -
${LabelEnableHttpsHelp}
+
+ +
${LabelEnableHttpsHelp}
-
-
- ${LabelEnableAutomaticPortMap} -
${LabelEnableAutomaticPortMapHelp}
+
+ +
${LabelEnableAutomaticPortMapHelp}

-
- +
diff --git a/dashboard-ui/devicesupload.html b/dashboard-ui/devicesupload.html index df4c89b3f1..0974a86171 100644 --- a/dashboard-ui/devicesupload.html +++ b/dashboard-ui/devicesupload.html @@ -1,4 +1,4 @@ -
+
@@ -16,15 +16,18 @@
${LabelCameraUploadPathHelp}
-
-
- ${LabelCreateCameraUploadSubfolder} -
${LabelCreateCameraUploadSubfolderHelp}
+
+ +
${LabelCreateCameraUploadSubfolderHelp}

-
- +
diff --git a/dashboard-ui/dlnaprofile.html b/dashboard-ui/dlnaprofile.html index 073026ea2e..f25a247bbc 100644 --- a/dashboard-ui/dlnaprofile.html +++ b/dashboard-ui/dlnaprofile.html @@ -1,4 +1,4 @@ -
+
diff --git a/dashboard-ui/dlnasettings.html b/dashboard-ui/dlnasettings.html index 2f47fbddfc..a5e6397e01 100644 --- a/dashboard-ui/dlnasettings.html +++ b/dashboard-ui/dlnasettings.html @@ -1,57 +1,65 @@ -
+
-
- ${LabelEnableDlnaPlayTo} -
${LabelEnableDlnaPlayToHelp}
+
+ +
${LabelEnableDlnaPlayToHelp}
-
-
-
- ${LabelEnableDlnaDebugLogging} -
${LabelEnableDlnaDebugLoggingHelp}
+ +
+ +
${LabelEnableDlnaDebugLoggingHelp}
-
-
+
${LabelEnableDlnaClientDiscoveryIntervalHelp}
-
-
- ${LabelEnableDlnaServer} -
${LabelEnableDlnaServerHelp}
+ +
+ +
${LabelEnableDlnaServerHelp}
-
-
- ${LabelEnableBlastAliveMessages} -
${LabelEnableBlastAliveMessagesHelp}
+ +
+ +
${LabelEnableBlastAliveMessagesHelp}
-
-
+
${LabelBlastMessageIntervalHelp}
-
${LabelDefaultUserHelp}
-
-
- ${LabelEnableEnhancedMovies} -
${LabelEnableEnhancedMoviesHelp}
+
+ +
${LabelEnableEnhancedMoviesHelp}
-
-
diff --git a/dashboard-ui/legacy/fnchecked.js b/dashboard-ui/legacy/fnchecked.js index f4e61982d2..1005d73c61 100644 --- a/dashboard-ui/legacy/fnchecked.js +++ b/dashboard-ui/legacy/fnchecked.js @@ -12,4 +12,8 @@ return this.length && this[0].checked; } }; + + $.fn.checkboxradio = function () { + return this; + }; }); \ No newline at end of file diff --git a/dashboard-ui/livetvtunerprovider-hdhomerun.html b/dashboard-ui/livetvtunerprovider-hdhomerun.html index 9955f26a86..94fbc2e04b 100644 --- a/dashboard-ui/livetvtunerprovider-hdhomerun.html +++ b/dashboard-ui/livetvtunerprovider-hdhomerun.html @@ -1,4 +1,4 @@ -
+
@@ -9,26 +9,36 @@
-
- ${LabelEnableThisTuner} -
${LabelEnableThisTunerHelp}
+
+ +
${LabelEnableThisTunerHelp}
-
-
- ${LabelImportOnlyFavoriteChannels} -
${ImportFavoriteChannelsHelp}
+
+ +
${ImportFavoriteChannelsHelp}
-
-
- ${LabelAllowHWTranscoding} -
${AllowHWTranscodingHelp}
+
+ +
${AllowHWTranscodingHelp}
-

${DrmChannelsNotImported}


- - + +
diff --git a/dashboard-ui/plugincatalog.html b/dashboard-ui/plugincatalog.html index bd55ad8182..7eaca14f69 100644 --- a/dashboard-ui/plugincatalog.html +++ b/dashboard-ui/plugincatalog.html @@ -1,15 +1,14 @@ -
+
-
-
- -
-
+
@@ -41,7 +43,9 @@

- +


@@ -53,7 +57,9 @@
${LabelSupporterEmailAddress}

- +

@@ -78,7 +84,9 @@

- +

From bbb9e890630ed7f6b2b1c36487342a0cf3e52910 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 16 Sep 2016 02:32:40 -0400 Subject: [PATCH 20/91] update datetime --- .../emby-webcomponents/.bower.json | 8 +-- .../browserdeviceprofile.js | 2 +- .../cardbuilder/cardbuilder.js | 29 ++-------- .../emby-webcomponents/datetime.js | 53 +++++-------------- .../emby-checkbox/emby-checkbox.css | 19 +++++-- .../emby-webcomponents/formdialog.css | 2 +- .../emby-webcomponents/guide/guide.js | 9 +--- .../emby-webcomponents/mediainfo/mediainfo.js | 2 +- .../recordingcreator/recordingcreator.js | 19 ++----- .../recordingcreator.template.html | 16 +++--- .../emby-webcomponents/strings/en-US.json | 7 +-- .../subtitleeditor.template.html | 4 +- 12 files changed, 57 insertions(+), 113 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index d35324c496..999858ca61 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.248", - "_release": "1.4.248", + "version": "1.4.250", + "_release": "1.4.250", "_resolution": { "type": "version", - "tag": "1.4.248", - "commit": "099ebb1e4d7df48d6dbf182985a565b83b17cea7" + "tag": "1.4.250", + "commit": "64a7a8d4d23fff00807f047f1019e27886b2a928" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js index 770871b274..855dffddae 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js +++ b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js @@ -199,7 +199,7 @@ define(['browser'], function (browser) { function getMaxBitrate() { if (browser.edgeUwp) { - return 20000000; + return 22000000; } // 10mbps diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js index 2bea7eb583..ac2e9edc10 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js +++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js @@ -233,7 +233,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo if (item.PremiereDate) { try { - newIndexValue = getDisplayDateText(datetime.parseISO8601Date(item.PremiereDate)); + newIndexValue = datetime.toLocaleDateString(datetime.parseISO8601Date(item.PremiereDate), { weekday: 'long', month: 'long', day: 'numeric' }); } catch (err) { } @@ -408,27 +408,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo return html; } - function getDisplayDateText(date) { - - var weekday = []; - weekday[0] = globalize.translate('sharedcomponents#Sunday'); - weekday[1] = globalize.translate('sharedcomponents#Monday'); - weekday[2] = globalize.translate('sharedcomponents#Tuesday'); - weekday[3] = globalize.translate('sharedcomponents#Wednesday'); - weekday[4] = globalize.translate('sharedcomponents#Thursday'); - weekday[5] = globalize.translate('sharedcomponents#Friday'); - weekday[6] = globalize.translate('sharedcomponents#Saturday'); - - var day = weekday[date.getDay()]; - date = date.toLocaleDateString(); - - if (date.toLowerCase().indexOf(day.toLowerCase()) == -1) { - return day + " " + date; - } - - return date; - } - function getDesiredAspect(shape) { if (shape) { @@ -818,9 +797,9 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo try { var date = datetime.parseISO8601Date(item.StartDate); - airTimeText = date.toLocaleDateString(); + airTimeText = datetime.toLocaleDateString(date, { weekday: 'short', month: 'short', day: 'numeric' }); - airTimeText += ', ' + datetime.getDisplayTime(date); + airTimeText += ' ' + datetime.getDisplayTime(date); if (item.EndDate) { date = datetime.parseISO8601Date(item.EndDate); @@ -861,7 +840,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo var text; if (item.StartDate) { var startDate = datetime.parseISO8601Date(item.StartDate, true); - text = datetime.toLocaleDateString(startDate) + ', ' + datetime.getDisplayTime(startDate); + text = datetime.toLocaleDateString(startDate, { weekday: 'short', month: 'short', day: 'numeric' }) + ' ' + datetime.getDisplayTime(startDate); } else { text = ''; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/datetime.js b/dashboard-ui/bower_components/emby-webcomponents/datetime.js index 0a61ecfe34..52f9038e3a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/datetime.js +++ b/dashboard-ui/bower_components/emby-webcomponents/datetime.js @@ -109,59 +109,29 @@ return locale; } - function toLocaleString(date) { + function toLocaleString(date, options) { var currentLocale = getCurrentLocale(); return currentLocale && toLocaleTimeStringSupportsLocales ? - date.toLocaleString(currentLocale) : + date.toLocaleString(currentLocale, options || {}) : date.toLocaleString(); } - function getLocaleDateStringParts(date) { - - var day = getDayName(date); - date = toLocaleDateString(date); - - var parts = []; - - if (date.toLowerCase().indexOf(day.toLowerCase()) == -1) { - parts.push(day); - } - - parts.push(date); - - return parts; - } - - function getDayName(date) { - - var weekday = []; - weekday[0] = globalize.translate('sharedcomponents#Sunday'); - weekday[1] = globalize.translate('sharedcomponents#Monday'); - weekday[2] = globalize.translate('sharedcomponents#Tuesday'); - weekday[3] = globalize.translate('sharedcomponents#Wednesday'); - weekday[4] = globalize.translate('sharedcomponents#Thursday'); - weekday[5] = globalize.translate('sharedcomponents#Friday'); - weekday[6] = globalize.translate('sharedcomponents#Saturday'); - - return weekday[date.getDay()]; - } - - function toLocaleDateString(date) { + function toLocaleDateString(date, options) { var currentLocale = getCurrentLocale(); return currentLocale && toLocaleTimeStringSupportsLocales ? - date.toLocaleDateString(currentLocale) : + date.toLocaleDateString(currentLocale, options || {}) : date.toLocaleDateString(); } - function toLocaleTimeString(date) { + function toLocaleTimeString(date, options) { var currentLocale = getCurrentLocale(); return currentLocale && toLocaleTimeStringSupportsLocales ? - date.toLocaleTimeString(currentLocale) : + date.toLocaleTimeString(currentLocale, options || {}) : date.toLocaleTimeString(); } @@ -194,7 +164,13 @@ if (minutes < 10) { minutes = '0' + minutes; } - time = hour + ':' + minutes + suffix; + + if (minutes == '00') { + minutes = ''; + } else { + minutes = ':' + minutes; + } + time = hour + minutes + suffix; } else { var timeParts = time.split(':'); @@ -224,7 +200,6 @@ toLocaleDateString: toLocaleDateString, toLocaleString: toLocaleString, getDisplayTime: getDisplayTime, - isRelativeDay: isRelativeDay, - getLocaleDateStringParts: getLocaleDateStringParts + isRelativeDay: isRelativeDay }; }); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-checkbox/emby-checkbox.css b/dashboard-ui/bower_components/emby-webcomponents/emby-checkbox/emby-checkbox.css index 5ec9a2be18..eeee0573a6 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-checkbox/emby-checkbox.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-checkbox/emby-checkbox.css @@ -2,7 +2,7 @@ position: relative; z-index: 1; vertical-align: middle; - display: inline-flex; + display: inline-block; box-sizing: border-box; width: 100%; margin: 0; @@ -18,7 +18,18 @@ .checkboxContainer { margin-bottom: 1.8em; - display: flex; + display: block; +} + +@supports (display: flex) { + + .mdl-checkbox { + display: inline-flex; + } + + .checkboxContainer { + display: flex; + } } .checkboxContainer-withDescription { @@ -113,7 +124,7 @@ cursor: auto; } -.checkboxList .mdl-checkbox { +.checkboxList > .mdl-checkbox { display: flex; margin: .5em 0; } @@ -124,4 +135,4 @@ .checkboxListLabel { opacity: .7; -} \ No newline at end of file +} diff --git a/dashboard-ui/bower_components/emby-webcomponents/formdialog.css b/dashboard-ui/bower_components/emby-webcomponents/formdialog.css index ca95cd7e6b..cae3b85055 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/formdialog.css +++ b/dashboard-ui/bower_components/emby-webcomponents/formdialog.css @@ -49,7 +49,7 @@ left: 0; right: 0; display: flex; - padding: 1.25em; + padding: 1.25em 1em; /* Without this emby-checkbox is able to appear on top */ z-index: 1; align-items: center; diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js index 2969522208..b0bfd2b63e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js +++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js @@ -639,13 +639,8 @@ reloadGuide(page, newStartDate); - var dateText = datetime.getLocaleDateStringParts(date); + var dateText = datetime.toLocaleDateString(date, { weekday: 'short', month: 'short', day: 'numeric' }); - if (dateText.length == 1) { - dateText = dateText[0]; - } else { - dateText = '
' + dateText[0] + '
' + dateText[1] + '
'; - } page.querySelector('.guideDateText').innerHTML = dateText; } @@ -673,7 +668,7 @@ while (start <= end) { dateOptions.push({ - name: datetime.getLocaleDateStringParts(start).join(' '), + name: datetime.toLocaleDateString(start, { weekday: 'long', month: 'long', day: 'numeric' }), id: start.getTime() }); diff --git a/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.js b/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.js index e2d80dbe58..af402f4112 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.js +++ b/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.js @@ -11,7 +11,7 @@ define(['datetime', 'globalize', 'embyRouter', 'itemHelper', 'material-icons', ' try { date = datetime.parseISO8601Date(item.StartDate); - text = datetime.toLocaleDateString(date); + text = datetime.toLocaleDateString(date, { weekday: 'short', month: 'short', day: 'numeric' }); text += ' ' + datetime.getDisplayTime(date); diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js index 62c048ecc1..b5f5d570c5 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js @@ -27,13 +27,6 @@ var apiClient = connectionManager.getApiClient(currentServerId); - apiClient.getNamedConfiguration("livetv").then(function (config) { - - config.EnableRecordingEncoding = form.querySelector('#chkConvertRecordings').checked; - - apiClient.updateNamedConfiguration("livetv", config); - }); - apiClient.getNewLiveTvTimerDefaults({ programId: currentProgramId }).then(function (item) { item.RecordNewOnly = form.querySelector('#chkNewOnly').checked; @@ -218,11 +211,6 @@ supporterButtons[i].classList.add('hide'); } } - - apiClient.getNamedConfiguration("livetv").then(function (config) { - - context.querySelector('#chkConvertRecordings').checked = config.EnableRecordingEncoding; - }); } function getImageUrl(item, apiClient, imageHeight) { @@ -293,7 +281,6 @@ context.querySelector('#eligibleForSeriesFields').classList.add('hide'); } - context.querySelector('.convertRecordingsContainer').classList.remove('hide'); showConvertRecordingsUnlockMessage(context, apiClient); loading.hide(); @@ -304,14 +291,14 @@ apiClient.getPluginSecurityInfo().then(function (regInfo) { if (regInfo.IsMBSupporter) { - context.querySelector('.btnSupporterForConverting').classList.add('hide'); + context.querySelector('.convertRecordingsContainer').classList.add('hide'); } else { - context.querySelector('.btnSupporterForConverting').classList.remove('hide'); + context.querySelector('.convertRecordingsContainer').classList.remove('hide'); } }, function () { - context.querySelector('.btnSupporterForConverting').classList.remove('hide'); + context.querySelector('.convertRecordingsContainer').classList.remove('hide'); }); } diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html index df93007593..6dc41232b0 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html @@ -43,15 +43,13 @@

-
- -
${OptionConvertRecordingsToStreamingFormatHelp}
-
+
+

${HeaderConvertYourRecordings}

+
${PromoConvertRecordingsToStreamingFormat}
+
+

diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json index 098760ca22..4f05a0d237 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json @@ -46,9 +46,9 @@ "RecordOnlyNewEpisodes": "Record only new episodes", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "Save", "Edit": "Edit", @@ -284,5 +284,6 @@ "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", - "HeaderCancelRecording": "Cancel Recording" + "HeaderCancelRecording": "Cancel Recording", + "HeaderLearnMore": "Learn More" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.template.html b/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.template.html index 76c93f9ea8..12a7eeaa0c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.template.html @@ -15,9 +15,7 @@
- +
From 3a46bfe164fd50622f383a27cd1a834e60cfc8f9 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 16 Sep 2016 08:21:22 -0400 Subject: [PATCH 21/91] add missing file --- .../build/document-register-element.js | 2 ++ .../bower_components/emby-webcomponents/datetime.js | 6 +----- dashboard-ui/dashboard/logpage.js | 2 +- dashboard-ui/scripts/itembynamedetailpage.js | 2 +- dashboard-ui/scripts/livetvchannel.js | 2 +- dashboard-ui/scripts/livetvsuggested.js | 3 ++- dashboard-ui/scripts/sections.js | 1 - 7 files changed, 8 insertions(+), 10 deletions(-) create mode 100644 dashboard-ui/bower_components/document-register-element/build/document-register-element.js diff --git a/dashboard-ui/bower_components/document-register-element/build/document-register-element.js b/dashboard-ui/bower_components/document-register-element/build/document-register-element.js new file mode 100644 index 0000000000..02fbeaf06c --- /dev/null +++ b/dashboard-ui/bower_components/document-register-element/build/document-register-element.js @@ -0,0 +1,2 @@ +/*! (C) WebReflection Mit Style License */ +(function(e,t,n,r){"use strict";function rt(e,t){for(var n=0,r=e.length;n>0),s="attached",o="detached",u="extends",a="ADDITION",f="MODIFICATION",l="REMOVAL",c="DOMAttrModified",h="DOMContentLoaded",p="DOMSubtreeModified",d="<",v="=",m=/^[A-Z][A-Z0-9]*(?:-[A-Z0-9]+)+$/,g=["ANNOTATION-XML","COLOR-PROFILE","FONT-FACE","FONT-FACE-SRC","FONT-FACE-URI","FONT-FACE-FORMAT","FONT-FACE-NAME","MISSING-GLYPH"],y=[],b=[],w="",E=t.documentElement,S=y.indexOf||function(e){for(var t=this.length;t--&&this[t]!==e;);return t},x=n.prototype,T=x.hasOwnProperty,N=x.isPrototypeOf,C=n.defineProperty,k=n.getOwnPropertyDescriptor,L=n.getOwnPropertyNames,A=n.getPrototypeOf,O=n.setPrototypeOf,M=!!n.__proto__,_=n.create||function mt(e){return e?(mt.prototype=e,new mt):this},D=O||(M?function(e,t){return e.__proto__=t,e}:L&&k?function(){function e(e,t){for(var n,r=L(t),i=0,s=r.length;i'; + html += '

' + datetime.toLocaleDateString(itemStartDate, { weekday: 'long', month: 'long', day: 'numeric' }) + '

'; html += '
' + listView.getListViewHtml({ items: currentItems, diff --git a/dashboard-ui/scripts/livetvsuggested.js b/dashboard-ui/scripts/livetvsuggested.js index c0536ae60d..c457fb3466 100644 --- a/dashboard-ui/scripts/livetvsuggested.js +++ b/dashboard-ui/scripts/livetvsuggested.js @@ -116,7 +116,8 @@ items: items, preferThumb: !shape, shape: shape || (enableScrollX() ? 'overflowBackdrop' : 'backdrop'), - showTitle: true, + showParentTitleOrTitle: true, + showTitle: false, centerText: true, coverImage: true, overlayText: false, diff --git a/dashboard-ui/scripts/sections.js b/dashboard-ui/scripts/sections.js index 16a61ca05d..c002777826 100644 --- a/dashboard-ui/scripts/sections.js +++ b/dashboard-ui/scripts/sections.js @@ -458,7 +458,6 @@ overlayText: false, lazy: true, transition: false, - preferThumb: true, allowBottomPadding: !enableScrollX() }); html += '
'; From a9ae08f60c46c47f4570e492415945d8780d14db Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 17 Sep 2016 01:47:49 -0400 Subject: [PATCH 22/91] update program images --- .../emby-webcomponents/.bower.json | 8 +- .../emby-toggle/emby-toggle.js | 49 + .../webcomponentsjs/CustomElements.js | 1029 --- .../webcomponentsjs/CustomElements.min.js | 11 - .../webcomponentsjs/HTMLImports.js | 1157 --- .../webcomponentsjs/HTMLImports.min.js | 11 - .../webcomponentsjs/MutationObserver.js | 350 - .../webcomponentsjs/MutationObserver.min.js | 11 - .../webcomponentsjs/ShadowDOM.js | 4493 ---------- .../webcomponentsjs/ShadowDOM.min.js | 13 - .../webcomponentsjs/webcomponents-lite.js | 2505 ------ .../webcomponentsjs/webcomponents.js | 7206 ----------------- .../webcomponentsjs/webcomponents.min.js | 14 - .../imagedownloader/imagedownloader.js | 9 +- dashboard-ui/scripts/livetvitems.js | 1 + dashboard-ui/scripts/livetvrecordings.js | 2 +- dashboard-ui/scripts/livetvsuggested.js | 3 +- dashboard-ui/scripts/site.js | 4 +- 18 files changed, 61 insertions(+), 16815 deletions(-) create mode 100644 dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.js delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/CustomElements.js delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/CustomElements.min.js delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/HTMLImports.js delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/HTMLImports.min.js delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/MutationObserver.js delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/MutationObserver.min.js delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/ShadowDOM.js delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/ShadowDOM.min.js delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/webcomponents-lite.js delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/webcomponents.js delete mode 100644 dashboard-ui/bower_components/webcomponentsjs/webcomponents.min.js diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index 999858ca61..e75400a784 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.250", - "_release": "1.4.250", + "version": "1.4.252", + "_release": "1.4.252", "_resolution": { "type": "version", - "tag": "1.4.250", - "commit": "64a7a8d4d23fff00807f047f1019e27886b2a928" + "tag": "1.4.252", + "commit": "05ef5c9690e73f86f9adc9177c1d1565daa04745" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.js b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.js new file mode 100644 index 0000000000..3dab35b1bf --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.js @@ -0,0 +1,49 @@ +define(['css!./emby-toggle', 'registerElement'], function () { + + var EmbyTogglePrototype = Object.create(HTMLInputElement.prototype); + + function onKeyDown(e) { + + // Don't submit form on enter + if (e.keyCode == 13) { + e.preventDefault(); + + this.checked = !this.checked; + + this.dispatchEvent(new CustomEvent('change', { + bubbles: true + })); + + return false; + } + } + + EmbyTogglePrototype.attachedCallback = function () { + + if (this.getAttribute('data-embytoggle') == 'true') { + return; + } + + this.setAttribute('data-embytoggle', 'true'); + + this.classList.add('mdl-switch__input'); + + var labelElement = this.parentNode; + labelElement.classList.add('mdl-switch'); + labelElement.classList.add('mdl-js-switch'); + + var labelTextElement = labelElement.querySelector('span'); + + labelElement.insertAdjacentHTML('beforeend', '
'); + + labelTextElement.classList.add('toggleButtonLabel'); + labelTextElement.classList.add('mdl-switch__label'); + + this.addEventListener('keydown', onKeyDown); + }; + + document.registerElement('emby-toggle', { + prototype: EmbyTogglePrototype, + extends: 'input' + }); +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/webcomponentsjs/CustomElements.js b/dashboard-ui/bower_components/webcomponentsjs/CustomElements.js deleted file mode 100644 index 931f6c22e1..0000000000 --- a/dashboard-ui/bower_components/webcomponentsjs/CustomElements.js +++ /dev/null @@ -1,1029 +0,0 @@ -/** - * @license - * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. - * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - * Code distributed by Google as part of the polymer project is also - * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt - */ -// @version 0.7.22 -if (typeof WeakMap === "undefined") { - (function() { - var defineProperty = Object.defineProperty; - var counter = Date.now() % 1e9; - var WeakMap = function() { - this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__"); - }; - WeakMap.prototype = { - set: function(key, value) { - var entry = key[this.name]; - if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, { - value: [ key, value ], - writable: true - }); - return this; - }, - get: function(key) { - var entry; - return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined; - }, - "delete": function(key) { - var entry = key[this.name]; - if (!entry || entry[0] !== key) return false; - entry[0] = entry[1] = undefined; - return true; - }, - has: function(key) { - var entry = key[this.name]; - if (!entry) return false; - return entry[0] === key; - } - }; - window.WeakMap = WeakMap; - })(); -} - -(function(global) { - if (global.JsMutationObserver) { - return; - } - var registrationsTable = new WeakMap(); - var setImmediate; - if (/Trident|Edge/.test(navigator.userAgent)) { - setImmediate = setTimeout; - } else if (window.setImmediate) { - setImmediate = window.setImmediate; - } else { - var setImmediateQueue = []; - var sentinel = String(Math.random()); - window.addEventListener("message", function(e) { - if (e.data === sentinel) { - var queue = setImmediateQueue; - setImmediateQueue = []; - queue.forEach(function(func) { - func(); - }); - } - }); - setImmediate = function(func) { - setImmediateQueue.push(func); - window.postMessage(sentinel, "*"); - }; - } - var isScheduled = false; - var scheduledObservers = []; - function scheduleCallback(observer) { - scheduledObservers.push(observer); - if (!isScheduled) { - isScheduled = true; - setImmediate(dispatchCallbacks); - } - } - function wrapIfNeeded(node) { - return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node; - } - function dispatchCallbacks() { - isScheduled = false; - var observers = scheduledObservers; - scheduledObservers = []; - observers.sort(function(o1, o2) { - return o1.uid_ - o2.uid_; - }); - var anyNonEmpty = false; - observers.forEach(function(observer) { - var queue = observer.takeRecords(); - removeTransientObserversFor(observer); - if (queue.length) { - observer.callback_(queue, observer); - anyNonEmpty = true; - } - }); - if (anyNonEmpty) dispatchCallbacks(); - } - function removeTransientObserversFor(observer) { - observer.nodes_.forEach(function(node) { - var registrations = registrationsTable.get(node); - if (!registrations) return; - registrations.forEach(function(registration) { - if (registration.observer === observer) registration.removeTransientObservers(); - }); - }); - } - function forEachAncestorAndObserverEnqueueRecord(target, callback) { - for (var node = target; node; node = node.parentNode) { - var registrations = registrationsTable.get(node); - if (registrations) { - for (var j = 0; j < registrations.length; j++) { - var registration = registrations[j]; - var options = registration.options; - if (node !== target && !options.subtree) continue; - var record = callback(options); - if (record) registration.enqueue(record); - } - } - } - } - var uidCounter = 0; - function JsMutationObserver(callback) { - this.callback_ = callback; - this.nodes_ = []; - this.records_ = []; - this.uid_ = ++uidCounter; - } - JsMutationObserver.prototype = { - observe: function(target, options) { - target = wrapIfNeeded(target); - if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) { - throw new SyntaxError(); - } - var registrations = registrationsTable.get(target); - if (!registrations) registrationsTable.set(target, registrations = []); - var registration; - for (var i = 0; i < registrations.length; i++) { - if (registrations[i].observer === this) { - registration = registrations[i]; - registration.removeListeners(); - registration.options = options; - break; - } - } - if (!registration) { - registration = new Registration(this, target, options); - registrations.push(registration); - this.nodes_.push(target); - } - registration.addListeners(); - }, - disconnect: function() { - this.nodes_.forEach(function(node) { - var registrations = registrationsTable.get(node); - for (var i = 0; i < registrations.length; i++) { - var registration = registrations[i]; - if (registration.observer === this) { - registration.removeListeners(); - registrations.splice(i, 1); - break; - } - } - }, this); - this.records_ = []; - }, - takeRecords: function() { - var copyOfRecords = this.records_; - this.records_ = []; - return copyOfRecords; - } - }; - function MutationRecord(type, target) { - this.type = type; - this.target = target; - this.addedNodes = []; - this.removedNodes = []; - this.previousSibling = null; - this.nextSibling = null; - this.attributeName = null; - this.attributeNamespace = null; - this.oldValue = null; - } - function copyMutationRecord(original) { - var record = new MutationRecord(original.type, original.target); - record.addedNodes = original.addedNodes.slice(); - record.removedNodes = original.removedNodes.slice(); - record.previousSibling = original.previousSibling; - record.nextSibling = original.nextSibling; - record.attributeName = original.attributeName; - record.attributeNamespace = original.attributeNamespace; - record.oldValue = original.oldValue; - return record; - } - var currentRecord, recordWithOldValue; - function getRecord(type, target) { - return currentRecord = new MutationRecord(type, target); - } - function getRecordWithOldValue(oldValue) { - if (recordWithOldValue) return recordWithOldValue; - recordWithOldValue = copyMutationRecord(currentRecord); - recordWithOldValue.oldValue = oldValue; - return recordWithOldValue; - } - function clearRecords() { - currentRecord = recordWithOldValue = undefined; - } - function recordRepresentsCurrentMutation(record) { - return record === recordWithOldValue || record === currentRecord; - } - function selectRecord(lastRecord, newRecord) { - if (lastRecord === newRecord) return lastRecord; - if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue; - return null; - } - function Registration(observer, target, options) { - this.observer = observer; - this.target = target; - this.options = options; - this.transientObservedNodes = []; - } - Registration.prototype = { - enqueue: function(record) { - var records = this.observer.records_; - var length = records.length; - if (records.length > 0) { - var lastRecord = records[length - 1]; - var recordToReplaceLast = selectRecord(lastRecord, record); - if (recordToReplaceLast) { - records[length - 1] = recordToReplaceLast; - return; - } - } else { - scheduleCallback(this.observer); - } - records[length] = record; - }, - addListeners: function() { - this.addListeners_(this.target); - }, - addListeners_: function(node) { - var options = this.options; - if (options.attributes) node.addEventListener("DOMAttrModified", this, true); - if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true); - if (options.childList) node.addEventListener("DOMNodeInserted", this, true); - if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true); - }, - removeListeners: function() { - this.removeListeners_(this.target); - }, - removeListeners_: function(node) { - var options = this.options; - if (options.attributes) node.removeEventListener("DOMAttrModified", this, true); - if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true); - if (options.childList) node.removeEventListener("DOMNodeInserted", this, true); - if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true); - }, - addTransientObserver: function(node) { - if (node === this.target) return; - this.addListeners_(node); - this.transientObservedNodes.push(node); - var registrations = registrationsTable.get(node); - if (!registrations) registrationsTable.set(node, registrations = []); - registrations.push(this); - }, - removeTransientObservers: function() { - var transientObservedNodes = this.transientObservedNodes; - this.transientObservedNodes = []; - transientObservedNodes.forEach(function(node) { - this.removeListeners_(node); - var registrations = registrationsTable.get(node); - for (var i = 0; i < registrations.length; i++) { - if (registrations[i] === this) { - registrations.splice(i, 1); - break; - } - } - }, this); - }, - handleEvent: function(e) { - e.stopImmediatePropagation(); - switch (e.type) { - case "DOMAttrModified": - var name = e.attrName; - var namespace = e.relatedNode.namespaceURI; - var target = e.target; - var record = new getRecord("attributes", target); - record.attributeName = name; - record.attributeNamespace = namespace; - var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue; - forEachAncestorAndObserverEnqueueRecord(target, function(options) { - if (!options.attributes) return; - if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) { - return; - } - if (options.attributeOldValue) return getRecordWithOldValue(oldValue); - return record; - }); - break; - - case "DOMCharacterDataModified": - var target = e.target; - var record = getRecord("characterData", target); - var oldValue = e.prevValue; - forEachAncestorAndObserverEnqueueRecord(target, function(options) { - if (!options.characterData) return; - if (options.characterDataOldValue) return getRecordWithOldValue(oldValue); - return record; - }); - break; - - case "DOMNodeRemoved": - this.addTransientObserver(e.target); - - case "DOMNodeInserted": - var changedNode = e.target; - var addedNodes, removedNodes; - if (e.type === "DOMNodeInserted") { - addedNodes = [ changedNode ]; - removedNodes = []; - } else { - addedNodes = []; - removedNodes = [ changedNode ]; - } - var previousSibling = changedNode.previousSibling; - var nextSibling = changedNode.nextSibling; - var record = getRecord("childList", e.target.parentNode); - record.addedNodes = addedNodes; - record.removedNodes = removedNodes; - record.previousSibling = previousSibling; - record.nextSibling = nextSibling; - forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) { - if (!options.childList) return; - return record; - }); - } - clearRecords(); - } - }; - global.JsMutationObserver = JsMutationObserver; - if (!global.MutationObserver) { - global.MutationObserver = JsMutationObserver; - JsMutationObserver._isPolyfilled = true; - } -})(self); - -(function(scope) { - "use strict"; - if (!window.performance) { - var start = Date.now(); - window.performance = { - now: function() { - return Date.now() - start; - } - }; - } - if (!window.requestAnimationFrame) { - window.requestAnimationFrame = function() { - var nativeRaf = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; - return nativeRaf ? function(callback) { - return nativeRaf(function() { - callback(performance.now()); - }); - } : function(callback) { - return window.setTimeout(callback, 1e3 / 60); - }; - }(); - } - if (!window.cancelAnimationFrame) { - window.cancelAnimationFrame = function() { - return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) { - clearTimeout(id); - }; - }(); - } - var workingDefaultPrevented = function() { - var e = document.createEvent("Event"); - e.initEvent("foo", true, true); - e.preventDefault(); - return e.defaultPrevented; - }(); - if (!workingDefaultPrevented) { - var origPreventDefault = Event.prototype.preventDefault; - Event.prototype.preventDefault = function() { - if (!this.cancelable) { - return; - } - origPreventDefault.call(this); - Object.defineProperty(this, "defaultPrevented", { - get: function() { - return true; - }, - configurable: true - }); - }; - } - var isIE = /Trident/.test(navigator.userAgent); - if (!window.CustomEvent || isIE && typeof window.CustomEvent !== "function") { - window.CustomEvent = function(inType, params) { - params = params || {}; - var e = document.createEvent("CustomEvent"); - e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail); - return e; - }; - window.CustomEvent.prototype = window.Event.prototype; - } - if (!window.Event || isIE && typeof window.Event !== "function") { - var origEvent = window.Event; - window.Event = function(inType, params) { - params = params || {}; - var e = document.createEvent("Event"); - e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable)); - return e; - }; - window.Event.prototype = origEvent.prototype; - } -})(window.WebComponents); - -window.CustomElements = window.CustomElements || { - flags: {} -}; - -(function(scope) { - var flags = scope.flags; - var modules = []; - var addModule = function(module) { - modules.push(module); - }; - var initializeModules = function() { - modules.forEach(function(module) { - module(scope); - }); - }; - scope.addModule = addModule; - scope.initializeModules = initializeModules; - scope.hasNative = Boolean(document.registerElement); - scope.isIE = /Trident/.test(navigator.userAgent); - scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || window.HTMLImports.useNative); -})(window.CustomElements); - -window.CustomElements.addModule(function(scope) { - var IMPORT_LINK_TYPE = window.HTMLImports ? window.HTMLImports.IMPORT_LINK_TYPE : "none"; - function forSubtree(node, cb) { - findAllElements(node, function(e) { - if (cb(e)) { - return true; - } - forRoots(e, cb); - }); - forRoots(node, cb); - } - function findAllElements(node, find, data) { - var e = node.firstElementChild; - if (!e) { - e = node.firstChild; - while (e && e.nodeType !== Node.ELEMENT_NODE) { - e = e.nextSibling; - } - } - while (e) { - if (find(e, data) !== true) { - findAllElements(e, find, data); - } - e = e.nextElementSibling; - } - return null; - } - function forRoots(node, cb) { - var root = node.shadowRoot; - while (root) { - forSubtree(root, cb); - root = root.olderShadowRoot; - } - } - function forDocumentTree(doc, cb) { - _forDocumentTree(doc, cb, []); - } - function _forDocumentTree(doc, cb, processingDocuments) { - doc = window.wrap(doc); - if (processingDocuments.indexOf(doc) >= 0) { - return; - } - processingDocuments.push(doc); - var imports = doc.querySelectorAll("link[rel=" + IMPORT_LINK_TYPE + "]"); - for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) { - if (n.import) { - _forDocumentTree(n.import, cb, processingDocuments); - } - } - cb(doc); - } - scope.forDocumentTree = forDocumentTree; - scope.forSubtree = forSubtree; -}); - -window.CustomElements.addModule(function(scope) { - var flags = scope.flags; - var forSubtree = scope.forSubtree; - var forDocumentTree = scope.forDocumentTree; - function addedNode(node, isAttached) { - return added(node, isAttached) || addedSubtree(node, isAttached); - } - function added(node, isAttached) { - if (scope.upgrade(node, isAttached)) { - return true; - } - if (isAttached) { - attached(node); - } - } - function addedSubtree(node, isAttached) { - forSubtree(node, function(e) { - if (added(e, isAttached)) { - return true; - } - }); - } - var hasThrottledAttached = window.MutationObserver._isPolyfilled && flags["throttle-attached"]; - scope.hasPolyfillMutations = hasThrottledAttached; - scope.hasThrottledAttached = hasThrottledAttached; - var isPendingMutations = false; - var pendingMutations = []; - function deferMutation(fn) { - pendingMutations.push(fn); - if (!isPendingMutations) { - isPendingMutations = true; - setTimeout(takeMutations); - } - } - function takeMutations() { - isPendingMutations = false; - var $p = pendingMutations; - for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) { - p(); - } - pendingMutations = []; - } - function attached(element) { - if (hasThrottledAttached) { - deferMutation(function() { - _attached(element); - }); - } else { - _attached(element); - } - } - function _attached(element) { - if (element.__upgraded__ && !element.__attached) { - element.__attached = true; - if (element.attachedCallback) { - element.attachedCallback(); - } - } - } - function detachedNode(node) { - detached(node); - forSubtree(node, function(e) { - detached(e); - }); - } - function detached(element) { - if (hasThrottledAttached) { - deferMutation(function() { - _detached(element); - }); - } else { - _detached(element); - } - } - function _detached(element) { - if (element.__upgraded__ && element.__attached) { - element.__attached = false; - if (element.detachedCallback) { - element.detachedCallback(); - } - } - } - function inDocument(element) { - var p = element; - var doc = window.wrap(document); - while (p) { - if (p == doc) { - return true; - } - p = p.parentNode || p.nodeType === Node.DOCUMENT_FRAGMENT_NODE && p.host; - } - } - function watchShadow(node) { - if (node.shadowRoot && !node.shadowRoot.__watched) { - flags.dom && console.log("watching shadow-root for: ", node.localName); - var root = node.shadowRoot; - while (root) { - observe(root); - root = root.olderShadowRoot; - } - } - } - function handler(root, mutations) { - if (flags.dom) { - var mx = mutations[0]; - if (mx && mx.type === "childList" && mx.addedNodes) { - if (mx.addedNodes) { - var d = mx.addedNodes[0]; - while (d && d !== document && !d.host) { - d = d.parentNode; - } - var u = d && (d.URL || d._URL || d.host && d.host.localName) || ""; - u = u.split("/?").shift().split("/").pop(); - } - } - console.group("mutations (%d) [%s]", mutations.length, u || ""); - } - var isAttached = inDocument(root); - mutations.forEach(function(mx) { - if (mx.type === "childList") { - forEach(mx.addedNodes, function(n) { - if (!n.localName) { - return; - } - addedNode(n, isAttached); - }); - forEach(mx.removedNodes, function(n) { - if (!n.localName) { - return; - } - detachedNode(n); - }); - } - }); - flags.dom && console.groupEnd(); - } - function takeRecords(node) { - node = window.wrap(node); - if (!node) { - node = window.wrap(document); - } - while (node.parentNode) { - node = node.parentNode; - } - var observer = node.__observer; - if (observer) { - handler(node, observer.takeRecords()); - takeMutations(); - } - } - var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach); - function observe(inRoot) { - if (inRoot.__observer) { - return; - } - var observer = new MutationObserver(handler.bind(this, inRoot)); - observer.observe(inRoot, { - childList: true, - subtree: true - }); - inRoot.__observer = observer; - } - function upgradeDocument(doc) { - doc = window.wrap(doc); - flags.dom && console.group("upgradeDocument: ", doc.baseURI.split("/").pop()); - var isMainDocument = doc === window.wrap(document); - addedNode(doc, isMainDocument); - observe(doc); - flags.dom && console.groupEnd(); - } - function upgradeDocumentTree(doc) { - forDocumentTree(doc, upgradeDocument); - } - var originalCreateShadowRoot = Element.prototype.createShadowRoot; - if (originalCreateShadowRoot) { - Element.prototype.createShadowRoot = function() { - var root = originalCreateShadowRoot.call(this); - window.CustomElements.watchShadow(this); - return root; - }; - } - scope.watchShadow = watchShadow; - scope.upgradeDocumentTree = upgradeDocumentTree; - scope.upgradeDocument = upgradeDocument; - scope.upgradeSubtree = addedSubtree; - scope.upgradeAll = addedNode; - scope.attached = attached; - scope.takeRecords = takeRecords; -}); - -window.CustomElements.addModule(function(scope) { - var flags = scope.flags; - function upgrade(node, isAttached) { - if (node.localName === "template") { - if (window.HTMLTemplateElement && HTMLTemplateElement.decorate) { - HTMLTemplateElement.decorate(node); - } - } - if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) { - var is = node.getAttribute("is"); - var definition = scope.getRegisteredDefinition(node.localName) || scope.getRegisteredDefinition(is); - if (definition) { - if (is && definition.tag == node.localName || !is && !definition.extends) { - return upgradeWithDefinition(node, definition, isAttached); - } - } - } - } - function upgradeWithDefinition(element, definition, isAttached) { - flags.upgrade && console.group("upgrade:", element.localName); - if (definition.is) { - element.setAttribute("is", definition.is); - } - implementPrototype(element, definition); - element.__upgraded__ = true; - created(element); - if (isAttached) { - scope.attached(element); - } - scope.upgradeSubtree(element, isAttached); - flags.upgrade && console.groupEnd(); - return element; - } - function implementPrototype(element, definition) { - if (Object.__proto__) { - element.__proto__ = definition.prototype; - } else { - customMixin(element, definition.prototype, definition.native); - element.__proto__ = definition.prototype; - } - } - function customMixin(inTarget, inSrc, inNative) { - var used = {}; - var p = inSrc; - while (p !== inNative && p !== HTMLElement.prototype) { - var keys = Object.getOwnPropertyNames(p); - for (var i = 0, k; k = keys[i]; i++) { - if (!used[k]) { - Object.defineProperty(inTarget, k, Object.getOwnPropertyDescriptor(p, k)); - used[k] = 1; - } - } - p = Object.getPrototypeOf(p); - } - } - function created(element) { - if (element.createdCallback) { - element.createdCallback(); - } - } - scope.upgrade = upgrade; - scope.upgradeWithDefinition = upgradeWithDefinition; - scope.implementPrototype = implementPrototype; -}); - -window.CustomElements.addModule(function(scope) { - var isIE = scope.isIE; - var upgradeDocumentTree = scope.upgradeDocumentTree; - var upgradeAll = scope.upgradeAll; - var upgradeWithDefinition = scope.upgradeWithDefinition; - var implementPrototype = scope.implementPrototype; - var useNative = scope.useNative; - function register(name, options) { - var definition = options || {}; - if (!name) { - throw new Error("document.registerElement: first argument `name` must not be empty"); - } - if (name.indexOf("-") < 0) { - throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '" + String(name) + "'."); - } - if (isReservedTag(name)) { - throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '" + String(name) + "'. The type name is invalid."); - } - if (getRegisteredDefinition(name)) { - throw new Error("DuplicateDefinitionError: a type with name '" + String(name) + "' is already registered"); - } - if (!definition.prototype) { - definition.prototype = Object.create(HTMLElement.prototype); - } - definition.__name = name.toLowerCase(); - if (definition.extends) { - definition.extends = definition.extends.toLowerCase(); - } - definition.lifecycle = definition.lifecycle || {}; - definition.ancestry = ancestry(definition.extends); - resolveTagName(definition); - resolvePrototypeChain(definition); - overrideAttributeApi(definition.prototype); - registerDefinition(definition.__name, definition); - definition.ctor = generateConstructor(definition); - definition.ctor.prototype = definition.prototype; - definition.prototype.constructor = definition.ctor; - if (scope.ready) { - upgradeDocumentTree(document); - } - return definition.ctor; - } - function overrideAttributeApi(prototype) { - if (prototype.setAttribute._polyfilled) { - return; - } - var setAttribute = prototype.setAttribute; - prototype.setAttribute = function(name, value) { - changeAttribute.call(this, name, value, setAttribute); - }; - var removeAttribute = prototype.removeAttribute; - prototype.removeAttribute = function(name) { - changeAttribute.call(this, name, null, removeAttribute); - }; - prototype.setAttribute._polyfilled = true; - } - function changeAttribute(name, value, operation) { - name = name.toLowerCase(); - var oldValue = this.getAttribute(name); - operation.apply(this, arguments); - var newValue = this.getAttribute(name); - if (this.attributeChangedCallback && newValue !== oldValue) { - this.attributeChangedCallback(name, oldValue, newValue); - } - } - function isReservedTag(name) { - for (var i = 0; i < reservedTagList.length; i++) { - if (name === reservedTagList[i]) { - return true; - } - } - } - var reservedTagList = [ "annotation-xml", "color-profile", "font-face", "font-face-src", "font-face-uri", "font-face-format", "font-face-name", "missing-glyph" ]; - function ancestry(extnds) { - var extendee = getRegisteredDefinition(extnds); - if (extendee) { - return ancestry(extendee.extends).concat([ extendee ]); - } - return []; - } - function resolveTagName(definition) { - var baseTag = definition.extends; - for (var i = 0, a; a = definition.ancestry[i]; i++) { - baseTag = a.is && a.tag; - } - definition.tag = baseTag || definition.__name; - if (baseTag) { - definition.is = definition.__name; - } - } - function resolvePrototypeChain(definition) { - if (!Object.__proto__) { - var nativePrototype = HTMLElement.prototype; - if (definition.is) { - var inst = document.createElement(definition.tag); - nativePrototype = Object.getPrototypeOf(inst); - } - var proto = definition.prototype, ancestor; - var foundPrototype = false; - while (proto) { - if (proto == nativePrototype) { - foundPrototype = true; - } - ancestor = Object.getPrototypeOf(proto); - if (ancestor) { - proto.__proto__ = ancestor; - } - proto = ancestor; - } - if (!foundPrototype) { - console.warn(definition.tag + " prototype not found in prototype chain for " + definition.is); - } - definition.native = nativePrototype; - } - } - function instantiate(definition) { - return upgradeWithDefinition(domCreateElement(definition.tag), definition); - } - var registry = {}; - function getRegisteredDefinition(name) { - if (name) { - return registry[name.toLowerCase()]; - } - } - function registerDefinition(name, definition) { - registry[name] = definition; - } - function generateConstructor(definition) { - return function() { - return instantiate(definition); - }; - } - var HTML_NAMESPACE = "http://www.w3.org/1999/xhtml"; - function createElementNS(namespace, tag, typeExtension) { - if (namespace === HTML_NAMESPACE) { - return createElement(tag, typeExtension); - } else { - return domCreateElementNS(namespace, tag); - } - } - function createElement(tag, typeExtension) { - if (tag) { - tag = tag.toLowerCase(); - } - if (typeExtension) { - typeExtension = typeExtension.toLowerCase(); - } - var definition = getRegisteredDefinition(typeExtension || tag); - if (definition) { - if (tag == definition.tag && typeExtension == definition.is) { - return new definition.ctor(); - } - if (!typeExtension && !definition.is) { - return new definition.ctor(); - } - } - var element; - if (typeExtension) { - element = createElement(tag); - element.setAttribute("is", typeExtension); - return element; - } - element = domCreateElement(tag); - if (tag.indexOf("-") >= 0) { - implementPrototype(element, HTMLElement); - } - return element; - } - var domCreateElement = document.createElement.bind(document); - var domCreateElementNS = document.createElementNS.bind(document); - var isInstance; - if (!Object.__proto__ && !useNative) { - isInstance = function(obj, ctor) { - if (obj instanceof ctor) { - return true; - } - var p = obj; - while (p) { - if (p === ctor.prototype) { - return true; - } - p = p.__proto__; - } - return false; - }; - } else { - isInstance = function(obj, base) { - return obj instanceof base; - }; - } - function wrapDomMethodToForceUpgrade(obj, methodName) { - var orig = obj[methodName]; - obj[methodName] = function() { - var n = orig.apply(this, arguments); - upgradeAll(n); - return n; - }; - } - wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode"); - wrapDomMethodToForceUpgrade(document, "importNode"); - document.registerElement = register; - document.createElement = createElement; - document.createElementNS = createElementNS; - scope.registry = registry; - scope.instanceof = isInstance; - scope.reservedTagList = reservedTagList; - scope.getRegisteredDefinition = getRegisteredDefinition; - document.register = document.registerElement; -}); - -(function(scope) { - var useNative = scope.useNative; - var initializeModules = scope.initializeModules; - var isIE = scope.isIE; - if (useNative) { - var nop = function() {}; - scope.watchShadow = nop; - scope.upgrade = nop; - scope.upgradeAll = nop; - scope.upgradeDocumentTree = nop; - scope.upgradeSubtree = nop; - scope.takeRecords = nop; - scope.instanceof = function(obj, base) { - return obj instanceof base; - }; - } else { - initializeModules(); - } - var upgradeDocumentTree = scope.upgradeDocumentTree; - var upgradeDocument = scope.upgradeDocument; - if (!window.wrap) { - if (window.ShadowDOMPolyfill) { - window.wrap = window.ShadowDOMPolyfill.wrapIfNeeded; - window.unwrap = window.ShadowDOMPolyfill.unwrapIfNeeded; - } else { - window.wrap = window.unwrap = function(node) { - return node; - }; - } - } - if (window.HTMLImports) { - window.HTMLImports.__importsParsingHook = function(elt) { - if (elt.import) { - upgradeDocument(wrap(elt.import)); - } - }; - } - function bootstrap() { - upgradeDocumentTree(window.wrap(document)); - window.CustomElements.ready = true; - var requestAnimationFrame = window.requestAnimationFrame || function(f) { - setTimeout(f, 16); - }; - requestAnimationFrame(function() { - setTimeout(function() { - window.CustomElements.readyTime = Date.now(); - if (window.HTMLImports) { - window.CustomElements.elapsed = window.CustomElements.readyTime - window.HTMLImports.readyTime; - } - document.dispatchEvent(new CustomEvent("WebComponentsReady", { - bubbles: true - })); - }); - }); - } - if (document.readyState === "complete" || scope.flags.eager) { - bootstrap(); - } else if (document.readyState === "interactive" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) { - bootstrap(); - } else { - var loadEvent = window.HTMLImports && !window.HTMLImports.ready ? "HTMLImportsLoaded" : "DOMContentLoaded"; - window.addEventListener(loadEvent, bootstrap); - } -})(window.CustomElements); \ No newline at end of file diff --git a/dashboard-ui/bower_components/webcomponentsjs/CustomElements.min.js b/dashboard-ui/bower_components/webcomponentsjs/CustomElements.min.js deleted file mode 100644 index a2761f17d7..0000000000 --- a/dashboard-ui/bower_components/webcomponentsjs/CustomElements.min.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @license - * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. - * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - * Code distributed by Google as part of the polymer project is also - * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt - */ -// @version 0.7.22 -"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var o=t[this.name];return o&&o[0]===t?o[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){E.push(e),b||(b=!0,w(o))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function o(){b=!1;var e=E;E=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();r(e),n.length&&(e.callback_(n,e),t=!0)}),t&&o()}function r(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var o=v.get(n);if(o)for(var r=0;r0){var r=n[o-1],i=p(r,e);if(i)return void(n[o-1]=i)}else t(this.observer);n[o]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n=0)){n.push(e);for(var o,r=e.querySelectorAll("link[rel="+a+"]"),d=0,s=r.length;s>d&&(o=r[d]);d++)o["import"]&&i(o["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=r,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||o(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function o(e,t){b(e,function(e){return n(e,t)?!0:void 0})}function r(e){N.push(e),y||(y=!0,setTimeout(i))}function i(){y=!1;for(var e,t=N,n=0,o=t.length;o>n&&(e=t[n]);n++)e();N=[]}function a(e){_?r(function(){d(e)}):d(e)}function d(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function s(e){u(e),b(e,function(e){u(e)})}function u(e){_?r(function(){c(e)}):c(e)}function c(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function l(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function f(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)w(t),t=t.olderShadowRoot}}function p(e,n){if(g.dom){var o=n[0];if(o&&"childList"===o.type&&o.addedNodes&&o.addedNodes){for(var r=o.addedNodes[0];r&&r!==document&&!r.host;)r=r.parentNode;var i=r&&(r.URL||r._URL||r.host&&r.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=l(e);n.forEach(function(e){"childList"===e.type&&(M(e.addedNodes,function(e){e.localName&&t(e,a)}),M(e.removedNodes,function(e){e.localName&&s(e)}))}),g.dom&&console.groupEnd()}function m(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(p(e,t.takeRecords()),i())}function w(e){if(!e.__observer){var t=new MutationObserver(p.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),w(e),g.dom&&console.groupEnd()}function h(e){E(e,v)}var g=e.flags,b=e.forSubtree,E=e.forDocumentTree,_=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=_,e.hasThrottledAttached=_;var y=!1,N=[],M=Array.prototype.forEach.call.bind(Array.prototype.forEach),O=Element.prototype.createShadowRoot;O&&(Element.prototype.createShadowRoot=function(){var e=O.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=f,e.upgradeDocumentTree=h,e.upgradeDocument=v,e.upgradeSubtree=o,e.upgradeAll=t,e.attached=a,e.takeRecords=m}),window.CustomElements.addModule(function(e){function t(t,o){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var r=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(r);if(i&&(r&&i.tag==t.localName||!r&&!i["extends"]))return n(t,i,o)}}function n(t,n,r){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),o(t,n),t.__upgraded__=!0,i(t),r&&e.attached(t),e.upgradeSubtree(t,r),a.upgrade&&console.groupEnd(),t}function o(e,t){Object.__proto__?e.__proto__=t.prototype:(r(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function r(e,t,n){for(var o={},r=t;r!==n&&r!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(r),d=0;i=a[d];d++)o[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i)),o[i]=1);r=Object.getPrototypeOf(r)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=o}),window.CustomElements.addModule(function(e){function t(t,o){var s=o||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(r(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(u(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return s.prototype||(s.prototype=Object.create(HTMLElement.prototype)),s.__name=t.toLowerCase(),s["extends"]&&(s["extends"]=s["extends"].toLowerCase()),s.lifecycle=s.lifecycle||{},s.ancestry=i(s["extends"]),a(s),d(s),n(s.prototype),c(s.__name,s),s.ctor=l(s),s.ctor.prototype=s.prototype,s.prototype.constructor=s.ctor,e.ready&&v(document),s.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){o.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){o.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function o(e,t,n){e=e.toLowerCase();var o=this.getAttribute(e);n.apply(this,arguments);var r=this.getAttribute(e);this.attributeChangedCallback&&r!==o&&this.attributeChangedCallback(e,o,r)}function r(e){for(var t=0;t<_.length;t++)if(e===_[t])return!0}function i(e){var t=u(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],o=0;t=e.ancestry[o];o++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function d(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var o,r=e.prototype,i=!1;r;)r==t&&(i=!0),o=Object.getPrototypeOf(r),o&&(r.__proto__=o),r=o;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function s(e){return g(M(e.tag),e)}function u(e){return e?y[e.toLowerCase()]:void 0}function c(e,t){y[e]=t}function l(e){return function(){return s(e)}}function f(e,t,n){return e===N?p(t,n):O(e,t)}function p(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=u(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var o;return t?(o=p(e),o.setAttribute("is",t),o):(o=M(e),e.indexOf("-")>=0&&b(o,HTMLElement),o)}function m(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return h(e),e}}var w,v=(e.isIE,e.upgradeDocumentTree),h=e.upgradeAll,g=e.upgradeWithDefinition,b=e.implementPrototype,E=e.useNative,_=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],y={},N="http://www.w3.org/1999/xhtml",M=document.createElement.bind(document),O=document.createElementNS.bind(document);w=Object.__proto__||E?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},m(Node.prototype,"cloneNode"),m(document,"importNode"),document.registerElement=t,document.createElement=p,document.createElementNS=f,e.registry=y,e["instanceof"]=w,e.reservedTagList=_,e.getRegisteredDefinition=u,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,o=e.initializeModules;e.isIE;if(n){var r=function(){};e.watchShadow=r,e.upgrade=r,e.upgradeAll=r,e.upgradeDocumentTree=r,e.upgradeSubtree=r,e.takeRecords=r,e["instanceof"]=function(e,t){return e instanceof t}}else o();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var d=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(d,t)}else t()}(window.CustomElements); \ No newline at end of file diff --git a/dashboard-ui/bower_components/webcomponentsjs/HTMLImports.js b/dashboard-ui/bower_components/webcomponentsjs/HTMLImports.js deleted file mode 100644 index cc8ac641d8..0000000000 --- a/dashboard-ui/bower_components/webcomponentsjs/HTMLImports.js +++ /dev/null @@ -1,1157 +0,0 @@ -/** - * @license - * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. - * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - * Code distributed by Google as part of the polymer project is also - * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt - */ -// @version 0.7.22 -if (typeof WeakMap === "undefined") { - (function() { - var defineProperty = Object.defineProperty; - var counter = Date.now() % 1e9; - var WeakMap = function() { - this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__"); - }; - WeakMap.prototype = { - set: function(key, value) { - var entry = key[this.name]; - if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, { - value: [ key, value ], - writable: true - }); - return this; - }, - get: function(key) { - var entry; - return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined; - }, - "delete": function(key) { - var entry = key[this.name]; - if (!entry || entry[0] !== key) return false; - entry[0] = entry[1] = undefined; - return true; - }, - has: function(key) { - var entry = key[this.name]; - if (!entry) return false; - return entry[0] === key; - } - }; - window.WeakMap = WeakMap; - })(); -} - -(function(global) { - if (global.JsMutationObserver) { - return; - } - var registrationsTable = new WeakMap(); - var setImmediate; - if (/Trident|Edge/.test(navigator.userAgent)) { - setImmediate = setTimeout; - } else if (window.setImmediate) { - setImmediate = window.setImmediate; - } else { - var setImmediateQueue = []; - var sentinel = String(Math.random()); - window.addEventListener("message", function(e) { - if (e.data === sentinel) { - var queue = setImmediateQueue; - setImmediateQueue = []; - queue.forEach(function(func) { - func(); - }); - } - }); - setImmediate = function(func) { - setImmediateQueue.push(func); - window.postMessage(sentinel, "*"); - }; - } - var isScheduled = false; - var scheduledObservers = []; - function scheduleCallback(observer) { - scheduledObservers.push(observer); - if (!isScheduled) { - isScheduled = true; - setImmediate(dispatchCallbacks); - } - } - function wrapIfNeeded(node) { - return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node; - } - function dispatchCallbacks() { - isScheduled = false; - var observers = scheduledObservers; - scheduledObservers = []; - observers.sort(function(o1, o2) { - return o1.uid_ - o2.uid_; - }); - var anyNonEmpty = false; - observers.forEach(function(observer) { - var queue = observer.takeRecords(); - removeTransientObserversFor(observer); - if (queue.length) { - observer.callback_(queue, observer); - anyNonEmpty = true; - } - }); - if (anyNonEmpty) dispatchCallbacks(); - } - function removeTransientObserversFor(observer) { - observer.nodes_.forEach(function(node) { - var registrations = registrationsTable.get(node); - if (!registrations) return; - registrations.forEach(function(registration) { - if (registration.observer === observer) registration.removeTransientObservers(); - }); - }); - } - function forEachAncestorAndObserverEnqueueRecord(target, callback) { - for (var node = target; node; node = node.parentNode) { - var registrations = registrationsTable.get(node); - if (registrations) { - for (var j = 0; j < registrations.length; j++) { - var registration = registrations[j]; - var options = registration.options; - if (node !== target && !options.subtree) continue; - var record = callback(options); - if (record) registration.enqueue(record); - } - } - } - } - var uidCounter = 0; - function JsMutationObserver(callback) { - this.callback_ = callback; - this.nodes_ = []; - this.records_ = []; - this.uid_ = ++uidCounter; - } - JsMutationObserver.prototype = { - observe: function(target, options) { - target = wrapIfNeeded(target); - if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) { - throw new SyntaxError(); - } - var registrations = registrationsTable.get(target); - if (!registrations) registrationsTable.set(target, registrations = []); - var registration; - for (var i = 0; i < registrations.length; i++) { - if (registrations[i].observer === this) { - registration = registrations[i]; - registration.removeListeners(); - registration.options = options; - break; - } - } - if (!registration) { - registration = new Registration(this, target, options); - registrations.push(registration); - this.nodes_.push(target); - } - registration.addListeners(); - }, - disconnect: function() { - this.nodes_.forEach(function(node) { - var registrations = registrationsTable.get(node); - for (var i = 0; i < registrations.length; i++) { - var registration = registrations[i]; - if (registration.observer === this) { - registration.removeListeners(); - registrations.splice(i, 1); - break; - } - } - }, this); - this.records_ = []; - }, - takeRecords: function() { - var copyOfRecords = this.records_; - this.records_ = []; - return copyOfRecords; - } - }; - function MutationRecord(type, target) { - this.type = type; - this.target = target; - this.addedNodes = []; - this.removedNodes = []; - this.previousSibling = null; - this.nextSibling = null; - this.attributeName = null; - this.attributeNamespace = null; - this.oldValue = null; - } - function copyMutationRecord(original) { - var record = new MutationRecord(original.type, original.target); - record.addedNodes = original.addedNodes.slice(); - record.removedNodes = original.removedNodes.slice(); - record.previousSibling = original.previousSibling; - record.nextSibling = original.nextSibling; - record.attributeName = original.attributeName; - record.attributeNamespace = original.attributeNamespace; - record.oldValue = original.oldValue; - return record; - } - var currentRecord, recordWithOldValue; - function getRecord(type, target) { - return currentRecord = new MutationRecord(type, target); - } - function getRecordWithOldValue(oldValue) { - if (recordWithOldValue) return recordWithOldValue; - recordWithOldValue = copyMutationRecord(currentRecord); - recordWithOldValue.oldValue = oldValue; - return recordWithOldValue; - } - function clearRecords() { - currentRecord = recordWithOldValue = undefined; - } - function recordRepresentsCurrentMutation(record) { - return record === recordWithOldValue || record === currentRecord; - } - function selectRecord(lastRecord, newRecord) { - if (lastRecord === newRecord) return lastRecord; - if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue; - return null; - } - function Registration(observer, target, options) { - this.observer = observer; - this.target = target; - this.options = options; - this.transientObservedNodes = []; - } - Registration.prototype = { - enqueue: function(record) { - var records = this.observer.records_; - var length = records.length; - if (records.length > 0) { - var lastRecord = records[length - 1]; - var recordToReplaceLast = selectRecord(lastRecord, record); - if (recordToReplaceLast) { - records[length - 1] = recordToReplaceLast; - return; - } - } else { - scheduleCallback(this.observer); - } - records[length] = record; - }, - addListeners: function() { - this.addListeners_(this.target); - }, - addListeners_: function(node) { - var options = this.options; - if (options.attributes) node.addEventListener("DOMAttrModified", this, true); - if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true); - if (options.childList) node.addEventListener("DOMNodeInserted", this, true); - if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true); - }, - removeListeners: function() { - this.removeListeners_(this.target); - }, - removeListeners_: function(node) { - var options = this.options; - if (options.attributes) node.removeEventListener("DOMAttrModified", this, true); - if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true); - if (options.childList) node.removeEventListener("DOMNodeInserted", this, true); - if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true); - }, - addTransientObserver: function(node) { - if (node === this.target) return; - this.addListeners_(node); - this.transientObservedNodes.push(node); - var registrations = registrationsTable.get(node); - if (!registrations) registrationsTable.set(node, registrations = []); - registrations.push(this); - }, - removeTransientObservers: function() { - var transientObservedNodes = this.transientObservedNodes; - this.transientObservedNodes = []; - transientObservedNodes.forEach(function(node) { - this.removeListeners_(node); - var registrations = registrationsTable.get(node); - for (var i = 0; i < registrations.length; i++) { - if (registrations[i] === this) { - registrations.splice(i, 1); - break; - } - } - }, this); - }, - handleEvent: function(e) { - e.stopImmediatePropagation(); - switch (e.type) { - case "DOMAttrModified": - var name = e.attrName; - var namespace = e.relatedNode.namespaceURI; - var target = e.target; - var record = new getRecord("attributes", target); - record.attributeName = name; - record.attributeNamespace = namespace; - var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue; - forEachAncestorAndObserverEnqueueRecord(target, function(options) { - if (!options.attributes) return; - if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) { - return; - } - if (options.attributeOldValue) return getRecordWithOldValue(oldValue); - return record; - }); - break; - - case "DOMCharacterDataModified": - var target = e.target; - var record = getRecord("characterData", target); - var oldValue = e.prevValue; - forEachAncestorAndObserverEnqueueRecord(target, function(options) { - if (!options.characterData) return; - if (options.characterDataOldValue) return getRecordWithOldValue(oldValue); - return record; - }); - break; - - case "DOMNodeRemoved": - this.addTransientObserver(e.target); - - case "DOMNodeInserted": - var changedNode = e.target; - var addedNodes, removedNodes; - if (e.type === "DOMNodeInserted") { - addedNodes = [ changedNode ]; - removedNodes = []; - } else { - addedNodes = []; - removedNodes = [ changedNode ]; - } - var previousSibling = changedNode.previousSibling; - var nextSibling = changedNode.nextSibling; - var record = getRecord("childList", e.target.parentNode); - record.addedNodes = addedNodes; - record.removedNodes = removedNodes; - record.previousSibling = previousSibling; - record.nextSibling = nextSibling; - forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) { - if (!options.childList) return; - return record; - }); - } - clearRecords(); - } - }; - global.JsMutationObserver = JsMutationObserver; - if (!global.MutationObserver) { - global.MutationObserver = JsMutationObserver; - JsMutationObserver._isPolyfilled = true; - } -})(self); - -(function(scope) { - "use strict"; - if (!window.performance) { - var start = Date.now(); - window.performance = { - now: function() { - return Date.now() - start; - } - }; - } - if (!window.requestAnimationFrame) { - window.requestAnimationFrame = function() { - var nativeRaf = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; - return nativeRaf ? function(callback) { - return nativeRaf(function() { - callback(performance.now()); - }); - } : function(callback) { - return window.setTimeout(callback, 1e3 / 60); - }; - }(); - } - if (!window.cancelAnimationFrame) { - window.cancelAnimationFrame = function() { - return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) { - clearTimeout(id); - }; - }(); - } - var workingDefaultPrevented = function() { - var e = document.createEvent("Event"); - e.initEvent("foo", true, true); - e.preventDefault(); - return e.defaultPrevented; - }(); - if (!workingDefaultPrevented) { - var origPreventDefault = Event.prototype.preventDefault; - Event.prototype.preventDefault = function() { - if (!this.cancelable) { - return; - } - origPreventDefault.call(this); - Object.defineProperty(this, "defaultPrevented", { - get: function() { - return true; - }, - configurable: true - }); - }; - } - var isIE = /Trident/.test(navigator.userAgent); - if (!window.CustomEvent || isIE && typeof window.CustomEvent !== "function") { - window.CustomEvent = function(inType, params) { - params = params || {}; - var e = document.createEvent("CustomEvent"); - e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail); - return e; - }; - window.CustomEvent.prototype = window.Event.prototype; - } - if (!window.Event || isIE && typeof window.Event !== "function") { - var origEvent = window.Event; - window.Event = function(inType, params) { - params = params || {}; - var e = document.createEvent("Event"); - e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable)); - return e; - }; - window.Event.prototype = origEvent.prototype; - } -})(window.WebComponents); - -window.HTMLImports = window.HTMLImports || { - flags: {} -}; - -(function(scope) { - var IMPORT_LINK_TYPE = "import"; - var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement("link")); - var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill); - var wrap = function(node) { - return hasShadowDOMPolyfill ? window.ShadowDOMPolyfill.wrapIfNeeded(node) : node; - }; - var rootDocument = wrap(document); - var currentScriptDescriptor = { - get: function() { - var script = window.HTMLImports.currentScript || document.currentScript || (document.readyState !== "complete" ? document.scripts[document.scripts.length - 1] : null); - return wrap(script); - }, - configurable: true - }; - Object.defineProperty(document, "_currentScript", currentScriptDescriptor); - Object.defineProperty(rootDocument, "_currentScript", currentScriptDescriptor); - var isIE = /Trident/.test(navigator.userAgent); - function whenReady(callback, doc) { - doc = doc || rootDocument; - whenDocumentReady(function() { - watchImportsLoad(callback, doc); - }, doc); - } - var requiredReadyState = isIE ? "complete" : "interactive"; - var READY_EVENT = "readystatechange"; - function isDocumentReady(doc) { - return doc.readyState === "complete" || doc.readyState === requiredReadyState; - } - function whenDocumentReady(callback, doc) { - if (!isDocumentReady(doc)) { - var checkReady = function() { - if (doc.readyState === "complete" || doc.readyState === requiredReadyState) { - doc.removeEventListener(READY_EVENT, checkReady); - whenDocumentReady(callback, doc); - } - }; - doc.addEventListener(READY_EVENT, checkReady); - } else if (callback) { - callback(); - } - } - function markTargetLoaded(event) { - event.target.__loaded = true; - } - function watchImportsLoad(callback, doc) { - var imports = doc.querySelectorAll("link[rel=import]"); - var parsedCount = 0, importCount = imports.length, newImports = [], errorImports = []; - function checkDone() { - if (parsedCount == importCount && callback) { - callback({ - allImports: imports, - loadedImports: newImports, - errorImports: errorImports - }); - } - } - function loadedImport(e) { - markTargetLoaded(e); - newImports.push(this); - parsedCount++; - checkDone(); - } - function errorLoadingImport(e) { - errorImports.push(this); - parsedCount++; - checkDone(); - } - if (importCount) { - for (var i = 0, imp; i < importCount && (imp = imports[i]); i++) { - if (isImportLoaded(imp)) { - newImports.push(this); - parsedCount++; - checkDone(); - } else { - imp.addEventListener("load", loadedImport); - imp.addEventListener("error", errorLoadingImport); - } - } - } else { - checkDone(); - } - } - function isImportLoaded(link) { - return useNative ? link.__loaded || link.import && link.import.readyState !== "loading" : link.__importParsed; - } - if (useNative) { - new MutationObserver(function(mxns) { - for (var i = 0, l = mxns.length, m; i < l && (m = mxns[i]); i++) { - if (m.addedNodes) { - handleImports(m.addedNodes); - } - } - }).observe(document.head, { - childList: true - }); - function handleImports(nodes) { - for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { - if (isImport(n)) { - handleImport(n); - } - } - } - function isImport(element) { - return element.localName === "link" && element.rel === "import"; - } - function handleImport(element) { - var loaded = element.import; - if (loaded) { - markTargetLoaded({ - target: element - }); - } else { - element.addEventListener("load", markTargetLoaded); - element.addEventListener("error", markTargetLoaded); - } - } - (function() { - if (document.readyState === "loading") { - var imports = document.querySelectorAll("link[rel=import]"); - for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) { - handleImport(imp); - } - } - })(); - } - whenReady(function(detail) { - window.HTMLImports.ready = true; - window.HTMLImports.readyTime = new Date().getTime(); - var evt = rootDocument.createEvent("CustomEvent"); - evt.initCustomEvent("HTMLImportsLoaded", true, true, detail); - rootDocument.dispatchEvent(evt); - }); - scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE; - scope.useNative = useNative; - scope.rootDocument = rootDocument; - scope.whenReady = whenReady; - scope.isIE = isIE; -})(window.HTMLImports); - -(function(scope) { - var modules = []; - var addModule = function(module) { - modules.push(module); - }; - var initializeModules = function() { - modules.forEach(function(module) { - module(scope); - }); - }; - scope.addModule = addModule; - scope.initializeModules = initializeModules; -})(window.HTMLImports); - -window.HTMLImports.addModule(function(scope) { - var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g; - var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g; - var path = { - resolveUrlsInStyle: function(style, linkUrl) { - var doc = style.ownerDocument; - var resolver = doc.createElement("a"); - style.textContent = this.resolveUrlsInCssText(style.textContent, linkUrl, resolver); - return style; - }, - resolveUrlsInCssText: function(cssText, linkUrl, urlObj) { - var r = this.replaceUrls(cssText, urlObj, linkUrl, CSS_URL_REGEXP); - r = this.replaceUrls(r, urlObj, linkUrl, CSS_IMPORT_REGEXP); - return r; - }, - replaceUrls: function(text, urlObj, linkUrl, regexp) { - return text.replace(regexp, function(m, pre, url, post) { - var urlPath = url.replace(/["']/g, ""); - if (linkUrl) { - urlPath = new URL(urlPath, linkUrl).href; - } - urlObj.href = urlPath; - urlPath = urlObj.href; - return pre + "'" + urlPath + "'" + post; - }); - } - }; - scope.path = path; -}); - -window.HTMLImports.addModule(function(scope) { - var xhr = { - async: true, - ok: function(request) { - return request.status >= 200 && request.status < 300 || request.status === 304 || request.status === 0; - }, - load: function(url, next, nextContext) { - var request = new XMLHttpRequest(); - if (scope.flags.debug || scope.flags.bust) { - url += "?" + Math.random(); - } - request.open("GET", url, xhr.async); - request.addEventListener("readystatechange", function(e) { - if (request.readyState === 4) { - var redirectedUrl = null; - try { - var locationHeader = request.getResponseHeader("Location"); - if (locationHeader) { - redirectedUrl = locationHeader.substr(0, 1) === "/" ? location.origin + locationHeader : locationHeader; - } - } catch (e) { - console.error(e.message); - } - next.call(nextContext, !xhr.ok(request) && request, request.response || request.responseText, redirectedUrl); - } - }); - request.send(); - return request; - }, - loadDocument: function(url, next, nextContext) { - this.load(url, next, nextContext).responseType = "document"; - } - }; - scope.xhr = xhr; -}); - -window.HTMLImports.addModule(function(scope) { - var xhr = scope.xhr; - var flags = scope.flags; - var Loader = function(onLoad, onComplete) { - this.cache = {}; - this.onload = onLoad; - this.oncomplete = onComplete; - this.inflight = 0; - this.pending = {}; - }; - Loader.prototype = { - addNodes: function(nodes) { - this.inflight += nodes.length; - for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { - this.require(n); - } - this.checkDone(); - }, - addNode: function(node) { - this.inflight++; - this.require(node); - this.checkDone(); - }, - require: function(elt) { - var url = elt.src || elt.href; - elt.__nodeUrl = url; - if (!this.dedupe(url, elt)) { - this.fetch(url, elt); - } - }, - dedupe: function(url, elt) { - if (this.pending[url]) { - this.pending[url].push(elt); - return true; - } - var resource; - if (this.cache[url]) { - this.onload(url, elt, this.cache[url]); - this.tail(); - return true; - } - this.pending[url] = [ elt ]; - return false; - }, - fetch: function(url, elt) { - flags.load && console.log("fetch", url, elt); - if (!url) { - setTimeout(function() { - this.receive(url, elt, { - error: "href must be specified" - }, null); - }.bind(this), 0); - } else if (url.match(/^data:/)) { - var pieces = url.split(","); - var header = pieces[0]; - var body = pieces[1]; - if (header.indexOf(";base64") > -1) { - body = atob(body); - } else { - body = decodeURIComponent(body); - } - setTimeout(function() { - this.receive(url, elt, null, body); - }.bind(this), 0); - } else { - var receiveXhr = function(err, resource, redirectedUrl) { - this.receive(url, elt, err, resource, redirectedUrl); - }.bind(this); - xhr.load(url, receiveXhr); - } - }, - receive: function(url, elt, err, resource, redirectedUrl) { - this.cache[url] = resource; - var $p = this.pending[url]; - for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) { - this.onload(url, p, resource, err, redirectedUrl); - this.tail(); - } - this.pending[url] = null; - }, - tail: function() { - --this.inflight; - this.checkDone(); - }, - checkDone: function() { - if (!this.inflight) { - this.oncomplete(); - } - } - }; - scope.Loader = Loader; -}); - -window.HTMLImports.addModule(function(scope) { - var Observer = function(addCallback) { - this.addCallback = addCallback; - this.mo = new MutationObserver(this.handler.bind(this)); - }; - Observer.prototype = { - handler: function(mutations) { - for (var i = 0, l = mutations.length, m; i < l && (m = mutations[i]); i++) { - if (m.type === "childList" && m.addedNodes.length) { - this.addedNodes(m.addedNodes); - } - } - }, - addedNodes: function(nodes) { - if (this.addCallback) { - this.addCallback(nodes); - } - for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) { - if (n.children && n.children.length) { - this.addedNodes(n.children); - } - } - }, - observe: function(root) { - this.mo.observe(root, { - childList: true, - subtree: true - }); - } - }; - scope.Observer = Observer; -}); - -window.HTMLImports.addModule(function(scope) { - var path = scope.path; - var rootDocument = scope.rootDocument; - var flags = scope.flags; - var isIE = scope.isIE; - var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE; - var IMPORT_SELECTOR = "link[rel=" + IMPORT_LINK_TYPE + "]"; - var importParser = { - documentSelectors: IMPORT_SELECTOR, - importsSelectors: [ IMPORT_SELECTOR, "link[rel=stylesheet]:not([type])", "style:not([type])", "script:not([type])", 'script[type="application/javascript"]', 'script[type="text/javascript"]' ].join(","), - map: { - link: "parseLink", - script: "parseScript", - style: "parseStyle" - }, - dynamicElements: [], - parseNext: function() { - var next = this.nextToParse(); - if (next) { - this.parse(next); - } - }, - parse: function(elt) { - if (this.isParsed(elt)) { - flags.parse && console.log("[%s] is already parsed", elt.localName); - return; - } - var fn = this[this.map[elt.localName]]; - if (fn) { - this.markParsing(elt); - fn.call(this, elt); - } - }, - parseDynamic: function(elt, quiet) { - this.dynamicElements.push(elt); - if (!quiet) { - this.parseNext(); - } - }, - markParsing: function(elt) { - flags.parse && console.log("parsing", elt); - this.parsingElement = elt; - }, - markParsingComplete: function(elt) { - elt.__importParsed = true; - this.markDynamicParsingComplete(elt); - if (elt.__importElement) { - elt.__importElement.__importParsed = true; - this.markDynamicParsingComplete(elt.__importElement); - } - this.parsingElement = null; - flags.parse && console.log("completed", elt); - }, - markDynamicParsingComplete: function(elt) { - var i = this.dynamicElements.indexOf(elt); - if (i >= 0) { - this.dynamicElements.splice(i, 1); - } - }, - parseImport: function(elt) { - elt.import = elt.__doc; - if (window.HTMLImports.__importsParsingHook) { - window.HTMLImports.__importsParsingHook(elt); - } - if (elt.import) { - elt.import.__importParsed = true; - } - this.markParsingComplete(elt); - if (elt.__resource && !elt.__error) { - elt.dispatchEvent(new CustomEvent("load", { - bubbles: false - })); - } else { - elt.dispatchEvent(new CustomEvent("error", { - bubbles: false - })); - } - if (elt.__pending) { - var fn; - while (elt.__pending.length) { - fn = elt.__pending.shift(); - if (fn) { - fn({ - target: elt - }); - } - } - } - this.parseNext(); - }, - parseLink: function(linkElt) { - if (nodeIsImport(linkElt)) { - this.parseImport(linkElt); - } else { - linkElt.href = linkElt.href; - this.parseGeneric(linkElt); - } - }, - parseStyle: function(elt) { - var src = elt; - elt = cloneStyle(elt); - src.__appliedElement = elt; - elt.__importElement = src; - this.parseGeneric(elt); - }, - parseGeneric: function(elt) { - this.trackElement(elt); - this.addElementToDocument(elt); - }, - rootImportForElement: function(elt) { - var n = elt; - while (n.ownerDocument.__importLink) { - n = n.ownerDocument.__importLink; - } - return n; - }, - addElementToDocument: function(elt) { - var port = this.rootImportForElement(elt.__importElement || elt); - port.parentNode.insertBefore(elt, port); - }, - trackElement: function(elt, callback) { - var self = this; - var done = function(e) { - elt.removeEventListener("load", done); - elt.removeEventListener("error", done); - if (callback) { - callback(e); - } - self.markParsingComplete(elt); - self.parseNext(); - }; - elt.addEventListener("load", done); - elt.addEventListener("error", done); - if (isIE && elt.localName === "style") { - var fakeLoad = false; - if (elt.textContent.indexOf("@import") == -1) { - fakeLoad = true; - } else if (elt.sheet) { - fakeLoad = true; - var csr = elt.sheet.cssRules; - var len = csr ? csr.length : 0; - for (var i = 0, r; i < len && (r = csr[i]); i++) { - if (r.type === CSSRule.IMPORT_RULE) { - fakeLoad = fakeLoad && Boolean(r.styleSheet); - } - } - } - if (fakeLoad) { - setTimeout(function() { - elt.dispatchEvent(new CustomEvent("load", { - bubbles: false - })); - }); - } - } - }, - parseScript: function(scriptElt) { - var script = document.createElement("script"); - script.__importElement = scriptElt; - script.src = scriptElt.src ? scriptElt.src : generateScriptDataUrl(scriptElt); - scope.currentScript = scriptElt; - this.trackElement(script, function(e) { - if (script.parentNode) { - script.parentNode.removeChild(script); - } - scope.currentScript = null; - }); - this.addElementToDocument(script); - }, - nextToParse: function() { - this._mayParse = []; - return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic()); - }, - nextToParseInDoc: function(doc, link) { - if (doc && this._mayParse.indexOf(doc) < 0) { - this._mayParse.push(doc); - var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc)); - for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { - if (!this.isParsed(n)) { - if (this.hasResource(n)) { - return nodeIsImport(n) ? this.nextToParseInDoc(n.__doc, n) : n; - } else { - return; - } - } - } - } - return link; - }, - nextToParseDynamic: function() { - return this.dynamicElements[0]; - }, - parseSelectorsForNode: function(node) { - var doc = node.ownerDocument || node; - return doc === rootDocument ? this.documentSelectors : this.importsSelectors; - }, - isParsed: function(node) { - return node.__importParsed; - }, - needsDynamicParsing: function(elt) { - return this.dynamicElements.indexOf(elt) >= 0; - }, - hasResource: function(node) { - if (nodeIsImport(node) && node.__doc === undefined) { - return false; - } - return true; - } - }; - function nodeIsImport(elt) { - return elt.localName === "link" && elt.rel === IMPORT_LINK_TYPE; - } - function generateScriptDataUrl(script) { - var scriptContent = generateScriptContent(script); - return "data:text/javascript;charset=utf-8," + encodeURIComponent(scriptContent); - } - function generateScriptContent(script) { - return script.textContent + generateSourceMapHint(script); - } - function generateSourceMapHint(script) { - var owner = script.ownerDocument; - owner.__importedScripts = owner.__importedScripts || 0; - var moniker = script.ownerDocument.baseURI; - var num = owner.__importedScripts ? "-" + owner.__importedScripts : ""; - owner.__importedScripts++; - return "\n//# sourceURL=" + moniker + num + ".js\n"; - } - function cloneStyle(style) { - var clone = style.ownerDocument.createElement("style"); - clone.textContent = style.textContent; - path.resolveUrlsInStyle(clone); - return clone; - } - scope.parser = importParser; - scope.IMPORT_SELECTOR = IMPORT_SELECTOR; -}); - -window.HTMLImports.addModule(function(scope) { - var flags = scope.flags; - var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE; - var IMPORT_SELECTOR = scope.IMPORT_SELECTOR; - var rootDocument = scope.rootDocument; - var Loader = scope.Loader; - var Observer = scope.Observer; - var parser = scope.parser; - var importer = { - documents: {}, - documentPreloadSelectors: IMPORT_SELECTOR, - importsPreloadSelectors: [ IMPORT_SELECTOR ].join(","), - loadNode: function(node) { - importLoader.addNode(node); - }, - loadSubtree: function(parent) { - var nodes = this.marshalNodes(parent); - importLoader.addNodes(nodes); - }, - marshalNodes: function(parent) { - return parent.querySelectorAll(this.loadSelectorsForNode(parent)); - }, - loadSelectorsForNode: function(node) { - var doc = node.ownerDocument || node; - return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors; - }, - loaded: function(url, elt, resource, err, redirectedUrl) { - flags.load && console.log("loaded", url, elt); - elt.__resource = resource; - elt.__error = err; - if (isImportLink(elt)) { - var doc = this.documents[url]; - if (doc === undefined) { - doc = err ? null : makeDocument(resource, redirectedUrl || url); - if (doc) { - doc.__importLink = elt; - this.bootDocument(doc); - } - this.documents[url] = doc; - } - elt.__doc = doc; - } - parser.parseNext(); - }, - bootDocument: function(doc) { - this.loadSubtree(doc); - this.observer.observe(doc); - parser.parseNext(); - }, - loadedAll: function() { - parser.parseNext(); - } - }; - var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer)); - importer.observer = new Observer(); - function isImportLink(elt) { - return isLinkRel(elt, IMPORT_LINK_TYPE); - } - function isLinkRel(elt, rel) { - return elt.localName === "link" && elt.getAttribute("rel") === rel; - } - function hasBaseURIAccessor(doc) { - return !!Object.getOwnPropertyDescriptor(doc, "baseURI"); - } - function makeDocument(resource, url) { - var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE); - doc._URL = url; - var base = doc.createElement("base"); - base.setAttribute("href", url); - if (!doc.baseURI && !hasBaseURIAccessor(doc)) { - Object.defineProperty(doc, "baseURI", { - value: url - }); - } - var meta = doc.createElement("meta"); - meta.setAttribute("charset", "utf-8"); - doc.head.appendChild(meta); - doc.head.appendChild(base); - doc.body.innerHTML = resource; - if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) { - HTMLTemplateElement.bootstrap(doc); - } - return doc; - } - if (!document.baseURI) { - var baseURIDescriptor = { - get: function() { - var base = document.querySelector("base"); - return base ? base.href : window.location.href; - }, - configurable: true - }; - Object.defineProperty(document, "baseURI", baseURIDescriptor); - Object.defineProperty(rootDocument, "baseURI", baseURIDescriptor); - } - scope.importer = importer; - scope.importLoader = importLoader; -}); - -window.HTMLImports.addModule(function(scope) { - var parser = scope.parser; - var importer = scope.importer; - var dynamic = { - added: function(nodes) { - var owner, parsed, loading; - for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { - if (!owner) { - owner = n.ownerDocument; - parsed = parser.isParsed(owner); - } - loading = this.shouldLoadNode(n); - if (loading) { - importer.loadNode(n); - } - if (this.shouldParseNode(n) && parsed) { - parser.parseDynamic(n, loading); - } - } - }, - shouldLoadNode: function(node) { - return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node)); - }, - shouldParseNode: function(node) { - return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node)); - } - }; - importer.observer.addCallback = dynamic.added.bind(dynamic); - var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector; -}); - -(function(scope) { - var initializeModules = scope.initializeModules; - var isIE = scope.isIE; - if (scope.useNative) { - return; - } - initializeModules(); - var rootDocument = scope.rootDocument; - function bootstrap() { - window.HTMLImports.importer.bootDocument(rootDocument); - } - if (document.readyState === "complete" || document.readyState === "interactive" && !window.attachEvent) { - bootstrap(); - } else { - document.addEventListener("DOMContentLoaded", bootstrap); - } -})(window.HTMLImports); \ No newline at end of file diff --git a/dashboard-ui/bower_components/webcomponentsjs/HTMLImports.min.js b/dashboard-ui/bower_components/webcomponentsjs/HTMLImports.min.js deleted file mode 100644 index dd5b11758a..0000000000 --- a/dashboard-ui/bower_components/webcomponentsjs/HTMLImports.min.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @license - * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. - * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - * Code distributed by Google as part of the polymer project is also - * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt - */ -// @version 0.7.22 -"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){E.push(e),g||(g=!0,f(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){g=!1;var e=E;E=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=v.get(n);if(r)for(var o=0;o0){var o=n[r-1],i=m(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;nm&&(h=s[m]);m++)a(h)?(u.push(this),d++,n()):(h.addEventListener("load",r),h.addEventListener("error",i));else n()}function a(e){return l?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)d(t)&&c(t)}function d(e){return"link"===e.localName&&"import"===e.rel}function c(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",l=Boolean(u in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),m=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},p=m(document),f={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return m(e)},configurable:!0};Object.defineProperty(document,"_currentScript",f),Object.defineProperty(p,"_currentScript",f);var v=/Trident/.test(navigator.userAgent),w=v?"complete":"interactive",b="readystatechange";l&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)c(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=p.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),p.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=l,e.rootDocument=p,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,d=a.length;d>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,d=e.flags,c=e.isIE,u=e.IMPORT_LINK_TYPE,l="link[rel="+u+"]",h={documentSelectors:l,importsSelectors:[l,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(d.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){d.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,d.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),c&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,d=0;s>d&&(i=a[d]);d++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=h,e.IMPORT_SELECTOR=l}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,d=e.rootDocument,c=e.Loader,u=e.Observer,l=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){m.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);m.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===d?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var d=this.documents[e];void 0===d&&(d=a?null:o(r,s||e),d&&(d.__importLink=n,this.bootDocument(d)),this.documents[e]=d),n.__doc=d}l.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),l.parseNext()},loadedAll:function(){l.parseNext()}},m=new c(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new u,!document.baseURI){var p={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",p),Object.defineProperty(d,"baseURI",p)}e.importer=h,e.importLoader=m}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,d=e.length;d>s&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports); \ No newline at end of file diff --git a/dashboard-ui/bower_components/webcomponentsjs/MutationObserver.js b/dashboard-ui/bower_components/webcomponentsjs/MutationObserver.js deleted file mode 100644 index e58713b6a8..0000000000 --- a/dashboard-ui/bower_components/webcomponentsjs/MutationObserver.js +++ /dev/null @@ -1,350 +0,0 @@ -/** - * @license - * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. - * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - * Code distributed by Google as part of the polymer project is also - * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt - */ -// @version 0.7.22 -if (typeof WeakMap === "undefined") { - (function() { - var defineProperty = Object.defineProperty; - var counter = Date.now() % 1e9; - var WeakMap = function() { - this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__"); - }; - WeakMap.prototype = { - set: function(key, value) { - var entry = key[this.name]; - if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, { - value: [ key, value ], - writable: true - }); - return this; - }, - get: function(key) { - var entry; - return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined; - }, - "delete": function(key) { - var entry = key[this.name]; - if (!entry || entry[0] !== key) return false; - entry[0] = entry[1] = undefined; - return true; - }, - has: function(key) { - var entry = key[this.name]; - if (!entry) return false; - return entry[0] === key; - } - }; - window.WeakMap = WeakMap; - })(); -} - -(function(global) { - if (global.JsMutationObserver) { - return; - } - var registrationsTable = new WeakMap(); - var setImmediate; - if (/Trident|Edge/.test(navigator.userAgent)) { - setImmediate = setTimeout; - } else if (window.setImmediate) { - setImmediate = window.setImmediate; - } else { - var setImmediateQueue = []; - var sentinel = String(Math.random()); - window.addEventListener("message", function(e) { - if (e.data === sentinel) { - var queue = setImmediateQueue; - setImmediateQueue = []; - queue.forEach(function(func) { - func(); - }); - } - }); - setImmediate = function(func) { - setImmediateQueue.push(func); - window.postMessage(sentinel, "*"); - }; - } - var isScheduled = false; - var scheduledObservers = []; - function scheduleCallback(observer) { - scheduledObservers.push(observer); - if (!isScheduled) { - isScheduled = true; - setImmediate(dispatchCallbacks); - } - } - function wrapIfNeeded(node) { - return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node; - } - function dispatchCallbacks() { - isScheduled = false; - var observers = scheduledObservers; - scheduledObservers = []; - observers.sort(function(o1, o2) { - return o1.uid_ - o2.uid_; - }); - var anyNonEmpty = false; - observers.forEach(function(observer) { - var queue = observer.takeRecords(); - removeTransientObserversFor(observer); - if (queue.length) { - observer.callback_(queue, observer); - anyNonEmpty = true; - } - }); - if (anyNonEmpty) dispatchCallbacks(); - } - function removeTransientObserversFor(observer) { - observer.nodes_.forEach(function(node) { - var registrations = registrationsTable.get(node); - if (!registrations) return; - registrations.forEach(function(registration) { - if (registration.observer === observer) registration.removeTransientObservers(); - }); - }); - } - function forEachAncestorAndObserverEnqueueRecord(target, callback) { - for (var node = target; node; node = node.parentNode) { - var registrations = registrationsTable.get(node); - if (registrations) { - for (var j = 0; j < registrations.length; j++) { - var registration = registrations[j]; - var options = registration.options; - if (node !== target && !options.subtree) continue; - var record = callback(options); - if (record) registration.enqueue(record); - } - } - } - } - var uidCounter = 0; - function JsMutationObserver(callback) { - this.callback_ = callback; - this.nodes_ = []; - this.records_ = []; - this.uid_ = ++uidCounter; - } - JsMutationObserver.prototype = { - observe: function(target, options) { - target = wrapIfNeeded(target); - if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) { - throw new SyntaxError(); - } - var registrations = registrationsTable.get(target); - if (!registrations) registrationsTable.set(target, registrations = []); - var registration; - for (var i = 0; i < registrations.length; i++) { - if (registrations[i].observer === this) { - registration = registrations[i]; - registration.removeListeners(); - registration.options = options; - break; - } - } - if (!registration) { - registration = new Registration(this, target, options); - registrations.push(registration); - this.nodes_.push(target); - } - registration.addListeners(); - }, - disconnect: function() { - this.nodes_.forEach(function(node) { - var registrations = registrationsTable.get(node); - for (var i = 0; i < registrations.length; i++) { - var registration = registrations[i]; - if (registration.observer === this) { - registration.removeListeners(); - registrations.splice(i, 1); - break; - } - } - }, this); - this.records_ = []; - }, - takeRecords: function() { - var copyOfRecords = this.records_; - this.records_ = []; - return copyOfRecords; - } - }; - function MutationRecord(type, target) { - this.type = type; - this.target = target; - this.addedNodes = []; - this.removedNodes = []; - this.previousSibling = null; - this.nextSibling = null; - this.attributeName = null; - this.attributeNamespace = null; - this.oldValue = null; - } - function copyMutationRecord(original) { - var record = new MutationRecord(original.type, original.target); - record.addedNodes = original.addedNodes.slice(); - record.removedNodes = original.removedNodes.slice(); - record.previousSibling = original.previousSibling; - record.nextSibling = original.nextSibling; - record.attributeName = original.attributeName; - record.attributeNamespace = original.attributeNamespace; - record.oldValue = original.oldValue; - return record; - } - var currentRecord, recordWithOldValue; - function getRecord(type, target) { - return currentRecord = new MutationRecord(type, target); - } - function getRecordWithOldValue(oldValue) { - if (recordWithOldValue) return recordWithOldValue; - recordWithOldValue = copyMutationRecord(currentRecord); - recordWithOldValue.oldValue = oldValue; - return recordWithOldValue; - } - function clearRecords() { - currentRecord = recordWithOldValue = undefined; - } - function recordRepresentsCurrentMutation(record) { - return record === recordWithOldValue || record === currentRecord; - } - function selectRecord(lastRecord, newRecord) { - if (lastRecord === newRecord) return lastRecord; - if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue; - return null; - } - function Registration(observer, target, options) { - this.observer = observer; - this.target = target; - this.options = options; - this.transientObservedNodes = []; - } - Registration.prototype = { - enqueue: function(record) { - var records = this.observer.records_; - var length = records.length; - if (records.length > 0) { - var lastRecord = records[length - 1]; - var recordToReplaceLast = selectRecord(lastRecord, record); - if (recordToReplaceLast) { - records[length - 1] = recordToReplaceLast; - return; - } - } else { - scheduleCallback(this.observer); - } - records[length] = record; - }, - addListeners: function() { - this.addListeners_(this.target); - }, - addListeners_: function(node) { - var options = this.options; - if (options.attributes) node.addEventListener("DOMAttrModified", this, true); - if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true); - if (options.childList) node.addEventListener("DOMNodeInserted", this, true); - if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true); - }, - removeListeners: function() { - this.removeListeners_(this.target); - }, - removeListeners_: function(node) { - var options = this.options; - if (options.attributes) node.removeEventListener("DOMAttrModified", this, true); - if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true); - if (options.childList) node.removeEventListener("DOMNodeInserted", this, true); - if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true); - }, - addTransientObserver: function(node) { - if (node === this.target) return; - this.addListeners_(node); - this.transientObservedNodes.push(node); - var registrations = registrationsTable.get(node); - if (!registrations) registrationsTable.set(node, registrations = []); - registrations.push(this); - }, - removeTransientObservers: function() { - var transientObservedNodes = this.transientObservedNodes; - this.transientObservedNodes = []; - transientObservedNodes.forEach(function(node) { - this.removeListeners_(node); - var registrations = registrationsTable.get(node); - for (var i = 0; i < registrations.length; i++) { - if (registrations[i] === this) { - registrations.splice(i, 1); - break; - } - } - }, this); - }, - handleEvent: function(e) { - e.stopImmediatePropagation(); - switch (e.type) { - case "DOMAttrModified": - var name = e.attrName; - var namespace = e.relatedNode.namespaceURI; - var target = e.target; - var record = new getRecord("attributes", target); - record.attributeName = name; - record.attributeNamespace = namespace; - var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue; - forEachAncestorAndObserverEnqueueRecord(target, function(options) { - if (!options.attributes) return; - if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) { - return; - } - if (options.attributeOldValue) return getRecordWithOldValue(oldValue); - return record; - }); - break; - - case "DOMCharacterDataModified": - var target = e.target; - var record = getRecord("characterData", target); - var oldValue = e.prevValue; - forEachAncestorAndObserverEnqueueRecord(target, function(options) { - if (!options.characterData) return; - if (options.characterDataOldValue) return getRecordWithOldValue(oldValue); - return record; - }); - break; - - case "DOMNodeRemoved": - this.addTransientObserver(e.target); - - case "DOMNodeInserted": - var changedNode = e.target; - var addedNodes, removedNodes; - if (e.type === "DOMNodeInserted") { - addedNodes = [ changedNode ]; - removedNodes = []; - } else { - addedNodes = []; - removedNodes = [ changedNode ]; - } - var previousSibling = changedNode.previousSibling; - var nextSibling = changedNode.nextSibling; - var record = getRecord("childList", e.target.parentNode); - record.addedNodes = addedNodes; - record.removedNodes = removedNodes; - record.previousSibling = previousSibling; - record.nextSibling = nextSibling; - forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) { - if (!options.childList) return; - return record; - }); - } - clearRecords(); - } - }; - global.JsMutationObserver = JsMutationObserver; - if (!global.MutationObserver) { - global.MutationObserver = JsMutationObserver; - JsMutationObserver._isPolyfilled = true; - } -})(self); \ No newline at end of file diff --git a/dashboard-ui/bower_components/webcomponentsjs/MutationObserver.min.js b/dashboard-ui/bower_components/webcomponentsjs/MutationObserver.min.js deleted file mode 100644 index 267b374ec1..0000000000 --- a/dashboard-ui/bower_components/webcomponentsjs/MutationObserver.min.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @license - * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. - * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - * Code distributed by Google as part of the polymer project is also - * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt - */ -// @version 0.7.22 -"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,r=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};r.prototype={set:function(t,r){var i=t[this.name];return i&&i[0]===t?i[1]=r:e(t,this.name,{value:[t,r],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=r}(),function(e){function t(e){N.push(e),O||(O=!0,b(i))}function r(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function i(){O=!1;var e=N;N=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var r=e.takeRecords();n(e),r.length&&(e.callback_(r,e),t=!0)}),t&&i()}function n(e){e.nodes_.forEach(function(t){var r=p.get(t);r&&r.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function a(e,t){for(var r=e;r;r=r.parentNode){var i=p.get(r);if(i)for(var n=0;n0){var n=r[i-1],a=l(n,e);if(a)return void(r[i-1]=a)}else t(this.observer);r[i]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=p.get(e);t||p.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=p.get(e),r=0;r>> 0) + (counter++ + "__"); - }; - WeakMap.prototype = { - set: function(key, value) { - var entry = key[this.name]; - if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, { - value: [ key, value ], - writable: true - }); - return this; - }, - get: function(key) { - var entry; - return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined; - }, - "delete": function(key) { - var entry = key[this.name]; - if (!entry || entry[0] !== key) return false; - entry[0] = entry[1] = undefined; - return true; - }, - has: function(key) { - var entry = key[this.name]; - if (!entry) return false; - return entry[0] === key; - } - }; - window.WeakMap = WeakMap; - })(); -} - -window.ShadowDOMPolyfill = {}; - -(function(scope) { - "use strict"; - var constructorTable = new WeakMap(); - var nativePrototypeTable = new WeakMap(); - var wrappers = Object.create(null); - function detectEval() { - if (typeof chrome !== "undefined" && chrome.app && chrome.app.runtime) { - return false; - } - if (navigator.getDeviceStorage) { - return false; - } - try { - var f = new Function("return true;"); - return f(); - } catch (ex) { - return false; - } - } - var hasEval = detectEval(); - function assert(b) { - if (!b) throw new Error("Assertion failed"); - } - var defineProperty = Object.defineProperty; - var getOwnPropertyNames = Object.getOwnPropertyNames; - var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - function mixin(to, from) { - var names = getOwnPropertyNames(from); - for (var i = 0; i < names.length; i++) { - var name = names[i]; - defineProperty(to, name, getOwnPropertyDescriptor(from, name)); - } - return to; - } - function mixinStatics(to, from) { - var names = getOwnPropertyNames(from); - for (var i = 0; i < names.length; i++) { - var name = names[i]; - switch (name) { - case "arguments": - case "caller": - case "length": - case "name": - case "prototype": - case "toString": - continue; - } - defineProperty(to, name, getOwnPropertyDescriptor(from, name)); - } - return to; - } - function oneOf(object, propertyNames) { - for (var i = 0; i < propertyNames.length; i++) { - if (propertyNames[i] in object) return propertyNames[i]; - } - } - var nonEnumerableDataDescriptor = { - value: undefined, - configurable: true, - enumerable: false, - writable: true - }; - function defineNonEnumerableDataProperty(object, name, value) { - nonEnumerableDataDescriptor.value = value; - defineProperty(object, name, nonEnumerableDataDescriptor); - } - getOwnPropertyNames(window); - function getWrapperConstructor(node, opt_instance) { - var nativePrototype = node.__proto__ || Object.getPrototypeOf(node); - if (isFirefox) { - try { - getOwnPropertyNames(nativePrototype); - } catch (error) { - nativePrototype = nativePrototype.__proto__; - } - } - var wrapperConstructor = constructorTable.get(nativePrototype); - if (wrapperConstructor) return wrapperConstructor; - var parentWrapperConstructor = getWrapperConstructor(nativePrototype); - var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor); - registerInternal(nativePrototype, GeneratedWrapper, opt_instance); - return GeneratedWrapper; - } - function addForwardingProperties(nativePrototype, wrapperPrototype) { - installProperty(nativePrototype, wrapperPrototype, true); - } - function registerInstanceProperties(wrapperPrototype, instanceObject) { - installProperty(instanceObject, wrapperPrototype, false); - } - var isFirefox = /Firefox/.test(navigator.userAgent); - var dummyDescriptor = { - get: function() {}, - set: function(v) {}, - configurable: true, - enumerable: true - }; - function isEventHandlerName(name) { - return /^on[a-z]+$/.test(name); - } - function isIdentifierName(name) { - return /^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(name); - } - function getGetter(name) { - return hasEval && isIdentifierName(name) ? new Function("return this.__impl4cf1e782hg__." + name) : function() { - return this.__impl4cf1e782hg__[name]; - }; - } - function getSetter(name) { - return hasEval && isIdentifierName(name) ? new Function("v", "this.__impl4cf1e782hg__." + name + " = v") : function(v) { - this.__impl4cf1e782hg__[name] = v; - }; - } - function getMethod(name) { - return hasEval && isIdentifierName(name) ? new Function("return this.__impl4cf1e782hg__." + name + ".apply(this.__impl4cf1e782hg__, arguments)") : function() { - return this.__impl4cf1e782hg__[name].apply(this.__impl4cf1e782hg__, arguments); - }; - } - function getDescriptor(source, name) { - try { - return Object.getOwnPropertyDescriptor(source, name); - } catch (ex) { - return dummyDescriptor; - } - } - var isBrokenSafari = function() { - var descr = Object.getOwnPropertyDescriptor(Node.prototype, "nodeType"); - return descr && !descr.get && !descr.set; - }(); - function installProperty(source, target, allowMethod, opt_blacklist) { - var names = getOwnPropertyNames(source); - for (var i = 0; i < names.length; i++) { - var name = names[i]; - if (name === "polymerBlackList_") continue; - if (name in target) continue; - if (source.polymerBlackList_ && source.polymerBlackList_[name]) continue; - if (isFirefox) { - source.__lookupGetter__(name); - } - var descriptor = getDescriptor(source, name); - var getter, setter; - if (typeof descriptor.value === "function") { - if (allowMethod) { - target[name] = getMethod(name); - } - continue; - } - var isEvent = isEventHandlerName(name); - if (isEvent) getter = scope.getEventHandlerGetter(name); else getter = getGetter(name); - if (descriptor.writable || descriptor.set || isBrokenSafari) { - if (isEvent) setter = scope.getEventHandlerSetter(name); else setter = getSetter(name); - } - var configurable = isBrokenSafari || descriptor.configurable; - defineProperty(target, name, { - get: getter, - set: setter, - configurable: configurable, - enumerable: descriptor.enumerable - }); - } - } - function register(nativeConstructor, wrapperConstructor, opt_instance) { - if (nativeConstructor == null) { - return; - } - var nativePrototype = nativeConstructor.prototype; - registerInternal(nativePrototype, wrapperConstructor, opt_instance); - mixinStatics(wrapperConstructor, nativeConstructor); - } - function registerInternal(nativePrototype, wrapperConstructor, opt_instance) { - var wrapperPrototype = wrapperConstructor.prototype; - assert(constructorTable.get(nativePrototype) === undefined); - constructorTable.set(nativePrototype, wrapperConstructor); - nativePrototypeTable.set(wrapperPrototype, nativePrototype); - addForwardingProperties(nativePrototype, wrapperPrototype); - if (opt_instance) registerInstanceProperties(wrapperPrototype, opt_instance); - defineNonEnumerableDataProperty(wrapperPrototype, "constructor", wrapperConstructor); - wrapperConstructor.prototype = wrapperPrototype; - } - function isWrapperFor(wrapperConstructor, nativeConstructor) { - return constructorTable.get(nativeConstructor.prototype) === wrapperConstructor; - } - function registerObject(object) { - var nativePrototype = Object.getPrototypeOf(object); - var superWrapperConstructor = getWrapperConstructor(nativePrototype); - var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor); - registerInternal(nativePrototype, GeneratedWrapper, object); - return GeneratedWrapper; - } - function createWrapperConstructor(superWrapperConstructor) { - function GeneratedWrapper(node) { - superWrapperConstructor.call(this, node); - } - var p = Object.create(superWrapperConstructor.prototype); - p.constructor = GeneratedWrapper; - GeneratedWrapper.prototype = p; - return GeneratedWrapper; - } - function isWrapper(object) { - return object && object.__impl4cf1e782hg__; - } - function isNative(object) { - return !isWrapper(object); - } - function wrap(impl) { - if (impl === null) return null; - assert(isNative(impl)); - var wrapper = impl.__wrapper8e3dd93a60__; - if (wrapper != null) { - return wrapper; - } - return impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl, impl))(impl); - } - function unwrap(wrapper) { - if (wrapper === null) return null; - assert(isWrapper(wrapper)); - return wrapper.__impl4cf1e782hg__; - } - function unsafeUnwrap(wrapper) { - return wrapper.__impl4cf1e782hg__; - } - function setWrapper(impl, wrapper) { - wrapper.__impl4cf1e782hg__ = impl; - impl.__wrapper8e3dd93a60__ = wrapper; - } - function unwrapIfNeeded(object) { - return object && isWrapper(object) ? unwrap(object) : object; - } - function wrapIfNeeded(object) { - return object && !isWrapper(object) ? wrap(object) : object; - } - function rewrap(node, wrapper) { - if (wrapper === null) return; - assert(isNative(node)); - assert(wrapper === undefined || isWrapper(wrapper)); - node.__wrapper8e3dd93a60__ = wrapper; - } - var getterDescriptor = { - get: undefined, - configurable: true, - enumerable: true - }; - function defineGetter(constructor, name, getter) { - getterDescriptor.get = getter; - defineProperty(constructor.prototype, name, getterDescriptor); - } - function defineWrapGetter(constructor, name) { - defineGetter(constructor, name, function() { - return wrap(this.__impl4cf1e782hg__[name]); - }); - } - function forwardMethodsToWrapper(constructors, names) { - constructors.forEach(function(constructor) { - names.forEach(function(name) { - constructor.prototype[name] = function() { - var w = wrapIfNeeded(this); - return w[name].apply(w, arguments); - }; - }); - }); - } - scope.addForwardingProperties = addForwardingProperties; - scope.assert = assert; - scope.constructorTable = constructorTable; - scope.defineGetter = defineGetter; - scope.defineWrapGetter = defineWrapGetter; - scope.forwardMethodsToWrapper = forwardMethodsToWrapper; - scope.isIdentifierName = isIdentifierName; - scope.isWrapper = isWrapper; - scope.isWrapperFor = isWrapperFor; - scope.mixin = mixin; - scope.nativePrototypeTable = nativePrototypeTable; - scope.oneOf = oneOf; - scope.registerObject = registerObject; - scope.registerWrapper = register; - scope.rewrap = rewrap; - scope.setWrapper = setWrapper; - scope.unsafeUnwrap = unsafeUnwrap; - scope.unwrap = unwrap; - scope.unwrapIfNeeded = unwrapIfNeeded; - scope.wrap = wrap; - scope.wrapIfNeeded = wrapIfNeeded; - scope.wrappers = wrappers; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - function newSplice(index, removed, addedCount) { - return { - index: index, - removed: removed, - addedCount: addedCount - }; - } - var EDIT_LEAVE = 0; - var EDIT_UPDATE = 1; - var EDIT_ADD = 2; - var EDIT_DELETE = 3; - function ArraySplice() {} - ArraySplice.prototype = { - calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) { - var rowCount = oldEnd - oldStart + 1; - var columnCount = currentEnd - currentStart + 1; - var distances = new Array(rowCount); - for (var i = 0; i < rowCount; i++) { - distances[i] = new Array(columnCount); - distances[i][0] = i; - } - for (var j = 0; j < columnCount; j++) distances[0][j] = j; - for (var i = 1; i < rowCount; i++) { - for (var j = 1; j < columnCount; j++) { - if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1])) distances[i][j] = distances[i - 1][j - 1]; else { - var north = distances[i - 1][j] + 1; - var west = distances[i][j - 1] + 1; - distances[i][j] = north < west ? north : west; - } - } - } - return distances; - }, - spliceOperationsFromEditDistances: function(distances) { - var i = distances.length - 1; - var j = distances[0].length - 1; - var current = distances[i][j]; - var edits = []; - while (i > 0 || j > 0) { - if (i == 0) { - edits.push(EDIT_ADD); - j--; - continue; - } - if (j == 0) { - edits.push(EDIT_DELETE); - i--; - continue; - } - var northWest = distances[i - 1][j - 1]; - var west = distances[i - 1][j]; - var north = distances[i][j - 1]; - var min; - if (west < north) min = west < northWest ? west : northWest; else min = north < northWest ? north : northWest; - if (min == northWest) { - if (northWest == current) { - edits.push(EDIT_LEAVE); - } else { - edits.push(EDIT_UPDATE); - current = northWest; - } - i--; - j--; - } else if (min == west) { - edits.push(EDIT_DELETE); - i--; - current = west; - } else { - edits.push(EDIT_ADD); - j--; - current = north; - } - } - edits.reverse(); - return edits; - }, - calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) { - var prefixCount = 0; - var suffixCount = 0; - var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart); - if (currentStart == 0 && oldStart == 0) prefixCount = this.sharedPrefix(current, old, minLength); - if (currentEnd == current.length && oldEnd == old.length) suffixCount = this.sharedSuffix(current, old, minLength - prefixCount); - currentStart += prefixCount; - oldStart += prefixCount; - currentEnd -= suffixCount; - oldEnd -= suffixCount; - if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0) return []; - if (currentStart == currentEnd) { - var splice = newSplice(currentStart, [], 0); - while (oldStart < oldEnd) splice.removed.push(old[oldStart++]); - return [ splice ]; - } else if (oldStart == oldEnd) return [ newSplice(currentStart, [], currentEnd - currentStart) ]; - var ops = this.spliceOperationsFromEditDistances(this.calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd)); - var splice = undefined; - var splices = []; - var index = currentStart; - var oldIndex = oldStart; - for (var i = 0; i < ops.length; i++) { - switch (ops[i]) { - case EDIT_LEAVE: - if (splice) { - splices.push(splice); - splice = undefined; - } - index++; - oldIndex++; - break; - - case EDIT_UPDATE: - if (!splice) splice = newSplice(index, [], 0); - splice.addedCount++; - index++; - splice.removed.push(old[oldIndex]); - oldIndex++; - break; - - case EDIT_ADD: - if (!splice) splice = newSplice(index, [], 0); - splice.addedCount++; - index++; - break; - - case EDIT_DELETE: - if (!splice) splice = newSplice(index, [], 0); - splice.removed.push(old[oldIndex]); - oldIndex++; - break; - } - } - if (splice) { - splices.push(splice); - } - return splices; - }, - sharedPrefix: function(current, old, searchLength) { - for (var i = 0; i < searchLength; i++) if (!this.equals(current[i], old[i])) return i; - return searchLength; - }, - sharedSuffix: function(current, old, searchLength) { - var index1 = current.length; - var index2 = old.length; - var count = 0; - while (count < searchLength && this.equals(current[--index1], old[--index2])) count++; - return count; - }, - calculateSplices: function(current, previous) { - return this.calcSplices(current, 0, current.length, previous, 0, previous.length); - }, - equals: function(currentValue, previousValue) { - return currentValue === previousValue; - } - }; - scope.ArraySplice = ArraySplice; -})(window.ShadowDOMPolyfill); - -(function(context) { - "use strict"; - var OriginalMutationObserver = window.MutationObserver; - var callbacks = []; - var pending = false; - var timerFunc; - function handle() { - pending = false; - var copies = callbacks.slice(0); - callbacks = []; - for (var i = 0; i < copies.length; i++) { - (0, copies[i])(); - } - } - if (OriginalMutationObserver) { - var counter = 1; - var observer = new OriginalMutationObserver(handle); - var textNode = document.createTextNode(counter); - observer.observe(textNode, { - characterData: true - }); - timerFunc = function() { - counter = (counter + 1) % 2; - textNode.data = counter; - }; - } else { - timerFunc = window.setTimeout; - } - function setEndOfMicrotask(func) { - callbacks.push(func); - if (pending) return; - pending = true; - timerFunc(handle, 0); - } - context.setEndOfMicrotask = setEndOfMicrotask; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var setEndOfMicrotask = scope.setEndOfMicrotask; - var wrapIfNeeded = scope.wrapIfNeeded; - var wrappers = scope.wrappers; - var registrationsTable = new WeakMap(); - var globalMutationObservers = []; - var isScheduled = false; - function scheduleCallback(observer) { - if (observer.scheduled_) return; - observer.scheduled_ = true; - globalMutationObservers.push(observer); - if (isScheduled) return; - setEndOfMicrotask(notifyObservers); - isScheduled = true; - } - function notifyObservers() { - isScheduled = false; - while (globalMutationObservers.length) { - var notifyList = globalMutationObservers; - globalMutationObservers = []; - notifyList.sort(function(x, y) { - return x.uid_ - y.uid_; - }); - for (var i = 0; i < notifyList.length; i++) { - var mo = notifyList[i]; - mo.scheduled_ = false; - var queue = mo.takeRecords(); - removeTransientObserversFor(mo); - if (queue.length) { - mo.callback_(queue, mo); - } - } - } - } - function MutationRecord(type, target) { - this.type = type; - this.target = target; - this.addedNodes = new wrappers.NodeList(); - this.removedNodes = new wrappers.NodeList(); - this.previousSibling = null; - this.nextSibling = null; - this.attributeName = null; - this.attributeNamespace = null; - this.oldValue = null; - } - function registerTransientObservers(ancestor, node) { - for (;ancestor; ancestor = ancestor.parentNode) { - var registrations = registrationsTable.get(ancestor); - if (!registrations) continue; - for (var i = 0; i < registrations.length; i++) { - var registration = registrations[i]; - if (registration.options.subtree) registration.addTransientObserver(node); - } - } - } - function removeTransientObserversFor(observer) { - for (var i = 0; i < observer.nodes_.length; i++) { - var node = observer.nodes_[i]; - var registrations = registrationsTable.get(node); - if (!registrations) return; - for (var j = 0; j < registrations.length; j++) { - var registration = registrations[j]; - if (registration.observer === observer) registration.removeTransientObservers(); - } - } - } - function enqueueMutation(target, type, data) { - var interestedObservers = Object.create(null); - var associatedStrings = Object.create(null); - for (var node = target; node; node = node.parentNode) { - var registrations = registrationsTable.get(node); - if (!registrations) continue; - for (var j = 0; j < registrations.length; j++) { - var registration = registrations[j]; - var options = registration.options; - if (node !== target && !options.subtree) continue; - if (type === "attributes" && !options.attributes) continue; - if (type === "attributes" && options.attributeFilter && (data.namespace !== null || options.attributeFilter.indexOf(data.name) === -1)) { - continue; - } - if (type === "characterData" && !options.characterData) continue; - if (type === "childList" && !options.childList) continue; - var observer = registration.observer; - interestedObservers[observer.uid_] = observer; - if (type === "attributes" && options.attributeOldValue || type === "characterData" && options.characterDataOldValue) { - associatedStrings[observer.uid_] = data.oldValue; - } - } - } - for (var uid in interestedObservers) { - var observer = interestedObservers[uid]; - var record = new MutationRecord(type, target); - if ("name" in data && "namespace" in data) { - record.attributeName = data.name; - record.attributeNamespace = data.namespace; - } - if (data.addedNodes) record.addedNodes = data.addedNodes; - if (data.removedNodes) record.removedNodes = data.removedNodes; - if (data.previousSibling) record.previousSibling = data.previousSibling; - if (data.nextSibling) record.nextSibling = data.nextSibling; - if (associatedStrings[uid] !== undefined) record.oldValue = associatedStrings[uid]; - scheduleCallback(observer); - observer.records_.push(record); - } - } - var slice = Array.prototype.slice; - function MutationObserverOptions(options) { - this.childList = !!options.childList; - this.subtree = !!options.subtree; - if (!("attributes" in options) && ("attributeOldValue" in options || "attributeFilter" in options)) { - this.attributes = true; - } else { - this.attributes = !!options.attributes; - } - if ("characterDataOldValue" in options && !("characterData" in options)) this.characterData = true; else this.characterData = !!options.characterData; - if (!this.attributes && (options.attributeOldValue || "attributeFilter" in options) || !this.characterData && options.characterDataOldValue) { - throw new TypeError(); - } - this.characterData = !!options.characterData; - this.attributeOldValue = !!options.attributeOldValue; - this.characterDataOldValue = !!options.characterDataOldValue; - if ("attributeFilter" in options) { - if (options.attributeFilter == null || typeof options.attributeFilter !== "object") { - throw new TypeError(); - } - this.attributeFilter = slice.call(options.attributeFilter); - } else { - this.attributeFilter = null; - } - } - var uidCounter = 0; - function MutationObserver(callback) { - this.callback_ = callback; - this.nodes_ = []; - this.records_ = []; - this.uid_ = ++uidCounter; - this.scheduled_ = false; - } - MutationObserver.prototype = { - constructor: MutationObserver, - observe: function(target, options) { - target = wrapIfNeeded(target); - var newOptions = new MutationObserverOptions(options); - var registration; - var registrations = registrationsTable.get(target); - if (!registrations) registrationsTable.set(target, registrations = []); - for (var i = 0; i < registrations.length; i++) { - if (registrations[i].observer === this) { - registration = registrations[i]; - registration.removeTransientObservers(); - registration.options = newOptions; - } - } - if (!registration) { - registration = new Registration(this, target, newOptions); - registrations.push(registration); - this.nodes_.push(target); - } - }, - disconnect: function() { - this.nodes_.forEach(function(node) { - var registrations = registrationsTable.get(node); - for (var i = 0; i < registrations.length; i++) { - var registration = registrations[i]; - if (registration.observer === this) { - registrations.splice(i, 1); - break; - } - } - }, this); - this.records_ = []; - }, - takeRecords: function() { - var copyOfRecords = this.records_; - this.records_ = []; - return copyOfRecords; - } - }; - function Registration(observer, target, options) { - this.observer = observer; - this.target = target; - this.options = options; - this.transientObservedNodes = []; - } - Registration.prototype = { - addTransientObserver: function(node) { - if (node === this.target) return; - scheduleCallback(this.observer); - this.transientObservedNodes.push(node); - var registrations = registrationsTable.get(node); - if (!registrations) registrationsTable.set(node, registrations = []); - registrations.push(this); - }, - removeTransientObservers: function() { - var transientObservedNodes = this.transientObservedNodes; - this.transientObservedNodes = []; - for (var i = 0; i < transientObservedNodes.length; i++) { - var node = transientObservedNodes[i]; - var registrations = registrationsTable.get(node); - for (var j = 0; j < registrations.length; j++) { - if (registrations[j] === this) { - registrations.splice(j, 1); - break; - } - } - } - } - }; - scope.enqueueMutation = enqueueMutation; - scope.registerTransientObservers = registerTransientObservers; - scope.wrappers.MutationObserver = MutationObserver; - scope.wrappers.MutationRecord = MutationRecord; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - function TreeScope(root, parent) { - this.root = root; - this.parent = parent; - } - TreeScope.prototype = { - get renderer() { - if (this.root instanceof scope.wrappers.ShadowRoot) { - return scope.getRendererForHost(this.root.host); - } - return null; - }, - contains: function(treeScope) { - for (;treeScope; treeScope = treeScope.parent) { - if (treeScope === this) return true; - } - return false; - } - }; - function setTreeScope(node, treeScope) { - if (node.treeScope_ !== treeScope) { - node.treeScope_ = treeScope; - for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) { - sr.treeScope_.parent = treeScope; - } - for (var child = node.firstChild; child; child = child.nextSibling) { - setTreeScope(child, treeScope); - } - } - } - function getTreeScope(node) { - if (node instanceof scope.wrappers.Window) { - debugger; - } - if (node.treeScope_) return node.treeScope_; - var parent = node.parentNode; - var treeScope; - if (parent) treeScope = getTreeScope(parent); else treeScope = new TreeScope(node, null); - return node.treeScope_ = treeScope; - } - scope.TreeScope = TreeScope; - scope.getTreeScope = getTreeScope; - scope.setTreeScope = setTreeScope; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var forwardMethodsToWrapper = scope.forwardMethodsToWrapper; - var getTreeScope = scope.getTreeScope; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var wrappers = scope.wrappers; - var wrappedFuns = new WeakMap(); - var listenersTable = new WeakMap(); - var handledEventsTable = new WeakMap(); - var currentlyDispatchingEvents = new WeakMap(); - var targetTable = new WeakMap(); - var currentTargetTable = new WeakMap(); - var relatedTargetTable = new WeakMap(); - var eventPhaseTable = new WeakMap(); - var stopPropagationTable = new WeakMap(); - var stopImmediatePropagationTable = new WeakMap(); - var eventHandlersTable = new WeakMap(); - var eventPathTable = new WeakMap(); - function isShadowRoot(node) { - return node instanceof wrappers.ShadowRoot; - } - function rootOfNode(node) { - return getTreeScope(node).root; - } - function getEventPath(node, event) { - var path = []; - var current = node; - path.push(current); - while (current) { - var destinationInsertionPoints = getDestinationInsertionPoints(current); - if (destinationInsertionPoints && destinationInsertionPoints.length > 0) { - for (var i = 0; i < destinationInsertionPoints.length; i++) { - var insertionPoint = destinationInsertionPoints[i]; - if (isShadowInsertionPoint(insertionPoint)) { - var shadowRoot = rootOfNode(insertionPoint); - var olderShadowRoot = shadowRoot.olderShadowRoot; - if (olderShadowRoot) path.push(olderShadowRoot); - } - path.push(insertionPoint); - } - current = destinationInsertionPoints[destinationInsertionPoints.length - 1]; - } else { - if (isShadowRoot(current)) { - if (inSameTree(node, current) && eventMustBeStopped(event)) { - break; - } - current = current.host; - path.push(current); - } else { - current = current.parentNode; - if (current) path.push(current); - } - } - } - return path; - } - function eventMustBeStopped(event) { - if (!event) return false; - switch (event.type) { - case "abort": - case "error": - case "select": - case "change": - case "load": - case "reset": - case "resize": - case "scroll": - case "selectstart": - return true; - } - return false; - } - function isShadowInsertionPoint(node) { - return node instanceof HTMLShadowElement; - } - function getDestinationInsertionPoints(node) { - return scope.getDestinationInsertionPoints(node); - } - function eventRetargetting(path, currentTarget) { - if (path.length === 0) return currentTarget; - if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document; - var currentTargetTree = getTreeScope(currentTarget); - var originalTarget = path[0]; - var originalTargetTree = getTreeScope(originalTarget); - var relativeTargetTree = lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree); - for (var i = 0; i < path.length; i++) { - var node = path[i]; - if (getTreeScope(node) === relativeTargetTree) return node; - } - return path[path.length - 1]; - } - function getTreeScopeAncestors(treeScope) { - var ancestors = []; - for (;treeScope; treeScope = treeScope.parent) { - ancestors.push(treeScope); - } - return ancestors; - } - function lowestCommonInclusiveAncestor(tsA, tsB) { - var ancestorsA = getTreeScopeAncestors(tsA); - var ancestorsB = getTreeScopeAncestors(tsB); - var result = null; - while (ancestorsA.length > 0 && ancestorsB.length > 0) { - var a = ancestorsA.pop(); - var b = ancestorsB.pop(); - if (a === b) result = a; else break; - } - return result; - } - function getTreeScopeRoot(ts) { - if (!ts.parent) return ts; - return getTreeScopeRoot(ts.parent); - } - function relatedTargetResolution(event, currentTarget, relatedTarget) { - if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document; - var currentTargetTree = getTreeScope(currentTarget); - var relatedTargetTree = getTreeScope(relatedTarget); - var relatedTargetEventPath = getEventPath(relatedTarget, event); - var lowestCommonAncestorTree; - var lowestCommonAncestorTree = lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree); - if (!lowestCommonAncestorTree) lowestCommonAncestorTree = relatedTargetTree.root; - for (var commonAncestorTree = lowestCommonAncestorTree; commonAncestorTree; commonAncestorTree = commonAncestorTree.parent) { - var adjustedRelatedTarget; - for (var i = 0; i < relatedTargetEventPath.length; i++) { - var node = relatedTargetEventPath[i]; - if (getTreeScope(node) === commonAncestorTree) return node; - } - } - return null; - } - function inSameTree(a, b) { - return getTreeScope(a) === getTreeScope(b); - } - var NONE = 0; - var CAPTURING_PHASE = 1; - var AT_TARGET = 2; - var BUBBLING_PHASE = 3; - var pendingError; - function dispatchOriginalEvent(originalEvent) { - if (handledEventsTable.get(originalEvent)) return; - handledEventsTable.set(originalEvent, true); - dispatchEvent(wrap(originalEvent), wrap(originalEvent.target)); - if (pendingError) { - var err = pendingError; - pendingError = null; - throw err; - } - } - function isLoadLikeEvent(event) { - switch (event.type) { - case "load": - case "beforeunload": - case "unload": - return true; - } - return false; - } - function dispatchEvent(event, originalWrapperTarget) { - if (currentlyDispatchingEvents.get(event)) throw new Error("InvalidStateError"); - currentlyDispatchingEvents.set(event, true); - scope.renderAllPending(); - var eventPath; - var overrideTarget; - var win; - if (isLoadLikeEvent(event) && !event.bubbles) { - var doc = originalWrapperTarget; - if (doc instanceof wrappers.Document && (win = doc.defaultView)) { - overrideTarget = doc; - eventPath = []; - } - } - if (!eventPath) { - if (originalWrapperTarget instanceof wrappers.Window) { - win = originalWrapperTarget; - eventPath = []; - } else { - eventPath = getEventPath(originalWrapperTarget, event); - if (!isLoadLikeEvent(event)) { - var doc = eventPath[eventPath.length - 1]; - if (doc instanceof wrappers.Document) win = doc.defaultView; - } - } - } - eventPathTable.set(event, eventPath); - if (dispatchCapturing(event, eventPath, win, overrideTarget)) { - if (dispatchAtTarget(event, eventPath, win, overrideTarget)) { - dispatchBubbling(event, eventPath, win, overrideTarget); - } - } - eventPhaseTable.set(event, NONE); - currentTargetTable.delete(event, null); - currentlyDispatchingEvents.delete(event); - return event.defaultPrevented; - } - function dispatchCapturing(event, eventPath, win, overrideTarget) { - var phase = CAPTURING_PHASE; - if (win) { - if (!invoke(win, event, phase, eventPath, overrideTarget)) return false; - } - for (var i = eventPath.length - 1; i > 0; i--) { - if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return false; - } - return true; - } - function dispatchAtTarget(event, eventPath, win, overrideTarget) { - var phase = AT_TARGET; - var currentTarget = eventPath[0] || win; - return invoke(currentTarget, event, phase, eventPath, overrideTarget); - } - function dispatchBubbling(event, eventPath, win, overrideTarget) { - var phase = BUBBLING_PHASE; - for (var i = 1; i < eventPath.length; i++) { - if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return; - } - if (win && eventPath.length > 0) { - invoke(win, event, phase, eventPath, overrideTarget); - } - } - function invoke(currentTarget, event, phase, eventPath, overrideTarget) { - var listeners = listenersTable.get(currentTarget); - if (!listeners) return true; - var target = overrideTarget || eventRetargetting(eventPath, currentTarget); - if (target === currentTarget) { - if (phase === CAPTURING_PHASE) return true; - if (phase === BUBBLING_PHASE) phase = AT_TARGET; - } else if (phase === BUBBLING_PHASE && !event.bubbles) { - return true; - } - if ("relatedTarget" in event) { - var originalEvent = unwrap(event); - var unwrappedRelatedTarget = originalEvent.relatedTarget; - if (unwrappedRelatedTarget) { - if (unwrappedRelatedTarget instanceof Object && unwrappedRelatedTarget.addEventListener) { - var relatedTarget = wrap(unwrappedRelatedTarget); - var adjusted = relatedTargetResolution(event, currentTarget, relatedTarget); - if (adjusted === target) return true; - } else { - adjusted = null; - } - relatedTargetTable.set(event, adjusted); - } - } - eventPhaseTable.set(event, phase); - var type = event.type; - var anyRemoved = false; - targetTable.set(event, target); - currentTargetTable.set(event, currentTarget); - listeners.depth++; - for (var i = 0, len = listeners.length; i < len; i++) { - var listener = listeners[i]; - if (listener.removed) { - anyRemoved = true; - continue; - } - if (listener.type !== type || !listener.capture && phase === CAPTURING_PHASE || listener.capture && phase === BUBBLING_PHASE) { - continue; - } - try { - if (typeof listener.handler === "function") listener.handler.call(currentTarget, event); else listener.handler.handleEvent(event); - if (stopImmediatePropagationTable.get(event)) return false; - } catch (ex) { - if (!pendingError) pendingError = ex; - } - } - listeners.depth--; - if (anyRemoved && listeners.depth === 0) { - var copy = listeners.slice(); - listeners.length = 0; - for (var i = 0; i < copy.length; i++) { - if (!copy[i].removed) listeners.push(copy[i]); - } - } - return !stopPropagationTable.get(event); - } - function Listener(type, handler, capture) { - this.type = type; - this.handler = handler; - this.capture = Boolean(capture); - } - Listener.prototype = { - equals: function(that) { - return this.handler === that.handler && this.type === that.type && this.capture === that.capture; - }, - get removed() { - return this.handler === null; - }, - remove: function() { - this.handler = null; - } - }; - var OriginalEvent = window.Event; - OriginalEvent.prototype.polymerBlackList_ = { - returnValue: true, - keyLocation: true - }; - function Event(type, options) { - if (type instanceof OriginalEvent) { - var impl = type; - if (!OriginalBeforeUnloadEvent && impl.type === "beforeunload" && !(this instanceof BeforeUnloadEvent)) { - return new BeforeUnloadEvent(impl); - } - setWrapper(impl, this); - } else { - return wrap(constructEvent(OriginalEvent, "Event", type, options)); - } - } - Event.prototype = { - get target() { - return targetTable.get(this); - }, - get currentTarget() { - return currentTargetTable.get(this); - }, - get eventPhase() { - return eventPhaseTable.get(this); - }, - get path() { - var eventPath = eventPathTable.get(this); - if (!eventPath) return []; - return eventPath.slice(); - }, - stopPropagation: function() { - stopPropagationTable.set(this, true); - }, - stopImmediatePropagation: function() { - stopPropagationTable.set(this, true); - stopImmediatePropagationTable.set(this, true); - } - }; - var supportsDefaultPrevented = function() { - var e = document.createEvent("Event"); - e.initEvent("test", true, true); - e.preventDefault(); - return e.defaultPrevented; - }(); - if (!supportsDefaultPrevented) { - Event.prototype.preventDefault = function() { - if (!this.cancelable) return; - unsafeUnwrap(this).preventDefault(); - Object.defineProperty(this, "defaultPrevented", { - get: function() { - return true; - }, - configurable: true - }); - }; - } - registerWrapper(OriginalEvent, Event, document.createEvent("Event")); - function unwrapOptions(options) { - if (!options || !options.relatedTarget) return options; - return Object.create(options, { - relatedTarget: { - value: unwrap(options.relatedTarget) - } - }); - } - function registerGenericEvent(name, SuperEvent, prototype) { - var OriginalEvent = window[name]; - var GenericEvent = function(type, options) { - if (type instanceof OriginalEvent) setWrapper(type, this); else return wrap(constructEvent(OriginalEvent, name, type, options)); - }; - GenericEvent.prototype = Object.create(SuperEvent.prototype); - if (prototype) mixin(GenericEvent.prototype, prototype); - if (OriginalEvent) { - try { - registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent("temp")); - } catch (ex) { - registerWrapper(OriginalEvent, GenericEvent, document.createEvent(name)); - } - } - return GenericEvent; - } - var UIEvent = registerGenericEvent("UIEvent", Event); - var CustomEvent = registerGenericEvent("CustomEvent", Event); - var relatedTargetProto = { - get relatedTarget() { - var relatedTarget = relatedTargetTable.get(this); - if (relatedTarget !== undefined) return relatedTarget; - return wrap(unwrap(this).relatedTarget); - } - }; - function getInitFunction(name, relatedTargetIndex) { - return function() { - arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]); - var impl = unwrap(this); - impl[name].apply(impl, arguments); - }; - } - var mouseEventProto = mixin({ - initMouseEvent: getInitFunction("initMouseEvent", 14) - }, relatedTargetProto); - var focusEventProto = mixin({ - initFocusEvent: getInitFunction("initFocusEvent", 5) - }, relatedTargetProto); - var MouseEvent = registerGenericEvent("MouseEvent", UIEvent, mouseEventProto); - var FocusEvent = registerGenericEvent("FocusEvent", UIEvent, focusEventProto); - var defaultInitDicts = Object.create(null); - var supportsEventConstructors = function() { - try { - new window.FocusEvent("focus"); - } catch (ex) { - return false; - } - return true; - }(); - function constructEvent(OriginalEvent, name, type, options) { - if (supportsEventConstructors) return new OriginalEvent(type, unwrapOptions(options)); - var event = unwrap(document.createEvent(name)); - var defaultDict = defaultInitDicts[name]; - var args = [ type ]; - Object.keys(defaultDict).forEach(function(key) { - var v = options != null && key in options ? options[key] : defaultDict[key]; - if (key === "relatedTarget") v = unwrap(v); - args.push(v); - }); - event["init" + name].apply(event, args); - return event; - } - if (!supportsEventConstructors) { - var configureEventConstructor = function(name, initDict, superName) { - if (superName) { - var superDict = defaultInitDicts[superName]; - initDict = mixin(mixin({}, superDict), initDict); - } - defaultInitDicts[name] = initDict; - }; - configureEventConstructor("Event", { - bubbles: false, - cancelable: false - }); - configureEventConstructor("CustomEvent", { - detail: null - }, "Event"); - configureEventConstructor("UIEvent", { - view: null, - detail: 0 - }, "Event"); - configureEventConstructor("MouseEvent", { - screenX: 0, - screenY: 0, - clientX: 0, - clientY: 0, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - button: 0, - relatedTarget: null - }, "UIEvent"); - configureEventConstructor("FocusEvent", { - relatedTarget: null - }, "UIEvent"); - } - var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent; - function BeforeUnloadEvent(impl) { - Event.call(this, impl); - } - BeforeUnloadEvent.prototype = Object.create(Event.prototype); - mixin(BeforeUnloadEvent.prototype, { - get returnValue() { - return unsafeUnwrap(this).returnValue; - }, - set returnValue(v) { - unsafeUnwrap(this).returnValue = v; - } - }); - if (OriginalBeforeUnloadEvent) registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent); - function isValidListener(fun) { - if (typeof fun === "function") return true; - return fun && fun.handleEvent; - } - function isMutationEvent(type) { - switch (type) { - case "DOMAttrModified": - case "DOMAttributeNameChanged": - case "DOMCharacterDataModified": - case "DOMElementNameChanged": - case "DOMNodeInserted": - case "DOMNodeInsertedIntoDocument": - case "DOMNodeRemoved": - case "DOMNodeRemovedFromDocument": - case "DOMSubtreeModified": - return true; - } - return false; - } - var OriginalEventTarget = window.EventTarget; - function EventTarget(impl) { - setWrapper(impl, this); - } - var methodNames = [ "addEventListener", "removeEventListener", "dispatchEvent" ]; - [ Node, Window ].forEach(function(constructor) { - var p = constructor.prototype; - methodNames.forEach(function(name) { - Object.defineProperty(p, name + "_", { - value: p[name] - }); - }); - }); - function getTargetToListenAt(wrapper) { - if (wrapper instanceof wrappers.ShadowRoot) wrapper = wrapper.host; - return unwrap(wrapper); - } - EventTarget.prototype = { - addEventListener: function(type, fun, capture) { - if (!isValidListener(fun) || isMutationEvent(type)) return; - var listener = new Listener(type, fun, capture); - var listeners = listenersTable.get(this); - if (!listeners) { - listeners = []; - listeners.depth = 0; - listenersTable.set(this, listeners); - } else { - for (var i = 0; i < listeners.length; i++) { - if (listener.equals(listeners[i])) return; - } - } - listeners.push(listener); - var target = getTargetToListenAt(this); - target.addEventListener_(type, dispatchOriginalEvent, true); - }, - removeEventListener: function(type, fun, capture) { - capture = Boolean(capture); - var listeners = listenersTable.get(this); - if (!listeners) return; - var count = 0, found = false; - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].type === type && listeners[i].capture === capture) { - count++; - if (listeners[i].handler === fun) { - found = true; - listeners[i].remove(); - } - } - } - if (found && count === 1) { - var target = getTargetToListenAt(this); - target.removeEventListener_(type, dispatchOriginalEvent, true); - } - }, - dispatchEvent: function(event) { - var nativeEvent = unwrap(event); - var eventType = nativeEvent.type; - handledEventsTable.set(nativeEvent, false); - scope.renderAllPending(); - var tempListener; - if (!hasListenerInAncestors(this, eventType)) { - tempListener = function() {}; - this.addEventListener(eventType, tempListener, true); - } - try { - return unwrap(this).dispatchEvent_(nativeEvent); - } finally { - if (tempListener) this.removeEventListener(eventType, tempListener, true); - } - } - }; - function hasListener(node, type) { - var listeners = listenersTable.get(node); - if (listeners) { - for (var i = 0; i < listeners.length; i++) { - if (!listeners[i].removed && listeners[i].type === type) return true; - } - } - return false; - } - function hasListenerInAncestors(target, type) { - for (var node = unwrap(target); node; node = node.parentNode) { - if (hasListener(wrap(node), type)) return true; - } - return false; - } - if (OriginalEventTarget) registerWrapper(OriginalEventTarget, EventTarget); - function wrapEventTargetMethods(constructors) { - forwardMethodsToWrapper(constructors, methodNames); - } - var originalElementFromPoint = document.elementFromPoint; - function elementFromPoint(self, document, x, y) { - scope.renderAllPending(); - var element = wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y)); - if (!element) return null; - var path = getEventPath(element, null); - var idx = path.lastIndexOf(self); - if (idx == -1) return null; else path = path.slice(0, idx); - return eventRetargetting(path, self); - } - function getEventHandlerGetter(name) { - return function() { - var inlineEventHandlers = eventHandlersTable.get(this); - return inlineEventHandlers && inlineEventHandlers[name] && inlineEventHandlers[name].value || null; - }; - } - function getEventHandlerSetter(name) { - var eventType = name.slice(2); - return function(value) { - var inlineEventHandlers = eventHandlersTable.get(this); - if (!inlineEventHandlers) { - inlineEventHandlers = Object.create(null); - eventHandlersTable.set(this, inlineEventHandlers); - } - var old = inlineEventHandlers[name]; - if (old) this.removeEventListener(eventType, old.wrapped, false); - if (typeof value === "function") { - var wrapped = function(e) { - var rv = value.call(this, e); - if (rv === false) e.preventDefault(); else if (name === "onbeforeunload" && typeof rv === "string") e.returnValue = rv; - }; - this.addEventListener(eventType, wrapped, false); - inlineEventHandlers[name] = { - value: value, - wrapped: wrapped - }; - } - }; - } - scope.elementFromPoint = elementFromPoint; - scope.getEventHandlerGetter = getEventHandlerGetter; - scope.getEventHandlerSetter = getEventHandlerSetter; - scope.wrapEventTargetMethods = wrapEventTargetMethods; - scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent; - scope.wrappers.CustomEvent = CustomEvent; - scope.wrappers.Event = Event; - scope.wrappers.EventTarget = EventTarget; - scope.wrappers.FocusEvent = FocusEvent; - scope.wrappers.MouseEvent = MouseEvent; - scope.wrappers.UIEvent = UIEvent; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var UIEvent = scope.wrappers.UIEvent; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrap = scope.wrap; - var OriginalTouchEvent = window.TouchEvent; - if (!OriginalTouchEvent) return; - var nativeEvent; - try { - nativeEvent = document.createEvent("TouchEvent"); - } catch (ex) { - return; - } - var nonEnumDescriptor = { - enumerable: false - }; - function nonEnum(obj, prop) { - Object.defineProperty(obj, prop, nonEnumDescriptor); - } - function Touch(impl) { - setWrapper(impl, this); - } - Touch.prototype = { - get target() { - return wrap(unsafeUnwrap(this).target); - } - }; - var descr = { - configurable: true, - enumerable: true, - get: null - }; - [ "clientX", "clientY", "screenX", "screenY", "pageX", "pageY", "identifier", "webkitRadiusX", "webkitRadiusY", "webkitRotationAngle", "webkitForce" ].forEach(function(name) { - descr.get = function() { - return unsafeUnwrap(this)[name]; - }; - Object.defineProperty(Touch.prototype, name, descr); - }); - function TouchList() { - this.length = 0; - nonEnum(this, "length"); - } - TouchList.prototype = { - item: function(index) { - return this[index]; - } - }; - function wrapTouchList(nativeTouchList) { - var list = new TouchList(); - for (var i = 0; i < nativeTouchList.length; i++) { - list[i] = new Touch(nativeTouchList[i]); - } - list.length = i; - return list; - } - function TouchEvent(impl) { - UIEvent.call(this, impl); - } - TouchEvent.prototype = Object.create(UIEvent.prototype); - mixin(TouchEvent.prototype, { - get touches() { - return wrapTouchList(unsafeUnwrap(this).touches); - }, - get targetTouches() { - return wrapTouchList(unsafeUnwrap(this).targetTouches); - }, - get changedTouches() { - return wrapTouchList(unsafeUnwrap(this).changedTouches); - }, - initTouchEvent: function() { - throw new Error("Not implemented"); - } - }); - registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent); - scope.wrappers.Touch = Touch; - scope.wrappers.TouchEvent = TouchEvent; - scope.wrappers.TouchList = TouchList; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrap = scope.wrap; - var nonEnumDescriptor = { - enumerable: false - }; - function nonEnum(obj, prop) { - Object.defineProperty(obj, prop, nonEnumDescriptor); - } - function NodeList() { - this.length = 0; - nonEnum(this, "length"); - } - NodeList.prototype = { - item: function(index) { - return this[index]; - } - }; - nonEnum(NodeList.prototype, "item"); - function wrapNodeList(list) { - if (list == null) return list; - var wrapperList = new NodeList(); - for (var i = 0, length = list.length; i < length; i++) { - wrapperList[i] = wrap(list[i]); - } - wrapperList.length = length; - return wrapperList; - } - function addWrapNodeListMethod(wrapperConstructor, name) { - wrapperConstructor.prototype[name] = function() { - return wrapNodeList(unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments)); - }; - } - scope.wrappers.NodeList = NodeList; - scope.addWrapNodeListMethod = addWrapNodeListMethod; - scope.wrapNodeList = wrapNodeList; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - scope.wrapHTMLCollection = scope.wrapNodeList; - scope.wrappers.HTMLCollection = scope.wrappers.NodeList; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var EventTarget = scope.wrappers.EventTarget; - var NodeList = scope.wrappers.NodeList; - var TreeScope = scope.TreeScope; - var assert = scope.assert; - var defineWrapGetter = scope.defineWrapGetter; - var enqueueMutation = scope.enqueueMutation; - var getTreeScope = scope.getTreeScope; - var isWrapper = scope.isWrapper; - var mixin = scope.mixin; - var registerTransientObservers = scope.registerTransientObservers; - var registerWrapper = scope.registerWrapper; - var setTreeScope = scope.setTreeScope; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var wrapIfNeeded = scope.wrapIfNeeded; - var wrappers = scope.wrappers; - function assertIsNodeWrapper(node) { - assert(node instanceof Node); - } - function createOneElementNodeList(node) { - var nodes = new NodeList(); - nodes[0] = node; - nodes.length = 1; - return nodes; - } - var surpressMutations = false; - function enqueueRemovalForInsertedNodes(node, parent, nodes) { - enqueueMutation(parent, "childList", { - removedNodes: nodes, - previousSibling: node.previousSibling, - nextSibling: node.nextSibling - }); - } - function enqueueRemovalForInsertedDocumentFragment(df, nodes) { - enqueueMutation(df, "childList", { - removedNodes: nodes - }); - } - function collectNodes(node, parentNode, previousNode, nextNode) { - if (node instanceof DocumentFragment) { - var nodes = collectNodesForDocumentFragment(node); - surpressMutations = true; - for (var i = nodes.length - 1; i >= 0; i--) { - node.removeChild(nodes[i]); - nodes[i].parentNode_ = parentNode; - } - surpressMutations = false; - for (var i = 0; i < nodes.length; i++) { - nodes[i].previousSibling_ = nodes[i - 1] || previousNode; - nodes[i].nextSibling_ = nodes[i + 1] || nextNode; - } - if (previousNode) previousNode.nextSibling_ = nodes[0]; - if (nextNode) nextNode.previousSibling_ = nodes[nodes.length - 1]; - return nodes; - } - var nodes = createOneElementNodeList(node); - var oldParent = node.parentNode; - if (oldParent) { - oldParent.removeChild(node); - } - node.parentNode_ = parentNode; - node.previousSibling_ = previousNode; - node.nextSibling_ = nextNode; - if (previousNode) previousNode.nextSibling_ = node; - if (nextNode) nextNode.previousSibling_ = node; - return nodes; - } - function collectNodesNative(node) { - if (node instanceof DocumentFragment) return collectNodesForDocumentFragment(node); - var nodes = createOneElementNodeList(node); - var oldParent = node.parentNode; - if (oldParent) enqueueRemovalForInsertedNodes(node, oldParent, nodes); - return nodes; - } - function collectNodesForDocumentFragment(node) { - var nodes = new NodeList(); - var i = 0; - for (var child = node.firstChild; child; child = child.nextSibling) { - nodes[i++] = child; - } - nodes.length = i; - enqueueRemovalForInsertedDocumentFragment(node, nodes); - return nodes; - } - function snapshotNodeList(nodeList) { - return nodeList; - } - function nodeWasAdded(node, treeScope) { - setTreeScope(node, treeScope); - node.nodeIsInserted_(); - } - function nodesWereAdded(nodes, parent) { - var treeScope = getTreeScope(parent); - for (var i = 0; i < nodes.length; i++) { - nodeWasAdded(nodes[i], treeScope); - } - } - function nodeWasRemoved(node) { - setTreeScope(node, new TreeScope(node, null)); - } - function nodesWereRemoved(nodes) { - for (var i = 0; i < nodes.length; i++) { - nodeWasRemoved(nodes[i]); - } - } - function ensureSameOwnerDocument(parent, child) { - var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ? parent : parent.ownerDocument; - if (ownerDoc !== child.ownerDocument) ownerDoc.adoptNode(child); - } - function adoptNodesIfNeeded(owner, nodes) { - if (!nodes.length) return; - var ownerDoc = owner.ownerDocument; - if (ownerDoc === nodes[0].ownerDocument) return; - for (var i = 0; i < nodes.length; i++) { - scope.adoptNodeNoRemove(nodes[i], ownerDoc); - } - } - function unwrapNodesForInsertion(owner, nodes) { - adoptNodesIfNeeded(owner, nodes); - var length = nodes.length; - if (length === 1) return unwrap(nodes[0]); - var df = unwrap(owner.ownerDocument.createDocumentFragment()); - for (var i = 0; i < length; i++) { - df.appendChild(unwrap(nodes[i])); - } - return df; - } - function clearChildNodes(wrapper) { - if (wrapper.firstChild_ !== undefined) { - var child = wrapper.firstChild_; - while (child) { - var tmp = child; - child = child.nextSibling_; - tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined; - } - } - wrapper.firstChild_ = wrapper.lastChild_ = undefined; - } - function removeAllChildNodes(wrapper) { - if (wrapper.invalidateShadowRenderer()) { - var childWrapper = wrapper.firstChild; - while (childWrapper) { - assert(childWrapper.parentNode === wrapper); - var nextSibling = childWrapper.nextSibling; - var childNode = unwrap(childWrapper); - var parentNode = childNode.parentNode; - if (parentNode) originalRemoveChild.call(parentNode, childNode); - childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = null; - childWrapper = nextSibling; - } - wrapper.firstChild_ = wrapper.lastChild_ = null; - } else { - var node = unwrap(wrapper); - var child = node.firstChild; - var nextSibling; - while (child) { - nextSibling = child.nextSibling; - originalRemoveChild.call(node, child); - child = nextSibling; - } - } - } - function invalidateParent(node) { - var p = node.parentNode; - return p && p.invalidateShadowRenderer(); - } - function cleanupNodes(nodes) { - for (var i = 0, n; i < nodes.length; i++) { - n = nodes[i]; - n.parentNode.removeChild(n); - } - } - var originalImportNode = document.importNode; - var originalCloneNode = window.Node.prototype.cloneNode; - function cloneNode(node, deep, opt_doc) { - var clone; - if (opt_doc) clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false)); else clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false)); - if (deep) { - for (var child = node.firstChild; child; child = child.nextSibling) { - clone.appendChild(cloneNode(child, true, opt_doc)); - } - if (node instanceof wrappers.HTMLTemplateElement) { - var cloneContent = clone.content; - for (var child = node.content.firstChild; child; child = child.nextSibling) { - cloneContent.appendChild(cloneNode(child, true, opt_doc)); - } - } - } - return clone; - } - function contains(self, child) { - if (!child || getTreeScope(self) !== getTreeScope(child)) return false; - for (var node = child; node; node = node.parentNode) { - if (node === self) return true; - } - return false; - } - var OriginalNode = window.Node; - function Node(original) { - assert(original instanceof OriginalNode); - EventTarget.call(this, original); - this.parentNode_ = undefined; - this.firstChild_ = undefined; - this.lastChild_ = undefined; - this.nextSibling_ = undefined; - this.previousSibling_ = undefined; - this.treeScope_ = undefined; - } - var OriginalDocumentFragment = window.DocumentFragment; - var originalAppendChild = OriginalNode.prototype.appendChild; - var originalCompareDocumentPosition = OriginalNode.prototype.compareDocumentPosition; - var originalIsEqualNode = OriginalNode.prototype.isEqualNode; - var originalInsertBefore = OriginalNode.prototype.insertBefore; - var originalRemoveChild = OriginalNode.prototype.removeChild; - var originalReplaceChild = OriginalNode.prototype.replaceChild; - var isIEOrEdge = /Trident|Edge/.test(navigator.userAgent); - var removeChildOriginalHelper = isIEOrEdge ? function(parent, child) { - try { - originalRemoveChild.call(parent, child); - } catch (ex) { - if (!(parent instanceof OriginalDocumentFragment)) throw ex; - } - } : function(parent, child) { - originalRemoveChild.call(parent, child); - }; - Node.prototype = Object.create(EventTarget.prototype); - mixin(Node.prototype, { - appendChild: function(childWrapper) { - return this.insertBefore(childWrapper, null); - }, - insertBefore: function(childWrapper, refWrapper) { - assertIsNodeWrapper(childWrapper); - var refNode; - if (refWrapper) { - if (isWrapper(refWrapper)) { - refNode = unwrap(refWrapper); - } else { - refNode = refWrapper; - refWrapper = wrap(refNode); - } - } else { - refWrapper = null; - refNode = null; - } - refWrapper && assert(refWrapper.parentNode === this); - var nodes; - var previousNode = refWrapper ? refWrapper.previousSibling : this.lastChild; - var useNative = !this.invalidateShadowRenderer() && !invalidateParent(childWrapper); - if (useNative) nodes = collectNodesNative(childWrapper); else nodes = collectNodes(childWrapper, this, previousNode, refWrapper); - if (useNative) { - ensureSameOwnerDocument(this, childWrapper); - clearChildNodes(this); - originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode); - } else { - if (!previousNode) this.firstChild_ = nodes[0]; - if (!refWrapper) { - this.lastChild_ = nodes[nodes.length - 1]; - if (this.firstChild_ === undefined) this.firstChild_ = this.firstChild; - } - var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this); - if (parentNode) { - originalInsertBefore.call(parentNode, unwrapNodesForInsertion(this, nodes), refNode); - } else { - adoptNodesIfNeeded(this, nodes); - } - } - enqueueMutation(this, "childList", { - addedNodes: nodes, - nextSibling: refWrapper, - previousSibling: previousNode - }); - nodesWereAdded(nodes, this); - return childWrapper; - }, - removeChild: function(childWrapper) { - assertIsNodeWrapper(childWrapper); - if (childWrapper.parentNode !== this) { - var found = false; - var childNodes = this.childNodes; - for (var ieChild = this.firstChild; ieChild; ieChild = ieChild.nextSibling) { - if (ieChild === childWrapper) { - found = true; - break; - } - } - if (!found) { - throw new Error("NotFoundError"); - } - } - var childNode = unwrap(childWrapper); - var childWrapperNextSibling = childWrapper.nextSibling; - var childWrapperPreviousSibling = childWrapper.previousSibling; - if (this.invalidateShadowRenderer()) { - var thisFirstChild = this.firstChild; - var thisLastChild = this.lastChild; - var parentNode = childNode.parentNode; - if (parentNode) removeChildOriginalHelper(parentNode, childNode); - if (thisFirstChild === childWrapper) this.firstChild_ = childWrapperNextSibling; - if (thisLastChild === childWrapper) this.lastChild_ = childWrapperPreviousSibling; - if (childWrapperPreviousSibling) childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling; - if (childWrapperNextSibling) { - childWrapperNextSibling.previousSibling_ = childWrapperPreviousSibling; - } - childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = undefined; - } else { - clearChildNodes(this); - removeChildOriginalHelper(unsafeUnwrap(this), childNode); - } - if (!surpressMutations) { - enqueueMutation(this, "childList", { - removedNodes: createOneElementNodeList(childWrapper), - nextSibling: childWrapperNextSibling, - previousSibling: childWrapperPreviousSibling - }); - } - registerTransientObservers(this, childWrapper); - return childWrapper; - }, - replaceChild: function(newChildWrapper, oldChildWrapper) { - assertIsNodeWrapper(newChildWrapper); - var oldChildNode; - if (isWrapper(oldChildWrapper)) { - oldChildNode = unwrap(oldChildWrapper); - } else { - oldChildNode = oldChildWrapper; - oldChildWrapper = wrap(oldChildNode); - } - if (oldChildWrapper.parentNode !== this) { - throw new Error("NotFoundError"); - } - var nextNode = oldChildWrapper.nextSibling; - var previousNode = oldChildWrapper.previousSibling; - var nodes; - var useNative = !this.invalidateShadowRenderer() && !invalidateParent(newChildWrapper); - if (useNative) { - nodes = collectNodesNative(newChildWrapper); - } else { - if (nextNode === newChildWrapper) nextNode = newChildWrapper.nextSibling; - nodes = collectNodes(newChildWrapper, this, previousNode, nextNode); - } - if (!useNative) { - if (this.firstChild === oldChildWrapper) this.firstChild_ = nodes[0]; - if (this.lastChild === oldChildWrapper) this.lastChild_ = nodes[nodes.length - 1]; - oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ = oldChildWrapper.parentNode_ = undefined; - if (oldChildNode.parentNode) { - originalReplaceChild.call(oldChildNode.parentNode, unwrapNodesForInsertion(this, nodes), oldChildNode); - } - } else { - ensureSameOwnerDocument(this, newChildWrapper); - clearChildNodes(this); - originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper), oldChildNode); - } - enqueueMutation(this, "childList", { - addedNodes: nodes, - removedNodes: createOneElementNodeList(oldChildWrapper), - nextSibling: nextNode, - previousSibling: previousNode - }); - nodeWasRemoved(oldChildWrapper); - nodesWereAdded(nodes, this); - return oldChildWrapper; - }, - nodeIsInserted_: function() { - for (var child = this.firstChild; child; child = child.nextSibling) { - child.nodeIsInserted_(); - } - }, - hasChildNodes: function() { - return this.firstChild !== null; - }, - get parentNode() { - return this.parentNode_ !== undefined ? this.parentNode_ : wrap(unsafeUnwrap(this).parentNode); - }, - get firstChild() { - return this.firstChild_ !== undefined ? this.firstChild_ : wrap(unsafeUnwrap(this).firstChild); - }, - get lastChild() { - return this.lastChild_ !== undefined ? this.lastChild_ : wrap(unsafeUnwrap(this).lastChild); - }, - get nextSibling() { - return this.nextSibling_ !== undefined ? this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling); - }, - get previousSibling() { - return this.previousSibling_ !== undefined ? this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling); - }, - get parentElement() { - var p = this.parentNode; - while (p && p.nodeType !== Node.ELEMENT_NODE) { - p = p.parentNode; - } - return p; - }, - get textContent() { - var s = ""; - for (var child = this.firstChild; child; child = child.nextSibling) { - if (child.nodeType != Node.COMMENT_NODE) { - s += child.textContent; - } - } - return s; - }, - set textContent(textContent) { - if (textContent == null) textContent = ""; - var removedNodes = snapshotNodeList(this.childNodes); - if (this.invalidateShadowRenderer()) { - removeAllChildNodes(this); - if (textContent !== "") { - var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent); - this.appendChild(textNode); - } - } else { - clearChildNodes(this); - unsafeUnwrap(this).textContent = textContent; - } - var addedNodes = snapshotNodeList(this.childNodes); - enqueueMutation(this, "childList", { - addedNodes: addedNodes, - removedNodes: removedNodes - }); - nodesWereRemoved(removedNodes); - nodesWereAdded(addedNodes, this); - }, - get childNodes() { - var wrapperList = new NodeList(); - var i = 0; - for (var child = this.firstChild; child; child = child.nextSibling) { - wrapperList[i++] = child; - } - wrapperList.length = i; - return wrapperList; - }, - cloneNode: function(deep) { - return cloneNode(this, deep); - }, - contains: function(child) { - return contains(this, wrapIfNeeded(child)); - }, - compareDocumentPosition: function(otherNode) { - return originalCompareDocumentPosition.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode)); - }, - isEqualNode: function(otherNode) { - return originalIsEqualNode.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode)); - }, - normalize: function() { - var nodes = snapshotNodeList(this.childNodes); - var remNodes = []; - var s = ""; - var modNode; - for (var i = 0, n; i < nodes.length; i++) { - n = nodes[i]; - if (n.nodeType === Node.TEXT_NODE) { - if (!modNode && !n.data.length) this.removeChild(n); else if (!modNode) modNode = n; else { - s += n.data; - remNodes.push(n); - } - } else { - if (modNode && remNodes.length) { - modNode.data += s; - cleanupNodes(remNodes); - } - remNodes = []; - s = ""; - modNode = null; - if (n.childNodes.length) n.normalize(); - } - } - if (modNode && remNodes.length) { - modNode.data += s; - cleanupNodes(remNodes); - } - } - }); - defineWrapGetter(Node, "ownerDocument"); - registerWrapper(OriginalNode, Node, document.createDocumentFragment()); - delete Node.prototype.querySelector; - delete Node.prototype.querySelectorAll; - Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype); - scope.cloneNode = cloneNode; - scope.nodeWasAdded = nodeWasAdded; - scope.nodeWasRemoved = nodeWasRemoved; - scope.nodesWereAdded = nodesWereAdded; - scope.nodesWereRemoved = nodesWereRemoved; - scope.originalInsertBefore = originalInsertBefore; - scope.originalRemoveChild = originalRemoveChild; - scope.snapshotNodeList = snapshotNodeList; - scope.wrappers.Node = Node; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLCollection = scope.wrappers.HTMLCollection; - var NodeList = scope.wrappers.NodeList; - var getTreeScope = scope.getTreeScope; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrap = scope.wrap; - var originalDocumentQuerySelector = document.querySelector; - var originalElementQuerySelector = document.documentElement.querySelector; - var originalDocumentQuerySelectorAll = document.querySelectorAll; - var originalElementQuerySelectorAll = document.documentElement.querySelectorAll; - var originalDocumentGetElementsByTagName = document.getElementsByTagName; - var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName; - var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS; - var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS; - var OriginalElement = window.Element; - var OriginalDocument = window.HTMLDocument || window.Document; - function filterNodeList(list, index, result, deep) { - var wrappedItem = null; - var root = null; - for (var i = 0, length = list.length; i < length; i++) { - wrappedItem = wrap(list[i]); - if (!deep && (root = getTreeScope(wrappedItem).root)) { - if (root instanceof scope.wrappers.ShadowRoot) { - continue; - } - } - result[index++] = wrappedItem; - } - return index; - } - function shimSelector(selector) { - return String(selector).replace(/\/deep\/|::shadow|>>>/g, " "); - } - function shimMatchesSelector(selector) { - return String(selector).replace(/:host\(([^\s]+)\)/g, "$1").replace(/([^\s]):host/g, "$1").replace(":host", "*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g, " "); - } - function findOne(node, selector) { - var m, el = node.firstElementChild; - while (el) { - if (el.matches(selector)) return el; - m = findOne(el, selector); - if (m) return m; - el = el.nextElementSibling; - } - return null; - } - function matchesSelector(el, selector) { - return el.matches(selector); - } - var XHTML_NS = "http://www.w3.org/1999/xhtml"; - function matchesTagName(el, localName, localNameLowerCase) { - var ln = el.localName; - return ln === localName || ln === localNameLowerCase && el.namespaceURI === XHTML_NS; - } - function matchesEveryThing() { - return true; - } - function matchesLocalNameOnly(el, ns, localName) { - return el.localName === localName; - } - function matchesNameSpace(el, ns) { - return el.namespaceURI === ns; - } - function matchesLocalNameNS(el, ns, localName) { - return el.namespaceURI === ns && el.localName === localName; - } - function findElements(node, index, result, p, arg0, arg1) { - var el = node.firstElementChild; - while (el) { - if (p(el, arg0, arg1)) result[index++] = el; - index = findElements(el, index, result, p, arg0, arg1); - el = el.nextElementSibling; - } - return index; - } - function querySelectorAllFiltered(p, index, result, selector, deep) { - var target = unsafeUnwrap(this); - var list; - var root = getTreeScope(this).root; - if (root instanceof scope.wrappers.ShadowRoot) { - return findElements(this, index, result, p, selector, null); - } else if (target instanceof OriginalElement) { - list = originalElementQuerySelectorAll.call(target, selector); - } else if (target instanceof OriginalDocument) { - list = originalDocumentQuerySelectorAll.call(target, selector); - } else { - return findElements(this, index, result, p, selector, null); - } - return filterNodeList(list, index, result, deep); - } - var SelectorsInterface = { - querySelector: function(selector) { - var shimmed = shimSelector(selector); - var deep = shimmed !== selector; - selector = shimmed; - var target = unsafeUnwrap(this); - var wrappedItem; - var root = getTreeScope(this).root; - if (root instanceof scope.wrappers.ShadowRoot) { - return findOne(this, selector); - } else if (target instanceof OriginalElement) { - wrappedItem = wrap(originalElementQuerySelector.call(target, selector)); - } else if (target instanceof OriginalDocument) { - wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector)); - } else { - return findOne(this, selector); - } - if (!wrappedItem) { - return wrappedItem; - } else if (!deep && (root = getTreeScope(wrappedItem).root)) { - if (root instanceof scope.wrappers.ShadowRoot) { - return findOne(this, selector); - } - } - return wrappedItem; - }, - querySelectorAll: function(selector) { - var shimmed = shimSelector(selector); - var deep = shimmed !== selector; - selector = shimmed; - var result = new NodeList(); - result.length = querySelectorAllFiltered.call(this, matchesSelector, 0, result, selector, deep); - return result; - } - }; - var MatchesInterface = { - matches: function(selector) { - selector = shimMatchesSelector(selector); - return scope.originalMatches.call(unsafeUnwrap(this), selector); - } - }; - function getElementsByTagNameFiltered(p, index, result, localName, lowercase) { - var target = unsafeUnwrap(this); - var list; - var root = getTreeScope(this).root; - if (root instanceof scope.wrappers.ShadowRoot) { - return findElements(this, index, result, p, localName, lowercase); - } else if (target instanceof OriginalElement) { - list = originalElementGetElementsByTagName.call(target, localName, lowercase); - } else if (target instanceof OriginalDocument) { - list = originalDocumentGetElementsByTagName.call(target, localName, lowercase); - } else { - return findElements(this, index, result, p, localName, lowercase); - } - return filterNodeList(list, index, result, false); - } - function getElementsByTagNameNSFiltered(p, index, result, ns, localName) { - var target = unsafeUnwrap(this); - var list; - var root = getTreeScope(this).root; - if (root instanceof scope.wrappers.ShadowRoot) { - return findElements(this, index, result, p, ns, localName); - } else if (target instanceof OriginalElement) { - list = originalElementGetElementsByTagNameNS.call(target, ns, localName); - } else if (target instanceof OriginalDocument) { - list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName); - } else { - return findElements(this, index, result, p, ns, localName); - } - return filterNodeList(list, index, result, false); - } - var GetElementsByInterface = { - getElementsByTagName: function(localName) { - var result = new HTMLCollection(); - var match = localName === "*" ? matchesEveryThing : matchesTagName; - result.length = getElementsByTagNameFiltered.call(this, match, 0, result, localName, localName.toLowerCase()); - return result; - }, - getElementsByClassName: function(className) { - return this.querySelectorAll("." + className); - }, - getElementsByTagNameNS: function(ns, localName) { - var result = new HTMLCollection(); - var match = null; - if (ns === "*") { - match = localName === "*" ? matchesEveryThing : matchesLocalNameOnly; - } else { - match = localName === "*" ? matchesNameSpace : matchesLocalNameNS; - } - result.length = getElementsByTagNameNSFiltered.call(this, match, 0, result, ns || null, localName); - return result; - } - }; - scope.GetElementsByInterface = GetElementsByInterface; - scope.SelectorsInterface = SelectorsInterface; - scope.MatchesInterface = MatchesInterface; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var NodeList = scope.wrappers.NodeList; - function forwardElement(node) { - while (node && node.nodeType !== Node.ELEMENT_NODE) { - node = node.nextSibling; - } - return node; - } - function backwardsElement(node) { - while (node && node.nodeType !== Node.ELEMENT_NODE) { - node = node.previousSibling; - } - return node; - } - var ParentNodeInterface = { - get firstElementChild() { - return forwardElement(this.firstChild); - }, - get lastElementChild() { - return backwardsElement(this.lastChild); - }, - get childElementCount() { - var count = 0; - for (var child = this.firstElementChild; child; child = child.nextElementSibling) { - count++; - } - return count; - }, - get children() { - var wrapperList = new NodeList(); - var i = 0; - for (var child = this.firstElementChild; child; child = child.nextElementSibling) { - wrapperList[i++] = child; - } - wrapperList.length = i; - return wrapperList; - }, - remove: function() { - var p = this.parentNode; - if (p) p.removeChild(this); - } - }; - var ChildNodeInterface = { - get nextElementSibling() { - return forwardElement(this.nextSibling); - }, - get previousElementSibling() { - return backwardsElement(this.previousSibling); - } - }; - var NonElementParentNodeInterface = { - getElementById: function(id) { - if (/[ \t\n\r\f]/.test(id)) return null; - return this.querySelector('[id="' + id + '"]'); - } - }; - scope.ChildNodeInterface = ChildNodeInterface; - scope.NonElementParentNodeInterface = NonElementParentNodeInterface; - scope.ParentNodeInterface = ParentNodeInterface; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var ChildNodeInterface = scope.ChildNodeInterface; - var Node = scope.wrappers.Node; - var enqueueMutation = scope.enqueueMutation; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var OriginalCharacterData = window.CharacterData; - function CharacterData(node) { - Node.call(this, node); - } - CharacterData.prototype = Object.create(Node.prototype); - mixin(CharacterData.prototype, { - get nodeValue() { - return this.data; - }, - set nodeValue(data) { - this.data = data; - }, - get textContent() { - return this.data; - }, - set textContent(value) { - this.data = value; - }, - get data() { - return unsafeUnwrap(this).data; - }, - set data(value) { - var oldValue = unsafeUnwrap(this).data; - enqueueMutation(this, "characterData", { - oldValue: oldValue - }); - unsafeUnwrap(this).data = value; - } - }); - mixin(CharacterData.prototype, ChildNodeInterface); - registerWrapper(OriginalCharacterData, CharacterData, document.createTextNode("")); - scope.wrappers.CharacterData = CharacterData; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var CharacterData = scope.wrappers.CharacterData; - var enqueueMutation = scope.enqueueMutation; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - function toUInt32(x) { - return x >>> 0; - } - var OriginalText = window.Text; - function Text(node) { - CharacterData.call(this, node); - } - Text.prototype = Object.create(CharacterData.prototype); - mixin(Text.prototype, { - splitText: function(offset) { - offset = toUInt32(offset); - var s = this.data; - if (offset > s.length) throw new Error("IndexSizeError"); - var head = s.slice(0, offset); - var tail = s.slice(offset); - this.data = head; - var newTextNode = this.ownerDocument.createTextNode(tail); - if (this.parentNode) this.parentNode.insertBefore(newTextNode, this.nextSibling); - return newTextNode; - } - }); - registerWrapper(OriginalText, Text, document.createTextNode("")); - scope.wrappers.Text = Text; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - if (!window.DOMTokenList) { - console.warn("Missing DOMTokenList prototype, please include a " + "compatible classList polyfill such as http://goo.gl/uTcepH."); - return; - } - var unsafeUnwrap = scope.unsafeUnwrap; - var enqueueMutation = scope.enqueueMutation; - function getClass(el) { - return unsafeUnwrap(el).getAttribute("class"); - } - function enqueueClassAttributeChange(el, oldValue) { - enqueueMutation(el, "attributes", { - name: "class", - namespace: null, - oldValue: oldValue - }); - } - function invalidateClass(el) { - scope.invalidateRendererBasedOnAttribute(el, "class"); - } - function changeClass(tokenList, method, args) { - var ownerElement = tokenList.ownerElement_; - if (ownerElement == null) { - return method.apply(tokenList, args); - } - var oldValue = getClass(ownerElement); - var retv = method.apply(tokenList, args); - if (getClass(ownerElement) !== oldValue) { - enqueueClassAttributeChange(ownerElement, oldValue); - invalidateClass(ownerElement); - } - return retv; - } - var oldAdd = DOMTokenList.prototype.add; - DOMTokenList.prototype.add = function() { - changeClass(this, oldAdd, arguments); - }; - var oldRemove = DOMTokenList.prototype.remove; - DOMTokenList.prototype.remove = function() { - changeClass(this, oldRemove, arguments); - }; - var oldToggle = DOMTokenList.prototype.toggle; - DOMTokenList.prototype.toggle = function() { - return changeClass(this, oldToggle, arguments); - }; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var ChildNodeInterface = scope.ChildNodeInterface; - var GetElementsByInterface = scope.GetElementsByInterface; - var Node = scope.wrappers.Node; - var ParentNodeInterface = scope.ParentNodeInterface; - var SelectorsInterface = scope.SelectorsInterface; - var MatchesInterface = scope.MatchesInterface; - var addWrapNodeListMethod = scope.addWrapNodeListMethod; - var enqueueMutation = scope.enqueueMutation; - var mixin = scope.mixin; - var oneOf = scope.oneOf; - var registerWrapper = scope.registerWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrappers = scope.wrappers; - var OriginalElement = window.Element; - var matchesNames = [ "matches", "mozMatchesSelector", "msMatchesSelector", "webkitMatchesSelector" ].filter(function(name) { - return OriginalElement.prototype[name]; - }); - var matchesName = matchesNames[0]; - var originalMatches = OriginalElement.prototype[matchesName]; - function invalidateRendererBasedOnAttribute(element, name) { - var p = element.parentNode; - if (!p || !p.shadowRoot) return; - var renderer = scope.getRendererForHost(p); - if (renderer.dependsOnAttribute(name)) renderer.invalidate(); - } - function enqueAttributeChange(element, name, oldValue) { - enqueueMutation(element, "attributes", { - name: name, - namespace: null, - oldValue: oldValue - }); - } - var classListTable = new WeakMap(); - function Element(node) { - Node.call(this, node); - } - Element.prototype = Object.create(Node.prototype); - mixin(Element.prototype, { - createShadowRoot: function() { - var newShadowRoot = new wrappers.ShadowRoot(this); - unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot; - var renderer = scope.getRendererForHost(this); - renderer.invalidate(); - return newShadowRoot; - }, - get shadowRoot() { - return unsafeUnwrap(this).polymerShadowRoot_ || null; - }, - setAttribute: function(name, value) { - var oldValue = unsafeUnwrap(this).getAttribute(name); - unsafeUnwrap(this).setAttribute(name, value); - enqueAttributeChange(this, name, oldValue); - invalidateRendererBasedOnAttribute(this, name); - }, - removeAttribute: function(name) { - var oldValue = unsafeUnwrap(this).getAttribute(name); - unsafeUnwrap(this).removeAttribute(name); - enqueAttributeChange(this, name, oldValue); - invalidateRendererBasedOnAttribute(this, name); - }, - get classList() { - var list = classListTable.get(this); - if (!list) { - list = unsafeUnwrap(this).classList; - if (!list) return; - list.ownerElement_ = this; - classListTable.set(this, list); - } - return list; - }, - get className() { - return unsafeUnwrap(this).className; - }, - set className(v) { - this.setAttribute("class", v); - }, - get id() { - return unsafeUnwrap(this).id; - }, - set id(v) { - this.setAttribute("id", v); - } - }); - matchesNames.forEach(function(name) { - if (name !== "matches") { - Element.prototype[name] = function(selector) { - return this.matches(selector); - }; - } - }); - if (OriginalElement.prototype.webkitCreateShadowRoot) { - Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot; - } - mixin(Element.prototype, ChildNodeInterface); - mixin(Element.prototype, GetElementsByInterface); - mixin(Element.prototype, ParentNodeInterface); - mixin(Element.prototype, SelectorsInterface); - mixin(Element.prototype, MatchesInterface); - registerWrapper(OriginalElement, Element, document.createElementNS(null, "x")); - scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute; - scope.matchesNames = matchesNames; - scope.originalMatches = originalMatches; - scope.wrappers.Element = Element; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var Element = scope.wrappers.Element; - var defineGetter = scope.defineGetter; - var enqueueMutation = scope.enqueueMutation; - var mixin = scope.mixin; - var nodesWereAdded = scope.nodesWereAdded; - var nodesWereRemoved = scope.nodesWereRemoved; - var registerWrapper = scope.registerWrapper; - var snapshotNodeList = scope.snapshotNodeList; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var wrappers = scope.wrappers; - var escapeAttrRegExp = /[&\u00A0"]/g; - var escapeDataRegExp = /[&\u00A0<>]/g; - function escapeReplace(c) { - switch (c) { - case "&": - return "&"; - - case "<": - return "<"; - - case ">": - return ">"; - - case '"': - return """; - - case " ": - return " "; - } - } - function escapeAttr(s) { - return s.replace(escapeAttrRegExp, escapeReplace); - } - function escapeData(s) { - return s.replace(escapeDataRegExp, escapeReplace); - } - function makeSet(arr) { - var set = {}; - for (var i = 0; i < arr.length; i++) { - set[arr[i]] = true; - } - return set; - } - var voidElements = makeSet([ "area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr" ]); - var plaintextParents = makeSet([ "style", "script", "xmp", "iframe", "noembed", "noframes", "plaintext", "noscript" ]); - var XHTML_NS = "http://www.w3.org/1999/xhtml"; - function needsSelfClosingSlash(node) { - if (node.namespaceURI !== XHTML_NS) return true; - var doctype = node.ownerDocument.doctype; - return doctype && doctype.publicId && doctype.systemId; - } - function getOuterHTML(node, parentNode) { - switch (node.nodeType) { - case Node.ELEMENT_NODE: - var tagName = node.tagName.toLowerCase(); - var s = "<" + tagName; - var attrs = node.attributes; - for (var i = 0, attr; attr = attrs[i]; i++) { - s += " " + attr.name + '="' + escapeAttr(attr.value) + '"'; - } - if (voidElements[tagName]) { - if (needsSelfClosingSlash(node)) s += "/"; - return s + ">"; - } - return s + ">" + getInnerHTML(node) + ""; - - case Node.TEXT_NODE: - var data = node.data; - if (parentNode && plaintextParents[parentNode.localName]) return data; - return escapeData(data); - - case Node.COMMENT_NODE: - return ""; - - default: - console.error(node); - throw new Error("not implemented"); - } - } - function getInnerHTML(node) { - if (node instanceof wrappers.HTMLTemplateElement) node = node.content; - var s = ""; - for (var child = node.firstChild; child; child = child.nextSibling) { - s += getOuterHTML(child, node); - } - return s; - } - function setInnerHTML(node, value, opt_tagName) { - var tagName = opt_tagName || "div"; - node.textContent = ""; - var tempElement = unwrap(node.ownerDocument.createElement(tagName)); - tempElement.innerHTML = value; - var firstChild; - while (firstChild = tempElement.firstChild) { - node.appendChild(wrap(firstChild)); - } - } - var oldIe = /MSIE/.test(navigator.userAgent); - var OriginalHTMLElement = window.HTMLElement; - var OriginalHTMLTemplateElement = window.HTMLTemplateElement; - function HTMLElement(node) { - Element.call(this, node); - } - HTMLElement.prototype = Object.create(Element.prototype); - mixin(HTMLElement.prototype, { - get innerHTML() { - return getInnerHTML(this); - }, - set innerHTML(value) { - if (oldIe && plaintextParents[this.localName]) { - this.textContent = value; - return; - } - var removedNodes = snapshotNodeList(this.childNodes); - if (this.invalidateShadowRenderer()) { - if (this instanceof wrappers.HTMLTemplateElement) setInnerHTML(this.content, value); else setInnerHTML(this, value, this.tagName); - } else if (!OriginalHTMLTemplateElement && this instanceof wrappers.HTMLTemplateElement) { - setInnerHTML(this.content, value); - } else { - unsafeUnwrap(this).innerHTML = value; - } - var addedNodes = snapshotNodeList(this.childNodes); - enqueueMutation(this, "childList", { - addedNodes: addedNodes, - removedNodes: removedNodes - }); - nodesWereRemoved(removedNodes); - nodesWereAdded(addedNodes, this); - }, - get outerHTML() { - return getOuterHTML(this, this.parentNode); - }, - set outerHTML(value) { - var p = this.parentNode; - if (p) { - p.invalidateShadowRenderer(); - var df = frag(p, value); - p.replaceChild(df, this); - } - }, - insertAdjacentHTML: function(position, text) { - var contextElement, refNode; - switch (String(position).toLowerCase()) { - case "beforebegin": - contextElement = this.parentNode; - refNode = this; - break; - - case "afterend": - contextElement = this.parentNode; - refNode = this.nextSibling; - break; - - case "afterbegin": - contextElement = this; - refNode = this.firstChild; - break; - - case "beforeend": - contextElement = this; - refNode = null; - break; - - default: - return; - } - var df = frag(contextElement, text); - contextElement.insertBefore(df, refNode); - }, - get hidden() { - return this.hasAttribute("hidden"); - }, - set hidden(v) { - if (v) { - this.setAttribute("hidden", ""); - } else { - this.removeAttribute("hidden"); - } - } - }); - function frag(contextElement, html) { - var p = unwrap(contextElement.cloneNode(false)); - p.innerHTML = html; - var df = unwrap(document.createDocumentFragment()); - var c; - while (c = p.firstChild) { - df.appendChild(c); - } - return wrap(df); - } - function getter(name) { - return function() { - scope.renderAllPending(); - return unsafeUnwrap(this)[name]; - }; - } - function getterRequiresRendering(name) { - defineGetter(HTMLElement, name, getter(name)); - } - [ "clientHeight", "clientLeft", "clientTop", "clientWidth", "offsetHeight", "offsetLeft", "offsetTop", "offsetWidth", "scrollHeight", "scrollWidth" ].forEach(getterRequiresRendering); - function getterAndSetterRequiresRendering(name) { - Object.defineProperty(HTMLElement.prototype, name, { - get: getter(name), - set: function(v) { - scope.renderAllPending(); - unsafeUnwrap(this)[name] = v; - }, - configurable: true, - enumerable: true - }); - } - [ "scrollLeft", "scrollTop" ].forEach(getterAndSetterRequiresRendering); - function methodRequiresRendering(name) { - Object.defineProperty(HTMLElement.prototype, name, { - value: function() { - scope.renderAllPending(); - return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments); - }, - configurable: true, - enumerable: true - }); - } - [ "focus", "getBoundingClientRect", "getClientRects", "scrollIntoView" ].forEach(methodRequiresRendering); - registerWrapper(OriginalHTMLElement, HTMLElement, document.createElement("b")); - scope.wrappers.HTMLElement = HTMLElement; - scope.getInnerHTML = getInnerHTML; - scope.setInnerHTML = setInnerHTML; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrap = scope.wrap; - var OriginalHTMLCanvasElement = window.HTMLCanvasElement; - function HTMLCanvasElement(node) { - HTMLElement.call(this, node); - } - HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLCanvasElement.prototype, { - getContext: function() { - var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments); - return context && wrap(context); - } - }); - registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement, document.createElement("canvas")); - scope.wrappers.HTMLCanvasElement = HTMLCanvasElement; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var OriginalHTMLContentElement = window.HTMLContentElement; - function HTMLContentElement(node) { - HTMLElement.call(this, node); - } - HTMLContentElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLContentElement.prototype, { - constructor: HTMLContentElement, - get select() { - return this.getAttribute("select"); - }, - set select(value) { - this.setAttribute("select", value); - }, - setAttribute: function(n, v) { - HTMLElement.prototype.setAttribute.call(this, n, v); - if (String(n).toLowerCase() === "select") this.invalidateShadowRenderer(true); - } - }); - if (OriginalHTMLContentElement) registerWrapper(OriginalHTMLContentElement, HTMLContentElement); - scope.wrappers.HTMLContentElement = HTMLContentElement; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var wrapHTMLCollection = scope.wrapHTMLCollection; - var unwrap = scope.unwrap; - var OriginalHTMLFormElement = window.HTMLFormElement; - function HTMLFormElement(node) { - HTMLElement.call(this, node); - } - HTMLFormElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLFormElement.prototype, { - get elements() { - return wrapHTMLCollection(unwrap(this).elements); - } - }); - registerWrapper(OriginalHTMLFormElement, HTMLFormElement, document.createElement("form")); - scope.wrappers.HTMLFormElement = HTMLFormElement; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var registerWrapper = scope.registerWrapper; - var unwrap = scope.unwrap; - var rewrap = scope.rewrap; - var OriginalHTMLImageElement = window.HTMLImageElement; - function HTMLImageElement(node) { - HTMLElement.call(this, node); - } - HTMLImageElement.prototype = Object.create(HTMLElement.prototype); - registerWrapper(OriginalHTMLImageElement, HTMLImageElement, document.createElement("img")); - function Image(width, height) { - if (!(this instanceof Image)) { - throw new TypeError("DOM object constructor cannot be called as a function."); - } - var node = unwrap(document.createElement("img")); - HTMLElement.call(this, node); - rewrap(node, this); - if (width !== undefined) node.width = width; - if (height !== undefined) node.height = height; - } - Image.prototype = HTMLImageElement.prototype; - scope.wrappers.HTMLImageElement = HTMLImageElement; - scope.wrappers.Image = Image; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var NodeList = scope.wrappers.NodeList; - var registerWrapper = scope.registerWrapper; - var OriginalHTMLShadowElement = window.HTMLShadowElement; - function HTMLShadowElement(node) { - HTMLElement.call(this, node); - } - HTMLShadowElement.prototype = Object.create(HTMLElement.prototype); - HTMLShadowElement.prototype.constructor = HTMLShadowElement; - if (OriginalHTMLShadowElement) registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement); - scope.wrappers.HTMLShadowElement = HTMLShadowElement; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var contentTable = new WeakMap(); - var templateContentsOwnerTable = new WeakMap(); - function getTemplateContentsOwner(doc) { - if (!doc.defaultView) return doc; - var d = templateContentsOwnerTable.get(doc); - if (!d) { - d = doc.implementation.createHTMLDocument(""); - while (d.lastChild) { - d.removeChild(d.lastChild); - } - templateContentsOwnerTable.set(doc, d); - } - return d; - } - function extractContent(templateElement) { - var doc = getTemplateContentsOwner(templateElement.ownerDocument); - var df = unwrap(doc.createDocumentFragment()); - var child; - while (child = templateElement.firstChild) { - df.appendChild(child); - } - return df; - } - var OriginalHTMLTemplateElement = window.HTMLTemplateElement; - function HTMLTemplateElement(node) { - HTMLElement.call(this, node); - if (!OriginalHTMLTemplateElement) { - var content = extractContent(node); - contentTable.set(this, wrap(content)); - } - } - HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLTemplateElement.prototype, { - constructor: HTMLTemplateElement, - get content() { - if (OriginalHTMLTemplateElement) return wrap(unsafeUnwrap(this).content); - return contentTable.get(this); - } - }); - if (OriginalHTMLTemplateElement) registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement); - scope.wrappers.HTMLTemplateElement = HTMLTemplateElement; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var registerWrapper = scope.registerWrapper; - var OriginalHTMLMediaElement = window.HTMLMediaElement; - if (!OriginalHTMLMediaElement) return; - function HTMLMediaElement(node) { - HTMLElement.call(this, node); - } - HTMLMediaElement.prototype = Object.create(HTMLElement.prototype); - registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement, document.createElement("audio")); - scope.wrappers.HTMLMediaElement = HTMLMediaElement; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLMediaElement = scope.wrappers.HTMLMediaElement; - var registerWrapper = scope.registerWrapper; - var unwrap = scope.unwrap; - var rewrap = scope.rewrap; - var OriginalHTMLAudioElement = window.HTMLAudioElement; - if (!OriginalHTMLAudioElement) return; - function HTMLAudioElement(node) { - HTMLMediaElement.call(this, node); - } - HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype); - registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement, document.createElement("audio")); - function Audio(src) { - if (!(this instanceof Audio)) { - throw new TypeError("DOM object constructor cannot be called as a function."); - } - var node = unwrap(document.createElement("audio")); - HTMLMediaElement.call(this, node); - rewrap(node, this); - node.setAttribute("preload", "auto"); - if (src !== undefined) node.setAttribute("src", src); - } - Audio.prototype = HTMLAudioElement.prototype; - scope.wrappers.HTMLAudioElement = HTMLAudioElement; - scope.wrappers.Audio = Audio; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var rewrap = scope.rewrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var OriginalHTMLOptionElement = window.HTMLOptionElement; - function trimText(s) { - return s.replace(/\s+/g, " ").trim(); - } - function HTMLOptionElement(node) { - HTMLElement.call(this, node); - } - HTMLOptionElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLOptionElement.prototype, { - get text() { - return trimText(this.textContent); - }, - set text(value) { - this.textContent = trimText(String(value)); - }, - get form() { - return wrap(unwrap(this).form); - } - }); - registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement, document.createElement("option")); - function Option(text, value, defaultSelected, selected) { - if (!(this instanceof Option)) { - throw new TypeError("DOM object constructor cannot be called as a function."); - } - var node = unwrap(document.createElement("option")); - HTMLElement.call(this, node); - rewrap(node, this); - if (text !== undefined) node.text = text; - if (value !== undefined) node.setAttribute("value", value); - if (defaultSelected === true) node.setAttribute("selected", ""); - node.selected = selected === true; - } - Option.prototype = HTMLOptionElement.prototype; - scope.wrappers.HTMLOptionElement = HTMLOptionElement; - scope.wrappers.Option = Option; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var OriginalHTMLSelectElement = window.HTMLSelectElement; - function HTMLSelectElement(node) { - HTMLElement.call(this, node); - } - HTMLSelectElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLSelectElement.prototype, { - add: function(element, before) { - if (typeof before === "object") before = unwrap(before); - unwrap(this).add(unwrap(element), before); - }, - remove: function(indexOrNode) { - if (indexOrNode === undefined) { - HTMLElement.prototype.remove.call(this); - return; - } - if (typeof indexOrNode === "object") indexOrNode = unwrap(indexOrNode); - unwrap(this).remove(indexOrNode); - }, - get form() { - return wrap(unwrap(this).form); - } - }); - registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement, document.createElement("select")); - scope.wrappers.HTMLSelectElement = HTMLSelectElement; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var wrapHTMLCollection = scope.wrapHTMLCollection; - var OriginalHTMLTableElement = window.HTMLTableElement; - function HTMLTableElement(node) { - HTMLElement.call(this, node); - } - HTMLTableElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLTableElement.prototype, { - get caption() { - return wrap(unwrap(this).caption); - }, - createCaption: function() { - return wrap(unwrap(this).createCaption()); - }, - get tHead() { - return wrap(unwrap(this).tHead); - }, - createTHead: function() { - return wrap(unwrap(this).createTHead()); - }, - createTFoot: function() { - return wrap(unwrap(this).createTFoot()); - }, - get tFoot() { - return wrap(unwrap(this).tFoot); - }, - get tBodies() { - return wrapHTMLCollection(unwrap(this).tBodies); - }, - createTBody: function() { - return wrap(unwrap(this).createTBody()); - }, - get rows() { - return wrapHTMLCollection(unwrap(this).rows); - }, - insertRow: function(index) { - return wrap(unwrap(this).insertRow(index)); - } - }); - registerWrapper(OriginalHTMLTableElement, HTMLTableElement, document.createElement("table")); - scope.wrappers.HTMLTableElement = HTMLTableElement; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var wrapHTMLCollection = scope.wrapHTMLCollection; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement; - function HTMLTableSectionElement(node) { - HTMLElement.call(this, node); - } - HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLTableSectionElement.prototype, { - constructor: HTMLTableSectionElement, - get rows() { - return wrapHTMLCollection(unwrap(this).rows); - }, - insertRow: function(index) { - return wrap(unwrap(this).insertRow(index)); - } - }); - registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement, document.createElement("thead")); - scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var wrapHTMLCollection = scope.wrapHTMLCollection; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var OriginalHTMLTableRowElement = window.HTMLTableRowElement; - function HTMLTableRowElement(node) { - HTMLElement.call(this, node); - } - HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLTableRowElement.prototype, { - get cells() { - return wrapHTMLCollection(unwrap(this).cells); - }, - insertCell: function(index) { - return wrap(unwrap(this).insertCell(index)); - } - }); - registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement, document.createElement("tr")); - scope.wrappers.HTMLTableRowElement = HTMLTableRowElement; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLContentElement = scope.wrappers.HTMLContentElement; - var HTMLElement = scope.wrappers.HTMLElement; - var HTMLShadowElement = scope.wrappers.HTMLShadowElement; - var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var OriginalHTMLUnknownElement = window.HTMLUnknownElement; - function HTMLUnknownElement(node) { - switch (node.localName) { - case "content": - return new HTMLContentElement(node); - - case "shadow": - return new HTMLShadowElement(node); - - case "template": - return new HTMLTemplateElement(node); - } - HTMLElement.call(this, node); - } - HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype); - registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement); - scope.wrappers.HTMLUnknownElement = HTMLUnknownElement; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var Element = scope.wrappers.Element; - var HTMLElement = scope.wrappers.HTMLElement; - var registerWrapper = scope.registerWrapper; - var defineWrapGetter = scope.defineWrapGetter; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrap = scope.wrap; - var mixin = scope.mixin; - var SVG_NS = "http://www.w3.org/2000/svg"; - var OriginalSVGElement = window.SVGElement; - var svgTitleElement = document.createElementNS(SVG_NS, "title"); - if (!("classList" in svgTitleElement)) { - var descr = Object.getOwnPropertyDescriptor(Element.prototype, "classList"); - Object.defineProperty(HTMLElement.prototype, "classList", descr); - delete Element.prototype.classList; - } - function SVGElement(node) { - Element.call(this, node); - } - SVGElement.prototype = Object.create(Element.prototype); - mixin(SVGElement.prototype, { - get ownerSVGElement() { - return wrap(unsafeUnwrap(this).ownerSVGElement); - } - }); - registerWrapper(OriginalSVGElement, SVGElement, document.createElementNS(SVG_NS, "title")); - scope.wrappers.SVGElement = SVGElement; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var OriginalSVGUseElement = window.SVGUseElement; - var SVG_NS = "http://www.w3.org/2000/svg"; - var gWrapper = wrap(document.createElementNS(SVG_NS, "g")); - var useElement = document.createElementNS(SVG_NS, "use"); - var SVGGElement = gWrapper.constructor; - var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype); - var parentInterface = parentInterfacePrototype.constructor; - function SVGUseElement(impl) { - parentInterface.call(this, impl); - } - SVGUseElement.prototype = Object.create(parentInterfacePrototype); - if ("instanceRoot" in useElement) { - mixin(SVGUseElement.prototype, { - get instanceRoot() { - return wrap(unwrap(this).instanceRoot); - }, - get animatedInstanceRoot() { - return wrap(unwrap(this).animatedInstanceRoot); - } - }); - } - registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement); - scope.wrappers.SVGUseElement = SVGUseElement; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var EventTarget = scope.wrappers.EventTarget; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrap = scope.wrap; - var OriginalSVGElementInstance = window.SVGElementInstance; - if (!OriginalSVGElementInstance) return; - function SVGElementInstance(impl) { - EventTarget.call(this, impl); - } - SVGElementInstance.prototype = Object.create(EventTarget.prototype); - mixin(SVGElementInstance.prototype, { - get correspondingElement() { - return wrap(unsafeUnwrap(this).correspondingElement); - }, - get correspondingUseElement() { - return wrap(unsafeUnwrap(this).correspondingUseElement); - }, - get parentNode() { - return wrap(unsafeUnwrap(this).parentNode); - }, - get childNodes() { - throw new Error("Not implemented"); - }, - get firstChild() { - return wrap(unsafeUnwrap(this).firstChild); - }, - get lastChild() { - return wrap(unsafeUnwrap(this).lastChild); - }, - get previousSibling() { - return wrap(unsafeUnwrap(this).previousSibling); - }, - get nextSibling() { - return wrap(unsafeUnwrap(this).nextSibling); - } - }); - registerWrapper(OriginalSVGElementInstance, SVGElementInstance); - scope.wrappers.SVGElementInstance = SVGElementInstance; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D; - function CanvasRenderingContext2D(impl) { - setWrapper(impl, this); - } - mixin(CanvasRenderingContext2D.prototype, { - get canvas() { - return wrap(unsafeUnwrap(this).canvas); - }, - drawImage: function() { - arguments[0] = unwrapIfNeeded(arguments[0]); - unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments); - }, - createPattern: function() { - arguments[0] = unwrap(arguments[0]); - return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments); - } - }); - registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D, document.createElement("canvas").getContext("2d")); - scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var addForwardingProperties = scope.addForwardingProperties; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var OriginalWebGLRenderingContext = window.WebGLRenderingContext; - if (!OriginalWebGLRenderingContext) return; - function WebGLRenderingContext(impl) { - setWrapper(impl, this); - } - mixin(WebGLRenderingContext.prototype, { - get canvas() { - return wrap(unsafeUnwrap(this).canvas); - }, - texImage2D: function() { - arguments[5] = unwrapIfNeeded(arguments[5]); - unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments); - }, - texSubImage2D: function() { - arguments[6] = unwrapIfNeeded(arguments[6]); - unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments); - } - }); - var OriginalWebGLRenderingContextBase = Object.getPrototypeOf(OriginalWebGLRenderingContext.prototype); - if (OriginalWebGLRenderingContextBase !== Object.prototype) { - addForwardingProperties(OriginalWebGLRenderingContextBase, WebGLRenderingContext.prototype); - } - var instanceProperties = /WebKit/.test(navigator.userAgent) ? { - drawingBufferHeight: null, - drawingBufferWidth: null - } : {}; - registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext, instanceProperties); - scope.wrappers.WebGLRenderingContext = WebGLRenderingContext; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var Node = scope.wrappers.Node; - var GetElementsByInterface = scope.GetElementsByInterface; - var NonElementParentNodeInterface = scope.NonElementParentNodeInterface; - var ParentNodeInterface = scope.ParentNodeInterface; - var SelectorsInterface = scope.SelectorsInterface; - var mixin = scope.mixin; - var registerObject = scope.registerObject; - var registerWrapper = scope.registerWrapper; - var OriginalDocumentFragment = window.DocumentFragment; - function DocumentFragment(node) { - Node.call(this, node); - } - DocumentFragment.prototype = Object.create(Node.prototype); - mixin(DocumentFragment.prototype, ParentNodeInterface); - mixin(DocumentFragment.prototype, SelectorsInterface); - mixin(DocumentFragment.prototype, GetElementsByInterface); - mixin(DocumentFragment.prototype, NonElementParentNodeInterface); - registerWrapper(OriginalDocumentFragment, DocumentFragment, document.createDocumentFragment()); - scope.wrappers.DocumentFragment = DocumentFragment; - var Comment = registerObject(document.createComment("")); - scope.wrappers.Comment = Comment; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var DocumentFragment = scope.wrappers.DocumentFragment; - var TreeScope = scope.TreeScope; - var elementFromPoint = scope.elementFromPoint; - var getInnerHTML = scope.getInnerHTML; - var getTreeScope = scope.getTreeScope; - var mixin = scope.mixin; - var rewrap = scope.rewrap; - var setInnerHTML = scope.setInnerHTML; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var shadowHostTable = new WeakMap(); - var nextOlderShadowTreeTable = new WeakMap(); - function ShadowRoot(hostWrapper) { - var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment()); - DocumentFragment.call(this, node); - rewrap(node, this); - var oldShadowRoot = hostWrapper.shadowRoot; - nextOlderShadowTreeTable.set(this, oldShadowRoot); - this.treeScope_ = new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper)); - shadowHostTable.set(this, hostWrapper); - } - ShadowRoot.prototype = Object.create(DocumentFragment.prototype); - mixin(ShadowRoot.prototype, { - constructor: ShadowRoot, - get innerHTML() { - return getInnerHTML(this); - }, - set innerHTML(value) { - setInnerHTML(this, value); - this.invalidateShadowRenderer(); - }, - get olderShadowRoot() { - return nextOlderShadowTreeTable.get(this) || null; - }, - get host() { - return shadowHostTable.get(this) || null; - }, - invalidateShadowRenderer: function() { - return shadowHostTable.get(this).invalidateShadowRenderer(); - }, - elementFromPoint: function(x, y) { - return elementFromPoint(this, this.ownerDocument, x, y); - }, - getSelection: function() { - return document.getSelection(); - }, - get activeElement() { - var unwrappedActiveElement = unwrap(this).ownerDocument.activeElement; - if (!unwrappedActiveElement || !unwrappedActiveElement.nodeType) return null; - var activeElement = wrap(unwrappedActiveElement); - while (!this.contains(activeElement)) { - while (activeElement.parentNode) { - activeElement = activeElement.parentNode; - } - if (activeElement.host) { - activeElement = activeElement.host; - } else { - return null; - } - } - return activeElement; - } - }); - scope.wrappers.ShadowRoot = ShadowRoot; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var getTreeScope = scope.getTreeScope; - var OriginalRange = window.Range; - var ShadowRoot = scope.wrappers.ShadowRoot; - function getHost(node) { - var root = getTreeScope(node).root; - if (root instanceof ShadowRoot) { - return root.host; - } - return null; - } - function hostNodeToShadowNode(refNode, offset) { - if (refNode.shadowRoot) { - offset = Math.min(refNode.childNodes.length - 1, offset); - var child = refNode.childNodes[offset]; - if (child) { - var insertionPoint = scope.getDestinationInsertionPoints(child); - if (insertionPoint.length > 0) { - var parentNode = insertionPoint[0].parentNode; - if (parentNode.nodeType == Node.ELEMENT_NODE) { - refNode = parentNode; - } - } - } - } - return refNode; - } - function shadowNodeToHostNode(node) { - node = wrap(node); - return getHost(node) || node; - } - function Range(impl) { - setWrapper(impl, this); - } - Range.prototype = { - get startContainer() { - return shadowNodeToHostNode(unsafeUnwrap(this).startContainer); - }, - get endContainer() { - return shadowNodeToHostNode(unsafeUnwrap(this).endContainer); - }, - get commonAncestorContainer() { - return shadowNodeToHostNode(unsafeUnwrap(this).commonAncestorContainer); - }, - setStart: function(refNode, offset) { - refNode = hostNodeToShadowNode(refNode, offset); - unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset); - }, - setEnd: function(refNode, offset) { - refNode = hostNodeToShadowNode(refNode, offset); - unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset); - }, - setStartBefore: function(refNode) { - unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode)); - }, - setStartAfter: function(refNode) { - unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode)); - }, - setEndBefore: function(refNode) { - unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode)); - }, - setEndAfter: function(refNode) { - unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode)); - }, - selectNode: function(refNode) { - unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode)); - }, - selectNodeContents: function(refNode) { - unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode)); - }, - compareBoundaryPoints: function(how, sourceRange) { - return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange)); - }, - extractContents: function() { - return wrap(unsafeUnwrap(this).extractContents()); - }, - cloneContents: function() { - return wrap(unsafeUnwrap(this).cloneContents()); - }, - insertNode: function(node) { - unsafeUnwrap(this).insertNode(unwrapIfNeeded(node)); - }, - surroundContents: function(newParent) { - unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent)); - }, - cloneRange: function() { - return wrap(unsafeUnwrap(this).cloneRange()); - }, - isPointInRange: function(node, offset) { - return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset); - }, - comparePoint: function(node, offset) { - return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset); - }, - intersectsNode: function(node) { - return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node)); - }, - toString: function() { - return unsafeUnwrap(this).toString(); - } - }; - if (OriginalRange.prototype.createContextualFragment) { - Range.prototype.createContextualFragment = function(html) { - return wrap(unsafeUnwrap(this).createContextualFragment(html)); - }; - } - registerWrapper(window.Range, Range, document.createRange()); - scope.wrappers.Range = Range; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var Element = scope.wrappers.Element; - var HTMLContentElement = scope.wrappers.HTMLContentElement; - var HTMLShadowElement = scope.wrappers.HTMLShadowElement; - var Node = scope.wrappers.Node; - var ShadowRoot = scope.wrappers.ShadowRoot; - var assert = scope.assert; - var getTreeScope = scope.getTreeScope; - var mixin = scope.mixin; - var oneOf = scope.oneOf; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var ArraySplice = scope.ArraySplice; - function updateWrapperUpAndSideways(wrapper) { - wrapper.previousSibling_ = wrapper.previousSibling; - wrapper.nextSibling_ = wrapper.nextSibling; - wrapper.parentNode_ = wrapper.parentNode; - } - function updateWrapperDown(wrapper) { - wrapper.firstChild_ = wrapper.firstChild; - wrapper.lastChild_ = wrapper.lastChild; - } - function updateAllChildNodes(parentNodeWrapper) { - assert(parentNodeWrapper instanceof Node); - for (var childWrapper = parentNodeWrapper.firstChild; childWrapper; childWrapper = childWrapper.nextSibling) { - updateWrapperUpAndSideways(childWrapper); - } - updateWrapperDown(parentNodeWrapper); - } - function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) { - var parentNode = unwrap(parentNodeWrapper); - var newChild = unwrap(newChildWrapper); - var refChild = refChildWrapper ? unwrap(refChildWrapper) : null; - remove(newChildWrapper); - updateWrapperUpAndSideways(newChildWrapper); - if (!refChildWrapper) { - parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild; - if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild) parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild; - var lastChildWrapper = wrap(parentNode.lastChild); - if (lastChildWrapper) lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling; - } else { - if (parentNodeWrapper.firstChild === refChildWrapper) parentNodeWrapper.firstChild_ = refChildWrapper; - refChildWrapper.previousSibling_ = refChildWrapper.previousSibling; - } - scope.originalInsertBefore.call(parentNode, newChild, refChild); - } - function remove(nodeWrapper) { - var node = unwrap(nodeWrapper); - var parentNode = node.parentNode; - if (!parentNode) return; - var parentNodeWrapper = wrap(parentNode); - updateWrapperUpAndSideways(nodeWrapper); - if (nodeWrapper.previousSibling) nodeWrapper.previousSibling.nextSibling_ = nodeWrapper; - if (nodeWrapper.nextSibling) nodeWrapper.nextSibling.previousSibling_ = nodeWrapper; - if (parentNodeWrapper.lastChild === nodeWrapper) parentNodeWrapper.lastChild_ = nodeWrapper; - if (parentNodeWrapper.firstChild === nodeWrapper) parentNodeWrapper.firstChild_ = nodeWrapper; - scope.originalRemoveChild.call(parentNode, node); - } - var distributedNodesTable = new WeakMap(); - var destinationInsertionPointsTable = new WeakMap(); - var rendererForHostTable = new WeakMap(); - function resetDistributedNodes(insertionPoint) { - distributedNodesTable.set(insertionPoint, []); - } - function getDistributedNodes(insertionPoint) { - var rv = distributedNodesTable.get(insertionPoint); - if (!rv) distributedNodesTable.set(insertionPoint, rv = []); - return rv; - } - function getChildNodesSnapshot(node) { - var result = [], i = 0; - for (var child = node.firstChild; child; child = child.nextSibling) { - result[i++] = child; - } - return result; - } - var request = oneOf(window, [ "requestAnimationFrame", "mozRequestAnimationFrame", "webkitRequestAnimationFrame", "setTimeout" ]); - var pendingDirtyRenderers = []; - var renderTimer; - function renderAllPending() { - for (var i = 0; i < pendingDirtyRenderers.length; i++) { - var renderer = pendingDirtyRenderers[i]; - var parentRenderer = renderer.parentRenderer; - if (parentRenderer && parentRenderer.dirty) continue; - renderer.render(); - } - pendingDirtyRenderers = []; - } - function handleRequestAnimationFrame() { - renderTimer = null; - renderAllPending(); - } - function getRendererForHost(host) { - var renderer = rendererForHostTable.get(host); - if (!renderer) { - renderer = new ShadowRenderer(host); - rendererForHostTable.set(host, renderer); - } - return renderer; - } - function getShadowRootAncestor(node) { - var root = getTreeScope(node).root; - if (root instanceof ShadowRoot) return root; - return null; - } - function getRendererForShadowRoot(shadowRoot) { - return getRendererForHost(shadowRoot.host); - } - var spliceDiff = new ArraySplice(); - spliceDiff.equals = function(renderNode, rawNode) { - return unwrap(renderNode.node) === rawNode; - }; - function RenderNode(node) { - this.skip = false; - this.node = node; - this.childNodes = []; - } - RenderNode.prototype = { - append: function(node) { - var rv = new RenderNode(node); - this.childNodes.push(rv); - return rv; - }, - sync: function(opt_added) { - if (this.skip) return; - var nodeWrapper = this.node; - var newChildren = this.childNodes; - var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper)); - var added = opt_added || new WeakMap(); - var splices = spliceDiff.calculateSplices(newChildren, oldChildren); - var newIndex = 0, oldIndex = 0; - var lastIndex = 0; - for (var i = 0; i < splices.length; i++) { - var splice = splices[i]; - for (;lastIndex < splice.index; lastIndex++) { - oldIndex++; - newChildren[newIndex++].sync(added); - } - var removedCount = splice.removed.length; - for (var j = 0; j < removedCount; j++) { - var wrapper = wrap(oldChildren[oldIndex++]); - if (!added.get(wrapper)) remove(wrapper); - } - var addedCount = splice.addedCount; - var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]); - for (var j = 0; j < addedCount; j++) { - var newChildRenderNode = newChildren[newIndex++]; - var newChildWrapper = newChildRenderNode.node; - insertBefore(nodeWrapper, newChildWrapper, refNode); - added.set(newChildWrapper, true); - newChildRenderNode.sync(added); - } - lastIndex += addedCount; - } - for (var i = lastIndex; i < newChildren.length; i++) { - newChildren[i].sync(added); - } - } - }; - function ShadowRenderer(host) { - this.host = host; - this.dirty = false; - this.invalidateAttributes(); - this.associateNode(host); - } - ShadowRenderer.prototype = { - render: function(opt_renderNode) { - if (!this.dirty) return; - this.invalidateAttributes(); - var host = this.host; - this.distribution(host); - var renderNode = opt_renderNode || new RenderNode(host); - this.buildRenderTree(renderNode, host); - var topMostRenderer = !opt_renderNode; - if (topMostRenderer) renderNode.sync(); - this.dirty = false; - }, - get parentRenderer() { - return getTreeScope(this.host).renderer; - }, - invalidate: function() { - if (!this.dirty) { - this.dirty = true; - var parentRenderer = this.parentRenderer; - if (parentRenderer) parentRenderer.invalidate(); - pendingDirtyRenderers.push(this); - if (renderTimer) return; - renderTimer = window[request](handleRequestAnimationFrame, 0); - } - }, - distribution: function(root) { - this.resetAllSubtrees(root); - this.distributionResolution(root); - }, - resetAll: function(node) { - if (isInsertionPoint(node)) resetDistributedNodes(node); else resetDestinationInsertionPoints(node); - this.resetAllSubtrees(node); - }, - resetAllSubtrees: function(node) { - for (var child = node.firstChild; child; child = child.nextSibling) { - this.resetAll(child); - } - if (node.shadowRoot) this.resetAll(node.shadowRoot); - if (node.olderShadowRoot) this.resetAll(node.olderShadowRoot); - }, - distributionResolution: function(node) { - if (isShadowHost(node)) { - var shadowHost = node; - var pool = poolPopulation(shadowHost); - var shadowTrees = getShadowTrees(shadowHost); - for (var i = 0; i < shadowTrees.length; i++) { - this.poolDistribution(shadowTrees[i], pool); - } - for (var i = shadowTrees.length - 1; i >= 0; i--) { - var shadowTree = shadowTrees[i]; - var shadow = getShadowInsertionPoint(shadowTree); - if (shadow) { - var olderShadowRoot = shadowTree.olderShadowRoot; - if (olderShadowRoot) { - pool = poolPopulation(olderShadowRoot); - } - for (var j = 0; j < pool.length; j++) { - destributeNodeInto(pool[j], shadow); - } - } - this.distributionResolution(shadowTree); - } - } - for (var child = node.firstChild; child; child = child.nextSibling) { - this.distributionResolution(child); - } - }, - poolDistribution: function(node, pool) { - if (node instanceof HTMLShadowElement) return; - if (node instanceof HTMLContentElement) { - var content = node; - this.updateDependentAttributes(content.getAttribute("select")); - var anyDistributed = false; - for (var i = 0; i < pool.length; i++) { - var node = pool[i]; - if (!node) continue; - if (matches(node, content)) { - destributeNodeInto(node, content); - pool[i] = undefined; - anyDistributed = true; - } - } - if (!anyDistributed) { - for (var child = content.firstChild; child; child = child.nextSibling) { - destributeNodeInto(child, content); - } - } - return; - } - for (var child = node.firstChild; child; child = child.nextSibling) { - this.poolDistribution(child, pool); - } - }, - buildRenderTree: function(renderNode, node) { - var children = this.compose(node); - for (var i = 0; i < children.length; i++) { - var child = children[i]; - var childRenderNode = renderNode.append(child); - this.buildRenderTree(childRenderNode, child); - } - if (isShadowHost(node)) { - var renderer = getRendererForHost(node); - renderer.dirty = false; - } - }, - compose: function(node) { - var children = []; - var p = node.shadowRoot || node; - for (var child = p.firstChild; child; child = child.nextSibling) { - if (isInsertionPoint(child)) { - this.associateNode(p); - var distributedNodes = getDistributedNodes(child); - for (var j = 0; j < distributedNodes.length; j++) { - var distributedNode = distributedNodes[j]; - if (isFinalDestination(child, distributedNode)) children.push(distributedNode); - } - } else { - children.push(child); - } - } - return children; - }, - invalidateAttributes: function() { - this.attributes = Object.create(null); - }, - updateDependentAttributes: function(selector) { - if (!selector) return; - var attributes = this.attributes; - if (/\.\w+/.test(selector)) attributes["class"] = true; - if (/#\w+/.test(selector)) attributes["id"] = true; - selector.replace(/\[\s*([^\s=\|~\]]+)/g, function(_, name) { - attributes[name] = true; - }); - }, - dependsOnAttribute: function(name) { - return this.attributes[name]; - }, - associateNode: function(node) { - unsafeUnwrap(node).polymerShadowRenderer_ = this; - } - }; - function poolPopulation(node) { - var pool = []; - for (var child = node.firstChild; child; child = child.nextSibling) { - if (isInsertionPoint(child)) { - pool.push.apply(pool, getDistributedNodes(child)); - } else { - pool.push(child); - } - } - return pool; - } - function getShadowInsertionPoint(node) { - if (node instanceof HTMLShadowElement) return node; - if (node instanceof HTMLContentElement) return null; - for (var child = node.firstChild; child; child = child.nextSibling) { - var res = getShadowInsertionPoint(child); - if (res) return res; - } - return null; - } - function destributeNodeInto(child, insertionPoint) { - getDistributedNodes(insertionPoint).push(child); - var points = destinationInsertionPointsTable.get(child); - if (!points) destinationInsertionPointsTable.set(child, [ insertionPoint ]); else points.push(insertionPoint); - } - function getDestinationInsertionPoints(node) { - return destinationInsertionPointsTable.get(node); - } - function resetDestinationInsertionPoints(node) { - destinationInsertionPointsTable.set(node, undefined); - } - var selectorStartCharRe = /^(:not\()?[*.#[a-zA-Z_|]/; - function matches(node, contentElement) { - var select = contentElement.getAttribute("select"); - if (!select) return true; - select = select.trim(); - if (!select) return true; - if (!(node instanceof Element)) return false; - if (!selectorStartCharRe.test(select)) return false; - try { - return node.matches(select); - } catch (ex) { - return false; - } - } - function isFinalDestination(insertionPoint, node) { - var points = getDestinationInsertionPoints(node); - return points && points[points.length - 1] === insertionPoint; - } - function isInsertionPoint(node) { - return node instanceof HTMLContentElement || node instanceof HTMLShadowElement; - } - function isShadowHost(shadowHost) { - return shadowHost.shadowRoot; - } - function getShadowTrees(host) { - var trees = []; - for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) { - trees.push(tree); - } - return trees; - } - function render(host) { - new ShadowRenderer(host).render(); - } - Node.prototype.invalidateShadowRenderer = function(force) { - var renderer = unsafeUnwrap(this).polymerShadowRenderer_; - if (renderer) { - renderer.invalidate(); - return true; - } - return false; - }; - HTMLContentElement.prototype.getDistributedNodes = HTMLShadowElement.prototype.getDistributedNodes = function() { - renderAllPending(); - return getDistributedNodes(this); - }; - Element.prototype.getDestinationInsertionPoints = function() { - renderAllPending(); - return getDestinationInsertionPoints(this) || []; - }; - HTMLContentElement.prototype.nodeIsInserted_ = HTMLShadowElement.prototype.nodeIsInserted_ = function() { - this.invalidateShadowRenderer(); - var shadowRoot = getShadowRootAncestor(this); - var renderer; - if (shadowRoot) renderer = getRendererForShadowRoot(shadowRoot); - unsafeUnwrap(this).polymerShadowRenderer_ = renderer; - if (renderer) renderer.invalidate(); - }; - scope.getRendererForHost = getRendererForHost; - scope.getShadowTrees = getShadowTrees; - scope.renderAllPending = renderAllPending; - scope.getDestinationInsertionPoints = getDestinationInsertionPoints; - scope.visual = { - insertBefore: insertBefore, - remove: remove - }; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var assert = scope.assert; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var elementsWithFormProperty = [ "HTMLButtonElement", "HTMLFieldSetElement", "HTMLInputElement", "HTMLKeygenElement", "HTMLLabelElement", "HTMLLegendElement", "HTMLObjectElement", "HTMLOutputElement", "HTMLTextAreaElement" ]; - function createWrapperConstructor(name) { - if (!window[name]) return; - assert(!scope.wrappers[name]); - var GeneratedWrapper = function(node) { - HTMLElement.call(this, node); - }; - GeneratedWrapper.prototype = Object.create(HTMLElement.prototype); - mixin(GeneratedWrapper.prototype, { - get form() { - return wrap(unwrap(this).form); - } - }); - registerWrapper(window[name], GeneratedWrapper, document.createElement(name.slice(4, -7))); - scope.wrappers[name] = GeneratedWrapper; - } - elementsWithFormProperty.forEach(createWrapperConstructor); -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var OriginalSelection = window.Selection; - function Selection(impl) { - setWrapper(impl, this); - } - Selection.prototype = { - get anchorNode() { - return wrap(unsafeUnwrap(this).anchorNode); - }, - get focusNode() { - return wrap(unsafeUnwrap(this).focusNode); - }, - addRange: function(range) { - unsafeUnwrap(this).addRange(unwrapIfNeeded(range)); - }, - collapse: function(node, index) { - unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index); - }, - containsNode: function(node, allowPartial) { - return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial); - }, - getRangeAt: function(index) { - return wrap(unsafeUnwrap(this).getRangeAt(index)); - }, - removeRange: function(range) { - unsafeUnwrap(this).removeRange(unwrap(range)); - }, - selectAllChildren: function(node) { - unsafeUnwrap(this).selectAllChildren(node instanceof ShadowRoot ? unsafeUnwrap(node.host) : unwrapIfNeeded(node)); - }, - toString: function() { - return unsafeUnwrap(this).toString(); - } - }; - if (OriginalSelection.prototype.extend) { - Selection.prototype.extend = function(node, offset) { - unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset); - }; - } - registerWrapper(window.Selection, Selection, window.getSelection()); - scope.wrappers.Selection = Selection; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var OriginalTreeWalker = window.TreeWalker; - function TreeWalker(impl) { - setWrapper(impl, this); - } - TreeWalker.prototype = { - get root() { - return wrap(unsafeUnwrap(this).root); - }, - get currentNode() { - return wrap(unsafeUnwrap(this).currentNode); - }, - set currentNode(node) { - unsafeUnwrap(this).currentNode = unwrapIfNeeded(node); - }, - get filter() { - return unsafeUnwrap(this).filter; - }, - parentNode: function() { - return wrap(unsafeUnwrap(this).parentNode()); - }, - firstChild: function() { - return wrap(unsafeUnwrap(this).firstChild()); - }, - lastChild: function() { - return wrap(unsafeUnwrap(this).lastChild()); - }, - previousSibling: function() { - return wrap(unsafeUnwrap(this).previousSibling()); - }, - previousNode: function() { - return wrap(unsafeUnwrap(this).previousNode()); - }, - nextNode: function() { - return wrap(unsafeUnwrap(this).nextNode()); - } - }; - registerWrapper(OriginalTreeWalker, TreeWalker); - scope.wrappers.TreeWalker = TreeWalker; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var GetElementsByInterface = scope.GetElementsByInterface; - var Node = scope.wrappers.Node; - var ParentNodeInterface = scope.ParentNodeInterface; - var NonElementParentNodeInterface = scope.NonElementParentNodeInterface; - var Selection = scope.wrappers.Selection; - var SelectorsInterface = scope.SelectorsInterface; - var ShadowRoot = scope.wrappers.ShadowRoot; - var TreeScope = scope.TreeScope; - var cloneNode = scope.cloneNode; - var defineGetter = scope.defineGetter; - var defineWrapGetter = scope.defineWrapGetter; - var elementFromPoint = scope.elementFromPoint; - var forwardMethodsToWrapper = scope.forwardMethodsToWrapper; - var matchesNames = scope.matchesNames; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var renderAllPending = scope.renderAllPending; - var rewrap = scope.rewrap; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var wrapEventTargetMethods = scope.wrapEventTargetMethods; - var wrapNodeList = scope.wrapNodeList; - var implementationTable = new WeakMap(); - function Document(node) { - Node.call(this, node); - this.treeScope_ = new TreeScope(this, null); - } - Document.prototype = Object.create(Node.prototype); - defineWrapGetter(Document, "documentElement"); - defineWrapGetter(Document, "body"); - defineWrapGetter(Document, "head"); - defineGetter(Document, "activeElement", function() { - var unwrappedActiveElement = unwrap(this).activeElement; - if (!unwrappedActiveElement || !unwrappedActiveElement.nodeType) return null; - var activeElement = wrap(unwrappedActiveElement); - while (!this.contains(activeElement)) { - while (activeElement.parentNode) { - activeElement = activeElement.parentNode; - } - if (activeElement.host) { - activeElement = activeElement.host; - } else { - return null; - } - } - return activeElement; - }); - function wrapMethod(name) { - var original = document[name]; - Document.prototype[name] = function() { - return wrap(original.apply(unsafeUnwrap(this), arguments)); - }; - } - [ "createComment", "createDocumentFragment", "createElement", "createElementNS", "createEvent", "createEventNS", "createRange", "createTextNode" ].forEach(wrapMethod); - var originalAdoptNode = document.adoptNode; - function adoptNodeNoRemove(node, doc) { - originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node)); - adoptSubtree(node, doc); - } - function adoptSubtree(node, doc) { - if (node.shadowRoot) doc.adoptNode(node.shadowRoot); - if (node instanceof ShadowRoot) adoptOlderShadowRoots(node, doc); - for (var child = node.firstChild; child; child = child.nextSibling) { - adoptSubtree(child, doc); - } - } - function adoptOlderShadowRoots(shadowRoot, doc) { - var oldShadowRoot = shadowRoot.olderShadowRoot; - if (oldShadowRoot) doc.adoptNode(oldShadowRoot); - } - var originalGetSelection = document.getSelection; - mixin(Document.prototype, { - adoptNode: function(node) { - if (node.parentNode) node.parentNode.removeChild(node); - adoptNodeNoRemove(node, this); - return node; - }, - elementFromPoint: function(x, y) { - return elementFromPoint(this, this, x, y); - }, - importNode: function(node, deep) { - return cloneNode(node, deep, unsafeUnwrap(this)); - }, - getSelection: function() { - renderAllPending(); - return new Selection(originalGetSelection.call(unwrap(this))); - }, - getElementsByName: function(name) { - return SelectorsInterface.querySelectorAll.call(this, "[name=" + JSON.stringify(String(name)) + "]"); - } - }); - var originalCreateTreeWalker = document.createTreeWalker; - var TreeWalkerWrapper = scope.wrappers.TreeWalker; - Document.prototype.createTreeWalker = function(root, whatToShow, filter, expandEntityReferences) { - var newFilter = null; - if (filter) { - if (filter.acceptNode && typeof filter.acceptNode === "function") { - newFilter = { - acceptNode: function(node) { - return filter.acceptNode(wrap(node)); - } - }; - } else if (typeof filter === "function") { - newFilter = function(node) { - return filter(wrap(node)); - }; - } - } - return new TreeWalkerWrapper(originalCreateTreeWalker.call(unwrap(this), unwrap(root), whatToShow, newFilter, expandEntityReferences)); - }; - if (document.registerElement) { - var originalRegisterElement = document.registerElement; - Document.prototype.registerElement = function(tagName, object) { - var prototype, extendsOption; - if (object !== undefined) { - prototype = object.prototype; - extendsOption = object.extends; - } - if (!prototype) prototype = Object.create(HTMLElement.prototype); - if (scope.nativePrototypeTable.get(prototype)) { - throw new Error("NotSupportedError"); - } - var proto = Object.getPrototypeOf(prototype); - var nativePrototype; - var prototypes = []; - while (proto) { - nativePrototype = scope.nativePrototypeTable.get(proto); - if (nativePrototype) break; - prototypes.push(proto); - proto = Object.getPrototypeOf(proto); - } - if (!nativePrototype) { - throw new Error("NotSupportedError"); - } - var newPrototype = Object.create(nativePrototype); - for (var i = prototypes.length - 1; i >= 0; i--) { - newPrototype = Object.create(newPrototype); - } - [ "createdCallback", "attachedCallback", "detachedCallback", "attributeChangedCallback" ].forEach(function(name) { - var f = prototype[name]; - if (!f) return; - newPrototype[name] = function() { - if (!(wrap(this) instanceof CustomElementConstructor)) { - rewrap(this); - } - f.apply(wrap(this), arguments); - }; - }); - var p = { - prototype: newPrototype - }; - if (extendsOption) p.extends = extendsOption; - function CustomElementConstructor(node) { - if (!node) { - if (extendsOption) { - return document.createElement(extendsOption, tagName); - } else { - return document.createElement(tagName); - } - } - setWrapper(node, this); - } - CustomElementConstructor.prototype = prototype; - CustomElementConstructor.prototype.constructor = CustomElementConstructor; - scope.constructorTable.set(newPrototype, CustomElementConstructor); - scope.nativePrototypeTable.set(prototype, newPrototype); - var nativeConstructor = originalRegisterElement.call(unwrap(this), tagName, p); - return CustomElementConstructor; - }; - forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ "registerElement" ]); - } - forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement, window.HTMLHtmlElement ], [ "appendChild", "compareDocumentPosition", "contains", "getElementsByClassName", "getElementsByTagName", "getElementsByTagNameNS", "insertBefore", "querySelector", "querySelectorAll", "removeChild", "replaceChild" ]); - forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLHeadElement, window.HTMLHtmlElement ], matchesNames); - forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ "adoptNode", "importNode", "contains", "createComment", "createDocumentFragment", "createElement", "createElementNS", "createEvent", "createEventNS", "createRange", "createTextNode", "createTreeWalker", "elementFromPoint", "getElementById", "getElementsByName", "getSelection" ]); - mixin(Document.prototype, GetElementsByInterface); - mixin(Document.prototype, ParentNodeInterface); - mixin(Document.prototype, SelectorsInterface); - mixin(Document.prototype, NonElementParentNodeInterface); - mixin(Document.prototype, { - get implementation() { - var implementation = implementationTable.get(this); - if (implementation) return implementation; - implementation = new DOMImplementation(unwrap(this).implementation); - implementationTable.set(this, implementation); - return implementation; - }, - get defaultView() { - return wrap(unwrap(this).defaultView); - } - }); - registerWrapper(window.Document, Document, document.implementation.createHTMLDocument("")); - if (window.HTMLDocument) registerWrapper(window.HTMLDocument, Document); - wrapEventTargetMethods([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement ]); - function DOMImplementation(impl) { - setWrapper(impl, this); - } - var originalCreateDocument = document.implementation.createDocument; - DOMImplementation.prototype.createDocument = function() { - arguments[2] = unwrap(arguments[2]); - return wrap(originalCreateDocument.apply(unsafeUnwrap(this), arguments)); - }; - function wrapImplMethod(constructor, name) { - var original = document.implementation[name]; - constructor.prototype[name] = function() { - return wrap(original.apply(unsafeUnwrap(this), arguments)); - }; - } - function forwardImplMethod(constructor, name) { - var original = document.implementation[name]; - constructor.prototype[name] = function() { - return original.apply(unsafeUnwrap(this), arguments); - }; - } - wrapImplMethod(DOMImplementation, "createDocumentType"); - wrapImplMethod(DOMImplementation, "createHTMLDocument"); - forwardImplMethod(DOMImplementation, "hasFeature"); - registerWrapper(window.DOMImplementation, DOMImplementation); - forwardMethodsToWrapper([ window.DOMImplementation ], [ "createDocument", "createDocumentType", "createHTMLDocument", "hasFeature" ]); - scope.adoptNodeNoRemove = adoptNodeNoRemove; - scope.wrappers.DOMImplementation = DOMImplementation; - scope.wrappers.Document = Document; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var EventTarget = scope.wrappers.EventTarget; - var Selection = scope.wrappers.Selection; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var renderAllPending = scope.renderAllPending; - var unwrap = scope.unwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var OriginalWindow = window.Window; - var originalGetComputedStyle = window.getComputedStyle; - var originalGetDefaultComputedStyle = window.getDefaultComputedStyle; - var originalGetSelection = window.getSelection; - function Window(impl) { - EventTarget.call(this, impl); - } - Window.prototype = Object.create(EventTarget.prototype); - OriginalWindow.prototype.getComputedStyle = function(el, pseudo) { - return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo); - }; - if (originalGetDefaultComputedStyle) { - OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) { - return wrap(this || window).getDefaultComputedStyle(unwrapIfNeeded(el), pseudo); - }; - } - OriginalWindow.prototype.getSelection = function() { - return wrap(this || window).getSelection(); - }; - delete window.getComputedStyle; - delete window.getDefaultComputedStyle; - delete window.getSelection; - [ "addEventListener", "removeEventListener", "dispatchEvent" ].forEach(function(name) { - OriginalWindow.prototype[name] = function() { - var w = wrap(this || window); - return w[name].apply(w, arguments); - }; - delete window[name]; - }); - mixin(Window.prototype, { - getComputedStyle: function(el, pseudo) { - renderAllPending(); - return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo); - }, - getSelection: function() { - renderAllPending(); - return new Selection(originalGetSelection.call(unwrap(this))); - }, - get document() { - return wrap(unwrap(this).document); - } - }); - if (originalGetDefaultComputedStyle) { - Window.prototype.getDefaultComputedStyle = function(el, pseudo) { - renderAllPending(); - return originalGetDefaultComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo); - }; - } - registerWrapper(OriginalWindow, Window, window); - scope.wrappers.Window = Window; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var unwrap = scope.unwrap; - var OriginalDataTransfer = window.DataTransfer || window.Clipboard; - var OriginalDataTransferSetDragImage = OriginalDataTransfer.prototype.setDragImage; - if (OriginalDataTransferSetDragImage) { - OriginalDataTransfer.prototype.setDragImage = function(image, x, y) { - OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y); - }; - } -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unwrap = scope.unwrap; - var OriginalFormData = window.FormData; - if (!OriginalFormData) return; - function FormData(formElement) { - var impl; - if (formElement instanceof OriginalFormData) { - impl = formElement; - } else { - impl = new OriginalFormData(formElement && unwrap(formElement)); - } - setWrapper(impl, this); - } - registerWrapper(OriginalFormData, FormData, new OriginalFormData()); - scope.wrappers.FormData = FormData; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var originalSend = XMLHttpRequest.prototype.send; - XMLHttpRequest.prototype.send = function(obj) { - return originalSend.call(this, unwrapIfNeeded(obj)); - }; -})(window.ShadowDOMPolyfill); - -(function(scope) { - "use strict"; - var isWrapperFor = scope.isWrapperFor; - var elements = { - a: "HTMLAnchorElement", - area: "HTMLAreaElement", - audio: "HTMLAudioElement", - base: "HTMLBaseElement", - body: "HTMLBodyElement", - br: "HTMLBRElement", - button: "HTMLButtonElement", - canvas: "HTMLCanvasElement", - caption: "HTMLTableCaptionElement", - col: "HTMLTableColElement", - content: "HTMLContentElement", - data: "HTMLDataElement", - datalist: "HTMLDataListElement", - del: "HTMLModElement", - dir: "HTMLDirectoryElement", - div: "HTMLDivElement", - dl: "HTMLDListElement", - embed: "HTMLEmbedElement", - fieldset: "HTMLFieldSetElement", - font: "HTMLFontElement", - form: "HTMLFormElement", - frame: "HTMLFrameElement", - frameset: "HTMLFrameSetElement", - h1: "HTMLHeadingElement", - head: "HTMLHeadElement", - hr: "HTMLHRElement", - html: "HTMLHtmlElement", - iframe: "HTMLIFrameElement", - img: "HTMLImageElement", - input: "HTMLInputElement", - keygen: "HTMLKeygenElement", - label: "HTMLLabelElement", - legend: "HTMLLegendElement", - li: "HTMLLIElement", - link: "HTMLLinkElement", - map: "HTMLMapElement", - marquee: "HTMLMarqueeElement", - menu: "HTMLMenuElement", - menuitem: "HTMLMenuItemElement", - meta: "HTMLMetaElement", - meter: "HTMLMeterElement", - object: "HTMLObjectElement", - ol: "HTMLOListElement", - optgroup: "HTMLOptGroupElement", - option: "HTMLOptionElement", - output: "HTMLOutputElement", - p: "HTMLParagraphElement", - param: "HTMLParamElement", - pre: "HTMLPreElement", - progress: "HTMLProgressElement", - q: "HTMLQuoteElement", - script: "HTMLScriptElement", - select: "HTMLSelectElement", - shadow: "HTMLShadowElement", - source: "HTMLSourceElement", - span: "HTMLSpanElement", - style: "HTMLStyleElement", - table: "HTMLTableElement", - tbody: "HTMLTableSectionElement", - template: "HTMLTemplateElement", - textarea: "HTMLTextAreaElement", - thead: "HTMLTableSectionElement", - time: "HTMLTimeElement", - title: "HTMLTitleElement", - tr: "HTMLTableRowElement", - track: "HTMLTrackElement", - ul: "HTMLUListElement", - video: "HTMLVideoElement" - }; - function overrideConstructor(tagName) { - var nativeConstructorName = elements[tagName]; - var nativeConstructor = window[nativeConstructorName]; - if (!nativeConstructor) return; - var element = document.createElement(tagName); - var wrapperConstructor = element.constructor; - window[nativeConstructorName] = wrapperConstructor; - } - Object.keys(elements).forEach(overrideConstructor); - Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) { - window[name] = scope.wrappers[name]; - }); -})(window.ShadowDOMPolyfill); \ No newline at end of file diff --git a/dashboard-ui/bower_components/webcomponentsjs/ShadowDOM.min.js b/dashboard-ui/bower_components/webcomponentsjs/ShadowDOM.min.js deleted file mode 100644 index 3303840cf0..0000000000 --- a/dashboard-ui/bower_components/webcomponentsjs/ShadowDOM.min.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @license - * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. - * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - * Code distributed by Google as part of the polymer project is also - * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt - */ -// @version 0.7.22 -"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=k(t),r=0;ru;u++)c[u]=new Array(s),c[u][0]=u;for(var l=0;s>l;l++)c[0][l]=l;for(var u=1;a>u;u++)for(var l=1;s>l;l++)if(this.equals(e[t+l-1],r[o+u-1]))c[u][l]=c[u-1][l-1];else{var p=c[u-1][l]+1,d=c[u][l-1]+1;c[u][l]=d>p?p:d}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var u,l=e[t-1][n-1],p=e[t-1][n],d=e[t][n-1];u=d>p?l>p?p:l:l>d?d:l,u==l?(l==s?c.push(r):(c.push(o),s=l),t--,n--):u==p?(c.push(a),t--,s=p):(c.push(i),n--,s=d)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,u,l){var p=0,d=0,f=Math.min(s-n,l-u);if(0==n&&0==u&&(p=this.sharedPrefix(e,c,f)),s==e.length&&l==c.length&&(d=this.sharedSuffix(e,c,f-p)),n+=p,u+=p,s-=d,l-=d,s-n==0&&l-u==0)return[];if(n==s){for(var h=t(n,[],0);l>u;)h.removed.push(c[u++]);return[h]}if(u==l)return[t(n,[],s-n)];for(var w=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,u,l)),h=void 0,m=[],v=n,g=u,b=0;br;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;n>i&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t0){for(var l=0;l0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function l(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=A(t),a=A(n),s=r(n,e),o=u(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var l=0;l0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function m(e,t,n,r){var o=ie,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=ae,i=1;i0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===oe)return!0;n===ae&&(n=ie)}else if(n===ae&&!t.bubbles)return!0;if("relatedTarget"in t){var c=q(t),u=c.relatedTarget;if(u){if(u instanceof Object&&u.addEventListener){var p=V(u),d=l(t,e,p);if(d===a)return!0}else d=null;Z.set(t,d)}}J.set(t,n);var f=t.type,h=!1;Y.set(t,a),$.set(t,e),i.depth++;for(var w=0,m=i.length;m>w;w++){var v=i[w];if(v.removed)h=!0;else if(!(v.type!==f||!v.capture&&n===oe||v.capture&&n===ae))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),ee.get(t))return!1}catch(g){W||(W=g)}}if(i.depth--,h&&0===i.depth){var b=i.slice();i.length=0;for(var w=0;wr;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){N(e instanceof S)}function n(e){var t=new T;return t[0]=e,t.length=1,t}function r(e,t,n){L(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){L(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);B=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;B=!1;for(var a=0;ao;o++)r.appendChild(W(t[o]));return r}function m(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){N(t.parentNode===e);var n=t.nextSibling,r=W(t),o=r.parentNode;o&&Y.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=W(e),a=i.firstChild;a;)n=a.nextSibling,Y.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;ns;s++)i=b(t[s]),!o&&(a=v(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\/|::shadow|>>>/g," ")}function r(e){return String(e).replace(/:host\(([^\s]+)\)/g,"$1").replace(/([^\s]):host/g,"$1").replace(":host","*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g," ")}function o(e,t){for(var n,r=e.firstElementChild;r;){if(r.matches(t))return r;if(n=o(r,t))return n;r=r.nextElementSibling}return null}function i(e,t){return e.matches(t)}function a(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===D}function s(){return!0}function c(e,t,n){return e.localName===n}function u(e,t){return e.namespaceURI===t}function l(e,t,n){return e.namespaceURI===t&&e.localName===n}function p(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=p(a,t,n,r,o,i),a=a.nextElementSibling;return t}function d(n,r,o,i,a){var s,c=g(this),u=v(this).root;if(u instanceof e.wrappers.ShadowRoot)return p(this,r,o,n,i,null);if(c instanceof L)s=M.call(c,i);else{if(!(c instanceof _))return p(this,r,o,n,i,null);s=S.call(c,i)}return t(s,r,o,a)}function f(n,r,o,i,a){var s,c=g(this),u=v(this).root;if(u instanceof e.wrappers.ShadowRoot)return p(this,r,o,n,i,a);if(c instanceof L)s=O.call(c,i,a);else{if(!(c instanceof _))return p(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function h(n,r,o,i,a){var s,c=g(this),u=v(this).root;if(u instanceof e.wrappers.ShadowRoot)return p(this,r,o,n,i,a);if(c instanceof L)s=j.call(c,i,a);else{if(!(c instanceof _))return p(this,r,o,n,i,a);s=N.call(c,i,a)}return t(s,r,o,!1)}var w=e.wrappers.HTMLCollection,m=e.wrappers.NodeList,v=e.getTreeScope,g=e.unsafeUnwrap,b=e.wrap,y=document.querySelector,E=document.documentElement.querySelector,S=document.querySelectorAll,M=document.documentElement.querySelectorAll,T=document.getElementsByTagName,O=document.documentElement.getElementsByTagName,N=document.getElementsByTagNameNS,j=document.documentElement.getElementsByTagNameNS,L=window.Element,_=window.HTMLDocument||window.Document,D="http://www.w3.org/1999/xhtml",C={querySelector:function(t){var r=n(t),i=r!==t;t=r;var a,s=g(this),c=v(this).root;if(c instanceof e.wrappers.ShadowRoot)return o(this,t);if(s instanceof L)a=b(E.call(s,t));else{if(!(s instanceof _))return o(this,t);a=b(y.call(s,t))}return a&&!i&&(c=v(a).root)&&c instanceof e.wrappers.ShadowRoot?o(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var o=new m;return o.length=d.call(this,i,0,o,e,r),o}},H={matches:function(t){return t=r(t),e.originalMatches.call(g(this),t)}},x={getElementsByTagName:function(e){var t=new w,n="*"===e?s:a;return t.length=f.call(this,n,0,t,e,e.toLowerCase()), -t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new w,r=null;return r="*"===e?"*"===t?s:c:"*"===t?u:l,n.length=h.call(this,r,0,n,e||null,t),n}};e.GetElementsByInterface=x,e.SelectorsInterface=C,e.MatchesInterface=H}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}},a={getElementById:function(e){return/[ \t\n\r\f]/.test(e)?null:this.querySelector('[id="'+e+'"]')}};e.ChildNodeInterface=i,e.NonElementParentNodeInterface=a,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get nodeValue(){return this.data},set nodeValue(e){this.data=e},get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return i(e).getAttribute("class")}function n(e,t){a(e,"attributes",{name:"class",namespace:null,oldValue:t})}function r(t){e.invalidateRendererBasedOnAttribute(t,"class")}function o(e,o,i){var a=e.ownerElement_;if(null==a)return o.apply(e,i);var s=t(a),c=o.apply(e,i);return t(a)!==s&&(n(a,s),r(a)),c}if(!window.DOMTokenList)return void console.warn("Missing DOMTokenList prototype, please include a compatible classList polyfill such as http://goo.gl/uTcepH.");var i=e.unsafeUnwrap,a=e.enqueueMutation,s=DOMTokenList.prototype.add;DOMTokenList.prototype.add=function(){o(this,s,arguments)};var c=DOMTokenList.prototype.remove;DOMTokenList.prototype.remove=function(){o(this,c,arguments)};var u=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(){return o(this,u,arguments)}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){l(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.ParentNodeInterface,c=e.SelectorsInterface,u=e.MatchesInterface,l=(e.addWrapNodeListMethod,e.enqueueMutation),p=e.mixin,d=(e.oneOf,e.registerWrapper),f=e.unsafeUnwrap,h=e.wrappers,w=window.Element,m=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return w.prototype[e]}),v=m[0],g=w.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),p(r.prototype,{createShadowRoot:function(){var t=new h.ShadowRoot(this);f(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return f(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=f(this).getAttribute(e);f(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=f(this).getAttribute(e);f(this).removeAttribute(e),n(this,e,r),t(this,e)},get classList(){var e=b.get(this);if(!e){if(e=f(this).classList,!e)return;e.ownerElement_=this,b.set(this,e)}return e},get className(){return f(this).className},set className(e){this.setAttribute("class",e)},get id(){return f(this).id},set id(e){this.setAttribute("id",e)}}),m.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),w.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),p(r.prototype,o),p(r.prototype,i),p(r.prototype,s),p(r.prototype,c),p(r.prototype,u),d(w,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=m,e.originalMatches=g,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&";case"<":return"<";case">":return">";case'"':return""";case" ":return" "}}function n(e){return e.replace(j,t)}function r(e){return e.replace(L,t)}function o(e){for(var t={},n=0;n"):c+">"+s(e)+"";case Node.TEXT_NODE:var p=e.data;return t&&D[t.localName]?p:r(p);case Node.COMMENT_NODE:return"";default:throw console.error(e),new Error("not implemented")}}function s(e){e instanceof N.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=a(n,e);return t}function c(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(O(i))}function u(e){w.call(this,e)}function l(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return O(o)}function p(t){return function(){return e.renderAllPending(),M(this)[t]}}function d(e){m(u,e,p(e))}function f(t){Object.defineProperty(u.prototype,t,{get:p(t),set:function(n){e.renderAllPending(),M(this)[t]=n},configurable:!0,enumerable:!0})}function h(t){Object.defineProperty(u.prototype,t,{value:function(){return e.renderAllPending(),M(this)[t].apply(M(this),arguments)},configurable:!0,enumerable:!0})}var w=e.wrappers.Element,m=e.defineGetter,v=e.enqueueMutation,g=e.mixin,b=e.nodesWereAdded,y=e.nodesWereRemoved,E=e.registerWrapper,S=e.snapshotNodeList,M=e.unsafeUnwrap,T=e.unwrap,O=e.wrap,N=e.wrappers,j=/[&\u00A0"]/g,L=/[&\u00A0<>]/g,_=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),D=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),C="http://www.w3.org/1999/xhtml",H=/MSIE/.test(navigator.userAgent),x=window.HTMLElement,R=window.HTMLTemplateElement;u.prototype=Object.create(w.prototype),g(u.prototype,{get innerHTML(){return s(this)},set innerHTML(e){if(H&&D[this.localName])return void(this.textContent=e);var t=S(this.childNodes);this.invalidateShadowRenderer()?this instanceof N.HTMLTemplateElement?c(this.content,e):c(this,e,this.tagName):!R&&this instanceof N.HTMLTemplateElement?c(this.content,e):M(this).innerHTML=e;var n=S(this.childNodes);v(this,"childList",{addedNodes:n,removedNodes:t}),y(t),b(n,this)},get outerHTML(){return a(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=l(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=l(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(d),["scrollLeft","scrollTop"].forEach(f),["focus","getBoundingClientRect","getClientRects","scrollIntoView"].forEach(h),E(x,u,document.createElement("b")),e.wrappers.HTMLElement=u,e.getInnerHTML=s,e.setInnerHTML=c}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=p.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);p.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!d){var t=n(e);l.set(this,u(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,u=e.wrap,l=new WeakMap,p=new WeakMap,d=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return d?u(s(this).content):l.get(this)}}),d&&a(d,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,u=e.wrap,l=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return u(c(this).form)}}),a(l,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Element,r=e.wrappers.HTMLElement,o=e.registerWrapper,i=(e.defineWrapGetter,e.unsafeUnwrap),a=e.wrap,s=e.mixin,c="http://www.w3.org/2000/svg",u=window.SVGElement,l=document.createElementNS(c,"title");if(!("classList"in l)){var p=Object.getOwnPropertyDescriptor(n.prototype,"classList");Object.defineProperty(r.prototype,"classList",p),delete n.prototype.classList}t.prototype=Object.create(n.prototype),s(t.prototype,{get ownerSVGElement(){return a(i(this).ownerSVGElement)}}),o(u,t,document.createElementNS(c,"title")),e.wrappers.SVGElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){d.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),u=document.createElementNS(s,"use"),l=c.constructor,p=Object.getPrototypeOf(l.prototype),d=p.constructor;t.prototype=Object.create(p),"instanceRoot"in u&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,u),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,u=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(u,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){i(e,this)}var n=e.addForwardingProperties,r=e.mixin,o=e.registerWrapper,i=e.setWrapper,a=e.unsafeUnwrap,s=e.unwrapIfNeeded,c=e.wrap,u=window.WebGLRenderingContext;if(u){r(t.prototype,{get canvas(){return c(a(this).canvas)},texImage2D:function(){arguments[5]=s(arguments[5]),a(this).texImage2D.apply(a(this),arguments)},texSubImage2D:function(){arguments[6]=s(arguments[6]),a(this).texSubImage2D.apply(a(this),arguments)}});var l=Object.getPrototypeOf(u.prototype);l!==Object.prototype&&n(l,t.prototype);var p=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};o(u,t,p),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Node,r=e.GetElementsByInterface,o=e.NonElementParentNodeInterface,i=e.ParentNodeInterface,a=e.SelectorsInterface,s=e.mixin,c=e.registerObject,u=e.registerWrapper,l=window.DocumentFragment;t.prototype=Object.create(n.prototype),s(t.prototype,i),s(t.prototype,a),s(t.prototype,r),s(t.prototype,o),u(l,t,document.createDocumentFragment()),e.wrappers.DocumentFragment=t;var p=c(document.createComment(""));e.wrappers.Comment=p}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=p(l(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;h.set(this,o),this.treeScope_=new r(this,a(o||e)),f.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,u=e.setInnerHTML,l=e.unsafeUnwrap,p=e.unwrap,d=e.wrap,f=new WeakMap,h=new WeakMap;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){u(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return h.get(this)||null},get host(){return f.get(this)||null},invalidateShadowRenderer:function(){return f.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getSelection:function(){return document.getSelection()},get activeElement(){var e=p(this).ownerDocument.activeElement;if(!e||!e.nodeType)return null;for(var t=d(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=p(e).root;return t instanceof f?t.host:null}function n(t,n){if(t.shadowRoot){n=Math.min(t.childNodes.length-1,n);var r=t.childNodes[n];if(r){var o=e.getDestinationInsertionPoints(r);if(o.length>0){var i=o[0].parentNode;i.nodeType==Node.ELEMENT_NODE&&(t=i)}}}return t}function r(e){return e=l(e),t(e)||e}function o(e){a(e,this)}var i=e.registerWrapper,a=e.setWrapper,s=e.unsafeUnwrap,c=e.unwrap,u=e.unwrapIfNeeded,l=e.wrap,p=e.getTreeScope,d=window.Range,f=e.wrappers.ShadowRoot;o.prototype={get startContainer(){return r(s(this).startContainer)},get endContainer(){return r(s(this).endContainer)},get commonAncestorContainer(){return r(s(this).commonAncestorContainer)},setStart:function(e,t){e=n(e,t),s(this).setStart(u(e),t)},setEnd:function(e,t){e=n(e,t),s(this).setEnd(u(e),t)},setStartBefore:function(e){s(this).setStartBefore(u(e))},setStartAfter:function(e){s(this).setStartAfter(u(e))},setEndBefore:function(e){s(this).setEndBefore(u(e))},setEndAfter:function(e){s(this).setEndAfter(u(e))},selectNode:function(e){s(this).selectNode(u(e))},selectNodeContents:function(e){s(this).selectNodeContents(u(e))},compareBoundaryPoints:function(e,t){return s(this).compareBoundaryPoints(e,c(t))},extractContents:function(){return l(s(this).extractContents())},cloneContents:function(){return l(s(this).cloneContents())},insertNode:function(e){s(this).insertNode(u(e))},surroundContents:function(e){s(this).surroundContents(u(e))},cloneRange:function(){return l(s(this).cloneRange())},isPointInRange:function(e,t){return s(this).isPointInRange(u(e),t)},comparePoint:function(e,t){return s(this).comparePoint(u(e),t)},intersectsNode:function(e){return s(this).intersectsNode(u(e))},toString:function(){return s(this).toString()}},d.prototype.createContextualFragment&&(o.prototype.createContextualFragment=function(e){return l(s(this).createContextualFragment(e))}),i(window.Range,o,document.createRange()),e.wrappers.Range=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var u=R(a.lastChild);u&&(u.nextSibling_=u.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){W.set(e,[])}function i(e){var t=W.get(e);return t||W.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;ew;w++){var m=R(i[l++]);s.get(m)||r(m)}for(var v=f.addedCount,g=i[l]&&R(i[l]),w=0;v>w;w++){var b=o[u++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}p+=v}for(var d=p;d=0;o--){var i=r[o],a=w(i);if(a){var s=i.olderShadowRoot;s&&(n=h(s));for(var c=0;c=0;l--)u=Object.create(u);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(u[e]=function(){D(this)instanceof r||N(this),t.apply(D(this),arguments)})});var p={prototype:u};i&&(p["extends"]=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(u,r),e.nativePrototypeTable.set(o,u);I.call(_(this),t,p);return r},E([window.HTMLDocument||window.Document],["registerElement"])}E([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),E([window.HTMLBodyElement,window.HTMLHeadElement,window.HTMLHtmlElement],S),E([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","createTreeWalker","elementFromPoint","getElementById","getElementsByName","getSelection"]),M(t.prototype,u),M(t.prototype,p),M(t.prototype,h),M(t.prototype,d),M(t.prototype,{get implementation(){var e=H.get(this);return e?e:(e=new a(_(this).implementation),H.set(this,e),e)},get defaultView(){return D(_(this).defaultView)}}),T(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&T(window.HTMLDocument,t),C([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]);var A=document.implementation.createDocument;a.prototype.createDocument=function(){return arguments[2]=_(arguments[2]),D(A.apply(L(this),arguments))},s(a,"createDocumentType"),s(a,"createHTMLDocument"),c(a,"hasFeature"),T(window.DOMImplementation,a),E([window.DOMImplementation],["createDocument","createDocumentType","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,u=e.wrap,l=window.Window,p=window.getComputedStyle,d=window.getDefaultComputedStyle,f=window.getSelection;t.prototype=Object.create(n.prototype),l.prototype.getComputedStyle=function(e,t){return u(this||window).getComputedStyle(c(e),t)},d&&(l.prototype.getDefaultComputedStyle=function(e,t){return u(this||window).getDefaultComputedStyle(c(e),t)}),l.prototype.getSelection=function(){return u(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){l.prototype[e]=function(){var t=u(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),p.call(s(this),c(e),t)},getSelection:function(){return a(),new r(f.call(s(this)))},get document(){return u(s(this).document)}}),d&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),d.call(s(this),c(e),t)}),i(l,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill); \ No newline at end of file diff --git a/dashboard-ui/bower_components/webcomponentsjs/webcomponents-lite.js b/dashboard-ui/bower_components/webcomponentsjs/webcomponents-lite.js deleted file mode 100644 index 44059a5b7b..0000000000 --- a/dashboard-ui/bower_components/webcomponentsjs/webcomponents-lite.js +++ /dev/null @@ -1,2505 +0,0 @@ -/** - * @license - * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. - * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - * Code distributed by Google as part of the polymer project is also - * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt - */ -// @version 0.7.22 -(function() { - window.WebComponents = window.WebComponents || { - flags: {} - }; - var file = "webcomponents-lite.js"; - var script = document.querySelector('script[src*="' + file + '"]'); - var flags = {}; - if (!flags.noOpts) { - location.search.slice(1).split("&").forEach(function(option) { - var parts = option.split("="); - var match; - if (parts[0] && (match = parts[0].match(/wc-(.+)/))) { - flags[match[1]] = parts[1] || true; - } - }); - if (script) { - for (var i = 0, a; a = script.attributes[i]; i++) { - if (a.name !== "src") { - flags[a.name] = a.value || true; - } - } - } - if (flags.log && flags.log.split) { - var parts = flags.log.split(","); - flags.log = {}; - parts.forEach(function(f) { - flags.log[f] = true; - }); - } else { - flags.log = {}; - } - } - if (flags.register) { - window.CustomElements = window.CustomElements || { - flags: {} - }; - window.CustomElements.flags.register = flags.register; - } - WebComponents.flags = flags; -})(); - -(function(scope) { - "use strict"; - var hasWorkingUrl = false; - if (!scope.forceJURL) { - try { - var u = new URL("b", "http://a"); - u.pathname = "c%20d"; - hasWorkingUrl = u.href === "http://a/c%20d"; - } catch (e) {} - } - if (hasWorkingUrl) return; - var relative = Object.create(null); - relative["ftp"] = 21; - relative["file"] = 0; - relative["gopher"] = 70; - relative["http"] = 80; - relative["https"] = 443; - relative["ws"] = 80; - relative["wss"] = 443; - var relativePathDotMapping = Object.create(null); - relativePathDotMapping["%2e"] = "."; - relativePathDotMapping[".%2e"] = ".."; - relativePathDotMapping["%2e."] = ".."; - relativePathDotMapping["%2e%2e"] = ".."; - function isRelativeScheme(scheme) { - return relative[scheme] !== undefined; - } - function invalid() { - clear.call(this); - this._isInvalid = true; - } - function IDNAToASCII(h) { - if ("" == h) { - invalid.call(this); - } - return h.toLowerCase(); - } - function percentEscape(c) { - var unicode = c.charCodeAt(0); - if (unicode > 32 && unicode < 127 && [ 34, 35, 60, 62, 63, 96 ].indexOf(unicode) == -1) { - return c; - } - return encodeURIComponent(c); - } - function percentEscapeQuery(c) { - var unicode = c.charCodeAt(0); - if (unicode > 32 && unicode < 127 && [ 34, 35, 60, 62, 96 ].indexOf(unicode) == -1) { - return c; - } - return encodeURIComponent(c); - } - var EOF = undefined, ALPHA = /[a-zA-Z]/, ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; - function parse(input, stateOverride, base) { - function err(message) { - errors.push(message); - } - var state = stateOverride || "scheme start", cursor = 0, buffer = "", seenAt = false, seenBracket = false, errors = []; - loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) { - var c = input[cursor]; - switch (state) { - case "scheme start": - if (c && ALPHA.test(c)) { - buffer += c.toLowerCase(); - state = "scheme"; - } else if (!stateOverride) { - buffer = ""; - state = "no scheme"; - continue; - } else { - err("Invalid scheme."); - break loop; - } - break; - - case "scheme": - if (c && ALPHANUMERIC.test(c)) { - buffer += c.toLowerCase(); - } else if (":" == c) { - this._scheme = buffer; - buffer = ""; - if (stateOverride) { - break loop; - } - if (isRelativeScheme(this._scheme)) { - this._isRelative = true; - } - if ("file" == this._scheme) { - state = "relative"; - } else if (this._isRelative && base && base._scheme == this._scheme) { - state = "relative or authority"; - } else if (this._isRelative) { - state = "authority first slash"; - } else { - state = "scheme data"; - } - } else if (!stateOverride) { - buffer = ""; - cursor = 0; - state = "no scheme"; - continue; - } else if (EOF == c) { - break loop; - } else { - err("Code point not allowed in scheme: " + c); - break loop; - } - break; - - case "scheme data": - if ("?" == c) { - this._query = "?"; - state = "query"; - } else if ("#" == c) { - this._fragment = "#"; - state = "fragment"; - } else { - if (EOF != c && " " != c && "\n" != c && "\r" != c) { - this._schemeData += percentEscape(c); - } - } - break; - - case "no scheme": - if (!base || !isRelativeScheme(base._scheme)) { - err("Missing scheme."); - invalid.call(this); - } else { - state = "relative"; - continue; - } - break; - - case "relative or authority": - if ("/" == c && "/" == input[cursor + 1]) { - state = "authority ignore slashes"; - } else { - err("Expected /, got: " + c); - state = "relative"; - continue; - } - break; - - case "relative": - this._isRelative = true; - if ("file" != this._scheme) this._scheme = base._scheme; - if (EOF == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._username = base._username; - this._password = base._password; - break loop; - } else if ("/" == c || "\\" == c) { - if ("\\" == c) err("\\ is an invalid code point."); - state = "relative slash"; - } else if ("?" == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = "?"; - this._username = base._username; - this._password = base._password; - state = "query"; - } else if ("#" == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._fragment = "#"; - this._username = base._username; - this._password = base._password; - state = "fragment"; - } else { - var nextC = input[cursor + 1]; - var nextNextC = input[cursor + 2]; - if ("file" != this._scheme || !ALPHA.test(c) || nextC != ":" && nextC != "|" || EOF != nextNextC && "/" != nextNextC && "\\" != nextNextC && "?" != nextNextC && "#" != nextNextC) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - this._path = base._path.slice(); - this._path.pop(); - } - state = "relative path"; - continue; - } - break; - - case "relative slash": - if ("/" == c || "\\" == c) { - if ("\\" == c) { - err("\\ is an invalid code point."); - } - if ("file" == this._scheme) { - state = "file host"; - } else { - state = "authority ignore slashes"; - } - } else { - if ("file" != this._scheme) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - } - state = "relative path"; - continue; - } - break; - - case "authority first slash": - if ("/" == c) { - state = "authority second slash"; - } else { - err("Expected '/', got: " + c); - state = "authority ignore slashes"; - continue; - } - break; - - case "authority second slash": - state = "authority ignore slashes"; - if ("/" != c) { - err("Expected '/', got: " + c); - continue; - } - break; - - case "authority ignore slashes": - if ("/" != c && "\\" != c) { - state = "authority"; - continue; - } else { - err("Expected authority, got: " + c); - } - break; - - case "authority": - if ("@" == c) { - if (seenAt) { - err("@ already seen."); - buffer += "%40"; - } - seenAt = true; - for (var i = 0; i < buffer.length; i++) { - var cp = buffer[i]; - if (" " == cp || "\n" == cp || "\r" == cp) { - err("Invalid whitespace in authority."); - continue; - } - if (":" == cp && null === this._password) { - this._password = ""; - continue; - } - var tempC = percentEscape(cp); - null !== this._password ? this._password += tempC : this._username += tempC; - } - buffer = ""; - } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) { - cursor -= buffer.length; - buffer = ""; - state = "host"; - continue; - } else { - buffer += c; - } - break; - - case "file host": - if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) { - if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ":" || buffer[1] == "|")) { - state = "relative path"; - } else if (buffer.length == 0) { - state = "relative path start"; - } else { - this._host = IDNAToASCII.call(this, buffer); - buffer = ""; - state = "relative path start"; - } - continue; - } else if (" " == c || "\n" == c || "\r" == c) { - err("Invalid whitespace in file host."); - } else { - buffer += c; - } - break; - - case "host": - case "hostname": - if (":" == c && !seenBracket) { - this._host = IDNAToASCII.call(this, buffer); - buffer = ""; - state = "port"; - if ("hostname" == stateOverride) { - break loop; - } - } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) { - this._host = IDNAToASCII.call(this, buffer); - buffer = ""; - state = "relative path start"; - if (stateOverride) { - break loop; - } - continue; - } else if (" " != c && "\n" != c && "\r" != c) { - if ("[" == c) { - seenBracket = true; - } else if ("]" == c) { - seenBracket = false; - } - buffer += c; - } else { - err("Invalid code point in host/hostname: " + c); - } - break; - - case "port": - if (/[0-9]/.test(c)) { - buffer += c; - } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c || stateOverride) { - if ("" != buffer) { - var temp = parseInt(buffer, 10); - if (temp != relative[this._scheme]) { - this._port = temp + ""; - } - buffer = ""; - } - if (stateOverride) { - break loop; - } - state = "relative path start"; - continue; - } else if (" " == c || "\n" == c || "\r" == c) { - err("Invalid code point in port: " + c); - } else { - invalid.call(this); - } - break; - - case "relative path start": - if ("\\" == c) err("'\\' not allowed in path."); - state = "relative path"; - if ("/" != c && "\\" != c) { - continue; - } - break; - - case "relative path": - if (EOF == c || "/" == c || "\\" == c || !stateOverride && ("?" == c || "#" == c)) { - if ("\\" == c) { - err("\\ not allowed in relative path."); - } - var tmp; - if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { - buffer = tmp; - } - if (".." == buffer) { - this._path.pop(); - if ("/" != c && "\\" != c) { - this._path.push(""); - } - } else if ("." == buffer && "/" != c && "\\" != c) { - this._path.push(""); - } else if ("." != buffer) { - if ("file" == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == "|") { - buffer = buffer[0] + ":"; - } - this._path.push(buffer); - } - buffer = ""; - if ("?" == c) { - this._query = "?"; - state = "query"; - } else if ("#" == c) { - this._fragment = "#"; - state = "fragment"; - } - } else if (" " != c && "\n" != c && "\r" != c) { - buffer += percentEscape(c); - } - break; - - case "query": - if (!stateOverride && "#" == c) { - this._fragment = "#"; - state = "fragment"; - } else if (EOF != c && " " != c && "\n" != c && "\r" != c) { - this._query += percentEscapeQuery(c); - } - break; - - case "fragment": - if (EOF != c && " " != c && "\n" != c && "\r" != c) { - this._fragment += c; - } - break; - } - cursor++; - } - } - function clear() { - this._scheme = ""; - this._schemeData = ""; - this._username = ""; - this._password = null; - this._host = ""; - this._port = ""; - this._path = []; - this._query = ""; - this._fragment = ""; - this._isInvalid = false; - this._isRelative = false; - } - function jURL(url, base) { - if (base !== undefined && !(base instanceof jURL)) base = new jURL(String(base)); - this._url = url; - clear.call(this); - var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ""); - parse.call(this, input, null, base); - } - jURL.prototype = { - toString: function() { - return this.href; - }, - get href() { - if (this._isInvalid) return this._url; - var authority = ""; - if ("" != this._username || null != this._password) { - authority = this._username + (null != this._password ? ":" + this._password : "") + "@"; - } - return this.protocol + (this._isRelative ? "//" + authority + this.host : "") + this.pathname + this._query + this._fragment; - }, - set href(href) { - clear.call(this); - parse.call(this, href); - }, - get protocol() { - return this._scheme + ":"; - }, - set protocol(protocol) { - if (this._isInvalid) return; - parse.call(this, protocol + ":", "scheme start"); - }, - get host() { - return this._isInvalid ? "" : this._port ? this._host + ":" + this._port : this._host; - }, - set host(host) { - if (this._isInvalid || !this._isRelative) return; - parse.call(this, host, "host"); - }, - get hostname() { - return this._host; - }, - set hostname(hostname) { - if (this._isInvalid || !this._isRelative) return; - parse.call(this, hostname, "hostname"); - }, - get port() { - return this._port; - }, - set port(port) { - if (this._isInvalid || !this._isRelative) return; - parse.call(this, port, "port"); - }, - get pathname() { - return this._isInvalid ? "" : this._isRelative ? "/" + this._path.join("/") : this._schemeData; - }, - set pathname(pathname) { - if (this._isInvalid || !this._isRelative) return; - this._path = []; - parse.call(this, pathname, "relative path start"); - }, - get search() { - return this._isInvalid || !this._query || "?" == this._query ? "" : this._query; - }, - set search(search) { - if (this._isInvalid || !this._isRelative) return; - this._query = "?"; - if ("?" == search[0]) search = search.slice(1); - parse.call(this, search, "query"); - }, - get hash() { - return this._isInvalid || !this._fragment || "#" == this._fragment ? "" : this._fragment; - }, - set hash(hash) { - if (this._isInvalid) return; - this._fragment = "#"; - if ("#" == hash[0]) hash = hash.slice(1); - parse.call(this, hash, "fragment"); - }, - get origin() { - var host; - if (this._isInvalid || !this._scheme) { - return ""; - } - switch (this._scheme) { - case "data": - case "file": - case "javascript": - case "mailto": - return "null"; - } - host = this.host; - if (!host) { - return ""; - } - return this._scheme + "://" + host; - } - }; - var OriginalURL = scope.URL; - if (OriginalURL) { - jURL.createObjectURL = function(blob) { - return OriginalURL.createObjectURL.apply(OriginalURL, arguments); - }; - jURL.revokeObjectURL = function(url) { - OriginalURL.revokeObjectURL(url); - }; - } - scope.URL = jURL; -})(self); - -if (typeof WeakMap === "undefined") { - (function() { - var defineProperty = Object.defineProperty; - var counter = Date.now() % 1e9; - var WeakMap = function() { - this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__"); - }; - WeakMap.prototype = { - set: function(key, value) { - var entry = key[this.name]; - if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, { - value: [ key, value ], - writable: true - }); - return this; - }, - get: function(key) { - var entry; - return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined; - }, - "delete": function(key) { - var entry = key[this.name]; - if (!entry || entry[0] !== key) return false; - entry[0] = entry[1] = undefined; - return true; - }, - has: function(key) { - var entry = key[this.name]; - if (!entry) return false; - return entry[0] === key; - } - }; - window.WeakMap = WeakMap; - })(); -} - -(function(global) { - if (global.JsMutationObserver) { - return; - } - var registrationsTable = new WeakMap(); - var setImmediate; - if (/Trident|Edge/.test(navigator.userAgent)) { - setImmediate = setTimeout; - } else if (window.setImmediate) { - setImmediate = window.setImmediate; - } else { - var setImmediateQueue = []; - var sentinel = String(Math.random()); - window.addEventListener("message", function(e) { - if (e.data === sentinel) { - var queue = setImmediateQueue; - setImmediateQueue = []; - queue.forEach(function(func) { - func(); - }); - } - }); - setImmediate = function(func) { - setImmediateQueue.push(func); - window.postMessage(sentinel, "*"); - }; - } - var isScheduled = false; - var scheduledObservers = []; - function scheduleCallback(observer) { - scheduledObservers.push(observer); - if (!isScheduled) { - isScheduled = true; - setImmediate(dispatchCallbacks); - } - } - function wrapIfNeeded(node) { - return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node; - } - function dispatchCallbacks() { - isScheduled = false; - var observers = scheduledObservers; - scheduledObservers = []; - observers.sort(function(o1, o2) { - return o1.uid_ - o2.uid_; - }); - var anyNonEmpty = false; - observers.forEach(function(observer) { - var queue = observer.takeRecords(); - removeTransientObserversFor(observer); - if (queue.length) { - observer.callback_(queue, observer); - anyNonEmpty = true; - } - }); - if (anyNonEmpty) dispatchCallbacks(); - } - function removeTransientObserversFor(observer) { - observer.nodes_.forEach(function(node) { - var registrations = registrationsTable.get(node); - if (!registrations) return; - registrations.forEach(function(registration) { - if (registration.observer === observer) registration.removeTransientObservers(); - }); - }); - } - function forEachAncestorAndObserverEnqueueRecord(target, callback) { - for (var node = target; node; node = node.parentNode) { - var registrations = registrationsTable.get(node); - if (registrations) { - for (var j = 0; j < registrations.length; j++) { - var registration = registrations[j]; - var options = registration.options; - if (node !== target && !options.subtree) continue; - var record = callback(options); - if (record) registration.enqueue(record); - } - } - } - } - var uidCounter = 0; - function JsMutationObserver(callback) { - this.callback_ = callback; - this.nodes_ = []; - this.records_ = []; - this.uid_ = ++uidCounter; - } - JsMutationObserver.prototype = { - observe: function(target, options) { - target = wrapIfNeeded(target); - if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) { - throw new SyntaxError(); - } - var registrations = registrationsTable.get(target); - if (!registrations) registrationsTable.set(target, registrations = []); - var registration; - for (var i = 0; i < registrations.length; i++) { - if (registrations[i].observer === this) { - registration = registrations[i]; - registration.removeListeners(); - registration.options = options; - break; - } - } - if (!registration) { - registration = new Registration(this, target, options); - registrations.push(registration); - this.nodes_.push(target); - } - registration.addListeners(); - }, - disconnect: function() { - this.nodes_.forEach(function(node) { - var registrations = registrationsTable.get(node); - for (var i = 0; i < registrations.length; i++) { - var registration = registrations[i]; - if (registration.observer === this) { - registration.removeListeners(); - registrations.splice(i, 1); - break; - } - } - }, this); - this.records_ = []; - }, - takeRecords: function() { - var copyOfRecords = this.records_; - this.records_ = []; - return copyOfRecords; - } - }; - function MutationRecord(type, target) { - this.type = type; - this.target = target; - this.addedNodes = []; - this.removedNodes = []; - this.previousSibling = null; - this.nextSibling = null; - this.attributeName = null; - this.attributeNamespace = null; - this.oldValue = null; - } - function copyMutationRecord(original) { - var record = new MutationRecord(original.type, original.target); - record.addedNodes = original.addedNodes.slice(); - record.removedNodes = original.removedNodes.slice(); - record.previousSibling = original.previousSibling; - record.nextSibling = original.nextSibling; - record.attributeName = original.attributeName; - record.attributeNamespace = original.attributeNamespace; - record.oldValue = original.oldValue; - return record; - } - var currentRecord, recordWithOldValue; - function getRecord(type, target) { - return currentRecord = new MutationRecord(type, target); - } - function getRecordWithOldValue(oldValue) { - if (recordWithOldValue) return recordWithOldValue; - recordWithOldValue = copyMutationRecord(currentRecord); - recordWithOldValue.oldValue = oldValue; - return recordWithOldValue; - } - function clearRecords() { - currentRecord = recordWithOldValue = undefined; - } - function recordRepresentsCurrentMutation(record) { - return record === recordWithOldValue || record === currentRecord; - } - function selectRecord(lastRecord, newRecord) { - if (lastRecord === newRecord) return lastRecord; - if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue; - return null; - } - function Registration(observer, target, options) { - this.observer = observer; - this.target = target; - this.options = options; - this.transientObservedNodes = []; - } - Registration.prototype = { - enqueue: function(record) { - var records = this.observer.records_; - var length = records.length; - if (records.length > 0) { - var lastRecord = records[length - 1]; - var recordToReplaceLast = selectRecord(lastRecord, record); - if (recordToReplaceLast) { - records[length - 1] = recordToReplaceLast; - return; - } - } else { - scheduleCallback(this.observer); - } - records[length] = record; - }, - addListeners: function() { - this.addListeners_(this.target); - }, - addListeners_: function(node) { - var options = this.options; - if (options.attributes) node.addEventListener("DOMAttrModified", this, true); - if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true); - if (options.childList) node.addEventListener("DOMNodeInserted", this, true); - if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true); - }, - removeListeners: function() { - this.removeListeners_(this.target); - }, - removeListeners_: function(node) { - var options = this.options; - if (options.attributes) node.removeEventListener("DOMAttrModified", this, true); - if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true); - if (options.childList) node.removeEventListener("DOMNodeInserted", this, true); - if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true); - }, - addTransientObserver: function(node) { - if (node === this.target) return; - this.addListeners_(node); - this.transientObservedNodes.push(node); - var registrations = registrationsTable.get(node); - if (!registrations) registrationsTable.set(node, registrations = []); - registrations.push(this); - }, - removeTransientObservers: function() { - var transientObservedNodes = this.transientObservedNodes; - this.transientObservedNodes = []; - transientObservedNodes.forEach(function(node) { - this.removeListeners_(node); - var registrations = registrationsTable.get(node); - for (var i = 0; i < registrations.length; i++) { - if (registrations[i] === this) { - registrations.splice(i, 1); - break; - } - } - }, this); - }, - handleEvent: function(e) { - e.stopImmediatePropagation(); - switch (e.type) { - case "DOMAttrModified": - var name = e.attrName; - var namespace = e.relatedNode.namespaceURI; - var target = e.target; - var record = new getRecord("attributes", target); - record.attributeName = name; - record.attributeNamespace = namespace; - var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue; - forEachAncestorAndObserverEnqueueRecord(target, function(options) { - if (!options.attributes) return; - if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) { - return; - } - if (options.attributeOldValue) return getRecordWithOldValue(oldValue); - return record; - }); - break; - - case "DOMCharacterDataModified": - var target = e.target; - var record = getRecord("characterData", target); - var oldValue = e.prevValue; - forEachAncestorAndObserverEnqueueRecord(target, function(options) { - if (!options.characterData) return; - if (options.characterDataOldValue) return getRecordWithOldValue(oldValue); - return record; - }); - break; - - case "DOMNodeRemoved": - this.addTransientObserver(e.target); - - case "DOMNodeInserted": - var changedNode = e.target; - var addedNodes, removedNodes; - if (e.type === "DOMNodeInserted") { - addedNodes = [ changedNode ]; - removedNodes = []; - } else { - addedNodes = []; - removedNodes = [ changedNode ]; - } - var previousSibling = changedNode.previousSibling; - var nextSibling = changedNode.nextSibling; - var record = getRecord("childList", e.target.parentNode); - record.addedNodes = addedNodes; - record.removedNodes = removedNodes; - record.previousSibling = previousSibling; - record.nextSibling = nextSibling; - forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) { - if (!options.childList) return; - return record; - }); - } - clearRecords(); - } - }; - global.JsMutationObserver = JsMutationObserver; - if (!global.MutationObserver) { - global.MutationObserver = JsMutationObserver; - JsMutationObserver._isPolyfilled = true; - } -})(self); - -(function() { - var needsTemplate = typeof HTMLTemplateElement === "undefined"; - if (/Trident/.test(navigator.userAgent)) { - (function() { - var importNode = document.importNode; - document.importNode = function() { - var n = importNode.apply(document, arguments); - if (n.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { - var f = document.createDocumentFragment(); - f.appendChild(n); - return f; - } else { - return n; - } - }; - })(); - } - var needsCloning = function() { - if (!needsTemplate) { - var t = document.createElement("template"); - var t2 = document.createElement("template"); - t2.content.appendChild(document.createElement("div")); - t.content.appendChild(t2); - var clone = t.cloneNode(true); - return clone.content.childNodes.length === 0 || clone.content.firstChild.content.childNodes.length === 0; - } - }(); - var TEMPLATE_TAG = "template"; - var TemplateImpl = function() {}; - if (needsTemplate) { - var contentDoc = document.implementation.createHTMLDocument("template"); - var canDecorate = true; - var templateStyle = document.createElement("style"); - templateStyle.textContent = TEMPLATE_TAG + "{display:none;}"; - var head = document.head; - head.insertBefore(templateStyle, head.firstElementChild); - TemplateImpl.prototype = Object.create(HTMLElement.prototype); - TemplateImpl.decorate = function(template) { - if (template.content) { - return; - } - template.content = contentDoc.createDocumentFragment(); - var child; - while (child = template.firstChild) { - template.content.appendChild(child); - } - template.cloneNode = function(deep) { - return TemplateImpl.cloneNode(this, deep); - }; - if (canDecorate) { - try { - Object.defineProperty(template, "innerHTML", { - get: function() { - var o = ""; - for (var e = this.content.firstChild; e; e = e.nextSibling) { - o += e.outerHTML || escapeData(e.data); - } - return o; - }, - set: function(text) { - contentDoc.body.innerHTML = text; - TemplateImpl.bootstrap(contentDoc); - while (this.content.firstChild) { - this.content.removeChild(this.content.firstChild); - } - while (contentDoc.body.firstChild) { - this.content.appendChild(contentDoc.body.firstChild); - } - }, - configurable: true - }); - } catch (err) { - canDecorate = false; - } - } - TemplateImpl.bootstrap(template.content); - }; - TemplateImpl.bootstrap = function(doc) { - var templates = doc.querySelectorAll(TEMPLATE_TAG); - for (var i = 0, l = templates.length, t; i < l && (t = templates[i]); i++) { - TemplateImpl.decorate(t); - } - }; - document.addEventListener("DOMContentLoaded", function() { - TemplateImpl.bootstrap(document); - }); - var createElement = document.createElement; - document.createElement = function() { - "use strict"; - var el = createElement.apply(document, arguments); - if (el.localName === "template") { - TemplateImpl.decorate(el); - } - return el; - }; - var escapeDataRegExp = /[&\u00A0<>]/g; - function escapeReplace(c) { - switch (c) { - case "&": - return "&"; - - case "<": - return "<"; - - case ">": - return ">"; - - case " ": - return " "; - } - } - function escapeData(s) { - return s.replace(escapeDataRegExp, escapeReplace); - } - } - if (needsTemplate || needsCloning) { - var nativeCloneNode = Node.prototype.cloneNode; - TemplateImpl.cloneNode = function(template, deep) { - var clone = nativeCloneNode.call(template, false); - if (this.decorate) { - this.decorate(clone); - } - if (deep) { - clone.content.appendChild(nativeCloneNode.call(template.content, true)); - this.fixClonedDom(clone.content, template.content); - } - return clone; - }; - TemplateImpl.fixClonedDom = function(clone, source) { - if (!source.querySelectorAll) return; - var s$ = source.querySelectorAll(TEMPLATE_TAG); - var t$ = clone.querySelectorAll(TEMPLATE_TAG); - for (var i = 0, l = t$.length, t, s; i < l; i++) { - s = s$[i]; - t = t$[i]; - if (this.decorate) { - this.decorate(s); - } - t.parentNode.replaceChild(s.cloneNode(true), t); - } - }; - var originalImportNode = document.importNode; - Node.prototype.cloneNode = function(deep) { - var dom = nativeCloneNode.call(this, deep); - if (deep) { - TemplateImpl.fixClonedDom(dom, this); - } - return dom; - }; - document.importNode = function(element, deep) { - if (element.localName === TEMPLATE_TAG) { - return TemplateImpl.cloneNode(element, deep); - } else { - var dom = originalImportNode.call(document, element, deep); - if (deep) { - TemplateImpl.fixClonedDom(dom, element); - } - return dom; - } - }; - if (needsCloning) { - HTMLTemplateElement.prototype.cloneNode = function(deep) { - return TemplateImpl.cloneNode(this, deep); - }; - } - } - if (needsTemplate) { - window.HTMLTemplateElement = TemplateImpl; - } -})(); - -(function(scope) { - "use strict"; - if (!window.performance) { - var start = Date.now(); - window.performance = { - now: function() { - return Date.now() - start; - } - }; - } - if (!window.requestAnimationFrame) { - window.requestAnimationFrame = function() { - var nativeRaf = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; - return nativeRaf ? function(callback) { - return nativeRaf(function() { - callback(performance.now()); - }); - } : function(callback) { - return window.setTimeout(callback, 1e3 / 60); - }; - }(); - } - if (!window.cancelAnimationFrame) { - window.cancelAnimationFrame = function() { - return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) { - clearTimeout(id); - }; - }(); - } - var workingDefaultPrevented = function() { - var e = document.createEvent("Event"); - e.initEvent("foo", true, true); - e.preventDefault(); - return e.defaultPrevented; - }(); - if (!workingDefaultPrevented) { - var origPreventDefault = Event.prototype.preventDefault; - Event.prototype.preventDefault = function() { - if (!this.cancelable) { - return; - } - origPreventDefault.call(this); - Object.defineProperty(this, "defaultPrevented", { - get: function() { - return true; - }, - configurable: true - }); - }; - } - var isIE = /Trident/.test(navigator.userAgent); - if (!window.CustomEvent || isIE && typeof window.CustomEvent !== "function") { - window.CustomEvent = function(inType, params) { - params = params || {}; - var e = document.createEvent("CustomEvent"); - e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail); - return e; - }; - window.CustomEvent.prototype = window.Event.prototype; - } - if (!window.Event || isIE && typeof window.Event !== "function") { - var origEvent = window.Event; - window.Event = function(inType, params) { - params = params || {}; - var e = document.createEvent("Event"); - e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable)); - return e; - }; - window.Event.prototype = origEvent.prototype; - } -})(window.WebComponents); - -window.HTMLImports = window.HTMLImports || { - flags: {} -}; - -(function(scope) { - var IMPORT_LINK_TYPE = "import"; - var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement("link")); - var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill); - var wrap = function(node) { - return hasShadowDOMPolyfill ? window.ShadowDOMPolyfill.wrapIfNeeded(node) : node; - }; - var rootDocument = wrap(document); - var currentScriptDescriptor = { - get: function() { - var script = window.HTMLImports.currentScript || document.currentScript || (document.readyState !== "complete" ? document.scripts[document.scripts.length - 1] : null); - return wrap(script); - }, - configurable: true - }; - Object.defineProperty(document, "_currentScript", currentScriptDescriptor); - Object.defineProperty(rootDocument, "_currentScript", currentScriptDescriptor); - var isIE = /Trident/.test(navigator.userAgent); - function whenReady(callback, doc) { - doc = doc || rootDocument; - whenDocumentReady(function() { - watchImportsLoad(callback, doc); - }, doc); - } - var requiredReadyState = isIE ? "complete" : "interactive"; - var READY_EVENT = "readystatechange"; - function isDocumentReady(doc) { - return doc.readyState === "complete" || doc.readyState === requiredReadyState; - } - function whenDocumentReady(callback, doc) { - if (!isDocumentReady(doc)) { - var checkReady = function() { - if (doc.readyState === "complete" || doc.readyState === requiredReadyState) { - doc.removeEventListener(READY_EVENT, checkReady); - whenDocumentReady(callback, doc); - } - }; - doc.addEventListener(READY_EVENT, checkReady); - } else if (callback) { - callback(); - } - } - function markTargetLoaded(event) { - event.target.__loaded = true; - } - function watchImportsLoad(callback, doc) { - var imports = doc.querySelectorAll("link[rel=import]"); - var parsedCount = 0, importCount = imports.length, newImports = [], errorImports = []; - function checkDone() { - if (parsedCount == importCount && callback) { - callback({ - allImports: imports, - loadedImports: newImports, - errorImports: errorImports - }); - } - } - function loadedImport(e) { - markTargetLoaded(e); - newImports.push(this); - parsedCount++; - checkDone(); - } - function errorLoadingImport(e) { - errorImports.push(this); - parsedCount++; - checkDone(); - } - if (importCount) { - for (var i = 0, imp; i < importCount && (imp = imports[i]); i++) { - if (isImportLoaded(imp)) { - newImports.push(this); - parsedCount++; - checkDone(); - } else { - imp.addEventListener("load", loadedImport); - imp.addEventListener("error", errorLoadingImport); - } - } - } else { - checkDone(); - } - } - function isImportLoaded(link) { - return useNative ? link.__loaded || link.import && link.import.readyState !== "loading" : link.__importParsed; - } - if (useNative) { - new MutationObserver(function(mxns) { - for (var i = 0, l = mxns.length, m; i < l && (m = mxns[i]); i++) { - if (m.addedNodes) { - handleImports(m.addedNodes); - } - } - }).observe(document.head, { - childList: true - }); - function handleImports(nodes) { - for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { - if (isImport(n)) { - handleImport(n); - } - } - } - function isImport(element) { - return element.localName === "link" && element.rel === "import"; - } - function handleImport(element) { - var loaded = element.import; - if (loaded) { - markTargetLoaded({ - target: element - }); - } else { - element.addEventListener("load", markTargetLoaded); - element.addEventListener("error", markTargetLoaded); - } - } - (function() { - if (document.readyState === "loading") { - var imports = document.querySelectorAll("link[rel=import]"); - for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) { - handleImport(imp); - } - } - })(); - } - whenReady(function(detail) { - window.HTMLImports.ready = true; - window.HTMLImports.readyTime = new Date().getTime(); - var evt = rootDocument.createEvent("CustomEvent"); - evt.initCustomEvent("HTMLImportsLoaded", true, true, detail); - rootDocument.dispatchEvent(evt); - }); - scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE; - scope.useNative = useNative; - scope.rootDocument = rootDocument; - scope.whenReady = whenReady; - scope.isIE = isIE; -})(window.HTMLImports); - -(function(scope) { - var modules = []; - var addModule = function(module) { - modules.push(module); - }; - var initializeModules = function() { - modules.forEach(function(module) { - module(scope); - }); - }; - scope.addModule = addModule; - scope.initializeModules = initializeModules; -})(window.HTMLImports); - -window.HTMLImports.addModule(function(scope) { - var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g; - var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g; - var path = { - resolveUrlsInStyle: function(style, linkUrl) { - var doc = style.ownerDocument; - var resolver = doc.createElement("a"); - style.textContent = this.resolveUrlsInCssText(style.textContent, linkUrl, resolver); - return style; - }, - resolveUrlsInCssText: function(cssText, linkUrl, urlObj) { - var r = this.replaceUrls(cssText, urlObj, linkUrl, CSS_URL_REGEXP); - r = this.replaceUrls(r, urlObj, linkUrl, CSS_IMPORT_REGEXP); - return r; - }, - replaceUrls: function(text, urlObj, linkUrl, regexp) { - return text.replace(regexp, function(m, pre, url, post) { - var urlPath = url.replace(/["']/g, ""); - if (linkUrl) { - urlPath = new URL(urlPath, linkUrl).href; - } - urlObj.href = urlPath; - urlPath = urlObj.href; - return pre + "'" + urlPath + "'" + post; - }); - } - }; - scope.path = path; -}); - -window.HTMLImports.addModule(function(scope) { - var xhr = { - async: true, - ok: function(request) { - return request.status >= 200 && request.status < 300 || request.status === 304 || request.status === 0; - }, - load: function(url, next, nextContext) { - var request = new XMLHttpRequest(); - if (scope.flags.debug || scope.flags.bust) { - url += "?" + Math.random(); - } - request.open("GET", url, xhr.async); - request.addEventListener("readystatechange", function(e) { - if (request.readyState === 4) { - var redirectedUrl = null; - try { - var locationHeader = request.getResponseHeader("Location"); - if (locationHeader) { - redirectedUrl = locationHeader.substr(0, 1) === "/" ? location.origin + locationHeader : locationHeader; - } - } catch (e) { - console.error(e.message); - } - next.call(nextContext, !xhr.ok(request) && request, request.response || request.responseText, redirectedUrl); - } - }); - request.send(); - return request; - }, - loadDocument: function(url, next, nextContext) { - this.load(url, next, nextContext).responseType = "document"; - } - }; - scope.xhr = xhr; -}); - -window.HTMLImports.addModule(function(scope) { - var xhr = scope.xhr; - var flags = scope.flags; - var Loader = function(onLoad, onComplete) { - this.cache = {}; - this.onload = onLoad; - this.oncomplete = onComplete; - this.inflight = 0; - this.pending = {}; - }; - Loader.prototype = { - addNodes: function(nodes) { - this.inflight += nodes.length; - for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { - this.require(n); - } - this.checkDone(); - }, - addNode: function(node) { - this.inflight++; - this.require(node); - this.checkDone(); - }, - require: function(elt) { - var url = elt.src || elt.href; - elt.__nodeUrl = url; - if (!this.dedupe(url, elt)) { - this.fetch(url, elt); - } - }, - dedupe: function(url, elt) { - if (this.pending[url]) { - this.pending[url].push(elt); - return true; - } - var resource; - if (this.cache[url]) { - this.onload(url, elt, this.cache[url]); - this.tail(); - return true; - } - this.pending[url] = [ elt ]; - return false; - }, - fetch: function(url, elt) { - flags.load && console.log("fetch", url, elt); - if (!url) { - setTimeout(function() { - this.receive(url, elt, { - error: "href must be specified" - }, null); - }.bind(this), 0); - } else if (url.match(/^data:/)) { - var pieces = url.split(","); - var header = pieces[0]; - var body = pieces[1]; - if (header.indexOf(";base64") > -1) { - body = atob(body); - } else { - body = decodeURIComponent(body); - } - setTimeout(function() { - this.receive(url, elt, null, body); - }.bind(this), 0); - } else { - var receiveXhr = function(err, resource, redirectedUrl) { - this.receive(url, elt, err, resource, redirectedUrl); - }.bind(this); - xhr.load(url, receiveXhr); - } - }, - receive: function(url, elt, err, resource, redirectedUrl) { - this.cache[url] = resource; - var $p = this.pending[url]; - for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) { - this.onload(url, p, resource, err, redirectedUrl); - this.tail(); - } - this.pending[url] = null; - }, - tail: function() { - --this.inflight; - this.checkDone(); - }, - checkDone: function() { - if (!this.inflight) { - this.oncomplete(); - } - } - }; - scope.Loader = Loader; -}); - -window.HTMLImports.addModule(function(scope) { - var Observer = function(addCallback) { - this.addCallback = addCallback; - this.mo = new MutationObserver(this.handler.bind(this)); - }; - Observer.prototype = { - handler: function(mutations) { - for (var i = 0, l = mutations.length, m; i < l && (m = mutations[i]); i++) { - if (m.type === "childList" && m.addedNodes.length) { - this.addedNodes(m.addedNodes); - } - } - }, - addedNodes: function(nodes) { - if (this.addCallback) { - this.addCallback(nodes); - } - for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) { - if (n.children && n.children.length) { - this.addedNodes(n.children); - } - } - }, - observe: function(root) { - this.mo.observe(root, { - childList: true, - subtree: true - }); - } - }; - scope.Observer = Observer; -}); - -window.HTMLImports.addModule(function(scope) { - var path = scope.path; - var rootDocument = scope.rootDocument; - var flags = scope.flags; - var isIE = scope.isIE; - var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE; - var IMPORT_SELECTOR = "link[rel=" + IMPORT_LINK_TYPE + "]"; - var importParser = { - documentSelectors: IMPORT_SELECTOR, - importsSelectors: [ IMPORT_SELECTOR, "link[rel=stylesheet]:not([type])", "style:not([type])", "script:not([type])", 'script[type="application/javascript"]', 'script[type="text/javascript"]' ].join(","), - map: { - link: "parseLink", - script: "parseScript", - style: "parseStyle" - }, - dynamicElements: [], - parseNext: function() { - var next = this.nextToParse(); - if (next) { - this.parse(next); - } - }, - parse: function(elt) { - if (this.isParsed(elt)) { - flags.parse && console.log("[%s] is already parsed", elt.localName); - return; - } - var fn = this[this.map[elt.localName]]; - if (fn) { - this.markParsing(elt); - fn.call(this, elt); - } - }, - parseDynamic: function(elt, quiet) { - this.dynamicElements.push(elt); - if (!quiet) { - this.parseNext(); - } - }, - markParsing: function(elt) { - flags.parse && console.log("parsing", elt); - this.parsingElement = elt; - }, - markParsingComplete: function(elt) { - elt.__importParsed = true; - this.markDynamicParsingComplete(elt); - if (elt.__importElement) { - elt.__importElement.__importParsed = true; - this.markDynamicParsingComplete(elt.__importElement); - } - this.parsingElement = null; - flags.parse && console.log("completed", elt); - }, - markDynamicParsingComplete: function(elt) { - var i = this.dynamicElements.indexOf(elt); - if (i >= 0) { - this.dynamicElements.splice(i, 1); - } - }, - parseImport: function(elt) { - elt.import = elt.__doc; - if (window.HTMLImports.__importsParsingHook) { - window.HTMLImports.__importsParsingHook(elt); - } - if (elt.import) { - elt.import.__importParsed = true; - } - this.markParsingComplete(elt); - if (elt.__resource && !elt.__error) { - elt.dispatchEvent(new CustomEvent("load", { - bubbles: false - })); - } else { - elt.dispatchEvent(new CustomEvent("error", { - bubbles: false - })); - } - if (elt.__pending) { - var fn; - while (elt.__pending.length) { - fn = elt.__pending.shift(); - if (fn) { - fn({ - target: elt - }); - } - } - } - this.parseNext(); - }, - parseLink: function(linkElt) { - if (nodeIsImport(linkElt)) { - this.parseImport(linkElt); - } else { - linkElt.href = linkElt.href; - this.parseGeneric(linkElt); - } - }, - parseStyle: function(elt) { - var src = elt; - elt = cloneStyle(elt); - src.__appliedElement = elt; - elt.__importElement = src; - this.parseGeneric(elt); - }, - parseGeneric: function(elt) { - this.trackElement(elt); - this.addElementToDocument(elt); - }, - rootImportForElement: function(elt) { - var n = elt; - while (n.ownerDocument.__importLink) { - n = n.ownerDocument.__importLink; - } - return n; - }, - addElementToDocument: function(elt) { - var port = this.rootImportForElement(elt.__importElement || elt); - port.parentNode.insertBefore(elt, port); - }, - trackElement: function(elt, callback) { - var self = this; - var done = function(e) { - elt.removeEventListener("load", done); - elt.removeEventListener("error", done); - if (callback) { - callback(e); - } - self.markParsingComplete(elt); - self.parseNext(); - }; - elt.addEventListener("load", done); - elt.addEventListener("error", done); - if (isIE && elt.localName === "style") { - var fakeLoad = false; - if (elt.textContent.indexOf("@import") == -1) { - fakeLoad = true; - } else if (elt.sheet) { - fakeLoad = true; - var csr = elt.sheet.cssRules; - var len = csr ? csr.length : 0; - for (var i = 0, r; i < len && (r = csr[i]); i++) { - if (r.type === CSSRule.IMPORT_RULE) { - fakeLoad = fakeLoad && Boolean(r.styleSheet); - } - } - } - if (fakeLoad) { - setTimeout(function() { - elt.dispatchEvent(new CustomEvent("load", { - bubbles: false - })); - }); - } - } - }, - parseScript: function(scriptElt) { - var script = document.createElement("script"); - script.__importElement = scriptElt; - script.src = scriptElt.src ? scriptElt.src : generateScriptDataUrl(scriptElt); - scope.currentScript = scriptElt; - this.trackElement(script, function(e) { - if (script.parentNode) { - script.parentNode.removeChild(script); - } - scope.currentScript = null; - }); - this.addElementToDocument(script); - }, - nextToParse: function() { - this._mayParse = []; - return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic()); - }, - nextToParseInDoc: function(doc, link) { - if (doc && this._mayParse.indexOf(doc) < 0) { - this._mayParse.push(doc); - var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc)); - for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { - if (!this.isParsed(n)) { - if (this.hasResource(n)) { - return nodeIsImport(n) ? this.nextToParseInDoc(n.__doc, n) : n; - } else { - return; - } - } - } - } - return link; - }, - nextToParseDynamic: function() { - return this.dynamicElements[0]; - }, - parseSelectorsForNode: function(node) { - var doc = node.ownerDocument || node; - return doc === rootDocument ? this.documentSelectors : this.importsSelectors; - }, - isParsed: function(node) { - return node.__importParsed; - }, - needsDynamicParsing: function(elt) { - return this.dynamicElements.indexOf(elt) >= 0; - }, - hasResource: function(node) { - if (nodeIsImport(node) && node.__doc === undefined) { - return false; - } - return true; - } - }; - function nodeIsImport(elt) { - return elt.localName === "link" && elt.rel === IMPORT_LINK_TYPE; - } - function generateScriptDataUrl(script) { - var scriptContent = generateScriptContent(script); - return "data:text/javascript;charset=utf-8," + encodeURIComponent(scriptContent); - } - function generateScriptContent(script) { - return script.textContent + generateSourceMapHint(script); - } - function generateSourceMapHint(script) { - var owner = script.ownerDocument; - owner.__importedScripts = owner.__importedScripts || 0; - var moniker = script.ownerDocument.baseURI; - var num = owner.__importedScripts ? "-" + owner.__importedScripts : ""; - owner.__importedScripts++; - return "\n//# sourceURL=" + moniker + num + ".js\n"; - } - function cloneStyle(style) { - var clone = style.ownerDocument.createElement("style"); - clone.textContent = style.textContent; - path.resolveUrlsInStyle(clone); - return clone; - } - scope.parser = importParser; - scope.IMPORT_SELECTOR = IMPORT_SELECTOR; -}); - -window.HTMLImports.addModule(function(scope) { - var flags = scope.flags; - var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE; - var IMPORT_SELECTOR = scope.IMPORT_SELECTOR; - var rootDocument = scope.rootDocument; - var Loader = scope.Loader; - var Observer = scope.Observer; - var parser = scope.parser; - var importer = { - documents: {}, - documentPreloadSelectors: IMPORT_SELECTOR, - importsPreloadSelectors: [ IMPORT_SELECTOR ].join(","), - loadNode: function(node) { - importLoader.addNode(node); - }, - loadSubtree: function(parent) { - var nodes = this.marshalNodes(parent); - importLoader.addNodes(nodes); - }, - marshalNodes: function(parent) { - return parent.querySelectorAll(this.loadSelectorsForNode(parent)); - }, - loadSelectorsForNode: function(node) { - var doc = node.ownerDocument || node; - return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors; - }, - loaded: function(url, elt, resource, err, redirectedUrl) { - flags.load && console.log("loaded", url, elt); - elt.__resource = resource; - elt.__error = err; - if (isImportLink(elt)) { - var doc = this.documents[url]; - if (doc === undefined) { - doc = err ? null : makeDocument(resource, redirectedUrl || url); - if (doc) { - doc.__importLink = elt; - this.bootDocument(doc); - } - this.documents[url] = doc; - } - elt.__doc = doc; - } - parser.parseNext(); - }, - bootDocument: function(doc) { - this.loadSubtree(doc); - this.observer.observe(doc); - parser.parseNext(); - }, - loadedAll: function() { - parser.parseNext(); - } - }; - var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer)); - importer.observer = new Observer(); - function isImportLink(elt) { - return isLinkRel(elt, IMPORT_LINK_TYPE); - } - function isLinkRel(elt, rel) { - return elt.localName === "link" && elt.getAttribute("rel") === rel; - } - function hasBaseURIAccessor(doc) { - return !!Object.getOwnPropertyDescriptor(doc, "baseURI"); - } - function makeDocument(resource, url) { - var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE); - doc._URL = url; - var base = doc.createElement("base"); - base.setAttribute("href", url); - if (!doc.baseURI && !hasBaseURIAccessor(doc)) { - Object.defineProperty(doc, "baseURI", { - value: url - }); - } - var meta = doc.createElement("meta"); - meta.setAttribute("charset", "utf-8"); - doc.head.appendChild(meta); - doc.head.appendChild(base); - doc.body.innerHTML = resource; - if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) { - HTMLTemplateElement.bootstrap(doc); - } - return doc; - } - if (!document.baseURI) { - var baseURIDescriptor = { - get: function() { - var base = document.querySelector("base"); - return base ? base.href : window.location.href; - }, - configurable: true - }; - Object.defineProperty(document, "baseURI", baseURIDescriptor); - Object.defineProperty(rootDocument, "baseURI", baseURIDescriptor); - } - scope.importer = importer; - scope.importLoader = importLoader; -}); - -window.HTMLImports.addModule(function(scope) { - var parser = scope.parser; - var importer = scope.importer; - var dynamic = { - added: function(nodes) { - var owner, parsed, loading; - for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { - if (!owner) { - owner = n.ownerDocument; - parsed = parser.isParsed(owner); - } - loading = this.shouldLoadNode(n); - if (loading) { - importer.loadNode(n); - } - if (this.shouldParseNode(n) && parsed) { - parser.parseDynamic(n, loading); - } - } - }, - shouldLoadNode: function(node) { - return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node)); - }, - shouldParseNode: function(node) { - return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node)); - } - }; - importer.observer.addCallback = dynamic.added.bind(dynamic); - var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector; -}); - -(function(scope) { - var initializeModules = scope.initializeModules; - var isIE = scope.isIE; - if (scope.useNative) { - return; - } - initializeModules(); - var rootDocument = scope.rootDocument; - function bootstrap() { - window.HTMLImports.importer.bootDocument(rootDocument); - } - if (document.readyState === "complete" || document.readyState === "interactive" && !window.attachEvent) { - bootstrap(); - } else { - document.addEventListener("DOMContentLoaded", bootstrap); - } -})(window.HTMLImports); - -window.CustomElements = window.CustomElements || { - flags: {} -}; - -(function(scope) { - var flags = scope.flags; - var modules = []; - var addModule = function(module) { - modules.push(module); - }; - var initializeModules = function() { - modules.forEach(function(module) { - module(scope); - }); - }; - scope.addModule = addModule; - scope.initializeModules = initializeModules; - scope.hasNative = Boolean(document.registerElement); - scope.isIE = /Trident/.test(navigator.userAgent); - scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || window.HTMLImports.useNative); -})(window.CustomElements); - -window.CustomElements.addModule(function(scope) { - var IMPORT_LINK_TYPE = window.HTMLImports ? window.HTMLImports.IMPORT_LINK_TYPE : "none"; - function forSubtree(node, cb) { - findAllElements(node, function(e) { - if (cb(e)) { - return true; - } - forRoots(e, cb); - }); - forRoots(node, cb); - } - function findAllElements(node, find, data) { - var e = node.firstElementChild; - if (!e) { - e = node.firstChild; - while (e && e.nodeType !== Node.ELEMENT_NODE) { - e = e.nextSibling; - } - } - while (e) { - if (find(e, data) !== true) { - findAllElements(e, find, data); - } - e = e.nextElementSibling; - } - return null; - } - function forRoots(node, cb) { - var root = node.shadowRoot; - while (root) { - forSubtree(root, cb); - root = root.olderShadowRoot; - } - } - function forDocumentTree(doc, cb) { - _forDocumentTree(doc, cb, []); - } - function _forDocumentTree(doc, cb, processingDocuments) { - doc = window.wrap(doc); - if (processingDocuments.indexOf(doc) >= 0) { - return; - } - processingDocuments.push(doc); - var imports = doc.querySelectorAll("link[rel=" + IMPORT_LINK_TYPE + "]"); - for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) { - if (n.import) { - _forDocumentTree(n.import, cb, processingDocuments); - } - } - cb(doc); - } - scope.forDocumentTree = forDocumentTree; - scope.forSubtree = forSubtree; -}); - -window.CustomElements.addModule(function(scope) { - var flags = scope.flags; - var forSubtree = scope.forSubtree; - var forDocumentTree = scope.forDocumentTree; - function addedNode(node, isAttached) { - return added(node, isAttached) || addedSubtree(node, isAttached); - } - function added(node, isAttached) { - if (scope.upgrade(node, isAttached)) { - return true; - } - if (isAttached) { - attached(node); - } - } - function addedSubtree(node, isAttached) { - forSubtree(node, function(e) { - if (added(e, isAttached)) { - return true; - } - }); - } - var hasThrottledAttached = window.MutationObserver._isPolyfilled && flags["throttle-attached"]; - scope.hasPolyfillMutations = hasThrottledAttached; - scope.hasThrottledAttached = hasThrottledAttached; - var isPendingMutations = false; - var pendingMutations = []; - function deferMutation(fn) { - pendingMutations.push(fn); - if (!isPendingMutations) { - isPendingMutations = true; - setTimeout(takeMutations); - } - } - function takeMutations() { - isPendingMutations = false; - var $p = pendingMutations; - for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) { - p(); - } - pendingMutations = []; - } - function attached(element) { - if (hasThrottledAttached) { - deferMutation(function() { - _attached(element); - }); - } else { - _attached(element); - } - } - function _attached(element) { - if (element.__upgraded__ && !element.__attached) { - element.__attached = true; - if (element.attachedCallback) { - element.attachedCallback(); - } - } - } - function detachedNode(node) { - detached(node); - forSubtree(node, function(e) { - detached(e); - }); - } - function detached(element) { - if (hasThrottledAttached) { - deferMutation(function() { - _detached(element); - }); - } else { - _detached(element); - } - } - function _detached(element) { - if (element.__upgraded__ && element.__attached) { - element.__attached = false; - if (element.detachedCallback) { - element.detachedCallback(); - } - } - } - function inDocument(element) { - var p = element; - var doc = window.wrap(document); - while (p) { - if (p == doc) { - return true; - } - p = p.parentNode || p.nodeType === Node.DOCUMENT_FRAGMENT_NODE && p.host; - } - } - function watchShadow(node) { - if (node.shadowRoot && !node.shadowRoot.__watched) { - flags.dom && console.log("watching shadow-root for: ", node.localName); - var root = node.shadowRoot; - while (root) { - observe(root); - root = root.olderShadowRoot; - } - } - } - function handler(root, mutations) { - if (flags.dom) { - var mx = mutations[0]; - if (mx && mx.type === "childList" && mx.addedNodes) { - if (mx.addedNodes) { - var d = mx.addedNodes[0]; - while (d && d !== document && !d.host) { - d = d.parentNode; - } - var u = d && (d.URL || d._URL || d.host && d.host.localName) || ""; - u = u.split("/?").shift().split("/").pop(); - } - } - console.group("mutations (%d) [%s]", mutations.length, u || ""); - } - var isAttached = inDocument(root); - mutations.forEach(function(mx) { - if (mx.type === "childList") { - forEach(mx.addedNodes, function(n) { - if (!n.localName) { - return; - } - addedNode(n, isAttached); - }); - forEach(mx.removedNodes, function(n) { - if (!n.localName) { - return; - } - detachedNode(n); - }); - } - }); - flags.dom && console.groupEnd(); - } - function takeRecords(node) { - node = window.wrap(node); - if (!node) { - node = window.wrap(document); - } - while (node.parentNode) { - node = node.parentNode; - } - var observer = node.__observer; - if (observer) { - handler(node, observer.takeRecords()); - takeMutations(); - } - } - var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach); - function observe(inRoot) { - if (inRoot.__observer) { - return; - } - var observer = new MutationObserver(handler.bind(this, inRoot)); - observer.observe(inRoot, { - childList: true, - subtree: true - }); - inRoot.__observer = observer; - } - function upgradeDocument(doc) { - doc = window.wrap(doc); - flags.dom && console.group("upgradeDocument: ", doc.baseURI.split("/").pop()); - var isMainDocument = doc === window.wrap(document); - addedNode(doc, isMainDocument); - observe(doc); - flags.dom && console.groupEnd(); - } - function upgradeDocumentTree(doc) { - forDocumentTree(doc, upgradeDocument); - } - var originalCreateShadowRoot = Element.prototype.createShadowRoot; - if (originalCreateShadowRoot) { - Element.prototype.createShadowRoot = function() { - var root = originalCreateShadowRoot.call(this); - window.CustomElements.watchShadow(this); - return root; - }; - } - scope.watchShadow = watchShadow; - scope.upgradeDocumentTree = upgradeDocumentTree; - scope.upgradeDocument = upgradeDocument; - scope.upgradeSubtree = addedSubtree; - scope.upgradeAll = addedNode; - scope.attached = attached; - scope.takeRecords = takeRecords; -}); - -window.CustomElements.addModule(function(scope) { - var flags = scope.flags; - function upgrade(node, isAttached) { - if (node.localName === "template") { - if (window.HTMLTemplateElement && HTMLTemplateElement.decorate) { - HTMLTemplateElement.decorate(node); - } - } - if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) { - var is = node.getAttribute("is"); - var definition = scope.getRegisteredDefinition(node.localName) || scope.getRegisteredDefinition(is); - if (definition) { - if (is && definition.tag == node.localName || !is && !definition.extends) { - return upgradeWithDefinition(node, definition, isAttached); - } - } - } - } - function upgradeWithDefinition(element, definition, isAttached) { - flags.upgrade && console.group("upgrade:", element.localName); - if (definition.is) { - element.setAttribute("is", definition.is); - } - implementPrototype(element, definition); - element.__upgraded__ = true; - created(element); - if (isAttached) { - scope.attached(element); - } - scope.upgradeSubtree(element, isAttached); - flags.upgrade && console.groupEnd(); - return element; - } - function implementPrototype(element, definition) { - if (Object.__proto__) { - element.__proto__ = definition.prototype; - } else { - customMixin(element, definition.prototype, definition.native); - element.__proto__ = definition.prototype; - } - } - function customMixin(inTarget, inSrc, inNative) { - var used = {}; - var p = inSrc; - while (p !== inNative && p !== HTMLElement.prototype) { - var keys = Object.getOwnPropertyNames(p); - for (var i = 0, k; k = keys[i]; i++) { - if (!used[k]) { - Object.defineProperty(inTarget, k, Object.getOwnPropertyDescriptor(p, k)); - used[k] = 1; - } - } - p = Object.getPrototypeOf(p); - } - } - function created(element) { - if (element.createdCallback) { - element.createdCallback(); - } - } - scope.upgrade = upgrade; - scope.upgradeWithDefinition = upgradeWithDefinition; - scope.implementPrototype = implementPrototype; -}); - -window.CustomElements.addModule(function(scope) { - var isIE = scope.isIE; - var upgradeDocumentTree = scope.upgradeDocumentTree; - var upgradeAll = scope.upgradeAll; - var upgradeWithDefinition = scope.upgradeWithDefinition; - var implementPrototype = scope.implementPrototype; - var useNative = scope.useNative; - function register(name, options) { - var definition = options || {}; - if (!name) { - throw new Error("document.registerElement: first argument `name` must not be empty"); - } - if (name.indexOf("-") < 0) { - throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '" + String(name) + "'."); - } - if (isReservedTag(name)) { - throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '" + String(name) + "'. The type name is invalid."); - } - if (getRegisteredDefinition(name)) { - throw new Error("DuplicateDefinitionError: a type with name '" + String(name) + "' is already registered"); - } - if (!definition.prototype) { - definition.prototype = Object.create(HTMLElement.prototype); - } - definition.__name = name.toLowerCase(); - if (definition.extends) { - definition.extends = definition.extends.toLowerCase(); - } - definition.lifecycle = definition.lifecycle || {}; - definition.ancestry = ancestry(definition.extends); - resolveTagName(definition); - resolvePrototypeChain(definition); - overrideAttributeApi(definition.prototype); - registerDefinition(definition.__name, definition); - definition.ctor = generateConstructor(definition); - definition.ctor.prototype = definition.prototype; - definition.prototype.constructor = definition.ctor; - if (scope.ready) { - upgradeDocumentTree(document); - } - return definition.ctor; - } - function overrideAttributeApi(prototype) { - if (prototype.setAttribute._polyfilled) { - return; - } - var setAttribute = prototype.setAttribute; - prototype.setAttribute = function(name, value) { - changeAttribute.call(this, name, value, setAttribute); - }; - var removeAttribute = prototype.removeAttribute; - prototype.removeAttribute = function(name) { - changeAttribute.call(this, name, null, removeAttribute); - }; - prototype.setAttribute._polyfilled = true; - } - function changeAttribute(name, value, operation) { - name = name.toLowerCase(); - var oldValue = this.getAttribute(name); - operation.apply(this, arguments); - var newValue = this.getAttribute(name); - if (this.attributeChangedCallback && newValue !== oldValue) { - this.attributeChangedCallback(name, oldValue, newValue); - } - } - function isReservedTag(name) { - for (var i = 0; i < reservedTagList.length; i++) { - if (name === reservedTagList[i]) { - return true; - } - } - } - var reservedTagList = [ "annotation-xml", "color-profile", "font-face", "font-face-src", "font-face-uri", "font-face-format", "font-face-name", "missing-glyph" ]; - function ancestry(extnds) { - var extendee = getRegisteredDefinition(extnds); - if (extendee) { - return ancestry(extendee.extends).concat([ extendee ]); - } - return []; - } - function resolveTagName(definition) { - var baseTag = definition.extends; - for (var i = 0, a; a = definition.ancestry[i]; i++) { - baseTag = a.is && a.tag; - } - definition.tag = baseTag || definition.__name; - if (baseTag) { - definition.is = definition.__name; - } - } - function resolvePrototypeChain(definition) { - if (!Object.__proto__) { - var nativePrototype = HTMLElement.prototype; - if (definition.is) { - var inst = document.createElement(definition.tag); - nativePrototype = Object.getPrototypeOf(inst); - } - var proto = definition.prototype, ancestor; - var foundPrototype = false; - while (proto) { - if (proto == nativePrototype) { - foundPrototype = true; - } - ancestor = Object.getPrototypeOf(proto); - if (ancestor) { - proto.__proto__ = ancestor; - } - proto = ancestor; - } - if (!foundPrototype) { - console.warn(definition.tag + " prototype not found in prototype chain for " + definition.is); - } - definition.native = nativePrototype; - } - } - function instantiate(definition) { - return upgradeWithDefinition(domCreateElement(definition.tag), definition); - } - var registry = {}; - function getRegisteredDefinition(name) { - if (name) { - return registry[name.toLowerCase()]; - } - } - function registerDefinition(name, definition) { - registry[name] = definition; - } - function generateConstructor(definition) { - return function() { - return instantiate(definition); - }; - } - var HTML_NAMESPACE = "http://www.w3.org/1999/xhtml"; - function createElementNS(namespace, tag, typeExtension) { - if (namespace === HTML_NAMESPACE) { - return createElement(tag, typeExtension); - } else { - return domCreateElementNS(namespace, tag); - } - } - function createElement(tag, typeExtension) { - if (tag) { - tag = tag.toLowerCase(); - } - if (typeExtension) { - typeExtension = typeExtension.toLowerCase(); - } - var definition = getRegisteredDefinition(typeExtension || tag); - if (definition) { - if (tag == definition.tag && typeExtension == definition.is) { - return new definition.ctor(); - } - if (!typeExtension && !definition.is) { - return new definition.ctor(); - } - } - var element; - if (typeExtension) { - element = createElement(tag); - element.setAttribute("is", typeExtension); - return element; - } - element = domCreateElement(tag); - if (tag.indexOf("-") >= 0) { - implementPrototype(element, HTMLElement); - } - return element; - } - var domCreateElement = document.createElement.bind(document); - var domCreateElementNS = document.createElementNS.bind(document); - var isInstance; - if (!Object.__proto__ && !useNative) { - isInstance = function(obj, ctor) { - if (obj instanceof ctor) { - return true; - } - var p = obj; - while (p) { - if (p === ctor.prototype) { - return true; - } - p = p.__proto__; - } - return false; - }; - } else { - isInstance = function(obj, base) { - return obj instanceof base; - }; - } - function wrapDomMethodToForceUpgrade(obj, methodName) { - var orig = obj[methodName]; - obj[methodName] = function() { - var n = orig.apply(this, arguments); - upgradeAll(n); - return n; - }; - } - wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode"); - wrapDomMethodToForceUpgrade(document, "importNode"); - document.registerElement = register; - document.createElement = createElement; - document.createElementNS = createElementNS; - scope.registry = registry; - scope.instanceof = isInstance; - scope.reservedTagList = reservedTagList; - scope.getRegisteredDefinition = getRegisteredDefinition; - document.register = document.registerElement; -}); - -(function(scope) { - var useNative = scope.useNative; - var initializeModules = scope.initializeModules; - var isIE = scope.isIE; - if (useNative) { - var nop = function() {}; - scope.watchShadow = nop; - scope.upgrade = nop; - scope.upgradeAll = nop; - scope.upgradeDocumentTree = nop; - scope.upgradeSubtree = nop; - scope.takeRecords = nop; - scope.instanceof = function(obj, base) { - return obj instanceof base; - }; - } else { - initializeModules(); - } - var upgradeDocumentTree = scope.upgradeDocumentTree; - var upgradeDocument = scope.upgradeDocument; - if (!window.wrap) { - if (window.ShadowDOMPolyfill) { - window.wrap = window.ShadowDOMPolyfill.wrapIfNeeded; - window.unwrap = window.ShadowDOMPolyfill.unwrapIfNeeded; - } else { - window.wrap = window.unwrap = function(node) { - return node; - }; - } - } - if (window.HTMLImports) { - window.HTMLImports.__importsParsingHook = function(elt) { - if (elt.import) { - upgradeDocument(wrap(elt.import)); - } - }; - } - function bootstrap() { - upgradeDocumentTree(window.wrap(document)); - window.CustomElements.ready = true; - var requestAnimationFrame = window.requestAnimationFrame || function(f) { - setTimeout(f, 16); - }; - requestAnimationFrame(function() { - setTimeout(function() { - window.CustomElements.readyTime = Date.now(); - if (window.HTMLImports) { - window.CustomElements.elapsed = window.CustomElements.readyTime - window.HTMLImports.readyTime; - } - document.dispatchEvent(new CustomEvent("WebComponentsReady", { - bubbles: true - })); - }); - }); - } - if (document.readyState === "complete" || scope.flags.eager) { - bootstrap(); - } else if (document.readyState === "interactive" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) { - bootstrap(); - } else { - var loadEvent = window.HTMLImports && !window.HTMLImports.ready ? "HTMLImportsLoaded" : "DOMContentLoaded"; - window.addEventListener(loadEvent, bootstrap); - } -})(window.CustomElements); - -(function(scope) { - var style = document.createElement("style"); - style.textContent = "" + "body {" + "transition: opacity ease-in 0.2s;" + " } \n" + "body[unresolved] {" + "opacity: 0; display: block; overflow: hidden; position: relative;" + " } \n"; - var head = document.querySelector("head"); - head.insertBefore(style, head.firstChild); -})(window.WebComponents); \ No newline at end of file diff --git a/dashboard-ui/bower_components/webcomponentsjs/webcomponents.js b/dashboard-ui/bower_components/webcomponentsjs/webcomponents.js deleted file mode 100644 index f363c0e14c..0000000000 --- a/dashboard-ui/bower_components/webcomponentsjs/webcomponents.js +++ /dev/null @@ -1,7206 +0,0 @@ -/** - * @license - * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. - * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - * Code distributed by Google as part of the polymer project is also - * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt - */ -// @version 0.7.22 -(function() { - window.WebComponents = window.WebComponents || { - flags: {} - }; - var file = "webcomponents.js"; - var script = document.querySelector('script[src*="' + file + '"]'); - var flags = {}; - if (!flags.noOpts) { - location.search.slice(1).split("&").forEach(function(option) { - var parts = option.split("="); - var match; - if (parts[0] && (match = parts[0].match(/wc-(.+)/))) { - flags[match[1]] = parts[1] || true; - } - }); - if (script) { - for (var i = 0, a; a = script.attributes[i]; i++) { - if (a.name !== "src") { - flags[a.name] = a.value || true; - } - } - } - if (flags.log && flags.log.split) { - var parts = flags.log.split(","); - flags.log = {}; - parts.forEach(function(f) { - flags.log[f] = true; - }); - } else { - flags.log = {}; - } - } - flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill; - if (flags.shadow === "native") { - flags.shadow = false; - } else { - flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot; - } - if (flags.register) { - window.CustomElements = window.CustomElements || { - flags: {} - }; - window.CustomElements.flags.register = flags.register; - } - WebComponents.flags = flags; -})(); - -if (WebComponents.flags.shadow) { - if (typeof WeakMap === "undefined") { - (function() { - var defineProperty = Object.defineProperty; - var counter = Date.now() % 1e9; - var WeakMap = function() { - this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__"); - }; - WeakMap.prototype = { - set: function(key, value) { - var entry = key[this.name]; - if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, { - value: [ key, value ], - writable: true - }); - return this; - }, - get: function(key) { - var entry; - return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined; - }, - "delete": function(key) { - var entry = key[this.name]; - if (!entry || entry[0] !== key) return false; - entry[0] = entry[1] = undefined; - return true; - }, - has: function(key) { - var entry = key[this.name]; - if (!entry) return false; - return entry[0] === key; - } - }; - window.WeakMap = WeakMap; - })(); - } - window.ShadowDOMPolyfill = {}; - (function(scope) { - "use strict"; - var constructorTable = new WeakMap(); - var nativePrototypeTable = new WeakMap(); - var wrappers = Object.create(null); - function detectEval() { - if (typeof chrome !== "undefined" && chrome.app && chrome.app.runtime) { - return false; - } - if (navigator.getDeviceStorage) { - return false; - } - try { - var f = new Function("return true;"); - return f(); - } catch (ex) { - return false; - } - } - var hasEval = detectEval(); - function assert(b) { - if (!b) throw new Error("Assertion failed"); - } - var defineProperty = Object.defineProperty; - var getOwnPropertyNames = Object.getOwnPropertyNames; - var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - function mixin(to, from) { - var names = getOwnPropertyNames(from); - for (var i = 0; i < names.length; i++) { - var name = names[i]; - defineProperty(to, name, getOwnPropertyDescriptor(from, name)); - } - return to; - } - function mixinStatics(to, from) { - var names = getOwnPropertyNames(from); - for (var i = 0; i < names.length; i++) { - var name = names[i]; - switch (name) { - case "arguments": - case "caller": - case "length": - case "name": - case "prototype": - case "toString": - continue; - } - defineProperty(to, name, getOwnPropertyDescriptor(from, name)); - } - return to; - } - function oneOf(object, propertyNames) { - for (var i = 0; i < propertyNames.length; i++) { - if (propertyNames[i] in object) return propertyNames[i]; - } - } - var nonEnumerableDataDescriptor = { - value: undefined, - configurable: true, - enumerable: false, - writable: true - }; - function defineNonEnumerableDataProperty(object, name, value) { - nonEnumerableDataDescriptor.value = value; - defineProperty(object, name, nonEnumerableDataDescriptor); - } - getOwnPropertyNames(window); - function getWrapperConstructor(node, opt_instance) { - var nativePrototype = node.__proto__ || Object.getPrototypeOf(node); - if (isFirefox) { - try { - getOwnPropertyNames(nativePrototype); - } catch (error) { - nativePrototype = nativePrototype.__proto__; - } - } - var wrapperConstructor = constructorTable.get(nativePrototype); - if (wrapperConstructor) return wrapperConstructor; - var parentWrapperConstructor = getWrapperConstructor(nativePrototype); - var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor); - registerInternal(nativePrototype, GeneratedWrapper, opt_instance); - return GeneratedWrapper; - } - function addForwardingProperties(nativePrototype, wrapperPrototype) { - installProperty(nativePrototype, wrapperPrototype, true); - } - function registerInstanceProperties(wrapperPrototype, instanceObject) { - installProperty(instanceObject, wrapperPrototype, false); - } - var isFirefox = /Firefox/.test(navigator.userAgent); - var dummyDescriptor = { - get: function() {}, - set: function(v) {}, - configurable: true, - enumerable: true - }; - function isEventHandlerName(name) { - return /^on[a-z]+$/.test(name); - } - function isIdentifierName(name) { - return /^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(name); - } - function getGetter(name) { - return hasEval && isIdentifierName(name) ? new Function("return this.__impl4cf1e782hg__." + name) : function() { - return this.__impl4cf1e782hg__[name]; - }; - } - function getSetter(name) { - return hasEval && isIdentifierName(name) ? new Function("v", "this.__impl4cf1e782hg__." + name + " = v") : function(v) { - this.__impl4cf1e782hg__[name] = v; - }; - } - function getMethod(name) { - return hasEval && isIdentifierName(name) ? new Function("return this.__impl4cf1e782hg__." + name + ".apply(this.__impl4cf1e782hg__, arguments)") : function() { - return this.__impl4cf1e782hg__[name].apply(this.__impl4cf1e782hg__, arguments); - }; - } - function getDescriptor(source, name) { - try { - return Object.getOwnPropertyDescriptor(source, name); - } catch (ex) { - return dummyDescriptor; - } - } - var isBrokenSafari = function() { - var descr = Object.getOwnPropertyDescriptor(Node.prototype, "nodeType"); - return descr && !descr.get && !descr.set; - }(); - function installProperty(source, target, allowMethod, opt_blacklist) { - var names = getOwnPropertyNames(source); - for (var i = 0; i < names.length; i++) { - var name = names[i]; - if (name === "polymerBlackList_") continue; - if (name in target) continue; - if (source.polymerBlackList_ && source.polymerBlackList_[name]) continue; - if (isFirefox) { - source.__lookupGetter__(name); - } - var descriptor = getDescriptor(source, name); - var getter, setter; - if (typeof descriptor.value === "function") { - if (allowMethod) { - target[name] = getMethod(name); - } - continue; - } - var isEvent = isEventHandlerName(name); - if (isEvent) getter = scope.getEventHandlerGetter(name); else getter = getGetter(name); - if (descriptor.writable || descriptor.set || isBrokenSafari) { - if (isEvent) setter = scope.getEventHandlerSetter(name); else setter = getSetter(name); - } - var configurable = isBrokenSafari || descriptor.configurable; - defineProperty(target, name, { - get: getter, - set: setter, - configurable: configurable, - enumerable: descriptor.enumerable - }); - } - } - function register(nativeConstructor, wrapperConstructor, opt_instance) { - if (nativeConstructor == null) { - return; - } - var nativePrototype = nativeConstructor.prototype; - registerInternal(nativePrototype, wrapperConstructor, opt_instance); - mixinStatics(wrapperConstructor, nativeConstructor); - } - function registerInternal(nativePrototype, wrapperConstructor, opt_instance) { - var wrapperPrototype = wrapperConstructor.prototype; - assert(constructorTable.get(nativePrototype) === undefined); - constructorTable.set(nativePrototype, wrapperConstructor); - nativePrototypeTable.set(wrapperPrototype, nativePrototype); - addForwardingProperties(nativePrototype, wrapperPrototype); - if (opt_instance) registerInstanceProperties(wrapperPrototype, opt_instance); - defineNonEnumerableDataProperty(wrapperPrototype, "constructor", wrapperConstructor); - wrapperConstructor.prototype = wrapperPrototype; - } - function isWrapperFor(wrapperConstructor, nativeConstructor) { - return constructorTable.get(nativeConstructor.prototype) === wrapperConstructor; - } - function registerObject(object) { - var nativePrototype = Object.getPrototypeOf(object); - var superWrapperConstructor = getWrapperConstructor(nativePrototype); - var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor); - registerInternal(nativePrototype, GeneratedWrapper, object); - return GeneratedWrapper; - } - function createWrapperConstructor(superWrapperConstructor) { - function GeneratedWrapper(node) { - superWrapperConstructor.call(this, node); - } - var p = Object.create(superWrapperConstructor.prototype); - p.constructor = GeneratedWrapper; - GeneratedWrapper.prototype = p; - return GeneratedWrapper; - } - function isWrapper(object) { - return object && object.__impl4cf1e782hg__; - } - function isNative(object) { - return !isWrapper(object); - } - function wrap(impl) { - if (impl === null) return null; - assert(isNative(impl)); - var wrapper = impl.__wrapper8e3dd93a60__; - if (wrapper != null) { - return wrapper; - } - return impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl, impl))(impl); - } - function unwrap(wrapper) { - if (wrapper === null) return null; - assert(isWrapper(wrapper)); - return wrapper.__impl4cf1e782hg__; - } - function unsafeUnwrap(wrapper) { - return wrapper.__impl4cf1e782hg__; - } - function setWrapper(impl, wrapper) { - wrapper.__impl4cf1e782hg__ = impl; - impl.__wrapper8e3dd93a60__ = wrapper; - } - function unwrapIfNeeded(object) { - return object && isWrapper(object) ? unwrap(object) : object; - } - function wrapIfNeeded(object) { - return object && !isWrapper(object) ? wrap(object) : object; - } - function rewrap(node, wrapper) { - if (wrapper === null) return; - assert(isNative(node)); - assert(wrapper === undefined || isWrapper(wrapper)); - node.__wrapper8e3dd93a60__ = wrapper; - } - var getterDescriptor = { - get: undefined, - configurable: true, - enumerable: true - }; - function defineGetter(constructor, name, getter) { - getterDescriptor.get = getter; - defineProperty(constructor.prototype, name, getterDescriptor); - } - function defineWrapGetter(constructor, name) { - defineGetter(constructor, name, function() { - return wrap(this.__impl4cf1e782hg__[name]); - }); - } - function forwardMethodsToWrapper(constructors, names) { - constructors.forEach(function(constructor) { - names.forEach(function(name) { - constructor.prototype[name] = function() { - var w = wrapIfNeeded(this); - return w[name].apply(w, arguments); - }; - }); - }); - } - scope.addForwardingProperties = addForwardingProperties; - scope.assert = assert; - scope.constructorTable = constructorTable; - scope.defineGetter = defineGetter; - scope.defineWrapGetter = defineWrapGetter; - scope.forwardMethodsToWrapper = forwardMethodsToWrapper; - scope.isIdentifierName = isIdentifierName; - scope.isWrapper = isWrapper; - scope.isWrapperFor = isWrapperFor; - scope.mixin = mixin; - scope.nativePrototypeTable = nativePrototypeTable; - scope.oneOf = oneOf; - scope.registerObject = registerObject; - scope.registerWrapper = register; - scope.rewrap = rewrap; - scope.setWrapper = setWrapper; - scope.unsafeUnwrap = unsafeUnwrap; - scope.unwrap = unwrap; - scope.unwrapIfNeeded = unwrapIfNeeded; - scope.wrap = wrap; - scope.wrapIfNeeded = wrapIfNeeded; - scope.wrappers = wrappers; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - function newSplice(index, removed, addedCount) { - return { - index: index, - removed: removed, - addedCount: addedCount - }; - } - var EDIT_LEAVE = 0; - var EDIT_UPDATE = 1; - var EDIT_ADD = 2; - var EDIT_DELETE = 3; - function ArraySplice() {} - ArraySplice.prototype = { - calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) { - var rowCount = oldEnd - oldStart + 1; - var columnCount = currentEnd - currentStart + 1; - var distances = new Array(rowCount); - for (var i = 0; i < rowCount; i++) { - distances[i] = new Array(columnCount); - distances[i][0] = i; - } - for (var j = 0; j < columnCount; j++) distances[0][j] = j; - for (var i = 1; i < rowCount; i++) { - for (var j = 1; j < columnCount; j++) { - if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1])) distances[i][j] = distances[i - 1][j - 1]; else { - var north = distances[i - 1][j] + 1; - var west = distances[i][j - 1] + 1; - distances[i][j] = north < west ? north : west; - } - } - } - return distances; - }, - spliceOperationsFromEditDistances: function(distances) { - var i = distances.length - 1; - var j = distances[0].length - 1; - var current = distances[i][j]; - var edits = []; - while (i > 0 || j > 0) { - if (i == 0) { - edits.push(EDIT_ADD); - j--; - continue; - } - if (j == 0) { - edits.push(EDIT_DELETE); - i--; - continue; - } - var northWest = distances[i - 1][j - 1]; - var west = distances[i - 1][j]; - var north = distances[i][j - 1]; - var min; - if (west < north) min = west < northWest ? west : northWest; else min = north < northWest ? north : northWest; - if (min == northWest) { - if (northWest == current) { - edits.push(EDIT_LEAVE); - } else { - edits.push(EDIT_UPDATE); - current = northWest; - } - i--; - j--; - } else if (min == west) { - edits.push(EDIT_DELETE); - i--; - current = west; - } else { - edits.push(EDIT_ADD); - j--; - current = north; - } - } - edits.reverse(); - return edits; - }, - calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) { - var prefixCount = 0; - var suffixCount = 0; - var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart); - if (currentStart == 0 && oldStart == 0) prefixCount = this.sharedPrefix(current, old, minLength); - if (currentEnd == current.length && oldEnd == old.length) suffixCount = this.sharedSuffix(current, old, minLength - prefixCount); - currentStart += prefixCount; - oldStart += prefixCount; - currentEnd -= suffixCount; - oldEnd -= suffixCount; - if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0) return []; - if (currentStart == currentEnd) { - var splice = newSplice(currentStart, [], 0); - while (oldStart < oldEnd) splice.removed.push(old[oldStart++]); - return [ splice ]; - } else if (oldStart == oldEnd) return [ newSplice(currentStart, [], currentEnd - currentStart) ]; - var ops = this.spliceOperationsFromEditDistances(this.calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd)); - var splice = undefined; - var splices = []; - var index = currentStart; - var oldIndex = oldStart; - for (var i = 0; i < ops.length; i++) { - switch (ops[i]) { - case EDIT_LEAVE: - if (splice) { - splices.push(splice); - splice = undefined; - } - index++; - oldIndex++; - break; - - case EDIT_UPDATE: - if (!splice) splice = newSplice(index, [], 0); - splice.addedCount++; - index++; - splice.removed.push(old[oldIndex]); - oldIndex++; - break; - - case EDIT_ADD: - if (!splice) splice = newSplice(index, [], 0); - splice.addedCount++; - index++; - break; - - case EDIT_DELETE: - if (!splice) splice = newSplice(index, [], 0); - splice.removed.push(old[oldIndex]); - oldIndex++; - break; - } - } - if (splice) { - splices.push(splice); - } - return splices; - }, - sharedPrefix: function(current, old, searchLength) { - for (var i = 0; i < searchLength; i++) if (!this.equals(current[i], old[i])) return i; - return searchLength; - }, - sharedSuffix: function(current, old, searchLength) { - var index1 = current.length; - var index2 = old.length; - var count = 0; - while (count < searchLength && this.equals(current[--index1], old[--index2])) count++; - return count; - }, - calculateSplices: function(current, previous) { - return this.calcSplices(current, 0, current.length, previous, 0, previous.length); - }, - equals: function(currentValue, previousValue) { - return currentValue === previousValue; - } - }; - scope.ArraySplice = ArraySplice; - })(window.ShadowDOMPolyfill); - (function(context) { - "use strict"; - var OriginalMutationObserver = window.MutationObserver; - var callbacks = []; - var pending = false; - var timerFunc; - function handle() { - pending = false; - var copies = callbacks.slice(0); - callbacks = []; - for (var i = 0; i < copies.length; i++) { - (0, copies[i])(); - } - } - if (OriginalMutationObserver) { - var counter = 1; - var observer = new OriginalMutationObserver(handle); - var textNode = document.createTextNode(counter); - observer.observe(textNode, { - characterData: true - }); - timerFunc = function() { - counter = (counter + 1) % 2; - textNode.data = counter; - }; - } else { - timerFunc = window.setTimeout; - } - function setEndOfMicrotask(func) { - callbacks.push(func); - if (pending) return; - pending = true; - timerFunc(handle, 0); - } - context.setEndOfMicrotask = setEndOfMicrotask; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var setEndOfMicrotask = scope.setEndOfMicrotask; - var wrapIfNeeded = scope.wrapIfNeeded; - var wrappers = scope.wrappers; - var registrationsTable = new WeakMap(); - var globalMutationObservers = []; - var isScheduled = false; - function scheduleCallback(observer) { - if (observer.scheduled_) return; - observer.scheduled_ = true; - globalMutationObservers.push(observer); - if (isScheduled) return; - setEndOfMicrotask(notifyObservers); - isScheduled = true; - } - function notifyObservers() { - isScheduled = false; - while (globalMutationObservers.length) { - var notifyList = globalMutationObservers; - globalMutationObservers = []; - notifyList.sort(function(x, y) { - return x.uid_ - y.uid_; - }); - for (var i = 0; i < notifyList.length; i++) { - var mo = notifyList[i]; - mo.scheduled_ = false; - var queue = mo.takeRecords(); - removeTransientObserversFor(mo); - if (queue.length) { - mo.callback_(queue, mo); - } - } - } - } - function MutationRecord(type, target) { - this.type = type; - this.target = target; - this.addedNodes = new wrappers.NodeList(); - this.removedNodes = new wrappers.NodeList(); - this.previousSibling = null; - this.nextSibling = null; - this.attributeName = null; - this.attributeNamespace = null; - this.oldValue = null; - } - function registerTransientObservers(ancestor, node) { - for (;ancestor; ancestor = ancestor.parentNode) { - var registrations = registrationsTable.get(ancestor); - if (!registrations) continue; - for (var i = 0; i < registrations.length; i++) { - var registration = registrations[i]; - if (registration.options.subtree) registration.addTransientObserver(node); - } - } - } - function removeTransientObserversFor(observer) { - for (var i = 0; i < observer.nodes_.length; i++) { - var node = observer.nodes_[i]; - var registrations = registrationsTable.get(node); - if (!registrations) return; - for (var j = 0; j < registrations.length; j++) { - var registration = registrations[j]; - if (registration.observer === observer) registration.removeTransientObservers(); - } - } - } - function enqueueMutation(target, type, data) { - var interestedObservers = Object.create(null); - var associatedStrings = Object.create(null); - for (var node = target; node; node = node.parentNode) { - var registrations = registrationsTable.get(node); - if (!registrations) continue; - for (var j = 0; j < registrations.length; j++) { - var registration = registrations[j]; - var options = registration.options; - if (node !== target && !options.subtree) continue; - if (type === "attributes" && !options.attributes) continue; - if (type === "attributes" && options.attributeFilter && (data.namespace !== null || options.attributeFilter.indexOf(data.name) === -1)) { - continue; - } - if (type === "characterData" && !options.characterData) continue; - if (type === "childList" && !options.childList) continue; - var observer = registration.observer; - interestedObservers[observer.uid_] = observer; - if (type === "attributes" && options.attributeOldValue || type === "characterData" && options.characterDataOldValue) { - associatedStrings[observer.uid_] = data.oldValue; - } - } - } - for (var uid in interestedObservers) { - var observer = interestedObservers[uid]; - var record = new MutationRecord(type, target); - if ("name" in data && "namespace" in data) { - record.attributeName = data.name; - record.attributeNamespace = data.namespace; - } - if (data.addedNodes) record.addedNodes = data.addedNodes; - if (data.removedNodes) record.removedNodes = data.removedNodes; - if (data.previousSibling) record.previousSibling = data.previousSibling; - if (data.nextSibling) record.nextSibling = data.nextSibling; - if (associatedStrings[uid] !== undefined) record.oldValue = associatedStrings[uid]; - scheduleCallback(observer); - observer.records_.push(record); - } - } - var slice = Array.prototype.slice; - function MutationObserverOptions(options) { - this.childList = !!options.childList; - this.subtree = !!options.subtree; - if (!("attributes" in options) && ("attributeOldValue" in options || "attributeFilter" in options)) { - this.attributes = true; - } else { - this.attributes = !!options.attributes; - } - if ("characterDataOldValue" in options && !("characterData" in options)) this.characterData = true; else this.characterData = !!options.characterData; - if (!this.attributes && (options.attributeOldValue || "attributeFilter" in options) || !this.characterData && options.characterDataOldValue) { - throw new TypeError(); - } - this.characterData = !!options.characterData; - this.attributeOldValue = !!options.attributeOldValue; - this.characterDataOldValue = !!options.characterDataOldValue; - if ("attributeFilter" in options) { - if (options.attributeFilter == null || typeof options.attributeFilter !== "object") { - throw new TypeError(); - } - this.attributeFilter = slice.call(options.attributeFilter); - } else { - this.attributeFilter = null; - } - } - var uidCounter = 0; - function MutationObserver(callback) { - this.callback_ = callback; - this.nodes_ = []; - this.records_ = []; - this.uid_ = ++uidCounter; - this.scheduled_ = false; - } - MutationObserver.prototype = { - constructor: MutationObserver, - observe: function(target, options) { - target = wrapIfNeeded(target); - var newOptions = new MutationObserverOptions(options); - var registration; - var registrations = registrationsTable.get(target); - if (!registrations) registrationsTable.set(target, registrations = []); - for (var i = 0; i < registrations.length; i++) { - if (registrations[i].observer === this) { - registration = registrations[i]; - registration.removeTransientObservers(); - registration.options = newOptions; - } - } - if (!registration) { - registration = new Registration(this, target, newOptions); - registrations.push(registration); - this.nodes_.push(target); - } - }, - disconnect: function() { - this.nodes_.forEach(function(node) { - var registrations = registrationsTable.get(node); - for (var i = 0; i < registrations.length; i++) { - var registration = registrations[i]; - if (registration.observer === this) { - registrations.splice(i, 1); - break; - } - } - }, this); - this.records_ = []; - }, - takeRecords: function() { - var copyOfRecords = this.records_; - this.records_ = []; - return copyOfRecords; - } - }; - function Registration(observer, target, options) { - this.observer = observer; - this.target = target; - this.options = options; - this.transientObservedNodes = []; - } - Registration.prototype = { - addTransientObserver: function(node) { - if (node === this.target) return; - scheduleCallback(this.observer); - this.transientObservedNodes.push(node); - var registrations = registrationsTable.get(node); - if (!registrations) registrationsTable.set(node, registrations = []); - registrations.push(this); - }, - removeTransientObservers: function() { - var transientObservedNodes = this.transientObservedNodes; - this.transientObservedNodes = []; - for (var i = 0; i < transientObservedNodes.length; i++) { - var node = transientObservedNodes[i]; - var registrations = registrationsTable.get(node); - for (var j = 0; j < registrations.length; j++) { - if (registrations[j] === this) { - registrations.splice(j, 1); - break; - } - } - } - } - }; - scope.enqueueMutation = enqueueMutation; - scope.registerTransientObservers = registerTransientObservers; - scope.wrappers.MutationObserver = MutationObserver; - scope.wrappers.MutationRecord = MutationRecord; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - function TreeScope(root, parent) { - this.root = root; - this.parent = parent; - } - TreeScope.prototype = { - get renderer() { - if (this.root instanceof scope.wrappers.ShadowRoot) { - return scope.getRendererForHost(this.root.host); - } - return null; - }, - contains: function(treeScope) { - for (;treeScope; treeScope = treeScope.parent) { - if (treeScope === this) return true; - } - return false; - } - }; - function setTreeScope(node, treeScope) { - if (node.treeScope_ !== treeScope) { - node.treeScope_ = treeScope; - for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) { - sr.treeScope_.parent = treeScope; - } - for (var child = node.firstChild; child; child = child.nextSibling) { - setTreeScope(child, treeScope); - } - } - } - function getTreeScope(node) { - if (node instanceof scope.wrappers.Window) { - debugger; - } - if (node.treeScope_) return node.treeScope_; - var parent = node.parentNode; - var treeScope; - if (parent) treeScope = getTreeScope(parent); else treeScope = new TreeScope(node, null); - return node.treeScope_ = treeScope; - } - scope.TreeScope = TreeScope; - scope.getTreeScope = getTreeScope; - scope.setTreeScope = setTreeScope; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var forwardMethodsToWrapper = scope.forwardMethodsToWrapper; - var getTreeScope = scope.getTreeScope; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var wrappers = scope.wrappers; - var wrappedFuns = new WeakMap(); - var listenersTable = new WeakMap(); - var handledEventsTable = new WeakMap(); - var currentlyDispatchingEvents = new WeakMap(); - var targetTable = new WeakMap(); - var currentTargetTable = new WeakMap(); - var relatedTargetTable = new WeakMap(); - var eventPhaseTable = new WeakMap(); - var stopPropagationTable = new WeakMap(); - var stopImmediatePropagationTable = new WeakMap(); - var eventHandlersTable = new WeakMap(); - var eventPathTable = new WeakMap(); - function isShadowRoot(node) { - return node instanceof wrappers.ShadowRoot; - } - function rootOfNode(node) { - return getTreeScope(node).root; - } - function getEventPath(node, event) { - var path = []; - var current = node; - path.push(current); - while (current) { - var destinationInsertionPoints = getDestinationInsertionPoints(current); - if (destinationInsertionPoints && destinationInsertionPoints.length > 0) { - for (var i = 0; i < destinationInsertionPoints.length; i++) { - var insertionPoint = destinationInsertionPoints[i]; - if (isShadowInsertionPoint(insertionPoint)) { - var shadowRoot = rootOfNode(insertionPoint); - var olderShadowRoot = shadowRoot.olderShadowRoot; - if (olderShadowRoot) path.push(olderShadowRoot); - } - path.push(insertionPoint); - } - current = destinationInsertionPoints[destinationInsertionPoints.length - 1]; - } else { - if (isShadowRoot(current)) { - if (inSameTree(node, current) && eventMustBeStopped(event)) { - break; - } - current = current.host; - path.push(current); - } else { - current = current.parentNode; - if (current) path.push(current); - } - } - } - return path; - } - function eventMustBeStopped(event) { - if (!event) return false; - switch (event.type) { - case "abort": - case "error": - case "select": - case "change": - case "load": - case "reset": - case "resize": - case "scroll": - case "selectstart": - return true; - } - return false; - } - function isShadowInsertionPoint(node) { - return node instanceof HTMLShadowElement; - } - function getDestinationInsertionPoints(node) { - return scope.getDestinationInsertionPoints(node); - } - function eventRetargetting(path, currentTarget) { - if (path.length === 0) return currentTarget; - if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document; - var currentTargetTree = getTreeScope(currentTarget); - var originalTarget = path[0]; - var originalTargetTree = getTreeScope(originalTarget); - var relativeTargetTree = lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree); - for (var i = 0; i < path.length; i++) { - var node = path[i]; - if (getTreeScope(node) === relativeTargetTree) return node; - } - return path[path.length - 1]; - } - function getTreeScopeAncestors(treeScope) { - var ancestors = []; - for (;treeScope; treeScope = treeScope.parent) { - ancestors.push(treeScope); - } - return ancestors; - } - function lowestCommonInclusiveAncestor(tsA, tsB) { - var ancestorsA = getTreeScopeAncestors(tsA); - var ancestorsB = getTreeScopeAncestors(tsB); - var result = null; - while (ancestorsA.length > 0 && ancestorsB.length > 0) { - var a = ancestorsA.pop(); - var b = ancestorsB.pop(); - if (a === b) result = a; else break; - } - return result; - } - function getTreeScopeRoot(ts) { - if (!ts.parent) return ts; - return getTreeScopeRoot(ts.parent); - } - function relatedTargetResolution(event, currentTarget, relatedTarget) { - if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document; - var currentTargetTree = getTreeScope(currentTarget); - var relatedTargetTree = getTreeScope(relatedTarget); - var relatedTargetEventPath = getEventPath(relatedTarget, event); - var lowestCommonAncestorTree; - var lowestCommonAncestorTree = lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree); - if (!lowestCommonAncestorTree) lowestCommonAncestorTree = relatedTargetTree.root; - for (var commonAncestorTree = lowestCommonAncestorTree; commonAncestorTree; commonAncestorTree = commonAncestorTree.parent) { - var adjustedRelatedTarget; - for (var i = 0; i < relatedTargetEventPath.length; i++) { - var node = relatedTargetEventPath[i]; - if (getTreeScope(node) === commonAncestorTree) return node; - } - } - return null; - } - function inSameTree(a, b) { - return getTreeScope(a) === getTreeScope(b); - } - var NONE = 0; - var CAPTURING_PHASE = 1; - var AT_TARGET = 2; - var BUBBLING_PHASE = 3; - var pendingError; - function dispatchOriginalEvent(originalEvent) { - if (handledEventsTable.get(originalEvent)) return; - handledEventsTable.set(originalEvent, true); - dispatchEvent(wrap(originalEvent), wrap(originalEvent.target)); - if (pendingError) { - var err = pendingError; - pendingError = null; - throw err; - } - } - function isLoadLikeEvent(event) { - switch (event.type) { - case "load": - case "beforeunload": - case "unload": - return true; - } - return false; - } - function dispatchEvent(event, originalWrapperTarget) { - if (currentlyDispatchingEvents.get(event)) throw new Error("InvalidStateError"); - currentlyDispatchingEvents.set(event, true); - scope.renderAllPending(); - var eventPath; - var overrideTarget; - var win; - if (isLoadLikeEvent(event) && !event.bubbles) { - var doc = originalWrapperTarget; - if (doc instanceof wrappers.Document && (win = doc.defaultView)) { - overrideTarget = doc; - eventPath = []; - } - } - if (!eventPath) { - if (originalWrapperTarget instanceof wrappers.Window) { - win = originalWrapperTarget; - eventPath = []; - } else { - eventPath = getEventPath(originalWrapperTarget, event); - if (!isLoadLikeEvent(event)) { - var doc = eventPath[eventPath.length - 1]; - if (doc instanceof wrappers.Document) win = doc.defaultView; - } - } - } - eventPathTable.set(event, eventPath); - if (dispatchCapturing(event, eventPath, win, overrideTarget)) { - if (dispatchAtTarget(event, eventPath, win, overrideTarget)) { - dispatchBubbling(event, eventPath, win, overrideTarget); - } - } - eventPhaseTable.set(event, NONE); - currentTargetTable.delete(event, null); - currentlyDispatchingEvents.delete(event); - return event.defaultPrevented; - } - function dispatchCapturing(event, eventPath, win, overrideTarget) { - var phase = CAPTURING_PHASE; - if (win) { - if (!invoke(win, event, phase, eventPath, overrideTarget)) return false; - } - for (var i = eventPath.length - 1; i > 0; i--) { - if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return false; - } - return true; - } - function dispatchAtTarget(event, eventPath, win, overrideTarget) { - var phase = AT_TARGET; - var currentTarget = eventPath[0] || win; - return invoke(currentTarget, event, phase, eventPath, overrideTarget); - } - function dispatchBubbling(event, eventPath, win, overrideTarget) { - var phase = BUBBLING_PHASE; - for (var i = 1; i < eventPath.length; i++) { - if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return; - } - if (win && eventPath.length > 0) { - invoke(win, event, phase, eventPath, overrideTarget); - } - } - function invoke(currentTarget, event, phase, eventPath, overrideTarget) { - var listeners = listenersTable.get(currentTarget); - if (!listeners) return true; - var target = overrideTarget || eventRetargetting(eventPath, currentTarget); - if (target === currentTarget) { - if (phase === CAPTURING_PHASE) return true; - if (phase === BUBBLING_PHASE) phase = AT_TARGET; - } else if (phase === BUBBLING_PHASE && !event.bubbles) { - return true; - } - if ("relatedTarget" in event) { - var originalEvent = unwrap(event); - var unwrappedRelatedTarget = originalEvent.relatedTarget; - if (unwrappedRelatedTarget) { - if (unwrappedRelatedTarget instanceof Object && unwrappedRelatedTarget.addEventListener) { - var relatedTarget = wrap(unwrappedRelatedTarget); - var adjusted = relatedTargetResolution(event, currentTarget, relatedTarget); - if (adjusted === target) return true; - } else { - adjusted = null; - } - relatedTargetTable.set(event, adjusted); - } - } - eventPhaseTable.set(event, phase); - var type = event.type; - var anyRemoved = false; - targetTable.set(event, target); - currentTargetTable.set(event, currentTarget); - listeners.depth++; - for (var i = 0, len = listeners.length; i < len; i++) { - var listener = listeners[i]; - if (listener.removed) { - anyRemoved = true; - continue; - } - if (listener.type !== type || !listener.capture && phase === CAPTURING_PHASE || listener.capture && phase === BUBBLING_PHASE) { - continue; - } - try { - if (typeof listener.handler === "function") listener.handler.call(currentTarget, event); else listener.handler.handleEvent(event); - if (stopImmediatePropagationTable.get(event)) return false; - } catch (ex) { - if (!pendingError) pendingError = ex; - } - } - listeners.depth--; - if (anyRemoved && listeners.depth === 0) { - var copy = listeners.slice(); - listeners.length = 0; - for (var i = 0; i < copy.length; i++) { - if (!copy[i].removed) listeners.push(copy[i]); - } - } - return !stopPropagationTable.get(event); - } - function Listener(type, handler, capture) { - this.type = type; - this.handler = handler; - this.capture = Boolean(capture); - } - Listener.prototype = { - equals: function(that) { - return this.handler === that.handler && this.type === that.type && this.capture === that.capture; - }, - get removed() { - return this.handler === null; - }, - remove: function() { - this.handler = null; - } - }; - var OriginalEvent = window.Event; - OriginalEvent.prototype.polymerBlackList_ = { - returnValue: true, - keyLocation: true - }; - function Event(type, options) { - if (type instanceof OriginalEvent) { - var impl = type; - if (!OriginalBeforeUnloadEvent && impl.type === "beforeunload" && !(this instanceof BeforeUnloadEvent)) { - return new BeforeUnloadEvent(impl); - } - setWrapper(impl, this); - } else { - return wrap(constructEvent(OriginalEvent, "Event", type, options)); - } - } - Event.prototype = { - get target() { - return targetTable.get(this); - }, - get currentTarget() { - return currentTargetTable.get(this); - }, - get eventPhase() { - return eventPhaseTable.get(this); - }, - get path() { - var eventPath = eventPathTable.get(this); - if (!eventPath) return []; - return eventPath.slice(); - }, - stopPropagation: function() { - stopPropagationTable.set(this, true); - }, - stopImmediatePropagation: function() { - stopPropagationTable.set(this, true); - stopImmediatePropagationTable.set(this, true); - } - }; - var supportsDefaultPrevented = function() { - var e = document.createEvent("Event"); - e.initEvent("test", true, true); - e.preventDefault(); - return e.defaultPrevented; - }(); - if (!supportsDefaultPrevented) { - Event.prototype.preventDefault = function() { - if (!this.cancelable) return; - unsafeUnwrap(this).preventDefault(); - Object.defineProperty(this, "defaultPrevented", { - get: function() { - return true; - }, - configurable: true - }); - }; - } - registerWrapper(OriginalEvent, Event, document.createEvent("Event")); - function unwrapOptions(options) { - if (!options || !options.relatedTarget) return options; - return Object.create(options, { - relatedTarget: { - value: unwrap(options.relatedTarget) - } - }); - } - function registerGenericEvent(name, SuperEvent, prototype) { - var OriginalEvent = window[name]; - var GenericEvent = function(type, options) { - if (type instanceof OriginalEvent) setWrapper(type, this); else return wrap(constructEvent(OriginalEvent, name, type, options)); - }; - GenericEvent.prototype = Object.create(SuperEvent.prototype); - if (prototype) mixin(GenericEvent.prototype, prototype); - if (OriginalEvent) { - try { - registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent("temp")); - } catch (ex) { - registerWrapper(OriginalEvent, GenericEvent, document.createEvent(name)); - } - } - return GenericEvent; - } - var UIEvent = registerGenericEvent("UIEvent", Event); - var CustomEvent = registerGenericEvent("CustomEvent", Event); - var relatedTargetProto = { - get relatedTarget() { - var relatedTarget = relatedTargetTable.get(this); - if (relatedTarget !== undefined) return relatedTarget; - return wrap(unwrap(this).relatedTarget); - } - }; - function getInitFunction(name, relatedTargetIndex) { - return function() { - arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]); - var impl = unwrap(this); - impl[name].apply(impl, arguments); - }; - } - var mouseEventProto = mixin({ - initMouseEvent: getInitFunction("initMouseEvent", 14) - }, relatedTargetProto); - var focusEventProto = mixin({ - initFocusEvent: getInitFunction("initFocusEvent", 5) - }, relatedTargetProto); - var MouseEvent = registerGenericEvent("MouseEvent", UIEvent, mouseEventProto); - var FocusEvent = registerGenericEvent("FocusEvent", UIEvent, focusEventProto); - var defaultInitDicts = Object.create(null); - var supportsEventConstructors = function() { - try { - new window.FocusEvent("focus"); - } catch (ex) { - return false; - } - return true; - }(); - function constructEvent(OriginalEvent, name, type, options) { - if (supportsEventConstructors) return new OriginalEvent(type, unwrapOptions(options)); - var event = unwrap(document.createEvent(name)); - var defaultDict = defaultInitDicts[name]; - var args = [ type ]; - Object.keys(defaultDict).forEach(function(key) { - var v = options != null && key in options ? options[key] : defaultDict[key]; - if (key === "relatedTarget") v = unwrap(v); - args.push(v); - }); - event["init" + name].apply(event, args); - return event; - } - if (!supportsEventConstructors) { - var configureEventConstructor = function(name, initDict, superName) { - if (superName) { - var superDict = defaultInitDicts[superName]; - initDict = mixin(mixin({}, superDict), initDict); - } - defaultInitDicts[name] = initDict; - }; - configureEventConstructor("Event", { - bubbles: false, - cancelable: false - }); - configureEventConstructor("CustomEvent", { - detail: null - }, "Event"); - configureEventConstructor("UIEvent", { - view: null, - detail: 0 - }, "Event"); - configureEventConstructor("MouseEvent", { - screenX: 0, - screenY: 0, - clientX: 0, - clientY: 0, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - button: 0, - relatedTarget: null - }, "UIEvent"); - configureEventConstructor("FocusEvent", { - relatedTarget: null - }, "UIEvent"); - } - var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent; - function BeforeUnloadEvent(impl) { - Event.call(this, impl); - } - BeforeUnloadEvent.prototype = Object.create(Event.prototype); - mixin(BeforeUnloadEvent.prototype, { - get returnValue() { - return unsafeUnwrap(this).returnValue; - }, - set returnValue(v) { - unsafeUnwrap(this).returnValue = v; - } - }); - if (OriginalBeforeUnloadEvent) registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent); - function isValidListener(fun) { - if (typeof fun === "function") return true; - return fun && fun.handleEvent; - } - function isMutationEvent(type) { - switch (type) { - case "DOMAttrModified": - case "DOMAttributeNameChanged": - case "DOMCharacterDataModified": - case "DOMElementNameChanged": - case "DOMNodeInserted": - case "DOMNodeInsertedIntoDocument": - case "DOMNodeRemoved": - case "DOMNodeRemovedFromDocument": - case "DOMSubtreeModified": - return true; - } - return false; - } - var OriginalEventTarget = window.EventTarget; - function EventTarget(impl) { - setWrapper(impl, this); - } - var methodNames = [ "addEventListener", "removeEventListener", "dispatchEvent" ]; - [ Node, Window ].forEach(function(constructor) { - var p = constructor.prototype; - methodNames.forEach(function(name) { - Object.defineProperty(p, name + "_", { - value: p[name] - }); - }); - }); - function getTargetToListenAt(wrapper) { - if (wrapper instanceof wrappers.ShadowRoot) wrapper = wrapper.host; - return unwrap(wrapper); - } - EventTarget.prototype = { - addEventListener: function(type, fun, capture) { - if (!isValidListener(fun) || isMutationEvent(type)) return; - var listener = new Listener(type, fun, capture); - var listeners = listenersTable.get(this); - if (!listeners) { - listeners = []; - listeners.depth = 0; - listenersTable.set(this, listeners); - } else { - for (var i = 0; i < listeners.length; i++) { - if (listener.equals(listeners[i])) return; - } - } - listeners.push(listener); - var target = getTargetToListenAt(this); - target.addEventListener_(type, dispatchOriginalEvent, true); - }, - removeEventListener: function(type, fun, capture) { - capture = Boolean(capture); - var listeners = listenersTable.get(this); - if (!listeners) return; - var count = 0, found = false; - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].type === type && listeners[i].capture === capture) { - count++; - if (listeners[i].handler === fun) { - found = true; - listeners[i].remove(); - } - } - } - if (found && count === 1) { - var target = getTargetToListenAt(this); - target.removeEventListener_(type, dispatchOriginalEvent, true); - } - }, - dispatchEvent: function(event) { - var nativeEvent = unwrap(event); - var eventType = nativeEvent.type; - handledEventsTable.set(nativeEvent, false); - scope.renderAllPending(); - var tempListener; - if (!hasListenerInAncestors(this, eventType)) { - tempListener = function() {}; - this.addEventListener(eventType, tempListener, true); - } - try { - return unwrap(this).dispatchEvent_(nativeEvent); - } finally { - if (tempListener) this.removeEventListener(eventType, tempListener, true); - } - } - }; - function hasListener(node, type) { - var listeners = listenersTable.get(node); - if (listeners) { - for (var i = 0; i < listeners.length; i++) { - if (!listeners[i].removed && listeners[i].type === type) return true; - } - } - return false; - } - function hasListenerInAncestors(target, type) { - for (var node = unwrap(target); node; node = node.parentNode) { - if (hasListener(wrap(node), type)) return true; - } - return false; - } - if (OriginalEventTarget) registerWrapper(OriginalEventTarget, EventTarget); - function wrapEventTargetMethods(constructors) { - forwardMethodsToWrapper(constructors, methodNames); - } - var originalElementFromPoint = document.elementFromPoint; - function elementFromPoint(self, document, x, y) { - scope.renderAllPending(); - var element = wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y)); - if (!element) return null; - var path = getEventPath(element, null); - var idx = path.lastIndexOf(self); - if (idx == -1) return null; else path = path.slice(0, idx); - return eventRetargetting(path, self); - } - function getEventHandlerGetter(name) { - return function() { - var inlineEventHandlers = eventHandlersTable.get(this); - return inlineEventHandlers && inlineEventHandlers[name] && inlineEventHandlers[name].value || null; - }; - } - function getEventHandlerSetter(name) { - var eventType = name.slice(2); - return function(value) { - var inlineEventHandlers = eventHandlersTable.get(this); - if (!inlineEventHandlers) { - inlineEventHandlers = Object.create(null); - eventHandlersTable.set(this, inlineEventHandlers); - } - var old = inlineEventHandlers[name]; - if (old) this.removeEventListener(eventType, old.wrapped, false); - if (typeof value === "function") { - var wrapped = function(e) { - var rv = value.call(this, e); - if (rv === false) e.preventDefault(); else if (name === "onbeforeunload" && typeof rv === "string") e.returnValue = rv; - }; - this.addEventListener(eventType, wrapped, false); - inlineEventHandlers[name] = { - value: value, - wrapped: wrapped - }; - } - }; - } - scope.elementFromPoint = elementFromPoint; - scope.getEventHandlerGetter = getEventHandlerGetter; - scope.getEventHandlerSetter = getEventHandlerSetter; - scope.wrapEventTargetMethods = wrapEventTargetMethods; - scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent; - scope.wrappers.CustomEvent = CustomEvent; - scope.wrappers.Event = Event; - scope.wrappers.EventTarget = EventTarget; - scope.wrappers.FocusEvent = FocusEvent; - scope.wrappers.MouseEvent = MouseEvent; - scope.wrappers.UIEvent = UIEvent; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var UIEvent = scope.wrappers.UIEvent; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrap = scope.wrap; - var OriginalTouchEvent = window.TouchEvent; - if (!OriginalTouchEvent) return; - var nativeEvent; - try { - nativeEvent = document.createEvent("TouchEvent"); - } catch (ex) { - return; - } - var nonEnumDescriptor = { - enumerable: false - }; - function nonEnum(obj, prop) { - Object.defineProperty(obj, prop, nonEnumDescriptor); - } - function Touch(impl) { - setWrapper(impl, this); - } - Touch.prototype = { - get target() { - return wrap(unsafeUnwrap(this).target); - } - }; - var descr = { - configurable: true, - enumerable: true, - get: null - }; - [ "clientX", "clientY", "screenX", "screenY", "pageX", "pageY", "identifier", "webkitRadiusX", "webkitRadiusY", "webkitRotationAngle", "webkitForce" ].forEach(function(name) { - descr.get = function() { - return unsafeUnwrap(this)[name]; - }; - Object.defineProperty(Touch.prototype, name, descr); - }); - function TouchList() { - this.length = 0; - nonEnum(this, "length"); - } - TouchList.prototype = { - item: function(index) { - return this[index]; - } - }; - function wrapTouchList(nativeTouchList) { - var list = new TouchList(); - for (var i = 0; i < nativeTouchList.length; i++) { - list[i] = new Touch(nativeTouchList[i]); - } - list.length = i; - return list; - } - function TouchEvent(impl) { - UIEvent.call(this, impl); - } - TouchEvent.prototype = Object.create(UIEvent.prototype); - mixin(TouchEvent.prototype, { - get touches() { - return wrapTouchList(unsafeUnwrap(this).touches); - }, - get targetTouches() { - return wrapTouchList(unsafeUnwrap(this).targetTouches); - }, - get changedTouches() { - return wrapTouchList(unsafeUnwrap(this).changedTouches); - }, - initTouchEvent: function() { - throw new Error("Not implemented"); - } - }); - registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent); - scope.wrappers.Touch = Touch; - scope.wrappers.TouchEvent = TouchEvent; - scope.wrappers.TouchList = TouchList; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrap = scope.wrap; - var nonEnumDescriptor = { - enumerable: false - }; - function nonEnum(obj, prop) { - Object.defineProperty(obj, prop, nonEnumDescriptor); - } - function NodeList() { - this.length = 0; - nonEnum(this, "length"); - } - NodeList.prototype = { - item: function(index) { - return this[index]; - } - }; - nonEnum(NodeList.prototype, "item"); - function wrapNodeList(list) { - if (list == null) return list; - var wrapperList = new NodeList(); - for (var i = 0, length = list.length; i < length; i++) { - wrapperList[i] = wrap(list[i]); - } - wrapperList.length = length; - return wrapperList; - } - function addWrapNodeListMethod(wrapperConstructor, name) { - wrapperConstructor.prototype[name] = function() { - return wrapNodeList(unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments)); - }; - } - scope.wrappers.NodeList = NodeList; - scope.addWrapNodeListMethod = addWrapNodeListMethod; - scope.wrapNodeList = wrapNodeList; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - scope.wrapHTMLCollection = scope.wrapNodeList; - scope.wrappers.HTMLCollection = scope.wrappers.NodeList; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var EventTarget = scope.wrappers.EventTarget; - var NodeList = scope.wrappers.NodeList; - var TreeScope = scope.TreeScope; - var assert = scope.assert; - var defineWrapGetter = scope.defineWrapGetter; - var enqueueMutation = scope.enqueueMutation; - var getTreeScope = scope.getTreeScope; - var isWrapper = scope.isWrapper; - var mixin = scope.mixin; - var registerTransientObservers = scope.registerTransientObservers; - var registerWrapper = scope.registerWrapper; - var setTreeScope = scope.setTreeScope; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var wrapIfNeeded = scope.wrapIfNeeded; - var wrappers = scope.wrappers; - function assertIsNodeWrapper(node) { - assert(node instanceof Node); - } - function createOneElementNodeList(node) { - var nodes = new NodeList(); - nodes[0] = node; - nodes.length = 1; - return nodes; - } - var surpressMutations = false; - function enqueueRemovalForInsertedNodes(node, parent, nodes) { - enqueueMutation(parent, "childList", { - removedNodes: nodes, - previousSibling: node.previousSibling, - nextSibling: node.nextSibling - }); - } - function enqueueRemovalForInsertedDocumentFragment(df, nodes) { - enqueueMutation(df, "childList", { - removedNodes: nodes - }); - } - function collectNodes(node, parentNode, previousNode, nextNode) { - if (node instanceof DocumentFragment) { - var nodes = collectNodesForDocumentFragment(node); - surpressMutations = true; - for (var i = nodes.length - 1; i >= 0; i--) { - node.removeChild(nodes[i]); - nodes[i].parentNode_ = parentNode; - } - surpressMutations = false; - for (var i = 0; i < nodes.length; i++) { - nodes[i].previousSibling_ = nodes[i - 1] || previousNode; - nodes[i].nextSibling_ = nodes[i + 1] || nextNode; - } - if (previousNode) previousNode.nextSibling_ = nodes[0]; - if (nextNode) nextNode.previousSibling_ = nodes[nodes.length - 1]; - return nodes; - } - var nodes = createOneElementNodeList(node); - var oldParent = node.parentNode; - if (oldParent) { - oldParent.removeChild(node); - } - node.parentNode_ = parentNode; - node.previousSibling_ = previousNode; - node.nextSibling_ = nextNode; - if (previousNode) previousNode.nextSibling_ = node; - if (nextNode) nextNode.previousSibling_ = node; - return nodes; - } - function collectNodesNative(node) { - if (node instanceof DocumentFragment) return collectNodesForDocumentFragment(node); - var nodes = createOneElementNodeList(node); - var oldParent = node.parentNode; - if (oldParent) enqueueRemovalForInsertedNodes(node, oldParent, nodes); - return nodes; - } - function collectNodesForDocumentFragment(node) { - var nodes = new NodeList(); - var i = 0; - for (var child = node.firstChild; child; child = child.nextSibling) { - nodes[i++] = child; - } - nodes.length = i; - enqueueRemovalForInsertedDocumentFragment(node, nodes); - return nodes; - } - function snapshotNodeList(nodeList) { - return nodeList; - } - function nodeWasAdded(node, treeScope) { - setTreeScope(node, treeScope); - node.nodeIsInserted_(); - } - function nodesWereAdded(nodes, parent) { - var treeScope = getTreeScope(parent); - for (var i = 0; i < nodes.length; i++) { - nodeWasAdded(nodes[i], treeScope); - } - } - function nodeWasRemoved(node) { - setTreeScope(node, new TreeScope(node, null)); - } - function nodesWereRemoved(nodes) { - for (var i = 0; i < nodes.length; i++) { - nodeWasRemoved(nodes[i]); - } - } - function ensureSameOwnerDocument(parent, child) { - var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ? parent : parent.ownerDocument; - if (ownerDoc !== child.ownerDocument) ownerDoc.adoptNode(child); - } - function adoptNodesIfNeeded(owner, nodes) { - if (!nodes.length) return; - var ownerDoc = owner.ownerDocument; - if (ownerDoc === nodes[0].ownerDocument) return; - for (var i = 0; i < nodes.length; i++) { - scope.adoptNodeNoRemove(nodes[i], ownerDoc); - } - } - function unwrapNodesForInsertion(owner, nodes) { - adoptNodesIfNeeded(owner, nodes); - var length = nodes.length; - if (length === 1) return unwrap(nodes[0]); - var df = unwrap(owner.ownerDocument.createDocumentFragment()); - for (var i = 0; i < length; i++) { - df.appendChild(unwrap(nodes[i])); - } - return df; - } - function clearChildNodes(wrapper) { - if (wrapper.firstChild_ !== undefined) { - var child = wrapper.firstChild_; - while (child) { - var tmp = child; - child = child.nextSibling_; - tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined; - } - } - wrapper.firstChild_ = wrapper.lastChild_ = undefined; - } - function removeAllChildNodes(wrapper) { - if (wrapper.invalidateShadowRenderer()) { - var childWrapper = wrapper.firstChild; - while (childWrapper) { - assert(childWrapper.parentNode === wrapper); - var nextSibling = childWrapper.nextSibling; - var childNode = unwrap(childWrapper); - var parentNode = childNode.parentNode; - if (parentNode) originalRemoveChild.call(parentNode, childNode); - childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = null; - childWrapper = nextSibling; - } - wrapper.firstChild_ = wrapper.lastChild_ = null; - } else { - var node = unwrap(wrapper); - var child = node.firstChild; - var nextSibling; - while (child) { - nextSibling = child.nextSibling; - originalRemoveChild.call(node, child); - child = nextSibling; - } - } - } - function invalidateParent(node) { - var p = node.parentNode; - return p && p.invalidateShadowRenderer(); - } - function cleanupNodes(nodes) { - for (var i = 0, n; i < nodes.length; i++) { - n = nodes[i]; - n.parentNode.removeChild(n); - } - } - var originalImportNode = document.importNode; - var originalCloneNode = window.Node.prototype.cloneNode; - function cloneNode(node, deep, opt_doc) { - var clone; - if (opt_doc) clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false)); else clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false)); - if (deep) { - for (var child = node.firstChild; child; child = child.nextSibling) { - clone.appendChild(cloneNode(child, true, opt_doc)); - } - if (node instanceof wrappers.HTMLTemplateElement) { - var cloneContent = clone.content; - for (var child = node.content.firstChild; child; child = child.nextSibling) { - cloneContent.appendChild(cloneNode(child, true, opt_doc)); - } - } - } - return clone; - } - function contains(self, child) { - if (!child || getTreeScope(self) !== getTreeScope(child)) return false; - for (var node = child; node; node = node.parentNode) { - if (node === self) return true; - } - return false; - } - var OriginalNode = window.Node; - function Node(original) { - assert(original instanceof OriginalNode); - EventTarget.call(this, original); - this.parentNode_ = undefined; - this.firstChild_ = undefined; - this.lastChild_ = undefined; - this.nextSibling_ = undefined; - this.previousSibling_ = undefined; - this.treeScope_ = undefined; - } - var OriginalDocumentFragment = window.DocumentFragment; - var originalAppendChild = OriginalNode.prototype.appendChild; - var originalCompareDocumentPosition = OriginalNode.prototype.compareDocumentPosition; - var originalIsEqualNode = OriginalNode.prototype.isEqualNode; - var originalInsertBefore = OriginalNode.prototype.insertBefore; - var originalRemoveChild = OriginalNode.prototype.removeChild; - var originalReplaceChild = OriginalNode.prototype.replaceChild; - var isIEOrEdge = /Trident|Edge/.test(navigator.userAgent); - var removeChildOriginalHelper = isIEOrEdge ? function(parent, child) { - try { - originalRemoveChild.call(parent, child); - } catch (ex) { - if (!(parent instanceof OriginalDocumentFragment)) throw ex; - } - } : function(parent, child) { - originalRemoveChild.call(parent, child); - }; - Node.prototype = Object.create(EventTarget.prototype); - mixin(Node.prototype, { - appendChild: function(childWrapper) { - return this.insertBefore(childWrapper, null); - }, - insertBefore: function(childWrapper, refWrapper) { - assertIsNodeWrapper(childWrapper); - var refNode; - if (refWrapper) { - if (isWrapper(refWrapper)) { - refNode = unwrap(refWrapper); - } else { - refNode = refWrapper; - refWrapper = wrap(refNode); - } - } else { - refWrapper = null; - refNode = null; - } - refWrapper && assert(refWrapper.parentNode === this); - var nodes; - var previousNode = refWrapper ? refWrapper.previousSibling : this.lastChild; - var useNative = !this.invalidateShadowRenderer() && !invalidateParent(childWrapper); - if (useNative) nodes = collectNodesNative(childWrapper); else nodes = collectNodes(childWrapper, this, previousNode, refWrapper); - if (useNative) { - ensureSameOwnerDocument(this, childWrapper); - clearChildNodes(this); - originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode); - } else { - if (!previousNode) this.firstChild_ = nodes[0]; - if (!refWrapper) { - this.lastChild_ = nodes[nodes.length - 1]; - if (this.firstChild_ === undefined) this.firstChild_ = this.firstChild; - } - var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this); - if (parentNode) { - originalInsertBefore.call(parentNode, unwrapNodesForInsertion(this, nodes), refNode); - } else { - adoptNodesIfNeeded(this, nodes); - } - } - enqueueMutation(this, "childList", { - addedNodes: nodes, - nextSibling: refWrapper, - previousSibling: previousNode - }); - nodesWereAdded(nodes, this); - return childWrapper; - }, - removeChild: function(childWrapper) { - assertIsNodeWrapper(childWrapper); - if (childWrapper.parentNode !== this) { - var found = false; - var childNodes = this.childNodes; - for (var ieChild = this.firstChild; ieChild; ieChild = ieChild.nextSibling) { - if (ieChild === childWrapper) { - found = true; - break; - } - } - if (!found) { - throw new Error("NotFoundError"); - } - } - var childNode = unwrap(childWrapper); - var childWrapperNextSibling = childWrapper.nextSibling; - var childWrapperPreviousSibling = childWrapper.previousSibling; - if (this.invalidateShadowRenderer()) { - var thisFirstChild = this.firstChild; - var thisLastChild = this.lastChild; - var parentNode = childNode.parentNode; - if (parentNode) removeChildOriginalHelper(parentNode, childNode); - if (thisFirstChild === childWrapper) this.firstChild_ = childWrapperNextSibling; - if (thisLastChild === childWrapper) this.lastChild_ = childWrapperPreviousSibling; - if (childWrapperPreviousSibling) childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling; - if (childWrapperNextSibling) { - childWrapperNextSibling.previousSibling_ = childWrapperPreviousSibling; - } - childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = undefined; - } else { - clearChildNodes(this); - removeChildOriginalHelper(unsafeUnwrap(this), childNode); - } - if (!surpressMutations) { - enqueueMutation(this, "childList", { - removedNodes: createOneElementNodeList(childWrapper), - nextSibling: childWrapperNextSibling, - previousSibling: childWrapperPreviousSibling - }); - } - registerTransientObservers(this, childWrapper); - return childWrapper; - }, - replaceChild: function(newChildWrapper, oldChildWrapper) { - assertIsNodeWrapper(newChildWrapper); - var oldChildNode; - if (isWrapper(oldChildWrapper)) { - oldChildNode = unwrap(oldChildWrapper); - } else { - oldChildNode = oldChildWrapper; - oldChildWrapper = wrap(oldChildNode); - } - if (oldChildWrapper.parentNode !== this) { - throw new Error("NotFoundError"); - } - var nextNode = oldChildWrapper.nextSibling; - var previousNode = oldChildWrapper.previousSibling; - var nodes; - var useNative = !this.invalidateShadowRenderer() && !invalidateParent(newChildWrapper); - if (useNative) { - nodes = collectNodesNative(newChildWrapper); - } else { - if (nextNode === newChildWrapper) nextNode = newChildWrapper.nextSibling; - nodes = collectNodes(newChildWrapper, this, previousNode, nextNode); - } - if (!useNative) { - if (this.firstChild === oldChildWrapper) this.firstChild_ = nodes[0]; - if (this.lastChild === oldChildWrapper) this.lastChild_ = nodes[nodes.length - 1]; - oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ = oldChildWrapper.parentNode_ = undefined; - if (oldChildNode.parentNode) { - originalReplaceChild.call(oldChildNode.parentNode, unwrapNodesForInsertion(this, nodes), oldChildNode); - } - } else { - ensureSameOwnerDocument(this, newChildWrapper); - clearChildNodes(this); - originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper), oldChildNode); - } - enqueueMutation(this, "childList", { - addedNodes: nodes, - removedNodes: createOneElementNodeList(oldChildWrapper), - nextSibling: nextNode, - previousSibling: previousNode - }); - nodeWasRemoved(oldChildWrapper); - nodesWereAdded(nodes, this); - return oldChildWrapper; - }, - nodeIsInserted_: function() { - for (var child = this.firstChild; child; child = child.nextSibling) { - child.nodeIsInserted_(); - } - }, - hasChildNodes: function() { - return this.firstChild !== null; - }, - get parentNode() { - return this.parentNode_ !== undefined ? this.parentNode_ : wrap(unsafeUnwrap(this).parentNode); - }, - get firstChild() { - return this.firstChild_ !== undefined ? this.firstChild_ : wrap(unsafeUnwrap(this).firstChild); - }, - get lastChild() { - return this.lastChild_ !== undefined ? this.lastChild_ : wrap(unsafeUnwrap(this).lastChild); - }, - get nextSibling() { - return this.nextSibling_ !== undefined ? this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling); - }, - get previousSibling() { - return this.previousSibling_ !== undefined ? this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling); - }, - get parentElement() { - var p = this.parentNode; - while (p && p.nodeType !== Node.ELEMENT_NODE) { - p = p.parentNode; - } - return p; - }, - get textContent() { - var s = ""; - for (var child = this.firstChild; child; child = child.nextSibling) { - if (child.nodeType != Node.COMMENT_NODE) { - s += child.textContent; - } - } - return s; - }, - set textContent(textContent) { - if (textContent == null) textContent = ""; - var removedNodes = snapshotNodeList(this.childNodes); - if (this.invalidateShadowRenderer()) { - removeAllChildNodes(this); - if (textContent !== "") { - var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent); - this.appendChild(textNode); - } - } else { - clearChildNodes(this); - unsafeUnwrap(this).textContent = textContent; - } - var addedNodes = snapshotNodeList(this.childNodes); - enqueueMutation(this, "childList", { - addedNodes: addedNodes, - removedNodes: removedNodes - }); - nodesWereRemoved(removedNodes); - nodesWereAdded(addedNodes, this); - }, - get childNodes() { - var wrapperList = new NodeList(); - var i = 0; - for (var child = this.firstChild; child; child = child.nextSibling) { - wrapperList[i++] = child; - } - wrapperList.length = i; - return wrapperList; - }, - cloneNode: function(deep) { - return cloneNode(this, deep); - }, - contains: function(child) { - return contains(this, wrapIfNeeded(child)); - }, - compareDocumentPosition: function(otherNode) { - return originalCompareDocumentPosition.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode)); - }, - isEqualNode: function(otherNode) { - return originalIsEqualNode.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode)); - }, - normalize: function() { - var nodes = snapshotNodeList(this.childNodes); - var remNodes = []; - var s = ""; - var modNode; - for (var i = 0, n; i < nodes.length; i++) { - n = nodes[i]; - if (n.nodeType === Node.TEXT_NODE) { - if (!modNode && !n.data.length) this.removeChild(n); else if (!modNode) modNode = n; else { - s += n.data; - remNodes.push(n); - } - } else { - if (modNode && remNodes.length) { - modNode.data += s; - cleanupNodes(remNodes); - } - remNodes = []; - s = ""; - modNode = null; - if (n.childNodes.length) n.normalize(); - } - } - if (modNode && remNodes.length) { - modNode.data += s; - cleanupNodes(remNodes); - } - } - }); - defineWrapGetter(Node, "ownerDocument"); - registerWrapper(OriginalNode, Node, document.createDocumentFragment()); - delete Node.prototype.querySelector; - delete Node.prototype.querySelectorAll; - Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype); - scope.cloneNode = cloneNode; - scope.nodeWasAdded = nodeWasAdded; - scope.nodeWasRemoved = nodeWasRemoved; - scope.nodesWereAdded = nodesWereAdded; - scope.nodesWereRemoved = nodesWereRemoved; - scope.originalInsertBefore = originalInsertBefore; - scope.originalRemoveChild = originalRemoveChild; - scope.snapshotNodeList = snapshotNodeList; - scope.wrappers.Node = Node; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLCollection = scope.wrappers.HTMLCollection; - var NodeList = scope.wrappers.NodeList; - var getTreeScope = scope.getTreeScope; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrap = scope.wrap; - var originalDocumentQuerySelector = document.querySelector; - var originalElementQuerySelector = document.documentElement.querySelector; - var originalDocumentQuerySelectorAll = document.querySelectorAll; - var originalElementQuerySelectorAll = document.documentElement.querySelectorAll; - var originalDocumentGetElementsByTagName = document.getElementsByTagName; - var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName; - var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS; - var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS; - var OriginalElement = window.Element; - var OriginalDocument = window.HTMLDocument || window.Document; - function filterNodeList(list, index, result, deep) { - var wrappedItem = null; - var root = null; - for (var i = 0, length = list.length; i < length; i++) { - wrappedItem = wrap(list[i]); - if (!deep && (root = getTreeScope(wrappedItem).root)) { - if (root instanceof scope.wrappers.ShadowRoot) { - continue; - } - } - result[index++] = wrappedItem; - } - return index; - } - function shimSelector(selector) { - return String(selector).replace(/\/deep\/|::shadow|>>>/g, " "); - } - function shimMatchesSelector(selector) { - return String(selector).replace(/:host\(([^\s]+)\)/g, "$1").replace(/([^\s]):host/g, "$1").replace(":host", "*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g, " "); - } - function findOne(node, selector) { - var m, el = node.firstElementChild; - while (el) { - if (el.matches(selector)) return el; - m = findOne(el, selector); - if (m) return m; - el = el.nextElementSibling; - } - return null; - } - function matchesSelector(el, selector) { - return el.matches(selector); - } - var XHTML_NS = "http://www.w3.org/1999/xhtml"; - function matchesTagName(el, localName, localNameLowerCase) { - var ln = el.localName; - return ln === localName || ln === localNameLowerCase && el.namespaceURI === XHTML_NS; - } - function matchesEveryThing() { - return true; - } - function matchesLocalNameOnly(el, ns, localName) { - return el.localName === localName; - } - function matchesNameSpace(el, ns) { - return el.namespaceURI === ns; - } - function matchesLocalNameNS(el, ns, localName) { - return el.namespaceURI === ns && el.localName === localName; - } - function findElements(node, index, result, p, arg0, arg1) { - var el = node.firstElementChild; - while (el) { - if (p(el, arg0, arg1)) result[index++] = el; - index = findElements(el, index, result, p, arg0, arg1); - el = el.nextElementSibling; - } - return index; - } - function querySelectorAllFiltered(p, index, result, selector, deep) { - var target = unsafeUnwrap(this); - var list; - var root = getTreeScope(this).root; - if (root instanceof scope.wrappers.ShadowRoot) { - return findElements(this, index, result, p, selector, null); - } else if (target instanceof OriginalElement) { - list = originalElementQuerySelectorAll.call(target, selector); - } else if (target instanceof OriginalDocument) { - list = originalDocumentQuerySelectorAll.call(target, selector); - } else { - return findElements(this, index, result, p, selector, null); - } - return filterNodeList(list, index, result, deep); - } - var SelectorsInterface = { - querySelector: function(selector) { - var shimmed = shimSelector(selector); - var deep = shimmed !== selector; - selector = shimmed; - var target = unsafeUnwrap(this); - var wrappedItem; - var root = getTreeScope(this).root; - if (root instanceof scope.wrappers.ShadowRoot) { - return findOne(this, selector); - } else if (target instanceof OriginalElement) { - wrappedItem = wrap(originalElementQuerySelector.call(target, selector)); - } else if (target instanceof OriginalDocument) { - wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector)); - } else { - return findOne(this, selector); - } - if (!wrappedItem) { - return wrappedItem; - } else if (!deep && (root = getTreeScope(wrappedItem).root)) { - if (root instanceof scope.wrappers.ShadowRoot) { - return findOne(this, selector); - } - } - return wrappedItem; - }, - querySelectorAll: function(selector) { - var shimmed = shimSelector(selector); - var deep = shimmed !== selector; - selector = shimmed; - var result = new NodeList(); - result.length = querySelectorAllFiltered.call(this, matchesSelector, 0, result, selector, deep); - return result; - } - }; - var MatchesInterface = { - matches: function(selector) { - selector = shimMatchesSelector(selector); - return scope.originalMatches.call(unsafeUnwrap(this), selector); - } - }; - function getElementsByTagNameFiltered(p, index, result, localName, lowercase) { - var target = unsafeUnwrap(this); - var list; - var root = getTreeScope(this).root; - if (root instanceof scope.wrappers.ShadowRoot) { - return findElements(this, index, result, p, localName, lowercase); - } else if (target instanceof OriginalElement) { - list = originalElementGetElementsByTagName.call(target, localName, lowercase); - } else if (target instanceof OriginalDocument) { - list = originalDocumentGetElementsByTagName.call(target, localName, lowercase); - } else { - return findElements(this, index, result, p, localName, lowercase); - } - return filterNodeList(list, index, result, false); - } - function getElementsByTagNameNSFiltered(p, index, result, ns, localName) { - var target = unsafeUnwrap(this); - var list; - var root = getTreeScope(this).root; - if (root instanceof scope.wrappers.ShadowRoot) { - return findElements(this, index, result, p, ns, localName); - } else if (target instanceof OriginalElement) { - list = originalElementGetElementsByTagNameNS.call(target, ns, localName); - } else if (target instanceof OriginalDocument) { - list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName); - } else { - return findElements(this, index, result, p, ns, localName); - } - return filterNodeList(list, index, result, false); - } - var GetElementsByInterface = { - getElementsByTagName: function(localName) { - var result = new HTMLCollection(); - var match = localName === "*" ? matchesEveryThing : matchesTagName; - result.length = getElementsByTagNameFiltered.call(this, match, 0, result, localName, localName.toLowerCase()); - return result; - }, - getElementsByClassName: function(className) { - return this.querySelectorAll("." + className); - }, - getElementsByTagNameNS: function(ns, localName) { - var result = new HTMLCollection(); - var match = null; - if (ns === "*") { - match = localName === "*" ? matchesEveryThing : matchesLocalNameOnly; - } else { - match = localName === "*" ? matchesNameSpace : matchesLocalNameNS; - } - result.length = getElementsByTagNameNSFiltered.call(this, match, 0, result, ns || null, localName); - return result; - } - }; - scope.GetElementsByInterface = GetElementsByInterface; - scope.SelectorsInterface = SelectorsInterface; - scope.MatchesInterface = MatchesInterface; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var NodeList = scope.wrappers.NodeList; - function forwardElement(node) { - while (node && node.nodeType !== Node.ELEMENT_NODE) { - node = node.nextSibling; - } - return node; - } - function backwardsElement(node) { - while (node && node.nodeType !== Node.ELEMENT_NODE) { - node = node.previousSibling; - } - return node; - } - var ParentNodeInterface = { - get firstElementChild() { - return forwardElement(this.firstChild); - }, - get lastElementChild() { - return backwardsElement(this.lastChild); - }, - get childElementCount() { - var count = 0; - for (var child = this.firstElementChild; child; child = child.nextElementSibling) { - count++; - } - return count; - }, - get children() { - var wrapperList = new NodeList(); - var i = 0; - for (var child = this.firstElementChild; child; child = child.nextElementSibling) { - wrapperList[i++] = child; - } - wrapperList.length = i; - return wrapperList; - }, - remove: function() { - var p = this.parentNode; - if (p) p.removeChild(this); - } - }; - var ChildNodeInterface = { - get nextElementSibling() { - return forwardElement(this.nextSibling); - }, - get previousElementSibling() { - return backwardsElement(this.previousSibling); - } - }; - var NonElementParentNodeInterface = { - getElementById: function(id) { - if (/[ \t\n\r\f]/.test(id)) return null; - return this.querySelector('[id="' + id + '"]'); - } - }; - scope.ChildNodeInterface = ChildNodeInterface; - scope.NonElementParentNodeInterface = NonElementParentNodeInterface; - scope.ParentNodeInterface = ParentNodeInterface; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var ChildNodeInterface = scope.ChildNodeInterface; - var Node = scope.wrappers.Node; - var enqueueMutation = scope.enqueueMutation; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var OriginalCharacterData = window.CharacterData; - function CharacterData(node) { - Node.call(this, node); - } - CharacterData.prototype = Object.create(Node.prototype); - mixin(CharacterData.prototype, { - get nodeValue() { - return this.data; - }, - set nodeValue(data) { - this.data = data; - }, - get textContent() { - return this.data; - }, - set textContent(value) { - this.data = value; - }, - get data() { - return unsafeUnwrap(this).data; - }, - set data(value) { - var oldValue = unsafeUnwrap(this).data; - enqueueMutation(this, "characterData", { - oldValue: oldValue - }); - unsafeUnwrap(this).data = value; - } - }); - mixin(CharacterData.prototype, ChildNodeInterface); - registerWrapper(OriginalCharacterData, CharacterData, document.createTextNode("")); - scope.wrappers.CharacterData = CharacterData; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var CharacterData = scope.wrappers.CharacterData; - var enqueueMutation = scope.enqueueMutation; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - function toUInt32(x) { - return x >>> 0; - } - var OriginalText = window.Text; - function Text(node) { - CharacterData.call(this, node); - } - Text.prototype = Object.create(CharacterData.prototype); - mixin(Text.prototype, { - splitText: function(offset) { - offset = toUInt32(offset); - var s = this.data; - if (offset > s.length) throw new Error("IndexSizeError"); - var head = s.slice(0, offset); - var tail = s.slice(offset); - this.data = head; - var newTextNode = this.ownerDocument.createTextNode(tail); - if (this.parentNode) this.parentNode.insertBefore(newTextNode, this.nextSibling); - return newTextNode; - } - }); - registerWrapper(OriginalText, Text, document.createTextNode("")); - scope.wrappers.Text = Text; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - if (!window.DOMTokenList) { - console.warn("Missing DOMTokenList prototype, please include a " + "compatible classList polyfill such as http://goo.gl/uTcepH."); - return; - } - var unsafeUnwrap = scope.unsafeUnwrap; - var enqueueMutation = scope.enqueueMutation; - function getClass(el) { - return unsafeUnwrap(el).getAttribute("class"); - } - function enqueueClassAttributeChange(el, oldValue) { - enqueueMutation(el, "attributes", { - name: "class", - namespace: null, - oldValue: oldValue - }); - } - function invalidateClass(el) { - scope.invalidateRendererBasedOnAttribute(el, "class"); - } - function changeClass(tokenList, method, args) { - var ownerElement = tokenList.ownerElement_; - if (ownerElement == null) { - return method.apply(tokenList, args); - } - var oldValue = getClass(ownerElement); - var retv = method.apply(tokenList, args); - if (getClass(ownerElement) !== oldValue) { - enqueueClassAttributeChange(ownerElement, oldValue); - invalidateClass(ownerElement); - } - return retv; - } - var oldAdd = DOMTokenList.prototype.add; - DOMTokenList.prototype.add = function() { - changeClass(this, oldAdd, arguments); - }; - var oldRemove = DOMTokenList.prototype.remove; - DOMTokenList.prototype.remove = function() { - changeClass(this, oldRemove, arguments); - }; - var oldToggle = DOMTokenList.prototype.toggle; - DOMTokenList.prototype.toggle = function() { - return changeClass(this, oldToggle, arguments); - }; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var ChildNodeInterface = scope.ChildNodeInterface; - var GetElementsByInterface = scope.GetElementsByInterface; - var Node = scope.wrappers.Node; - var ParentNodeInterface = scope.ParentNodeInterface; - var SelectorsInterface = scope.SelectorsInterface; - var MatchesInterface = scope.MatchesInterface; - var addWrapNodeListMethod = scope.addWrapNodeListMethod; - var enqueueMutation = scope.enqueueMutation; - var mixin = scope.mixin; - var oneOf = scope.oneOf; - var registerWrapper = scope.registerWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrappers = scope.wrappers; - var OriginalElement = window.Element; - var matchesNames = [ "matches", "mozMatchesSelector", "msMatchesSelector", "webkitMatchesSelector" ].filter(function(name) { - return OriginalElement.prototype[name]; - }); - var matchesName = matchesNames[0]; - var originalMatches = OriginalElement.prototype[matchesName]; - function invalidateRendererBasedOnAttribute(element, name) { - var p = element.parentNode; - if (!p || !p.shadowRoot) return; - var renderer = scope.getRendererForHost(p); - if (renderer.dependsOnAttribute(name)) renderer.invalidate(); - } - function enqueAttributeChange(element, name, oldValue) { - enqueueMutation(element, "attributes", { - name: name, - namespace: null, - oldValue: oldValue - }); - } - var classListTable = new WeakMap(); - function Element(node) { - Node.call(this, node); - } - Element.prototype = Object.create(Node.prototype); - mixin(Element.prototype, { - createShadowRoot: function() { - var newShadowRoot = new wrappers.ShadowRoot(this); - unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot; - var renderer = scope.getRendererForHost(this); - renderer.invalidate(); - return newShadowRoot; - }, - get shadowRoot() { - return unsafeUnwrap(this).polymerShadowRoot_ || null; - }, - setAttribute: function(name, value) { - var oldValue = unsafeUnwrap(this).getAttribute(name); - unsafeUnwrap(this).setAttribute(name, value); - enqueAttributeChange(this, name, oldValue); - invalidateRendererBasedOnAttribute(this, name); - }, - removeAttribute: function(name) { - var oldValue = unsafeUnwrap(this).getAttribute(name); - unsafeUnwrap(this).removeAttribute(name); - enqueAttributeChange(this, name, oldValue); - invalidateRendererBasedOnAttribute(this, name); - }, - get classList() { - var list = classListTable.get(this); - if (!list) { - list = unsafeUnwrap(this).classList; - if (!list) return; - list.ownerElement_ = this; - classListTable.set(this, list); - } - return list; - }, - get className() { - return unsafeUnwrap(this).className; - }, - set className(v) { - this.setAttribute("class", v); - }, - get id() { - return unsafeUnwrap(this).id; - }, - set id(v) { - this.setAttribute("id", v); - } - }); - matchesNames.forEach(function(name) { - if (name !== "matches") { - Element.prototype[name] = function(selector) { - return this.matches(selector); - }; - } - }); - if (OriginalElement.prototype.webkitCreateShadowRoot) { - Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot; - } - mixin(Element.prototype, ChildNodeInterface); - mixin(Element.prototype, GetElementsByInterface); - mixin(Element.prototype, ParentNodeInterface); - mixin(Element.prototype, SelectorsInterface); - mixin(Element.prototype, MatchesInterface); - registerWrapper(OriginalElement, Element, document.createElementNS(null, "x")); - scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute; - scope.matchesNames = matchesNames; - scope.originalMatches = originalMatches; - scope.wrappers.Element = Element; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var Element = scope.wrappers.Element; - var defineGetter = scope.defineGetter; - var enqueueMutation = scope.enqueueMutation; - var mixin = scope.mixin; - var nodesWereAdded = scope.nodesWereAdded; - var nodesWereRemoved = scope.nodesWereRemoved; - var registerWrapper = scope.registerWrapper; - var snapshotNodeList = scope.snapshotNodeList; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var wrappers = scope.wrappers; - var escapeAttrRegExp = /[&\u00A0"]/g; - var escapeDataRegExp = /[&\u00A0<>]/g; - function escapeReplace(c) { - switch (c) { - case "&": - return "&"; - - case "<": - return "<"; - - case ">": - return ">"; - - case '"': - return """; - - case " ": - return " "; - } - } - function escapeAttr(s) { - return s.replace(escapeAttrRegExp, escapeReplace); - } - function escapeData(s) { - return s.replace(escapeDataRegExp, escapeReplace); - } - function makeSet(arr) { - var set = {}; - for (var i = 0; i < arr.length; i++) { - set[arr[i]] = true; - } - return set; - } - var voidElements = makeSet([ "area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr" ]); - var plaintextParents = makeSet([ "style", "script", "xmp", "iframe", "noembed", "noframes", "plaintext", "noscript" ]); - var XHTML_NS = "http://www.w3.org/1999/xhtml"; - function needsSelfClosingSlash(node) { - if (node.namespaceURI !== XHTML_NS) return true; - var doctype = node.ownerDocument.doctype; - return doctype && doctype.publicId && doctype.systemId; - } - function getOuterHTML(node, parentNode) { - switch (node.nodeType) { - case Node.ELEMENT_NODE: - var tagName = node.tagName.toLowerCase(); - var s = "<" + tagName; - var attrs = node.attributes; - for (var i = 0, attr; attr = attrs[i]; i++) { - s += " " + attr.name + '="' + escapeAttr(attr.value) + '"'; - } - if (voidElements[tagName]) { - if (needsSelfClosingSlash(node)) s += "/"; - return s + ">"; - } - return s + ">" + getInnerHTML(node) + ""; - - case Node.TEXT_NODE: - var data = node.data; - if (parentNode && plaintextParents[parentNode.localName]) return data; - return escapeData(data); - - case Node.COMMENT_NODE: - return ""; - - default: - console.error(node); - throw new Error("not implemented"); - } - } - function getInnerHTML(node) { - if (node instanceof wrappers.HTMLTemplateElement) node = node.content; - var s = ""; - for (var child = node.firstChild; child; child = child.nextSibling) { - s += getOuterHTML(child, node); - } - return s; - } - function setInnerHTML(node, value, opt_tagName) { - var tagName = opt_tagName || "div"; - node.textContent = ""; - var tempElement = unwrap(node.ownerDocument.createElement(tagName)); - tempElement.innerHTML = value; - var firstChild; - while (firstChild = tempElement.firstChild) { - node.appendChild(wrap(firstChild)); - } - } - var oldIe = /MSIE/.test(navigator.userAgent); - var OriginalHTMLElement = window.HTMLElement; - var OriginalHTMLTemplateElement = window.HTMLTemplateElement; - function HTMLElement(node) { - Element.call(this, node); - } - HTMLElement.prototype = Object.create(Element.prototype); - mixin(HTMLElement.prototype, { - get innerHTML() { - return getInnerHTML(this); - }, - set innerHTML(value) { - if (oldIe && plaintextParents[this.localName]) { - this.textContent = value; - return; - } - var removedNodes = snapshotNodeList(this.childNodes); - if (this.invalidateShadowRenderer()) { - if (this instanceof wrappers.HTMLTemplateElement) setInnerHTML(this.content, value); else setInnerHTML(this, value, this.tagName); - } else if (!OriginalHTMLTemplateElement && this instanceof wrappers.HTMLTemplateElement) { - setInnerHTML(this.content, value); - } else { - unsafeUnwrap(this).innerHTML = value; - } - var addedNodes = snapshotNodeList(this.childNodes); - enqueueMutation(this, "childList", { - addedNodes: addedNodes, - removedNodes: removedNodes - }); - nodesWereRemoved(removedNodes); - nodesWereAdded(addedNodes, this); - }, - get outerHTML() { - return getOuterHTML(this, this.parentNode); - }, - set outerHTML(value) { - var p = this.parentNode; - if (p) { - p.invalidateShadowRenderer(); - var df = frag(p, value); - p.replaceChild(df, this); - } - }, - insertAdjacentHTML: function(position, text) { - var contextElement, refNode; - switch (String(position).toLowerCase()) { - case "beforebegin": - contextElement = this.parentNode; - refNode = this; - break; - - case "afterend": - contextElement = this.parentNode; - refNode = this.nextSibling; - break; - - case "afterbegin": - contextElement = this; - refNode = this.firstChild; - break; - - case "beforeend": - contextElement = this; - refNode = null; - break; - - default: - return; - } - var df = frag(contextElement, text); - contextElement.insertBefore(df, refNode); - }, - get hidden() { - return this.hasAttribute("hidden"); - }, - set hidden(v) { - if (v) { - this.setAttribute("hidden", ""); - } else { - this.removeAttribute("hidden"); - } - } - }); - function frag(contextElement, html) { - var p = unwrap(contextElement.cloneNode(false)); - p.innerHTML = html; - var df = unwrap(document.createDocumentFragment()); - var c; - while (c = p.firstChild) { - df.appendChild(c); - } - return wrap(df); - } - function getter(name) { - return function() { - scope.renderAllPending(); - return unsafeUnwrap(this)[name]; - }; - } - function getterRequiresRendering(name) { - defineGetter(HTMLElement, name, getter(name)); - } - [ "clientHeight", "clientLeft", "clientTop", "clientWidth", "offsetHeight", "offsetLeft", "offsetTop", "offsetWidth", "scrollHeight", "scrollWidth" ].forEach(getterRequiresRendering); - function getterAndSetterRequiresRendering(name) { - Object.defineProperty(HTMLElement.prototype, name, { - get: getter(name), - set: function(v) { - scope.renderAllPending(); - unsafeUnwrap(this)[name] = v; - }, - configurable: true, - enumerable: true - }); - } - [ "scrollLeft", "scrollTop" ].forEach(getterAndSetterRequiresRendering); - function methodRequiresRendering(name) { - Object.defineProperty(HTMLElement.prototype, name, { - value: function() { - scope.renderAllPending(); - return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments); - }, - configurable: true, - enumerable: true - }); - } - [ "focus", "getBoundingClientRect", "getClientRects", "scrollIntoView" ].forEach(methodRequiresRendering); - registerWrapper(OriginalHTMLElement, HTMLElement, document.createElement("b")); - scope.wrappers.HTMLElement = HTMLElement; - scope.getInnerHTML = getInnerHTML; - scope.setInnerHTML = setInnerHTML; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrap = scope.wrap; - var OriginalHTMLCanvasElement = window.HTMLCanvasElement; - function HTMLCanvasElement(node) { - HTMLElement.call(this, node); - } - HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLCanvasElement.prototype, { - getContext: function() { - var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments); - return context && wrap(context); - } - }); - registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement, document.createElement("canvas")); - scope.wrappers.HTMLCanvasElement = HTMLCanvasElement; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var OriginalHTMLContentElement = window.HTMLContentElement; - function HTMLContentElement(node) { - HTMLElement.call(this, node); - } - HTMLContentElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLContentElement.prototype, { - constructor: HTMLContentElement, - get select() { - return this.getAttribute("select"); - }, - set select(value) { - this.setAttribute("select", value); - }, - setAttribute: function(n, v) { - HTMLElement.prototype.setAttribute.call(this, n, v); - if (String(n).toLowerCase() === "select") this.invalidateShadowRenderer(true); - } - }); - if (OriginalHTMLContentElement) registerWrapper(OriginalHTMLContentElement, HTMLContentElement); - scope.wrappers.HTMLContentElement = HTMLContentElement; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var wrapHTMLCollection = scope.wrapHTMLCollection; - var unwrap = scope.unwrap; - var OriginalHTMLFormElement = window.HTMLFormElement; - function HTMLFormElement(node) { - HTMLElement.call(this, node); - } - HTMLFormElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLFormElement.prototype, { - get elements() { - return wrapHTMLCollection(unwrap(this).elements); - } - }); - registerWrapper(OriginalHTMLFormElement, HTMLFormElement, document.createElement("form")); - scope.wrappers.HTMLFormElement = HTMLFormElement; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var registerWrapper = scope.registerWrapper; - var unwrap = scope.unwrap; - var rewrap = scope.rewrap; - var OriginalHTMLImageElement = window.HTMLImageElement; - function HTMLImageElement(node) { - HTMLElement.call(this, node); - } - HTMLImageElement.prototype = Object.create(HTMLElement.prototype); - registerWrapper(OriginalHTMLImageElement, HTMLImageElement, document.createElement("img")); - function Image(width, height) { - if (!(this instanceof Image)) { - throw new TypeError("DOM object constructor cannot be called as a function."); - } - var node = unwrap(document.createElement("img")); - HTMLElement.call(this, node); - rewrap(node, this); - if (width !== undefined) node.width = width; - if (height !== undefined) node.height = height; - } - Image.prototype = HTMLImageElement.prototype; - scope.wrappers.HTMLImageElement = HTMLImageElement; - scope.wrappers.Image = Image; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var NodeList = scope.wrappers.NodeList; - var registerWrapper = scope.registerWrapper; - var OriginalHTMLShadowElement = window.HTMLShadowElement; - function HTMLShadowElement(node) { - HTMLElement.call(this, node); - } - HTMLShadowElement.prototype = Object.create(HTMLElement.prototype); - HTMLShadowElement.prototype.constructor = HTMLShadowElement; - if (OriginalHTMLShadowElement) registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement); - scope.wrappers.HTMLShadowElement = HTMLShadowElement; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var contentTable = new WeakMap(); - var templateContentsOwnerTable = new WeakMap(); - function getTemplateContentsOwner(doc) { - if (!doc.defaultView) return doc; - var d = templateContentsOwnerTable.get(doc); - if (!d) { - d = doc.implementation.createHTMLDocument(""); - while (d.lastChild) { - d.removeChild(d.lastChild); - } - templateContentsOwnerTable.set(doc, d); - } - return d; - } - function extractContent(templateElement) { - var doc = getTemplateContentsOwner(templateElement.ownerDocument); - var df = unwrap(doc.createDocumentFragment()); - var child; - while (child = templateElement.firstChild) { - df.appendChild(child); - } - return df; - } - var OriginalHTMLTemplateElement = window.HTMLTemplateElement; - function HTMLTemplateElement(node) { - HTMLElement.call(this, node); - if (!OriginalHTMLTemplateElement) { - var content = extractContent(node); - contentTable.set(this, wrap(content)); - } - } - HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLTemplateElement.prototype, { - constructor: HTMLTemplateElement, - get content() { - if (OriginalHTMLTemplateElement) return wrap(unsafeUnwrap(this).content); - return contentTable.get(this); - } - }); - if (OriginalHTMLTemplateElement) registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement); - scope.wrappers.HTMLTemplateElement = HTMLTemplateElement; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var registerWrapper = scope.registerWrapper; - var OriginalHTMLMediaElement = window.HTMLMediaElement; - if (!OriginalHTMLMediaElement) return; - function HTMLMediaElement(node) { - HTMLElement.call(this, node); - } - HTMLMediaElement.prototype = Object.create(HTMLElement.prototype); - registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement, document.createElement("audio")); - scope.wrappers.HTMLMediaElement = HTMLMediaElement; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLMediaElement = scope.wrappers.HTMLMediaElement; - var registerWrapper = scope.registerWrapper; - var unwrap = scope.unwrap; - var rewrap = scope.rewrap; - var OriginalHTMLAudioElement = window.HTMLAudioElement; - if (!OriginalHTMLAudioElement) return; - function HTMLAudioElement(node) { - HTMLMediaElement.call(this, node); - } - HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype); - registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement, document.createElement("audio")); - function Audio(src) { - if (!(this instanceof Audio)) { - throw new TypeError("DOM object constructor cannot be called as a function."); - } - var node = unwrap(document.createElement("audio")); - HTMLMediaElement.call(this, node); - rewrap(node, this); - node.setAttribute("preload", "auto"); - if (src !== undefined) node.setAttribute("src", src); - } - Audio.prototype = HTMLAudioElement.prototype; - scope.wrappers.HTMLAudioElement = HTMLAudioElement; - scope.wrappers.Audio = Audio; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var rewrap = scope.rewrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var OriginalHTMLOptionElement = window.HTMLOptionElement; - function trimText(s) { - return s.replace(/\s+/g, " ").trim(); - } - function HTMLOptionElement(node) { - HTMLElement.call(this, node); - } - HTMLOptionElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLOptionElement.prototype, { - get text() { - return trimText(this.textContent); - }, - set text(value) { - this.textContent = trimText(String(value)); - }, - get form() { - return wrap(unwrap(this).form); - } - }); - registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement, document.createElement("option")); - function Option(text, value, defaultSelected, selected) { - if (!(this instanceof Option)) { - throw new TypeError("DOM object constructor cannot be called as a function."); - } - var node = unwrap(document.createElement("option")); - HTMLElement.call(this, node); - rewrap(node, this); - if (text !== undefined) node.text = text; - if (value !== undefined) node.setAttribute("value", value); - if (defaultSelected === true) node.setAttribute("selected", ""); - node.selected = selected === true; - } - Option.prototype = HTMLOptionElement.prototype; - scope.wrappers.HTMLOptionElement = HTMLOptionElement; - scope.wrappers.Option = Option; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var OriginalHTMLSelectElement = window.HTMLSelectElement; - function HTMLSelectElement(node) { - HTMLElement.call(this, node); - } - HTMLSelectElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLSelectElement.prototype, { - add: function(element, before) { - if (typeof before === "object") before = unwrap(before); - unwrap(this).add(unwrap(element), before); - }, - remove: function(indexOrNode) { - if (indexOrNode === undefined) { - HTMLElement.prototype.remove.call(this); - return; - } - if (typeof indexOrNode === "object") indexOrNode = unwrap(indexOrNode); - unwrap(this).remove(indexOrNode); - }, - get form() { - return wrap(unwrap(this).form); - } - }); - registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement, document.createElement("select")); - scope.wrappers.HTMLSelectElement = HTMLSelectElement; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var wrapHTMLCollection = scope.wrapHTMLCollection; - var OriginalHTMLTableElement = window.HTMLTableElement; - function HTMLTableElement(node) { - HTMLElement.call(this, node); - } - HTMLTableElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLTableElement.prototype, { - get caption() { - return wrap(unwrap(this).caption); - }, - createCaption: function() { - return wrap(unwrap(this).createCaption()); - }, - get tHead() { - return wrap(unwrap(this).tHead); - }, - createTHead: function() { - return wrap(unwrap(this).createTHead()); - }, - createTFoot: function() { - return wrap(unwrap(this).createTFoot()); - }, - get tFoot() { - return wrap(unwrap(this).tFoot); - }, - get tBodies() { - return wrapHTMLCollection(unwrap(this).tBodies); - }, - createTBody: function() { - return wrap(unwrap(this).createTBody()); - }, - get rows() { - return wrapHTMLCollection(unwrap(this).rows); - }, - insertRow: function(index) { - return wrap(unwrap(this).insertRow(index)); - } - }); - registerWrapper(OriginalHTMLTableElement, HTMLTableElement, document.createElement("table")); - scope.wrappers.HTMLTableElement = HTMLTableElement; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var wrapHTMLCollection = scope.wrapHTMLCollection; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement; - function HTMLTableSectionElement(node) { - HTMLElement.call(this, node); - } - HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLTableSectionElement.prototype, { - constructor: HTMLTableSectionElement, - get rows() { - return wrapHTMLCollection(unwrap(this).rows); - }, - insertRow: function(index) { - return wrap(unwrap(this).insertRow(index)); - } - }); - registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement, document.createElement("thead")); - scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var wrapHTMLCollection = scope.wrapHTMLCollection; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var OriginalHTMLTableRowElement = window.HTMLTableRowElement; - function HTMLTableRowElement(node) { - HTMLElement.call(this, node); - } - HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype); - mixin(HTMLTableRowElement.prototype, { - get cells() { - return wrapHTMLCollection(unwrap(this).cells); - }, - insertCell: function(index) { - return wrap(unwrap(this).insertCell(index)); - } - }); - registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement, document.createElement("tr")); - scope.wrappers.HTMLTableRowElement = HTMLTableRowElement; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLContentElement = scope.wrappers.HTMLContentElement; - var HTMLElement = scope.wrappers.HTMLElement; - var HTMLShadowElement = scope.wrappers.HTMLShadowElement; - var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var OriginalHTMLUnknownElement = window.HTMLUnknownElement; - function HTMLUnknownElement(node) { - switch (node.localName) { - case "content": - return new HTMLContentElement(node); - - case "shadow": - return new HTMLShadowElement(node); - - case "template": - return new HTMLTemplateElement(node); - } - HTMLElement.call(this, node); - } - HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype); - registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement); - scope.wrappers.HTMLUnknownElement = HTMLUnknownElement; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var Element = scope.wrappers.Element; - var HTMLElement = scope.wrappers.HTMLElement; - var registerWrapper = scope.registerWrapper; - var defineWrapGetter = scope.defineWrapGetter; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrap = scope.wrap; - var mixin = scope.mixin; - var SVG_NS = "http://www.w3.org/2000/svg"; - var OriginalSVGElement = window.SVGElement; - var svgTitleElement = document.createElementNS(SVG_NS, "title"); - if (!("classList" in svgTitleElement)) { - var descr = Object.getOwnPropertyDescriptor(Element.prototype, "classList"); - Object.defineProperty(HTMLElement.prototype, "classList", descr); - delete Element.prototype.classList; - } - function SVGElement(node) { - Element.call(this, node); - } - SVGElement.prototype = Object.create(Element.prototype); - mixin(SVGElement.prototype, { - get ownerSVGElement() { - return wrap(unsafeUnwrap(this).ownerSVGElement); - } - }); - registerWrapper(OriginalSVGElement, SVGElement, document.createElementNS(SVG_NS, "title")); - scope.wrappers.SVGElement = SVGElement; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var OriginalSVGUseElement = window.SVGUseElement; - var SVG_NS = "http://www.w3.org/2000/svg"; - var gWrapper = wrap(document.createElementNS(SVG_NS, "g")); - var useElement = document.createElementNS(SVG_NS, "use"); - var SVGGElement = gWrapper.constructor; - var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype); - var parentInterface = parentInterfacePrototype.constructor; - function SVGUseElement(impl) { - parentInterface.call(this, impl); - } - SVGUseElement.prototype = Object.create(parentInterfacePrototype); - if ("instanceRoot" in useElement) { - mixin(SVGUseElement.prototype, { - get instanceRoot() { - return wrap(unwrap(this).instanceRoot); - }, - get animatedInstanceRoot() { - return wrap(unwrap(this).animatedInstanceRoot); - } - }); - } - registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement); - scope.wrappers.SVGUseElement = SVGUseElement; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var EventTarget = scope.wrappers.EventTarget; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var wrap = scope.wrap; - var OriginalSVGElementInstance = window.SVGElementInstance; - if (!OriginalSVGElementInstance) return; - function SVGElementInstance(impl) { - EventTarget.call(this, impl); - } - SVGElementInstance.prototype = Object.create(EventTarget.prototype); - mixin(SVGElementInstance.prototype, { - get correspondingElement() { - return wrap(unsafeUnwrap(this).correspondingElement); - }, - get correspondingUseElement() { - return wrap(unsafeUnwrap(this).correspondingUseElement); - }, - get parentNode() { - return wrap(unsafeUnwrap(this).parentNode); - }, - get childNodes() { - throw new Error("Not implemented"); - }, - get firstChild() { - return wrap(unsafeUnwrap(this).firstChild); - }, - get lastChild() { - return wrap(unsafeUnwrap(this).lastChild); - }, - get previousSibling() { - return wrap(unsafeUnwrap(this).previousSibling); - }, - get nextSibling() { - return wrap(unsafeUnwrap(this).nextSibling); - } - }); - registerWrapper(OriginalSVGElementInstance, SVGElementInstance); - scope.wrappers.SVGElementInstance = SVGElementInstance; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D; - function CanvasRenderingContext2D(impl) { - setWrapper(impl, this); - } - mixin(CanvasRenderingContext2D.prototype, { - get canvas() { - return wrap(unsafeUnwrap(this).canvas); - }, - drawImage: function() { - arguments[0] = unwrapIfNeeded(arguments[0]); - unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments); - }, - createPattern: function() { - arguments[0] = unwrap(arguments[0]); - return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments); - } - }); - registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D, document.createElement("canvas").getContext("2d")); - scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var addForwardingProperties = scope.addForwardingProperties; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var OriginalWebGLRenderingContext = window.WebGLRenderingContext; - if (!OriginalWebGLRenderingContext) return; - function WebGLRenderingContext(impl) { - setWrapper(impl, this); - } - mixin(WebGLRenderingContext.prototype, { - get canvas() { - return wrap(unsafeUnwrap(this).canvas); - }, - texImage2D: function() { - arguments[5] = unwrapIfNeeded(arguments[5]); - unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments); - }, - texSubImage2D: function() { - arguments[6] = unwrapIfNeeded(arguments[6]); - unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments); - } - }); - var OriginalWebGLRenderingContextBase = Object.getPrototypeOf(OriginalWebGLRenderingContext.prototype); - if (OriginalWebGLRenderingContextBase !== Object.prototype) { - addForwardingProperties(OriginalWebGLRenderingContextBase, WebGLRenderingContext.prototype); - } - var instanceProperties = /WebKit/.test(navigator.userAgent) ? { - drawingBufferHeight: null, - drawingBufferWidth: null - } : {}; - registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext, instanceProperties); - scope.wrappers.WebGLRenderingContext = WebGLRenderingContext; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var Node = scope.wrappers.Node; - var GetElementsByInterface = scope.GetElementsByInterface; - var NonElementParentNodeInterface = scope.NonElementParentNodeInterface; - var ParentNodeInterface = scope.ParentNodeInterface; - var SelectorsInterface = scope.SelectorsInterface; - var mixin = scope.mixin; - var registerObject = scope.registerObject; - var registerWrapper = scope.registerWrapper; - var OriginalDocumentFragment = window.DocumentFragment; - function DocumentFragment(node) { - Node.call(this, node); - } - DocumentFragment.prototype = Object.create(Node.prototype); - mixin(DocumentFragment.prototype, ParentNodeInterface); - mixin(DocumentFragment.prototype, SelectorsInterface); - mixin(DocumentFragment.prototype, GetElementsByInterface); - mixin(DocumentFragment.prototype, NonElementParentNodeInterface); - registerWrapper(OriginalDocumentFragment, DocumentFragment, document.createDocumentFragment()); - scope.wrappers.DocumentFragment = DocumentFragment; - var Comment = registerObject(document.createComment("")); - scope.wrappers.Comment = Comment; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var DocumentFragment = scope.wrappers.DocumentFragment; - var TreeScope = scope.TreeScope; - var elementFromPoint = scope.elementFromPoint; - var getInnerHTML = scope.getInnerHTML; - var getTreeScope = scope.getTreeScope; - var mixin = scope.mixin; - var rewrap = scope.rewrap; - var setInnerHTML = scope.setInnerHTML; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var shadowHostTable = new WeakMap(); - var nextOlderShadowTreeTable = new WeakMap(); - function ShadowRoot(hostWrapper) { - var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment()); - DocumentFragment.call(this, node); - rewrap(node, this); - var oldShadowRoot = hostWrapper.shadowRoot; - nextOlderShadowTreeTable.set(this, oldShadowRoot); - this.treeScope_ = new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper)); - shadowHostTable.set(this, hostWrapper); - } - ShadowRoot.prototype = Object.create(DocumentFragment.prototype); - mixin(ShadowRoot.prototype, { - constructor: ShadowRoot, - get innerHTML() { - return getInnerHTML(this); - }, - set innerHTML(value) { - setInnerHTML(this, value); - this.invalidateShadowRenderer(); - }, - get olderShadowRoot() { - return nextOlderShadowTreeTable.get(this) || null; - }, - get host() { - return shadowHostTable.get(this) || null; - }, - invalidateShadowRenderer: function() { - return shadowHostTable.get(this).invalidateShadowRenderer(); - }, - elementFromPoint: function(x, y) { - return elementFromPoint(this, this.ownerDocument, x, y); - }, - getSelection: function() { - return document.getSelection(); - }, - get activeElement() { - var unwrappedActiveElement = unwrap(this).ownerDocument.activeElement; - if (!unwrappedActiveElement || !unwrappedActiveElement.nodeType) return null; - var activeElement = wrap(unwrappedActiveElement); - while (!this.contains(activeElement)) { - while (activeElement.parentNode) { - activeElement = activeElement.parentNode; - } - if (activeElement.host) { - activeElement = activeElement.host; - } else { - return null; - } - } - return activeElement; - } - }); - scope.wrappers.ShadowRoot = ShadowRoot; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var getTreeScope = scope.getTreeScope; - var OriginalRange = window.Range; - var ShadowRoot = scope.wrappers.ShadowRoot; - function getHost(node) { - var root = getTreeScope(node).root; - if (root instanceof ShadowRoot) { - return root.host; - } - return null; - } - function hostNodeToShadowNode(refNode, offset) { - if (refNode.shadowRoot) { - offset = Math.min(refNode.childNodes.length - 1, offset); - var child = refNode.childNodes[offset]; - if (child) { - var insertionPoint = scope.getDestinationInsertionPoints(child); - if (insertionPoint.length > 0) { - var parentNode = insertionPoint[0].parentNode; - if (parentNode.nodeType == Node.ELEMENT_NODE) { - refNode = parentNode; - } - } - } - } - return refNode; - } - function shadowNodeToHostNode(node) { - node = wrap(node); - return getHost(node) || node; - } - function Range(impl) { - setWrapper(impl, this); - } - Range.prototype = { - get startContainer() { - return shadowNodeToHostNode(unsafeUnwrap(this).startContainer); - }, - get endContainer() { - return shadowNodeToHostNode(unsafeUnwrap(this).endContainer); - }, - get commonAncestorContainer() { - return shadowNodeToHostNode(unsafeUnwrap(this).commonAncestorContainer); - }, - setStart: function(refNode, offset) { - refNode = hostNodeToShadowNode(refNode, offset); - unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset); - }, - setEnd: function(refNode, offset) { - refNode = hostNodeToShadowNode(refNode, offset); - unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset); - }, - setStartBefore: function(refNode) { - unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode)); - }, - setStartAfter: function(refNode) { - unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode)); - }, - setEndBefore: function(refNode) { - unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode)); - }, - setEndAfter: function(refNode) { - unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode)); - }, - selectNode: function(refNode) { - unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode)); - }, - selectNodeContents: function(refNode) { - unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode)); - }, - compareBoundaryPoints: function(how, sourceRange) { - return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange)); - }, - extractContents: function() { - return wrap(unsafeUnwrap(this).extractContents()); - }, - cloneContents: function() { - return wrap(unsafeUnwrap(this).cloneContents()); - }, - insertNode: function(node) { - unsafeUnwrap(this).insertNode(unwrapIfNeeded(node)); - }, - surroundContents: function(newParent) { - unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent)); - }, - cloneRange: function() { - return wrap(unsafeUnwrap(this).cloneRange()); - }, - isPointInRange: function(node, offset) { - return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset); - }, - comparePoint: function(node, offset) { - return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset); - }, - intersectsNode: function(node) { - return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node)); - }, - toString: function() { - return unsafeUnwrap(this).toString(); - } - }; - if (OriginalRange.prototype.createContextualFragment) { - Range.prototype.createContextualFragment = function(html) { - return wrap(unsafeUnwrap(this).createContextualFragment(html)); - }; - } - registerWrapper(window.Range, Range, document.createRange()); - scope.wrappers.Range = Range; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var Element = scope.wrappers.Element; - var HTMLContentElement = scope.wrappers.HTMLContentElement; - var HTMLShadowElement = scope.wrappers.HTMLShadowElement; - var Node = scope.wrappers.Node; - var ShadowRoot = scope.wrappers.ShadowRoot; - var assert = scope.assert; - var getTreeScope = scope.getTreeScope; - var mixin = scope.mixin; - var oneOf = scope.oneOf; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var ArraySplice = scope.ArraySplice; - function updateWrapperUpAndSideways(wrapper) { - wrapper.previousSibling_ = wrapper.previousSibling; - wrapper.nextSibling_ = wrapper.nextSibling; - wrapper.parentNode_ = wrapper.parentNode; - } - function updateWrapperDown(wrapper) { - wrapper.firstChild_ = wrapper.firstChild; - wrapper.lastChild_ = wrapper.lastChild; - } - function updateAllChildNodes(parentNodeWrapper) { - assert(parentNodeWrapper instanceof Node); - for (var childWrapper = parentNodeWrapper.firstChild; childWrapper; childWrapper = childWrapper.nextSibling) { - updateWrapperUpAndSideways(childWrapper); - } - updateWrapperDown(parentNodeWrapper); - } - function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) { - var parentNode = unwrap(parentNodeWrapper); - var newChild = unwrap(newChildWrapper); - var refChild = refChildWrapper ? unwrap(refChildWrapper) : null; - remove(newChildWrapper); - updateWrapperUpAndSideways(newChildWrapper); - if (!refChildWrapper) { - parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild; - if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild) parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild; - var lastChildWrapper = wrap(parentNode.lastChild); - if (lastChildWrapper) lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling; - } else { - if (parentNodeWrapper.firstChild === refChildWrapper) parentNodeWrapper.firstChild_ = refChildWrapper; - refChildWrapper.previousSibling_ = refChildWrapper.previousSibling; - } - scope.originalInsertBefore.call(parentNode, newChild, refChild); - } - function remove(nodeWrapper) { - var node = unwrap(nodeWrapper); - var parentNode = node.parentNode; - if (!parentNode) return; - var parentNodeWrapper = wrap(parentNode); - updateWrapperUpAndSideways(nodeWrapper); - if (nodeWrapper.previousSibling) nodeWrapper.previousSibling.nextSibling_ = nodeWrapper; - if (nodeWrapper.nextSibling) nodeWrapper.nextSibling.previousSibling_ = nodeWrapper; - if (parentNodeWrapper.lastChild === nodeWrapper) parentNodeWrapper.lastChild_ = nodeWrapper; - if (parentNodeWrapper.firstChild === nodeWrapper) parentNodeWrapper.firstChild_ = nodeWrapper; - scope.originalRemoveChild.call(parentNode, node); - } - var distributedNodesTable = new WeakMap(); - var destinationInsertionPointsTable = new WeakMap(); - var rendererForHostTable = new WeakMap(); - function resetDistributedNodes(insertionPoint) { - distributedNodesTable.set(insertionPoint, []); - } - function getDistributedNodes(insertionPoint) { - var rv = distributedNodesTable.get(insertionPoint); - if (!rv) distributedNodesTable.set(insertionPoint, rv = []); - return rv; - } - function getChildNodesSnapshot(node) { - var result = [], i = 0; - for (var child = node.firstChild; child; child = child.nextSibling) { - result[i++] = child; - } - return result; - } - var request = oneOf(window, [ "requestAnimationFrame", "mozRequestAnimationFrame", "webkitRequestAnimationFrame", "setTimeout" ]); - var pendingDirtyRenderers = []; - var renderTimer; - function renderAllPending() { - for (var i = 0; i < pendingDirtyRenderers.length; i++) { - var renderer = pendingDirtyRenderers[i]; - var parentRenderer = renderer.parentRenderer; - if (parentRenderer && parentRenderer.dirty) continue; - renderer.render(); - } - pendingDirtyRenderers = []; - } - function handleRequestAnimationFrame() { - renderTimer = null; - renderAllPending(); - } - function getRendererForHost(host) { - var renderer = rendererForHostTable.get(host); - if (!renderer) { - renderer = new ShadowRenderer(host); - rendererForHostTable.set(host, renderer); - } - return renderer; - } - function getShadowRootAncestor(node) { - var root = getTreeScope(node).root; - if (root instanceof ShadowRoot) return root; - return null; - } - function getRendererForShadowRoot(shadowRoot) { - return getRendererForHost(shadowRoot.host); - } - var spliceDiff = new ArraySplice(); - spliceDiff.equals = function(renderNode, rawNode) { - return unwrap(renderNode.node) === rawNode; - }; - function RenderNode(node) { - this.skip = false; - this.node = node; - this.childNodes = []; - } - RenderNode.prototype = { - append: function(node) { - var rv = new RenderNode(node); - this.childNodes.push(rv); - return rv; - }, - sync: function(opt_added) { - if (this.skip) return; - var nodeWrapper = this.node; - var newChildren = this.childNodes; - var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper)); - var added = opt_added || new WeakMap(); - var splices = spliceDiff.calculateSplices(newChildren, oldChildren); - var newIndex = 0, oldIndex = 0; - var lastIndex = 0; - for (var i = 0; i < splices.length; i++) { - var splice = splices[i]; - for (;lastIndex < splice.index; lastIndex++) { - oldIndex++; - newChildren[newIndex++].sync(added); - } - var removedCount = splice.removed.length; - for (var j = 0; j < removedCount; j++) { - var wrapper = wrap(oldChildren[oldIndex++]); - if (!added.get(wrapper)) remove(wrapper); - } - var addedCount = splice.addedCount; - var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]); - for (var j = 0; j < addedCount; j++) { - var newChildRenderNode = newChildren[newIndex++]; - var newChildWrapper = newChildRenderNode.node; - insertBefore(nodeWrapper, newChildWrapper, refNode); - added.set(newChildWrapper, true); - newChildRenderNode.sync(added); - } - lastIndex += addedCount; - } - for (var i = lastIndex; i < newChildren.length; i++) { - newChildren[i].sync(added); - } - } - }; - function ShadowRenderer(host) { - this.host = host; - this.dirty = false; - this.invalidateAttributes(); - this.associateNode(host); - } - ShadowRenderer.prototype = { - render: function(opt_renderNode) { - if (!this.dirty) return; - this.invalidateAttributes(); - var host = this.host; - this.distribution(host); - var renderNode = opt_renderNode || new RenderNode(host); - this.buildRenderTree(renderNode, host); - var topMostRenderer = !opt_renderNode; - if (topMostRenderer) renderNode.sync(); - this.dirty = false; - }, - get parentRenderer() { - return getTreeScope(this.host).renderer; - }, - invalidate: function() { - if (!this.dirty) { - this.dirty = true; - var parentRenderer = this.parentRenderer; - if (parentRenderer) parentRenderer.invalidate(); - pendingDirtyRenderers.push(this); - if (renderTimer) return; - renderTimer = window[request](handleRequestAnimationFrame, 0); - } - }, - distribution: function(root) { - this.resetAllSubtrees(root); - this.distributionResolution(root); - }, - resetAll: function(node) { - if (isInsertionPoint(node)) resetDistributedNodes(node); else resetDestinationInsertionPoints(node); - this.resetAllSubtrees(node); - }, - resetAllSubtrees: function(node) { - for (var child = node.firstChild; child; child = child.nextSibling) { - this.resetAll(child); - } - if (node.shadowRoot) this.resetAll(node.shadowRoot); - if (node.olderShadowRoot) this.resetAll(node.olderShadowRoot); - }, - distributionResolution: function(node) { - if (isShadowHost(node)) { - var shadowHost = node; - var pool = poolPopulation(shadowHost); - var shadowTrees = getShadowTrees(shadowHost); - for (var i = 0; i < shadowTrees.length; i++) { - this.poolDistribution(shadowTrees[i], pool); - } - for (var i = shadowTrees.length - 1; i >= 0; i--) { - var shadowTree = shadowTrees[i]; - var shadow = getShadowInsertionPoint(shadowTree); - if (shadow) { - var olderShadowRoot = shadowTree.olderShadowRoot; - if (olderShadowRoot) { - pool = poolPopulation(olderShadowRoot); - } - for (var j = 0; j < pool.length; j++) { - destributeNodeInto(pool[j], shadow); - } - } - this.distributionResolution(shadowTree); - } - } - for (var child = node.firstChild; child; child = child.nextSibling) { - this.distributionResolution(child); - } - }, - poolDistribution: function(node, pool) { - if (node instanceof HTMLShadowElement) return; - if (node instanceof HTMLContentElement) { - var content = node; - this.updateDependentAttributes(content.getAttribute("select")); - var anyDistributed = false; - for (var i = 0; i < pool.length; i++) { - var node = pool[i]; - if (!node) continue; - if (matches(node, content)) { - destributeNodeInto(node, content); - pool[i] = undefined; - anyDistributed = true; - } - } - if (!anyDistributed) { - for (var child = content.firstChild; child; child = child.nextSibling) { - destributeNodeInto(child, content); - } - } - return; - } - for (var child = node.firstChild; child; child = child.nextSibling) { - this.poolDistribution(child, pool); - } - }, - buildRenderTree: function(renderNode, node) { - var children = this.compose(node); - for (var i = 0; i < children.length; i++) { - var child = children[i]; - var childRenderNode = renderNode.append(child); - this.buildRenderTree(childRenderNode, child); - } - if (isShadowHost(node)) { - var renderer = getRendererForHost(node); - renderer.dirty = false; - } - }, - compose: function(node) { - var children = []; - var p = node.shadowRoot || node; - for (var child = p.firstChild; child; child = child.nextSibling) { - if (isInsertionPoint(child)) { - this.associateNode(p); - var distributedNodes = getDistributedNodes(child); - for (var j = 0; j < distributedNodes.length; j++) { - var distributedNode = distributedNodes[j]; - if (isFinalDestination(child, distributedNode)) children.push(distributedNode); - } - } else { - children.push(child); - } - } - return children; - }, - invalidateAttributes: function() { - this.attributes = Object.create(null); - }, - updateDependentAttributes: function(selector) { - if (!selector) return; - var attributes = this.attributes; - if (/\.\w+/.test(selector)) attributes["class"] = true; - if (/#\w+/.test(selector)) attributes["id"] = true; - selector.replace(/\[\s*([^\s=\|~\]]+)/g, function(_, name) { - attributes[name] = true; - }); - }, - dependsOnAttribute: function(name) { - return this.attributes[name]; - }, - associateNode: function(node) { - unsafeUnwrap(node).polymerShadowRenderer_ = this; - } - }; - function poolPopulation(node) { - var pool = []; - for (var child = node.firstChild; child; child = child.nextSibling) { - if (isInsertionPoint(child)) { - pool.push.apply(pool, getDistributedNodes(child)); - } else { - pool.push(child); - } - } - return pool; - } - function getShadowInsertionPoint(node) { - if (node instanceof HTMLShadowElement) return node; - if (node instanceof HTMLContentElement) return null; - for (var child = node.firstChild; child; child = child.nextSibling) { - var res = getShadowInsertionPoint(child); - if (res) return res; - } - return null; - } - function destributeNodeInto(child, insertionPoint) { - getDistributedNodes(insertionPoint).push(child); - var points = destinationInsertionPointsTable.get(child); - if (!points) destinationInsertionPointsTable.set(child, [ insertionPoint ]); else points.push(insertionPoint); - } - function getDestinationInsertionPoints(node) { - return destinationInsertionPointsTable.get(node); - } - function resetDestinationInsertionPoints(node) { - destinationInsertionPointsTable.set(node, undefined); - } - var selectorStartCharRe = /^(:not\()?[*.#[a-zA-Z_|]/; - function matches(node, contentElement) { - var select = contentElement.getAttribute("select"); - if (!select) return true; - select = select.trim(); - if (!select) return true; - if (!(node instanceof Element)) return false; - if (!selectorStartCharRe.test(select)) return false; - try { - return node.matches(select); - } catch (ex) { - return false; - } - } - function isFinalDestination(insertionPoint, node) { - var points = getDestinationInsertionPoints(node); - return points && points[points.length - 1] === insertionPoint; - } - function isInsertionPoint(node) { - return node instanceof HTMLContentElement || node instanceof HTMLShadowElement; - } - function isShadowHost(shadowHost) { - return shadowHost.shadowRoot; - } - function getShadowTrees(host) { - var trees = []; - for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) { - trees.push(tree); - } - return trees; - } - function render(host) { - new ShadowRenderer(host).render(); - } - Node.prototype.invalidateShadowRenderer = function(force) { - var renderer = unsafeUnwrap(this).polymerShadowRenderer_; - if (renderer) { - renderer.invalidate(); - return true; - } - return false; - }; - HTMLContentElement.prototype.getDistributedNodes = HTMLShadowElement.prototype.getDistributedNodes = function() { - renderAllPending(); - return getDistributedNodes(this); - }; - Element.prototype.getDestinationInsertionPoints = function() { - renderAllPending(); - return getDestinationInsertionPoints(this) || []; - }; - HTMLContentElement.prototype.nodeIsInserted_ = HTMLShadowElement.prototype.nodeIsInserted_ = function() { - this.invalidateShadowRenderer(); - var shadowRoot = getShadowRootAncestor(this); - var renderer; - if (shadowRoot) renderer = getRendererForShadowRoot(shadowRoot); - unsafeUnwrap(this).polymerShadowRenderer_ = renderer; - if (renderer) renderer.invalidate(); - }; - scope.getRendererForHost = getRendererForHost; - scope.getShadowTrees = getShadowTrees; - scope.renderAllPending = renderAllPending; - scope.getDestinationInsertionPoints = getDestinationInsertionPoints; - scope.visual = { - insertBefore: insertBefore, - remove: remove - }; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var HTMLElement = scope.wrappers.HTMLElement; - var assert = scope.assert; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var elementsWithFormProperty = [ "HTMLButtonElement", "HTMLFieldSetElement", "HTMLInputElement", "HTMLKeygenElement", "HTMLLabelElement", "HTMLLegendElement", "HTMLObjectElement", "HTMLOutputElement", "HTMLTextAreaElement" ]; - function createWrapperConstructor(name) { - if (!window[name]) return; - assert(!scope.wrappers[name]); - var GeneratedWrapper = function(node) { - HTMLElement.call(this, node); - }; - GeneratedWrapper.prototype = Object.create(HTMLElement.prototype); - mixin(GeneratedWrapper.prototype, { - get form() { - return wrap(unwrap(this).form); - } - }); - registerWrapper(window[name], GeneratedWrapper, document.createElement(name.slice(4, -7))); - scope.wrappers[name] = GeneratedWrapper; - } - elementsWithFormProperty.forEach(createWrapperConstructor); - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var OriginalSelection = window.Selection; - function Selection(impl) { - setWrapper(impl, this); - } - Selection.prototype = { - get anchorNode() { - return wrap(unsafeUnwrap(this).anchorNode); - }, - get focusNode() { - return wrap(unsafeUnwrap(this).focusNode); - }, - addRange: function(range) { - unsafeUnwrap(this).addRange(unwrapIfNeeded(range)); - }, - collapse: function(node, index) { - unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index); - }, - containsNode: function(node, allowPartial) { - return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial); - }, - getRangeAt: function(index) { - return wrap(unsafeUnwrap(this).getRangeAt(index)); - }, - removeRange: function(range) { - unsafeUnwrap(this).removeRange(unwrap(range)); - }, - selectAllChildren: function(node) { - unsafeUnwrap(this).selectAllChildren(node instanceof ShadowRoot ? unsafeUnwrap(node.host) : unwrapIfNeeded(node)); - }, - toString: function() { - return unsafeUnwrap(this).toString(); - } - }; - if (OriginalSelection.prototype.extend) { - Selection.prototype.extend = function(node, offset) { - unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset); - }; - } - registerWrapper(window.Selection, Selection, window.getSelection()); - scope.wrappers.Selection = Selection; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var OriginalTreeWalker = window.TreeWalker; - function TreeWalker(impl) { - setWrapper(impl, this); - } - TreeWalker.prototype = { - get root() { - return wrap(unsafeUnwrap(this).root); - }, - get currentNode() { - return wrap(unsafeUnwrap(this).currentNode); - }, - set currentNode(node) { - unsafeUnwrap(this).currentNode = unwrapIfNeeded(node); - }, - get filter() { - return unsafeUnwrap(this).filter; - }, - parentNode: function() { - return wrap(unsafeUnwrap(this).parentNode()); - }, - firstChild: function() { - return wrap(unsafeUnwrap(this).firstChild()); - }, - lastChild: function() { - return wrap(unsafeUnwrap(this).lastChild()); - }, - previousSibling: function() { - return wrap(unsafeUnwrap(this).previousSibling()); - }, - previousNode: function() { - return wrap(unsafeUnwrap(this).previousNode()); - }, - nextNode: function() { - return wrap(unsafeUnwrap(this).nextNode()); - } - }; - registerWrapper(OriginalTreeWalker, TreeWalker); - scope.wrappers.TreeWalker = TreeWalker; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var GetElementsByInterface = scope.GetElementsByInterface; - var Node = scope.wrappers.Node; - var ParentNodeInterface = scope.ParentNodeInterface; - var NonElementParentNodeInterface = scope.NonElementParentNodeInterface; - var Selection = scope.wrappers.Selection; - var SelectorsInterface = scope.SelectorsInterface; - var ShadowRoot = scope.wrappers.ShadowRoot; - var TreeScope = scope.TreeScope; - var cloneNode = scope.cloneNode; - var defineGetter = scope.defineGetter; - var defineWrapGetter = scope.defineWrapGetter; - var elementFromPoint = scope.elementFromPoint; - var forwardMethodsToWrapper = scope.forwardMethodsToWrapper; - var matchesNames = scope.matchesNames; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var renderAllPending = scope.renderAllPending; - var rewrap = scope.rewrap; - var setWrapper = scope.setWrapper; - var unsafeUnwrap = scope.unsafeUnwrap; - var unwrap = scope.unwrap; - var wrap = scope.wrap; - var wrapEventTargetMethods = scope.wrapEventTargetMethods; - var wrapNodeList = scope.wrapNodeList; - var implementationTable = new WeakMap(); - function Document(node) { - Node.call(this, node); - this.treeScope_ = new TreeScope(this, null); - } - Document.prototype = Object.create(Node.prototype); - defineWrapGetter(Document, "documentElement"); - defineWrapGetter(Document, "body"); - defineWrapGetter(Document, "head"); - defineGetter(Document, "activeElement", function() { - var unwrappedActiveElement = unwrap(this).activeElement; - if (!unwrappedActiveElement || !unwrappedActiveElement.nodeType) return null; - var activeElement = wrap(unwrappedActiveElement); - while (!this.contains(activeElement)) { - while (activeElement.parentNode) { - activeElement = activeElement.parentNode; - } - if (activeElement.host) { - activeElement = activeElement.host; - } else { - return null; - } - } - return activeElement; - }); - function wrapMethod(name) { - var original = document[name]; - Document.prototype[name] = function() { - return wrap(original.apply(unsafeUnwrap(this), arguments)); - }; - } - [ "createComment", "createDocumentFragment", "createElement", "createElementNS", "createEvent", "createEventNS", "createRange", "createTextNode" ].forEach(wrapMethod); - var originalAdoptNode = document.adoptNode; - function adoptNodeNoRemove(node, doc) { - originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node)); - adoptSubtree(node, doc); - } - function adoptSubtree(node, doc) { - if (node.shadowRoot) doc.adoptNode(node.shadowRoot); - if (node instanceof ShadowRoot) adoptOlderShadowRoots(node, doc); - for (var child = node.firstChild; child; child = child.nextSibling) { - adoptSubtree(child, doc); - } - } - function adoptOlderShadowRoots(shadowRoot, doc) { - var oldShadowRoot = shadowRoot.olderShadowRoot; - if (oldShadowRoot) doc.adoptNode(oldShadowRoot); - } - var originalGetSelection = document.getSelection; - mixin(Document.prototype, { - adoptNode: function(node) { - if (node.parentNode) node.parentNode.removeChild(node); - adoptNodeNoRemove(node, this); - return node; - }, - elementFromPoint: function(x, y) { - return elementFromPoint(this, this, x, y); - }, - importNode: function(node, deep) { - return cloneNode(node, deep, unsafeUnwrap(this)); - }, - getSelection: function() { - renderAllPending(); - return new Selection(originalGetSelection.call(unwrap(this))); - }, - getElementsByName: function(name) { - return SelectorsInterface.querySelectorAll.call(this, "[name=" + JSON.stringify(String(name)) + "]"); - } - }); - var originalCreateTreeWalker = document.createTreeWalker; - var TreeWalkerWrapper = scope.wrappers.TreeWalker; - Document.prototype.createTreeWalker = function(root, whatToShow, filter, expandEntityReferences) { - var newFilter = null; - if (filter) { - if (filter.acceptNode && typeof filter.acceptNode === "function") { - newFilter = { - acceptNode: function(node) { - return filter.acceptNode(wrap(node)); - } - }; - } else if (typeof filter === "function") { - newFilter = function(node) { - return filter(wrap(node)); - }; - } - } - return new TreeWalkerWrapper(originalCreateTreeWalker.call(unwrap(this), unwrap(root), whatToShow, newFilter, expandEntityReferences)); - }; - if (document.registerElement) { - var originalRegisterElement = document.registerElement; - Document.prototype.registerElement = function(tagName, object) { - var prototype, extendsOption; - if (object !== undefined) { - prototype = object.prototype; - extendsOption = object.extends; - } - if (!prototype) prototype = Object.create(HTMLElement.prototype); - if (scope.nativePrototypeTable.get(prototype)) { - throw new Error("NotSupportedError"); - } - var proto = Object.getPrototypeOf(prototype); - var nativePrototype; - var prototypes = []; - while (proto) { - nativePrototype = scope.nativePrototypeTable.get(proto); - if (nativePrototype) break; - prototypes.push(proto); - proto = Object.getPrototypeOf(proto); - } - if (!nativePrototype) { - throw new Error("NotSupportedError"); - } - var newPrototype = Object.create(nativePrototype); - for (var i = prototypes.length - 1; i >= 0; i--) { - newPrototype = Object.create(newPrototype); - } - [ "createdCallback", "attachedCallback", "detachedCallback", "attributeChangedCallback" ].forEach(function(name) { - var f = prototype[name]; - if (!f) return; - newPrototype[name] = function() { - if (!(wrap(this) instanceof CustomElementConstructor)) { - rewrap(this); - } - f.apply(wrap(this), arguments); - }; - }); - var p = { - prototype: newPrototype - }; - if (extendsOption) p.extends = extendsOption; - function CustomElementConstructor(node) { - if (!node) { - if (extendsOption) { - return document.createElement(extendsOption, tagName); - } else { - return document.createElement(tagName); - } - } - setWrapper(node, this); - } - CustomElementConstructor.prototype = prototype; - CustomElementConstructor.prototype.constructor = CustomElementConstructor; - scope.constructorTable.set(newPrototype, CustomElementConstructor); - scope.nativePrototypeTable.set(prototype, newPrototype); - var nativeConstructor = originalRegisterElement.call(unwrap(this), tagName, p); - return CustomElementConstructor; - }; - forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ "registerElement" ]); - } - forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement, window.HTMLHtmlElement ], [ "appendChild", "compareDocumentPosition", "contains", "getElementsByClassName", "getElementsByTagName", "getElementsByTagNameNS", "insertBefore", "querySelector", "querySelectorAll", "removeChild", "replaceChild" ]); - forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLHeadElement, window.HTMLHtmlElement ], matchesNames); - forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ "adoptNode", "importNode", "contains", "createComment", "createDocumentFragment", "createElement", "createElementNS", "createEvent", "createEventNS", "createRange", "createTextNode", "createTreeWalker", "elementFromPoint", "getElementById", "getElementsByName", "getSelection" ]); - mixin(Document.prototype, GetElementsByInterface); - mixin(Document.prototype, ParentNodeInterface); - mixin(Document.prototype, SelectorsInterface); - mixin(Document.prototype, NonElementParentNodeInterface); - mixin(Document.prototype, { - get implementation() { - var implementation = implementationTable.get(this); - if (implementation) return implementation; - implementation = new DOMImplementation(unwrap(this).implementation); - implementationTable.set(this, implementation); - return implementation; - }, - get defaultView() { - return wrap(unwrap(this).defaultView); - } - }); - registerWrapper(window.Document, Document, document.implementation.createHTMLDocument("")); - if (window.HTMLDocument) registerWrapper(window.HTMLDocument, Document); - wrapEventTargetMethods([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement ]); - function DOMImplementation(impl) { - setWrapper(impl, this); - } - var originalCreateDocument = document.implementation.createDocument; - DOMImplementation.prototype.createDocument = function() { - arguments[2] = unwrap(arguments[2]); - return wrap(originalCreateDocument.apply(unsafeUnwrap(this), arguments)); - }; - function wrapImplMethod(constructor, name) { - var original = document.implementation[name]; - constructor.prototype[name] = function() { - return wrap(original.apply(unsafeUnwrap(this), arguments)); - }; - } - function forwardImplMethod(constructor, name) { - var original = document.implementation[name]; - constructor.prototype[name] = function() { - return original.apply(unsafeUnwrap(this), arguments); - }; - } - wrapImplMethod(DOMImplementation, "createDocumentType"); - wrapImplMethod(DOMImplementation, "createHTMLDocument"); - forwardImplMethod(DOMImplementation, "hasFeature"); - registerWrapper(window.DOMImplementation, DOMImplementation); - forwardMethodsToWrapper([ window.DOMImplementation ], [ "createDocument", "createDocumentType", "createHTMLDocument", "hasFeature" ]); - scope.adoptNodeNoRemove = adoptNodeNoRemove; - scope.wrappers.DOMImplementation = DOMImplementation; - scope.wrappers.Document = Document; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var EventTarget = scope.wrappers.EventTarget; - var Selection = scope.wrappers.Selection; - var mixin = scope.mixin; - var registerWrapper = scope.registerWrapper; - var renderAllPending = scope.renderAllPending; - var unwrap = scope.unwrap; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var wrap = scope.wrap; - var OriginalWindow = window.Window; - var originalGetComputedStyle = window.getComputedStyle; - var originalGetDefaultComputedStyle = window.getDefaultComputedStyle; - var originalGetSelection = window.getSelection; - function Window(impl) { - EventTarget.call(this, impl); - } - Window.prototype = Object.create(EventTarget.prototype); - OriginalWindow.prototype.getComputedStyle = function(el, pseudo) { - return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo); - }; - if (originalGetDefaultComputedStyle) { - OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) { - return wrap(this || window).getDefaultComputedStyle(unwrapIfNeeded(el), pseudo); - }; - } - OriginalWindow.prototype.getSelection = function() { - return wrap(this || window).getSelection(); - }; - delete window.getComputedStyle; - delete window.getDefaultComputedStyle; - delete window.getSelection; - [ "addEventListener", "removeEventListener", "dispatchEvent" ].forEach(function(name) { - OriginalWindow.prototype[name] = function() { - var w = wrap(this || window); - return w[name].apply(w, arguments); - }; - delete window[name]; - }); - mixin(Window.prototype, { - getComputedStyle: function(el, pseudo) { - renderAllPending(); - return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo); - }, - getSelection: function() { - renderAllPending(); - return new Selection(originalGetSelection.call(unwrap(this))); - }, - get document() { - return wrap(unwrap(this).document); - } - }); - if (originalGetDefaultComputedStyle) { - Window.prototype.getDefaultComputedStyle = function(el, pseudo) { - renderAllPending(); - return originalGetDefaultComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo); - }; - } - registerWrapper(OriginalWindow, Window, window); - scope.wrappers.Window = Window; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var unwrap = scope.unwrap; - var OriginalDataTransfer = window.DataTransfer || window.Clipboard; - var OriginalDataTransferSetDragImage = OriginalDataTransfer.prototype.setDragImage; - if (OriginalDataTransferSetDragImage) { - OriginalDataTransfer.prototype.setDragImage = function(image, x, y) { - OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y); - }; - } - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var registerWrapper = scope.registerWrapper; - var setWrapper = scope.setWrapper; - var unwrap = scope.unwrap; - var OriginalFormData = window.FormData; - if (!OriginalFormData) return; - function FormData(formElement) { - var impl; - if (formElement instanceof OriginalFormData) { - impl = formElement; - } else { - impl = new OriginalFormData(formElement && unwrap(formElement)); - } - setWrapper(impl, this); - } - registerWrapper(OriginalFormData, FormData, new OriginalFormData()); - scope.wrappers.FormData = FormData; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var unwrapIfNeeded = scope.unwrapIfNeeded; - var originalSend = XMLHttpRequest.prototype.send; - XMLHttpRequest.prototype.send = function(obj) { - return originalSend.call(this, unwrapIfNeeded(obj)); - }; - })(window.ShadowDOMPolyfill); - (function(scope) { - "use strict"; - var isWrapperFor = scope.isWrapperFor; - var elements = { - a: "HTMLAnchorElement", - area: "HTMLAreaElement", - audio: "HTMLAudioElement", - base: "HTMLBaseElement", - body: "HTMLBodyElement", - br: "HTMLBRElement", - button: "HTMLButtonElement", - canvas: "HTMLCanvasElement", - caption: "HTMLTableCaptionElement", - col: "HTMLTableColElement", - content: "HTMLContentElement", - data: "HTMLDataElement", - datalist: "HTMLDataListElement", - del: "HTMLModElement", - dir: "HTMLDirectoryElement", - div: "HTMLDivElement", - dl: "HTMLDListElement", - embed: "HTMLEmbedElement", - fieldset: "HTMLFieldSetElement", - font: "HTMLFontElement", - form: "HTMLFormElement", - frame: "HTMLFrameElement", - frameset: "HTMLFrameSetElement", - h1: "HTMLHeadingElement", - head: "HTMLHeadElement", - hr: "HTMLHRElement", - html: "HTMLHtmlElement", - iframe: "HTMLIFrameElement", - img: "HTMLImageElement", - input: "HTMLInputElement", - keygen: "HTMLKeygenElement", - label: "HTMLLabelElement", - legend: "HTMLLegendElement", - li: "HTMLLIElement", - link: "HTMLLinkElement", - map: "HTMLMapElement", - marquee: "HTMLMarqueeElement", - menu: "HTMLMenuElement", - menuitem: "HTMLMenuItemElement", - meta: "HTMLMetaElement", - meter: "HTMLMeterElement", - object: "HTMLObjectElement", - ol: "HTMLOListElement", - optgroup: "HTMLOptGroupElement", - option: "HTMLOptionElement", - output: "HTMLOutputElement", - p: "HTMLParagraphElement", - param: "HTMLParamElement", - pre: "HTMLPreElement", - progress: "HTMLProgressElement", - q: "HTMLQuoteElement", - script: "HTMLScriptElement", - select: "HTMLSelectElement", - shadow: "HTMLShadowElement", - source: "HTMLSourceElement", - span: "HTMLSpanElement", - style: "HTMLStyleElement", - table: "HTMLTableElement", - tbody: "HTMLTableSectionElement", - template: "HTMLTemplateElement", - textarea: "HTMLTextAreaElement", - thead: "HTMLTableSectionElement", - time: "HTMLTimeElement", - title: "HTMLTitleElement", - tr: "HTMLTableRowElement", - track: "HTMLTrackElement", - ul: "HTMLUListElement", - video: "HTMLVideoElement" - }; - function overrideConstructor(tagName) { - var nativeConstructorName = elements[tagName]; - var nativeConstructor = window[nativeConstructorName]; - if (!nativeConstructor) return; - var element = document.createElement(tagName); - var wrapperConstructor = element.constructor; - window[nativeConstructorName] = wrapperConstructor; - } - Object.keys(elements).forEach(overrideConstructor); - Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) { - window[name] = scope.wrappers[name]; - }); - })(window.ShadowDOMPolyfill); - (function(scope) { - var ShadowCSS = { - strictStyling: false, - registry: {}, - shimStyling: function(root, name, extendsName) { - var scopeStyles = this.prepareRoot(root, name, extendsName); - var typeExtension = this.isTypeExtension(extendsName); - var scopeSelector = this.makeScopeSelector(name, typeExtension); - var cssText = stylesToCssText(scopeStyles, true); - cssText = this.scopeCssText(cssText, scopeSelector); - if (root) { - root.shimmedStyle = cssText; - } - this.addCssToDocument(cssText, name); - }, - shimStyle: function(style, selector) { - return this.shimCssText(style.textContent, selector); - }, - shimCssText: function(cssText, selector) { - cssText = this.insertDirectives(cssText); - return this.scopeCssText(cssText, selector); - }, - makeScopeSelector: function(name, typeExtension) { - if (name) { - return typeExtension ? "[is=" + name + "]" : name; - } - return ""; - }, - isTypeExtension: function(extendsName) { - return extendsName && extendsName.indexOf("-") < 0; - }, - prepareRoot: function(root, name, extendsName) { - var def = this.registerRoot(root, name, extendsName); - this.replaceTextInStyles(def.rootStyles, this.insertDirectives); - this.removeStyles(root, def.rootStyles); - if (this.strictStyling) { - this.applyScopeToContent(root, name); - } - return def.scopeStyles; - }, - removeStyles: function(root, styles) { - for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) { - s.parentNode.removeChild(s); - } - }, - registerRoot: function(root, name, extendsName) { - var def = this.registry[name] = { - root: root, - name: name, - extendsName: extendsName - }; - var styles = this.findStyles(root); - def.rootStyles = styles; - def.scopeStyles = def.rootStyles; - var extendee = this.registry[def.extendsName]; - if (extendee) { - def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles); - } - return def; - }, - findStyles: function(root) { - if (!root) { - return []; - } - var styles = root.querySelectorAll("style"); - return Array.prototype.filter.call(styles, function(s) { - return !s.hasAttribute(NO_SHIM_ATTRIBUTE); - }); - }, - applyScopeToContent: function(root, name) { - if (root) { - Array.prototype.forEach.call(root.querySelectorAll("*"), function(node) { - node.setAttribute(name, ""); - }); - Array.prototype.forEach.call(root.querySelectorAll("template"), function(template) { - this.applyScopeToContent(template.content, name); - }, this); - } - }, - insertDirectives: function(cssText) { - cssText = this.insertPolyfillDirectivesInCssText(cssText); - return this.insertPolyfillRulesInCssText(cssText); - }, - insertPolyfillDirectivesInCssText: function(cssText) { - cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) { - return p1.slice(0, -2) + "{"; - }); - return cssText.replace(cssContentNextSelectorRe, function(match, p1) { - return p1 + " {"; - }); - }, - insertPolyfillRulesInCssText: function(cssText) { - cssText = cssText.replace(cssCommentRuleRe, function(match, p1) { - return p1.slice(0, -1); - }); - return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) { - var rule = match.replace(p1, "").replace(p2, ""); - return p3 + rule; - }); - }, - scopeCssText: function(cssText, scopeSelector) { - var unscoped = this.extractUnscopedRulesFromCssText(cssText); - cssText = this.insertPolyfillHostInCssText(cssText); - cssText = this.convertColonHost(cssText); - cssText = this.convertColonHostContext(cssText); - cssText = this.convertShadowDOMSelectors(cssText); - if (scopeSelector) { - var self = this, cssText; - withCssRules(cssText, function(rules) { - cssText = self.scopeRules(rules, scopeSelector); - }); - } - cssText = cssText + "\n" + unscoped; - return cssText.trim(); - }, - extractUnscopedRulesFromCssText: function(cssText) { - var r = "", m; - while (m = cssCommentUnscopedRuleRe.exec(cssText)) { - r += m[1].slice(0, -1) + "\n\n"; - } - while (m = cssContentUnscopedRuleRe.exec(cssText)) { - r += m[0].replace(m[2], "").replace(m[1], m[3]) + "\n\n"; - } - return r; - }, - convertColonHost: function(cssText) { - return this.convertColonRule(cssText, cssColonHostRe, this.colonHostPartReplacer); - }, - convertColonHostContext: function(cssText) { - return this.convertColonRule(cssText, cssColonHostContextRe, this.colonHostContextPartReplacer); - }, - convertColonRule: function(cssText, regExp, partReplacer) { - return cssText.replace(regExp, function(m, p1, p2, p3) { - p1 = polyfillHostNoCombinator; - if (p2) { - var parts = p2.split(","), r = []; - for (var i = 0, l = parts.length, p; i < l && (p = parts[i]); i++) { - p = p.trim(); - r.push(partReplacer(p1, p, p3)); - } - return r.join(","); - } else { - return p1 + p3; - } - }); - }, - colonHostContextPartReplacer: function(host, part, suffix) { - if (part.match(polyfillHost)) { - return this.colonHostPartReplacer(host, part, suffix); - } else { - return host + part + suffix + ", " + part + " " + host + suffix; - } - }, - colonHostPartReplacer: function(host, part, suffix) { - return host + part.replace(polyfillHost, "") + suffix; - }, - convertShadowDOMSelectors: function(cssText) { - for (var i = 0; i < shadowDOMSelectorsRe.length; i++) { - cssText = cssText.replace(shadowDOMSelectorsRe[i], " "); - } - return cssText; - }, - scopeRules: function(cssRules, scopeSelector) { - var cssText = ""; - if (cssRules) { - Array.prototype.forEach.call(cssRules, function(rule) { - if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) { - cssText += this.scopeSelector(rule.selectorText, scopeSelector, this.strictStyling) + " {\n "; - cssText += this.propertiesFromRule(rule) + "\n}\n\n"; - } else if (rule.type === CSSRule.MEDIA_RULE) { - cssText += "@media " + rule.media.mediaText + " {\n"; - cssText += this.scopeRules(rule.cssRules, scopeSelector); - cssText += "\n}\n\n"; - } else { - try { - if (rule.cssText) { - cssText += rule.cssText + "\n\n"; - } - } catch (x) { - if (rule.type === CSSRule.KEYFRAMES_RULE && rule.cssRules) { - cssText += this.ieSafeCssTextFromKeyFrameRule(rule); - } - } - } - }, this); - } - return cssText; - }, - ieSafeCssTextFromKeyFrameRule: function(rule) { - var cssText = "@keyframes " + rule.name + " {"; - Array.prototype.forEach.call(rule.cssRules, function(rule) { - cssText += " " + rule.keyText + " {" + rule.style.cssText + "}"; - }); - cssText += " }"; - return cssText; - }, - scopeSelector: function(selector, scopeSelector, strict) { - var r = [], parts = selector.split(","); - parts.forEach(function(p) { - p = p.trim(); - if (this.selectorNeedsScoping(p, scopeSelector)) { - p = strict && !p.match(polyfillHostNoCombinator) ? this.applyStrictSelectorScope(p, scopeSelector) : this.applySelectorScope(p, scopeSelector); - } - r.push(p); - }, this); - return r.join(", "); - }, - selectorNeedsScoping: function(selector, scopeSelector) { - if (Array.isArray(scopeSelector)) { - return true; - } - var re = this.makeScopeMatcher(scopeSelector); - return !selector.match(re); - }, - makeScopeMatcher: function(scopeSelector) { - scopeSelector = scopeSelector.replace(/\[/g, "\\[").replace(/\]/g, "\\]"); - return new RegExp("^(" + scopeSelector + ")" + selectorReSuffix, "m"); - }, - applySelectorScope: function(selector, selectorScope) { - return Array.isArray(selectorScope) ? this.applySelectorScopeList(selector, selectorScope) : this.applySimpleSelectorScope(selector, selectorScope); - }, - applySelectorScopeList: function(selector, scopeSelectorList) { - var r = []; - for (var i = 0, s; s = scopeSelectorList[i]; i++) { - r.push(this.applySimpleSelectorScope(selector, s)); - } - return r.join(", "); - }, - applySimpleSelectorScope: function(selector, scopeSelector) { - if (selector.match(polyfillHostRe)) { - selector = selector.replace(polyfillHostNoCombinator, scopeSelector); - return selector.replace(polyfillHostRe, scopeSelector + " "); - } else { - return scopeSelector + " " + selector; - } - }, - applyStrictSelectorScope: function(selector, scopeSelector) { - scopeSelector = scopeSelector.replace(/\[is=([^\]]*)\]/g, "$1"); - var splits = [ " ", ">", "+", "~" ], scoped = selector, attrName = "[" + scopeSelector + "]"; - splits.forEach(function(sep) { - var parts = scoped.split(sep); - scoped = parts.map(function(p) { - var t = p.trim().replace(polyfillHostRe, ""); - if (t && splits.indexOf(t) < 0 && t.indexOf(attrName) < 0) { - p = t.replace(/([^:]*)(:*)(.*)/, "$1" + attrName + "$2$3"); - } - return p; - }).join(sep); - }); - return scoped; - }, - insertPolyfillHostInCssText: function(selector) { - return selector.replace(colonHostContextRe, polyfillHostContext).replace(colonHostRe, polyfillHost); - }, - propertiesFromRule: function(rule) { - var cssText = rule.style.cssText; - if (rule.style.content && !rule.style.content.match(/['"]+|attr/)) { - cssText = cssText.replace(/content:[^;]*;/g, "content: '" + rule.style.content + "';"); - } - var style = rule.style; - for (var i in style) { - if (style[i] === "initial") { - cssText += i + ": initial; "; - } - } - return cssText; - }, - replaceTextInStyles: function(styles, action) { - if (styles && action) { - if (!(styles instanceof Array)) { - styles = [ styles ]; - } - Array.prototype.forEach.call(styles, function(s) { - s.textContent = action.call(this, s.textContent); - }, this); - } - }, - addCssToDocument: function(cssText, name) { - if (cssText.match("@import")) { - addOwnSheet(cssText, name); - } else { - addCssToDocument(cssText); - } - } - }; - var selectorRe = /([^{]*)({[\s\S]*?})/gim, cssCommentRe = /\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim, cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^\/*][^*]*\*+)*\/)([^{]*?){/gim, cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim, cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim, cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim, cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim, cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim, cssPseudoRe = /::(x-[^\s{,(]*)/gim, cssPartRe = /::part\(([^)]*)\)/gim, polyfillHost = "-shadowcsshost", polyfillHostContext = "-shadowcsscontext", parenSuffix = ")(?:\\((" + "(?:\\([^)(]*\\)|[^)(]*)+?" + ")\\))?([^,{]*)"; - var cssColonHostRe = new RegExp("(" + polyfillHost + parenSuffix, "gim"), cssColonHostContextRe = new RegExp("(" + polyfillHostContext + parenSuffix, "gim"), selectorReSuffix = "([>\\s~+[.,{:][\\s\\S]*)?$", colonHostRe = /\:host/gim, colonHostContextRe = /\:host-context/gim, polyfillHostNoCombinator = polyfillHost + "-no-combinator", polyfillHostRe = new RegExp(polyfillHost, "gim"), polyfillHostContextRe = new RegExp(polyfillHostContext, "gim"), shadowDOMSelectorsRe = [ />>>/g, /::shadow/g, /::content/g, /\/deep\//g, /\/shadow\//g, /\/shadow-deep\//g, /\^\^/g, /\^/g ]; - function stylesToCssText(styles, preserveComments) { - var cssText = ""; - Array.prototype.forEach.call(styles, function(s) { - cssText += s.textContent + "\n\n"; - }); - if (!preserveComments) { - cssText = cssText.replace(cssCommentRe, ""); - } - return cssText; - } - function cssTextToStyle(cssText) { - var style = document.createElement("style"); - style.textContent = cssText; - return style; - } - function cssToRules(cssText) { - var style = cssTextToStyle(cssText); - document.head.appendChild(style); - var rules = []; - if (style.sheet) { - try { - rules = style.sheet.cssRules; - } catch (e) {} - } else { - console.warn("sheet not found", style); - } - style.parentNode.removeChild(style); - return rules; - } - var frame = document.createElement("iframe"); - frame.style.display = "none"; - function initFrame() { - frame.initialized = true; - document.body.appendChild(frame); - var doc = frame.contentDocument; - var base = doc.createElement("base"); - base.href = document.baseURI; - doc.head.appendChild(base); - } - function inFrame(fn) { - if (!frame.initialized) { - initFrame(); - } - document.body.appendChild(frame); - fn(frame.contentDocument); - document.body.removeChild(frame); - } - var isChrome = navigator.userAgent.match("Chrome"); - function withCssRules(cssText, callback) { - if (!callback) { - return; - } - var rules; - if (cssText.match("@import") && isChrome) { - var style = cssTextToStyle(cssText); - inFrame(function(doc) { - doc.head.appendChild(style.impl); - rules = Array.prototype.slice.call(style.sheet.cssRules, 0); - callback(rules); - }); - } else { - rules = cssToRules(cssText); - callback(rules); - } - } - function rulesToCss(cssRules) { - for (var i = 0, css = []; i < cssRules.length; i++) { - css.push(cssRules[i].cssText); - } - return css.join("\n\n"); - } - function addCssToDocument(cssText) { - if (cssText) { - getSheet().appendChild(document.createTextNode(cssText)); - } - } - function addOwnSheet(cssText, name) { - var style = cssTextToStyle(cssText); - style.setAttribute(name, ""); - style.setAttribute(SHIMMED_ATTRIBUTE, ""); - document.head.appendChild(style); - } - var SHIM_ATTRIBUTE = "shim-shadowdom"; - var SHIMMED_ATTRIBUTE = "shim-shadowdom-css"; - var NO_SHIM_ATTRIBUTE = "no-shim"; - var sheet; - function getSheet() { - if (!sheet) { - sheet = document.createElement("style"); - sheet.setAttribute(SHIMMED_ATTRIBUTE, ""); - sheet[SHIMMED_ATTRIBUTE] = true; - } - return sheet; - } - if (window.ShadowDOMPolyfill) { - addCssToDocument("style { display: none !important; }\n"); - var doc = ShadowDOMPolyfill.wrap(document); - var head = doc.querySelector("head"); - head.insertBefore(getSheet(), head.childNodes[0]); - document.addEventListener("DOMContentLoaded", function() { - var urlResolver = scope.urlResolver; - if (window.HTMLImports && !HTMLImports.useNative) { - var SHIM_SHEET_SELECTOR = "link[rel=stylesheet]" + "[" + SHIM_ATTRIBUTE + "]"; - var SHIM_STYLE_SELECTOR = "style[" + SHIM_ATTRIBUTE + "]"; - HTMLImports.importer.documentPreloadSelectors += "," + SHIM_SHEET_SELECTOR; - HTMLImports.importer.importsPreloadSelectors += "," + SHIM_SHEET_SELECTOR; - HTMLImports.parser.documentSelectors = [ HTMLImports.parser.documentSelectors, SHIM_SHEET_SELECTOR, SHIM_STYLE_SELECTOR ].join(","); - var originalParseGeneric = HTMLImports.parser.parseGeneric; - HTMLImports.parser.parseGeneric = function(elt) { - if (elt[SHIMMED_ATTRIBUTE]) { - return; - } - var style = elt.__importElement || elt; - if (!style.hasAttribute(SHIM_ATTRIBUTE)) { - originalParseGeneric.call(this, elt); - return; - } - if (elt.__resource) { - style = elt.ownerDocument.createElement("style"); - style.textContent = elt.__resource; - } - HTMLImports.path.resolveUrlsInStyle(style, elt.href); - style.textContent = ShadowCSS.shimStyle(style); - style.removeAttribute(SHIM_ATTRIBUTE, ""); - style.setAttribute(SHIMMED_ATTRIBUTE, ""); - style[SHIMMED_ATTRIBUTE] = true; - if (style.parentNode !== head) { - if (elt.parentNode === head) { - head.replaceChild(style, elt); - } else { - this.addElementToDocument(style); - } - } - style.__importParsed = true; - this.markParsingComplete(elt); - this.parseNext(); - }; - var hasResource = HTMLImports.parser.hasResource; - HTMLImports.parser.hasResource = function(node) { - if (node.localName === "link" && node.rel === "stylesheet" && node.hasAttribute(SHIM_ATTRIBUTE)) { - return node.__resource; - } else { - return hasResource.call(this, node); - } - }; - } - }); - } - scope.ShadowCSS = ShadowCSS; - })(window.WebComponents); -} - -(function(scope) { - if (window.ShadowDOMPolyfill) { - window.wrap = ShadowDOMPolyfill.wrapIfNeeded; - window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded; - } else { - window.wrap = window.unwrap = function(n) { - return n; - }; - } -})(window.WebComponents); - -(function(scope) { - "use strict"; - var hasWorkingUrl = false; - if (!scope.forceJURL) { - try { - var u = new URL("b", "http://a"); - u.pathname = "c%20d"; - hasWorkingUrl = u.href === "http://a/c%20d"; - } catch (e) {} - } - if (hasWorkingUrl) return; - var relative = Object.create(null); - relative["ftp"] = 21; - relative["file"] = 0; - relative["gopher"] = 70; - relative["http"] = 80; - relative["https"] = 443; - relative["ws"] = 80; - relative["wss"] = 443; - var relativePathDotMapping = Object.create(null); - relativePathDotMapping["%2e"] = "."; - relativePathDotMapping[".%2e"] = ".."; - relativePathDotMapping["%2e."] = ".."; - relativePathDotMapping["%2e%2e"] = ".."; - function isRelativeScheme(scheme) { - return relative[scheme] !== undefined; - } - function invalid() { - clear.call(this); - this._isInvalid = true; - } - function IDNAToASCII(h) { - if ("" == h) { - invalid.call(this); - } - return h.toLowerCase(); - } - function percentEscape(c) { - var unicode = c.charCodeAt(0); - if (unicode > 32 && unicode < 127 && [ 34, 35, 60, 62, 63, 96 ].indexOf(unicode) == -1) { - return c; - } - return encodeURIComponent(c); - } - function percentEscapeQuery(c) { - var unicode = c.charCodeAt(0); - if (unicode > 32 && unicode < 127 && [ 34, 35, 60, 62, 96 ].indexOf(unicode) == -1) { - return c; - } - return encodeURIComponent(c); - } - var EOF = undefined, ALPHA = /[a-zA-Z]/, ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; - function parse(input, stateOverride, base) { - function err(message) { - errors.push(message); - } - var state = stateOverride || "scheme start", cursor = 0, buffer = "", seenAt = false, seenBracket = false, errors = []; - loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) { - var c = input[cursor]; - switch (state) { - case "scheme start": - if (c && ALPHA.test(c)) { - buffer += c.toLowerCase(); - state = "scheme"; - } else if (!stateOverride) { - buffer = ""; - state = "no scheme"; - continue; - } else { - err("Invalid scheme."); - break loop; - } - break; - - case "scheme": - if (c && ALPHANUMERIC.test(c)) { - buffer += c.toLowerCase(); - } else if (":" == c) { - this._scheme = buffer; - buffer = ""; - if (stateOverride) { - break loop; - } - if (isRelativeScheme(this._scheme)) { - this._isRelative = true; - } - if ("file" == this._scheme) { - state = "relative"; - } else if (this._isRelative && base && base._scheme == this._scheme) { - state = "relative or authority"; - } else if (this._isRelative) { - state = "authority first slash"; - } else { - state = "scheme data"; - } - } else if (!stateOverride) { - buffer = ""; - cursor = 0; - state = "no scheme"; - continue; - } else if (EOF == c) { - break loop; - } else { - err("Code point not allowed in scheme: " + c); - break loop; - } - break; - - case "scheme data": - if ("?" == c) { - this._query = "?"; - state = "query"; - } else if ("#" == c) { - this._fragment = "#"; - state = "fragment"; - } else { - if (EOF != c && " " != c && "\n" != c && "\r" != c) { - this._schemeData += percentEscape(c); - } - } - break; - - case "no scheme": - if (!base || !isRelativeScheme(base._scheme)) { - err("Missing scheme."); - invalid.call(this); - } else { - state = "relative"; - continue; - } - break; - - case "relative or authority": - if ("/" == c && "/" == input[cursor + 1]) { - state = "authority ignore slashes"; - } else { - err("Expected /, got: " + c); - state = "relative"; - continue; - } - break; - - case "relative": - this._isRelative = true; - if ("file" != this._scheme) this._scheme = base._scheme; - if (EOF == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._username = base._username; - this._password = base._password; - break loop; - } else if ("/" == c || "\\" == c) { - if ("\\" == c) err("\\ is an invalid code point."); - state = "relative slash"; - } else if ("?" == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = "?"; - this._username = base._username; - this._password = base._password; - state = "query"; - } else if ("#" == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._fragment = "#"; - this._username = base._username; - this._password = base._password; - state = "fragment"; - } else { - var nextC = input[cursor + 1]; - var nextNextC = input[cursor + 2]; - if ("file" != this._scheme || !ALPHA.test(c) || nextC != ":" && nextC != "|" || EOF != nextNextC && "/" != nextNextC && "\\" != nextNextC && "?" != nextNextC && "#" != nextNextC) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - this._path = base._path.slice(); - this._path.pop(); - } - state = "relative path"; - continue; - } - break; - - case "relative slash": - if ("/" == c || "\\" == c) { - if ("\\" == c) { - err("\\ is an invalid code point."); - } - if ("file" == this._scheme) { - state = "file host"; - } else { - state = "authority ignore slashes"; - } - } else { - if ("file" != this._scheme) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - } - state = "relative path"; - continue; - } - break; - - case "authority first slash": - if ("/" == c) { - state = "authority second slash"; - } else { - err("Expected '/', got: " + c); - state = "authority ignore slashes"; - continue; - } - break; - - case "authority second slash": - state = "authority ignore slashes"; - if ("/" != c) { - err("Expected '/', got: " + c); - continue; - } - break; - - case "authority ignore slashes": - if ("/" != c && "\\" != c) { - state = "authority"; - continue; - } else { - err("Expected authority, got: " + c); - } - break; - - case "authority": - if ("@" == c) { - if (seenAt) { - err("@ already seen."); - buffer += "%40"; - } - seenAt = true; - for (var i = 0; i < buffer.length; i++) { - var cp = buffer[i]; - if (" " == cp || "\n" == cp || "\r" == cp) { - err("Invalid whitespace in authority."); - continue; - } - if (":" == cp && null === this._password) { - this._password = ""; - continue; - } - var tempC = percentEscape(cp); - null !== this._password ? this._password += tempC : this._username += tempC; - } - buffer = ""; - } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) { - cursor -= buffer.length; - buffer = ""; - state = "host"; - continue; - } else { - buffer += c; - } - break; - - case "file host": - if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) { - if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ":" || buffer[1] == "|")) { - state = "relative path"; - } else if (buffer.length == 0) { - state = "relative path start"; - } else { - this._host = IDNAToASCII.call(this, buffer); - buffer = ""; - state = "relative path start"; - } - continue; - } else if (" " == c || "\n" == c || "\r" == c) { - err("Invalid whitespace in file host."); - } else { - buffer += c; - } - break; - - case "host": - case "hostname": - if (":" == c && !seenBracket) { - this._host = IDNAToASCII.call(this, buffer); - buffer = ""; - state = "port"; - if ("hostname" == stateOverride) { - break loop; - } - } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) { - this._host = IDNAToASCII.call(this, buffer); - buffer = ""; - state = "relative path start"; - if (stateOverride) { - break loop; - } - continue; - } else if (" " != c && "\n" != c && "\r" != c) { - if ("[" == c) { - seenBracket = true; - } else if ("]" == c) { - seenBracket = false; - } - buffer += c; - } else { - err("Invalid code point in host/hostname: " + c); - } - break; - - case "port": - if (/[0-9]/.test(c)) { - buffer += c; - } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c || stateOverride) { - if ("" != buffer) { - var temp = parseInt(buffer, 10); - if (temp != relative[this._scheme]) { - this._port = temp + ""; - } - buffer = ""; - } - if (stateOverride) { - break loop; - } - state = "relative path start"; - continue; - } else if (" " == c || "\n" == c || "\r" == c) { - err("Invalid code point in port: " + c); - } else { - invalid.call(this); - } - break; - - case "relative path start": - if ("\\" == c) err("'\\' not allowed in path."); - state = "relative path"; - if ("/" != c && "\\" != c) { - continue; - } - break; - - case "relative path": - if (EOF == c || "/" == c || "\\" == c || !stateOverride && ("?" == c || "#" == c)) { - if ("\\" == c) { - err("\\ not allowed in relative path."); - } - var tmp; - if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { - buffer = tmp; - } - if (".." == buffer) { - this._path.pop(); - if ("/" != c && "\\" != c) { - this._path.push(""); - } - } else if ("." == buffer && "/" != c && "\\" != c) { - this._path.push(""); - } else if ("." != buffer) { - if ("file" == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == "|") { - buffer = buffer[0] + ":"; - } - this._path.push(buffer); - } - buffer = ""; - if ("?" == c) { - this._query = "?"; - state = "query"; - } else if ("#" == c) { - this._fragment = "#"; - state = "fragment"; - } - } else if (" " != c && "\n" != c && "\r" != c) { - buffer += percentEscape(c); - } - break; - - case "query": - if (!stateOverride && "#" == c) { - this._fragment = "#"; - state = "fragment"; - } else if (EOF != c && " " != c && "\n" != c && "\r" != c) { - this._query += percentEscapeQuery(c); - } - break; - - case "fragment": - if (EOF != c && " " != c && "\n" != c && "\r" != c) { - this._fragment += c; - } - break; - } - cursor++; - } - } - function clear() { - this._scheme = ""; - this._schemeData = ""; - this._username = ""; - this._password = null; - this._host = ""; - this._port = ""; - this._path = []; - this._query = ""; - this._fragment = ""; - this._isInvalid = false; - this._isRelative = false; - } - function jURL(url, base) { - if (base !== undefined && !(base instanceof jURL)) base = new jURL(String(base)); - this._url = url; - clear.call(this); - var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ""); - parse.call(this, input, null, base); - } - jURL.prototype = { - toString: function() { - return this.href; - }, - get href() { - if (this._isInvalid) return this._url; - var authority = ""; - if ("" != this._username || null != this._password) { - authority = this._username + (null != this._password ? ":" + this._password : "") + "@"; - } - return this.protocol + (this._isRelative ? "//" + authority + this.host : "") + this.pathname + this._query + this._fragment; - }, - set href(href) { - clear.call(this); - parse.call(this, href); - }, - get protocol() { - return this._scheme + ":"; - }, - set protocol(protocol) { - if (this._isInvalid) return; - parse.call(this, protocol + ":", "scheme start"); - }, - get host() { - return this._isInvalid ? "" : this._port ? this._host + ":" + this._port : this._host; - }, - set host(host) { - if (this._isInvalid || !this._isRelative) return; - parse.call(this, host, "host"); - }, - get hostname() { - return this._host; - }, - set hostname(hostname) { - if (this._isInvalid || !this._isRelative) return; - parse.call(this, hostname, "hostname"); - }, - get port() { - return this._port; - }, - set port(port) { - if (this._isInvalid || !this._isRelative) return; - parse.call(this, port, "port"); - }, - get pathname() { - return this._isInvalid ? "" : this._isRelative ? "/" + this._path.join("/") : this._schemeData; - }, - set pathname(pathname) { - if (this._isInvalid || !this._isRelative) return; - this._path = []; - parse.call(this, pathname, "relative path start"); - }, - get search() { - return this._isInvalid || !this._query || "?" == this._query ? "" : this._query; - }, - set search(search) { - if (this._isInvalid || !this._isRelative) return; - this._query = "?"; - if ("?" == search[0]) search = search.slice(1); - parse.call(this, search, "query"); - }, - get hash() { - return this._isInvalid || !this._fragment || "#" == this._fragment ? "" : this._fragment; - }, - set hash(hash) { - if (this._isInvalid) return; - this._fragment = "#"; - if ("#" == hash[0]) hash = hash.slice(1); - parse.call(this, hash, "fragment"); - }, - get origin() { - var host; - if (this._isInvalid || !this._scheme) { - return ""; - } - switch (this._scheme) { - case "data": - case "file": - case "javascript": - case "mailto": - return "null"; - } - host = this.host; - if (!host) { - return ""; - } - return this._scheme + "://" + host; - } - }; - var OriginalURL = scope.URL; - if (OriginalURL) { - jURL.createObjectURL = function(blob) { - return OriginalURL.createObjectURL.apply(OriginalURL, arguments); - }; - jURL.revokeObjectURL = function(url) { - OriginalURL.revokeObjectURL(url); - }; - } - scope.URL = jURL; -})(self); - -(function(global) { - if (global.JsMutationObserver) { - return; - } - var registrationsTable = new WeakMap(); - var setImmediate; - if (/Trident|Edge/.test(navigator.userAgent)) { - setImmediate = setTimeout; - } else if (window.setImmediate) { - setImmediate = window.setImmediate; - } else { - var setImmediateQueue = []; - var sentinel = String(Math.random()); - window.addEventListener("message", function(e) { - if (e.data === sentinel) { - var queue = setImmediateQueue; - setImmediateQueue = []; - queue.forEach(function(func) { - func(); - }); - } - }); - setImmediate = function(func) { - setImmediateQueue.push(func); - window.postMessage(sentinel, "*"); - }; - } - var isScheduled = false; - var scheduledObservers = []; - function scheduleCallback(observer) { - scheduledObservers.push(observer); - if (!isScheduled) { - isScheduled = true; - setImmediate(dispatchCallbacks); - } - } - function wrapIfNeeded(node) { - return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node; - } - function dispatchCallbacks() { - isScheduled = false; - var observers = scheduledObservers; - scheduledObservers = []; - observers.sort(function(o1, o2) { - return o1.uid_ - o2.uid_; - }); - var anyNonEmpty = false; - observers.forEach(function(observer) { - var queue = observer.takeRecords(); - removeTransientObserversFor(observer); - if (queue.length) { - observer.callback_(queue, observer); - anyNonEmpty = true; - } - }); - if (anyNonEmpty) dispatchCallbacks(); - } - function removeTransientObserversFor(observer) { - observer.nodes_.forEach(function(node) { - var registrations = registrationsTable.get(node); - if (!registrations) return; - registrations.forEach(function(registration) { - if (registration.observer === observer) registration.removeTransientObservers(); - }); - }); - } - function forEachAncestorAndObserverEnqueueRecord(target, callback) { - for (var node = target; node; node = node.parentNode) { - var registrations = registrationsTable.get(node); - if (registrations) { - for (var j = 0; j < registrations.length; j++) { - var registration = registrations[j]; - var options = registration.options; - if (node !== target && !options.subtree) continue; - var record = callback(options); - if (record) registration.enqueue(record); - } - } - } - } - var uidCounter = 0; - function JsMutationObserver(callback) { - this.callback_ = callback; - this.nodes_ = []; - this.records_ = []; - this.uid_ = ++uidCounter; - } - JsMutationObserver.prototype = { - observe: function(target, options) { - target = wrapIfNeeded(target); - if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) { - throw new SyntaxError(); - } - var registrations = registrationsTable.get(target); - if (!registrations) registrationsTable.set(target, registrations = []); - var registration; - for (var i = 0; i < registrations.length; i++) { - if (registrations[i].observer === this) { - registration = registrations[i]; - registration.removeListeners(); - registration.options = options; - break; - } - } - if (!registration) { - registration = new Registration(this, target, options); - registrations.push(registration); - this.nodes_.push(target); - } - registration.addListeners(); - }, - disconnect: function() { - this.nodes_.forEach(function(node) { - var registrations = registrationsTable.get(node); - for (var i = 0; i < registrations.length; i++) { - var registration = registrations[i]; - if (registration.observer === this) { - registration.removeListeners(); - registrations.splice(i, 1); - break; - } - } - }, this); - this.records_ = []; - }, - takeRecords: function() { - var copyOfRecords = this.records_; - this.records_ = []; - return copyOfRecords; - } - }; - function MutationRecord(type, target) { - this.type = type; - this.target = target; - this.addedNodes = []; - this.removedNodes = []; - this.previousSibling = null; - this.nextSibling = null; - this.attributeName = null; - this.attributeNamespace = null; - this.oldValue = null; - } - function copyMutationRecord(original) { - var record = new MutationRecord(original.type, original.target); - record.addedNodes = original.addedNodes.slice(); - record.removedNodes = original.removedNodes.slice(); - record.previousSibling = original.previousSibling; - record.nextSibling = original.nextSibling; - record.attributeName = original.attributeName; - record.attributeNamespace = original.attributeNamespace; - record.oldValue = original.oldValue; - return record; - } - var currentRecord, recordWithOldValue; - function getRecord(type, target) { - return currentRecord = new MutationRecord(type, target); - } - function getRecordWithOldValue(oldValue) { - if (recordWithOldValue) return recordWithOldValue; - recordWithOldValue = copyMutationRecord(currentRecord); - recordWithOldValue.oldValue = oldValue; - return recordWithOldValue; - } - function clearRecords() { - currentRecord = recordWithOldValue = undefined; - } - function recordRepresentsCurrentMutation(record) { - return record === recordWithOldValue || record === currentRecord; - } - function selectRecord(lastRecord, newRecord) { - if (lastRecord === newRecord) return lastRecord; - if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue; - return null; - } - function Registration(observer, target, options) { - this.observer = observer; - this.target = target; - this.options = options; - this.transientObservedNodes = []; - } - Registration.prototype = { - enqueue: function(record) { - var records = this.observer.records_; - var length = records.length; - if (records.length > 0) { - var lastRecord = records[length - 1]; - var recordToReplaceLast = selectRecord(lastRecord, record); - if (recordToReplaceLast) { - records[length - 1] = recordToReplaceLast; - return; - } - } else { - scheduleCallback(this.observer); - } - records[length] = record; - }, - addListeners: function() { - this.addListeners_(this.target); - }, - addListeners_: function(node) { - var options = this.options; - if (options.attributes) node.addEventListener("DOMAttrModified", this, true); - if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true); - if (options.childList) node.addEventListener("DOMNodeInserted", this, true); - if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true); - }, - removeListeners: function() { - this.removeListeners_(this.target); - }, - removeListeners_: function(node) { - var options = this.options; - if (options.attributes) node.removeEventListener("DOMAttrModified", this, true); - if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true); - if (options.childList) node.removeEventListener("DOMNodeInserted", this, true); - if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true); - }, - addTransientObserver: function(node) { - if (node === this.target) return; - this.addListeners_(node); - this.transientObservedNodes.push(node); - var registrations = registrationsTable.get(node); - if (!registrations) registrationsTable.set(node, registrations = []); - registrations.push(this); - }, - removeTransientObservers: function() { - var transientObservedNodes = this.transientObservedNodes; - this.transientObservedNodes = []; - transientObservedNodes.forEach(function(node) { - this.removeListeners_(node); - var registrations = registrationsTable.get(node); - for (var i = 0; i < registrations.length; i++) { - if (registrations[i] === this) { - registrations.splice(i, 1); - break; - } - } - }, this); - }, - handleEvent: function(e) { - e.stopImmediatePropagation(); - switch (e.type) { - case "DOMAttrModified": - var name = e.attrName; - var namespace = e.relatedNode.namespaceURI; - var target = e.target; - var record = new getRecord("attributes", target); - record.attributeName = name; - record.attributeNamespace = namespace; - var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue; - forEachAncestorAndObserverEnqueueRecord(target, function(options) { - if (!options.attributes) return; - if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) { - return; - } - if (options.attributeOldValue) return getRecordWithOldValue(oldValue); - return record; - }); - break; - - case "DOMCharacterDataModified": - var target = e.target; - var record = getRecord("characterData", target); - var oldValue = e.prevValue; - forEachAncestorAndObserverEnqueueRecord(target, function(options) { - if (!options.characterData) return; - if (options.characterDataOldValue) return getRecordWithOldValue(oldValue); - return record; - }); - break; - - case "DOMNodeRemoved": - this.addTransientObserver(e.target); - - case "DOMNodeInserted": - var changedNode = e.target; - var addedNodes, removedNodes; - if (e.type === "DOMNodeInserted") { - addedNodes = [ changedNode ]; - removedNodes = []; - } else { - addedNodes = []; - removedNodes = [ changedNode ]; - } - var previousSibling = changedNode.previousSibling; - var nextSibling = changedNode.nextSibling; - var record = getRecord("childList", e.target.parentNode); - record.addedNodes = addedNodes; - record.removedNodes = removedNodes; - record.previousSibling = previousSibling; - record.nextSibling = nextSibling; - forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) { - if (!options.childList) return; - return record; - }); - } - clearRecords(); - } - }; - global.JsMutationObserver = JsMutationObserver; - if (!global.MutationObserver) { - global.MutationObserver = JsMutationObserver; - JsMutationObserver._isPolyfilled = true; - } -})(self); - -(function(scope) { - "use strict"; - if (!window.performance) { - var start = Date.now(); - window.performance = { - now: function() { - return Date.now() - start; - } - }; - } - if (!window.requestAnimationFrame) { - window.requestAnimationFrame = function() { - var nativeRaf = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; - return nativeRaf ? function(callback) { - return nativeRaf(function() { - callback(performance.now()); - }); - } : function(callback) { - return window.setTimeout(callback, 1e3 / 60); - }; - }(); - } - if (!window.cancelAnimationFrame) { - window.cancelAnimationFrame = function() { - return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) { - clearTimeout(id); - }; - }(); - } - var workingDefaultPrevented = function() { - var e = document.createEvent("Event"); - e.initEvent("foo", true, true); - e.preventDefault(); - return e.defaultPrevented; - }(); - if (!workingDefaultPrevented) { - var origPreventDefault = Event.prototype.preventDefault; - Event.prototype.preventDefault = function() { - if (!this.cancelable) { - return; - } - origPreventDefault.call(this); - Object.defineProperty(this, "defaultPrevented", { - get: function() { - return true; - }, - configurable: true - }); - }; - } - var isIE = /Trident/.test(navigator.userAgent); - if (!window.CustomEvent || isIE && typeof window.CustomEvent !== "function") { - window.CustomEvent = function(inType, params) { - params = params || {}; - var e = document.createEvent("CustomEvent"); - e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail); - return e; - }; - window.CustomEvent.prototype = window.Event.prototype; - } - if (!window.Event || isIE && typeof window.Event !== "function") { - var origEvent = window.Event; - window.Event = function(inType, params) { - params = params || {}; - var e = document.createEvent("Event"); - e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable)); - return e; - }; - window.Event.prototype = origEvent.prototype; - } -})(window.WebComponents); - -window.HTMLImports = window.HTMLImports || { - flags: {} -}; - -(function(scope) { - var IMPORT_LINK_TYPE = "import"; - var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement("link")); - var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill); - var wrap = function(node) { - return hasShadowDOMPolyfill ? window.ShadowDOMPolyfill.wrapIfNeeded(node) : node; - }; - var rootDocument = wrap(document); - var currentScriptDescriptor = { - get: function() { - var script = window.HTMLImports.currentScript || document.currentScript || (document.readyState !== "complete" ? document.scripts[document.scripts.length - 1] : null); - return wrap(script); - }, - configurable: true - }; - Object.defineProperty(document, "_currentScript", currentScriptDescriptor); - Object.defineProperty(rootDocument, "_currentScript", currentScriptDescriptor); - var isIE = /Trident/.test(navigator.userAgent); - function whenReady(callback, doc) { - doc = doc || rootDocument; - whenDocumentReady(function() { - watchImportsLoad(callback, doc); - }, doc); - } - var requiredReadyState = isIE ? "complete" : "interactive"; - var READY_EVENT = "readystatechange"; - function isDocumentReady(doc) { - return doc.readyState === "complete" || doc.readyState === requiredReadyState; - } - function whenDocumentReady(callback, doc) { - if (!isDocumentReady(doc)) { - var checkReady = function() { - if (doc.readyState === "complete" || doc.readyState === requiredReadyState) { - doc.removeEventListener(READY_EVENT, checkReady); - whenDocumentReady(callback, doc); - } - }; - doc.addEventListener(READY_EVENT, checkReady); - } else if (callback) { - callback(); - } - } - function markTargetLoaded(event) { - event.target.__loaded = true; - } - function watchImportsLoad(callback, doc) { - var imports = doc.querySelectorAll("link[rel=import]"); - var parsedCount = 0, importCount = imports.length, newImports = [], errorImports = []; - function checkDone() { - if (parsedCount == importCount && callback) { - callback({ - allImports: imports, - loadedImports: newImports, - errorImports: errorImports - }); - } - } - function loadedImport(e) { - markTargetLoaded(e); - newImports.push(this); - parsedCount++; - checkDone(); - } - function errorLoadingImport(e) { - errorImports.push(this); - parsedCount++; - checkDone(); - } - if (importCount) { - for (var i = 0, imp; i < importCount && (imp = imports[i]); i++) { - if (isImportLoaded(imp)) { - newImports.push(this); - parsedCount++; - checkDone(); - } else { - imp.addEventListener("load", loadedImport); - imp.addEventListener("error", errorLoadingImport); - } - } - } else { - checkDone(); - } - } - function isImportLoaded(link) { - return useNative ? link.__loaded || link.import && link.import.readyState !== "loading" : link.__importParsed; - } - if (useNative) { - new MutationObserver(function(mxns) { - for (var i = 0, l = mxns.length, m; i < l && (m = mxns[i]); i++) { - if (m.addedNodes) { - handleImports(m.addedNodes); - } - } - }).observe(document.head, { - childList: true - }); - function handleImports(nodes) { - for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { - if (isImport(n)) { - handleImport(n); - } - } - } - function isImport(element) { - return element.localName === "link" && element.rel === "import"; - } - function handleImport(element) { - var loaded = element.import; - if (loaded) { - markTargetLoaded({ - target: element - }); - } else { - element.addEventListener("load", markTargetLoaded); - element.addEventListener("error", markTargetLoaded); - } - } - (function() { - if (document.readyState === "loading") { - var imports = document.querySelectorAll("link[rel=import]"); - for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) { - handleImport(imp); - } - } - })(); - } - whenReady(function(detail) { - window.HTMLImports.ready = true; - window.HTMLImports.readyTime = new Date().getTime(); - var evt = rootDocument.createEvent("CustomEvent"); - evt.initCustomEvent("HTMLImportsLoaded", true, true, detail); - rootDocument.dispatchEvent(evt); - }); - scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE; - scope.useNative = useNative; - scope.rootDocument = rootDocument; - scope.whenReady = whenReady; - scope.isIE = isIE; -})(window.HTMLImports); - -(function(scope) { - var modules = []; - var addModule = function(module) { - modules.push(module); - }; - var initializeModules = function() { - modules.forEach(function(module) { - module(scope); - }); - }; - scope.addModule = addModule; - scope.initializeModules = initializeModules; -})(window.HTMLImports); - -window.HTMLImports.addModule(function(scope) { - var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g; - var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g; - var path = { - resolveUrlsInStyle: function(style, linkUrl) { - var doc = style.ownerDocument; - var resolver = doc.createElement("a"); - style.textContent = this.resolveUrlsInCssText(style.textContent, linkUrl, resolver); - return style; - }, - resolveUrlsInCssText: function(cssText, linkUrl, urlObj) { - var r = this.replaceUrls(cssText, urlObj, linkUrl, CSS_URL_REGEXP); - r = this.replaceUrls(r, urlObj, linkUrl, CSS_IMPORT_REGEXP); - return r; - }, - replaceUrls: function(text, urlObj, linkUrl, regexp) { - return text.replace(regexp, function(m, pre, url, post) { - var urlPath = url.replace(/["']/g, ""); - if (linkUrl) { - urlPath = new URL(urlPath, linkUrl).href; - } - urlObj.href = urlPath; - urlPath = urlObj.href; - return pre + "'" + urlPath + "'" + post; - }); - } - }; - scope.path = path; -}); - -window.HTMLImports.addModule(function(scope) { - var xhr = { - async: true, - ok: function(request) { - return request.status >= 200 && request.status < 300 || request.status === 304 || request.status === 0; - }, - load: function(url, next, nextContext) { - var request = new XMLHttpRequest(); - if (scope.flags.debug || scope.flags.bust) { - url += "?" + Math.random(); - } - request.open("GET", url, xhr.async); - request.addEventListener("readystatechange", function(e) { - if (request.readyState === 4) { - var redirectedUrl = null; - try { - var locationHeader = request.getResponseHeader("Location"); - if (locationHeader) { - redirectedUrl = locationHeader.substr(0, 1) === "/" ? location.origin + locationHeader : locationHeader; - } - } catch (e) { - console.error(e.message); - } - next.call(nextContext, !xhr.ok(request) && request, request.response || request.responseText, redirectedUrl); - } - }); - request.send(); - return request; - }, - loadDocument: function(url, next, nextContext) { - this.load(url, next, nextContext).responseType = "document"; - } - }; - scope.xhr = xhr; -}); - -window.HTMLImports.addModule(function(scope) { - var xhr = scope.xhr; - var flags = scope.flags; - var Loader = function(onLoad, onComplete) { - this.cache = {}; - this.onload = onLoad; - this.oncomplete = onComplete; - this.inflight = 0; - this.pending = {}; - }; - Loader.prototype = { - addNodes: function(nodes) { - this.inflight += nodes.length; - for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { - this.require(n); - } - this.checkDone(); - }, - addNode: function(node) { - this.inflight++; - this.require(node); - this.checkDone(); - }, - require: function(elt) { - var url = elt.src || elt.href; - elt.__nodeUrl = url; - if (!this.dedupe(url, elt)) { - this.fetch(url, elt); - } - }, - dedupe: function(url, elt) { - if (this.pending[url]) { - this.pending[url].push(elt); - return true; - } - var resource; - if (this.cache[url]) { - this.onload(url, elt, this.cache[url]); - this.tail(); - return true; - } - this.pending[url] = [ elt ]; - return false; - }, - fetch: function(url, elt) { - flags.load && console.log("fetch", url, elt); - if (!url) { - setTimeout(function() { - this.receive(url, elt, { - error: "href must be specified" - }, null); - }.bind(this), 0); - } else if (url.match(/^data:/)) { - var pieces = url.split(","); - var header = pieces[0]; - var body = pieces[1]; - if (header.indexOf(";base64") > -1) { - body = atob(body); - } else { - body = decodeURIComponent(body); - } - setTimeout(function() { - this.receive(url, elt, null, body); - }.bind(this), 0); - } else { - var receiveXhr = function(err, resource, redirectedUrl) { - this.receive(url, elt, err, resource, redirectedUrl); - }.bind(this); - xhr.load(url, receiveXhr); - } - }, - receive: function(url, elt, err, resource, redirectedUrl) { - this.cache[url] = resource; - var $p = this.pending[url]; - for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) { - this.onload(url, p, resource, err, redirectedUrl); - this.tail(); - } - this.pending[url] = null; - }, - tail: function() { - --this.inflight; - this.checkDone(); - }, - checkDone: function() { - if (!this.inflight) { - this.oncomplete(); - } - } - }; - scope.Loader = Loader; -}); - -window.HTMLImports.addModule(function(scope) { - var Observer = function(addCallback) { - this.addCallback = addCallback; - this.mo = new MutationObserver(this.handler.bind(this)); - }; - Observer.prototype = { - handler: function(mutations) { - for (var i = 0, l = mutations.length, m; i < l && (m = mutations[i]); i++) { - if (m.type === "childList" && m.addedNodes.length) { - this.addedNodes(m.addedNodes); - } - } - }, - addedNodes: function(nodes) { - if (this.addCallback) { - this.addCallback(nodes); - } - for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) { - if (n.children && n.children.length) { - this.addedNodes(n.children); - } - } - }, - observe: function(root) { - this.mo.observe(root, { - childList: true, - subtree: true - }); - } - }; - scope.Observer = Observer; -}); - -window.HTMLImports.addModule(function(scope) { - var path = scope.path; - var rootDocument = scope.rootDocument; - var flags = scope.flags; - var isIE = scope.isIE; - var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE; - var IMPORT_SELECTOR = "link[rel=" + IMPORT_LINK_TYPE + "]"; - var importParser = { - documentSelectors: IMPORT_SELECTOR, - importsSelectors: [ IMPORT_SELECTOR, "link[rel=stylesheet]:not([type])", "style:not([type])", "script:not([type])", 'script[type="application/javascript"]', 'script[type="text/javascript"]' ].join(","), - map: { - link: "parseLink", - script: "parseScript", - style: "parseStyle" - }, - dynamicElements: [], - parseNext: function() { - var next = this.nextToParse(); - if (next) { - this.parse(next); - } - }, - parse: function(elt) { - if (this.isParsed(elt)) { - flags.parse && console.log("[%s] is already parsed", elt.localName); - return; - } - var fn = this[this.map[elt.localName]]; - if (fn) { - this.markParsing(elt); - fn.call(this, elt); - } - }, - parseDynamic: function(elt, quiet) { - this.dynamicElements.push(elt); - if (!quiet) { - this.parseNext(); - } - }, - markParsing: function(elt) { - flags.parse && console.log("parsing", elt); - this.parsingElement = elt; - }, - markParsingComplete: function(elt) { - elt.__importParsed = true; - this.markDynamicParsingComplete(elt); - if (elt.__importElement) { - elt.__importElement.__importParsed = true; - this.markDynamicParsingComplete(elt.__importElement); - } - this.parsingElement = null; - flags.parse && console.log("completed", elt); - }, - markDynamicParsingComplete: function(elt) { - var i = this.dynamicElements.indexOf(elt); - if (i >= 0) { - this.dynamicElements.splice(i, 1); - } - }, - parseImport: function(elt) { - elt.import = elt.__doc; - if (window.HTMLImports.__importsParsingHook) { - window.HTMLImports.__importsParsingHook(elt); - } - if (elt.import) { - elt.import.__importParsed = true; - } - this.markParsingComplete(elt); - if (elt.__resource && !elt.__error) { - elt.dispatchEvent(new CustomEvent("load", { - bubbles: false - })); - } else { - elt.dispatchEvent(new CustomEvent("error", { - bubbles: false - })); - } - if (elt.__pending) { - var fn; - while (elt.__pending.length) { - fn = elt.__pending.shift(); - if (fn) { - fn({ - target: elt - }); - } - } - } - this.parseNext(); - }, - parseLink: function(linkElt) { - if (nodeIsImport(linkElt)) { - this.parseImport(linkElt); - } else { - linkElt.href = linkElt.href; - this.parseGeneric(linkElt); - } - }, - parseStyle: function(elt) { - var src = elt; - elt = cloneStyle(elt); - src.__appliedElement = elt; - elt.__importElement = src; - this.parseGeneric(elt); - }, - parseGeneric: function(elt) { - this.trackElement(elt); - this.addElementToDocument(elt); - }, - rootImportForElement: function(elt) { - var n = elt; - while (n.ownerDocument.__importLink) { - n = n.ownerDocument.__importLink; - } - return n; - }, - addElementToDocument: function(elt) { - var port = this.rootImportForElement(elt.__importElement || elt); - port.parentNode.insertBefore(elt, port); - }, - trackElement: function(elt, callback) { - var self = this; - var done = function(e) { - elt.removeEventListener("load", done); - elt.removeEventListener("error", done); - if (callback) { - callback(e); - } - self.markParsingComplete(elt); - self.parseNext(); - }; - elt.addEventListener("load", done); - elt.addEventListener("error", done); - if (isIE && elt.localName === "style") { - var fakeLoad = false; - if (elt.textContent.indexOf("@import") == -1) { - fakeLoad = true; - } else if (elt.sheet) { - fakeLoad = true; - var csr = elt.sheet.cssRules; - var len = csr ? csr.length : 0; - for (var i = 0, r; i < len && (r = csr[i]); i++) { - if (r.type === CSSRule.IMPORT_RULE) { - fakeLoad = fakeLoad && Boolean(r.styleSheet); - } - } - } - if (fakeLoad) { - setTimeout(function() { - elt.dispatchEvent(new CustomEvent("load", { - bubbles: false - })); - }); - } - } - }, - parseScript: function(scriptElt) { - var script = document.createElement("script"); - script.__importElement = scriptElt; - script.src = scriptElt.src ? scriptElt.src : generateScriptDataUrl(scriptElt); - scope.currentScript = scriptElt; - this.trackElement(script, function(e) { - if (script.parentNode) { - script.parentNode.removeChild(script); - } - scope.currentScript = null; - }); - this.addElementToDocument(script); - }, - nextToParse: function() { - this._mayParse = []; - return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic()); - }, - nextToParseInDoc: function(doc, link) { - if (doc && this._mayParse.indexOf(doc) < 0) { - this._mayParse.push(doc); - var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc)); - for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { - if (!this.isParsed(n)) { - if (this.hasResource(n)) { - return nodeIsImport(n) ? this.nextToParseInDoc(n.__doc, n) : n; - } else { - return; - } - } - } - } - return link; - }, - nextToParseDynamic: function() { - return this.dynamicElements[0]; - }, - parseSelectorsForNode: function(node) { - var doc = node.ownerDocument || node; - return doc === rootDocument ? this.documentSelectors : this.importsSelectors; - }, - isParsed: function(node) { - return node.__importParsed; - }, - needsDynamicParsing: function(elt) { - return this.dynamicElements.indexOf(elt) >= 0; - }, - hasResource: function(node) { - if (nodeIsImport(node) && node.__doc === undefined) { - return false; - } - return true; - } - }; - function nodeIsImport(elt) { - return elt.localName === "link" && elt.rel === IMPORT_LINK_TYPE; - } - function generateScriptDataUrl(script) { - var scriptContent = generateScriptContent(script); - return "data:text/javascript;charset=utf-8," + encodeURIComponent(scriptContent); - } - function generateScriptContent(script) { - return script.textContent + generateSourceMapHint(script); - } - function generateSourceMapHint(script) { - var owner = script.ownerDocument; - owner.__importedScripts = owner.__importedScripts || 0; - var moniker = script.ownerDocument.baseURI; - var num = owner.__importedScripts ? "-" + owner.__importedScripts : ""; - owner.__importedScripts++; - return "\n//# sourceURL=" + moniker + num + ".js\n"; - } - function cloneStyle(style) { - var clone = style.ownerDocument.createElement("style"); - clone.textContent = style.textContent; - path.resolveUrlsInStyle(clone); - return clone; - } - scope.parser = importParser; - scope.IMPORT_SELECTOR = IMPORT_SELECTOR; -}); - -window.HTMLImports.addModule(function(scope) { - var flags = scope.flags; - var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE; - var IMPORT_SELECTOR = scope.IMPORT_SELECTOR; - var rootDocument = scope.rootDocument; - var Loader = scope.Loader; - var Observer = scope.Observer; - var parser = scope.parser; - var importer = { - documents: {}, - documentPreloadSelectors: IMPORT_SELECTOR, - importsPreloadSelectors: [ IMPORT_SELECTOR ].join(","), - loadNode: function(node) { - importLoader.addNode(node); - }, - loadSubtree: function(parent) { - var nodes = this.marshalNodes(parent); - importLoader.addNodes(nodes); - }, - marshalNodes: function(parent) { - return parent.querySelectorAll(this.loadSelectorsForNode(parent)); - }, - loadSelectorsForNode: function(node) { - var doc = node.ownerDocument || node; - return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors; - }, - loaded: function(url, elt, resource, err, redirectedUrl) { - flags.load && console.log("loaded", url, elt); - elt.__resource = resource; - elt.__error = err; - if (isImportLink(elt)) { - var doc = this.documents[url]; - if (doc === undefined) { - doc = err ? null : makeDocument(resource, redirectedUrl || url); - if (doc) { - doc.__importLink = elt; - this.bootDocument(doc); - } - this.documents[url] = doc; - } - elt.__doc = doc; - } - parser.parseNext(); - }, - bootDocument: function(doc) { - this.loadSubtree(doc); - this.observer.observe(doc); - parser.parseNext(); - }, - loadedAll: function() { - parser.parseNext(); - } - }; - var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer)); - importer.observer = new Observer(); - function isImportLink(elt) { - return isLinkRel(elt, IMPORT_LINK_TYPE); - } - function isLinkRel(elt, rel) { - return elt.localName === "link" && elt.getAttribute("rel") === rel; - } - function hasBaseURIAccessor(doc) { - return !!Object.getOwnPropertyDescriptor(doc, "baseURI"); - } - function makeDocument(resource, url) { - var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE); - doc._URL = url; - var base = doc.createElement("base"); - base.setAttribute("href", url); - if (!doc.baseURI && !hasBaseURIAccessor(doc)) { - Object.defineProperty(doc, "baseURI", { - value: url - }); - } - var meta = doc.createElement("meta"); - meta.setAttribute("charset", "utf-8"); - doc.head.appendChild(meta); - doc.head.appendChild(base); - doc.body.innerHTML = resource; - if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) { - HTMLTemplateElement.bootstrap(doc); - } - return doc; - } - if (!document.baseURI) { - var baseURIDescriptor = { - get: function() { - var base = document.querySelector("base"); - return base ? base.href : window.location.href; - }, - configurable: true - }; - Object.defineProperty(document, "baseURI", baseURIDescriptor); - Object.defineProperty(rootDocument, "baseURI", baseURIDescriptor); - } - scope.importer = importer; - scope.importLoader = importLoader; -}); - -window.HTMLImports.addModule(function(scope) { - var parser = scope.parser; - var importer = scope.importer; - var dynamic = { - added: function(nodes) { - var owner, parsed, loading; - for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) { - if (!owner) { - owner = n.ownerDocument; - parsed = parser.isParsed(owner); - } - loading = this.shouldLoadNode(n); - if (loading) { - importer.loadNode(n); - } - if (this.shouldParseNode(n) && parsed) { - parser.parseDynamic(n, loading); - } - } - }, - shouldLoadNode: function(node) { - return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node)); - }, - shouldParseNode: function(node) { - return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node)); - } - }; - importer.observer.addCallback = dynamic.added.bind(dynamic); - var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector; -}); - -(function(scope) { - var initializeModules = scope.initializeModules; - var isIE = scope.isIE; - if (scope.useNative) { - return; - } - initializeModules(); - var rootDocument = scope.rootDocument; - function bootstrap() { - window.HTMLImports.importer.bootDocument(rootDocument); - } - if (document.readyState === "complete" || document.readyState === "interactive" && !window.attachEvent) { - bootstrap(); - } else { - document.addEventListener("DOMContentLoaded", bootstrap); - } -})(window.HTMLImports); - -window.CustomElements = window.CustomElements || { - flags: {} -}; - -(function(scope) { - var flags = scope.flags; - var modules = []; - var addModule = function(module) { - modules.push(module); - }; - var initializeModules = function() { - modules.forEach(function(module) { - module(scope); - }); - }; - scope.addModule = addModule; - scope.initializeModules = initializeModules; - scope.hasNative = Boolean(document.registerElement); - scope.isIE = /Trident/.test(navigator.userAgent); - scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || window.HTMLImports.useNative); -})(window.CustomElements); - -window.CustomElements.addModule(function(scope) { - var IMPORT_LINK_TYPE = window.HTMLImports ? window.HTMLImports.IMPORT_LINK_TYPE : "none"; - function forSubtree(node, cb) { - findAllElements(node, function(e) { - if (cb(e)) { - return true; - } - forRoots(e, cb); - }); - forRoots(node, cb); - } - function findAllElements(node, find, data) { - var e = node.firstElementChild; - if (!e) { - e = node.firstChild; - while (e && e.nodeType !== Node.ELEMENT_NODE) { - e = e.nextSibling; - } - } - while (e) { - if (find(e, data) !== true) { - findAllElements(e, find, data); - } - e = e.nextElementSibling; - } - return null; - } - function forRoots(node, cb) { - var root = node.shadowRoot; - while (root) { - forSubtree(root, cb); - root = root.olderShadowRoot; - } - } - function forDocumentTree(doc, cb) { - _forDocumentTree(doc, cb, []); - } - function _forDocumentTree(doc, cb, processingDocuments) { - doc = window.wrap(doc); - if (processingDocuments.indexOf(doc) >= 0) { - return; - } - processingDocuments.push(doc); - var imports = doc.querySelectorAll("link[rel=" + IMPORT_LINK_TYPE + "]"); - for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) { - if (n.import) { - _forDocumentTree(n.import, cb, processingDocuments); - } - } - cb(doc); - } - scope.forDocumentTree = forDocumentTree; - scope.forSubtree = forSubtree; -}); - -window.CustomElements.addModule(function(scope) { - var flags = scope.flags; - var forSubtree = scope.forSubtree; - var forDocumentTree = scope.forDocumentTree; - function addedNode(node, isAttached) { - return added(node, isAttached) || addedSubtree(node, isAttached); - } - function added(node, isAttached) { - if (scope.upgrade(node, isAttached)) { - return true; - } - if (isAttached) { - attached(node); - } - } - function addedSubtree(node, isAttached) { - forSubtree(node, function(e) { - if (added(e, isAttached)) { - return true; - } - }); - } - var hasThrottledAttached = window.MutationObserver._isPolyfilled && flags["throttle-attached"]; - scope.hasPolyfillMutations = hasThrottledAttached; - scope.hasThrottledAttached = hasThrottledAttached; - var isPendingMutations = false; - var pendingMutations = []; - function deferMutation(fn) { - pendingMutations.push(fn); - if (!isPendingMutations) { - isPendingMutations = true; - setTimeout(takeMutations); - } - } - function takeMutations() { - isPendingMutations = false; - var $p = pendingMutations; - for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) { - p(); - } - pendingMutations = []; - } - function attached(element) { - if (hasThrottledAttached) { - deferMutation(function() { - _attached(element); - }); - } else { - _attached(element); - } - } - function _attached(element) { - if (element.__upgraded__ && !element.__attached) { - element.__attached = true; - if (element.attachedCallback) { - element.attachedCallback(); - } - } - } - function detachedNode(node) { - detached(node); - forSubtree(node, function(e) { - detached(e); - }); - } - function detached(element) { - if (hasThrottledAttached) { - deferMutation(function() { - _detached(element); - }); - } else { - _detached(element); - } - } - function _detached(element) { - if (element.__upgraded__ && element.__attached) { - element.__attached = false; - if (element.detachedCallback) { - element.detachedCallback(); - } - } - } - function inDocument(element) { - var p = element; - var doc = window.wrap(document); - while (p) { - if (p == doc) { - return true; - } - p = p.parentNode || p.nodeType === Node.DOCUMENT_FRAGMENT_NODE && p.host; - } - } - function watchShadow(node) { - if (node.shadowRoot && !node.shadowRoot.__watched) { - flags.dom && console.log("watching shadow-root for: ", node.localName); - var root = node.shadowRoot; - while (root) { - observe(root); - root = root.olderShadowRoot; - } - } - } - function handler(root, mutations) { - if (flags.dom) { - var mx = mutations[0]; - if (mx && mx.type === "childList" && mx.addedNodes) { - if (mx.addedNodes) { - var d = mx.addedNodes[0]; - while (d && d !== document && !d.host) { - d = d.parentNode; - } - var u = d && (d.URL || d._URL || d.host && d.host.localName) || ""; - u = u.split("/?").shift().split("/").pop(); - } - } - console.group("mutations (%d) [%s]", mutations.length, u || ""); - } - var isAttached = inDocument(root); - mutations.forEach(function(mx) { - if (mx.type === "childList") { - forEach(mx.addedNodes, function(n) { - if (!n.localName) { - return; - } - addedNode(n, isAttached); - }); - forEach(mx.removedNodes, function(n) { - if (!n.localName) { - return; - } - detachedNode(n); - }); - } - }); - flags.dom && console.groupEnd(); - } - function takeRecords(node) { - node = window.wrap(node); - if (!node) { - node = window.wrap(document); - } - while (node.parentNode) { - node = node.parentNode; - } - var observer = node.__observer; - if (observer) { - handler(node, observer.takeRecords()); - takeMutations(); - } - } - var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach); - function observe(inRoot) { - if (inRoot.__observer) { - return; - } - var observer = new MutationObserver(handler.bind(this, inRoot)); - observer.observe(inRoot, { - childList: true, - subtree: true - }); - inRoot.__observer = observer; - } - function upgradeDocument(doc) { - doc = window.wrap(doc); - flags.dom && console.group("upgradeDocument: ", doc.baseURI.split("/").pop()); - var isMainDocument = doc === window.wrap(document); - addedNode(doc, isMainDocument); - observe(doc); - flags.dom && console.groupEnd(); - } - function upgradeDocumentTree(doc) { - forDocumentTree(doc, upgradeDocument); - } - var originalCreateShadowRoot = Element.prototype.createShadowRoot; - if (originalCreateShadowRoot) { - Element.prototype.createShadowRoot = function() { - var root = originalCreateShadowRoot.call(this); - window.CustomElements.watchShadow(this); - return root; - }; - } - scope.watchShadow = watchShadow; - scope.upgradeDocumentTree = upgradeDocumentTree; - scope.upgradeDocument = upgradeDocument; - scope.upgradeSubtree = addedSubtree; - scope.upgradeAll = addedNode; - scope.attached = attached; - scope.takeRecords = takeRecords; -}); - -window.CustomElements.addModule(function(scope) { - var flags = scope.flags; - function upgrade(node, isAttached) { - if (node.localName === "template") { - if (window.HTMLTemplateElement && HTMLTemplateElement.decorate) { - HTMLTemplateElement.decorate(node); - } - } - if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) { - var is = node.getAttribute("is"); - var definition = scope.getRegisteredDefinition(node.localName) || scope.getRegisteredDefinition(is); - if (definition) { - if (is && definition.tag == node.localName || !is && !definition.extends) { - return upgradeWithDefinition(node, definition, isAttached); - } - } - } - } - function upgradeWithDefinition(element, definition, isAttached) { - flags.upgrade && console.group("upgrade:", element.localName); - if (definition.is) { - element.setAttribute("is", definition.is); - } - implementPrototype(element, definition); - element.__upgraded__ = true; - created(element); - if (isAttached) { - scope.attached(element); - } - scope.upgradeSubtree(element, isAttached); - flags.upgrade && console.groupEnd(); - return element; - } - function implementPrototype(element, definition) { - if (Object.__proto__) { - element.__proto__ = definition.prototype; - } else { - customMixin(element, definition.prototype, definition.native); - element.__proto__ = definition.prototype; - } - } - function customMixin(inTarget, inSrc, inNative) { - var used = {}; - var p = inSrc; - while (p !== inNative && p !== HTMLElement.prototype) { - var keys = Object.getOwnPropertyNames(p); - for (var i = 0, k; k = keys[i]; i++) { - if (!used[k]) { - Object.defineProperty(inTarget, k, Object.getOwnPropertyDescriptor(p, k)); - used[k] = 1; - } - } - p = Object.getPrototypeOf(p); - } - } - function created(element) { - if (element.createdCallback) { - element.createdCallback(); - } - } - scope.upgrade = upgrade; - scope.upgradeWithDefinition = upgradeWithDefinition; - scope.implementPrototype = implementPrototype; -}); - -window.CustomElements.addModule(function(scope) { - var isIE = scope.isIE; - var upgradeDocumentTree = scope.upgradeDocumentTree; - var upgradeAll = scope.upgradeAll; - var upgradeWithDefinition = scope.upgradeWithDefinition; - var implementPrototype = scope.implementPrototype; - var useNative = scope.useNative; - function register(name, options) { - var definition = options || {}; - if (!name) { - throw new Error("document.registerElement: first argument `name` must not be empty"); - } - if (name.indexOf("-") < 0) { - throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '" + String(name) + "'."); - } - if (isReservedTag(name)) { - throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '" + String(name) + "'. The type name is invalid."); - } - if (getRegisteredDefinition(name)) { - throw new Error("DuplicateDefinitionError: a type with name '" + String(name) + "' is already registered"); - } - if (!definition.prototype) { - definition.prototype = Object.create(HTMLElement.prototype); - } - definition.__name = name.toLowerCase(); - if (definition.extends) { - definition.extends = definition.extends.toLowerCase(); - } - definition.lifecycle = definition.lifecycle || {}; - definition.ancestry = ancestry(definition.extends); - resolveTagName(definition); - resolvePrototypeChain(definition); - overrideAttributeApi(definition.prototype); - registerDefinition(definition.__name, definition); - definition.ctor = generateConstructor(definition); - definition.ctor.prototype = definition.prototype; - definition.prototype.constructor = definition.ctor; - if (scope.ready) { - upgradeDocumentTree(document); - } - return definition.ctor; - } - function overrideAttributeApi(prototype) { - if (prototype.setAttribute._polyfilled) { - return; - } - var setAttribute = prototype.setAttribute; - prototype.setAttribute = function(name, value) { - changeAttribute.call(this, name, value, setAttribute); - }; - var removeAttribute = prototype.removeAttribute; - prototype.removeAttribute = function(name) { - changeAttribute.call(this, name, null, removeAttribute); - }; - prototype.setAttribute._polyfilled = true; - } - function changeAttribute(name, value, operation) { - name = name.toLowerCase(); - var oldValue = this.getAttribute(name); - operation.apply(this, arguments); - var newValue = this.getAttribute(name); - if (this.attributeChangedCallback && newValue !== oldValue) { - this.attributeChangedCallback(name, oldValue, newValue); - } - } - function isReservedTag(name) { - for (var i = 0; i < reservedTagList.length; i++) { - if (name === reservedTagList[i]) { - return true; - } - } - } - var reservedTagList = [ "annotation-xml", "color-profile", "font-face", "font-face-src", "font-face-uri", "font-face-format", "font-face-name", "missing-glyph" ]; - function ancestry(extnds) { - var extendee = getRegisteredDefinition(extnds); - if (extendee) { - return ancestry(extendee.extends).concat([ extendee ]); - } - return []; - } - function resolveTagName(definition) { - var baseTag = definition.extends; - for (var i = 0, a; a = definition.ancestry[i]; i++) { - baseTag = a.is && a.tag; - } - definition.tag = baseTag || definition.__name; - if (baseTag) { - definition.is = definition.__name; - } - } - function resolvePrototypeChain(definition) { - if (!Object.__proto__) { - var nativePrototype = HTMLElement.prototype; - if (definition.is) { - var inst = document.createElement(definition.tag); - nativePrototype = Object.getPrototypeOf(inst); - } - var proto = definition.prototype, ancestor; - var foundPrototype = false; - while (proto) { - if (proto == nativePrototype) { - foundPrototype = true; - } - ancestor = Object.getPrototypeOf(proto); - if (ancestor) { - proto.__proto__ = ancestor; - } - proto = ancestor; - } - if (!foundPrototype) { - console.warn(definition.tag + " prototype not found in prototype chain for " + definition.is); - } - definition.native = nativePrototype; - } - } - function instantiate(definition) { - return upgradeWithDefinition(domCreateElement(definition.tag), definition); - } - var registry = {}; - function getRegisteredDefinition(name) { - if (name) { - return registry[name.toLowerCase()]; - } - } - function registerDefinition(name, definition) { - registry[name] = definition; - } - function generateConstructor(definition) { - return function() { - return instantiate(definition); - }; - } - var HTML_NAMESPACE = "http://www.w3.org/1999/xhtml"; - function createElementNS(namespace, tag, typeExtension) { - if (namespace === HTML_NAMESPACE) { - return createElement(tag, typeExtension); - } else { - return domCreateElementNS(namespace, tag); - } - } - function createElement(tag, typeExtension) { - if (tag) { - tag = tag.toLowerCase(); - } - if (typeExtension) { - typeExtension = typeExtension.toLowerCase(); - } - var definition = getRegisteredDefinition(typeExtension || tag); - if (definition) { - if (tag == definition.tag && typeExtension == definition.is) { - return new definition.ctor(); - } - if (!typeExtension && !definition.is) { - return new definition.ctor(); - } - } - var element; - if (typeExtension) { - element = createElement(tag); - element.setAttribute("is", typeExtension); - return element; - } - element = domCreateElement(tag); - if (tag.indexOf("-") >= 0) { - implementPrototype(element, HTMLElement); - } - return element; - } - var domCreateElement = document.createElement.bind(document); - var domCreateElementNS = document.createElementNS.bind(document); - var isInstance; - if (!Object.__proto__ && !useNative) { - isInstance = function(obj, ctor) { - if (obj instanceof ctor) { - return true; - } - var p = obj; - while (p) { - if (p === ctor.prototype) { - return true; - } - p = p.__proto__; - } - return false; - }; - } else { - isInstance = function(obj, base) { - return obj instanceof base; - }; - } - function wrapDomMethodToForceUpgrade(obj, methodName) { - var orig = obj[methodName]; - obj[methodName] = function() { - var n = orig.apply(this, arguments); - upgradeAll(n); - return n; - }; - } - wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode"); - wrapDomMethodToForceUpgrade(document, "importNode"); - document.registerElement = register; - document.createElement = createElement; - document.createElementNS = createElementNS; - scope.registry = registry; - scope.instanceof = isInstance; - scope.reservedTagList = reservedTagList; - scope.getRegisteredDefinition = getRegisteredDefinition; - document.register = document.registerElement; -}); - -(function(scope) { - var useNative = scope.useNative; - var initializeModules = scope.initializeModules; - var isIE = scope.isIE; - if (useNative) { - var nop = function() {}; - scope.watchShadow = nop; - scope.upgrade = nop; - scope.upgradeAll = nop; - scope.upgradeDocumentTree = nop; - scope.upgradeSubtree = nop; - scope.takeRecords = nop; - scope.instanceof = function(obj, base) { - return obj instanceof base; - }; - } else { - initializeModules(); - } - var upgradeDocumentTree = scope.upgradeDocumentTree; - var upgradeDocument = scope.upgradeDocument; - if (!window.wrap) { - if (window.ShadowDOMPolyfill) { - window.wrap = window.ShadowDOMPolyfill.wrapIfNeeded; - window.unwrap = window.ShadowDOMPolyfill.unwrapIfNeeded; - } else { - window.wrap = window.unwrap = function(node) { - return node; - }; - } - } - if (window.HTMLImports) { - window.HTMLImports.__importsParsingHook = function(elt) { - if (elt.import) { - upgradeDocument(wrap(elt.import)); - } - }; - } - function bootstrap() { - upgradeDocumentTree(window.wrap(document)); - window.CustomElements.ready = true; - var requestAnimationFrame = window.requestAnimationFrame || function(f) { - setTimeout(f, 16); - }; - requestAnimationFrame(function() { - setTimeout(function() { - window.CustomElements.readyTime = Date.now(); - if (window.HTMLImports) { - window.CustomElements.elapsed = window.CustomElements.readyTime - window.HTMLImports.readyTime; - } - document.dispatchEvent(new CustomEvent("WebComponentsReady", { - bubbles: true - })); - }); - }); - } - if (document.readyState === "complete" || scope.flags.eager) { - bootstrap(); - } else if (document.readyState === "interactive" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) { - bootstrap(); - } else { - var loadEvent = window.HTMLImports && !window.HTMLImports.ready ? "HTMLImportsLoaded" : "DOMContentLoaded"; - window.addEventListener(loadEvent, bootstrap); - } -})(window.CustomElements); - -(function(scope) { - if (!Function.prototype.bind) { - Function.prototype.bind = function(scope) { - var self = this; - var args = Array.prototype.slice.call(arguments, 1); - return function() { - var args2 = args.slice(); - args2.push.apply(args2, arguments); - return self.apply(scope, args2); - }; - }; - } -})(window.WebComponents); - -(function(scope) { - var style = document.createElement("style"); - style.textContent = "" + "body {" + "transition: opacity ease-in 0.2s;" + " } \n" + "body[unresolved] {" + "opacity: 0; display: block; overflow: hidden; position: relative;" + " } \n"; - var head = document.querySelector("head"); - head.insertBefore(style, head.firstChild); -})(window.WebComponents); - -(function(scope) { - window.Platform = scope; -})(window.WebComponents); \ No newline at end of file diff --git a/dashboard-ui/bower_components/webcomponentsjs/webcomponents.min.js b/dashboard-ui/bower_components/webcomponentsjs/webcomponents.min.js deleted file mode 100644 index a426238aaf..0000000000 --- a/dashboard-ui/bower_components/webcomponentsjs/webcomponents.min.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @license - * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. - * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - * Code distributed by Google as part of the polymer project is also - * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt - */ -// @version 0.7.22 -!function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,r=e.split("=");r[0]&&(t=r[0].match(/wc-(.+)/))&&(n[t[1]]=r[1]||!0)}),t)for(var r,o=0;r=t.attributes[o];o++)"src"!==r.name&&(n[r.name]=r.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.shadow=n.shadow||n.shadowdom||n.polyfill,"native"===n.shadow?n.shadow=!1:n.shadow=n.shadow||!HTMLElement.prototype.createShadowRoot,n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),WebComponents.flags.shadow&&("undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=W(t),r=0;rl;l++)c[l]=new Array(s),c[l][0]=l;for(var u=0;s>u;u++)c[0][u]=u;for(var l=1;a>l;l++)for(var u=1;s>u;u++)if(this.equals(e[t+u-1],r[o+l-1]))c[l][u]=c[l-1][u-1];else{var d=c[l-1][u]+1,p=c[l][u-1]+1;c[l][u]=p>d?d:p}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var l,u=e[t-1][n-1],d=e[t-1][n],p=e[t][n-1];l=p>d?u>d?d:u:u>p?p:u,l==u?(u==s?c.push(r):(c.push(o),s=u),t--,n--):l==d?(c.push(a),t--,s=d):(c.push(i),n--,s=p)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,l,u){var d=0,p=0,h=Math.min(s-n,u-l);if(0==n&&0==l&&(d=this.sharedPrefix(e,c,h)),s==e.length&&u==c.length&&(p=this.sharedSuffix(e,c,h-d)),n+=d,l+=d,s-=p,u-=p,s-n==0&&u-l==0)return[];if(n==s){for(var f=t(n,[],0);u>l;)f.removed.push(c[l++]);return[f]}if(l==u)return[t(n,[],s-n)];for(var m=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,l,u)),f=void 0,w=[],v=n,g=l,b=0;br;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;n>i&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t0){for(var u=0;u0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function u(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=A(t),a=A(n),s=r(n,e),o=l(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var u=0;u0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function w(e,t,n,r){var o=ie,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=ae,i=1;i0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===oe)return!0;n===ae&&(n=ie)}else if(n===ae&&!t.bubbles)return!0;if("relatedTarget"in t){var c=B(t),l=c.relatedTarget;if(l){if(l instanceof Object&&l.addEventListener){var d=V(l),p=u(t,e,d);if(p===a)return!0}else p=null;Z.set(t,p)}}J.set(t,n);var h=t.type,f=!1;X.set(t,a),Y.set(t,e),i.depth++;for(var m=0,w=i.length;w>m;m++){var v=i[m];if(v.removed)f=!0;else if(!(v.type!==h||!v.capture&&n===oe||v.capture&&n===ae))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),ee.get(t))return!1}catch(g){P||(P=g)}}if(i.depth--,f&&0===i.depth){var b=i.slice();i.length=0;for(var m=0;mr;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){O(e instanceof _)}function n(e){var t=new T;return t[0]=e,t.length=1,t}function r(e,t,n){N(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){N(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);U=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;U=!1;for(var a=0;ao;o++)r.appendChild(P(t[o]));return r}function w(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){O(t.parentNode===e);var n=t.nextSibling,r=P(t),o=r.parentNode;o&&X.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=P(e),a=i.firstChild;a;)n=a.nextSibling,X.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;ns;s++)i=b(t[s]),!o&&(a=v(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\/|::shadow|>>>/g," ")}function r(e){return String(e).replace(/:host\(([^\s]+)\)/g,"$1").replace(/([^\s]):host/g,"$1").replace(":host","*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g," ")}function o(e,t){for(var n,r=e.firstElementChild;r;){if(r.matches(t))return r;if(n=o(r,t))return n;r=r.nextElementSibling}return null}function i(e,t){return e.matches(t)}function a(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===j}function s(){return!0}function c(e,t,n){return e.localName===n}function l(e,t){return e.namespaceURI===t}function u(e,t,n){return e.namespaceURI===t&&e.localName===n}function d(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=d(a,t,n,r,o,i),a=a.nextElementSibling;return t}function p(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,null);if(c instanceof N)s=S.call(c,i);else{if(!(c instanceof C))return d(this,r,o,n,i,null);s=_.call(c,i)}return t(s,r,o,a)}function h(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=M.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function f(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=L.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=O.call(c,i,a)}return t(s,r,o,!1)}var m=e.wrappers.HTMLCollection,w=e.wrappers.NodeList,v=e.getTreeScope,g=e.unsafeUnwrap,b=e.wrap,y=document.querySelector,E=document.documentElement.querySelector,_=document.querySelectorAll,S=document.documentElement.querySelectorAll,T=document.getElementsByTagName,M=document.documentElement.getElementsByTagName,O=document.getElementsByTagNameNS,L=document.documentElement.getElementsByTagNameNS,N=window.Element,C=window.HTMLDocument||window.Document,j="http://www.w3.org/1999/xhtml",D={ -querySelector:function(t){var r=n(t),i=r!==t;t=r;var a,s=g(this),c=v(this).root;if(c instanceof e.wrappers.ShadowRoot)return o(this,t);if(s instanceof N)a=b(E.call(s,t));else{if(!(s instanceof C))return o(this,t);a=b(y.call(s,t))}return a&&!i&&(c=v(a).root)&&c instanceof e.wrappers.ShadowRoot?o(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var o=new w;return o.length=p.call(this,i,0,o,e,r),o}},H={matches:function(t){return t=r(t),e.originalMatches.call(g(this),t)}},x={getElementsByTagName:function(e){var t=new m,n="*"===e?s:a;return t.length=h.call(this,n,0,t,e,e.toLowerCase()),t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new m,r=null;return r="*"===e?"*"===t?s:c:"*"===t?l:u,n.length=f.call(this,r,0,n,e||null,t),n}};e.GetElementsByInterface=x,e.SelectorsInterface=D,e.MatchesInterface=H}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}},a={getElementById:function(e){return/[ \t\n\r\f]/.test(e)?null:this.querySelector('[id="'+e+'"]')}};e.ChildNodeInterface=i,e.NonElementParentNodeInterface=a,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get nodeValue(){return this.data},set nodeValue(e){this.data=e},get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return i(e).getAttribute("class")}function n(e,t){a(e,"attributes",{name:"class",namespace:null,oldValue:t})}function r(t){e.invalidateRendererBasedOnAttribute(t,"class")}function o(e,o,i){var a=e.ownerElement_;if(null==a)return o.apply(e,i);var s=t(a),c=o.apply(e,i);return t(a)!==s&&(n(a,s),r(a)),c}if(!window.DOMTokenList)return void console.warn("Missing DOMTokenList prototype, please include a compatible classList polyfill such as http://goo.gl/uTcepH.");var i=e.unsafeUnwrap,a=e.enqueueMutation,s=DOMTokenList.prototype.add;DOMTokenList.prototype.add=function(){o(this,s,arguments)};var c=DOMTokenList.prototype.remove;DOMTokenList.prototype.remove=function(){o(this,c,arguments)};var l=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(){return o(this,l,arguments)}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){u(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.ParentNodeInterface,c=e.SelectorsInterface,l=e.MatchesInterface,u=(e.addWrapNodeListMethod,e.enqueueMutation),d=e.mixin,p=(e.oneOf,e.registerWrapper),h=e.unsafeUnwrap,f=e.wrappers,m=window.Element,w=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return m.prototype[e]}),v=w[0],g=m.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),d(r.prototype,{createShadowRoot:function(){var t=new f.ShadowRoot(this);h(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return h(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=h(this).getAttribute(e);h(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=h(this).getAttribute(e);h(this).removeAttribute(e),n(this,e,r),t(this,e)},get classList(){var e=b.get(this);if(!e){if(e=h(this).classList,!e)return;e.ownerElement_=this,b.set(this,e)}return e},get className(){return h(this).className},set className(e){this.setAttribute("class",e)},get id(){return h(this).id},set id(e){this.setAttribute("id",e)}}),w.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),m.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),d(r.prototype,o),d(r.prototype,i),d(r.prototype,s),d(r.prototype,c),d(r.prototype,l),p(m,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=w,e.originalMatches=g,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&";case"<":return"<";case">":return">";case'"':return""";case" ":return" "}}function n(e){return e.replace(L,t)}function r(e){return e.replace(N,t)}function o(e){for(var t={},n=0;n"):c+">"+s(e)+"";case Node.TEXT_NODE:var d=e.data;return t&&j[t.localName]?d:r(d);case Node.COMMENT_NODE:return"";default:throw console.error(e),new Error("not implemented")}}function s(e){e instanceof O.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=a(n,e);return t}function c(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(M(i))}function l(e){m.call(this,e)}function u(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return M(o)}function d(t){return function(){return e.renderAllPending(),S(this)[t]}}function p(e){w(l,e,d(e))}function h(t){Object.defineProperty(l.prototype,t,{get:d(t),set:function(n){e.renderAllPending(),S(this)[t]=n},configurable:!0,enumerable:!0})}function f(t){Object.defineProperty(l.prototype,t,{value:function(){return e.renderAllPending(),S(this)[t].apply(S(this),arguments)},configurable:!0,enumerable:!0})}var m=e.wrappers.Element,w=e.defineGetter,v=e.enqueueMutation,g=e.mixin,b=e.nodesWereAdded,y=e.nodesWereRemoved,E=e.registerWrapper,_=e.snapshotNodeList,S=e.unsafeUnwrap,T=e.unwrap,M=e.wrap,O=e.wrappers,L=/[&\u00A0"]/g,N=/[&\u00A0<>]/g,C=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),j=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D="http://www.w3.org/1999/xhtml",H=/MSIE/.test(navigator.userAgent),x=window.HTMLElement,R=window.HTMLTemplateElement;l.prototype=Object.create(m.prototype),g(l.prototype,{get innerHTML(){return s(this)},set innerHTML(e){if(H&&j[this.localName])return void(this.textContent=e);var t=_(this.childNodes);this.invalidateShadowRenderer()?this instanceof O.HTMLTemplateElement?c(this.content,e):c(this,e,this.tagName):!R&&this instanceof O.HTMLTemplateElement?c(this.content,e):S(this).innerHTML=e;var n=_(this.childNodes);v(this,"childList",{addedNodes:n,removedNodes:t}),y(t),b(n,this)},get outerHTML(){return a(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=u(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=u(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(p),["scrollLeft","scrollTop"].forEach(h),["focus","getBoundingClientRect","getClientRects","scrollIntoView"].forEach(f),E(x,l,document.createElement("b")),e.wrappers.HTMLElement=l,e.getInnerHTML=s,e.setInnerHTML=c}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!p){var t=n(e);u.set(this,l(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.wrap,u=new WeakMap,d=new WeakMap,p=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return p?l(s(this).content):u.get(this)}}),p&&a(p,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,l=e.wrap,u=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return l(c(this).form)}}),a(u,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Element,r=e.wrappers.HTMLElement,o=e.registerWrapper,i=(e.defineWrapGetter,e.unsafeUnwrap),a=e.wrap,s=e.mixin,c="http://www.w3.org/2000/svg",l=window.SVGElement,u=document.createElementNS(c,"title");if(!("classList"in u)){var d=Object.getOwnPropertyDescriptor(n.prototype,"classList");Object.defineProperty(r.prototype,"classList",d),delete n.prototype.classList}t.prototype=Object.create(n.prototype),s(t.prototype,{get ownerSVGElement(){return a(i(this).ownerSVGElement)}}),o(l,t,document.createElementNS(c,"title")),e.wrappers.SVGElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){p.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),l=document.createElementNS(s,"use"),u=c.constructor,d=Object.getPrototypeOf(u.prototype),p=d.constructor;t.prototype=Object.create(d),"instanceRoot"in l&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,l),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(l,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){i(e,this)}var n=e.addForwardingProperties,r=e.mixin,o=e.registerWrapper,i=e.setWrapper,a=e.unsafeUnwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.WebGLRenderingContext;if(l){r(t.prototype,{get canvas(){return c(a(this).canvas)},texImage2D:function(){arguments[5]=s(arguments[5]),a(this).texImage2D.apply(a(this),arguments)},texSubImage2D:function(){arguments[6]=s(arguments[6]),a(this).texSubImage2D.apply(a(this),arguments)}});var u=Object.getPrototypeOf(l.prototype);u!==Object.prototype&&n(u,t.prototype);var d=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};o(l,t,d),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Node,r=e.GetElementsByInterface,o=e.NonElementParentNodeInterface,i=e.ParentNodeInterface,a=e.SelectorsInterface,s=e.mixin,c=e.registerObject,l=e.registerWrapper,u=window.DocumentFragment;t.prototype=Object.create(n.prototype),s(t.prototype,i),s(t.prototype,a),s(t.prototype,r),s(t.prototype,o),l(u,t,document.createDocumentFragment()),e.wrappers.DocumentFragment=t;var d=c(document.createComment(""));e.wrappers.Comment=d}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(u(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;f.set(this,o),this.treeScope_=new r(this,a(o||e)),h.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,l=e.setInnerHTML,u=e.unsafeUnwrap,d=e.unwrap,p=e.wrap,h=new WeakMap,f=new WeakMap;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return f.get(this)||null},get host(){return h.get(this)||null},invalidateShadowRenderer:function(){return h.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getSelection:function(){return document.getSelection()},get activeElement(){var e=d(this).ownerDocument.activeElement;if(!e||!e.nodeType)return null;for(var t=p(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(e).root;return t instanceof h?t.host:null}function n(t,n){if(t.shadowRoot){n=Math.min(t.childNodes.length-1,n);var r=t.childNodes[n];if(r){var o=e.getDestinationInsertionPoints(r);if(o.length>0){var i=o[0].parentNode;i.nodeType==Node.ELEMENT_NODE&&(t=i)}}}return t}function r(e){return e=u(e),t(e)||e}function o(e){a(e,this)}var i=e.registerWrapper,a=e.setWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.unwrapIfNeeded,u=e.wrap,d=e.getTreeScope,p=window.Range,h=e.wrappers.ShadowRoot;o.prototype={get startContainer(){return r(s(this).startContainer)},get endContainer(){return r(s(this).endContainer)},get commonAncestorContainer(){return r(s(this).commonAncestorContainer)},setStart:function(e,t){e=n(e,t),s(this).setStart(l(e),t)},setEnd:function(e,t){e=n(e,t),s(this).setEnd(l(e),t)},setStartBefore:function(e){s(this).setStartBefore(l(e))},setStartAfter:function(e){s(this).setStartAfter(l(e))},setEndBefore:function(e){s(this).setEndBefore(l(e))},setEndAfter:function(e){s(this).setEndAfter(l(e))},selectNode:function(e){s(this).selectNode(l(e))},selectNodeContents:function(e){s(this).selectNodeContents(l(e))},compareBoundaryPoints:function(e,t){return s(this).compareBoundaryPoints(e,c(t))},extractContents:function(){return u(s(this).extractContents())},cloneContents:function(){return u(s(this).cloneContents())},insertNode:function(e){s(this).insertNode(l(e))},surroundContents:function(e){s(this).surroundContents(l(e))},cloneRange:function(){return u(s(this).cloneRange())},isPointInRange:function(e,t){return s(this).isPointInRange(l(e),t)},comparePoint:function(e,t){return s(this).comparePoint(l(e),t)},intersectsNode:function(e){return s(this).intersectsNode(l(e))},toString:function(){return s(this).toString()}},p.prototype.createContextualFragment&&(o.prototype.createContextualFragment=function(e){return u(s(this).createContextualFragment(e))}),i(window.Range,o,document.createRange()),e.wrappers.Range=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var l=R(a.lastChild);l&&(l.nextSibling_=l.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){P.set(e,[])}function i(e){var t=P.get(e);return t||P.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;em;m++){var w=R(i[u++]);s.get(w)||r(w)}for(var v=h.addedCount,g=i[u]&&R(i[u]),m=0;v>m;m++){var b=o[l++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}d+=v}for(var p=d;p=0;o--){var i=r[o],a=m(i);if(a){var s=i.olderShadowRoot;s&&(n=f(s));for(var c=0;c=0;u--)l=Object.create(l);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(l[e]=function(){j(this)instanceof r||O(this),t.apply(j(this),arguments)})});var d={prototype:l};i&&(d["extends"]=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(l,r),e.nativePrototypeTable.set(o,l);k.call(C(this),t,d);return r},E([window.HTMLDocument||window.Document],["registerElement"])}E([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),E([window.HTMLBodyElement,window.HTMLHeadElement,window.HTMLHtmlElement],_),E([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","createTreeWalker","elementFromPoint","getElementById","getElementsByName","getSelection"]),S(t.prototype,l),S(t.prototype,d),S(t.prototype,f),S(t.prototype,p),S(t.prototype,{get implementation(){var e=H.get(this);return e?e:(e=new a(C(this).implementation),H.set(this,e),e)},get defaultView(){return j(C(this).defaultView)}}),T(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&T(window.HTMLDocument,t),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]);var A=document.implementation.createDocument;a.prototype.createDocument=function(){return arguments[2]=C(arguments[2]),j(A.apply(N(this),arguments))},s(a,"createDocumentType"),s(a,"createHTMLDocument"),c(a,"hasFeature"),T(window.DOMImplementation,a),E([window.DOMImplementation],["createDocument","createDocumentType","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,l=e.wrap,u=window.Window,d=window.getComputedStyle,p=window.getDefaultComputedStyle,h=window.getSelection;t.prototype=Object.create(n.prototype),u.prototype.getComputedStyle=function(e,t){return l(this||window).getComputedStyle(c(e),t)},p&&(u.prototype.getDefaultComputedStyle=function(e,t){return l(this||window).getDefaultComputedStyle(c(e),t)}),u.prototype.getSelection=function(){return l(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){u.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),d.call(s(this),c(e),t)},getSelection:function(){return a(),new r(h.call(s(this)))},get document(){return l(s(this).document)}}),p&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),p.call(s(this),c(e),t)}),i(u,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill),function(e){function t(e,t){var n="";return Array.prototype.forEach.call(e,function(e){n+=e.textContent+"\n\n"}),t||(n=n.replace(d,"")),n}function n(e){var t=document.createElement("style");return t.textContent=e,t}function r(e){var t=n(e);document.head.appendChild(t);var r=[];if(t.sheet)try{r=t.sheet.cssRules}catch(o){}else console.warn("sheet not found",t);return t.parentNode.removeChild(t),r}function o(){C.initialized=!0,document.body.appendChild(C);var e=C.contentDocument,t=e.createElement("base");t.href=document.baseURI,e.head.appendChild(t)}function i(e){C.initialized||o(),document.body.appendChild(C),e(C.contentDocument),document.body.removeChild(C)}function a(e,t){if(t){var o;if(e.match("@import")&&D){var a=n(e);i(function(e){e.head.appendChild(a.impl),o=Array.prototype.slice.call(a.sheet.cssRules,0),t(o)})}else o=r(e),t(o)}}function s(e){e&&l().appendChild(document.createTextNode(e))}function c(e,t){var r=n(e);r.setAttribute(t,""),r.setAttribute(x,""),document.head.appendChild(r)}function l(){return j||(j=document.createElement("style"),j.setAttribute(x,""),j[x]=!0),j}var u={strictStyling:!1,registry:{},shimStyling:function(e,n,r){var o=this.prepareRoot(e,n,r),i=this.isTypeExtension(r),a=this.makeScopeSelector(n,i),s=t(o,!0);s=this.scopeCssText(s,a),e&&(e.shimmedStyle=s),this.addCssToDocument(s,n)},shimStyle:function(e,t){return this.shimCssText(e.textContent,t)},shimCssText:function(e,t){return e=this.insertDirectives(e),this.scopeCssText(e,t)},makeScopeSelector:function(e,t){return e?t?"[is="+e+"]":e:""},isTypeExtension:function(e){return e&&e.indexOf("-")<0},prepareRoot:function(e,t,n){var r=this.registerRoot(e,t,n);return this.replaceTextInStyles(r.rootStyles,this.insertDirectives),this.removeStyles(e,r.rootStyles),this.strictStyling&&this.applyScopeToContent(e,t),r.scopeStyles},removeStyles:function(e,t){for(var n,r=0,o=t.length;o>r&&(n=t[r]);r++)n.parentNode.removeChild(n)},registerRoot:function(e,t,n){var r=this.registry[t]={root:e,name:t,extendsName:n},o=this.findStyles(e);r.rootStyles=o,r.scopeStyles=r.rootStyles;var i=this.registry[r.extendsName];return i&&(r.scopeStyles=i.scopeStyles.concat(r.scopeStyles)),r},findStyles:function(e){if(!e)return[];var t=e.querySelectorAll("style");return Array.prototype.filter.call(t,function(e){return!e.hasAttribute(R)})},applyScopeToContent:function(e,t){e&&(Array.prototype.forEach.call(e.querySelectorAll("*"),function(e){e.setAttribute(t,"")}),Array.prototype.forEach.call(e.querySelectorAll("template"),function(e){this.applyScopeToContent(e.content,t)},this))},insertDirectives:function(e){return e=this.insertPolyfillDirectivesInCssText(e),this.insertPolyfillRulesInCssText(e)},insertPolyfillDirectivesInCssText:function(e){return e=e.replace(p,function(e,t){return t.slice(0,-2)+"{"}),e.replace(h,function(e,t){return t+" {"})},insertPolyfillRulesInCssText:function(e){return e=e.replace(f,function(e,t){return t.slice(0,-1)}),e.replace(m,function(e,t,n,r){var o=e.replace(t,"").replace(n,"");return r+o})},scopeCssText:function(e,t){var n=this.extractUnscopedRulesFromCssText(e);if(e=this.insertPolyfillHostInCssText(e),e=this.convertColonHost(e),e=this.convertColonHostContext(e),e=this.convertShadowDOMSelectors(e),t){var e,r=this;a(e,function(n){e=r.scopeRules(n,t)})}return e=e+"\n"+n,e.trim()},extractUnscopedRulesFromCssText:function(e){for(var t,n="";t=w.exec(e);)n+=t[1].slice(0,-1)+"\n\n";for(;t=v.exec(e);)n+=t[0].replace(t[2],"").replace(t[1],t[3])+"\n\n";return n},convertColonHost:function(e){return this.convertColonRule(e,E,this.colonHostPartReplacer)},convertColonHostContext:function(e){return this.convertColonRule(e,_,this.colonHostContextPartReplacer)},convertColonRule:function(e,t,n){return e.replace(t,function(e,t,r,o){if(t=O,r){for(var i,a=r.split(","),s=[],c=0,l=a.length;l>c&&(i=a[c]);c++)i=i.trim(),s.push(n(t,i,o));return s.join(",")}return t+o})},colonHostContextPartReplacer:function(e,t,n){return t.match(g)?this.colonHostPartReplacer(e,t,n):e+t+n+", "+t+" "+e+n},colonHostPartReplacer:function(e,t,n){return e+t.replace(g,"")+n},convertShadowDOMSelectors:function(e){for(var t=0;t","+","~"],r=e,o="["+t+"]";return n.forEach(function(e){var t=r.split(e);r=t.map(function(e){var t=e.trim().replace(L,"");return t&&n.indexOf(t)<0&&t.indexOf(o)<0&&(e=t.replace(/([^:]*)(:*)(.*)/,"$1"+o+"$2$3")),e}).join(e)}),r},insertPolyfillHostInCssText:function(e){return e.replace(M,b).replace(T,g)},propertiesFromRule:function(e){var t=e.style.cssText;e.style.content&&!e.style.content.match(/['"]+|attr/)&&(t=t.replace(/content:[^;]*;/g,"content: '"+e.style.content+"';"));var n=e.style;for(var r in n)"initial"===n[r]&&(t+=r+": initial; ");return t},replaceTextInStyles:function(e,t){e&&t&&(e instanceof Array||(e=[e]),Array.prototype.forEach.call(e,function(e){e.textContent=t.call(this,e.textContent)},this))},addCssToDocument:function(e,t){e.match("@import")?c(e,t):s(e)}},d=/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,p=/\/\*\s*@polyfill ([^*]*\*+([^\/*][^*]*\*+)*\/)([^{]*?){/gim,h=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,f=/\/\*\s@polyfill-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,m=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,w=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,v=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,g="-shadowcsshost",b="-shadowcsscontext",y=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",E=new RegExp("("+g+y,"gim"),_=new RegExp("("+b+y,"gim"),S="([>\\s~+[.,{:][\\s\\S]*)?$",T=/\:host/gim,M=/\:host-context/gim,O=g+"-no-combinator",L=new RegExp(g,"gim"),N=(new RegExp(b,"gim"),[/>>>/g,/::shadow/g,/::content/g,/\/deep\//g,/\/shadow\//g,/\/shadow-deep\//g,/\^\^/g,/\^/g]),C=document.createElement("iframe");C.style.display="none";var j,D=navigator.userAgent.match("Chrome"),H="shim-shadowdom",x="shim-shadowdom-css",R="no-shim";if(window.ShadowDOMPolyfill){s("style { display: none !important; }\n");var I=ShadowDOMPolyfill.wrap(document),P=I.querySelector("head");P.insertBefore(l(),P.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){e.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var t="link[rel=stylesheet]["+H+"]",n="style["+H+"]";HTMLImports.importer.documentPreloadSelectors+=","+t,HTMLImports.importer.importsPreloadSelectors+=","+t,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,t,n].join(",");var r=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(e){if(!e[x]){var t=e.__importElement||e;if(!t.hasAttribute(H))return void r.call(this,e);e.__resource&&(t=e.ownerDocument.createElement("style"),t.textContent=e.__resource),HTMLImports.path.resolveUrlsInStyle(t,e.href),t.textContent=u.shimStyle(t),t.removeAttribute(H,""),t.setAttribute(x,""),t[x]=!0,t.parentNode!==P&&(e.parentNode===P?P.replaceChild(t,e):this.addElementToDocument(t)),t.__importParsed=!0,this.markParsingComplete(e),this.parseNext()}};var o=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(e){return"link"===e.localName&&"stylesheet"===e.rel&&e.hasAttribute(H)?e.__resource:o.call(this,e)}}})}e.ShadowCSS=u}(window.WebComponents)),function(e){window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}}(window.WebComponents),function(e){"use strict";function t(e){return void 0!==p[e]}function n(){s.call(this),this._isInvalid=!0}function r(e){return""==e&&n.call(this),e.toLowerCase()}function o(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){b.push(e)}var l=a||"scheme start",u=0,d="",v=!1,g=!1,b=[];e:for(;(e[u-1]!=f||0==u)&&!this._isInvalid;){var y=e[u];switch(l){case"scheme start":if(!y||!m.test(y)){if(a){c("Invalid scheme.");break e}d="",l="no scheme";continue}d+=y.toLowerCase(),l="scheme";break;case"scheme":if(y&&w.test(y))d+=y.toLowerCase();else{if(":"!=y){if(a){if(f==y)break e;c("Code point not allowed in scheme: "+y);break e}d="",u=0,l="no scheme";continue}if(this._scheme=d,d="",a)break e;t(this._scheme)&&(this._isRelative=!0),l="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==y?(this._query="?",l="query"):"#"==y?(this._fragment="#",l="fragment"):f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._schemeData+=o(y));break;case"no scheme":if(s&&t(s._scheme)){l="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=y||"/"!=e[u+1]){c("Expected /, got: "+y),l="relative";continue}l="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),f==y){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==y||"\\"==y)"\\"==y&&c("\\ is an invalid code point."),l="relative slash";else if("?"==y)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,l="query";else{if("#"!=y){var E=e[u+1],_=e[u+2];("file"!=this._scheme||!m.test(y)||":"!=E&&"|"!=E||f!=_&&"/"!=_&&"\\"!=_&&"?"!=_&&"#"!=_)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),l="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,l="fragment"}break;case"relative slash":if("/"!=y&&"\\"!=y){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),l="relative path";continue}"\\"==y&&c("\\ is an invalid code point."),l="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=y){c("Expected '/', got: "+y),l="authority ignore slashes";continue}l="authority second slash";break;case"authority second slash":if(l="authority ignore slashes","/"!=y){c("Expected '/', got: "+y);continue}break;case"authority ignore slashes":if("/"!=y&&"\\"!=y){l="authority";continue}c("Expected authority, got: "+y);break;case"authority":if("@"==y){v&&(c("@ already seen."),d+="%40"),v=!0;for(var S=0;S0){var o=n[r-1],i=h(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=w.get(e);t||w.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=w.get(e),n=0;nh&&(p=s[h]);h++)a(p)?(u.push(this),c++,n()):(p.addEventListener("load",r),p.addEventListener("error",i));else n()}function a(e){return d?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)c(t)&&l(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function l(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",d=Boolean(u in document.createElement("link")),p=Boolean(window.ShadowDOMPolyfill),h=function(e){return p?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},f=h(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return h(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(f,"_currentScript",m);var w=/Trident/.test(navigator.userAgent),v=w?"complete":"interactive",g="readystatechange";d&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)l(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=f.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),f.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=d,e.rootDocument=f,e.whenReady=t,e.isIE=w}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,l=e.isIE,u=e.IMPORT_LINK_TYPE,d="link[rel="+u+"]",p={documentSelectors:d,importsSelectors:[d,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),l&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=p,e.IMPORT_SELECTOR=d}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,l=e.Loader,u=e.Observer,d=e.parser,p={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){h.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);h.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:o(r,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}d.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),d.parseNext()},loadedAll:function(){d.parseNext()}},h=new l(p.loaded.bind(p),p.loadedAll.bind(p));if(p.observer=new u,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(c,"baseURI",f)}e.importer=p,e.importLoader=h}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var r,o=e.querySelectorAll("link[rel="+a+"]"),s=0,c=o.length;c>s&&(r=o[s]);s++)r["import"]&&i(r["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||r(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function r(e,t){b(e,function(e){return n(e,t)?!0:void 0})}function o(e){S.push(e),_||(_=!0,setTimeout(i))}function i(){_=!1;for(var e,t=S,n=0,r=t.length;r>n&&(e=t[n]);n++)e();S=[]}function a(e){E?o(function(){s(e)}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){l(e),b(e,function(e){l(e)})}function l(e){E?o(function(){u(e)}):u(e)}function u(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function d(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function p(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function h(e,n){if(g.dom){var r=n[0];if(r&&"childList"===r.type&&r.addedNodes&&r.addedNodes){for(var o=r.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var i=o&&(o.URL||o._URL||o.host&&o.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=d(e);n.forEach(function(e){"childList"===e.type&&(T(e.addedNodes,function(e){e.localName&&t(e,a)}),T(e.removedNodes,function(e){e.localName&&c(e)}))}),g.dom&&console.groupEnd()}function f(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(h(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(h.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function w(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),g.dom&&console.groupEnd()}function v(e){y(e,w)}var g=e.flags,b=e.forSubtree,y=e.forDocumentTree,E=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=E,e.hasThrottledAttached=E;var _=!1,S=[],T=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=p,e.upgradeDocumentTree=v,e.upgradeDocument=w,e.upgradeSubtree=r,e.upgradeAll=t,e.attached=a,e.takeRecords=f}),window.CustomElements.addModule(function(e){function t(t,r){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var o=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(o);if(i&&(o&&i.tag==t.localName||!o&&!i["extends"]))return n(t,i,r)}}function n(t,n,o){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),o&&e.attached(t),e.upgradeSubtree(t,o),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),window.CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(l(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c["extends"]&&(c["extends"]=c["extends"].toLowerCase()),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=d(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&w(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t=0&&b(r,HTMLElement),r)}function f(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return v(e),e}}var m,w=(e.isIE,e.upgradeDocumentTree),v=e.upgradeAll,g=e.upgradeWithDefinition,b=e.implementPrototype,y=e.useNative,E=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],_={},S="http://www.w3.org/1999/xhtml",T=document.createElement.bind(document),M=document.createElementNS.bind(document);m=Object.__proto__||y?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},f(Node.prototype,"cloneNode"),f(document,"importNode"),document.registerElement=t,document.createElement=h,document.createElementNS=p,e.registry=_,e["instanceof"]=m,e.reservedTagList=E,e.getRegisteredDefinition=l,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,r=e.initializeModules;e.isIE;if(n){var o=function(){};e.watchShadow=o,e.upgrade=o,e.upgradeAll=o,e.upgradeDocumentTree=o,e.upgradeSubtree=o,e.takeRecords=o,e["instanceof"]=function(e,t){return e instanceof t}}else r();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){Function.prototype.bind||(Function.prototype.bind=function(e){var t=this,n=Array.prototype.slice.call(arguments,1);return function(){var r=n.slice();return r.push.apply(r,arguments),t.apply(e,r)}})}(window.WebComponents),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents),function(e){window.Platform=e}(window.WebComponents); \ No newline at end of file diff --git a/dashboard-ui/components/imagedownloader/imagedownloader.js b/dashboard-ui/components/imagedownloader/imagedownloader.js index 574cf90092..868afe05a6 100644 --- a/dashboard-ui/components/imagedownloader/imagedownloader.js +++ b/dashboard-ui/components/imagedownloader/imagedownloader.js @@ -7,14 +7,7 @@ var hasChanges = false; // These images can be large and we're seeing memory problems in safari - var browsableImagePageSize; - - // This can handle more - if (window.IntersectionObserver) { - browsableImagePageSize = 100; - } else { - browsableImagePageSize = browserInfo.slow ? 6 : 30; - } + var browsableImagePageSize = browserInfo.slow ? 6 : 30; var browsableImageStartIndex = 0; var browsableImageType = 'Primary'; diff --git a/dashboard-ui/scripts/livetvitems.js b/dashboard-ui/scripts/livetvitems.js index 39006e876d..e6c2e8b773 100644 --- a/dashboard-ui/scripts/livetvitems.js +++ b/dashboard-ui/scripts/livetvitems.js @@ -60,6 +60,7 @@ items: result.Items, shape: query.IsMovie || params.type == 'RecordingSeries' ? 'portrait' : "backdrop", preferThumb: !query.IsMovie && params.type != 'RecordingSeries', + inheritThumb: params.type == 'Recordings', context: 'livetv', centerText: true, lazy: true, diff --git a/dashboard-ui/scripts/livetvrecordings.js b/dashboard-ui/scripts/livetvrecordings.js index bd8aaa9e24..1553b9a7f4 100644 --- a/dashboard-ui/scripts/livetvrecordings.js +++ b/dashboard-ui/scripts/livetvrecordings.js @@ -120,7 +120,7 @@ IsInProgress: false, Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', EnableTotalRecordCount: false, - EnableImageTypes: "Primary,Thumb" + EnableImageTypes: "Primary,Thumb,Backdrop" }).then(function (result) { diff --git a/dashboard-ui/scripts/livetvsuggested.js b/dashboard-ui/scripts/livetvsuggested.js index c457fb3466..2da7911d66 100644 --- a/dashboard-ui/scripts/livetvsuggested.js +++ b/dashboard-ui/scripts/livetvsuggested.js @@ -28,7 +28,7 @@ IsAiring: true, limit: limit, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Thumb", + EnableImageTypes: "Primary,Thumb,Backdrop", Fields: "ChannelInfo" }).then(function (result) { @@ -115,6 +115,7 @@ var html = cardBuilder.getCardsHtml({ items: items, preferThumb: !shape, + inheritThumb: false, shape: shape || (enableScrollX() ? 'overflowBackdrop' : 'backdrop'), showParentTitleOrTitle: true, showTitle: false, diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 2ff26b78f8..a52d2af0fd 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -842,7 +842,8 @@ var Dashboard = { supportsCustomSeeking: supportsCustomSeeking }); - if (!(AppInfo.isNativeApp && browserInfo.android)) { + if (!(AppInfo.isNativeApp && browserInfo.android) && !browserInfo.edge && !browserInfo.msie) { + // libjass not working here profile.SubtitleProfiles.push({ Format: 'ass', Method: 'External' @@ -1226,6 +1227,7 @@ var AppInfo = {}; define("emby-select", [embyWebComponentsBowerPath + "/emby-select/emby-select"], returnFirstDependency); define("emby-slider", [embyWebComponentsBowerPath + "/emby-slider/emby-slider"], returnFirstDependency); define("emby-checkbox", [embyWebComponentsBowerPath + "/emby-checkbox/emby-checkbox"], returnFirstDependency); + define("emby-toggle", [embyWebComponentsBowerPath + "/emby-toggle/emby-toggle"], returnFirstDependency); define("emby-radio", [embyWebComponentsBowerPath + "/emby-radio/emby-radio"], returnFirstDependency); define("emby-textarea", [embyWebComponentsBowerPath + "/emby-textarea/emby-textarea"], returnFirstDependency); define("collectionEditor", [embyWebComponentsBowerPath + "/collectioneditor/collectioneditor"], returnFirstDependency); From a219fc863aec0f3ce4d0f23e7eb5e642d02f004f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 17 Sep 2016 02:09:29 -0400 Subject: [PATCH 23/91] update startup tasks --- .../emby-toggle/emby-toggle.css | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css new file mode 100644 index 0000000000..14f6a7d130 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css @@ -0,0 +1,123 @@ +.mdl-switch { + position: relative; + z-index: 1; + vertical-align: middle; + display: inline-block; + box-sizing: border-box; + width: 100%; + height: 1.72em; + margin: 0; + padding: 0; + overflow: visible; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + padding-left: 2em; +} + +.toggleContainer { + margin-bottom: 1.8em; +} + +.mdl-switch__input { + line-height: 1.72em; +} + +.mdl-switch__input { + position: absolute; + width: 0; + height: 0; + margin: 0; + padding: 0; + opacity: 0; + -ms-appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + border: none; +} + +.mdl-switch__track { + background: rgba(255,255,255, 0.26); + position: absolute; + left: 0; + top: .36em; + height: 1em; + width: 2.58em; + border-radius: 1em; + cursor: pointer; +} + +.mdl-switch__input:checked + .mdl-switch__label + .mdl-switch__track { + background: rgba(204,51,51, 0.5); +} + +.mdl-switch__input[disabled] + .mdl-switch__label + .mdl-switch__track { + background: rgba(0,0,0, 0.12); + cursor: auto; +} + +.mdl-switch__thumb { + background: #999; + position: absolute; + left: 0; + top: .15em; + height: 1.44em; + width: 1.44em; + border-radius: 50%; + cursor: pointer; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transition-duration: 0.28s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: left; +} + +.mdl-switch__input:checked + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb { + background: rgb(204,51,51); + left: 1.146em; + box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 3px 3px -2px rgba(0, 0, 0, 0.2), 0 1px 8px 0 rgba(0, 0, 0, 0.12); +} + +.mdl-switch__input[disabled] + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb { + background: rgb(189,189,189); + cursor: auto; +} + +.mdl-switch__focus-helper { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + display: inline-block; + box-sizing: border-box; + width: .6em; + height: .6em; + border-radius: 50%; + background-color: transparent; +} + +.mdl-switch__input:focus + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb > .mdl-switch__focus-helper { + box-shadow: 0 0 0px 20px rgba(255,255,255, 0.26); + background-color: rgba(255,255,255, 0.26); +} + +.mdl-switch__input:checked:focus + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb > .mdl-switch__focus-helper { + box-shadow: 0 0 0px 20px rgba(204,51,51, 0.26); + background-color: rgba(204,51,51, 0.26); +} + +.mdl-switch__label { + position: relative; + cursor: pointer; + line-height: 1.72em; + margin: 0; + left: 1.52em; +} + +.mdl-switch__input[disabled] .mdl-switch__label { + color: rgb(189,189,189); + cursor: auto; +} From 42a332a9b3e106a6f3d3b11c4049b4da1d5a6e99 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 17 Sep 2016 02:18:25 -0400 Subject: [PATCH 24/91] update toggle --- .../bower_components/emby-webcomponents/.bower.json | 8 ++++---- .../emby-webcomponents/emby-toggle/emby-toggle.css | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index e75400a784..e9c678e676 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.252", - "_release": "1.4.252", + "version": "1.4.253", + "_release": "1.4.253", "_resolution": { "type": "version", - "tag": "1.4.252", - "commit": "05ef5c9690e73f86f9adc9177c1d1565daa04745" + "tag": "1.4.253", + "commit": "858cc490a36d41641aed43e556944f803d5f083a" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css index 14f6a7d130..60804f79a8 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css @@ -51,7 +51,7 @@ } .mdl-switch__input:checked + .mdl-switch__label + .mdl-switch__track { - background: rgba(204,51,51, 0.5); + background: rgba(82,181,75, 0.5); } .mdl-switch__input[disabled] + .mdl-switch__label + .mdl-switch__track { @@ -75,7 +75,7 @@ } .mdl-switch__input:checked + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb { - background: rgb(204,51,51); + background: rgb(82,181,75); left: 1.146em; box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 3px 3px -2px rgba(0, 0, 0, 0.2), 0 1px 8px 0 rgba(0, 0, 0, 0.12); } @@ -105,8 +105,8 @@ } .mdl-switch__input:checked:focus + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb > .mdl-switch__focus-helper { - box-shadow: 0 0 0px 20px rgba(204,51,51, 0.26); - background-color: rgba(204,51,51, 0.26); + box-shadow: 0 0 0px 20px rgba(82,181,75, 0.26); + background-color: rgba(82,181,75, 0.26); } .mdl-switch__label { From dd68bc561cbecf761aa79c99af78edf75bd81f3b Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 17 Sep 2016 13:01:58 -0400 Subject: [PATCH 25/91] update nlog, simpleinjector --- dashboard-ui/scripts/livetvchannel.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dashboard-ui/scripts/livetvchannel.js b/dashboard-ui/scripts/livetvchannel.js index 7021857a23..8f5be4aa38 100644 --- a/dashboard-ui/scripts/livetvchannel.js +++ b/dashboard-ui/scripts/livetvchannel.js @@ -51,7 +51,9 @@ UserId: Dashboard.getCurrentUserId(), HasAired: false, SortBy: "StartDate", - Limit: 200 + EnableTotalRecordCount: false, + EnableImages: false, + ImageTypeLimit: 0 }).then(function (result) { From 1f57d9b23196e6adb0cce34fc7b057b608896ebc Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 17 Sep 2016 14:03:42 -0400 Subject: [PATCH 26/91] update components --- .../emby-webcomponents/recordingcreator/recordingcreator.js | 1 + .../recordingcreator/recordingcreator.template.html | 2 ++ 2 files changed, 3 insertions(+) diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js index b5f5d570c5..9c489fad40 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js @@ -259,6 +259,7 @@ context.querySelector('.recordingDialog-itemName').innerHTML = program.Name; context.querySelector('.formDialogHeaderTitle').innerHTML = program.Name; context.querySelector('.itemGenres').innerHTML = (program.Genres || []).join(' / '); + context.querySelector('.itemOverview').innerHTML = program.Overview || ''; var btnPlay = context.querySelector('.btnPlay'); var now = new Date(); diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html index 6dc41232b0..65f799f4ac 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html @@ -17,6 +17,8 @@
+

+

- +
diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index e9c678e676..f88a264c0b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.253", - "_release": "1.4.253", + "version": "1.4.254", + "_release": "1.4.254", "_resolution": { "type": "version", - "tag": "1.4.253", - "commit": "858cc490a36d41641aed43e556944f803d5f083a" + "tag": "1.4.254", + "commit": "261edde431045d80a709a5ac89a8307e7e012f31" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css index c2c6763a16..27e6a3e427 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css +++ b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css @@ -4,10 +4,12 @@ padding: 0; border: none; max-height: 84%; + border-radius: 1px !important; } .actionsheet-fullscreen { max-height: none; + border-radius: 0 !important; } .actionSheetContent-centered { diff --git a/dashboard-ui/bower_components/emby-webcomponents/confirm/confirm.js b/dashboard-ui/bower_components/emby-webcomponents/confirm/confirm.js index f7c80885cf..0891ada469 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/confirm/confirm.js +++ b/dashboard-ui/bower_components/emby-webcomponents/confirm/confirm.js @@ -15,15 +15,15 @@ define(['dialog', 'globalize'], function (dialog, globalize) { var items = []; items.push({ - name: globalize.translate('sharedcomponents#ButtonOk'), - id: 'ok', - type: 'submit' + name: options.cancelText || globalize.translate('sharedcomponents#ButtonCancel'), + id: 'cancel', + type: options.primary == 'cancel' ? 'submit' : 'cancel' }); items.push({ - name: globalize.translate('sharedcomponents#ButtonCancel'), - id: 'cancel', - type: 'cancel' + name: options.confirmText || globalize.translate('sharedcomponents#ButtonOk'), + id: 'ok', + type: options.primary == 'cancel' ? 'cancel' : 'submit' }); options.buttons = items; diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js b/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js index ef728db827..5b212ad9b3 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js +++ b/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js @@ -1,21 +1,5 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function (dialogHelper, dom, layoutManager, scrollHelper, globalize, require) { - function showTvDialog(options) { - return new Promise(function (resolve, reject) { - - require(['actionsheet'], function (actionSheet) { - - actionSheet.show({ - - title: options.text, - items: options.buttons, - timeout: options.timeout - - }).then(resolve, reject); - }); - }); - } - function showDialog(options, template) { var dialogOptions = { @@ -23,7 +7,9 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're scrollY: false }; - if (layoutManager.tv) { + var enableTvLayout = layoutManager.tv; + + if (enableTvLayout) { dialogOptions.size = 'fullscreen'; } else { //dialogOptions.size = 'mini'; @@ -35,10 +21,17 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're dlg.innerHTML = globalize.translateHtml(template, 'sharedcomponents'); - if (layoutManager.tv) { - scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); + if (enableTvLayout) { + dlg.style['align-items'] = 'center'; + dlg.style['justify-content'] = 'center'; + var formDialogContent = dlg.querySelector('.formDialogContent'); + formDialogContent.style['flex-grow'] = 'initial'; + formDialogContent.style['max-width'] = '50%'; + formDialogContent.style['max-height'] = '60%'; + scrollHelper.centerFocus.on(formDialogContent, false); } else { - dlg.querySelector('.dialogContentInner').classList.add('dialogContentInner-mini'); + var minWidth = (Math.min(options.buttons.length * 150, dom.getWindowSize().innerWidth - 50)); + dlg.style.maxWidth = (minWidth + 200) + 'px'; } //dlg.querySelector('.btnCancel').addEventListener('click', function (e) { @@ -56,7 +49,7 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're var item = options.buttons[i]; var autoFocus = i == 0 ? ' autofocus' : ''; - var buttonClass = 'btnOption raised block formDialogFooterItem'; + var buttonClass = 'btnOption raised formDialogFooterItem formDialogFooterItem-autosize'; if (item.type) { buttonClass += ' button-' + item.type; @@ -65,8 +58,6 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're html += ''; } - dlg.style.minWidth = (Math.min(options.buttons.length * 150, dom.getWindowSize().innerWidth - 50)) + 'px'; - dlg.querySelector('.formDialogFooter').innerHTML = html; var dialogResult; @@ -82,7 +73,7 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're return dialogHelper.open(dlg).then(function () { - if (layoutManager.tv) { + if (enableTvLayout) { scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); } @@ -106,10 +97,6 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're options = text; } - if (layoutManager.tv) { - return showTvDialog(options); - } - return new Promise(function (resolve, reject) { require(['text!./dialog.template.html'], function (template) { showDialog(options, template).then(resolve, reject); diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.template.html b/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.template.html index 61d81d900e..96fc5ae5ed 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.template.html @@ -1,16 +1,15 @@ -
-

- +
+

-
+
- -
-
+
+ +
\ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.css b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.css index e8119c0671..fb3a8dd7e1 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.css +++ b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.css @@ -13,7 +13,7 @@ .dialog { margin: 0; - border-radius: 1px; + border-radius: 4px; -webkit-font-smoothing: antialiased; box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.4); border: 0; diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css b/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css index ac394bd7dc..565d9cfc6a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css @@ -26,7 +26,6 @@ position: relative; overflow: hidden; font-weight: 500; - text-transform: uppercase; /* Disable webkit tap highlighting */ -webkit-tap-highlight-color: rgba(0,0,0,0); box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); diff --git a/dashboard-ui/bower_components/emby-webcomponents/formdialog.css b/dashboard-ui/bower_components/emby-webcomponents/formdialog.css index cae3b85055..28cceac866 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/formdialog.css +++ b/dashboard-ui/bower_components/emby-webcomponents/formdialog.css @@ -15,6 +15,10 @@ background-color: #222326; } +.formDialogHeader-clear, .formDialogFooter-clear { + background-color: transparent; +} + .formDialogHeaderTitle { margin-left: .25em; /* In case of h1, h2, h3 */ @@ -57,6 +61,10 @@ flex-wrap: wrap; } +.formDialogFooter-flex { + position: static; +} + .formDialogFooterItem { margin-left: .5em !important; margin-right: .5em !important; @@ -65,6 +73,13 @@ flex-basis: 0; } +.formDialogFooterItem-autosize { + flex-basis: initial; + flex-grow: initial; + padding-left: 2em; + padding-right: 2em; +} + @media all and (min-width: 800px) { .formDialogFooterItem { diff --git a/dashboard-ui/bower_components/emby-webcomponents/imageeditor/imageeditor.js b/dashboard-ui/bower_components/emby-webcomponents/imageeditor/imageeditor.js index f82200c10d..e3525f8074 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/imageeditor/imageeditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/imageeditor/imageeditor.js @@ -192,7 +192,13 @@ require(['confirm'], function (confirm) { - confirm(globalize.translate('sharedcomponents#ConfirmDeleteImage')).then(afterConfirm); + confirm({ + + text: globalize.translate('sharedcomponents#ConfirmDeleteImage'), + confirmText: globalize.translate('sharedcomponents#Delete'), + primary: 'cancel' + + }).then(afterConfirm); }); } diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js index 9b9aee75cd..64252f3b1a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js +++ b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js @@ -37,10 +37,18 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', } if (item.CanDelete) { - commands.push({ - name: globalize.translate('sharedcomponents#Delete'), - id: 'delete' - }); + + if (item.Type == 'Playlist' || item.Type == 'BoxSet') { + commands.push({ + name: globalize.translate('sharedcomponents#Delete'), + id: 'delete' + }); + } else { + commands.push({ + name: globalize.translate('sharedcomponents#DeleteMedia'), + id: 'delete' + }); + } } if (itemHelper.canEdit(user, item.Type)) { @@ -383,7 +391,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', } case 'delete': { - deleteItem(apiClient, itemId).then(getResolveFunction(resolve, id, true, true), getResolveFunction(resolve, id)); + deleteItem(apiClient, item).then(getResolveFunction(resolve, id, true, true), getResolveFunction(resolve, id)); break; } case 'share': @@ -550,16 +558,25 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', }); } - function deleteItem(apiClient, itemId) { + function deleteItem(apiClient, item) { return new Promise(function (resolve, reject) { + var itemId = item.Id; + var msg = globalize.translate('sharedcomponents#ConfirmDeleteItem'); var title = globalize.translate('sharedcomponents#HeaderDeleteItem'); require(['confirm'], function (confirm) { - confirm(msg, title).then(function () { + confirm({ + + title: title, + text: msg, + confirmText: globalize.translate('sharedcomponents#Delete'), + primary: 'cancel' + + }).then(function () { apiClient.deleteItem(itemId).then(function () { resolve(true); diff --git a/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.js b/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.js index b5c9951d62..f22f9418cf 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.js +++ b/dashboard-ui/bower_components/emby-webcomponents/multiselect/multiselect.js @@ -409,26 +409,18 @@ return; } - var msg = globalize.translate('sharedcomponents#TheSelectedItemsWillBeGrouped'); + loading.show(); - require(['confirm'], function (confirm) { + apiClient.ajax({ - confirm(msg, globalize.translate('sharedcomponents#GroupVersions')).then(function () { + type: "POST", + url: apiClient.getUrl("Videos/MergeVersions", { Ids: selection.join(',') }) - loading.show(); + }).then(function () { - apiClient.ajax({ - - type: "POST", - url: apiClient.getUrl("Videos/MergeVersions", { Ids: selection.join(',') }) - - }).then(function () { - - loading.hide(); - hideSelections(); - dispatchNeedsRefresh(); - }); - }); + loading.hide(); + hideSelections(); + dispatchNeedsRefresh(); }); } diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js index 260c7885e8..10f7c394d9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js @@ -12,7 +12,15 @@ require(['confirm'], function (confirm) { - confirm(globalize.translate('sharedcomponents#MessageConfirmRecordingCancellation'), globalize.translate('sharedcomponents#HeaderConfirmRecordingCancellation')).then(function () { + confirm({ + + title: globalize.translate('sharedcomponents#HeaderConfirmRecordingCancellation'), + text: globalize.translate('sharedcomponents#MessageConfirmRecordingCancellation'), + confirmText: globalize.translate('sharedcomponents#HeaderCancelRecording'), + cancelText: globalize.translate('sharedcomponents#HeaderKeepRecording'), + primary: 'cancel' + + }).then(function () { loading.show(); diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ar.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ar.json index 95bb376dbf..731019da71 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ar.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ar.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/bg-BG.json b/dashboard-ui/bower_components/emby-webcomponents/strings/bg-BG.json index 967c8bce37..5dcd456288 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/bg-BG.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/bg-BG.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u0414\u043e\u0431\u0430\u0432\u0438", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ca.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ca.json index 150c9c2895..911f4362f8 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ca.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ca.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Afegeix", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/cs.json b/dashboard-ui/bower_components/emby-webcomponents/strings/cs.json index 80dc924379..fb1b86a035 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/cs.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/cs.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "P\u0159idat", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/da.json b/dashboard-ui/bower_components/emby-webcomponents/strings/da.json index a8842197d0..c99f1c78d8 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/da.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/da.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Del", "Add": "Tilf\u00f8j", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json index f31d9b7570..3153c2d915 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Konvertiere Aufnahmen automatisch in ein Streaming-freundliches Format mit Emby Premiere. Aufnahmen werden, basierend auf den Emby Server-Einstellungen, dynamisch zu MP4 oder MKV konvertiert.", + "HeaderConvertYourRecordings": "Konvertiere deine Aufnahmen", + "HeaderLearnMore": "Erfahre mehr", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Teilen", "Add": "Hinzuf\u00fcgen", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/el.json b/dashboard-ui/bower_components/emby-webcomponents/strings/el.json index 78434802f1..ee70fc61a0 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/el.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/el.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u03a0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c3\u03b5", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/en-GB.json b/dashboard-ui/bower_components/emby-webcomponents/strings/en-GB.json index 1c9208d782..62b5b11689 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/en-GB.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/en-GB.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -64,7 +69,7 @@ "NewCollection": "New Collection", "LabelCollection": "Collection:", "Help": "Help", - "NewCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", + "NewCollectionHelp": "Collections allow you to create personalised groupings of movies and other library content.", "SearchForCollectionInternetMetadata": "Search the internet for artwork and metadata", "LabelName": "Name:", "NewCollectionNameExample": "Example: Star Wars Collection", @@ -94,7 +99,7 @@ "HeaderSaySomethingLike": "Say Something Like...", "ButtonTryAgain": "Try Again", "HeaderYouSaid": "You Said...", - "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognize that command.", + "MessageWeDidntRecognizeCommand": "We're sorry, we didn't recognise that command.", "MessageIfYouBlockedVoice": "If you denied voice access to the app you'll need to reconfigure before trying again.", "ValueDiscNumber": "Disc {0}", "Unrated": "Unrated", @@ -205,7 +210,7 @@ "Continuing": "Continuing", "Ended": "Ended", "HeaderEnabledFields": "Enabled Fields", - "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent its data from being changed.", "Backdrops": "Backdrops", "Images": "Images", "Keywords": "Keywords", @@ -245,7 +250,7 @@ "ValueMusicVideoCount": "{0} music videos", "ValueMinutes": "{0} min", "HeaderIdentifyItemHelp": "Enter one or more search criteria. Remove criteria to increase search results.", - "PleaseEnterNameOrId": "Please enter a name or an external Id.", + "PleaseEnterNameOrId": "Please enter a name or an external ID.", "MessageItemSaved": "Item saved.", "SearchResults": "Search Results", "SyncToOtherDevice": "Sync to other device", @@ -279,7 +284,7 @@ "Settings": "Settings", "ShowIndicatorsFor": "Show indicators for:", "NewEpisodes": "New episodes", - "HDPrograms": "HD programs", + "HDPrograms": "HD programmes", "LiveBroadcasts": "Live broadcasts", "Premieres": "Premieres", "RepeatEpisodes": "Repeat episodes", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json index 4f05a0d237..9a53ea76d7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json @@ -48,7 +48,7 @@ "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderConvertYourRecordings": "Convert Your Recordings", "Record": "Record", "Save": "Save", "Edit": "Edit", @@ -124,7 +124,6 @@ "MarkUnplayed": "Mark unplayed", "GroupVersions": "Group versions", "PleaseSelectTwoItems": "Please select at least two items.", - "TheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?", "TryMultiSelect": "Try Multi-Select", "TryMultiSelectMessage": "To edit multiple media items, just click and hold any poster and select the items you want to manage. Try it!", "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", @@ -285,5 +284,7 @@ "RepeatEpisodes": "Repeat episodes", "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", "HeaderCancelRecording": "Cancel Recording", - "HeaderLearnMore": "Learn More" + "HeaderKeepRecording": "Keep Recording", + "HeaderLearnMore": "Learn More", + "DeleteMedia": "Delete media" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es-AR.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es-AR.json index b6bcc380b5..8dc6440b0e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es-AR.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es-AR.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json index af4283d24f..f757950019 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Compartir", "Add": "Agregar", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es.json index 91e059c7e7..e347685644 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Compartir", "Add": "A\u00f1adir", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json index dbcac7d305..d1c488533a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fr-CA.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fr-CA.json index 3f0cf62b55..299d43f37b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fr-CA.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fr-CA.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json index d63be557bd..9f4b6e6064 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Sp\u00e9cial - {0}", "Share": "Partager", "Add": "Ajouter", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json b/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json index 5cec14c081..74efde7beb 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/he.json b/dashboard-ui/bower_components/emby-webcomponents/strings/he.json index 7f36ed4699..0a7cdcbe51 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/he.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/he.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u05d4\u05d5\u05e1\u05e3", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json index 8d56d6efab..fc1f04cd62 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Dodaj", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json b/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json index f04b49a8db..99c1a852c5 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Megoszt\u00e1s", "Add": "Hozz\u00e1ad", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/id.json b/dashboard-ui/bower_components/emby-webcomponents/strings/id.json index f1713c74a8..c28bede7b3 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/id.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/id.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/it.json b/dashboard-ui/bower_components/emby-webcomponents/strings/it.json index eaeaa0e4cb..2b07119acb 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/it.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/it.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Aggiungi", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json index 3818f693e5..8d2ee88b61 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Emby Premiere \u0430\u0440\u049b\u044b\u043b\u044b \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443\u0493\u0430 \u043e\u04a3\u0430\u0439 \u043f\u0456\u0448\u0456\u043d\u0434\u0435 \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u0434\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443. \u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440 Emby Server \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456 \u043d\u0435\u0433\u0456\u0437\u0456\u043d\u0434\u0435, \u043d\u0430\u049b\u0442\u044b \u0443\u0430\u049b\u044b\u0442\u0442\u0430 MP4 \u043d\u0435\u043c\u0435\u0441\u0435 MKV \u043f\u0456\u0448\u0456\u043c\u0456\u043d\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0456\u043b\u0435\u0434\u0456.", + "HeaderConvertYourRecordings": "\u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u044b\u04a3\u044b\u0437\u0434\u044b \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443", + "HeaderLearnMore": "\u041a\u04e9\u0431\u0456\u0440\u0435\u043a \u0431\u0456\u043b\u0443", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "\u0410\u0440\u043d\u0430\u0439\u044b - {0}", "Share": "\u041e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443", "Add": "\u04ae\u0441\u0442\u0435\u0443", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json index 533ba842d6..603a5d1616 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\ucd94\uac00", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json index 3f0cf62b55..299d43f37b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json index d647b6bf6c..71ae820961 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Spesial - {0}", "Share": "Del", "Add": "Legg til", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json b/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json index fb23b66c19..a3c2ef0369 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Speciaal - {0}", "Share": "Delen", "Add": "Toevoegen", @@ -13,7 +18,7 @@ "ValueSeriesYearToPresent": "{0}-Heden", "ReleaseYearValue": "Jaar van uitgifte: {0}", "OriginalAirDateValue": "Originele uitzenddatum: {0}", - "EndsAtValue": "Eindigt om: {0}", + "EndsAtValue": "Eindigt om {0}", "OptionSundayShort": "Zo", "OptionMondayShort": "Ma", "OptionTuesdayShort": "Di", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json index a04568e4c4..22d7ed63c3 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Dodaj", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json index 453c3c7129..333f188a34 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Converter automaticamente grava\u00e7\u00f5es para um formato amig\u00e1vel para streaming com Emby Premiere. Grava\u00e7\u00f5es ser\u00e3o convertidas em tempo real para MP4 ou MKV, baseado nas configura\u00e7\u00f5es do Servidor Emby.", + "HeaderConvertYourRecordings": "Converter suas Grava\u00e7\u00f5es", + "HeaderLearnMore": "Saiba Mais", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Compartilhar", "Add": "Adicionar", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json index cd3c19116a..27a357a69f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Partilhar", "Add": "Adicionar", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json index 2447a63a6a..1ebf457e78 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json index 6437af2f61..78faf153c7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Emby Premiere. \u0417\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 MP4 \u0438\u043b\u0438 MKV, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 Emby Server.", + "HeaderConvertYourRecordings": "\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439", + "HeaderLearnMore": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435...", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "\u0421\u043f\u0435\u0446\u044d\u043f\u0438\u0437\u043e\u0434 - {0}", "Share": "\u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f", "Add": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json index 3f0cf62b55..299d43f37b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sl-SI.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sl-SI.json index 6572117d92..c456b1ccf8 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sl-SI.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sl-SI.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json index 9534774a3f..4364602352 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Specialavsnitt - {0}", "Share": "Dela", "Add": "L\u00e4gg till", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json index b61f3f27f4..625aea8a28 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Ekle", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json index 3ec735feca..7b2ca79854 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json b/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json index fbd301dd7d..b3c3f80373 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Th\u00eam", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json index 49d3d73c46..c791beedcc 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u6dfb\u52a0", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-HK.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-HK.json index 31c9ea79fa..9511d0686c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-HK.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-HK.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u65b0\u589e", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json index 3869dd1597..f0e4485ce6 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json @@ -1,4 +1,9 @@ { + "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", + "HeaderConvertYourRecordings": "Convert Your Recordings", + "HeaderLearnMore": "Learn More", + "HeaderKeepRecording": "Keep Recording", + "DeleteMedia": "Delete media", "ValueSpecialEpisodeName": "Special - {0}", "Share": "\u5206\u4eab", "Add": "\u6dfb\u52a0", diff --git a/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.js b/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.js index b6aedc45b5..5aa547d901 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.js @@ -68,7 +68,14 @@ require(['confirm'], function (confirm) { - confirm(msg, globalize.translate('sharedcomponents#ConfirmDeletion')).then(function () { + confirm({ + + title: globalize.translate('sharedcomponents#ConfirmDeletion'), + text: msg, + confirmText: globalize.translate('sharedcomponents#Delete'), + primary: 'cancel' + + }).then(function () { loading.show(); diff --git a/dashboard-ui/bower_components/requirejs/.bower.json b/dashboard-ui/bower_components/requirejs/.bower.json index 241a962b94..73ea60e696 100644 --- a/dashboard-ui/bower_components/requirejs/.bower.json +++ b/dashboard-ui/bower_components/requirejs/.bower.json @@ -1,6 +1,6 @@ { "name": "requirejs", - "version": "2.3.1", + "version": "2.3.2", "ignore": [], "homepage": "http://requirejs.org", "authors": [ @@ -14,11 +14,11 @@ "license": [ "MIT" ], - "_release": "2.3.1", + "_release": "2.3.2", "_resolution": { "type": "version", - "tag": "2.3.1", - "commit": "94785e8633448b668f292009fd2c31e3338a0074" + "tag": "2.3.2", + "commit": "5b5d3ea2c754898b645cfeaa8871bb92ba4f2790" }, "_source": "https://github.com/jrburke/requirejs-bower.git", "_target": "^2.1.22", diff --git a/dashboard-ui/bower_components/requirejs/bower.json b/dashboard-ui/bower_components/requirejs/bower.json index 61d2be43ee..2caafc469c 100644 --- a/dashboard-ui/bower_components/requirejs/bower.json +++ b/dashboard-ui/bower_components/requirejs/bower.json @@ -1,6 +1,6 @@ { "name": "requirejs", - "version": "2.3.1", + "version": "2.3.2", "ignore": [], "homepage": "http://requirejs.org", "authors": [ diff --git a/dashboard-ui/bower_components/requirejs/require.js b/dashboard-ui/bower_components/requirejs/require.js index 929c0a869d..4db14246c5 100644 --- a/dashboard-ui/bower_components/requirejs/require.js +++ b/dashboard-ui/bower_components/requirejs/require.js @@ -1,5 +1,5 @@ /** vim: et:ts=4:sw=4:sts=4 - * @license RequireJS 2.3.1 Copyright jQuery Foundation and other contributors. + * @license RequireJS 2.3.2 Copyright jQuery Foundation and other contributors. * Released under MIT license, https://github.com/requirejs/requirejs/blob/master/LICENSE */ //Not using strict: uneven strict support in browsers, #392, and causes @@ -11,7 +11,7 @@ var requirejs, require, define; (function (global, setTimeout) { var req, s, head, baseElement, dataMain, src, interactiveScript, currentlyAddingScript, mainScript, subPath, - version = '2.3.1', + version = '2.3.2', commentRegExp = /\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/mg, cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g, jsSuffixRegExp = /\.js$/, @@ -2139,4 +2139,4 @@ var requirejs, require, define; //Set up with config info. req(cfg); -}(this, setTimeout)); +}(this, (typeof setTimeout === 'undefined' ? undefined : setTimeout))); diff --git a/dashboard-ui/components/appfooter/appfooter.css b/dashboard-ui/components/appfooter/appfooter.css index aade7cd87d..86a542f5f3 100644 --- a/dashboard-ui/components/appfooter/appfooter.css +++ b/dashboard-ui/components/appfooter/appfooter.css @@ -6,10 +6,15 @@ z-index: 1; bottom: 0; transition: transform 180ms linear; - contain: layout style; } - .appfooter.headroom--unpinned { - transform: translateY(100%); - } +.appfooter-blurred { + background: rgba(28,28,28,.92); + -webkit-backdrop-filter: blur(5px); + backdrop-filter: blur(5px); +} + +.appfooter.headroom--unpinned { + transform: translateY(100%); +} diff --git a/dashboard-ui/components/appfooter/appfooter.js b/dashboard-ui/components/appfooter/appfooter.js index a3be8707f2..fd3fa49e8e 100644 --- a/dashboard-ui/components/appfooter/appfooter.js +++ b/dashboard-ui/components/appfooter/appfooter.js @@ -1,4 +1,4 @@ -define(['css!./appfooter'], function () { +define(['browser', 'css!./appfooter'], function (browser) { function render(options) { @@ -6,6 +6,10 @@ elem.classList.add('appfooter'); + if (browser.safari) { + elem.classList.add('appfooter-blurred'); + } + document.body.appendChild(elem); return elem; diff --git a/dashboard-ui/components/dockedtabs/dockedtabs.js b/dashboard-ui/components/dockedtabs/dockedtabs.js index 1d36803f90..424cacdc5e 100644 --- a/dashboard-ui/components/dockedtabs/dockedtabs.js +++ b/dashboard-ui/components/dockedtabs/dockedtabs.js @@ -39,6 +39,9 @@ case 'manageserver': Dashboard.navigate('dashboard.html'); break; + case 'remotecontrol': + Dashboard.navigate('nowplaying.html'); + break; case 'sync': Dashboard.navigate('mysync.html'); break; @@ -115,6 +118,11 @@ }); } + commands.push({ + name: globalize.translate('ButtonRemoteControl'), + id: 'remotecontrol' + }); + if (Dashboard.isConnectMode()) { commands.push({ name: globalize.translate('HeaderSelectServer'), diff --git a/dashboard-ui/components/fileorganizer/fileorganizer.template.html b/dashboard-ui/components/fileorganizer/fileorganizer.template.html index bed0b2b63a..29c2d72d4a 100644 --- a/dashboard-ui/components/fileorganizer/fileorganizer.template.html +++ b/dashboard-ui/components/fileorganizer/fileorganizer.template.html @@ -42,7 +42,6 @@
diff --git a/dashboard-ui/components/imageuploader/imageuploader.template.html b/dashboard-ui/components/imageuploader/imageuploader.template.html index b23da78e00..06793f9699 100644 --- a/dashboard-ui/components/imageuploader/imageuploader.template.html +++ b/dashboard-ui/components/imageuploader/imageuploader.template.html @@ -28,7 +28,6 @@
diff --git a/dashboard-ui/components/medialibraryeditor/medialibraryeditor.js b/dashboard-ui/components/medialibraryeditor/medialibraryeditor.js index f17f4f5311..7c1d9e501b 100644 --- a/dashboard-ui/components/medialibraryeditor/medialibraryeditor.js +++ b/dashboard-ui/components/medialibraryeditor/medialibraryeditor.js @@ -34,7 +34,14 @@ require(['confirm'], function (confirm) { - confirm(Globalize.translate('MessageConfirmRemoveMediaLocation'), Globalize.translate('HeaderRemoveMediaLocation')).then(function () { + confirm({ + + title: Globalize.translate('HeaderRemoveMediaLocation'), + text: Globalize.translate('MessageConfirmRemoveMediaLocation'), + confirmText: Globalize.translate('sharedcomponents#ButtonDelete'), + primary: 'cancel' + + }).then(function () { var refreshAfterChange = currentOptions.refresh; diff --git a/dashboard-ui/components/tvproviders/schedulesdirect.template.html b/dashboard-ui/components/tvproviders/schedulesdirect.template.html index 3daded0da1..4546845eed 100644 --- a/dashboard-ui/components/tvproviders/schedulesdirect.template.html +++ b/dashboard-ui/components/tvproviders/schedulesdirect.template.html @@ -21,7 +21,7 @@
- +
@@ -62,8 +62,8 @@

- - + +
diff --git a/dashboard-ui/components/tvproviders/xmltv.template.html b/dashboard-ui/components/tvproviders/xmltv.template.html index 5e5adeeba8..f18aa65b9e 100644 --- a/dashboard-ui/components/tvproviders/xmltv.template.html +++ b/dashboard-ui/components/tvproviders/xmltv.template.html @@ -45,7 +45,7 @@ ${ButtonLearnMore}

- - + +
\ No newline at end of file diff --git a/dashboard-ui/connectlogin.html b/dashboard-ui/connectlogin.html index f8aee7f4ab..53af8f5ca1 100644 --- a/dashboard-ui/connectlogin.html +++ b/dashboard-ui/connectlogin.html @@ -62,11 +62,9 @@
diff --git a/dashboard-ui/device.html b/dashboard-ui/device.html index db56eadac6..9b3acd848a 100644 --- a/dashboard-ui/device.html +++ b/dashboard-ui/device.html @@ -23,7 +23,7 @@
${LabelCameraUploadPathHelp}
- +
diff --git a/dashboard-ui/dlnaprofile.html b/dashboard-ui/dlnaprofile.html index f25a247bbc..46e2511cf7 100644 --- a/dashboard-ui/dlnaprofile.html +++ b/dashboard-ui/dlnaprofile.html @@ -329,10 +329,10 @@
diff --git a/dashboard-ui/forgotpassword.html b/dashboard-ui/forgotpassword.html index 4412dc7de4..a93e9702bf 100644 --- a/dashboard-ui/forgotpassword.html +++ b/dashboard-ui/forgotpassword.html @@ -14,12 +14,10 @@
diff --git a/dashboard-ui/forgotpasswordpin.html b/dashboard-ui/forgotpasswordpin.html index abd217a5dc..d8456dc957 100644 --- a/dashboard-ui/forgotpasswordpin.html +++ b/dashboard-ui/forgotpasswordpin.html @@ -13,12 +13,10 @@
diff --git a/dashboard-ui/itemdetails.html b/dashboard-ui/itemdetails.html index 776623f0a4..1aae70219f 100644 --- a/dashboard-ui/itemdetails.html +++ b/dashboard-ui/itemdetails.html @@ -36,8 +36,8 @@
-
diff --git a/dashboard-ui/livetvseriestimer.html b/dashboard-ui/livetvseriestimer.html index d9e013c2b1..eff000058b 100644 --- a/dashboard-ui/livetvseriestimer.html +++ b/dashboard-ui/livetvseriestimer.html @@ -68,9 +68,9 @@
- + - +
diff --git a/dashboard-ui/livetvsettings.html b/dashboard-ui/livetvsettings.html index 72c50d9031..47b2e62a05 100644 --- a/dashboard-ui/livetvsettings.html +++ b/dashboard-ui/livetvsettings.html @@ -95,7 +95,7 @@

- +
diff --git a/dashboard-ui/livetvtunerprovider-m3u.html b/dashboard-ui/livetvtunerprovider-m3u.html index daa21f2f6d..58da9701da 100644 --- a/dashboard-ui/livetvtunerprovider-m3u.html +++ b/dashboard-ui/livetvtunerprovider-m3u.html @@ -15,8 +15,8 @@
- - + +
diff --git a/dashboard-ui/livetvtunerprovider-satip.html b/dashboard-ui/livetvtunerprovider-satip.html index 79b885b83b..bf1b9d402c 100644 --- a/dashboard-ui/livetvtunerprovider-satip.html +++ b/dashboard-ui/livetvtunerprovider-satip.html @@ -63,8 +63,8 @@

- - + +
diff --git a/dashboard-ui/metadata.html b/dashboard-ui/metadata.html index 516055a649..dbae991e9f 100644 --- a/dashboard-ui/metadata.html +++ b/dashboard-ui/metadata.html @@ -28,7 +28,7 @@

- +
diff --git a/dashboard-ui/metadataimages.html b/dashboard-ui/metadataimages.html index 3ffd7e7733..4c65083b4a 100644 --- a/dashboard-ui/metadataimages.html +++ b/dashboard-ui/metadataimages.html @@ -87,7 +87,7 @@

-
+
diff --git a/dashboard-ui/metadatanfo.html b/dashboard-ui/metadatanfo.html index be0dc5a5aa..f2c991aa19 100644 --- a/dashboard-ui/metadatanfo.html +++ b/dashboard-ui/metadatanfo.html @@ -42,7 +42,7 @@
${LabelKodiMetadataEnableExtraThumbsHelp}
-
+
diff --git a/dashboard-ui/mypreferencesdisplay.html b/dashboard-ui/mypreferencesdisplay.html index ab56056e35..5e147319dc 100644 --- a/dashboard-ui/mypreferencesdisplay.html +++ b/dashboard-ui/mypreferencesdisplay.html @@ -88,7 +88,6 @@
diff --git a/dashboard-ui/mypreferenceshome.html b/dashboard-ui/mypreferenceshome.html index 257f8561cc..b869701a2d 100644 --- a/dashboard-ui/mypreferenceshome.html +++ b/dashboard-ui/mypreferenceshome.html @@ -112,7 +112,6 @@
diff --git a/dashboard-ui/mypreferenceslanguages.html b/dashboard-ui/mypreferenceslanguages.html index bebe736005..92cdacbce4 100644 --- a/dashboard-ui/mypreferenceslanguages.html +++ b/dashboard-ui/mypreferenceslanguages.html @@ -95,7 +95,6 @@
diff --git a/dashboard-ui/myprofile.html b/dashboard-ui/myprofile.html index f230ade6a2..239badb2b6 100644 --- a/dashboard-ui/myprofile.html +++ b/dashboard-ui/myprofile.html @@ -61,7 +61,7 @@
- + @@ -33,7 +32,6 @@
From 92e4d82bd272c8bdaff2613dd6dbe2650c73895c Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 18 Sep 2016 12:08:32 -0400 Subject: [PATCH 28/91] initial timeshifting support --- .../actionsheet/actionsheet.css | 1 + .../browserdeviceprofile.js | 8 ++-- .../emby-webcomponents/dialog/dialog.js | 9 ++-- .../dialoghelper/dialoghelper.css | 4 +- dashboard-ui/myprofile.html | 2 +- dashboard-ui/scripts/externalplayer.js | 2 - dashboard-ui/scripts/htmlmediarenderer.js | 5 +- dashboard-ui/scripts/mediacontroller.js | 35 ++++++-------- dashboard-ui/scripts/mediaplayer-video.js | 20 ++------ dashboard-ui/scripts/mediaplayer.js | 46 +++++++++++++++---- dashboard-ui/scripts/site.js | 6 +-- dashboard-ui/userpassword.html | 2 +- 12 files changed, 78 insertions(+), 62 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css index 27e6a3e427..1cfb03add7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css +++ b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.css @@ -5,6 +5,7 @@ border: none; max-height: 84%; border-radius: 1px !important; + box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.4); } .actionsheet-fullscreen { diff --git a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js index 855dffddae..9674fca848 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js +++ b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js @@ -46,7 +46,7 @@ define(['browser'], function (browser) { } function canPlayHlsWithMSE() { - if (window.MediaSource != null && !browser.firefox) { + if (window.MediaSource != null) { // text tracks don’t work with this in firefox return true; } @@ -389,7 +389,7 @@ define(['browser'], function (browser) { } // Can't use mkv on mobile because we have to use the native player controls and they won't be able to seek it - if (canPlayMkv && options.supportsCustomSeeking && !browser.tizen) { + if (canPlayMkv && options.supportsCustomSeeking && !browser.tizen && options.enableMkvProgressive !== false) { profile.TranscodingProfiles.push({ Container: 'mkv', Type: 'Video', @@ -400,7 +400,7 @@ define(['browser'], function (browser) { }); } - if (canPlayTs && options.supportsCustomSeeking && !browser.tizen && !browser.web0s) { + if (canPlayTs && options.supportsCustomSeeking && !browser.tizen && !browser.web0s && options.enableTsProgressive !== false) { profile.TranscodingProfiles.push({ Container: 'ts', Type: 'Video', @@ -414,7 +414,7 @@ define(['browser'], function (browser) { }); } - if (canPlayHls()) { + if (canPlayHls() && options.enableHls !== false) { profile.TranscodingProfiles.push({ Container: 'ts', Type: 'Video', diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js b/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js index 5b212ad9b3..51f17853e8 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js +++ b/dashboard-ui/bower_components/emby-webcomponents/dialog/dialog.js @@ -30,15 +30,18 @@ define(['dialogHelper', 'dom', 'layoutManager', 'scrollHelper', 'globalize', 're formDialogContent.style['max-height'] = '60%'; scrollHelper.centerFocus.on(formDialogContent, false); } else { - var minWidth = (Math.min(options.buttons.length * 150, dom.getWindowSize().innerWidth - 50)); - dlg.style.maxWidth = (minWidth + 200) + 'px'; + dlg.style.maxWidth = (Math.min((options.buttons.length * 150) + 200, dom.getWindowSize().innerWidth - 50)) + 'px'; } //dlg.querySelector('.btnCancel').addEventListener('click', function (e) { // dialogHelper.close(dlg); //}); - dlg.querySelector('.formDialogHeaderTitle').innerHTML = options.title || ''; + if (options.title) { + dlg.querySelector('.formDialogHeaderTitle').innerHTML = options.title || ''; + } else { + dlg.querySelector('.formDialogHeaderTitle').classList.add('hide'); + } dlg.querySelector('.text').innerHTML = options.html || options.text || ''; diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.css b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.css index fb3a8dd7e1..ea3773fa8b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.css +++ b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.css @@ -15,12 +15,12 @@ margin: 0; border-radius: 4px; -webkit-font-smoothing: antialiased; - box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.4); border: 0; padding: 0; will-change: transform; /* Strict does not work well with actionsheet */ contain: style; + box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.4); } .dialog-fixedSize { @@ -37,6 +37,7 @@ left: 0; right: 0; margin: 0; + box-shadow: none; } @media all and (max-width: 1280px), all and (max-height: 720px) { @@ -47,6 +48,7 @@ left: 0 !important; right: 0 !important; margin: 0 !important; + box-shadow: none; } } diff --git a/dashboard-ui/myprofile.html b/dashboard-ui/myprofile.html index 239badb2b6..b0483a95df 100644 --- a/dashboard-ui/myprofile.html +++ b/dashboard-ui/myprofile.html @@ -89,7 +89,7 @@

- +
'; - var hiddenOnIdleClass = AppInfo.isNativeApp && browserInfo.android ? 'hiddenOnIdle hide' : 'hiddenOnIdle'; + var hiddenOnIdleClass = AppInfo.isNativeApp && browser.android ? 'hiddenOnIdle hide' : 'hiddenOnIdle'; html += '
'; html += ''; @@ -984,7 +984,7 @@ self.playVideo = function (item, mediaSource, startPosition, callback) { - if (browserInfo.msie) { + if (browser.msie) { if (!window.MediaSource || !mediaSource.RunTimeTicks) { alert('Playback of this content is not supported in Internet Explorer. For a better experience, please try a modern browser such as Google Chrome, Firefox, Opera, or Microsoft Edge.'); @@ -998,15 +998,20 @@ self.createStreamInfo('Video', item, mediaSource, startPosition).then(function (streamInfo) { + var onReadyToPlay = function () { + self.playVideoInternal(item, mediaSource, startPosition, streamInfo, callback); + }; + var isHls = streamInfo.url.toLowerCase().indexOf('.m3u8') != -1; // Huge hack alert. Safari doesn't seem to like if the segments aren't available right away when playback starts // This will start the transcoding process before actually feeding the video url into the player // Edit: Also seeing stalls from hls.js - if (!mediaSource.RunTimeTicks && isHls && !browserInfo.edge) { + if (!mediaSource.RunTimeTicks && isHls && !browser.edge) { + + var hlsPlaylistUrl = streamInfo.url.replace('master.m3u8', 'live.m3u8'); Dashboard.showLoadingMsg(); - var hlsPlaylistUrl = streamInfo.url.replace('master.m3u8', 'live.m3u8'); ApiClient.ajax({ type: 'GET', @@ -1016,17 +1021,14 @@ Dashboard.hideLoadingMsg(); streamInfo.url = hlsPlaylistUrl; - // add a delay to continue building up the buffer. without this we see failures in safari mobile - setTimeout(function () { - self.playVideoInternal(item, mediaSource, startPosition, streamInfo, callback); - }, 2000); + onReadyToPlay(); }, function () { Dashboard.hideLoadingMsg(); }); } else { - self.playVideoInternal(item, mediaSource, startPosition, streamInfo, callback); + onReadyToPlay(); } }); }); @@ -1064,7 +1066,7 @@ elem.classList.remove('hide'); - if (!browserInfo.animate || browserInfo.slow) { + if (!browser.animate || browser.slow) { return; } @@ -1262,7 +1264,7 @@ function onClick() { - if (!browserInfo.mobile) { + if (!browser.mobile) { if (this.paused()) { self.unpause(); } else { @@ -1272,7 +1274,7 @@ } function onDoubleClick() { - if (!browserInfo.mobile) { + if (!browser.mobile) { self.toggleFullscreen(); } } From 85a11e81cffddc2f597fb3dbb9c31ffae5ef684e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 19 Sep 2016 11:41:35 -0400 Subject: [PATCH 31/91] always supply SeriesTimerId --- .../cardbuilder/cardbuilder.js | 48 +++- .../emby-itemscontainer.js | 69 ++++- .../emby-toggle/emby-toggle.css | 17 ++ .../emby-webcomponents/guide/guide.js | 6 +- .../indicators/indicators.js | 4 +- .../emby-webcomponents/itemcontextmenu.js | 2 +- .../recordingcreator/recordingfields.js | 242 ++++++++++++++++++ .../recordingfields.template.html | 27 ++ .../recordingcreator/recordinghelper.js | 67 +++++ .../emby-webcomponents/shortcuts.js | 68 +---- .../subtitleeditor.template.html | 2 +- dashboard-ui/css/site.css | 8 + dashboard-ui/scripts/htmlmediarenderer.js | 15 +- dashboard-ui/scripts/mediaplayer-video.js | 5 +- dashboard-ui/scripts/mediaplayer.js | 4 +- dashboard-ui/scripts/site.js | 2 + 16 files changed, 499 insertions(+), 87 deletions(-) create mode 100644 dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js create mode 100644 dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html create mode 100644 dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordinghelper.js diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js index ac2e9edc10..ff6d52dfcd 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js +++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/cardbuilder.js @@ -1421,10 +1421,56 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo } } + function onTimerCreated(programId, newTimerId, itemsContainer) { + + var cells = itemsContainer.querySelectorAll('.card[data-id="' + programId + '"]'); + + for (var i = 0, length = cells.length; i < length; i++) { + var cell = cells[i]; + var icon = cell.querySelector('.timerIndicator'); + if (!icon) { + var indicatorsElem = ensureIndicators(cell); + indicatorsElem.insertAdjacentHTML('beforeend', ''); + } + cell.setAttribute('data-timerid', newTimerId); + } + } + + function onTimerCancelled(id, itemsContainer) { + + var cells = itemsContainer.querySelectorAll('.card[data-timerid="' + id + '"]'); + + for (var i = 0, length = cells.length; i < length; i++) { + var cell = cells[i]; + var icon = cell.querySelector('.timerIndicator'); + if (icon) { + icon.parentNode.removeChild(icon); + } + cell.removeAttribute('data-timerid'); + } + } + + function onSeriesTimerCancelled(id, itemsContainer) { + + var cells = itemsContainer.querySelectorAll('.card[data-seriestimerid="' + id + '"]'); + + for (var i = 0, length = cells.length; i < length; i++) { + var cell = cells[i]; + var icon = cell.querySelector('.timerIndicator'); + if (icon) { + icon.parentNode.removeChild(icon); + } + cell.removeAttribute('data-seriestimerid'); + } + } + return { getCardsHtml: getCardsHtml, buildCards: buildCards, onUserDataChanged: onUserDataChanged, - getDefaultColorClass: getDefaultColorClass + getDefaultColorClass: getDefaultColorClass, + onTimerCreated: onTimerCreated, + onTimerCancelled: onTimerCancelled, + onSeriesTimerCancelled: onSeriesTimerCancelled }; }); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js index 1f2c80f0dd..49cf07ee05 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-itemscontainer/emby-itemscontainer.js @@ -183,6 +183,57 @@ }); } + function onTimerCreated(e, apiClient, data) { + + var itemsContainer = this; + + var programId = data.ProgramId; + // This could be null, not supported by all tv providers + var newTimerId = data.Id; + + require(['cardBuilder'], function (cardBuilder) { + cardBuilder.onTimerCreated(programId, newTimerId, itemsContainer); + }); + } + + function onSeriesTimerCreated(e, apiClient, data) { + var itemsContainer = this; + } + + function onTimerCancelled(e, apiClient, data) { + var itemsContainer = this; + var id = data.Id; + + require(['cardBuilder'], function (cardBuilder) { + cardBuilder.onTimerCancelled(id, itemsContainer); + }); + } + + function onSeriesTimerCancelled(e, apiClient, data) { + var itemsContainer = this; + var id = data.Id; + + require(['cardBuilder'], function (cardBuilder) { + cardBuilder.onSeriesTimerCancelled(id, itemsContainer); + }); + } + + function addNotificationEvent(instance, name, handler) { + + var localHandler = handler.bind(instance); + events.on(serverNotifications, name, localHandler); + instance[name] = localHandler; + } + + function removeNotificationEvent(instance, name) { + + var handler = instance[name]; + if (handler) { + events.off(serverNotifications, 'UserDataChanged', handler); + instance[name] = null; + } + } + ItemsContainerProtoType.attachedCallback = function () { this.addEventListener('click', onClick); @@ -203,9 +254,11 @@ itemShortcuts.on(this, getShortcutOptions()); - var userDataHandler = onUserDataChanged.bind(this); - events.on(serverNotifications, 'UserDataChanged', userDataHandler); - this.userDataHandler = userDataHandler; + addNotificationEvent(this, 'UserDataChanged', onUserDataChanged); + addNotificationEvent(this, 'TimerCreated', onTimerCreated); + addNotificationEvent(this, 'SeriesTimerCreated', onSeriesTimerCreated); + addNotificationEvent(this, 'TimerCancelled', onTimerCancelled); + addNotificationEvent(this, 'SeriesTimerCancelled', onSeriesTimerCancelled); }; ItemsContainerProtoType.detachedCallback = function () { @@ -218,11 +271,11 @@ this.removeEventListener('contextmenu', disableEvent); itemShortcuts.off(this, getShortcutOptions()); - var userDataHandler = this.userDataHandler; - if (userDataHandler) { - events.off(serverNotifications, 'UserDataChanged', userDataHandler); - this.userDataHandler = null; - } + removeNotificationEvent(this, 'UserDataChanged'); + removeNotificationEvent(this, 'TimerCreated'); + removeNotificationEvent(this, 'SeriesTimerCreated'); + removeNotificationEvent(this, 'TimerCancelled'); + removeNotificationEvent(this, 'SeriesTimerCancelled'); }; document.registerElement('emby-itemscontainer', { diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css index 60804f79a8..387197c15c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css @@ -54,6 +54,10 @@ background: rgba(82,181,75, 0.5); } +.mdl-switch__input.red:checked + .mdl-switch__label + .mdl-switch__track { + background: rgba(204,51,51, 0.5); +} + .mdl-switch__input[disabled] + .mdl-switch__label + .mdl-switch__track { background: rgba(0,0,0, 0.12); cursor: auto; @@ -80,6 +84,12 @@ box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 3px 3px -2px rgba(0, 0, 0, 0.2), 0 1px 8px 0 rgba(0, 0, 0, 0.12); } +.mdl-switch__input.red:checked + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb { + background: rgb(204,51,51); + left: 1.146em; + box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 3px 3px -2px rgba(0, 0, 0, 0.2), 0 1px 8px 0 rgba(0, 0, 0, 0.12); +} + .mdl-switch__input[disabled] + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb { background: rgb(189,189,189); cursor: auto; @@ -109,12 +119,19 @@ background-color: rgba(82,181,75, 0.26); } +.mdl-switch__input.red:checked:focus + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb > .mdl-switch__focus-helper { + box-shadow: 0 0 0px 20px rgba(204,51,51, 0.26); + background-color: rgba(204,51,51, 0.26); +} + .mdl-switch__label { position: relative; cursor: pointer; line-height: 1.72em; margin: 0; left: 1.52em; + display: inline-flex; + align-items: center; } .mdl-switch__input[disabled] .mdl-switch__label { diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js index b0bfd2b63e..7bfecbfe9d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js +++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js @@ -396,10 +396,10 @@ } if (program.SeriesTimerId) { - html += 'fiber_smart_record'; + html += ''; } else if (program.TimerId) { - html += 'fiber_manual_record'; + html += ''; } if (addAccent) { @@ -778,7 +778,7 @@ var icon = cell.querySelector('.timerIcon'); if (!icon) { - cell.insertAdjacentHTML('beforeend', 'fiber_manual_record'); + cell.insertAdjacentHTML('beforeend', ''); } if (newTimerId) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.js b/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.js index 71250246ac..cd9c090809 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.js +++ b/dashboard-ui/bower_components/emby-webcomponents/indicators/indicators.js @@ -99,10 +99,10 @@ define(['css!./indicators.css', 'material-icons'], function () { function getTimerIndicator(item) { if (item.SeriesTimerId) { - return 'fiber_smart_record'; + return ''; } if (item.TimerId) { - return 'fiber_manual_record'; + return ''; } return ''; diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js index 64252f3b1a..ea2db09cc0 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js +++ b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js @@ -168,7 +168,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter', } } - if (item.Type == 'Program' && (!item.TimerId && !item.SeriesTimerId)) { + if (item.Type == 'Program') { commands.push({ name: Globalize.translate('sharedcomponents#Record'), diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js new file mode 100644 index 0000000000..b4f705fa3e --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js @@ -0,0 +1,242 @@ +define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'recordingHelper', 'emby-toggle'], function (globalize, connectionManager, require, loading, appHost, recordingHelper) { + + function getRegistration(apiClient, programId, feature) { + + loading.show(); + + return apiClient.getJSON(apiClient.getUrl('LiveTv/Registration', { + + ProgramId: programId, + Feature: feature + + })).then(function (result) { + + loading.hide(); + return result; + + }, function () { + + loading.hide(); + + return { + TrialVersion: true, + IsValid: true, + IsRegistered: false + }; + }); + } + + function showConvertRecordingsUnlockMessage(context, apiClient) { + + apiClient.getPluginSecurityInfo().then(function (regInfo) { + + if (regInfo.IsMBSupporter) { + context.querySelector('.convertRecordingsContainer').classList.add('hide'); + } else { + context.querySelector('.convertRecordingsContainer').classList.remove('hide'); + } + + }, function () { + + context.querySelector('.convertRecordingsContainer').classList.remove('hide'); + }); + } + + function showSeriesRecordingFields(context, programId, apiClient) { + + getRegistration(apiClient, programId, 'seriesrecordings').then(function (regInfo) { + + if (regInfo.IsRegistered) { + context.querySelector('.supporterContainer').classList.add('hide'); + context.querySelector('.convertRecordingsContainer').classList.add('hide'); + + } else { + + context.querySelector('.supporterContainerText').innerHTML = globalize.translate('sharedcomponents#MessageActiveSubscriptionRequiredSeriesRecordings'); + context.querySelector('.supporterContainer').classList.remove('hide'); + context.querySelector('.convertRecordingsContainer').classList.add('hide'); + } + }); + } + + function showSingleRecordingFields(context, programId, apiClient) { + + getRegistration(apiClient, programId, 'dvr').then(function (regInfo) { + + if (regInfo.IsRegistered) { + context.querySelector('.supporterContainer').classList.add('hide'); + showConvertRecordingsUnlockMessage(context, apiClient); + } else { + + context.querySelector('.supporterContainerText').innerHTML = globalize.translate('sharedcomponents#DvrSubscriptionRequired'); + context.querySelector('.supporterContainer').classList.remove('hide'); + context.querySelector('.convertRecordingsContainer').classList.add('hide'); + } + }); + } + + function showRecordingFieldsContainer(context, programId, apiClient) { + + getRegistration(apiClient, programId, 'dvr').then(function (regInfo) { + + if (regInfo.IsRegistered) { + context.querySelector('.recordingFields').classList.remove('hide'); + } else { + + context.querySelector('.recordingFields').classList.add('hide'); + } + }); + } + + function loadData(parent, program, apiClient) { + + if (program.IsSeries) { + parent.querySelector('.chkRecordSeriesContainer').classList.remove('hide'); + } else { + parent.querySelector('.chkRecordSeriesContainer').classList.add('hide'); + } + + parent.querySelector('.chkRecord').checked = program.TimerId != null; + parent.querySelector('.chkRecordSeries').checked = program.SeriesTimerId != null; + + if (program.SeriesTimerId != null) { + showSeriesRecordingFields(parent, program.Id, apiClient); + } else { + showSingleRecordingFields(parent, program.Id, apiClient); + } + + //var seriesTimerPromise = program.SeriesTimerId ? + // apiClient.getLiveTvSeriesTimer(program.SeriesTimerId) : + // apiClient.getLiveTvProgram(program.Id, apiClient.getCurrentUserId()); + + //seriesTimerPromise.then(function (seriesTimer) { + + //}); + } + + function fetchData(instance) { + + var options = instance.options; + var apiClient = connectionManager.getApiClient(options.serverId); + + showRecordingFieldsContainer(options.parent, options.programId, apiClient); + + return apiClient.getLiveTvProgram(options.programId, apiClient.getCurrentUserId()).then(function (program) { + + instance.TimerId = program.TimerId; + instance.SeriesTimerId = program.SeriesTimerId; + + loadData(options.parent, program, apiClient); + }); + } + + function recordingEditor(options) { + this.options = options; + this.embed(); + } + + function onSupporterButtonClick() { + if (appHost.supports('externalpremium')) { + shell.openUrl('https://emby.media/premiere'); + } else { + + } + } + + function onRecordChange(e) { + + this.changed = true; + + var self = this; + var options = this.options; + var apiClient = connectionManager.getApiClient(options.serverId); + + var isChecked = e.target.checked; + + if (e.target.checked) { + if (!this.TimerId && !this.SeriesTimerId) { + recordingHelper.createRecording(apiClient, options.programId, false).then(function () { + fetchData(self); + }); + } + } else { + if (this.TimerId) { + recordingHelper.cancelTimer(apiClient, this.TimerId, true).then(function () { + fetchData(self); + }); + } + } + } + + function onRecordSeriesChange(e) { + + this.changed = true; + + var self = this; + var options = this.options; + var apiClient = connectionManager.getApiClient(options.serverId); + + var isChecked = e.target.checked; + + if (e.target.checked) { + showSeriesRecordingFields(options.parent, options.programId, apiClient); + + if (!this.SeriesTimerId) { + + var promise = this.TimerId ? + recordingHelper.changeRecordingToSeries(apiClient, this.TimerId, options.programId) : + recordingHelper.createRecording(apiClient, options.programId, true); + + promise.then(function () { + fetchData(self); + }); + } + } else { + + showSingleRecordingFields(options.parent, options.programId, apiClient); + + if (this.SeriesTimerId) { + apiClient.cancelLiveTvSeriesTimer(this.SeriesTimerId).then(function () { + fetchData(self); + }); + } + } + } + + recordingEditor.prototype.embed = function () { + + var self = this; + + return new Promise(function (resolve, reject) { + + require(['text!./recordingfields.template.html'], function (template) { + + var options = self.options; + var context = options.parent; + context.innerHTML = globalize.translateDocument(template, 'sharedcomponents'); + + var supporterButtons = context.querySelectorAll('.btnSupporter'); + for (var i = 0, length = supporterButtons.length; i < length; i++) { + if (appHost.supports('externalpremium')) { + supporterButtons[i].classList.remove('hide'); + } else { + supporterButtons[i].classList.add('hide'); + } + supporterButtons[i].addEventListener('click', onSupporterButtonClick); + } + + context.querySelector('.chkRecord').addEventListener('change', onRecordChange.bind(self)); + context.querySelector('.chkRecordSeries').addEventListener('change', onRecordSeriesChange.bind(self)); + + fetchData(self).then(resolve); + }); + }); + }; + + recordingEditor.prototype.hasChanged = function () { + + return this.changed; + }; + + return recordingEditor; +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html new file mode 100644 index 0000000000..2049fcf367 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html @@ -0,0 +1,27 @@ +
+

${HeaderConvertYourRecordings}

+
${PromoConvertRecordingsToStreamingFormat}
+
+ +
+
+
+
+ +
+
+ + + + +
\ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordinghelper.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordinghelper.js new file mode 100644 index 0000000000..8128e60beb --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordinghelper.js @@ -0,0 +1,67 @@ +define(['globalize', 'loading'], function (globalize, loading) { + + function changeRecordingToSeries(apiClient, timerId, programId) { + + loading.show(); + + apiClient.getItem(apiClient.getCurrentUserId(), programId).then(function (item) { + + if (item.IsSeries) { + // cancel, then create series + cancelTimer(apiClient, timerId, false).then(function () { + apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (timerDefaults) { + + apiClient.createLiveTvSeriesTimer(timerDefaults).then(function () { + + loading.hide(); + sendToast(globalize.translate('sharedcomponents#SeriesRecordingScheduled')); + }); + }); + }); + } else { + // cancel + cancelTimer(apiClient, timerId, true); + } + }); + } + + function cancelTimer(apiClient, timerId, hideLoading) { + loading.show(); + return apiClient.cancelLiveTvTimer(timerId).then(function () { + + if (hideLoading) { + loading.hide(); + sendToast(globalize.translate('sharedcomponents#RecordingCancelled')); + } + }); + } + + function createRecording(apiClient, programId, isSeries) { + + loading.show(); + return apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (item) { + + var promise = isSeries ? + apiClient.createLiveTvSeriesTimer(item) : + apiClient.createLiveTvTimer(item); + + return promise.then(function () { + + loading.hide(); + sendToast(globalize.translate('sharedcomponents#RecordingScheduled')); + }); + }); + } + + function sendToast(msg) { + require(['toast'], function (toast) { + toast(msg); + }); + } + + return { + cancelTimer: cancelTimer, + createRecording: createRecording, + changeRecordingToSeries: changeRecordingToSeries + }; +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js b/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js index 80a07a0934..e49465e41c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js +++ b/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js @@ -1,4 +1,4 @@ -define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'globalize', 'loading', 'dom'], function (playbackManager, inputManager, connectionManager, embyRouter, globalize, loading, dom) { +define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'globalize', 'loading', 'dom', 'recordingHelper'], function (playbackManager, inputManager, connectionManager, embyRouter, globalize, loading, dom, recordingHelper) { function playAllFromHere(card, serverId, queue) { @@ -93,11 +93,6 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g function showProgramDialog(item) { - if (item.TimerId) { - showItem(item); - return; - } - require(['recordingCreator'], function (recordingCreator) { recordingCreator.show(item.Id, item.ServerId); @@ -338,75 +333,20 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g if (seriesTimerId && timerId) { // cancel - cancelTimer(apiClient, timerId, true); + recordingHelper.cancelTimer(apiClient, timerId, true); } else if (timerId) { // change to series recording, if possible // otherwise cancel individual recording - changeRecordingToSeries(apiClient, timerId, id); + recordingHelper.changeRecordingToSeries(apiClient, timerId, id); } else if (type == 'Program') { // schedule recording - createRecording(apiClient, id); + recordingHelper.createRecording(apiClient, id); } } - function changeRecordingToSeries(apiClient, timerId, programId) { - - loading.show(); - - apiClient.getItem(apiClient.getCurrentUserId(), programId).then(function (item) { - - if (item.IsSeries) { - // cancel, then create series - cancelTimer(apiClient, timerId, false).then(function () { - apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (timerDefaults) { - - apiClient.createLiveTvSeriesTimer(timerDefaults).then(function () { - - loading.hide(); - sendToast(globalize.translate('sharedcomponents#SeriesRecordingScheduled')); - }); - }); - }); - } else { - // cancel - cancelTimer(apiClient, timerId, true); - } - }); - } - - function cancelTimer(apiClient, timerId, hideLoading) { - loading.show(); - return apiClient.cancelLiveTvTimer(timerId).then(function () { - - if (hideLoading) { - loading.hide(); - sendToast(globalize.translate('sharedcomponents#RecordingCancelled')); - } - }); - } - - function createRecording(apiClient, programId) { - - loading.show(); - apiClient.getNewLiveTvTimerDefaults({ programId: programId }).then(function (item) { - - apiClient.createLiveTvTimer(item).then(function () { - - loading.hide(); - sendToast(globalize.translate('sharedcomponents#RecordingScheduled')); - }); - }); - } - - function sendToast(msg) { - require(['toast'], function (toast) { - toast(msg); - }); - } - function onClick(e) { var card = dom.parentWithClass(e.target, 'itemAction'); diff --git a/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.template.html b/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.template.html index 12a7eeaa0c..2a9fca002c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/subtitleeditor/subtitleeditor.template.html @@ -8,7 +8,7 @@

${SearchForSubtitles}

-

+

diff --git a/dashboard-ui/css/site.css b/dashboard-ui/css/site.css index 0682af6b06..bfc81a6337 100644 --- a/dashboard-ui/css/site.css +++ b/dashboard-ui/css/site.css @@ -188,6 +188,14 @@ select { color: #fff; } +.ui-body-a .secondaryText { + color: #ccc; +} + +.ui-body-b .secondaryText { + color: #aaa; +} + div[data-role='page'] { outline: none; } diff --git a/dashboard-ui/scripts/htmlmediarenderer.js b/dashboard-ui/scripts/htmlmediarenderer.js index 754da83152..e6de4ae650 100644 --- a/dashboard-ui/scripts/htmlmediarenderer.js +++ b/dashboard-ui/scripts/htmlmediarenderer.js @@ -184,8 +184,14 @@ return false; } - if (MediaPlayer.canPlayNativeHls() && mediaSource.RunTimeTicks) { - return false; + if (MediaPlayer.canPlayNativeHls()) { + + // simple playback should use the native support + if (mediaSource.RunTimeTicks) { + return false; + } + + //return false; } // For now don't do this in edge because we lose some native audio support @@ -193,6 +199,11 @@ return false; } + // hls.js is only in beta. needs more testing. + if (browser.safari) { + return false; + } + return true; } diff --git a/dashboard-ui/scripts/mediaplayer-video.js b/dashboard-ui/scripts/mediaplayer-video.js index dec583b6ad..5aada04c30 100644 --- a/dashboard-ui/scripts/mediaplayer-video.js +++ b/dashboard-ui/scripts/mediaplayer-video.js @@ -986,8 +986,9 @@ if (browser.msie) { - if (!window.MediaSource || !mediaSource.RunTimeTicks) { + if (window.MediaSource == null || mediaSource.RunTimeTicks == null) { alert('Playback of this content is not supported in Internet Explorer. For a better experience, please try a modern browser such as Google Chrome, Firefox, Opera, or Microsoft Edge.'); + return; } } @@ -1021,7 +1022,7 @@ Dashboard.hideLoadingMsg(); streamInfo.url = hlsPlaylistUrl; - onReadyToPlay(); + setTimeout(onReadyToPlay, 0); }, function () { Dashboard.hideLoadingMsg(); diff --git a/dashboard-ui/scripts/mediaplayer.js b/dashboard-ui/scripts/mediaplayer.js index 2856864c7a..0a0ba7cf59 100644 --- a/dashboard-ui/scripts/mediaplayer.js +++ b/dashboard-ui/scripts/mediaplayer.js @@ -143,9 +143,7 @@ define(['appSettings', 'userSettings', 'appStorage', 'datetime'], function (appS return true; } - // viblast can help us here - //return true; - return window.MediaSource; + return window.MediaSource != null; }; self.changeStream = function (ticks, params) { diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 7dbf0f99ef..391350274d 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -1234,6 +1234,8 @@ var AppInfo = {}; define("playlistEditor", [embyWebComponentsBowerPath + "/playlisteditor/playlisteditor"], returnFirstDependency); define("recordingCreator", [embyWebComponentsBowerPath + "/recordingcreator/recordingcreator"], returnFirstDependency); define("recordingEditor", [embyWebComponentsBowerPath + "/recordingcreator/recordingeditor"], returnFirstDependency); + define("recordingFields", [embyWebComponentsBowerPath + "/recordingcreator/recordingfields"], returnFirstDependency); + define("recordingHelper", [embyWebComponentsBowerPath + "/recordingcreator/recordinghelper"], returnFirstDependency); define("subtitleEditor", [embyWebComponentsBowerPath + "/subtitleeditor/subtitleeditor"], returnFirstDependency); define("itemIdentifier", [embyWebComponentsBowerPath + "/itemidentifier/itemidentifier"], returnFirstDependency); define("mediaInfo", [embyWebComponentsBowerPath + "/mediainfo/mediainfo"], returnFirstDependency); From 01bfc32c1ef66fe0e3718850806effef55e5879d Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 20 Sep 2016 11:21:44 -0400 Subject: [PATCH 32/91] update guide image quality --- .../dist/js/social-share-kit.min.js | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.min.js diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.min.js b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.min.js new file mode 100644 index 0000000000..9d23f80f60 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.min.js @@ -0,0 +1,8 @@ +/*! + * Social Share Kit v1.0.10 (http://socialsharekit.com) + * Copyright 2015 Social Share Kit / Kaspars Sprogis. + * @Licensed under Creative Commons Attribution-NonCommercial 3.0 license: + * https://github.com/darklow/social-share-kit/blob/master/LICENSE + * --- + */ +var SocialShareKit=function(){function e(e){return k(e).share()}function t(e){"loading"!=document.readyState?e():document.addEventListener?document.addEventListener("DOMContentLoaded",e):document.attachEvent("onreadystatechange",function(){"loading"!=document.readyState&&e()})}function n(e){return document.querySelectorAll(e)}function o(e,t){for(var n=0;n=200&&this.status<400&&t(this.responseText)},o.open("POST",e,!0),o.setRequestHeader("Content-Type","application/json"),o.send(n)}function g(e,t,n){var o="cb_"+e+"_"+Math.round(1e5*Math.random()),r=document.createElement("script");return window[o]=function(e){try{delete window[o]}catch(e){}document.body.removeChild(r),n(e)},"vk"==e?window.VK={Share:{count:function(e,t){window[o](t)}}}:"google-plus"==e&&(window.services={gplus:{cb:window[o]}}),r.src=t+(t.indexOf("?")>=0?"&":"?")+"callback="+o,document.body.appendChild(r),!0}var k,b,y=/(twitter|facebook|google-plus|pinterest|tumblr|vk|linkedin|email)/,C="*|*";return b=function(e){var t=e||{},o=t.selector||".ssk";this.nodes=n(o),this.options=t},b.prototype={share:function(){function e(e){var t,n=c(e),o=a(n),r=o[0];if(o&&(t=s(p,r,n))){if(window.twttr&&n.getAttribute("href").indexOf("twitter.com/intent/")!==-1)return void n.setAttribute("href",t);if("email"!=r){var i=u(t);if(p.onOpen&&p.onOpen(n,r,t,i),p.onClose)var d=window.setInterval(function(){i.closed!==!1&&(window.clearInterval(d),p.onClose(n,r,t,i))},250)}else document.location=t}}function n(){var e,t;for(e in h)t=e.split(C),function(e){w(t[0],t[1],p,function(t){for(var n in e)m(e[n],t)})}(h[e])}var l=this.nodes,p=this.options,h={};return t(function(){l.length&&(o(l,function(t){var n,o=a(t);o&&(i(t,"click",e),r(t,"click",e),t.parentNode.className.indexOf("ssk-count")!==-1&&(o=o[0],n=o+C+d(p,o,t),n in h||(h[n]=[]),h[n].push(t)))}),n())}),this.nodes}},k=function(e){return new b(e)},{init:e}}();window.SocialShareKit=SocialShareKit; From a511b20e4cef00b9868b9e90b7fcdd68a9e63bea Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 20 Sep 2016 11:22:00 -0400 Subject: [PATCH 33/91] exclude backdrops from photos --- .../dist/js/social-share-kit.js | 401 ++++++++++++++++++ 1 file changed, 401 insertions(+) create mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.js diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.js b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.js new file mode 100644 index 0000000000..8432d5367c --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/js/social-share-kit.js @@ -0,0 +1,401 @@ +/*! + * Social Share Kit v1.0.10 (http://socialsharekit.com) + * Copyright 2015 Social Share Kit / Kaspars Sprogis. + * @Licensed under Creative Commons Attribution-NonCommercial 3.0 license: + * https://github.com/darklow/social-share-kit/blob/master/LICENSE + * --- + */ +var SocialShareKit = (function () { + var supportsShare = /(twitter|facebook|google-plus|pinterest|tumblr|vk|linkedin|email)/, + sep = '*|*', wrap, _wrap; + + // Wrapper to support multiple instances per page by selector + _wrap = function (opts) { + var options = opts || {}, + selector = options.selector || '.ssk'; + this.nodes = $(selector); + this.options = options; + }; + + // Instance related functions + _wrap.prototype = { + share: function () { + var els = this.nodes, + options = this.options, + urlsToCount = {}; + + ready(function () { + if (!els.length) + return; + + each(els, function (el) { + var network = elSupportsShare(el), uniqueKey; + if (!network) { + return; + } + removeEventListener(el, 'click', onClick); + addEventListener(el, 'click', onClick); + + // Gather icons with share counts + if (el.parentNode.className.indexOf('ssk-count') !== -1) { + network = network[0]; + uniqueKey = network + sep + getShareUrl(options, network, el); + if (!(uniqueKey in urlsToCount)) { + urlsToCount[uniqueKey] = []; + } + urlsToCount[uniqueKey].push(el); + } + }); + + processShareCount(); + }); + + function onClick(e) { + var target = preventDefault(e), + match = elSupportsShare(target), + network = match[0], + url; + + if (!match) + return; + + url = getUrl(options, network, target); + if (!url) + return; + + // To use Twitter intent events, replace URL and use Twitter native share JS + if (window.twttr && target.getAttribute('href').indexOf('twitter.com/intent/') !== -1) { + target.setAttribute('href', url); + return; + } + + if (network != 'email') { + var win = winOpen(url); + + if (options.onOpen) { + options.onOpen(target, network, url, win); + } + + if (options.onClose) { + var closeInt = window.setInterval(function () { + if (win.closed !== false) { + window.clearInterval(closeInt); + options.onClose(target, network, url, win); + } + }, 250); + } + + } else { + document.location = url; + } + } + + function processShareCount() { + var a, ref; + for (a in urlsToCount) { + ref = a.split(sep); + (function (els) { + getCount(ref[0], ref[1], options, function (cnt) { + for (var c in els) + addCount(els[c], cnt); + }); + })(urlsToCount[a]); + } + } + + return this.nodes; + } + }; + + wrap = function (selector) { + return new _wrap(selector); + }; + + function init(opts) { + return wrap(opts).share(); + } + + function ready(fn) { + if (document.readyState != 'loading') { + fn(); + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', fn); + } else { + document.attachEvent('onreadystatechange', function () { + if (document.readyState != 'loading') + fn(); + }); + } + } + + function $(selector) { + return document.querySelectorAll(selector); + } + + function each(elements, fn) { + for (var i = 0; i < elements.length; i++) + fn(elements[i], i); + } + + function addEventListener(el, eventName, handler) { + if (el.addEventListener) { + el.addEventListener(eventName, handler); + } else { + el.attachEvent('on' + eventName, function () { + handler.call(el); + }); + } + } + + function removeEventListener(el, eventName, handler) { + if (el.removeEventListener) + el.removeEventListener(eventName, handler); + else + el.detachEvent('on' + eventName, handler); + } + + function elSupportsShare(el) { + return el.className.match(supportsShare); + } + + + function preventDefault(e) { + var evt = e || window.event; // IE8 compatibility + if (evt.preventDefault) { + evt.preventDefault(); + } else { + evt.returnValue = false; + evt.cancelBubble = true; + } + return evt.currentTarget || evt.srcElement; + } + + function winOpen(url) { + var width = 575, height = 400, + left = (document.documentElement.clientWidth / 2 - width / 2), + top = (document.documentElement.clientHeight - height) / 2, + opts = 'status=1,resizable=yes' + + ',width=' + width + ',height=' + height + + ',top=' + top + ',left=' + left, + win = window.open(url, '', opts); + win.focus(); + return win; + } + + function getUrl(options, network, el) { + var url, dataOpts = getDataOpts(options, network, el), + shareUrl = getShareUrl(options, network, el, dataOpts), + title = typeof dataOpts['title'] !== 'undefined' ? dataOpts['title'] : getTitle(network), + text = typeof dataOpts['text'] !== 'undefined' ? dataOpts['text'] : getText(network), + image = dataOpts['image'] ? dataOpts['image'] : getMetaContent('og:image'), + via = typeof dataOpts['via'] !== 'undefined' ? dataOpts['via'] : getMetaContent('twitter:site'), + paramsObj = { + shareUrl: shareUrl, + title: title, + text: text, + image: image, + via: via, + options: options, + shareUrlEncoded: function () { + return encodeURIComponent(this.shareUrl); + } + }; + switch (network) { + case 'facebook': + url = 'https://www.facebook.com/share.php?u=' + paramsObj.shareUrlEncoded(); + break; + case 'twitter': + url = 'https://twitter.com/intent/tweet?url=' + paramsObj.shareUrlEncoded() + + '&text=' + encodeURIComponent(title + (text && title ? ' - ' : '') + text); + if (via) + url += '&via=' + via.replace('@', ''); + break; + case 'google-plus': + url = 'https://plus.google.com/share?url=' + paramsObj.shareUrlEncoded(); + break; + case 'pinterest': + url = 'https://pinterest.com/pin/create/button/?url=' + paramsObj.shareUrlEncoded() + + '&description=' + encodeURIComponent(text); + if (image) + url += '&media=' + encodeURIComponent(image); + break; + case 'tumblr': + url = 'https://www.tumblr.com/share/link?url=' + paramsObj.shareUrlEncoded() + + '&name=' + encodeURIComponent(title) + + '&description=' + encodeURIComponent(text); + break; + case 'linkedin': + url = 'https://www.linkedin.com/shareArticle?mini=true&url=' + paramsObj.shareUrlEncoded() + + '&title=' + encodeURIComponent(title) + + '&summary=' + encodeURIComponent(text); + break; + case 'vk': + url = 'https://vkontakte.ru/share.php?url=' + paramsObj.shareUrlEncoded(); + break; + case 'email': + url = 'mailto:?subject=' + encodeURIComponent(title) + + '&body=' + encodeURIComponent(title + '\n' + shareUrl + '\n\n' + text + '\n'); + break; + } + + paramsObj.networkUrl = url; + + if (options.onBeforeOpen) { + options.onBeforeOpen(el, network, paramsObj) + } + + return paramsObj.networkUrl; + } + + function getShareUrl(options, network, el, dataOpts) { + dataOpts = dataOpts || getDataOpts(options, network, el); + return dataOpts['url'] || window.location.href; + } + + function getTitle(network) { + var title; + if (network == 'twitter') + title = getMetaContent('twitter:title'); + return title || document.title; + } + + function getText(network) { + var text; + if (network == 'twitter') + text = getMetaContent('twitter:description'); + return text || getMetaContent('description'); + } + + function getMetaContent(tagName, attr) { + var text, tag = $('meta[' + (attr ? attr : tagName.indexOf('og:') === 0 ? 'property' : 'name') + '="' + tagName + '"]'); + if (tag.length) { + text = tag[0].getAttribute('content') || ''; + } + return text || '' + } + + function getDataOpts(options, network, el) { + var validOpts = ['url', 'title', 'text', 'image'], + opts = {}, optValue, optKey, dataKey, a, parent = el.parentNode; + network == 'twitter' && validOpts.push('via'); + for (a in validOpts) { + optKey = validOpts[a]; + dataKey = 'data-' + optKey; + optValue = el.getAttribute(dataKey) || parent.getAttribute(dataKey) || + (options[network] && typeof options[network][optKey] != 'undefined' ? options[network][optKey] : options[optKey]); + if (typeof optValue != 'undefined') { + opts[optKey] = optValue; + } + } + return opts; + } + + + function addCount(el, cnt) { + var newEl = document.createElement('div'); + newEl.innerHTML = cnt; + newEl.className = 'ssk-num'; + el.appendChild(newEl); + } + + function getCount(network, shareUrl, options, onReady) { + var url, parseFunc, body, + shareUrlEnc = encodeURIComponent(shareUrl); + switch (network) { + case 'facebook': + url = 'https://graph.facebook.com/?id=' + shareUrlEnc; + parseFunc = function (r) { + return onReady(r.share ? r.share.share_count : 0); + }; + break; + case 'twitter': + if (options && options.twitter && options.twitter.countCallback) { + options.twitter.countCallback(shareUrl, onReady); + } + break; + case 'google-plus': + url = 'https://clients6.google.com/rpc?key=AIzaSyCKSbrvQasunBoV16zDH9R33D88CeLr9gQ'; + body = "[{\"method\":\"pos.plusones.get\",\"id\":\"p\"," + + "\"params\":{\"id\":\"" + shareUrl + "\",\"userId\":\"@viewer\",\"groupId\":\"@self\",\"nolog\":true}," + + "\"jsonrpc\":\"2.0\",\"key\":\"p\",\"apiVersion\":\"v1\"}]"; + parseFunc = function (r) { + r = JSON.parse(r); + if (r.length) { + return onReady(r[0].result.metadata.globalCounts.count); + } + }; + ajax(url, parseFunc, body); + return; + case 'linkedin': + url = 'https://www.linkedin.com/countserv/count/share?url=' + shareUrlEnc; + parseFunc = function (r) { + return onReady(r.count); + }; + break; + case 'pinterest': + url = 'https://api.pinterest.com/v1/urls/count.json?url=' + shareUrlEnc; + parseFunc = function (r) { + return onReady(r.count); + }; + break; + case 'vk': + url = 'https://vk.com/share.php?act=count&url=' + shareUrlEnc; + parseFunc = function (r) { + return onReady(r); + }; + break; + } + url && parseFunc && JSONPRequest(network, url, parseFunc, body); + } + + function ajax(url, callback, body) { + var request = new XMLHttpRequest(); + request.onreadystatechange = function () { + if (this.readyState === 4) { + if (this.status >= 200 && this.status < 400) { + callback(this.responseText); + } + } + }; + request.open('POST', url, true); + request.setRequestHeader('Content-Type', 'application/json'); + request.send(body); + } + + function JSONPRequest(network, url, callback) { + var callbackName = 'cb_' + network + '_' + Math.round(100000 * Math.random()), + script = document.createElement('script'); + window[callbackName] = function (data) { + try { // IE8 + delete window[callbackName]; + } catch (e) { + } + document.body.removeChild(script); + callback(data); + }; + if (network == 'vk') { + window['VK'] = { + Share: { + count: function (a, b) { + window[callbackName](b); + } + } + }; + } else if (network == 'google-plus') { + window['services'] = { + gplus: { + cb: window[callbackName] + } + }; + } + script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName; + document.body.appendChild(script); + return true; + } + + return { + init: init + }; +})(); + +window.SocialShareKit = SocialShareKit; From df635e0c5be573715f348d5abf2c42d7d62bc74a Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 20 Sep 2016 11:22:53 -0400 Subject: [PATCH 34/91] fix really high audio encoding bitrate --- .../dist/fonts/social-share-kit.woff | Bin 0 -> 6720 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.woff diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.woff b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.woff new file mode 100644 index 0000000000000000000000000000000000000000..f03624afd4780c2febfd18479f18d86d15e57bc5 GIT binary patch literal 6720 zcmZWuWl$Wjx?S9*_~Ke96xRYpixgYjWmy&|vQS(XcP;Kvpt#c_i))J(*FtgE;!vP( z@0~aA&&$l2%sEL;@@2lsOcF1Uq9RCF7X$!M%K-2I$iln`K>1Jo|BJk$A|n8Rf(-yr z3;+OhAlgE021P|(bpU{J4B49+30hbBPI{$x3W`W=AIa&EU<4=t&_O!90ssINax6dz z39u%ed5IOw@*`5yL~>80Z-CZY?YR%umQbWNgw$RkA%gkOMD+twL~2(^PK5+3Ixi~P z2bjAz006{CazP}7Fs4xYV3yuUKcEbfWBwONYbQ&XHBwVX@?GQ{ceM2oiI2{1?#Six zAvIzo7y)Pi6z|-4ABQ;B1rKvk#43EyQUA+&@-^6oc1D||$DLz}sRBK@B0hC7#xD4a zdNi53D}!LWphWxS@qw3~M`x8rXMx%3%<5(Sl3B9EsF{?4sxF5E)36#@IC1E^2Iyo6 zx1kKWvMj-*Y_gjlIZMJ5i$|G#<)Qv++wF>5*Co8=62YS6dhh?7uyd~?$i91OF69TY zJ3Mt0>6>C9ZP}5!+yDDa*<(>a%Z);-7^$`K z^Ks^^Q!u0b>1PN0M;?M`<(}v?(Bd@oTh{Hi(}enN0JoRd>F<^9A-MQ0uUmJHAM0)S ziVi{tA&5Y%xYp)7>|N!in2et6nEzbOlyb2@+YS?jLc4F-QNqk>3H#urDdGu z7f8JIcpeyA=^MkS&N4PPdQ~9(rbS59ZDVEjAPdjdM*n9zs5UvydQ3epSKM#2ucBf`RgfL@Q$4Tsqpw}SuKUh$ zbeeUwdA2y**Jg*Z8R7FM@OtN8)6!a_B~OOIrLp-0jn7by50~>^UPsRDMS#>$wp?1U$(2D1GJ6%6__Z=k*$cPt7@3xO3{M&xBRW+w5TD(OZ97Z~dc0gvS^){1f>btc@qQ4FMy9B#S8@r%Gru@IE2h<{RN2GoNx1u% zQ^Tp9^a~l0GBy-t#uGuxCL$Kufi>59t@s%$Pu|kYDhmq{PtSa- ztgG?fqiclC$FRkh?<>|0Zp7ip<=?4diq+I$H!{8t2~mI@!Qw@|!NFg}a=vqKI-&UwCnf*)MN}rpv-M&HR?x z7#c<_w|1hCS3dLS?;^r5en1(2nSRfOaIb#AMxD@GAP=5dAv<1P5$lT3GpVV?9TgM3 z{Buz+UJYxyZP>~OW)4isin`19|NB1f#+(*(Y5cy}?ps{?@97+S9T*39G^v>Ehtb?w z?I~k)!<<|1x|7&KGL@ucj%aF!X!@h*7ySn7#*N+To-N|-A74P;PRns?qYWBJE@ix3 z8eHuyt`d9aqNn60Y~a;{v36lL@yB$+YZ$C~E-4fcM*;eb_qK`s`U_7%Jre?#*O9Cd zD^c*rTE0}k!`LjXYA6W@vd4bB$7_?Gka!mRXGK35qMJ0K}qU;f2&^0MkI<~&U z`jbYP=O1W;FVABZDSmNcsjr)gI4RU*g5FsG>nCbWd7Kv>X!!{YF3CV8{T`DRl5;df zzXWOfOP*YN`T04y7j7IUTwp(39Ty7cKf-2?+3QRnP8pJfR5tktbVS2>9+xo*)}sI(x(+@6F2@GADh=W03CLB zdOReG1&(XrXHex+4<*r76>e}*8Fa4xKKk*VN zT}-+Vnm`k-wa@w~`FKLH4A{zJTI;AgPq}5(6C|{p{TU~wTDi3+^oCPm_-a^rGwf{^GJI}&l&cg|vHSYH$OQPYT2FkV)@GFXj+U`jOGaAJ z;2n`cJ>U29tl-kJ9HX z`(~Xql+3|$#f6%OXEy1>Lb6IRJ9L&tocK!0L8Nt;>mY5lv#Q--CS!ecd(rX}oj`;c z-|KN*wK+K!;I<%UQFFsVfOkvOS}RR&MM!-ny7Y()f&#<3 z6VB#%jSr6;U>jqidO(LPa%7^6bFy+XQHvW|(irm9a%Y=<_)Yx!r(<6=qOyhDF;%3t z;CRfiO;%%5QBYy zgrQeF)v5?HoWJc|*e`CX*}Hv=mvnr-!5Z=4mqJ%0lrrNu+>I1b@a7f9yCEQ$n1v>Kzhki?eh|s>e~3#wS(cZe9JQ7)uFl|Az>e9ej!VpXuF6Q z3=bcCbAzweZ))pe>ypulZg9?32uw*#lrjmcTu?TlYi2L}Yh%Gn_<7Gu-0tuiEYmm< zPz}W?#YP1}@y7O#204YG&2x|)Ox@worJ9nwP_EF0b-h;Y)x4KWHEUdbGN+b)cKubT z2!95a%1SYQvoGkOFVXO|b7)ghf8e|%j0rA|NnrrK9qK6+b9ATaw6720*CwZlSJe5k z(MY1}7jJIG=!CiyCOg^BP1WG z>G&)#S@vuaHmDf*V>|IPR|R`U0R#k0?AP`6tXi({a-b^`i?Eew-pbCOcdo;MTXrMX zx~fn1f6XVfAHlFB_z?#_+lP2#fcqTtnJVp2*nvA5J}WgUg&5c*c*_K(kWnetsX_*w z1F`}XIz5-Yk{We6Zi0dd+}*R*Ms0xI2ST4Q3j#NzC*;Wwodnm3)5TixPXD1i;)~lr zyp-F^@WI%k=7CR`)%}|0TP$3Pr}u()y-#=0QLu3OPfpd>N#IA2GFOkaB&qG2E_*`woMWu2j=5X2)n55x?=DZT+ugGnnR{)eIpW!04ML? zM`1}ZHfg?~g@Uf4qtHKnZGcx1R%y;)R55;!$L6RNYOnXv3)4i`)Nm@t^&bE)H zI7A7++;YP&oz!QQWggVDa?@2DG$Y%t#Un(_O`=>LWERe4VJ5Q&3tN(2bpr_iV={ZWuj zTg34!6Iu?81g-`$wf}qkS-_j#CEiwWkiNX1g^JB6(UvH7BCp)Y^2;lYPm9?**ghVI zi{x7n6mc>o{rYKJ0aJ;4KjynCZn7G&8Pm&}lH-k&NEO+*SGdgQO$yV<@U^~*cFEx zu`o*vPW^ceG1Mbbm^)Kj;qai9#-^pU_H_OBqo->5>quMvP$3m|*ZRe-(H{Si;5qOv zBtU-$e=LFI1wZI8S9{)OhH)U$BUsA`X{-X0z^COMb2*nGMDm&=9`EW|_?Y-Dy7Pb$?i@L9e zXE7Xie$AJR9qbISKor9;jE~UQq9{0IdW1h~~@88-{Rn-h$CRYD!0q7uX z3hmt{cQoA(n8fYNONW@z=-x!n&q*k%xu=R5iYqHQVFrh~IW}Ksw~g@XrB^kT_N0hZ z5*jgwmJIQt*E(Zm3i+eibx*(Pd|tYqaMysCUi7MmGnG*Hez7gvNIRjdgWn(3bs_>; zo+;kk=-*IW`uf&N4hMYEJrx$cU13r?rjX5heq!g!!KyPqHqYWaRBIZk(Fmv$bMzb` zU3-4{_0l?0bcM z;eG2q&Rp4QzadU>3DuIFME~Bj+tTMFZV$YWw+w~}sb0n}Y{x-#%18AWN5AW5Zu`Uz zm=&BOVcq%F57vy_AIixQoDI~9Xon*)1};aQct3k3+r_)ZCkn#La2_omN;=tZ=+`WM z|KLzL&R@9J$>F@xJsO5rgkEYiTRPOkCx6AXgm4RtSf2?fQyrsT&~8@^@Qg=|*65cs zadOj8irYZ%^~2stB&4wJdsk!_m*2h+*RXC^gOH<2oQH5k<&n*UEllgYj#gdkv7uMd zQ$&p*vf`pdT{@q#_|x6NyXv)GscW!u1e?s5L)pnU1;NXG`M}{vj5wgcG?#8y=FTr= zjbBkVjn#NE0blPM@Abe{azKw1V@1NdwePN$2Od8U1Vuoo}83S_&eL>XiZ*-q`o{d{I5% zD-#Z?w~>`ue4#nb@yeQ+C}@d0GwFpxMSA6{O|KEQ_;Px^6>CO|`yXRjFmbij8+^YrMT26DkKEc!}MUqZhy|dI}U?ZOMy>1HVTH?>BQz5Wwy6b z#pI7pnV!=cWu)w~Bt^i`*+kRXzVy%wh}tP`D7&}??(-+fh~x~C6CC)MFisr>D}i;^ zz;NymE_d*brcJY$ke*dM1NPBoL>r3902dsqi!Pw}%!MZrc=|}NyRq9p&9Z*NCh;`> zylWH4zLfn-@~clW)S@*~i!wY-AE8$}r*E>Uy25pBP}j!0zaS=1X=@AQur81sE?4QD z)YD5RH=?eR5GoH740Y4#YId!6M;y72lMOk1?DVlt@W(5o8Wt458eK@s`?3MVtp*8BEQo_2a}l8bl&}<*&9*Pycqp<(Y^{QN2wxCI5Rp zqWWLp;egJD(EQKi*HV!a^wuC^k zXep)D`{J1$?vQQlYr-^1YJt__vxRc{I~v}NwL3P}ioi=Y|M)H;d#Ue}aiI9B_l(I? zeyWVi$*LKjz5$G)owq)l;o;y8*Avod-h8?+VGj7C9uD+SN+gr5XG^Rt*`R^ajZKh0 zd(sR!exM0-J#h=%!*bHE&FITn;6V9=^Qdt{VB@XX^J20qXFo>VD35bCq*5msS9dO3 zS--BxallwN!u<*=W>$WFO<}N8DbNT@W}0>yk$37LIJ9GXxs+FIVF_4Dx`?%0p_M`% zupnZ%{IxcBZ54T4-4AUEyy}iWrCR+n6)4mON6mk)L1a5rF*S9ZK#7}iWN=S8`P%F8 zs%+^brFibxa(7R<i74>yGP+tU8K{Z{ zW#eq`Yl?41nP#C$bjrPN+uirH#<~HEp0x7F{wwAJxV!+C?0}tODL*!9h3xCX?6(Le zgdV?IZ*sWQEST2akheXDuK?e8=T4H>{dov(_;ul)>fp{#{+4I-9p>jRi3a4U{4Zwt zo*XcH+i@>m>P?a5VG;>9YEbHZhN>jQ5v$y@%*Bz(?!zYB=^kSow3sF4=f2$7?Uw${ zvQhwfNKPsWA%YU33^?h~I(0Z(GIrPugD?V1M9udHDJy0Ye<@j%5~}ySj%P#Tju6&Q z7A@|h_iAOonUiwtOYhD%6xCyorw)xfm5@=BT^xA)T%9)x(t=p3_at@rCiIy zL31nB21{q-o3-b7?V9Y}$G*wf`aW(Z0v*znQRJMXuo0Vm?dM(MaCzF>YlP_PAC~|1At>e^EDF@3flIX6em@iY!ohr@4ueA5a0xS?$BdSf_dYqxxPOodTN>~R-M{Frbc6Zv)FRy?=6 z8%iJ6l`$Ew$fnTL9}(qcZ*`EOQHW@a7zY_&OqGwadZEzr6T4c9HI1A)%|GfO@lPX| zZHD|#?zepXiKbm{yMuZ=OlkW|`3N=K~0C zX-HNtmAU%QJ$Zf#=2u!S+A0yYlT9u8EfmwE8>fR!s#EFRCyxC9OkakbyfUkAvIp9K zA@Ek><_^r+;gXi~(f!*P4S9Xa2gkZ47ubUPfp$JWp~)=Ns(9s*d~4B?TNPMtIReYs zic<_Y5~ZgmR~!s{825Vlv4hHYTzOxX;YPHDM-DZbB-%j4LUoOAxOd`Thv~WRYAX@c z!O+aSRyV_dGqh$H>+jwfm%l<_$+bVQovN@$9n8?2zJUr{{acq6kbU#F#;IoBao&Da zKXBSFwPC7tXcP7hXN)~$K4UFN6zoRI4t9SuD@|{Hc;XS6 z8z?m%Umj@aXa8C?mQzL#zuRVz_CHBn>oBM7e4t8M)rpgSBjG!-FE1nI`FO(cw13hP zD0I(k3OnZgIhHLxIzMA9M6^w$A@#IqwNUW9ylr4bi#lu&xoWa{r*GIA)`K$ImF+z&{frg&A7P(FNl3+yoG z;IOrb;)Vk@anmn*>SkzuB12mZP*tlQ*Q=O~M6*<_yvE_zUr0Lr7p-(}x(pvH7Y^p5 zCR8{{^HeLp6qVYt@=b1JeaN&k8aNhXkit$`6ms*?()W;#D7@4WY{9E5`}cc*Xi^=w z?*HNgY`&3J;NH52bqRbF)!0OJHBI@A~$dpRl-S}1O)V5o2?VJPb-7~w#rj5aQI36Kh4 zRe_d?bkqFruY`AQUSh8b8b6r=XxXlCR>5UMe1ASp@I~7`)@)PGrYDEI#5Xm@8RtLj zk4)WzX`;f+QH(-~=NhN&KD;Qk-h-dgEqh_RF9h=i5)pgcZcGzOyEtxc89pO@lB0Gp zS!8})Y2E|EiCI57&QD%#`%Fk~d><18HS7il_oOF8uxONZa!kh%X@mH}U< Date: Tue, 20 Sep 2016 12:51:16 -0400 Subject: [PATCH 35/91] update recording dialogs --- .../emby-apiclient/.bower.json | 8 +- .../emby-apiclient/apiclient.js | 6 +- .../emby-apiclient/connectionmanager.js | 7 +- .../emby-webcomponents/.bower.json | 8 +- .../browserdeviceprofile.js | 9 +- .../emby-webcomponents/cardbuilder/card.css | 4 +- .../dialoghelper/dialoghelper.js | 4 + .../emby-toggle/emby-toggle.css | 51 ++- .../emby-toggle/emby-toggle.js | 2 +- .../emby-webcomponents/mediainfo/mediainfo.js | 20 +- .../recordingcreator/recordingcreator.css | 17 +- .../recordingcreator/recordingcreator.js | 259 +------------- .../recordingcreator.template.html | 58 +-- .../recordingcreator/recordingeditor.js | 94 ++--- .../recordingeditor.template.html | 23 +- .../recordingcreator/recordingfields.js | 37 +- .../recordingfields.template.html | 62 +++- .../emby-webcomponents/sharing/sharingmenu.js | 57 ++- .../LICENSE | 0 .../dist/css/social-share-kit.css | 7 + .../dist/fonts/social-share-kit.eot | Bin 0 -> 8660 bytes .../dist/fonts/social-share-kit.svg | 33 ++ .../dist/fonts/social-share-kit.ttf | Bin 0 -> 8456 bytes .../dist/css/social-share-kit.css | 7 - .../dist/fonts/social-share-kit.eot | Bin 8348 -> 0 bytes .../dist/fonts/social-share-kit.svg | 32 -- .../dist/fonts/social-share-kit.ttf | Bin 8144 -> 0 bytes .../dist/fonts/social-share-kit.woff | Bin 6420 -> 0 bytes .../dist/js/social-share-kit.js | 338 ------------------ .../dist/js/social-share-kit.min.js | 8 - .../emby-webcomponents/shortcuts.js | 13 +- .../emby-webcomponents/strings/ar.json | 2 + .../emby-webcomponents/strings/bg-BG.json | 2 + .../emby-webcomponents/strings/ca.json | 2 + .../emby-webcomponents/strings/cs.json | 2 + .../emby-webcomponents/strings/da.json | 2 + .../emby-webcomponents/strings/de.json | 2 + .../emby-webcomponents/strings/el.json | 2 + .../emby-webcomponents/strings/en-GB.json | 4 +- .../emby-webcomponents/strings/en-US.json | 4 +- .../emby-webcomponents/strings/es-AR.json | 2 + .../emby-webcomponents/strings/es-MX.json | 18 +- .../emby-webcomponents/strings/es.json | 2 + .../emby-webcomponents/strings/fi.json | 2 + .../emby-webcomponents/strings/fr-CA.json | 2 + .../emby-webcomponents/strings/fr.json | 2 + .../emby-webcomponents/strings/gsw.json | 2 + .../emby-webcomponents/strings/he.json | 2 + .../emby-webcomponents/strings/hr.json | 2 + .../emby-webcomponents/strings/hu.json | 2 + .../emby-webcomponents/strings/id.json | 2 + .../emby-webcomponents/strings/it.json | 2 + .../emby-webcomponents/strings/kk.json | 6 +- .../emby-webcomponents/strings/ko.json | 2 + .../emby-webcomponents/strings/ms.json | 2 + .../emby-webcomponents/strings/nb.json | 2 + .../emby-webcomponents/strings/nl.json | 2 + .../emby-webcomponents/strings/pl.json | 2 + .../emby-webcomponents/strings/pt-BR.json | 2 + .../emby-webcomponents/strings/pt-PT.json | 2 + .../emby-webcomponents/strings/ro.json | 2 + .../emby-webcomponents/strings/ru.json | 6 +- .../emby-webcomponents/strings/sk.json | 2 + .../emby-webcomponents/strings/sl-SI.json | 2 + .../emby-webcomponents/strings/sv.json | 2 + .../emby-webcomponents/strings/tr.json | 2 + .../emby-webcomponents/strings/uk.json | 2 + .../emby-webcomponents/strings/vi.json | 2 + .../emby-webcomponents/strings/zh-CN.json | 2 + .../emby-webcomponents/strings/zh-HK.json | 2 + .../emby-webcomponents/strings/zh-TW.json | 2 + .../bower_components/hls.js/.bower.json | 8 +- .../bower_components/hls.js/bower.json | 2 +- .../bower_components/hls.js/dist/hls.min.js | 10 +- .../bower_components/hls.js/package.json | 2 +- dashboard-ui/devices/ios/ios.css | 4 - dashboard-ui/itemdetails.html | 22 +- dashboard-ui/scripts/itemdetailpage.js | 77 ++-- 78 files changed, 432 insertions(+), 965 deletions(-) rename dashboard-ui/bower_components/emby-webcomponents/sharing/{social-share-kit-1.0.4 => social-share-kit-1.0.10}/LICENSE (100%) create mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/css/social-share-kit.css create mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.eot create mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.svg create mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.ttf delete mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/css/social-share-kit.css delete mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.eot delete mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.svg delete mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.ttf delete mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.woff delete mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/js/social-share-kit.js delete mode 100644 dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/js/social-share-kit.min.js diff --git a/dashboard-ui/bower_components/emby-apiclient/.bower.json b/dashboard-ui/bower_components/emby-apiclient/.bower.json index e38c78981a..11d5276347 100644 --- a/dashboard-ui/bower_components/emby-apiclient/.bower.json +++ b/dashboard-ui/bower_components/emby-apiclient/.bower.json @@ -16,12 +16,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.1.82", - "_release": "1.1.82", + "version": "1.1.83", + "_release": "1.1.83", "_resolution": { "type": "version", - "tag": "1.1.82", - "commit": "3ce8ac9212de0ee709f2bf836b1897fac14c5db0" + "tag": "1.1.83", + "commit": "64d6582c85ba3ab677f81bdb9d535587b5de3c65" }, "_source": "https://github.com/MediaBrowser/Emby.ApiClient.Javascript.git", "_target": "^1.1.51", diff --git a/dashboard-ui/bower_components/emby-apiclient/apiclient.js b/dashboard-ui/bower_components/emby-apiclient/apiclient.js index 179b6933a4..9a56f8e1d9 100644 --- a/dashboard-ui/bower_components/emby-apiclient/apiclient.js +++ b/dashboard-ui/bower_components/emby-apiclient/apiclient.js @@ -535,7 +535,11 @@ return; } - self.openWebSocket(); + try { + self.openWebSocket(); + } catch (err) { + console.log("Error opening web socket: " + err); + } }; function replaceAll(originalString, strReplace, strWith) { diff --git a/dashboard-ui/bower_components/emby-apiclient/connectionmanager.js b/dashboard-ui/bower_components/emby-apiclient/connectionmanager.js index 55efe7ba26..fd93e1be24 100644 --- a/dashboard-ui/bower_components/emby-apiclient/connectionmanager.js +++ b/dashboard-ui/bower_components/emby-apiclient/connectionmanager.js @@ -448,12 +448,9 @@ } if (options.enableWebSocket !== false) { - if (!apiClient.isWebSocketOpenOrConnecting() && apiClient.isWebSocketSupported()) { + console.log('calling apiClient.ensureWebSocket'); - console.log('calling apiClient.openWebSocket'); - - apiClient.openWebSocket(); - } + apiClient.ensureWebSocket(); } } diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index 296428d131..7cc679328b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.255", - "_release": "1.4.255", + "version": "1.4.256", + "_release": "1.4.256", "_resolution": { "type": "version", - "tag": "1.4.255", - "commit": "24c4f512b1038c00015dee815b1c5472cafe5487" + "tag": "1.4.256", + "commit": "dbe988350fad1cbe359594a57be846a89ae764d4" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js index d86a58869c..fcbfbf403c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js +++ b/dashboard-ui/bower_components/emby-webcomponents/browserdeviceprofile.js @@ -269,19 +269,20 @@ define(['browser'], function (browser) { } var mp3Added = false; - if ((canPlayMkv && options.enableMkvProgressive !== false) || (canPlayTs && options.enableMkvProgressive !== false)) { + if (canPlayMkv || canPlayTs) { if (supportsMp3VideoAudio) { mp3Added = true; videoAudioCodecs.push('mp3'); - hlsVideoAudioCodecs.push('mp3'); } } if (videoTestElement.canPlayType('video/mp4; codecs="avc1.640029, mp4a.40.2"').replace(/no/, '')) { videoAudioCodecs.push('aac'); hlsVideoAudioCodecs.push('aac'); } - if (!mp3Added && supportsMp3VideoAudio) { - videoAudioCodecs.push('mp3'); + if (supportsMp3VideoAudio) { + if (!mp3Added) { + videoAudioCodecs.push('mp3'); + } hlsVideoAudioCodecs.push('mp3'); } diff --git a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css index 9523c94d0b..fcf6790010 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css +++ b/dashboard-ui/bower_components/emby-webcomponents/cardbuilder/card.css @@ -85,7 +85,7 @@ @media all and (min-width: 600px) { .cardBox-mobile { - margin: 3px; + margin: 2px; } } @@ -147,7 +147,7 @@ .cardImageContainer { /* Should be 0 with visualCardBox, but not really noticeable */ - border-radius: 2px; + border-radius: 1px; } } diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js index e23b24ce72..f2b5ef3042 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js +++ b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js @@ -117,6 +117,10 @@ addBackdropOverlay(dlg); dlg.classList.add('opened'); + dlg.dispatchEvent(new CustomEvent('open', { + bubbles: false, + cancelable: false + })); if (dlg.getAttribute('data-lockscroll') == 'true' && !document.body.classList.contains('noScroll')) { document.body.classList.add('noScroll'); diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css index 387197c15c..f13b39c29c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.css @@ -2,10 +2,10 @@ position: relative; z-index: 1; vertical-align: middle; - display: inline-block; + display: inline-flex; + align-items: center; box-sizing: border-box; width: 100%; - height: 1.72em; margin: 0; padding: 0; overflow: visible; @@ -14,7 +14,8 @@ -moz-user-select: none; -ms-user-select: none; user-select: none; - padding-left: 2em; + flex-direction: row-reverse; + justify-content: flex-end; } .toggleContainer { @@ -22,11 +23,6 @@ } .mdl-switch__input { - line-height: 1.72em; -} - -.mdl-switch__input { - position: absolute; width: 0; height: 0; margin: 0; @@ -39,26 +35,27 @@ border: none; } +.mdl-switch__trackContainer { + position: relative; + width: 2.9em; +} + .mdl-switch__track { background: rgba(255,255,255, 0.26); - position: absolute; - left: 0; - top: .36em; height: 1em; - width: 2.58em; border-radius: 1em; cursor: pointer; } -.mdl-switch__input:checked + .mdl-switch__label + .mdl-switch__track { +.mdl-switch__input:checked + .mdl-switch__label + .mdl-switch__trackContainer > .mdl-switch__track { background: rgba(82,181,75, 0.5); } -.mdl-switch__input.red:checked + .mdl-switch__label + .mdl-switch__track { +.mdl-switch__input.red:checked + .mdl-switch__label + .mdl-switch__trackContainer > .mdl-switch__track { background: rgba(204,51,51, 0.5); } -.mdl-switch__input[disabled] + .mdl-switch__label + .mdl-switch__track { +.mdl-switch__input[disabled] + .mdl-switch__label + .mdl-switch__trackContainer > .mdl-switch__track { background: rgba(0,0,0, 0.12); cursor: auto; } @@ -67,7 +64,7 @@ background: #999; position: absolute; left: 0; - top: .15em; + top: -.25em; height: 1.44em; width: 1.44em; border-radius: 50%; @@ -76,21 +73,23 @@ transition-duration: 0.28s; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-property: left; + display: flex; + align-items: center; + justify-content: center; } -.mdl-switch__input:checked + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb { +.mdl-switch__input:checked + .mdl-switch__label + .mdl-switch__trackContainer > .mdl-switch__thumb { background: rgb(82,181,75); - left: 1.146em; + left: 1.466em; box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 3px 3px -2px rgba(0, 0, 0, 0.2), 0 1px 8px 0 rgba(0, 0, 0, 0.12); } -.mdl-switch__input.red:checked + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb { +.mdl-switch__input.red:checked + .mdl-switch__label + .mdl-switch__trackContainer > .mdl-switch__thumb { background: rgb(204,51,51); - left: 1.146em; box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 3px 3px -2px rgba(0, 0, 0, 0.2), 0 1px 8px 0 rgba(0, 0, 0, 0.12); } -.mdl-switch__input[disabled] + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb { +.mdl-switch__input[disabled] + .mdl-switch__label + .mdl-switch__trackContainer > .mdl-switch__thumb { background: rgb(189,189,189); cursor: auto; } @@ -109,29 +108,27 @@ background-color: transparent; } -.mdl-switch__input:focus + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb > .mdl-switch__focus-helper { +.mdl-switch__input:focus + .mdl-switch__label + .mdl-switch__trackContainer .mdl-switch__focus-helper { box-shadow: 0 0 0px 20px rgba(255,255,255, 0.26); background-color: rgba(255,255,255, 0.26); } -.mdl-switch__input:checked:focus + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb > .mdl-switch__focus-helper { +.mdl-switch__input:checked:focus + .mdl-switch__label + .mdl-switch__trackContainer .mdl-switch__focus-helper { box-shadow: 0 0 0px 20px rgba(82,181,75, 0.26); background-color: rgba(82,181,75, 0.26); } -.mdl-switch__input.red:checked:focus + .mdl-switch__label + .mdl-switch__track + .mdl-switch__thumb > .mdl-switch__focus-helper { +.mdl-switch__input.red:checked:focus + .mdl-switch__label + .mdl-switch__trackContainer .mdl-switch__focus-helper { box-shadow: 0 0 0px 20px rgba(204,51,51, 0.26); background-color: rgba(204,51,51, 0.26); } .mdl-switch__label { - position: relative; cursor: pointer; - line-height: 1.72em; margin: 0; - left: 1.52em; display: inline-flex; align-items: center; + margin-left: .7em; } .mdl-switch__input[disabled] .mdl-switch__label { diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.js b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.js index 3dab35b1bf..17898539dd 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-toggle/emby-toggle.js @@ -34,7 +34,7 @@ var labelTextElement = labelElement.querySelector('span'); - labelElement.insertAdjacentHTML('beforeend', '
'); + labelElement.insertAdjacentHTML('beforeend', '
'); labelTextElement.classList.add('toggleButtonLabel'); labelTextElement.classList.add('mdl-switch__label'); diff --git a/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.js b/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.js index af402f4112..b15944e177 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.js +++ b/dashboard-ui/bower_components/emby-webcomponents/mediainfo/mediainfo.js @@ -40,15 +40,17 @@ define(['datetime', 'globalize', 'embyRouter', 'itemHelper', 'material-icons', ' } } - if (item.SeriesTimerId) { - miscInfo.push({ - html: '' - }); - } - else if (item.TimerId) { - miscInfo.push({ - html: '' - }); + if (options.timerIndicator !== false) { + if (item.SeriesTimerId) { + miscInfo.push({ + html: '' + }); + } + else if (item.TimerId) { + miscInfo.push({ + html: '' + }); + } } html += miscInfo.map(function (m) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.css b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.css index ba9843e3dd..f1cc9eedc7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.css +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.css @@ -2,10 +2,6 @@ color: #cc3333; } -.layout-tv .btnHeaderSave { - display: none; -} - .recordingDialog-imageContainer { flex-shrink: 0; padding: 1em 1em 1em 0; @@ -16,10 +12,6 @@ max-width: 100%; } -.btnPlay-notplayable { - display: none !important; -} - .recordingDialog-itemName { margin-top: .5em; } @@ -33,11 +25,4 @@ .programDialog-itemName { display: none; } -} - -@media all and (max-height: 1400px) { - - .layout-tv .recordingDialog .itemOverview { - display: none; - } -} +} \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js index 9c489fad40..eb76c03cb7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.js @@ -1,216 +1,29 @@ -define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'datetime', 'imageLoader', 'shell', 'emby-checkbox', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, datetime, imageLoader, shell) { +define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'datetime', 'imageLoader', 'recordingFields', 'emby-checkbox', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, datetime, imageLoader, recordingFields) { var currentProgramId; var currentServerId; var currentDialog; - var recordingCreated = false; var closeAction; + var currentRecordingFields; - function hideSeriesRecordingFields(context) { + function closeDialog() { - slideUpToHide(context.querySelector('.seriesFields')); - context.querySelector('.btnSubmit').classList.remove('hide'); - context.querySelector('.supporterContainer').classList.add('hide'); - } - - function closeDialog(isSubmitted) { - - recordingCreated = isSubmitted; dialogHelper.close(currentDialog); } - function onSubmit(e) { - - loading.show(); - - var form = this; - - var apiClient = connectionManager.getApiClient(currentServerId); - - apiClient.getNewLiveTvTimerDefaults({ programId: currentProgramId }).then(function (item) { - - item.RecordNewOnly = form.querySelector('#chkNewOnly').checked; - item.RecordAnyChannel = form.querySelector('#chkAllChannels').checked; - item.RecordAnyTime = form.querySelector('#chkAnyTime').checked; - - if (form.querySelector('#chkRecordSeries').checked) { - - apiClient.createLiveTvSeriesTimer(item).then(function () { - - loading.hide(); - closeDialog(true); - }); - - } else { - apiClient.createLiveTvTimer(item).then(function () { - - loading.hide(); - closeDialog(true); - }); - } - }); - - // Disable default form submission - e.preventDefault(); - return false; - } - - function getRegistration(apiClient, programId, feature) { - - loading.show(); - - return apiClient.getJSON(apiClient.getUrl('LiveTv/Registration', { - - ProgramId: programId, - Feature: feature - - })).then(function (result) { - - loading.hide(); - return result; - - }, function () { - - loading.hide(); - - return { - TrialVersion: true, - IsValid: true, - IsRegistered: false - }; - }); - } - - function setPlayButtonVisible(context, visible) { - - var btnPlay = context.querySelector('.btnPlay'); - - if (!visible) { - btnPlay.classList.add('hide'); - } else { - btnPlay.classList.remove('hide'); - } - } - - function showSeriesRecordingFields(context, apiClient) { - - slideDownToShow(context.querySelector('.seriesFields')); - - getRegistration(apiClient, currentProgramId, 'seriesrecordings').then(function (regInfo) { - - if (regInfo.IsRegistered) { - context.querySelector('.btnSubmit').classList.remove('hide'); - setPlayButtonVisible(context, true); - context.querySelector('.supporterContainer').classList.add('hide'); - - } else { - - context.querySelector('.supporterContainerText').innerHTML = globalize.translate('sharedcomponents#MessageActiveSubscriptionRequiredSeriesRecordings'); - context.querySelector('.supporterContainer').classList.remove('hide'); - context.querySelector('.btnSubmit').classList.add('hide'); - setPlayButtonVisible(context, false); - } - }); - } - - function showSingleRecordingFields(context, apiClient) { - - getRegistration(apiClient, currentProgramId, 'dvr').then(function (regInfo) { - - if (regInfo.IsRegistered) { - context.querySelector('.btnSubmit').classList.remove('hide'); - setPlayButtonVisible(context, true); - context.querySelector('.supporterContainer').classList.add('hide'); - - } else { - - context.querySelector('.supporterContainerText').innerHTML = globalize.translate('sharedcomponents#DvrSubscriptionRequired'); - context.querySelector('.supporterContainer').classList.remove('hide'); - context.querySelector('.btnSubmit').classList.add('hide'); - setPlayButtonVisible(context, false); - } - }); - } - - function slideDownToShow(elem) { - - if (!elem.classList.contains('hide')) { - return; - } - - elem.classList.remove('hide'); - - elem.style.overflowY = 'hidden'; - - requestAnimationFrame(function () { - - elem.animate([{ - height: 0 - }, { - height: elem.offsetHeight + 'px' - - }], { duration: 400, easing: 'ease' }).onfinish = function () { - elem.classList.remove('hide'); - }; - }); - } - - function slideUpToHide(elem) { - - if (elem.classList.contains('hide')) { - return; - } - - elem.style.overflowY = 'hidden'; - - requestAnimationFrame(function () { - - elem.animate([{ - height: elem.offsetHeight + 'px' - }, { - height: 0 - }], { duration: 400, easing: 'ease' }).onfinish = function () { - elem.classList.add('hide'); - }; - }); - } - function init(context) { - var apiClient = connectionManager.getApiClient(currentServerId); - - context.querySelector('#chkRecordSeries').addEventListener('change', function () { - - if (this.checked) { - showSeriesRecordingFields(context, apiClient); - } else { - hideSeriesRecordingFields(context); - showSingleRecordingFields(context, apiClient); - } - }); - context.querySelector('.btnPlay').addEventListener('click', function () { closeAction = 'play'; - closeDialog(false); + closeDialog(); }); context.querySelector('.btnCancel').addEventListener('click', function () { closeAction = null; - closeDialog(false); + closeDialog(); }); - - context.querySelector('form', context).addEventListener('submit', onSubmit); - - var supporterButtons = context.querySelectorAll('.btnSupporter'); - for (var i = 0, length = supporterButtons.length; i < length; i++) { - if (appHost.supports('externalpremium')) { - supporterButtons[i].classList.remove('hide'); - } else { - supporterButtons[i].classList.add('hide'); - } - } } function getImageUrl(item, apiClient, imageHeight) { @@ -261,56 +74,22 @@ context.querySelector('.itemGenres').innerHTML = (program.Genres || []).join(' / '); context.querySelector('.itemOverview').innerHTML = program.Overview || ''; - var btnPlay = context.querySelector('.btnPlay'); + var formDialogFooter = context.querySelector('.formDialogFooter'); var now = new Date(); if (now >= datetime.parseISO8601Date(program.StartDate, true) && now < datetime.parseISO8601Date(program.EndDate, true)) { - btnPlay.classList.remove('btnPlay-notplayable'); + formDialogFooter.classList.remove('hide'); } else { - btnPlay.classList.add('btnPlay-notplayable'); + formDialogFooter.classList.add('hide'); } context.querySelector('.itemMiscInfoPrimary').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(program); - context.querySelector('.itemMiscInfoSecondary').innerHTML = mediaInfo.getSecondaryMediaInfoHtml(program); - - context.querySelector('#chkNewOnly').checked = defaultTimer.RecordNewOnly; - context.querySelector('#chkAllChannels').checked = defaultTimer.RecordAnyChannel; - context.querySelector('#chkAnyTime').checked = defaultTimer.RecordAnyTime; - - if (program.IsSeries) { - context.querySelector('#eligibleForSeriesFields').classList.remove('hide'); - } else { - context.querySelector('#eligibleForSeriesFields').classList.add('hide'); - } - - showConvertRecordingsUnlockMessage(context, apiClient); + context.querySelector('.itemMiscInfoSecondary').innerHTML = mediaInfo.getSecondaryMediaInfoHtml(program, { + timerIndicator: false + }); loading.hide(); } - function showConvertRecordingsUnlockMessage(context, apiClient) { - - apiClient.getPluginSecurityInfo().then(function (regInfo) { - - if (regInfo.IsMBSupporter) { - context.querySelector('.convertRecordingsContainer').classList.add('hide'); - } else { - context.querySelector('.convertRecordingsContainer').classList.remove('hide'); - } - - }, function () { - - context.querySelector('.convertRecordingsContainer').classList.remove('hide'); - }); - } - - function onSupporterButtonClick() { - if (appHost.supports('externalpremium')) { - shell.openUrl('https://emby.media/premiere'); - } else { - - } - } - function reload(context, programId) { loading.show(); @@ -350,7 +129,6 @@ return new Promise(function (resolve, reject) { - recordingCreated = false; currentProgramId = itemId; currentServerId = serverId; closeAction = null; @@ -387,10 +165,7 @@ executeCloseAction(closeAction, currentProgramId, currentServerId); - if (recordingCreated) { - require(['toast'], function (toast) { - toast(globalize.translate('sharedcomponents#RecordingScheduled')); - }); + if (currentRecordingFields && currentRecordingFields.hasChanged()) { resolve(); } else { reject(); @@ -401,14 +176,16 @@ scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); } - dlg.querySelector('.btnSupporterForConverting').addEventListener('click', onSupporterButtonClick); - - hideSeriesRecordingFields(dlg); - showSingleRecordingFields(dlg, connectionManager.getApiClient(serverId)); init(dlg); reload(dlg, itemId); + currentRecordingFields = new recordingFields({ + parent: dlg.querySelector('.recordingFields'), + programId: itemId, + serverId: serverId + }); + dialogHelper.open(dlg); }); }); diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html index 65f799f4ac..f27fbdd9e8 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingcreator.template.html @@ -9,65 +9,23 @@
-
+

-

-

+

+

+ +
+

- -
-
- - -
-
- - - -
-
-
-

-
-

${HeaderConvertYourRecordings}

-
${PromoConvertRecordingsToStreamingFormat}
-
- -
-
-
-
-
-
- -
- -
\ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js index 10f7c394d9..eec179f69c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js @@ -13,7 +13,7 @@ require(['confirm'], function (confirm) { confirm({ - + title: globalize.translate('sharedcomponents#HeaderConfirmRecordingCancellation'), text: globalize.translate('sharedcomponents#MessageConfirmRecordingCancellation'), confirmText: globalize.translate('sharedcomponents#HeaderCancelRecording'), @@ -38,85 +38,30 @@ }); } - function getImageUrl(item, apiClient, imageHeight) { - - var imageTags = item.ImageTags || {}; - - if (item.PrimaryImageTag) { - imageTags.Primary = item.PrimaryImageTag; - } - - if (imageTags.Primary) { - - return apiClient.getScaledImageUrl(item.Id, { - type: "Primary", - maxHeight: imageHeight, - tag: item.ImageTags.Primary - }); - } - else if (imageTags.Thumb) { - - return apiClient.getScaledImageUrl(item.Id, { - type: "Thumb", - maxHeight: imageHeight, - tag: item.ImageTags.Thumb - }); - } - - return null; - } - function renderTimer(context, item, apiClient) { var program = item.ProgramInfo || {}; - var imgUrl = getImageUrl(program, apiClient, 200); - var imageContainer = context.querySelector('.recordingDialog-imageContainer'); - - if (imgUrl) { - imageContainer.innerHTML = ''; - imageContainer.classList.remove('hide'); - - imageLoader.lazyChildren(imageContainer); - } else { - imageContainer.innerHTML = ''; - imageContainer.classList.add('hide'); - } - - context.querySelector('.recordingDialog-itemName').innerHTML = item.Name; - - context.querySelector('.itemGenres').innerHTML = (program.Genres || []).join(' / '); - context.querySelector('.itemOverview').innerHTML = program.Overview || ''; - - context.querySelector('.itemMiscInfoPrimary').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(program); - context.querySelector('.itemMiscInfoSecondary').innerHTML = mediaInfo.getSecondaryMediaInfoHtml(program); - context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60; context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60; - var timerStausElem = context.querySelector('.timerStatus'); - - if (item.Status == 'New') { - timerStausElem.classList.add('hide'); - } else { - timerStausElem.classList.remove('hide'); - timerStausElem.innerHTML = 'Status:   ' + item.Status; - } - loading.hide(); } - function closeDialog(isSubmitted, isDeleted) { + function closeDialog(isDeleted) { - recordingUpdated = isSubmitted; + recordingUpdated = true; recordingDeleted = isDeleted; - dialogHelper.close(currentDialog); + + if (isDeleted) { + dialogHelper.close(currentDialog); + } else { + currentDialog.querySelector('.btnSubmit').click(); + } } function onSubmit(e) { - loading.show(); - var form = this; var apiClient = connectionManager.getApiClient(currentServerId); @@ -126,11 +71,7 @@ item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60; item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60; apiClient.updateLiveTvTimer(item).then(function () { - loading.hide(); - require(['toast'], function (toast) { - toast(Globalize.translate('MessageRecordingSaved')); - closeDialog(true); - }); + dialogHelper.close(currentDialog); }); }); @@ -151,7 +92,7 @@ var apiClient = connectionManager.getApiClient(currentServerId); deleteTimer(apiClient, currentItemId).then(function () { - closeDialog(true, true); + closeDialog(true); }); }); @@ -171,7 +112,7 @@ }); } - function showEditor(itemId, serverId) { + function showEditor(itemId, serverId, options) { return new Promise(function (resolve, reject) { @@ -179,6 +120,7 @@ recordingDeleted = false; currentServerId = serverId; loading.show(); + options = options || {}; require(['text!./recordingeditor.template.html'], function (template) { @@ -190,7 +132,7 @@ if (layoutManager.tv) { dialogOptions.size = 'fullscreen'; } else { - dialogOptions.size = 'small'; + dialogOptions.size = 'mini'; } var dlg = dialogHelper.createDialog(dialogOptions); @@ -198,12 +140,20 @@ dlg.classList.add('formDialog'); dlg.classList.add('recordingDialog'); + if (!layoutManager.tv) { + dlg.style['min-width'] = '20%'; + } + var html = ''; html += globalize.translateDocument(template, 'sharedcomponents'); dlg.innerHTML = html; + if (options.enableCancel === false) { + dlg.querySelector('.formDialogFooter').classList.add('hide'); + } + currentDialog = dlg; dlg.addEventListener('close', function () { diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.template.html b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.template.html index 76a06d8f67..fa0d99d7fc 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.template.html @@ -1,30 +1,13 @@ 

- ${Edit} + ${HeaderRecordingOptions}

-
-
- -
-
-

-

-

-
-
- -

-

- -

-

-

@@ -36,10 +19,10 @@
- -
diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js index b4f705fa3e..ceb376cd04 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js @@ -1,4 +1,4 @@ -define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'recordingHelper', 'emby-toggle'], function (globalize, connectionManager, require, loading, appHost, recordingHelper) { +define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'recordingHelper', 'emby-toggle', 'paper-icon-button-light', 'emby-button'], function (globalize, connectionManager, require, loading, appHost, recordingHelper) { function getRegistration(apiClient, programId, feature) { @@ -105,6 +105,18 @@ showSingleRecordingFields(parent, program.Id, apiClient); } + if (program.SeriesTimerId) { + parent.querySelector('.btnManageSeriesRecording').classList.remove('visibilityHide'); + } else { + parent.querySelector('.btnManageSeriesRecording').classList.add('visibilityHide'); + } + + if (program.TimerId) { + parent.querySelector('.btnManageRecording').classList.remove('visibilityHide'); + } else { + parent.querySelector('.btnManageRecording').classList.add('visibilityHide'); + } + //var seriesTimerPromise = program.SeriesTimerId ? // apiClient.getLiveTvSeriesTimer(program.SeriesTimerId) : // apiClient.getLiveTvProgram(program.Id, apiClient.getCurrentUserId()); @@ -143,6 +155,28 @@ } } + function onManageRecordingClick(e) { + + var options = this.options; + + if (!this.TimerId) { + return; + } + + var self = this; + + require(['recordingEditor'], function (recordingEditor) { + + recordingEditor.show(self.TimerId, options.serverId, { + + enableCancel: false + + }).then(function () { + self.changed = true; + }); + }); + } + function onRecordChange(e) { this.changed = true; @@ -227,6 +261,7 @@ context.querySelector('.chkRecord').addEventListener('change', onRecordChange.bind(self)); context.querySelector('.chkRecordSeries').addEventListener('change', onRecordSeriesChange.bind(self)); + context.querySelector('.btnManageRecording').addEventListener('click', onManageRecordingClick.bind(self)); fetchData(self).then(resolve); }); diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html index 2049fcf367..af677ed00e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html @@ -1,4 +1,41 @@ -
+ + +

${HeaderConvertYourRecordings}

${PromoConvertRecordingsToStreamingFormat}

@@ -15,13 +52,20 @@
- +
+ + +
- +
+ + +
+
\ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/sharingmenu.js b/dashboard-ui/bower_components/emby-webcomponents/sharing/sharingmenu.js index 882fa46501..8a65c4cf48 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/sharing/sharingmenu.js +++ b/dashboard-ui/bower_components/emby-webcomponents/sharing/sharingmenu.js @@ -1,10 +1,11 @@ -define(['dialogHelper', 'layoutManager', 'globalize', './social-share-kit-1.0.4/dist/js/social-share-kit.min', 'css!./social-share-kit-1.0.4/dist/css/social-share-kit.css', 'emby-button'], function (dialogHelper, layoutManager, globalize) { +define(['dialogHelper', 'layoutManager', 'globalize', './social-share-kit-1.0.10/dist/js/social-share-kit.min', 'css!./social-share-kit-1.0.10/dist/css/social-share-kit.css', 'emby-button'], function (dialogHelper, layoutManager, globalize) { function showMenu(options) { var dlg = dialogHelper.createDialog({ removeOnClose: true, - autoFocus: layoutManager.tv + autoFocus: layoutManager.tv, + modal: false }); dlg.id = 'dlg' + new Date().getTime(); @@ -12,18 +13,18 @@ html += '

' + Globalize.translate('Share') + '

'; - html += '
'; html += '
'; // We can only do facebook if we can guarantee that the current page is available over the internet, since FB will try to probe it. - html += ''; + html += ''; - html += '
'; + html += ''; + html += ''; + html += ''; + html += ''; html += '
'; - html += '
'; - html += ''; - html += '
'; + dlg.style['padding'] = '.5em 1.5em 1.5em'; dlg.innerHTML = html; @@ -31,15 +32,6 @@ var shareInfo = options.share; - SocialShareKit.init({ - selector: '#' + dlg.id + ' .ssk', - url: shareInfo.Url, - title: shareInfo.Name, - text: shareInfo.Overview, - image: shareInfo.ImageUrl, - via: 'Emby' - }); - function onSskButtonClick(e) { isShared = true; dialogHelper.close(dlg); @@ -51,25 +43,24 @@ sskButtons[i].addEventListener('click', onSskButtonClick); } - // Has to be assigned a z-index after the call to .open() - dlg.querySelector('.btnCancel').addEventListener('click', function () { - dialogHelper.close(dlg); - }); - - var promise = new Promise(function (resolve, reject) { - - dlg.addEventListener('close', function () { - if (isShared) { - resolve(); - } else { - reject(); - } + dlg.addEventListener('open', function() { + SocialShareKit.init({ + selector: '#' + dlg.id + ' .ssk', + url: shareInfo.Url, + title: shareInfo.Name, + text: shareInfo.Overview, + image: shareInfo.ImageUrl, + via: 'Emby' }); }); - dialogHelper.open(dlg); - - return promise; + return dialogHelper.open(dlg).then(function() { + if (isShared) { + return Promise.resolve(); + } else { + return Promise.reject(); + } + }); } return { diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/LICENSE b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/LICENSE similarity index 100% rename from dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/LICENSE rename to dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/LICENSE diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/css/social-share-kit.css b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/css/social-share-kit.css new file mode 100644 index 0000000000..3c5e29fd01 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/css/social-share-kit.css @@ -0,0 +1,7 @@ +/*! + * Social Share Kit v1.0.7 (http://socialsharekit.com) + * Copyright 2015 Social Share Kit / Kaspars Sprogis. + * Licensed under Creative Commons Attribution-NonCommercial 3.0 license: + * https://github.com/darklow/social-share-kit/blob/master/LICENSE + * --- + */@font-face{font-family:'social-share-kit';src:url('../fonts/social-share-kit.eot');src:url('../fonts/social-share-kit.eot?#iefix') format('embedded-opentype'),url('../fonts/social-share-kit.woff') format('woff'),url('../fonts/social-share-kit.ttf') format('truetype'),url('../fonts/social-share-kit.svg#social-share-kit') format('svg');font-weight:normal;font-style:normal}.ssk:before{display:inline-block;font-family:"social-share-kit" !important;font-style:normal !important;font-weight:normal !important;font-variant:normal !important;text-transform:none !important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ssk-facebook:before{content:"a";text-indent:4px;margin-right:-4px}.ssk-twitter:before{content:"b"}.ssk-google-plus:before{content:"v"}.ssk-google-plus-old:before{content:"c"}.ssk-email:before{content:"d";top:-1px;position:relative}.ssk-pinterest:before{content:"e"}.ssk-tumblr:before{content:"f"}.ssk-linkedin:before{content:"g"}.ssk-github:before{content:"h"}.ssk-vk:before{content:"i"}.ssk-instagram:before{content:"j"}.ssk-amazon:before{content:"k"}.ssk-skype:before{content:"s"}.ssk-youtube:before{content:"x"}.ssk-vimeo:before{content:"u"}.ssk-ebay:before{content:"p"}.ssk-apple:before{content:"l"}.ssk-behance:before{content:"q"}.ssk-dribble:before{content:"n"}.ssk-android:before{content:"o"}.ssk-whatsapp:before{content:"m"}.ssk-reddit:before{content:"r"}.ssk-reddit2:before{content:"t"}.ssk{background-color:#757575;color:white;display:inline-block;font-size:22px;line-height:1px;margin-right:2px;margin-bottom:2px;padding:7px;text-align:center;text-decoration:none;transition:background-color .1s;-webkit-transition:background-color .1s;-moz-transition:background-color .1s;-ms-transition:background-color .1s;-o-transition:background-color .1s}.ssk:before,.ssk .glyphicon,.ssk .fa{position:relative;font-size:22px;top:0;vertical-align:middle}.ssk.ssk-xs,.ssk-xs>.ssk{padding:4px}.ssk.ssk-xs:before,.ssk-xs>.ssk:before,.ssk.ssk-xs .glyphicon,.ssk-xs>.ssk .glyphicon,.ssk.ssk-xs .fa,.ssk-xs>.ssk .fa{font-size:15px}.ssk.ssk-sm,.ssk-sm>.ssk{padding:5px}.ssk.ssk-sm:before,.ssk-sm>.ssk:before,.ssk.ssk-sm .glyphicon,.ssk-sm>.ssk .glyphicon,.ssk.ssk-sm .fa,.ssk-sm>.ssk .fa{font-size:20px}.ssk.ssk-lg,.ssk-lg>.ssk{padding:9px}.ssk.ssk-lg:before,.ssk-lg>.ssk:before,.ssk.ssk-lg .glyphicon,.ssk-lg>.ssk .glyphicon,.ssk.ssk-lg .fa,.ssk-lg>.ssk .fa{font-size:28px}.ssk:last-child{margin-right:0}.ssk:hover{background-color:#424242}.ssk:hover,.ssk:focus{color:#fff;text-decoration:none}.ssk.ssk-round,.ssk-round .ssk{border-radius:50%}.ssk.ssk-round:before,.ssk-round .ssk:before{text-indent:0;margin-right:0}.ssk.ssk-rounded,.ssk-rounded .ssk{border-radius:15%}.ssk.ssk-icon{color:#757575;padding:2px;font-size:24px}.ssk.ssk-icon,.ssk.ssk-icon:hover{background-color:transparent}.ssk.ssk-icon:hover{color:#424242}.ssk.ssk-icon.ssk-xs,.ssk-xs>.ssk.ssk-icon{font-size:16px}.ssk.ssk-icon.ssk-sm,.ssk-sm>.ssk.ssk-icon{font-size:20px}.ssk.ssk-icon.ssk-lg,.ssk-lg>.ssk.ssk-icon{font-size:28px}.ssk.ssk-text{overflow:hidden;font-size:17px;line-height:normal;padding-right:10px}.ssk.ssk-text:before,.ssk.ssk-text .glyphicon,.ssk.ssk-text .fa{margin:-7px 10px -7px -7px;padding:7px;background-color:rgba(0,0,0,0.15);vertical-align:bottom;text-indent:0}.ssk-block .ssk.ssk-text{display:block;margin-right:0;text-align:left}.ssk.ssk-text.ssk-xs,.ssk-xs>.ssk.ssk-text{font-size:12px;padding-right:6px}.ssk.ssk-text.ssk-xs:before,.ssk-xs>.ssk.ssk-text:before,.ssk.ssk-text.ssk-xs .glyphicon,.ssk-xs>.ssk.ssk-text .glyphicon,.ssk.ssk-text.ssk-xs .fa,.ssk-xs>.ssk.ssk-text .fa{margin:-4px 6px -4px -4px;padding:4px}.ssk.ssk-text.ssk-sm,.ssk-sm>.ssk.ssk-text{font-size:16px;padding-right:7px}.ssk.ssk-text.ssk-sm:before,.ssk-sm>.ssk.ssk-text:before,.ssk.ssk-text.ssk-sm .glyphicon,.ssk-sm>.ssk.ssk-text .glyphicon,.ssk.ssk-text.ssk-sm .fa,.ssk-sm>.ssk.ssk-text .fa{margin:-5px 7px -5px -5px;padding:5px}.ssk.ssk-text.ssk-lg,.ssk-lg>.ssk.ssk-text{font-size:22px;padding-right:13px}.ssk.ssk-text.ssk-lg:before,.ssk-lg>.ssk.ssk-text:before,.ssk.ssk-text.ssk-lg .glyphicon,.ssk-lg>.ssk.ssk-text .glyphicon,.ssk.ssk-text.ssk-lg .fa,.ssk-lg>.ssk.ssk-text .fa{margin:-9px 13px -9px -9px;padding:9px}.ssk-group,.ssk-sticky{font-size:0}.ssk-sticky{top:0;position:fixed;z-index:2000}.ssk-sticky .ssk{transition:padding .1s ease-out;-webkit-transition:padding .1s ease-out;-moz-transition:padding .1s ease-out;-ms-transition:padding .1s ease-out;-o-transition:padding .1s ease-out;margin:0}@media (min-width:768px){.ssk-sticky.ssk-left .ssk,.ssk-sticky.ssk-right .ssk{display:block;clear:both}.ssk-sticky.ssk-left.ssk-center,.ssk-sticky.ssk-right.ssk-center{top:50%;transform:translateY(-50%);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%)}.ssk-sticky.ssk-left{left:0}.ssk-sticky.ssk-left .ssk{float:left}.ssk-sticky.ssk-left .ssk:hover{padding-left:15px}.ssk-sticky.ssk-right{right:0}.ssk-sticky.ssk-right .ssk{float:right}.ssk-sticky.ssk-right .ssk:hover{padding-right:15px}}.ssk-sticky.ssk-bottom{font-size:0;top:auto;bottom:0}.ssk-sticky.ssk-bottom.ssk-center{left:50%;right:auto;transform:translateX(-50%);-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%)}.ssk-sticky.ssk-bottom .ssk{vertical-align:bottom}.ssk-sticky.ssk-bottom .ssk:hover{padding-bottom:15px}.ssk-sticky.ssk-round.ssk-xs .ssk:hover{padding:8px}.ssk-sticky.ssk-round.ssk-sm .ssk:hover{padding:9px}.ssk-sticky.ssk-round .ssk:hover{padding:11px}.ssk-sticky.ssk-round.ssk-lg .ssk:hover{padding:13px}@media (max-width:767px){.ssk-sticky{left:0;right:0;bottom:0;top:auto;width:100%;display:flex !important;flex-direction:row;flex-wrap:nowrap}.ssk-sticky.ssk-sticky-hide-xs{display:none !important}.ssk-sticky .ssk{flex:1;width:auto}.ssk-sticky .ssk .ssk-num{display:none}}.ssk-count{padding-top:20px}.ssk-count .ssk{position:relative}.ssk-count .ssk-num{border-radius:4px;color:#8f8f8f;background-color:rgba(50,50,50,0.03);display:block;font-size:12px;left:0;line-height:20px;position:absolute;right:0;text-align:center;top:-20px}@media (min-width:768px){.ssk-count.ssk-sticky{padding-top:0}.ssk-count.ssk-sticky.ssk-left .ssk-num,.ssk-count.ssk-sticky.ssk-right .ssk-num{top:20%;background-color:transparent}.ssk-count.ssk-sticky.ssk-left .ssk-num{left:100%;margin-left:5px}.ssk-count.ssk-sticky.ssk-right .ssk-num{right:115%;margin-left:-100%;text-align:right}}.ssk-facebook{background-color:#255c95}.ssk-grayscale>.ssk-facebook{background-color:#757575}.ssk-facebook:hover{background-color:#1b436c}.ssk-facebook:hover{background-color:#1b436c}.ssk-grayscale>.ssk-facebook:hover{background-color:#255c95}.ssk-facebook.ssk-icon{color:#255c95}.ssk-facebook.ssk-icon:hover{color:#1b436c}.ssk-facebook.ssk-icon:before{text-indent:0;margin-right:0}.ssk-twitter{background-color:#00b4e0}.ssk-grayscale>.ssk-twitter{background-color:#757575}.ssk-twitter:hover{background-color:#008bad}.ssk-twitter:hover{background-color:#008bad}.ssk-grayscale>.ssk-twitter:hover{background-color:#00b4e0}.ssk-twitter.ssk-icon{color:#00b4e0}.ssk-twitter.ssk-icon:hover{color:#008bad}.ssk-google-plus{background-color:#f1403a}.ssk-grayscale>.ssk-google-plus{background-color:#757575}.ssk-google-plus:hover{background-color:#e81810}.ssk-google-plus:hover{background-color:#e81810}.ssk-grayscale>.ssk-google-plus:hover{background-color:#f1403a}.ssk-google-plus.ssk-icon{color:#f1403a}.ssk-google-plus.ssk-icon:hover{color:#e81810}.ssk-pinterest{background-color:#cb2027}.ssk-grayscale>.ssk-pinterest{background-color:#757575}.ssk-pinterest:hover{background-color:#9f191f}.ssk-pinterest:hover{background-color:#9f191f}.ssk-grayscale>.ssk-pinterest:hover{background-color:#cb2027}.ssk-pinterest.ssk-icon{color:#cb2027}.ssk-pinterest.ssk-icon:hover{color:#9f191f}.ssk-tumblr{background-color:#395773}.ssk-grayscale>.ssk-tumblr{background-color:#757575}.ssk-tumblr:hover{background-color:#283d51}.ssk-tumblr:hover{background-color:#283d51}.ssk-grayscale>.ssk-tumblr:hover{background-color:#395773}.ssk-tumblr.ssk-icon{color:#395773}.ssk-tumblr.ssk-icon:hover{color:#283d51}.ssk-email{background-color:#757575}.ssk-grayscale>.ssk-email{background-color:#757575}.ssk-email:hover{background-color:#5b5b5b}.ssk-email:hover{background-color:#5b5b5b}.ssk-grayscale>.ssk-email:hover{background-color:#757575}.ssk-grayscale>.ssk-email:hover{background-color:#5b5b5b}.ssk-email.ssk-icon{color:#757575}.ssk-email.ssk-icon:hover{color:#5b5b5b}.ssk-vk{background-color:#54769a}.ssk-grayscale>.ssk-vk{background-color:#757575}.ssk-vk:hover{background-color:#425d79}.ssk-vk:hover{background-color:#425d79}.ssk-grayscale>.ssk-vk:hover{background-color:#54769a}.ssk-vk.ssk-icon{color:#54769a}.ssk-vk.ssk-icon:hover{color:#425d79}.ssk-linkedin{background-color:#1c87bd}.ssk-grayscale>.ssk-linkedin{background-color:#757575}.ssk-linkedin:hover{background-color:#156791}.ssk-linkedin:hover{background-color:#156791}.ssk-grayscale>.ssk-linkedin:hover{background-color:#1c87bd}.ssk-linkedin.ssk-icon{color:#1c87bd}.ssk-linkedin.ssk-icon:hover{color:#156791}.ssk-whatsapp{background-color:#34AF23}.ssk-grayscale>.ssk-whatsapp{background-color:#757575}.ssk-whatsapp:hover{background-color:#27851a}.ssk-whatsapp:hover{background-color:#27851a}.ssk-grayscale>.ssk-whatsapp:hover{background-color:#34AF23}.ssk-whatsapp.ssk-icon{color:#34AF23}.ssk-whatsapp.ssk-icon:hover{color:#27851a}.ssk-reddit{background-color:#5f99cf}.ssk-grayscale>.ssk-reddit{background-color:#757575}.ssk-reddit:hover{background-color:#3a80c1}.ssk-reddit:hover{background-color:#3a80c1}.ssk-grayscale>.ssk-reddit:hover{background-color:#5f99cf}.ssk-reddit.ssk-icon{color:#5f99cf}.ssk-reddit.ssk-icon:hover{color:#3a80c1}.ssk-reddit2{background-color:#5f99cf}.ssk-grayscale>.ssk-reddit2{background-color:#757575}.ssk-reddit2:hover{background-color:#3a80c1}.ssk-reddit2:hover{background-color:#3a80c1}.ssk-grayscale>.ssk-reddit2:hover{background-color:#5f99cf}.ssk-reddit2.ssk-icon{color:#5f99cf}.ssk-reddit2.ssk-icon:hover{color:#3a80c1}.ssk-turquoise{background-color:#1abc9c}.ssk-turquoise:hover{background-color:#148f77}.ssk-emerald{background-color:#2ecc71}.ssk-emerald:hover{background-color:#25a25a}.ssk-peter-river{background-color:#3498db}.ssk-peter-river:hover{background-color:#217dbb}.ssk-belize-hole{background-color:#2980b9}.ssk-belize-hole:hover{background-color:#20638f}.ssk-amethyst{background-color:#9b59b6}.ssk-amethyst:hover{background-color:#804399}.ssk-wisteria{background-color:#8e44ad}.ssk-wisteria:hover{background-color:#703688}.ssk-wet-asphalt{background-color:#34495e}.ssk-wet-asphalt:hover{background-color:#222f3d}.ssk-midnight-blue{background-color:#2c3e50}.ssk-midnight-blue:hover{background-color:#1a242f}.ssk-green-sea{background-color:#16a085}.ssk-green-sea:hover{background-color:#107360}.ssk-nephritis{background-color:#27ae60}.ssk-nephritis:hover{background-color:#1e8449}.ssk-sunflower{background-color:#f1c40f}.ssk-sunflower:hover{background-color:#c29d0b}.ssk-orange{background-color:#f39c12}.ssk-orange:hover{background-color:#c87f0a}.ssk-carrot{background-color:#e67e22}.ssk-carrot:hover{background-color:#bf6516}.ssk-pumpkin{background-color:#d35400}.ssk-pumpkin:hover{background-color:#a04000}.ssk-alizarin{background-color:#e74c3c}.ssk-alizarin:hover{background-color:#d62c1a}.ssk-pomegranate{background-color:#c0392b}.ssk-pomegranate:hover{background-color:#962d22}.ssk-clouds{background-color:#cfd9db}.ssk-clouds:hover{background-color:#b1c2c6}.ssk-concrete{background-color:#95a5a6}.ssk-concrete:hover{background-color:#798d8f}.ssk-silver{background-color:#bdc3c7}.ssk-silver:hover{background-color:#a1aab0}.ssk-asbestos{background-color:#7f8c8d}.ssk-asbestos:hover{background-color:#667273}.ssk-dark-gray{background-color:#555}.ssk-dark-gray:hover{background-color:#3b3b3b}.ssk-black{background-color:#333}.ssk-black:hover{background-color:#1a1a1a} \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.eot b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.eot new file mode 100644 index 0000000000000000000000000000000000000000..a9d69c604c7f0efee6e6256f76fa9c512dba9b59 GIT binary patch literal 8660 zcmcIpd5m0leShEgd-r|6H}~w!&aqyvy*slrv%c4kk2sFwm>hM;Vb=EAUSjVWdlM2u z+6vMN34v&&Qrc3aHVG0`LZq!qMFT2=R3M>3QHrXDA`pasK(wlaM4__#`MsG?$S@X6>+)stdf zxFKu^=Y=(4MYtl&;ps9;*M(J-A4TmZ`UStRHWBVeuj^=A!wl;}U04uy2=nOwf0+~A z_{MDEw*@BLee~$PC$CpOSH;*Lp|*VN@R6g!F+sueSNVje?%CNp_49{5he2oXeE<2Y zE7u-Ad-lKZjQ;eSmsW0EyLAgQ3H2|bUAuJU$%~(P$1B(jdtMNV+2z%h3(BnrPoV8v zxQ3TeA?*}pjO8?$zI=7_3H2Z8Wjucx&wH{sCde+s~gSe_M@juKQKX zOp+B<(+$(IgCvUmFm*DoAh^HkJpcdwyTZHa9DQ4SNPJfOHhV_;p!6g8Bg$^It-enS zw2Qi-f8DrZ{J?t1`nqjlJ0v_Sv}m1v4n7LhSDSHj&>Zv!i=*Klikl5p!8cN3n!ZCn zxU#U26_yTm9Z6-PNVIbLhd(^MuvjXd7D<*AGC0R;!g2a8eTGX2DQX<$Ghmixqm%S| zqeeTwwL9&7l=N}KQc0SmxDWfibU0GfA$>P4m}U}AP0eiUojmAh2NtXIx+B?UEs3Kf zG)=3y&|hN1PPbGm8?}tyUkR+4srFQ@T5`N?Vt2YMN=l(PMWz*ngv$FxNOsp=~ZDTaOn4iKZQ6ib{4UpPJ5@=*g?2ayVGb-NPq)G*d@L=!;pX3BKqzi z-X4#es>ItmAR@Z)gS#NW>y6@gIIjmO@`dul=aXSV&||oG0M{sQ=NuRf<#>xB{g`Z! zTx2q78Zjm+Ojkva+>8>(^SVHE%Z|-$fB_9+P-bMmg9RbByLfNC={cc4@E^I+$>6#%3Lc>V#{T!B|X#&4aZ8)O^evLrRX@lBwC6kN=z1Y)X1V} z^c|<{u)y`Qgq{z|H27XvEQa4Rol_x5FKUXaDw-(kY`Ni_jg!DXl8GcqI#Y;&?ocri z1u$B|sg-F%j||a@qcEwKIg${tS)jkCTf$ucWUi>~L7N|QKjEBhep)VbTmku=Kab^Z zs|Ia(udRN(l}mlQ^KIMn8dw^~5=C7!$zqhI<(NdxP&Gv6@v>$dp%Wex9@oC@!P?APGn}}fKJ>h(X-Ish9HFfxDQ3i zwGb*8RQ+egg-XZrA84_v-1G0Tn`^-|_9$Eoir%0e;lZG&E2Kk|;QZYp|m#DP$2 zj_td(KiaQ(PMUB!Gg!JFy-MFiDG+*C&u{u%j<_B}O#xd86mHF8BdH%h_!N|kp-cto3bL29!W%sY-_4K zRv`WlC{k5R)^aSJHt-#H1c4%;{Ve5VdQ+b<)d1`LQ3ARxaKcvEgt(l%!+s9*(AmMT0}0BlPOiE+ znXz$N zWyC~DG$ac+iPaTRfjQGHY*G>vtL%5?3z#0K%XcA5B?c2FYKh{&HbDdkVxu!xvLnsn zhK?zcq+(7HegR{UQ!O!d$wXhik}7&;khCEw`R1`A_ar5Fywmh8`W8ITjxZ1oK{6Jh z)?4PKpQ{qL`5|}(t%v%nfB`T?9xTpM1B^?PJ=B8()yQ=R-D3J3_SSCs=GV*J2gFWi zH0*Z5N*Ha-96s9Fh{6ipZM7`;n=R|&{Ned5JDg=CSk8-;ZnyGcBB6VyO948bSXw%P zf%mm6s|B_^)tH}eOea~EOk?ZV`w`(TdWk-cFmDM~@hbKXT~8y(5Cn(+b1MOr&TYb$ zML;E2?kLS&7sxpJLgR9r;G*1VD`^#7`Z>h3M{RCe(5K(S3{VA}ca-}_Z8EmUhsCMt zwz5Z_uIh54=$a4uw|0-(Iw#D+T(CtcWTHm5OKNmmr6sY%ra*`0hXC=oI_S^%S;5-|=pfQv zPh_DS%e3k-(Q~)Kr%ywl*l`CpnoCZF5(-2Qpfye@?Bv;}KN>Rn(k+_Hm zXo+5?FC*%C2Yg0AEay5dE)2N1dUCZMEWUxQxkyaZnd^KG%-ne#lQahaZbbN(L+!+P zVcuNAUPlYwN}rY1@ABPZeQw$1r64QKEuV7=X>+y^nU<#7I#AUh#jxDicU0A8nN|&B z)3%*7s}({xRI;L}8T3Qu-mz`LRdWq5$ly6@+Bg05u65=w&($(NM#)~DD-=Tm&W;;+ z28b(L0YTRc(>4`VCRtQ;-3hvZuWO2ALU~Q_O%`oSS2fjyzQVDC?!gkcPMF(M6EUPf zuRz6ggixulP1q|ufLQRig!c=7EW8M+#t}^GU$ynT>Ub~I>$g3ZQ0LJ-3ZGPlPNOHTA58!U3A?4{_!zY{`_5tuKRvjAZbmgUmk zufdtjyTPoEhG-w51+#NI3n1Xo40aA^x2YXtODCdUL3bQ8 z?eVdC@xYPv3tSr?RrIlyKfnBX8K8LHdHZE97VpblNAfg^>Ug4-;r|=gg-4qYDzR>mq<$DjAI{2hiORLw!BXNC;D}Q(NXvQ>)T`TP%cm+S?b^3DK*SJxc0A<= zt{d$CV5DhLqf~6@vb?;%5QJGF@Qc1@%YG)eg2+&0aCB+=0o6)kRcEy4%$biuRYk<| zEqWRH+7^b;PACr70B9D!ZGjtywOoVH%w2Id(J{``QJlu~vYoW2onqFGGiPpQTfNo` z>s8$;P5DzL-;T{Nitf>134Gh9IPTL6ov9@Q35z?9A6=fEfwCB(g$T7c)vQ$L_9#p} zN0n%{R<#)8AwAC~3TME(Pk?hR#Pts%;R%cmp|;S|vBs;jqUMcMhx$`q#LTf zEsjO9%{W9nYCCc)t zFX>@c=nwo{co{j@a;oPP=bWMAc8M%Gs~ABPn9|@-%h%KgF2UM4ae~C0?ZWS6)#*mJ zRMO8-wrg)@*W>s*pBNk~gpKLQcR@;nZrcX8Ks0>G2>h7A8z6!>IY0zZ!vM5sNVPOx zk43f$_uPIAPO;^yu$&p&_EO-Kc(NfaB$?$QGL~rH^7f$Fm_6cahYlz8sh`d4kY^8R zx~|*I5P$bjAFeSo90vAkasUrIcf`3XEz+Jm?Acn1hbE9|o=5u%VmuR;vJE~w!hN|A zLYZ4PB?pw;2jK}Sr8gFJkc?X_7*Z8M$?G-@oXV})pffgMBkpiaanf>6uST$NIRNJY z-*^sg^u8oX3{F18_vu`O@g)C8(bMz{0UaI2(PEvKyLk=8$RK@b$_sA(H1O*Y_v+)) z-VzVw#Lc{iSH!T#83GEBTEQ^VhZCP!2kn)R9@h&PR@H8a#dCXoEGWr31AGzZKFdV6Rj#lc3Lvl~ay)`v= z)E3pTC#Ld@5X5Fkb$ z(W#9)NoRFrY7m~2q%};{HhIjUK#DAegqjj2NEIQ3aa_d9sjXd1AQ# z;rBK-?%Ka_G_7rX^gVEIU1&bjb;Pp3WF!n!Ns)ltc3D@$BF~c`e6m3!2^l02Zfwl; zwkRy)%zuabG2yK6Md4qBA7UcBb!m+OZvixDcXm+@+M@+1T#|C%HAnIVWWp#K}^R(5JLkMl60XLqZhWAF7ODv!)*#;DY$V96UPo~DKg&%=h1j0=}>+X z9*+$XFe8T(49&j_*hap;El8sCh%PlnG!QhyHD;>ru>g#drkdr9c+|+%l!vqcmZ|O2 z%^WUx{QPkw=L|!KX;OSR!ZIxfHl?lO&H7;HQVI6S@V%5|=!33oJ8YQ+OGye^VCptf zCI*r3B5&ZhQ6T$B!|va~LtrODhz^JGQBBuGT=4fKqzaXrKQ?3rg+PLk+4P`W8d^%J zGTk1QTv2h%2>YAgZ>tC9Vi}3z8j~;(M!|;S{u_3w=_ERa$S@%z7*$aWEgqyJP=;nB z;!Qmq6Al$FCbAhUjWmFX@W=;cH1!Dc%gFb#>Dqj#g~|3p-PTRlE4Tr6#|qLkq94(4 z5KXDJ4M#U}ZP9fj(GVTG%1Y2x6ycLy6cM4RiYX!sO{6JTC0&KRl0pCC(JXEGNHCaw zE6o%u0u`hZ$@M^s9QlO8qcJHiiV8GbLi}}rUZXDvU1a2r2&aIO<4CMCf-Qk1$)7q9 zCCE1yQd|jl(K#K8*uHohOFL>Ymrq-kRo9#`Q)eXGqzJ&MPb%+yx z%Uwru{g=Pz9{1{D%-rOf$6InZ$wxQVH;-;yzqDHK?U=9cuK&-Cp{m!L!*_lGy?>2! z{V(t4?_a%sV{K!-zOVyX&0k|$E^lvq=#Ao}gtvs?BX?GK4p9bNs02$!2H_n6+2p|9 zc)~Zxr+`9=D5iu`?c&P$)pHvgkE)yRT-)4Sz3yJx*tm3Mb?(}g$8OART)7~xUR_zc zqF-BEN8{>^O=a`3tLLs<*RHIsKe~EhZC$yvwt4xnbK>KV>TByaHdiiPU%9HRTwQtB z#=3mt(I>C1s!wh_w)xn(Rr&F?tE(H*>baFC)pM(tSJuz3su!-WojZ4BRb5%XaD8L# zg7(hKE1Ne~u3b~EuU@#YwrNjTGk!APw6pP%32&&OfOv3ljg^BxGx!w*9NK#0oYU&7 P`~K`}eAw3ee}4aO0;u9b literal 0 HcmV?d00001 diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.svg b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.svg new file mode 100644 index 0000000000..a6ec16e060 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.svg @@ -0,0 +1,33 @@ + + + +Generated by Fontastic.me + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.ttf b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.10/dist/fonts/social-share-kit.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a6f445873827f27ff9cc76152883c00a20adef7c GIT binary patch literal 8456 zcmcIqdyHIHeLm-&`+mRgojcE+*?H`)cfC8aGqZlL9Y5k2$1!=-A&$-3UfYY;yT;yx zgfwjhX@!J9ZKP7#QlvHs5>!H@tx81$DuPrXp+XTwRYMU7!apEdRYIar+5OI)*~CIf zh)Uh@oqO&%=bp#!@%_Hv852qfvB>WbMjkkN^r4eCE1#_pQu`5VOUDi$IZBQZ8P8wA zbM4fFJG-ZTe)hA3&@*^`h-Oslz*nL;`vi}-n+heapfdA zqT~H_-v9c_Q#Z&JT1Wd5o@*N`*H=rQy0C|k@++wO>5a`>TmSvHe^nr)`ZsvC2;Up7 z@DrbZ;=Hr>C&Um?LCDwt^8@X>?*hr|)zJ+tcqgx!8}-LGAL;HtF|WyJl^A(7?@05y z<#9JE5c>N>A}W0gy^OkJ4s_faTs|)VyA9_IKTEl|L-q!$ZygM^xMK&;d$ZP z>^bp+;*X>c%e$49@;=p9FKfE?HGN(GfqB;anq^`&6nbvb4f=EFk+J z4))NfQCDPqLOG(7_h|=L78cUN(!q``DohY4T{->3AD&)VEM}(#Dv2`HxyGyHIQ=gD zG`A2cD^Zw_fKeLtcHHX@>#h9OYPa^$xQ832ijz3OebDPBgQ2Vp=y#)nVZ_12#ME^6 zL*W3rwP_N*NPmrYQnMZiKPw8J42zh8sAc7g&~KX=+1M6s;0u zjw3QfGPKMo8)oy_b}P~iSycl~Q6#2GCX*FG(N$6E%$)Q*HwX<&(+th`(~9kse9TCx zD^6FdrBW-V$B#Gh?{QHTWI>V?K~))}5>-Tj3KEl4)w1iJs~UnNGF7o{ss>(S`)L@I z9Luvz$Fx27rPzrIN#yxzARDSFtCA+_f+P!yY1oc4JK1DRhPOFx;KiP8sj46dsjpCx z%D9A5dAd`rY0~k@`vT<%x9GMPNOz~_t&}}ohFezZ+ zrmSK2qF~CVATmkNP$LO~-m~qJ&3wmAWBQ_BqW$j$Sr&ZHuulaLy`aj9BCCR=vE{mb zK8k(sNGecK)R;^e{_1GwNMw#C=B9Ci314*HWT`f^bWZnfXp4W)o<}_ z?x)yii|>}(9Ctu|=g%X%+pa-d-fO!bZ{=3sYJb~u-8!bmwgf>F3~Dl(B&CQ7s;;QA zT&x$1h9QY*b#AuRN>i2UIu(o)jP-`g4;?&USUcxWtG24hvSB#vs3e3Rn7cMN4s4`Yqjos+wps$dM;$9 z=YURmRHDzrf9r$58Fo@eXjJuzaO}IRb-|W)@#MoTaFUXmF0!Z z_bi>hwsGX09nFxn_=pXoR&C33s(-Ryb?qePa%PBhUHTgRCQ3f(Vm`0oaXaFE3^xUA z#cB)13nR=Pb&QW?!r;@4LR=7|p z)04Mfr^Pd|W!u&ceA%zR@ZpN*g^ucc^exvPwx%4asH!B^YFz(KGLLn=MmF(~+cihk z#rAmK;Q&j5$~h3V>Pj1{g(YkQ5_b+P_DwX}NdaXEgjnT{lYeovJ3zyPgBCZA5h!81 zNlagxnmMG1%rSgla}`aN6Cj6eI7VS_!K8_+T1Fzvn&N7{V;c->Hg!!^MIHVwalF8v zBBLb1)os~C{1650(9Bf1(w+a!`7UHZj_uwZagW+pGN~v_x@P)eQZJOMIr=GzYRE#h zRH&zZU}%OUi&P6mN@dAX6=~!^{2NfDD5j+5Sf;t6C<@W;-N*LxN%(BJFM)N^JM?Mt zcaUYQ*mUe9FfHsh8o5z}i(%v;kcLvnXVeh_3W4@BG#ArdeMV9PtoMd7*iv{)NvWQEmJv(xXOBO1R!+c#&>}B21)M0^o~3y7-Gy3 z1;E`lc#H-T8%GcvL`cto>F5#=B1IuKOI~}vfZ?&bd=-*d zWC&q`8p}3f6HI`@Y&7PGR;Zdh&@ovQ6^to>7cd4pRbxXF4fN$RDS~VGaSN7`FCH^; zCMkmPPSS7DZ-IHXNuL~oWh}z2x5G;>cO@S41Lz7~5BFC915k?8U!0+JC@zWj&@Kp6 zJ@*}Si|FsNw{=RlzgFrzDzw|fL8l#*gK%@|@X_{W7?kM)X43@UY?_zn56`FR;WVYh zv|lcFI^~yR5#8Gz>Z9X{rKJ;i@!_UvHldbh>htsU$v92pNh}>}KSJ)Ouh5T?S+azv zcpYnpuO}gF2!_MId6a-l=P_YBBA}8xcbMeV1vZYp@VFc&xGA?=a#BH;UJfy>VT*?r z^yzgm0$c(69p?O~MfDxgVPT>&U2>_bDVh|^n(9IR&E3P6#>~vp8Oz)l5@(w3+5u%# zM!W%oYIUY2cg$r)O;^=PeRz0zzhY~8c_LOAQ&k_V2WBmE!xqGV2`ar;RKk18O_9YG z^)+~Y01%HV{oa(97Tjq-2c??h3M`N!iLSa#aGhyzig{qKtEo&(El08ysjRewN#K(^ z3G-BBm@J@5bVNR(7?y3GRSC#|mguYWOUQcO3C;+J>!uTVwxU=pRVzVcSeBin)j|M5CCRFi!apR=jx7^Z&Cy*y1#?u@Z+gl7 z8_Zjtt)^atlC?Zr$O0W?$MIbq!j(*)!q;@eGGs-fk|1lE?RR`nQ)SVB^BT~bBv_`V zsEPr91+jzgArd%tkjGO4IV7RqfQxBJp%OAp_L4`D3;s5FKlxMgGNc-X2(A4AWWvL0 zx7q7A5aIU-xXF!rA3-jU_J~cRpsVoqelFQzzX1t0>iZ~?7#@&$Jce0vp$}MpkvnBK zK^OiR3wngWe7al(NP{pfxAtBYWHRrDusR%|eTWu}&f_eAfI~CX*{8b=MV1v~CChIA zsPbr~{MJGNYM=#ym7I4AqU)H2f@Qm+u#!UdMwl9z$Q9{cKXR_>t53HLq z)vn$!Rl_UpN+j3a|5@90rA%}MJuH-C!*Pswf!~lw&~R^ve_uGzbS#s~GBquy@t%ge z{ovN=%*~T0!>O!zBJ374+cuIee^-k?=y}>w)GN$m?9ggxSG4CBQfj z43a2`;cVplZGB(A18;xF`G+2C+p_4`o_+lts?3nP7j)06m1WRu>!pc_lADOEY5}i?=Sd4TJXKhb1lhBrKTV1vILDT z?Kq&AainOB?m2VjBXCs#xqOqp3V&^p0lX8A!#x0=#c$i-#$he@AT)C-&c;5*bvlfa zh`wsYtw}peTTyDyPEFUU-Jn*{?BawsQS_|H2*U6|6_LQRJQ_tk`civhNymZ3eaDY3 z&rHEt^uR=hnoTsyWqNNIB(AN9bf#J{8RIEEKTRZOpu3Mlb4}#+kCAnb(E;2Reme4a zWrliumE5hBcC?MfJE_v;aIq7>(j3EpLmSveFTuXRvC!Y4W4zcWj1ePgFY>qehXaj6 zIXv{fTDD!?a6HS=^_O01X9d%+p8pLC3AYTs+d?qZ&eCI(fCvqAioR$gVNWfK(qS0bUU^j#-4oddlCBMAgqKDXLOXFNaC4-XG@RW2Si88B+!4E ziFA|FGk@>6p;w5I!`lwkbVZwvB7s^)6d)h9Y$;0|*S0V6&<0v1%d%zK=8K&UWT--V z%{;Ggq47EBd`OOx4e}o7zSYi|K`u;wkb|wuqs%L31YA_zVP1_&d_w%-qfl^(RV)HKUN6plcDE8lsdg<8ni&rJyG|) zh=C1I3Uji72#|&jXi;(0Qhy^C*)BYI?=g^K(^C*RQ#SpIZx{JtLsE!S(?w=1(tXQ2 z{6>A|h^HPp9M>j(HZ>>B98xt+vzRXY-k~0-G1F}Z^{SE&hMf~}PNfC9Cr^8}r{bvz zY?_~=eHl5Pfk@ec9?o$t7r-d<=qBfYl5-G#KqYrarVf$uh=o9^ASrnxhCx$#H0!rV zA#BJA#{?HGXL?nN2$utJp74#v;6d+;qR2qITV3=+@L3^|*ElO!Z-oHWxP zJa=xX|7@rB+$+vUHz(8k7KW!b-$FH3!$}R&b1JHJL$M5=bI7nFli@&34q_Y?A%(FW z=|<@%0I=Pfp$oFIkYhdU45!3=j=Tzj zUH~NS<3~w6JnRv=$wCa%;t6X$Z8E;0cKjC1bo2^xXrMxzEOaCE!V;4Oo`JV{OhGOM z8n-Yec9=_+_%gVTMhi&>(p`8w3Piw+98U0R{#n2>^7U;)61|A*Qk4ZANi(Q1Q#6

zL6fHsn?}Kux0>MNL7xk|6)=Xqq%V955JOGf8DLgcQUgm1@2k+R_P`XJcZN2{JrfME-SvzD_?+ zIyjL#LQVlCN10fAh**M1l0UU!O0aKkq_|>E(b@wf+fWvbsu38QDu-6belJ2&HEW{8e(gMy&C4^~R;sATv z4#F%5IF5mIk;lPlUI6|hHd7=zJQeDJfHtF^4N95sB>^t+ee#{}XKnhWsolG$mTtdr z#^^LV!(pdhW=Xhn|2=Pi`#r6F^#q7fURvtx-rZr#6SZ9r>`GY{OrL+>`D|)&G3E0T z;O2+G==mSTFKzX4SwPNqY+PpG$A394i|F&Saake;ZH&t@ap`HGF<1s_Y8Y))7QnB2 z<1!;>$aWtQeg1V^FOirU(ht0-SX?G_=oHZQKN ztk2%Mx^i=M_Szb+`6Zp+Y(0trH}E3A-y~NsR1M}dN9J+gjq6uUIO^5KJG0|!o-A;Z zd~|bT>*(gqE338c+~ZPntlH?JvM?^@g1TD|F9+1$LczB+qj{fS$%o9maP)$1#3>)MUA4K%La z+LE`PxPD>%rn&r^}@>2%7xXdD;pPAl}k6*E?ih&RaQ1G-P~Neq`vFw%GRxw z8#m;etCudVZCPX0jGm0URyNu)#V^!wKs?yEM$W;X8F&Q+4sHM9oXhGf`~Kpq{I$FP HAHe?t$5_e; literal 0 HcmV?d00001 diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/css/social-share-kit.css b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/css/social-share-kit.css deleted file mode 100644 index dfa18d9b8e..0000000000 --- a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/css/social-share-kit.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Social Share Kit v1.0.3 (http://socialsharekit.com) - * Copyright 2015 Social Share Kit / Kaspars Sprogis. - * Licensed under Creative Commons Attribution-NonCommercial 3.0 license: - * https://github.com/darklow/social-share-kit/blob/master/LICENSE - * --- - */@font-face{font-family:'social-share-kit';src:url('../fonts/social-share-kit.eot');src:url('../fonts/social-share-kit.eot?#iefix') format('embedded-opentype'),url('../fonts/social-share-kit.woff') format('woff'),url('../fonts/social-share-kit.ttf') format('truetype'),url('../fonts/social-share-kit.svg#social-share-kit') format('svg');font-weight:normal;font-style:normal}.ssk:before{display:inline-block;font-family:"social-share-kit" !important;font-style:normal !important;font-weight:normal !important;font-variant:normal !important;text-transform:none !important;speak:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ssk-facebook:before{content:"a";text-indent:4px;margin-right:-4px}.ssk-twitter:before{content:"b"}.ssk-google-plus:before{content:"c"}.ssk-email:before{content:"d";top:-1px;position:relative}.ssk-pinterest:before{content:"e"}.ssk-tumblr:before{content:"f"}.ssk-linkedin:before{content:"g"}.ssk-github:before{content:"h"}.ssk-vk:before{content:"i"}.ssk-instagram:before{content:"j"}.ssk-amazon:before{content:"k"}.ssk-skype:before{content:"s"}.ssk-youtube:before{content:"x"}.ssk-vimeo:before{content:"u"}.ssk-ebay:before{content:"p"}.ssk-apple:before{content:"l"}.ssk-behance:before{content:"q"}.ssk-dribble:before{content:"n"}.ssk-android:before{content:"o"}.ssk-whatsapp:before{content:"m"}.ssk-reddit:before{content:"r"}.ssk-reddit2:before{content:"t"}.ssk{background-color:#757575;color:white;display:inline-block;font-size:22px;line-height:1px;margin-right:2px;margin-bottom:2px;padding:7px;text-align:center;text-decoration:none;transition:background-color .1s;-webkit-transition:background-color .1s;-moz-transition:background-color .1s;-ms-transition:background-color .1s;-o-transition:background-color .1s}.ssk:before,.ssk .glyphicon,.ssk .fa{position:relative;font-size:22px;top:0;vertical-align:middle}.ssk.ssk-xs,.ssk-xs>.ssk{padding:4px}.ssk.ssk-xs:before,.ssk-xs>.ssk:before,.ssk.ssk-xs .glyphicon,.ssk-xs>.ssk .glyphicon,.ssk.ssk-xs .fa,.ssk-xs>.ssk .fa{font-size:15px}.ssk.ssk-sm,.ssk-sm>.ssk{padding:5px}.ssk.ssk-sm:before,.ssk-sm>.ssk:before,.ssk.ssk-sm .glyphicon,.ssk-sm>.ssk .glyphicon,.ssk.ssk-sm .fa,.ssk-sm>.ssk .fa{font-size:20px}.ssk.ssk-lg,.ssk-lg>.ssk{padding:9px}.ssk.ssk-lg:before,.ssk-lg>.ssk:before,.ssk.ssk-lg .glyphicon,.ssk-lg>.ssk .glyphicon,.ssk.ssk-lg .fa,.ssk-lg>.ssk .fa{font-size:28px}.ssk:last-child{margin-right:0}.ssk:hover{background-color:#424242}.ssk:hover,.ssk:focus{color:#fff;text-decoration:none}.ssk.ssk-round,.ssk-round .ssk{border-radius:50%}.ssk.ssk-round:before,.ssk-round .ssk:before{text-indent:0;margin-right:0}.ssk.ssk-rounded,.ssk-rounded .ssk{border-radius:15%}.ssk.ssk-icon{color:#757575;padding:2px;font-size:24px}.ssk.ssk-icon,.ssk.ssk-icon:hover{background-color:transparent}.ssk.ssk-icon:hover{color:#424242}.ssk.ssk-icon.ssk-xs,.ssk-xs>.ssk.ssk-icon{font-size:16px}.ssk.ssk-icon.ssk-sm,.ssk-sm>.ssk.ssk-icon{font-size:20px}.ssk.ssk-icon.ssk-lg,.ssk-lg>.ssk.ssk-icon{font-size:28px}.ssk.ssk-text{overflow:hidden;font-size:17px;line-height:normal;padding-right:10px}.ssk.ssk-text:before,.ssk.ssk-text .glyphicon,.ssk.ssk-text .fa{margin:-7px 10px -7px -7px;padding:7px;background-color:rgba(0,0,0,0.15);vertical-align:bottom;text-indent:0}.ssk-block .ssk.ssk-text{display:block;margin-right:0;text-align:left}.ssk.ssk-text.ssk-xs,.ssk-xs>.ssk.ssk-text{font-size:12px;padding-right:6px}.ssk.ssk-text.ssk-xs:before,.ssk-xs>.ssk.ssk-text:before,.ssk.ssk-text.ssk-xs .glyphicon,.ssk-xs>.ssk.ssk-text .glyphicon,.ssk.ssk-text.ssk-xs .fa,.ssk-xs>.ssk.ssk-text .fa{margin:-4px 6px -4px -4px;padding:4px}.ssk.ssk-text.ssk-sm,.ssk-sm>.ssk.ssk-text{font-size:16px;padding-right:7px}.ssk.ssk-text.ssk-sm:before,.ssk-sm>.ssk.ssk-text:before,.ssk.ssk-text.ssk-sm .glyphicon,.ssk-sm>.ssk.ssk-text .glyphicon,.ssk.ssk-text.ssk-sm .fa,.ssk-sm>.ssk.ssk-text .fa{margin:-5px 7px -5px -5px;padding:5px}.ssk.ssk-text.ssk-lg,.ssk-lg>.ssk.ssk-text{font-size:22px;padding-right:13px}.ssk.ssk-text.ssk-lg:before,.ssk-lg>.ssk.ssk-text:before,.ssk.ssk-text.ssk-lg .glyphicon,.ssk-lg>.ssk.ssk-text .glyphicon,.ssk.ssk-text.ssk-lg .fa,.ssk-lg>.ssk.ssk-text .fa{margin:-9px 13px -9px -9px;padding:9px}.ssk-group,.ssk-sticky{font-size:0}.ssk-sticky{top:0;position:fixed;z-index:2000}.ssk-sticky .ssk{transition:padding .1s ease-out;-webkit-transition:padding .1s ease-out;-moz-transition:padding .1s ease-out;-ms-transition:padding .1s ease-out;-o-transition:padding .1s ease-out;margin:0}.ssk-sticky.ssk-left .ssk,.ssk-sticky.ssk-right .ssk{display:block;clear:both}.ssk-sticky.ssk-left.ssk-center,.ssk-sticky.ssk-right.ssk-center{top:50%;transform:translateY(-50%);-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%)}.ssk-sticky.ssk-left{left:0}.ssk-sticky.ssk-left .ssk{float:left}.ssk-sticky.ssk-left .ssk:hover{padding-left:15px}.ssk-sticky.ssk-right{right:0}.ssk-sticky.ssk-right .ssk{float:right}.ssk-sticky.ssk-right .ssk:hover{padding-right:15px}.ssk-sticky.ssk-bottom{font-size:0;top:auto;bottom:0}.ssk-sticky.ssk-bottom.ssk-center{left:50%;right:auto;transform:translateX(-50%);-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%)}.ssk-sticky.ssk-bottom .ssk{vertical-align:bottom}.ssk-sticky.ssk-bottom .ssk:hover{padding-bottom:15px}.ssk-sticky.ssk-round.ssk-xs .ssk:hover{padding:8px}.ssk-sticky.ssk-round.ssk-sm .ssk:hover{padding:9px}.ssk-sticky.ssk-round .ssk:hover{padding:11px}.ssk-sticky.ssk-round.ssk-lg .ssk:hover{padding:13px}@media (max-width:767px){.ssk-sticky{display:none}}.ssk-count{padding-top:20px}.ssk-count .ssk{position:relative}.ssk-count .ssk-num{border-radius:4px;color:#8f8f8f;background-color:rgba(50,50,50,0.03);display:block;font-size:12px;left:0;line-height:20px;position:absolute;right:0;text-align:center;top:-20px}.ssk-count.ssk-sticky{padding-top:0}.ssk-count.ssk-sticky.ssk-left .ssk-num,.ssk-count.ssk-sticky.ssk-right .ssk-num{top:20%;background-color:transparent}.ssk-count.ssk-sticky.ssk-left .ssk-num{left:100%;margin-left:5px}.ssk-count.ssk-sticky.ssk-right .ssk-num{right:115%;margin-left:-100%;text-align:right}.ssk-facebook{background-color:#255c95}.ssk-grayscale>.ssk-facebook{background-color:#757575}.ssk-facebook:hover{background-color:#1b436c}.ssk-facebook:hover{background-color:#1b436c}.ssk-grayscale>.ssk-facebook:hover{background-color:#255c95}.ssk-facebook.ssk-icon{color:#255c95}.ssk-facebook.ssk-icon:hover{color:#1b436c}.ssk-facebook.ssk-icon:before{text-indent:0;margin-right:0}.ssk-twitter{background-color:#00b4e0}.ssk-grayscale>.ssk-twitter{background-color:#757575}.ssk-twitter:hover{background-color:#008bad}.ssk-twitter:hover{background-color:#008bad}.ssk-grayscale>.ssk-twitter:hover{background-color:#00b4e0}.ssk-twitter.ssk-icon{color:#00b4e0}.ssk-twitter.ssk-icon:hover{color:#008bad}.ssk-google-plus{background-color:#f1403a}.ssk-grayscale>.ssk-google-plus{background-color:#757575}.ssk-google-plus:hover{background-color:#e81810}.ssk-google-plus:hover{background-color:#e81810}.ssk-grayscale>.ssk-google-plus:hover{background-color:#f1403a}.ssk-google-plus.ssk-icon{color:#f1403a}.ssk-google-plus.ssk-icon:hover{color:#e81810}.ssk-pinterest{background-color:#cb2027}.ssk-grayscale>.ssk-pinterest{background-color:#757575}.ssk-pinterest:hover{background-color:#9f191f}.ssk-pinterest:hover{background-color:#9f191f}.ssk-grayscale>.ssk-pinterest:hover{background-color:#cb2027}.ssk-pinterest.ssk-icon{color:#cb2027}.ssk-pinterest.ssk-icon:hover{color:#9f191f}.ssk-tumblr{background-color:#395773}.ssk-grayscale>.ssk-tumblr{background-color:#757575}.ssk-tumblr:hover{background-color:#283d51}.ssk-tumblr:hover{background-color:#283d51}.ssk-grayscale>.ssk-tumblr:hover{background-color:#395773}.ssk-tumblr.ssk-icon{color:#395773}.ssk-tumblr.ssk-icon:hover{color:#283d51}.ssk-email{background-color:#757575}.ssk-grayscale>.ssk-email{background-color:#757575}.ssk-email:hover{background-color:#5b5b5b}.ssk-email:hover{background-color:#5b5b5b}.ssk-grayscale>.ssk-email:hover{background-color:#757575}.ssk-grayscale>.ssk-email:hover{background-color:#5b5b5b}.ssk-email.ssk-icon{color:#757575}.ssk-email.ssk-icon:hover{color:#5b5b5b}.ssk-vk{background-color:#54769a}.ssk-grayscale>.ssk-vk{background-color:#757575}.ssk-vk:hover{background-color:#425d79}.ssk-vk:hover{background-color:#425d79}.ssk-grayscale>.ssk-vk:hover{background-color:#54769a}.ssk-vk.ssk-icon{color:#54769a}.ssk-vk.ssk-icon:hover{color:#425d79}.ssk-linkedin{background-color:#1c87bd}.ssk-grayscale>.ssk-linkedin{background-color:#757575}.ssk-linkedin:hover{background-color:#156791}.ssk-linkedin:hover{background-color:#156791}.ssk-grayscale>.ssk-linkedin:hover{background-color:#1c87bd}.ssk-linkedin.ssk-icon{color:#1c87bd}.ssk-linkedin.ssk-icon:hover{color:#156791}.ssk-whatsapp{background-color:#34af23}.ssk-grayscale>.ssk-whatsapp{background-color:#757575}.ssk-whatsapp:hover{background-color:#27851a}.ssk-whatsapp:hover{background-color:#27851a}.ssk-grayscale>.ssk-whatsapp:hover{background-color:#34af23}.ssk-whatsapp.ssk-icon{color:#34af23}.ssk-whatsapp.ssk-icon:hover{color:#27851a}.ssk-reddit{background-color:#5f99cf}.ssk-grayscale>.ssk-reddit{background-color:#757575}.ssk-reddit:hover{background-color:#3a80c1}.ssk-reddit:hover{background-color:#3a80c1}.ssk-grayscale>.ssk-reddit:hover{background-color:#5f99cf}.ssk-reddit.ssk-icon{color:#5f99cf}.ssk-reddit.ssk-icon:hover{color:#3a80c1}.ssk-reddit2{background-color:#5f99cf}.ssk-grayscale>.ssk-reddit2{background-color:#757575}.ssk-reddit2:hover{background-color:#3a80c1}.ssk-reddit2:hover{background-color:#3a80c1}.ssk-grayscale>.ssk-reddit2:hover{background-color:#5f99cf}.ssk-reddit2.ssk-icon{color:#5f99cf}.ssk-reddit2.ssk-icon:hover{color:#3a80c1}.ssk-turquoise{background-color:#1abc9c}.ssk-turquoise:hover{background-color:#148f77}.ssk-emerald{background-color:#2ecc71}.ssk-emerald:hover{background-color:#25a25a}.ssk-peter-river{background-color:#3498db}.ssk-peter-river:hover{background-color:#217dbb}.ssk-belize-hole{background-color:#2980b9}.ssk-belize-hole:hover{background-color:#20638f}.ssk-amethyst{background-color:#9b59b6}.ssk-amethyst:hover{background-color:#804399}.ssk-wisteria{background-color:#8e44ad}.ssk-wisteria:hover{background-color:#703688}.ssk-wet-asphalt{background-color:#34495e}.ssk-wet-asphalt:hover{background-color:#222f3d}.ssk-midnight-blue{background-color:#2c3e50}.ssk-midnight-blue:hover{background-color:#1a242f}.ssk-green-sea{background-color:#16a085}.ssk-green-sea:hover{background-color:#107360}.ssk-nephritis{background-color:#27ae60}.ssk-nephritis:hover{background-color:#1e8449}.ssk-sunflower{background-color:#f1c40f}.ssk-sunflower:hover{background-color:#c29d0b}.ssk-orange{background-color:#f39c12}.ssk-orange:hover{background-color:#c87f0a}.ssk-carrot{background-color:#e67e22}.ssk-carrot:hover{background-color:#bf6516}.ssk-pumpkin{background-color:#d35400}.ssk-pumpkin:hover{background-color:#a04000}.ssk-alizarin{background-color:#e74c3c}.ssk-alizarin:hover{background-color:#d62c1a}.ssk-pomegranate{background-color:#c0392b}.ssk-pomegranate:hover{background-color:#962d22}.ssk-clouds{background-color:#cfd9db}.ssk-clouds:hover{background-color:#b1c2c6}.ssk-concrete{background-color:#95a5a6}.ssk-concrete:hover{background-color:#798d8f}.ssk-silver{background-color:#bdc3c7}.ssk-silver:hover{background-color:#a1aab0}.ssk-asbestos{background-color:#7f8c8d}.ssk-asbestos:hover{background-color:#667273}.ssk-dark-gray{background-color:#555}.ssk-dark-gray:hover{background-color:#3b3b3b}.ssk-black{background-color:#333}.ssk-black:hover{background-color:#1a1a1a} \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.eot b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.eot deleted file mode 100644 index 0adc052065473f2e613856c7a7e46c76a3d83b8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8348 zcmcIqd5m3GeLlw?KqCJ;gH~Ti0#-R_5{a8NkgOx z0;*byXhi9v6saOXqLon7MUmLr3WCZ%Wf4V)&?*RmkU&)ZBNBqj?sx8clUfxO1*!MW zefQjR&OOU-`F_it=j()gwMGafjEI8~SkqjH-yr6MUtfFwf7a1X zcJFM$M{UYZ3?+DqV{w_mJ|M0<94NHoK2~kbR54SNdJ)hw?|1k=j;2pn2MPUDLmA zTs3}ZowL3UqCH1C^eX*1_($kKZN;r&Yd9FLj7JA(+-j-{&Pa)A`-FaIdwDr4tR9+i zB$YEp>Gqi){pif{N~w5;QCU)`Avj$l$LV+J%R(}!qQ+4^0!C>yd&!_bZg%rqx7S^x z$pAM@m840E`)JTlM`J}D(eK6u(@erfV|K28>X4&ttW=kDN3zXY5=TjBnpSIhu*yfh znNqE6)H3>emB5;9bQ`s5$?@jcOuNh^rBG~8(~81EF`h3Jxn*=m6~$`=LP8}W)AT3w zRnjLX$RCnFhZwK)R}Xpzs9?>-+2!+{{9l?`0uyj`$hJd)#GjtpXIgXWCORHK|z zTukA*%0PBAN;KcJRn0KH(2e}iwq0A-T9T^j)v)Ng5?5tYFS-@e>O9ly#)heATBxh4 z%yrocR6~>GnfX(`?}d?R>$<52K~{C#a)22r^`yC4tz7OV^!V`({@yNWOkuLDGL3O2 zRwGkYVwA~T)->B``krPoS>l@NI8+P$)CsaEEW5UETdw8!-iwJF7t+`dv`{fMOVMOq zGF;U%9oJoGcQ{v|Xs#FfiSO8&#u&>2l}c2>#mbernOa?!kGGGDKcP-S=R3f|mmz<5 zfU|L=v>HtzV_;a739bpItusN?aW0fDby&`zW^a)TMlvv-;wE?_q_NRY7%4_K9*l}c zc)ciDDtE0oi7l6_mh@mhG#o2^N1HKOu@v326pKk*W;&i^#*BgElpP+pUY5`of-)U` zFDw?r@0rf&5JYF1qN<9j!E{Sv)NP62?0f_8^pv9)!Iy>-P7#eRk2i8~%A(zaWHro7W`H_<92z1#aY+w+>3 z7kp$)XC}2cP1ABrnP#Y(qLi8=)0CyGwz$ykW|>9}gEI3Z=Y#R)J%=_-d+*X2&Cygv zksS7^jfL4lH%(ev>M2@BS&&POMx0n$5>_i|If!I+Wwx_-HfwMmg|jnz^}y4#VsL(| z-&gf+_r%+d-v)MLEfO~bep6wA=yTB7CL!S<9zZv8wS&&Z*z8oP)@W-em^}K|jZ2p# zZrM?@UdsH6CryMraagrJeU*L_ zr2rT~Lciq;xe=-h%>+~>(9Izbpw-0O71|oD(cU1=XP&hG&bjlBmu8NG-^6q1sdJ{4 z`9+1Fqx76XWy^5vXt`RUr*6DXOJ@_?aqK<#abExUA6I=pa#inRw_mx}o^`3JX|hzW z3mSCD64v!995VPcf~5jUS9;TV$0IBW{1$@UZK?vu#6!9ZP>_cd@BB9e?WI7k6lBcd zX^K&U{sxUwfmA{^CP;)0rwM&^cK)y`an}q2-BWc%NdXs*>6(Ru1uDsmrk-Y-siNqr zrw6WMaxC03bWM{CD7h>^0*9)gBtyj=#e(6Gn0|PEwo>gcy=SQpf{ZJje){dJ|(cQA)`T#@X*@fs0TU9jZLn+IjJ#mQUQl6R7qpOw!xcr z2c3inZqUIf&6SwmR2G>jB?3)=*gaENXW*}S6ed9e`Ai6qAq(pP{N$ho47Oeiqs(+I zkAtDiHv%)sObWYV9Y-gyhgu9ahDsJUxW;9P3bG2S;t=qpxm=PIcR6v?yrZbbxS|dA zhFO|nd-)p}<&Lk=Wa#+n$Hz$o3)4O!&^_^2USz(~xlFa<_T zx3EZwC05z*Efp|4c9*Y0mP#D9i)o4Cz$ifgDC9=xu4G4=CCnRFBnk2Yp_3HOA*)(q z>XM1Rn2D*(GlQfHIms7~85w+oHfhuE(C@(0?2#ck45?UwYVVqqL9R@~(1+j@G#?P4 z0t&zqdAKr9n_yd-9H4zTPR(3<&@HC#=Wm-S-}q{I=6=@ejYl)Ruo6Z)vq!diJ5gAn zcUm0_9%je7xO8MG%Z_9jC6@D2WoD-GQX-*yZ-xfwcye|1BwoC?V_6+A<>}_qQnQ_8 zS<)7`CBZkpgMOBN0%6@Mxr-nY6dp(#L4qJQ;#XJ+D0OZWc1;2*g?dM6?yo?;(Kkv3 zuuUMK*HzLgx(srd>5jX?w4l$Rj~-A1?01|yMO|v_iI1>Gb*}7DPX|IIvab1{erNx< zt8=Sp8=M!tL^v?I;W;7Yvu1J?Oz+Ojw)ZR+OS++HZDV|7b6s_GqtZxJ&NVH7rvu4T zgjh2vTtNow?#N=M>}O#>ZT9|FkZ>TodYX9aH#$U&*@dW?s1EYk}fXP!F;+qwk& z^>mF(neEDsDp%AlYXhFVHiT1EAhJLz$(6)}QdDt7 zAq=>Latfs$t_Ye<9K2j4rpi3=8il=p$0(2?HzN~6AxJO4c51*dZZ2VOVufg>pO&uP z;k(89!lo-qK~`GWe1}s=Tl0m;v^3S$0jdU749ksuM^$Z}Y1J?`ZQDt+S|NlVB`cbm zK|5sO726ivGuQBf4Bn!qebZ0xxXS&_g<9svDA}6}g<@#H#c>1A0CC|aQfQiC+NPq) zzyd|ronR*Lbxn~>sICdV$;`HNRZ~r9tE@0+9t?r><*M5i=6{4Y+DLf~J(rk%Nc` z-+|1)2g&o~uR+x~0^x=u7*}Ch`<=nC1uK7m;RccpVd!#;59>5BysBs)PH=J90tH*m zHHzRx7-eCTA(lc-ha)~*5n9<#(MOz9N>2b-%m)s@x(!s!D|j=g!Gp}Z!M2V^Xdj~` zXDcQEw=oz-9@71$swk?tT`b=CarORc<*q^je4qu!%kFP6$#bnj!FD`}Z5Jui?SW=Q zp{40&6zdB8RF?g-#%duXEb95NSkN^H-mO}MQk6W7Qm-eNy=dFLv@jSUGdCZ6kmBe&iGg%fl zRi`vM7~$^=8y(lSsG?BIc3baldAko@lg?i|bt;-ImQF_fg6=qG+86KY$%kCu(45CF zbK#s?d9sNj8!)8br(cGi9DycTL1}o@qh!prA5*X{9#v{)_$e$pFxCoE009joncaw7j znU$~^gWIDG+JXdhMReR%`$^nd8I5CgFcJbd!2|4b2qFnfA%K50ZaOp`K)zrkFox*2 zfePWUAu>j%;R@XLK{`gjI6i#%Em@Vbl3ezai`AwdolH;DBDI?3Mx*Sd5}yf@)DPq6 zqgh!l(Q>VJsFZjGxZ|`Kq-8w`>eW5-<jvu|iZm^1mWoYX zmN(Z6@TLlZU-Ug&_A|K?M1~^!hPt|EL$#7v)j2(I_U!XeSB5ygLtlZ;cF71DI>k0< zmw>okfD=lVD-oK7OU|ciCU`oI)0nZ;YyGfZ)tyqqZOiWfth%~pGHjtsfqrS=76>;<@Vrbyt@mcWh_`+}E+ z{w|$D#u}S~M%r7+(H!zEz{aHlAqHQmIG$m;zU>;ui!b(y1j{Lw0pgJNaM*n3#HY`fde#Z48zYrsQcU-C)sy-LTjM`=#A{w0c@gq38mBA0TgCwhM8ZFT1daMhAEQEr;OxTL$QhRt zJ}0_h4n1y{sE9P=tYQRFU`oTo9bZ%Le*|{VP7);LY#077ueO^rrILP@X8R6ic0G*kuUpssxsW*N$yC}~e)^uIBxxqegcmOAv z8x9AXH93H zDg8Wd5H?O2FBnx7!O5HE4D8Ac+ps4zc#V#Mz;Q#+S9pCj3S*Z8aUT9n#t`=Ji;~3Q z?n8{9$wgT_{YTN$^bD~bJ%X*px+u@&H8e&N>5C07xbf4#Yed4ok4pzjBBo>4^B!Ii zuf3Ziv;eUc{N=@=XFqL2M>Okc)8L=CO#RU0@z5byO;jJ!P3!a5gJPx8EEj_g)PQ#_ zs|#;Ze(7n^Ma2M~W(Z8+$Z2Nu2lV^M8yA4(gb2v(sbc}neI@tY)G_33w4zSDGF4=R zAk&Ks2^Gk4?jysY7pR8lO+_XNVViKE=?|Vgw>o@grvB__-H+|GvlGkX(>u3Qo!61G zLAXvOt!b*ZDWVSr+qXG#YD$1WHmCr9gVe_w0oj`iiO zw6^p7d*SN3Kme}mh-rb%NFb<^A_2ecvaW_jkv2gfWrIdio-y+DSm z5cvZ6Hu(_-szQG!z_$z47W#qzWp7Cr=p*%Ow%Yqgg5T+dQ zCV?n`u-BcZ%Zj?3V?N{znPM?VUIjug0~*&vUP+jV1FWAeClDGV=B9;u3urai*p)1K~5=WUlHS4+P^Ht#U?1{3z5^1h;^e#-4U72MiHOe*$Sb z!_Z-(6dz8pOg96Yrk&%h`f%@R33kfxy_Cw(2VI#vVwnX?NeWtE>NXN62Bp4>{DI>} zf$S?PTVE8xuoEFzhwu1KP1hJMczzNRhRThf7&3=KAWg_^`hZ&+SxTwW?v6?>QyeqG z`j*yhbz>oxkt?oo2`|Dp*ihVm$0{|QGRI&X19A%E%2;TLa2+8tG#jyR>S3F3tZ;G0 zXE8Mr0wzKwAC%G5quehe<;&Z(rBDl#J%zfho32-I1FVi0q&6ZUW;lqfRNIEn8@V=f z-G~{?v8x=g%~6DJc99`kQx%gT3r(q}T#{Z5)GRszw9QF$eth`y9X~3W=^52BE6Nbp2%Sp{{@q2@yP-quQ$z|HHYf0IY&3$Li z?2`?z7ZxK7aWX3)YbwKB8?pe{Gfo&4!%*ND0e*cHnLlw*eC=vZ%M5YUv1ysZU;WEz zSwf$mP0KPdX=_?mh)2%=6=C&JQ^#nNGK0T6n3g#?OLqH6=<}^JJu%3;m^K^!_#W z^}l={zwg4eCob*gWgh}6vg*f@ecw=Ap2X8gxlb$oggR4?f5Qm z2R_&(Z{SNS9A%UoTp2Fm^P-iMo8gublhR&&0#- IcWiP0FOW!&bN~PV diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.svg b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.svg deleted file mode 100644 index 910cdcad41..0000000000 --- a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - -Generated by Fontastic.me - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.ttf b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.ttf deleted file mode 100644 index d3547e18e5448d4314d190daab95c776b7d297ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8144 zcmcIpd5oNAeSVMczVBo1V`pX$?|OG;XJ&ouVPmgjJC0*=;6QM?#CGfu+o|oMq#;rT z0aYzUZA9sz6saOXqLon7Lr7e01wrMXQV>Om&?*RmkU&)Z0|`N8_j$jW4HiN|RO)>5 z&G%m4d;E^)cMPF~5S#oC;pE=!?fXw%fBYX05K{kpv{sHCIl4`@iGuovP;Z>RZ*Twf z&mR6PA@nTj4?cQj=gD(VAN>OAKg9j+$98T!dHXhIBJ~fTUwiC{r!QLn(CZPxUmzrZ z@zRBz^V0mjb@Y7;_vjKDq`geWyAkR$m#*A=O8p9b1@*r{eg6~J9^Kh|?Z{8?{w35` zuk1YaB)Ldi=wCyHtU{-<&0laZobn>^5icZ!y!$$0#VneO~ZMN3ZW#4MV{Kw7kIO@~oN=pPc9 zX!LG+5pBn&&mWVVJSXOt_36l8nEl?1N6(WjvO}Jtuibu)O!u(6gUOC2`$PG8QYQiC z*^fCpxIjg6lpG*?unHk#+#URuaFtO8A*Xj`I^Vm{BFzbAcP{*W?K zXVmv=o_1c>^sgFMjqh9MtgnJ-&yxIJ2@^E}daimK16TPS?qC`fd72AsJLr#oyefCrXJ(j>)mH0YY|Q(=;lmzvbHqA)MT3weoKMt4+I zyk;OIR1z{xe?(s;eR6{QG5Je~@oH}s`{{M}(k0ewEm2YG_FCO36>x?K8^wiVjKsxP zF?@-N{&><=qoS_|I%1eOy9*jjJL|M~S+s%{#Y)BLi>WXj2r^pT#62$h1q;R_Io{>S zAf`5G&bUl9$~nc&6t1fbWH+Nk^G#dT4ATqU$PaDXwRNp6sj6NJORg(%RW|jKTQ#lD zv%PL?n2M%_x~j@tm#siGG)bOaIOY3Z7@4-Nn|csrHOH+4Sdmgsny=R@m2N_hAMfD% zc1dFjlVz1@j5DztnW_?_Oy;tt*-p#%G?U2^*Hp)$TIi=vkVRp|wSC)iEywp>O58Y4 zV?WSB#ndcClXb~(Rm*f-cX6h}xdKIVz0gm5$JR8)SQe;Mq6%(Ssm{;V8@haa=D7F@ zbrL$?0Umx5@^=q78%IjJ*%C4ahSiwhnqb-n6GR;sLg`Y66%1*NT(aa=B_r5BEdEvC?6{Khbfzh)s%T8s`Buw$Bu)bVXvU}{={P!+3sj|GuY}_& zGlm`+%!;Ehsa0?|U@@Uzq_@c_0I*Qd?yxJ4wn1^Wt~jAMuTVVkM0Fxw_xivCPS<325i`{OPY1A+%Gf#3p7;oKw zXw$U!E}zjHO;r@hVV~GsoXfju($-Q>(K^baTy8ew#L|+mR!u8GB&(})oxO8elk+H? zo87Aio~D(8^V|Kts&~65-g^8lup4`kxFPVH3JXM^ht9SL2?y~2x>2YdbS}nWr%JU> z+e5+R(SK}Sx+HPSj#`a!=5NKR?DN&TfDt70+rE$+p}NpaKve?W90CE_Ev#Lo?a?~z4dP-U3WafmcVZz*xi;YfJ{`RZkCG$K=?!W$2nF8BlUrfCN6Of|3jscN7bTLt^^jg}G|2zx?jyJ_tgN z?cW~@Wm>OTR8nL^w}LQh<&}B?d8#TP$5dFolDD!TG<8!}B&tUerHX88D)u2%NPGc7 zs%ptv0b{x+NfL|q??1L7))5O9as^M5-lk8JPlBe2>d>jCK*Vt7c%n*eL5zu-fF^1S z*JL2b6anTJXhEzy#!P4jL?4Wkew~5BH9jS&LOK>V(OBKu~>x$};W)Jl?ZL2^zK_3kwsPy=DzgusE%$_ zn~BP~rUmeHAbE-qYbJ%9Y4k2hjowu4NIbD=phN3J0C`*+4(9wU_vV2dlcqqp* zz2I@?x%05C%fMex*SM6~uI#9CRqe7Fz>_xv;ZzlfERafaC9$9sRUHvUF+@CT^cDIq zh;n`tt_EOMa2>Z02HZk9g;Eb!1COg+cRR2wW#DY^sTvkTrrHypvZ3e(!}42Er3`2!3OkaP$`S6F;lr-|WJ zMgMSui^Dc3*lw*;1TVrU3!4nF6lyvg@!_h_%6^J5;+j%=0>ENDZ~)eApkiIYn?W5O zWHAi3bv#1<7(E4Bu>iP@$uRSf?l)CMQO%uF>DCWx57nw~&U5gA=8RX|-)55MT6u0e zp2T)alkPj(bX*%!j*7eb_~Vn>t?yLZ70J={TJ)@D z%!0h)=Qm1@>p+E|*7{$phsuL$WZTg~sr1o5c*0Vse(6a|GyU?uRQ9}$&pMtbmn4rF zQC>|<*EN$B@lbV2qk|E?pWp1bwnY_%TDIGMPuttAcrChc{nV*wu2eo5^>f{E%(O4w z)sqjpzM(l!Ugp9%wE!_-E3yGY`d#`Z=t+S%ySO0)T{t7V4$6em(_aB86Bc0*paqte ze%IgLUQ5Cdo75T&MKf)~2zA#)Oy`*vL=Oro1IUGGkR@4)7ULl38SBGYX#C@k+<#xs zQ6$&#ohy%P3P;4A8@}DBDqK}8BhE}eNzInZBE?bU2YOj4-)dCS3>c3*10jEg7~ zz8tc;M(!i$2r?^SD+aemo3srH=!)pLtM-$)y*e7l>R==UaDoRo=MY2^mO=pkXxwsW zJb-+`NMH^zZW9f{VMAn$LBmzJ?SpiTfN^~I@SCz4XJxtKCl_liKRTJ7rX^~%D$Qoa zOC>%VB&i?9(TB5&T&9(J{ZKjaa=7EP6r>eB2^zIM3zgH=l@g40s7U9Hl)qA>LwRiX>^ zn#H*Y=S2pQoCWVb4$gJRUh+2bguv;Ef!^KC0`&4kw&`<;QIz@aDk~y+M_950h4obccyzll@$nyk1 z1qC6_&~9ZCgcXi~pjLlev|>PC?y5Cn;R~V*=FsDInTkk5&Z?A=_&UWGd^4d&mwp`ZF z(rn+s%x=W-YabsT%fr@8?Y~Q&re}!l=n)(()Y+ohnrJ?xo7U%U2Bm7V zRVf7>r~&U8h3%@CNtk<-lR_vm+#H_n0Ogb2v(sbc}neWmc+)G_33 zw5m?LGF4=RAk#|>2^Gk4;UmML7pR8lO+_XNVViKE>Gz&Hw>Ersw(;C&+>czF$xf_{ zPhY#6>b!xR4Z?LQX)RN=O%Z)4IKIu1Q&YkO$szkA?o0 z$QI80Pk0_9kC4xkZ;~Hiq8jvf0(>i=LASS$7T`Tzfz~Cd@M8-^UqLR678%d>6v_+p zydr3^31KP_ZxV5m~zXBaw6l;XoFmg!bt)3kHE-5Bm&E5lA1zL!!N`k*WGM=Ue9lqA;zQ@4>o zF(~z2YP!a7!}F7nFjQ{+$dEY{0%<~S)3>?hk)@QY zGu=_yWr|})*x&Mot!^&HGIGUrF5yKO2OEm}U)ZIlQ|1_qV?s`0Tp0^35w0U-hGrx7 zO+6eFjumds_#Bo-Lcm0*}}Zsffr-ic3s^hD(UWHtFm1pUEsTbVtc)pyVVf>y2ShgkB2~=s^hZ z6hewS5w2Qqguq<<-%zN8z(GJ>RHMQ@gA>{-x>YU!^ z1quFhc>1rNX89jg!qBmyjl+Jfz{;ET*(MCCBL7`zJ7I|Yxt!GPHh&-p@_Z&QCzol* zt|t{wHus%5vrjg>URa7S#mOv3)>MYMHe>;?XPhu9g`vPP0{r?gJZ$ly__wPyEi=SX z$EIZtfAz1YWeH<`IxWk@r0r>0As#&gRD{(>O9Qh_$_)PQU|QznEZH3+VazwC?J`NI zIV~%sLHCjy(?y}a|p;*Co?*Dox-^Rj69 zC4+w6yNwC2;zjYiP9DQl4X|~IEaSN!_pe%TGOCZGEFx*Mhz551#2DT@DJDLnKeko|2)!d>vxPLPx2Zu~EB4|xzi@L5>B)A*PA3^GCY sk_X6J#2fgh6^=4W4(<%M@bW2mo8ea~YND-J@5|@D_)}52^Z)Gs1>=KuMgRZ+ diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.woff b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/fonts/social-share-kit.woff deleted file mode 100644 index 12cc6b542fc17112f5b7ef1703b497ee4881faae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6420 zcmZWtWl$VUlw921-GaN5;I_C0clU+hE+O~=Ssa1~cXxMpNN{(DKyb+IcXj{nRdr2u z&s4waSM%$6s{w&(T3TuV00}+-4FD~gN&w7%=l?HhAdngWfI$WT2(kbGaz=>KlQs~j zr2+sD7D8W>LP754&?77-BMXFTy--d81vNkh0I#OW$ph84pJMOsLI9rSqo^HJgleNuP7K8dcurV2J0}kxsJ0E|+)(f! z%)#_KnfpNfi1DEu@qa<24sbSivW9BpP<{;U@kmu?F6Q#Z9omls9;#tOK@ETd!1!dv z>HEf$>-tiyWc-LMsALBpYE=Q?6w0}{X+y-Wg;eL~HBW|kmJ1y*}@|CyDxm+qeK znU7vJ_nRqJhOA1Dh{`TMcU^X|iB##s3X}<2U9?N$>owSIa{TCyVb2^n%fcO z)gbur{omR@DiN#}xVD}#v3&{Zh{Bz z0uOELRc)O6n=&t5$X`fI?vi5unLi{wwH)d@Ne8_Rn^aMOs8|z#DM(HFZ3SugpIMH&!F|R zvX4|Drc0+}?KGhd^rVaK(w+wfGfm`!Rq)Uyk5nl2wn5W7pv}F&et!!lM#W0{*>8){ zU86DIsPCl2-S8N_@Pz9XKtnpPVm`%isVBram#5X{Bm$Is375ys3ZMaQ^0=_ioAWn% z4W5P#9!f|X^LB7?eS4fcF-5x-|o9W)PRRPhnQlQKzxF@Upcu`9F? z{ILY`in0uc=p54Mgbb7bxand;M=Q&wCKyI)ZVSuM3#NUNk%;Omg3y z-g`7o{9&*B^N!dLsKk?GJ$^^~`y!mt_4#8NrGHpTP}%|TU|3|#qd$D3)w^IAs_DBc zk-yQ5PwL1;QRoxIFlmrMdF4jJ_-sd1Vtc{NHwC~Lp=nrBjq>X@fp$9KEs?vo74Ku#qmN(i3OvwZ+}g64!g<+ zA`J{3^(kuPI%Ru~IQ>LR96ct#<2RVlSK7zf6fkQ~C2F{ho2L+08fZ=|JNRijp7J*p zro@7^BO{v3W;ncw(vnngzYLcYjJTBY3Twuid}ei%c0grgbP13yFWVn3iM(R%|F+?R zkcJf|qa2>Pt|9C&Lo9(sSk=7dO86F}oWq$)O5YYXG%cLZ*;f7q-p|a-JlpC?H@8Qm zqf{vMVj^hTh+E{%t#6B&XI4iu>mcg(R2@l&Kt^)#qcg3ID<6!3Lz=1)k%0;MP(r3u zrjMlWmdXNw3Jt*J617&Zl?BVYKkjg3bYcYw z72ELVMOz&eQ1WtlKpX1`=Q zHsi#|I4|!bH?wN5B&@0PR)ee0?e)pYNM_E-w~OWGi?7n{LpWLRGTgTrWdJ99ZEGdh zS}tSd>953+lzo#6BFcs`oEFQz3q0&_-V4CxhGQGL=vE04UWjjOSrkdN1rhFVAxfkO zwLV16OrBUrJYmm0u5I?dRM1@C;f|4dE!v`1U%k0Ux=&{^H4nanAYAH<> zA-EDabG8yl9e7M4n({$X%!Q56RW76P?7DY7vWn<7NtX4f(n+w*Z++Dter3& zPD9#BqGW;#jr(7sexOb;i)v* zJkL(S)H|#|t=Z-!P|)OC_b?WWawf*NfU!h+qk@7C#h6qu9;kY^#!>Fe|w;3(=&)BmYiF#Acs_%+fQg z12+r%M%ZePzjC9YlfuW4bKT1Sj`&HJyUdZpTSJ*HJ z_DY#uVY!YbKd#1255ZdwN^kU+JV&Yy{$u25ti+|XDRp*(>>ps`=XWUN56`ge<7g9T z6Do>Qa>JaE5|4#m!znRT(~`;F%xd{;Geh`1i(ydZwRRZ_x2C7%2VA)?i-`#z_KY35OhR>=7DaW7hQW50Uc+~ZHZPWlhdJ@ptXYh$>OqK7gA4Mf`;uj}TyMu^vmqZAnKU^_xQ&t+Ux|G$SP1rcNM+j*DEF_8n+jn*-v^ z3E};#-EG`lTxIF9D1u5*lPVA}w1}T_4a@oGTYh=ov&9E#c_Po6$u z>5!@{pUNhDwzUZX?yZ5w=V6}8JO^H1OQ4g^g?+{P;j^kkWC&H#xte&tnHTZ*Q?qWm zC%WVD)h>7MI;5$!9haA5ha&AWEkhYkl`U6_rG|hmMmDghYegM>*8EZ&zyHSC^-}-e zFr!fsw?mv_$n#VwDM8z`07g3uAuc-%nUTx+EXH}fdVIlDEk89ae(j~QfwvEhP3}ee zw8d)63u5u)QN03#U8`qlzl!&|E1p)~A-@!+d35N+&S`Fc#cciO64|io)kv7E;OCRu zT6j3?1jq$^(^19sLdDH^@z^Qb)9i(Ex*vs>0=uXN9e<)UYGr3+`K(hrMx?vUApHFG zEsGA-(5FGdMZ;=H|8J!%!cEe%kO)*+FWKF(@8Dn6Pc~nR0ecFvQCKi}jkDO~_@<~) zVX*P;wZR>TXzFuh4#tuRqe`9QvFbD**H%B@~qi7%=oDX3HPH?H_+a7TB z#ErX5Lt$?(=Woj82!C2pGk%us*MOs(^j~&J9)@O)C-PAT zR#YMnvgxj*~jOC9O9eqRF`f0`MJY>;{%df=Jm#-)$9EYH=?fPE}k(AY4MaUb<{qs}AD zgY#mZT}4s+X8JGV2gxN16K(`5FyQF(9)g&!lTB*}GHiy*uhhWo@r>md&3Qe!BCWCa z7!)czRb@}xPa{)wDWPcY4`UCNo=EY(=iA$6v)cZphLob-|9E(EA6WEu z-VsyeY-znf*82#AX^fuP(l=QN+LbxFYt^@8A#gVT2SE)5R`9*QUGbddGE2+{KTeL{ z?I*OYL|d){N|PvaCHGbH-)7!ed52O657!R<9&GMDJ9LS+i2Lu+Hq_Cpo%b{`8N$ZS zuoHeYPER+mtEyrzfqc)sL*1~^%j9w75;MNes`?U_`^e^gg`eCee=dGrGyJk}lzuy~ zaqIo1ug6MPwNI3)^QGu@dHP}{k|eA#`Jy4v7e&W>jH=NuD7la#`B>@$e3J(a6O6r- zF)J&y~OXqsr6uNtkHy}GNWo1K=o_f>7|mHCS&&)Inw>XDnj zI~3KNcRG{!^)70hymga)xul@GuPC9TA~HfgA^l}>1&~u!1uJTd|2?lTS;9 zDU=1p`y4|FyETart<>QMMSik3W+wlL{PIR{t3=Ffm8^RlkZ^#2Ujm!|BcGTy9*e+) z^wL)Bah?+`;l~5FzQ|Zf_;e!D^5MA;gS8+xJyV5e9Yg)MSnP^g2TjMk0$I8_cmb@$ zp^mJHCs1!VXq;0qW;d}J)oNk~3`q7nC?t0G!H{Z`Zz%1|=E~0D?=I1Ob2KU3r*P}FFXu`u%Z$kM%|!-1>U5Er zNe>Jz3Q_$EmPu-?cTC^O#I*VH$&h&B{ep3_Q>bE^wv*g}YU4w74%R1)j$h7A1`4Fb zI1$_+q`F9xWv@At*g@m&V7ar29ocWqf^1C!3@J z^-;RYvb8mgDT3=>(1qGc`zrY0Z8edi2>FD^Kot)mJ(6K%w zp2z6&ti}p$vGFVYI+fD&OZM-)A0)ZL*<+K7XgX(t8#}s1mqQsog+pJmw@k$r=Abdc$1dt z`|OqaL_xv)#w{@WIb^E?)Cli*`da7Ff96!BAUi5?A^!oY zz~1mArJ>_~??yl=yjXT%Bnjxq75;96U0F7ijeJ^n0Bjh+qt#e0LpYu1G}v&AesVl! zMr(TLs8Zdpjjy%#LAuab1JNk=Y-#l%%<3iLi!I<+!tjWsrjmtiQ*W{Aywto73 zKsR$*y_39Tjwi6nK0}ut?14bdoR{Bdyx(j^%1Fi@CAm>7wt6i;A}&W$ouSncSEQ&` zbY@zbtr5z|Y!FfQRk0B`HuODNalUQQph*o#(ZT`R#6I zsmVMv5WuPDEXY5##6Qo-og&zGw}t_IN?a#CI7QMW5ds$J&bG zB2P3rsH*Z=epXmG?<0gjJR-i)N@jDdr^IomPau~aV;KkI|3pK>hB5n{@9TVRHzFPOM+Ji`K9hScX`| z3q~}2hvb9*jUuA060i1iLmzYJ zDV~q7yji?pi$+O(e?IT6&ursCE#0AG<;=6T0@3RiNNZ%oD_;-* zx3x(kJQCE!6*N{IKE9Z50W%c%s_x2qRq!0J@Zetep z@W}Hta&d8S*Shia0_fmyk>%Z0%w5dntxC-TuK&S=QsO0&4(~}w!61{stSF+|L4BIy zlrTdj(51JyxB?8{EB)#({gBl;=Wj6?8eg1U@aa`SB-dGQy{=|>?!%fn8R0B-GvmU* zHIp9pAZ4=i)52Rf>)kdZdIEk5JUBXbQC+@0EGOPKi-}Ju~rBv3>HAsguM5EIiYi~0KkfJ zp;++pz=fiQ@`mzdu9FrFilW4yLwqxM(F`+02 z5Sr$5F4~@yGkPih#7D(6I?UufdWS*dAdaxq`-AN}7<)8oN$DGtHF}HV+rM5(tEQhp z^ihQ;$)ZLd4$^8#;XBE?l_Qh$Fp76MCGrQ~G3WSXc~0H6|HKm;!Qn>Zl;qiYNsDob zs$9Lpl9wqsJt#= 200 && this.status < 400) { - callback(this.responseText); - } - } - }; - request.open('POST', url, true); - request.setRequestHeader('Content-Type', 'application/json'); - request.send(body); - } - - function JSONPRequest(network, url, callback) { - var callbackName = 'cb_' + network + '_' + Math.round(100000 * Math.random()), - script = document.createElement('script'); - window[callbackName] = function (data) { - try { // IE8 - delete window[callbackName]; - } catch (e) { - } - document.body.removeChild(script); - callback(data); - }; - if (network == 'vk') { - window['VK'] = { - Share: { - count: function (a, b) { - window[callbackName](b); - } - } - }; - } else if (network == 'google-plus') { - window['services'] = { - gplus: { - cb: window[callbackName] - } - }; - } - script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName; - document.body.appendChild(script); - return true; - } - - return { - init: init - }; -})(); - -window.SocialShareKit = SocialShareKit; diff --git a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/js/social-share-kit.min.js b/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/js/social-share-kit.min.js deleted file mode 100644 index d105532f61..0000000000 --- a/dashboard-ui/bower_components/emby-webcomponents/sharing/social-share-kit-1.0.4/dist/js/social-share-kit.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/*! - * Social Share Kit v1.0.3 (http://socialsharekit.com) - * Copyright 2015 Social Share Kit / Kaspars Sprogis. - * Licensed under Creative Commons Attribution-NonCommercial 3.0 license: - * https://github.com/darklow/social-share-kit/blob/master/LICENSE - * --- - */ -;var SocialShareKit=(function(){var f,d,v,t={},q="*|*";function x(A){d=A||{};v=/(twitter|facebook|google-plus|pinterest|tumblr|vk|linkedin|email)/;n(function(){f=g(d.selector||".ssk");if(!f.length){return}e(f,function(C){var D=s(C),B;if(!D){return}r(C,"click",h);p(C,"click",h);if(C.parentNode.className.indexOf("ssk-count")!==-1){D=D[0];B=D+q+z(D,C);if(!(B in t)){t[B]=[]}t[B].push(C)}});j()})}function n(A){if(document.readyState!="loading"){A()}else{if(document.addEventListener){document.addEventListener("DOMContentLoaded",A)}else{document.attachEvent("onreadystatechange",function(){if(document.readyState!="loading"){A()}})}}}function g(A){return document.querySelectorAll(A)}function e(C,B){for(var A=0;A=200&&this.status<400){D(this.responseText)}}};C.open("POST",B,true);C.setRequestHeader("Content-Type","application/json");C.send(A)}function b(C,B,E){var D="cb_"+C+"_"+Math.round(100000*Math.random()),A=document.createElement("script");window[D]=function(F){try{delete window[D]}catch(G){}document.body.removeChild(A);E(F)};if(C=="vk"){window.VK={Share:{count:function(G,F){window[D](F)}}}}else{if(C=="google-plus"){window.services={gplus:{cb:window[D]}}}}A.src=B+(B.indexOf("?")>=0?"&":"?")+"callback="+D;document.body.appendChild(A);return true}return{init:x}})();window.SocialShareKit=SocialShareKit; \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js b/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js index e49465e41c..492d9c4bd1 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js +++ b/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js @@ -313,10 +313,17 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g var serverId = apiClient.serverInfo().Id; if (item.Type == 'Timer') { - require(['recordingEditor'], function (recordingEditor) { + if (item.ProgramId) { + require(['recordingCreator'], function (recordingCreator) { - recordingEditor.show(item.Id, serverId).then(resolve, reject); - }); + recordingCreator.show(item.ProgramId, serverId).then(resolve, reject); + }); + } else { + require(['recordingEditor'], function (recordingEditor) { + + recordingEditor.show(item.Id, serverId).then(resolve, reject); + }); + } } else { require(['metadataEditor'], function (metadataEditor) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ar.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ar.json index 731019da71..b4e3a37300 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ar.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ar.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/bg-BG.json b/dashboard-ui/bower_components/emby-webcomponents/strings/bg-BG.json index 5dcd456288..e7f0c2d1c2 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/bg-BG.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/bg-BG.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u0414\u043e\u0431\u0430\u0432\u0438", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ca.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ca.json index 911f4362f8..2d163cb1e3 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ca.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ca.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Afegeix", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/cs.json b/dashboard-ui/bower_components/emby-webcomponents/strings/cs.json index fb1b86a035..86bdd8a50a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/cs.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/cs.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "P\u0159idat", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/da.json b/dashboard-ui/bower_components/emby-webcomponents/strings/da.json index c99f1c78d8..5f51ad6416 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/da.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/da.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Del", "Add": "Tilf\u00f8j", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json index 3153c2d915..09017f1464 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Erfahre mehr", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Teilen", "Add": "Hinzuf\u00fcgen", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/el.json b/dashboard-ui/bower_components/emby-webcomponents/strings/el.json index ee70fc61a0..b57f5e15a7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/el.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/el.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u03a0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c3\u03b5", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/en-GB.json b/dashboard-ui/bower_components/emby-webcomponents/strings/en-GB.json index 62b5b11689..e9e8207989 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/en-GB.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/en-GB.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", @@ -52,7 +54,7 @@ "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 for easy playback on your devices.", + "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", "Record": "Record", "Save": "Save", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json index 9a53ea76d7..555791cca1 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/en-US.json @@ -286,5 +286,7 @@ "HeaderCancelRecording": "Cancel Recording", "HeaderKeepRecording": "Keep Recording", "HeaderLearnMore": "Learn More", - "DeleteMedia": "Delete media" + "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es-AR.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es-AR.json index 8dc6440b0e..500eb099f7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es-AR.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es-AR.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json index f757950019..99046460db 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es-MX.json @@ -1,9 +1,11 @@ { - "PromoConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format with Emby Premiere. Recordings will be converted on the fly to MP4 or MKV, based on Emby server settings.", - "HeaderConvertYourRecordings": "Convert Your Recordings", - "HeaderLearnMore": "Learn More", - "HeaderKeepRecording": "Keep Recording", - "DeleteMedia": "Delete media", + "PromoConvertRecordingsToStreamingFormat": "Convertir autom\u00e1ticamente grabaciones a un formato amigable para transmitir con Emby Premiere. Las grabaciones ser\u00e1n convertidos en tiempo real a MP4 o MKV, basado en las configuraciones del servidor Emby.", + "HeaderConvertYourRecordings": "Convertir Sus Grabaciones", + "HeaderLearnMore": "Aprenda m\u00e1s", + "HeaderKeepRecording": "Conservar Grabaciones", + "DeleteMedia": "Eliminar medios", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Compartir", "Add": "Agregar", @@ -52,7 +54,7 @@ "HeaderBecomeProjectSupporter": "Obtener Emby Premier", "MessageActiveSubscriptionRequiredSeriesRecordings": "Se requiere de una suscripci\u00f3n de Emby Premier para crear grabaciones automatizadas de series.", "OptionConvertRecordingsToStreamingFormat": "Convertir autom\u00e1ticamente las grabaciones a un formato amigable para transmisi\u00f3n", - "OptionConvertRecordingsToStreamingFormatHelp": "Las grabaciones ser\u00e1n convertidas en tiempo real a MP4 para una f\u00e1cil reproducci\u00f3n en sus dispositivos.", + "OptionConvertRecordingsToStreamingFormatHelp": "Las grabaciones ser\u00e1n convertidas en tiempo real a MP4 o MKV para una f\u00e1cil reproducci\u00f3n en sus dispositivos, basado en las configuraciones del servidor Emby.", "FeatureRequiresEmbyPremiere": "Esta caracter\u00edstica requiere de una suscripci\u00f3n activa de Emby Premiere.", "Record": "Grabar", "Save": "Guardar", @@ -288,6 +290,6 @@ "LiveBroadcasts": "Transmisiones en vivo", "Premieres": "Estrenos", "RepeatEpisodes": "Repetir episodios", - "DvrSubscriptionRequired": "Emby DVR requires an active Emby Premiere subscription.", - "HeaderCancelRecording": "Cancel Recording" + "DvrSubscriptionRequired": "Emby DVR necesita una suscripci\u00f3n activa de Emby Premiere.", + "HeaderCancelRecording": "Cancelar Grabaci\u00f3n" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/es.json b/dashboard-ui/bower_components/emby-webcomponents/strings/es.json index e347685644..53a8514b7a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/es.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/es.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Compartir", "Add": "A\u00f1adir", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json index d1c488533a..9a0b6a63e2 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fi.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fr-CA.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fr-CA.json index 299d43f37b..9fd0970706 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fr-CA.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fr-CA.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json index 9f4b6e6064..277b7b2ed6 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/fr.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Sp\u00e9cial - {0}", "Share": "Partager", "Add": "Ajouter", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json b/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json index 74efde7beb..f3f4d4b54d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/gsw.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/he.json b/dashboard-ui/bower_components/emby-webcomponents/strings/he.json index 0a7cdcbe51..32a5fdde71 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/he.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/he.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u05d4\u05d5\u05e1\u05e3", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json index fc1f04cd62..f7974103b9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/hr.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Dodaj", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json b/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json index 99c1a852c5..f99391fba3 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/hu.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Megoszt\u00e1s", "Add": "Hozz\u00e1ad", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/id.json b/dashboard-ui/bower_components/emby-webcomponents/strings/id.json index c28bede7b3..7efb79b858 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/id.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/id.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/it.json b/dashboard-ui/bower_components/emby-webcomponents/strings/it.json index 2b07119acb..5edf66e71d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/it.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/it.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Aggiungi", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json index 8d2ee88b61..04bf4c01d6 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json @@ -2,8 +2,10 @@ "PromoConvertRecordingsToStreamingFormat": "Emby Premiere \u0430\u0440\u049b\u044b\u043b\u044b \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443\u0493\u0430 \u043e\u04a3\u0430\u0439 \u043f\u0456\u0448\u0456\u043d\u0434\u0435 \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u0434\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443. \u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440 Emby Server \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456 \u043d\u0435\u0433\u0456\u0437\u0456\u043d\u0434\u0435, \u043d\u0430\u049b\u0442\u044b \u0443\u0430\u049b\u044b\u0442\u0442\u0430 MP4 \u043d\u0435\u043c\u0435\u0441\u0435 MKV \u043f\u0456\u0448\u0456\u043c\u0456\u043d\u0435 \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0456\u043b\u0435\u0434\u0456.", "HeaderConvertYourRecordings": "\u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u044b\u04a3\u044b\u0437\u0434\u044b \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443", "HeaderLearnMore": "\u041a\u04e9\u0431\u0456\u0440\u0435\u043a \u0431\u0456\u043b\u0443", - "HeaderKeepRecording": "Keep Recording", - "DeleteMedia": "Delete media", + "HeaderKeepRecording": "\u0416\u0430\u0437\u0443\u0434\u044b \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443", + "DeleteMedia": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0456 \u0436\u043e\u044e", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "\u0410\u0440\u043d\u0430\u0439\u044b - {0}", "Share": "\u041e\u0440\u0442\u0430\u049b\u0442\u0430\u0441\u0443", "Add": "\u04ae\u0441\u0442\u0435\u0443", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json index 603a5d1616..7243a62e91 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ko.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\ucd94\uac00", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json index 299d43f37b..9fd0970706 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ms.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json index 71ae820961..51f1048b0c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/nb.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Spesial - {0}", "Share": "Del", "Add": "Legg til", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json b/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json index a3c2ef0369..80f0bbe17d 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/nl.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Speciaal - {0}", "Share": "Delen", "Add": "Toevoegen", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json index 22d7ed63c3..f568c52645 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pl.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Dodaj", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json index 333f188a34..4f44025911 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-BR.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Saiba Mais", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Compartilhar", "Add": "Adicionar", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json index 27a357a69f..43ecce15db 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/pt-PT.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Especial - {0}", "Share": "Partilhar", "Add": "Adicionar", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json index 1ebf457e78..ee5e1460b0 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ro.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json index 78faf153c7..d8433504e2 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json @@ -2,8 +2,10 @@ "PromoConvertRecordingsToStreamingFormat": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Emby Premiere. \u0417\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 MP4 \u0438\u043b\u0438 MKV, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 Emby Server.", "HeaderConvertYourRecordings": "\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439", "HeaderLearnMore": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435...", - "HeaderKeepRecording": "Keep Recording", - "DeleteMedia": "Delete media", + "HeaderKeepRecording": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438", + "DeleteMedia": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "\u0421\u043f\u0435\u0446\u044d\u043f\u0438\u0437\u043e\u0434 - {0}", "Share": "\u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f", "Add": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json index 299d43f37b..9fd0970706 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sk.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sl-SI.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sl-SI.json index c456b1ccf8..258d38940b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sl-SI.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sl-SI.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json b/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json index 4364602352..d4ac956509 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/sv.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Specialavsnitt - {0}", "Share": "Dela", "Add": "L\u00e4gg till", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json b/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json index 625aea8a28..0dcf0063c0 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/tr.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Ekle", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json index 7b2ca79854..2904d371b9 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/uk.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Add", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json b/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json index b3c3f80373..792fcf5f4c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/vi.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "Th\u00eam", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json index c791beedcc..61945adc3a 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-CN.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u6dfb\u52a0", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-HK.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-HK.json index 9511d0686c..b098189c7e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-HK.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-HK.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "Share", "Add": "\u65b0\u589e", diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json index f0e4485ce6..bf66d04aec 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/zh-TW.json @@ -4,6 +4,8 @@ "HeaderLearnMore": "Learn More", "HeaderKeepRecording": "Keep Recording", "DeleteMedia": "Delete media", + "SeriesSettings": "Series settings", + "HeaderRecordingOptions": "Recording Options", "ValueSpecialEpisodeName": "Special - {0}", "Share": "\u5206\u4eab", "Add": "\u6dfb\u52a0", diff --git a/dashboard-ui/bower_components/hls.js/.bower.json b/dashboard-ui/bower_components/hls.js/.bower.json index bb16d9ac02..9086a86c43 100644 --- a/dashboard-ui/bower_components/hls.js/.bower.json +++ b/dashboard-ui/bower_components/hls.js/.bower.json @@ -1,6 +1,6 @@ { "name": "hls.js", - "version": "0.5.47", + "version": "0.5.48", "license": "Apache-2.0", "description": "Media Source Extension - HLS library, by/for Dailymotion", "homepage": "https://github.com/dailymotion/hls.js", @@ -16,11 +16,11 @@ "test", "tests" ], - "_release": "0.5.47", + "_release": "0.5.48", "_resolution": { "type": "version", - "tag": "v0.5.47", - "commit": "21becc9db79debff24e818fee2d961ed655e744b" + "tag": "v0.5.48", + "commit": "d37a6900d9a9c487b686b6cad4e8aabd5ad03893" }, "_source": "git://github.com/dailymotion/hls.js.git", "_target": "~0.5.7", diff --git a/dashboard-ui/bower_components/hls.js/bower.json b/dashboard-ui/bower_components/hls.js/bower.json index 2edfe2f88f..5735c80ce5 100644 --- a/dashboard-ui/bower_components/hls.js/bower.json +++ b/dashboard-ui/bower_components/hls.js/bower.json @@ -1,6 +1,6 @@ { "name": "hls.js", - "version": "0.5.47", + "version": "0.5.48", "license": "Apache-2.0", "description": "Media Source Extension - HLS library, by/for Dailymotion", "homepage": "https://github.com/dailymotion/hls.js", diff --git a/dashboard-ui/bower_components/hls.js/dist/hls.min.js b/dashboard-ui/bower_components/hls.js/dist/hls.min.js index 168b0f41dd..8748a25acb 100644 --- a/dashboard-ui/bower_components/hls.js/dist/hls.min.js +++ b/dashboard-ui/bower_components/hls.js/dist/hls.min.js @@ -1,5 +1,5 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Hls=e()}}(function(){return function s(e,t,r){function a(i,d){if(!t[i]){if(!e[i]){var l="function"==typeof require&&require;if(!d&&l)return l(i,!0);if(n)return n(i,!0);var u=new Error("Cannot find module '"+i+"'");throw u.code="MODULE_NOT_FOUND",u}var o=t[i]={exports:{}};e[i][0].call(o.exports,function(t){var r=e[i][1][t];return a(r?r:t)},o,o.exports,s,e,t,r)}return t[i].exports}for(var n="function"==typeof require&&require,i=0;ie||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},e.prototype.emit=function(l){var s,e,u,i,n,o;if(this._events||(this._events={}),"error"===l&&(!this._events.error||r(this._events.error)&&!this._events.error.length)){if(s=arguments[1],s instanceof Error)throw s;throw TypeError('Uncaught, unspecified "error" event.')}if(e=this._events[l],a(e))return!1;if(t(e))switch(arguments.length){case 1:e.call(this);break;case 2:e.call(this,arguments[1]);break;case 3:e.call(this,arguments[1],arguments[2]);break;default:i=Array.prototype.slice.call(arguments,1),e.apply(this,i)}else if(r(e))for(i=Array.prototype.slice.call(arguments,1),o=e.slice(),u=o.length,n=0;u>n;n++)o[n].apply(this,i);return!0},e.prototype.addListener=function(i,n){var s;if(!t(n))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",i,t(n.listener)?n.listener:n),this._events[i]?r(this._events[i])?this._events[i].push(n):this._events[i]=[this._events[i],n]:this._events[i]=n,r(this._events[i])&&!this._events[i].warned&&(s=a(this._maxListeners)?e.defaultMaxListeners:this._maxListeners,s&&s>0&&this._events[i].length>s&&(this._events[i].warned=!0,"function"==typeof console.trace)),this},e.prototype.on=e.prototype.addListener,e.prototype.once=function(a,e){function r(){this.removeListener(a,r),i||(i=!0,e.apply(this,arguments))}if(!t(e))throw TypeError("listener must be a function");var i=!1;return r.listener=e,this.on(a,r),this},e.prototype.removeListener=function(i,a){var e,s,o,n;if(!t(a))throw TypeError("listener must be a function");if(!this._events||!this._events[i])return this;if(e=this._events[i],o=e.length,s=-1,e===a||t(e.listener)&&e.listener===a)delete this._events[i],this._events.removeListener&&this.emit("removeListener",i,a);else if(r(e)){for(n=o;n-- >0;)if(e[n]===a||e[n].listener&&e[n].listener===a){s=n;break}if(0>s)return this;1===e.length?(e.length=0,delete this._events[i]):e.splice(s,1),this._events.removeListener&&this.emit("removeListener",i,a)}return this},e.prototype.removeAllListeners=function(r){var a,e;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[r]&&delete this._events[r],this;if(0===arguments.length){for(a in this._events)"removeListener"!==a&&this.removeAllListeners(a);return this.removeAllListeners("removeListener"),this._events={},this}if(e=this._events[r],t(e))this.removeListener(r,e);else if(e)for(;e.length;)this.removeListener(r,e[e.length-1]);return delete this._events[r],this},e.prototype.listeners=function(e){var r;return r=this._events&&this._events[e]?t(this._events[e])?[this._events[e]]:this._events[e].slice():[]},e.prototype.listenerCount=function(r){if(this._events){var e=this._events[r];if(t(e))return 1;if(e)return e.length}return 0},e.listenerCount=function(e,t){return e.listenerCount(t)}},{}],2:[function(n,a,s){var i=arguments[3],e=arguments[4],r=arguments[5],t=JSON.stringify;a.exports=function(l){for(var a,s=Object.keys(r),n=0,d=s.length;d>n;n++){var o=s[n],u=r[o].exports;if(u===l||u.default===l){a=o;break}}if(!a){a=Math.floor(Math.pow(16,8)*Math.random()).toString(16);for(var f={},n=0,d=s.length;d>n;n++){var o=s[n];f[o]=o}e[a]=[Function(["require","module","exports"],"("+l+")(self)"),f]}var h=Math.floor(Math.pow(16,8)*Math.random()).toString(16),c={};c[a]=a,e[h]=[Function(["require"],"var f = require("+t(a)+");(f.default ? f.default : f)(self);"),c];var v="("+i+")({"+Object.keys(e).map(function(r){return t(r)+":["+e[r][0]+","+t(e[r][1])+"]"}).join(",")+"},{},["+t(h)+"])",g=window.URL||window.webkitURL||window.mozURL||window.msURL;return new Worker(g.createObjectURL(new Blob([v],{type:"text/javascript"})))}},{}],3:[function(e,m,o){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function f(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function v(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(o,"__esModule",{value:!0});var g=function(){function e(a,r){for(var t=0;t500*e.duration){var f=i.levels,h=Math.max(1,1e3*e.loaded/u),v=Math.max(e.loaded,Math.round(e.duration*f[e.level].bitrate/8)),c=s.currentTime,d=(v-e.loaded)/h,o=n.default.bufferInfo(s,c,i.config.maxBufferHole).end-c;if(o<2*e.duration&&d>o){var l=void 0,a=void 0;for(a=e.level-1;a>=0&&(l=e.duration*f[a].bitrate/(6.4*h),t.logger.log("fragLoadedDelay/bufferStarvationDelay/fragLevelNextLoadedDelay["+a+"] :"+d.toFixed(1)+"/"+o.toFixed(1)+"/"+l.toFixed(1)),!(o>l));a--);d>l&&(a=Math.max(0,a),i.nextLoadLevel=a,this.bwEstimator.sample(u,e.loaded),t.logger.warn("loading too slow, abort fragment loading and switch to level "+a),e.loader.abort(),this.clearTimer(),i.trigger(r.default.FRAG_LOAD_EMERGENCY_ABORTED,{frag:e}))}}}}},{key:"onFragLoaded",value:function(t){var e=t.stats,r=t.frag;if(void 0===e.aborted&&1===r.loadCounter){var a=e.tload-e.trequest;this.bwEstimator.sample(a,e.loaded),r.bitrateTest?this.bitrateTestDelay=a/1e3:this.bitrateTestDelay=0}this.clearTimer(),this.lastLoadedFragLevel=t.frag.level,this._nextAutoLevel=-1}},{key:"onError",value:function(e){switch(e.details){case s.ErrorDetails.FRAG_LOAD_ERROR:case s.ErrorDetails.FRAG_LOAD_TIMEOUT:this.clearTimer()}}},{key:"clearTimer",value:function(){this.timer&&(clearInterval(this.timer),this.timer=null)}},{key:"findBestLevel",value:function(g,f,s,v,u,c,h,l){for(var e=v;e>=0;e--){var d=l[e],n=d.details,o=n?n.totalduration/n.fragments.length:f,r=void 0;r=g>=e?c*s:h*s;var i=l[e].bitrate,a=i*o/r;if(t.logger.trace("level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: "+e+"/"+Math.round(r)+"/"+i+"/"+o+"/"+u+"/"+a),r>i&&(!a||u>a))return e}return 0}},{key:"autoLevelCapping",get:function(){return this._autoLevelCapping},set:function(e){this._autoLevelCapping=e}},{key:"nextAutoLevel",get:function(){var i,u=this.hls,a=u.levels,e=u.config;if(i=-1===this._autoLevelCapping&&a&&a.length?a.length-1:this._autoLevelCapping,-1!==this._nextAutoLevel)return Math.min(this._nextAutoLevel,i);var r=u.media,c=this.lastLoadedFragLevel,f=this.fragCurrent?this.fragCurrent.duration:0,v=r?r.currentTime:0,g=r&&0!==r.playbackRate?Math.abs(r.playbackRate):1,d=this.bwEstimator?this.bwEstimator.getEstimate():e.abrEwmaDefaultEstimate,l=(n.default.bufferInfo(r,v,e.maxBufferHole).end-v)/g,h=this.findBestLevel(c,f,d,i,l,e.abrBandWidthFactor,e.abrBandWidthUpFactor,a);if(h)return h;t.logger.trace("rebuffering expected to happen, lets try to find a quality level minimizing the rebuffering");var o=e.maxStarvationDelay;if(0===l){var s=this.bitrateTestDelay;s&&(o-=s,t.logger.trace("bitrate test took "+Math.round(1e3*s)+"ms, set first fragment max fetchDuration to "+Math.round(1e3*o)+" ms"))}return this.findBestLevel(c,f,d,i,l+o,e.abrBandWidthFactor,e.abrBandWidthUpFactor,a)},set:function(e){this._nextAutoLevel=e}}]),e}(i.default);o.default=y},{"../errors":21,"../event-handler":22,"../events":23,"../helper/buffer-helper":24,"../utils/logger":38,"./ewma-bandwidth-estimator":6}],4:[function(a,v,i){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function f(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function h(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(i,"__esModule",{value:!0});var c=function(){function e(a,r){for(var t=0;tthis._msDuration&&(t.logger.log("Updating mediasource duration to "+this._levelDuration),e.duration=this._levelDuration,this._msDuration=this._levelDuration)}}}},{key:"doFlush",value:function(){for(;this.flushRange.length;){var r=this.flushRange[0];if(!this.flushBuffer(r.start,r.end))return void(this._needsFlush=!0);this.flushRange.shift(),this.flushBufferCounter=0}if(0===this.flushRange.length){this._needsFlush=!1;var a=0,t=this.sourceBuffer;if(t)for(var i in t)a+=t[i].buffered.length;this.appended=a,this.hls.trigger(e.default.BUFFER_FLUSHED)}}},{key:"doAppending",value:function(){var i=this.hls,s=this.sourceBuffer,n=this.segments;if(s){if(this.media.error)return n=[],void t.logger.error("trying to append although a media error occured, flush segment and abort");for(var l in s)if(s[l].updating)return;if(n.length){var o=n.shift();try{s[o.type].appendBuffer(o.data),this.appendError=0,this.appended++}catch(s){t.logger.error("error while trying to append buffer:"+s.message),n.unshift(o);var a={type:r.ErrorTypes.MEDIA_ERROR};if(22===s.code)return this.segments=[],a.details=r.ErrorDetails.BUFFER_FULL_ERROR,void i.trigger(e.default.ERROR,a);if(this.appendError?this.appendError++:this.appendError=1,a.details=r.ErrorDetails.BUFFER_APPEND_ERROR,a.frag=this.fragCurrent,this.appendError>i.config.appendErrorMaxRetry)return t.logger.log("fail "+i.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),n=[],a.fatal=!0,void i.trigger(e.default.ERROR,a);a.fatal=!1,i.trigger(e.default.ERROR,a)}}}}},{key:"flushBuffer",value:function(l,s){var e,r,o,n,a,i;if(this.flushBufferCounter.5)return this.flushBufferCounter++,t.logger.log("flush "+u+" ["+a+","+i+"], of ["+o+","+n+"], pos:"+this.media.currentTime),e.remove(a,i),!1}else t.logger.warn("abort flushing too many retries");return t.logger.log("buffer flushed"),!0}}]),a}(s.default);i.default=o},{"../errors":21,"../event-handler":22,"../events":23,"../utils/logger":38}],5:[function(e,h,t){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function f(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(a,r){for(var t=0;tthis.autoLevelCapping&&this.hls.streamController.nextLevelSwitch(),this.autoLevelCapping=this.hls.autoLevelCapping)}}},{key:"getMaxLevel",value:function(n){var r=void 0,e=void 0,t=void 0,s=this.mediaWidth,o=this.mediaHeight,a=0,i=0;for(e=0;n>=e&&(t=this.levels[e],r=e,a=t.width,i=t.height,!(a>=s||i>=o));e++);return r}},{key:"contentScaleFactor",get:function(){var e=1;try{e=window.devicePixelRatio}catch(e){}return e}},{key:"mediaWidth",get:function(){var e=void 0;return this.media&&(e=this.media.width||this.media.clientWidth||this.media.offsetWidth,e*=this.contentScaleFactor),e}},{key:"mediaHeight",get:function(){var e=void 0;return this.media&&(e=this.media.height||this.media.clientHeight||this.media.offsetHeight,e*=this.contentScaleFactor),e}}]),e}(s.default);t.default=u},{"../event-handler":22,"../events":23}],6:[function(r,l,e){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function e(a,r){for(var t=0;t=0&&a1e3){r.logger.log("(re)loading playlist for level "+a);var o=i.urlId;this.hls.trigger(t.default.LEVEL_LOADING,{url:i.url[o],level:a,id:o})}}else this.hls.trigger(t.default.ERROR,{type:e.ErrorTypes.OTHER_ERROR,details:e.ErrorDetails.LEVEL_SWITCH_ERROR,level:a,fatal:!1,reason:"invalid level idx"})}},{key:"onError",value:function(n){if(!n.fatal){var i=n.details,o=this.hls,s=void 0,a=void 0,l=!1;switch(i){case e.ErrorDetails.FRAG_LOAD_ERROR:case e.ErrorDetails.FRAG_LOAD_TIMEOUT:case e.ErrorDetails.FRAG_LOOP_LOADING_ERROR:case e.ErrorDetails.KEY_LOAD_ERROR:case e.ErrorDetails.KEY_LOAD_TIMEOUT:s=n.frag.level;break;case e.ErrorDetails.LEVEL_LOAD_ERROR:case e.ErrorDetails.LEVEL_LOAD_TIMEOUT:s=n.level,l=!0}if(void 0!==s)if(a=this._levels[s],a.urlIde&&(this._level===e&&void 0!==t[e].details||this.setLevelInternal(e))}},{key:"manualLevel",get:function(){return this._manualLevel},set:function(e){this._manualLevel=e,void 0===this._startLevel&&(this._startLevel=e),-1!==e&&(this.level=e)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(e){this._firstLevel=e}},{key:"startLevel",get:function(){return void 0===this._startLevel?this._firstLevel:this._startLevel},set:function(e){this._startLevel=e}},{key:"nextLoadLevel",get:function(){return-1!==this._manualLevel?this._manualLevel:this.hls.abrController.nextAutoLevel},set:function(e){this.level=e,-1===this._manualLevel&&(this.hls.abrController.nextAutoLevel=e)}}]),a}(f.default);i.default=o},{"../errors":21,"../event-handler":22,"../events":23,"../utils/logger":38}],8:[function(i,A,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function h(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function v(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(o,"__esModule",{value:!0});var m=function(){function e(a,r){for(var t=0;t0?(t.logger.log("configure startPosition @"+a),this.lastPaused||(t.logger.log("resuming video"),r.play()),this.state=e.IDLE):(this.lastCurrentTime=this.startPosition?this.startPosition:i,this.state=e.STARTING),this.nextLoadPosition=this.startPosition=this.lastCurrentTime,this.tick()}else t.logger.warn("cannot start loading as manifest not parsed yet"),this.state=e.STOPPED}},{key:"stopLoad",value:function(){var t=this.fragCurrent;t&&(t.loader&&t.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=e.STOPPED}},{key:"tick",value:function(){this.ticks++,1===this.ticks&&(this.doTick(),this.ticks>1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){var R,l,n,c=this.hls,o=c.config,h=this.media,b=h&&h.seeking;switch(this.state){case e.ERROR:case e.PAUSED:break;case e.STARTING:var _=c.startLevel;-1===_&&(_=0,this.fragBitrateTest=!0),this.level=c.nextLoadLevel=_,this.state=e.WAITING_LEVEL,this.loadedmetadata=!1;break;case e.IDLE:if(!h&&(this.startFragRequested||!o.startFragPrefetch))break;R=this.loadedmetadata?h.currentTime:this.nextLoadPosition,l=c.nextLoadLevel;var v,T=s.default.bufferInfo(h,R,o.maxBufferHole),P=T.len,f=T.end,u=this.fragPrevious;if(this.levels[l].hasOwnProperty("bitrate")?(v=Math.max(8*o.maxBufferSize/this.levels[l].bitrate,o.maxBufferLength),v=Math.min(v,o.maxMaxBufferLength)):v=o.maxBufferLength,v>P){if(c.nextLoadLevel=l,this.level=l,n=this.levels[l].details,"undefined"==typeof n||n.live&&this.levelLastLoaded!==l){this.state=e.WAITING_LEVEL;break}if(!n.live&&u&&u.sn===n.endSN&&(!b||h.duration-f<=u.duration/2)){this.hls.trigger(r.default.BUFFER_EOS),this.state=e.ENDED;break}var d=n.fragments,g=d.length,m=d[0].start,E=d[g-1].start+d[g-1].duration,i=void 0;if(n.live){var D=void 0!==o.liveMaxLatencyDuration?o.liveMaxLatencyDuration:o.liveMaxLatencyDurationCount*n.targetduration;if(fy&&(h.currentTime=y)}if(n.PTSKnown&&f>E)break;if(this.startFragRequested&&!n.PTSKnown){if(u){var A=u.sn+1;A>=n.startSN&&A<=n.endSN&&(i=d[A-n.startSN],t.logger.log("live playlist, switching playlist, load frag with next SN: "+i.sn))}i||(i=d[Math.min(g-1,Math.round(g/2))],t.logger.log("live playlist, switching playlist, unknown, load middle frag : "+i.sn))}}else m>f&&(i=d[0]);if(i||!function(){var e=o.maxFragLookUpTolerance;E>f?((f>E-e||b)&&(e=0),i=p.default.search(d,function(t){return t.start+t.duration-e<=f?1:t.start-e>f?-1:0})):i=d[g-1]}(),i){if(m=i.start,u&&i.level===u.level&&i.sn===u.sn){if(!(i.sno.maxBufferHole&&u.dropped?(i=d[k-1],t.logger.warn("SN just loaded, with large PTS gap between audio and video, maybe frag is not starting with a keyframe ? load previous one to try to overcome this"),u.loadCounter--):(i=d[k+1],t.logger.log("SN just loaded, load next one: "+i.sn)),!i)break}if(null!=i.decryptdata.uri&&null==i.decryptdata.key)t.logger.log("Loading key for "+i.sn+" of ["+n.startSN+" ,"+n.endSN+"],level "+l),this.state=e.KEY_LOADING,c.trigger(r.default.KEY_LOADING,{frag:i});else{if(t.logger.log("Loading "+i.sn+" of ["+n.startSN+" ,"+n.endSN+"],level "+l+", currentTime:"+R+",bufferEnd:"+f.toFixed(3)),void 0!==this.fragLoadIdx?this.fragLoadIdx++:this.fragLoadIdx=0,i.loadCounter){i.loadCounter++;var S=o.fragLoadingLoopThreshold;if(i.loadCounter>S&&Math.abs(this.fragLoadIdx-i.loadIdx)=w||b)&&(t.logger.log("mediaController: retryDate reached, switch back to IDLE state"),this.state=e.IDLE);break;case e.STOPPED:case e.FRAG_LOADING:case e.PARSING:case e.PARSED:case e.ENDED:}this._checkBuffer(),this._checkFragmentChanged()}},{key:"getBufferRange",value:function(a){var e,t,r=this.bufferRange;if(r)for(e=r.length-1;e>=0;e--)if(t=r[e],a>=t.start&&a<=t.end)return t;return null}},{key:"followingBufferRange",value:function(e){return e?this.getBufferRange(e.end+.5):null}},{key:"isBuffered",value:function(r){var a=this.media;if(a)for(var t=a.buffered,e=0;e=t.start(e)&&r<=t.end(e))return!0;return!1}},{key:"_checkFragmentChanged",value:function(){var t,e,a=this.media;if(a&&a.seeking===!1&&(e=a.currentTime,e>a.playbackRate*this.lastCurrentTime&&(this.lastCurrentTime=e),this.isBuffered(e)?t=this.getBufferRange(e):this.isBuffered(e+.1)&&(t=this.getBufferRange(e+.1)),t)){var i=t.frag;i!==this.fragPlaying&&(this.fragPlaying=i,this.hls.trigger(r.default.FRAG_CHANGED,{frag:i}))}}},{key:"immediateLevelSwitch",value:function(){if(t.logger.log("immediateLevelSwitch"),!this.immediateSwitch){this.immediateSwitch=!0;var a=this.media,i=void 0;a?(i=a.paused,a.pause()):i=!0,this.previouslyPaused=i}var n=this.fragCurrent;n&&n.loader&&n.loader.abort(),this.fragCurrent=null,this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.state=e.PAUSED,this.hls.trigger(r.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY})}},{key:"immediateLevelSwitchEnd",value:function(){this.immediateSwitch=!1;var e=this.media;e&&e.readyState&&(e.currentTime-=1e-4,this.previouslyPaused||e.play())}},{key:"nextLevelSwitch",value:function(){var t=this.media;if(t&&t.readyState){var n=void 0,i=void 0,a=void 0;if(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,i=this.getBufferRange(t.currentTime),i&&i.start>1&&(this.state=e.PAUSED,this.hls.trigger(r.default.BUFFER_FLUSHING,{startOffset:0,endOffset:i.start-1})),t.paused)n=0;else{var l=this.hls.nextLoadLevel,u=this.levels[l],o=this.fragLastKbps;n=o&&this.fragCurrent?this.fragCurrent.duration*u.bitrate/(1e3*o)+1:0}if(a=this.getBufferRange(t.currentTime+n),a&&(a=this.followingBufferRange(a))){var s=this.fragCurrent;s&&s.loader&&s.loader.abort(),this.fragCurrent=null,this.state=e.PAUSED,this.hls.trigger(r.default.BUFFER_FLUSHING,{startOffset:a.start,endOffset:Number.POSITIVE_INFINITY})}}}},{key:"onMediaAttached",value:function(r){var e=this.media=r.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),this.onvended=this.onMediaEnded.bind(this),e.addEventListener("seeking",this.onvseeking),e.addEventListener("seeked",this.onvseeked),e.addEventListener("ended",this.onvended);var t=this.config;this.levels&&t.autoStartLoad&&this.hls.startLoad(t.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(t.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var r=this.levels;r&&r.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("seeked",this.onvseeked),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){if(this.state===e.FRAG_LOADING){if(0===s.default.bufferInfo(this.media,this.media.currentTime,this.config.maxBufferHole).len){t.logger.log("seeking outside of buffer while fragment load in progress, cancel fragment load");var r=this.fragCurrent;r&&(r.loader&&r.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.state=e.IDLE}}else this.state===e.ENDED&&(this.state=e.IDLE);this.media&&(this.lastCurrentTime=this.media.currentTime),void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold),this.tick()}},{key:"onMediaSeeked",value:function(){this.tick()}},{key:"onMediaEnded",value:function(){t.logger.log("media ended"),this.startPosition=this.lastCurrentTime=0}},{key:"onManifestLoading",value:function(){t.logger.log("trigger BUFFER_RESET"),this.hls.trigger(r.default.BUFFER_RESET),this.bufferRange=[],this.stalled=!1}},{key:"onManifestParsed",value:function(r){var e,a=!1,i=!1;r.levels.forEach(function(t){e=t.audioCodec,e&&(-1!==e.indexOf("mp4a.40.2")&&(a=!0),-1!==e.indexOf("mp4a.40.5")&&(i=!0))}),this.audioCodecSwitch=a&&i,this.audioCodecSwitch&&t.logger.log("both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=r.levels,this.startLevelLoaded=!1,this.startFragRequested=!1;var n=this.config;n.autoStartLoad&&this.hls.startLoad(n.startPosition)}},{key:"onLevelLoaded",value:function(o){var a=o.details,i=o.level,l=this.levels[i],d=a.totalduration,n=0;if(t.logger.log("level "+i+" loaded ["+a.startSN+","+a.endSN+"],duration:"+d),this.levelLastLoaded=i,a.live){var f=l.details;f?(u.default.mergeDetails(f,a),n=a.fragments[0].start,a.PTSKnown?t.logger.log("live playlist sliding:"+n.toFixed(3)):t.logger.log("live playlist - outdated PTS, unknown sliding")):(a.PTSKnown=!1,t.logger.log("live playlist - first load, unknown sliding"))}else a.PTSKnown=!1;if(l.details=a,this.hls.trigger(r.default.LEVEL_UPDATED,{details:a,level:i}),this.startFragRequested===!1){if(-1===this.startPosition){var s=a.startTimeOffset;if(isNaN(s))if(a.live){var h=void 0!==this.config.liveSyncDuration?this.config.liveSyncDuration:this.config.liveSyncDurationCount*a.targetduration;this.startPosition=Math.max(0,n+d-h)}else this.startPosition=0;else t.logger.log("start time offset found in playlist, adjust startPosition to "+s),this.startPosition=s}this.nextLoadPosition=this.startPosition}this.state===e.WAITING_LEVEL&&(this.state=e.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===e.KEY_LOADING&&(this.state=e.IDLE,this.tick())}},{key:"onFragLoaded",value:function(n){var a=this.fragCurrent,s=n.frag;if(this.state===e.FRAG_LOADING&&a&&s.level===a.level&&s.sn===a.sn){var o=n.stats;if(t.logger.log("Loaded "+a.sn+" of level "+a.level),this.fragBitrateTest=!1,s.bitrateTest===!0&&this.hls.nextLoadLevel)this.state=e.IDLE,this.startFragRequested=!1,o.tparsed=o.tbuffered=performance.now(),this.hls.trigger(r.default.FRAG_BUFFERED,{stats:n.stats,frag:a}),this.tick();else{this.state=e.PARSING,this.stats=o;var l=this.levels[this.level],u=l.details,v=u.totalduration,c=void 0===a.startDTS||isNaN(a.startDTS)?a.start:a.startDTS,f=a.level,h=a.sn,i=l.audioCodec||this.config.defaultAudioCodec;this.audioCodecSwap&&(t.logger.log("swapping playlist audio codec"),void 0===i&&(i=this.lastAudioCodec),i&&(i=-1!==i.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5")),this.pendingAppending=0,t.logger.log("Demuxing "+h+" of ["+u.startSN+" ,"+u.endSN+"],level "+f+", cc "+a.cc);var d=this.demuxer;d&&d.push(n.payload,i,l.videoCodec,c,a.cc,f,h,v,a.decryptdata)}}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(l){if(this.state===e.PARSING){var o,a,i=l.tracks;if(a=i.audio){var n=this.levels[this.level].audioCodec,u=navigator.userAgent.toLowerCase();n&&this.audioCodecSwap&&(t.logger.log("swapping playlist audio codec"),n=-1!==n.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5"),this.audioCodecSwitch&&1!==a.metadata.channelCount&&-1===u.indexOf("firefox")&&(n="mp4a.40.5"),-1!==u.indexOf("android")&&(n="mp4a.40.2",t.logger.log("Android: force audio codec to"+n)),a.levelCodec=n}if(a=i.video,a&&(a.levelCodec=this.levels[this.level].videoCodec),l.unique){var s={codec:"",levelCodec:""};for(o in l.tracks)a=i[o],s.container=a.container,s.codec&&(s.codec+=",",s.levelCodec+=","),a.codec&&(s.codec+=a.codec),a.levelCodec&&(s.levelCodec+=a.levelCodec);i={audiovideo:s}}this.hls.trigger(r.default.BUFFER_CODECS,i);for(o in i){a=i[o],t.logger.log("track:"+o+",container:"+a.container+",codecs[level/parsed]=["+a.levelCodec+"/"+a.codec+"]");var d=a.initSegment;d&&(this.pendingAppending++,this.hls.trigger(r.default.BUFFER_APPENDING,{type:o,data:d}))}this.tick()}}},{key:"onFragParsingData",value:function(a){var o=this;if(this.state===e.PARSING){this.tparse2=Date.now();var n=this.levels[this.level],i=this.fragCurrent;t.logger.log("parsed "+a.type+",PTS:["+a.startPTS.toFixed(3)+","+a.endPTS.toFixed(3)+"],DTS:["+a.startDTS.toFixed(3)+"/"+a.endDTS.toFixed(3)+"],nb:"+a.nb+",dropped:"+(a.dropped||0));var l=u.default.updateFragPTSDTS(n.details,i.sn,a.startPTS,a.endPTS,a.startDTS,a.endDTS),s=this.hls;s.trigger(r.default.LEVEL_PTS_UPDATED,{details:n.details,level:this.level,drift:l}),"video"===a.type&&(i.dropped=a.dropped),[a.data1,a.data2].forEach(function(e){e&&(o.pendingAppending++,s.trigger(r.default.BUFFER_APPENDING,{type:a.type,data:e}))}),this.nextLoadPosition=a.endPTS,this.bufferRange.push({type:a.type,start:a.startPTS,end:a.endPTS,frag:i}),this.tick()}else t.logger.warn("not in PARSING state but "+this.state+", ignoring FRAG_PARSING_DATA event")}},{key:"onFragParsed",value:function(){this.state===e.PARSING&&(this.stats.tparsed=performance.now(),this.state=e.PARSED,this._checkAppendedParsed())}},{key:"onBufferAppended",value:function(){switch(this.state){case e.PARSING:case e.PARSED:this.pendingAppending--,this._checkAppendedParsed()}}},{key:"_checkAppendedParsed",value:function(){if(this.state===e.PARSED&&0===this.pendingAppending){var i=this.fragCurrent,a=this.stats;i&&(this.fragPrevious=i,a.tbuffered=performance.now(),this.fragLastKbps=Math.round(8*a.length/(a.tbuffered-a.tfirst)),this.hls.trigger(r.default.FRAG_BUFFERED,{stats:a,frag:i}),t.logger.log("media buffered : "+this.timeRangesToString(this.media.buffered)),this.state=e.IDLE),this.tick()}}},{key:"onError",value:function(i){switch(i.details){case a.ErrorDetails.FRAG_LOAD_ERROR:case a.ErrorDetails.FRAG_LOAD_TIMEOUT:if(!i.fatal){var n=this.fragLoadError;if(n?n++:n=1,n<=this.config.fragLoadingMaxRetry||this.media&&this.isBuffered(this.media.currentTime)){this.fragLoadError=n,i.frag.loadCounter=0;var s=Math.min(Math.pow(2,n-1)*this.config.fragLoadingRetryDelay,64e3);t.logger.warn("mediaController: frag loading failed, retry in "+s+" ms"),this.retryDate=performance.now()+s,this.state=e.FRAG_LOADING_WAITING_RETRY}else t.logger.error("mediaController: "+i.details+" reaches max retry, redispatch as fatal ..."),i.fatal=!0,this.hls.trigger(r.default.ERROR,i),this.state=e.ERROR}break;case a.ErrorDetails.FRAG_LOOP_LOADING_ERROR:case a.ErrorDetails.LEVEL_LOAD_ERROR:case a.ErrorDetails.LEVEL_LOAD_TIMEOUT:case a.ErrorDetails.KEY_LOAD_ERROR:case a.ErrorDetails.KEY_LOAD_TIMEOUT:this.state!==e.ERROR&&(this.state=i.fatal?e.ERROR:e.IDLE,t.logger.warn("mediaController: "+i.details+" while loading frag,switch to "+this.state+" state ..."));break;case a.ErrorDetails.BUFFER_FULL_ERROR:this.state!==e.PARSING&&this.state!==e.PARSED||(this.config.maxMaxBufferLength/=2,t.logger.warn("reduce max buffer length to "+this.config.maxMaxBufferLength+"s and switch to IDLE state"),this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.state=e.IDLE)}}},{key:"_checkBuffer",value:function(){var e=this.media;if(e&&e.readyState){var n=e.currentTime,u=e.buffered;if(!this.loadedmetadata&&u.length){this.loadedmetadata=!0;var i=this.startPosition;if(!n&&n!==i&&i){t.logger.log("target start position:"+i);var l=u.start(0),g=u.end(0);(l>i||i>g)&&(i=l,t.logger.log("target start position not buffered, seek to buffered.start(0) "+l)),t.logger.log("adjust currentTime from "+n+" to "+i),e.currentTime=i}}else{var d=s.default.bufferInfo(e,n,0),v=!(e.paused||e.ended||0===e.buffered.length),f=.4,h=n>e.playbackRate*this.lastCurrentTime;if(this.stalled&&h&&(this.stalled=!1,t.logger.log("playback not stuck anymore @"+n)),v&&d.len<=f&&(h?(f=0,this.seekHoleNudgeDuration=0):this.stalled?this.seekHoleNudgeDuration+=this.config.seekHoleNudgeDuration:(this.seekHoleNudgeDuration=0,t.logger.log("playback seems stuck @"+n),this.hls.trigger(r.default.ERROR,{type:a.ErrorTypes.MEDIA_ERROR,details:a.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1}),this.stalled=!0),d.len<=f)){var o=d.nextStart,c=o-n;if(o&&c0){t.logger.log("adjust currentTime from "+e.currentTime+" to next buffered @ "+o+" + nudge "+this.seekHoleNudgeDuration);var p=o+this.seekHoleNudgeDuration-e.currentTime;e.currentTime=o+this.seekHoleNudgeDuration,this.hls.trigger(r.default.ERROR,{type:a.ErrorTypes.MEDIA_ERROR,details:a.ErrorDetails.BUFFER_SEEK_OVER_HOLE,fatal:!1,hole:p})}}}}}},{key:"onFragLoadEmergencyAborted",value:function(){this.state=e.IDLE,this.tick()}},{key:"onBufferFlushed",value:function(){var t,r,a=[];for(r=0;re;e++)r+="["+t.start(e)+","+t.end(e)+"]";return r}},{key:"currentLevel",get:function(){if(this.media){var e=this.getBufferRange(this.media.currentTime);if(e)return e.frag.level}return-1}},{key:"nextBufferRange",get:function(){return this.media?this.followingBufferRange(this.getBufferRange(this.media.currentTime)):null}},{key:"nextLevel",get:function(){var e=this.nextBufferRange;return e?e.frag.level:-1}}]),i}(l.default);o.default=f},{"../demux/demuxer":17,"../errors":21,"../event-handler":22,"../events":23,"../helper/buffer-helper":24,"../helper/level-helper":25,"../utils/binary-search":35,"../utils/logger":38}],9:[function(t,v,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(a,"__esModule",{value:!0});var c=function(){function e(a,r){for(var t=0;te;e++)c[(i[e]=e<<1^283*(e>>7))^e]=e;for(a=r=0;!h[a];a^=u||1,r=c[r]||1)for(t=r^r<<1^r<<2^r<<3^r<<4,t=t>>8^255&t^99,h[a]=t,v[t]=a,d=i[f=i[u=i[a]]],l=16843009*d^65537*f^257*u^16843008*a,s=257*i[t]^16843008*t,e=0;4>e;e++)n[e][a]=s=s<<24^s>>>8,o[e][t]=l=l<<24^l>>>8;for(e=0;5>e;e++)n[e]=n[e].slice(0),o[e]=o[e].slice(0)}},{key:"decrypt",value:function(R,p,_,b,E,m){var h,g,v,n,e=this._key[1],t=R^e[0],a=b^e[1],i=_^e[2],r=p^e[3],y=e.length/4-2,s=4,o=this._tables[1],f=o[0],d=o[1],u=o[2],l=o[3],c=o[4];for(n=0;y>n;n++)h=f[t>>>24]^d[a>>16&255]^u[i>>8&255]^l[255&r]^e[s],g=f[a>>>24]^d[i>>16&255]^u[r>>8&255]^l[255&t]^e[s+1],v=f[i>>>24]^d[r>>16&255]^u[t>>8&255]^l[255&a]^e[s+2],r=f[r>>>24]^d[t>>16&255]^u[a>>8&255]^l[255&i]^e[s+3],s+=4,t=h,a=g,i=v;for(n=0;4>n;n++)E[(3&-n)+m]=c[t>>>24]<<24^c[a>>16&255]<<16^c[i>>8&255]<<8^c[255&r]^e[s++],h=t,t=a,a=i,i=r,r=h}}]),e}();e.default=a},{}],11:[function(t,l,e){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;t>8|e>>>24}},{key:"doDecrypt",value:function(a,g,i){var u,h,o,f,l,c,d,n,e,r=new Int32Array(a.buffer,a.byteOffset,a.byteLength>>2),p=new s.default(Array.prototype.slice.call(g)),v=new Uint8Array(a.byteLength),t=new Int32Array(v.buffer);for(u=~~i[0],h=~~i[1],o=~~i[2],f=~~i[3],e=0;ee&&(255!==t[e]||240!==(240&t[e+1]));e++);for(r.audiosamplerate||(i=o.default.getAudioConfig(this.observer,t,e,p),r.config=i.config,r.audiosamplerate=i.samplerate,r.channelCount=i.channelCount,r.codec=i.codec,r.duration=y,l.logger.log("parsed codec:"+r.codec+",rate:"+i.samplerate+",nb channel:"+i.channelCount)),c=0,g=9216e4/r.audiosamplerate;u>e+5&&(s=1&t[e+1]?7:9,n=(3&t[e+3])<<11|t[e+4]<<3|(224&t[e+5])>>>5,n-=s,n>0&&u>=e+s+n);)for(f=h+c*g,v={unit:t.subarray(e+s,e+s+n),pts:f,dts:f},r.samples.push(v),r.len+=n,e+=n+s,c++;u-1>e&&(255!==t[e]||240!==(240&t[e+1]));e++);this.remuxer.remux(this._aacTrack,{samples:[]},{samples:[{pts:h,dts:h,unit:d.payload}]},{samples:[]},m)}},{key:"destroy",value:function(){}}],[{key:"probe",value:function(t){var e,r,i=new a.default(t);if(i.hasTimeStamp)for(e=i.length,r=t.length;r-1>e;e++)if(255===t[e]&&240===(240&t[e+1]))return!0;return!1}}]),e}();t.default=s},{"../demux/id3":19,"../utils/logger":38,"./adts":14}],14:[function(e,o,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;t>>6)+1,e=(60&u[l+2])>>>2,e>d.length-1?void h.trigger(Event.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+e}):(o=(1&u[l+2])<<2,o|=(192&u[l+3])>>>6,n.logger.log("manifest codec:"+i+",ADTS data:type:"+a+",sampleingIndex:"+e+"["+d[e]+"Hz],channelConfig:"+o),-1!==f.indexOf("firefox")?e>=6?(a=5,t=new Array(4),s=e-3):(a=2,t=new Array(2),s=e):-1!==f.indexOf("android")?(a=2,t=new Array(2),s=e):(a=5,t=new Array(4),i&&(-1!==i.indexOf("mp4a.40.29")||-1!==i.indexOf("mp4a.40.5"))||!i&&e>=6?s=e-3:((i&&-1!==i.indexOf("mp4a.40.2")&&e>=6&&1===o||!i&&1===o)&&(a=2,t=new Array(2)),s=e)),t[0]=a<<3,t[0]|=(14&e)>>1,t[1]|=(1&e)<<7,t[1]|=o<<3,5===a&&(t[1]|=(14&s)>>1,t[2]=(1&s)<<7,t[2]|=8,t[3]=0),{config:t,samplerate:d[e],channelCount:o,codec:"mp4a.40."+a})}}]),e}();t.default=s},{"../errors":21,"../utils/logger":38}],15:[function(e,y,a){"use strict";function t(e){return e&&e.__esModule?e:{default:e}}function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(a,"__esModule",{value:!0});var h=function(){function e(a,r){for(var t=0;t1?r-1:0),e=1;r>e;e++)i[e-1]=arguments[e];t.emit.apply(t,[a,a].concat(i))},t.off=function(i){for(var r=arguments.length,a=Array(r>1?r-1:0),e=1;r>e;e++)a[e-1]=arguments[e];t.removeListener.apply(t,[i].concat(a))},r.addEventListener("message",function(a){var e=a.data;switch(e.cmd){case"init":r.demuxer=new u.default(t,e.typeSupported);break;case"demux":r.demuxer.push(new Uint8Array(e.data),e.audioCodec,e.videoCodec,e.timeOffset,e.cc,e.level,e.sn,e.duration)}}),t.on(e.default.FRAG_PARSING_INIT_SEGMENT,function(t,e){r.postMessage({event:t,tracks:e.tracks,unique:e.unique})}),t.on(e.default.FRAG_PARSING_DATA,function(a,e){var t={event:a,type:e.type,startPTS:e.startPTS,endPTS:e.endPTS,startDTS:e.startDTS,endDTS:e.endDTS,data1:e.data1.buffer,data2:e.data2.buffer,nb:e.nb,dropped:e.dropped};r.postMessage(t,[t.data1,t.data2])}),t.on(e.default.FRAG_PARSED,function(e){r.postMessage({event:e})}),t.on(e.default.ERROR,function(e,t){r.postMessage({event:e,data:t})}),t.on(e.default.FRAG_PARSING_METADATA,function(e,t){var a={event:e,samples:t.samples};r.postMessage(a)}),t.on(e.default.FRAG_PARSING_USERDATA,function(e,t){var a={event:e,samples:t.samples};r.postMessage(a)})};a.default=o},{"../demux/demuxer-inline":15,"../events":23,events:1}],17:[function(t,p,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(a,"__esModule",{value:!0});var u=function(){function e(a,r){for(var t=0;t0&&null!=e&&null!=e.key&&"AES-128"===e.method){null==this.decrypter&&(this.decrypter=new v.default(this.hls));var u=this;this.decrypter.decrypt(t,e.key,e.iv,function(e){u.pushDecrypted(e,r,a,i,n,s,o,l)})}else this.pushDecrypted(t,r,a,i,n,s,o,l)}},{key:"onWorkerMessage",value:function(a){var t=a.data;switch(t.event){case e.default.FRAG_PARSING_INIT_SEGMENT:var r={};r.tracks=t.tracks,r.unique=t.unique,this.hls.trigger(e.default.FRAG_PARSING_INIT_SEGMENT,r);break;case e.default.FRAG_PARSING_DATA:this.hls.trigger(e.default.FRAG_PARSING_DATA,{data1:new Uint8Array(t.data1),data2:new Uint8Array(t.data2),startPTS:t.startPTS,endPTS:t.endPTS,startDTS:t.startDTS,endDTS:t.endDTS,type:t.type,nb:t.nb,dropped:t.dropped});break;case e.default.FRAG_PARSING_METADATA:this.hls.trigger(e.default.FRAG_PARSING_METADATA,{samples:t.samples});break;case e.default.FRAG_PARSING_USERDATA:this.hls.trigger(e.default.FRAG_PARSING_USERDATA,{samples:t.samples});break;default:this.hls.trigger(t.event,t.data)}}}]),r}();a.default=o},{"../crypt/decrypter":12,"../demux/demuxer-inline":15,"../demux/demuxer-worker":16,"../errors":21,"../events":23,"../utils/logger":38,webworkify:2}],18:[function(t,s,e){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function e(a,r){for(var t=0;te?(this.word<<=e,this.bitsAvailable-=e):(e-=this.bitsAvailable,t=e>>3,e-=t>>3,this.bytesAvailable-=t,this.loadWord(),this.word<<=e,this.bitsAvailable-=e)}},{key:"readBits",value:function(t){var e=Math.min(this.bitsAvailable,t),r=this.word>>>32-e;return t>32&&i.logger.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=e,this.bitsAvailable>0?this.word<<=e:this.bytesAvailable>0&&this.loadWord(),e=t-e,e>0?r<>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()}},{key:"skipUEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"skipEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"readUEG",value:function(){var e=this.skipLZ();return this.readBits(e+1)-1}},{key:"readEG",value:function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)}},{key:"readBoolean",value:function(){return 1===this.readBits(1)}},{key:"readUByte",value:function(){return this.readBits(8)}},{key:"readUShort",value:function(){return this.readBits(16)}},{key:"readUInt",value:function(){return this.readBits(32)}},{key:"skipScalingList",value:function(i){var t,a,r=8,e=8;for(t=0;i>t;t++)0!==e&&(a=this.readEG(),e=(r+a+256)%256),r=0===e?r:e}},{key:"readSPS",value:function(){var t,g,p,l,i,n,a,o,r,s=0,d=0,f=0,h=0,c=1;if(this.readUByte(),t=this.readUByte(),g=this.readBits(5),this.skipBits(3),p=this.readUByte(),this.skipUEG(),100===t||110===t||122===t||244===t||44===t||83===t||86===t||118===t||128===t){var v=this.readUEG();if(3===v&&this.skipBits(1),this.skipUEG(),this.skipUEG(),this.skipBits(1),this.readBoolean())for(o=3!==v?8:12,r=0;o>r;r++)this.readBoolean()&&(6>r?this.skipScalingList(16):this.skipScalingList(64))}this.skipUEG();var u=this.readUEG();if(0===u)this.readUEG();else if(1===u)for(this.skipBits(1),this.skipEG(),this.skipEG(),l=this.readUEG(),r=0;l>r;r++)this.skipEG();if(this.skipUEG(),this.skipBits(1),i=this.readUEG(),n=this.readUEG(),a=this.readBits(1),0===a&&this.skipBits(1),this.skipBits(1),this.readBoolean()&&(s=this.readUEG(),d=this.readUEG(),f=this.readUEG(),h=this.readUEG()),this.readBoolean()&&this.readBoolean()){var e=void 0,y=this.readUByte();switch(y){case 1:e=[1,1];break;case 2:e=[12,11];break;case 3:e=[10,11];break;case 4:e=[16,11];break;case 5:e=[40,33];break;case 6:e=[24,11];break;case 7:e=[20,11];break;case 8:e=[32,11];break;case 9:e=[80,33];break;case 10:e=[18,11];break;case 11:e=[15,11];break;case 12:e=[64,33];break;case 13:e=[160,99];break;case 14:e=[4,3];break;case 15:e=[3,2];break;case 16:e=[2,1];break;case 255:e=[this.readUByte()<<8|this.readUByte(),this.readUByte()<<8|this.readUByte()]}e&&(c=e[0]/e[1])}return{width:Math.ceil((16*(i+1)-2*s-2*d)*c),height:(2-a)*(n+1)*16-(a?2:4)*(f+h)}}},{key:"readSliceType",value:function(){return this.readUByte(),this.readUEG(),this.readUEG()}}]),e}();e.default=n},{"../utils/logger":38}],19:[function(r,s,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;tr);return t}},{key:"_parseID3Frames",value:function(r,t,n){for(var i,s,o,l,a;n>=t+8;)switch(i=this.readUTF(r,t,4),t+=4,s=r[t++]<<24+r[t++]<<16+r[t++]<<8+r[t++],l=r[t++]<<8+r[t++],o=t,i){case"PRIV":if("com.apple.streaming.transportStreamTimestamp"===this.readUTF(r,t,44)){t+=44,t+=4;var u=1&r[t++];this._hasTimeStamp=!0,a=((r[t++]<<23)+(r[t++]<<15)+(r[t++]<<7)+r[t++])/45,u&&(a+=47721858.84),a=Math.round(a),e.logger.trace("ID3 timestamp found: "+a),this._timeStamp=a}}}},{key:"hasTimeStamp",get:function(){return this._hasTimeStamp}},{key:"timeStamp",get:function(){return this._timeStamp}},{key:"length",get:function(){return this._length}},{key:"payload",get:function(){return this._payload}}]),t}();t.default=n},{"../utils/logger":38}],20:[function(t,v,i){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var f=function(){function e(a,r){for(var t=0;tt;t+=188)if(71===a[t]){if(d=!!(64&a[t+1]),u=((31&a[t+1])<<8)+a[t+2],y=(48&a[t+3])>>4,y>1){if(i=t+5+a[t+4],i===t+188)continue}else i=t+4;if(g)if(u===h){if(d){if(s&&(this._parseAVCPES(this._parsePES(s)),b&&this._avcTrack.codec&&(-1===f||this._aacTrack.codec)))return void this.remux(a);s={data:[],size:0}}s&&(s.data.push(a.subarray(i,t+188)),s.size+=t+188-i)}else if(u===f){if(d){if(o&&(this._parseAACPES(this._parsePES(o)),b&&this._aacTrack.codec&&(-1===h||this._avcTrack.codec)))return void this.remux(a);o={data:[],size:0}}o&&(o.data.push(a.subarray(i,t+188)),o.size+=t+188-i)}else u===_&&(d&&(l&&this._parseID3PES(this._parsePES(l)),l={data:[],size:0}),l&&(l.data.push(a.subarray(i,t+188)),l.size+=t+188-i));else d&&(i+=a[i]+1),0===u?this._parsePAT(a,i):u===this._pmtId?(this._parsePMT(a,i),g=this.pmtParsed=!0,h=this._avcTrack.id,f=this._aacTrack.id,_=this._id3Track.id,v&&(e.logger.log("reparse from beginning"),v=!1,t=-188)):(e.logger.log("unknown PID found before PAT/PMT"),v=!0)}else this.observer.trigger(n.default.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"TS packet did not start with 0x47"});s&&this._parseAVCPES(this._parsePES(s)),o&&this._parseAACPES(this._parsePES(o)),l&&this._parseID3PES(this._parsePES(l)),this.remux(null)}},{key:"remux",value:function(e){this.remuxer.remux(this._aacTrack,this._avcTrack,this._id3Track,this._txtTrack,this.timeOffset,this.contiguous,e)}},{key:"destroy",value:function(){this.switchLevel(),this._initPTS=this._initDTS=void 0,this._duration=0}},{key:"_parsePAT",value:function(e,t){this._pmtId=(31&e[t+10])<<8|e[t+11]}},{key:"_parsePMT",value:function(r,t){var i,n,s,a;for(i=(15&r[t+1])<<8|r[t+2],n=t+3+i-4,s=(15&r[t+10])<<8|r[t+11],t+=12+s;n>t;){switch(a=(31&r[t+1])<<8|r[t+2],r[t]){case 15:this._aacTrack.id=a;break;case 21:this._id3Track.id=a;break;case 27:this._avcTrack.id=a;break;default:e.logger.log("unkown stream type:"+r[t])}t+=((15&r[t+3])<<8|r[t+4])+5}}},{key:"_parsePES",value:function(o){var e,n,h,d,u,l,a,r,t,f=0,s=o.data;if(e=s[0],h=(e[0]<<16)+(e[1]<<8)+e[2],1===h){for(d=(e[4]<<8)+e[5],n=e[7],192&n&&(a=536870912*(14&e[9])+4194304*(255&e[10])+16384*(254&e[11])+128*(255&e[12])+(254&e[13])/2,a>4294967295&&(a-=8589934592),64&n?(r=536870912*(14&e[14])+4194304*(255&e[15])+16384*(254&e[16])+128*(255&e[17])+(254&e[18])/2,r>4294967295&&(r-=8589934592)):r=a),u=e[8],t=u+9,o.size-=t,l=new Uint8Array(o.size);s.length;){e=s.shift();var i=e.byteLength;if(t){if(t>i){t-=i;continue}e=e.subarray(t),i-=t,t=0}l.set(e,f),f+=i}return{data:l,pts:a,dts:r,len:d}}return null}},{key:"_parseAVCPES",value:function(a){var t,m,n,o,y=this,r=this._avcTrack,u=r.samples,p=this._parseAVCNALu(a.data),d=[],l=!1,c=!1,f=0;if(0===p.length&&u.length>0){var v=u[u.length-1],h=v.units.units[v.units.units.length-1],g=new Uint8Array(h.data.byteLength+a.data.byteLength);g.set(h.data,0),g.set(a.data,h.data.byteLength),h.data=g,v.units.length+=a.data.byteLength,r.len+=a.data.byteLength}a.data=null;var i="",E=function(){d.length&&(c===!0||r.sps&&(u.length||this.contiguous)?(m={units:{units:d,length:f},pts:a.pts,dts:a.dts,key:c},u.push(m),r.len+=f,r.nbNalu+=d.length):r.dropped++,d=[],f=0)}.bind(this);p.forEach(function(e){switch(e.type){case 1:n=!0,l&&(i+="NDR ");break;case 5:n=!0,l&&(i+="IDR "),c=!0;break;case 6:n=!0,l&&(i+="SEI "),t=new s.default(e.data),t.readUByte();var b=t.readUByte();if(4===b){var g=0;do g=t.readUByte();while(255===g);var A=t.readUByte();if(181===A){var R=t.readUShort();if(49===R){var T=t.readUInt();if(1195456820===T){var k=t.readUByte();if(3===k){var v=t.readUByte(),_=t.readUByte(),S=31&v,h=[v,_];for(o=0;S>o;o++)h.push(t.readUByte()),h.push(t.readUByte()),h.push(t.readUByte());y._txtTrack.samples.push({type:3,pts:a.pts,bytes:h})}}}}}break;case 7:if(n=!0,l&&(i+="SPS "),!r.sps){t=new s.default(e.data);var p=t.readSPS();r.width=p.width,r.height=p.height,r.sps=[e.data],r.duration=y._duration;var L=e.data.subarray(1,4),m="avc1.";for(o=0;3>o;o++){var u=L[o].toString(16);u.length<2&&(u="0"+u),m+=u}r.codec=m}break;case 8:n=!0,l&&(i+="PPS "),r.pps||(r.pps=[e.data]);break;case 9:n=!1,l&&(i+="AUD "),E();break;default:n=!1,i+="unknown NAL "+e.type+" "}n&&(d.push(e),f+=e.data.byteLength)}),(l||i.length)&&e.logger.log(i),E()}},{key:"_parseAVCNALu",value:function(r){for(var s,a,l,_,n,d,t=0,g=r.byteLength,e=this.avcNaluState,v=[];g>t;)switch(s=r[t++],e){case 0:0===s&&(e=1);break;case 1:e=0===s?2:0;break;case 2:case 3:if(0===s)e=3;else if(1===s&&g>t){if(_=31&r[t],n)l={data:r.subarray(n,t-e-1),type:d},v.push(l);else{var i=this.avcNaluState;if(i&&4-i>=t){var m=this._avcTrack,c=m.samples;if(c.length){var p=c[c.length-1],R=p.units.units,u=R[R.length-1];u.state&&(u.data=u.data.subarray(0,u.data.byteLength-i),p.units.length-=i,m.len-=i)}}if(a=t-e-1,a>0){var y=this._avcTrack,h=y.samples;if(h.length){var E=h[h.length-1],b=E.units.units,o=b[b.length-1],f=new Uint8Array(o.data.byteLength+a);f.set(o.data,0),f.set(r.subarray(0,a),o.data.byteLength),o.data=f,E.units.length+=a,y.len+=a}}}n=t,d=_,e=0}else e=0}return n&&(l={data:r.subarray(n,g),type:d,state:e},v.push(l),this.avcNaluState=e),v}},{key:"_parseAACPES",value:function(R){var l,o,p,E,t,d,f,s,_,i=this._aacTrack,a=R.data,v=R.pts,L=0,T=this._duration,A=this.audioCodec,u=this.aacOverFlow,b=this.aacLastPTS;if(u){var m=new Uint8Array(u.byteLength+a.byteLength);m.set(u,0),m.set(a,u.byteLength),a=m}for(t=L,s=a.length;s-1>t&&(255!==a[t]||240!==(240&a[t+1]));t++);if(t){var y,h;if(s-1>t?(y="AAC PES did not start with ADTS header,offset:"+t,h=!1):(y="no ADTS header found in AAC PES",h=!0),this.observer.trigger(n.default.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:h,reason:y}),h)return}if(i.audiosamplerate||(l=c.default.getAudioConfig(this.observer,a,t,A),i.config=l.config,i.audiosamplerate=l.samplerate,i.channelCount=l.channelCount,i.codec=l.codec,i.duration=T,e.logger.log("parsed codec:"+i.codec+",rate:"+l.samplerate+",nb channel:"+l.channelCount)),E=0,p=9216e4/i.audiosamplerate,u&&b){var g=b+p;Math.abs(g-v)>1&&(e.logger.log("AAC: align PTS for overlapping frames by "+Math.round((g-v)/90)),v=g)}for(;s>t+5&&(d=1&a[t+1]?7:9,o=(3&a[t+3])<<11|a[t+4]<<3|(224&a[t+5])>>>5,o-=d,o>0&&s>=t+d+o);)for(f=v+E*p,_={unit:a.subarray(t+d,t+d+o),pts:f,dts:f},i.samples.push(_),i.len+=o,t+=o+d,E++;s-1>t&&(255!==a[t]||240!==(240&a[t+1]));t++);u=s>t?a.subarray(t,s):null,this.aacOverFlow=u,this.aacLastPTS=f}},{key:"_parseID3PES",value:function(e){this._id3Track.samples.push(e)}}],[{key:"probe",value:function(e){return e.length>=564&&71===e[0]&&71===e[188]&&71===e[376]}}]),t}();i.default=o},{"../errors":21,"../events":23,"../utils/logger":38,"./adts":14,"./exp-golomb":18}],21:[function(t,r,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.ErrorTypes={NETWORK_ERROR:"networkError",MEDIA_ERROR:"mediaError",OTHER_ERROR:"otherError"},e.ErrorDetails={MANIFEST_LOAD_ERROR:"manifestLoadError",MANIFEST_LOAD_TIMEOUT:"manifestLoadTimeOut",MANIFEST_PARSING_ERROR:"manifestParsingError",MANIFEST_INCOMPATIBLE_CODECS_ERROR:"manifestIncompatibleCodecsError",LEVEL_LOAD_ERROR:"levelLoadError",LEVEL_LOAD_TIMEOUT:"levelLoadTimeOut",LEVEL_SWITCH_ERROR:"levelSwitchError",FRAG_LOAD_ERROR:"fragLoadError",FRAG_LOOP_LOADING_ERROR:"fragLoopLoadingError",FRAG_LOAD_TIMEOUT:"fragLoadTimeOut",FRAG_DECRYPT_ERROR:"fragDecryptError",FRAG_PARSING_ERROR:"fragParsingError",KEY_LOAD_ERROR:"keyLoadError",KEY_LOAD_TIMEOUT:"keyLoadTimeOut",BUFFER_APPEND_ERROR:"bufferAppendError",BUFFER_APPENDING_ERROR:"bufferAppendingError",BUFFER_STALLED_ERROR:"bufferStalledError",BUFFER_FULL_ERROR:"bufferFullError",BUFFER_SEEK_OVER_HOLE:"bufferSeekOverHole",INTERNAL_EXCEPTION:"internalException"}},{}],22:[function(e,f,t){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},d=function(){function e(a,r){for(var t=0;t1?r-1:0),t=1;r>t;t++)a[t-1]=arguments[t];this.handledEvents=a,this.useGenericHandler=!0,this.registerListeners()}return d(e,[{key:"destroy",value:function(){this.unregisterListeners()}},{key:"isEventHandler",value:function(){return"object"===n(this.handledEvents)&&this.handledEvents.length&&"function"==typeof this.onEvent}},{key:"registerListeners",value:function(){this.isEventHandler()&&this.handledEvents.forEach(function(e){if("hlsEventGeneric"===e)throw new Error("Forbidden event name: "+e);this.hls.on(e,this.onEvent)}.bind(this))}},{key:"unregisterListeners",value:function(){this.isEventHandler()&&this.handledEvents.forEach(function(e){this.hls.off(e,this.onEvent)}.bind(this))}},{key:"onEvent",value:function(e,t){this.onEventGeneric(e,t)}},{key:"onEventGeneric",value:function(e,t){var a=function(t,r){var e="on"+t.replace("hls","");if("function"!=typeof this[e])throw new Error("Event "+t+" has no generic handler in this "+this.constructor.name+" class (tried "+e+")");return this[e].bind(this,r)};try{a.call(this,e,t).call()}catch(t){o.logger.error("internal error happened while processing "+e+":"+t.message),this.hls.trigger(s.default.ERROR,{type:r.ErrorTypes.OTHER_ERROR,details:r.ErrorDetails.INTERNAL_EXCEPTION,fatal:!1,event:e,err:t})}}}]),e}();t.default=l},{"./errors":21,"./events":23,"./utils/logger":38}],23:[function(t,e,r){"use strict";e.exports={MEDIA_ATTACHING:"hlsMediaAttaching",MEDIA_ATTACHED:"hlsMediaAttached",MEDIA_DETACHING:"hlsMediaDetaching",MEDIA_DETACHED:"hlsMediaDetached",BUFFER_RESET:"hlsBufferReset",BUFFER_CODECS:"hlsBufferCodecs",BUFFER_APPENDING:"hlsBufferAppending",BUFFER_APPENDED:"hlsBufferAppended",BUFFER_EOS:"hlsBufferEos",BUFFER_FLUSHING:"hlsBufferFlushing",BUFFER_FLUSHED:"hlsBufferFlushed",MANIFEST_LOADING:"hlsManifestLoading",MANIFEST_LOADED:"hlsManifestLoaded",MANIFEST_PARSED:"hlsManifestParsed",LEVEL_LOADING:"hlsLevelLoading",LEVEL_LOADED:"hlsLevelLoaded",LEVEL_UPDATED:"hlsLevelUpdated",LEVEL_PTS_UPDATED:"hlsLevelPtsUpdated",LEVEL_SWITCH:"hlsLevelSwitch",FRAG_LOADING:"hlsFragLoading",FRAG_LOAD_PROGRESS:"hlsFragLoadProgress",FRAG_LOAD_EMERGENCY_ABORTED:"hlsFragLoadEmergencyAborted",FRAG_LOADED:"hlsFragLoaded",FRAG_PARSING_INIT_SEGMENT:"hlsFragParsingInitSegment",FRAG_PARSING_USERDATA:"hlsFragParsingUserdata",FRAG_PARSING_METADATA:"hlsFragParsingMetadata",FRAG_PARSING_DATA:"hlsFragParsingData",FRAG_PARSED:"hlsFragParsed",FRAG_BUFFERED:"hlsFragBuffered",FRAG_CHANGED:"hlsFragChanged",FPS_DROP:"hlsFpsDrop",ERROR:"hlsError",DESTROYING:"hlsDestroying",KEY_LOADING:"hlsKeyLoading",KEY_LOADED:"hlsKeyLoaded"}},{}],24:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;td&&(t[u-1].end=r[e].end):t.push(r[e])}else t.push(r[e])}for(e=0,o=0,l=i=a;e=n&&f>a)l=n,i=f,o=i-a;else if(n>a+s){h=n;break}}return{len:o,start:l,end:i,nextStart:h}}}]),e}();e.default=a},{}],25:[function(r,s,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;th)return void(a.PTSKnown=!1);for(var r=c;h>=r;r++){var s=f[u+r],n=l[r];n&&s&&(d=s.cc-n.cc,isNaN(s.startPTS)||(n.start=n.startPTS=s.startPTS,n.endPTS=s.endPTS,n.duration=s.duration,i=n))}if(d)for(e.logger.log("discontinuity sliding from playlist, take drift into account"),r=0;r=0&&ui.endSN)return 0;if(o=l-i.startSN,n=i.fragments,e=n[o],!isNaN(e.startPTS)){var f=Math.abs(e.startPTS-a);isNaN(e.deltaPTS)?e.deltaPTS=f:e.deltaPTS=Math.max(f,e.deltaPTS),a=Math.min(a,e.startPTS),s=Math.max(s,e.endPTS),d=Math.min(d,e.startDTS),u=Math.max(u,e.endDTS)}var h=a-e.start;for(e.start=e.startPTS=a,e.endPTS=s,e.startDTS=d,e.endDTS=u,e.duration=s-a,r=o;r>0;r--)t.updatePTS(n,r,r-1);for(r=o;ra?r.start=t.start+t.duration:r.start=t.start-r.duration:i>a?(t.duration=n-t.start,t.duration<0&&e.logger.error("negative duration computed for frag "+t.sn+",level "+t.level+", there should be some duration drift between playlist and fragment!")):(r.duration=t.start-n,r.duration<0&&e.logger.error("negative duration computed for frag "+r.sn+",level "+r.level+", there should be some duration drift between playlist and fragment!"))}}]),t}();t.default=n},{"../utils/logger":38}],26:[function(t,I,i){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var n=function(){function e(a,r){for(var t=0;t1?t-1:0),e=1;t>e;e++)i[e-1]=arguments[e];a.emit.apply(a,[r,r].concat(i))},a.off=function(i){for(var t=arguments.length,r=Array(t>1?t-1:0),e=1;t>e;e++)r[e-1]=arguments[e];a.removeListener.apply(a,[i].concat(r))},this.on=a.on.bind(a),this.off=a.off.bind(a),this.trigger=a.trigger.bind(a),this.playlistLoader=new d.default(this),this.fragmentLoader=new h.default(this),this.levelController=new R.default(this),this.abrController=new r.abrController(this),this.bufferController=new r.bufferController(this),this.capLevelController=new r.capLevelController(this),this.streamController=new r.streamController(this),this.timelineController=new r.timelineController(this),this.keyLoader=new p.default(this)}return n(t,null,[{key:"isSupported",value:function(){return window.MediaSource&&"function"==typeof window.MediaSource.isTypeSupported&&window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"')}},{key:"Events",get:function(){return a.default}},{key:"ErrorTypes",get:function(){return s.ErrorTypes}},{key:"ErrorDetails",get:function(){return s.ErrorDetails}},{key:"DefaultConfig",get:function(){return t.defaultConfig||(t.defaultConfig={autoStartLoad:!0,startPosition:-1,debug:!1,capLevelToPlayerSize:!1,maxBufferLength:30,maxBufferSize:6e7,maxBufferHole:.5,maxSeekHole:2,seekHoleNudgeDuration:.01,stalledInBufferedNudgeThreshold:10,maxFragLookUpTolerance:.2,liveSyncDurationCount:3,liveMaxLatencyDurationCount:1/0,liveSyncDuration:void 0,liveMaxLatencyDuration:void 0,maxMaxBufferLength:600,enableWorker:!0,enableSoftwareAES:!0,manifestLoadingTimeOut:1e4,manifestLoadingMaxRetry:1,manifestLoadingRetryDelay:1e3,levelLoadingTimeOut:1e4,levelLoadingMaxRetry:4,levelLoadingRetryDelay:1e3,fragLoadingTimeOut:2e4,fragLoadingMaxRetry:6,fragLoadingRetryDelay:1e3,fragLoadingLoopThreshold:3,startFragPrefetch:!1,appendErrorMaxRetry:3,loader:S.default,fLoader:void 0,pLoader:void 0,abrController:v.default,bufferController:P.default,capLevelController:m.default,streamController:b.default,timelineController:T.default,enableCEA708Captions:!0,enableMP2TPassThrough:!1,abrEwmaFastLive:5,abrEwmaSlowLive:9,abrEwmaFastVoD:4,abrEwmaSlowVoD:15,abrEwmaDefaultEstimate:5e5,abrBandWidthFactor:.8,abrBandWidthUpFactor:.7,maxStarvationDelay:2}),t.defaultConfig},set:function(e){t.defaultConfig=e}}]),n(t,[{key:"destroy",value:function(){e.logger.log("destroy"),this.trigger(a.default.DESTROYING),this.detachMedia(),this.playlistLoader.destroy(),this.fragmentLoader.destroy(),this.levelController.destroy(),this.abrController.destroy(),this.bufferController.destroy(),this.capLevelController.destroy(),this.streamController.destroy(),this.timelineController.destroy(),this.keyLoader.destroy(),this.url=null,this.observer.removeAllListeners()}},{key:"attachMedia",value:function(t){e.logger.log("attachMedia"),this.media=t,this.trigger(a.default.MEDIA_ATTACHING,{media:t})}},{key:"detachMedia",value:function(){e.logger.log("detachMedia"),this.trigger(a.default.MEDIA_DETACHING),this.media=null}},{key:"loadSource",value:function(t){e.logger.log("loadSource:"+t),this.url=t,this.trigger(a.default.MANIFEST_LOADING,{url:t})}},{key:"startLoad",value:function(){var t=arguments.length<=0||void 0===arguments[0]?-1:arguments[0];e.logger.log("startLoad"),this.levelController.startLoad(),this.streamController.startLoad(t)}},{key:"stopLoad",value:function(){e.logger.log("stopLoad"),this.levelController.stopLoad(),this.streamController.stopLoad()}},{key:"swapAudioCodec",value:function(){e.logger.log("swapAudioCodec"),this.streamController.swapAudioCodec()}},{key:"recoverMediaError",value:function(){e.logger.log("recoverMediaError");var t=this.media;this.detachMedia(),this.attachMedia(t)}},{key:"levels",get:function(){return this.levelController.levels}},{key:"currentLevel",get:function(){return this.streamController.currentLevel},set:function(t){e.logger.log("set currentLevel:"+t),this.loadLevel=t,this.streamController.immediateLevelSwitch()}},{key:"nextLevel",get:function(){return this.streamController.nextLevel},set:function(t){e.logger.log("set nextLevel:"+t),this.levelController.manualLevel=t,this.streamController.nextLevelSwitch()}},{key:"loadLevel",get:function(){return this.levelController.level},set:function(t){e.logger.log("set loadLevel:"+t),this.levelController.manualLevel=t}},{key:"nextLoadLevel",get:function(){return this.levelController.nextLoadLevel},set:function(e){this.levelController.nextLoadLevel=e}},{key:"firstLevel",get:function(){return this.levelController.firstLevel},set:function(t){e.logger.log("set firstLevel:"+t),this.levelController.firstLevel=t}},{key:"startLevel",get:function(){return this.levelController.startLevel},set:function(t){e.logger.log("set startLevel:"+t),this.levelController.startLevel=t}},{key:"autoLevelCapping",get:function(){return this.abrController.autoLevelCapping},set:function(t){e.logger.log("set autoLevelCapping:"+t),this.abrController.autoLevelCapping=t}},{key:"autoLevelEnabled",get:function(){return-1===this.levelController.manualLevel}},{key:"manualLevel",get:function(){return this.levelController.manualLevel}}]),t}();i.default=l},{"./controller/abr-controller":3,"./controller/buffer-controller":4,"./controller/cap-level-controller":5,"./controller/level-controller":7,"./controller/stream-controller":8,"./controller/timeline-controller":9,"./errors":21,"./events":23,"./loader/fragment-loader":28,"./loader/key-loader":29,"./loader/playlist-loader":30,"./utils/logger":38,"./utils/xhr-loader":40,events:1}],27:[function(e,t,r){"use strict";t.exports=e("./hls.js").default},{"./hls.js":26}],28:[function(r,c,a){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function f(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(a,"__esModule",{value:!0});var h=function(){function e(a,r){for(var t=0;te;e++)t[e]=r>>8*(15-e)&255;return t}},{key:"fragmentDecryptdataFromLevelkey",value:function(e,r){var t=e;return e&&e.method&&e.uri&&!e.iv&&(t=this.cloneObj(e),t.iv=this.createInitializationVector(r)),t}},{key:"avc1toavcoti",value:function(r){var e,t=r.split(".");return t.length>2?(e=t.shift()+".",e+=parseInt(t.shift()).toString(16),e+=("000"+parseInt(t.shift()).toString(16)).substr(-4)):e=r,e}},{key:"cloneObj",value:function(e){return JSON.parse(JSON.stringify(e))}},{key:"parseLevelPlaylist",value:function(D,f,L){var E,e,R,l=0,o=0,t={version:null,type:null,url:f,fragments:[],live:!0,startSN:0},a={method:null,key:null,iv:null,uri:null},y=0,c=null,r=null,n=null,d=null,h=null,s=null;for(R=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE):(\d+))|(?:#EXT-X-(TARGETDURATION):(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT(INF):(\d+(?:\.\d+)?)(?:,(.*))?)|(?:(?!#)()(\S.+))|(?:#EXT-X-(BYTERANGE):(\d+(?:@\d+(?:\.\d+)?))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(PROGRAM-DATE-TIME):(.+))|(?:#EXT-X-(VERSION):(\d+))|(?:(#)(.*):(.*))|(?:(#)(.*)))(?:.*)\r?\n?/g;null!==(e=R.exec(D));)switch(e.shift(),e=e.filter(function(e){return void 0!==e}),e[0]){case"VERSION":t.version=parseInt(e[1]);break;case"PLAYLIST-TYPE":t.type=e[1].toUpperCase();break;case"MEDIA-SEQUENCE":l=t.startSN=parseInt(e[1]);break;case"TARGETDURATION":t.targetduration=parseFloat(e[1]);break;case"EXTM3U":break;case"ENDLIST":t.live=!1;break;case"DIS":y++;break;case"BYTERANGE":var v=e[1].split("@");s=1===v.length?h:parseInt(v[1]),h=parseInt(v[0])+s;break;case"INF":n=parseFloat(e[1]),d=e[2]?e[2]:null;break;case"":if(!isNaN(n)){var b=l++;E=this.fragmentDecryptdataFromLevelkey(a,b);var T=e[1]?this.resolve(e[1],f):null;r={url:T,duration:n,title:d,start:o,sn:b,level:L,cc:y,decryptdata:E,programDateTime:c},null!==s&&(r.byteRangeStartOffset=s,r.byteRangeEndOffset=h),t.fragments.push(r),o+=n,n=null,d=null,s=null,c=null}break;case"KEY":var A=e[1],p=new i.default(A),g=p.enumeratedString("METHOD"),m=p.URI,k=p.hexadecimalInteger("IV");g&&(a={method:null,key:null,iv:null,uri:null},m&&"AES-128"===g&&(a.method=g,a.uri=this.resolve(m,f),a.key=null,a.iv=k));break;case"START":var S=e[1],w=new i.default(S),_=w.decimalFloatingPoint("TIME-OFFSET");_&&(t.startTimeOffset=_);break;case"PROGRAM-DATE-TIME":c=new Date(Date.parse(e[1]));break;case"#":e.shift();break;default:u.logger.warn("line parsed but not handled: "+e)}return r&&!r.url&&(t.fragments.pop(),o-=r.duration),t.totalduration=o,t.endSN=l-1,t}},{key:"loadsuccess",value:function(d,a){var s,o=d.currentTarget,n=o.responseText,r=o.responseURL,l=this.id,f=this.id2,i=this.hls;if(this.loading=!1,void 0===r&&(r=this.url),a.tload=performance.now(),a.mtime=new Date(o.getResponseHeader("Last-Modified")),0===n.indexOf("#EXTM3U"))if(n.indexOf("#EXTINF:")>0){var u=this.parseLevelPlaylist(n,r,l||0);u.tload=a.tload,null===l&&i.trigger(t.default.MANIFEST_LOADED,{levels:[{url:r,details:u}],url:r,stats:a}),a.tparsed=performance.now(),i.trigger(t.default.LEVEL_LOADED,{details:u,level:l||0,id:f,stats:a})}else s=this.parseMasterPlaylist(n,r),s.length?i.trigger(t.default.MANIFEST_LOADED,{levels:s,url:r,stats:a}):i.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:e.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:r,reason:"no level found in manifest"});else i.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:e.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:r,reason:"no EXTM3U delimiter"})}},{key:"loaderror",value:function(i){var r,a;null===this.id?(r=e.ErrorDetails.MANIFEST_LOAD_ERROR,a=!0):(r=e.ErrorDetails.LEVEL_LOAD_ERROR,a=!1),this.loader&&this.loader.abort(),this.loading=!1,this.hls.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:r,fatal:a,url:this.url,loader:this.loader,response:i.currentTarget,level:this.id,id:this.id2})}},{key:"loadtimeout",value:function(){var r,a;null===this.id?(r=e.ErrorDetails.MANIFEST_LOAD_TIMEOUT,a=!0):(r=e.ErrorDetails.LEVEL_LOAD_TIMEOUT,a=!1),this.loader&&this.loader.abort(),this.loading=!1,this.hls.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:r,fatal:a,url:this.url,loader:this.loader,level:this.id,id:this.id2})}}]),r}(n.default);s.default=y},{"../errors":21,"../event-handler":22,"../events":23,"../utils/attr-list":34,"../utils/logger":38,"../utils/url":39}],31:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;t>24&255,t[1]=e>>16&255,t[2]=e>>8&255,t[3]=255&e,t.set(i,4),r=0,e=8;n>r;r++)t.set(a[r],e),e+=a[r].byteLength;return t}},{key:"hdlr",value:function(t){return e.box(e.types.hdlr,e.HDLR_TYPES[t])}},{key:"mdat",value:function(t){return e.box(e.types.mdat,t)}},{key:"mdhd",value:function(t,r){return r*=t,e.box(e.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,2,0,0,0,3,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24,r>>16&255,r>>8&255,255&r,85,196,0,0]))}},{key:"mdia",value:function(t){return e.box(e.types.mdia,e.mdhd(t.timescale,t.duration),e.hdlr(t.type),e.minf(t))}},{key:"mfhd",value:function(t){return e.box(e.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))}},{key:"minf",value:function(t){return"audio"===t.type?e.box(e.types.minf,e.box(e.types.smhd,e.SMHD),e.DINF,e.stbl(t)):e.box(e.types.minf,e.box(e.types.vmhd,e.VMHD),e.DINF,e.stbl(t))}},{key:"moof",value:function(t,r,a){return e.box(e.types.moof,e.mfhd(t),e.traf(a,r))}},{key:"moov",value:function(t){for(var r=t.length,a=[];r--;)a[r]=e.trak(t[r]);return e.box.apply(null,[e.types.moov,e.mvhd(t[0].timescale,t[0].duration)].concat(a).concat(e.mvex(t)))}},{key:"mvex",value:function(r){for(var t=r.length,a=[];t--;)a[t]=e.trex(r[t]);return e.box.apply(null,[e.types.mvex].concat(a))}},{key:"mvhd",value:function(t,r){r*=t;var a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,2,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24&255,r>>16&255,r>>8&255,255&r,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return e.box(e.types.mvhd,a)}},{key:"sdtp",value:function(n){var r,t,a=n.samples||[],i=new Uint8Array(4+a.length);for(t=0;t>>8&255),a.push(255&n),a=a.concat(Array.prototype.slice.call(i));for(r=0;r>>8&255),s.push(255&n),s=s.concat(Array.prototype.slice.call(i));var u=e.box(e.types.avcC,new Uint8Array([1,a[3],a[4],a[5],255,224|t.sps.length].concat(a).concat([t.pps.length]).concat(s))),o=t.width,l=t.height;return e.box(e.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,o>>8&255,255&o,l>>8&255,255&l,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),u,e.box(e.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])))}},{key:"esds",value:function(t){var e=t.config.length;return new Uint8Array([0,0,0,0,3,23+e,0,1,0,4,15+e,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([e]).concat(t.config).concat([6,1,2]))}},{key:"mp4a",value:function(t){var r=t.audiosamplerate;return e.box(e.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),e.box(e.types.esds,e.esds(t)))}},{key:"stsd",value:function(t){return"audio"===t.type?e.box(e.types.stsd,e.STSD,e.mp4a(t)):e.box(e.types.stsd,e.STSD,e.avc1(t))}},{key:"tkhd",value:function(t){var r=t.id,a=t.duration*t.timescale,i=t.width,n=t.height;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,a>>24,a>>16&255,a>>8&255,255&a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,i>>8&255,255&i,0,0,n>>8&255,255&n,0,0]))}},{key:"traf",value:function(a,t){var i=e.sdtp(a),r=a.id;return e.box(e.types.traf,e.box(e.types.tfhd,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r])),e.box(e.types.tfdt,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t])),e.trun(a,i.length+16+16+8+16+8+8),i)}},{key:"trak",value:function(t){return t.duration=t.duration||4294967295,e.box(e.types.trak,e.tkhd(t),e.mdia(t))}},{key:"trex",value:function(r){var t=r.id;return e.box(e.types.trex,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))}},{key:"trun",value:function(h,o){var a,i,n,s,t,l,d=h.samples||[],r=d.length,f=12+16*r,u=new Uint8Array(f);for(o+=8+f,u.set([0,0,15,1,r>>>24&255,r>>>16&255,r>>>8&255,255&r,o>>>24&255,o>>>16&255,o>>>8&255,255&o],0),a=0;r>a;a++)i=d[a],n=i.duration,s=i.size,t=i.flags,l=i.cts,u.set([n>>>24&255,n>>>16&255,n>>>8&255,255&n,s>>>24&255,s>>>16&255,s>>>8&255,255&s,t.isLeading<<2|t.dependsOn,t.isDependedOn<<6|t.hasRedundancy<<4|t.paddingValue<<1|t.isNonSync,61440&t.degradPrio,15&t.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*a);return e.box(e.types.trun,u)}},{key:"initSegment",value:function(a){e.types||e.init();var t,r=e.moov(a);return t=new Uint8Array(e.FTYP.byteLength+r.byteLength),t.set(e.FTYP),t.set(r,e.FTYP.byteLength),t}}]),e}();e.default=a},{}],32:[function(a,h,i){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var l=function(){function e(a,r){for(var t=0;tMath.pow(2,32)&&!function(){var e=function r(t,e){return e?r(e,t%e):t};a.timescale=a.audiosamplerate/e(a.audiosamplerate,1024)}(),e.logger.log("audio mp4 timescale :"+a.timescale),l.audio={container:"audio/mp4",codec:a.codec,initSegment:r.default.initSegment([a]),metadata:{channelCount:a.channelCount}},u&&(n=o=v[0].pts-f*h)),i.sps&&i.pps&&d.length&&(i.timescale=this.MP4_TIMESCALE,l.video={container:"video/mp4",codec:i.codec,initSegment:r.default.initSegment([i]),metadata:{width:i.width,height:i.height}},u&&(n=Math.min(n,d[0].pts-f*h),o=Math.min(o,d[0].dts-f*h))),Object.keys(l).length?(c.trigger(t.default.FRAG_PARSING_INIT_SEGMENT,g),this.ISGenerated=!0,u&&(this._initPTS=n,this._initDTS=o)):c.trigger(t.default.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"no audio/video samples found"})}},{key:"remuxVideo",value:function(a,D,w){var T,s,v,L,y,d,k,S,R,g,m,f,u,i,l,b=8,c=this.PES_TIMESCALE,h=this.PES2MP4SCALEFACTOR,o=[],A=a.samples.reduce(function(t,e){return Math.max(Math.min(t,e.pts-e.dts),-18e3)},0);for(0>A&&e.logger.warn("PTS < DTS detected in video samples, shifting DTS by "+Math.round(A/90)+" ms to overcome this issue"),d=new Uint8Array(a.len+4*a.nbNalu+8),T=new DataView(d.buffer),T.setUint32(0,d.byteLength),d.set(r.default.types.mdat,4);a.samples.length;){for(s=a.samples.shift(),L=0;s.units.units.length;)y=s.units.units.shift(),T.setUint32(b,y.data.byteLength),b+=4,d.set(y.data,b),b+=y.data.byteLength,L+=4+y.data.byteLength;if(m=s.pts-this._initDTS,f=s.dts-this._initDTS+A,f=Math.min(m,f),void 0!==g){u=this._PTSNormalize(m,g),i=this._PTSNormalize(f,g);var _=(i-g)/h;0>=_&&(e.logger.log("invalid sample duration at PTS/DTS: "+s.pts+"/"+s.dts+":"+_),_=1),v.duration=_}else{var p=void 0,n=void 0;p=w?this.nextAvcDts:D*c,u=this._PTSNormalize(m,p),i=this._PTSNormalize(f,p),n=Math.round((i-p)/90),w&&n&&(n>1?e.logger.log("AVC:"+n+" ms hole between fragments detected,filling it"):-1>n&&e.logger.log("AVC:"+-n+" ms overlapping between fragments detected"),i=p,u=Math.max(u-n,i),e.logger.log("Video/PTS/DTS adjusted: "+u+"/"+i+",delta:"+n)),S=Math.max(0,u),R=Math.max(0,i)}v={size:L,duration:0,cts:(u-i)/h,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0}},l=v.flags,s.key===!0?(l.dependsOn=2,l.isNonSync=0):(l.dependsOn=1,l.isNonSync=1),o.push(v),g=i}var E=0;o.length>=2&&(E=o[o.length-2].duration,v.duration=E),this.nextAvcDts=i+E*h;var O=a.dropped;a.len=0,a.nbNalu=0,a.dropped=0,o.length&&navigator.userAgent.toLowerCase().indexOf("chrome")>-1&&(l=o[0].flags,l.dependsOn=2,l.isNonSync=0),a.samples=o,k=r.default.moof(a.sequenceNumber++,R/h,a),a.samples=[],this.observer.trigger(t.default.FRAG_PARSING_DATA,{data1:k,data2:d,startPTS:S/c,endPTS:(u+h*E)/c,startDTS:R/c,endDTS:this.nextAvcDts/c,type:"video",nb:o.length,dropped:O})}},{key:"remuxAudio",value:function(a,D,S){var k,p,n,h,d,L,T,b,u,g,R,o,i,A=8,s=this.PES_TIMESCALE,w=a.timescale,f=s/w,E=1024*a.timescale/a.audiosamplerate,m=[],_=[];for(a.samples.sort(function(e,t){return e.pts-t.pts}),_=a.samples;_.length;){if(p=_.shift(),h=p.unit,g=p.pts-this._initDTS,R=p.dts-this._initDTS,void 0!==u)o=this._PTSNormalize(g,u),i=this._PTSNormalize(R,u),n.duration=(i-u)/f,Math.abs(n.duration-E)>E/10&&e.logger.log("invalid AAC sample duration at PTS "+Math.round(g/90)+",should be 1024,found :"+Math.round(n.duration*a.audiosamplerate/a.timescale)),n.duration=E,o=i=E*f+u;else{var c=void 0,l=void 0;if(c=S?this.nextAacPts:D*s,o=this._PTSNormalize(g,c),i=this._PTSNormalize(R,c),l=Math.round(1e3*(o-c)/s),S&&l){if(l>0)e.logger.log(l+" ms hole between AAC samples detected,filling it");else if(-12>l){e.logger.log(-l+" ms overlapping between AAC samples detected, drop frame"),a.len-=h.byteLength;continue}o=i=c}if(T=Math.max(0,o),b=Math.max(0,i),!(a.len>0))return;d=new Uint8Array(a.len+8),k=new DataView(d.buffer),k.setUint32(0,d.byteLength),d.set(r.default.types.mdat,4)}d.set(h,A),A+=h.byteLength,n={size:h.byteLength,cts:0,duration:0,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0,dependsOn:1}},m.push(n),u=i}var y=0,v=m.length;v>=2&&(y=m[v-2].duration,n.duration=y),v&&(this.nextAacPts=o+f*y,a.len=0,a.samples=m,L=r.default.moof(a.sequenceNumber++,b/f,a),a.samples=[],this.observer.trigger(t.default.FRAG_PARSING_DATA,{data1:L,data2:d,startPTS:T/s,endPTS:this.nextAacPts/s,startDTS:b/s,endDTS:(i+f*y)/s,type:"audio",nb:v}))}},{key:"remuxID3",value:function(r,i){var e,n=r.samples.length;if(n){for(var a=0;n>a;a++)e=r.samples[a],e.pts=(e.pts-this._initPTS)/this.PES_TIMESCALE,e.dts=(e.dts-this._initDTS)/this.PES_TIMESCALE;this.observer.trigger(t.default.FRAG_PARSING_METADATA,{samples:r.samples})}r.samples=[],i=i}},{key:"remuxText",value:function(e,i){e.samples.sort(function(e,t){return e.pts-t.pts});var r,n=e.samples.length;if(n){for(var a=0;n>a;a++)r=e.samples[a],r.pts=(r.pts-this._initPTS)/this.PES_TIMESCALE;this.observer.trigger(t.default.FRAG_PARSING_USERDATA,{samples:e.samples})}e.samples=[],i=i}},{key:"_PTSNormalize",value:function(e,t){var r;if(void 0===t)return e;for(r=e>t?-8589934592:8589934592;Math.abs(e-t)>4294967296;)e+=r;return e}},{key:"passthrough",get:function(){return!1}}]),a}();i.default=d},{"../errors":21,"../events":23,"../remux/mp4-generator":31,"../utils/logger":38}],33:[function(r,l,e){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function e(a,r){for(var t=0;tNumber.MAX_SAFE_INTEGER?1/0:e}},{key:"hexadecimalInteger",value:function(r){if(this[r]){var e=(this[r]||"0x").slice(2);e=(1&e.length?"0":"")+e;for(var a=new Uint8Array(e.length/2),t=0;tNumber.MAX_SAFE_INTEGER?1/0:e}},{key:"decimalFloatingPoint",value:function(e){return parseFloat(this[e])}},{key:"enumeratedString",value:function(e){return this[e]}},{key:"decimalResolution",value:function(t){var e=/^(\d+)x(\d+)$/.exec(this[t]);if(null!==e)return{width:parseInt(e[1],10),height:parseInt(e[2],10)}}}],[{key:"parseAttrList",value:function(i){for(var t,n=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g,r={};null!==(t=n.exec(i));){var e=t[2],a='"';0===e.indexOf(a)&&e.lastIndexOf(a)===e.length-1&&(e=e.slice(1,-1)),r[t[1]]=e}return r}}]),e}();e.default=a},{}],35:[function(r,e,a){"use strict";var t={search:function(i,s){for(var t=0,r=i.length-1,e=null,a=null;r>=t;){e=(t+r)/2|0,a=i[e];var n=s(a);if(n>0)t=e+1;else{if(!(0>n))return a;r=e-1}}return null}};e.exports=t},{}],36:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;t0;)e.removeCue(e.cues[0])}},{key:"push",value:function(r,a){this.cue||this._createCue();for(var i,t,e,s,o,u=31&a[0],n=2,l=0;u>l;l++)if(i=a[n++],t=127&a[n++],e=127&a[n++],s=0!==(4&i),o=3&i,(0!==t||0!==e)&&s&&0===o){if(32&t||64&t)this.cue.text+=this._fromCharCode(t)+this._fromCharCode(e);else if((17===t||25===t)&&e>=48&&63>=e)switch(e){case 48:this.cue.text+="®";break;case 49:this.cue.text+="°";break;case 50:this.cue.text+="½";break;case 51:this.cue.text+="¿";break;case 52:this.cue.text+="™";break;case 53:this.cue.text+="¢";break;case 54:this.cue.text+="";break;case 55:this.cue.text+="£";break;case 56:this.cue.text+="♪";break;case 57:this.cue.text+=" ";break;case 58:this.cue.text+="è";break;case 59:this.cue.text+="â";break;case 60:this.cue.text+="ê";break;case 61:this.cue.text+="î";break;case 62:this.cue.text+="ô";break;case 63:this.cue.text+="û"}if((17===t||25===t)&&e>=32&&47>=e)switch(e){case 32:break;case 33:break;case 34:break;case 35:break;case 36:break;case 37:break;case 38:break;case 39:break;case 40:break;case 41:break;case 42:break;case 43:break;case 44:break;case 45:break;case 46:break;case 47:}if((20===t||28===t)&&e>=32&&47>=e)switch(e){case 32:this._clearActiveCues(r);break;case 33:this.cue.text=this.cue.text.substr(0,this.cue.text.length-1);break;case 34:break;case 35:break;case 36:break;case 37:break;case 38:break;case 39:break;case 40:break;case 41:this._clearActiveCues(r);break;case 42:break;case 43:break;case 44:this._clearActiveCues(r);break;case 45:break;case 46:this._text="";break;case 47:this._flipMemory(r)}if((23===t||31===t)&&e>=33&&35>=e)switch(e){case 33:break;case 34:break;case 35:}}}},{key:"_fromCharCode",value:function(e){switch(e){case 42:return"á";case 2:return"á";case 2:return"é";case 4:return"í";case 5:return"ó";case 6:return"ú";case 3:return"ç";case 4:return"÷";case 5:return"Ñ";case 6:return"ñ";case 7:return"█";default:return String.fromCharCode(e)}}},{key:"_flipMemory",value:function(e){this._clearActiveCues(e),this._flushCaptions(e)}},{key:"_flushCaptions",value:function(s){this._has708||(this._textTrack=this.media.addTextTrack("captions","English","en"),this._has708=!0);var e=!0,a=!1,i=void 0;try{for(var n,t=this.memory[Symbol.iterator]();!(e=(n=t.next()).done);e=!0){var r=n.value;r.startTime=s,this._textTrack.addCue(r),this.display.push(r)}}catch(e){a=!0,i=e}finally{try{!e&&t.return&&t.return()}finally{if(a)throw i}}this.memory=[],this.cue=null}},{key:"_clearActiveCues",value:function(n){var e=!0,r=!1,a=void 0;try{for(var i,t=this.display[Symbol.iterator]();!(e=(i=t.next()).done);e=!0){var s=i.value;s.endTime=n}}catch(e){r=!0,a=e}finally{try{!e&&t.return&&t.return()}finally{if(r)throw a}}this.display=[]}},{key:"_clearBufferedCues",value:function(){}}]),e}();e.default=a},{}],37:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;t "+e}function n(t){var r=window.console[t];return r?function(){for(var n=arguments.length,e=Array(n),a=0;n>a;a++)e[a]=arguments[a];e[0]&&(e[0]=i(t,e[0])),r.apply(window.console,e)}:e}function s(r){for(var a=arguments.length,i=Array(a>1?a-1:0),e=1;a>e;e++)i[e-1]=arguments[e];i.forEach(function(e){t[e]=r[e]?r[e].bind(r):n(e)})}Object.defineProperty(r,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},a={trace:e,debug:e,log:e,warn:e,info:e,error:e},t=a;r.enableLogs=function(e){if(e===!0||"object"===("undefined"==typeof e?"undefined":o(e))){s(e,"debug","log","info","warn","error");try{t.log()}catch(e){t=a}}else t=a},r.logger=t},{}],39:[function(r,t,a){"use strict";var e={buildAbsoluteURL:function(r,t){if(t=t.trim(),/^[a-z]+:/i.test(t))return t;var l=null,o=null,n=/^([^#]*)(.*)$/.exec(t);n&&(o=n[2],t=n[1]);var s=/^([^\?]*)(.*)$/.exec(t);s&&(l=s[2],t=s[1]);var f=/^([^#]*)(.*)$/.exec(r);f&&(r=f[1]);var u=/^([^\?]*)(.*)$/.exec(r);u&&(r=u[1]);var a=/^(([a-z]+:)?\/\/[a-z0-9\.\-_~]+(:[0-9]+)?)?(\/.*)$/i.exec(r);if(!a)throw new Error("Error trying to parse base URL.");var h=a[2]||"",d=a[1]||"",c=a[4],i=null;return i=/^\/\//.test(t)?h+"//"+e.buildAbsolutePath("",t.substring(2)):/^\//.test(t)?d+"/"+e.buildAbsolutePath("",t.substring(1)):e.buildAbsolutePath(d+c,t),l&&(i+=l),o&&(i+=o),i},buildAbsolutePath:function(n,s){for(var a,e,o=s,i="",t=n.replace(/[^\/]*$/,o.replace(/(\/|^)(?:\.?\/+)+/g,"$1")),r=0;e=t.indexOf("/../",r),e>-1;r=e+a)a=/^\/(?:\.\.\/)*/.exec(t.slice(e))[0].length,i=(i+t.substring(r,e)).replace(new RegExp("(?:\\/+[^\\/]*){0,"+(a-1)/3+"}$"),"/");return i+t.substr(r)}};t.exports=e},{}],40:[function(r,s,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;t=200&&300>t?(window.clearTimeout(this.timeoutHandle),r.tload=Math.max(r.tfirst,performance.now()),this.onSuccess(a,r)):r.retry>=this.maxRetry||t>=400&&499>t?(window.clearTimeout(this.timeoutHandle),e.logger.error(t+" while loading "+this.url),this.onError(a)):(e.logger.warn(t+" while loading "+this.url+", retrying in "+this.retryDelay+"..."),this.destroy(),window.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,64e3),r.retry++))}},{key:"loadtimeout",value:function(t){e.logger.warn("timeout while loading "+this.url),this.onTimeout(t,this.stats)}},{key:"loadprogress",value:function(t){var e=this.stats;0===e.tfirst&&(e.tfirst=Math.max(performance.now(),e.trequest)),e.loaded=t.loaded,this.onProgress&&this.onProgress(t,e)}}]),t}();t.default=n},{"../utils/logger":38}]},{},[27])(27)}); +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Hls=e()}}(function(){return function e(t,r,a){function i(s,o){if(!r[s]){if(!t[s]){var l="function"==typeof require&&require;if(!o&&l)return l(s,!0);if(n)return n(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var d=r[s]={exports:{}};t[s][0].call(d.exports,function(e){var r=t[s][1][e];return i(r?r:e)},d,d.exports,e,t,r,a)}return r[s].exports}for(var n="function"==typeof require&&require,s=0;s0&&this._events[e].length>r&&(this._events[e].warned=!0,"function"==typeof console.trace)),this},a.prototype.on=a.prototype.addListener,a.prototype.once=function(e,t){function r(){this.removeListener(e,r),a||(a=!0,t.apply(this,arguments))}if(!i(t))throw TypeError("listener must be a function");var a=!1;return r.listener=t,this.on(e,r),this},a.prototype.removeListener=function(e,t){var r,a,n,o;if(!i(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],n=r.length,a=-1,r===t||i(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(s(r)){for(o=n;o-- >0;)if(r[o]===t||r[o].listener&&r[o].listener===t){a=o;break}if(a<0)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(a,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},a.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],i(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},a.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?i(this._events[e])?[this._events[e]]:this._events[e].slice():[]},a.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(i(t))return 1;if(t)return t.length}return 0},a.listenerCount=function(e,t){return e.listenerCount(t)}},{}],2:[function(e,t,r){var a=arguments[3],i=arguments[4],n=arguments[5],s=JSON.stringify;t.exports=function(e){for(var t,r=Object.keys(n),o=0,l=r.length;o500*r.duration){var i=e.levels,n=Math.max(1,1e3*r.loaded/a),s=Math.max(r.loaded,Math.round(r.duration*i[r.level].bitrate/8)),o=t.currentTime,l=(s-r.loaded)/n,d=c.default.bufferInfo(t,o,e.config.maxBufferHole).end-o;if(d<2*r.duration&&l>d){var f=void 0,h=void 0;for(h=r.level-1;h>=0&&(f=r.duration*i[h].bitrate/(6.4*n),g.logger.log("fragLoadedDelay/bufferStarvationDelay/fragLevelNextLoadedDelay["+h+"] :"+l.toFixed(1)+"/"+d.toFixed(1)+"/"+f.toFixed(1)),!(f=0;l--){var u=o[l],d=u.details,f=d?d.totalduration/d.fragments.length:t,h=void 0;h=l<=e?n*r:s*r;var c=o[l].bitrate,v=c*f/h;if(g.logger.trace("level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: "+l+"/"+Math.round(h)+"/"+c+"/"+f+"/"+i+"/"+v),h>c&&(!v||vthis._msDuration&&(h.logger.log("Updating mediasource duration to "+this._levelDuration),t.duration=this._levelDuration,this._msDuration=this._levelDuration)}}}},{key:"doFlush",value:function(){for(;this.flushRange.length;){var e=this.flushRange[0];if(!this.flushBuffer(e.start,e.end))return void(this._needsFlush=!0);this.flushRange.shift(),this.flushBufferCounter=0}if(0===this.flushRange.length){this._needsFlush=!1;var t=0,r=this.sourceBuffer;if(r)for(var a in r)t+=r[a].buffered.length;this.appended=t,this.hls.trigger(u.default.BUFFER_FLUSHED)}}},{key:"doAppending",value:function(){var e=this.hls,t=this.sourceBuffer,r=this.segments;if(t){if(this.media.error)return r=[],void h.logger.error("trying to append although a media error occured, flush segment and abort");for(var a in t)if(t[a].updating)return;if(r.length){var i=r.shift();try{t[i.type].appendBuffer(i.data),this.appendError=0,this.appended++}catch(t){h.logger.error("error while trying to append buffer:"+t.message),r.unshift(i);var n={type:c.ErrorTypes.MEDIA_ERROR};if(22===t.code)return this.segments=[],n.details=c.ErrorDetails.BUFFER_FULL_ERROR,void e.trigger(u.default.ERROR,n);if(this.appendError?this.appendError++:this.appendError=1,n.details=c.ErrorDetails.BUFFER_APPEND_ERROR,n.frag=this.fragCurrent,this.appendError>e.config.appendErrorMaxRetry)return h.logger.log("fail "+e.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),r=[],n.fatal=!0,void e.trigger(u.default.ERROR,n);n.fatal=!1,e.trigger(u.default.ERROR,n)}}}}},{key:"flushBuffer",value:function(e,t){var r,a,i,n,s,o;if(this.flushBufferCounter.5)return this.flushBufferCounter++,h.logger.log("flush "+l+" ["+s+","+o+"], of ["+i+","+n+"], pos:"+this.media.currentTime),r.remove(s,o),!1}else h.logger.warn("abort flushing too many retries");return h.logger.log("buffer flushed"),!0}}]),t}(f.default);r.default=v},{"../errors":21,"../event-handler":22,"../events":23,"../utils/logger":38}],5:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;rthis.autoLevelCapping&&this.hls.streamController.nextLevelSwitch(),this.autoLevelCapping=this.hls.autoLevelCapping)}}},{key:"getMaxLevel",value:function(e){var t=void 0,r=void 0,a=void 0,i=this.mediaWidth,n=this.mediaHeight,s=0,o=0;for(r=0;r<=e&&(a=this.levels[r],t=r,s=a.width,o=a.height,!(i<=s||n<=o));r++);return t}},{key:"contentScaleFactor",get:function(){var e=1;try{e=window.devicePixelRatio}catch(e){}return e}},{key:"mediaWidth",get:function(){var e=void 0;return this.media&&(e=this.media.width||this.media.clientWidth||this.media.offsetWidth,e*=this.contentScaleFactor),e}},{key:"mediaHeight",get:function(){var e=void 0;return this.media&&(e=this.media.height||this.media.clientHeight||this.media.offsetHeight,e*=this.contentScaleFactor),e}}]),t}(f.default);r.default=h},{"../event-handler":22,"../events":23}],6:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r=0&&e1e3){h.logger.log("(re)loading playlist for level "+e);var i=r.urlId;this.hls.trigger(u.default.LEVEL_LOADING,{url:r.url[i],level:e,id:i})}}else this.hls.trigger(u.default.ERROR,{type:c.ErrorTypes.OTHER_ERROR,details:c.ErrorDetails.LEVEL_SWITCH_ERROR,level:e,fatal:!1,reason:"invalid level idx"})}},{key:"onError",value:function(e){if(!e.fatal){var t=e.details,r=this.hls,a=void 0,i=void 0,n=!1;switch(t){case c.ErrorDetails.FRAG_LOAD_ERROR:case c.ErrorDetails.FRAG_LOAD_TIMEOUT:case c.ErrorDetails.FRAG_LOOP_LOADING_ERROR:case c.ErrorDetails.KEY_LOAD_ERROR:case c.ErrorDetails.KEY_LOAD_TIMEOUT:a=e.frag.level;break;case c.ErrorDetails.LEVEL_LOAD_ERROR:case c.ErrorDetails.LEVEL_LOAD_TIMEOUT:a=e.level,n=!0}if(void 0!==a)if(i=this._levels[a],i.urlIde&&(this._level===e&&void 0!==t[e].details||this.setLevelInternal(e))}},{key:"manualLevel",get:function(){return this._manualLevel},set:function(e){this._manualLevel=e,void 0===this._startLevel&&(this._startLevel=e),e!==-1&&(this.level=e)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(e){this._firstLevel=e}},{key:"startLevel",get:function(){return void 0===this._startLevel?this._firstLevel:this._startLevel},set:function(e){this._startLevel=e}},{key:"nextLoadLevel",get:function(){return this._manualLevel!==-1?this._manualLevel:this.hls.abrController.nextAutoLevel},set:function(e){this.level=e,this._manualLevel===-1&&(this.hls.abrController.nextAutoLevel=e)}}]),t}(f.default);r.default=v},{"../errors":21,"../event-handler":22,"../events":23,"../utils/logger":38}],8:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(r,"__esModule",{value:!0});var o=function(){function e(e,t){for(var r=0;r0?(v.logger.log("configure startPosition @"+r),this.lastPaused||(v.logger.log("resuming video"),t.play())):this.lastCurrentTime=this.startPosition?this.startPosition:e,this.state=this.startFragRequested?R.IDLE:R.STARTING,this.nextLoadPosition=this.startPosition=this.lastCurrentTime,this.tick()}else v.logger.warn("cannot start loading as manifest not parsed yet"),this.state=R.STOPPED}},{key:"stopLoad",value:function(){var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=R.STOPPED}},{key:"tick",value:function(){this.ticks++,1===this.ticks&&(this.doTick(),this.ticks>1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){var e,t,r,a=this.hls,i=a.config,n=this.media,s=n&&n.seeking;switch(this.state){case R.ERROR:case R.PAUSED:break;case R.STARTING:var o=a.startLevel;o===-1&&(o=0,this.fragBitrateTest=!0),this.level=a.nextLoadLevel=o,this.state=R.WAITING_LEVEL,this.loadedmetadata=!1;break;case R.IDLE:if(!n&&(this.startFragRequested||!i.startFragPrefetch))break;e=this.loadedmetadata?n.currentTime:this.nextLoadPosition,t=a.nextLoadLevel;var l,u=m.default.bufferInfo(n,e,i.maxBufferHole),d=u.len,h=u.end,c=this.fragPrevious;if(this.levels[t].hasOwnProperty("bitrate")?(l=Math.max(8*i.maxBufferSize/this.levels[t].bitrate,i.maxBufferLength),l=Math.min(l,i.maxMaxBufferLength)):l=i.maxBufferLength,dk&&(n.currentTime=k)}if(r.PTSKnown&&h>b)break;if(this.startFragRequested&&!r.PTSKnown){if(c){var S=c.sn+1;S>=r.startSN&&S<=r.endSN&&(A=g[S-r.startSN],v.logger.log("live playlist, switching playlist, load frag with next SN: "+A.sn))}A||(A=g[Math.min(y-1,Math.round(y/2))],v.logger.log("live playlist, switching playlist, unknown, load middle frag : "+A.sn))}}else hb-e||s)&&(e=0),A=p.default.search(g,function(t){return t.start+t.duration-e<=h?1:t.start-e>h?-1:0})):A=g[y-1]}(),A){if(E=A.start,c&&A.level===c.level&&A.sn===c.sn){if(!(A.sni.maxBufferHole&&c.dropped?(A=g[D-1],v.logger.warn("SN just loaded, with large PTS gap between audio and video, maybe frag is not starting with a keyframe ? load previous one to try to overcome this"),c.loadCounter--):(A=g[D+1],v.logger.log("SN just loaded, load next one: "+A.sn)),!A)break}if(null!=A.decryptdata.uri&&null==A.decryptdata.key)v.logger.log("Loading key for "+A.sn+" of ["+r.startSN+" ,"+r.endSN+"],level "+t),this.state=R.KEY_LOADING,a.trigger(f.default.KEY_LOADING,{frag:A});else{if(v.logger.log("Loading "+A.sn+" of ["+r.startSN+" ,"+r.endSN+"],level "+t+", currentTime:"+e+",bufferEnd:"+h.toFixed(3)),void 0!==this.fragLoadIdx?this.fragLoadIdx++:this.fragLoadIdx=0,A.loadCounter){A.loadCounter++;var O=i.fragLoadingLoopThreshold;if(A.loadCounter>O&&Math.abs(this.fragLoadIdx-A.loadIdx)=I||s)&&(v.logger.log("mediaController: retryDate reached, switch back to IDLE state"),this.state=R.IDLE);break;case R.STOPPED:case R.FRAG_LOADING:case R.PARSING:case R.PARSED:case R.ENDED:}this._checkBuffer(),this._checkFragmentChanged()}},{key:"getBufferRange",value:function(e){var t,r,a=this.bufferRange;if(a)for(t=a.length-1;t>=0;t--)if(r=a[t],e>=r.start&&e<=r.end)return r;return null}},{key:"followingBufferRange",value:function(e){return e?this.getBufferRange(e.end+.5):null}},{key:"isBuffered",value:function(e){var t=this.media;if(t)for(var r=t.buffered,a=0;a=r.start(a)&&e<=r.end(a))return!0;return!1}},{key:"_checkFragmentChanged",value:function(){var e,t,r=this.media;if(r&&r.seeking===!1&&(t=r.currentTime,t>r.playbackRate*this.lastCurrentTime&&(this.lastCurrentTime=t),this.isBuffered(t)?e=this.getBufferRange(t):this.isBuffered(t+.1)&&(e=this.getBufferRange(t+.1)),e)){var a=e.frag;a!==this.fragPlaying&&(this.fragPlaying=a,this.hls.trigger(f.default.FRAG_CHANGED,{frag:a}))}}},{key:"immediateLevelSwitch",value:function(){if(v.logger.log("immediateLevelSwitch"),!this.immediateSwitch){this.immediateSwitch=!0;var e=this.media,t=void 0;e?(t=e.paused,e.pause()):t=!0,this.previouslyPaused=t}var r=this.fragCurrent;r&&r.loader&&r.loader.abort(),this.fragCurrent=null,this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.state=R.PAUSED,this.hls.trigger(f.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY})}},{key:"immediateLevelSwitchEnd",value:function(){this.immediateSwitch=!1;var e=this.media;e&&e.readyState&&(e.currentTime-=1e-4,this.previouslyPaused||e.play())}},{key:"nextLevelSwitch",value:function(){var e=this.media;if(e&&e.readyState){var t=void 0,r=void 0,a=void 0;if(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,r=this.getBufferRange(e.currentTime),r&&r.start>1&&(this.state=R.PAUSED,this.hls.trigger(f.default.BUFFER_FLUSHING,{startOffset:0,endOffset:r.start-1})),e.paused)t=0;else{var i=this.hls.nextLoadLevel,n=this.levels[i],s=this.fragLastKbps;t=s&&this.fragCurrent?this.fragCurrent.duration*n.bitrate/(1e3*s)+1:0}if(a=this.getBufferRange(e.currentTime+t),a&&(a=this.followingBufferRange(a))){var o=this.fragCurrent;o&&o.loader&&o.loader.abort(),this.fragCurrent=null,this.state=R.PAUSED,this.hls.trigger(f.default.BUFFER_FLUSHING,{startOffset:a.start,endOffset:Number.POSITIVE_INFINITY})}}}},{key:"onMediaAttached",value:function(e){var t=this.media=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("seeked",this.onvseeked),t.addEventListener("ended",this.onvended);var r=this.config;this.levels&&r.autoStartLoad&&this.hls.startLoad(r.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(v.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var t=this.levels;t&&t.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("seeked",this.onvseeked),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){if(this.state===R.FRAG_LOADING){if(0===m.default.bufferInfo(this.media,this.media.currentTime,this.config.maxBufferHole).len){v.logger.log("seeking outside of buffer while fragment load in progress, cancel fragment load");var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.state=R.IDLE}}else this.state===R.ENDED&&(this.state=R.IDLE);this.media&&(this.lastCurrentTime=this.media.currentTime),void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold),this.tick()}},{key:"onMediaSeeked",value:function(){this.tick()}},{key:"onMediaEnded",value:function(){v.logger.log("media ended"),this.startPosition=this.lastCurrentTime=0}},{key:"onManifestLoading",value:function(){v.logger.log("trigger BUFFER_RESET"),this.hls.trigger(f.default.BUFFER_RESET),this.bufferRange=[],this.stalled=!1}},{key:"onManifestParsed",value:function(e){var t,r=!1,a=!1;e.levels.forEach(function(e){t=e.audioCodec,t&&(t.indexOf("mp4a.40.2")!==-1&&(r=!0),t.indexOf("mp4a.40.5")!==-1&&(a=!0))}),this.audioCodecSwitch=r&&a,this.audioCodecSwitch&&v.logger.log("both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=e.levels,this.startLevelLoaded=!1,this.startFragRequested=!1;var i=this.config;i.autoStartLoad&&this.hls.startLoad(i.startPosition)}},{key:"onLevelLoaded",value:function(e){var t=e.details,r=e.level,a=this.levels[r],i=t.totalduration,n=0;if(v.logger.log("level "+r+" loaded ["+t.startSN+","+t.endSN+"],duration:"+i),this.levelLastLoaded=r,t.live){var s=a.details;s?(b.default.mergeDetails(s,t),n=t.fragments[0].start,t.PTSKnown?v.logger.log("live playlist sliding:"+n.toFixed(3)):v.logger.log("live playlist - outdated PTS, unknown sliding")):(t.PTSKnown=!1,v.logger.log("live playlist - first load, unknown sliding"))}else t.PTSKnown=!1;if(a.details=t,this.hls.trigger(f.default.LEVEL_UPDATED,{details:t,level:r}),this.startFragRequested===!1){if(this.startPosition===-1){var o=t.startTimeOffset;if(isNaN(o))if(t.live){var l=void 0!==this.config.liveSyncDuration?this.config.liveSyncDuration:this.config.liveSyncDurationCount*t.targetduration;this.startPosition=Math.max(0,n+i-l)}else this.startPosition=0;else v.logger.log("start time offset found in playlist, adjust startPosition to "+o),this.startPosition=o}this.nextLoadPosition=this.startPosition}this.state===R.WAITING_LEVEL&&(this.state=R.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===R.KEY_LOADING&&(this.state=R.IDLE,this.tick())}},{key:"onFragLoaded",value:function(e){var t=this.fragCurrent,r=e.frag;if(this.state===R.FRAG_LOADING&&t&&r.level===t.level&&r.sn===t.sn){var a=e.stats;if(v.logger.log("Loaded "+t.sn+" of level "+t.level),this.fragBitrateTest=!1,r.bitrateTest===!0&&this.hls.nextLoadLevel)this.state=R.IDLE,this.startFragRequested=!1,a.tparsed=a.tbuffered=performance.now(),this.hls.trigger(f.default.FRAG_BUFFERED,{stats:e.stats,frag:t}),this.tick();else{this.state=R.PARSING,this.stats=a;var i=this.levels[this.level],n=i.details,s=n.totalduration,o=void 0===t.startDTS||isNaN(t.startDTS)?t.start:t.startDTS,l=t.level,u=t.sn,d=i.audioCodec||this.config.defaultAudioCodec;this.audioCodecSwap&&(v.logger.log("swapping playlist audio codec"),void 0===d&&(d=this.lastAudioCodec),d&&(d=d.indexOf("mp4a.40.5")!==-1?"mp4a.40.2":"mp4a.40.5")),this.pendingAppending=0,v.logger.log("Demuxing "+u+" of ["+n.startSN+" ,"+n.endSN+"],level "+l+", cc "+t.cc);var h=this.demuxer;h&&h.push(e.payload,d,i.videoCodec,o,t.cc,l,u,s,t.decryptdata)}}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(e){if(this.state===R.PARSING){var t,r,a=e.tracks;if(r=a.audio){var i=this.levels[this.level].audioCodec,n=navigator.userAgent.toLowerCase();i&&this.audioCodecSwap&&(v.logger.log("swapping playlist audio codec"),i=i.indexOf("mp4a.40.5")!==-1?"mp4a.40.2":"mp4a.40.5"),this.audioCodecSwitch&&1!==r.metadata.channelCount&&n.indexOf("firefox")===-1&&(i="mp4a.40.5"),n.indexOf("android")!==-1&&(i="mp4a.40.2",v.logger.log("Android: force audio codec to"+i)),r.levelCodec=i}if(r=a.video,r&&(r.levelCodec=this.levels[this.level].videoCodec),e.unique){var s={codec:"",levelCodec:""};for(t in e.tracks)r=a[t],s.container=r.container,s.codec&&(s.codec+=",",s.levelCodec+=","),r.codec&&(s.codec+=r.codec),r.levelCodec&&(s.levelCodec+=r.levelCodec);a={audiovideo:s}}this.hls.trigger(f.default.BUFFER_CODECS,a);for(t in a){r=a[t],v.logger.log("track:"+t+",container:"+r.container+",codecs[level/parsed]=["+r.levelCodec+"/"+r.codec+"]");var o=r.initSegment;o&&(this.pendingAppending++,this.hls.trigger(f.default.BUFFER_APPENDING,{type:t,data:o}))}this.tick()}}},{key:"onFragParsingData",value:function(e){var t=this;if(this.state===R.PARSING){this.tparse2=Date.now();var r=this.levels[this.level],a=this.fragCurrent;v.logger.log("parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb+",dropped:"+(e.dropped||0));var i=b.default.updateFragPTSDTS(r.details,a.sn,e.startPTS,e.endPTS,e.startDTS,e.endDTS),n=this.hls;n.trigger(f.default.LEVEL_PTS_UPDATED,{details:r.details,level:this.level,drift:i}),"video"===e.type&&(a.dropped=e.dropped),[e.data1,e.data2].forEach(function(r){r&&(t.pendingAppending++,n.trigger(f.default.BUFFER_APPENDING,{type:e.type,data:r}))}),this.nextLoadPosition=e.endPTS,this.bufferRange.push({type:e.type,start:e.startPTS,end:e.endPTS,frag:a}),this.tick()}else v.logger.warn("not in PARSING state but "+this.state+", ignoring FRAG_PARSING_DATA event")}},{key:"onFragParsed",value:function(){this.state===R.PARSING&&(this.stats.tparsed=performance.now(),this.state=R.PARSED,this._checkAppendedParsed())}},{key:"onBufferAppended",value:function(){switch(this.state){case R.PARSING:case R.PARSED:this.pendingAppending--,this._checkAppendedParsed()}}},{key:"_checkAppendedParsed",value:function(){if(this.state===R.PARSED&&0===this.pendingAppending){var e=this.fragCurrent,t=this.stats;e&&(this.fragPrevious=e,t.tbuffered=performance.now(),this.fragLastKbps=Math.round(8*t.length/(t.tbuffered-t.tfirst)),this.hls.trigger(f.default.FRAG_BUFFERED,{stats:t,frag:e}),v.logger.log("media buffered : "+this.timeRangesToString(this.media.buffered)),this.state=R.IDLE),this.tick()}}},{key:"onError",value:function(e){switch(e.details){case _.ErrorDetails.FRAG_LOAD_ERROR:case _.ErrorDetails.FRAG_LOAD_TIMEOUT:if(!e.fatal){var t=this.fragLoadError;if(t?t++:t=1,t<=this.config.fragLoadingMaxRetry||this.media&&this.isBuffered(this.media.currentTime)){this.fragLoadError=t,e.frag.loadCounter=0;var r=Math.min(Math.pow(2,t-1)*this.config.fragLoadingRetryDelay,64e3);v.logger.warn("mediaController: frag loading failed, retry in "+r+" ms"),this.retryDate=performance.now()+r,this.state=R.FRAG_LOADING_WAITING_RETRY}else v.logger.error("mediaController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.hls.trigger(f.default.ERROR,e),this.state=R.ERROR}break;case _.ErrorDetails.FRAG_LOOP_LOADING_ERROR:case _.ErrorDetails.LEVEL_LOAD_ERROR:case _.ErrorDetails.LEVEL_LOAD_TIMEOUT:case _.ErrorDetails.KEY_LOAD_ERROR:case _.ErrorDetails.KEY_LOAD_TIMEOUT:this.state!==R.ERROR&&(this.state=e.fatal?R.ERROR:R.IDLE,v.logger.warn("mediaController: "+e.details+" while loading frag,switch to "+this.state+" state ..."));break;case _.ErrorDetails.BUFFER_FULL_ERROR:this.state!==R.PARSING&&this.state!==R.PARSED||(this.config.maxMaxBufferLength/=2,v.logger.warn("reduce max buffer length to "+this.config.maxMaxBufferLength+"s and switch to IDLE state"),this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.state=R.IDLE)}}},{key:"_checkBuffer",value:function(){var e=this.media;if(e&&e.readyState){var t=e.currentTime,r=e.buffered;if(!this.loadedmetadata&&r.length){this.loadedmetadata=!0;var a=this.startPosition;if(!t&&t!==a&&a){v.logger.log("target start position:"+a);var i=r.start(0),n=r.end(0);(an)&&(a=i,v.logger.log("target start position not buffered, seek to buffered.start(0) "+i)),v.logger.log("adjust currentTime from "+t+" to "+a),e.currentTime=a}}else{var s=m.default.bufferInfo(e,t,0),o=!(e.paused||e.ended||0===e.buffered.length),l=.4,u=t>e.playbackRate*this.lastCurrentTime;if(this.stalled&&u&&(this.stalled=!1,v.logger.log("playback not stuck anymore @"+t)),o&&s.len<=l&&(u?(l=0,this.seekHoleNudgeDuration=0):this.stalled?this.seekHoleNudgeDuration+=this.config.seekHoleNudgeDuration:(this.seekHoleNudgeDuration=0,v.logger.log("playback seems stuck @"+t),this.hls.trigger(f.default.ERROR,{type:_.ErrorTypes.MEDIA_ERROR,details:_.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1}),this.stalled=!0),s.len<=l)){var d=s.nextStart,h=d-t;if(d&&h0){v.logger.log("adjust currentTime from "+e.currentTime+" to next buffered @ "+d+" + nudge "+this.seekHoleNudgeDuration);var c=d+this.seekHoleNudgeDuration-e.currentTime;e.currentTime=d+this.seekHoleNudgeDuration,this.hls.trigger(f.default.ERROR,{type:_.ErrorTypes.MEDIA_ERROR,details:_.ErrorDetails.BUFFER_SEEK_OVER_HOLE,fatal:!1,hole:c})}}}}}},{key:"onFragLoadEmergencyAborted",value:function(){this.state=R.IDLE,this.tick()}},{key:"onBufferFlushed",value:function(){var e,t,r=[];for(t=0;t>7))^e]=e;for(t=r=0;!f[t];t^=a||1,r=v[r]||1)for(s=r^r<<1^r<<2^r<<3^r<<4,s=s>>8^255&s^99,f[t]=s,h[s]=t,n=c[i=c[a=c[t]]],l=16843009*n^65537*i^257*a^16843008*t,o=257*c[s]^16843008*s,e=0;e<4;e++)u[e][t]=o=o<<24^o>>>8,d[e][s]=l=l<<24^l>>>8;for(e=0;e<5;e++)u[e]=u[e].slice(0),d[e]=d[e].slice(0)}},{key:"decrypt",value:function(e,t,r,a,i,n){var s,o,l,u,d=this._key[1],f=e^d[0],h=a^d[1],c=r^d[2],v=t^d[3],g=d.length/4-2,p=4,y=this._tables[1],m=y[0],E=y[1],b=y[2],_=y[3],R=y[4];for(u=0;u>>24]^E[h>>16&255]^b[c>>8&255]^_[255&v]^d[p],o=m[h>>>24]^E[c>>16&255]^b[v>>8&255]^_[255&f]^d[p+1],l=m[c>>>24]^E[v>>16&255]^b[f>>8&255]^_[255&h]^d[p+2],v=m[v>>>24]^E[f>>16&255]^b[h>>8&255]^_[255&c]^d[p+3],p+=4,f=s,h=o,c=l;for(u=0;u<4;u++)i[(3&-u)+n]=R[f>>>24]<<24^R[h>>16&255]<<16^R[c>>8&255]<<8^R[255&v]^d[p++],s=f,f=h,h=c,c=v,v=s}}]),e}();r.default=n},{}],11:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r>8|e>>>24}},{key:"doDecrypt",value:function(e,t,r){var a,i,n,s,l,u,d,f,h,c=new Int32Array(e.buffer,e.byteOffset,e.byteLength>>2),v=new o.default(Array.prototype.slice.call(t)),g=new Uint8Array(e.byteLength),p=new Int32Array(g.buffer);for(a=~~r[0],i=~~r[1],n=~~r[2],s=~~r[3],h=0;h>>5,h-=p,h>0&&g+p+h<=m);)for(y=R+v*c,E={unit:e.subarray(g+p,g+p+h),pts:y,dts:y},b.samples.push(E),b.len+=h,g+=h+p,v++;g>>6)+1,o=(60&t[r+2])>>>2,o>h.length-1?void e.trigger(Event.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+o}):(u=(1&t[r+2])<<2,u|=(192&t[r+3])>>>6,n.logger.log("manifest codec:"+a+",ADTS data:type:"+i+",sampleingIndex:"+o+"["+h[o]+"Hz],channelConfig:"+u),f.indexOf("firefox")!==-1?o>=6?(i=5,d=new Array(4),l=o-3):(i=2,d=new Array(2),l=o):f.indexOf("android")!==-1?(i=2,d=new Array(2),l=o):(i=5,d=new Array(4),a&&(a.indexOf("mp4a.40.29")!==-1||a.indexOf("mp4a.40.5")!==-1)||!a&&o>=6?l=o-3:((a&&a.indexOf("mp4a.40.2")!==-1&&o>=6&&1===u||!a&&1===u)&&(i=2,d=new Array(2)),l=o)),d[0]=i<<3,d[0]|=(14&o)>>1,d[1]|=(1&o)<<7,d[1]|=u<<3,5===i&&(d[1]|=(14&l)>>1,d[2]=(1&l)<<7,d[2]|=8,d[3]=0),{config:d,samplerate:h[o],channelCount:u,codec:"mp4a.40."+i})}}]),e}();r.default=o},{"../errors":21,"../utils/logger":38}],15:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r1?r-1:0),i=1;i1?r-1:0),i=1;i0&&null!=l&&null!=l.key&&"AES-128"===l.method){null==this.decrypter&&(this.decrypter=new v.default(this.hls));var u=this;this.decrypter.decrypt(e,l.key,l.iv,function(e){u.pushDecrypted(e,t,r,a,i,n,s,o)})}else this.pushDecrypted(e,t,r,a,i,n,s,o)}},{key:"onWorkerMessage",value:function(e){var t=e.data;switch(t.event){case o.default.FRAG_PARSING_INIT_SEGMENT:var r={};r.tracks=t.tracks,r.unique=t.unique,this.hls.trigger(o.default.FRAG_PARSING_INIT_SEGMENT,r);break;case o.default.FRAG_PARSING_DATA:this.hls.trigger(o.default.FRAG_PARSING_DATA,{data1:new Uint8Array(t.data1),data2:new Uint8Array(t.data2),startPTS:t.startPTS,endPTS:t.endPTS,startDTS:t.startDTS,endDTS:t.endDTS,type:t.type,nb:t.nb,dropped:t.dropped});break;case o.default.FRAG_PARSING_METADATA:this.hls.trigger(o.default.FRAG_PARSING_METADATA,{samples:t.samples});break;case o.default.FRAG_PARSING_USERDATA:this.hls.trigger(o.default.FRAG_PARSING_USERDATA,{samples:t.samples});break;default:this.hls.trigger(t.event,t.data)}}}]),t}();r.default=p},{"../crypt/decrypter":12,"../demux/demuxer-inline":15,"../demux/demuxer-worker":16,"../errors":21,"../events":23,"../utils/logger":38,webworkify:2}],18:[function(e,t,r){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;re?(this.word<<=e,this.bitsAvailable-=e):(e-=this.bitsAvailable,t=e>>3,e-=t>>3,this.bytesAvailable-=t,this.loadWord(),this.word<<=e,this.bitsAvailable-=e)}},{key:"readBits",value:function(e){var t=Math.min(this.bitsAvailable,e),r=this.word>>>32-t;return e>32&&n.logger.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=t,this.bitsAvailable>0?this.word<<=t:this.bytesAvailable>0&&this.loadWord(),t=e-t,t>0?r<>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()}},{key:"skipUEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"skipEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"readUEG",value:function(){var e=this.skipLZ();return this.readBits(e+1)-1}},{key:"readEG",value:function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)}},{key:"readBoolean",value:function(){return 1===this.readBits(1)}},{key:"readUByte",value:function(){return this.readBits(8)}},{key:"readUShort",value:function(){return this.readBits(16)}},{key:"readUInt",value:function(){return this.readBits(32)}},{key:"skipScalingList",value:function(e){var t,r,a=8,i=8;for(t=0;t>4,y>1){if(m=v+5+e[v+4],m===v+188)continue}else m=v+4;if(R)if(p===A){if(g){if(l&&(this._parseAVCPES(this._parsePES(l)),b&&this._avcTrack.codec&&(T===-1||this._aacTrack.codec)))return void this.remux(e);l={data:[],size:0}}l&&(l.data.push(e.subarray(m,v+188)),l.size+=v+188-m)}else if(p===T){if(g){if(d&&(this._parseAACPES(this._parsePES(d)),b&&this._aacTrack.codec&&(A===-1||this._avcTrack.codec)))return void this.remux(e);d={data:[],size:0}}d&&(d.data.push(e.subarray(m,v+188)),d.size+=v+188-m)}else p===L&&(g&&(f&&this._parseID3PES(this._parsePES(f)),f={data:[],size:0}),f&&(f.data.push(e.subarray(m,v+188)),f.size+=v+188-m));else g&&(m+=e[m]+1),0===p?this._parsePAT(e,m):p===this._pmtId?(this._parsePMT(e,m),R=this.pmtParsed=!0,A=this._avcTrack.id,T=this._aacTrack.id,L=this._id3Track.id,_&&(h.logger.log("reparse from beginning"),_=!1,v=-188)):(h.logger.log("unknown PID found before PAT/PMT"),_=!0)}else this.observer.trigger(u.default.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"TS packet did not start with 0x47"});l&&this._parseAVCPES(this._parsePES(l)),d&&this._parseAACPES(this._parsePES(d)),f&&this._parseID3PES(this._parsePES(f)),this.remux(null)}},{key:"remux",value:function(e){this.remuxer.remux(this._aacTrack,this._avcTrack,this._id3Track,this._txtTrack,this.timeOffset,this.contiguous,e)}},{key:"destroy",value:function(){this.switchLevel(),this._initPTS=this._initDTS=void 0,this._duration=0}},{key:"_parsePAT",value:function(e,t){this._pmtId=(31&e[t+10])<<8|e[t+11]}},{key:"_parsePMT",value:function(e,t){var r,a,i,n;for(r=(15&e[t+1])<<8|e[t+2],a=t+3+r-4,i=(15&e[t+10])<<8|e[t+11],t+=12+i;t4294967295&&(o-=8589934592),64&r?(l=536870912*(14&t[14])+4194304*(255&t[15])+16384*(254&t[16])+128*(255&t[17])+(254&t[18])/2,l>4294967295&&(l-=8589934592)):l=o),n=t[8],u=n+9,e.size-=u,s=new Uint8Array(e.size);f.length;){t=f.shift();var h=t.byteLength;if(u){if(u>h){u-=h;continue}t=t.subarray(u),h-=u,u=0}s.set(t,d),d+=h}return{data:s,pts:o,dts:l,len:i}}return null}},{key:"_parseAVCPES",value:function(e){var t,r,a,i,n=this,s=this._avcTrack,o=s.samples,l=this._parseAVCNALu(e.data),u=[],d=!1,c=!1,v=0;if(0===l.length&&o.length>0){var g=o[o.length-1],p=g.units.units[g.units.units.length-1],y=new Uint8Array(p.data.byteLength+e.data.byteLength);y.set(p.data,0),y.set(e.data,p.data.byteLength),p.data=y,g.units.length+=e.data.byteLength,s.len+=e.data.byteLength}e.data=null;var m="",E=function(){u.length&&(c===!0||s.sps&&(o.length||this.contiguous)?(r={units:{units:u,length:v},pts:e.pts,dts:e.dts,key:c},o.push(r),s.len+=v,s.nbNalu+=u.length):s.dropped++,u=[],v=0)}.bind(this);l.forEach(function(r){switch(r.type){case 1:a=!0,d&&(m+="NDR ");break;case 5:a=!0,d&&(m+="IDR "),c=!0;break;case 6:a=!0,d&&(m+="SEI "),t=new f.default(r.data),t.readUByte();var o=t.readUByte();if(4===o){var l=0;do l=t.readUByte();while(255===l);var h=t.readUByte();if(181===h){var g=t.readUShort();if(49===g){var p=t.readUInt();if(1195456820===p){var y=t.readUByte();if(3===y){var b=t.readUByte(),_=t.readUByte(),R=31&b,A=[b,_];for(i=0;i0){var y=this._avcTrack,m=y.samples;if(m.length){var E=m[m.length-1],b=E.units.units,_=b[b.length-1],R=new Uint8Array(_.data.byteLength+r);R.set(_.data,0),R.set(e.subarray(0,r),_.data.byteLength),_.data=R,E.units.length+=r,y.len+=r}}}n=o,s=i,u=0}else u=0}return n&&(a={data:e.subarray(n,l),type:s,state:u},d.push(a),this.avcNaluState=u),d}},{key:"_parseAACPES",value:function(e){var t,r,a,i,n,s,l,d,f,v=this._aacTrack,g=e.data,p=e.pts,y=0,m=this._duration,E=this.audioCodec,b=this.aacOverFlow,_=this.aacLastPTS;if(b){var R=new Uint8Array(b.byteLength+g.byteLength);R.set(b,0),R.set(g,b.byteLength),g=R}for(n=y,d=g.length;n1&&(h.logger.log("AAC: align PTS for overlapping frames by "+Math.round((L-p)/90)),p=L)}for(;n+5>>5,r-=s,r>0&&n+s+r<=d);)for(l=p+i*a,f={unit:g.subarray(n+s,n+s+r),pts:l,dts:l},v.samples.push(f),v.len+=r,n+=r+s,i++;n=564&&71===e[0]&&71===e[188]&&71===e[376]}}]),e}();r.default=v},{"../errors":21,"../events":23,"../utils/logger":38,"./adts":14,"./exp-golomb":18}],21:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.ErrorTypes={NETWORK_ERROR:"networkError",MEDIA_ERROR:"mediaError",OTHER_ERROR:"otherError"},r.ErrorDetails={MANIFEST_LOAD_ERROR:"manifestLoadError",MANIFEST_LOAD_TIMEOUT:"manifestLoadTimeOut",MANIFEST_PARSING_ERROR:"manifestParsingError",MANIFEST_INCOMPATIBLE_CODECS_ERROR:"manifestIncompatibleCodecsError",LEVEL_LOAD_ERROR:"levelLoadError",LEVEL_LOAD_TIMEOUT:"levelLoadTimeOut",LEVEL_SWITCH_ERROR:"levelSwitchError",FRAG_LOAD_ERROR:"fragLoadError",FRAG_LOOP_LOADING_ERROR:"fragLoopLoadingError",FRAG_LOAD_TIMEOUT:"fragLoadTimeOut",FRAG_DECRYPT_ERROR:"fragDecryptError",FRAG_PARSING_ERROR:"fragParsingError",KEY_LOAD_ERROR:"keyLoadError",KEY_LOAD_TIMEOUT:"keyLoadTimeOut",BUFFER_APPEND_ERROR:"bufferAppendError",BUFFER_APPENDING_ERROR:"bufferAppendingError",BUFFER_STALLED_ERROR:"bufferStalledError",BUFFER_FULL_ERROR:"bufferFullError",BUFFER_SEEK_OVER_HOLE:"bufferSeekOverHole",INTERNAL_EXCEPTION:"internalException"}},{}],22:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},s=function(){function e(e,t){for(var r=0;r1?r-1:0),n=1;nd&&(l[u-1].end=e[o].end):l.push(e[o])}else l.push(e[o])}for(o=0,a=0,i=n=t;o=f&&t=0&&ot.endSN)return 0;if(o=r-t.startSN,l=t.fragments,u=l[o],!isNaN(u.startPTS)){var f=Math.abs(u.startPTS-a);isNaN(u.deltaPTS)?u.deltaPTS=f:u.deltaPTS=Math.max(f,u.deltaPTS),a=Math.min(a,u.startPTS),i=Math.max(i,u.endPTS),n=Math.min(n,u.startDTS),s=Math.max(s,u.endDTS)}var h=a-u.start;for(u.start=u.startPTS=a,u.endPTS=i,u.startDTS=n,u.endDTS=s,u.duration=i-a,d=o;d>0;d--)e.updatePTS(l,d,d-1);for(d=o;dt?i.start=a.start+a.duration:i.start=a.start-i.duration:r>t?(a.duration=s-a.start,a.duration<0&&n.logger.error("negative duration computed for frag "+a.sn+",level "+a.level+", there should be some duration drift between playlist and fragment!")):(i.duration=a.start-s,i.duration<0&&n.logger.error("negative duration computed for frag "+i.sn+",level "+i.level+", there should be some duration drift between playlist and fragment!"))}}]),e}();r.default=s},{"../utils/logger":38}],26:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;r1?t-1:0),a=1;a1?t-1:0),a=1;a>8*(15-r)&255;return t}},{key:"fragmentDecryptdataFromLevelkey",value:function(e,t){var r=e;return e&&e.method&&e.uri&&!e.iv&&(r=this.cloneObj(e),r.iv=this.createInitializationVector(t)),r}},{key:"avc1toavcoti",value:function(e){var t,r=e.split(".");return r.length>2?(t=r.shift()+".",t+=parseInt(r.shift()).toString(16),t+=("000"+parseInt(r.shift()).toString(16)).substr(-4)):t=e,t}},{key:"cloneObj",value:function(e){return JSON.parse(JSON.stringify(e))}},{key:"parseLevelPlaylist",value:function(e,t,r){var a,i,n,s=0,o=0,l={version:null,type:null,url:t,fragments:[],live:!0,startSN:0},u={method:null,key:null,iv:null,uri:null},d=0,f=null,h=null,c=null,v=null,g=null,m=null;for(n=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE):(\d+))|(?:#EXT-X-(TARGETDURATION):(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT(INF):(\d+(?:\.\d+)?)(?:,(.*))?)|(?:(?!#)()(\S.+))|(?:#EXT-X-(BYTERANGE):(\d+(?:@\d+(?:\.\d+)?))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(PROGRAM-DATE-TIME):(.+))|(?:#EXT-X-(VERSION):(\d+))|(?:(#)(.*):(.*))|(?:(#)(.*)))(?:.*)\r?\n?/g;null!==(i=n.exec(e));)switch(i.shift(),i=i.filter(function(e){return void 0!==e}),i[0]){case"VERSION":l.version=parseInt(i[1]);break;case"PLAYLIST-TYPE":l.type=i[1].toUpperCase();break;case"MEDIA-SEQUENCE":s=l.startSN=parseInt(i[1]);break;case"TARGETDURATION":l.targetduration=parseFloat(i[1]);break;case"EXTM3U":break;case"ENDLIST":l.live=!1;break;case"DIS":d++;break;case"BYTERANGE":var E=i[1].split("@");m=1===E.length?g:parseInt(E[1]),g=parseInt(E[0])+m;break;case"INF":c=parseFloat(i[1]),v=i[2]?i[2]:null;break;case"":if(!isNaN(c)){var b=s++;a=this.fragmentDecryptdataFromLevelkey(u,b);var _=i[1]?this.resolve(i[1],t):null;h={url:_,duration:c,title:v,start:o,sn:b,level:r,cc:d,decryptdata:a,programDateTime:f},null!==m&&(h.byteRangeStartOffset=m,h.byteRangeEndOffset=g),l.fragments.push(h),o+=c,c=null,v=null,m=null,f=null}break;case"KEY":var R=i[1],A=new p.default(R),T=A.enumeratedString("METHOD"),L=A.URI,k=A.hexadecimalInteger("IV");T&&(u={method:null,key:null,iv:null,uri:null},L&&"AES-128"===T&&(u.method=T,u.uri=this.resolve(L,t),u.key=null,u.iv=k));break;case"START":var S=i[1],w=new p.default(S),D=w.decimalFloatingPoint("TIME-OFFSET");D&&(l.startTimeOffset=D);break;case"PROGRAM-DATE-TIME":f=new Date(Date.parse(i[1]));break;case"#":i.shift();break;default:y.logger.warn("line parsed but not handled: "+i)}return h&&!h.url&&(l.fragments.pop(),o-=h.duration),l.totalduration=o,l.endSN=s-1,l}},{key:"loadsuccess",value:function(e,t){var r,a=e.currentTarget,i=a.responseText,n=a.responseURL,s=this.id,o=this.id2,l=this.hls;if(this.loading=!1,void 0===n&&(n=this.url),t.tload=performance.now(),t.mtime=new Date(a.getResponseHeader("Last-Modified")),0===i.indexOf("#EXTM3U"))if(i.indexOf("#EXTINF:")>0){var d=this.parseLevelPlaylist(i,n,s||0);d.tload=t.tload,null===s&&l.trigger(u.default.MANIFEST_LOADED,{levels:[{url:n,details:d}],url:n,stats:t}),t.tparsed=performance.now(),l.trigger(u.default.LEVEL_LOADED,{details:d,level:s||0,id:o,stats:t})}else r=this.parseMasterPlaylist(i,n),r.length?l.trigger(u.default.MANIFEST_LOADED,{levels:r,url:n,stats:t}):l.trigger(u.default.ERROR,{type:h.ErrorTypes.NETWORK_ERROR,details:h.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:n,reason:"no level found in manifest"});else l.trigger(u.default.ERROR,{type:h.ErrorTypes.NETWORK_ERROR,details:h.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:n,reason:"no EXTM3U delimiter"})}},{key:"loaderror",value:function(e){var t,r;null===this.id?(t=h.ErrorDetails.MANIFEST_LOAD_ERROR,r=!0):(t=h.ErrorDetails.LEVEL_LOAD_ERROR,r=!1),this.loader&&this.loader.abort(),this.loading=!1,this.hls.trigger(u.default.ERROR,{type:h.ErrorTypes.NETWORK_ERROR,details:t,fatal:r,url:this.url,loader:this.loader,response:e.currentTarget,level:this.id,id:this.id2})}},{key:"loadtimeout",value:function(){var e,t;null===this.id?(e=h.ErrorDetails.MANIFEST_LOAD_TIMEOUT,t=!0):(e=h.ErrorDetails.LEVEL_LOAD_TIMEOUT,t=!1),this.loader&&this.loader.abort(),this.loading=!1,this.hls.trigger(u.default.ERROR,{type:h.ErrorTypes.NETWORK_ERROR,details:e,fatal:t,url:this.url,loader:this.loader,level:this.id,id:this.id2})}}]),t}(f.default);r.default=m},{"../errors":21,"../event-handler":22,"../events":23,"../utils/attr-list":34,"../utils/logger":38,"../utils/url":39}],31:[function(e,t,r){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r>24&255,t[1]=a>>16&255,t[2]=a>>8&255,t[3]=255&a,t.set(e,4),i=0,a=8;i>24&255,t>>16&255,t>>8&255,255&t,r>>24,r>>16&255,r>>8&255,255&r,85,196,0,0]))}},{key:"mdia",value:function(t){return e.box(e.types.mdia,e.mdhd(t.timescale,t.duration),e.hdlr(t.type),e.minf(t))}},{key:"mfhd",value:function(t){return e.box(e.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))}},{key:"minf",value:function(t){return"audio"===t.type?e.box(e.types.minf,e.box(e.types.smhd,e.SMHD),e.DINF,e.stbl(t)):e.box(e.types.minf,e.box(e.types.vmhd,e.VMHD),e.DINF,e.stbl(t))}},{key:"moof",value:function(t,r,a){return e.box(e.types.moof,e.mfhd(t),e.traf(a,r))}},{key:"moov",value:function(t){for(var r=t.length,a=[];r--;)a[r]=e.trak(t[r]);return e.box.apply(null,[e.types.moov,e.mvhd(t[0].timescale,t[0].duration)].concat(a).concat(e.mvex(t)))}},{key:"mvex",value:function(t){for(var r=t.length,a=[];r--;)a[r]=e.trex(t[r]);return e.box.apply(null,[e.types.mvex].concat(a))}},{key:"mvhd",value:function(t,r){r*=t;var a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,2,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24&255,r>>16&255,r>>8&255,255&r,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return e.box(e.types.mvhd,a)}},{key:"sdtp",value:function(t){var r,a,i=t.samples||[],n=new Uint8Array(4+i.length);for(a=0;a>>8&255),n.push(255&i),n=n.concat(Array.prototype.slice.call(a));for(r=0;r>>8&255),s.push(255&i),s=s.concat(Array.prototype.slice.call(a));var o=e.box(e.types.avcC,new Uint8Array([1,n[3],n[4],n[5],255,224|t.sps.length].concat(n).concat([t.pps.length]).concat(s))),l=t.width,u=t.height;return e.box(e.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,l>>8&255,255&l,u>>8&255,255&u,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),o,e.box(e.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])))}},{key:"esds",value:function(e){var t=e.config.length;return new Uint8Array([0,0,0,0,3,23+t,0,1,0,4,15+t,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([t]).concat(e.config).concat([6,1,2]))}},{key:"mp4a",value:function(t){var r=t.audiosamplerate;return e.box(e.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),e.box(e.types.esds,e.esds(t)))}},{key:"stsd",value:function(t){return"audio"===t.type?e.box(e.types.stsd,e.STSD,e.mp4a(t)):e.box(e.types.stsd,e.STSD,e.avc1(t))}},{key:"tkhd",value:function(t){var r=t.id,a=t.duration*t.timescale,i=t.width,n=t.height;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,a>>24,a>>16&255,a>>8&255,255&a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,i>>8&255,255&i,0,0,n>>8&255,255&n,0,0]))}},{key:"traf",value:function(t,r){var a=e.sdtp(t),i=t.id;return e.box(e.types.traf,e.box(e.types.tfhd,new Uint8Array([0,0,0,0,i>>24,i>>16&255,i>>8&255,255&i])),e.box(e.types.tfdt,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r])),e.trun(t,a.length+16+16+8+16+8+8),a)}},{key:"trak",value:function(t){return t.duration=t.duration||4294967295,e.box(e.types.trak,e.tkhd(t),e.mdia(t))}},{key:"trex",value:function(t){var r=t.id;return e.box(e.types.trex,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))}},{key:"trun",value:function(t,r){var a,i,n,s,o,l,u=t.samples||[],d=u.length,f=12+16*d,h=new Uint8Array(f);for(r+=8+f,h.set([0,0,15,1,d>>>24&255,d>>>16&255,d>>>8&255,255&d,r>>>24&255,r>>>16&255,r>>>8&255,255&r],0),a=0;a>>24&255,n>>>16&255,n>>>8&255,255&n,s>>>24&255,s>>>16&255,s>>>8&255,255&s,o.isLeading<<2|o.dependsOn,o.isDependedOn<<6|o.hasRedundancy<<4|o.paddingValue<<1|o.isNonSync,61440&o.degradPrio,15&o.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*a);return e.box(e.types.trun,h)}},{key:"initSegment",value:function(t){e.types||e.init();var r,a=e.moov(t);return r=new Uint8Array(e.FTYP.byteLength+a.byteLength),r.set(e.FTYP),r.set(a,e.FTYP.byteLength),r}}]),e}();r.default=n},{}],32:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;rMath.pow(2,32)&&!function(){var t=function e(t,r){return r?e(r,t%r):t};e.timescale=e.audiosamplerate/t(e.audiosamplerate,1024)}(),l.logger.log("audio mp4 timescale :"+e.timescale),c.audio={container:"audio/mp4",codec:e.codec,initSegment:d.default.initSegment([e]),metadata:{channelCount:e.channelCount}},g&&(a=i=s[0].pts-h*r)),t.sps&&t.pps&&u.length&&(t.timescale=this.MP4_TIMESCALE,c.video={container:"video/mp4",codec:t.codec,initSegment:d.default.initSegment([t]),metadata:{width:t.width,height:t.height}},g&&(a=Math.min(a,u[0].pts-h*r),i=Math.min(i,u[0].dts-h*r))),Object.keys(c).length?(n.trigger(o.default.FRAG_PARSING_INIT_SEGMENT,v),this.ISGenerated=!0,g&&(this._initPTS=a,this._initDTS=i)):n.trigger(o.default.ERROR,{type:f.ErrorTypes.MEDIA_ERROR,details:f.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"no audio/video samples found"})}},{key:"remuxVideo",value:function(e,t,r){var a,i,n,s,u,f,h,c,v,g,p,y,m,E,b,_=8,R=this.PES_TIMESCALE,A=this.PES2MP4SCALEFACTOR,T=[],L=e.samples.reduce(function(e,t){return Math.max(Math.min(e,t.pts-t.dts),-18e3)},0);for(L<0&&l.logger.warn("PTS < DTS detected in video samples, shifting DTS by "+Math.round(L/90)+" ms to overcome this issue"),f=new Uint8Array(e.len+4*e.nbNalu+8),a=new DataView(f.buffer),a.setUint32(0,f.byteLength),f.set(d.default.types.mdat,4);e.samples.length;){for(i=e.samples.shift(),s=0;i.units.units.length;)u=i.units.units.shift(),a.setUint32(_,u.data.byteLength),_+=4,f.set(u.data,_),_+=u.data.byteLength,s+=4+u.data.byteLength;if(p=i.pts-this._initDTS,y=i.dts-this._initDTS+L,y=Math.min(p,y),void 0!==g){m=this._PTSNormalize(p,g),E=this._PTSNormalize(y,g);var k=(E-g)/A;k<=0&&(l.logger.log("invalid sample duration at PTS/DTS: "+i.pts+"/"+i.dts+":"+k),k=1),n.duration=k}else{var S=void 0,w=void 0;S=r?this.nextAvcDts:t*R,m=this._PTSNormalize(p,S),E=this._PTSNormalize(y,S),w=Math.round((E-S)/90),r&&w&&(w>1?l.logger.log("AVC:"+w+" ms hole between fragments detected,filling it"):w<-1&&l.logger.log("AVC:"+-w+" ms overlapping between fragments detected"),E=S,m=Math.max(m-w,E),l.logger.log("Video/PTS/DTS adjusted: "+m+"/"+E+",delta:"+w)),c=Math.max(0,m),v=Math.max(0,E)}n={size:s,duration:0,cts:(m-E)/A,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0}},b=n.flags,i.key===!0?(b.dependsOn=2,b.isNonSync=0):(b.dependsOn=1,b.isNonSync=1),T.push(n),g=E}var D=0;T.length>=2&&(D=T[T.length-2].duration,n.duration=D),this.nextAvcDts=E+D*A;var O=e.dropped;e.len=0,e.nbNalu=0,e.dropped=0,T.length&&navigator.userAgent.toLowerCase().indexOf("chrome")>-1&&(b=T[0].flags,b.dependsOn=2,b.isNonSync=0),e.samples=T,h=d.default.moof(e.sequenceNumber++,v/A,e),e.samples=[],this.observer.trigger(o.default.FRAG_PARSING_DATA,{data1:h,data2:f,startPTS:c/R,endPTS:(m+A*D)/R,startDTS:v/R,endDTS:this.nextAvcDts/R,type:"video",nb:T.length,dropped:O})}},{key:"remuxAudio",value:function(e,t,r){var a,i,n,s,u,f,h,c,v,g,p,y,m,E=8,b=this.PES_TIMESCALE,_=e.timescale,R=b/_,A=1024*e.timescale/e.audiosamplerate,T=[],L=[];for(e.samples.sort(function(e,t){return e.pts-t.pts}),L=e.samples;L.length;){if(i=L.shift(),s=i.unit,g=i.pts-this._initDTS,p=i.dts-this._initDTS,void 0!==v)y=this._PTSNormalize(g,v),m=this._PTSNormalize(p,v),n.duration=(m-v)/R,Math.abs(n.duration-A)>A/10&&l.logger.log("invalid AAC sample duration at PTS "+Math.round(g/90)+",should be 1024,found :"+Math.round(n.duration*e.audiosamplerate/e.timescale)),n.duration=A,y=m=A*R+v;else{var k=void 0,S=void 0;if(k=r?this.nextAacPts:t*b,y=this._PTSNormalize(g,k),m=this._PTSNormalize(p,k),S=Math.round(1e3*(y-k)/b),r&&S){if(S>0)l.logger.log(S+" ms hole between AAC samples detected,filling it");else if(S<-12){l.logger.log(-S+" ms overlapping between AAC samples detected, drop frame"),e.len-=s.byteLength;continue}y=m=k}if(h=Math.max(0,y),c=Math.max(0,m),!(e.len>0))return;u=new Uint8Array(e.len+8),a=new DataView(u.buffer),a.setUint32(0,u.byteLength),u.set(d.default.types.mdat,4)}u.set(s,E),E+=s.byteLength,n={size:s.byteLength,cts:0,duration:0,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0,dependsOn:1}},T.push(n),v=m}var w=0,D=T.length;D>=2&&(w=T[D-2].duration,n.duration=w),D&&(this.nextAacPts=y+R*w,e.len=0,e.samples=T,f=d.default.moof(e.sequenceNumber++,c/R,e),e.samples=[],this.observer.trigger(o.default.FRAG_PARSING_DATA,{data1:f,data2:u,startPTS:h/b,endPTS:this.nextAacPts/b,startDTS:c/b,endDTS:(m+R*w)/b,type:"audio",nb:D}))}},{key:"remuxID3",value:function(e,t){var r,a=e.samples.length;if(a){for(var i=0;i4294967296;)e+=r;return e}},{key:"passthrough",get:function(){return!1}}]),e}();r.default=h},{"../errors":21,"../events":23,"../remux/mp4-generator":31,"../utils/logger":38}],33:[function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(e,t){for(var r=0;rNumber.MAX_SAFE_INTEGER?1/0:t}},{key:"hexadecimalInteger",value:function(e){if(this[e]){var t=(this[e]||"0x").slice(2);t=(1&t.length?"0":"")+t;for(var r=new Uint8Array(t.length/2),a=0;aNumber.MAX_SAFE_INTEGER?1/0:t}},{key:"decimalFloatingPoint",value:function(e){return parseFloat(this[e])}},{key:"enumeratedString",value:function(e){return this[e]}},{key:"decimalResolution",value:function(e){var t=/^(\d+)x(\d+)$/.exec(this[e]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}}}],[{key:"parseAttrList",value:function(e){for(var t,r=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g,a={};null!==(t=r.exec(e));){var i=t[2],n='"';0===i.indexOf(n)&&i.lastIndexOf(n)===i.length-1&&(i=i.slice(1,-1)),a[t[1]]=i}return a}}]),e}();r.default=n},{}],35:[function(e,t,r){"use strict";var a={search:function(e,t){for(var r=0,a=e.length-1,i=null,n=null;r<=a;){i=(r+a)/2|0,n=e[i];var s=t(n);if(s>0)r=i+1;else{if(!(s<0))return n;a=i-1}}return null}};t.exports=a},{}],36:[function(e,t,r){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r0;)e.removeCue(e.cues[0])}},{key:"push",value:function(e,t){this.cue||this._createCue();for(var r,a,i,n,s,o=31&t[0],l=2,u=0;u=48&&i<=63)switch(i){case 48:this.cue.text+="®";break;case 49:this.cue.text+="°";break;case 50:this.cue.text+="½";break;case 51:this.cue.text+="¿";break;case 52:this.cue.text+="™";break;case 53:this.cue.text+="¢";break;case 54:this.cue.text+="";break;case 55:this.cue.text+="£";break;case 56:this.cue.text+="♪";break;case 57:this.cue.text+=" ";break;case 58:this.cue.text+="è";break;case 59:this.cue.text+="â";break;case 60:this.cue.text+="ê";break;case 61:this.cue.text+="î";break;case 62:this.cue.text+="ô";break;case 63:this.cue.text+="û"}if((17===a||25===a)&&i>=32&&i<=47)switch(i){case 32:break;case 33:break;case 34:break;case 35:break;case 36:break;case 37:break;case 38:break;case 39:break;case 40:break;case 41:break;case 42:break;case 43:break;case 44:break;case 45:break;case 46:break;case 47:}if((20===a||28===a)&&i>=32&&i<=47)switch(i){case 32:this._clearActiveCues(e);break;case 33:this.cue.text=this.cue.text.substr(0,this.cue.text.length-1);break;case 34:break;case 35:break;case 36:break;case 37:break;case 38:break;case 39:break;case 40:break;case 41:this._clearActiveCues(e);break;case 42:break;case 43:break;case 44:this._clearActiveCues(e);break;case 45:break;case 46:this._text="";break;case 47:this._flipMemory(e)}if((23===a||31===a)&&i>=33&&i<=35)switch(i){case 33:break;case 34:break;case 35:}}}},{key:"_fromCharCode",value:function(e){switch(e){case 42:return"á";case 2:return"á";case 2:return"é";case 4:return"í";case 5:return"ó";case 6:return"ú";case 3:return"ç";case 4:return"÷";case 5:return"Ñ";case 6:return"ñ";case 7:return"█";default:return String.fromCharCode(e)}}},{key:"_flipMemory",value:function(e){this._clearActiveCues(e),this._flushCaptions(e)}},{key:"_flushCaptions",value:function(e){this._has708||(this._textTrack=this.media.addTextTrack("captions","English","en"),this._has708=!0);var t=!0,r=!1,a=void 0;try{for(var i,n=this.memory[Symbol.iterator]();!(t=(i=n.next()).done);t=!0){var s=i.value;s.startTime=e,this._textTrack.addCue(s),this.display.push(s)}}catch(e){r=!0,a=e}finally{try{!t&&n.return&&n.return()}finally{if(r)throw a}}this.memory=[],this.cue=null}},{key:"_clearActiveCues",value:function(e){var t=!0,r=!1,a=void 0;try{for(var i,n=this.display[Symbol.iterator]();!(t=(i=n.next()).done);t=!0){var s=i.value;s.endTime=e}}catch(e){r=!0,a=e}finally{try{!t&&n.return&&n.return()}finally{if(r)throw a}}this.display=[]}},{key:"_clearBufferedCues",value:function(){}}]),e}();r.default=n},{}],37:[function(e,t,r){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r "+t}function n(e){var t=window.console[e];return t?function(){for(var r=arguments.length,a=Array(r),n=0;n1?t-1:0),a=1;a-1;o=a+r)r=/^\/(?:\.\.\/)*/.exec(s.slice(a))[0].length,n=(n+s.substring(o,a)).replace(new RegExp("(?:\\/+[^\\/]*){0,"+(r-1)/3+"}$"),"/");return n+s.substr(o)}};t.exports=a},{}],40:[function(e,t,r){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r=200&&r<300?(window.clearTimeout(this.timeoutHandle),a.tload=Math.max(a.tfirst,performance.now()),this.onSuccess(e,a)):a.retry>=this.maxRetry||r>=400&&r<499?(window.clearTimeout(this.timeoutHandle),n.logger.error(r+" while loading "+this.url),this.onError(e)):(n.logger.warn(r+" while loading "+this.url+", retrying in "+this.retryDelay+"..."),this.destroy(),window.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,64e3),a.retry++))}},{key:"loadtimeout",value:function(e){n.logger.warn("timeout while loading "+this.url),this.onTimeout(e,this.stats)}},{key:"loadprogress",value:function(e){var t=this.stats;0===t.tfirst&&(t.tfirst=Math.max(performance.now(),t.trequest)),t.loaded=e.loaded,this.onProgress&&this.onProgress(e,t)}}]),e}();r.default=s},{"../utils/logger":38}]},{},[27])(27)}); diff --git a/dashboard-ui/bower_components/hls.js/package.json b/dashboard-ui/bower_components/hls.js/package.json index 852af9cf5a..ed5f8d7ed1 100644 --- a/dashboard-ui/bower_components/hls.js/package.json +++ b/dashboard-ui/bower_components/hls.js/package.json @@ -1,6 +1,6 @@ { "name": "hls.js", - "version": "0.5.47", + "version": "0.5.48", "license": "Apache-2.0", "description": "Media Source Extension - HLS library, by/for Dailymotion", "homepage": "https://github.com/dailymotion/hls.js", diff --git a/dashboard-ui/devices/ios/ios.css b/dashboard-ui/devices/ios/ios.css index f5611a9aac..e85e6c2a78 100644 --- a/dashboard-ui/devices/ios/ios.css +++ b/dashboard-ui/devices/ios/ios.css @@ -59,10 +59,6 @@ h1, h1 a { margin-top: 0; } -.cardImageContainer { - border-radius: 10px; -} - .sidebarLinkText { font-weight: 400 !important; } diff --git a/dashboard-ui/itemdetails.html b/dashboard-ui/itemdetails.html index 1aae70219f..df7f20cd7b 100644 --- a/dashboard-ui/itemdetails.html +++ b/dashboard-ui/itemdetails.html @@ -10,7 +10,6 @@

-
@@ -29,8 +28,6 @@
- -
@@ -53,27 +50,28 @@
- -
+
+ +

-
+

@@ -93,7 +91,7 @@
-
+
@@ -147,7 +145,7 @@

- +

TOMATOMETER®

@@ -160,8 +158,8 @@
-
-

+
+

${HeaderScenes}

@@ -200,7 +198,7 @@

${HeaderMediaInfo}

-
+
diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js index 2e59753cb0..abbb0bd0cb 100644 --- a/dashboard-ui/scripts/itemdetailpage.js +++ b/dashboard-ui/scripts/itemdetailpage.js @@ -172,25 +172,7 @@ hideAll(page, 'syncLocalContainer'); } - if (item.Type == 'Program' && item.TimerId) { - hideAll(page, 'btnCancelRecording', true); - } else { - hideAll(page, 'btnCancelRecording'); - } - - if (item.Type == 'Program' && (!item.TimerId && !item.SeriesTimerId)) { - - if (canPlay) { - hideAll(page, 'btnRecord', true); - hideAll(page, 'btnFloatingRecord'); - } else { - hideAll(page, 'btnRecord'); - hideAll(page, 'btnFloatingRecord', true); - } - } else { - hideAll(page, 'btnRecord'); - hideAll(page, 'btnFloatingRecord'); - } + showRecordingFields(page, item, user); var btnPlayExternalTrailer = page.querySelectorAll('.btnPlayExternalTrailer'); for (var i = 0, length = btnPlayExternalTrailer.length; i < length; i++) { @@ -314,6 +296,31 @@ Dashboard.hideLoadingMsg(); } + function showRecordingFields(page, item, user) { + + var recordingFieldsElement = page.querySelector('.recordingFields'); + + if (item.Type == 'Program' && user.Policy.EnableLiveTvManagement) { + + if (recordingFieldsElement.innerHTML) { + //return; + } + + require(['recordingFields'], function (recordingFields) { + + var currentRecordingFields = new recordingFields({ + parent: recordingFieldsElement, + programId: item.Id, + serverId: item.ServerId + }); + recordingFieldsElement.classList.remove('hide'); + }); + } else { + recordingFieldsElement.classList.add('hide'); + recordingFieldsElement.innerHTML = ''; + } + } + function renderLinks(linksElem, item) { var links = []; @@ -1637,10 +1644,13 @@ }); }); - if (limitExceeded) { - page.querySelector('.moreScenes').classList.remove('hide'); - } else { - page.querySelector('.moreScenes').classList.add('hide'); + var moreScenesButton = page.querySelector('.moreScenes'); + if (moreScenesButton) { + if (limitExceeded) { + moreScenesButton.classList.remove('hide'); + } else { + moreScenesButton.classList.add('hide'); + } } } @@ -1865,10 +1875,13 @@ }); }); - if (limitExceeded && !enableScrollX()) { - page.querySelector('.morePeople').classList.remove('hide'); - } else { - page.querySelector('.morePeople').classList.add('hide'); + var morePeopleButton = page.querySelector('.morePeople'); + if (morePeopleButton) { + if (limitExceeded && !enableScrollX()) { + morePeopleButton.classList.remove('hide'); + } else { + morePeopleButton.classList.add('hide'); + } } } @@ -2075,16 +2088,6 @@ elems[i].addEventListener('change', onSyncLocalClick); } - elems = view.querySelectorAll('.btnRecord,.btnFloatingRecord'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onRecordClick); - } - - elems = view.querySelectorAll('.btnCancelRecording'); - for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener('click', onCancelRecordingClick); - } - elems = view.querySelectorAll('.btnMoreCommands'); for (i = 0, length = elems.length; i < length; i++) { elems[i].addEventListener('click', onMoreCommandsClick); From ab16ffbef2cca7bc831be53f937d19afd03e4b57 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 20 Sep 2016 15:34:12 -0400 Subject: [PATCH 36/91] update recording dialogs --- .../emby-webcomponents/.bower.json | 8 +- .../recordingcreator/recordingeditor.js | 17 +- .../recordingcreator/recordingfields.js | 64 ++++-- .../recordingfields.template.html | 56 +++-- .../recordingcreator/seriesrecordingeditor.js | 202 ++++++++++++++++++ .../seriesrecordingeditor.template.html | 49 +++++ .../emby-webcomponents/strings/ar.json | 27 ++- .../emby-webcomponents/strings/bg-BG.json | 27 ++- .../emby-webcomponents/strings/ca.json | 27 ++- .../emby-webcomponents/strings/cs.json | 27 ++- .../emby-webcomponents/strings/da.json | 27 ++- .../emby-webcomponents/strings/de.json | 27 ++- .../emby-webcomponents/strings/el.json | 27 ++- .../emby-webcomponents/strings/en-GB.json | 27 ++- .../emby-webcomponents/strings/en-US.json | 11 +- .../emby-webcomponents/strings/es-AR.json | 27 ++- .../emby-webcomponents/strings/es-MX.json | 27 ++- .../emby-webcomponents/strings/es.json | 27 ++- .../emby-webcomponents/strings/fi.json | 27 ++- .../emby-webcomponents/strings/fr-CA.json | 27 ++- .../emby-webcomponents/strings/fr.json | 27 ++- .../emby-webcomponents/strings/gsw.json | 27 ++- .../emby-webcomponents/strings/he.json | 27 ++- .../emby-webcomponents/strings/hr.json | 27 ++- .../emby-webcomponents/strings/hu.json | 27 ++- .../emby-webcomponents/strings/id.json | 27 ++- .../emby-webcomponents/strings/it.json | 27 ++- .../emby-webcomponents/strings/kk.json | 27 ++- .../emby-webcomponents/strings/ko.json | 27 ++- .../emby-webcomponents/strings/ms.json | 27 ++- .../emby-webcomponents/strings/nb.json | 27 ++- .../emby-webcomponents/strings/nl.json | 61 +++--- .../emby-webcomponents/strings/pl.json | 27 ++- .../emby-webcomponents/strings/pt-BR.json | 27 ++- .../emby-webcomponents/strings/pt-PT.json | 27 ++- .../emby-webcomponents/strings/ro.json | 27 ++- .../emby-webcomponents/strings/ru.json | 27 ++- .../emby-webcomponents/strings/sk.json | 27 ++- .../emby-webcomponents/strings/sl-SI.json | 27 ++- .../emby-webcomponents/strings/sv.json | 27 ++- .../emby-webcomponents/strings/tr.json | 27 ++- .../emby-webcomponents/strings/uk.json | 27 ++- .../emby-webcomponents/strings/vi.json | 27 ++- .../emby-webcomponents/strings/zh-CN.json | 27 ++- .../emby-webcomponents/strings/zh-HK.json | 27 ++- .../emby-webcomponents/strings/zh-TW.json | 27 ++- dashboard-ui/scripts/site.js | 1 + dashboard-ui/strings/en-US.json | 5 +- 48 files changed, 996 insertions(+), 504 deletions(-) create mode 100644 dashboard-ui/bower_components/emby-webcomponents/recordingcreator/seriesrecordingeditor.js create mode 100644 dashboard-ui/bower_components/emby-webcomponents/recordingcreator/seriesrecordingeditor.template.html diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index 7cc679328b..7ac9348cdc 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.256", - "_release": "1.4.256", + "version": "1.4.258", + "_release": "1.4.258", "_resolution": { "type": "version", - "tag": "1.4.256", - "commit": "dbe988350fad1cbe359594a57be846a89ae764d4" + "tag": "1.4.258", + "commit": "52cd113c96592ab8036ea4878fdff7681459b16d" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js index eec179f69c..3603600ffc 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingeditor.js @@ -53,11 +53,7 @@ recordingUpdated = true; recordingDeleted = isDeleted; - if (isDeleted) { - dialogHelper.close(currentDialog); - } else { - currentDialog.querySelector('.btnSubmit').click(); - } + dialogHelper.close(currentDialog); } function onSubmit(e) { @@ -70,9 +66,7 @@ item.PrePaddingSeconds = form.querySelector('#txtPrePaddingMinutes').value * 60; item.PostPaddingSeconds = form.querySelector('#txtPostPaddingMinutes').value * 60; - apiClient.updateLiveTvTimer(item).then(function () { - dialogHelper.close(currentDialog); - }); + apiClient.updateLiveTvTimer(item); }); e.preventDefault(); @@ -156,6 +150,13 @@ currentDialog = dlg; + dlg.addEventListener('close', function () { + + if (!recordingDeleted) { + this.querySelector('.btnSubmit').click(); + } + }); + dlg.addEventListener('close', function () { if (recordingUpdated) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js index ceb376cd04..9f2116ef07 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.js @@ -1,4 +1,4 @@ -define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'recordingHelper', 'emby-toggle', 'paper-icon-button-light', 'emby-button'], function (globalize, connectionManager, require, loading, appHost, recordingHelper) { +define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'recordingHelper', 'paper-icon-button-light', 'emby-button'], function (globalize, connectionManager, require, loading, appHost, recordingHelper) { function getRegistration(apiClient, programId, feature) { @@ -91,14 +91,11 @@ function loadData(parent, program, apiClient) { if (program.IsSeries) { - parent.querySelector('.chkRecordSeriesContainer').classList.remove('hide'); + parent.querySelector('.recordSeriesContainer').classList.remove('hide'); } else { - parent.querySelector('.chkRecordSeriesContainer').classList.add('hide'); + parent.querySelector('.recordSeriesContainer').classList.add('hide'); } - parent.querySelector('.chkRecord').checked = program.TimerId != null; - parent.querySelector('.chkRecordSeries').checked = program.SeriesTimerId != null; - if (program.SeriesTimerId != null) { showSeriesRecordingFields(parent, program.Id, apiClient); } else { @@ -107,23 +104,23 @@ if (program.SeriesTimerId) { parent.querySelector('.btnManageSeriesRecording').classList.remove('visibilityHide'); + parent.querySelector('.seriesRecordingButton .recordingIcon').classList.add('recordingIcon-active'); + parent.querySelector('.seriesRecordingButton .buttonText').innerHTML = globalize.translate('sharedcomponents#CancelSeries'); } else { parent.querySelector('.btnManageSeriesRecording').classList.add('visibilityHide'); + parent.querySelector('.seriesRecordingButton .recordingIcon').classList.remove('recordingIcon-active'); + parent.querySelector('.seriesRecordingButton .buttonText').innerHTML = globalize.translate('sharedcomponents#RecordSeries'); } if (program.TimerId) { parent.querySelector('.btnManageRecording').classList.remove('visibilityHide'); + parent.querySelector('.singleRecordingButton .recordingIcon').classList.add('recordingIcon-active'); + parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('sharedcomponents#DoNotRecord'); } else { parent.querySelector('.btnManageRecording').classList.add('visibilityHide'); + parent.querySelector('.singleRecordingButton .recordingIcon').classList.remove('recordingIcon-active'); + parent.querySelector('.singleRecordingButton .buttonText').innerHTML = globalize.translate('sharedcomponents#Record'); } - - //var seriesTimerPromise = program.SeriesTimerId ? - // apiClient.getLiveTvSeriesTimer(program.SeriesTimerId) : - // apiClient.getLiveTvProgram(program.Id, apiClient.getCurrentUserId()); - - //seriesTimerPromise.then(function (seriesTimer) { - - //}); } function fetchData(instance) { @@ -156,7 +153,7 @@ } function onManageRecordingClick(e) { - + var options = this.options; if (!this.TimerId) { @@ -168,7 +165,29 @@ require(['recordingEditor'], function (recordingEditor) { recordingEditor.show(self.TimerId, options.serverId, { - + + enableCancel: false + + }).then(function () { + self.changed = true; + }); + }); + } + + function onManageSeriesRecordingClick(e) { + + var options = this.options; + + if (!this.SeriesTimerId) { + return; + } + + var self = this; + + require(['seriesRecordingEditor'], function (seriesRecordingEditor) { + + seriesRecordingEditor.show(self.SeriesTimerId, options.serverId, { + enableCancel: false }).then(function () { @@ -185,9 +204,9 @@ var options = this.options; var apiClient = connectionManager.getApiClient(options.serverId); - var isChecked = e.target.checked; + var isChecked = !e.target.querySelector('i').classList.contains('recordingIcon-active'); - if (e.target.checked) { + if (isChecked) { if (!this.TimerId && !this.SeriesTimerId) { recordingHelper.createRecording(apiClient, options.programId, false).then(function () { fetchData(self); @@ -210,9 +229,9 @@ var options = this.options; var apiClient = connectionManager.getApiClient(options.serverId); - var isChecked = e.target.checked; + var isChecked = !e.target.querySelector('i').classList.contains('recordingIcon-active'); - if (e.target.checked) { + if (isChecked) { showSeriesRecordingFields(options.parent, options.programId, apiClient); if (!this.SeriesTimerId) { @@ -259,9 +278,10 @@ supporterButtons[i].addEventListener('click', onSupporterButtonClick); } - context.querySelector('.chkRecord').addEventListener('change', onRecordChange.bind(self)); - context.querySelector('.chkRecordSeries').addEventListener('change', onRecordSeriesChange.bind(self)); + context.querySelector('.singleRecordingButton').addEventListener('click', onRecordChange.bind(self)); + context.querySelector('.seriesRecordingButton').addEventListener('click', onRecordSeriesChange.bind(self)); context.querySelector('.btnManageRecording').addEventListener('click', onManageRecordingClick.bind(self)); + context.querySelector('.btnManageSeriesRecording').addEventListener('click', onManageSeriesRecordingClick.bind(self)); fetchData(self).then(resolve); }); diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html index af677ed00e..ce08dff98f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html @@ -1,18 +1,24 @@ 
diff --git a/dashboard-ui/scripts/dashboardpage.js b/dashboard-ui/scripts/dashboardpage.js index 44a97ce51a..85984c5477 100644 --- a/dashboard-ui/scripts/dashboardpage.js +++ b/dashboard-ui/scripts/dashboardpage.js @@ -1,4 +1,4 @@ -define(['datetime', 'jQuery', 'dom', 'cardStyle'], function (datetime, $, dom) { +define(['datetime', 'jQuery', 'dom', 'cardStyle', 'listViewStyle'], function (datetime, $, dom) { function renderNoHealthAlertsMessage(page) { @@ -31,7 +31,8 @@ prompt({ label: Globalize.translate('LabelFriendlyServerName'), description: Globalize.translate('LabelFriendlyServerNameHelp'), - value: page.querySelector('.serverNameHeader').innerHTML + value: page.querySelector('.serverNameHeader').innerHTML, + submitText: Globalize.translate('ButtonSave') }).then(function (value) { diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js index e55b1d902f..e0c3e0a1c2 100644 --- a/dashboard-ui/scripts/itemdetailpage.js +++ b/dashboard-ui/scripts/itemdetailpage.js @@ -1,4 +1,4 @@ -define(['layoutManager', 'cardBuilder', 'datetime', 'mediaInfo', 'backdrop', 'listView', 'itemContextMenu', 'itemHelper', 'userdataButtons', 'dom', 'indicators', 'apphost', 'scrollStyles', 'emby-itemscontainer', 'emby-checkbox', 'emby-toggle'], function (layoutManager, cardBuilder, datetime, mediaInfo, backdrop, listView, itemContextMenu, itemHelper, userdataButtons, dom, indicators, appHost) { +define(['layoutManager', 'cardBuilder', 'datetime', 'mediaInfo', 'backdrop', 'listView', 'itemContextMenu', 'itemHelper', 'userdataButtons', 'dom', 'indicators', 'apphost', 'scrollStyles', 'emby-itemscontainer', 'emby-checkbox'], function (layoutManager, cardBuilder, datetime, mediaInfo, backdrop, listView, itemContextMenu, itemHelper, userdataButtons, dom, indicators, appHost) { var currentItem; var currentRecordingFields; diff --git a/dashboard-ui/scripts/ratingdialog.js b/dashboard-ui/scripts/ratingdialog.js deleted file mode 100644 index ea857c2a6e..0000000000 --- a/dashboard-ui/scripts/ratingdialog.js +++ /dev/null @@ -1,115 +0,0 @@ -define(['jQuery'], function ($) { - - window.RatingDialog = function (page) { - - var self = this; - - self.show = function (options) { - - require(['jqmpopup'], function () { - self.showInternal(options); - }); - }; - - self.showInternal = function (options) { - - options = options || {}; - - options.header = options.header || Globalize.translate('HeaderRateAndReview'); - - var html = ''; - - $(page).append(html); - - var popup = $('#popupRatingDialog').popup().trigger('create').on("popupafteropen", function () { - - $('#txtRatingDialogTitle', this).focus(); - - }).popup("open").on("popupafterclose", function () { - - $('form', this).off("submit"); - - $(this).off("popupafterclose").remove(); - - }); - - $('form', popup).on('submit', function () { - - if (options.callback) { - var review = { - id: options.id, - rating: $('#txtRatingDialogRating', this).val(), - title: $('#txtRatingDialogTitle', this).val(), - recommend: $('#txtRatingDialogRecommend', this).checked(), - review: $('#txtRatingDialogReview', this).val(), - }; - - options.callback(review); - } else console.log("No callback function provided"); - - return false; - }); - - }; - - self.close = function () { - $('#popupRatingDialog', page).popup("close"); - }; - }; - - window.RatingHelpers = { - - ratePackage: function (link) { - var id = link.getAttribute('data-id'); - var rating = link.getAttribute('data-rating'); - - var dialog = new RatingDialog($.mobile.activePage); - dialog.show({ - header: Globalize.translate('HeaderRateAndReview'), - id: id, - rating: rating, - callback: function (review) { - console.log(review); - dialog.close(); - - ApiClient.createPackageReview(review).then(function () { - Dashboard.alert({ - message: Globalize.translate('MessageThankYouForYourReview'), - title: Globalize.translate('HeaderThankYou') - }); - }); - } - }); - } - }; - -}); \ No newline at end of file diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 73d57ccd61..aacc25704f 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -1331,7 +1331,6 @@ var AppInfo = {}; define("dashboardcss", ['css!css/dashboard']); define("jqmbase", ['dashboardcss', 'css!thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.theme.css']); - define("jqmicons", ['jqmbase', 'css!thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.icons.css']); define("jqmtable", ['jqmbase', "thirdparty/jquerymobile-1.4.5/jqm.table", 'css!thirdparty/jquerymobile-1.4.5/jqm.table.css']); define("jqmwidget", ['jqmbase', "thirdparty/jquerymobile-1.4.5/jqm.widget"]); @@ -1344,7 +1343,7 @@ var AppInfo = {}; define("jqmcontrolgroup", ['jqmbase', 'css!thirdparty/jquerymobile-1.4.5/jqm.controlgroup.css']); - define("jqmcollapsible", ['jqmbase', "jqmicons", "thirdparty/jquerymobile-1.4.5/jqm.collapsible", 'css!thirdparty/jquerymobile-1.4.5/jqm.collapsible.css']); + define("jqmcollapsible", ['jqmbase', "thirdparty/jquerymobile-1.4.5/jqm.collapsible", 'css!thirdparty/jquerymobile-1.4.5/jqm.collapsible.css']); define("jqmpanel", ['jqmbase', "thirdparty/jquerymobile-1.4.5/jqm.panel", 'css!thirdparty/jquerymobile-1.4.5/jqm.panel.css']); @@ -1608,12 +1607,10 @@ var AppInfo = {}; } function onDialogOpen(dlg) { - if (dlg.classList.contains('formDialog')) { - if (!dlg.classList.contains('background-theme-a')) { + if (!dlg.classList.contains('background-theme-a') && !dlg.classList.contains('actionSheet')) { - dlg.classList.add('background-theme-b'); - dlg.classList.add('ui-body-b'); - } + dlg.classList.add('background-theme-b'); + dlg.classList.add('ui-body-b'); } } diff --git a/dashboard-ui/scripts/useredit.js b/dashboard-ui/scripts/useredit.js index 07cac8129b..1972176a36 100644 --- a/dashboard-ui/scripts/useredit.js +++ b/dashboard-ui/scripts/useredit.js @@ -112,9 +112,19 @@ }); - }, function () { + }, function (response) { - showEmbyConnectErrorMessage('.'); + if (response.status == 500) { + + Dashboard.alert({ + + message: Globalize.translate('ErrorAddingEmbyConnectAccount3') + + }); + + } else { + showEmbyConnectErrorMessage('.'); + } }); } else { diff --git a/dashboard-ui/strings/ar.json b/dashboard-ui/strings/ar.json index a7d6934627..30b0a56548 100644 --- a/dashboard-ui/strings/ar.json +++ b/dashboard-ui/strings/ar.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/be-BY.json b/dashboard-ui/strings/be-BY.json index 4a743929c6..bb0d44d0f2 100644 --- a/dashboard-ui/strings/be-BY.json +++ b/dashboard-ui/strings/be-BY.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/bg-BG.json b/dashboard-ui/strings/bg-BG.json index 8bfe60d978..4949d8a526 100644 --- a/dashboard-ui/strings/bg-BG.json +++ b/dashboard-ui/strings/bg-BG.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/ca.json b/dashboard-ui/strings/ca.json index f5b9913b90..15a96a2c04 100644 --- a/dashboard-ui/strings/ca.json +++ b/dashboard-ui/strings/ca.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Artistes preferits", "HeaderFavoriteSongs": "Can\u00e7ons Preferides", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/cs.json b/dashboard-ui/strings/cs.json index 57c736bece..faabec4bbc 100644 --- a/dashboard-ui/strings/cs.json +++ b/dashboard-ui/strings/cs.json @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "Chyba p\u0159ehr\u00e1v\u00e1n\u00ed", "MessagePlaybackErrorNotAllowed": "V sou\u010dasn\u00e9 dob\u011b nejste opr\u00e1vn\u011bni p\u0159ehr\u00e1vat tento obsah. Pro v\u00edce informac\u00ed se obra\u0165te se na spr\u00e1vce syst\u00e9mu.", "MessagePlaybackErrorNoCompatibleStream": "\u017d\u00e1dn\u00e9 kompatibiln\u00ed streamy nejsou v sou\u010dasn\u00e9 dob\u011b k dispozici. Zkuste to pros\u00edm pozd\u011bji nebo pro v\u00edce podrobnost\u00ed kontaktujte sv\u00e9ho spr\u00e1vce syst\u00e9mu", - "MessagePlaybackErrorRateLimitExceeded": "Limit rychlosti p\u0159ehr\u00e1v\u00e1n\u00ed byl p\u0159ekro\u010den. Pro v\u00edce informac\u00ed se obra\u0165te na spr\u00e1vce syst\u00e9mu.", "MessagePlaybackErrorPlaceHolder": "Zvolen\u00fd obsah nen\u00ed mo\u017en\u00e9 p\u0159ehr\u00e1t z tohoto za\u0159\u00edzen\u00ed.", "HeaderSelectAudio": "Vyber audio", "HeaderSelectSubtitles": "Vyber titulky", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "Nastala chyba p\u0159i odebr\u00e1n\u00ed \u00fa\u010dtu Emby Connect. Zkontrolujte zda m\u00e1te aktivn\u00ed internetov\u00e9 p\u0159ipojen\u00ed a zkuste znovu.", "ErrorAddingEmbyConnectAccount1": "Nastala chyba p\u0159i p\u0159id\u00e1v\u00e1n\u00ed \u00fa\u010dtu Emby Connect. Opravdu m\u00e1te vytvo\u0159en \u00fa\u010det u Emby? P\u0159ihlaste se zde {0}.", "ErrorAddingEmbyConnectAccount2": "Pros\u00edm, ujist\u011bte se, \u017ee \u00fa\u010det Emby byl aktivov\u00e1n podle pokyn\u016f v e-mailu zaslan\u00e9m po vytvo\u0159en\u00ed \u00fa\u010dtu. Pokud jste neobdr\u017eeli e-mail, pak pros\u00edm po\u0161lete e-mail na adresu {0} z e-mailov\u00e9 adresy pou\u017eit\u00fd na \u00fa\u010dtu Emby.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Obl\u00edben\u00ed \u00fam\u011blci", "HeaderFavoriteSongs": "Obl\u00edben\u00e1 hudba", "HeaderConfirmPluginInstallation": "Potvrzen\u00ed instalace z\u00e1suvn\u00e9ho modulu", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/da.json b/dashboard-ui/strings/da.json index e4d4b0b792..9b445cfd32 100644 --- a/dashboard-ui/strings/da.json +++ b/dashboard-ui/strings/da.json @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "Fejl i afspilning", "MessagePlaybackErrorNotAllowed": "Du er p\u00e5 nuv\u00e6rende tidspunkt ikke autoriseret til at afspille dette indhold. Kontakt venligst din systemadministrator for flere detaljer.", "MessagePlaybackErrorNoCompatibleStream": "Ingen kompatible streams er tilg\u00e6ngelige p\u00e5 nuv\u00e6rende tidspunkt. Pr\u00f8v igen senere eller kontakt din systemadministrator for flere detaljer.", - "MessagePlaybackErrorRateLimitExceeded": "Din afspilningskvote er blevet overskredet. Kontakt venligst din systemadministrator for flere detaljer.", "MessagePlaybackErrorPlaceHolder": "Det valgte indhold kan ikke afspilles fra denne enhed.", "HeaderSelectAudio": "V\u00e6lg lydspor", "HeaderSelectSubtitles": "V\u00e6lg undertekster", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/de.json b/dashboard-ui/strings/de.json index 90f34caae2..6aeae924fb 100644 --- a/dashboard-ui/strings/de.json +++ b/dashboard-ui/strings/de.json @@ -90,7 +90,7 @@ "LabelCountry": "Land:", "LabelLanguage": "Sprache:", "LabelTimeLimitHours": "Zeitlimit (Stunden):", - "HeaderPreferredMetadataLanguage": "Bevorzugte Metadata Sprache:", + "HeaderPreferredMetadataLanguage": "Bevorzugte Sprache der Metadaten:", "LabelSaveLocalMetadata": "Speichere Bildmaterial und Metadaten in den Medienverzeichnissen", "LabelSaveLocalMetadataHelp": "Durch die Speicherung von Bildmaterial und Metadaten direkt in den Medienverzeichnissen, befinden sich diese an einem Ort wo sie sehr leicht bearbeitet werden k\u00f6nnen.", "LabelDownloadInternetMetadata": "Lade Bildmaterial und Metadaten aus dem Internet", @@ -338,7 +338,7 @@ "TitleMetadata": "Metadaten", "LabelFanartApiKey": "Pers\u00f6nlicher API Schl\u00fcssel:", "LabelFanartApiKeyHelp": "Fanart Anfragen ohne einen pers\u00f6nlichen API Schl\u00fcssel liefert Bilder der letzten 7 Tage. Bei Verwendung eines pers\u00f6nlichen API Schl\u00fcssels werden Ergebnisse der letzten 48 Stunden, und als VIP Member, der letzten 10 Minuten geliefert.", - "ExtractChapterImagesHelp": "Das Extrahieren von Kapitel-Bildern erm\u00f6glicht es den Clients eine grafische Szenenauswahl anzubieten. Das Erstellen ist recht langsam, rechenintensiv und erfordert ggf. einige Gigabyte an freien Speicherplatz. Diese Aufgabe startet wenn neue Videos erkannt werden und ebenso als eine n\u00e4chtliche Aufgabe. Es wird nicht empfohlen diese Aufgabe in Zeiten hoher Server-Auslastung zu starten.", + "ExtractChapterImagesHelp": "Das Extrahieren von Kapitel-Bildern erm\u00f6glicht es Emby-Apps eine grafische Szenenauswahl anzubieten. Das Erstellen ist recht langsam, rechenintensiv und erfordert ggf. einige Gigabyte an freien Speicherplatz. Diese Aufgabe startet wenn neue Videos erkannt werden und ebenso als eine n\u00e4chtliche Aufgabe. Es wird nicht empfohlen diese Aufgabe in Zeiten hoher Server-Auslastung zu starten.", "LabelMetadataDownloadLanguage": "Bevorzugte Sprache f\u00fcr Downloads:", "ButtonSignIn": "Einloggen", "TitleSignIn": "Einloggen", @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "Wiedergabefehler", "MessagePlaybackErrorNotAllowed": "Sie sind nicht befugt diese Inhalte wiederzugeben. Bitte kontaktieren Sie Ihren Systemadministrator f\u00fcr weitere Details.", "MessagePlaybackErrorNoCompatibleStream": "Es sind keine kompatiblen Streams verf\u00fcgbar. Bitte versuchen Sie es sp\u00e4ter erneut oder kontaktieren Sie Ihren Systemadministrator f\u00fcr weitere Details.", - "MessagePlaybackErrorRateLimitExceeded": "Ihr Wiedergabelimit wurde \u00fcberschritten. Bitte kontaktieren Sie Ihren Systemadministrator f\u00fcr weitere Details.", "MessagePlaybackErrorPlaceHolder": "Der gew\u00e4hlte Inhalt kann auf diesem Ger\u00e4t nicht abgespielt werden.", "HeaderSelectAudio": "W\u00e4hle Audio", "HeaderSelectSubtitles": "W\u00f6hle Untertitel", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "Ein Fehler trat beim entfernen des Empy Connect Kontos auf. Bitte stellen Sie sicher, dass Sie \u00fcber eine aktive Internetverbindung verf\u00fcgen und versuchen Sie es erneut.", "ErrorAddingEmbyConnectAccount1": "Ein Fehler trat beim hinzuf\u00fcgen des Emby-Connect Kontos auf. Haben Sie bereits ein Emby Konto? Melden Sie sich hier an: {0}.", "ErrorAddingEmbyConnectAccount2": "Bitte stellen Sie sicher, dass Ihr Emby Konto nach den Anweisungen aus der Email, die Sie nach Erstellung des Kontos erhielten, aktiviert wurde. Wenn Sie keine Email erhalten haben, so senden Sie und bitte eine email an {0}. Benutzen Sie dazu bitte die Email-Adresse, die Sie bereits zur Erstellung Ihres Emby Kontos verwendet haben.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Lieblings K\u00fcnstler", "HeaderFavoriteSongs": "Lieblings Songs", "HeaderConfirmPluginInstallation": "Best\u00e4tige Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sport", "HeaderForKids": "F\u00fcr Kinder", "HeaderRecordingGroups": "Aufnahme-Gruppen", - "LabelConvertRecordingsTo": "Konvertiere Aufnahmen nach:" + "LabelConvertRecordingsTo": "Konvertiere Aufnahmen nach:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/el.json b/dashboard-ui/strings/el.json index 31a80e9a43..15a0b97fbe 100644 --- a/dashboard-ui/strings/el.json +++ b/dashboard-ui/strings/el.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/en-GB.json b/dashboard-ui/strings/en-GB.json index 44e484dc14..f52622a3c4 100644 --- a/dashboard-ui/strings/en-GB.json +++ b/dashboard-ui/strings/en-GB.json @@ -1,6 +1,6 @@ { "LabelExit": "Exit", - "LabelApiDocumentation": "Api Documentation", + "LabelApiDocumentation": "API Documentation", "LabelBrowseLibrary": "Browse Library", "LabelConfigureServer": "Configure Emby", "LabelPrevious": "Previous", @@ -38,7 +38,7 @@ "HeaderSupporterBenefits": "Emby Premiere Benefits", "HeaderAddUser": "Add User", "LabelAddConnectSupporterHelp": "To add a user who isn't listed, you'll need to first link their account to Emby Connect from their user profile page.", - "LabelPinCode": "Pin code:", + "LabelPinCode": "PIN code:", "OptionHideWatchedContentFromLatestMedia": "Hide watched content from latest media", "HeaderSync": "Sync", "ButtonOk": "Ok", @@ -52,13 +52,13 @@ "HeaderPaths": "Paths", "CategorySync": "Sync", "TabPlaylist": "Playlist", - "HeaderEasyPinCode": "Easy Pin Code", + "HeaderEasyPinCode": "Easy PIN Code", "HeaderInstalledServices": "Installed Services", "HeaderAvailableServices": "Available Services", "MessageNoServicesInstalled": "No services are currently installed.", - "HeaderToAccessPleaseEnterEasyPinCode": "To access, please enter your easy pin code", - "KidsModeAdultInstruction": "Click the lock icon in the bottom right to configure or leave children mode. Your pin code will be required.", - "ButtonConfigurePinCode": "Configure pin code", + "HeaderToAccessPleaseEnterEasyPinCode": "To access, please enter your easy PIN code", + "KidsModeAdultInstruction": "Click the lock icon in the bottom right to configure or leave children mode. Your PIN code will be required.", + "ButtonConfigurePinCode": "Configure PIN code", "RegisterWithPayPal": "Register with PayPal", "HeaderEnjoyDayTrial": "Enjoy a 14 Day Free Trial", "LabelSyncTempPath": "Temporary file path:", @@ -90,7 +90,7 @@ "LabelCountry": "Country:", "LabelLanguage": "Language:", "LabelTimeLimitHours": "Time limit (hours):", - "HeaderPreferredMetadataLanguage": "Preferred metadata language:", + "HeaderPreferredMetadataLanguage": "Preferred Metadata Language", "LabelSaveLocalMetadata": "Save artwork and metadata into media folders", "LabelSaveLocalMetadataHelp": "Saving artwork and metadata directly into media folders will put them in a place where they can be easily edited.", "LabelDownloadInternetMetadata": "Download artwork and metadata from the internet", @@ -260,7 +260,7 @@ "HeaderManagement": "Management", "LabelManagement": "Management:", "OptionMissingImdbId": "Missing IMDb Id", - "OptionMissingTvdbId": "Missing TheTVDB Id", + "OptionMissingTvdbId": "Missing TheTVDB ID", "OptionMissingOverview": "Missing Overview", "TabGeneral": "General", "TitleSupport": "Support", @@ -289,9 +289,9 @@ "OptionAllowManageLiveTv": "Allow Live TV recording management", "OptionAllowRemoteControlOthers": "Allow remote control of other users", "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", - "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", + "OptionAllowRemoteSharedDevicesHelp": "DLNA devices are considered shared until a user begins controlling it.", "OptionAllowLinkSharing": "Allow social media sharing", - "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.", + "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire after {0} days.", "HeaderSharing": "Sharing", "HeaderRemoteControl": "Remote Control", "OptionMissingTmdbId": "Missing Tmdb Id", @@ -299,8 +299,8 @@ "OptionIsSD": "SD", "OptionMetascore": "Metascore", "ButtonSelect": "Select", - "PismoMessage": "Utilizing Pismo File Mount through a donated license.", - "TangibleSoftwareMessage": "Utilizing Tangible Solutions Java\/C# converters through a donated license.", + "PismoMessage": "Utilising Pismo File Mount through a donated license.", + "TangibleSoftwareMessage": "Utilising Tangible Solutions Java\/C# converters through a donated license.", "HeaderCredits": "Credits", "PleaseSupportOtherProduces": "Please support other free products we utilise:", "VersionNumber": "Version {0}", @@ -310,7 +310,7 @@ "TitleAdvanced": "Advanced", "OptionRelease": "Official Release", "OptionBeta": "Beta", - "OptionDev": "Dev (Unstable)", + "OptionDev": "Dev", "LabelAllowServerAutoRestart": "Allow the server to restart automatically to apply updates", "LabelAllowServerAutoRestartHelp": "The server will only restart during idle periods, when no users are active.", "LabelRunServerAtStartup": "Run server at startup", @@ -336,9 +336,9 @@ "OptionEpisodes": "Episodes", "OptionOtherVideos": "Other Videos", "TitleMetadata": "Metadata", - "LabelFanartApiKey": "Personal api key:", - "LabelFanartApiKeyHelp": "Requests to fanart without a personal API key return results that were approved over 7 days ago. With a personal API key that drops to 48 hours and if you are also a fanart VIP member that will further drop to around 10 minutes.", - "ExtractChapterImagesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs when videos are discovered, and also as a nightly scheduled task. The schedule is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.", + "LabelFanartApiKey": "Personal API key:", + "LabelFanartApiKeyHelp": "Requests to fanart without a personal API key return images that were approved over 7 days ago. With a personal API key that drops to 48 hours and if you are also a fanart VIP member that will further drop to around 10 minutes.", + "ExtractChapterImagesHelp": "Extracting chapter images will allow Emby apps to display graphical scene selection menus. The process can be slow, CPU-intensive and may require several gigabytes of space. It runs when videos are discovered, and also as a nightly scheduled task. The schedule is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.", "LabelMetadataDownloadLanguage": "Preferred download language:", "ButtonSignIn": "Sign In", "TitleSignIn": "Sign In", @@ -384,7 +384,7 @@ "LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.", "OptionAutomatic": "Auto", "HeaderServices": "Services", - "LabelCustomizeOptionsPerMediaType": "Customize for media type:", + "LabelCustomizeOptionsPerMediaType": "Customise for media type:", "OptionDownloadThumbImage": "Thumb", "OptionDownloadMenuImage": "Menu", "OptionDownloadLogoImage": "Logo", @@ -446,12 +446,12 @@ "ButtonPlayTrailer": "Trailer", "LabelMissing": "Missing", "LabelOffline": "Offline", - "PathSubstitutionHelp": "Path substitutions are used for mapping a path on the server to a path that clients are able to access. By allowing clients direct access to media on the server they may be able to play them directly over the network and avoid using server resources to stream and transcode them.", + "PathSubstitutionHelp": "Path substitutions are used for mapping a path on the server to a path that Emby apps are able to access. By allowing Emby apps direct access to media on the server they may be able to play them directly over the network and avoid using server resources to stream and transcode them.", "HeaderFrom": "From", "HeaderTo": "To", "LabelFrom": "From:", "LabelTo": "To:", - "LabelToHelp": "Example: \\\\MyServer\\Movies (a path clients can access)", + "LabelToHelp": "Example: \\\\MyServer\\Movies (a path that can be accessed by Emby apps)", "ButtonAddPathSubstitution": "Add Substitution", "OptionSpecialEpisode": "Specials", "OptionMissingEpisode": "Missing Episodes", @@ -477,7 +477,7 @@ "HeaderLinks": "Links", "LinkCommunity": "Community", "LinkGithub": "Github", - "LinkApi": "Api", + "LinkApi": "API", "LabelFriendlyServerName": "Friendly server name:", "LabelFriendlyServerNameHelp": "This name will be used to identify this server. If left blank, the computer name will be used.", "LabelPreferredDisplayLanguage": "Preferred display language:", @@ -487,20 +487,20 @@ "ButtonCreate": "Create", "LabelCustomCss": "Custom css:", "LabelCustomCssHelp": "Apply your own custom css to the web interface.", - "LabelLocalHttpServerPortNumber": "Local http port number:", - "LabelLocalHttpServerPortNumberHelp": "The tcp port number that Emby's http server should bind to.", - "LabelPublicHttpPort": "Public http port number:", - "LabelPublicHttpPortHelp": "The public port number that should be mapped to the local http port.", - "LabelPublicHttpsPort": "Public https port number:", - "LabelPublicHttpsPortHelp": "The public port number that should be mapped to the local https port.", - "LabelEnableHttps": "Report https as external address", - "LabelEnableHttpsHelp": "If enabled, the server will report an https url to clients as it's external address.", - "LabelHttpsPort": "Local https port number:", - "LabelHttpsPortHelp": "The tcp port number that Emby's https server should bind to.", + "LabelLocalHttpServerPortNumber": "Local HTTP port number:", + "LabelLocalHttpServerPortNumberHelp": "The TCP port number that Emby's HTTP server should bind to.", + "LabelPublicHttpPort": "Public HTTP port number:", + "LabelPublicHttpPortHelp": "The public port number that should be mapped to the local HTTP port.", + "LabelPublicHttpsPort": "Public HTTPS port number:", + "LabelPublicHttpsPortHelp": "The public port number that should be mapped to the local HTTPS port.", + "LabelEnableHttps": "Report HTTPS as external address", + "LabelEnableHttpsHelp": "If enabled, the server will report an HTTPS URL to clients as its external address.", + "LabelHttpsPort": "Local HTTPS port number:", + "LabelHttpsPortHelp": "The TCP port number that Emby's HTTPS server should bind to.", "LabelEnableAutomaticPortMap": "Enable automatic port mapping", "LabelEnableAutomaticPortMapHelp": "Attempt to automatically map the public port to the local port via UPnP. This may not work with some router models.", "LabelExternalDDNS": "External domain:", - "LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Emby apps will use it when connecting remotely. This field is required when used with a custom ssl certificate.", + "LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Emby apps will use it when connecting remotely. This field is required when used with a custom SSL certificate.", "TitleAppSettings": "App Settings", "LabelMinResumePercentage": "Min resume percentage:", "LabelMaxResumePercentage": "Max resume percentage:", @@ -511,7 +511,7 @@ "TitleAutoOrganize": "Auto-Organise", "TabActivityLog": "Activity Log", "TabSmartMatches": "Smart Matches", - "TabSmartMatchInfo": "Manage your smart matches that were added using the Auto-Organize correction dialog", + "TabSmartMatchInfo": "Manage your smart matches that were added using the Auto-Organise correction dialog", "HeaderName": "Name", "HeaderDate": "Date", "HeaderSource": "Source", @@ -547,7 +547,7 @@ "HeaderTerm": "Term", "HeaderPattern": "Pattern", "HeaderResult": "Result", - "LabelDeleteEmptyFolders": "Delete empty folders after organizing", + "LabelDeleteEmptyFolders": "Delete empty folders after organising", "LabelDeleteEmptyFoldersHelp": "Enable this to keep the download directory clean.", "LabelDeleteLeftOverFiles": "Delete left over files with the following extensions:", "LabelDeleteLeftOverFilesHelp": "Separate with ;. For example: .nfo;.txt", @@ -590,7 +590,7 @@ "ErrorMessageInvalidKey": "In order for any premium content to be registered, you must also have an active Emby Premiere subscription.", "HeaderDisplaySettings": "Display Settings", "TabPlayTo": "Play To", - "LabelEnableDlnaServer": "Enable Dlna server", + "LabelEnableDlnaServer": "Enable DLNA server", "LabelEnableDlnaServerHelp": "Allows UPnP devices on your network to browse and play Emby content.", "LabelEnableBlastAliveMessages": "Blast alive messages", "LabelEnableBlastAliveMessagesHelp": "Enable this if the server is not detected reliably by other UPnP devices on your network.", @@ -601,7 +601,7 @@ "TitleDlna": "DLNA", "HeaderServerSettings": "Server Settings", "HeaderRequireManualLogin": "Require manual username entry for:", - "HeaderRequireManualLoginHelp": "When disabled clients may present a login screen with a visual selection of users.", + "HeaderRequireManualLoginHelp": "When disabled, Emby apps may present a login screen with a visual selection of users.", "OptionOtherApps": "Other apps", "OptionMobileApps": "Mobile apps", "HeaderNotificationList": "Click on a notification to configure sending options.", @@ -633,7 +633,7 @@ "CategoryApplication": "Application", "CategoryPlugin": "Plugin", "LabelAvailableTokens": "Available tokens:", - "AdditionalNotificationServices": "Browse the plugin catalog to install additional notification services.", + "AdditionalNotificationServices": "Browse the plugin catalogue to install additional notification services.", "OptionAllUsers": "All users", "OptionAdminUsers": "Administrators", "OptionCustomUsers": "Custom", @@ -703,7 +703,7 @@ "LabelEmbedAlbumArtDidl": "Embed album art in Didl", "LabelEmbedAlbumArtDidlHelp": "Some devices prefer this method for obtaining album art. Others may fail to play with this option enabled.", "LabelAlbumArtPN": "Album art PN:", - "LabelAlbumArtHelp": "PN used for album art, within the dlna:profileID attribute on upnp:albumArtURI. Some clients require a specific value, regardless of the size of the image.", + "LabelAlbumArtHelp": "PN used for album art, within the dlna:profileID attribute on upnp:albumArtURI. Some devices require a specific value, regardless of the size of the image.", "LabelAlbumArtMaxWidth": "Album art max width:", "LabelAlbumArtMaxWidthHelp": "Max resolution of album art exposed via upnp:albumArtURI.", "LabelAlbumArtMaxHeight": "Album art max height:", @@ -715,7 +715,7 @@ "LabelIdentificationFieldHelp": "A case-insensitive substring or regex expression.", "HeaderProfileServerSettingsHelp": "These values control how Emby Server will present itself to the device.", "LabelMaxBitrate": "Max bitrate:", - "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", + "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes its own limit.", "LabelMaxStreamingBitrate": "Max streaming bitrate:", "LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.", "LabelMaxChromecastBitrate": "Max Chromecast bitrate:", @@ -724,14 +724,14 @@ "LabelMusicStreamingTranscodingBitrate": "Music transcoding bitrate:", "LabelMusicStreamingTranscodingBitrateHelp": "Specify a max bitrate when streaming music", "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honoured but will ignore the byte range header.", "LabelFriendlyName": "Friendly name", "LabelManufacturer": "Manufacturer", - "LabelManufacturerUrl": "Manufacturer url", + "LabelManufacturerUrl": "Manufacturer URL", "LabelModelName": "Model name", "LabelModelNumber": "Model number", "LabelModelDescription": "Model description", - "LabelModelUrl": "Model url", + "LabelModelUrl": "Model URL", "LabelSerialNumber": "Serial number", "LabelDeviceDescription": "Device description", "HeaderIdentificationCriteriaHelp": "Enter at least one identification criteria.", @@ -822,7 +822,7 @@ "PlaceholderUsername": "Username", "HeaderBecomeProjectSupporter": "Get Emby Premiere", "MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.", - "MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, Albums, Books and Games. Click the + button to start creating Collections.", + "MessageNoCollectionsAvailable": "Collections allow you to enjoy personalised groupings of Movies, Series, Albums, Books and Games. Click the + button to start creating Collections.", "MessageNoPlaylistsAvailable": "Playlists allow you to create lists of content to play consecutively at a time. To add items to playlists, right click or tap and hold, then select Add to Playlist.", "MessageNoPlaylistItemsAvailable": "This playlist is currently empty.", "ButtonDismiss": "Dismiss", @@ -830,7 +830,7 @@ "LabelChannelStreamQuality": "Preferred internet channel quality:", "LabelChannelStreamQualityHelp": "In a low bandwidth environment, limiting quality can help ensure a smooth streaming experience.", "OptionBestAvailableStreamQuality": "Best available", - "ChannelSettingsFormHelp": "Install channels such as Trailers and Vimeo in the plugin catalog.", + "ChannelSettingsFormHelp": "Install channels such as Trailers and Vimeo in the plugin catalogue.", "ViewTypePlaylists": "Playlists", "ViewTypeMovies": "Movies", "ViewTypeTvShows": "TV", @@ -880,27 +880,27 @@ "LabelProtocolInfo": "Protocol info:", "LabelProtocolInfoHelp": "The value that will be used when responding to GetProtocolInfo requests from the device.", "TabNfoSettings": "Nfo Settings", - "HeaderKodiMetadataHelp": "Emby includes native support for Nfo metadata files. To enable or disable Nfo metadata, use the Advanced tab to configure options for your media types.", - "LabelKodiMetadataUser": "Sync user watch data to nfo's for:", + "HeaderKodiMetadataHelp": "Emby includes native support for Nfo metadata files. To enable or disable Nfo metadata, use the Services tab to configure options for your media types.", + "LabelKodiMetadataUser": "Sync user watch data to Nfos for:", "LabelKodiMetadataUserHelp": "Enable this to keep watch data in sync between Emby Server and Nfo files.", "LabelKodiMetadataDateFormat": "Release date format:", - "LabelKodiMetadataDateFormatHelp": "All dates within nfo's will be read and written to using this format.", + "LabelKodiMetadataDateFormatHelp": "All dates within nfos will be read and written to using this format.", "LabelKodiMetadataSaveImagePaths": "Save image paths within nfo files", "LabelKodiMetadataSaveImagePathsHelp": "This is recommended if you have image file names that don't conform to Kodi guidelines.", "LabelKodiMetadataEnablePathSubstitution": "Enable path substitution", "LabelKodiMetadataEnablePathSubstitutionHelp": "Enables path substitution of image paths using the server's path substitution settings.", "LabelKodiMetadataEnablePathSubstitutionHelp2": "See path substitution.", - "OptionDisplayChannelsInline": "Display channels inline within my views", - "OptionDisplayChannelsInlineHelp": "If enabled, channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.", + "OptionDisplayChannelsInline": "Display channels as media folders", + "OptionDisplayChannelsInlineHelp": "If enabled, channels will be displayed directly alongside other media libraries. If disabled, they'll be displayed within a separate Channels folder.", "LabelDisplayCollectionsView": "Display a collections view to show movie collections", - "LabelDisplayCollectionsViewHelp": "This will create a separate view to display collections that you've created or have access to. To create a collection, right-click or tap-hold any movie and select 'Add to Collection'. ", + "LabelDisplayCollectionsViewHelp": "This will create a separate view to display movie collections. To create a collection, right-click or tap-hold any movie and select 'Add to Collection'. ", "LabelKodiMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs", "LabelKodiMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Kodi skin compatibility.", "TabServices": "Services", "TabLogs": "Logs", "HeaderServerLogFiles": "Server log files:", "TabBranding": "Branding", - "HeaderBrandingHelp": "Customize the appearance of Emby to fit the needs of your group or organization.", + "HeaderBrandingHelp": "Customise the appearance of Emby to fit the needs of your group or organisation.", "LabelLoginDisclaimer": "Login disclaimer:", "LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.", "OptionList": "List", @@ -912,15 +912,15 @@ "LabelTranscodingTemporaryFiles": "Transcoding temporary files:", "HeaderLatestMusic": "Latest Music", "HeaderBranding": "Branding", - "HeaderApiKeys": "Api Keys", - "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Emby Server. Keys are issued by logging in with an Emby account, or by manually granting the application a key.", - "HeaderApiKey": "Api Key", + "HeaderApiKeys": "API Keys", + "HeaderApiKeysHelp": "External applications are required to have an API key in order to communicate with Emby Server. Keys are issued by logging in with an Emby account, or by manually granting the application a key.", + "HeaderApiKey": "API Key", "HeaderApp": "App", "HeaderDevice": "Device", "HeaderUser": "User", "HeaderDateIssued": "Date Issued", "LabelChapterName": "Chapter {0}", - "HeaderHttpHeaders": "Http Headers", + "HeaderHttpHeaders": "HTTP Headers", "HeaderIdentificationHeader": "Identification Header", "LabelValue": "Value:", "LabelMatchType": "Match type:", @@ -944,8 +944,8 @@ "TabSync": "Sync", "TitleUsers": "Users", "LabelProtocol": "Protocol:", - "OptionProtocolHttp": "Http", - "OptionProtocolHls": "Http Live Streaming", + "OptionProtocolHttp": "HTTP", + "OptionProtocolHls": "HTTP Live Streaming", "LabelContext": "Context:", "OptionContextStreaming": "Streaming", "OptionContextStatic": "Sync", @@ -1030,16 +1030,16 @@ "HeaderDownloadPeopleMetadataForHelp": "Enabling additional options will provide more on-screen information but will result in slower library scans.", "ViewTypeFolders": "Folders", "OptionDisplayFolderView": "Display a folder view to show plain media folders", - "OptionDisplayFolderViewHelp": "If enabled, Emby apps will display a Folders category alongside your media library. This is useful if you'd like to have plain folder views.", + "OptionDisplayFolderViewHelp": "If you have a dynamic DNS enter it here. Emby apps will use it when connecting remotely. This field is required when used with a custom SSL certificate.", "ViewTypeLiveTvRecordingGroups": "Recordings", "ViewTypeLiveTvChannels": "Channels", - "LabelEasyPinCode": "Easy pin code:", - "EasyPasswordHelp": "Your easy pin code is used for offline access with supported Emby apps, and can also be used for easy in-network sign in.", - "LabelInNetworkSignInWithEasyPassword": "Enable in-network sign in with my easy pin code", - "LabelInNetworkSignInWithEasyPasswordHelp": "If enabled, you'll be able to use your easy pin code to sign in to Emby apps from inside your home network. Your regular password will only be needed away from home. If the pin code is left blank, you won't need a password within your home network.", + "LabelEasyPinCode": "Easy PIN code:", + "EasyPasswordHelp": "Your easy PIN code is used for offline access with supported Emby apps, and can also be used for easy in-network sign in.", + "LabelInNetworkSignInWithEasyPassword": "Enable in-network sign in with my easy PIN code", + "LabelInNetworkSignInWithEasyPasswordHelp": "If enabled, you'll be able to use your easy PIN code to sign in to Emby apps from inside your home network. Your regular password will only be needed away from home. If the PIN code is left blank, you won't need a password within your home network.", "HeaderPassword": "Password", "HeaderViewOrder": "View Order", - "ButtonResetEasyPassword": "Reset easy pin code", + "ButtonResetEasyPassword": "Reset easy PIN code", "LabelSelectUserViewOrder": "Choose the order your views will be displayed in within Emby apps", "HeaderPersonInfo": "Person Info", "HeaderConfirmDeletion": "Confirm Deletion", @@ -1056,7 +1056,7 @@ "LabelRevenue": "Revenue ($):", "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", "HeaderSpecialEpisodeInfo": "Special Episode Info", - "HeaderExternalIds": "External Id's:", + "HeaderExternalIds": "External IDs:", "LabelAirsBeforeSeason": "Airs before season:", "LabelAirsAfterSeason": "Airs after season:", "LabelAirsBeforeEpisode": "Airs before episode:", @@ -1099,7 +1099,7 @@ "LabelConnectUserNameHelp": "Connect this local user to an online Emby account to enable easy sign-in access from any Emby app without having to know the server ip address.", "ButtonLearnMoreAboutEmbyConnect": "Learn more about Emby Connect", "LabelExternalPlayers": "External players:", - "LabelExternalPlayersHelp": "Display buttons to play content in external players. This is only available on devices that support url schemes, generally Android and iOS. With external players there is generally no support for remote control or resuming.", + "LabelExternalPlayersHelp": "Display buttons to play content in external players. This is only available on devices that support URL schemes, generally Android and iOS. With external players there is generally no support for remote control or resuming.", "LabelNativeExternalPlayersHelp": "Display buttons to play content in external players.", "HeaderSubtitleProfile": "Subtitle Profile", "HeaderSubtitleProfiles": "Subtitle Profiles", @@ -1123,7 +1123,7 @@ "CinemaModeConfigurationHelp": "Cinema mode brings the theater experience straight to your living room with the ability to play trailers and custom intros before the main feature.", "OptionTrailersFromMyMovies": "Include trailers from movies in my library", "OptionUpcomingMoviesInTheaters": "Include trailers from new and upcoming movies", - "LabelLimitIntrosToUnwatchedContent": "Only use trailers from unwatched content", + "LabelLimitIntrosToUnwatchedContent": "Only play trailers from unwatched content", "LabelEnableIntroParentalControl": "Enable smart parental control", "LabelEnableIntroParentalControlHelp": "Trailers will only be selected with a parental rating equal to or less than the content being watched.", "LabelTheseFeaturesRequireSubscriptionHelpAndTrailers": "These features require an active Emby Premiere subscription and installation of the Trailer channel plugin.", @@ -1136,7 +1136,7 @@ "CinemaModeConfigurationHelp2": "Emby apps will have a setting to enable or disable cinema mode. TV apps enable cinema mode by default.", "LabelEnableCinemaMode": "Enable cinema mode", "HeaderCinemaMode": "Cinema Mode", - "LabelDateAddedBehavior": "Date added behavior for new content:", + "LabelDateAddedBehavior": "Date added behaviour for new content:", "OptionDateAddedImportTime": "Use date scanned into the library", "OptionDateAddedFileTime": "Use file creation date", "LabelDateAddedBehaviorHelp": "If a metadata value is present it will always be used before either of these options.", @@ -1194,12 +1194,12 @@ "LabelForgotPasswordUsernameHelp": "Enter your username, if you remember it.", "HeaderForgotPassword": "Forgot Password", "TitlePasswordReset": "Password Reset", - "LabelPasswordRecoveryPinCode": "Pin code:", + "LabelPasswordRecoveryPinCode": "PIN code:", "HeaderPasswordReset": "Password Reset", "HeaderParentalRatings": "Parental Ratings", "HeaderVideoTypes": "Video Types", "HeaderYears": "Years", - "HeaderBlockItemsWithNoRating": "Block content with no or unrecognized rating information:", + "HeaderBlockItemsWithNoRating": "Block content with no or unrecognised rating information:", "LabelBlockContentWithTags": "Block content with tags:", "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.", @@ -1218,10 +1218,10 @@ "OptionTVMovies": "TV Movies", "HeaderUpcomingMovies": "Upcoming Movies", "HeaderUpcomingSports": "Upcoming Sports", - "HeaderUpcomingPrograms": "Upcoming Programs", + "HeaderUpcomingPrograms": "Upcoming Programmes", "ButtonMoreItems": "More", "OptionEnableTranscodingThrottle": "Enable throttling", - "OptionEnableTranscodingThrottleHelp": "Throttling will automatically adjust transcoding speed in order to minimize server cpu utilization during playback.", + "OptionEnableTranscodingThrottleHelp": "Throttling will automatically adjust transcoding speed in order to minimise server CPU utilisation during playback.", "LabelUploadSpeedLimit": "Upload speed limit (Mbps):", "OptionAllowSyncTranscoding": "Allow syncing that requires transcoding", "HeaderPlayback": "Media Playback", @@ -1231,7 +1231,7 @@ "OptionAllowMediaPlaybackTranscodingHelp": "Users will receive friendly messages when content is unplayable based on policy.", "TabStreaming": "Streaming", "LabelRemoteClientBitrateLimit": "Internet streaming bitrate limit (Mbps):", - "LabelRemoteClientBitrateLimitHelp": "An optional streaming bitrate limit for all out of network clients. This is useful to prevent clients from requesting a higher bitrate than your internet connection can handle.", + "LabelRemoteClientBitrateLimitHelp": "An optional streaming bitrate limit for all out of network devices. This is useful to prevent devices from requesting a higher bitrate than your internet connection can handle.", "LabelConversionCpuCoreLimit": "CPU core limit:", "LabelConversionCpuCoreLimitHelp": "Limit the number of CPU cores that will be used during sync conversion.", "OptionEnableFullSpeedConversion": "Enable full speed conversion", @@ -1283,13 +1283,13 @@ "TabExternalServices": "External Services", "HeaderGuideProviders": "Guide Providers", "AddGuideProviderHelp": "Add a source for TV Guide information", - "LabelZipCode": "Zip Code:", + "LabelZipCode": "Post Code:", "GuideProviderSelectListings": "Select Listings", "GuideProviderLogin": "Login", "LabelLineup": "Lineup:", "MessageTunerDeviceNotListed": "Is your tuner device not listed? Try installing an external service provider for more Live TV options.", - "LabelImportOnlyFavoriteChannels": "Restrict to channels marked as favorite", - "ImportFavoriteChannelsHelp": "If enabled, only channels that are marked as favorite on the tuner device will be imported.", + "LabelImportOnlyFavoriteChannels": "Restrict to channels marked as favourite", + "ImportFavoriteChannelsHelp": "If enabled, only channels that are marked as favourite on the tuner device will be imported.", "ButtonRepeat": "Repeat", "LabelEnableThisTuner": "Enable this tuner", "LabelEnableThisTunerHelp": "Uncheck to prevent importing channels from this tuner.", @@ -1316,7 +1316,7 @@ "AdditionalLiveTvProvidersCanBeInstalledLater": "Additional Live TV providers can be added later within the Live TV section.", "HeaderSetupTVGuide": "Setup TV Guide", "LabelDataProvider": "Data provider:", - "OptionSendRecordingsToAutoOrganize": "Automatically organize recordings into existing series folders in other libraries", + "OptionSendRecordingsToAutoOrganize": "Automatically organise recordings into existing series folders in other libraries", "HeaderDefaultPadding": "Default Padding", "OptionEnableRecordingSubfolders": "Create sub-folders for categories such as Sports, Kids, etc.", "HeaderSubtitles": "Subtitles", @@ -1337,14 +1337,14 @@ "LabelCodecIntrosPath": "Codec intros path:", "LabelCodecIntrosPathHelp": "A folder containing video files. If an intro video file name matches the video codec, audio codec, audio profile, or a tag, then it will be played prior to the main feature.", "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 for easy playback on your devices.", + "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV for easy playback on your devices.", "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", "FileExtension": "File extension", "OptionReplaceExistingImages": "Replace existing images", "OptionPlayNextEpisodeAutomatically": "Play next episode automatically", - "OptionDownloadImagesInAdvance": "Download all images in advance", + "OptionDownloadImagesInAdvance": "Download images in advance", "SettingsSaved": "Settings saved.", - "OptionDownloadImagesInAdvanceHelp": "By default, most secondary images are only downloaded when requested by an Emby app. Enable this option to download all images in advance, as new media is imported.", + "OptionDownloadImagesInAdvanceHelp": "By default, most images are only downloaded when requested by an Emby app. Enable this option to download all images in advance, as new media is imported.", "Users": "Users", "Delete": "Delete", "Password": "Password", @@ -1359,18 +1359,18 @@ "DeleteUserConfirmation": "Are you sure you wish to delete this user?", "PasswordResetHeader": "Reset Password", "PasswordResetComplete": "The password has been reset.", - "PinCodeResetComplete": "The pin code has been reset.", + "PinCodeResetComplete": "The PIN code has been reset.", "PasswordResetConfirmation": "Are you sure you wish to reset the password?", - "PinCodeResetConfirmation": "Are you sure you wish to reset the pin code?", - "HeaderPinCodeReset": "Reset Pin Code", + "PinCodeResetConfirmation": "Are you sure you wish to reset the PIN code?", + "HeaderPinCodeReset": "Reset PIN Code", "PasswordSaved": "Password saved.", "PasswordMatchError": "Password and password confirmation must match.", "UninstallPluginHeader": "Uninstall Plugin", "UninstallPluginConfirmation": "Are you sure you wish to uninstall {0}?", - "NoPluginConfigurationMessage": "This plugin has nothing to configure.", + "NoPluginConfigurationMessage": "This plugin has no settings to configure.", "NoPluginsInstalledMessage": "You have no plugins installed.", - "BrowsePluginCatalogMessage": "Browse our plugin catalog to view available plugins.", - "HeaderNewApiKey": "New Api Key", + "BrowsePluginCatalogMessage": "Browse our plugin catalogue to view available plugins.", + "HeaderNewApiKey": "New API Key", "LabelAppName": "App name", "LabelAppNameExample": "Example: Sickbeard, NzbDrone", "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Emby Server.", @@ -1438,7 +1438,7 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", @@ -1455,10 +1455,9 @@ "LabelNumberReviews": "{0} Reviews", "LabelFree": "Free", "HeaderPlaybackError": "Playback Error", - "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", + "MessagePlaybackErrorNotAllowed": "You're currently not authorised to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -1537,15 +1536,15 @@ "StatusSuccess": "Success", "MessageFileWillBeDeleted": "The following file will be deleted:", "MessageSureYouWishToProceed": "Are you sure you wish to proceed?", - "MessageDuplicatesWillBeDeleted": "In addition the following dupliates will be deleted:", + "MessageDuplicatesWillBeDeleted": "In addition the following duplicates will be deleted:", "MessageFollowingFileWillBeMovedFrom": "The following file will be moved from:", "MessageDestinationTo": "to:", "HeaderSelectWatchFolder": "Select Watch Folder", "HeaderSelectWatchFolderHelp": "Browse or enter the path to your watch folder. The folder must be writeable.", "OrganizePatternResult": "Result: {0}", - "AutoOrganizeError": "Error Organizing File", - "FileOrganizeManually": "Organize File", - "ErrorOrganizingFileWithErrorCode": "There was an error organizing the file. Error code: {0}.", + "AutoOrganizeError": "Error Organising File", + "FileOrganizeManually": "Organise File", + "ErrorOrganizingFileWithErrorCode": "There was an error organising the file. Error code: {0}.", "HeaderRestart": "Restart", "HeaderShutdown": "Shutdown", "MessageConfirmRestart": "Are you sure you wish to restart Emby Server?", @@ -1562,8 +1561,8 @@ "LabelVideoCodec": "Video: {0}", "LabelLocalAccessUrl": "Local access: {0}", "LabelRemoteAccessUrl": "Remote access: {0}", - "LabelRunningOnPort": "Running on http port {0}.", - "LabelRunningOnPorts": "Running on http port {0}, and https port {1}.", + "LabelRunningOnPort": "Running on HTTP port {0}.", + "LabelRunningOnPorts": "Running on HTTP port {0}, and HTTPS port {1}.", "HeaderLatestFromChannel": "Latest from {0}", "HeaderCurrentSubtitles": "Current Subtitles", "ButtonRemoteControl": "Remote Control", @@ -1597,12 +1596,12 @@ "OptionBlockMovies": "Movies", "OptionBlockBooks": "Books", "OptionBlockGames": "Games", - "OptionBlockLiveTvPrograms": "Live TV Programs", + "OptionBlockLiveTvPrograms": "Live TV Programmes", "OptionBlockLiveTvChannels": "Live TV Channels", "OptionBlockChannelContent": "Internet Channel Content", "ButtonRevoke": "Revoke", - "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Emby Server will be abruptly terminated.", - "HeaderConfirmRevokeApiKey": "Revoke Api Key", + "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this API key? The application's connection to Emby Server will be abruptly terminated.", + "HeaderConfirmRevokeApiKey": "Revoke API Key", "ValueContainer": "Container: {0}", "ValueAudioCodec": "Audio Codec: {0}", "ValueVideoCodec": "Video Codec: {0}", @@ -1627,7 +1626,7 @@ "OptionOn": "On", "ButtonUninstall": "Uninstall", "HeaderEnabledFields": "Enabled Fields", - "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", + "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent its data from being changed.", "HeaderLiveTV": "Live TV", "MissingPrimaryImage": "Missing primary image.", "MissingBackdropImage": "Missing backdrop image.", @@ -1693,7 +1692,7 @@ "OptionMusicAlbums": "Music albums", "OptionMusicVideos": "Music videos", "OptionSongs": "Songs", - "OptionHomeVideos": "Home videos", + "OptionHomeVideos": "Home videos & photos", "OptionBooks": "Books", "ButtonUp": "Up", "ButtonDown": "Down", @@ -1722,7 +1721,7 @@ "ButtonChangeContentType": "Change content type", "HeaderMediaLocations": "Media Locations", "LabelContentTypeValue": "Content type: {0}", - "LabelPathSubstitutionHelp": "Optional: Path substitution can map server paths to network shares that clients can access for direct playback.", + "LabelPathSubstitutionHelp": "Optional: Path substitution can map server paths to network shares that Emby apps can access for direct playback.", "FolderTypeUnset": "Unset (mixed content)", "BirthPlaceValue": "Birth place: {0}", "DeathDateValue": "Died: {0}", @@ -1865,7 +1864,7 @@ "WebClientTourMetadataManager": "Click edit to open the metadata manager", "WebClientTourPlaylists": "Easily create playlists and instant mixes, and play them on any device", "WebClientTourCollections": "Create movie collections to group box sets together", - "WebClientTourUserPreferences1": "User preferences allow you to customize the way your library is presented in all of your Emby apps", + "WebClientTourUserPreferences1": "User preferences allow you to customise the way your library is presented in all of your Emby apps", "WebClientTourUserPreferences2": "Configure your audio and subtitle language settings once, for every Emby app", "WebClientTourUserPreferences3": "Design the web client home page to your liking", "WebClientTourUserPreferences4": "Configure backdrops, theme songs and external players", @@ -1879,7 +1878,7 @@ "DashboardTourCinemaMode": "Cinema mode brings the theater experience straight to your living room with the ability to play trailers and custom intros before the main feature.", "DashboardTourChapters": "Enable chapter image generation for your videos for a more pleasing presentation while viewing.", "DashboardTourSubtitles": "Automatically download subtitles for your videos in any language.", - "DashboardTourPlugins": "Install plugins such as internet video channels, live tv, metadata scanners, and more.", + "DashboardTourPlugins": "Install plugins such as internet video channels, live TV, metadata scanners, and more.", "DashboardTourNotifications": "Automatically send notifications of server events to your mobile device, email and more.", "DashboardTourScheduledTasks": "Easily manage long running operations with scheduled tasks. Decide when they run, and how often.", "DashboardTourMobile": "The Emby Server dashboard works great on smartphones and tablets. Manage your server from the palm of your hand anytime, anywhere.", @@ -1910,8 +1909,8 @@ "MessageContactAdminToResetPassword": "Please contact your system administrator to reset your password.", "MessageForgotPasswordInNetworkRequired": "Please try again within your home network to initiate the password reset process.", "MessageForgotPasswordFileCreated": "The following file has been created on your server and contains instructions on how to proceed:", - "MessageForgotPasswordFileExpiration": "The reset pin will expire at {0}.", - "MessageInvalidForgotPasswordPin": "An invalid or expired pin was entered. Please try again.", + "MessageForgotPasswordFileExpiration": "The reset PIN will expire at {0}.", + "MessageInvalidForgotPasswordPin": "An invalid or expired PIN was entered. Please try again.", "MessagePasswordResetForUsers": "Passwords have been removed for the following users. To login, sign in with a blank password.", "ButtonLinkMyEmbyAccount": "Link my account now", "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Emby account to this server.", @@ -1922,7 +1921,7 @@ "MessageSyncJobCreated": "Sync job created.", "LabelQuality": "Quality:", "OptionAutomaticallySyncNewContent": "Automatically sync new content", - "OptionAutomaticallySyncNewContentHelp": "New content added to will be automatically synced to the device.", + "OptionAutomaticallySyncNewContentHelp": "New content added to this folder will be automatically synced to the device.", "MessageBookPluginRequired": "Requires installation of the Bookshelf plugin", "MessageGamePluginRequired": "Requires installation of the GameBrowser plugin", "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", @@ -1946,7 +1945,7 @@ "HeaderUnlockSync": "Unlock Emby Sync", "MessageUnlockAppWithPurchaseOrSupporter": "Unlock this feature with a small one-time purchase, or with an active Emby Premiere subscription.", "MessageUnlockAppWithSupporter": "Unlock this feature with an active Emby Premiere subscription.", - "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard under Help -> Emby Premiere.", + "MessageToValidateSupporter": "If you have an active Emby Premiere subscription, ensure you've setup Emby Premiere in your Emby Server Dashboard, which you can access by clicking Emby Premiere within the main menu.", "MessagePaymentServicesUnavailable": "Payment services are currently unavailable. Please try again later.", "ButtonUnlockWithPurchase": "Unlock with Purchase", "ButtonUnlockPrice": "Unlock {0}", @@ -1973,7 +1972,7 @@ "HeaderDeleteProvider": "Delete Provider", "ErrorAddingTunerDevice": "There was an error adding the tuner device. Please ensure it is accessible and try again.", "ErrorSavingTvProvider": "There was an error saving the TV provider. Please ensure it is accessible and try again.", - "ErrorGettingTvLineups": "There was an error downloading tv lineups. Please ensure your information is correct and try again.", + "ErrorGettingTvLineups": "There was an error downloading TV lineups. Please ensure your information is correct and try again.", "MessageCreateAccountAt": "Create an account at {0}", "ErrorPleaseSelectLineup": "Please select a lineup and try again. If no lineups are available, then please check that your username, password, and postal code is correct.", "HeaderTryEmbyPremiere": "Try Emby Premiere", @@ -2026,8 +2025,9 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", - "HeaderFavoriteArtists": "Favorite Artists", - "HeaderFavoriteSongs": "Favorite Songs", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", + "HeaderFavoriteArtists": "Favourite Artists", + "HeaderFavoriteSongs": "Favourite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", "PleaseConfirmPluginInstallation": "Please click OK to confirm you've read the above and wish to proceed with the plugin installation.", "MessagePluginInstallDisclaimer": "Plugins built by Emby community members are a great way to enhance your Emby experience with additional features and benefits. Before installing, please be aware of the effects they may have on your Emby Server, such as longer library scans, additional background processing and decreased system stability.", @@ -2049,13 +2049,13 @@ "HardwareAccelerationWarning": "Enabling hardware acceleration may cause instability in some environments. Ensure that your operating system and video drivers are fully up to date. If you have difficulty playing video after enabling this, you'll need to change the setting back to Auto.", "HeaderSelectCodecIntrosPath": "Select Codec Intros Path", "ButtonAddMissingData": "Add missing data only", - "ValueExample": "1:00 PM", + "ValueExample": "Example: {0}", "OptionEnableAnonymousUsageReporting": "Enable anonymous usage reporting", "OptionEnableAnonymousUsageReportingHelp": "Allow Emby to collect anonymous data such as installed plugins, the version numbers of your Emby apps, etc. This information is only used for the purpose of improving the software.", - "LabelFileOrUrl": "File or url:", + "LabelFileOrUrl": "File or URL:", "OptionEnableForAllTuners": "Enable for all tuner devices", "HeaderTuners": "Tuners", - "LabelOptionalM3uUrl": "M3U url (optional):", + "LabelOptionalM3uUrl": "M3U URL (optional):", "LabelOptionalM3uUrlHelp": "Some devices support an M3U channel listing.", "TabResumeSettings": "Resume Settings", "HowDidYouPay": "How did you pay?", @@ -2073,23 +2073,23 @@ "MetadataSettingChangeHelp": "Changing metadata settings will affect new content that is added going forward. To refresh existing content, open the detail screen and click the refresh button, or perform bulk refreshes using the metadata manager.", "OptionConvertRecordingPreserveAudio": "Preserve original audio when converting recordings (when possible)", "OptionConvertRecordingPreserveAudioHelp": "This will provide better audio but may require transcoding during playback on some devices.", - "CreateCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", + "CreateCollectionHelp": "Collections allow you to create personalised groupings of movies and other library content.", "AddItemToCollectionHelp": "Add items to collections by searching for them and using their right-click or tap menus to add them to a collection.", "HeaderHealthMonitor": "Health Monitor", "HealthMonitorNoAlerts": "There are no active alerts.", "RecordingPathChangeMessage": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.", "VisualLoginFormHelp": "Select a user or sign in manually", "LabelSportsCategories": "Sports categories:", - "XmlTvSportsCategoriesHelp": "Programs with these categories will be displayed as sports programs. Separate multiple with '|'.", + "XmlTvSportsCategoriesHelp": "Programmes with these categories will be displayed as sports programmes. Separate multiple with '|'.", "LabelNewsCategories": "News categories:", - "XmlTvNewsCategoriesHelp": "Programs with these categories will be displayed as news programs. Separate multiple with '|'.", + "XmlTvNewsCategoriesHelp": "Programmes with these categories will be displayed as news programmes. Separate multiple with '|'.", "LabelKidsCategories": "Children's categories:", - "XmlTvKidsCategoriesHelp": "Programs with these categories will be displayed as programs for children. Separate multiple with '|'.", + "XmlTvKidsCategoriesHelp": "Programmes with these categories will be displayed as programmes for children. Separate multiple with '|'.", "LabelMovieCategories": "Movie categories:", - "XmlTvMovieCategoriesHelp": "Programs with these categories will be displayed as movies. Separate multiple with '|'.", - "XmlTvPathHelp": "A path to an xml tv file. Emby will read this file and periodically check it for updates. You are responsible for creating and updating the file.", + "XmlTvMovieCategoriesHelp": "Programmes with these categories will be displayed as movies. Separate multiple with '|'.", + "XmlTvPathHelp": "A path to an XML TV file. Emby will read this file and periodically check it for updates. You are responsible for creating and updating the file.", "LabelBindToLocalNetworkAddress": "Bind to local network address:", - "LabelBindToLocalNetworkAddressHelp": "Optional. Override the local IP address to bind the http server to. If left empty, the server will bind to all availabile addresses. Changing this value requires restarting Emby Server.", + "LabelBindToLocalNetworkAddressHelp": "Optional. Override the local IP address to bind the HTTP server to. If left empty, the server will bind to all available addresses. Changing this value requires restarting Emby Server.", "TitleHostingSettings": "Hosting Settings", "SettingsWarning": "Changing these values may cause instability or connectivity failures. If you experience any problems, we recommend changing them back to default.", "MapChannels": "Map Channels", @@ -2097,7 +2097,7 @@ "LabelffmpegVersion": "FFmpeg version:", "LabelffmpegPathHelp": "The path to your downloaded FFmpeg application, or folder containing FFmpeg.", "SetupFFmpeg": "Setup FFmpeg", - "SetupFFmpegHelp": "Emby may require a library or application to convert certain media types. There are many different applications available, however, Emby has been tested to work with ffmpeg. Emby is in no way affiliated with ffmpeg, its ownership, code or distribution.", + "SetupFFmpegHelp": "Emby may require a library or application to convert certain media types. There are many different applications available, however, Emby has been tested to work with FFmpeg. Emby is in no way affiliated with FFmpeg, its ownership, code or distribution.", "EnterFFmpegLocation": "Enter FFmpeg path", "DownloadFFmpeg": "Download FFmpeg", "FFmpegSuggestedDownload": "Suggested download: {0}", @@ -2123,18 +2123,19 @@ "LabelVaapiDevice": "VA API Device:", "LabelVaapiDeviceHelp": "This is the render node that is used for hardware acceleration.", "HowToConnectFromEmbyApps": "How to Connect from Emby apps", - "MessageFolderRipPlaybackExperimental": "Support for playback of folder rips and ISOs in this app is only expirimental. For best results, try an Emby app that supports these formats natively, or use plain video files.", + "MessageFolderRipPlaybackExperimental": "Support for playback of folder rips and ISOs in this app is only experimental. For best results, try an Emby app that supports these formats natively, or use plain video files.", "OptionExtractChapterImage": "Enable chapter image extraction", "Downloads": "Downloads", "LabelEnableDebugLogging": "Enable debug logging", "OptionEnableExternalContentInSuggestions": "Enable external content in suggestions", - "OptionEnableExternalContentInSuggestionsHelp": "Allow internet trailers and live tv programs to be included within suggested content.", - "LabelH264EncodingPreset": "H264 encoding preset:", + "OptionEnableExternalContentInSuggestionsHelp": "Allow internet trailers and live TV programmes to be included within suggested content.", + "LabelH264EncodingPreset": "H.264 encoding preset:", "H264EncodingPresetHelp": "Choose a faster value to improve performance, or a slower value to improve quality.", - "LabelH264Crf": "H264 encoding CRF:", + "LabelH264Crf": "H.264 encoding CRF:", "H264CrfHelp": "The Constant Rate Factor (CRF) is the default quality setting for the x264 encoder. You can set the values between 0 and 51, where lower values would result in better quality (at the expense of higher file sizes). Sane values are between 18 and 28. The default for x264 is 23, so you can use this as a starting point.", "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/en-US.json b/dashboard-ui/strings/en-US.json index f877ce35e4..fde54094d3 100644 --- a/dashboard-ui/strings/en-US.json +++ b/dashboard-ui/strings/en-US.json @@ -2025,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", diff --git a/dashboard-ui/strings/es-AR.json b/dashboard-ui/strings/es-AR.json index 558b819c25..42fda8717f 100644 --- a/dashboard-ui/strings/es-AR.json +++ b/dashboard-ui/strings/es-AR.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/es-MX.json b/dashboard-ui/strings/es-MX.json index f85063bdde..ca4f757902 100644 --- a/dashboard-ui/strings/es-MX.json +++ b/dashboard-ui/strings/es-MX.json @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "Error de Reproducci\u00f3n", "MessagePlaybackErrorNotAllowed": "Actualmente no esta autorizado para reproducir este contenido. Por favor contacte a su administrador de sistema para mas informaci\u00f3n.", "MessagePlaybackErrorNoCompatibleStream": "No hay streams compatibles en este en este momento. Por favor intente de nuevo mas tarde o contacte a su administrador de sistema para mas detalles.", - "MessagePlaybackErrorRateLimitExceeded": "Su limite de transferencia ha sido excedido. Por favor contacte a su administrador de sistema para mas informaci\u00f3n.", "MessagePlaybackErrorPlaceHolder": "No es posible reproducir el contenido seleccionado en este dispositivo.", "HeaderSelectAudio": "Seleccionar Audio", "HeaderSelectSubtitles": "Seleccionar Subtitulos", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "Hubo un error retirando la cuenta de Emby Connect. Por favor aseg\u00farese que su conexi\u00f3n a internet esta activa e intente de nuevo.", "ErrorAddingEmbyConnectAccount1": "Hubo un error agregando la cuenta de Emby Connect. \u00bfYa ha creado una cuenta de Emby? Registrese en {0}.", "ErrorAddingEmbyConnectAccount2": "Por favor aseg\u00farese que la cuenta Emby ha sido activada siguiendo las instrucciones incluidas en el correo electr\u00f3nico que recibi\u00f3 al crear la cuenta. Si no recibi\u00f3 dicho correo electr\u00f3nico por favor escriba uno a {0} desde la direcci\u00f3n de correo electr\u00f3nico usada con la cuenta Emby.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Artistas Favoritos", "HeaderFavoriteSongs": "Canciones Favoritas", "HeaderConfirmPluginInstallation": "Confirmar Instalaci\u00f3n de Complemento", @@ -2136,5 +2136,6 @@ "Sports": "Deportes", "HeaderForKids": "Para Ni\u00f1os", "HeaderRecordingGroups": "Grupos de Grabaciones", - "LabelConvertRecordingsTo": "Convertir grabaciones a:" + "LabelConvertRecordingsTo": "Convertir grabaciones a:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/es.json b/dashboard-ui/strings/es.json index 91819aefbf..7cde939b04 100644 --- a/dashboard-ui/strings/es.json +++ b/dashboard-ui/strings/es.json @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "Error de reproducci\u00f3n", "MessagePlaybackErrorNotAllowed": "No est\u00e1s autorizado a reproducir este contenido. Contacta con el administrador para m\u00e1s detalles.", "MessagePlaybackErrorNoCompatibleStream": "No tienes disponible ninguna calidad por ahora. Int\u00e9ntalo m\u00e1s tarde o contacta con el administrador para m\u00e1s detalles.", - "MessagePlaybackErrorRateLimitExceeded": "Has sobrepasado el ratio l\u00edmite de reproducci\u00f3n. Contacta con el administrador para m\u00e1s detalles.", "MessagePlaybackErrorPlaceHolder": "El contenido elegido no se puede reproducir desde este dispositivo.", "HeaderSelectAudio": "Seleccionar Audio", "HeaderSelectSubtitles": "Seleccionar Subt\u00edtulos", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "Ha habido un error quitando la cuenta de Emby Connect. Por favor aseg\u00farate de que tienes una conexi\u00f3n a internet activa e int\u00e9ntalo otra vez.", "ErrorAddingEmbyConnectAccount1": "Ha habido un error a\u00f1adiendo la cuenta de Emby Connect. \u00bfTe has creado una cuenta de Emby primero? Reg\u00edstrate en {0}.", "ErrorAddingEmbyConnectAccount2": "Por favor aseg\u00farate de que la cuenta de Emby ha sido activada siguiendo las instrucciones del correo que se te envi\u00f3 despu\u00e9s de crear tu cuenta. Si no has recibido el correo, por favor m\u00e1ndanos un correo a {0} desde la direcci\u00f3n que has usado para crearte la cuenta de Emby.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Artistas favoritos", "HeaderFavoriteSongs": "Canciones favoritas", "HeaderConfirmPluginInstallation": "Confirmar la instalaci\u00f3n del Plugin", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/fi.json b/dashboard-ui/strings/fi.json index 440ab8a2cf..f9dd3569d0 100644 --- a/dashboard-ui/strings/fi.json +++ b/dashboard-ui/strings/fi.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/fr-CA.json b/dashboard-ui/strings/fr-CA.json index a5e70afc5c..16e23b7454 100644 --- a/dashboard-ui/strings/fr-CA.json +++ b/dashboard-ui/strings/fr-CA.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/fr-FR.json b/dashboard-ui/strings/fr-FR.json index 6a6fa6f7ce..ff815ed915 100644 --- a/dashboard-ui/strings/fr-FR.json +++ b/dashboard-ui/strings/fr-FR.json @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/fr.json b/dashboard-ui/strings/fr.json index e7e82c08ee..ea9fc0339c 100644 --- a/dashboard-ui/strings/fr.json +++ b/dashboard-ui/strings/fr.json @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "Erreur de lecture", "MessagePlaybackErrorNotAllowed": "Vous n'\u00eates pas autoris\u00e9 \u00e0 lire ce contenu. Veuillez contacter votre administrateur syst\u00e8me pour plus de d\u00e9tails.", "MessagePlaybackErrorNoCompatibleStream": "Aucun flux compatible n'est actuellement disponible. Veuillez r\u00e9essayer plus tard ou contactez votre administrateur pour plus de d\u00e9tails.", - "MessagePlaybackErrorRateLimitExceeded": "Vous avez d\u00e9pass\u00e9 votre limite de lecture. Veuillez contacter votre administrateur syst\u00e8me pour plus de d\u00e9tails.", "MessagePlaybackErrorPlaceHolder": "Impossible de lire le contenu choisi sur cet appareil", "HeaderSelectAudio": "S\u00e9lectionner audio", "HeaderSelectSubtitles": "S\u00e9lectionner sous-titres", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "Une erreur est survenue pendant la suppression du compte Emby Connect. Veuillez vous assurer que vous avez une connection internet active puis r\u00e9\u00e9ssayez.", "ErrorAddingEmbyConnectAccount1": "Une erreur est survenue lorsque vous avez ajout\u00e9 votre compte Emby Connect. Vous \u00eates-vous cr\u00e9\u00e9 un compte Emby? Inscrivez-vous sur {0}.", "ErrorAddingEmbyConnectAccount2": "Veuillez vous assurez que votre compte Emby a bien \u00e9t\u00e9 activ\u00e9 avec les instructions fournies dans l'email envoy\u00e9 apr\u00e8s la cr\u00e9ation de votre compte. Si vous n'avez pas re\u00e7u l'email veuillez envoyer un mail \u00e0 {0} avec l'adresse utilis\u00e9e lors de la cr\u00e9ation de votre compte Emby.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Artistes pr\u00e9f\u00e9r\u00e9s", "HeaderFavoriteSongs": "Chansons pr\u00e9f\u00e9r\u00e9es", "HeaderConfirmPluginInstallation": "Confirmer l'installation du plugin", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/gsw.json b/dashboard-ui/strings/gsw.json index 8f712fb090..9199b8eda4 100644 --- a/dashboard-ui/strings/gsw.json +++ b/dashboard-ui/strings/gsw.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/he.json b/dashboard-ui/strings/he.json index 391b359ba5..3ae6d65ae6 100644 --- a/dashboard-ui/strings/he.json +++ b/dashboard-ui/strings/he.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "\u05d0\u05de\u05e0\u05d9\u05dd \u05de\u05d5\u05e2\u05d3\u05e4\u05d9\u05dd", "HeaderFavoriteSongs": "\u05e9\u05d9\u05e8\u05d9\u05dd \u05de\u05d5\u05e2\u05d3\u05e4\u05d9\u05dd", "HeaderConfirmPluginInstallation": "\u05d0\u05e9\u05e8 \u05d4\u05ea\u05e7\u05e0\u05ea \u05ea\u05d5\u05e1\u05e3", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/hr.json b/dashboard-ui/strings/hr.json index 1b7576f7b1..02f872cd73 100644 --- a/dashboard-ui/strings/hr.json +++ b/dashboard-ui/strings/hr.json @@ -1,134 +1,134 @@ { "LabelExit": "Izlaz", - "LabelApiDocumentation": "Api Documentation", + "LabelApiDocumentation": "Api dokumentacija", "LabelBrowseLibrary": "Pregledaj biblioteku", - "LabelConfigureServer": "Configure Emby", + "LabelConfigureServer": "Podesi Emby", "LabelPrevious": "Prethodni", "LabelFinish": "Kraj", "LabelNext": "Sljede\u0107i", "LabelYoureDone": "Zavr\u0161eno!", - "WelcomeToProject": "Welcome to Emby!", + "WelcomeToProject": "Dobrodo\u0161li u Emby", "ThisWizardWillGuideYou": "Ovaj pomo\u0107nik \u0107e Vas voditi kroz proces pode\u0161avanja. Za po\u010detak, odaberite \u017eeljeni jezik.", "TellUsAboutYourself": "Recite nam ne\u0161to o sebi", - "ButtonQuickStartGuide": "Quick start guide", + "ButtonQuickStartGuide": "Vodi\u010d za brzi po\u010detak", "LabelYourFirstName": "Ime:", "MoreUsersCanBeAddedLater": "Vi\u0161e korisnika mo\u017eete dodati naknadno preko nadzorne plo\u010de.", - "UserProfilesIntro": "Emby includes built-in support for user profiles, enabling each user to have their own display settings, playstate and parental controls.", + "UserProfilesIntro": "Emby uklju\u010duje ugra\u0111enu podr\u0161ku za korisni\u010dke profile \u0161to omogu\u0107uje svakom korisniku da ima svoje vlastite postavke prikaza, PlayStation i roditeljski nadzor.", "LabelWindowsService": "Windows servis", "AWindowsServiceHasBeenInstalled": "Windows servis je instaliran.", - "WindowsServiceIntro1": "Emby Server normally runs as a desktop application with a tray icon, but if you prefer to run it as a background service, it can be started from the windows services control panel instead.", - "WindowsServiceIntro2": "If using the windows service, please note that it cannot be run at the same time as the tray icon, so you'll need to exit the tray in order to run the service. The service will also need to be configured with administrative privileges via the control panel. When running as a service, you will need to ensure that the service account has access to your media folders.", - "WizardCompleted": "That's all we need for now. Emby has begun collecting information about your media library. Check out some of our apps, and then click Finish<\/b> to view the Server Dashboard<\/b>.", + "WindowsServiceIntro1": "Emby Server normalno radi kao desktop aplikacija sa ikonom u sistemskoj traci, ali ako ga \u017eelite pokrenuti kao pozadinsku uslugu mo\u017ee se pokrenuti s upravlja\u010dke plo\u010de Windows pozadinskih servisa.", + "WindowsServiceIntro2": "Ako koristite Windows servis, znajte da se ne mo\u017ee izvoditi u isto vrijeme kao sistemska ikona, tako da morate iza\u0107i iz sistemske trake kako bi ga pokrenuli kao servis. Servis \u0107e tako\u0111er morati biti pode\u0161en s administrativnim ovlastima putem upravlja\u010dke plo\u010de. Kada se izvodi kao servis, morati \u0107ete osigurati da servisni login ima pristup va\u0161im medijskim mapama.", + "WizardCompleted": "To je sve \u0161to nam treba za sada. Emby je po\u010deo prikupljati podatke o va\u0161oj medijskoj knji\u017enici. Provjerite neke od na\u0161ih aplikacija, a zatim kliknite na Zavr\u0161i<\/b> za prikaz Serverske kontrolne plo\u010de<\/b>.", "LabelConfigureSettings": "Konfiguracija postavki", "LabelEnableAutomaticPortMapping": "Omogu\u0107i automatsko mapiranje porta", "LabelEnableAutomaticPortMappingHelp": "UPnP omogu\u0107uje automatsku konfiguraciju usmjeriva\u010da (router \/ modem) za lak\u0161i pristup na daljinu. Ovo mo\u017eda ne\u0107e raditi sa nekim modelima usmjeriva\u010da.", - "HeaderTermsOfService": "Emby Terms of Service", - "MessagePleaseAcceptTermsOfService": "Please accept the terms of service and privacy policy before continuing.", - "OptionIAcceptTermsOfService": "I accept the terms of service", - "ButtonPrivacyPolicy": "Privacy policy", - "ButtonTermsOfService": "Terms of Service", - "HeaderDeveloperOptions": "Developer Options", - "OptionEnableWebClientResponseCache": "Enable web response caching", - "OptionDisableForDevelopmentHelp": "Configure these as needed for web development purposes.", - "OptionEnableWebClientResourceMinification": "Enable web resource minification", - "LabelDashboardSourcePath": "Web client source path:", - "LabelDashboardSourcePathHelp": "If running the server from source, specify the path to the dashboard-ui folder. All web client files will be served from this location.", - "ButtonConvertMedia": "Convert media", - "ButtonOrganize": "Organize", - "HeaderSupporterBenefits": "Emby Premiere Benefits", - "HeaderAddUser": "Add User", - "LabelAddConnectSupporterHelp": "To add a user who isn't listed, you'll need to first link their account to Emby Connect from their user profile page.", - "LabelPinCode": "Pin code:", - "OptionHideWatchedContentFromLatestMedia": "Hide watched content from latest media", - "HeaderSync": "Sync", - "ButtonOk": "Ok", + "HeaderTermsOfService": "Emby Uvjeti kori\u0161tenja", + "MessagePleaseAcceptTermsOfService": "Molimo prihvatite uvjete kori\u0161tenja i pravila o privatnosti prije nego \u0161to nastavite.", + "OptionIAcceptTermsOfService": "Prihva\u0107am uvjete kori\u0161tenja", + "ButtonPrivacyPolicy": "Pravila o privatnosti", + "ButtonTermsOfService": "Uvjeti kori\u0161tenja", + "HeaderDeveloperOptions": "Razvojne opcije", + "OptionEnableWebClientResponseCache": "Omogu\u0107i web response caching", + "OptionDisableForDevelopmentHelp": "Podesi to kako je potrebno za potrebe web razvoja.", + "OptionEnableWebClientResourceMinification": "Omogu\u0107i reduciranje web resursa", + "LabelDashboardSourcePath": "Izvorna putanja web klijenta:", + "LabelDashboardSourcePathHelp": "Ako pokre\u0107ete poslu\u017eitelja iz izvora, odredite put do mape nadzorne plo\u010de korisni\u010dkog su\u010delja. Sve web klijentske datoteke biti \u0107e poslu\u017eene s ove lokacije.", + "ButtonConvertMedia": "Pretvori medij", + "ButtonOrganize": "Organiziraj", + "HeaderSupporterBenefits": "Prednosti Emby premijere", + "HeaderAddUser": "Dodaj korisnika", + "LabelAddConnectSupporterHelp": "Za dodavanje korisnika koji nije na popisu, morat \u0107ete najprije povezati njihov ra\u010dun na \"Emby Connect\" iz njihovog korisni\u010dkog profila.", + "LabelPinCode": "PIN:", + "OptionHideWatchedContentFromLatestMedia": "Sakrij pregledani sadr\u017eaj iz najnovijih medija", + "HeaderSync": "Sink.", + "ButtonOk": "U redu", "ButtonCancel": "Odustani", - "ButtonExit": "Exit", + "ButtonExit": "Izlaz", "ButtonNew": "Novo", - "HeaderTaskTriggers": "Task Triggers", + "HeaderTaskTriggers": "Okida\u010di zadataka", "HeaderTV": "TV", "HeaderAudio": "Audio", "HeaderVideo": "Video", - "HeaderPaths": "Paths", - "CategorySync": "Sync", - "TabPlaylist": "Playlist", - "HeaderEasyPinCode": "Easy Pin Code", - "HeaderInstalledServices": "Installed Services", - "HeaderAvailableServices": "Available Services", - "MessageNoServicesInstalled": "No services are currently installed.", - "HeaderToAccessPleaseEnterEasyPinCode": "To access, please enter your easy pin code", - "KidsModeAdultInstruction": "Click the lock icon in the bottom right to configure or leave kids mode. Your pin code will be required.", - "ButtonConfigurePinCode": "Configure pin code", - "RegisterWithPayPal": "Register with PayPal", - "HeaderEnjoyDayTrial": "Enjoy a 14 Day Free Trial", - "LabelSyncTempPath": "Temporary file path:", - "LabelSyncTempPathHelp": "Specify a custom sync working folder. Converted media created during the sync process will be stored here.", - "LabelCustomCertificatePath": "Custom certificate path:", - "LabelCustomCertificatePathHelp": "Supply your own ssl certificate .pfx file. If omitted, the server will create a self-signed certificate.", - "TitleNotifications": "Notifications", - "OptionDetectArchiveFilesAsMedia": "Detect archive files as media", - "OptionDetectArchiveFilesAsMediaHelp": "If enabled, files with .rar and .zip extensions will be detected as media files.", - "LabelEnterConnectUserName": "Username or email:", - "LabelEnterConnectUserNameHelp": "This is your Emby online account username or email.", - "LabelEnableEnhancedMovies": "Enable enhanced movie displays", - "LabelEnableEnhancedMoviesHelp": "When enabled, movies will be displayed as folders to include trailers, extras, cast & crew, and other related content.", - "HeaderSyncJobInfo": "Sync Job", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", - "FolderTypePhotos": "Photos", - "FolderTypeMusicVideos": "Music videos", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", + "HeaderPaths": "Putanje", + "CategorySync": "Sink.", + "TabPlaylist": "Lista izvo\u0111enja", + "HeaderEasyPinCode": "Lagan PIN", + "HeaderInstalledServices": "Instalirani servisi", + "HeaderAvailableServices": "Dostupni servisi", + "MessageNoServicesInstalled": "Trenutno nema instalirane usluge.", + "HeaderToAccessPleaseEnterEasyPinCode": "Molimo unesite svoj lagan PIN kako biste pristupili", + "KidsModeAdultInstruction": "Kliknite na ikonu lokota u donjem desnom kutu za postavke ili ostaviti dje\u010dji na\u010din. PIN kod \u0107e biti potreban.", + "ButtonConfigurePinCode": "Podesi PIN kod", + "RegisterWithPayPal": "Registracija sa PayPal-om", + "HeaderEnjoyDayTrial": "U\u017eivajte u 14 dana besplatne probe", + "LabelSyncTempPath": "Privremena putanja datoteka:", + "LabelSyncTempPathHelp": "Odredite prilago\u0111eni sinkronizacijski radni direktorij. Pretvoren medij stvorene tijekom postupka sinkronizacije biti \u0107e pohranjen ovdje.", + "LabelCustomCertificatePath": "Prilago\u0111en put certifikata:", + "LabelCustomCertificatePathHelp": "Nabavite vlastiti SSL certifikat .pfx datoteku. Ako je izostavljen, poslu\u017eitelj \u0107e stvoriti samo-potpisan certifikat.", + "TitleNotifications": "Obavijesti", + "OptionDetectArchiveFilesAsMedia": "Otkrivanje arhiviranih datoteka kao medije", + "OptionDetectArchiveFilesAsMediaHelp": "Ako je omogu\u0107eno, datoteke s .rar i .zip pro\u0161irenjima biti \u0107e prepoznate kao medijske datoteke.", + "LabelEnterConnectUserName": "Korisni\u010dko ime ili email:", + "LabelEnterConnectUserNameHelp": "Ovo je va\u0161e korisni\u010dko ime ili email Emby online ra\u010duna.", + "LabelEnableEnhancedMovies": "Omogu\u0107i pobolj\u0161an filmski prikaz", + "LabelEnableEnhancedMoviesHelp": "Kada je omogu\u0107eno, filmovi \u0107e se prikazati kao mape uklju\u010duju\u0107i kratke filmove, dodatke, glumce i tim i druge povezane sadr\u017eaje.", + "HeaderSyncJobInfo": "Sink. posao", + "FolderTypeMixed": "Mije\u0161ani sadr\u017eaj", + "FolderTypeMovies": "Filmovi", + "FolderTypeMusic": "Glazba", + "FolderTypePhotos": "Slike", + "FolderTypeMusicVideos": "Glazbeni videi", + "FolderTypeGames": "Igre", + "FolderTypeBooks": "Knjige", "FolderTypeTvShows": "TV", - "FolderTypeInherit": "Inherit", - "LabelContentType": "Content type:", - "TitleScheduledTasks": "Scheduled Tasks", - "HeaderSetupLibrary": "Setup your media libraries", + "FolderTypeInherit": "Naslijedi", + "LabelContentType": "Tip sadr\u017eaja:", + "TitleScheduledTasks": "Zakazani zadaci", + "HeaderSetupLibrary": "Postavite va\u0161e medijske biblioteke", "ButtonAddMediaFolder": "Dodaj mapu sa medijem", "LabelFolderType": "Tip mape:", "LabelCountry": "Zemlja:", "LabelLanguage": "Jezik:", - "LabelTimeLimitHours": "Time limit (hours):", - "HeaderPreferredMetadataLanguage": "\u017deljeni metadata jezik:", + "LabelTimeLimitHours": "Rok (sati):", + "HeaderPreferredMetadataLanguage": "\u017deljeni jezik meta-podataka", "LabelSaveLocalMetadata": "Snimi ilustracije i metadata u medijske mape", "LabelSaveLocalMetadataHelp": "Snimljene ilustracije i metadata u medijskim mapama \u0107e biti postavljene na lokaciju gdje \u0107e se mo\u0107i jednostavno mjenjati.", "LabelDownloadInternetMetadata": "Preuzmi ilustracije i metadata (opise) sa interneta", - "LabelDownloadInternetMetadataHelp": "Emby Server can download information about your media to enable rich presentations.", + "LabelDownloadInternetMetadataHelp": "Emby Server mo\u017ee preuzeti informacije o Va\u0161im medijima i omogu\u0107iti bogate prezentacije.", "TabPreferences": "Postavke", "TabPassword": "Lozinka", "TabLibraryAccess": "Pristup biblioteci", - "TabAccess": "Access", + "TabAccess": "Pristup", "TabImage": "Slika", "TabProfile": "Profil", - "TabMetadata": "Metadata", + "TabMetadata": "Meta-podaci", "TabImages": "Slike", "TabNotifications": "Obavijesti", "TabCollectionTitles": "Naslovi", - "HeaderDeviceAccess": "Device Access", - "OptionEnableAccessFromAllDevices": "Enable access from all devices", - "OptionEnableAccessToAllChannels": "Enable access to all channels", - "OptionEnableAccessToAllLibraries": "Enable access to all libraries", - "DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.", + "HeaderDeviceAccess": "Pristup ure\u0111aja", + "OptionEnableAccessFromAllDevices": "Omogu\u0107i pristup svim ure\u0111ajima", + "OptionEnableAccessToAllChannels": "Omogu\u0107i pristup svim kanalima", + "OptionEnableAccessToAllLibraries": "Omogu\u0107i pristup svim bibliotekama", + "DeviceAccessHelp": "To se odnosi samo na ure\u0111aje koji se mogu jedinstveno identificirati i ne\u0107e sprije\u010diti pristup preglednika. Filtriranje pristupa korisni\u010dkim ure\u0111ajima sprije\u010diti \u0107e ih u kori\u0161tenju novih ure\u0111aja sve dok nisu ovdje odobreni.", "LabelDisplayMissingEpisodesWithinSeasons": "Prika\u017ei epizode koje nedostaju unutar sezone", "LabelUnairedMissingEpisodesWithinSeasons": "Prika\u017ei epizode koje nisu emitirane unutar sezone", "HeaderVideoPlaybackSettings": "Postavke video reprodukcije", "HeaderPlaybackSettings": "Postavke reprodukcije", "LabelAudioLanguagePreference": "Postavke audio jezika:", - "LabelSubtitleLanguagePreference": "Jezik prijevoda:", - "OptionDefaultSubtitles": "Default", - "OptionSmartSubtitles": "Smart", - "OptionSmartSubtitlesHelp": "Subtitles matching the language preference will be loaded when the audio is in a foreign language.", - "OptionOnlyForcedSubtitles": "Only forced subtitles", - "OptionAlwaysPlaySubtitles": "Always play subtitles", - "OptionDefaultSubtitlesHelp": "Subtitles are loaded based on the default and forced flags in the embedded metadata. Language preferences are considered when multiple options are available.", - "OptionOnlyForcedSubtitlesHelp": "Only subtitles marked as forced will be loaded.", - "OptionAlwaysPlaySubtitlesHelp": "Subtitles matching the language preference will be loaded regardless of the audio language.", - "OptionNoSubtitlesHelp": "Subtitles will not be loaded by default.", + "LabelSubtitleLanguagePreference": "Postavke jezika titlova prijevoda", + "OptionDefaultSubtitles": "Zadano", + "OptionSmartSubtitles": "Pametno", + "OptionSmartSubtitlesHelp": "Titlovi prijevoda koji odgovaraju \u017eeljenom jeziku \u0107e se u\u010ditati kad je zvuk na stranom jeziku.", + "OptionOnlyForcedSubtitles": "Samo prisilni titlovi prijevoda", + "OptionAlwaysPlaySubtitles": "Uvijek prika\u017ei titlove prijevoda", + "OptionDefaultSubtitlesHelp": "Titlovi prijevoda u\u010ditani su na temelju zadanih i prisilnih oznaka u ugra\u0111enim meta-podacima. Postavke jezika uzimaju se u obzir kada je dostupno vi\u0161e opcija.", + "OptionOnlyForcedSubtitlesHelp": "Samo titlovi prijevoda ozna\u010deni kao prisilni \u0107e biti u\u010ditani.", + "OptionAlwaysPlaySubtitlesHelp": "Titlovi prijevoda koji odgovaraju \u017eeljenom jeziku biti \u0107e umetnuti bez obzira na audio jezik.", + "OptionNoSubtitlesHelp": "Titlovi prijevoda ne\u0107e biti u\u010ditani po zadanom.", "TabProfiles": "Profili", "TabSecurity": "Sigurnost", "ButtonAddUser": "Dodaj korisnika", - "ButtonInviteUser": "Invite User", + "ButtonInviteUser": "Pozovi korisnika", "ButtonSave": "Snimi", "ButtonResetPassword": "Resetiraj lozinku", "LabelNewPassword": "Nova lozinka:", @@ -147,7 +147,7 @@ "MessageNothingHere": "Ni\u0161ta ovdje.", "MessagePleaseEnsureInternetMetadata": "Molimo provjerite da je preuzimanje metadata sa interneta omogu\u0107eno.", "TabSuggested": "Preporu\u010deno", - "TabSuggestions": "Suggestions", + "TabSuggestions": "Prijedlozi", "TabLatest": "Zadnje", "TabUpcoming": "Uskoro", "TabShows": "Emisije", @@ -156,7 +156,7 @@ "TabPeople": "Ljudi", "TabNetworks": "Mre\u017ee", "HeaderUsers": "Korisnici", - "HeaderFilters": "Filters", + "HeaderFilters": "Filtri", "ButtonFilter": "Filter", "OptionFavorite": "Omiljeni", "OptionLikes": "Volim", @@ -182,7 +182,7 @@ "OptionAscending": "Uzlazno", "OptionDescending": "Silazno", "OptionRuntime": "Trajanje", - "OptionReleaseDate": "Release Date", + "OptionReleaseDate": "Datum izdavanja", "OptionPlayCount": "Broju izvo\u0111enja", "OptionDatePlayed": "Datumu izvo\u0111enja", "OptionDateAdded": "Datumu dodavanja", @@ -196,20 +196,20 @@ "OptionBudget": "Bud\u017eet", "OptionRevenue": "Prihod", "OptionPoster": "Poster", - "OptionPosterCard": "Poster card", + "OptionPosterCard": "Kartice postera", "OptionBackdrop": "Pozadina", "OptionTimeline": "Vremenska linija", "OptionThumb": "Sli\u010dica", - "OptionThumbCard": "Thumb card", + "OptionThumbCard": "Kartice sli\u010dica", "OptionBanner": "Zaglavlje", "OptionCriticRating": "Ocjeni kritike", - "OptionVideoBitrate": "Video Bitrate", + "OptionVideoBitrate": "Brzina prijenosa videa", "OptionResumable": "Nastavi", "ScheduledTasksHelp": "Klini na zadatak za pode\u0161avanje raporeda.", "ScheduledTasksTitle": "Raspored zadataka", "TabMyPlugins": "Moji dodaci", "TabCatalog": "Katalog", - "TitlePlugins": "Plugins", + "TitlePlugins": "Dodaci", "HeaderAutomaticUpdates": "Automatske nadogradnje", "HeaderNowPlaying": "Sad se izvodi", "HeaderLatestAlbums": "Zadnji albumi", @@ -223,17 +223,17 @@ "OptionIso": "Iso", "Option3D": "3D", "LabelStatus": "Status:", - "LabelLastResult": "Last result:", - "OptionHasSubtitles": "Prijevodi", + "LabelLastResult": "Posljednji rezultat:", + "OptionHasSubtitles": "Titlovi", "OptionHasTrailer": "Kratki video", "OptionHasThemeSong": "Pjesma teme", "OptionHasThemeVideo": "Video teme", "TabMovies": "Filmovi", "TabStudios": "Studio", "TabTrailers": "Kratki filmovi", - "LabelArtists": "Artists:", - "LabelArtistsHelp": "Separate multiple using ;", - "HeaderLatestTrailers": "Zadnji kratki filmovi", + "LabelArtists": "Izvo\u0111a\u010di:", + "LabelArtistsHelp": "Odvoji vi\u0161estruko koriste\u0107i ;", + "HeaderLatestTrailers": "Najnoviji kratki filmovi", "OptionHasSpecialFeatures": "Specijalne opcije", "OptionImdbRating": "IMDb ocjena", "OptionParentalRating": "Roditeljska ocjena", @@ -243,13 +243,13 @@ "OptionContinuing": "Nastavlja se", "OptionEnded": "Zavr\u0161eno", "HeaderAirDays": "Dani emitiranja", - "OptionSundayShort": "Sun", - "OptionMondayShort": "Mon", - "OptionTuesdayShort": "Tue", - "OptionWednesdayShort": "Wed", - "OptionThursdayShort": "Thu", - "OptionFridayShort": "Fri", - "OptionSaturdayShort": "Sat", + "OptionSundayShort": "Ned", + "OptionMondayShort": "Pon", + "OptionTuesdayShort": "Uto", + "OptionWednesdayShort": "Sre", + "OptionThursdayShort": "\u010cet", + "OptionFridayShort": "Pet", + "OptionSaturdayShort": "Sub", "OptionSunday": "Nedjelja", "OptionMonday": "Ponedjeljak", "OptionTuesday": "Utorak", @@ -258,50 +258,50 @@ "OptionFriday": "Petak", "OptionSaturday": "Subota", "HeaderManagement": "Upravljanje", - "LabelManagement": "Management:", + "LabelManagement": "Upravljanje:", "OptionMissingImdbId": "Nedostaje IMDb Id", "OptionMissingTvdbId": "Nedostaje TheTVDB Id", "OptionMissingOverview": "Nedostaje pregled", "TabGeneral": "Op\u0107e", "TitleSupport": "Podr\u0161ka", "TabAbout": "O ovome...", - "TabSupporterKey": "Emby Premiere Key", - "TabBecomeSupporter": "Get Emby Premiere", - "TabEmbyPremiere": "Emby Premiere", - "ProjectHasCommunity": "Emby has a thriving community of users and contributors.", - "CheckoutKnowledgeBase": "Check out our knowledge base to help you get the most out of Emby.", + "TabSupporterKey": "Klju\u010d Emby Premijere", + "TabBecomeSupporter": "Nabavite Emby Premijeru", + "TabEmbyPremiere": "Emby Premijera", + "ProjectHasCommunity": "Emby ima uspje\u0161nu zajednicu korisnika i suradnika.", + "CheckoutKnowledgeBase": "Provjerite na\u0161u bazu znanja kako bi vam pomogla da dobijete najvi\u0161e od Emby.", "SearchKnowledgeBase": "Pretra\u017ei bazu znanja", "VisitTheCommunity": "Posjeti zajednicu", - "VisitProjectWebsite": "Visit the Emby Web Site", - "VisitProjectWebsiteLong": "Visit the Emby Web site to catch the latest news and keep up with the developer blog.", + "VisitProjectWebsite": "Posjetite Emby Web stranice", + "VisitProjectWebsiteLong": "Posjetite web stranice Emby da pratite najnovije vijesti i dr\u017eite korak sa developer blogom.", "OptionHideUser": "Sakrij korisnika sa prozora prijave", - "OptionHideUserFromLoginHelp": "Useful for private or hidden administrator accounts. The user will need to sign in manually by entering their username and password.", + "OptionHideUserFromLoginHelp": "Korisno za privatne ili skrivene administratorske ra\u010dune. Korisnik \u0107e se morati prijaviti ru\u010dno unosom svojeg korisni\u010dkog imena i lozinke.", "OptionDisableUser": "Onemogu\u0107i ovog korisnika", "OptionDisableUserHelp": "Ako je onemogu\u0107en server ne\u0107e dopustiti nikakve veze od ovog korisnika. Postoje\u0107e veze \u0107e odmah biti prekinute.", "HeaderAdvancedControl": "Napredna kontrola", "LabelName": "Ime:", - "ButtonHelp": "Help", + "ButtonHelp": "Pomo\u0107", "OptionAllowUserToManageServer": "Dopusti ovom korisniku da upravlja serverom", "HeaderFeatureAccess": "Pristup opcijama", - "OptionAllowMediaPlayback": "Allow media playback", - "OptionAllowBrowsingLiveTv": "Allow Live TV access", - "OptionAllowDeleteLibraryContent": "Allow media deletion", - "OptionAllowManageLiveTv": "Allow Live TV recording management", - "OptionAllowRemoteControlOthers": "Allow remote control of other users", - "OptionAllowRemoteSharedDevices": "Allow remote control of shared devices", - "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.", - "OptionAllowLinkSharing": "Allow social media sharing", - "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire after {0} days.", - "HeaderSharing": "Sharing", - "HeaderRemoteControl": "Remote Control", + "OptionAllowMediaPlayback": "Dopusti reprodukciju medija", + "OptionAllowBrowsingLiveTv": "Dopusti pristup TV u\u017eivo", + "OptionAllowDeleteLibraryContent": "Dopusti brisanje medija", + "OptionAllowManageLiveTv": "Dopusti upravljanje snimanja TV u\u017eivo", + "OptionAllowRemoteControlOthers": "Dopusti daljinsko upravljanje drugih korisnika", + "OptionAllowRemoteSharedDevices": "Dopusti daljinsko upravljanje dijeljenih ure\u0111aja", + "OptionAllowRemoteSharedDevicesHelp": "DLNA ure\u0111aji smatraju se dijeljeni sve dok ih korisnik ne zapo\u010dne kontrolirati.", + "OptionAllowLinkSharing": "Dopusti dijeljenja na dru\u0161tvenim mre\u017eama", + "OptionAllowLinkSharingHelp": "Samo web stranice koje sadr\u017ee informacije medija su podijeljene. Medijske datoteke nikada nisu podijeljene javno. Dijeljenja su vremenski ograni\u010dena i iste\u0107i \u0107e nakon {0} dana.", + "HeaderSharing": "Dijeli", + "HeaderRemoteControl": "Daljinsko upravljanje", "OptionMissingTmdbId": "Nedostaje Tmdb Id", "OptionIsHD": "HD", "OptionIsSD": "SD", "OptionMetascore": "Metascore", "ButtonSelect": "Odaberi", - "PismoMessage": "Utilizing Pismo File Mount through a donated license.", - "TangibleSoftwareMessage": "Utilizing Tangible Solutions Java\/C# converters through a donated license.", - "HeaderCredits": "Credits", + "PismoMessage": "Upotrijebi montiranu Pismo datoteku kroz doniranu licencu.", + "TangibleSoftwareMessage": "Upotrijebi materijalna rje\u0161enja Java\/C# pretvara\u010da kroz doniranu licencu.", + "HeaderCredits": "Zasluge", "PleaseSupportOtherProduces": "Molimo podr\u017eite i druge proizvode koje koristimo:", "VersionNumber": "Verzija {0}", "TabPaths": "Putanja", @@ -310,64 +310,64 @@ "TitleAdvanced": "Napredno", "OptionRelease": "Slu\u017ebeno izdanje", "OptionBeta": "Beta", - "OptionDev": "Dev (nestabilno)", + "OptionDev": "Dev", "LabelAllowServerAutoRestart": "Dopusti serveru da se automatski resetira kako bi proveo nadogradnje", "LabelAllowServerAutoRestartHelp": "Server \u0107e se resetirati dok je u statusu mirovanja, odnosno kada nema aktivnih korisnika.", "LabelRunServerAtStartup": "Pokreni server pri pokretanju ra\u010dunala", "LabelRunServerAtStartupHelp": "Ovo \u0107e pokrenuti aplikaciju na alatnoj traci prilikom startanja windowsa. Ako \u017eelite pokrenuti Media Browser kao uslugu servisa maknite kva\u010dicu i pokrenite servis iz windows kontrolne plo\u010de. Imajte na umu da nemo\u017eet imati pokrenuto oboje, stoga ugasite aplikaciju na alatnoj traci prije pokretanja servisa.", - "ButtonSelectDirectory": "Select Directory", - "LabelCachePath": "Cache path:", - "LabelCachePathHelp": "Specify a custom location for server cache files, such as images. Leave blank to use the server default.", - "LabelRecordingPath": "Default recording path:", - "LabelMovieRecordingPath": "Movie recording path (optional):", - "LabelSeriesRecordingPath": "Series recording path (optional):", - "LabelRecordingPathHelp": "Specify the default location to save recordings. If left empty, the server's program data folder will be used.", - "LabelMetadataPath": "Metadata path:", - "LabelMetadataPathHelp": "Specify a custom location for downloaded artwork and metadata.", - "LabelTranscodingTempPath": "Transcoding temporary path:", - "LabelTranscodingTempPathHelp": "This folder contains working files used by the transcoder. Specify a custom path, or leave empty to use the default within the server's data folder.", - "TabBasics": "Basics", + "ButtonSelectDirectory": "Odaberi mapu", + "LabelCachePath": "Putanja predmemorije:", + "LabelCachePathHelp": "Odredite prilago\u0111enu lokaciju za predmemorijske datoteke servera, kao \u0161to su slike. Ostavite prazno za kori\u0161tenje zadanog poslu\u017eitelja.", + "LabelRecordingPath": "Zadana putanja za snimanje:", + "LabelMovieRecordingPath": "Putanja za snimanje filmova (neobavezno):", + "LabelSeriesRecordingPath": "Putanja za snimanje serija (neobavezno):", + "LabelRecordingPathHelp": "Odredite zadano mjesto za spremanje snimaka. Ako se ostavi prazno, koristit \u0107e se mapa poslu\u017eitelja programskih podaka.", + "LabelMetadataPath": "Put meta-podataka:", + "LabelMetadataPathHelp": "Odredite prilago\u0111enu lokaciju za preuzete ilustracije i meta-podatke.", + "LabelTranscodingTempPath": "Privremena putanja konvertiranja:", + "LabelTranscodingTempPathHelp": "Ova mapa sadr\u017ei radne datoteke koje koristi konverter. Navedite prilago\u0111enu putanju ili ostavite prazno za kori\u0161tenje zadanog unutar mape podataka poslu\u017eitelja.", + "TabBasics": "Osnove", "TabTV": "TV", - "TabGames": "Games", - "TabMusic": "Music", - "TabOthers": "Others", - "HeaderExtractChapterImagesFor": "Extract chapter images for:", - "OptionMovies": "Movies", - "OptionEpisodes": "Episodes", - "OptionOtherVideos": "Other Videos", - "TitleMetadata": "Metadata", - "LabelFanartApiKey": "Personal api key:", - "LabelFanartApiKeyHelp": "Requests to fanart without a personal API key return images that were approved over 7 days ago. With a personal API key that drops to 48 hours and if you are also a fanart VIP member that will further drop to around 10 minutes.", - "ExtractChapterImagesHelp": "Extracting chapter images will allow Emby apps to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs when videos are discovered, and also as a nightly scheduled task. The schedule is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.", - "LabelMetadataDownloadLanguage": "Preferred download language:", - "ButtonSignIn": "Sign In", - "TitleSignIn": "Sign In", - "HeaderPleaseSignIn": "Please sign in", - "LabelUser": "User:", - "LabelPassword": "Password:", - "ButtonManualLogin": "Manual Login", - "TabGuide": "Guide", - "TabChannels": "Channels", + "TabGames": "Igre", + "TabMusic": "Glazba", + "TabOthers": "Ostalo", + "HeaderExtractChapterImagesFor": "Izvadi slike poglavlja za:", + "OptionMovies": "Filmovi", + "OptionEpisodes": "Epizode", + "OptionOtherVideos": "Ostali video", + "TitleMetadata": "Meta-podaci", + "LabelFanartApiKey": "Osobni api klju\u010d:", + "LabelFanartApiKeyHelp": "Zahtjev za fanart bez osobnog API klju\u010d za povratak slika koje su odobrene prije vi\u0161e od sedam dana. Uz osobni API klju\u010d to se spu\u0161ta do 48 sati, a ako ste i VIP \u010dlan fanart-a to \u0107e jo\u0161 dodatno pasti na oko 10 minuta.", + "ExtractChapterImagesHelp": "Izdvajanje slika poglavlja omogu\u0107iti \u0107e Emby aplikaciji za prikaz grafi\u010dkih izbornika za odabir scena. Proces mo\u017ee biti spor, CPU intenzivno kori\u0161ten i mo\u017ee zahtijevati nekoliko gigabajta prostora. Ono se pokre\u0107e kad je otkriven video, a tako\u0111er i kao no\u0107ni zadatak. Raspored je podesiv u podru\u010dju rasporeda zadataka. Ne preporu\u010duje se za pokretanje ovog zadatka tijekom sati \u010destog kori\u0161tenja.", + "LabelMetadataDownloadLanguage": "\u017deljeni jezik za preuzimanje:", + "ButtonSignIn": "Prijava", + "TitleSignIn": "Prijava", + "HeaderPleaseSignIn": "Molim, prijavite se", + "LabelUser": "Korisnik:", + "LabelPassword": "Lozinka:", + "ButtonManualLogin": "Ru\u010dna prijava", + "TabGuide": "Vodi\u010d", + "TabChannels": "Kanali", "TabCollections": "Kolekcije", - "HeaderChannels": "Channels", - "TabRecordings": "Recordings", - "TabScheduled": "Scheduled", - "TabSeries": "Series", + "HeaderChannels": "Kanali", + "TabRecordings": "Snimke", + "TabScheduled": "Zakazano", + "TabSeries": "Serije", "TabFavorites": "Omiljeni", - "TabMyLibrary": "My Library", - "ButtonCancelRecording": "Cancel Recording", - "LabelPrePaddingMinutes": "Pre-padding minutes:", + "TabMyLibrary": "Moja biblioteka", + "ButtonCancelRecording": "Prekini snimanje", + "LabelPrePaddingMinutes": "Dodatne minute za kraj", "LabelPostPaddingMinutes": "Dodatne minute za kraj", "HeaderWhatsOnTV": "\u0160to je sad na TV-u", "TabStatus": "Status", "TabSettings": "Postavke", "ButtonRefreshGuideData": "Osvje\u017ei TV vodi\u010d", - "ButtonRefresh": "Refresh", + "ButtonRefresh": "Osvije\u017ei", "OptionPriority": "Prioritet", - "OptionRecordOnAllChannels": "Record on all channels", - "OptionRecordAnytime": "Record at any time", + "OptionRecordOnAllChannels": "Snimanje na svim kanalima", + "OptionRecordAnytime": "Snimanje bilo kada", "OptionRecordOnlyNewEpisodes": "Snimi samo nove epizode", - "HeaderRepeatingOptions": "Repeating Options", + "HeaderRepeatingOptions": "Opcije ponavljanja", "HeaderDays": "Dani", "HeaderActiveRecordings": "Aktivna snimanja", "HeaderLatestRecordings": "Zadnje snimke", @@ -383,8 +383,8 @@ "LabelNumberOfGuideDays": "Broj dana TV vodi\u010da za preuzet:", "LabelNumberOfGuideDaysHelp": "Preuzimanje vi\u0161e dana TV vodi\u010da, omogu\u0107iti \u0107e vam zakazivanje snimanja dalje u budu\u0107nost , ali \u0107e i preuzimanje du\u017ee trajati. Automaski - odabir \u0107e se prilagoditi broju kanala.", "OptionAutomatic": "Automatski", - "HeaderServices": "Services", - "LabelCustomizeOptionsPerMediaType": "Customize for media type:", + "HeaderServices": "Servisi", + "LabelCustomizeOptionsPerMediaType": "Prilagodba za vrstu medija:", "OptionDownloadThumbImage": "Sli\u010dica", "OptionDownloadMenuImage": "Meni", "OptionDownloadLogoImage": "Logo", @@ -396,13 +396,13 @@ "OptionDownloadPrimaryImage": "Primarno", "HeaderFetchImages": "Dohvati slike:", "HeaderImageSettings": "Postavke slike", - "TabOther": "Other", + "TabOther": "Ostalo", "LabelMaxBackdropsPerItem": "Maksimalni broj pozadina po stavci:", "LabelMaxScreenshotsPerItem": "Maksimalni broj isje\u010daka po stavci:", "LabelMinBackdropDownloadWidth": "Minimalna \u0161irina pozadine za preuzimanje:", "LabelMinScreenshotDownloadWidth": "Minimalna \u0161irina isje\u010dka za preuzimanje:", - "ButtonAddScheduledTaskTrigger": "Add Trigger", - "HeaderAddScheduledTaskTrigger": "Add Trigger", + "ButtonAddScheduledTaskTrigger": "Dodaj okida\u010d", + "HeaderAddScheduledTaskTrigger": "Dodaj okida\u010d", "ButtonAdd": "Dodaj", "LabelTriggerType": "Tip pokreta\u010da:", "OptionDaily": "Dnevno", @@ -426,7 +426,7 @@ "LabelEnableRealtimeMonitor": "Omogu\u0107i nadgledanje u realnom vremenu", "LabelEnableRealtimeMonitorHelp": "Promjene \u0107e biti procesuirane odmah, nad podr\u017eanim datotekama sistema.", "ButtonScanLibrary": "Skeniraj biblioteku", - "HeaderNumberOfPlayers": "Players", + "HeaderNumberOfPlayers": "Izvo\u0111a\u010di", "OptionAnyNumberOfPlayers": "Bilo koji", "Option1Player": "1+", "Option2Player": "2+", @@ -443,15 +443,15 @@ "HeaderCastCrew": "Glumci i ekipa", "HeaderAdditionalParts": "Dodatni djelovi", "ButtonSplitVersionsApart": "Razdvoji verzije", - "ButtonPlayTrailer": "Trailer", + "ButtonPlayTrailer": "Kratki video", "LabelMissing": "Nedostaje", "LabelOffline": "Nedostupno", - "PathSubstitutionHelp": "Zamjenske putanje se koriste za mapiranje putanja na serveru na putanje kojima \u0107e kljenti mo\u0107i pristupiti. Dupu\u0161taju\u0107i kljentima direktan pristup medijima na serveru imaju mogu\u0107nost izvoditi sadr\u017eaj direktno preko mre\u017ee i tako ne iskori\u0161tavati resurse servera za koverziju i reprodukciju istih.", + "PathSubstitutionHelp": "Zamjene se koriste za mapiranje putanja na serveru na putanje kojima \u0107e Emby aplikacije mo\u0107i pristupiti. Dopu\u0161taju\u0107i Emby aplikacijama direktan pristup medijima na serveru imaju mogu\u0107nost izvoditi sadr\u017eaj direktno preko mre\u017ee i tako ne iskori\u0161tavati resurse servera za konverziju i reprodukciju istih.", "HeaderFrom": "Od", "HeaderTo": "Za", "LabelFrom": "Od:", "LabelTo": "Za:", - "LabelToHelp": "Example: \\\\MyServer\\Movies (a path that can be accessed by Emby apps)", + "LabelToHelp": "Primjer: \\\\MyServer\\Movies (Putanja kojoj mogu pristupiti Emby aplikacije)", "ButtonAddPathSubstitution": "Dodaj zamjenu", "OptionSpecialEpisode": "Specijal", "OptionMissingEpisode": "Epizode koje nedostaju", @@ -462,11 +462,11 @@ "EditCollectionItemsHelp": "Dodaj ili ukloni bilo koje filmove, serije, albume, knjige ili igrice koje \u017eeli\u0161 grupirati u ovu kolekciju.", "HeaderAddTitles": "Dodaj naslove", "LabelEnableDlnaPlayTo": "Omogu\u0107i DLNA izvo\u0111enje na", - "LabelEnableDlnaPlayToHelp": "Emby can detect devices within your network and offer the ability to remote control them.", + "LabelEnableDlnaPlayToHelp": "Emby mo\u017ee otkriti ure\u0111aje unutar svoje mre\u017ee i ponuditi mogu\u0107nost da ih daljinski upravlja.", "LabelEnableDlnaDebugLogging": "Omogu\u0107i DLNA logiranje gre\u0161aka.", "LabelEnableDlnaDebugLoggingHelp": "Ovo \u0107e kreirati iznimno velike log datoteke i jedino se preporu\u010da koristiti u slu\u010daju problema.", "LabelEnableDlnaClientDiscoveryInterval": "Interval za otkrivanje kljenata (sekunde)", - "LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds between SSDP searches performed by Emby.", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Odre\u0111uje trajanje u sekundama izme\u0111u SSDP pretra\u017eivanja obavljenih od Emby-a.", "HeaderCustomDlnaProfiles": "Prilago\u0111en profil", "HeaderSystemDlnaProfiles": "Sistemski profil", "CustomDlnaProfilesHelp": "Kreiraj prilago\u0111eni profili za novi ure\u0111aj ili doradi neki od sistemskih profila.", @@ -480,27 +480,27 @@ "LinkApi": "Api", "LabelFriendlyServerName": "Prijateljsko ime servera:", "LabelFriendlyServerNameHelp": "Ovo ime \u0107e se koristiti za identifikaciju servera. Ako ostavite prazno, ime ra\u010dunala \u0107e se koristi kao identifikator.", - "LabelPreferredDisplayLanguage": "Preferred display language:", - "LabelPreferredDisplayLanguageHelp": "Translating Emby is an ongoing project.", - "LabelReadHowYouCanContribute": "Learn how you can contribute.", - "ButtonSubmit": "Submit", + "LabelPreferredDisplayLanguage": "\u017deljeni jezik za prikaz:", + "LabelPreferredDisplayLanguageHelp": "Preva\u0111anje Emby-a je projekt u tijeku.", + "LabelReadHowYouCanContribute": "Nau\u010dite kako mo\u017eete pridonijeti.", + "ButtonSubmit": "Podnesi", "ButtonCreate": "Kreiraj", - "LabelCustomCss": "Custom css:", - "LabelCustomCssHelp": "Apply your own custom css to the web interface.", - "LabelLocalHttpServerPortNumber": "Local http port number:", - "LabelLocalHttpServerPortNumberHelp": "The tcp port number that Emby's http server should bind to.", - "LabelPublicHttpPort": "Public http port number:", - "LabelPublicHttpPortHelp": "The public port number that should be mapped to the local http port.", - "LabelPublicHttpsPort": "Public https port number:", - "LabelPublicHttpsPortHelp": "The public port number that should be mapped to the local https port.", - "LabelEnableHttps": "Report https as external address", - "LabelEnableHttpsHelp": "If enabled, the server will report an https url to Emby apps as it's external address.", - "LabelHttpsPort": "Local https port number:", - "LabelHttpsPortHelp": "The tcp port number that Emby's https server should bind to.", - "LabelEnableAutomaticPortMap": "Enable automatic port mapping", - "LabelEnableAutomaticPortMapHelp": "Attempt to automatically map the public port to the local port via UPnP. This may not work with some router models.", - "LabelExternalDDNS": "External domain:", - "LabelExternalDDNSHelp": "If you have a dynamic DNS enter it here. Emby apps will use it when connecting remotely. This field is required when used with a custom ssl certificate.", + "LabelCustomCss": "Prilago\u0111en css:", + "LabelCustomCssHelp": "Primijenite svoj vlastiti prilago\u0111eni css na web su\u010delje.", + "LabelLocalHttpServerPortNumber": "Lokalni broj http porta:", + "LabelLocalHttpServerPortNumberHelp": "Broj TCP porta na koji se treba vezati Emby-jev HTTP poslu\u017eitelj.", + "LabelPublicHttpPort": "Javni broj http porta:", + "LabelPublicHttpPortHelp": "Broj javnog broja porta koji treba biti mapiran na lokalni http port.", + "LabelPublicHttpsPort": "Javni broj https porta:", + "LabelPublicHttpsPortHelp": "Broj javnog broja porta koji treba biti mapiran na lokalni https port.", + "LabelEnableHttps": "Prijavi https kao vanjsku adresu", + "LabelEnableHttpsHelp": "Ako je omogu\u0107eno, server \u0107e izvijestiti https url Emby aplikacijama kao \u0161to je vanjska adresa.", + "LabelHttpsPort": "Lokalni broj https porta:", + "LabelHttpsPortHelp": "Broj TCP porta na koji se Emby https server treba vezati.", + "LabelEnableAutomaticPortMap": "Omogu\u0107i automatsko mapiranje porta", + "LabelEnableAutomaticPortMapHelp": "Poku\u0161aj automatski mapirati javni port za lokalni port preko UPnP. Mo\u017eda ne\u0107e raditi s nekim modelima router-a.", + "LabelExternalDDNS": "Vanjska domena:", + "LabelExternalDDNSHelp": "Ako imate dinami\u010dan DNS unesite ga ovdje. Emby aplikacije \u0107e ga koristiti prilikom spajanja na daljinu. Ovo polje je obavezno kada se koristi s prilago\u0111enim ssl certifikatom.", "TitleAppSettings": "Postavke aplikacije", "LabelMinResumePercentage": "Minimalni postotak za nastavak:", "LabelMaxResumePercentage": "Maksimalni postotak za nastavak:", @@ -510,8 +510,8 @@ "LabelMinResumeDurationHelp": "Naslovi kra\u0107i od ovog ne\u0107e imati mogu\u0107nost nastavka", "TitleAutoOrganize": "Auto-Organiziraj", "TabActivityLog": "Zapisnik aktivnosti", - "TabSmartMatches": "Smart Matches", - "TabSmartMatchInfo": "Manage your smart matches that were added using the Auto-Organize correction dialog", + "TabSmartMatches": "Pametno podudaranje", + "TabSmartMatchInfo": "Upravljanje pametnim podudaranjima koje su dodane pomo\u0107u automatsko-organizirane forme za ispravljanje", "HeaderName": "Ime", "HeaderDate": "Datum", "HeaderSource": "Izvor", @@ -520,17 +520,17 @@ "HeaderProgram": "Program", "HeaderClients": "Kljenti", "LabelCompleted": "Zavr\u0161eno", - "LabelFailed": "Failed", + "LabelFailed": "Neuspje\u0161no", "LabelSkipped": "Presko\u010deno", - "LabelSeries": "Series:", - "LabelSeasonNumber": "Season number:", - "LabelEpisodeNumber": "Episode number:", + "LabelSeries": "Serije:", + "LabelSeasonNumber": "Broj sezone:", + "LabelEpisodeNumber": "Broj epizode:", "LabelEndingEpisodeNumber": "Broj kraja epizode:", "LabelEndingEpisodeNumberHelp": "Potrebno samo za datoteke sa vi\u0161e epizoda", - "OptionRememberOrganizeCorrection": "Save and apply this correction to future files with similiar names", - "HeaderSupportTheTeam": "Support the Emby Team", - "HeaderSupportTheTeamHelp": "Help ensure the continued development of this project by purchasing Emby Premiere. A portion of all income will be contributed to other free tools we depend on.", - "DonationNextStep": "Once complete, please return and enter your Emby Premiere key, which you will receive by email.", + "OptionRememberOrganizeCorrection": "Spremite i primijenite ovaj ispravak na budu\u0107e datoteke sa sli\u010dnim imenima", + "HeaderSupportTheTeam": "Podr\u017eite Emby tim", + "HeaderSupportTheTeamHelp": "Osigurajte kontinuirani razvoj ovog projekta kupnjom Emby premijere. Dio svih prihoda bit \u0107e dan drugim besplatnim alatima na koje se oslanjamo.", + "DonationNextStep": "Nakon zavr\u0161etka, vratite se i unesite klju\u010d Emby Premijere, koji \u0107ete dobiti putem e-maila.", "AutoOrganizeHelp": "Auto-Organizator nadgleda va\u0161u mapu za preuzimanja za nove datoteke i filmove te ih premje\u0161ta u mapu za medije.", "AutoOrganizeTvHelp": "Organizator TV datoteka \u0107e samo dodati epizode za postoje\u0107e serije. Ne\u0107e napraviti mape za nove serije.", "OptionEnableEpisodeOrganization": "Omogu\u0107i organizaciju novih epizoda", @@ -560,38 +560,38 @@ "HeaderRunningTasks": "Zadatci koji se izvode", "HeaderActiveDevices": "Aktivni ure\u0111aji", "HeaderPendingInstallations": "Instalacije u toku", - "HeaderServerInformation": "Server Information", + "HeaderServerInformation": "Informacije servera", "ButtonRestartNow": "Ponovo pokreni sad", "ButtonRestart": "Ponovo pokreni", "ButtonShutdown": "Ugasi", "ButtonUpdateNow": "A\u017euriraj sad", - "TabHosting": "Hosting", + "TabHosting": "Poslu\u017eivanje", "PleaseUpdateManually": "Molimo ugasite server i a\u017eurirati ru\u010dno", - "NewServerVersionAvailable": "A new version of Emby Server is available!", - "ServerUpToDate": "Emby Server is up to date", + "NewServerVersionAvailable": "Nova verzija Emby servera je dostupna!", + "ServerUpToDate": "Emby server je a\u017euran", "LabelComponentsUpdated": "Sljede\u0107e komponente su instalirane ili a\u017eurirane.", "MessagePleaseRestartServerToFinishUpdating": "Molimo ponovo pokrenite server kako bi se zavr\u0161ila a\u017euriranja.", "LabelDownMixAudioScale": "Poja\u010daj zvuk kada radi\u0161 downmix:", "LabelDownMixAudioScaleHelp": "Poja\u010daj zvuk kada radi\u0161 downmix. Postavi na 1 ako \u017eeli\u0161 zadr\u017eati orginalnu ja\u010dinu zvuka.", - "ButtonLinkKeys": "Transfer Key", - "LabelOldSupporterKey": "Old Emby Premiere key", - "LabelNewSupporterKey": "New Emby Premiere key", - "HeaderMultipleKeyLinking": "Transfer to New Key", - "MultipleKeyLinkingHelp": "If you received a new Emby Premiere key, use this form to transfer the old key's registrations to your new one.", + "ButtonLinkKeys": "Klju\u010d za prijenos", + "LabelOldSupporterKey": "Stari klju\u010d Emby Premijere", + "LabelNewSupporterKey": "Novi klju\u010d Emby Premijere", + "HeaderMultipleKeyLinking": "Prenesi na novi klju\u010d", + "MultipleKeyLinkingHelp": "Ako ste dobili novi klju\u010d Emby Premijere, upotrijebite ovaj obrazac za prijenos starog klju\u010da prijave na novo.", "LabelCurrentEmailAddress": "Trenutna e-mail adresa", "LabelCurrentEmailAddressHelp": "Trenutna e-mail adresa na koju je poslan novi klju\u010d.", "HeaderForgotKey": "Zaboravili ste klju\u010d", "LabelEmailAddress": "E-mail adresa", "LabelSupporterEmailAddress": "E-mail adresa koja je kori\u0161tena za nabavku klju\u010da", "ButtonRetrieveKey": "Dohvati klju\u010d", - "LabelSupporterKey": "Emby Premiere key (paste from email):", - "LabelSupporterKeyHelp": "Enter your Emby Premiere key to start enjoying additional benefits the community has developed for Emby.", - "MessageInvalidKey": "Emby Premiere key is missing or invalid.", - "ErrorMessageInvalidKey": "In order for any premium content to be registered, you must also have an active Emby Premiere subscription.", + "LabelSupporterKey": "Emby Premijera klju\u010d (zalijepi iz e-mail):", + "LabelSupporterKeyHelp": "Unesite svoj klju\u010d Emby Premijere da po\u010dnete u\u017eivati u dodatnim pogodnostima koje je zajednica razvijala za Emby.", + "MessageInvalidKey": "Klju\u010d Emby Premijere nedostaje ili je pogre\u0161an.", + "ErrorMessageInvalidKey": "Kako bi premium sadr\u017eaj bio registriran, morate imati aktivnu pretplatu Emby Premijere.", "HeaderDisplaySettings": "Postavke prikaza", "TabPlayTo": "Izvedi na", "LabelEnableDlnaServer": "Omogu\u0107i Dlna server", - "LabelEnableDlnaServerHelp": "Allows UPnP devices on your network to browse and play Emby content.", + "LabelEnableDlnaServerHelp": "Omogu\u0107uje UPnP ure\u0111ajima na mre\u017ei da pregledavaju i pokre\u0107u Emby sadr\u017eaj.", "LabelEnableBlastAliveMessages": "Objavi poruke dostupnosti", "LabelEnableBlastAliveMessagesHelp": "Omogu\u0107i ovo ako server nije prikazan kao siguran za druge UPnP ure\u0111aje na mre\u017ei.", "LabelBlastMessageInterval": "Interval poruka dostupnosti (sekunde)", @@ -601,10 +601,10 @@ "TitleDlna": "DLNA", "HeaderServerSettings": "Postavke Servera", "HeaderRequireManualLogin": "Zahtjevaj ru\u010dni unos korisni\u010dkog imena za:", - "HeaderRequireManualLoginHelp": "Kada onemogu\u0107eni korisnici otvore prozor za prijavu sa vizualnim odabirom korisnika.", + "HeaderRequireManualLoginHelp": "Kada je onemogu\u0107eno, Emby aplikacije mogu otvoriti prozor za prijavu sa vizualnim odabirom korisnika.", "OptionOtherApps": "Druge aplikacije", "OptionMobileApps": "Mobilne aplikacije", - "HeaderNotificationList": "Click on a notification to configure sending options.", + "HeaderNotificationList": "Kliknite na obavijesti za pode\u0161avanje opcije slanja.", "NotificationOptionApplicationUpdateAvailable": "Dostupno a\u017euriranje aplikacije", "NotificationOptionApplicationUpdateInstalled": "Instalirano a\u017euriranje aplikacije", "NotificationOptionPluginUpdateInstalled": "Instalirano a\u017euriranje za dodatak", @@ -613,16 +613,16 @@ "NotificationOptionVideoPlayback": "Reprodukcija videa zapo\u010deta", "NotificationOptionAudioPlayback": "Reprodukcija glazbe zapo\u010deta", "NotificationOptionGamePlayback": "Igrica pokrenuta", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", - "NotificationOptionGamePlaybackStopped": "Game playback stopped", + "NotificationOptionVideoPlaybackStopped": "Reprodukcija videozapisa je zaustavljena", + "NotificationOptionAudioPlaybackStopped": "Reprodukcija audiozapisa je zaustavljena", + "NotificationOptionGamePlaybackStopped": "Reprodukcija igre je zaustavljena", "NotificationOptionTaskFailed": "Zakazan zadatak nije izvr\u0161en", "NotificationOptionInstallationFailed": "Instalacija nije izvr\u0161ena", "NotificationOptionNewLibraryContent": "Novi sadr\u017eaj dodan", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", - "NotificationOptionCameraImageUploaded": "Camera image uploaded", - "NotificationOptionUserLockedOut": "User locked out", - "HeaderSendNotificationHelp": "Notifications are delivered to your Emby inbox. Additional options can be installed from the Services tab.", + "NotificationOptionNewLibraryContentMultiple": "Novi sadr\u017eaj dodan (vi\u0161estruki)", + "NotificationOptionCameraImageUploaded": "Slike kamere preuzete", + "NotificationOptionUserLockedOut": "Korisnik zaklju\u010dan", + "HeaderSendNotificationHelp": "Obavijesti se dostavljaju u va\u0161 Emby inbox. Dodatne opcije mogu biti instalirane na kartici Servisa.", "NotificationOptionServerRestartRequired": "Potrebno ponovo pokretanje servera", "LabelNotificationEnabled": "Omogu\u0107i ovu obavijest", "LabelMonitorUsers": "Obrazac nadzora aktivnosti:", @@ -643,7 +643,7 @@ "ButtonArrowRight": "Desno", "ButtonBack": "Nazad", "ButtonInfo": "Info", - "ButtonOsd": "On screen display", + "ButtonOsd": "Zaslon ekrana", "ButtonPageUp": "Stranica gore", "ButtonPageDown": "Stranica dolje", "ButtonHome": "Po\u010detna", @@ -656,19 +656,19 @@ "TabControls": "Kontrole", "ButtonScenes": "Scene", "ButtonSubtitles": "Titlovi", - "ButtonPreviousTrack": "Previous track", - "ButtonNextTrack": "Next track", + "ButtonPreviousTrack": "Prethodna pjesma", + "ButtonNextTrack": "Sljede\u0107a pjesma", "ButtonStop": "Stop", "ButtonPause": "Pauza", - "ButtonNext": "Next", - "ButtonPrevious": "Previous", + "ButtonNext": "Sljede\u0107i", + "ButtonPrevious": "Prethodni", "LabelGroupMoviesIntoCollections": "Grupiraj filmove u kolekciju", "LabelGroupMoviesIntoCollectionsHelp": "Kada se prikazuje lista filmova, filmovi koji pripadaju kolekciji biti \u0107e prikazani kao jedna stavka.", "NotificationOptionPluginError": "Dodatak otkazao", "ButtonVolumeUp": "Glasno\u0107a gore", "ButtonVolumeDown": "Glasno\u0107a dolje", "HeaderLatestMedia": "Lista medija", - "OptionNoSubtitles": "Nema titlova", + "OptionNoSubtitles": "Bez titlova prijevoda", "OptionSpecialFeatures": "Specijalne opcije", "HeaderCollections": "Kolekcije", "LabelProfileCodecsHelp": "Odvojeno sa to\u010dka-zrezom. Ovo mo\u017ee ostaviti prazno kao bi bilo postavljeno za sve codecs.", @@ -694,7 +694,7 @@ "OptionPlainVideoItems": "Prika\u017ei sav video kao jednostavne video stavke.", "OptionPlainVideoItemsHelp": "Ako je omogu\u0107eno, sav video se prezentira u DIDL-u kao \"objekt.stavka.videoStavka\" umjesto vi\u0161e specijaliziranog tipa kao \"objekt.stavka.videoStavka.film\".", "LabelSupportedMediaTypes": "Podr\u017eani tipovi medija:", - "HeaderIdentification": "Identification", + "HeaderIdentification": "Identifikacija", "TabDirectPlay": "Direktna reprodukcija", "TabContainers": "Spremnik", "TabCodecs": "Kodek", @@ -703,134 +703,134 @@ "LabelEmbedAlbumArtDidl": "Ugradi grafike albuma u Didl", "LabelEmbedAlbumArtDidlHelp": "Neki ure\u0111aji podr\u017eavaju ovu metodu za prikaz grafike albuma. Drugi bi mogli imati problema sa ovom opcijom uklju\u010denom.", "LabelAlbumArtPN": "Grafika albuma PN:", - "LabelAlbumArtHelp": "PN se koristi za grafiku albuma sa dlna:profilID atributom na upnp:albumGrafikaURI. Neki klijenti zahtijevaju specifi\u010dnu vrijednost bez obzira na veli\u010dinu slike.", - "LabelAlbumArtMaxWidth": "Album art max width:", - "LabelAlbumArtMaxWidthHelp": "Max resolution of album art exposed via upnp:albumArtURI.", - "LabelAlbumArtMaxHeight": "Album art max height:", - "LabelAlbumArtMaxHeightHelp": "Max resolution of album art exposed via upnp:albumArtURI.", - "LabelIconMaxWidth": "Icon max width:", - "LabelIconMaxWidthHelp": "Max resolution of icons exposed via upnp:icon.", - "LabelIconMaxHeight": "Icon max height:", - "LabelIconMaxHeightHelp": "Max resolution of icons exposed via upnp:icon.", - "LabelIdentificationFieldHelp": "A case-insensitive substring or regex expression.", - "HeaderProfileServerSettingsHelp": "These values control how Emby Server will present itself to the device.", - "LabelMaxBitrate": "Max bitrate:", - "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.", - "LabelMaxStreamingBitrate": "Max streaming bitrate:", - "LabelMaxStreamingBitrateHelp": "Specify a max bitrate when streaming.", - "LabelMaxChromecastBitrate": "Max Chromecast bitrate:", - "LabelMusicStaticBitrate": "Music sync bitrate:", - "LabelMusicStaticBitrateHelp": "Specify a max bitrate when syncing music", - "LabelMusicStreamingTranscodingBitrate": "Music transcoding bitrate:", - "LabelMusicStreamingTranscodingBitrateHelp": "Specify a max bitrate when streaming music", - "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests", - "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.", - "LabelFriendlyName": "Friendly name", - "LabelManufacturer": "Manufacturer", - "LabelManufacturerUrl": "Manufacturer url", - "LabelModelName": "Model name", - "LabelModelNumber": "Model number", - "LabelModelDescription": "Model description", - "LabelModelUrl": "Model url", - "LabelSerialNumber": "Serial number", - "LabelDeviceDescription": "Device description", - "HeaderIdentificationCriteriaHelp": "Enter at least one identification criteria.", - "HeaderDirectPlayProfileHelp": "Add direct play profiles to indicate which formats the device can handle natively.", - "HeaderTranscodingProfileHelp": "Add transcoding profiles to indicate which formats should be used when transcoding is required.", + "LabelAlbumArtHelp": "PN se koristi za grafiku albuma sa dlna:profileID atributom na upnp:albumArtURI. Neki ure\u0111aji zahtijevaju specifi\u010dnu vrijednost bez obzira na veli\u010dinu slike.", + "LabelAlbumArtMaxWidth": "Maksimalna \u0161irina Album art-a:", + "LabelAlbumArtMaxWidthHelp": "Maksimalna rezolucija albuma izlo\u017eenih putem UPnP:albumArtURI.", + "LabelAlbumArtMaxHeight": "Maksimalna visina Album art-a:", + "LabelAlbumArtMaxHeightHelp": "Maksimalna rezolucija albuma izlo\u017eenih putem UPnP:albumArtURI.", + "LabelIconMaxWidth": "Maksimalna \u0161irina ikona:", + "LabelIconMaxWidthHelp": "Maksimalna rezolucija ikona izlo\u017eenih putem UPnP:icon.", + "LabelIconMaxHeight": "Maksimalna visina ikona:", + "LabelIconMaxHeightHelp": "Maksimalna rezolucija ikona izlo\u017eenih putem UPnP:icon.", + "LabelIdentificationFieldHelp": "Spis-neosjetljivi podniz ili regex izraz.", + "HeaderProfileServerSettingsHelp": "Ove vrijednosti kontroliraju kako \u0107e se Emby Server predstaviti na ure\u0111aju.", + "LabelMaxBitrate": "Najve\u0107a brzina prijenosa:", + "LabelMaxBitrateHelp": "Odredite maksimalnu brzinu prijenosa u okru\u017eenju ograni\u010dene propusnosti ili ako ure\u0111aj name\u0107e svoju granicu.", + "LabelMaxStreamingBitrate": "Najve\u0107a brzina prijenosa strujanja:", + "LabelMaxStreamingBitrateHelp": "Odredite maksimalnu brzinu prijenosa pri strujanju.", + "LabelMaxChromecastBitrate": "Najve\u0107a brzina prijenosa Chromecast-a:", + "LabelMusicStaticBitrate": "Brzina prijenosa sinkronizacije glazbe:", + "LabelMusicStaticBitrateHelp": "Odredite maksimalnu brzinu prijenosa prilikom sinkronizacije glazbe", + "LabelMusicStreamingTranscodingBitrate": "Brzina prijenosa konvertiranja glazbe:", + "LabelMusicStreamingTranscodingBitrateHelp": "Odredite maksimalnu brzinu prijenosa pri strujanju glazbe", + "OptionIgnoreTranscodeByteRangeRequests": "Zanemari raspon zahtjeva prikrivenog bajta", + "OptionIgnoreTranscodeByteRangeRequestsHelp": "Ako je omogu\u0107eno, zahtjevi \u0107e biti po\u0161tovani, ali \u0107e ignorirati zaglavlja raspona bajta.", + "LabelFriendlyName": "Prijateljsko ime", + "LabelManufacturer": "Proizvo\u0111a\u010d", + "LabelManufacturerUrl": "URL proizvo\u0111a\u010da", + "LabelModelName": "Ime modela", + "LabelModelNumber": "Broj modela", + "LabelModelDescription": "Opis modela", + "LabelModelUrl": "URL modela", + "LabelSerialNumber": "Serijski broj", + "LabelDeviceDescription": "Opis ure\u0111aja", + "HeaderIdentificationCriteriaHelp": "Unesite barem jedan kriterij za identifikaciju.", + "HeaderDirectPlayProfileHelp": "Dodaj izravne profile reprodukcije za ozna\u010davanje kojim formatima ure\u0111aj mo\u017ee rukovati prirodno.", + "HeaderTranscodingProfileHelp": "Dodaj profile konvertiranja za ozna\u010davanje koji se formati trebaju koristiti kada je potrebno konvertiranje.", "HeaderContainerProfileHelp": "Profil spremnika definira ograni\u010denja za ure\u0111aje kada izvode specifi\u010dne formate. Ako se ograni\u010denja podudaraju tada \u0107e sadr\u017eaj biti transkodiran, iako je format konfiguriran za direktno izvo\u0111enje.", "HeaderCodecProfileHelp": "Profili kodeka definiraju ograni\u010denja kada ure\u0111aji izvode sadr\u017eaj u specifi\u010dnom kodeku. Ako se ograni\u010denja podudaraju tada \u0107e sadr\u017eaj biti transkodiran, iako je kodek konfiguriran za direktno izvo\u0111enje.", - "HeaderResponseProfileHelp": "Response profiles provide a way to customize information sent to the device when playing certain kinds of media.", + "HeaderResponseProfileHelp": "Profili odgovora pru\u017eaju na\u010din prilagodbe informacija koje se \u0161alju na ure\u0111aj kada reproducirate odre\u0111ene vrste medija.", "LabelXDlnaCap": "X-Dlna cap:", - "LabelXDlnaCapHelp": "Determines the content of the X_DLNACAP element in the urn:schemas-dlna-org:device-1-0 namespace.", + "LabelXDlnaCapHelp": "Odre\u0111uje sadr\u017eaj X_DLNACAP elementa u urn:shemas-dlna-org:device-1-0 namespace.", "LabelXDlnaDoc": "X-Dlna doc:", - "LabelXDlnaDocHelp": "Determines the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.", + "LabelXDlnaDocHelp": "Odre\u0111uje sadr\u017eaj X_DLNADOC elementa u urn:schemas-dlna-org:device-1-0 namespace.", "LabelSonyAggregationFlags": "Sony aggregation flags:", - "LabelSonyAggregationFlagsHelp": "Determines the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace.", - "LabelTranscodingContainer": "Container:", - "LabelTranscodingVideoCodec": "Video codec:", - "LabelTranscodingAudioCodec": "Audio codec:", - "OptionEnableM2tsMode": "Enable M2ts mode", - "OptionEnableM2tsModeHelp": "Enable m2ts mode when encoding to mpegts.", - "OptionEstimateContentLength": "Estimate content length when transcoding", - "OptionReportByteRangeSeekingWhenTranscoding": "Report that the server supports byte seeking when transcoding", - "OptionReportByteRangeSeekingWhenTranscodingHelp": "This is required for some devices that don't time seek very well.", - "HeaderDownloadSubtitlesFor": "Download subtitles for:", - "LabelSkipIfGraphicalSubsPresent": "Skip if the video already contains embedded subtitles", - "LabelSkipIfGraphicalSubsPresentHelp": "Keeping text versions of subtitles will result in more efficient delivery and decrease the likelihood of video transcoding.", - "TabSubtitles": "Subtitles", - "TabChapters": "Chapters", - "LabelOpenSubtitlesUsername": "Open Subtitles username:", - "LabelOpenSubtitlesPassword": "Open Subtitles password:", - "LabelPlayDefaultAudioTrack": "Play default audio track regardless of language", - "LabelSubtitlePlaybackMode": "Subtitle mode:", - "LabelDownloadLanguages": "Download languages:", - "ButtonRegister": "Register", - "LabelSkipIfAudioTrackPresent": "Skip if the default audio track matches the download language", - "LabelSkipIfAudioTrackPresentHelp": "Uncheck this to ensure all videos have subtitles, regardless of audio language.", - "HeaderSendMessage": "Send Message", - "ButtonSend": "Send", - "LabelMessageText": "Message text:", + "LabelSonyAggregationFlagsHelp": "Odre\u0111uje sadr\u017eaj aggregationFlags elementa u urn:schemas-sonycom:av namespace.", + "LabelTranscodingContainer": "Spremnik:", + "LabelTranscodingVideoCodec": "Video koder:", + "LabelTranscodingAudioCodec": "Audio koder:", + "OptionEnableM2tsMode": "Omogu\u0107i M2ts na\u010din", + "OptionEnableM2tsModeHelp": "Omogu\u0107i M2ts na\u010din kada se kodira u mpegts.", + "OptionEstimateContentLength": "Procjena duljine sadr\u017eaja kada se konvertira", + "OptionReportByteRangeSeekingWhenTranscoding": "Izvje\u0161\u0107e da li poslu\u017eitelj podr\u017eava bajt tra\u017eenja kada se konvertira", + "OptionReportByteRangeSeekingWhenTranscodingHelp": "To je potrebno za neke ure\u0111aje koji ne mogu dobro koristiti pretra\u017eivanje vremena.", + "HeaderDownloadSubtitlesFor": "Preuzmi titlove prijevoda za:", + "LabelSkipIfGraphicalSubsPresent": "Presko\u010di ako video ve\u0107 sadr\u017ei ugra\u0111ene titlove prijevoda", + "LabelSkipIfGraphicalSubsPresentHelp": "Zadr\u017eavanjem tekstualne verzije titlova prijevoda rezultirati \u0107e u\u010dinkovitijoj isporuci i smanjiti vjerojatnost video konvertiranja.", + "TabSubtitles": "Titlovi", + "TabChapters": "Poglavlja", + "LabelOpenSubtitlesUsername": "Korisni\u010dko ime \"Open Subtitles\":", + "LabelOpenSubtitlesPassword": "Lozinka \"Open Subtitles\":", + "LabelPlayDefaultAudioTrack": "Pokreni zadani audio zapis, bez obzira na jezik", + "LabelSubtitlePlaybackMode": "Na\u010din titlova prijevoda", + "LabelDownloadLanguages": "Jezici za preuzimanje:", + "ButtonRegister": "Registracija", + "LabelSkipIfAudioTrackPresent": "Presko\u010di ako zadani audio zapis odgovara jeziku preuzimanja", + "LabelSkipIfAudioTrackPresentHelp": "Poni\u0161tite ovo da bi osigurali da svi videi imaju titlove, bez obzira na audio jezik.", + "HeaderSendMessage": "Po\u0161alji poruku", + "ButtonSend": "Po\u0161alji", + "LabelMessageText": "Tekst poruke:", "LabelMessageTitle": "Naslov poruke:", - "MessageNoAvailablePlugins": "No available plugins.", - "LabelDisplayPluginsFor": "Display plugins for:", - "PluginTabAppClassic": "Emby Classic", - "PluginTabAppTheater": "Emby Theater", - "LabelEpisodeNamePlain": "Episode name", - "LabelSeriesNamePlain": "Series name", - "ValueSeriesNamePeriod": "Series.name", - "ValueSeriesNameUnderscore": "Series_name", - "ValueEpisodeNamePeriod": "Episode.name", - "ValueEpisodeNameUnderscore": "Episode_name", - "LabelSeasonNumberPlain": "Season number", - "LabelEpisodeNumberPlain": "Episode number", - "LabelEndingEpisodeNumberPlain": "Ending episode number", - "HeaderTypeText": "Enter Text", - "LabelTypeText": "Text", - "HeaderSearchForSubtitles": "Search for Subtitles", - "MessageNoSubtitleSearchResultsFound": "No search results founds.", - "TabDisplay": "Display", - "TabLanguages": "Languages", - "TabAppSettings": "App Settings", - "LabelEnableThemeSongs": "Enable theme songs", - "LabelEnableBackdrops": "Enable backdrops", - "LabelEnableThemeSongsHelp": "If enabled, theme songs will be played in the background while browsing the library.", - "LabelEnableBackdropsHelp": "If enabled, backdrops will be displayed in the background of some pages while browsing the library.", - "HeaderHomePage": "Home Page", - "HeaderSettingsForThisDevice": "Settings for This Device", - "OptionAuto": "Auto", - "OptionYes": "Yes", - "OptionNo": "No", - "HeaderOptions": "Options", - "LabelHomePageSection1": "Home page section 1:", - "LabelHomePageSection2": "Home page section 2:", - "LabelHomePageSection3": "Home page section 3:", - "LabelHomePageSection4": "Home page section 4:", + "MessageNoAvailablePlugins": "Nema odgovaraju\u0107ih dodataka.", + "LabelDisplayPluginsFor": "Prika\u017ei dodatak za:", + "PluginTabAppClassic": "Klasi\u010dni Emby", + "PluginTabAppTheater": "Emby kazali\u0161te", + "LabelEpisodeNamePlain": "Ime epizode", + "LabelSeriesNamePlain": "Ime serije", + "ValueSeriesNamePeriod": "serija.ime", + "ValueSeriesNameUnderscore": "serija_ime", + "ValueEpisodeNamePeriod": "epizoda.ime", + "ValueEpisodeNameUnderscore": "epizoda_ime", + "LabelSeasonNumberPlain": "Broj sezone", + "LabelEpisodeNumberPlain": "Broj epizode", + "LabelEndingEpisodeNumberPlain": "Broj kraja epizode", + "HeaderTypeText": "Unesite tekst", + "LabelTypeText": "Tekst", + "HeaderSearchForSubtitles": "Tra\u017ei titlove prijevoda", + "MessageNoSubtitleSearchResultsFound": "Nije ni\u0161ta prona\u0111eno.", + "TabDisplay": "Prikaz", + "TabLanguages": "Jezici", + "TabAppSettings": "Postavke aplikacije", + "LabelEnableThemeSongs": "Omogu\u0107i pjesme tema", + "LabelEnableBackdrops": "Omogu\u0107i pozadinu", + "LabelEnableThemeSongsHelp": "Ako je omogu\u0107eno, pjesma teme igrati \u0107e u pozadini tijekom pregledavanja biblioteke.", + "LabelEnableBackdropsHelp": "Ako je omogu\u0107eno, oslikane pozadine \u0107e biti prikazane u pozadini nekih stranica tijekom pregledavanja biblioteke.", + "HeaderHomePage": "Po\u010detna stranica", + "HeaderSettingsForThisDevice": "Postavke za ovaj ure\u0111aj", + "OptionAuto": "Automatski", + "OptionYes": "Da", + "OptionNo": "Ne", + "HeaderOptions": "Opcije", + "LabelHomePageSection1": "Odjeljak 1 po\u010detne stranice:", + "LabelHomePageSection2": "Odjeljak 2 po\u010detne stranice:", + "LabelHomePageSection3": "Odjeljak 3 po\u010detne stranice:", + "LabelHomePageSection4": "Odjeljak 4 po\u010detne stranice:", "OptionMyMediaButtons": "Moji mediji (gumbi\u0107i)", "OptionMyMedia": "Moji mediji", "OptionMyMediaSmall": "Moji mediji (malo)", - "OptionResumablemedia": "Resume", - "OptionLatestMedia": "Latest media", - "OptionLatestChannelMedia": "Latest channel items", - "HeaderLatestChannelItems": "Latest Channel Items", - "OptionNone": "None", - "HeaderLiveTv": "Live TV", - "HeaderReports": "Reports", - "HeaderSettings": "Settings", - "OptionDefaultSort": "Default", - "OptionCommunityMostWatchedSort": "Most Watched", + "OptionResumablemedia": "Nastavi", + "OptionLatestMedia": "Najnoviji mediji", + "OptionLatestChannelMedia": "Najnoviji kanali", + "HeaderLatestChannelItems": "Najnoviji kanali", + "OptionNone": "Ni\u0161ta", + "HeaderLiveTv": "TV u\u017eivo", + "HeaderReports": "Izvje\u0161taji", + "HeaderSettings": "Postavke", + "OptionDefaultSort": "Zadano", + "OptionCommunityMostWatchedSort": "Najgledaniji", "TabNextUp": "Sljede\u0107e je", - "PlaceholderUsername": "Username", - "HeaderBecomeProjectSupporter": "Get Emby Premiere", - "MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.", - "MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, Albums, Books and Games. Click the + button to start creating Collections.", - "MessageNoPlaylistsAvailable": "Playlists allow you to create lists of content to play consecutively at a time. To add items to playlists, right click or tap and hold, then select Add to Playlist.", - "MessageNoPlaylistItemsAvailable": "This playlist is currently empty.", - "ButtonDismiss": "Dismiss", - "ButtonEditOtherUserPreferences": "Edit this user's profile, image and personal preferences.", - "LabelChannelStreamQuality": "Preferred internet channel quality:", - "LabelChannelStreamQualityHelp": "In a low bandwidth environment, limiting quality can help ensure a smooth streaming experience.", - "OptionBestAvailableStreamQuality": "Best available", - "ChannelSettingsFormHelp": "Install channels such as Trailers and Vimeo in the plugin catalog.", + "PlaceholderUsername": "Korisni\u010dko ime:", + "HeaderBecomeProjectSupporter": "Nabavite Emby Premijeru", + "MessageNoMovieSuggestionsAvailable": "Filmski prijedlozi nisu trenutno dostupni. Po\u010dnite s gledanjem i ocjenjivanjem svoje filmove, a zatim se vratite da biste vidjeli svoje preporuke.", + "MessageNoCollectionsAvailable": "Zbirke vam omogu\u0107iti da u\u017eivate u personaliziranim grupama filmova, serija, albuma, knjiga i igra. Kliknite gumb + za po\u010detak stvaranja zbirke.", + "MessageNoPlaylistsAvailable": "Popisi vam omogu\u0107iti da napravite popis sadr\u017eaja koji igra uzastopno u isto vrijeme. Za dodavanje stavki na popisima za reprodukciju kliknite desni gumb mi\u0161a ili dodirnite i dr\u017eite, a zatim odaberite dodaj na popis za reprodukciju.", + "MessageNoPlaylistItemsAvailable": "Ovaj popis za reprodukciju je prazan.", + "ButtonDismiss": "Odbaci", + "ButtonEditOtherUserPreferences": "Uredite ovaj korisni\u010dki profil, slike i osobne postavke.", + "LabelChannelStreamQuality": "\u017deljena kvaliteta internet kanala:", + "LabelChannelStreamQualityHelp": "U okru\u017eenju slabe propusnosti, ograni\u010davanje kvalitete mo\u017ee osigurati iskustvo glatkog strujanja.", + "OptionBestAvailableStreamQuality": "Najbolje dostupno", + "ChannelSettingsFormHelp": "Instalacija kanala kao \u0161to su kratki filmovi i Vimeo u katalog dodataka.", "ViewTypePlaylists": "Playlists", "ViewTypeMovies": "Movies", "ViewTypeTvShows": "TV", @@ -843,832 +843,831 @@ "ViewTypeLiveTV": "Live TV", "ViewTypeLiveTvNowPlaying": "Now Airing", "ViewTypeLatestGames": "Latest Games", - "ViewTypeRecentlyPlayedGames": "Recently Played", + "ViewTypeRecentlyPlayedGames": "Zadnje izvo\u0111eno", "ViewTypeGameFavorites": "Omiljeni", - "ViewTypeGameSystems": "Game Systems", - "ViewTypeGameGenres": "Genres", - "ViewTypeTvResume": "Resume", + "ViewTypeGameSystems": "Sustav igra", + "ViewTypeGameGenres": "\u017danrovi", + "ViewTypeTvResume": "Nastavi", "ViewTypeTvNextUp": "Sljede\u0107e je", - "ViewTypeTvLatest": "Latest", - "ViewTypeTvShowSeries": "Series", - "ViewTypeTvGenres": "Genres", + "ViewTypeTvLatest": "Najnovije", + "ViewTypeTvShowSeries": "Serije", + "ViewTypeTvGenres": "\u017danrovi", "ViewTypeTvFavoriteSeries": "Omiljene serije", - "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", - "ViewTypeMovieResume": "Resume", - "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", + "ViewTypeTvFavoriteEpisodes": "Omiljene epizode", + "ViewTypeMovieResume": "Nastavi", + "ViewTypeMovieLatest": "Najnovije", + "ViewTypeMovieMovies": "Filmovi", "ViewTypeMovieCollections": "Kolekcije", "ViewTypeMovieFavorites": "Omiljeni", - "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", - "ViewTypeMusicPlaylists": "Playlists", - "ViewTypeMusicAlbums": "Albums", - "ViewTypeMusicAlbumArtists": "Album Artists", - "HeaderOtherDisplaySettings": "Display Settings", - "ViewTypeMusicSongs": "Songs", + "ViewTypeMovieGenres": "\u017danrovi", + "ViewTypeMusicLatest": "Najnovije", + "ViewTypeMusicPlaylists": "Popisi", + "ViewTypeMusicAlbums": "Albumi", + "ViewTypeMusicAlbumArtists": "Izvo\u0111a\u010di albuma", + "HeaderOtherDisplaySettings": "Postavke prikaza", + "ViewTypeMusicSongs": "Pjesme", "ViewTypeMusicFavorites": "Omiljeni", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", + "ViewTypeMusicFavoriteAlbums": "Omiljeni albumi", + "ViewTypeMusicFavoriteArtists": "Omiljeni izvo\u0111a\u010di", "ViewTypeMusicFavoriteSongs": "Omiljene pjesme", - "HeaderMyViews": "My Views", - "LabelSelectFolderGroups": "Automatically group content from the following folders into views such as Movies, Music and TV:", - "LabelSelectFolderGroupsHelp": "Folders that are unchecked will be displayed by themselves in their own view.", - "OptionDisplayAdultContent": "Display adult content", - "OptionLibraryFolders": "Media folders", - "TitleRemoteControl": "Remote Control", - "OptionLatestTvRecordings": "Latest recordings", - "LabelProtocolInfo": "Protocol info:", - "LabelProtocolInfoHelp": "The value that will be used when responding to GetProtocolInfo requests from the device.", - "TabNfoSettings": "Nfo Settings", - "HeaderKodiMetadataHelp": "Emby includes native support for Nfo metadata files. To enable or disable Nfo metadata, use the Services tab to configure options for your media types.", - "LabelKodiMetadataUser": "Sync user watch data to nfo's for:", - "LabelKodiMetadataUserHelp": "Enable this to keep watch data in sync between Emby Server and Nfo files.", - "LabelKodiMetadataDateFormat": "Release date format:", - "LabelKodiMetadataDateFormatHelp": "All dates within nfo's will be read and written to using this format.", - "LabelKodiMetadataSaveImagePaths": "Save image paths within nfo files", - "LabelKodiMetadataSaveImagePathsHelp": "This is recommended if you have image file names that don't conform to Kodi guidelines.", - "LabelKodiMetadataEnablePathSubstitution": "Enable path substitution", - "LabelKodiMetadataEnablePathSubstitutionHelp": "Enables path substitution of image paths using the server's path substitution settings.", - "LabelKodiMetadataEnablePathSubstitutionHelp2": "See path substitution.", - "OptionDisplayChannelsInline": "Display channels as media folders", - "OptionDisplayChannelsInlineHelp": "If enabled, channels will be displayed directly alongside other media libraries. If disabled, they'll be displayed within a separate Channels folder.", - "LabelDisplayCollectionsView": "Display a collections view to show movie collections", - "LabelDisplayCollectionsViewHelp": "This will create a separate view to display movie collections. To create a collection, right-click or tap-hold any movie and select 'Add to Collection'. ", - "LabelKodiMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs", - "LabelKodiMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Kodi skin compatibility.", - "TabServices": "Services", - "TabLogs": "Logs", - "HeaderServerLogFiles": "Server log files:", - "TabBranding": "Branding", - "HeaderBrandingHelp": "Customize the appearance of Emby to fit the needs of your group or organization.", - "LabelLoginDisclaimer": "Login disclaimer:", - "LabelLoginDisclaimerHelp": "This will be displayed at the bottom of the login page.", - "OptionList": "List", - "TabDashboard": "Dashboard", + "HeaderMyViews": "Moji pogledi", + "LabelSelectFolderGroups": "Automatski grupiraj sadr\u017eaj od sljede\u0107ih mapa u poglede kao \u0161to su filmovi, glazba i TV:", + "LabelSelectFolderGroupsHelp": "Mape koje nisu ozna\u010dene biti \u0107e prikazane za sebe u vlastitom pogledu.", + "OptionDisplayAdultContent": "Prikaz sadr\u017eaja za odrasle", + "OptionLibraryFolders": "Mape medija", + "TitleRemoteControl": "Daljinsko upravljanje", + "OptionLatestTvRecordings": "Zadnje snimke", + "LabelProtocolInfo": "Protokol informacija:", + "LabelProtocolInfoHelp": "Vrijednost koja \u0107e se koristiti kada se reagira na GetProtocolInfo zahtjeve iz ure\u0111aja.", + "TabNfoSettings": "Nfo postavke", + "HeaderKodiMetadataHelp": "Emby uklju\u010duje prirodnu podr\u0161ku za Nfo meta-podatke datoteka. Da biste omogu\u0107ili ili onemogu\u0107ili Nfo meta-podatke koristite karticu usluge da bi podesili opcije za vrste medija.", + "LabelKodiMetadataUser": "Sinkronizacija korisni\u010dkih podataka gledanja na Nfo za:", + "LabelKodiMetadataUserHelp": "Omogu\u0107ite ovo da bi zadr\u017eali podatke gledanja u sinkronizaciji izme\u0111u Emby Servera i Nfo datoteka.", + "LabelKodiMetadataDateFormat": "Format datuma izdanja:", + "LabelKodiMetadataDateFormatHelp": "Svi datumi unutar NFO-a biti \u0107e \u010ditani i pisani koriste\u0107i ovaj format.", + "LabelKodiMetadataSaveImagePaths": "Spremanje staze slika unutar NFO datoteka", + "LabelKodiMetadataSaveImagePathsHelp": "Preporu\u010da se ako imate nazive datoteka slika koje ne udovoljavaju Kodi smjernicama.", + "LabelKodiMetadataEnablePathSubstitution": "Omogu\u010di zamjensku putanju", + "LabelKodiMetadataEnablePathSubstitutionHelp": "Omogu\u0107uje zamjensku putanju putanje slika koriste\u0107i serverskih postavka zamjenske putanje.", + "LabelKodiMetadataEnablePathSubstitutionHelp2": "Vidi zamjenske putanje.", + "OptionDisplayChannelsInline": "Prika\u017ei kanale kao medijske mape", + "OptionDisplayChannelsInlineHelp": "Ako je omogu\u0107eno, kanali \u0107e biti prikazan neposredno uz druge medijske biblioteke. Ako je onemogu\u0107eno oni \u0107e biti prikazani u zasebnu mapu kanala.", + "LabelDisplayCollectionsView": "Kako biste pokazali kolekcije filmova prika\u017ei pregled kolekcija", + "LabelDisplayCollectionsViewHelp": "Stvoriti \u0107e se poseban pogled na zaslon kolekcije filmova. Da biste stvorili kolekciju, desni klik ili pritisnite i zadr\u017eite bilo koji film i odaberite \"Dodaj u kolkeciju\". ", + "LabelKodiMetadataEnableExtraThumbs": "Kopiraj ekstra fanart u ekstra sli\u010dicu", + "LabelKodiMetadataEnableExtraThumbsHelp": "Prilikom preuzimanja slike mogu biti spremljene u oba ekstra fanart i pomo\u0107nim sli\u010dicama za maksimalnu kompatibilnosti Kodi korisni\u010dkog su\u010delja.", + "TabServices": "Servisi", + "TabLogs": "Dnevnici", + "HeaderServerLogFiles": "Datoteke serverskih dnevnika:", + "TabBranding": "Brendiranje", + "HeaderBrandingHelp": "Prilagodite izgled Emby da odgovara potrebama va\u0161e grupe ili organizacije.", + "LabelLoginDisclaimer": "Prijava odricanja:", + "LabelLoginDisclaimerHelp": "Prikazano \u0107e biti na dnu stranice za prijavu.", + "OptionList": "Popis", + "TabDashboard": "Nadzorna plo\u010da", "TitleServer": "Server", - "LabelCache": "Cache:", - "LabelLogs": "Logs:", - "LabelMetadata": "Metadata:", - "LabelTranscodingTemporaryFiles": "Transcoding temporary files:", - "HeaderLatestMusic": "Latest Music", - "HeaderBranding": "Branding", - "HeaderApiKeys": "Api Keys", - "HeaderApiKeysHelp": "External applications are required to have an Api key in order to communicate with Emby Server. Keys are issued by logging in with an Emby account, or by manually granting the application a key.", - "HeaderApiKey": "Api Key", - "HeaderApp": "App", - "HeaderDevice": "Device", - "HeaderUser": "User", - "HeaderDateIssued": "Date Issued", - "LabelChapterName": "Chapter {0}", - "HeaderHttpHeaders": "Http Headers", - "HeaderIdentificationHeader": "Identification Header", - "LabelValue": "Value:", - "LabelMatchType": "Match type:", - "OptionEquals": "Equals", + "LabelCache": "Predmemorija:", + "LabelLogs": "Dnevnici:", + "LabelMetadata": "Meta-podaci:", + "LabelTranscodingTemporaryFiles": "Privremene datoteke konvertiranja:", + "HeaderLatestMusic": "Najnovija glazba", + "HeaderBranding": "Brendiranje", + "HeaderApiKeys": "API klju\u010devi", + "HeaderApiKeysHelp": "Vanjske aplikacije moraju imati API klju\u010d kako bi komunicirale s Emby Serverom. Klju\u010devi se izdaju prijavom s Emby ra\u010dunom ili ru\u010dnim odobravanjem zahtjeva klju\u010da.", + "HeaderApiKey": "API klju\u010d", + "HeaderApp": "Aplikacija", + "HeaderDevice": "Ure\u0111aj", + "HeaderUser": "Korisnik", + "HeaderDateIssued": "Datum izdavanja", + "LabelChapterName": "Poglavlje {0}", + "HeaderHttpHeaders": "Http zaglavlja", + "HeaderIdentificationHeader": "Identifikacija zaglavlja", + "LabelValue": "Vrijednost:", + "LabelMatchType": "Vrsta podudaranja:", + "OptionEquals": "Jednako", "OptionRegex": "Regex", - "OptionSubstring": "Substring", - "TabView": "View", - "TabSort": "Sort", + "OptionSubstring": "Podniz", + "TabView": "Pogled", + "TabSort": "Slo\u017ei", "TabFilter": "Filter", - "ButtonView": "View", - "LabelPageSize": "Item limit:", - "LabelPath": "Path:", - "LabelView": "View:", - "TabUsers": "Users", - "HeaderFeatures": "Features", - "HeaderAdvanced": "Advanced", - "ButtonSync": "Sync", - "TabScheduledTasks": "Scheduled Tasks", - "HeaderChapters": "Chapters", - "HeaderResumeSettings": "Resume Settings", - "TabSync": "Sync", - "TitleUsers": "Users", - "LabelProtocol": "Protocol:", + "ButtonView": "Pogled", + "LabelPageSize": "Ograni\u010denje stavke:", + "LabelPath": "Putanja:", + "LabelView": "Pogled:", + "TabUsers": "Korisnici", + "HeaderFeatures": "Mogu\u0107nosti", + "HeaderAdvanced": "Napredno", + "ButtonSync": "Sink.", + "TabScheduledTasks": "Zakazani zadaci", + "HeaderChapters": "Poglavlja", + "HeaderResumeSettings": "Postavke nastavka", + "TabSync": "Sink.", + "TitleUsers": "Korisnici", + "LabelProtocol": "Protokol:", "OptionProtocolHttp": "Http", - "OptionProtocolHls": "Http Live Streaming", - "LabelContext": "Context:", - "OptionContextStreaming": "Streaming", - "OptionContextStatic": "Sync", - "TabPlaylists": "Playlists", - "ButtonClose": "Close", - "LabelAllLanguages": "All languages", - "HeaderBrowseOnlineImages": "Browse Online Images", - "LabelSource": "Source:", - "OptionAll": "All", - "LabelImage": "Image:", - "HeaderImages": "Images", - "HeaderBackdrops": "Backdrops", - "HeaderScreenshots": "Screenshots", - "HeaderAddUpdateImage": "Add\/Update Image", + "OptionProtocolHls": "Http strujanje u\u017eivo", + "LabelContext": "Kontekst:", + "OptionContextStreaming": "Strujanje", + "OptionContextStatic": "Sink.", + "TabPlaylists": "Popisi", + "ButtonClose": "Zatvori", + "LabelAllLanguages": "Svi jezici", + "HeaderBrowseOnlineImages": "Pregledaj online slike", + "LabelSource": "Izvor:", + "OptionAll": "Sve", + "LabelImage": "Slika:", + "HeaderImages": "Slike", + "HeaderBackdrops": "Pozadine", + "HeaderScreenshots": "Isje\u010dci slika", + "HeaderAddUpdateImage": "Dodaj\/a\u017euriraj sliku", "LabelDropImageHere": "Ubaci sliku ovdje", - "LabelJpgPngOnly": "JPG\/PNG only", - "LabelImageType": "Image type:", - "OptionPrimary": "Primary", - "OptionArt": "Art", - "OptionBox": "Box", - "OptionBoxRear": "Box rear", - "OptionDisc": "Disc", - "OptionIcon": "Icon", + "LabelJpgPngOnly": "Samo JPG\/PNG", + "LabelImageType": "Tip slike:", + "OptionPrimary": "Primarno", + "OptionArt": "Umjetnost", + "OptionBox": "Kutija", + "OptionBoxRear": "Pole\u0111ina kutije", + "OptionDisc": "Disk", + "OptionIcon": "Ikona", "OptionLogo": "Logo", - "OptionMenu": "Menu", - "OptionScreenshot": "Screenshot", - "OptionLocked": "Locked", - "OptionUnidentified": "Unidentified", - "OptionMissingParentalRating": "Missing parental rating", + "OptionMenu": "Izbornik", + "OptionScreenshot": "Sli\u010dica zaslona", + "OptionLocked": "Zaklju\u010dano", + "OptionUnidentified": "Neidentificiran", + "OptionMissingParentalRating": "Nedostaje roditeljska ocjena", "OptionStub": "Stub", - "OptionSeason0": "Season 0", - "LabelReport": "Report:", - "OptionReportSongs": "Songs", - "OptionReportSeries": "Series", - "OptionReportSeasons": "Seasons", + "OptionSeason0": "Sezona 0", + "LabelReport": "Izvje\u0161taj:", + "OptionReportSongs": "Pjesme", + "OptionReportSeries": "Serije", + "OptionReportSeasons": "Sezone", "OptionReportTrailers": "Kratki filmovi", - "OptionReportMusicVideos": "Music videos", - "OptionReportMovies": "Movies", - "OptionReportHomeVideos": "Home videos", - "OptionReportGames": "Games", - "OptionReportEpisodes": "Episodes", + "OptionReportMusicVideos": "Glazbeni videi", + "OptionReportMovies": "Filmovi", + "OptionReportHomeVideos": "Ku\u0107ni videi", + "OptionReportGames": "Igre", + "OptionReportEpisodes": "Epizode", "OptionReportCollections": "Kolekcije", - "OptionReportBooks": "Books", - "OptionReportArtists": "Artists", - "OptionReportAlbums": "Albums", - "ButtonMore": "More", - "HeaderActivity": "Activity", - "ScheduledTaskStartedWithName": "{0} started", - "ScheduledTaskCancelledWithName": "{0} was cancelled", - "ScheduledTaskCompletedWithName": "{0} completed", - "ScheduledTaskFailed": "Scheduled task completed", - "PluginInstalledWithName": "{0} was installed", - "PluginUpdatedWithName": "{0} was updated", - "PluginUninstalledWithName": "{0} was uninstalled", - "ScheduledTaskFailedWithName": "{0} failed", - "DeviceOnlineWithName": "{0} is connected", - "UserOnlineFromDevice": "{0} is online from {1}", - "DeviceOfflineWithName": "{0} has disconnected", - "UserOfflineFromDevice": "{0} has disconnected from {1}", - "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", - "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", - "LabelRunningTimeValue": "Running time: {0}", - "LabelIpAddressValue": "Ip address: {0}", - "UserLockedOutWithName": "User {0} has been locked out", - "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", - "UserCreatedWithName": "User {0} has been created", - "UserPasswordChangedWithName": "Password has been changed for user {0}", - "UserDeletedWithName": "User {0} has been deleted", - "MessageServerConfigurationUpdated": "Server configuration has been updated", - "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", - "MessageApplicationUpdated": "Emby Server has been updated", - "UserDownloadingItemWithValues": "{0} is downloading {1}", - "UserStartedPlayingItemWithValues": "{0} has started playing {1}", - "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", - "AppDeviceValues": "App: {0}, Device: {1}", + "OptionReportBooks": "Knjige", + "OptionReportArtists": "Izvo\u0111a\u010di", + "OptionReportAlbums": "Albumi", + "ButtonMore": "Vi\u0161e", + "HeaderActivity": "Aktivnosti", + "ScheduledTaskStartedWithName": "{0} pokrenuto", + "ScheduledTaskCancelledWithName": "{0} je otkazan", + "ScheduledTaskCompletedWithName": "{0} zavr\u0161en", + "ScheduledTaskFailed": "Zakazan zadatak je zavr\u0161en", + "PluginInstalledWithName": "{0} je instalirano", + "PluginUpdatedWithName": "{0} je a\u017eurirano", + "PluginUninstalledWithName": "{0} je deinstalirano", + "ScheduledTaskFailedWithName": "{0} neuspjelo", + "DeviceOnlineWithName": "{0} je spojeno", + "UserOnlineFromDevice": "{0} je online od {1}", + "DeviceOfflineWithName": "{0} se odspojilo", + "UserOfflineFromDevice": "{0} se odspojilo od {1}", + "SubtitlesDownloadedForItem": "Titlovi prijevoda preuzeti za {0}", + "SubtitleDownloadFailureForItem": "Titlovi prijevoda nisu preuzeti za {0}", + "LabelRunningTimeValue": "Vrijeme rada: {0}", + "LabelIpAddressValue": "Ip adresa: {0}", + "UserLockedOutWithName": "Korisnik {0} je zaklju\u010dan", + "UserConfigurationUpdatedWithName": "Postavke korisnika su a\u017eurirane za {0}", + "UserCreatedWithName": "Korisnik {0} je stvoren", + "UserPasswordChangedWithName": "Lozinka je promijenjena za korisnika {0}", + "UserDeletedWithName": "Korisnik {0} je obrisan", + "MessageServerConfigurationUpdated": "Postavke servera su a\u017eurirane", + "MessageNamedServerConfigurationUpdatedWithValue": "Odjeljak postavka servera {0} je a\u017euriran", + "MessageApplicationUpdated": "Emby Server je a\u017euriran", + "UserDownloadingItemWithValues": "{0} se preuzima {1}", + "UserStartedPlayingItemWithValues": "{0} se pokrenuo {1}", + "UserStoppedPlayingItemWithValues": "{0} se zaustavio {1}", + "AppDeviceValues": "Aplikacija: {0}, Ure\u0111aj: {1}", "ProviderValue": "Provider: {0}", - "HeaderRecentActivity": "Recent Activity", + "HeaderRecentActivity": "Nedavne aktivnosti", "HeaderPeople": "People", - "HeaderDownloadPeopleMetadataFor": "Download biography and images for:", - "OptionComposers": "Composers", - "OptionOthers": "Others", - "HeaderDownloadPeopleMetadataForHelp": "Enabling additional options will provide more on-screen information but will result in slower library scans.", + "HeaderDownloadPeopleMetadataFor": "Preuzmi biografiju i slike za:", + "OptionComposers": "Skladatelji", + "OptionOthers": "Ostali", + "HeaderDownloadPeopleMetadataForHelp": "Omogu\u0107avanje dodatnih opcija pru\u017eiti \u0107e vi\u0161e informacija na zaslonu, ali \u0107e rezultirati sporijim skeniranjem biblioteke.", "ViewTypeFolders": "Folders", - "OptionDisplayFolderView": "Display a folder view to show plain media folders", - "OptionDisplayFolderViewHelp": "If enabled, Emby apps will display a Folders category alongside your media library. This is useful if you'd like to have plain folder views.", + "OptionDisplayFolderView": "Prikaz pogleda mape za prikaz obi\u010dne medijske mape", + "OptionDisplayFolderViewHelp": "Ako je omogu\u0107eno, Emby aplikacija \u0107e prikazati kategoriju mape uz va\u0161u medijsku biblioteku. To je korisno ako \u017eelite imati obi\u010dan pogled mapa.", "ViewTypeLiveTvRecordingGroups": "Recordings", "ViewTypeLiveTvChannels": "Channels", - "LabelEasyPinCode": "Easy pin code:", - "EasyPasswordHelp": "Your easy pin code is used for offline access with supported Emby apps, and can also be used for easy in-network sign in.", - "LabelInNetworkSignInWithEasyPassword": "Enable in-network sign in with my easy pin code", - "LabelInNetworkSignInWithEasyPasswordHelp": "If enabled, you'll be able to use your easy pin code to sign in to Emby apps from inside your home network. Your regular password will only be needed away from home. If the pin code is left blank, you won't need a password within your home network.", - "HeaderPassword": "Password", - "HeaderViewOrder": "View Order", - "ButtonResetEasyPassword": "Reset easy pin code", - "LabelSelectUserViewOrder": "Choose the order your views will be displayed in within Emby apps", - "HeaderPersonInfo": "Person Info", - "HeaderConfirmDeletion": "Confirm Deletion", - "LabelAlbumArtist": "Album artist:", - "LabelAlbumArtists": "Album artists:", + "LabelEasyPinCode": "Lagan PIN kod:", + "EasyPasswordHelp": "Va\u0161 laki PIN kod se koristi za izvan-mre\u017eni pristup s podr\u017eanim Emby aplikacijama, a tako\u0111er se mo\u017ee koristiti za jednostavnu mre\u017enu prijavu.", + "LabelInNetworkSignInWithEasyPassword": "Omogu\u0107i mre\u017enu prijavu sa jednostavnim PIN kodom", + "LabelInNetworkSignInWithEasyPasswordHelp": "Ako je omogu\u0107eno, biti \u0107ete u mogu\u0107nosti koristiti svoj jednostavan PIN broj za prijavu u Emby aplikacije iz unutra\u0161njosti na ku\u0107nu mre\u017eu. Va\u0161a regularna lozinka \u0107e biti samo potrebna od ku\u0107e. Ako je PIN kod ostavljen prazan, ne\u0107e vam trebati lozinka unutar ku\u0107ne mre\u017ee.", + "HeaderPassword": "Lozinka", + "HeaderViewOrder": "Poredak pogleda", + "ButtonResetEasyPassword": "Poni\u0161ti jednostavan PIN kod", + "LabelSelectUserViewOrder": "Odaberite redoslijed va\u0161ih pogleda kako \u0107e biti prikazani u sklopu Emby aplikacija", + "HeaderPersonInfo": "Informacije osobe", + "HeaderConfirmDeletion": "Potvrdite brisanje", + "LabelAlbumArtist": "Izvo\u0111a\u010d albuma:", + "LabelAlbumArtists": "Izvo\u0111a\u010di albuma:", "LabelAlbum": "Album:", - "LabelCommunityRating": "Community rating:", - "LabelAwardSummary": "Award summary:", - "LabelReleaseDate": "Release date:", - "LabelEndDate": "End date:", - "LabelAirDate": "Air days:", - "LabelAirTime:": "Air time:", - "LabelRuntimeMinutes": "Run time (minutes):", - "LabelRevenue": "Revenue ($):", - "HeaderAlternateEpisodeNumbers": "Alternate Episode Numbers", - "HeaderSpecialEpisodeInfo": "Special Episode Info", - "HeaderExternalIds": "External Id's:", - "LabelAirsBeforeSeason": "Airs before season:", - "LabelAirsAfterSeason": "Airs after season:", - "LabelAirsBeforeEpisode": "Airs before episode:", - "LabelDisplaySpecialsWithinSeasons": "Display specials within seasons they aired in", + "LabelCommunityRating": "Ocjene zajednice", + "LabelAwardSummary": "Sa\u017eetak nagrada:", + "LabelReleaseDate": "Datum izdavanja:", + "LabelEndDate": "Datum zavr\u0161etka:", + "LabelAirDate": "Dani emitiranja:", + "LabelAirTime:": "Vrijeme emitiranja:", + "LabelRuntimeMinutes": "Vrijeme izvo\u0111enja (minuta):", + "LabelRevenue": "Prihod ($):", + "HeaderAlternateEpisodeNumbers": "Alternativni brojevi epizoda", + "HeaderSpecialEpisodeInfo": "Posebni podaci o epizodi", + "HeaderExternalIds": "Vanjski id-ovi:", + "LabelAirsBeforeSeason": "Emitiranje prije sezone:", + "LabelAirsAfterSeason": "Emitiranje nakon sezona:", + "LabelAirsBeforeEpisode": "Emitiranje prije epizoda:", + "LabelDisplaySpecialsWithinSeasons": "Prikaz specijalnih dodataka unutar sezona u kojima su emitirani", "HeaderCountries": "Countries", "HeaderGenres": "Genres", - "HeaderPlotKeywords": "Plot Keywords", + "HeaderPlotKeywords": "Klju\u010dne rije\u010di", "HeaderStudios": "Studios", - "HeaderTags": "Tags", - "MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item, or the global default value.", - "OptionNoTrailer": "No Trailer", - "ButtonPurchase": "Purchase", - "OptionActor": "Actor", - "OptionComposer": "Composer", - "OptionDirector": "Director", - "OptionProducer": "Producer", - "OptionWriter": "Writer", - "LabelAirDays": "Air days:", - "LabelAirTime": "Air time:", - "HeaderMediaInfo": "Media Info", - "HeaderPhotoInfo": "Photo Info", - "HeaderInstall": "Install", - "LabelSelectVersionToInstall": "Select version to install:", - "LinkLearnMoreAboutSubscription": "Learn about Emby Premiere", - "MessagePluginRequiresSubscription": "This plugin will require an active Emby Premiere subscription after the 14 day free trial.", - "MessagePremiumPluginRequiresMembership": "This plugin will require an active Emby Premiere subscription in order to purchase after the 14 day free trial.", - "HeaderReviews": "Reviews", - "HeaderDeveloperInfo": "Developer Info", - "HeaderRevisionHistory": "Revision History", - "ButtonViewWebsite": "View website", - "HeaderXmlSettings": "Xml Settings", - "HeaderXmlDocumentAttributes": "Xml Document Attributes", - "HeaderXmlDocumentAttribute": "Xml Document Attribute", - "XmlDocumentAttributeListHelp": "These attributes are applied to the root element of every xml response.", - "OptionSaveMetadataAsHidden": "Save metadata and images as hidden files", - "LabelExtractChaptersDuringLibraryScan": "Extract chapter images during the library scan", - "LabelExtractChaptersDuringLibraryScanHelp": "If enabled, chapter images will be extracted when videos are imported during the library scan. If disabled they will be extracted during the chapter images scheduled task, allowing the regular library scan to complete faster.", - "LabelConnectGuestUserName": "Their Emby username or email address:", - "LabelConnectUserName": "Emby username or email address:", - "LabelConnectUserNameHelp": "Connect this local user to an online Emby account to enable easy sign-in access from any Emby app without having to know the server ip address.", - "ButtonLearnMoreAboutEmbyConnect": "Learn more about Emby Connect", - "LabelExternalPlayers": "External players:", - "LabelExternalPlayersHelp": "Display buttons to play content in external players. This is only available on devices that support url schemes, generally Android and iOS. With external players there is generally no support for remote control or resuming.", - "LabelNativeExternalPlayersHelp": "Display buttons to play content in external players.", - "HeaderSubtitleProfile": "Subtitle Profile", - "HeaderSubtitleProfiles": "Subtitle Profiles", - "HeaderSubtitleProfilesHelp": "Subtitle profiles describe the subtitle formats supported by the device.", + "HeaderTags": "Oznake", + "MessageLeaveEmptyToInherit": "Ostavite prazno da naslijedi postavke od roditelja stavke ili globalnu zadanu vrijednost.", + "OptionNoTrailer": "Nema kratkog videa", + "ButtonPurchase": "Kupiti", + "OptionActor": "Glumac", + "OptionComposer": "Kompozitor", + "OptionDirector": "Re\u017eiser", + "OptionProducer": "Producent", + "OptionWriter": "Pisac", + "LabelAirDays": "Dani emitiranja:", + "LabelAirTime": "Vrijeme emitiranja:", + "HeaderMediaInfo": "Info medija:", + "HeaderPhotoInfo": "Info slike", + "HeaderInstall": "Instaliraj", + "LabelSelectVersionToInstall": "Odaberi verziju za instalaciju:", + "LinkLearnMoreAboutSubscription": "Nau\u010dite o Emby Premijeri", + "MessagePluginRequiresSubscription": "Ovaj dodatak zahtijeva aktivnu pretplatu Emby Premijere nakon 14 dana probnog razdoblja.", + "MessagePremiumPluginRequiresMembership": "Ovaj dodatak zahtijeva aktivnu pretplatu Emby Premijere za kupnju nakon 14 dana probnog razdoblja.", + "HeaderReviews": "Recenzije", + "HeaderDeveloperInfo": "Razvojne informacije", + "HeaderRevisionHistory": "Povijest revizije", + "ButtonViewWebsite": "Posjeti web stranice", + "HeaderXmlSettings": "Xml postavke", + "HeaderXmlDocumentAttributes": "Xml atributi dokumenta", + "HeaderXmlDocumentAttribute": "Xml atribut dokumenta", + "XmlDocumentAttributeListHelp": "Ovi atributi se primjenjuju na korijen elementa svakog xml odgovora.", + "OptionSaveMetadataAsHidden": "Spremite meta-podatke i slike kao skrivene datoteke", + "LabelExtractChaptersDuringLibraryScan": "Izvadi slike poglavlja dok traje skeniranje biblioteke", + "LabelExtractChaptersDuringLibraryScanHelp": "Ako je omogu\u0107eno, slike poglavlje \u0107e se izdvojiti kad se videozapisi uvezu tijekom skeniranja biblioteke. Ako je onemogu\u0107eno izdvojiti \u0107e se u rasporedu zadatka slika poglavlja, \u010dime se omogu\u0107uje da se skeniranje redovne biblioteke zavr\u0161iti br\u017ee.", + "LabelConnectGuestUserName": "Njihovo Emby korisni\u010dko ime ili e-mail adresa:", + "LabelConnectUserName": "Emby korisni\u010dko ime ili e-mail adresa:", + "LabelConnectUserNameHelp": "Spojite ovog lokalnog korisnika sa online Emby ra\u010dunom kako bi se omogu\u0107ila jednostavna prijava pristupa s bilo koje Emby aplikacije bez poznavanja IP adrese poslu\u017eitelja.", + "ButtonLearnMoreAboutEmbyConnect": "Nau\u010dite vi\u0161e o \"Emby Connect\"", + "LabelExternalPlayers": "Vanjski pokreta\u010di:", + "LabelExternalPlayersHelp": "Prika\u017ei tipke za reprodukciju sadr\u017eaja na vanjskim izvo\u0111a\u010dima. Ovo je dostupno samo na ure\u0111ajima koji podr\u017eavaju URL sheme, generalno Android i iOS. S vanjskim izvo\u0111a\u010dima op\u0107enito ne postoji podr\u0161ka za daljinsko upravljanje ili nastavak.", + "LabelNativeExternalPlayersHelp": "Prika\u017ei tipke za reprodukciju sadr\u017eaja na vanjskim izvo\u0111a\u010dima.", + "HeaderSubtitleProfile": "Profil titlova prijevoda", + "HeaderSubtitleProfiles": "Profili titlova prijevoda", + "HeaderSubtitleProfilesHelp": "Profili titlova prijevoda opisuju format titlova koji podr\u017eava ure\u0111aj.", "LabelFormat": "Format:", - "LabelMethod": "Method:", - "LabelDidlMode": "Didl mode:", + "LabelMethod": "Na\u010din:", + "LabelDidlMode": "Didl na\u010din:", "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", "OptionResElement": "res element", - "OptionEmbedSubtitles": "Embed within container", - "OptionExternallyDownloaded": "External download", - "OptionHlsSegmentedSubtitles": "Hls segmented subtitles", - "LabelSubtitleFormatHelp": "Example: srt", - "ButtonLearnMore": "Learn more", - "TabPlayback": "Playback", - "HeaderAudioSettings": "Audio Settings", - "HeaderSubtitleSettings": "Subtitle Settings", - "TabCinemaMode": "Cinema Mode", - "TitlePlayback": "Playback", - "LabelEnableCinemaModeFor": "Enable cinema mode for:", - "CinemaModeConfigurationHelp": "Cinema mode brings the theater experience straight to your living room with the ability to play trailers and custom intros before the main feature.", - "OptionTrailersFromMyMovies": "Include trailers from movies in my library", - "OptionUpcomingMoviesInTheaters": "Include trailers from new and upcoming movies", - "LabelLimitIntrosToUnwatchedContent": "Only play trailers from unwatched content", - "LabelEnableIntroParentalControl": "Enable smart parental control", - "LabelEnableIntroParentalControlHelp": "Trailers will only be selected with a parental rating equal to or less than the content being watched.", - "LabelTheseFeaturesRequireSubscriptionHelpAndTrailers": "These features require an active Emby Premiere subscription and installation of the Trailer channel plugin.", - "OptionTrailersFromMyMoviesHelp": "Requires setup of local trailers.", - "LabelCustomIntrosPath": "Custom intros path:", - "LabelCustomIntrosPathHelp": "A folder containing video files. A video will be randomly selected and played after trailers.", - "LabelSelectInternetTrailersForCinemaMode": "Internet trailers:", - "OptionUpcomingDvdMovies": "Include trailers from new and upcoming movies on Dvd & Blu-ray", - "OptionUpcomingStreamingMovies": "Include trailers from new and upcoming movies on Netflix", - "CinemaModeConfigurationHelp2": "Emby apps will have a setting to enable or disable cinema mode. TV apps enable cinema mode by default.", - "LabelEnableCinemaMode": "Enable cinema mode", - "HeaderCinemaMode": "Cinema Mode", - "LabelDateAddedBehavior": "Date added behavior for new content:", - "OptionDateAddedImportTime": "Use date scanned into the library", - "OptionDateAddedFileTime": "Use file creation date", - "LabelDateAddedBehaviorHelp": "If a metadata value is present it will always be used before either of these options.", - "LabelNumberTrailerToPlay": "Number of trailers to play:", - "TitleDevices": "Devices", - "TabCameraUpload": "Camera Upload", - "TabDevices": "Devices", - "HeaderCameraUploadHelp": "Automatically upload photos and videos taken from your mobile devices into Emby.", - "MessageNoDevicesSupportCameraUpload": "You currently don't have any devices that support camera upload.", - "LabelCameraUploadPath": "Camera upload path:", - "LabelCameraUploadPathHelp": "Select a custom upload path, if desired. If unspecified a default folder will be used. If using a custom path it will also need to be added in the library setup area.", - "LabelCreateCameraUploadSubfolder": "Create a subfolder for each device", - "LabelCreateCameraUploadSubfolderHelp": "Specific folders can be assigned to a device by clicking on it from the Devices page.", - "LabelCustomDeviceDisplayName": "Display name:", - "LabelCustomDeviceDisplayNameHelp": "Supply a custom display name or leave empty to use the name reported by the device.", - "HeaderInviteUser": "Invite User", - "LabelConnectGuestUserNameHelp": "This is the username that your friend uses to sign in to the Emby website, or their email address.", - "HeaderInviteUserHelp": "Sharing your media with friends is easier than ever before with Emby Connect.", - "ButtonSendInvitation": "Send Invitation", - "HeaderSignInWithConnect": "Sign in with Emby Connect", - "HeaderGuests": "Guests", - "HeaderPendingInvitations": "Pending Invitations", - "TabParentalControl": "Parental Control", - "HeaderAccessSchedule": "Access Schedule", - "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", - "ButtonAddSchedule": "Add Schedule", - "LabelAccessDay": "Day of week:", - "LabelAccessStart": "Start time:", - "LabelAccessEnd": "End time:", - "HeaderSchedule": "Schedule", - "OptionEveryday": "Every day", - "OptionWeekdays": "Weekdays", - "OptionWeekends": "Weekends", - "MessageProfileInfoSynced": "User profile information synced with Emby Connect.", - "HeaderOptionalLinkEmbyAccount": "Optional: Link your Emby account", - "ButtonTrailer": "Trailer", - "MessageNoTrailersFound": "No trailers found. Install the Trailer channel to enhance your movie experience by adding a library of internet trailers.", - "HeaderNewUsers": "New Users", - "ButtonSignUp": "Sign up", - "ButtonForgotPassword": "Forgot password", - "OptionDisableUserPreferences": "Disable access to user preferences", - "OptionDisableUserPreferencesHelp": "If enabled, only administrators will be able to configure user profile images, passwords, and language preferences.", - "HeaderSelectServer": "Select Server", - "MessageNoServersAvailableToConnect": "No servers are available to connect to. If you've been invited to share a server, make sure to accept it below or by clicking the link in the email.", - "TitleNewUser": "New User", - "ButtonConfigurePassword": "Configure Password", - "HeaderDashboardUserPassword": "User passwords are managed within each user's personal profile settings.", - "HeaderLibraryAccess": "Library Access", - "HeaderChannelAccess": "Channel Access", - "HeaderLatestItems": "Latest Items", - "LabelSelectLastestItemsFolders": "Include media from the following sections in Latest Items", - "HeaderShareMediaFolders": "Share Media Folders", - "MessageGuestSharingPermissionsHelp": "Most features are initially unavailable to guests but can be enabled as needed.", - "HeaderInvitations": "Invitations", - "LabelForgotPasswordUsernameHelp": "Enter your username, if you remember it.", - "HeaderForgotPassword": "Forgot Password", - "TitlePasswordReset": "Password Reset", - "LabelPasswordRecoveryPinCode": "Pin code:", - "HeaderPasswordReset": "Password Reset", + "OptionEmbedSubtitles": "Omogu\u0107i unutar spremnika", + "OptionExternallyDownloaded": "Vanjsko preuzimanje", + "OptionHlsSegmentedSubtitles": "Hls dijelovi titlova prijevoda", + "LabelSubtitleFormatHelp": "Npr.: srt", + "ButtonLearnMore": "Nau\u010di jo\u0161", + "TabPlayback": "Reprodukcija", + "HeaderAudioSettings": "Postavke zvuka", + "HeaderSubtitleSettings": "Postavke titlova prijevoda", + "TabCinemaMode": "Kino na\u010din", + "TitlePlayback": "Reprodukcija", + "LabelEnableCinemaModeFor": "Omogu\u0107i na\u010din kina za:", + "CinemaModeConfigurationHelp": "Na\u010din kino donosi iskustvo kina izravno u va\u0161 dnevni boravak s mogu\u0107no\u0161\u0107u da se pokre\u0107u kratki filmovi i prilago\u0111eni isje\u010dci prije glavne zna\u010dajke.", + "OptionTrailersFromMyMovies": "Uklju\u010di kratke filmove iz filmova u mojoj biblioteci", + "OptionUpcomingMoviesInTheaters": "Uklju\u010di kratke filmove od novih i nadolaze\u0107ih filmova", + "LabelLimitIntrosToUnwatchedContent": "Samo pokre\u010di kratke filmove iz nepregledanog sadr\u017eaja", + "LabelEnableIntroParentalControl": "Omogu\u0107i pametnu roditeljsku kontrolu", + "LabelEnableIntroParentalControlHelp": "Kratki filmovi \u0107e biti izabrani samo uz roditeljski rejting jednak ili manji od sadr\u017eaja koji se prikazuju.", + "LabelTheseFeaturesRequireSubscriptionHelpAndTrailers": "Ove zna\u010dajke zahtijevaju aktivnu pretplatu Emby Premijere i instaliran dodatak za kanale kratkih filmova.", + "OptionTrailersFromMyMoviesHelp": "Zahtjeva instalaciju lokalnih kratkih filmova.", + "LabelCustomIntrosPath": "Prilago\u0111eni put predfilmova:", + "LabelCustomIntrosPathHelp": "Mapa sadr\u017ei video datoteke. Video \u0107e biti nasumi\u010dno odabran i reproduciran nakon kratkih filmova.", + "LabelSelectInternetTrailersForCinemaMode": "Kratki filmovi sa Interneta:", + "OptionUpcomingDvdMovies": "Uklju\u010di kratke filmove od novih i nadolaze\u0107ih filmova na DVD-u i Blu-ray-u", + "OptionUpcomingStreamingMovies": "Uklju\u010di kratke filmove od novih i nadolaze\u0107ih filmova na Netflix-u", + "CinemaModeConfigurationHelp2": "Emby aplikacije imati \u0107e postavku za omogu\u0107avanje ili onemogu\u0107avanje kino na\u010dina. TV aplikacije omogu\u0107uju kino na\u010dina po zadanom.", + "LabelEnableCinemaMode": "Omogu\u0107i na\u010din kina", + "HeaderCinemaMode": "Kino na\u010din", + "LabelDateAddedBehavior": "Pona\u0161anje datuma dodanog za novi sadr\u017eaj:", + "OptionDateAddedImportTime": "Koristi skenirano datumom u biblioteku", + "OptionDateAddedFileTime": "Koristi datum stvaranja datoteke", + "LabelDateAddedBehaviorHelp": "Ako je prisutna vrijednost meta-podataka uvijek \u0107e se koristiti prije bilo kojih od ovih opcija.", + "LabelNumberTrailerToPlay": "Broj kratkih filmova za reprodukciju:", + "TitleDevices": "Ure\u0111aji", + "TabCameraUpload": "Prenesene slike kamere", + "TabDevices": "Ure\u0111aji", + "HeaderCameraUploadHelp": "Automatski prijenos fotografija i videa snimljenih iz va\u0161ih mobilnih ure\u0111aja u Emby.", + "MessageNoDevicesSupportCameraUpload": "Trenutno nemate ure\u0111aje koji podr\u017eavaju preuzimanje slika kamere.", + "LabelCameraUploadPath": "Putanja slika kamere za preuzimanje:", + "LabelCameraUploadPathHelp": "Odaberite stazu prilago\u0111enu za prijenos, ako to \u017eelite. Ako ne, koristit \u0107e se zadana mapa. Ako koristite prilago\u0111enu putanju morati \u0107e se dodati i u podru\u010dju postavka biblioteke.", + "LabelCreateCameraUploadSubfolder": "Izradi podmape za svaki ure\u0111aj", + "LabelCreateCameraUploadSubfolderHelp": "Posebne mape mogu biti dodijeljene na ure\u0111aj tako da kliknete na njega sa stranice ure\u0111aji.", + "LabelCustomDeviceDisplayName": "Prikaz naziva:", + "LabelCustomDeviceDisplayNameHelp": "Navedite naziv prilago\u0111enog prikaza ili ostaviti prazno za kori\u0161tenje naziva koji je izvijestio ure\u0111aj.", + "HeaderInviteUser": "Pozovi korisnika", + "LabelConnectGuestUserNameHelp": "Korisni\u010dko ime koje va\u0161 prijatelj upotrebljava da se prijavi na Emby web stranicu ili njihove e-mail adrese.", + "HeaderInviteUserHelp": "Dijeljenje medija sa prijateljima je lak\u0161e nego ikad prije sa \"Emby Connect\".", + "ButtonSendInvitation": "Po\u0161alji poziv", + "HeaderSignInWithConnect": "Prijavi se uz \"Emby Connect\"", + "HeaderGuests": "Gosti", + "HeaderPendingInvitations": "Nerije\u0161eni pozivi", + "TabParentalControl": "Roditeljska kontrola", + "HeaderAccessSchedule": "Raspored pristupa", + "HeaderAccessScheduleHelp": "Napravite raspored pristupa da bi ograni\u010dili pristup odre\u0111enim satima.", + "ButtonAddSchedule": "Dodaj raspored", + "LabelAccessDay": "Dan u tjednu:", + "LabelAccessStart": "Po\u010detak:", + "LabelAccessEnd": "Zavr\u0161etak:", + "HeaderSchedule": "Raspored", + "OptionEveryday": "Svaki dan", + "OptionWeekdays": "Radni dani", + "OptionWeekends": "Vikendi", + "MessageProfileInfoSynced": "Korisni\u010dki profil informacija sinkroniziran s \"Emby Connect\".", + "HeaderOptionalLinkEmbyAccount": "Opcija: Pove\u017eite svoj Emby ra\u010dun", + "ButtonTrailer": "Kratki video", + "MessageNoTrailersFound": "Nisu prona\u0111eni kratki videi. Postavite kanal kratkih filmova kako biste pobolj\u0161ali svoj filmski do\u017eivljaj dodavanjem kratkih filmova sa internet biblioteke.", + "HeaderNewUsers": "Novi korisnici", + "ButtonSignUp": "Prijava", + "ButtonForgotPassword": "Zaboravili ste lozinku", + "OptionDisableUserPreferences": "Onemogu\u0107i pristup korisni\u010dkim postavkama", + "OptionDisableUserPreferencesHelp": "Ako je omogu\u0107eno, samo administratori \u0107e mo\u0107i pode\u0161avati korisni\u010dki profil slike, lozinke i postavke jezika.", + "HeaderSelectServer": "Odaberi Server", + "MessageNoServersAvailableToConnect": "Nema poslu\u017eitelja dostupnih za povezivanje. Ako ste pozvani da dijelite poslu\u017eitelj, provjerite da li ste ga prihvatili ispod ili klikom na link u e-po\u0161ti.", + "TitleNewUser": "Novi korisnik", + "ButtonConfigurePassword": "Podesi lozinku", + "HeaderDashboardUserPassword": "Korisni\u010dke lozinke upravljaju se u okviru osobnih postavki profila pojedinih korisnika.", + "HeaderLibraryAccess": "Pristup biblioteci", + "HeaderChannelAccess": "Pristup kanalima", + "HeaderLatestItems": "Najnovije stavke", + "LabelSelectLastestItemsFolders": "Uklju\u010di medije iz sljede\u0107ih dijelova u aktualnostima", + "HeaderShareMediaFolders": "Dijeli medijske mape", + "MessageGuestSharingPermissionsHelp": "Ve\u0107ina zna\u010dajka u po\u010detku nisu na raspolaganju gostima, ali mogu biti omogu\u0107ene po potrebi.", + "HeaderInvitations": "Pozivi", + "LabelForgotPasswordUsernameHelp": "Unesite korisni\u010dko ime, ako se sje\u0107ate.", + "HeaderForgotPassword": "Zaboravili ste lozinku", + "TitlePasswordReset": "Poni\u0161tenje lozinke", + "LabelPasswordRecoveryPinCode": "PIN:", + "HeaderPasswordReset": "Poni\u0161tenje lozinke", "HeaderParentalRatings": "Parental Ratings", - "HeaderVideoTypes": "Video Types", - "HeaderYears": "Years", - "HeaderBlockItemsWithNoRating": "Block content with no or unrecognized rating information:", - "LabelBlockContentWithTags": "Block content with tags:", - "LabelEnableSingleImageInDidlLimit": "Limit to single embedded image", - "LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.", - "TabActivity": "Activity", - "TitleSync": "Sync", - "OptionAllowSyncContent": "Allow Sync", - "OptionAllowContentDownloading": "Allow media downloading", - "NameSeasonUnknown": "Season Unknown", + "HeaderVideoTypes": "Tip videa", + "HeaderYears": "Godine", + "HeaderBlockItemsWithNoRating": "Blokiranje sadr\u017eaja bez ili neprepoznatljivih informacija ocjena:", + "LabelBlockContentWithTags": "Blokiranje sadr\u017eaja sa oznakama:", + "LabelEnableSingleImageInDidlLimit": "Ograni\u010denje na jednu ugra\u0111enu sliku", + "LabelEnableSingleImageInDidlLimitHelp": "Neki ure\u0111aji ne\u0107e ispravno prikazivati ako je vi\u0161e slika ugra\u0111eno unutar Didl-a.", + "TabActivity": "Aktivnost", + "TitleSync": "Sink.", + "OptionAllowSyncContent": "Dozvoli sink.", + "OptionAllowContentDownloading": "Dopusti preuzimanje medija", + "NameSeasonUnknown": "Nepoznata sezona", "NameSeasonNumber": "Season {0}", - "LabelNewUserNameHelp": "Usernames can contain letters (a-z), numbers (0-9), dashes (-), underscores (_), apostrophes ('), and periods (.)", - "TabJobs": "Jobs", - "TabSyncJobs": "Sync Jobs", - "HeaderThisUserIsCurrentlyDisabled": "This user is currently disabled", - "MessageReenableUser": "See below to reenable", - "LabelEnableInternetMetadataForTvPrograms": "Download internet metadata for:", - "OptionTVMovies": "TV Movies", - "HeaderUpcomingMovies": "Upcoming Movies", - "HeaderUpcomingSports": "Upcoming Sports", - "HeaderUpcomingPrograms": "Upcoming Programs", - "ButtonMoreItems": "More", - "OptionEnableTranscodingThrottle": "Enable throttling", - "OptionEnableTranscodingThrottleHelp": "Throttling will automatically adjust transcoding speed in order to minimize server cpu utilization during playback.", - "LabelUploadSpeedLimit": "Upload speed limit (Mbps):", - "OptionAllowSyncTranscoding": "Allow syncing that requires transcoding", - "HeaderPlayback": "Media Playback", - "OptionAllowAudioPlaybackTranscoding": "Allow audio playback that requires transcoding", - "OptionAllowVideoPlaybackTranscoding": "Allow video playback that requires transcoding", - "OptionAllowVideoPlaybackRemuxing": "Allow video playback that requires conversion without re-encoding", - "OptionAllowMediaPlaybackTranscodingHelp": "Users will receive friendly messages when content is unplayable based on policy.", - "TabStreaming": "Streaming", - "LabelRemoteClientBitrateLimit": "Internet streaming bitrate limit (Mbps):", - "LabelRemoteClientBitrateLimitHelp": "An optional streaming bitrate limit for all out of network devices. This is useful to prevent devices from requesting a higher bitrate than your internet connection can handle.", - "LabelConversionCpuCoreLimit": "CPU core limit:", - "LabelConversionCpuCoreLimitHelp": "Limit the number of CPU cores that will be used during sync conversion.", - "OptionEnableFullSpeedConversion": "Enable full speed conversion", - "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", - "HeaderPlaylists": "Playlists", - "HeaderViewStyles": "View Styles", - "TabPhotos": "Photos", - "TabVideos": "Videos", - "HeaderWelcomeToEmby": "Welcome to Emby", - "EmbyIntroMessage": "With Emby you can easily stream videos, music and photos to smart phones, tablets and other devices from your Emby Server.", - "ButtonSkip": "Skip", - "TextConnectToServerManually": "Connect to server manually", - "ButtonSignInWithConnect": "Sign in with Emby Connect", - "ButtonConnect": "Connect", - "LabelServerHost": "Host:", - "LabelServerHostHelp": "192.168.1.100 or https:\/\/myserver.com", + "LabelNewUserNameHelp": "Korisni\u010dka imena mogu sadr\u017eavati slova (a-z), brojeve (0-9), crtice (-), donje crtice (_), apostrofe (') i to\u010dke (.)", + "TabJobs": "Poslovi", + "TabSyncJobs": "Poslovi sink.", + "HeaderThisUserIsCurrentlyDisabled": "Ovaj je korisnik trenutno onemogu\u0107en", + "MessageReenableUser": "Pogledajte dolje za ponovno omogu\u0107enje", + "LabelEnableInternetMetadataForTvPrograms": "Preuzmi Internet meta-podatke za:", + "OptionTVMovies": "TV filmovi", + "HeaderUpcomingMovies": "Nadolaze\u0107i filmovi", + "HeaderUpcomingSports": "Nadolaze\u0107i sport", + "HeaderUpcomingPrograms": "Nadolaze\u0107i programi", + "ButtonMoreItems": "Vi\u0161e", + "OptionEnableTranscodingThrottle": "Omogu\u0107i proporcionalnost", + "OptionEnableTranscodingThrottleHelp": "Proporcionalnost \u0107e automatski podesiti brzinu konvertiranja kako bi se umanjilo kori\u0161tenje serverskog CPU-a tijekom reprodukcije.", + "LabelUploadSpeedLimit": "Ograni\u010denje brzine prijenosa (Mbps):", + "OptionAllowSyncTranscoding": "Dopusti sinkronizaciju koja zahtijeva konvertiranje", + "HeaderPlayback": "Reprodukcija medija", + "OptionAllowAudioPlaybackTranscoding": "Dopusti audio reprodukciju koja zahtijeva konvertiranje", + "OptionAllowVideoPlaybackTranscoding": "Dopusti video reprodukciju koja zahtijeva konvertiranje", + "OptionAllowVideoPlaybackRemuxing": "Dopusti video reprodukciju koja zahtijeva konvertiranje bez ponovnog kodiranja", + "OptionAllowMediaPlaybackTranscodingHelp": "Korisnici \u0107e dobiti prijateljske poruke kada se sadr\u017eaj ne mo\u017ee reproducirati na temelju pravila.", + "TabStreaming": "Strujanje", + "LabelRemoteClientBitrateLimit": "Granica brzine strujanja prijenosa preko Interneta (Mbps):", + "LabelRemoteClientBitrateLimitHelp": "Optimalna granica brzine strujanja prijenosa za sve mre\u017ene ure\u0111aje. To je korisno za spre\u010davanje ure\u0111aja koji zahtijevaju ve\u0107u brzinu od one koju va\u0161a internet veza mo\u017ee podnositi.", + "LabelConversionCpuCoreLimit": "Ograni\u010denje CPU jezgra:", + "LabelConversionCpuCoreLimitHelp": "Ograni\u010dite broj procesorskih jezgra koje \u0107e se koristiti tijekom sinkronizacije pretvorbe.", + "OptionEnableFullSpeedConversion": "Omogu\u0107i potpunu pretvorbu brzine", + "OptionEnableFullSpeedConversionHelp": "Prema zadanim postavkama, sinkronizacija pretvorbe se obavlja pri niskim brzinama kako bi se smanjila potro\u0161nja resursa.", + "HeaderPlaylists": "Popisi", + "HeaderViewStyles": "Stilovi pogleda", + "TabPhotos": "Fotografije", + "TabVideos": "Videi", + "HeaderWelcomeToEmby": "Dobrodo\u0161li u Emby", + "EmbyIntroMessage": "Uz Emby mo\u017eete jednostavno gledati video, glazbu i fotografije na pametnim telefonima, tabletima i drugim ure\u0111ajima iz svog Emby Servera.", + "ButtonSkip": "Presko\u010di", + "TextConnectToServerManually": "Spoji se ru\u010dno na Server", + "ButtonSignInWithConnect": "Prijavi se uz \"Emby Connect\"", + "ButtonConnect": "Spoji", + "LabelServerHost": "Doma\u0107in:", + "LabelServerHostHelp": "192.168.1.100 ili https:\/\/myserver.com", "LabelServerPort": "Port:", - "HeaderNewServer": "New Server", - "ButtonChangeServer": "Change Server", - "HeaderConnectToServer": "Connect to Server", - "OptionReportList": "List View", - "OptionReportStatistics": "Statistics", - "OptionReportGrouping": "Grouping", - "HeaderExport": "Export", - "HeaderColumns": "Columns", - "ButtonReset": "Reset", - "OptionEnableExternalVideoPlayers": "Enable external video players", - "ButtonUnlockGuide": "Unlock Guide", - "LabelEnableFullScreen": "Enable fullscreen mode", - "LabelEmail": "Email:", - "LabelUsername": "Username:", - "HeaderSignUp": "Sign Up", - "LabelPasswordConfirm": "Password (confirm):", - "ButtonAddServer": "Add Server", - "TabHomeScreen": "Home Screen", - "HeaderDisplay": "Display", - "HeaderNavigation": "Navigation", - "OptionEnableAutomaticServerUpdates": "Enable automatic server updates", - "OptionOtherTrailers": "Include trailers from older movies", + "HeaderNewServer": "Novi Server", + "ButtonChangeServer": "Promijeni Server", + "HeaderConnectToServer": "Spoji se na Server", + "OptionReportList": "Prikaz popisa", + "OptionReportStatistics": "Statistike", + "OptionReportGrouping": "Grupiranja", + "HeaderExport": "Izvoz", + "HeaderColumns": "Stupci", + "ButtonReset": "Resetiraj", + "OptionEnableExternalVideoPlayers": "Omogu\u0107i vanjske pokreta\u010de", + "ButtonUnlockGuide": "Otklju\u010daj vodi\u010d", + "LabelEnableFullScreen": "Omogu\u0107i na\u010din punog zaslona", + "LabelEmail": "E-mail:", + "LabelUsername": "Korisni\u010dko ime:", + "HeaderSignUp": "Prijava", + "LabelPasswordConfirm": "Potvrda nove lozinke:", + "ButtonAddServer": "Dodaj Server", + "TabHomeScreen": "Po\u010detni zaslon", + "HeaderDisplay": "Prikaz", + "HeaderNavigation": "Navigacija", + "OptionEnableAutomaticServerUpdates": "Omogu\u0107i automatska a\u017euriranja servera", + "OptionOtherTrailers": "Uklju\u010di kratke filmove od starijih filmova", "HeaderOverview": "Overview", "HeaderShortOverview": "Short Overview", "HeaderType": "Type", "HeaderSeverity": "Severity", - "OptionReportActivities": "Activities Log", - "HeaderTunerDevices": "Tuner Devices", - "HeaderAddDevice": "Add Device", - "HeaderExternalServices": "External Services", - "LabelTunerIpAddress": "Tuner IP Address:", - "TabExternalServices": "External Services", - "HeaderGuideProviders": "Guide Providers", - "AddGuideProviderHelp": "Add a source for TV Guide information", - "LabelZipCode": "Zip Code:", - "GuideProviderSelectListings": "Select Listings", - "GuideProviderLogin": "Login", - "LabelLineup": "Lineup:", - "MessageTunerDeviceNotListed": "Is your tuner device not listed? Try installing an external service provider for more Live TV options.", - "LabelImportOnlyFavoriteChannels": "Restrict to channels marked as favorite", - "ImportFavoriteChannelsHelp": "If enabled, only channels that are marked as favorite on the tuner device will be imported.", - "ButtonRepeat": "Repeat", - "LabelEnableThisTuner": "Enable this tuner", - "LabelEnableThisTunerHelp": "Uncheck to prevent importing channels from this tuner.", + "OptionReportActivities": "Dnevnik aktivnosti", + "HeaderTunerDevices": "TV\/Radio ure\u0111aji", + "HeaderAddDevice": "Dodaj ure\u0111aj", + "HeaderExternalServices": "Vanjski servisi", + "LabelTunerIpAddress": "IP adresa TV\/Radio ure\u0111aja:", + "TabExternalServices": "Vanjski servisi", + "HeaderGuideProviders": "Pru\u017eatelji vodi\u010da", + "AddGuideProviderHelp": "Dodaj izvor za informacije TV vodi\u010da", + "LabelZipCode": "Po\u0161tanski broj:", + "GuideProviderSelectListings": "Odaberi ispis", + "GuideProviderLogin": "Prijava", + "LabelLineup": "Svrastavanje:", + "MessageTunerDeviceNotListed": "Dali va\u0161 prijamnik nije na popisu? Poku\u0161ajte instalirati vanjskog pru\u017eatelja usluga za vi\u0161e TV u\u017eivo opcija.", + "LabelImportOnlyFavoriteChannels": "Ograni\u010di na kanale ozna\u010dene kao omiljeni", + "ImportFavoriteChannelsHelp": "Ako je omogu\u0107eno, samo kanali koji su ozna\u010deni kao omiljeni na ure\u0111aju TV\/radio pretra\u017eiva\u010da \u0107e se uvesti.", + "ButtonRepeat": "Ponovi", + "LabelEnableThisTuner": "Omogu\u0107i ovaj TV\/radio pretra\u017eiva\u010d", + "LabelEnableThisTunerHelp": "Odzna\u010dite da sprije\u010dite uvoz kanala iz tog TV\/radio pretra\u017eiva\u010da.", "HeaderUnidentified": "Unidentified", "HeaderImagePrimary": "Primary", "HeaderImageBackdrop": "Backdrop", "HeaderImageLogo": "Logo", "HeaderUserPrimaryImage": "User Image", - "ButtonProfile": "Profile", - "ButtonProfileHelp": "Set your profile image and password.", - "HeaderHomeScreenSettings": "Home Screen settings", - "HeaderProfile": "Profile", - "HeaderLanguage": "Language", - "LabelTranscodingThreadCount": "Transcoding thread count:", - "LabelTranscodingThreadCountHelp": "Select the maximum number of threads to use when transcoding. Reducing the thread count will lower cpu usage but may not convert fast enough for a smooth playback experience.", - "OptionMax": "Max", - "LabelSyncPath": "Synced content path:", - "OptionSyncOnlyOnWifi": "Sync only on Wifi", - "OptionSyncLosslessAudioOriginal": "Sync lossless audio at original quality", - "HeaderUpcomingForKids": "Upcoming for Kids", - "HeaderSetupLiveTV": "Setup Live TV", - "LabelTunerType": "Tuner type:", - "HelpMoreTunersCanBeAdded": "Additional tuners can be added later within the Live TV section.", - "AdditionalLiveTvProvidersCanBeInstalledLater": "Additional Live TV providers can be added later within the Live TV section.", - "HeaderSetupTVGuide": "Setup TV Guide", - "LabelDataProvider": "Data provider:", - "OptionSendRecordingsToAutoOrganize": "Automatically organize recordings into existing series folders in other libraries", - "HeaderDefaultPadding": "Default Padding", - "OptionEnableRecordingSubfolders": "Create sub-folders for categories such as Sports, Kids, etc.", - "HeaderSubtitles": "Subtitles", - "HeaderVideos": "Videos", - "LabelHardwareAccelerationType": "Hardware acceleration:", - "LabelHardwareAccelerationTypeHelp": "Available on supported systems only.", - "ButtonServerDashboard": "Server Dashboard", + "ButtonProfile": "Profil", + "ButtonProfileHelp": "Postavite sliku profila i lozinku.", + "HeaderHomeScreenSettings": "Postavke po\u010detne stranice", + "HeaderProfile": "Profil", + "HeaderLanguage": "Jezik", + "LabelTranscodingThreadCount": "Broj niti konvertiranja:", + "LabelTranscodingThreadCountHelp": "Odaberite maksimalan broj niti koje \u0107e se koristiti kada se konvertira. Manji broj niti \u0107e smanjiti upotrebu procesora, ali mogu\u0107e da ne\u0107e konvertirati dovoljno brzo za glatke reprodukcije.", + "OptionMax": "Maksimalno", + "LabelSyncPath": "Putanja sadr\u017eaja sinkronizacije:", + "OptionSyncOnlyOnWifi": "Sinkroniziraj jedino na Wifi", + "OptionSyncLosslessAudioOriginal": "Sinkronizacija audia bez gubitaka na izvornu kvalitetu", + "HeaderUpcomingForKids": "Nadolaze\u0107i za djecu", + "HeaderSetupLiveTV": "Podesi TV u\u017eivo", + "LabelTunerType": "Vrsta pretra\u017eiva\u010da:", + "HelpMoreTunersCanBeAdded": "Dodatni TV\/radio pretra\u017eiva\u010di mogu se dodati kasnije u odjeljku TV u\u017eivo.", + "AdditionalLiveTvProvidersCanBeInstalledLater": "Dodatne usluge TV u\u017eivo mogu se dodati kasnije u odjeljku TV u\u017eivo.", + "HeaderSetupTVGuide": "Podesi TV vodi\u010d", + "LabelDataProvider": "Pru\u017eatelj podataka:", + "OptionSendRecordingsToAutoOrganize": "Automatski organizirajte snimke u postoje\u0107e mape serija u drugim bibliotekama", + "HeaderDefaultPadding": "Zadano punjenje", + "OptionEnableRecordingSubfolders": "Stvaranje pod-mape za kategorije kao \u0161to su sport, djeca, itd.", + "HeaderSubtitles": "Titlovi", + "HeaderVideos": "Videi", + "LabelHardwareAccelerationType": "Hardversko ubrzanje:", + "LabelHardwareAccelerationTypeHelp": "Dostupno samo na podr\u017eanim sustavima.", + "ButtonServerDashboard": "Nadzorna plo\u010da poslu\u017eitelja", "HeaderAdmin": "Admin", - "ButtonSignOut": "Sign out", - "HeaderCameraUpload": "Camera Upload", - "SelectCameraUploadServers": "Upload camera photos to the following servers:", - "ButtonClear": "Clear", - "LabelFolder": "Folder:", - "HeadersFolders": "Folders", - "LabelDisplayName": "Display name:", - "HeaderNewRecording": "New Recording", - "ButtonAdvanced": "Advanced", - "LabelCodecIntrosPath": "Codec intros path:", - "LabelCodecIntrosPathHelp": "A folder containing video files. If an intro video file name matches the video codec, audio codec, audio profile, or a tag, then it will be played prior to the main feature.", - "OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format", - "OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 or MKV for easy playback on your devices.", - "FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.", - "FileExtension": "File extension", - "OptionReplaceExistingImages": "Replace existing images", - "OptionPlayNextEpisodeAutomatically": "Play next episode automatically", - "OptionDownloadImagesInAdvance": "Download images in advance", + "ButtonSignOut": "Odjava", + "HeaderCameraUpload": "Slike kamere", + "SelectCameraUploadServers": "Prenesi slike kamere na slijede\u0107e poslu\u017eitelje:", + "ButtonClear": "O\u010disti", + "LabelFolder": "Mapa:", + "HeadersFolders": "Mape", + "LabelDisplayName": "Prikaz naziva:", + "HeaderNewRecording": "Nova snimka", + "ButtonAdvanced": "Napredno", + "LabelCodecIntrosPath": "Putanja codec-a isje\u010dka:", + "LabelCodecIntrosPathHelp": "Mapa sadr\u017ei video datoteke. Ako naziv video isje\u010dka datoteke odgovara video codec-u, audio codec-u, audio profilu ili oznaci, onda \u0107e se reproducirati prije glavne zna\u010dajke.", + "OptionConvertRecordingsToStreamingFormat": "Automatski pretvoriti snimke na prijateljskom formatu strujanja", + "OptionConvertRecordingsToStreamingFormatHelp": "Snimke \u0107e se pretvoriti u letu u MP4 ili MKV za jednostavnu reprodukciju na ure\u0111ajima.", + "FeatureRequiresEmbyPremiere": "Ova zna\u010dajka zahtijeva aktivnu pretplatu Emby Premijere.", + "FileExtension": "Ekstenzija datoteke", + "OptionReplaceExistingImages": "Zamijeni postoje\u0107e slike", + "OptionPlayNextEpisodeAutomatically": "Pokreni automatski slijede\u0107u epizodu", + "OptionDownloadImagesInAdvance": "Preuzmi slike unaprijed", "SettingsSaved": "Postavke snimljene", - "OptionDownloadImagesInAdvanceHelp": "By default, most images are only downloaded when requested by an Emby app. Enable this option to download all images in advance, as new media is imported.", + "OptionDownloadImagesInAdvanceHelp": "Prema zadanim postavkama, ve\u0107ina slika se preuzimaju samo kada to zatra\u017ei Emby aplikacija. Omogu\u0107ite ovu opciju da biste preuzeli sve slike unaprijed kada se novi mediji uvoze.", "Users": "Korisnici", "Delete": "Izbri\u0161i", "Password": "Lozinka", "DeleteImage": "Izbri\u0161i sliku", - "MessageThankYouForSupporting": "Thank you for supporting Emby.", - "MessagePleaseSupportProject": "Please support Emby.", + "MessageThankYouForSupporting": "Hvala vam na podr\u0161ci Emby-a.", + "MessagePleaseSupportProject": "Molimo podr\u017eite Emby.", "DeleteImageConfirmation": "Da li ste sigurni da \u017eelite izbrisati ovu sliku?", "FileReadCancelled": "U\u010ditavanje datoteke je prekinuto.", "FileNotFound": "Datoteka nije prona\u0111ena.", "FileReadError": "Prilikom u\u010ditavanja datoteke desila se gre\u0161ka", "DeleteUser": "Izbri\u0161i korisnika", "DeleteUserConfirmation": "Da li ste sigurni da \u017eelite izbrisati odabranog korisnika?", - "PasswordResetHeader": "Reset Password", + "PasswordResetHeader": "Poni\u0161ti lozinku", "PasswordResetComplete": "Lozinka je resetirana.", - "PinCodeResetComplete": "The pin code has been reset.", + "PinCodeResetComplete": "PIN je resetiran.", "PasswordResetConfirmation": "Da li ste sigurni da \u017eelite resetirati lozinku?", - "PinCodeResetConfirmation": "Are you sure you wish to reset the pin code?", - "HeaderPinCodeReset": "Reset Pin Code", + "PinCodeResetConfirmation": "Da li ste sigurni da \u017eelite resetirati PIN?", + "HeaderPinCodeReset": "Poni\u0161ti PIN", "PasswordSaved": "Lozinka snimljena.", "PasswordMatchError": "Lozinka i lozinka potvrde moraju biti identi\u010dne.", "UninstallPluginHeader": "Ukloni dodatak", "UninstallPluginConfirmation": "Da li ste sigurni da \u017eelite ukloniti {0}?", - "NoPluginConfigurationMessage": "Ovaj dodatak nema ni\u0161ta za podesiti.", + "NoPluginConfigurationMessage": "Ovaj dodatak nema postavke za podesiti.", "NoPluginsInstalledMessage": "Nemate instaliranih dodataka.", "BrowsePluginCatalogMessage": "Pregledajte dostupne dodatke u na\u0161em katalogu.", - "HeaderNewApiKey": "New Api Key", - "LabelAppName": "App name", - "LabelAppNameExample": "Example: Sickbeard, NzbDrone", - "HeaderNewApiKeyHelp": "Grant an application permission to communicate with Emby Server.", - "MessageKeyEmailedTo": "Key emailed to {0}.", - "MessageKeysLinked": "Keys linked.", - "HeaderConfirmation": "Confirmation", - "MessageKeyUpdated": "Thank you. Your Emby Premiere key has been updated.", - "MessageKeyRemoved": "Thank you. Your Emby Premiere key has been removed.", - "TextEnjoyBonusFeatures": "Enjoy Bonus Features", - "ButtonCancelSyncJob": "Cancel sync", - "HeaderAddTag": "Add Tag", - "LabelTag": "Tag:", - "ButtonSelectView": "Select view", - "HeaderSelectDate": "Select Date", - "ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}", - "LabelFromHelp": "Example: {0} (on the server)", + "HeaderNewApiKey": "Novi API klju\u010d", + "LabelAppName": "Ime aplikacije", + "LabelAppNameExample": "Primjer: Sickbeard, NzbDrone", + "HeaderNewApiKeyHelp": "Odobri dozvolu aplikacije za komunikaciju s Emby Serverom.", + "MessageKeyEmailedTo": "Klju\u010d je poslan na {0}.", + "MessageKeysLinked": "Klju\u010devi su spojeni.", + "HeaderConfirmation": "Potvrda", + "MessageKeyUpdated": "Hvala Vam. Va\u0161 klju\u010d Emby Premijere je a\u017euriran.", + "MessageKeyRemoved": "Hvala Vam. Va\u0161 klju\u010d Emby Premijere je uklonjen.", + "TextEnjoyBonusFeatures": "U\u017eivajte u bonus zna\u010dajkama", + "ButtonCancelSyncJob": "Odustani od sink.", + "HeaderAddTag": "Dodaj oznaku", + "LabelTag": "Oznaka:", + "ButtonSelectView": "Odaberi pogled", + "HeaderSelectDate": "Odaberi datum", + "ServerUpdateNeeded": "Emby Server treba a\u017eurirati. Da biste preuzeli najnoviju verziju, posjetite {0}", + "LabelFromHelp": "Primjer: {0} (na serveru)", "HeaderMyMedia": "Moji mediji", - "LabelAutomaticUpdateLevel": "Automatic update level:", - "LabelAutomaticUpdateLevelForPlugins": "Automatic update level for plugins:", - "ErrorLaunchingChromecast": "There was an error launching chromecast. Please ensure your device is connected to your wireless network.", - "MessageErrorLoadingSupporterInfo": "There was an error loading Emby Premiere information. Please try again later.", - "MessageLinkYourSupporterKey": "Link your Emby Premiere key with up to {0} Emby Connect members to enjoy free access to the following apps:", - "HeaderConfirmRemoveUser": "Remove User", - "MessageConfirmRemoveConnectSupporter": "Are you sure you wish to remove additional Emby Premiere benefits from this user?", - "ValueTimeLimitSingleHour": "Time limit: 1 hour", - "ValueTimeLimitMultiHour": "Time limit: {0} hours", - "PluginCategoryGeneral": "General", - "PluginCategoryContentProvider": "Content Providers", + "LabelAutomaticUpdateLevel": "Automatska razina za a\u017euriranje:", + "LabelAutomaticUpdateLevelForPlugins": "Automatska razina a\u017euriranja za dodatke:", + "ErrorLaunchingChromecast": "Do\u0161lo je do pogre\u0161ke pokretanja chromecast-a. Provjerite jeli va\u0161 ure\u0111aj spojen na be\u017ei\u010dnu mre\u017eu.", + "MessageErrorLoadingSupporterInfo": "Do\u0161lo je do pogre\u0161ke prilikom u\u010ditavanja informacije Emby Premijere. Molimo poku\u0161ajte ponovo kasnije.", + "MessageLinkYourSupporterKey": "Pove\u017eite svoj klju\u010d Emby Premijere sa do {0} \u010dlanova \"Emby Connect\" da imaju na raspolaganju besplatni pristup sljede\u0107im aplikacijama:", + "HeaderConfirmRemoveUser": "Ukloni korisnika", + "MessageConfirmRemoveConnectSupporter": "Jeste li sigurni da \u017eelite ukloniti dodatne pogodnosti Emby Premijere tom korisniku?", + "ValueTimeLimitSingleHour": "Vremensko ograni\u010denje: 1 sat", + "ValueTimeLimitMultiHour": "Vremensko ograni\u010denje: {0} sati", + "PluginCategoryGeneral": "Op\u0107e", + "PluginCategoryContentProvider": "Pru\u017eatelji sadr\u017eaja", "PluginCategoryScreenSaver": "Screen Savers", - "PluginCategoryTheme": "Themes", - "PluginCategorySync": "Sync", - "PluginCategorySocialIntegration": "Social Networks", - "PluginCategoryNotifications": "Notifications", - "PluginCategoryMetadata": "Metadata", - "PluginCategoryLiveTV": "Live TV", - "PluginCategoryChannel": "Channels", - "HeaderSearch": "Search", - "ValueDateCreated": "Date created: {0}", - "LabelArtist": "Artist", - "LabelMovie": "Movie", - "LabelMusicVideo": "Music Video", - "LabelEpisode": "Episode", - "Series": "Series", - "LabelStopping": "Stopping", - "LabelCancelled": "Cancelled", - "ButtonDownload": "Download", - "SyncJobStatusQueued": "Queued", - "SyncJobStatusConverting": "Converting", - "SyncJobStatusFailed": "Failed", - "SyncJobStatusCancelled": "Cancelled", - "SyncJobStatusCompleted": "Synced", - "SyncJobStatusReadyToTransfer": "Ready to Transfer", - "SyncJobStatusTransferring": "Transferring", - "SyncJobStatusCompletedWithError": "Synced with errors", - "SyncJobItemStatusReadyToTransfer": "Ready to Transfer", - "LabelCollection": "Collection", - "HeaderDevices": "Devices", - "ButtonScheduledTasks": "Scheduled tasks", - "MessageItemsAdded": "Items added", - "HeaderSelectCertificatePath": "Select Certificate Path", - "ConfirmMessageScheduledTaskButton": "This operation normally runs automatically as a scheduled task and does not require any manual effort. To configure the scheduled task, see:", - "HeaderSupporterBenefit": "An active Emby Premiere subscription provides additional benefits such as access to sync, premium plugins, internet channel content, and more. {0}Learn more{1}.", - "HeaderWelcomeToProjectServerDashboard": "Welcome to the Emby Server Dashboard", - "HeaderWelcomeToProjectWebClient": "Welcome to Emby", - "ButtonTakeTheTour": "Take the tour", - "HeaderWelcomeBack": "Welcome back!", - "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", - "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", - "HeaderSelectDevices": "Select Devices", - "ButtonCancelItem": "Cancel item", - "ButtonQueueForRetry": "Queue for retry", - "ButtonReenable": "Re-enable", - "SyncJobItemStatusSyncedMarkForRemoval": "Marked for removal", - "LabelAbortedByServerShutdown": "(Aborted by server shutdown)", - "LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.", - "HeaderDeleteTaskTrigger": "Delete Task Trigger", - "MessageDeleteTaskTrigger": "Are you sure you wish to delete this task trigger?", - "MessageNoPluginsInstalled": "You have no plugins installed.", - "MessageNoPluginsDueToAppStore": "To manage plugins, please use the Emby web app.", - "LabelVersionInstalled": "{0} installed", - "LabelNumberReviews": "{0} Reviews", - "LabelFree": "Free", - "HeaderPlaybackError": "Playback Error", - "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", - "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", - "HeaderSelectAudio": "Select Audio", - "HeaderSelectSubtitles": "Select Subtitles", - "ButtonMarkForRemoval": "Remove from device", - "ButtonUnmarkForRemoval": "Cancel removal from device", - "LabelDefaultStream": "(Default)", - "LabelForcedStream": "(Forced)", - "LabelDefaultForcedStream": "(Default\/Forced)", - "LabelUnknownLanguage": "Unknown language", + "PluginCategoryTheme": "Teme", + "PluginCategorySync": "Sink.", + "PluginCategorySocialIntegration": "Dru\u0161tvene mre\u017ee", + "PluginCategoryNotifications": "Obavijesti", + "PluginCategoryMetadata": "Meta-podaci", + "PluginCategoryLiveTV": "TV u\u017eivo", + "PluginCategoryChannel": "Kanali", + "HeaderSearch": "Tra\u017ei", + "ValueDateCreated": "Datum izrade: {0}", + "LabelArtist": "Izvo\u0111a\u010d", + "LabelMovie": "Film", + "LabelMusicVideo": "Glazbeni video", + "LabelEpisode": "Epizoda", + "Series": "Serija", + "LabelStopping": "Zaustavljanje", + "LabelCancelled": "Otkazan", + "ButtonDownload": "Preuzimanje", + "SyncJobStatusQueued": "Na \u010dekanju", + "SyncJobStatusConverting": "Pretvaranje", + "SyncJobStatusFailed": "Neuspje\u0161no", + "SyncJobStatusCancelled": "Otkazan", + "SyncJobStatusCompleted": "Sinkronizirano", + "SyncJobStatusReadyToTransfer": "Spremno za prijenos", + "SyncJobStatusTransferring": "Prijenos", + "SyncJobStatusCompletedWithError": "Sinkronizirano s pogre\u0161kama", + "SyncJobItemStatusReadyToTransfer": "Spremno za prijenos", + "LabelCollection": "Kolekcija", + "HeaderDevices": "Ure\u0111aji", + "ButtonScheduledTasks": "Zakazani zadaci", + "MessageItemsAdded": "Stavke su dodane", + "HeaderSelectCertificatePath": "Odaberi put certifikata:", + "ConfirmMessageScheduledTaskButton": "Ova operacija se obi\u010dno automatski pokre\u0107e kao zakazan zadatak i ne zahtijeva ru\u010dnu intervenciju. Za pode\u0161avanje rasporeda zadataka, pogledajte:", + "HeaderSupporterBenefit": "Aktivna pretplata Emby Premijere omogu\u0107uje dodatne pogodnosti kao \u0161to su pristup za sinkronizaciju, premium dodataka, internet sadr\u017eaja kanala, i jo\u0161 mnogo toga. {0} Saznajte vi\u0161e {1}.", + "HeaderWelcomeToProjectServerDashboard": "Dobrodo\u0161li u kontrlonu plo\u010du Emby Server-a", + "HeaderWelcomeToProjectWebClient": "Dobrodo\u0161li u Emby", + "ButtonTakeTheTour": "Krenite u obilazak", + "HeaderWelcomeBack": "Dobrodo\u0161li nazad!", + "ButtonTakeTheTourToSeeWhatsNew": "Krenite u obilazak da vidite \u0161to je novo", + "MessageNoSyncJobsFound": "Nisu prona\u0111eni sinkronizacijski poslovi. Stvorite sinkronizacijske poslove koriste\u0107i sinkronizacijske gumbe koji se nalaze po cijeloj aplikaciji.", + "MessageDownloadsFound": "Nema preuzimanja izvan mre\u017ee. Klikom na gumb \"napravi dostupno izvan mre\u017ee\" koji se nalazi po cijeloj aplikaciji u\u010dinite da va\u0161i mediji budu dostupni izvan mre\u017ee.", + "HeaderSelectDevices": "Odaberi ure\u0111aje", + "ButtonCancelItem": "Odustani od stavke", + "ButtonQueueForRetry": "U redu za ponovni poku\u0161aj", + "ButtonReenable": "Ponovno omogu\u0107iti", + "SyncJobItemStatusSyncedMarkForRemoval": "Ozna\u010deno za uklanjanje", + "LabelAbortedByServerShutdown": "(Prekinuto od strane isklju\u010divanja servera)", + "LabelScheduledTaskLastRan": "Posljednji puta pokrenuto {0}, uzimaju\u0107i {1}.", + "HeaderDeleteTaskTrigger": "Brisanje okida\u010da zadataka", + "MessageDeleteTaskTrigger": "Jeste li sigurni da \u017eelite izbrisati ovaj okida\u010d zadatka?", + "MessageNoPluginsInstalled": "Nemate instaliranih dodataka.", + "MessageNoPluginsDueToAppStore": "Za upravljanje dodatcima, molimo koristite Emby web-aplikaciju.", + "LabelVersionInstalled": "{0} instaliran", + "LabelNumberReviews": "{0} recenzije", + "LabelFree": "Slobodno", + "HeaderPlaybackError": "Gre\u0161ka u reprodukciji", + "MessagePlaybackErrorNotAllowed": "Trenuta\u010dno niste ovla\u0161teni za reprodukciju tog sadr\u017eaja. Obratite se administratoru sustava za detalje.", + "MessagePlaybackErrorNoCompatibleStream": "Kompatibilna strujanja su trenutno nedostupna. Poku\u0161ajte ponovno kasnije ili se obratite administratoru sustava za detalje.", + "MessagePlaybackErrorPlaceHolder": "Molimo umetnite disk kako bi se reproducirao ovaj video.", + "HeaderSelectAudio": "Odaberi audio", + "HeaderSelectSubtitles": "Odaberi titlove prijevoda", + "ButtonMarkForRemoval": "Ukloni iz ure\u0111aja", + "ButtonUnmarkForRemoval": "Odustani od uklanjanja iz ure\u0111aja", + "LabelDefaultStream": "(Zadano)", + "LabelForcedStream": "(Prisilno)", + "LabelDefaultForcedStream": "(Zadano\/Prisilno)", + "LabelUnknownLanguage": "Nepoznati jezik", "ButtonMute": "Bez zvuka", - "ButtonUnmute": "Unmute", - "ButtonPlaylist": "Playlist", - "LabelEnabled": "Enabled", - "LabelDisabled": "Disabled", - "ButtonMoreInformation": "More Information", - "LabelNoUnreadNotifications": "No unread notifications.", - "LabelAllPlaysSentToPlayer": "All plays will be sent to the selected player.", - "MessageInvalidUser": "Invalid username or password. Please try again.", - "HeaderLoginFailure": "Login Failure", - "RecommendationBecauseYouLike": "Because you like {0}", - "RecommendationBecauseYouWatched": "Because you watched {0}", - "RecommendationDirectedBy": "Directed by {0}", - "RecommendationStarring": "Starring {0}", - "HeaderConfirmRecordingCancellation": "Confirm Recording Cancellation", - "MessageConfirmRecordingCancellation": "Are you sure you wish to cancel this recording?", - "MessageRecordingCancelled": "Recording cancelled.", - "MessageRecordingScheduled": "Recording scheduled.", - "HeaderConfirmSeriesCancellation": "Confirm Series Cancellation", - "MessageConfirmSeriesCancellation": "Are you sure you wish to cancel this series?", - "MessageSeriesCancelled": "Series cancelled.", - "HeaderConfirmRecordingDeletion": "Confirm Recording Deletion", - "MessageRecordingSaved": "Recording saved.", - "OptionWeekend": "Weekends", - "OptionWeekday": "Weekdays", - "MessageConfirmPathSubstitutionDeletion": "Are you sure you wish to delete this path substitution?", - "LiveTvUpdateAvailable": "(Update available)", - "LabelVersionUpToDate": "Up to date!", - "ButtonResetTuner": "Reset tuner", - "HeaderResetTuner": "Reset Tuner", - "MessageConfirmResetTuner": "Are you sure you wish to reset this tuner? Any active players or recordings will be abruptly stopped.", - "ButtonCancelSeries": "Cancel Series", - "HeaderSeriesRecordings": "Series Recordings", - "LabelAnytime": "Any time", - "StatusRecording": "Recording", - "StatusWatching": "Watching", - "StatusRecordingProgram": "Recording {0}", - "StatusWatchingProgram": "Watching {0}", - "HeaderSplitMedia": "Split Media Apart", - "MessageConfirmSplitMedia": "Are you sure you wish to split the media sources into separate items?", - "HeaderError": "Error", - "MessageChromecastConnectionError": "Your Chromecast receiver is unable to connect to your Emby Server. Please check their connections and try again.", - "HeaderLibraryFolders": "Media Folders", - "HeaderFavoriteMovies": "Favorite Movies", + "ButtonUnmute": "Uklju\u010di zvuk", + "ButtonPlaylist": "Lista izvo\u0111enja", + "LabelEnabled": "Omogu\u0107eno", + "LabelDisabled": "Onesposobljeno", + "ButtonMoreInformation": "Vi\u0161e informacija", + "LabelNoUnreadNotifications": "Nema nepro\u010ditanih obavijesti.", + "LabelAllPlaysSentToPlayer": "Sve reprodukcije biti \u0107e poslane na odabrani ure\u0111aj.", + "MessageInvalidUser": "Pogre\u0161no korisni\u010dko ime ili lozinka. Molim, poku\u0161ajte ponovo.", + "HeaderLoginFailure": "Neuspjela prijava", + "RecommendationBecauseYouLike": "Zato \u0161to volite {0}", + "RecommendationBecauseYouWatched": "Zato \u0161to ste gledali {0}", + "RecommendationDirectedBy": "Re\u017eisirao {0}", + "RecommendationStarring": "Glumi {0}", + "HeaderConfirmRecordingCancellation": "Potvrdi otkazivanje snimanja", + "MessageConfirmRecordingCancellation": "Jeste li sigurni da \u017eelite poni\u0161titi ovu snimku?", + "MessageRecordingCancelled": "Snimka je otkazana.", + "MessageRecordingScheduled": "Snimka je zakazana.", + "HeaderConfirmSeriesCancellation": "Potvrdi otkazivanje serije", + "MessageConfirmSeriesCancellation": "Jeste li sigurni da \u017eelite odustati od ove serije?", + "MessageSeriesCancelled": "Serija je otkazana.", + "HeaderConfirmRecordingDeletion": "Potvrdite brisanje snimanja", + "MessageRecordingSaved": "Snimka je spremljena.", + "OptionWeekend": "Vikendi", + "OptionWeekday": "Radni dani", + "MessageConfirmPathSubstitutionDeletion": "Da li ste sigurni da \u017eelite izbrisati ovu zamjenu putanje?", + "LiveTvUpdateAvailable": "(Dostupno a\u017euriranje)", + "LabelVersionUpToDate": "(Aktualan)", + "ButtonResetTuner": "Resetiraj pretra\u017eiva\u010d", + "HeaderResetTuner": "Resetiraj pretra\u017eiva\u010d", + "MessageConfirmResetTuner": "Jeste li sigurni da \u017eelite poni\u0161titi ovaj TV\/radio pretra\u017eiva\u010d? Aktivna reprodukcija ili snimke \u0107e se naglo zaustaviti.", + "ButtonCancelSeries": "Odustani od serije", + "HeaderSeriesRecordings": "Snimke serija", + "LabelAnytime": "Bilo kada", + "StatusRecording": "Snimanje", + "StatusWatching": "Gledanje", + "StatusRecordingProgram": "Snimanje {0}", + "StatusWatchingProgram": "Gledanje {0}", + "HeaderSplitMedia": "Razdvoji medije", + "MessageConfirmSplitMedia": "Jeste li sigurni da \u017eelite podijeliti izvore medija u zasebne stavke?", + "HeaderError": "Gre\u0161ka", + "MessageChromecastConnectionError": "Va\u0161 Chromecast prijemnik ne mo\u017ee se spojiti na Emby Server. Molimo provjerite veze i poku\u0161ajte ponovno.", + "HeaderLibraryFolders": "Mape medija", + "HeaderFavoriteMovies": "Omiljeni filmovi", "HeaderFavoriteShows": "Omiljene emisije", - "HeaderFavoriteEpisodes": "Favorite Episodes", - "HeaderFavoriteGames": "Favorite Games", - "HeaderConfirmProfileDeletion": "Confirm Profile Deletion", - "MessageConfirmProfileDeletion": "Are you sure you wish to delete this profile?", - "HeaderSelectServerCachePath": "Select Server Cache Path", - "HeaderSelectTranscodingPath": "Select Transcoding Temporary Path", - "HeaderSelectMetadataPath": "Select Metadata Path", - "HeaderSelectServerCachePathHelp": "Browse or enter the path to use for server cache files. The folder must be writeable.", - "HeaderSelectTranscodingPathHelp": "Browse or enter the path to use for transcoding temporary files. The folder must be writeable.", - "HeaderSelectMetadataPathHelp": "Browse or enter the path you'd like to store metadata within. The folder must be writeable.", - "HeaderSelectChannelDownloadPath": "Select Channel Download Path", - "HeaderSelectChannelDownloadPathHelp": "Browse or enter the path to use for storing channel cache files. The folder must be writeable.", - "LabelChapterDownloaders": "Chapter downloaders:", - "LabelChapterDownloadersHelp": "Enable and rank your preferred chapter downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.", - "HeaderFavoriteAlbums": "Favorite Albums", - "HeaderLatestChannelMedia": "Latest Channel Items", - "ButtonOrganizeFile": "Organize File", - "ButtonDeleteFile": "Delete File", - "HeaderOrganizeFile": "Organize File", - "HeaderDeleteFile": "Delete File", - "StatusSkipped": "Skipped", - "StatusFailed": "Failed", - "StatusSuccess": "Success", - "MessageFileWillBeDeleted": "The following file will be deleted:", - "MessageSureYouWishToProceed": "Are you sure you wish to proceed?", - "MessageDuplicatesWillBeDeleted": "In addition the following duplicates will be deleted:", - "MessageFollowingFileWillBeMovedFrom": "The following file will be moved from:", - "MessageDestinationTo": "to:", - "HeaderSelectWatchFolder": "Select Watch Folder", - "HeaderSelectWatchFolderHelp": "Browse or enter the path to your watch folder. The folder must be writeable.", - "OrganizePatternResult": "Result: {0}", - "AutoOrganizeError": "Error Organizing File", - "FileOrganizeManually": "Organize File", - "ErrorOrganizingFileWithErrorCode": "There was an error organizing the file. Error code: {0}.", - "HeaderRestart": "Restart", - "HeaderShutdown": "Shutdown", - "MessageConfirmRestart": "Are you sure you wish to restart Emby Server?", - "MessageConfirmShutdown": "Are you sure you wish to shutdown Emby Server?", - "ValueItemCount": "{0} item", - "ValueItemCountPlural": "{0} items", - "NewVersionOfSomethingAvailable": "A new version of {0} is available!", - "VersionXIsAvailableForDownload": "Version {0} is now available for download.", - "LabelVersionNumber": "Version {0}", - "LabelPlayMethodTranscoding": "Transcoding", - "LabelPlayMethodDirectStream": "Direct Streaming", - "LabelPlayMethodDirectPlay": "Direct Playing", + "HeaderFavoriteEpisodes": "Omiljene epizode", + "HeaderFavoriteGames": "Omiljene igre", + "HeaderConfirmProfileDeletion": "Potvrdite brisanje profila", + "MessageConfirmProfileDeletion": "Jeste li sigurni da \u017eelite obrisati ovaj profil?", + "HeaderSelectServerCachePath": "Odaberite putanju predmemorije servera", + "HeaderSelectTranscodingPath": "Odaberite privremenu putanju konvertiranja", + "HeaderSelectMetadataPath": "Odaberite putanju meta-podataka:", + "HeaderSelectServerCachePathHelp": "Pregledajte ili unesite putanju za kori\u0161tenje predmemorijskih datoteka. U mapu se mora mo\u0107i pisati.", + "HeaderSelectTranscodingPathHelp": "Pregledajte ili unesite putanju za kori\u0161tenje konvertiranja privremenih datoteka. U mapu se mora mo\u0107i pisati.", + "HeaderSelectMetadataPathHelp": "Pregledajte ili unesite putanju za pohranu meta-podataka. U mapu se mora mo\u0107i pisati.", + "HeaderSelectChannelDownloadPath": "Odaberite putanju za preuzimanje kanala", + "HeaderSelectChannelDownloadPathHelp": "Pregledajte ili unesite putanju za pohranu predmemorijskih datoteka kanala. U mapu se mora mo\u0107i pisati.", + "LabelChapterDownloaders": "Preuzimatelji poglavlja:", + "LabelChapterDownloadersHelp": "Omogu\u0107ite i rangirajte \u017eeljene preuzimatelje poglavlje u prvenstvenom redu. Manjeg prioriteta preuzimatelja koristit \u0107e se samo za ispunjavanje informacija koje nedostaju.", + "HeaderFavoriteAlbums": "Omiljeni albumi", + "HeaderLatestChannelMedia": "Najnoviji kanali", + "ButtonOrganizeFile": "Oragniziraj datoteku", + "ButtonDeleteFile": "Obri\u0161i datoteku", + "HeaderOrganizeFile": "Oragniziraj datoteku", + "HeaderDeleteFile": "Obri\u0161i datoteku", + "StatusSkipped": "Presko\u010deno", + "StatusFailed": "Neuspje\u0161no", + "StatusSuccess": "Uspjeh", + "MessageFileWillBeDeleted": "Sljede\u0107a datoteka \u0107e biti izbrisana:", + "MessageSureYouWishToProceed": "Jeste li sigurni da \u017eelite nastaviti?", + "MessageDuplicatesWillBeDeleted": "Osim toga sljede\u0107i duplikati \u0107e biti obrisani:", + "MessageFollowingFileWillBeMovedFrom": "Sljede\u0107a datoteka \u0107e biti premje\u0161tena iz:", + "MessageDestinationTo": "na:", + "HeaderSelectWatchFolder": "Odaberi mapu gledanja:", + "HeaderSelectWatchFolderHelp": "Pregledajte ili unesite putanju do va\u0161e mape gledanja. U mapu se mora mo\u0107i pisati.", + "OrganizePatternResult": "Rezultat: {0}", + "AutoOrganizeError": "Gre\u0161ka u organiziranju datoteke", + "FileOrganizeManually": "Oragniziraj datoteku", + "ErrorOrganizingFileWithErrorCode": "Do\u0161lo je do pogre\u0161ke organiziranja datoteke. Kod pogre\u0161ke: {0}.", + "HeaderRestart": "Ponovo pokreni", + "HeaderShutdown": "Ugasi", + "MessageConfirmRestart": "Dali ste sigurni da \u017eelite ponovo pokrenuti Emby Server?", + "MessageConfirmShutdown": "Dali ste sigurni da \u017eelite ugasiti Emby Server?", + "ValueItemCount": "{0} stavka", + "ValueItemCountPlural": "{0} stavaka", + "NewVersionOfSomethingAvailable": "Nova verzija {0} je dostupna", + "VersionXIsAvailableForDownload": "Verzija {0} je dostupna za preuzimanje.", + "LabelVersionNumber": "Verzija {0}", + "LabelPlayMethodTranscoding": "Konvertiranje", + "LabelPlayMethodDirectStream": "Direktno strujanje", + "LabelPlayMethodDirectPlay": "Direktno izvo\u0111enje", "LabelAudioCodec": "Audio: {0}", "LabelVideoCodec": "Video: {0}", - "LabelLocalAccessUrl": "Local access: {0}", - "LabelRemoteAccessUrl": "Remote access: {0}", - "LabelRunningOnPort": "Running on http port {0}.", - "LabelRunningOnPorts": "Running on http port {0}, and https port {1}.", - "HeaderLatestFromChannel": "Latest from {0}", - "HeaderCurrentSubtitles": "Current Subtitles", - "ButtonRemoteControl": "Remote Control", - "HeaderLatestTvRecordings": "Latest Recordings", - "LabelCurrentPath": "Current path:", - "HeaderSelectMediaPath": "Select Media Path", - "HeaderSelectPath": "Select Path", - "ButtonNetwork": "Network", - "MessageDirectoryPickerInstruction": "Network paths can be entered manually in the event the Network button fails to locate your devices. For example, {0} or {1}.", - "MessageDirectoryPickerBSDInstruction": "For BSD, you may need to configure storage within your FreeNAS Jail in order to allow Emby to access it.", - "MessageDirectoryPickerLinuxInstruction": "For Linux on Arch Linux, CentOS, Debian, Fedora, OpenSuse, or Ubuntu, you must grant the Emby system user at least read access to your storage locations.", - "HeaderMenu": "Menu", - "ButtonOpen": "Open", - "ButtonShuffle": "Shuffle", - "ButtonResume": "Resume", - "HeaderAudioTracks": "Audio Tracks", - "HeaderLibraries": "Libraries", - "HeaderVideoQuality": "Video Quality", - "MessageErrorPlayingVideo": "There was an error playing the video.", - "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", - "ButtonDashboard": "Dashboard", - "ButtonReports": "Reports", - "MetadataManager": "Metadata Manager", - "HeaderTime": "Time", - "LabelAddedOnDate": "Added {0}", - "ButtonStart": "Start", - "OptionBlockOthers": "Others", - "OptionBlockTvShows": "TV Shows", + "LabelLocalAccessUrl": "Lokalni pristup: {0}", + "LabelRemoteAccessUrl": "Udaljeni pristup: {0}", + "LabelRunningOnPort": "Izvodi se na http port-u {0}.", + "LabelRunningOnPorts": "Izvodi se na http port-u {0} i na https port-u {1}.", + "HeaderLatestFromChannel": "Zadnje od {0}", + "HeaderCurrentSubtitles": "Trenutni titlovi prijevoda", + "ButtonRemoteControl": "Daljinsko upravljanje", + "HeaderLatestTvRecordings": "Zadnje snimke", + "LabelCurrentPath": "Trenutna putanja:", + "HeaderSelectMediaPath": "Odaberi putanju medija", + "HeaderSelectPath": "Odaberi putanju", + "ButtonNetwork": "Mre\u017ea", + "MessageDirectoryPickerInstruction": "Mre\u017ene putanje mogu se unijeti ru\u010dno u slu\u010daju da gumb Mre\u017ee ne uspije locirati va\u0161e ure\u0111aje. Na primjer, {0} ili {1}.", + "MessageDirectoryPickerBSDInstruction": "Za BSD mo\u017eda \u0107ete morati podesiti pohranu unutar va\u0161ega FreeNAS kako bi se omogu\u0107ilo Emby-u pristup.", + "MessageDirectoryPickerLinuxInstruction": "Za Linux na Arch Linux, CentOS, Debian, Fedora, OpenSuse ili Ubuntu morate dati korisniku Emby sistema barem pristup \u010ditanja va\u0161im lokacijama za skladi\u0161tenje.", + "HeaderMenu": "Izbornik", + "ButtonOpen": "Otvori", + "ButtonShuffle": "Mije\u0161aj", + "ButtonResume": "Nastavi", + "HeaderAudioTracks": "Audio pjesme", + "HeaderLibraries": "Biblioteke", + "HeaderVideoQuality": "Kvaliteta videa", + "MessageErrorPlayingVideo": "Do\u0161lo je do pogre\u0161ke reproduciranja videa.", + "MessageEnsureOpenTuner": "Provjerite postoji li otvoren TV\/radio pretra\u017eiva\u010d na raspolaganju.", + "ButtonDashboard": "Nadzorna plo\u010da", + "ButtonReports": "Izvje\u0161taji", + "MetadataManager": "Upravitelj meta-podacima", + "HeaderTime": "Vrijeme", + "LabelAddedOnDate": "Dodano {0}", + "ButtonStart": "Po\u010detak", + "OptionBlockOthers": "Ostali", + "OptionBlockTvShows": "TV emisije", "OptionBlockTrailers": "Kratki filmovi", - "OptionBlockMusic": "Music", - "OptionBlockMovies": "Movies", - "OptionBlockBooks": "Books", - "OptionBlockGames": "Games", - "OptionBlockLiveTvPrograms": "Live TV Programs", - "OptionBlockLiveTvChannels": "Live TV Channels", - "OptionBlockChannelContent": "Internet Channel Content", - "ButtonRevoke": "Revoke", - "MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Emby Server will be abruptly terminated.", - "HeaderConfirmRevokeApiKey": "Revoke Api Key", - "ValueContainer": "Container: {0}", - "ValueAudioCodec": "Audio Codec: {0}", - "ValueVideoCodec": "Video Codec: {0}", - "ValueCodec": "Codec: {0}", - "ValueConditions": "Conditions: {0}", - "LabelAll": "All", - "HeaderDeleteImage": "Delete Image", - "MessageFileNotFound": "File not found.", - "MessageFileReadError": "An error occurred reading this file.", - "ButtonNextPage": "Next Page", - "ButtonPreviousPage": "Previous Page", - "ButtonMoveLeft": "Move left", - "ButtonMoveRight": "Move right", - "ButtonBrowseOnlineImages": "Browse online images", - "HeaderDeleteItem": "Delete Item", - "ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?", - "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", - "MessageValueNotCorrect": "The value entered is not correct. Please try again.", - "MessageItemSaved": "Item saved.", - "MessagePleaseAcceptTermsOfServiceBeforeContinuing": "Please accept the terms of service before continuing.", + "OptionBlockMusic": "Glazba", + "OptionBlockMovies": "Filmovi", + "OptionBlockBooks": "Knjige", + "OptionBlockGames": "Igre", + "OptionBlockLiveTvPrograms": "TV programi u\u017eivo", + "OptionBlockLiveTvChannels": "TV kanali u\u017eivo", + "OptionBlockChannelContent": "Sadr\u017eaj Internet kanala", + "ButtonRevoke": "Opozvati", + "MessageConfirmRevokeApiKey": "Jeste li sigurni da \u017eelite poni\u0161titi ovaj API klju\u010d? Veza aplikacije s Emby Server-om \u0107e se naglo prekinuti.", + "HeaderConfirmRevokeApiKey": "Opozovi Api klju\u010d", + "ValueContainer": "Spremnik: {0}", + "ValueAudioCodec": "Audio koder: {0}", + "ValueVideoCodec": "Video koder: {0}", + "ValueCodec": "Koder: {0}", + "ValueConditions": "Uvjeti: {0}", + "LabelAll": "Sve", + "HeaderDeleteImage": "Izbri\u0161i sliku", + "MessageFileNotFound": "Datoteka nije prona\u0111ena.", + "MessageFileReadError": "Prilikom u\u010ditavanja datoteke desila se gre\u0161ka", + "ButtonNextPage": "Sljede\u0107a stranica", + "ButtonPreviousPage": "Prethodna stranica", + "ButtonMoveLeft": "Pomakni ulijevo", + "ButtonMoveRight": "Pomakni udesno", + "ButtonBrowseOnlineImages": "Pregledaj online slike", + "HeaderDeleteItem": "Izbri\u0161i stavku", + "ConfirmDeleteItem": "Brisanjem ove stavke \u0107e je izbrisati iz oba datote\u010dnog sustava i medijskoj biblioteci. Jeste li sigurni da \u017eelite nastaviti?", + "ConfirmDeleteItems": "Brisanjem ovih stavaka \u0107e ih izbrisati iz oba datote\u010dnog sustava i medijskoj biblioteci. Jeste li sigurni da \u017eelite nastaviti?", + "MessageValueNotCorrect": "Unesena vrijednost nije ispravna. Molim poku\u0161ajte ponovno.", + "MessageItemSaved": "Stavka je snimljena.", + "MessagePleaseAcceptTermsOfServiceBeforeContinuing": "Molimo prihvatite uvjete kori\u0161tenja prije nego \u0161to nastavite.", "OptionOff": "Off", "OptionOn": "On", - "ButtonUninstall": "Uninstall", - "HeaderEnabledFields": "Enabled Fields", - "HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.", - "HeaderLiveTV": "Live TV", - "MissingPrimaryImage": "Missing primary image.", - "MissingBackdropImage": "Missing backdrop image.", - "MissingLogoImage": "Missing logo image.", - "MissingEpisode": "Missing episode.", - "OptionScreenshots": "Screenshots", - "OptionBackdrops": "Backdrops", - "OptionImages": "Images", - "OptionKeywords": "Keywords", - "OptionTags": "Tags", - "OptionStudios": "Studios", - "OptionName": "Name", - "OptionOverview": "Overview", - "OptionGenres": "Genres", - "OptionPeople": "People", - "OptionProductionLocations": "Production Locations", - "OptionBirthLocation": "Birth Location", - "LabelAllChannels": "All channels", - "AttributeNew": "New", - "AttributePremiere": "Premiere", - "AttributeLive": "Live", - "HeaderChangeFolderType": "Change Content Type", - "HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the library with the new type.", - "HeaderAlert": "Alert", - "MessagePleaseRestart": "Please restart to finish updating.", - "ButtonHide": "Hide", - "MessageSettingsSaved": "Settings saved.", - "TabLibrary": "Library", + "ButtonUninstall": "Ukloni", + "HeaderEnabledFields": "Omogu\u0107i polja", + "HeaderEnabledFieldsHelp": "Poni\u0161ti polje za zaklju\u010davanje i sprije\u010di njihove podatke od toga da budu promijenjeni.", + "HeaderLiveTV": "TV u\u017eivo", + "MissingPrimaryImage": "Nedostaje glavna slika.", + "MissingBackdropImage": "Nedostaje pozadinska slika.", + "MissingLogoImage": "Nedostaje slika logo-a.", + "MissingEpisode": "Nedostaje epizoda", + "OptionScreenshots": "Isje\u010dci slika", + "OptionBackdrops": "Pozadine", + "OptionImages": "Slike", + "OptionKeywords": "Klju\u010dne rije\u010di", + "OptionTags": "Oznake", + "OptionStudios": "Studija", + "OptionName": "Ime", + "OptionOverview": "Pregled", + "OptionGenres": "\u017danrovi", + "OptionPeople": "Ljudi", + "OptionProductionLocations": "Lokacije proizvodnje", + "OptionBirthLocation": "Lokacije ro\u0111enja", + "LabelAllChannels": "Svi kanali", + "AttributeNew": "Novo", + "AttributePremiere": "Premijera", + "AttributeLive": "U\u017eivo", + "HeaderChangeFolderType": "Promijeni tip sadr\u017eaja", + "HeaderChangeFolderTypeHelp": "Za promjenu tipa, uklonite i ponovno izgraditi biblioteku s novim tipom.", + "HeaderAlert": "Uzbuna", + "MessagePleaseRestart": "Molimo ponovo pokrenite kako bi se zavr\u0161ila a\u017euriranja.", + "ButtonHide": "Sakrij", + "MessageSettingsSaved": "Postavke snimljene", + "TabLibrary": "Biblioteka", "TabDLNA": "DLNA", - "TabLiveTV": "Live TV", - "TabAutoOrganize": "Auto-Organize", - "TabPlugins": "Plugins", - "TabHelp": "Help", - "ButtonFullscreen": "Fullscreen", - "ButtonAudioTracks": "Audio Tracks", - "ButtonQuality": "Quality", - "HeaderNotifications": "Notifications", - "HeaderSelectPlayer": "Select Player", - "MessageInternetExplorerWebm": "For best results with Internet Explorer please install the WebM playback plugin.", - "HeaderVideoError": "Video Error", - "ButtonViewSeriesRecording": "View series recording", + "TabLiveTV": "TV u\u017eivo", + "TabAutoOrganize": "Auto-organiziraj", + "TabPlugins": "Dodaci", + "TabHelp": "Pomo\u0107", + "ButtonFullscreen": "Puni zaslon", + "ButtonAudioTracks": "Audio pjesme", + "ButtonQuality": "Kvaliteta", + "HeaderNotifications": "Obavijesti", + "HeaderSelectPlayer": "Odaberi pokreta\u010d", + "MessageInternetExplorerWebm": "Za najbolje rezultate s Internet Explorer-om instalirajte dodatak WebM reprodukcije.", + "HeaderVideoError": "Video gre\u0161ka", + "ButtonViewSeriesRecording": "Pogledaj snimke serija", "HeaderSpecials": "Specials", "HeaderTrailers": "Kratki filmovi", "HeaderResolution": "Resolution", @@ -1681,91 +1680,91 @@ "HeaderSeasonNumber": "Season number", "HeaderNetwork": "Network", "HeaderYear": "Year:", - "HeaderGameSystem": "Game system", + "HeaderGameSystem": "Sistem igre", "HeaderEmbeddedImage": "Embedded image", "HeaderTrack": "Track", "OptionCollections": "Kolekcije", - "OptionSeries": "Series", - "OptionSeasons": "Seasons", - "OptionGames": "Games", - "OptionGameSystems": "Game systems", - "OptionMusicArtists": "Music artists", - "OptionMusicAlbums": "Music albums", - "OptionMusicVideos": "Music videos", - "OptionSongs": "Songs", - "OptionHomeVideos": "Home videos & photos", - "OptionBooks": "Books", - "ButtonUp": "Up", - "ButtonDown": "Down", - "LabelMetadataReaders": "Metadata readers:", - "LabelMetadataReadersHelp": "Rank your preferred local metadata sources in order of priority. The first file found will be read.", - "LabelMetadataDownloaders": "Metadata downloaders:", - "LabelMetadataDownloadersHelp": "Enable and rank your preferred metadata downloaders in order of priority. Lower priority downloaders will only be used to fill in missing information.", - "LabelMetadataSavers": "Metadata savers:", - "LabelMetadataSaversHelp": "Choose the file formats to save your metadata to.", - "LabelImageFetchers": "Image fetchers:", - "LabelImageFetchersHelp": "Enable and rank your preferred image fetchers in order of priority.", + "OptionSeries": "Serije", + "OptionSeasons": "Sezone", + "OptionGames": "Igre", + "OptionGameSystems": "Sistemi igrica", + "OptionMusicArtists": "Glazbeni izvo\u0111a\u010di", + "OptionMusicAlbums": "Glazbeni albumi", + "OptionMusicVideos": "Glazbeni spotovi", + "OptionSongs": "Pjesme", + "OptionHomeVideos": "Ku\u0107ni videi i slike", + "OptionBooks": "Knjige", + "ButtonUp": "Gore", + "ButtonDown": "Dolje", + "LabelMetadataReaders": "\u010cita\u010di meta-podataka", + "LabelMetadataReadersHelp": "Poredajte \u017eeljene lokalne izvore meta-podataka po redu prioriteta. Prva na\u0111ena datoteka biti \u0107e \u010ditana.", + "LabelMetadataDownloaders": "Preuzima\u010di meta-podataka:", + "LabelMetadataDownloadersHelp": "Omogu\u0107ite i poredajte \u017eeljene preuzimatelje meta-podataka po redu prioriteta. Manjeg prioriteta preuzimatelji koristit \u0107e se samo za ispunjavanje nedostaju\u0107ih informacija.", + "LabelMetadataSavers": "Snima\u010di meta-podataka:", + "LabelMetadataSaversHelp": "Odaberite formate datoteka za spremanje meta-podataka.", + "LabelImageFetchers": "Dohvata\u010di slika:", + "LabelImageFetchersHelp": "Omogu\u0107ite i poredajte \u017eeljene dohvata\u010de slika po redu prioriteta.", "LabelDynamicExternalId": "{0} Id:", - "PersonTypePerson": "Person", - "OptionSortName": "Sort name", - "LabelDateOfBirth": "Date of birth:", - "LabelDeathDate": "Death date:", - "HeaderRemoveMediaLocation": "Remove Media Location", - "MessageConfirmRemoveMediaLocation": "Are you sure you wish to remove this location?", - "LabelNewName": "New name:", - "HeaderAddMediaFolder": "Add Media Folder", - "HeaderAddMediaFolderHelp": "Name (Movies, Music, TV, etc):", - "HeaderRemoveMediaFolder": "Remove Media Folder", - "MessageTheFollowingLocationWillBeRemovedFromLibrary": "The following media locations will be removed from your Emby library:", - "MessageAreYouSureYouWishToRemoveMediaFolder": "Are you sure you wish to remove this media folder?", - "ButtonRename": "Rename", - "ButtonChangeContentType": "Change content type", - "HeaderMediaLocations": "Media Locations", - "LabelContentTypeValue": "Content type: {0}", - "LabelPathSubstitutionHelp": "Optional: Path substitution can map server paths to network shares that Emby apps can access for direct playback.", - "FolderTypeUnset": "Unset (mixed content)", - "BirthPlaceValue": "Birth place: {0}", - "DeathDateValue": "Died: {0}", - "BirthDateValue": "Born: {0}", - "HeaderLatestReviews": "Latest Reviews", - "HeaderPluginInstallation": "Plugin Installation", - "MessageAlreadyInstalled": "This version is already installed.", - "ValueReviewCount": "{0} Reviews", - "MessageYouHaveVersionInstalled": "You currently have version {0} installed.", - "MessageTrialExpired": "The trial period for this feature has expired", - "MessageTrialWillExpireIn": "The trial period for this feature will expire in {0} day(s)", - "MessageInstallPluginFromApp": "This plugin must be installed from with in the app you intend to use it in.", - "ValuePriceUSD": "Price: {0} (USD)", - "MessageFeatureIncludedWithSupporter": "You are registered for this feature, and will be able to continue using it with an active Emby Premiere subscription.", - "HeaderEmbyAccountAdded": "Emby Account Added", - "MessageEmbyAccountAdded": "The Emby account has been added to this user.", - "MessagePendingEmbyAccountAdded": "The Emby account has been added to this user. An email will be sent to the owner of the account. The invitation will need to be confirmed by clicking a link within the email.", - "HeaderEmbyAccountRemoved": "Emby Account Removed", - "MessageEmbyAccontRemoved": "The Emby account has been removed from this user.", - "TooltipLinkedToEmbyConnect": "Linked to Emby Connect", - "HeaderUnrated": "Unrated", - "ValueDiscNumber": "Disc {0}", - "HeaderUnknownDate": "Unknown Date", - "HeaderUnknownYear": "Unknown Year", - "ValueMinutes": "{0} min", - "HeaderSelectExternalPlayer": "Select External Player", - "HeaderExternalPlayerPlayback": "External Player Playback", - "ButtonImDone": "I'm Done", - "OptionWatched": "Watched", - "OptionUnwatched": "Unwatched", - "ExternalPlayerPlaystateOptionsHelp": "Specify how you would like to resume playing this video next time.", - "LabelMarkAs": "Mark as:", - "OptionInProgress": "In-Progress", - "LabelResumePoint": "Resume point:", - "ValueOneMovie": "1 movie", - "ValueMovieCount": "{0} movies", - "ValueOneTrailer": "1 trailer", + "PersonTypePerson": "Osoba", + "OptionSortName": "Ime vrste", + "LabelDateOfBirth": "Datum ro\u0111enja:", + "LabelDeathDate": "Datum smrti:", + "HeaderRemoveMediaLocation": "Ukloni lokacije medija", + "MessageConfirmRemoveMediaLocation": "Jeste li sigurni da \u017eelite ukloniti ovu lokaciju?", + "LabelNewName": "Novo ime:", + "HeaderAddMediaFolder": "Dodaj mapu sa medijem", + "HeaderAddMediaFolderHelp": "Naziv (filmovi, glazba, TV, itd.):", + "HeaderRemoveMediaFolder": "Ukloni mape medija", + "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Sljede\u0107e lokacije medija biti \u0107e uklonjene iz va\u0161e Emby biblioteke:", + "MessageAreYouSureYouWishToRemoveMediaFolder": "Jeste li sigurni da \u017eelite ukloniti ovu medijsku mapu?", + "ButtonRename": "Preimenuj", + "ButtonChangeContentType": "Promijeni tip sadr\u017eaja", + "HeaderMediaLocations": "Lokacije medija", + "LabelContentTypeValue": "Tip sadr\u017eaja: {0}", + "LabelPathSubstitutionHelp": "Neobvezno: zamjenska putanja mo\u017ee mapirati putanje servera na mre\u017ena dijeljenja kojim Emby aplikacije mogu pristupiti za izravnu reprodukciju.", + "FolderTypeUnset": "Isklju\u010di (mije\u0161ani sadr\u017eaj)", + "BirthPlaceValue": "Mjesto ro\u0111enja: {0}", + "DeathDateValue": "Umro: {0}", + "BirthDateValue": "Ro\u0111en: {0}", + "HeaderLatestReviews": "Zadnje recenzije", + "HeaderPluginInstallation": "Instalacija dodataka", + "MessageAlreadyInstalled": "Ova verzija je ve\u0107 instalirana.", + "ValueReviewCount": "{0} recenzije", + "MessageYouHaveVersionInstalled": "Trenutno imate instaliranu {0} verziju.", + "MessageTrialExpired": "Probno razdoblje za ovu zna\u010dajku je isteklo", + "MessageTrialWillExpireIn": "Probno razdoblje za ovu zna\u010dajku isti\u010de za {0} dan(a)", + "MessageInstallPluginFromApp": "Ovaj dodatak mora biti instaliran unutar aplikacije u kojoj ga namjeravate koristiti.", + "ValuePriceUSD": "Cijena: {0} (USD)", + "MessageFeatureIncludedWithSupporter": "Prijavljeni ste za ovu zna\u010dajku koju \u0107ete mo\u0107i nastaviti koristiti s aktivnom pretplatom Emby Premijere.", + "HeaderEmbyAccountAdded": "Emby ra\u010dun je dodan", + "MessageEmbyAccountAdded": "Emby ra\u010dun je dodan ovom korisniku.", + "MessagePendingEmbyAccountAdded": "Emby ra\u010dun je dodan ovom korisniku. E-mail \u0107e biti poslan vlasniku ra\u010duna. Poziv \u0107e morati potvrditi klikom na vezu u poruci e-po\u0161te.", + "HeaderEmbyAccountRemoved": "Emby ra\u010dun je uklonjen", + "MessageEmbyAccontRemoved": "Emby ra\u010dun je uklonjen ovom korisniku.", + "TooltipLinkedToEmbyConnect": "Spojeni na \"Emby Connect\"", + "HeaderUnrated": "Neocijenjeno", + "ValueDiscNumber": "Disk {0}", + "HeaderUnknownDate": "Nepoznati datum", + "HeaderUnknownYear": "Nepoznata godina", + "ValueMinutes": "{0} minuta", + "HeaderSelectExternalPlayer": "Odaberi vanjski pokreta\u010d", + "HeaderExternalPlayerPlayback": "Reprodukcija na vanjski pokreta\u010d", + "ButtonImDone": "Gotov sam", + "OptionWatched": "Pogledano", + "OptionUnwatched": "Nepogledano", + "ExternalPlayerPlaystateOptionsHelp": "Odredite kako \u017eelite nastaviti reproducirati ovaj video sljede\u0107i put.", + "LabelMarkAs": "Ozna\u010di kao:", + "OptionInProgress": "U toku", + "LabelResumePoint": "To\u010dka nastavka:", + "ValueOneMovie": "1 film", + "ValueMovieCount": "{0} filmova", + "ValueOneTrailer": "1 kratki video", "ValueTrailerCount": "{0} kratki filmovi", - "ValueOneSeries": "1 series", - "ValueSeriesCount": "{0} series", - "ValueOneEpisode": "1 episode", - "ValueEpisodeCount": "{0} episodes", - "ValueOneGame": "1 game", + "ValueOneSeries": "1 serija", + "ValueSeriesCount": "{0} serija", + "ValueOneEpisode": "1 epizoda", + "ValueEpisodeCount": "{0} epizoda", + "ValueOneGame": "1 igra", "ValueGameCount": "{0} games", "ValueOneAlbum": "1 album", "ValueAlbumCount": "{0} albums", @@ -1778,7 +1777,7 @@ "HeaderMissing": "Missing", "ButtonWebsite": "Website", "ValueSeriesYearToPresent": "{0}-Present", - "ValueAwards": "Awards: {0}", + "ValueAwards": "Nagrade: {0}", "ValueBudget": "Budget: {0}", "ValueRevenue": "Revenue: {0}", "ValuePremiered": "Premiered {0}", @@ -1788,7 +1787,7 @@ "ValueStatus": "Status: {0}", "LabelLimit": "Limit:", "ValueLinks": "Links: {0}", - "HeaderCastAndCrew": "Cast & Crew", + "HeaderCastAndCrew": "Glumci i ekipa", "ValueArtist": "Artist: {0}", "ValueArtists": "Artists: {0}", "MediaInfoCameraMake": "Camera make", @@ -1803,7 +1802,7 @@ "MediaInfoLongitude": "Longitude", "MediaInfoShutterSpeed": "Shutter speed", "MediaInfoSoftware": "Software", - "HeaderIfYouLikeCheckTheseOut": "If you like {0}, check these out...", + "HeaderIfYouLikeCheckTheseOut": "Ako vam se svi\u0111a {0}, provjerite ove...", "HeaderMovies": "Movies", "HeaderAlbums": "Albums", "HeaderGames": "Games", @@ -1820,59 +1819,59 @@ "MediaInfoPath": "Path", "MediaInfoFile": "File", "MediaInfoFormat": "Format", - "MediaInfoContainer": "Container", - "MediaInfoDefault": "Default", - "MediaInfoForced": "Forced", - "MediaInfoExternal": "External", - "MediaInfoTimestamp": "Timestamp", - "MediaInfoPixelFormat": "Pixel format", - "MediaInfoBitDepth": "Bit depth", - "MediaInfoSampleRate": "Sample rate", - "MediaInfoBitrate": "Bitrate", - "MediaInfoChannels": "Channels", - "MediaInfoLayout": "Layout", - "MediaInfoLanguage": "Language", - "MediaInfoCodec": "Codec", - "MediaInfoCodecTag": "Codec tag", - "MediaInfoProfile": "Profile", - "MediaInfoLevel": "Level", - "MediaInfoAspectRatio": "Aspect ratio", - "MediaInfoResolution": "Resolution", - "MediaInfoAnamorphic": "Anamorphic", - "MediaInfoInterlaced": "Interlaced", - "MediaInfoFramerate": "Framerate", + "MediaInfoContainer": "Spremnik", + "MediaInfoDefault": "Zadano", + "MediaInfoForced": "Prisilno", + "MediaInfoExternal": "Vanjski", + "MediaInfoTimestamp": "Vremenski \u017eig", + "MediaInfoPixelFormat": "Format piksela", + "MediaInfoBitDepth": "Dubina bita", + "MediaInfoSampleRate": "Uzorak brzine", + "MediaInfoBitrate": "Brzina prijenosa", + "MediaInfoChannels": "Kanali", + "MediaInfoLayout": "Raspored", + "MediaInfoLanguage": "Jezik", + "MediaInfoCodec": "Koder", + "MediaInfoCodecTag": "Oznaka kodera", + "MediaInfoProfile": "Profil", + "MediaInfoLevel": "Nivo", + "MediaInfoAspectRatio": "Omjer gledanja", + "MediaInfoResolution": "Rezolucija", + "MediaInfoAnamorphic": "Anamorfno", + "MediaInfoInterlaced": "Prepleteno", + "MediaInfoFramerate": "Okvirna brzina", "MediaInfoStreamTypeAudio": "Audio", - "MediaInfoStreamTypeData": "Data", + "MediaInfoStreamTypeData": "Podatci", "MediaInfoStreamTypeVideo": "Video", - "MediaInfoStreamTypeSubtitle": "Subtitle", - "MediaInfoStreamTypeEmbeddedImage": "Embedded Image", - "MediaInfoRefFrames": "Ref frames", - "TabExpert": "Expert", - "HeaderSelectCustomIntrosPath": "Select Custom Intros Path", - "HeaderRateAndReview": "Rate and Review", - "HeaderThankYou": "Thank You", - "MessageThankYouForYourReview": "Thank you for your review.", - "LabelYourRating": "Your rating:", - "LabelFullReview": "Full review:", - "LabelShortRatingDescription": "Short rating summary:", - "OptionIRecommendThisItem": "I recommend this item", - "ReleaseYearValue": "Release year: {0}", - "OriginalAirDateValue": "Original air date: {0}", - "WebClientTourContent": "View your recently added media, next episodes, and more. The green circles indicate how many unplayed items you have.", - "WebClientTourMovies": "Play movies, trailers and more from any device with a web browser", - "WebClientTourMouseOver": "Hold the mouse over any poster for quick access to important information", - "WebClientTourTapHold": "Tap and hold or right click any poster for a context menu", - "WebClientTourMetadataManager": "Click edit to open the metadata manager", - "WebClientTourPlaylists": "Easily create playlists and instant mixes, and play them on any device", - "WebClientTourCollections": "Create movie collections to group box sets together", - "WebClientTourUserPreferences1": "User preferences allow you to customize the way your library is presented in all of your Emby apps", - "WebClientTourUserPreferences2": "Configure your audio and subtitle language settings once, for every Emby app", - "WebClientTourUserPreferences3": "Design the web client home page to your liking", - "WebClientTourUserPreferences4": "Configure backdrops, theme songs and external players", - "WebClientTourMobile1": "The web client works great on smartphones and tablets...", - "WebClientTourMobile2": "and easily controls other devices and Emby apps", - "WebClientTourMySync": "Sync your personal media to your devices for offline viewing.", - "MessageEnjoyYourStay": "Enjoy your stay", + "MediaInfoStreamTypeSubtitle": "Titlovi", + "MediaInfoStreamTypeEmbeddedImage": "Ugra\u0111ena slika", + "MediaInfoRefFrames": "Ref okviri", + "TabExpert": "Stru\u010dnjak", + "HeaderSelectCustomIntrosPath": "Odaberi prilago\u0111eni put predfilmova:", + "HeaderRateAndReview": "Ocijeni i recenziraj", + "HeaderThankYou": "Hvala", + "MessageThankYouForYourReview": "Hvala na recenziji", + "LabelYourRating": "Va\u0161a ocjena:", + "LabelFullReview": "Puna recenzija:", + "LabelShortRatingDescription": "Kratki sa\u017eetak ocjena:", + "OptionIRecommendThisItem": "Preporu\u010dam ovu stavku", + "ReleaseYearValue": "Godina izdanja: {0}", + "OriginalAirDateValue": "Originalni datum prikazivanja: {0}", + "WebClientTourContent": "Pogledaj svoje nedavno dodane medije, sljede\u0107e epizode i jo\u0161 toga. Zeleni krugovi pokazuju koliko imate nereproduciranih stavaka.", + "WebClientTourMovies": "Pokre\u0107ite filmove, kratke filmove i vi\u0161e iz bilo kojeg ure\u0111aja s web-preglednikom", + "WebClientTourMouseOver": "Dr\u017eite mi\u0161a preko bilo kojega plakata za brzi pristup va\u017enim informacijama", + "WebClientTourTapHold": "Dodirnite i dr\u017eite ili desni klik na bilo koji plakat za padaju\u010di izbornik", + "WebClientTourMetadataManager": "Kliknite \"uredi\" da biste otvorili upravitelj meta-podataka", + "WebClientTourPlaylists": "Jednostavno stvaranje lista i instant mikseva te ih pokre\u010dite na bilo kojem ure\u0111aju", + "WebClientTourCollections": "Napravi filmske kolkecije u skupni okvir postavlja zajedno", + "WebClientTourUserPreferences1": "Korisni\u010dke postavke omogu\u0107uju vam da prilagodite na\u010din na koji je va\u0161a biblioteka predstavljena u svim va\u0161im Emby aplikacijama", + "WebClientTourUserPreferences2": "Podesite svoj zvuk i titl jezi\u010dne postavke jednom za svaku Emby aplikaciju", + "WebClientTourUserPreferences3": "Dizajnirajte po\u010detnu stranicu web klijenta va\u0161im \u017eeljama", + "WebClientTourUserPreferences4": "Postavke pozadine, tema pjesama i vanjskih pokreta\u010da", + "WebClientTourMobile1": "Web klijent radi super i na pametnim telefonima i tabletima...", + "WebClientTourMobile2": "i lako kontrolira druge ure\u0111aje i Emby aplikacije", + "WebClientTourMySync": "Sinkronizirajte svoje osobne medije za svoje ure\u0111aje za izvanmre\u017eno pregledavanje.", + "MessageEnjoyYourStay": "U\u017eivajte u boravku", "DashboardTourDashboard": "The server dashboard allows you to monitor your server and your users. You'll always know who is doing what and where they are.", "DashboardTourHelp": "In-app help provides easy buttons to open wiki pages relating to the on-screen content.", "DashboardTourUsers": "Easily create user accounts for your friends and family, each with their own permissions, library access, parental controls and more.", @@ -1890,7 +1889,7 @@ "DeviceLastUsedByUserName": "Last used by {0}", "HeaderDeleteDevice": "Delete Device", "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.", - "LabelEnableCameraUploadFor": "Enable camera upload for:", + "LabelEnableCameraUploadFor": "Omogu\u0107i preuzimanje slika kamera za:", "HeaderSelectUploadPath": "Select Upload Path", "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Emby.", "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time.", @@ -2008,7 +2007,7 @@ "AlreadyPaidHelp1": "If you already paid to install an older version of Media Browser for Android, you don't need to pay again in order to activate this app. Click OK to send us an email at {0} and we'll get it activated for you.", "AlreadyPaidHelp2": "Got Emby Premiere? Just cancel this dialog, setup Emby Premiere in your Emby Server Dashboard under Help -> Emby Premiere, and it will be unlocked automatically.", "ButtonNowPlaying": "Now Playing", - "HeaderLatestMovies": "Zadnji Filmovi", + "HeaderLatestMovies": "Najnoviji filmovi", "EmbyPremiereMonthly": "Emby Premiere Monthly", "EmbyPremiereMonthlyWithPrice": "Emby Premiere Monthly {0}", "HeaderEmailAddress": "E-Mail Address", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Omiljene pjesme", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2073,8 +2073,8 @@ "MetadataSettingChangeHelp": "Changing metadata settings will affect new content that is added going forward. To refresh existing content, open the detail screen and click the refresh button, or perform bulk refreshes using the metadata manager.", "OptionConvertRecordingPreserveAudio": "Preserve original audio when converting recordings (when possible)", "OptionConvertRecordingPreserveAudioHelp": "This will provide better audio but may require transcoding during playback on some devices.", - "CreateCollectionHelp": "Collections allow you to create personalized groupings of movies and other library content.", - "AddItemToCollectionHelp": "Add items to collections by searching for them and using their right-click or tap menus to add them to a collection.", + "CreateCollectionHelp": "Kolekcije vam omogu\u0107iti da napravite personalizirane grupe filmova i ostale biblioteke.", + "AddItemToCollectionHelp": "Pretra\u017eivanjem stavaka i kori\u0161tenjem desnog klika ili izbornika dodavanja u kolekciju mo\u017eete ih dodati u kolekciju.", "HeaderHealthMonitor": "Health Monitor", "HealthMonitorNoAlerts": "There are no active alerts.", "RecordingPathChangeMessage": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.", @@ -2106,7 +2106,7 @@ "OptionUseMyCustomVersion": "Use a custom version", "FFmpegSavePathNotFound": "We're unable to locate FFmpeg using the path you've entered. FFprobe is also required and must exist in the same folder. These components are normally bundled together in the same download. Please check the path and try again.", "XmlTvPremiere": "By default, Emby will import {0} hours of guide data. Importing unlimited data requires an active Emby Premiere subscription.", - "MoreFromValue": "More from {0}", + "MoreFromValue": "Vi\u0161e od {0}", "OptionSaveMetadataAsHiddenHelp": "Changing this will apply to new metadata saved going forward. Existing metadata files will be updated the next time they are saved by Emby Server.", "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", @@ -2115,7 +2115,7 @@ "RemoveDownload": "Remove download", "SyncToOtherDevices": "Sync to other devices", "ManageOfflineDownloads": "Manage offline downloads", - "MessageDownloadScheduled": "Download scheduled", + "MessageDownloadScheduled": "Zakazana preuzimanja", "RememberMe": "Remember me", "HeaderOfflineSync": "Offline Sync", "LabelMaxAudioFileBitrate": "Max audio file bitrate:", @@ -2125,9 +2125,9 @@ "HowToConnectFromEmbyApps": "How to Connect from Emby apps", "MessageFolderRipPlaybackExperimental": "Support for playback of folder rips and ISOs in this app is only expirimental. For best results, try an Emby app that supports these formats natively, or use plain video files.", "OptionExtractChapterImage": "Enable chapter image extraction", - "Downloads": "Downloads", + "Downloads": "Preuzimanja", "LabelEnableDebugLogging": "Omogu\u0107i logiranje gre\u0161aka", - "OptionEnableExternalContentInSuggestions": "Enable external content in suggestions", + "OptionEnableExternalContentInSuggestions": "Omogu\u0107i vanjske sadr\u017eaje u prijedlozima", "OptionEnableExternalContentInSuggestionsHelp": "Allow internet trailers and live tv programs to be included within suggested content.", "LabelH264EncodingPreset": "H264 encoding preset:", "H264EncodingPresetHelp": "Choose a faster value to improve performance, or a slower value to improve quality.", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/hu.json b/dashboard-ui/strings/hu.json index a1c0a58d62..1293280aa4 100644 --- a/dashboard-ui/strings/hu.json +++ b/dashboard-ui/strings/hu.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "V\u00e1lassz Audi\u00f3t", "HeaderSelectSubtitles": "V\u00e1lassz Feliratot", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Kedvenc M\u0171v\u00e9szek", "HeaderFavoriteSongs": "Kedvenc Dalok", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/id.json b/dashboard-ui/strings/id.json index 9c88ed655b..623b3bde51 100644 --- a/dashboard-ui/strings/id.json +++ b/dashboard-ui/strings/id.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/it.json b/dashboard-ui/strings/it.json index 38e22f684a..acf6ab7354 100644 --- a/dashboard-ui/strings/it.json +++ b/dashboard-ui/strings/it.json @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "Errore di riproduzione", "MessagePlaybackErrorNotAllowed": "Al momento non sei autorizzato a riprodurre questo contenuto. Per favore contatta l'amministratore del sistema per ulteriori dettagli", "MessagePlaybackErrorNoCompatibleStream": "Nessuna trasmissione compatibile \u00e8 al momento disponibile. Per favore riprova in seguito o contatta il tuo Amministratore di sistema per chiarimenti", - "MessagePlaybackErrorRateLimitExceeded": "La tua quota di riproduzione \u00e8 stata raggiunta. Per favore contatta l'amministratore del sistema per ulteriori dettagli", "MessagePlaybackErrorPlaceHolder": "Il contenuto scelto non pu\u00f2 essere riprodotto su questo dispositivo", "HeaderSelectAudio": "Seleziona audio", "HeaderSelectSubtitles": "Seleziona sottotitoli", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "C'\u00e8 stato un errore nella rimozione dell'account Emby Connect. Per favore assicurati di avere una connessione a internet attiva e riprova.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/kk.json b/dashboard-ui/strings/kk.json index 7e12aed7dc..95e8903437 100644 --- a/dashboard-ui/strings/kk.json +++ b/dashboard-ui/strings/kk.json @@ -27,7 +27,7 @@ "OptionIAcceptTermsOfService": "\u049a\u044b\u0437\u043c\u0435\u0442 \u043a\u04e9\u0440\u0441\u0435\u0442\u0443 \u0448\u0430\u0440\u0442\u0442\u0430\u0440\u044b\u043d \u049b\u0430\u0431\u044b\u043b\u0434\u0430\u0439\u043c\u044b\u043d", "ButtonPrivacyPolicy": "\u049a\u04b1\u043f\u0438\u044f\u043b\u044b\u043b\u044b\u049b \u0441\u0430\u044f\u0441\u0430\u0442\u044b\u043d\u0430", "ButtonTermsOfService": "\u049a\u044b\u0437\u043c\u0435\u0442 \u043a\u04e9\u0440\u0441\u0435\u0442\u0443 \u0448\u0430\u0440\u0442\u0442\u0430\u0440\u044b\u043d\u0430", - "HeaderDeveloperOptions": "\u0416\u0430\u0441\u0430\u049b\u0442\u0430\u0443\u0448\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456", + "HeaderDeveloperOptions": "\u0416\u0430\u0441\u0430\u049b\u0442\u0430\u0443\u0448\u044b \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440\u044b", "OptionEnableWebClientResponseCache": "\u0412\u0435\u0431 \u04af\u043d \u049b\u0430\u0442\u0443 \u043a\u044d\u0448\u0442\u0435\u0443\u0456\u043d \u049b\u043e\u0441\u0443", "OptionDisableForDevelopmentHelp": "\u0412\u0435\u0431-\u0436\u0430\u0441\u0430\u049b\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \u049b\u0430\u0436\u0435\u0442 \u0431\u043e\u043b\u0493\u0430\u043d\u0434\u0430 \u043c\u044b\u043d\u0430\u043b\u0430\u0440\u0434\u044b \u0442\u0435\u04a3\u0448\u0435\u04a3\u0456\u0437.", "OptionEnableWebClientResourceMinification": "\u0412\u0435\u0431 \u049b\u043e\u0440\u044b\u043d \u0430\u0437\u0430\u0439\u0442\u0443\u0434\u044b \u049b\u043e\u0441\u0443", @@ -90,7 +90,7 @@ "LabelCountry": "\u0415\u043b:", "LabelLanguage": "\u0422\u0456\u043b:", "LabelTimeLimitHours": "\u0423\u0430\u049b\u044b\u0442 \u0448\u0435\u0433\u0456 (\u0441\u0430\u0493\u0430\u0442):", - "HeaderPreferredMetadataLanguage": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0442\u0456\u043b\u0456\u043d\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456:", + "HeaderPreferredMetadataLanguage": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0442\u0456\u043b\u0456\u043d\u0456\u04a3 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456", "LabelSaveLocalMetadata": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u043c\u0435\u043b\u0435\u0440 \u0431\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u044b \u0456\u0448\u0456\u043d\u0434\u0435 \u0441\u0430\u049b\u0442\u0430\u0443", "LabelSaveLocalMetadataHelp": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u043c\u0435\u043b\u0435\u0440 \u0431\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u044b \u0456\u0448\u0456\u043d\u0434\u0435 \u0441\u0430\u049b\u0442\u0430\u043b\u0443\u044b \u043e\u043b\u0430\u0440\u0434\u044b \u0436\u0435\u04a3\u0456\u043b \u04e9\u04a3\u0434\u0435\u0439 \u0430\u043b\u0430\u0442\u044b\u043d \u043e\u0440\u044b\u043d\u0493\u0430 \u049b\u043e\u044f\u0434\u044b.", "LabelDownloadInternetMetadata": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u043c\u0435\u043b\u0435\u0440 \u0431\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0442\u0435\u043d \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443", @@ -121,7 +121,7 @@ "OptionSmartSubtitlesHelp": "\u0422\u0456\u043b \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456\u043d\u0435 \u0441\u04d9\u0439\u043a\u0435\u0441 \u043a\u0435\u043b\u0433\u0435\u043d \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u0434\u044b\u0431\u044b\u0441 \u0448\u0435\u0442\u0435\u043b \u0442\u0456\u043b\u0456\u043d\u0434\u0435 \u0431\u043e\u043b\u0493\u0430\u043d\u0434\u0430 \u0436\u04af\u043a\u0442\u0435\u043b\u0435\u0434\u0456.", "OptionOnlyForcedSubtitles": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u043c\u04d9\u0436\u0431\u04af\u0440\u043b\u0456 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440", "OptionAlwaysPlaySubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u04d9\u0440\u049b\u0430\u0448\u0430\u043d \u043e\u0439\u043d\u0430\u0442\u0443", - "OptionDefaultSubtitlesHelp": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u0435\u043d\u0433\u0456\u0437\u0456\u043b\u0433\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0435\u0433\u0456 \u04d9\u0434\u0435\u043f\u043a\u0456 \u0436\u04d9\u043d\u0435 \u043c\u04d9\u0436\u0431\u04af\u0440\u043b\u0456 \u0436\u0430\u043b\u0430\u0443\u0448\u0430\u043b\u0430\u0440\u044b \u043d\u0435\u0433\u0456\u0437\u0456\u043d\u0434\u0435 \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0430\u0434\u044b. \u0411\u0456\u0440\u043d\u0435\u0448\u0435 \u043d\u04b1\u0441\u049b\u0430 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0431\u043e\u043b\u0493\u0430\u043d\u0434\u0430 \u0442\u0456\u043b \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456 \u049b\u0430\u0440\u0430\u0441\u0442\u044b\u0440\u044b\u043b\u0430\u0434\u044b.", + "OptionDefaultSubtitlesHelp": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u0435\u043d\u0433\u0456\u0437\u0456\u043b\u0433\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0435\u0433\u0456 \u04d9\u0434\u0435\u043f\u043a\u0456 \u0436\u04d9\u043d\u0435 \u043c\u04d9\u0436\u0431\u04af\u0440\u043b\u0456 \u0436\u0430\u043b\u0430\u0443\u0448\u0430\u043b\u0430\u0440\u044b \u043d\u0435\u0433\u0456\u0437\u0456\u043d\u0434\u0435 \u0436\u04af\u043a\u0442\u0435\u043b\u0456\u043f \u0430\u043b\u044b\u043d\u0430\u0434\u044b. \u0411\u0456\u0440\u043d\u0435\u0448\u0435 \u043e\u043f\u0446\u0438\u044f \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0431\u043e\u043b\u0493\u0430\u043d\u0434\u0430 \u0442\u0456\u043b \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456 \u049b\u0430\u0440\u0430\u0441\u0442\u044b\u0440\u044b\u043b\u0430\u0434\u044b.", "OptionOnlyForcedSubtitlesHelp": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u043c\u04d9\u0436\u0431\u04af\u0440\u043b\u0456 \u0434\u0435\u043f \u0431\u0435\u043b\u0433\u0456\u043b\u0435\u043d\u0433\u0435\u043d \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u0436\u04af\u043a\u0442\u0435\u043b\u0435\u0434\u0456.", "OptionAlwaysPlaySubtitlesHelp": "\u0422\u0456\u043b \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0456\u043d\u0435 \u0441\u04d9\u0439\u043a\u0435\u0441 \u043a\u0435\u043b\u0433\u0435\u043d \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u0434\u044b\u0431\u044b\u0441 \u0442\u0456\u043b\u0456\u043d\u0435 \u049b\u0430\u0442\u044b\u0441\u0441\u044b\u0437 \u0436\u04af\u043a\u0442\u0435\u043b\u0435\u0434\u0456.", "OptionNoSubtitlesHelp": "\u04d8\u0434\u0435\u043f\u043a\u0456\u0434\u0435 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u0436\u04af\u043a\u0442\u0435\u043b\u043c\u0435\u0439\u0434\u0456.", @@ -319,8 +319,8 @@ "LabelCachePath": "\u041a\u044d\u0448\u043a\u0435 \u049b\u0430\u0440\u0430\u0439 \u0436\u043e\u043b:", "LabelCachePathHelp": "\u0421\u0443\u0440\u0435\u0442 \u0441\u0438\u044f\u049b\u0442\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0434\u0456\u04a3 \u043a\u044d\u0448 \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u0436\u0430\u0439\u0493\u0430\u0441\u044b\u043c\u0434\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u04a3\u044b\u0437. \u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456\u04a3 \u04d9\u0434\u0435\u043f\u043a\u0456\u0441\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443 \u04af\u0448\u0456\u043d \u0431\u043e\u0441 \u049b\u0430\u043b\u0434\u044b\u0440\u044b\u04a3\u044b\u0437.", "LabelRecordingPath": "\u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u0434\u044b\u04a3 \u04d9\u0434\u0435\u043f\u043a\u0456 \u0436\u043e\u043b\u044b:", - "LabelMovieRecordingPath": "\u0424\u0438\u043b\u044c\u043c \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u0434\u044b\u04a3 \u0436\u043e\u043b\u044b (\u043c\u0456\u0434\u0435\u0442\u0442\u0456 \u0435\u043c\u0435\u0441):", - "LabelSeriesRecordingPath": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u0434\u044b\u04a3 \u0436\u043e\u043b\u044b (\u043c\u0456\u0434\u0435\u0442\u0442\u0456 \u0435\u043c\u0435\u0441):", + "LabelMovieRecordingPath": "\u0424\u0438\u043b\u044c\u043c \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u0434\u044b\u04a3 \u0436\u043e\u043b\u044b (\u043c\u0456\u043d\u0434\u0435\u0442\u0442\u0456 \u0435\u043c\u0435\u0441):", + "LabelSeriesRecordingPath": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u0434\u044b\u04a3 \u0436\u043e\u043b\u044b (\u043c\u0456\u043d\u0434\u0435\u0442\u0442\u0456 \u0435\u043c\u0435\u0441):", "LabelRecordingPathHelp": "\u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u0434\u044b \u0441\u0430\u049b\u0442\u0430\u0439\u0442\u044b\u043d \u04d9\u0434\u0435\u043f\u043a\u0456 \u043e\u0440\u044b\u043d\u0434\u044b \u043a\u04e9\u0440\u0441\u0435\u0442\u0456\u04a3\u0456\u0437. \u0411\u043e\u0441 \u049b\u0430\u043b\u0434\u044b\u0440\u0441\u0430\u04a3\u044b\u0437, \u0441\u0435\u0440\u0432\u0435\u0440\u0434\u0456\u04a3 program data \u049b\u0430\u043b\u0442\u0430\u0441\u044b \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0442\u044b\u043d \u0431\u043e\u043b\u0430\u0434\u044b.", "LabelMetadataPath": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0433\u0435 \u049b\u0430\u0440\u0430\u0439 \u0436\u043e\u043b:", "LabelMetadataPathHelp": "\u0416\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u044b\u043d\u0493\u0430\u043d \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u043c\u0435\u043b\u0435\u0440 \u0431\u0435\u043d \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u043b\u0433\u0435\u043d \u0436\u0430\u0439\u0493\u0430\u0441\u044b\u043c\u0434\u044b \u0430\u043d\u044b\u049b\u0442\u0430\u04a3\u044b\u0437.", @@ -367,7 +367,7 @@ "OptionRecordOnAllChannels": "\u0411\u0430\u0440\u043b\u044b\u049b \u0430\u0440\u043d\u0430\u043b\u0430\u0440\u0434\u0430\u043d \u0436\u0430\u0437\u044b\u043f \u0430\u043b\u0443", "OptionRecordAnytime": "\u04d8\u0440 \u0443\u0430\u049b\u044b\u0442\u0442\u0430 \u0436\u0430\u0437\u044b\u043f \u0430\u043b\u0443", "OptionRecordOnlyNewEpisodes": "\u0422\u0435\u043a \u049b\u0430\u043d\u0430 \u0436\u0430\u04a3\u0430 \u0431\u04e9\u043b\u0456\u043c\u0434\u0435\u0440\u0434\u0456 \u0436\u0430\u0437\u044b\u043f \u0430\u043b\u0443", - "HeaderRepeatingOptions": "\u049a\u0430\u0439\u0442\u0430\u043b\u0430\u043c\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456", + "HeaderRepeatingOptions": "\u049a\u0430\u0439\u0442\u0430\u043b\u0430\u043c\u0430 \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440\u044b", "HeaderDays": "\u041a\u04af\u043d\u0434\u0435\u0440", "HeaderActiveRecordings": "\u0411\u0435\u043b\u0441\u0435\u043d\u0434\u0456 \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440", "HeaderLatestRecordings": "\u0415\u04a3 \u043a\u0435\u0439\u0456\u04a3\u0433\u0456 \u0436\u0430\u0437\u0431\u0430\u043b\u0430\u0440", @@ -382,7 +382,7 @@ "TitleLiveTV": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414", "LabelNumberOfGuideDays": "\u0416\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u04af\u0448\u0456\u043d \u0422\u0435\u043b\u0435\u0433\u0438\u0434 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043d\u0434\u0435\u0433\u0456 \u043a\u04af\u043d \u0441\u0430\u043d\u044b:", "LabelNumberOfGuideDaysHelp": "\u041a\u04e9\u0431\u0456\u0440\u0435\u043a \u043a\u04af\u043d\u0434\u0456 \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u0422\u0435\u043b\u0435\u0433\u0438\u0434 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043d\u0456\u04a3 \u049b\u04b1\u043d\u0434\u044b\u043b\u044b\u0493\u044b\u043d \u043a\u04e9\u0442\u0435\u0440\u0435\u0434\u0456 \u0434\u0435 \u0430\u043b\u0434\u044b\u043d-\u0430\u043b\u0430 \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0443 \u04af\u0448\u0456\u043d \u049b\u0430\u0431\u0456\u043b\u0435\u0442\u0456\u043d \u0436\u04d9\u043d\u0435 \u043a\u04e9\u0431\u0456\u0440\u0435\u043a \u0442\u0456\u0437\u0431\u0435\u043b\u0435\u0440 \u043a\u04e9\u0440\u0443\u0434\u0456 \u049b\u0430\u043c\u0442\u0430\u043c\u0430\u0441\u044b\u0437 \u0435\u0442\u0435\u0434\u0456, \u0431\u0456\u0440\u0430\u049b \u0431\u04b1\u043b \u0436\u04af\u043a\u0442\u0435\u0443 \u0443\u0430\u049b\u044b\u0442\u044b\u043d \u0434\u0430 \u0441\u043e\u0437\u0434\u044b\u0440\u0430\u0434\u044b. \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u0430\u04a3\u0434\u0430\u0443 \u0430\u0440\u043d\u0430 \u0441\u0430\u043d\u044b\u043d\u0430 \u043d\u0435\u0433\u0456\u0437\u0434\u0435\u043b\u0456\u043d\u0435\u0434\u0456.", - "OptionAutomatic": "\u0410\u0432\u0442\u043e\u0442\u0430\u04a3\u0434\u0430\u0443", + "OptionAutomatic": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b", "HeaderServices": "\u049a\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440", "LabelCustomizeOptionsPerMediaType": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448 \u0442\u04af\u0440\u0456 \u04af\u0448\u0456\u043d \u0442\u0435\u04a3\u0448\u0435\u0443:", "OptionDownloadThumbImage": "\u041d\u043e\u0431\u0430\u0439", @@ -446,7 +446,7 @@ "ButtonPlayTrailer": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u0433\u0435", "LabelMissing": "\u0416\u043e\u049b", "LabelOffline": "\u0414\u0435\u0440\u0431\u0435\u0441", - "PathSubstitutionHelp": "\u0416\u043e\u043b \u0430\u043b\u043c\u0430\u0441\u0442\u044b\u0440\u0443\u043b\u0430\u0440\u044b\u043d \u0441\u0435\u0440\u0432\u0435\u0440\u0434\u0435\u0433\u0456 \u0436\u043e\u043b\u0434\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440 \u049b\u0430\u0442\u044b\u043d\u0430\u0443 \u043c\u04af\u043c\u043a\u0456\u043d \u0436\u043e\u043b\u043c\u0435\u043d \u0441\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b. \u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0435\u0433\u0456 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0433\u0435 \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u049b\u0430\u0442\u044b\u043d\u0430\u0443 \u04af\u0448\u0456\u043d \u043a\u043b\u0438\u0435\u043d\u0442\u0442\u0435\u0440\u0433\u0435 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0456\u043b\u0433\u0435\u043d\u0434\u0435, \u0431\u04b1\u043b\u0430\u0440 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0442\u044b \u0436\u0435\u043b\u0456 \u0430\u0440\u049b\u044b\u043b\u044b \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d \u0436\u04d9\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u0435\u0441\u0443\u0440\u0441\u0442\u0430\u0440\u044b\u043d \u0430\u0493\u044b\u043d\u043c\u0435\u043d \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443 \u04af\u0448\u0456\u043d \u0436\u04d9\u043d\u0435 \u049b\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0434\u0430\u043d \u0436\u0430\u043b\u0442\u0430\u0440\u0430\u0434\u044b.", + "PathSubstitutionHelp": "\u0416\u043e\u043b \u0430\u043b\u043c\u0430\u0441\u0442\u044b\u0440\u0443\u043b\u0430\u0440\u044b\u043d \u0441\u0435\u0440\u0432\u0435\u0440\u0434\u0435\u0433\u0456 \u0436\u043e\u043b\u0434\u044b Emby-\u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b \u049b\u0430\u0442\u044b\u043d\u0430\u0443 \u043c\u04af\u043c\u043a\u0456\u043d \u0436\u043e\u043b\u043c\u0435\u043d \u0441\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u04af\u0448\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b. \u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0435\u0433\u0456 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0433\u0435 \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u049b\u0430\u0442\u044b\u043d\u0430\u0443 \u04af\u0448\u0456\u043d Emby-\u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u0493\u0430 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0456\u043b\u0433\u0435\u043d\u0434\u0435, \u0431\u04b1\u043b\u0430\u0440 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0442\u044b \u0436\u0435\u043b\u0456 \u0430\u0440\u049b\u044b\u043b\u044b \u0442\u0456\u043a\u0435\u043b\u0435\u0439 \u043e\u0439\u043d\u0430\u0442\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d \u0436\u04d9\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u0435\u0441\u0443\u0440\u0441\u0442\u0430\u0440\u044b\u043d \u0430\u0493\u044b\u043d\u043c\u0435\u043d \u0442\u0430\u0441\u044b\u043c\u0430\u043b\u0434\u0430\u0443 \u04af\u0448\u0456\u043d \u0436\u04d9\u043d\u0435 \u049b\u0430\u0439\u0442\u0430 \u043a\u043e\u0434\u0442\u0430\u0443 \u04af\u0448\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0434\u0430\u043d \u0436\u0430\u043b\u0442\u0430\u0440\u0430\u0434\u044b.", "HeaderFrom": "\u049a\u0430\u0439\u0434\u0430\u043d", "HeaderTo": "\u049a\u0430\u0439\u0434\u0430", "LabelFrom": "\u049a\u0430\u0439\u0434\u0430\u043d:", @@ -604,7 +604,7 @@ "HeaderRequireManualLoginHelp": "\u0410\u0436\u044b\u0440\u0430\u0442\u044b\u043b\u0493\u0430\u043d\u0434\u0430, Emby-\u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u044b \u043f\u0430\u0439\u0434\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440\u0434\u044b \u043a\u04e9\u0440\u043d\u0435\u043a\u0456 \u0442\u0430\u04a3\u0434\u0430\u0443\u044b \u0431\u0430\u0440 \u043a\u0456\u0440\u0443 \u044d\u043a\u0440\u0430\u043d\u044b\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443\u0456 \u043c\u04af\u043c\u043a\u0456\u043d.", "OptionOtherApps": "\u0411\u0430\u0441\u049b\u0430 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440", "OptionMobileApps": "\u04b0\u0442\u049b\u044b\u0440 \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440", - "HeaderNotificationList": "\u0416\u0456\u0431\u0435\u0440\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0434\u0456 \u0442\u0435\u04a3\u0448\u0435\u0443 \u04af\u0448\u0456\u043d \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u043c\u0430\u043d\u044b \u043d\u04b1\u049b\u044b\u04a3\u044b\u0437.", + "HeaderNotificationList": "\u0416\u0456\u0431\u0435\u0440\u0443 \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440\u044b\u043d \u0442\u0435\u04a3\u0448\u0435\u0443 \u04af\u0448\u0456\u043d \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u043c\u0430\u043d\u044b \u043d\u04b1\u049b\u044b\u04a3\u044b\u0437.", "NotificationOptionApplicationUpdateAvailable": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456", "NotificationOptionApplicationUpdateInstalled": "\u049a\u043e\u043b\u0434\u0430\u043d\u0431\u0430 \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", "NotificationOptionPluginUpdateInstalled": "\u041f\u043b\u0430\u0433\u0438\u043d \u0436\u0430\u04a3\u0430\u0440\u0442\u0443\u044b \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0434\u044b", @@ -622,7 +622,7 @@ "NotificationOptionNewLibraryContentMultiple": "\u0416\u0430\u04a3\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d \u049b\u043e\u0441\u044b\u043b\u0434\u044b (\u043a\u04e9\u043f\u0442\u0435\u0433\u0435\u043d)", "NotificationOptionCameraImageUploaded": "\u041a\u0430\u043c\u0435\u0440\u0430\u0434\u0430\u043d \u0444\u043e\u0442\u043e\u0441\u0443\u0440\u0435\u0442 \u043a\u0435\u0440\u0456 \u049b\u043e\u0442\u0430\u0440\u044b\u043b\u0493\u0430\u043d", "NotificationOptionUserLockedOut": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u049b\u04b1\u0440\u0441\u0430\u0443\u043b\u044b", - "HeaderSendNotificationHelp": "\u0425\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u0443\u043b\u0430\u0440 Emby \u043a\u0456\u0440\u0456\u0441 \u0436\u04d9\u0448\u0456\u0433\u0456\u043d\u0435 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u043b\u0435\u0434\u0456. \u049a\u043e\u0441\u044b\u043c\u0448\u0430 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u043a\u0442\u0435\u0440 \u049a\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440 \u049b\u043e\u0439\u044b\u043d\u0434\u044b\u0441\u044b\u043d\u0430\u043d \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0443 \u043c\u04af\u043c\u043a\u0456\u043d.", + "HeaderSendNotificationHelp": "\u0425\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u0443\u043b\u0430\u0440 Emby \u043a\u0456\u0440\u0456\u0441 \u0436\u04d9\u0448\u0456\u0433\u0456\u043d\u0435 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u043b\u0435\u0434\u0456. \u049a\u043e\u0441\u044b\u043c\u0448\u0430 \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440 \u049a\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440 \u049b\u043e\u0439\u044b\u043d\u0434\u044b\u0441\u044b\u043d\u0430\u043d \u043e\u0440\u043d\u0430\u0442\u044b\u043b\u0443 \u043c\u04af\u043c\u043a\u0456\u043d.", "NotificationOptionServerRestartRequired": "\u0421\u0435\u0440\u0432\u0435\u0440\u0434\u0456 \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443 \u049b\u0430\u0436\u0435\u0442", "LabelNotificationEnabled": "\u0411\u04b1\u043b \u0445\u0430\u0431\u0430\u0440\u043b\u0430\u043d\u0434\u044b\u0440\u043c\u0430\u043d\u044b \u049b\u043e\u0441\u0443", "LabelMonitorUsers": "\u041c\u044b\u043d\u0430\u043d\u044b\u04a3 \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0435\u0440\u0456\u043d \u0431\u0430\u049b\u044b\u043b\u0430\u0443:", @@ -701,7 +701,7 @@ "TabResponses": "\u04ae\u043d \u049b\u0430\u0442\u0443\u043b\u0430\u0440", "HeaderProfileInformation": "\u041f\u0440\u043e\u0444\u0430\u0439\u043b \u043c\u04d9\u043b\u0456\u043c\u0435\u0442\u0442\u0435\u0440\u0456", "LabelEmbedAlbumArtDidl": "DIDL \u0456\u0448\u0456\u043d\u0435 \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d \u0435\u043d\u0434\u0456\u0440\u0443", - "LabelEmbedAlbumArtDidlHelp": "\u041a\u0435\u0439\u0431\u0456\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0493\u0430 \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d \u0430\u043b\u0443 \u04af\u0448\u0456\u043d \u043e\u0441\u044b \u04d9\u0434\u0456\u0441 \u049b\u0430\u0436\u0435\u0442. \u0411\u0430\u0441\u049b\u0430\u043b\u0430\u0440 \u04af\u0448\u0456\u043d, \u043e\u0441\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u043e\u0439\u043d\u0430\u0442\u0443 \u0441\u04d9\u0442\u0441\u0456\u0437 \u0431\u043e\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.", + "LabelEmbedAlbumArtDidlHelp": "\u041a\u0435\u0439\u0431\u0456\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0493\u0430 \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d \u0430\u043b\u0443 \u04af\u0448\u0456\u043d \u043e\u0441\u044b \u04d9\u0434\u0456\u0441 \u049b\u0430\u0436\u0435\u0442. \u0411\u0430\u0441\u049b\u0430\u043b\u0430\u0440 \u04af\u0448\u0456\u043d, \u043e\u0441\u044b \u043e\u043f\u0446\u0438\u044f \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u043e\u0439\u043d\u0430\u0442\u0443 \u0441\u04d9\u0442\u0441\u0456\u0437 \u0431\u043e\u043b\u0443\u044b \u043c\u04af\u043c\u043a\u0456\u043d.", "LabelAlbumArtPN": "\u0410\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456 PN:", "LabelAlbumArtHelp": "PN \u0430\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456 \u04af\u0448\u0456\u043d upnp:albumArtURI \u0456\u0448\u0456\u043d\u0434\u0435\u0433\u0456 dlna:profileID \u0442\u04e9\u043b\u0441\u0438\u043f\u0430\u0442\u044b\u043c\u0435\u043d \u0431\u0456\u0440\u0433\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b. \u041a\u0435\u0439\u0431\u0456\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440 \u04af\u0448\u0456\u043d, \u0441\u0443\u0440\u0435\u0442\u0442\u0456\u04a3 \u04e9\u043b\u0448\u0435\u043c\u0456\u043d\u0435 \u0430\u04a3\u0493\u0430\u0440\u0443\u0441\u044b\u0437, \u043d\u0430\u049b\u0442\u044b \u043c\u04d9\u043d \u049b\u0430\u0436\u0435\u0442.", "LabelAlbumArtMaxWidth": "\u0410\u043b\u044c\u0431\u043e\u043c \u0441\u0443\u0440\u0435\u0442\u0456\u043d\u0456\u04a3 \u0435\u04a3 \u0436\u043e\u0493\u0430\u0440\u044b \u0435\u043d\u0456:", @@ -800,7 +800,7 @@ "OptionAuto": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b", "OptionYes": "\u0418\u04d9", "OptionNo": "\u0416\u043e\u049b", - "HeaderOptions": "\u041d\u04b1\u0441\u049b\u0430\u043b\u0430\u0440", + "HeaderOptions": "\u041e\u043f\u0446\u0438\u044f\u043b\u0430\u0440", "LabelHomePageSection1": "\u0411\u0430\u0441\u0442\u044b \u0431\u0435\u0442 1-\u0431\u04e9\u043b\u0456\u043c:", "LabelHomePageSection2": "\u0411\u0430\u0441\u0442\u044b \u0431\u0435\u0442 2-\u0431\u04e9\u043b\u0456\u043c:", "LabelHomePageSection3": "\u0411\u0430\u0441\u0442\u044b \u0431\u0435\u0442 3-\u0431\u04e9\u043b\u0456\u043c:", @@ -880,7 +880,7 @@ "LabelProtocolInfo": "\u041f\u0440\u043e\u0442\u043e\u049b\u043e\u043b \u0442\u0443\u0440\u0430\u043b\u044b:", "LabelProtocolInfoHelp": "\u0411\u04b1\u043b \u043c\u04d9\u043d \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043d\u044b\u04a3 GetProtocolInfo \u0441\u04b1\u0440\u0430\u043d\u044b\u0441\u0442\u0430\u0440\u044b\u043d\u0430 \u0436\u0430\u0443\u0430\u043f \u0431\u0435\u0440\u0433\u0435\u043d\u0434\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b.", "TabNfoSettings": "NFO \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440\u0456", - "HeaderKodiMetadataHelp": "NFO \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u04af\u0448\u0456\u043d Emby \u043a\u0456\u0440\u0456\u043a\u0442\u0456\u0440\u043c\u0435 \u049b\u043e\u043b\u0434\u0430\u0443\u044b\u043d \u049b\u0430\u043c\u0442\u0438\u0434\u044b. NFO \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u0443 \u043d\u0435\u043c\u0435\u0441\u0435 \u04e9\u0448\u0456\u0440\u0443 \u04af\u0448\u0456\u043d, \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u0442\u04af\u0440\u043b\u0435\u0440\u0456\u043d\u0435 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u043a\u0442\u0435\u0440\u0434\u0456 \u0442\u0435\u04a3\u0448\u0435\u0443 \u04af\u0448\u0456\u043d \u049a\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440 \u049b\u043e\u0439\u044b\u043d\u0434\u044b\u0441\u044b\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u04a3\u044b\u0437.", + "HeaderKodiMetadataHelp": "NFO \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u04af\u0448\u0456\u043d Emby \u043a\u0456\u0440\u0456\u043a\u0442\u0456\u0440\u043c\u0435 \u049b\u043e\u043b\u0434\u0430\u0443\u044b\u043d \u049b\u0430\u043c\u0442\u0438\u0434\u044b. NFO \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043d \u049b\u043e\u0441\u0443 \u043d\u0435\u043c\u0435\u0441\u0435 \u04e9\u0448\u0456\u0440\u0443 \u04af\u0448\u0456\u043d, \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u0442\u04af\u0440\u043b\u0435\u0440\u0456\u043d\u0435 \u0430\u0440\u043d\u0430\u043b\u0493\u0430\u043d \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440\u0434\u044b \u0442\u0435\u04a3\u0448\u0435\u0443 \u04af\u0448\u0456\u043d \u049a\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440 \u049b\u043e\u0439\u044b\u043d\u0434\u044b\u0441\u044b\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u04a3\u044b\u0437.", "LabelKodiMetadataUser": "NFO-\u0444\u0430\u0439\u043b\u0434\u0430\u0440\u0434\u044b \u043c\u044b\u043d\u0430 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u049b\u0430\u0440\u0430\u0443 \u043a\u04af\u0439\u0456\u043c\u0435\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443:", "LabelKodiMetadataUserHelp": "Emby Server \u0436\u04d9\u043d\u0435 NFO-\u0444\u0430\u0439\u043b\u0434\u0430\u0440 \u0430\u0440\u0430\u0441\u044b\u043d\u0434\u0430 \u049b\u0430\u0440\u0430\u043b\u0493\u0430\u043d \u043a\u04af\u0439 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0456\u043f \u0442\u04b1\u0440\u0443 \u04af\u0448\u0456\u043d \u0431\u04b1\u043d\u044b \u049b\u043e\u0441\u044b\u04a3\u044b\u0437.", "LabelKodiMetadataDateFormat": "\u0428\u044b\u0493\u0430\u0440\u0443 \u043a\u04af\u043d\u0456\u043d\u0456\u04a3 \u043f\u0456\u0448\u0456\u043c\u0456:", @@ -1027,7 +1027,7 @@ "HeaderDownloadPeopleMetadataFor": "\u04e8\u043c\u0456\u0440\u0431\u0430\u044f\u043d \u0431\u0435\u043d \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u043c\u0430\u049b\u0441\u0430\u0442\u044b;", "OptionComposers": "\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u043b\u0430\u0440", "OptionOthers": "\u0411\u0430\u0441\u049b\u0430\u043b\u0430\u0440", - "HeaderDownloadPeopleMetadataForHelp": "\u049a\u043e\u0441\u044b\u043c\u0448\u0430 \u0442\u0435\u04a3\u0448\u0435\u043b\u0456\u043c\u0434\u0435\u0440\u0434\u0456 \u049b\u043e\u0441\u049b\u0430\u043d\u0434\u0430 \u044d\u043a\u0440\u0430\u043d\u0434\u0430\u0493\u044b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u0442\u044b \u043a\u04e9\u0431\u0456\u0440\u0435\u043a \u04b1\u0441\u044b\u043d\u0430\u0434\u044b, \u0431\u0456\u0440\u0430\u049b \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043d\u044b\u04a3 \u0441\u043a\u0430\u043d\u0435\u0440\u043b\u0435\u0443\u043b\u0435\u0440\u0456 \u0431\u0430\u044f\u0443\u043b\u0430\u0439\u0434\u044b.", + "HeaderDownloadPeopleMetadataForHelp": "\u049a\u043e\u0441\u044b\u043c\u0448\u0430 \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440\u0434\u044b \u049b\u043e\u0441\u049b\u0430\u043d\u0434\u0430 \u044d\u043a\u0440\u0430\u043d\u0434\u0430\u0493\u044b \u0430\u049b\u043f\u0430\u0440\u0430\u0442\u0442\u044b \u043a\u04e9\u0431\u0456\u0440\u0435\u043a \u04b1\u0441\u044b\u043d\u044b\u043b\u0430\u0434\u044b, \u0431\u0456\u0440\u0430\u049b \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u043d\u044b\u04a3 \u0441\u043a\u0430\u043d\u0435\u0440\u043b\u0435\u0443\u043b\u0435\u0440\u0456 \u0431\u0430\u044f\u0443\u043b\u0430\u0439\u0434\u044b.", "ViewTypeFolders": "\u049a\u0430\u043b\u0442\u0430\u043b\u0430\u0440", "OptionDisplayFolderView": "\u041a\u04d9\u0434\u0456\u043c\u0433\u0456 \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u049b\u0430\u043b\u0442\u0430\u043b\u0430\u0440\u044b\u043d \u043a\u04e9\u0440\u0441\u0435\u0442\u0443 \u04af\u0448\u0456\u043d \u049a\u0430\u043b\u0442\u0430 \u0430\u0441\u043f\u0435\u043a\u0442\u0456\u043d \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u0443", "OptionDisplayFolderViewHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, Emby-\u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u043b\u0430\u0440\u0434\u0430 \u049a\u0430\u043b\u0442\u0430\u043b\u0430\u0440 \u0441\u0430\u043d\u0430\u0442\u044b \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u04a3\u044b\u0437 \u0436\u0430\u043d\u044b\u043d\u0434\u0430 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0435\u0434\u0456. \u0415\u0433\u0435\u0440 \u043a\u04d9\u0434\u0456\u043c\u0433\u0456 \u049b\u0430\u043b\u0442\u0430 \u043a\u04e9\u0440\u0456\u043d\u0456\u0441\u0442\u0435\u0440\u0456\u043d \u04b1\u043d\u0430\u0442\u0441\u0430\u04a3\u044b\u0437, \u0431\u04b1\u043b \u043f\u0430\u0439\u0434\u0430\u043b\u044b \u0431\u043e\u043b\u0430\u0434\u044b.", @@ -1139,7 +1139,7 @@ "LabelDateAddedBehavior": "\u0416\u0430\u04a3\u0430 \u043c\u0430\u0437\u043c\u04b1\u043d \u04af\u0448\u0456\u043d \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d \u043a\u04af\u043d\u0456 \u0442\u04d9\u0440\u0442\u0456\u0431\u0456:", "OptionDateAddedImportTime": "\u0422\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430 \u0456\u0448\u0456\u043d\u0435 \u0441\u043a\u0430\u043d\u0435\u0440\u043b\u0435\u0443 \u043a\u04af\u043d\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443", "OptionDateAddedFileTime": "\u0424\u0430\u0439\u043b\u0434\u044b\u04a3 \u0436\u0430\u0441\u0430\u043b\u0493\u0430\u043d \u043a\u04af\u043d\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443", - "LabelDateAddedBehaviorHelp": "\u0415\u0433\u0435\u0440 \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0435 \u043c\u04d9\u043d\u0456 \u0431\u043e\u043b\u0441\u0430, \u0431\u04b1\u043b \u049b\u0430\u0439\u0441\u044b\u0431\u0456\u0440 \u043e\u0441\u044b \u043d\u04b1\u0441\u049b\u0430\u043b\u0430\u0440\u0434\u044b\u04a3 \u0430\u043b\u0434\u044b\u043d\u0434\u0430 \u04d9\u0440\u049b\u0430\u0448\u0430\u043d\u0434\u0430 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b.", + "LabelDateAddedBehaviorHelp": "\u0415\u0433\u0435\u0440 \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0435 \u043c\u04d9\u043d\u0456 \u0431\u043e\u043b\u0441\u0430, \u0431\u04b1\u043b \u049b\u0430\u0439\u0441\u044b\u0431\u0456\u0440 \u043e\u0441\u044b \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440\u044b\u0434\u044b\u04a3 \u0430\u043b\u0434\u044b\u043d\u0434\u0430 \u04d9\u0440\u049b\u0430\u0448\u0430\u043d\u0434\u0430 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0430\u0434\u044b.", "LabelNumberTrailerToPlay": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u0434\u0456\u04a3 \u043e\u0439\u043d\u0430\u0442\u044b\u043b\u0443 \u04af\u0448\u0456\u043d \u0441\u0430\u043d\u044b:", "TitleDevices": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440", "TabCameraUpload": "\u041a\u0430\u043c\u0435\u0440\u0430\u043b\u0430\u0440", @@ -1168,7 +1168,7 @@ "LabelAccessEnd": "\u0410\u044f\u049b\u0442\u0430\u0443 \u0443\u0430\u049b\u044b\u0442\u044b:", "HeaderSchedule": "\u0406\u0441 \u043a\u0435\u0441\u0442\u0435\u0441\u0456", "OptionEveryday": "\u041a\u04af\u043d \u0441\u0430\u0439\u044b\u043d", - "OptionWeekdays": "\u0410\u043f\u0442\u0430 \u043a\u04af\u043d\u0434\u0435\u0440\u0456", + "OptionWeekdays": "\u0416\u04b1\u043c\u044b\u0441 \u043a\u04af\u043d\u0434\u0435\u0440\u0456", "OptionWeekends": "\u0414\u0435\u043c\u0430\u043b\u044b\u0441 \u043a\u04af\u043d\u0434\u0435\u0440\u0456", "MessageProfileInfoSynced": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b \u043f\u0440\u043e\u0444\u0430\u0439\u043b \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456 Emby Connect \u0430\u0440\u0430\u0441\u044b\u043d\u0434\u0430 \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0456\u043b\u0434\u0456.", "HeaderOptionalLinkEmbyAccount": "\u041c\u0456\u043d\u0434\u0435\u0442\u0442\u0456 \u0435\u043c\u0435\u0441: Emby \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u04a3\u0456\u0437\u0431\u0435\u043d \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u0442\u044b\u0440\u0443", @@ -1287,7 +1287,7 @@ "GuideProviderSelectListings": "\u0422\u0456\u0437\u0431\u0435\u043b\u0435\u0440\u0434\u0456 \u0442\u0430\u04a3\u0434\u0430\u0443", "GuideProviderLogin": "\u041a\u0456\u0440\u0443", "LabelLineup": "\u0422\u0456\u0437\u0431\u0435\u043a:", - "MessageTunerDeviceNotListed": "\u0422\u044e\u043d\u0435\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u04a3\u044b\u0437 \u0442\u0456\u0437\u0456\u043c\u0434\u0435 \u0436\u043e\u049b \u043f\u0430? \u041a\u04e9\u0431\u0456\u0440\u0435\u043a \u044d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u043a\u0442\u0435\u0440\u0456 \u04af\u0448\u0456\u043d \u0441\u044b\u0440\u0442\u049b\u044b \u049b\u044b\u0437\u043c\u0435\u0442 \u0436\u0435\u0442\u043a\u0456\u0437\u0443\u0448\u0456\u0441\u0456\u043d \u043e\u0440\u043d\u0430\u0442\u044b\u043f \u043a\u04e9\u0440\u0456\u04a3\u0456\u0437.", + "MessageTunerDeviceNotListed": "\u0422\u044e\u043d\u0435\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u04a3\u044b\u0437 \u0442\u0456\u0437\u0456\u043c\u0434\u0435 \u0436\u043e\u049b \u043f\u0430? \u041a\u04e9\u0431\u0456\u0440\u0435\u043a \u044d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414 \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440\u044b \u04af\u0448\u0456\u043d \u0441\u044b\u0440\u0442\u049b\u044b \u049b\u044b\u0437\u043c\u0435\u0442 \u0436\u0435\u0442\u043a\u0456\u0437\u0443\u0448\u0456\u0441\u0456\u043d \u043e\u0440\u043d\u0430\u0442\u044b\u043f \u043a\u04e9\u0440\u0456\u04a3\u0456\u0437.", "LabelImportOnlyFavoriteChannels": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0431\u0435\u043b\u0433\u0456\u043b\u0435\u043d\u0433\u0435\u043d \u0430\u0440\u043d\u0430\u043b\u0430\u0440\u043c\u0435\u043d \u0448\u0435\u043a\u0442\u0435\u0443", "ImportFavoriteChannelsHelp": "\u049a\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, \u0442\u044e\u043d\u0435\u0440 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u0441\u044b\u043d\u0434\u0430\u0493\u044b \u0442\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u0440\u0435\u0442\u0456\u043d\u0434\u0435 \u0431\u0435\u043b\u0433\u0456\u043b\u0435\u043d\u0433\u0435\u043d \u0493\u0430\u043d\u0430 \u0430\u0440\u043d\u0430\u043b\u0430\u0440 \u0448\u0435\u0442\u0442\u0435\u043d \u04d9\u043a\u0435\u043b\u0456\u043d\u0435\u0442\u0456\u043d \u0431\u043e\u043b\u0430\u0434\u044b.", "ButtonRepeat": "\u049a\u0430\u0439\u0442\u0430\u043b\u0430\u0443", @@ -1344,7 +1344,7 @@ "OptionPlayNextEpisodeAutomatically": "\u041a\u0435\u043b\u0435\u0441\u0456 \u0431\u04e9\u043b\u0456\u043c\u0434\u0456 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0442\u044b \u0442\u04af\u0440\u0434\u0435 \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443", "OptionDownloadImagesInAdvance": "\u0421\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0430\u043b\u0434\u044b\u043d \u0430\u043b\u0430 \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443", "SettingsSaved": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440 \u0441\u0430\u049b\u0442\u0430\u043b\u0434\u044b.", - "OptionDownloadImagesInAdvanceHelp": "\u04d8\u0434\u0435\u043f\u043a\u0456\u0434\u0435, \u049b\u043e\u0441\u044b\u043c\u0448\u0430 \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456\u04a3 \u043a\u04e9\u0431\u0456 \u0442\u0435\u043a \u049b\u0430\u043d\u0430 Emby-\u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0441\u044b \u0441\u04b1\u0440\u0430\u0441\u0430 \u0436\u04af\u043a\u0442\u0435\u043b\u0435\u0434\u0456. \u0416\u0430\u04a3\u0430 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0438\u043c\u043f\u043e\u0440\u0442\u0442\u0430\u043b\u0493\u0430\u043d \u043a\u0435\u0437\u0434\u0435 \u0430\u043b\u0434\u044b\u043d \u0430\u043b\u0430 \u0431\u0430\u0440\u043b\u044b\u049b \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u04af\u0448\u0456\u043d, \u043e\u0441\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0434\u0456 \u049b\u043e\u0441\u044b\u04a3\u044b\u0437.", + "OptionDownloadImagesInAdvanceHelp": "\u04d8\u0434\u0435\u043f\u043a\u0456\u0434\u0435, \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456\u04a3 \u043a\u04e9\u0431\u0456 \u0442\u0435\u043a \u049b\u0430\u043d\u0430 Emby-\u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0441\u044b \u0441\u04b1\u0440\u0430\u0441\u0430 \u0436\u04af\u043a\u0442\u0435\u043b\u0435\u0434\u0456. \u0416\u0430\u04a3\u0430 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u0438\u043c\u043f\u043e\u0440\u0442\u0442\u0430\u043b\u0493\u0430\u043d \u043a\u0435\u0437\u0434\u0435 \u0430\u043b\u0434\u044b\u043d \u0430\u043b\u0430 \u0431\u0430\u0440\u043b\u044b\u049b \u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u0436\u04af\u043a\u0442\u0435\u043f \u0430\u043b\u0443 \u04af\u0448\u0456\u043d, \u043e\u0441\u044b \u043e\u043f\u0446\u0438\u044f\u043d\u044b \u049b\u043e\u0441\u044b\u04a3\u044b\u0437.", "Users": "\u041f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u0443\u0448\u044b\u043b\u0430\u0440", "Delete": "\u0416\u043e\u044e", "Password": "\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437", @@ -1367,7 +1367,7 @@ "PasswordMatchError": "\u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0456 \u043c\u0435\u043d \u049a\u04b1\u043f\u0438\u044f \u0441\u04e9\u0437\u0434\u0456 \u0440\u0430\u0441\u0442\u0430\u0443 \u04e9\u0440\u0456\u0441\u0442\u0435\u0440\u0456 \u0441\u04d9\u0439\u043a\u0435\u0441 \u0431\u043e\u043b\u0443 \u043a\u0435\u0440\u0435\u043a.", "UninstallPluginHeader": "\u041f\u043b\u0430\u0433\u0438\u043d \u043e\u0440\u043d\u0430\u0442\u0443\u044b\u043d \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", "UninstallPluginConfirmation": "\u0428\u044b\u043d\u044b\u043c\u0435\u043d {0} \u043e\u0440\u043d\u0430\u0442\u0443\u044b\u043d \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?", - "NoPluginConfigurationMessage": "\u041e\u0441\u044b \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435 \u0435\u0448\u0442\u0435\u04a3\u0435 \u0442\u0435\u04a3\u0448\u0435\u043b\u0435\u0442\u0456\u043d \u0436\u043e\u049b.", + "NoPluginConfigurationMessage": "\u041e\u0441\u044b \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435 \u0442\u0435\u04a3\u0448\u0435\u043b\u0435\u0442\u0456\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440 \u0436\u043e\u049b.", "NoPluginsInstalledMessage": "\u041e\u0440\u043d\u0430\u0442\u044b\u043b\u0493\u0430\u043d \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440 \u0436\u043e\u049b.", "BrowsePluginCatalogMessage": "\u049a\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u043f\u043b\u0430\u0433\u0438\u043d\u0434\u0435\u0440\u043c\u0435\u043d \u0442\u0430\u043d\u044b\u0441\u0443 \u04af\u0448\u0456\u043d \u043f\u043b\u0430\u0433\u0438\u043d \u0442\u0456\u0437\u0456\u043c\u0434\u0435\u043c\u0435\u0441\u0456\u043d \u0448\u043e\u043b\u044b\u04a3\u044b\u0437.", "HeaderNewApiKey": "\u0416\u0430\u04a3\u0430 API-\u043a\u0456\u043b\u0442", @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "\u041e\u0439\u043d\u0430\u0442\u0443 \u049b\u0430\u0442\u0435\u0441\u0456", "MessagePlaybackErrorNotAllowed": "\u041e\u0441\u044b \u043c\u0430\u0437\u043c\u04b1\u043d\u0434\u044b \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0430\u0493\u044b\u043c\u0434\u0430 \u0441\u0456\u0437\u0433\u0435 \u0440\u04b1\u049b\u0441\u0430\u0442 \u0435\u0442\u0456\u043b\u043c\u0435\u0433\u0435\u043d. \u0422\u043e\u043b\u044b\u049b \u043c\u04d9\u043b\u0456\u043c\u0435\u0442\u0442\u0435\u0440 \u04af\u0448\u0456\u043d \u0436\u04af\u0439\u0435\u043b\u0456\u043a \u04d9\u043a\u0456\u043c\u0448\u0456\u04a3\u0456\u0437\u0433\u0435 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u044b\u04a3\u044b\u0437.", "MessagePlaybackErrorNoCompatibleStream": "\u0410\u0493\u044b\u043c\u0434\u0430 \u0435\u0448\u049b\u0430\u043d\u0434\u0430\u0439 \u0441\u044b\u0439\u044b\u0441\u044b\u043c\u0434\u044b \u0430\u0493\u044b\u043d\u0434\u0430\u0440 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u043c\u0435\u0441. \u04d8\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u043a\u0435\u0439\u0456\u043d \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437 \u043d\u0435\u043c\u0435\u0441\u0435 \u0442\u043e\u043b\u044b\u049b \u043c\u04d9\u043b\u0456\u043c\u0435\u0442\u0442\u0435\u0440 \u04af\u0448\u0456\u043d \u0436\u04af\u0439\u0435\u043b\u0456\u043a \u04d9\u043a\u0456\u043c\u0448\u0456\u04a3\u0456\u0437\u0433\u0435 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u044b\u04a3\u044b\u0437.", - "MessagePlaybackErrorRateLimitExceeded": "\u041e\u0439\u043d\u0430\u0442\u0443 \u049b\u0430\u0440\u049b\u044b\u043d\u044b\u04a3\u044b\u0437 \u0448\u0435\u043a\u0442\u0435\u043d \u0430\u0441\u044b\u043f \u043a\u0435\u0442\u043a\u0435\u043d. \u0422\u043e\u043b\u044b\u049b \u043c\u04d9\u043b\u0456\u043c\u0435\u0442\u0442\u0435\u0440 \u04af\u0448\u0456\u043d \u0436\u04af\u0439\u0435\u043b\u0456\u043a \u04d9\u043a\u0456\u043c\u0448\u0456\u04a3\u0456\u0437\u0433\u0435 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u044b\u04a3\u044b\u0437.", - "MessagePlaybackErrorPlaceHolder": "\u0422\u0430\u04a3\u0434\u0430\u043b\u0493\u0430\u043d \u043c\u0430\u0437\u043c\u04b1\u043d \u0431\u04b1\u043b \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430\u043d \u043e\u0439\u043d\u0430\u0442\u044b\u043b\u0430\u0442\u044b\u043d \u0435\u043c\u0435\u0441.", + "MessagePlaybackErrorPlaceHolder": "\u041e\u0441\u044b \u0431\u0435\u0439\u043d\u0435\u043d\u0456 \u043e\u0439\u043d\u0430\u0442\u0443 \u04af\u0448\u0456\u043d \u0434\u0438\u0441\u043a\u0456\u043d\u0456 \u0435\u043d\u0433\u0456\u0437\u0456\u04a3\u0456\u0437.", "HeaderSelectAudio": "\u0414\u044b\u0431\u044b\u0441 \u0442\u0430\u04a3\u0434\u0430\u0443", "HeaderSelectSubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u043b\u0435\u0440 \u0442\u0430\u04a3\u0434\u0430\u0443", "ButtonMarkForRemoval": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u0443", @@ -1996,7 +1995,7 @@ "HeaderSortOrder": "\u0421\u04b1\u0440\u044b\u043f\u0442\u0430\u0443 \u0440\u0435\u0442\u0456", "ButtonDisconnect": "\u0410\u0436\u044b\u0440\u0430\u0442\u0443", "ButtonMenu": "\u041c\u04d9\u0437\u0456\u0440", - "ForAdditionalLiveTvOptions": "\u049a\u043e\u0441\u044b\u043c\u0448\u0430 \u044d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414 \u0436\u0435\u0442\u043a\u0456\u0437\u0443\u0448\u0456\u043b\u0435\u0440 \u04af\u0448\u0456\u043d, \u0421\u044b\u0440\u0442\u049b\u044b \u049b\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440 \u049b\u043e\u0439\u044b\u043d\u0434\u044b\u0441\u044b\u043d \u043d\u04b1\u049b\u044b\u043f, \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0442\u0435\u0440\u043c\u0435\u043d \u0442\u0430\u043d\u044b\u0441\u044b\u04a3\u044b\u0437.", + "ForAdditionalLiveTvOptions": "\u049a\u043e\u0441\u044b\u043c\u0448\u0430 \u044d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414 \u0436\u0435\u0442\u043a\u0456\u0437\u0443\u0448\u0456\u043b\u0435\u0440 \u04af\u0448\u0456\u043d, \u0421\u044b\u0440\u0442\u049b\u044b \u049b\u044b\u0437\u043c\u0435\u0442\u0442\u0435\u0440 \u049b\u043e\u0439\u044b\u043d\u0434\u044b\u0441\u044b\u043d \u043d\u04b1\u049b\u044b\u043f, \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u043e\u043f\u0446\u0438\u044f\u043b\u0430\u0440\u0431\u0435\u043d \u0442\u0430\u043d\u044b\u0441\u044b\u04a3\u044b\u0437.", "ButtonGuide": "\u0422\u0435\u043b\u0435\u0433\u0438\u0434", "ButtonRecordedTv": "\u0416\u0430\u0437\u044b\u043b\u0493\u0430\u043d \u0422\u0414", "ConfirmEndPlayerSession": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u0434\u0430 Emby \u0436\u0430\u0431\u0443\u044b\u043d \u049b\u0430\u043b\u0430\u0439\u0441\u044b\u0437 \u0431\u0430?", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "Emby Connect \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d \u0430\u043b\u0430\u0441\u0442\u0430\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. \u0411\u0435\u043b\u0441\u0435\u043d\u0434\u0456 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u049b\u043e\u0441\u044b\u043b\u044b\u043c\u044b \u0431\u0430\u0440 \u0435\u043a\u0435\u043d\u0456\u043d\u0435 \u043a\u04e9\u0437 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u04a3\u0456\u0437 \u0436\u04d9\u043d\u0435 \u04d9\u0440\u0435\u043a\u0435\u0442\u0442\u0456 \u043a\u0435\u0439\u0456\u043d \u049b\u0430\u0439\u0442\u0430\u043b\u0430\u04a3\u044b\u0437.", "ErrorAddingEmbyConnectAccount1": "Emby Connect \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d \u04af\u0441\u0442\u0435\u0443 \u043a\u0435\u0437\u0456\u043d\u0434\u0435 \u049b\u0430\u0442\u0435 \u043e\u0440\u044b\u043d \u0430\u043b\u0434\u044b. Emby \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d \u0436\u0430\u0441\u0430\u0434\u044b\u04a3\u044b\u0437 \u0431\u0430? {0} \u0436\u0430\u043d\u044b\u043d\u0434\u0430 \u0442\u0456\u0440\u043a\u0435\u043b\u0456\u04a3\u0456\u0437.", "ErrorAddingEmbyConnectAccount2": "\u0422\u0456\u0440\u043a\u0435\u043b\u0433\u0456 \u0436\u0430\u0441\u0430\u0493\u0430\u043d\u043d\u0430\u043d \u043a\u0435\u0439\u0456\u043d \u044d-\u043f\u043e\u0448\u0442\u0430\u043c\u0435\u043d \u0436\u0456\u0431\u0435\u0440\u0456\u043b\u0433\u0435\u043d \u043d\u04b1\u0441\u049b\u0430\u0443\u043b\u0430\u0440\u0493\u0430 \u0441\u04d9\u0439\u043a\u0435\u0441 Emby \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456 \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456\u0440\u0443\u0456\u043d\u0435 \u043a\u04e9\u0437 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u04a3\u0456\u0437. \u0415\u0433\u0435\u0440 \u0441\u0456\u0437 \u043e\u0441\u044b \u044d-\u043f\u043e\u0448\u0442\u0430 \u0430\u043b\u043c\u0430\u0493\u0430\u043d \u0431\u043e\u043b\u0441\u0430\u04a3\u044b\u0437, Emby \u0442\u0456\u0440\u043a\u0435\u043b\u0433\u0456\u0441\u0456\u043d\u0434\u0435 \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043b\u0493\u0430\u043d \u044d-\u043f\u043e\u0448\u0442\u0430 \u0430\u0440\u049b\u044b\u043b\u044b {0} \u043c\u0435\u043a\u0435\u043d\u0436\u0430\u0439\u044b\u043d\u0430 \u0445\u0430\u0431\u0430\u0440 \u0436\u0456\u0431\u0435\u0440\u0456\u04a3\u0456\u0437.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u043e\u0440\u044b\u043d\u0434\u0430\u0443\u0448\u044b\u043b\u0430\u0440", "HeaderFavoriteSongs": "\u0422\u0430\u04a3\u0434\u0430\u0443\u043b\u044b \u04d9\u0443\u0435\u043d\u0434\u0435\u0440", "HeaderConfirmPluginInstallation": "\u041f\u043b\u0430\u0433\u0438\u043d \u043e\u0440\u043d\u0430\u0442\u044b\u043c\u044b\u043d \u0440\u0430\u0441\u0442\u0430\u0443", @@ -2136,5 +2136,6 @@ "Sports": "\u0421\u043f\u043e\u0440\u0442", "HeaderForKids": "\u0411\u0430\u043b\u0430\u043b\u044b\u049b", "HeaderRecordingGroups": "\u0416\u0430\u0437\u0431\u0430 \u0442\u043e\u043f\u0442\u0430\u0440\u044b", - "LabelConvertRecordingsTo": "\u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u0434\u044b \u043c\u044b\u043d\u0430\u0493\u0430\u043d \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443:" + "LabelConvertRecordingsTo": "\u0416\u0430\u0437\u0431\u0430\u043b\u0430\u0440\u0434\u044b \u043c\u044b\u043d\u0430\u0493\u0430\u043d \u0442\u04af\u0440\u043b\u0435\u043d\u0434\u0456\u0440\u0443:", + "HeaderUpcomingOnTV": "\u041a\u04af\u0442\u0456\u043b\u0433\u0435\u043d \u0422\u0414" } \ No newline at end of file diff --git a/dashboard-ui/strings/ko.json b/dashboard-ui/strings/ko.json index d33aead6bc..988fbee342 100644 --- a/dashboard-ui/strings/ko.json +++ b/dashboard-ui/strings/ko.json @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "\uc7ac\uc0dd \uc624\ub958", "MessagePlaybackErrorNotAllowed": "\uc774 \ucf58\ud150\ud2b8\ub97c \uc7ac\uc0dd\ud560 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \uc2dc\uc2a4\ud15c \uad00\ub9ac\uc790\uc5d0\uac8c \ubb38\uc758\ud558\uc138\uc694.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", "MessagePlaybackErrorPlaceHolder": "\uc120\ud0dd\ud55c \ucf58\ud150\ud2b8\ub294 \uc774 \uc7a5\uce58\uc5d0\uc11c \uc7ac\uc0dd\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.", "HeaderSelectAudio": "\uc624\ub514\uc624 \uc120\ud0dd", "HeaderSelectSubtitles": "\uc790\ub9c9 \uc120\ud0dd", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/ms.json b/dashboard-ui/strings/ms.json index 11512008b0..edfa954ece 100644 --- a/dashboard-ui/strings/ms.json +++ b/dashboard-ui/strings/ms.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/nb.json b/dashboard-ui/strings/nb.json index bb97079554..d77e0f7c28 100644 --- a/dashboard-ui/strings/nb.json +++ b/dashboard-ui/strings/nb.json @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "Avspillingsfeil", "MessagePlaybackErrorNotAllowed": "Du er for \u00f8yeblikket ikke autorisert til \u00e5 spille dette innholdet. Ta kontakt med systemadministratoren for mer informasjon.", "MessagePlaybackErrorNoCompatibleStream": "Ingen kompatible streamer er tilgjengelig for \u00f8yeblikket. Vennligst pr\u00f8v igjen senere eller kontakt systemadministratoren for mer informasjon.", - "MessagePlaybackErrorRateLimitExceeded": "Avspillingshastighet grensen er overskredet. Ta kontakt med systemadministratoren for mer informasjon.", "MessagePlaybackErrorPlaceHolder": "Valgt innholdet, kan ikke avspilles fra denne enheten.", "HeaderSelectAudio": "Velg Lyd", "HeaderSelectSubtitles": "Velg Undertekst", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "Det oppstod en feil under fjerning Emby Connect-kontoen. Kontroller at du har en aktiv Internett-tilkobling og pr\u00f8v igjen.", "ErrorAddingEmbyConnectAccount1": "Det oppstod en feil \u00e5 legge den Emby Connect-kontoen. Har du opprettet en Emby konto? Meld deg p\u00e5 her {0}.", "ErrorAddingEmbyConnectAccount2": "S\u00f8rg for at Emby kontoen er aktivert ved \u00e5 f\u00f8lge instruksjonene i e-posten som ble sent etter at du opprettet kontoen. Hvis du ikke har mottatt denne e-posten s\u00e5 kan du sende en e-post til {0} fra e-postadressen som brukes med Emby konto.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favoritt artist", "HeaderFavoriteSongs": "Favoritt sang", "HeaderConfirmPluginInstallation": "Bekreft Installasjon av Plugin", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/nl.json b/dashboard-ui/strings/nl.json index 021907161a..24f7b04e3d 100644 --- a/dashboard-ui/strings/nl.json +++ b/dashboard-ui/strings/nl.json @@ -13,11 +13,11 @@ "ButtonQuickStartGuide": "Snel start gids", "LabelYourFirstName": "Uw voornaam:", "MoreUsersCanBeAddedLater": "Meer gebruikers kunnen later via het dashboard worden toegevoegd.", - "UserProfilesIntro": "Emby heeft ingebouwde ondersteuning voor gebruikersprofielen die het mogelijk maken om elke gebruiker eigen scherminstellingen, afspeelinstellingen en ouderlijk toezicht te geven.", + "UserProfilesIntro": "Emby heeft ingebouwde ondersteuning voor gebruikersprofielen die het mogelijk maakt om elke gebruiker eigen scherminstellingen, afspeelinstellingen en ouderlijk toezicht te geven.", "LabelWindowsService": "Windows Service", "AWindowsServiceHasBeenInstalled": "Er is een Windows service ge\u00efnstalleerd.", - "WindowsServiceIntro1": "Emby Server draait normaalgesproken als een desktop applicatie met een icoon in het systeemvaak, maar als u dat wilt kunt u het als een achtergrondproces draaien. Het kan daarvoor worden gestart vanuit het Windows Services configuratiescherm.", - "WindowsServiceIntro2": "Wanneer u de Windows-service gebruikt, dan dient u er rekening mee te houden dat het niet op hetzelfde moment als de desktop applicatie kan worden uitgevoerd. Het is daarom vereist de desktop applicatie eerst af te sluiten voordat u de service gebruikt. De service moet worden geconfigureerd met beheerdersrechten via het configuratie scherm. Bij het uitvoeren als service, moet u rekening mee houden dat de service-account toegang heeft tot uw media-mappen.", + "WindowsServiceIntro1": "Emby Server draait normaal gesproken als een desktop applicatie met een icoon in het systeemvak, maar als u dat wilt kunt u het als een achtergrondproces draaien. Het kan daarvoor worden gestart vanuit het Windows Services configuratiescherm.", + "WindowsServiceIntro2": "Wanneer u de Windows service gebruikt, dient u er rekening mee te houden dat het niet op hetzelfde moment als de desktop applicatie kan worden uitgevoerd. Het is daarom vereist de desktop applicatie eerst af te sluiten voordat u de service gebruikt. De service moet worden geconfigureerd met beheerdersrechten via het configuratie scherm. Bij het uitvoeren als eenservice, moet u er rekening mee houden dat het service-account toegang heeft tot uw mappen met media bestanden.", "WizardCompleted": "Dat is alles wat we nu nodig hebben. Emby is begonnen met het verzamelen van informatie over uw media bibliotheek. Probeer sommige van onze apps en klik dan Finish<\/b> om het Server Dashboard<\/b> te bekijken.", "LabelConfigureSettings": "Configureer instellingen", "LabelEnableAutomaticPortMapping": "Automatische poorttoewijzing inschakelen", @@ -70,7 +70,7 @@ "OptionDetectArchiveFilesAsMediaHelp": "Indien ingeschakeld zullen bestanden met .rar en .zip extensies herkend worden als media bestanden.", "LabelEnterConnectUserName": "Gebruikersnaam of email:", "LabelEnterConnectUserNameHelp": "Dit is uw Emby Online Account gebruikersnaam of e-mailadres.", - "LabelEnableEnhancedMovies": "Verbeterde film displays inschakelen", + "LabelEnableEnhancedMovies": "Verbeterde film weergave inschakelen", "LabelEnableEnhancedMoviesHelp": "Wanneer ingeschakeld, zullen films worden weergegeven als mappen inclusief trailers, extra's, cast & crew en andere gerelateerde inhoud.", "HeaderSyncJobInfo": "Sync Opdrachten", "FolderTypeMixed": "Gemengde inhoud", @@ -121,7 +121,7 @@ "OptionSmartSubtitlesHelp": "Als de audio in een andere taal is zal de ondertiteling die overeenkomt met de voorkeurs taal geladen worden.", "OptionOnlyForcedSubtitles": "Alleen geforceerde ondertiteling", "OptionAlwaysPlaySubtitles": "Ondertiteling altijd weergeven", - "OptionDefaultSubtitlesHelp": "Ondertitels worden geladen op basis van de default en forced flags in de ingesloten metadata. Als er meerdere opties zijn wordt rekening gehouden met de taalvoorkeuren.", + "OptionDefaultSubtitlesHelp": "Ondertitels worden geladen op basis van de standaard en geforceerd markeringen in de ingesloten metadata. Als er meerdere opties zijn wordt rekening gehouden met de taalvoorkeuren.", "OptionOnlyForcedSubtitlesHelp": "Alleen ondertiteling gemarkeerd als \"gedwongen\" zullen worden geladen.", "OptionAlwaysPlaySubtitlesHelp": "Ondertiteling wordt weergegeveen in de voorkeurstaal ongeacht de taal van de audio.", "OptionNoSubtitlesHelp": "Ondertiteling wordt standaard niet weergegeven.", @@ -178,7 +178,7 @@ "TabMusicVideos": "Muziek Videos", "ButtonSort": "Sorteren", "OptionPlayed": "Afgespeeld", - "OptionUnplayed": "Onafgespeeld", + "OptionUnplayed": "Niet afgespeeld", "OptionAscending": "Oplopend", "OptionDescending": "Aflopend", "OptionRuntime": "Speelduur", @@ -216,7 +216,7 @@ "HeaderLatestSongs": "Nieuwste Titels", "HeaderRecentlyPlayed": "Recent afgespeeld", "HeaderFrequentlyPlayed": "Vaak afgespeeld", - "DevBuildWarning": "Development versies zijn geheel voor eigen risico. Deze versies worden vaak vrijgegeven en zijn niet getest! De Applicatie kan crashen en sommige functies kunnen mogelijk niet meer werken.", + "DevBuildWarning": "Ontwikkelaars versies zijn geheel voor eigen risico. Deze versies worden vaak vrijgegeven en zijn niet getest! De applicatie kan crashen en sommige functies kunnen mogelijk niet werken.", "LabelVideoType": "Video Type:", "OptionBluray": "Blu-ray", "OptionDvd": "Dvd", @@ -231,7 +231,7 @@ "TabMovies": "Films", "TabStudios": "Studio's", "TabTrailers": "Trailers", - "LabelArtists": "Artiest:", + "LabelArtists": "Artiesten:", "LabelArtistsHelp": "Scheidt meerdere met een ;", "HeaderLatestTrailers": "Nieuwste Trailers", "OptionHasSpecialFeatures": "Extra's", @@ -269,7 +269,7 @@ "TabBecomeSupporter": "Verkrijg Emby Premiere", "TabEmbyPremiere": "Emby Premiere", "ProjectHasCommunity": "Emby heeft een bloeiende gemeenschap van gebruikers en medewerkers.", - "CheckoutKnowledgeBase": "Bekijk onze knowledge base om u te helpen het meeste uit Emby halen.", + "CheckoutKnowledgeBase": "Bekijk onze Kennisbank om u te helpen het meeste uit Emby halen.", "SearchKnowledgeBase": "Zoek in de Kennisbank", "VisitTheCommunity": "Bezoek de Gemeenschap", "VisitProjectWebsite": "Bezoek de Emby Website", @@ -314,7 +314,7 @@ "LabelAllowServerAutoRestart": "Automatisch herstarten van de server toestaan om updates toe te passen", "LabelAllowServerAutoRestartHelp": "De server zal alleen opnieuw opstarten tijdens inactieve perioden, wanneer er geen gebruikers actief zijn.", "LabelRunServerAtStartup": "Start server bij het aanmelden", - "LabelRunServerAtStartupHelp": "Dit start de applicatie als pictogram in het systeemvak tijdens het aanmelden van Windows. Om de Windows-service te starten, schakelt u deze uit en start u de service via het Configuratiescherm van Windows. Houd er rekening mee dat u de service en de applicatie niet tegelijk kunt uitvoeren, u moet dus eerst de applicatie sluiten alvorens u de service start.", + "LabelRunServerAtStartupHelp": "Dit start de applicatie als pictogram in het systeemvak tijdens het aanmelden van Windows. Om de Windows service te starten, vinkt u dit uit en start u de service via het Windos configuratie scherm. Houd er rekening mee dat u de service en de applicatie niet tegelijk kunt uitvoeren. U moet dus eerst de applicatie sluiten voordat u de service start.", "ButtonSelectDirectory": "Selecteer map", "LabelCachePath": "Cache pad:", "LabelCachePathHelp": "Geef een aangepaste lokatie voor cache bestanden zoals afbeeldingen. Laat leeg om de standaard lokatie te gebruiken.", @@ -435,7 +435,7 @@ "HeaderMediaFolders": "Media Mappen", "HeaderThemeVideos": "Thema Video's", "HeaderThemeSongs": "Herkenningsmelodie", - "HeaderScenes": "Scenes", + "HeaderScenes": "Hoofdstukken", "HeaderAwardsAndReviews": "Awards en recensies", "HeaderSoundtracks": "Soundtracks", "HeaderMusicVideos": "Music Video's", @@ -451,7 +451,7 @@ "HeaderTo": "Naar", "LabelFrom": "Van:", "LabelTo": "Naar:", - "LabelToHelp": "Voorbeeld: \\\\Server\\Films (een pad waar apps bij kunnen)", + "LabelToHelp": "Voorbeeld: \\\\Server\\Films (een pad dat Emby apps kunnen benaderen)", "ButtonAddPathSubstitution": "Vervanging toevoegen", "OptionSpecialEpisode": "Specials", "OptionMissingEpisode": "Ontbrekende Afleveringen", @@ -459,7 +459,7 @@ "OptionEpisodeSortName": "Aflevering Sorteer Naam", "OptionSeriesSortName": "Serie Naam", "OptionTvdbRating": "Tvdb Waardering", - "EditCollectionItemsHelp": "Toevoegen of verwijderen van alle films, series, albums, boeken of games die u wilt groeperen in deze collectie.", + "EditCollectionItemsHelp": "Toevoegen of verwijderen van alle films, series, albums, boeken of games die u in deze collectie wilt groeperen.", "HeaderAddTitles": "Titels toevoegen", "LabelEnableDlnaPlayTo": "DLNA Afspelen Met inschakelen", "LabelEnableDlnaPlayToHelp": "Emby kan apparaten detecteren binnen uw netwerk en biedt de mogelijkheid om ze op afstand te controleren", @@ -505,7 +505,7 @@ "LabelMinResumePercentage": "Percentage (min.):", "LabelMaxResumePercentage": "Percentage (max.):", "LabelMinResumeDuration": "Minimale duur (seconden):", - "LabelMinResumePercentageHelp": "Titels worden ingesteld als onafgespeeld indien gestopt voor deze tijd", + "LabelMinResumePercentageHelp": "Titels worden als niet afgespeeld beschouwd indien gestopt voor deze tijd", "LabelMaxResumePercentageHelp": "Titels worden ingesteld als volledig afgespeeld indien gestopt na deze tijd", "LabelMinResumeDurationHelp": "Titels korter dan dit zullen niet hervatbaar zijn", "TitleAutoOrganize": "Automatisch Organiseren", @@ -654,7 +654,7 @@ "TabNowPlaying": "Wordt nu afgespeeld", "TabNavigation": "Navigatie", "TabControls": "Besturing", - "ButtonScenes": "Scenes", + "ButtonScenes": "Hoofdstukken", "ButtonSubtitles": "Ondertiteling", "ButtonPreviousTrack": "Vorige track", "ButtonNextTrack": "Volgende track", @@ -871,7 +871,7 @@ "ViewTypeMusicFavoriteArtists": "Favoriete artiesten", "ViewTypeMusicFavoriteSongs": "Favoriete titels", "HeaderMyViews": "Mijn Overzichten", - "LabelSelectFolderGroups": "De inhoud van de volgende mappen automatisch groeperen in de secties zoals Films, Muziek en TV:", + "LabelSelectFolderGroups": "De inhoud van de volgende mappen automatisch groeperen in secties zoals Films, Muziek en TV:", "LabelSelectFolderGroupsHelp": "Mappen die niet aangevinkt zijn worden getoond in hun eigen weergave.", "OptionDisplayAdultContent": "Toon Inhoud voor volwassen", "OptionLibraryFolders": "Media mappen", @@ -1099,7 +1099,7 @@ "LabelConnectUserNameHelp": "Verbind deze locale gebruiker aan een online Emby account om eenvoudig aanmelden vanaf elke Emby app toe te staan zonder dat u het IP-adres hoeft te weten.", "ButtonLearnMoreAboutEmbyConnect": "Leer meer over Emby Connect", "LabelExternalPlayers": "Externe spelers:", - "LabelExternalPlayersHelp": "Toon knoppen om inhoud in externe spelers of te spelen. Dit is alleen mogelijk op apparaten die 'url schemes' ondersteunen, meest Android en iOS. Met externe spelers is er over het algemeen geen ondersteuning voor afstandsbediening of hervatten.", + "LabelExternalPlayersHelp": "Toon knoppen om inhoud in externe spelers of te spelen. Dit is alleen mogelijk op apparaten die 'url schemes' ondersteunen, zoals Android en iOS. Met externe spelers is er over het algemeen geen ondersteuning voor afstandsbediening of hervatten.", "LabelNativeExternalPlayersHelp": "Toon knoppen om media in externe spelers te kunnen spelen.", "HeaderSubtitleProfile": "Ondertitelingsprofiel", "HeaderSubtitleProfiles": "Ondertitelingsprofielen", @@ -1122,7 +1122,7 @@ "LabelEnableCinemaModeFor": "Schakel cinema mode in voor:", "CinemaModeConfigurationHelp": "Cinema mode brengt de theater ervaring naar uw woonkamer met de mogelijkheid om trailers en eigen intro's voor de film af te spelen.", "OptionTrailersFromMyMovies": "Voeg trailers van films uit mijn bibliotheek toe", - "OptionUpcomingMoviesInTheaters": "Voeg trailers van nieuwe en verwachte films toe", + "OptionUpcomingMoviesInTheaters": "Voeg trailers van nieuwe en verwachtte films toe", "LabelLimitIntrosToUnwatchedContent": "Gebruik alleen trailers van films die nog niet gekeken zijn", "LabelEnableIntroParentalControl": "Schakel slimme ouderlijke toezicht in", "LabelEnableIntroParentalControlHelp": "Trailers worden alleen geselecteerd als de ouderlijke toezicht lager of gelijk is aan de film die gekeken wordt.", @@ -1287,7 +1287,7 @@ "GuideProviderSelectListings": "Selecteer lijst", "GuideProviderLogin": "Log in", "LabelLineup": "Lineup:", - "MessageTunerDeviceNotListed": "Wordt uw tuner niet getoond? Porbeer een externe service provider te installeren om meer Live TV opties te krijgen.", + "MessageTunerDeviceNotListed": "Wordt uw tuner niet getoond? Probeer een externe service provider te installeren om meer Live TV opties te krijgen.", "LabelImportOnlyFavoriteChannels": "Gebruik alleen kanalen die favoriet zijn", "ImportFavoriteChannelsHelp": "Bij inschakelen zullen alleen kanalen ge\u00efmporteerd worden die op de tuner als favoriet aangemerkt zijn.", "ButtonRepeat": "Herhaling", @@ -1318,7 +1318,7 @@ "LabelDataProvider": "Gegevensleverancier:", "OptionSendRecordingsToAutoOrganize": "Automatisch organiseren van opnames in de bestaande serie mappen van andere bibliotheken", "HeaderDefaultPadding": "Standaard 'Padding'", - "OptionEnableRecordingSubfolders": "Maak sub-mappen voor categorie\u00ebn zoals sport, Kids, etc. ", + "OptionEnableRecordingSubfolders": "Maak sub-mappen voor categorie\u00ebn zoals Sport, Kinderen, enz.", "HeaderSubtitles": "Ondertiteling", "HeaderVideos": "Video's", "LabelHardwareAccelerationType": "Hardware acceleratie:", @@ -1439,7 +1439,7 @@ "HeaderWelcomeBack": "Welkom terug!", "ButtonTakeTheTourToSeeWhatsNew": "Volg de tour om te zien wat nieuw is", "MessageNoSyncJobsFound": "Geen sync opdrachten gevonden. Maak sync opdrachten via de Synchronisatie knoppen in de web interface.", - "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", + "MessageDownloadsFound": "Geen offline downloads. Maak uw media offline beschikbaar door te klikken op Offline beschikbaar maken in de hele app.", "HeaderSelectDevices": "Selecteer Apparaten", "ButtonCancelItem": "Annuleren item", "ButtonQueueForRetry": "Wachtrij voor opnieuw proberen", @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "Afspeel Fout", "MessagePlaybackErrorNotAllowed": "U bent niet bevoegd om deze content af te spelen. Neem contact op met uw systeembeheerder voor meer informatie.", "MessagePlaybackErrorNoCompatibleStream": "Geen compatibele streams beschikbaar. Probeer het later opnieuw of neem contact op met de serverbeheerder.", - "MessagePlaybackErrorRateLimitExceeded": "Uw afspeel rate limiet is overschreden. Neem contact op met de beheerder van de server voor details.", "MessagePlaybackErrorPlaceHolder": "De gekozen content is niet af te spelen vanaf dit apparaat.", "HeaderSelectAudio": "Selecteer geluid", "HeaderSelectSubtitles": "Selecteer ondertiteling", @@ -1485,7 +1484,7 @@ "MessageConfirmRecordingCancellation": "Weet u zeker dat u deze opname wilt annuleren?", "MessageRecordingCancelled": "Opname geannuleerd.", "MessageRecordingScheduled": "Opname schema", - "HeaderConfirmSeriesCancellation": "Bevestigen Series Annulering", + "HeaderConfirmSeriesCancellation": "Bevestig Annulering Series", "MessageConfirmSeriesCancellation": "Weet u zeker dat u deze serie wilt annuleren?", "MessageSeriesCancelled": "Serie geannuleerd.", "HeaderConfirmRecordingDeletion": "Bevestigen Verwijdering Opname", @@ -1714,7 +1713,7 @@ "MessageConfirmRemoveMediaLocation": "Weet u zeker dat u deze locatie wilt verwijderen?", "LabelNewName": "Nieuwe naam:", "HeaderAddMediaFolder": "Voeg media map toe", - "HeaderAddMediaFolderHelp": "Naam (Films, Muziek, TV etc):", + "HeaderAddMediaFolderHelp": "Naam (Films, Muziek, TV enz.):", "HeaderRemoveMediaFolder": "Verwijder media map", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "De volgende media locaties worden verwijderd uit de Emby bibliotheek:", "MessageAreYouSureYouWishToRemoveMediaFolder": "Weet u zeker dat u deze media map wilt verwijderen?", @@ -1941,7 +1940,7 @@ "MyDevice": "Mijn apparaat", "ButtonRemote": "Afstandsbediening", "TabCast": "Cast", - "TabScenes": "Scenes", + "TabScenes": "Hoofdstukken", "HeaderUnlockApp": "App vrijgeven", "HeaderUnlockSync": "Ontgrendel Emby Sync", "MessageUnlockAppWithPurchaseOrSupporter": "Ontgrendel deze functie met een kleine eenmalige aankoop, of met een actief Emby Premiere abonnement.", @@ -2021,11 +2020,12 @@ "MessageTryMicrosoftEdge": "Voor een betere ervaring in Windows 10 gebruikt u de nieuwe Microsoft Edge webbrowser.", "MessageTryModernBrowser": "Voor een betere ervaring in Windows, probeer een moderne webbrowser zoals Google Chrome, Firefox of Opera.", "ErrorAddingListingsToSchedulesDirect": "Er ging iets mis bij het toevoegen van de lineup aan uw Schedules Direct account. Schedules Direct staat maar een beperkt aantal lineups per account toe. Het kan nodig zijn dat u zich aan moet melden op de Schedules Direct website en andere lineups moet verwijderen voordat u verder kunt.", - "PleaseAddAtLeastOneFolder": "Voeg ten minste 1 map to aan deze bibliotheek door op de Toevoegen knop te klikken.", + "PleaseAddAtLeastOneFolder": "Voeg tenminste 1 map aan deze bibliotheek toe door op de Toevoegen knop te klikken.", "ErrorAddingMediaPathToVirtualFolder": "Er ging iets mis bij het toevoegen van het media pad. Controleer of het pad klopt en of het Emby server process toegang heeft tot het pad.", "ErrorRemovingEmbyConnectAccount": "Er ging iets mis bij het verwijderen van het Emby Connect account. Controleer de internet verbinding en probeer het opnieuw.", "ErrorAddingEmbyConnectAccount1": "Er ging iets mis bij het toevoegen van de Emby Connect account. Hebt u een Emby account aangemaakt? Registreer op {0}.", "ErrorAddingEmbyConnectAccount2": "Verzekert u zich er a.u.b. van dat het Emby account geactiveerd is door de instructies te volgen in de e-mail die verstuurd is na het aanmaken van de account. Als u deze mail niet ontvangen hebt, stuur dan a.u.b. een e-mail naar {0} vanaf het e-mailadres dat gebruikt is bij het aanmaken van het Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favoriete Artiest", "HeaderFavoriteSongs": "Favoriete Titels", "HeaderConfirmPluginInstallation": "Bevestig Plugin Installatie", @@ -2109,32 +2109,33 @@ "MoreFromValue": "Meer van {0}", "OptionSaveMetadataAsHiddenHelp": "Het veranderen van dit zal gelden voor nieuwe metadata die wordt opgeslagen. Bestaande metadata bestanden zullen de volgende keer dat ze worden opgeslagen door Emby Server worden bijgewerkt.", "EnablePhotos": "Inschakelen foto's", - "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", + "EnablePhotosHelp": "Foto's worden herkend en weergegeven naast andere mediabestanden.", "MakeAvailableOffline": "Maak offline beschikbaar", "ConfirmRemoveDownload": "Download verwijderen?", "RemoveDownload": "Download verwijderen", "SyncToOtherDevices": "Synchroniseer met andere apparaten", "ManageOfflineDownloads": "Beheer offline downloads", - "MessageDownloadScheduled": "Download scheduled", + "MessageDownloadScheduled": "Download gepland", "RememberMe": "Onthoud mij", "HeaderOfflineSync": "Offline Sync", - "LabelMaxAudioFileBitrate": "Max audio file bitrate:", + "LabelMaxAudioFileBitrate": "Max audiobestand bitrate:", "LabelMaxAudioFileBitrateHelp": "Audio bestanden met een hogere bitrate zullen door Emby Server worden geconverteerd. Selecteer een hogere waarde voor betere kwaliteit of een lagere waarde om diskruimte te besparen.", "LabelVaapiDevice": "VA API Apparaat:", - "LabelVaapiDeviceHelp": "This is the render node that is used for hardware acceleration.", - "HowToConnectFromEmbyApps": "How to Connect from Emby apps", - "MessageFolderRipPlaybackExperimental": "Support for playback of folder rips and ISOs in this app is only expirimental. For best results, try an Emby app that supports these formats natively, or use plain video files.", + "LabelVaapiDeviceHelp": "Dit is de render knooppunt dat wordt gebruikt voor hardwareversnelling.", + "HowToConnectFromEmbyApps": "Hoe te verbinden vanuit Emby apps", + "MessageFolderRipPlaybackExperimental": "Ondersteuning voor het afspelen van de map rips en ISO's in deze app is alleen expirimental. Voor het beste resultaat, probeer dan een Emby app die deze formaten native ondersteuning, of gebruik gewoon videobestanden.", "OptionExtractChapterImage": "Inschakelen uitpakken van hoofdstuk afbeeldingen", "Downloads": "Downloads", "LabelEnableDebugLogging": "Foutopsporings logboek inschakelen", "OptionEnableExternalContentInSuggestions": "Inschakelen externe inhoud in suggesties", - "OptionEnableExternalContentInSuggestionsHelp": "Allow internet trailers and live tv programs to be included within suggested content.", + "OptionEnableExternalContentInSuggestionsHelp": "Laat internet trailers en live-tv-programma's op te nemen binnen de voorgestelde inhoud.", "LabelH264EncodingPreset": "H264 codering preset:", - "H264EncodingPresetHelp": "Choose a faster value to improve performance, or a slower value to improve quality.", + "H264EncodingPresetHelp": "Kies een hogere waarde om de prestaties, of een tragere waarde om de kwaliteit te verbeteren.", "LabelH264Crf": "H264 encoding CRF:", - "H264CrfHelp": "The Constant Rate Factor (CRF) is the default quality setting for the x264 encoder. You can set the values between 0 and 51, where lower values would result in better quality (at the expense of higher file sizes). Sane values are between 18 and 28. The default for x264 is 23, so you can use this as a starting point.", + "H264CrfHelp": "De Constant Rate Factor (CRF) is de standaard kwaliteit instelling voor de x264-encoder. U kunt de waarden tussen 0 en 51, in voorkomend lagere waarden zou resulteren in een betere kwaliteit (ten koste van hogere bestandsgrootte). aanbevolen zijn waarden tussen de 18 en 28. De standaard voor de x264 is 23, zodat u deze kunt gebruiken als uitgangspunt.", "Sports": "Sport", "HeaderForKids": "Voor Kinderen", - "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Converteer opnames naar:" + "HeaderRecordingGroups": "Opname groepen", + "LabelConvertRecordingsTo": "Converteer opnames naar:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/pl.json b/dashboard-ui/strings/pl.json index 14cd73c2d5..abf0519837 100644 --- a/dashboard-ui/strings/pl.json +++ b/dashboard-ui/strings/pl.json @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "B\u0142\u0105d Odtwarzania", "MessagePlaybackErrorNotAllowed": "Obecnie nie jeste\u015b autoryzowany do odtwarzania tej zawarto\u015bci. prosz\u0119 skontaktuj si\u0119 ze swoim administratorem.", "MessagePlaybackErrorNoCompatibleStream": "Obecnie brak kompatybilnych stream\u00f3w. Prosz\u0119 spr\u00f3buj ponownie p\u00f3\u017aniej lub skontaktuj si\u0119 z administratorem systemu.", - "MessagePlaybackErrorRateLimitExceeded": "Tw\u00f3j limit odtwarzania wyczerpa\u0142 si\u0119. Prosz\u0119 skontaktuj si\u0119 z administratorem systemu.", "MessagePlaybackErrorPlaceHolder": "Wybrana zawarto\u015b\u0107 nie mo\u017ce by\u0107 odtwarzana z tego urz\u0105dzenia.", "HeaderSelectAudio": "Wybierz Audio", "HeaderSelectSubtitles": "Wybierz Napisy", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "Wyst\u0105pi\u0142 b\u0142\u0105d podczas usuwania konta Emby Connect. Prosz\u0119 upewnij si\u0119 \u017ce posiadasz aktywne po\u0142\u0105czenie z internetem i spr\u00f3buj ponownie.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Ulubieni arty\u015bci", "HeaderFavoriteSongs": "Ulubione utwory", "HeaderConfirmPluginInstallation": "Potwierd\u017a instalacj\u0119 pluginu", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/pt-BR.json b/dashboard-ui/strings/pt-BR.json index 4325281b6d..64eea60d54 100644 --- a/dashboard-ui/strings/pt-BR.json +++ b/dashboard-ui/strings/pt-BR.json @@ -90,7 +90,7 @@ "LabelCountry": "Pa\u00eds:", "LabelLanguage": "Idioma:", "LabelTimeLimitHours": "Limite de tempo (horas):", - "HeaderPreferredMetadataLanguage": "Idioma preferido dos metadados:", + "HeaderPreferredMetadataLanguage": "Idioma Preferido dos Metadados", "LabelSaveLocalMetadata": "Salvar artwork e metadados dentro das pastas da m\u00eddia", "LabelSaveLocalMetadataHelp": "Salvar artwork e metadados diretamente nas pastas da m\u00eddia as deixar\u00e1 em um local f\u00e1cil para edit\u00e1-las.", "LabelDownloadInternetMetadata": "Fazer download das imagens e metadados da internet", @@ -338,7 +338,7 @@ "TitleMetadata": "Metadados", "LabelFanartApiKey": "Chave de api pessoal:", "LabelFanartApiKeyHelp": "Solicita\u00e7\u00f5es para fanart sem uma chave de API pessoal retornar\u00e3o imagens que foram aprovadas h\u00e1 mais de 7 dias. Com uma chave de API pessoal isso diminui para 48 horas e se voc\u00ea for um membro VIP da fanart, isso diminuir\u00e1 para aproximadamente 10 minutos.", - "ExtractChapterImagesHelp": "Extrair imagens de cap\u00edtulos permitir\u00e1 aos clientes exibir menus gr\u00e1ficos de sele\u00e7\u00e3o de cenas. O processo pode ser lento, demandar uso intensivo de cpu e pode exigir bastante espa\u00e7o em disco. Ele ser\u00e1 executado quando os v\u00eddeos forem descobertos e tamb\u00e9m como uma tarefa noturna. O agendamento pode ser configurado na \u00e1rea de tarefas agendadas. N\u00e3o \u00e9 recomendado executar esta tarefa durante as horas de pico de uso.", + "ExtractChapterImagesHelp": "Extrair imagens de cap\u00edtulos permitir\u00e1 aos apps Emby exibir menus gr\u00e1ficos de sele\u00e7\u00e3o de cenas. O processo pode ser lento, demandar uso intensivo de cpu e pode exigir bastante espa\u00e7o em disco. Ele ser\u00e1 executado quando os v\u00eddeos forem descobertos e tamb\u00e9m como uma tarefa noturna. O agendamento pode ser configurado na \u00e1rea de tarefas agendadas. N\u00e3o \u00e9 recomendado executar esta tarefa durante as horas de pico de uso.", "LabelMetadataDownloadLanguage": "Idioma preferido para download:", "ButtonSignIn": "Iniciar Sess\u00e3o", "TitleSignIn": "Iniciar Sess\u00e3o", @@ -446,12 +446,12 @@ "ButtonPlayTrailer": "Trailer", "LabelMissing": "Faltando", "LabelOffline": "Desconectado", - "PathSubstitutionHelp": "Substitui\u00e7\u00f5es de locais s\u00e3o usadas para mapear um local no servidor que possa ser acessado pelos clientes. Ao permitir o acesso dos clientes \u00e0 m\u00eddia no servidor, eles podem reproduzir diretamente atrav\u00e9s da rede e evitar o uso de recursos do servidor para fazer stream ou transcodifica\u00e7\u00e3o.", + "PathSubstitutionHelp": "Substitui\u00e7\u00f5es de locais s\u00e3o usadas para mapear um local no servidor que possa ser acessado pelos apps Emby. Ao permitir o acesso dos apps \u00e0 m\u00eddia no servidor, eles podem reproduzir diretamente atrav\u00e9s da rede e evitar o uso de recursos do servidor para fazer stream ou transcodifica\u00e7\u00e3o.", "HeaderFrom": "De", "HeaderTo": "Para", "LabelFrom": "De:", "LabelTo": "Para:", - "LabelToHelp": "Exemplo: \\\\MeuServidor\\Filmes (um local que os clientes possam acessar)", + "LabelToHelp": "Exemplo: \\\\MeuServidor\\Filmes (um local que os apps Emby possam acessar)", "ButtonAddPathSubstitution": "Adicionar Substitui\u00e7\u00e3o", "OptionSpecialEpisode": "Especiais", "OptionMissingEpisode": "Epis\u00f3dios Faltantes", @@ -494,7 +494,7 @@ "LabelPublicHttpsPort": "N\u00famero da porta p\u00fablica de https:", "LabelPublicHttpsPortHelp": "O n\u00famero da porta p\u00fablica que dever\u00e1 ser mapeada para a porta local de https.", "LabelEnableHttps": "Reportar https como um endere\u00e7o externo", - "LabelEnableHttpsHelp": "Se ativado, o servidor ir\u00e1 reportar uma url https para os clientes como um endere\u00e7o externo.", + "LabelEnableHttpsHelp": "Se ativado, o servidor ir\u00e1 reportar uma url https para os apps Emby como um endere\u00e7o externo.", "LabelHttpsPort": "N\u00famero da porta local de https:", "LabelHttpsPortHelp": "O n\u00famero da porta tcp que o servidor https do Emby deveria se conectar.", "LabelEnableAutomaticPortMap": "Ativar mapeamento autom\u00e1tico de portas", @@ -601,7 +601,7 @@ "TitleDlna": "DLNA", "HeaderServerSettings": "Ajustes do Servidor", "HeaderRequireManualLogin": "Necessita a digita\u00e7\u00e3o manual de um nome para:", - "HeaderRequireManualLoginHelp": "Quando desativados, os clientes podem mostrar a tela de login com uma sele\u00e7\u00e3o visual de usu\u00e1rios.", + "HeaderRequireManualLoginHelp": "Quando desativados, os apps Emby podem mostrar a tela de login com uma sele\u00e7\u00e3o visual de usu\u00e1rios.", "OptionOtherApps": "Outros apps", "OptionMobileApps": "Apps m\u00f3veis", "HeaderNotificationList": "Clique em uma notifica\u00e7\u00e3o para configurar as op\u00e7\u00f5es de envio.", @@ -703,7 +703,7 @@ "LabelEmbedAlbumArtDidl": "Embutir a capa do \u00e1lbum no Didl", "LabelEmbedAlbumArtDidlHelp": "Alguns dispositivos preferem este m\u00e9todo para obter a capa do \u00e1lbum. Outros podem falhar para reproduzir com esta op\u00e7\u00e3o ativada", "LabelAlbumArtPN": "PN da capa do \u00e1lbum:", - "LabelAlbumArtHelp": "O PN usado para a capa do album, dentro do atributo dlna:profileID em upnp:albumArtURI. Alguns clientes requerem um valor espec\u00edfico, independente do tamanho da imagem.", + "LabelAlbumArtHelp": "O PN usado para a capa do album, dentro do atributo dlna:profileID em upnp:albumArtURI. Alguns dispositivos requerem um valor espec\u00edfico, independente do tamanho da imagem.", "LabelAlbumArtMaxWidth": "Largura m\u00e1xima da capa do \u00e1lbum:", "LabelAlbumArtMaxWidthHelp": "Resolu\u00e7\u00e3o m\u00e1xima da capa do \u00e1lbum que \u00e9 exposta via upnp:albumArtURI.", "LabelAlbumArtMaxHeight": "Altura m\u00e1xima da capa do \u00e1lbum:", @@ -1231,7 +1231,7 @@ "OptionAllowMediaPlaybackTranscodingHelp": "Os usu\u00e1rios receber\u00e3o mensagens de erro amig\u00e1veis quando o conte\u00fado n\u00e3o for reproduz\u00edvel, baseado nas pol\u00edticas.", "TabStreaming": "Streaming", "LabelRemoteClientBitrateLimit": "Limite de taxa de bits para streaming da Internet (Mbps):", - "LabelRemoteClientBitrateLimitHelp": "Um limite opcional da taxa de bits de streaming para todos os clientes fora da rede. Esta op\u00e7\u00e3o \u00e9 \u00fatil para evitar que os clientes demandem uma taxa de bits maior que a permitida pela sua conex\u00e3o.", + "LabelRemoteClientBitrateLimitHelp": "Um limite opcional da taxa de bits de streaming para todos os dispositivos fora da rede. Esta op\u00e7\u00e3o \u00e9 \u00fatil para evitar que os dispositivos demandem uma taxa de bits maior que a permitida pela sua conex\u00e3o.", "LabelConversionCpuCoreLimit": "Limite de n\u00facleos da CPU:", "LabelConversionCpuCoreLimitHelp": "Limite o n\u00famero de n\u00facleos da CPU que ser\u00e3o usados durante a convers\u00e3o na sincroniza\u00e7\u00e3o", "OptionEnableFullSpeedConversion": "Ativar convers\u00e3o de alta velocidade", @@ -1342,9 +1342,9 @@ "FileExtension": "Extens\u00e3o do arquivo", "OptionReplaceExistingImages": "Substituir imagens existentes", "OptionPlayNextEpisodeAutomatically": "Reproduzir pr\u00f3ximo epis\u00f3dio automaticamente", - "OptionDownloadImagesInAdvance": "Fazer download de todas as imagens antecipadamente", + "OptionDownloadImagesInAdvance": "Fazer download das imagens antecipadamente", "SettingsSaved": "Ajustes salvos.", - "OptionDownloadImagesInAdvanceHelp": "Por padr\u00e3o, a maioria das imagens secund\u00e1rias s\u00e3o baixadas s\u00f3 quando um app do Emby solicita. Ativar esta op\u00e7\u00e3o far\u00e1 download de todas as imagens atencipadamente, assim que novas m\u00eddias s\u00e3o importadas.", + "OptionDownloadImagesInAdvanceHelp": "Por padr\u00e3o, a maioria das imagens s\u00e3o baixadas s\u00f3 quando um app Emby solicita. Ativar esta op\u00e7\u00e3o far\u00e1 download de todas as imagens atencipadamente, assim que novas m\u00eddias s\u00e3o importadas.", "Users": "Usu\u00e1rios", "Delete": "Excluir", "Password": "Senha", @@ -1367,7 +1367,7 @@ "PasswordMatchError": "A senha e a confirma\u00e7\u00e3o da senha devem ser iguais.", "UninstallPluginHeader": "Desinstalar Plugin", "UninstallPluginConfirmation": "Deseja realmente desinstalar {0}?", - "NoPluginConfigurationMessage": "Este plugin n\u00e3o precisa ser configurado.", + "NoPluginConfigurationMessage": "Este plugin n\u00e3o tem ajustes para configurar", "NoPluginsInstalledMessage": "N\u00e3o existem plugins instalados.", "BrowsePluginCatalogMessage": "Explore nosso cat\u00e1logo de plugins para ver os dispon\u00edveis.", "HeaderNewApiKey": "Nova Chave da Api", @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Erro na Reprodu\u00e7\u00e3o", "MessagePlaybackErrorNotAllowed": "Voc\u00ea n\u00e3o est\u00e1 autorizado a reproduzir este conte\u00fado. Por favor, entre em contato com o administrador do sistema para mais detalhes.", "MessagePlaybackErrorNoCompatibleStream": "N\u00e3o existem streams compat\u00edveis. Por favor, tente novamente mais tarde ou contate o administrador do sistema para mais detalhes.", - "MessagePlaybackErrorRateLimitExceeded": "Seu limite da taxa de reprodu\u00e7\u00e3o foi excedido. Por favor, entre em contato com o administrador do sistema para mais detalhes.", - "MessagePlaybackErrorPlaceHolder": "O conte\u00fado escolhido n\u00e3o \u00e9 reproduz\u00edvel neste dispositivo.", + "MessagePlaybackErrorPlaceHolder": "Por favor insira o disco para reproduzir este v\u00eddeo.", "HeaderSelectAudio": "Selecione \u00c1udio", "HeaderSelectSubtitles": "Selecione Legendas", "ButtonMarkForRemoval": "Remover do dispositivo", @@ -1722,7 +1721,7 @@ "ButtonChangeContentType": "Alterar o tipo de conte\u00fado", "HeaderMediaLocations": "Localiza\u00e7\u00f5es de M\u00eddia", "LabelContentTypeValue": "Tipo de conte\u00fado: {0}", - "LabelPathSubstitutionHelp": "Opcional: Substitui\u00e7\u00e3o de local pode mapear locais do servidor para compartilhamentos de rede de forma a que os clientes possam acessar para reprodu\u00e7\u00e3o direta.", + "LabelPathSubstitutionHelp": "Opcional: Substitui\u00e7\u00e3o de local pode mapear locais do servidor para compartilhamentos de rede de forma a que os apps Emby possam acessar para reprodu\u00e7\u00e3o direta.", "FolderTypeUnset": "Indefinido (conte\u00fado misto)", "BirthPlaceValue": "Local de nascimento: {0}", "DeathDateValue": "Morte: {0}", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "Ocorreu um erro ao remover a conta do Emby Connect. Por favor, assegure-se que possui uma conex\u00e3o de internet ativa e tente novamente.", "ErrorAddingEmbyConnectAccount1": "Ocorreu um erro ao adicionar a conta do Emby Connect. Voc\u00ea j\u00e1 criou uma conta Emby? Registre-se em {0}.", "ErrorAddingEmbyConnectAccount2": "Por favor, certifique-se que a conta Emby foi ativada seguindo as instru\u00e7\u00f5es do e-mail enviado ap\u00f3s a cria\u00e7\u00e3o da conta. Se n\u00e3o recebeu o e-mail, por favor envie um e-mail para {0} a partir do endere\u00e7o de e-mail usado na conta Emby.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Artistas Favoritos", "HeaderFavoriteSongs": "M\u00fasicas Favoritas", "HeaderConfirmPluginInstallation": "Confirmar a Instala\u00e7\u00e3o do Plugin", @@ -2136,5 +2136,6 @@ "Sports": "Esportes", "HeaderForKids": "Para Crian\u00e7as", "HeaderRecordingGroups": "Grupos de Grava\u00e7\u00e3o", - "LabelConvertRecordingsTo": "Converter grava\u00e7\u00f5es para:" + "LabelConvertRecordingsTo": "Converter grava\u00e7\u00f5es para:", + "HeaderUpcomingOnTV": "Chegando na TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/pt-PT.json b/dashboard-ui/strings/pt-PT.json index 21b3da9f88..f47315e66d 100644 --- a/dashboard-ui/strings/pt-PT.json +++ b/dashboard-ui/strings/pt-PT.json @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "Erro na Reprodu\u00e7\u00e3o", "MessagePlaybackErrorNotAllowed": "N\u00e3o est\u00e1 autorizado a reproduzir este conte\u00fado. Por favor, contacte o administrador do sistema para mais detalhes.", "MessagePlaybackErrorNoCompatibleStream": "N\u00e3o existem streams compat\u00edveis. Por favor, tente novamente mais tarde ou contate o administrador do sistema para mais detalhes.", - "MessagePlaybackErrorRateLimitExceeded": "O seu limite da taxa de reprodu\u00e7\u00e3o foi excedido. Por favor, entre em contato com o administrador do sistema para mais detalhes.", "MessagePlaybackErrorPlaceHolder": "O conte\u00fado escolhido n\u00e3o \u00e9 reproduz\u00edvel neste dispositivo.", "HeaderSelectAudio": "Selecione \u00c1udio", "HeaderSelectSubtitles": "Selecione Legendas", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/ro.json b/dashboard-ui/strings/ro.json index 25e06c6d18..75a51cf325 100644 --- a/dashboard-ui/strings/ro.json +++ b/dashboard-ui/strings/ro.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/ru.json b/dashboard-ui/strings/ru.json index 7108d14b74..8c5f0cd53b 100644 --- a/dashboard-ui/strings/ru.json +++ b/dashboard-ui/strings/ru.json @@ -19,7 +19,7 @@ "WindowsServiceIntro1": "Emby Server \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e \u0437\u043d\u0430\u0447\u043a\u043e\u043c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u043b\u043e\u0442\u043a\u0435, \u043d\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u043a\u0430\u043a \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u0441\u043b\u0443\u0436\u0431\u044b, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u0441\u043b\u0443\u0436\u0431 Windows.", "WindowsServiceIntro2": "\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u043b\u0443\u0436\u0431\u044b Windows, \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0435\u0451 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u043a\u043e\u043c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u043b\u043e\u0442\u043a\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0437\u043d\u0430\u0447\u043a\u0430 \u0432 \u043b\u043e\u0442\u043a\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0443\u0436\u0431\u0430 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430. \u0421\u043b\u0443\u0436\u0431\u0443 \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c, \u0432\u043e\u0439\u0434\u044f \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u043c. \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u0430\u043a \u0441\u043b\u0443\u0436\u0431\u044b, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0441\u043b\u0443\u0436\u0431\u044b \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0438\u043c \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043a\u0430\u043c.", "WizardCompleted": "\u042d\u0442\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441. Emby \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0432\u0430\u0448\u0435\u0439 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0435. \u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u043f\u043e\u043a\u0430 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0430\u0448\u0438\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u0413\u043e\u0442\u043e\u0432\u043e<\/b>, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u041f\u0430\u043d\u0435\u043b\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/b>.", - "LabelConfigureSettings": "\u041d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b", + "LabelConfigureSettings": "\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b", "LabelEnableAutomaticPortMapping": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u043e\u0432", "LabelEnableAutomaticPortMappingHelp": "UPnP \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432.", "HeaderTermsOfService": "\u0423\u0441\u043b\u043e\u0432\u0438\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433 Emby", @@ -27,7 +27,7 @@ "OptionIAcceptTermsOfService": "\u042f \u0441\u043e\u0433\u043b\u0430\u0448\u0430\u044e\u0441\u044c \u0441 \u0423\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433", "ButtonPrivacyPolicy": "\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438...", "ButtonTermsOfService": "\u0423\u0441\u043b\u043e\u0432\u0438\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433...", - "HeaderDeveloperOptions": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432", + "HeaderDeveloperOptions": "\u041e\u043f\u0446\u0438\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432", "OptionEnableWebClientResponseCache": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0431-\u043e\u0442\u043a\u043b\u0438\u043a\u043e\u0432", "OptionDisableForDevelopmentHelp": "\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0439\u0442\u0435 \u0438\u0445, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0434\u043b\u044f \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.", "OptionEnableWebClientResourceMinification": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u0435\u0431-\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432", @@ -37,7 +37,7 @@ "ButtonOrganize": "\u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c", "HeaderSupporterBenefits": "\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b Emby Premiere", "HeaderAddUser": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f", - "LabelAddConnectSupporterHelp": "\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0435\u0433\u043e \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u0441 Emby Connect \u0441 \u0435\u0433\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.", + "LabelAddConnectSupporterHelp": "\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0435\u0433\u043e \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u043a Emby Connect \u0441 \u0435\u0433\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u044f.", "LabelPinCode": "PIN-\u043a\u043e\u0434:", "OptionHideWatchedContentFromLatestMedia": "\u0421\u043a\u0440\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0438\u0437 \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445", "HeaderSync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f", @@ -90,7 +90,7 @@ "LabelCountry": "\u0421\u0442\u0440\u0430\u043d\u0430:", "LabelLanguage": "\u042f\u0437\u044b\u043a:", "LabelTimeLimitHours": "\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u0447\u0430\u0441\u044b):", - "HeaderPreferredMetadataLanguage": "\u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445:", + "HeaderPreferredMetadataLanguage": "\u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", "LabelSaveLocalMetadata": "\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u044c \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043e\u043a", "LabelSaveLocalMetadataHelp": "\u041f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0439 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u044c \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043e\u043a, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432 \u0442\u0430\u043a\u043e\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0433\u0434\u0435 \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0430\u0432\u0438\u0442\u044c.", "LabelDownloadInternetMetadata": "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430", @@ -121,7 +121,7 @@ "OptionSmartSubtitlesHelp": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u044f\u0437\u044b\u043a\u0430, \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f, \u0435\u0441\u043b\u0438 \u0430\u0443\u0434\u0438\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u043c.", "OptionOnlyForcedSubtitles": "\u0422\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u0440\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b", "OptionAlwaysPlaySubtitles": "\u0412\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0441 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u0430\u043c\u0438", - "OptionDefaultSubtitlesHelp": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u043b\u0430\u0433\u0430\u043c\u0438 \"\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u0435\" \u0438 \"\u0444\u043e\u0440\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\" \u0432\u043e \u0432\u043d\u0435\u0434\u0440\u0451\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. \u042f\u0437\u044b\u043a\u043e\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432.", + "OptionDefaultSubtitlesHelp": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u043b\u0430\u0433\u0430\u043c\u0438 \"\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u0435\" \u0438 \"\u0444\u043e\u0440\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\" \u0432\u043e \u0432\u043d\u0435\u0434\u0440\u0451\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. \u042f\u0437\u044b\u043a\u043e\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u043f\u0446\u0438\u0439.", "OptionOnlyForcedSubtitlesHelp": "\u0411\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u0430\u043a \u0444\u043e\u0440\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435.", "OptionAlwaysPlaySubtitlesHelp": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u044f\u0437\u044b\u043a\u0430, \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u044f\u0437\u044b\u043a\u0430 \u0430\u0443\u0434\u0438\u043e.", "OptionNoSubtitlesHelp": "\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f.", @@ -138,7 +138,7 @@ "LabelMaxParentalRating": "\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f:", "MaxParentalRatingHelp": "\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0441 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0440\u044b\u0442\u043e \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f", "LibraryAccessHelp": "\u0412\u044b\u0434\u0435\u043b\u0438\u0442\u0435 \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043a\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u00ab\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445\u00bb.", - "ChannelAccessHelp": "\u0412\u044b\u0434\u0435\u043b\u0438\u0442\u0435 \u043a\u0430\u043d\u0430\u043b\u044b, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u00ab\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445\u00bb.", + "ChannelAccessHelp": "\u0412\u044b\u0434\u0435\u043b\u0438\u0442\u0435 \u043a\u0430\u043d\u0430\u043b\u044b, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u0430\u043d\u0430\u043b\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u00ab\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445\u00bb.", "ButtonDeleteImage": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043e\u043a", "LabelSelectUsers": "\u0412\u044b\u0431\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439:", "ButtonUpload": "\u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0432\u044b\u043a\u043b\u0430\u0434\u043a\u0443", @@ -232,7 +232,7 @@ "TabStudios": "\u0421\u0442\u0443\u0434\u0438\u0438", "TabTrailers": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u044b", "LabelArtists": "\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438:", - "LabelArtistsHelp": "\u0414\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u00ab;\u00bb", + "LabelArtistsHelp": "\u0414\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0442\u043e\u0447\u043a\u0443 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 (;)", "HeaderLatestTrailers": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u044b", "OptionHasSpecialFeatures": "\u0414\u043e\u043f. \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b", "OptionImdbRating": "\u041e\u0446\u0435\u043d\u043a\u0430 IMDb", @@ -273,7 +273,7 @@ "SearchKnowledgeBase": "\u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0411\u0430\u0437\u0435 \u0437\u043d\u0430\u043d\u0438\u0439", "VisitTheCommunity": "\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u044c \u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e", "VisitProjectWebsite": "\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u044c \u0441\u0430\u0439\u0442 Emby", - "VisitProjectWebsiteLong": "\u041f\u043e\u0441\u0435\u0449\u0430\u0439\u0442\u0435 \u0441\u0430\u0439\u0442 Emby, \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u043d\u043e\u0432\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0431\u043b\u043e\u0433\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.", + "VisitProjectWebsiteLong": "\u041f\u043e\u0441\u0435\u0449\u0430\u0439\u0442\u0435 \u0441\u0430\u0439\u0442 Emby, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u0432\u0435\u0436\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u0438 \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0431\u043b\u043e\u0433\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.", "OptionHideUser": "\u0421\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0432\u0445\u043e\u0434\u0430", "OptionHideUserFromLoginHelp": "\u0426\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u0434\u043b\u044f \u043b\u0438\u0447\u043d\u044b\u0445 \u0438\u043b\u0438 \u0441\u043a\u0440\u044b\u0442\u044b\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0441\u043a\u0438\u0445 \u0443\u0447\u0451\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0431\u0443\u0434\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u0432\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0432\u0432\u043e\u0434\u044f \u0441\u0432\u043e\u0451 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c.", "OptionDisableUser": "\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f", @@ -367,7 +367,7 @@ "OptionRecordOnAllChannels": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043e \u0432\u0441\u0435\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432", "OptionRecordAnytime": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f", "OptionRecordOnlyNewEpisodes": "\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0435 \u044d\u043f\u0438\u0437\u043e\u0434\u044b", - "HeaderRepeatingOptions": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f", + "HeaderRepeatingOptions": "\u041e\u043f\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f", "HeaderDays": "\u0414\u043d\u0438", "HeaderActiveRecordings": "\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438", "HeaderLatestRecordings": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438", @@ -446,7 +446,7 @@ "ButtonPlayTrailer": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440...", "LabelMissing": "\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442", "LabelOffline": "\u0410\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e", - "PathSubstitutionHelp": "\u041f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0443\u0442\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0443\u0442\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441 \u043f\u0443\u0442\u0451\u043c, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f. \u041f\u0440\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u043e \u0441\u0435\u0442\u0438, \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0430 \u0438\u0445 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044e \u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443.", + "PathSubstitutionHelp": "\u041f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0443\u0442\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0443\u0442\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441 \u043f\u0443\u0442\u0451\u043c, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f. \u041f\u0440\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u043e \u0441\u0435\u0442\u0438, \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043d\u0430 \u0438\u0445 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044e \u0438 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443.", "HeaderFrom": "\u0421", "HeaderTo": "\u041d\u0430", "LabelFrom": "\u0421:", @@ -511,7 +511,7 @@ "TitleAutoOrganize": "\u0410\u0432\u0442\u043e\u043f\u043e\u0440\u044f\u0434\u043e\u043a", "TabActivityLog": "\u0416\u0443\u0440\u043d\u0430\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439", "TabSmartMatches": "\u0423\u043c\u043d\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f", - "TabSmartMatchInfo": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0430\u0448\u0438\u043c\u0438 \"\u0443\u043c\u043d\u044b\u043c\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f\u043c\u0438\", \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0410\u0432\u0442\u043e\u043f\u043e\u0440\u044f\u0434\u043a\u0430", + "TabSmartMatchInfo": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0430\u0448\u0438\u043c\u0438 \"\u0443\u043c\u043d\u044b\u043c\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f\u043c\u0438\", \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0410\u0432\u0442\u043e\u043f\u043e\u0440\u044f\u0434\u043a\u0430", "HeaderName": "\u0418\u043c\u044f", "HeaderDate": "\u0414\u0430\u0442\u0430", "HeaderSource": "\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a", @@ -548,7 +548,7 @@ "HeaderPattern": "\u0428\u0430\u0431\u043b\u043e\u043d", "HeaderResult": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442", "LabelDeleteEmptyFolders": "\u0423\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f", - "LabelDeleteEmptyFoldersHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u0447\u0438\u0441\u0442\u044b\u043c.", + "LabelDeleteEmptyFoldersHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u0447\u0438\u0441\u0442\u044b\u043c.", "LabelDeleteLeftOverFiles": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438:", "LabelDeleteLeftOverFilesHelp": "\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0439\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u00ab;\u00bb. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: .nfo;.txt", "OptionOverwriteExistingEpisodes": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u044d\u043f\u0438\u0437\u043e\u0434\u044b", @@ -597,14 +597,14 @@ "LabelBlastMessageInterval": "\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u0441", "LabelBlastMessageIntervalHelp": "\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.", "LabelDefaultUser": "\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c:", - "LabelDefaultUserHelp": "\u041f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f, \u0447\u044c\u044f \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445. \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u0439.", + "LabelDefaultUserHelp": "\u041f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f, \u0447\u044c\u044f \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445. \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u0438.", "TitleDlna": "DLNA", "HeaderServerSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430", "HeaderRequireManualLogin": "\u0420\u0443\u0447\u043d\u043e\u0439 \u0432\u0432\u043e\u0434 \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f:", "HeaderRequireManualLoginHelp": "\u041f\u0440\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u0434\u043b\u044f Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 \u0432\u0445\u043e\u0434\u0430 \u0441 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.", "OptionOtherApps": "\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", "OptionMobileApps": "\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", - "HeaderNotificationList": "\u0429\u0451\u043b\u043a\u043d\u0438\u0442\u0435 \u043f\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438.", + "HeaderNotificationList": "\u0429\u0451\u043b\u043a\u043d\u0438\u0442\u0435 \u043f\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u043f\u0446\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438.", "NotificationOptionApplicationUpdateAvailable": "\u0418\u043c\u0435\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", "NotificationOptionApplicationUpdateInstalled": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e", "NotificationOptionPluginUpdateInstalled": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e", @@ -622,7 +622,7 @@ "NotificationOptionNewLibraryContentMultiple": "\u041d\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e (\u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e)", "NotificationOptionCameraImageUploaded": "\u041f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0432\u044b\u043a\u043b\u0430\u0434\u043a\u0430 \u043e\u0442\u0441\u043d\u044f\u0442\u043e\u0433\u043e \u0441 \u043a\u0430\u043c\u0435\u0440\u044b", "NotificationOptionUserLockedOut": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d", - "HeaderSendNotificationHelp": "\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0443 \u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432 Emby. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0438\u0437 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0423\u0441\u043b\u0443\u0433\u0438.", + "HeaderSendNotificationHelp": "\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0443 \u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432 Emby. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0438\u0437 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0423\u0441\u043b\u0443\u0433\u0438.", "NotificationOptionServerRestartRequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430", "LabelNotificationEnabled": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435", "LabelMonitorUsers": "\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442:", @@ -688,7 +688,7 @@ "OptionProfileVideoAudio": "\u0412\u0438\u0434\u0435\u043e \u0410\u0443\u0434\u0438\u043e", "OptionProfilePhoto": "\u0424\u043e\u0442\u043e", "LabelUserLibrary": "\u041c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:", - "LabelUserLibraryHelp": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435, \u0447\u044c\u044e \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u041d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0439\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.", + "LabelUserLibraryHelp": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435, \u0447\u044c\u044e \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u041d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0439\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.", "OptionPlainStorageFolders": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u043f\u043a\u0438, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f", "OptionPlainStorageFoldersHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u0432\u0441\u0435 \u043f\u0430\u043f\u043a\u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 DIDL \u043a\u0430\u043a \u00abobject.container.storageFolder\u00bb, \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00abobject.container.person.musicArtist\u00bb.", "OptionPlainVideoItems": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432\u0441\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0432\u0438\u0434\u0435\u043e, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0432\u0438\u0434\u0435\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b", @@ -701,7 +701,7 @@ "TabResponses": "\u041e\u0442\u043a\u043b\u0438\u043a\u0438", "HeaderProfileInformation": "\u041e \u043f\u0440\u043e\u0444\u0438\u043b\u0435", "LabelEmbedAlbumArtDidl": "\u0412\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u0430\u043b\u044c\u0431\u043e\u043c\u043d\u044b\u0435 \u043e\u0431\u043b\u043e\u0436\u043a\u0438 \u0432 DIDL", - "LabelEmbedAlbumArtDidlHelp": "\u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u043b\u044c\u0431\u043e\u043c\u043d\u044b\u0445 \u043e\u0431\u043b\u043e\u0436\u0435\u043a \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c, \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438.", + "LabelEmbedAlbumArtDidlHelp": "\u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u043b\u044c\u0431\u043e\u043c\u043d\u044b\u0445 \u043e\u0431\u043b\u043e\u0436\u0435\u043a \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c, \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0439 \u043e\u043f\u0446\u0438\u0438.", "LabelAlbumArtPN": "PN \u0430\u043b\u044c\u0431\u043e\u043c\u043d\u043e\u0439 \u043e\u0431\u043b\u043e\u0436\u043a\u0438:", "LabelAlbumArtHelp": "PN \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435 \u0434\u043b\u044f \u0430\u043b\u044c\u0431\u043e\u043c\u043d\u044b\u0445 \u043e\u0431\u043b\u043e\u0436\u0435\u043a, \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 dlna:profileID \u043f\u0440\u0438 upnp:albumArtURI. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430.", "LabelAlbumArtMaxWidth": "\u041c\u0430\u043a\u0441. \u0448\u0438\u0440\u0438\u043d\u0430 \u043e\u0431\u043b\u043e\u0436\u043a\u0438 \u0430\u043b\u044c\u0431\u043e\u043c\u0430:", @@ -713,7 +713,7 @@ "LabelIconMaxHeight": "\u041c\u0430\u043a\u0441. \u0432\u044b\u0441\u043e\u0442\u0430 \u0437\u043d\u0430\u0447\u043a\u0430:", "LabelIconMaxHeightHelp": "\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u043a\u043e\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e upnp:icon.", "LabelIdentificationFieldHelp": "\u041f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430 \u0431\u0435\u0437 \u0443\u0447\u0451\u0442\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u043b\u0438\u0431\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435.", - "HeaderProfileServerSettingsHelp": "\u0414\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442 \u0442\u0435\u043c, \u043a\u0430\u043a Emby Server \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0435\u0431\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443.", + "HeaderProfileServerSettingsHelp": "\u0414\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442 \u0442\u0435\u043c, \u043a\u0430\u043a Emby Server \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443.", "LabelMaxBitrate": "\u041c\u0430\u043a\u0441. \u043f\u043e\u0442\u043e\u043a. \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c:", "LabelMaxBitrateHelp": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432 \u0441\u0440\u0435\u0434\u0430\u0445 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e, \u043b\u0438\u0431\u043e, \u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 - \u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435.", "LabelMaxStreamingBitrate": "\u041c\u0430\u043a\u0441. \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438:", @@ -756,7 +756,7 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "\u042d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u043f\u043e\u0432\u0440\u0435\u043c\u0451\u043d\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u043e\u0442\u043a\u0443 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e.", "HeaderDownloadSubtitlesFor": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432 \u0434\u043b\u044f:", "LabelSkipIfGraphicalSubsPresent": "\u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u0438\u0434\u0435\u043e \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u043d\u0435\u0434\u0440\u0451\u043d\u043d\u044b\u0435 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b", - "LabelSkipIfGraphicalSubsPresentHelp": "\u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0438\u0434\u0435\u043e.", + "LabelSkipIfGraphicalSubsPresentHelp": "\u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u0438 \u043f\u043e\u043d\u0438\u0437\u0438\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0438\u0434\u0435\u043e.", "TabSubtitles": "\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b", "TabChapters": "\u0421\u0446\u0435\u043d\u044b", "LabelOpenSubtitlesUsername": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Open Subtitles:", @@ -800,7 +800,7 @@ "OptionAuto": "\u0410\u0432\u0442\u043e", "OptionYes": "\u0414\u0430", "OptionNo": "\u041d\u0435\u0442", - "HeaderOptions": "\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b", + "HeaderOptions": "\u041e\u043f\u0446\u0438\u0438", "LabelHomePageSection1": "\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 - \u0440\u0430\u0437\u0434\u0435\u043b 1:", "LabelHomePageSection2": "\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 - \u0440\u0430\u0437\u0434\u0435\u043b 2:", "LabelHomePageSection3": "\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 - \u0440\u0430\u0437\u0434\u0435\u043b 3:", @@ -880,15 +880,15 @@ "LabelProtocolInfo": "\u041e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435:", "LabelProtocolInfoHelp": "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u044b GetProtocolInfo \u043e\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.", "TabNfoSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b NFO", - "HeaderKodiMetadataHelp": "\u0412 Emby \u043d\u0430\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043b\u044f NFO- \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f NFO-\u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 \u00ab\u0423\u0441\u043b\u0443\u0433\u0438\u00bb, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445.", + "HeaderKodiMetadataHelp": "\u0412 Emby \u043d\u0430\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043b\u044f NFO- \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f NFO-\u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 \u00ab\u0423\u0441\u043b\u0443\u0433\u0438\u00bb, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u043f\u0446\u0438\u0438 \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0445.", "LabelKodiMetadataUser": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441 NFO-\u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c:", - "LabelKodiMetadataUserHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 Emby Server \u0438 NFO-\u0444\u0430\u0439\u043b\u0430\u043c\u0438.", + "LabelKodiMetadataUserHelp": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430\u0445 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 Emby Server \u0438 NFO-\u0444\u0430\u0439\u043b\u0430\u043c\u0438.", "LabelKodiMetadataDateFormat": "\u0424\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u0442\u044b \u0432\u044b\u043f\u0443\u0441\u043a\u0430:", - "LabelKodiMetadataDateFormatHelp": "\u0412\u0441\u0435 \u0434\u0430\u0442\u044b \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 NFO-\u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430.", + "LabelKodiMetadataDateFormatHelp": "\u0412\u0441\u0435 \u0434\u0430\u0442\u044b \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 NFO-\u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0443.", "LabelKodiMetadataSaveImagePaths": "\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043f\u0443\u0442\u0438 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 NFO-\u0444\u0430\u0439\u043b\u043e\u0432", "LabelKodiMetadataSaveImagePathsHelp": "\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0438\u043c\u0435\u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u044f\u0449\u0438\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c Kodi.", "LabelKodiMetadataEnablePathSubstitution": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0443\u0442\u0435\u0439", - "LabelKodiMetadataEnablePathSubstitutionHelp": "\u0412\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0443\u0442\u0435\u0439 \u043a \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0443\u0442\u0435\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.", + "LabelKodiMetadataEnablePathSubstitutionHelp": "\u0412\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0443\u0442\u0435\u0439 \u043a \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u044b \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0443\u0442\u0435\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.", "LabelKodiMetadataEnablePathSubstitutionHelp2": "\u0421\u043c. \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0443\u0442\u0435\u0439", "OptionDisplayChannelsInline": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u044b \u043a\u0430\u043a \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043a\u0438", "OptionDisplayChannelsInlineHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u043a\u0430\u043d\u0430\u043b\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u044f\u0434\u043e\u043c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430\u043c\u0438. \u041f\u0440\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 \u00ab\u041a\u0430\u043d\u0430\u043b\u044b\u00bb.", @@ -1027,7 +1027,7 @@ "HeaderDownloadPeopleMetadataFor": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0431\u0438\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0438 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0434\u043b\u044f:", "OptionComposers": "\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u044b", "OptionOthers": "\u0414\u0440\u0443\u0433\u0438\u0435", - "HeaderDownloadPeopleMetadataForHelp": "\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u044e \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438.", + "HeaderDownloadPeopleMetadataForHelp": "\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0446\u0438\u0439 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u044e \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438.", "ViewTypeFolders": "\u041f\u0430\u043f\u043a\u0438", "OptionDisplayFolderView": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0430\u0441\u043f\u0435\u043a\u0442 \u041f\u0430\u043f\u043a\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043c\u0435\u0434\u0438\u0430\u043f\u0430\u043f\u043e\u043a", "OptionDisplayFolderViewHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u0432 Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u041f\u0430\u043f\u043a\u0438 \u0440\u044f\u0434\u043e\u043c \u0441 \u0432\u0430\u0448\u0435\u0439 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u043e\u0439. \u042d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0432\u0438\u0434 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0430\u043f\u043e\u043a.", @@ -1087,7 +1087,7 @@ "HeaderDeveloperInfo": "\u041e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u0445", "HeaderRevisionHistory": "\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439", "ButtonViewWebsite": "\u0421\u043c. \u0432\u0435\u0431\u0441\u0430\u0439\u0442", - "HeaderXmlSettings": "XML-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b", + "HeaderXmlSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b XML", "HeaderXmlDocumentAttributes": "\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b XML-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", "HeaderXmlDocumentAttribute": "\u0410\u0442\u0440\u0438\u0431\u0443\u0442 XML-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430", "XmlDocumentAttributeListHelp": "\u0414\u0430\u043d\u043d\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043a\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e XML-\u043e\u0442\u043a\u043b\u0438\u043a\u0430.", @@ -1139,7 +1139,7 @@ "LabelDateAddedBehavior": "\u0414\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0437\u0430 \u0434\u0430\u0442\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f:", "OptionDateAddedImportTime": "\u0414\u0430\u0442\u0430 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u044c \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438", "OptionDateAddedFileTime": "\u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430", - "LabelDateAddedBehaviorHelp": "\u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u043e, \u0447\u0435\u043c \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432.", + "LabelDateAddedBehaviorHelp": "\u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u043e, \u0447\u0435\u043c \u043b\u044e\u0431\u0430\u044f \u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0446\u0438\u0439.", "LabelNumberTrailerToPlay": "\u0427\u0438\u0441\u043b\u043e \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f:", "TitleDevices": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", "TabCameraUpload": "\u041a\u0430\u043c\u0435\u0440\u044b", @@ -1171,7 +1171,7 @@ "OptionWeekdays": "\u0412 \u0431\u0443\u0434\u043d\u0438", "OptionWeekends": "\u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435", "MessageProfileInfoSynced": "\u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441 Emby Connect.", - "HeaderOptionalLinkEmbyAccount": "\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u0421\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u0432\u0430\u0448\u0435\u0439 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 Emby", + "HeaderOptionalLinkEmbyAccount": "\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u0432\u0430\u0448\u0435\u0439 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 Emby", "ButtonTrailer": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440", "MessageNoTrailersFound": "\u0422\u0440\u0435\u0439\u043b\u0435\u0440\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043a\u0430\u043d\u0430\u043b \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0438\u043b\u0438\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u043e\u0442 \u0444\u0438\u043b\u044c\u043c\u0430 \u043f\u0443\u0442\u0451\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0440\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0442\u0440\u0435\u0439\u043b\u0435\u0440\u043e\u0432.", "HeaderNewUsers": "\u041d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438", @@ -1287,7 +1287,7 @@ "GuideProviderSelectListings": "\u0412\u044b\u0431\u043e\u0440 \u043f\u0435\u0440\u0435\u0447\u043d\u0435\u0439", "GuideProviderLogin": "\u0412\u0445\u043e\u0434", "LabelLineup": "\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f:", - "MessageTunerDeviceNotListed": "\u0412\u0430\u0448\u0435\u0433\u043e \u0442\u044e\u043d\u0435\u0440\u0430 \u043d\u0435\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435? \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 \u0443\u0441\u043b\u0443\u0433, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u0444\u0438\u0440\u043d\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u043e\u0432.", + "MessageTunerDeviceNotListed": "\u0412\u0430\u0448\u0435\u0433\u043e \u0442\u044e\u043d\u0435\u0440\u0430 \u043d\u0435\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435? \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 \u0443\u0441\u043b\u0443\u0433 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043e\u043f\u0446\u0438\u0439 \u044d\u0444\u0438\u0440\u043d\u043e\u0433\u043e \u0422\u0412.", "LabelImportOnlyFavoriteChannels": "\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u0430\u043a \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435", "ImportFavoriteChannelsHelp": "\u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438, \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043d\u0430\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u043a\u0430\u043a \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0442\u044e\u043d\u0435\u0440\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435.", "ButtonRepeat": "\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c", @@ -1318,7 +1318,7 @@ "LabelDataProvider": "\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445:", "OptionSendRecordingsToAutoOrganize": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u043d\u0443\u0442\u0440\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0430\u043f\u043e\u043a \u0441\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430\u0445.", "HeaderDefaultPadding": "\u041e\u0442\u0431\u0438\u0432\u043a\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e", - "OptionEnableRecordingSubfolders": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0430\u043f\u043e\u043a \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439, \u043a\u0430\u043a \u0421\u043f\u043e\u0440\u0442, \u0414\u0435\u0442\u0441\u043a\u0438\u0439 \u0438 \u0442.\u043f.", + "OptionEnableRecordingSubfolders": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0430\u043f\u043e\u043a \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439, \u043a\u0430\u043a \u0421\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u044b\u0435, \u0414\u0435\u0442\u0441\u043a\u0438\u0435 \u0438 \u0442.\u043f.", "HeaderSubtitles": "\u0421\u0443\u0431\u0442.", "HeaderVideos": "\u0412\u0438\u0434\u0435\u043e\u0444\u0430\u0439\u043b\u044b", "LabelHardwareAccelerationType": "\u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435:", @@ -1344,7 +1344,7 @@ "OptionPlayNextEpisodeAutomatically": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043f\u0438\u0437\u043e\u0434 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438", "OptionDownloadImagesInAdvance": "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435", "SettingsSaved": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b.", - "OptionDownloadImagesInAdvanceHelp": "\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043e\u0442 Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u044d\u0442\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432\u0441\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435.", + "OptionDownloadImagesInAdvanceHelp": "\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u0432 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043e\u0442 Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u0443\u044e \u043e\u043f\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432\u0441\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435.", "Users": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438", "Delete": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c", "Password": "\u041f\u0430\u0440\u043e\u043b\u044c", @@ -1367,7 +1367,7 @@ "PasswordMatchError": "\u041f\u0430\u0440\u043e\u043b\u044c \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c", "UninstallPluginHeader": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430", "UninstallPluginConfirmation": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0}?", - "NoPluginConfigurationMessage": "\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.", + "NoPluginConfigurationMessage": "\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.", "NoPluginsInstalledMessage": "\u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430.", "BrowsePluginCatalogMessage": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438.", "HeaderNewApiKey": "\u041d\u043e\u0432\u044b\u0439 API-\u043a\u043b\u044e\u0447", @@ -1375,7 +1375,7 @@ "LabelAppNameExample": "\u041f\u0440\u0438\u043c\u0435\u0440: Sickbeard, NzbDrone", "HeaderNewApiKeyHelp": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043f\u0440\u0430\u0432\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a Emby Server.", "MessageKeyEmailedTo": "\u041a\u043b\u044e\u0447 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u043d\u0430 {0}.", - "MessageKeysLinked": "\u041a\u043b\u044e\u0447\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u044b.", + "MessageKeysLinked": "\u041a\u043b\u044e\u0447\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b.", "HeaderConfirmation": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435", "MessageKeyUpdated": "\u0412\u0430\u0448 \u043a\u043b\u044e\u0447 Emby Premiere \u0431\u044b\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d.", "MessageKeyRemoved": "\u0412\u0430\u0448 \u043a\u043b\u044e\u0447 Emby Premiere \u0431\u044b\u043b \u0438\u0437\u044a\u044f\u0442.", @@ -1392,7 +1392,7 @@ "LabelAutomaticUpdateLevelForPlugins": "\u0421\u0442\u0435\u043f\u0435\u043d\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432:", "ErrorLaunchingChromecast": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 Chromecast. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a \u0431\u0435\u0441\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0442\u0438.", "MessageErrorLoadingSupporterInfo": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 Emby Premiere. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435.", - "MessageLinkYourSupporterKey": "\u0421\u0432\u044f\u0436\u0438\u0442\u0435 \u0432\u0430\u0448 \u043a\u043b\u044e\u0447 Emby Premiere \u0441 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e {0} \u0447\u043b\u0435\u043d\u0430\u043c\u0438 Emby Connect, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c:", + "MessageLinkYourSupporterKey": "\u041f\u0440\u0438\u0432\u044f\u0436\u0438\u0442\u0435 \u0432\u0430\u0448 \u043a\u043b\u044e\u0447 Emby Premiere \u0441 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e {0} \u0447\u043b\u0435\u043d\u0430\u043c\u0438 Emby Connect, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c:", "HeaderConfirmRemoveUser": "\u0418\u0437\u044a\u044f\u0442\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f", "MessageConfirmRemoveConnectSupporter": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u044a\u044f\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b Emby Premiere \u0441 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f?", "ValueTimeLimitSingleHour": "\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438: 1 \u0447\u0430\u0441", @@ -1438,7 +1438,7 @@ "ButtonTakeTheTour": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f", "HeaderWelcomeBack": "\u0417\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0435\u0449\u0451!", "ButtonTakeTheTourToSeeWhatsNew": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u043e\u0432\u0430\u0446\u0438\u044f\u043c\u0438", - "MessageNoSyncJobsFound": "\u0417\u0430\u0434\u0430\u043d\u0438\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043d\u043e\u043f\u043e\u043a \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e.", + "MessageNoSyncJobsFound": "\u0417\u0430\u0434\u0430\u043d\u0438\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e.", "MessageDownloadsFound": "\u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u043a. \u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0432\u0430\u0448\u0438 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e, \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e.", "HeaderSelectDevices": "\u0412\u044b\u0431\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", "ButtonCancelItem": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442", @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f", "MessagePlaybackErrorNotAllowed": "\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b \u043d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f. \u0417\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u0432\u044f\u0436\u0438\u0442\u0435\u0441\u044c \u0441 \u0432\u0430\u0448\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c.", "MessagePlaybackErrorNoCompatibleStream": "\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435 \u0438\u043b\u0438 \u0437\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c\u0443 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443.", - "MessagePlaybackErrorRateLimitExceeded": "\u0412\u0430\u0448\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430. \u0417\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u0432\u044f\u0436\u0438\u0442\u0435\u0441\u044c \u0441 \u0432\u0430\u0448\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c.", - "MessagePlaybackErrorPlaceHolder": "\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043d\u0435\u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e \u0441 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.", + "MessagePlaybackErrorPlaceHolder": "\u0412\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0434\u0438\u0441\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e.", "HeaderSelectAudio": "\u0412\u044b\u0431\u043e\u0440 \u0430\u0443\u0434\u0438\u043e", "HeaderSelectSubtitles": "\u0412\u044b\u0431\u043e\u0440 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432", "ButtonMarkForRemoval": "\u0418\u0437\u044a\u044f\u0442\u044c \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", @@ -1742,7 +1741,7 @@ "MessagePendingEmbyAccountAdded": "\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c Emby \u0431\u044b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u0438\u0441\u044c\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0443 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c, \u0449\u0451\u043b\u043a\u043d\u0443\u0432 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432 \u043f\u0438\u0441\u044c\u043c\u0435.", "HeaderEmbyAccountRemoved": "\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c Emby \u0438\u0437\u044a\u044f\u0442\u0430", "MessageEmbyAccontRemoved": "\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c Emby \u0431\u044b\u043b\u0430 \u0438\u0437\u044a\u044f\u0442\u0430 \u0443 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f", - "TooltipLinkedToEmbyConnect": "\u0418\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u044c \u0441 Emby Connect", + "TooltipLinkedToEmbyConnect": "\u041f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043a Emby Connect", "HeaderUnrated": "\u0411\u0435\u0437 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438", "ValueDiscNumber": "\u0414\u0438\u0441\u043a {0}", "HeaderUnknownDate": "\u041d\u0435\u043e\u043f\u043e\u0437\u043d\u0430\u043d\u043d\u0430\u044f \u0434\u0430\u0442\u0430", @@ -1867,7 +1866,7 @@ "WebClientTourCollections": "\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0444\u0438\u043b\u044c\u043c\u043e\u0432\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u044b \u0432\u043c\u0435\u0441\u0442\u0435", "WebClientTourUserPreferences1": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u043e \u0432\u0441\u0435\u0445 \u0432\u0430\u0448\u0438\u0445 Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445.", "WebClientTourUserPreferences2": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0430\u0443\u0434\u0438\u043e \u0438 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432 \u0441\u0432\u043e\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430, \u0435\u0434\u0438\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", - "WebClientTourUserPreferences3": "\u041e\u0444\u043e\u0440\u044c\u043c\u0442\u0435 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u043e \u0441\u0432\u043e\u0438\u043c \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u044f\u043c", + "WebClientTourUserPreferences3": "\u041e\u0444\u043e\u0440\u044c\u043c\u0442\u0435 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043a\u0430\u043a \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f", "WebClientTourUserPreferences4": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0437\u0430\u0434\u043d\u0438\u043a\u0438, \u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u0438", "WebClientTourMobile1": "\u0412\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043d\u0430 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d\u0430\u0445 \u0438 \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0430\u0445...", "WebClientTourMobile2": "\u0438 \u043b\u0435\u0433\u043a\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 Emby-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438", @@ -1958,7 +1957,7 @@ "HeaderSaySomethingLike": "\u0421\u043a\u0430\u0436\u0438\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435...", "NoResultsFound": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.", "ButtonManageServer": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c", - "ButtonPreferences": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", + "ButtonPreferences": "\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c", "ButtonViewArtist": "\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f", "ButtonViewAlbum": "\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0430\u043b\u044c\u0431\u043e\u043c", "ButtonEditImages": "\u041f\u0440\u0430\u0432\u0438\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043a\u0438", @@ -1996,7 +1995,7 @@ "HeaderSortOrder": "\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438", "ButtonDisconnect": "\u0420\u0430\u0437\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f", "ButtonMenu": "\u041c\u0435\u043d\u044e", - "ForAdditionalLiveTvOptions": "\u0414\u043b\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u043e\u0432 \u044d\u0444\u0438\u0440\u0430, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0449\u0451\u043b\u043a\u043d\u0443\u0432 \u043f\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u0443\u0441\u043b\u0443\u0433\u0438.", + "ForAdditionalLiveTvOptions": "\u0414\u043b\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u043e\u0432 \u044d\u0444\u0438\u0440\u0430, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043e\u043f\u0446\u0438\u044f\u043c\u0438, \u0449\u0451\u043b\u043a\u043d\u0443\u0432 \u043f\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u0443\u0441\u043b\u0443\u0433\u0438.", "ButtonGuide": "\u0422\u0435\u043b\u0435\u0433\u0438\u0434", "ButtonRecordedTv": "\u0422\u0412-\u0437\u0430\u043f\u0438\u0441\u0438", "ConfirmEndPlayerSession": "\u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c Emby \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435?", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 Emby Connect. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443.", "ErrorAddingEmbyConnectAccount1": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 Emby Connect. \u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u043b\u0438 \u0432\u044b \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c Emby? \u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0439\u0442\u0435\u0441\u044c \u043d\u0430 {0}.", "ErrorAddingEmbyConnectAccount2": "\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0443\u0447\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c Emby \u0431\u044b\u043b\u0430 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0441\u043b\u0435\u0434\u0443\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u0432 \u043f\u0438\u0441\u044c\u043c\u0435, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u044d\u0442\u043e \u043f\u0438\u0441\u044c\u043c\u043e, \u0442\u043e\u0433\u0434\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043f\u0438\u0441\u044c\u043c\u043e \u043d\u0430 {0} \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 \u042d-\u043f\u043e\u0447\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 Emby.", + "ErrorAddingEmbyConnectAccount3": "\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c Emby \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u0430 \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. \u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c Emby \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f.", "HeaderFavoriteArtists": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438", "HeaderFavoriteSongs": "\u0418\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438", "HeaderConfirmPluginInstallation": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430", @@ -2057,7 +2057,7 @@ "HeaderTuners": "\u0422\u044e\u043d\u0435\u0440\u044b", "LabelOptionalM3uUrl": "M3U url (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e):", "LabelOptionalM3uUrlHelp": "\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043f\u0435\u0440\u0435\u0447\u043d\u0438 M3U.", - "TabResumeSettings": "\u0412\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435", + "TabResumeSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f", "HowDidYouPay": "\u041a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b \u043e\u043f\u043b\u0430\u0442\u0438\u043b\u0438?", "IHaveEmbyPremiere": "\u0423 \u043c\u0435\u043d\u044f \u0438\u043c\u0435\u0435\u0442\u0441\u044f Emby Premiere", "IPurchasedThisApp": "\u042f \u043f\u0440\u0438\u043e\u0431\u0440\u0451\u043b \u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435", @@ -2074,7 +2074,7 @@ "OptionConvertRecordingPreserveAudio": "\u0421\u0431\u0435\u0440\u0435\u0433\u0430\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0430\u0443\u0434\u0438\u043e \u043f\u0440\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 (\u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438)", "OptionConvertRecordingPreserveAudioHelp": "\u042d\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u0430\u0443\u0434\u0438\u043e \u043f\u043e\u043b\u0443\u0447\u0448\u0435, \u043d\u043e, \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430.", "CreateCollectionHelp": "\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u0438\u044f \u0444\u0438\u043b\u044c\u043c\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438.", - "AddItemToCollectionHelp": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0445 \u043f\u043e\u0438\u0441\u043a\u0430, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u0445 \u043f\u0440\u0430\u0432\u044b\u043c \u0449\u0435\u043b\u0447\u043a\u043e\u043c \u0438\u043b\u0438 \u043a\u0430\u0441\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0438\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.", + "AddItemToCollectionHelp": "\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043d\u0438\u043c, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u0445 \u043c\u0435\u043d\u044e \u043f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u0449\u0435\u043b\u0447\u043a\u0443 \u0438\u043b\u0438 \u043f\u043e \u043a\u0430\u0441\u0430\u043d\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043a\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.", "HeaderHealthMonitor": "\u041c\u043e\u043d\u0438\u0442\u043e\u0440 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438", "HealthMonitorNoAlerts": "\u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439.", "RecordingPathChangeMessage": "\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0443 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0441\u043e \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u043d\u0430 \u043d\u043e\u0432\u043e\u0435. \u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0438\u0445 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e.", @@ -2132,9 +2132,10 @@ "LabelH264EncodingPreset": "\u041f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 H264-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:", "H264EncodingPresetHelp": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430.", "LabelH264Crf": "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 CRF H264-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:", - "H264CrfHelp": "\u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0446\u0435\u043d\u043a\u0438 (Constant Rate Factor, CRF) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u043a\u043e\u0434\u0451\u0440\u0430 x264 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 0 \u0434\u043e 51, \u0433\u0434\u0435 \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 (\u0437\u0430 \u0441\u0447\u0451\u0442 \u0431\u043e\u0301\u043b\u044c\u0448\u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432). \u0420\u0430\u0437\u0443\u043c\u043d\u044b\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 18 \u0434\u043e 28. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 23 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0434\u043b\u044f x264 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438.", + "H264CrfHelp": "\u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0446\u0435\u043d\u043a\u0438 (Constant Rate Factor, CRF) - \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u043a\u043e\u0434\u0451\u0440\u0430 x264. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 0 \u0434\u043e 51, \u0433\u0434\u0435 \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 (\u0437\u0430 \u0441\u0447\u0451\u0442 \u0431\u043e\u0301\u043b\u044c\u0448\u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432). \u0420\u0430\u0437\u0443\u043c\u043d\u044b\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 18 \u0434\u043e 28. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e \u0434\u043b\u044f x264 - 23, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438.", "Sports": "\u0421\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u044b\u0435", "HeaderForKids": "\u0414\u0435\u0442\u0441\u043a\u0438\u0435", "HeaderRecordingGroups": "\u0413\u0440\u0443\u043f\u043f\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439", - "LabelConvertRecordingsTo": "\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432:" + "LabelConvertRecordingsTo": "\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432:", + "HeaderUpcomingOnTV": "\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u043d\u0430 \u0422\u0412" } \ No newline at end of file diff --git a/dashboard-ui/strings/sk.json b/dashboard-ui/strings/sk.json index c21f329d02..0ac953e61f 100644 --- a/dashboard-ui/strings/sk.json +++ b/dashboard-ui/strings/sk.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Ob\u013e\u00faben\u00e9 pesni\u010dky", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/sl-SI.json b/dashboard-ui/strings/sl-SI.json index e8932f4f03..95a08b2f64 100644 --- a/dashboard-ui/strings/sl-SI.json +++ b/dashboard-ui/strings/sl-SI.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/sv.json b/dashboard-ui/strings/sv.json index aa99a8bb7b..25053415ed 100644 --- a/dashboard-ui/strings/sv.json +++ b/dashboard-ui/strings/sv.json @@ -1457,7 +1457,6 @@ "HeaderPlaybackError": "Uppspelningsfel", "MessagePlaybackErrorNotAllowed": "Du har inte tillg\u00e5ng att spela upp det h\u00e4r inneh\u00e5llet. Kontakta din systemadministrat\u00f6r f\u00f6r mer detaljer.", "MessagePlaybackErrorNoCompatibleStream": "Inga kompatibla str\u00f6mmar finns att tillg\u00e5. V\u00e4nligen f\u00f6rs\u00f6k igen senare eller kontakta din systemadministrat\u00f6r f\u00f6r mer detaljer.", - "MessagePlaybackErrorRateLimitExceeded": "Begr\u00e4nsningen f\u00f6r din uppspelning har n\u00e5tt sin gr\u00e4ns. Kontakta din systemadministrat\u00f6r f\u00f6r mer information.", "MessagePlaybackErrorPlaceHolder": "Inneh\u00e5llet du har valt kan inte spelas upp fr\u00e5n den h\u00e4r enheten.", "HeaderSelectAudio": "V\u00e4lj ljudsp\u00e5r", "HeaderSelectSubtitles": "V\u00e4lj undertexter", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "Det gick inte att l\u00e4gga till ditt Emby Connect-konto. Har du ett Emby Connect-konto? Du kan skapa ett p\u00e5 {0}", "ErrorAddingEmbyConnectAccount2": "Kontrollera att ditt konto aktiverats genom att f\u00f6lja instruktionerna som skickades per epost n\u00e4r du skapade ditt konto. Om du inte f\u00e5tt denna epost, skicka epost till {0} fr\u00e5n den apostadress du anv\u00e4nde n\u00e4r du skapade kontot.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorit artister", "HeaderFavoriteSongs": "Favorit l\u00e5tar", "HeaderConfirmPluginInstallation": "Bekr\u00e4fta installation av till\u00e4gg", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/tr.json b/dashboard-ui/strings/tr.json index e5b82d92a9..be18d855de 100644 --- a/dashboard-ui/strings/tr.json +++ b/dashboard-ui/strings/tr.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/uk.json b/dashboard-ui/strings/uk.json index 7c5663ba4e..a70e89fdda 100644 --- a/dashboard-ui/strings/uk.json +++ b/dashboard-ui/strings/uk.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/vi.json b/dashboard-ui/strings/vi.json index c985283cc8..fa9eb7c854 100644 --- a/dashboard-ui/strings/vi.json +++ b/dashboard-ui/strings/vi.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/zh-CN.json b/dashboard-ui/strings/zh-CN.json index 187ef3b008..6bb524e5ed 100644 --- a/dashboard-ui/strings/zh-CN.json +++ b/dashboard-ui/strings/zh-CN.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "\u9009\u62e9\u97f3\u9891", "HeaderSelectSubtitles": "\u9009\u62e9\u5b57\u5e55", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/zh-HK.json b/dashboard-ui/strings/zh-HK.json index 8d99805ada..0db7d8a4e9 100644 --- a/dashboard-ui/strings/zh-HK.json +++ b/dashboard-ui/strings/zh-HK.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "\u9078\u64c7\u5b57\u5e55", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/strings/zh-TW.json b/dashboard-ui/strings/zh-TW.json index 4735543552..a141598ce3 100644 --- a/dashboard-ui/strings/zh-TW.json +++ b/dashboard-ui/strings/zh-TW.json @@ -1457,8 +1457,7 @@ "HeaderPlaybackError": "Playback Error", "MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.", "MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.", - "MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.", - "MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.", + "MessagePlaybackErrorPlaceHolder": "Please insert the disc in order to play this video.", "HeaderSelectAudio": "Select Audio", "HeaderSelectSubtitles": "Select Subtitles", "ButtonMarkForRemoval": "Remove from device", @@ -2026,6 +2025,7 @@ "ErrorRemovingEmbyConnectAccount": "There was an error removing the Emby Connect account. Please ensure you have an active internet connection and try again.", "ErrorAddingEmbyConnectAccount1": "There was an error adding the Emby Connect account. Have you created an Emby account? Sign up at {0}.", "ErrorAddingEmbyConnectAccount2": "Please ensure the Emby account has been activated by following the instructions in the email sent after creating the account. If you did not receive this email then please send an email to {0} from the email address used with the Emby account.", + "ErrorAddingEmbyConnectAccount3": "The Emby account is already linked to an existing local user. An Emby account can only be linked to one local user at a time.", "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderConfirmPluginInstallation": "Confirm Plugin Installation", @@ -2136,5 +2136,6 @@ "Sports": "Sports", "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", - "LabelConvertRecordingsTo": "Convert recordings to:" + "LabelConvertRecordingsTo": "Convert recordings to:", + "HeaderUpcomingOnTV": "Upcoming On TV" } \ No newline at end of file diff --git a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.icons.css b/dashboard-ui/thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.icons.css deleted file mode 100644 index 1dd6c6458b..0000000000 --- a/dashboard-ui/thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.icons.css +++ /dev/null @@ -1,90 +0,0 @@ -/*! -* jQuery Mobile 1.4.5 -* Git HEAD hash: 68e55e78b292634d3991c795f06f5e37a512decc <> Date: Fri Oct 31 2014 17:33:30 UTC -* http://jquerymobile.com -* -* Copyright 2010, 2014 jQuery Foundation, Inc. and othercontributors -* Released under the MIT license. -* http://jquery.org/license -* -*/ - - -/* SVG icons */ -a[data-icon="action"]:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M9%2C5v3l5-4L9%2C0v3c0%2C0-5%2C0-5%2C7C6%2C5%2C9%2C5%2C9%2C5z%20M11%2C12H2V5h1l2-2H0v11h13V7l-2%2C2V12z%22%2F%3E%3C%2Fsvg%3E"); -} -a[data-icon="alert"]:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M7%2C0L0%2C12h14L7%2C0z%20M7%2C11c-0.553%2C0-1-0.447-1-1s0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1S7.553%2C11%2C7%2C11z%20M7%2C8%20C6.447%2C8%2C6%2C7.553%2C6%2C7V5c0-0.553%2C0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1v2C8%2C7.553%2C7.553%2C8%2C7%2C8z%22%2F%3E%3C%2Fsvg%3E"); -} -.ui-icon-arrow-d-l:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C3%2011%2C0%203.5%2C7.5%200%2C4%200%2C14%2010%2C14%206.5%2C10.5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -a[data-icon="arrow-d"]:after, .ui-icon-arrow-d:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%229%2C7%209%2C0%205%2C0%205%2C7%200%2C7%207%2C14%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -.ui-icon-arrow-l:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%227%2C5%207%2C0%200%2C7%207%2C14%207%2C9%2014%2C9%2014%2C5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -.ui-icon-arrow-r:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C7%207%2C0%207%2C5%200%2C5%200%2C9%207%2C9%207%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -.ui-icon-arrow-u-l:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C11%206.5%2C3.5%2010%2C0%200%2C0%200%2C10%203.5%2C6.5%2011%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -.ui-icon-arrow-u-r:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C0%204%2C0%207.5%2C3.5%200%2C11%203%2C14%2010.5%2C6.5%2014%2C10%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -a[data-icon="arrow-u"]:after, .ui-icon-arrow-u:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%227%2C0%200%2C7%205%2C7%205%2C14%209%2C14%209%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -.ui-icon-audio:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.018px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014.018%2014%22%20style%3D%22enable-background%3Anew%200%200%2014.018%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M1%2C4C0.447%2C4%2C0%2C4.447%2C0%2C5v4c0%2C0.553%2C0.447%2C1%2C1%2C1h1l4%2C4V0L2%2C4H1z%20M10.346%2C7c0-1.699-1.042-3.154-2.546-3.867L6.982%2C4.68%20C7.885%2C5.107%2C8.51%2C5.98%2C8.51%2C7S7.885%2C8.893%2C6.982%2C9.32L7.8%2C10.867C9.304%2C10.154%2C10.346%2C8.699%2C10.346%2C7z%20M9.447%2C0.017L8.618%2C1.586%20C10.723%2C2.584%2C12.182%2C4.621%2C12.182%2C7s-1.459%2C4.416-3.563%2C5.414l0.829%2C1.569c2.707-1.283%2C4.57-3.925%2C4.57-6.983%20S12.154%2C1.3%2C9.447%2C0.017z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -a[data-icon="back"]:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M5%2C3V0L1%2C4l4%2C4V5c0%2C0%2C6%2C0%2C6%2C3s-5%2C4-5%2C4v2c0%2C0%2C7-1%2C7-6C13%2C4%2C8%2C3%2C5%2C3z%22%2F%3E%3C%2Fsvg%3E"); -} -.ui-icon-bars:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M1%2C4h12c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H1C0.447%2C2%2C0%2C2.447%2C0%2C3S0.447%2C4%2C1%2C4z%20M13%2C6H1%20C0.447%2C6%2C0%2C6.447%2C0%2C7c0%2C0.553%2C0.447%2C1%2C1%2C1h12c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H1c-0.553%2C0-1%2C0.447-1%2C1%20s0.447%2C1%2C1%2C1h12c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%22%2F%3E%3C%2Fsvg%3E"); -} -.ui-icon-bullets:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M5%2C4h8c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H5C4.447%2C2%2C4%2C2.447%2C4%2C3S4.447%2C4%2C5%2C4z%20M13%2C6H5%20C4.447%2C6%2C4%2C6.447%2C4%2C7c0%2C0.553%2C0.447%2C1%2C1%2C1h8c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H5c-0.553%2C0-1%2C0.447-1%2C1%20s0.447%2C1%2C1%2C1h8c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%20M1%2C2C0.447%2C2%2C0%2C2.447%2C0%2C3s0.447%2C1%2C1%2C1s1-0.447%2C1-1S1.553%2C2%2C1%2C2z%20M1%2C6%20C0.447%2C6%2C0%2C6.447%2C0%2C7c0%2C0.553%2C0.447%2C1%2C1%2C1s1-0.447%2C1-1C2%2C6.447%2C1.553%2C6%2C1%2C6z%20M1%2C10c-0.553%2C0-1%2C0.447-1%2C1s0.447%2C1%2C1%2C1s1-0.447%2C1-1%20S1.553%2C10%2C1%2C10z%22%2F%3E%3C%2Fsvg%3E"); -} -.ui-icon-calendar:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M0%2C8h2V6H0V8z%20M3%2C8h2V6H3V8z%20M6%2C8h2V6H6V8z%20M9%2C8h2V6H9V8z%20M12%2C8h2V6h-2V8z%20M0%2C11h2V9H0V11z%20M3%2C11h2V9H3V11z%20M6%2C11h2V9H6V11z%20%20M9%2C11h2V9H9V11z%20M12%2C11h2V9h-2V11z%20M0%2C14h2v-2H0V14z%20M3%2C14h2v-2H3V14z%20M6%2C14h2v-2H6V14z%20M9%2C14h2v-2H9V14z%20M12%2C1%20c0-0.553-0.447-1-1-1s-1%2C0.447-1%2C1H4c0-0.553-0.447-1-1-1S2%2C0.447%2C2%2C1H0v4h14V1H12z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -.ui-icon-check:after, -/* Used ui-checkbox-on twice to increase specificity. If active state has background-image for gradient this rule overrides. */ -html .ui-btn.ui-checkbox-on.ui-checkbox-on:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2214%2C4%2011%2C1%205.003%2C6.997%203%2C5%200%2C8%204.966%2C13%204.983%2C12.982%205%2C13%20%22%2F%3E%3C%2Fsvg%3E"); -} -a[data-icon="delete"]:after, .ui-icon-delete:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C3%2011%2C0%207%2C4%203%2C0%200%2C3%204%2C7%200%2C11%203%2C14%207%2C10%2011%2C14%2014%2C11%2010%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -a[data-icon="edit"]:after, .ui-icon-edit:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M1%2C10l-1%2C4l4-1l7-7L8%2C3L1%2C10z%20M11%2C0L9%2C2l3%2C3l2-2L11%2C0z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -.ui-icon-forward:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M13%2C4L9%2C0v3C6%2C3%2C1%2C4%2C1%2C8c0%2C5%2C7%2C6%2C7%2C6v-2c0%2C0-5-1-5-4s6-3%2C6-3v3L13%2C4z%22%2F%3E%3C%2Fsvg%3E"); -} -a[data-icon="gear"]:after, .ui-icon-gear:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M13.621%2C5.904l-1.036-0.259c-0.168-0.042-0.303-0.168-0.355-0.332c-0.092-0.284-0.205-0.559-0.339-0.82%20c-0.079-0.153-0.073-0.337%2C0.017-0.486l0.549-0.915c0.118-0.196%2C0.088-0.448-0.075-0.61l-0.862-0.863%20c-0.162-0.163-0.414-0.193-0.611-0.075l-0.916%2C0.55C9.844%2C2.182%2C9.659%2C2.188%2C9.506%2C2.109C9.244%2C1.975%2C8.97%2C1.861%2C8.686%2C1.77%20c-0.165-0.052-0.29-0.187-0.332-0.354L8.095%2C0.379C8.039%2C0.156%2C7.839%2C0%2C7.609%2C0H6.391c-0.229%2C0-0.43%2C0.156-0.485%2C0.379L5.646%2C1.415%20C5.604%2C1.582%2C5.479%2C1.718%2C5.313%2C1.77c-0.284%2C0.092-0.559%2C0.206-0.82%2C0.34C4.339%2C2.188%2C4.155%2C2.182%2C4.007%2C2.093L3.092%2C1.544%20c-0.196-0.118-0.448-0.087-0.61%2C0.075L1.619%2C2.481C1.457%2C2.644%2C1.426%2C2.896%2C1.544%2C3.093l0.549%2C0.914%20c0.089%2C0.148%2C0.095%2C0.332%2C0.017%2C0.486C1.975%2C4.755%2C1.861%2C5.029%2C1.77%2C5.314c-0.053%2C0.164-0.188%2C0.29-0.354%2C0.332L0.379%2C5.905%20C0.156%2C5.961%2C0%2C6.161%2C0%2C6.391v1.219c0%2C0.229%2C0.156%2C0.43%2C0.379%2C0.485l1.036%2C0.26C1.582%2C8.396%2C1.717%2C8.521%2C1.77%2C8.687%20c0.092%2C0.284%2C0.205%2C0.559%2C0.34%2C0.82C2.188%2C9.66%2C2.182%2C9.844%2C2.093%2C9.993l-0.549%2C0.915c-0.118%2C0.195-0.087%2C0.448%2C0.075%2C0.61%20l0.862%2C0.862c0.162%2C0.163%2C0.414%2C0.193%2C0.61%2C0.075l0.915-0.549c0.148-0.089%2C0.332-0.095%2C0.486-0.017%20c0.262%2C0.135%2C0.536%2C0.248%2C0.82%2C0.34c0.165%2C0.053%2C0.291%2C0.187%2C0.332%2C0.354l0.259%2C1.036C5.96%2C13.844%2C6.16%2C14%2C6.39%2C14h1.22%20c0.229%2C0%2C0.43-0.156%2C0.485-0.379l0.259-1.036c0.042-0.167%2C0.168-0.302%2C0.333-0.354c0.284-0.092%2C0.559-0.205%2C0.82-0.34%20c0.154-0.078%2C0.338-0.072%2C0.486%2C0.017l0.914%2C0.549c0.197%2C0.118%2C0.449%2C0.088%2C0.611-0.074l0.862-0.863%20c0.163-0.162%2C0.193-0.415%2C0.075-0.611l-0.549-0.915c-0.089-0.148-0.096-0.332-0.017-0.485c0.134-0.263%2C0.248-0.536%2C0.339-0.82%20c0.053-0.165%2C0.188-0.291%2C0.355-0.333l1.036-0.259C13.844%2C8.039%2C14%2C7.839%2C14%2C7.609V6.39C14%2C6.16%2C13.844%2C5.96%2C13.621%2C5.904z%20M7%2C10%20c-1.657%2C0-3-1.343-3-3s1.343-3%2C3-3s3%2C1.343%2C3%2C3S8.657%2C10%2C7%2C10z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -a[data-icon="home"]:after, .ui-icon-home:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%227%2C0%200%2C7%202%2C7%202%2C14%205%2C14%205%2C9%209%2C9%209%2C14%2012%2C14%2012%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -a[data-icon="info"]:after, .ui-icon-info:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M7%2C0C3.134%2C0%2C0%2C3.134%2C0%2C7s3.134%2C7%2C7%2C7s7-3.134%2C7-7S10.866%2C0%2C7%2C0z%20M7%2C2c0.552%2C0%2C1%2C0.447%2C1%2C1S7.552%2C4%2C7%2C4S6%2C3.553%2C6%2C3%20S6.448%2C2%2C7%2C2z%20M9%2C11H5v-1h1V6H5V5h3v5h1V11z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -a[data-icon="minus"]:after, .ui-icon-minus:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Crect%20y%3D%225%22%20style%3D%22fill%3A%23FFFFFF%3B%22%20width%3D%2214%22%20height%3D%224%22%2F%3E%3C%2Fsvg%3E"); -} -a[data-icon="plus"]:after, .ui-icon-plus:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C5%209%2C5%209%2C0%205%2C0%205%2C5%200%2C5%200%2C9%205%2C9%205%2C14%209%2C14%209%2C9%2014%2C9%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -a[data-icon="refresh"]:after, .ui-icon-refresh:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.001px%22%20height%3D%2214.002px%22%20viewBox%3D%220%200%2014.001%2014.002%22%20style%3D%22enable-background%3Anew%200%200%2014.001%2014.002%3B%22%20%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M14.001%2C6.001v-6l-2.06%2C2.06c-0.423-0.424-0.897-0.809-1.44-1.122C7.153-0.994%2C2.872%2C0.153%2C0.939%2C3.501%20c-1.933%2C3.348-0.786%2C7.629%2C2.562%2C9.562c3.348%2C1.933%2C7.629%2C0.785%2C9.562-2.562l-1.732-1c-1.381%2C2.392-4.438%2C3.211-6.83%2C1.83%20s-3.211-4.438-1.83-6.83s4.438-3.211%2C6.83-1.83c0.389%2C0.225%2C0.718%2C0.506%2C1.02%2C0.81l-2.52%2C2.52H14.001z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -a[data-icon="search"]:after, .ui-icon-search:after { - background-image: url("data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M10.171%2C8.766c0.617-0.888%2C0.979-1.964%2C0.979-3.126c0-3.037-2.463-5.5-5.5-5.5s-5.5%2C2.463-5.5%2C5.5%20s2.463%2C5.5%2C5.5%2C5.5c1.152%2C0%2C2.223-0.355%2C3.104-0.962l3.684%2C3.683l1.414-1.414L10.171%2C8.766z%20M5.649%2C9.14c-1.933%2C0-3.5-1.567-3.5-3.5%20c0-1.933%2C1.567-3.5%2C3.5-3.5c1.933%2C0%2C3.5%2C1.567%2C3.5%2C3.5C9.149%2C7.572%2C7.582%2C9.14%2C5.649%2C9.14z%22%2F%3E%3C%2Fsvg%3E"); -} \ No newline at end of file From 4dae2fdc326ac59f5033eeae511332cef0aeae1f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 24 Sep 2016 02:22:03 -0400 Subject: [PATCH 44/91] add network share config --- .../emby-apiclient/apiclient.js | 48 +++++- .../itemhovermenu/itemhovermenu.js | 2 +- .../recordingfields.template.html | 4 + .../directorybrowser/directorybrowser.css | 1 - .../directorybrowser/directorybrowser.js | 156 +++++++++++------- .../imageuploader/imageuploader.template.html | 2 +- .../medialibrarycreator.js | 52 ++++-- .../medialibraryeditor/medialibraryeditor.js | 109 ++++++++++-- dashboard-ui/css/librarymenu.css | 2 +- dashboard-ui/dashboard.html | 4 +- dashboard-ui/scripts/dashboardpage.js | 2 +- dashboard-ui/scripts/userlibraryaccess.js | 2 +- dashboard-ui/strings/en-US.json | 4 +- 13 files changed, 278 insertions(+), 110 deletions(-) diff --git a/dashboard-ui/bower_components/emby-apiclient/apiclient.js b/dashboard-ui/bower_components/emby-apiclient/apiclient.js index 9a56f8e1d9..ab55290e68 100644 --- a/dashboard-ui/bower_components/emby-apiclient/apiclient.js +++ b/dashboard-ui/bower_components/emby-apiclient/apiclient.js @@ -1739,7 +1739,7 @@ * Adds a virtual folder * @param {String} name */ - self.addVirtualFolder = function (name, type, refreshLibrary, initialPaths, libraryOptions) { + self.addVirtualFolder = function (name, type, refreshLibrary, libraryOptions) { if (!name) { throw new Error("null name"); @@ -1762,7 +1762,6 @@ type: "POST", url: url, data: JSON.stringify({ - Paths: initialPaths, LibraryOptions: libraryOptions }), contentType: 'application/json' @@ -1817,7 +1816,7 @@ * Adds an additional mediaPath to an existing virtual folder * @param {String} name */ - self.addMediaPath = function (virtualFolderName, mediaPath, refreshLibrary) { + self.addMediaPath = function (virtualFolderName, mediaPath, networkSharePath, refreshLibrary) { if (!virtualFolderName) { throw new Error("null virtualFolderName"); @@ -1829,15 +1828,50 @@ var url = "Library/VirtualFolders/Paths"; + var pathInfo = { + Path: mediaPath + }; + if (networkSharePath) { + pathInfo.NetworkPath = networkSharePath; + } + url = self.getUrl(url, { - refreshLibrary: refreshLibrary ? true : false, - path: mediaPath, - name: virtualFolderName + refreshLibrary: refreshLibrary ? true : false }); return self.ajax({ type: "POST", - url: url + url: url, + data: JSON.stringify({ + Name: virtualFolderName, + PathInfo: pathInfo + }), + contentType: 'application/json' + }); + }; + + self.updateMediaPath = function (virtualFolderName, pathInfo) { + + if (!virtualFolderName) { + throw new Error("null virtualFolderName"); + } + + if (!pathInfo) { + throw new Error("null pathInfo"); + } + + var url = "Library/VirtualFolders/Paths/Update"; + + url = self.getUrl(url); + + return self.ajax({ + type: "POST", + url: url, + data: JSON.stringify({ + Name: virtualFolderName, + PathInfo: pathInfo + }), + contentType: 'application/json' }); }; diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.js b/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.js index a24fe6488d..e02e083a62 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.js +++ b/dashboard-ui/bower_components/emby-webcomponents/itemhovermenu/itemhovermenu.js @@ -243,7 +243,7 @@ showOverlayTimeout = setTimeout(function () { onShowTimerExpired(card); - }, 1000); + }, 1200); } function preventTouchHover() { diff --git a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html index 0b5610bfd7..c45dcc38a7 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/recordingcreator/recordingfields.template.html @@ -17,6 +17,10 @@ color: #cc3333; } + .manageButtonText { + text-transform: none; + } + @media all and (max-width: 440px) { .manageButtonText { diff --git a/dashboard-ui/components/directorybrowser/directorybrowser.css b/dashboard-ui/components/directorybrowser/directorybrowser.css index 7822a3bf94..2fe861ee16 100644 --- a/dashboard-ui/components/directorybrowser/directorybrowser.css +++ b/dashboard-ui/components/directorybrowser/directorybrowser.css @@ -12,5 +12,4 @@ background: #fff3a5; padding: 1em; border-radius: 5px; - margin-top: 2em; } \ No newline at end of file diff --git a/dashboard-ui/components/directorybrowser/directorybrowser.js b/dashboard-ui/components/directorybrowser/directorybrowser.js index 5d70e2fa9a..5d73df62e6 100644 --- a/dashboard-ui/components/directorybrowser/directorybrowser.js +++ b/dashboard-ui/components/directorybrowser/directorybrowser.js @@ -1,4 +1,4 @@ -define(['dialogHelper', 'jQuery', 'listViewStyle', 'emby-input', 'emby-button', 'paper-icon-button-light', 'css!./directorybrowser', 'formDialogStyle'], function (dialogHelper, $) { +define(['dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'emby-button', 'paper-icon-button-light', 'css!./directorybrowser', 'formDialogStyle'], function (dialogHelper, dom) { var systemInfo; function getSystemInfo() { @@ -29,12 +29,6 @@ } Dashboard.showLoadingMsg(); - if (path) { - $('.networkHeadline').hide(); - } else { - $('.networkHeadline').show(); - } - var promises = []; if (path === "Network") { @@ -53,7 +47,7 @@ var folders = responses[0]; var parentPath = responses[1] || ''; - $('#txtDirectoryPickerPath', page).val(path || ""); + page.querySelector('#txtDirectoryPickerPath').value = path || ""; var html = ''; @@ -75,14 +69,14 @@ html += getItem("lnkPath lnkDirectory", "", "Network", Globalize.translate('ButtonNetwork')); } - $('.results', page).html(html); + page.querySelector('.results').innerHTML = html; Dashboard.hideLoadingMsg(); }, function () { - $('#txtDirectoryPickerPath', page).val(""); - $('.results', page).html(''); + page.querySelector('#txtDirectoryPickerPath').value = ""; + page.querySelector('.results').innerHTML = ''; Dashboard.hideLoadingMsg(); }); @@ -108,44 +102,63 @@ var html = ''; html += '
'; - html += '
'; + html += '
'; - var instruction = options.instruction ? options.instruction + '

' : ''; + if (!options.pathReadOnly) { + var instruction = options.instruction ? options.instruction + '

' : ''; - html += '

'; - html += instruction; - html += Globalize.translate('MessageDirectoryPickerInstruction') - .replace('{0}', '\\\\server') - .replace('{1}', '\\\\192.168.1.101'); + html += '

'; + html += instruction; + html += Globalize.translate('MessageDirectoryPickerInstruction') + .replace('{0}', '\\\\server') + .replace('{1}', '\\\\192.168.1.101'); - if (systemInfo.OperatingSystem.toLowerCase() == 'bsd') { + if (systemInfo.OperatingSystem.toLowerCase() == 'bsd') { - html += '
'; - html += '
'; - html += Globalize.translate('MessageDirectoryPickerBSDInstruction'); - html += '
'; - html += '' + Globalize.translate('ButtonMoreInformation') + ''; + html += '
'; + html += '
'; + html += Globalize.translate('MessageDirectoryPickerBSDInstruction'); + html += '
'; + html += '' + Globalize.translate('ButtonMoreInformation') + ''; + } + else if (systemInfo.OperatingSystem.toLowerCase() == 'linux') { + + html += '
'; + html += '
'; + html += Globalize.translate('MessageDirectoryPickerLinuxInstruction'); + html += '
'; + } + + html += '
'; } - else if (systemInfo.OperatingSystem.toLowerCase() == 'linux') { - - html += '
'; - html += '
'; - html += Globalize.translate('MessageDirectoryPickerLinuxInstruction'); - html += '
'; - } - - html += '

'; html += '
'; html += '
'; html += '
'; - html += ''; - html += '
'; - html += ''; + var labelKey = options.includeFiles !== true ? 'LabelFolder' : 'LabelPath'; + var readOnlyAttribute = options.pathReadOnly ? ' readonly' : ''; + html += ''; html += '
'; - html += '
'; + if (!readOnlyAttribute) { + html += ''; + } + + html += '
'; + + if (!readOnlyAttribute) { + html += '
'; + } + + if (options.enableNetworkSharePath) { + html += '
'; + html += ''; + html += '
'; + html += Globalize.translate('LabelOptionalNetworkPathHelp'); + html += '
'; + html += '
'; + } html += '
'; html += ''; @@ -162,32 +175,49 @@ function initEditor(content, options, fileOptions) { - $(content).on("click", ".lnkPath", function () { + content.addEventListener("click", function (e) { - var path = this.getAttribute('data-path'); + var lnkPath = dom.parentWithClass(e.target, 'lnkPath'); + if (lnkPath) { + var path = lnkPath.getAttribute('data-path'); - if ($(this).hasClass('lnkFile')) { - $('#txtDirectoryPickerPath', content).val(path); - } else { - refreshDirectoryBrowser(content, path, fileOptions); + if (lnkPath.classList.contains('lnkFile')) { + content.querySelector('#txtDirectoryPickerPath').value = path; + } else { + refreshDirectoryBrowser(content, path, fileOptions); + } } - }).on("click", ".btnRefreshDirectories", function () { - - var path = $('#txtDirectoryPickerPath', content).val(); - - refreshDirectoryBrowser(content, path, fileOptions); - - }).on("change", "#txtDirectoryPickerPath", function () { - - refreshDirectoryBrowser(content, this.value, fileOptions); }); - $('form', content).on('submit', function () { + content.addEventListener("click", function (e) { + + var btnRefreshDirectories = dom.parentWithClass(e.target, 'btnRefreshDirectories'); + if (btnRefreshDirectories) { + var path = content.querySelector('#txtDirectoryPickerPath').value; + + refreshDirectoryBrowser(content, path, fileOptions); + } + }); + + content.addEventListener("change", function (e) { + + var txtDirectoryPickerPath = dom.parentWithTag(e.target, 'INPUT'); + if (txtDirectoryPickerPath && txtDirectoryPickerPath.id == 'txtDirectoryPickerPath') { + refreshDirectoryBrowser(content, txtDirectoryPickerPath.value, fileOptions); + } + }); + + content.querySelector('form').addEventListener('submit', function (e) { if (options.callback) { - options.callback(this.querySelector('#txtDirectoryPickerPath').value); + + var networkSharePath = this.querySelector('#txtNetworkPath'); + networkSharePath = networkSharePath ? networkSharePath.value : null; + options.callback(this.querySelector('#txtDirectoryPickerPath').value, networkSharePath); } + e.preventDefault(); + e.stopPropagation(); return false; }); } @@ -259,15 +289,11 @@ initEditor(dlg, options, fileOptions); - // Has to be assigned a z-index after the call to .open() - $(dlg).on('iron-overlay-opened', function () { - this.querySelector('#txtDirectoryPickerPath input').focus(); - }); - $(dlg).on('close', onDialogClosed); + dlg.addEventListener('close', onDialogClosed); dialogHelper.open(dlg); - $('.btnCloseDialog', dlg).on('click', function () { + dlg.querySelector('.btnCloseDialog').addEventListener('click', function () { dialogHelper.close(dlg); }); @@ -276,7 +302,15 @@ var txtCurrentPath = dlg.querySelector('#txtDirectoryPickerPath'); txtCurrentPath.value = initialPath; - refreshDirectoryBrowser(dlg, txtCurrentPath.value); + + var txtNetworkPath = dlg.querySelector('#txtNetworkPath'); + if (txtNetworkPath) { + txtNetworkPath.value = options.networkSharePath || ''; + } + + if (!options.pathReadOnly) { + refreshDirectoryBrowser(dlg, txtCurrentPath.value); + } }); }; diff --git a/dashboard-ui/components/imageuploader/imageuploader.template.html b/dashboard-ui/components/imageuploader/imageuploader.template.html index 06793f9699..a36f163a26 100644 --- a/dashboard-ui/components/imageuploader/imageuploader.template.html +++ b/dashboard-ui/components/imageuploader/imageuploader.template.html @@ -13,7 +13,7 @@
- diff --git a/dashboard-ui/components/medialibrarycreator/medialibrarycreator.js b/dashboard-ui/components/medialibrarycreator/medialibrarycreator.js index 339ffeba15..71f8d1735f 100644 --- a/dashboard-ui/components/medialibrarycreator/medialibrarycreator.js +++ b/dashboard-ui/components/medialibrarycreator/medialibrarycreator.js @@ -3,11 +3,11 @@ var currentDeferred; var hasChanges; var currentOptions; - var paths = []; + var pathInfos = []; function onSubmit() { - if (paths.length == 0) { + if (pathInfos.length == 0) { require(['alert'], function (alert) { alert({ text: Globalize.translate('PleaseAddAtLeastOneFolder'), @@ -29,7 +29,9 @@ var libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector('.libraryOptions')); - ApiClient.addVirtualFolder(name, type, currentOptions.refresh, paths, libraryOptions).then(function () { + libraryOptions.PathInfos = pathInfos; + + ApiClient.addVirtualFolder(name, type, currentOptions.refresh, libraryOptions).then(function () { hasChanges = true; dialogHelper.close(dlg); @@ -111,10 +113,11 @@ picker.show({ - callback: function (path) { + enableNetworkSharePath: true, + callback: function (path, networkSharePath) { if (path) { - addMediaLocation(page, path); + addMediaLocation(page, path, networkSharePath); } picker.close(); } @@ -123,7 +126,7 @@ }); } - function getFolderHtml(path, index) { + function getFolderHtml(pathInfo, index) { var html = ''; @@ -131,8 +134,14 @@ html += 'folder'; - html += '
'; - html += '
' + path + '
'; + var cssClass = pathInfo.NetworkPath ? 'listItemBody two-line' : 'listItemBody'; + + html += '
'; + html += '
' + pathInfo.Path + '
'; + + if (pathInfo.NetworkPath) { + html += '
' + pathInfo.NetworkPath + '
'; + } html += '
'; html += ''; @@ -143,7 +152,7 @@ } function renderPaths(page) { - var foldersHtml = paths.map(getFolderHtml).join(''); + var foldersHtml = pathInfos.map(getFolderHtml).join(''); var folderList = page.querySelector('.folderList'); folderList.innerHTML = foldersHtml; @@ -157,14 +166,21 @@ $(page.querySelectorAll('.btnRemovePath')).on('click', onRemoveClick); } - function addMediaLocation(page, path) { + function addMediaLocation(page, path, networkSharePath) { - if (paths.filter(function (p) { + if (pathInfos.filter(function (p) { - return p.toLowerCase() == path.toLowerCase(); + return p.Path.toLowerCase() == path.toLowerCase(); }).length == 0) { - paths.push(path); + + var pathInfo = { + Path: path + }; + if (networkSharePath) { + pathInfo.NetworkPath = networkSharePath; + } + pathInfos.push(pathInfo); renderPaths(page); } } @@ -174,10 +190,10 @@ var button = this; var index = parseInt(button.getAttribute('data-index')); - var location = paths[index]; - paths = paths.filter(function (p) { + var location = pathInfos[index]; + pathInfos = pathInfos.filter(function (p) { - return p.toLowerCase() != location.toLowerCase(); + return p.Path.toLowerCase() != location.toLowerCase(); }); var page = $(this).parents('.dlg-librarycreator')[0]; renderPaths(page); @@ -190,7 +206,7 @@ } function initLibraryOptions(dlg) { - libraryoptionseditor.embed(dlg.querySelector('.libraryOptions')).then(function() { + libraryoptionseditor.embed(dlg.querySelector('.libraryOptions')).then(function () { $('#selectCollectionType', dlg).trigger('change'); }); } @@ -241,7 +257,7 @@ dialogHelper.close(dlg); }); - paths = []; + pathInfos = []; renderPaths(dlg); initLibraryOptions(dlg); } diff --git a/dashboard-ui/components/medialibraryeditor/medialibraryeditor.js b/dashboard-ui/components/medialibraryeditor/medialibraryeditor.js index 7c1d9e501b..0459d164e9 100644 --- a/dashboard-ui/components/medialibraryeditor/medialibraryeditor.js +++ b/dashboard-ui/components/medialibraryeditor/medialibraryeditor.js @@ -4,13 +4,13 @@ var hasChanges; var currentOptions; - function addMediaLocation(page, path) { + function addMediaLocation(page, path, networkSharePath) { var virtualFolder = currentOptions.library; var refreshAfterChange = currentOptions.refresh; - ApiClient.addMediaPath(virtualFolder.Name, path, refreshAfterChange).then(function () { + ApiClient.addMediaPath(virtualFolder.Name, path, networkSharePath, refreshAfterChange).then(function () { hasChanges = true; refreshLibraryFromServer(page); @@ -23,9 +23,30 @@ }); } - function onRemoveClick() { + function updateMediaLocation(page, path, networkSharePath) { + var virtualFolder = currentOptions.library; - var button = this; + ApiClient.updateMediaPath(virtualFolder.Name, { + + Path: path, + NetworkPath: networkSharePath + + }).then(function () { + + hasChanges = true; + refreshLibraryFromServer(page); + + }, function () { + + require(['toast'], function (toast) { + toast(Globalize.translate('ErrorAddingMediaPathToVirtualFolder')); + }); + }); + } + + function onRemoveClick(btnRemovePath) { + + var button = btnRemovePath; var index = parseInt(button.getAttribute('data-index')); var virtualFolder = currentOptions.library; @@ -35,10 +56,10 @@ require(['confirm'], function (confirm) { confirm({ - + title: Globalize.translate('HeaderRemoveMediaLocation'), text: Globalize.translate('MessageConfirmRemoveMediaLocation'), - confirmText: Globalize.translate('sharedcomponents#ButtonDelete'), + confirmText: Globalize.translate('ButtonDelete'), primary: 'cancel' }).then(function () { @@ -60,18 +81,42 @@ }); } - function getFolderHtml(path, index) { + function onListItemClick(e) { + + var btnRemovePath = dom.parentWithClass(e.target, 'btnRemovePath'); + if (btnRemovePath) { + onRemoveClick(btnRemovePath); + return; + } + + var listItem = dom.parentWithClass(e.target, 'listItem'); + if (!listItem) { + return; + } + + var index = parseInt(listItem.getAttribute('data-index')); + var page = dom.parentWithClass(listItem, 'dlg-libraryeditor'); + showDirectoryBrowser(page, index); + } + + function getFolderHtml(pathInfo, index) { var html = ''; - html += '
'; + html += '
'; html += 'folder'; - html += '
'; + var cssClass = pathInfo.NetworkPath ? 'listItemBody two-line' : 'listItemBody'; + + html += '
'; + html += '

'; - html += path; + html += pathInfo.Path; html += '

'; + if (pathInfo.NetworkPath) { + html += '
' + pathInfo.NetworkPath + '
'; + } html += '
'; html += ''; @@ -99,13 +144,24 @@ } function renderLibrary(page, options) { - var foldersHtml = options.library.Locations.map(getFolderHtml).join(''); + + var pathInfos = (options.library.LibraryOptions || {}).PathInfos || []; + + if (!pathInfos.length) { + pathInfos = options.library.Locations.map(function (p) { + return { + Path: p + }; + }); + } + + var foldersHtml = pathInfos.map(getFolderHtml).join(''); page.querySelector('.folderList').innerHTML = foldersHtml; - var btnRemovePath = page.querySelectorAll('.btnRemovePath'); - for (var i = 0, length = btnRemovePath.length; i < length; i++) { - btnRemovePath[i].addEventListener('click', onRemoveClick); + var listItems = page.querySelectorAll('.listItem'); + for (var i = 0, length = listItems.length; i < length; i++) { + listItems[i].addEventListener('click', onListItemClick); } } @@ -113,16 +169,35 @@ var page = dom.parentWithClass(this, 'dlg-libraryeditor'); + showDirectoryBrowser(page); + } + + function showDirectoryBrowser(context, listIndex) { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); + var pathInfos = (currentOptions.library.LibraryOptions || {}).PathInfos || []; + var pathInfo = listIndex == null ? {} : (pathInfos[listIndex] || {}); + // legacy + var location = listIndex == null ? null : (currentOptions.library.Locations[listIndex]); + var originalPath = pathInfo.Path || location; + picker.show({ - callback: function (path) { + enableNetworkSharePath: true, + pathReadOnly: listIndex != null, + path: originalPath, + networkSharePath: pathInfo.NetworkPath, + callback: function (path, networkSharePath) { if (path) { - addMediaLocation(page, path); + if (originalPath) { + updateMediaLocation(context, originalPath, networkSharePath); + } else { + addMediaLocation(context, path, networkSharePath); + } } picker.close(); } @@ -145,6 +220,8 @@ var libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector('.libraryOptions')); + libraryOptions = Object.assign(currentOptions.library.LibraryOptions || {}, libraryOptions); + ApiClient.updateVirtualFolderOptions(currentOptions.library.ItemId, libraryOptions); } diff --git a/dashboard-ui/css/librarymenu.css b/dashboard-ui/css/librarymenu.css index 9314405bd3..7e5bd5a8b4 100644 --- a/dashboard-ui/css/librarymenu.css +++ b/dashboard-ui/css/librarymenu.css @@ -246,7 +246,7 @@ body:not(.dashboardDocument) .btnNotifications { } i.sidebarLinkIcon { - font-size: 150%; + font-size: 120%; height: auto; width: auto; } diff --git a/dashboard-ui/dashboard.html b/dashboard-ui/dashboard.html index d083ae30c7..6dc6ca0388 100644 --- a/dashboard-ui/dashboard.html +++ b/dashboard-ui/dashboard.html @@ -35,7 +35,9 @@

- +
${PleaseUpdateManually} diff --git a/dashboard-ui/scripts/dashboardpage.js b/dashboard-ui/scripts/dashboardpage.js index 85984c5477..007efc99d9 100644 --- a/dashboard-ui/scripts/dashboardpage.js +++ b/dashboard-ui/scripts/dashboardpage.js @@ -986,7 +986,7 @@ html += '

' + Globalize.translate('NewVersionOfSomethingAvailable').replace('{0}', update.name) + '

'; - html += ''; + html += ''; } elem.html(html); diff --git a/dashboard-ui/scripts/userlibraryaccess.js b/dashboard-ui/scripts/userlibraryaccess.js index e07826168b..6d688424e4 100644 --- a/dashboard-ui/scripts/userlibraryaccess.js +++ b/dashboard-ui/scripts/userlibraryaccess.js @@ -70,7 +70,7 @@ var checkedAttribute = user.Policy.EnableAllDevices || user.Policy.EnabledDevices.indexOf(device.Id) != -1 ? ' checked="checked"' : ''; - html += ''; + html += ''; } html += '
'; diff --git a/dashboard-ui/strings/en-US.json b/dashboard-ui/strings/en-US.json index fde54094d3..5b5c16073e 100644 --- a/dashboard-ui/strings/en-US.json +++ b/dashboard-ui/strings/en-US.json @@ -2137,5 +2137,7 @@ "HeaderForKids": "For Kids", "HeaderRecordingGroups": "Recording Groups", "LabelConvertRecordingsTo": "Convert recordings to:", - "HeaderUpcomingOnTV": "Upcoming On TV" + "HeaderUpcomingOnTV": "Upcoming On TV", + "LabelOptionalNetworkPath": "(Optional) Shared network folder:", + "LabelOptionalNetworkPathHelp": "If this folder is shared on your network, supplying the network share path can allow Emby apps on other devices to access media files directly." } From fd25ff8c13d7e778de3e77f42940f6f92c3dbe99 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 24 Sep 2016 13:58:17 -0400 Subject: [PATCH 45/91] update network share settings --- .../directorybrowser/directorybrowser.css | 1 + .../directorybrowser/directorybrowser.js | 2 +- .../medialibraryeditor/medialibraryeditor.js | 1 - dashboard-ui/dashboard/librarydisplay.js | 2 +- dashboard-ui/dashboard/librarysettings.js | 2 +- dashboard-ui/librarypathmapping.html | 26 +++++-------------- dashboard-ui/scripts/librarypathmapping.js | 2 +- dashboard-ui/scripts/medialibrarypage.js | 4 +-- 8 files changed, 13 insertions(+), 27 deletions(-) diff --git a/dashboard-ui/components/directorybrowser/directorybrowser.css b/dashboard-ui/components/directorybrowser/directorybrowser.css index 2fe861ee16..a985a800d7 100644 --- a/dashboard-ui/components/directorybrowser/directorybrowser.css +++ b/dashboard-ui/components/directorybrowser/directorybrowser.css @@ -12,4 +12,5 @@ background: #fff3a5; padding: 1em; border-radius: 5px; + margin-bottom: 1.5em; } \ No newline at end of file diff --git a/dashboard-ui/components/directorybrowser/directorybrowser.js b/dashboard-ui/components/directorybrowser/directorybrowser.js index 5d73df62e6..f7ecbbdd39 100644 --- a/dashboard-ui/components/directorybrowser/directorybrowser.js +++ b/dashboard-ui/components/directorybrowser/directorybrowser.js @@ -152,7 +152,7 @@ } if (options.enableNetworkSharePath) { - html += '
'; + html += '
'; html += ''; html += '
'; html += Globalize.translate('LabelOptionalNetworkPathHelp'); diff --git a/dashboard-ui/components/medialibraryeditor/medialibraryeditor.js b/dashboard-ui/components/medialibraryeditor/medialibraryeditor.js index 0459d164e9..a313400053 100644 --- a/dashboard-ui/components/medialibraryeditor/medialibraryeditor.js +++ b/dashboard-ui/components/medialibraryeditor/medialibraryeditor.js @@ -25,7 +25,6 @@ function updateMediaLocation(page, path, networkSharePath) { var virtualFolder = currentOptions.library; - ApiClient.updateMediaPath(virtualFolder.Name, { Path: path, diff --git a/dashboard-ui/dashboard/librarydisplay.js b/dashboard-ui/dashboard/librarydisplay.js index bd7b0271c9..7d3e758640 100644 --- a/dashboard-ui/dashboard/librarydisplay.js +++ b/dashboard-ui/dashboard/librarydisplay.js @@ -4,7 +4,7 @@ return [ { href: 'library.html', - name: globalize.translate('TabFolders') + name: globalize.translate('HeaderLibraries') }, { href: 'librarydisplay.html', diff --git a/dashboard-ui/dashboard/librarysettings.js b/dashboard-ui/dashboard/librarysettings.js index 97e880457a..fc0438f1c8 100644 --- a/dashboard-ui/dashboard/librarysettings.js +++ b/dashboard-ui/dashboard/librarysettings.js @@ -94,7 +94,7 @@ return [ { href: 'library.html', - name: Globalize.translate('TabFolders') + name: Globalize.translate('HeaderLibraries') }, { href: 'librarydisplay.html', diff --git a/dashboard-ui/librarypathmapping.html b/dashboard-ui/librarypathmapping.html index 5303346f84..1583065488 100644 --- a/dashboard-ui/librarypathmapping.html +++ b/dashboard-ui/librarypathmapping.html @@ -10,26 +10,12 @@
- - -
-

${ButtonAddPathSubstitution}

-
- - -
-
-
-
- - -
${LabelToHelp}
-
-
- -
- - +

+ Path Substitutions can no longer be added. This feature is being replaced by the network share setup. +

+

+ To configure network shares, edit an existing media library, then click on one of the existing folders. You'll then be able to map a network path to a library path. +

diff --git a/dashboard-ui/scripts/librarypathmapping.js b/dashboard-ui/scripts/librarypathmapping.js index a619f7d228..d53050ee24 100644 --- a/dashboard-ui/scripts/librarypathmapping.js +++ b/dashboard-ui/scripts/librarypathmapping.js @@ -114,7 +114,7 @@ return [ { href: 'library.html', - name: Globalize.translate('TabFolders') + name: Globalize.translate('HeaderLibraries') }, { href: 'librarydisplay.html', diff --git a/dashboard-ui/scripts/medialibrarypage.js b/dashboard-ui/scripts/medialibrarypage.js index 9da6ef58cf..de2ea55339 100644 --- a/dashboard-ui/scripts/medialibrarypage.js +++ b/dashboard-ui/scripts/medialibrarypage.js @@ -328,7 +328,7 @@ if (!imgUrl && virtualFolder.showNameWithIcon) { html += '

'; - html += '' + (virtualFolder.icon || getIcon(virtualFolder.CollectionType)) + ''; + html += '' + (virtualFolder.icon || getIcon(virtualFolder.CollectionType)) + ''; if (virtualFolder.showNameWithIcon) { html += '
'; @@ -435,7 +435,7 @@ return [ { href: 'library.html', - name: Globalize.translate('TabFolders') + name: Globalize.translate('HeaderLibraries') }, { href: 'librarydisplay.html', From a6d492c13de4edd43597da3b866db9b64897bb9b Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 25 Sep 2016 14:39:13 -0400 Subject: [PATCH 46/91] rework live stream handling --- .../actionsheet/actionsheet.js | 8 +- .../dialoghelper/dialoghelper.js | 4 +- .../emby-button/emby-button.css | 1 - .../accessschedule/accessschedule.js | 113 +++++ .../accessschedule.template.html | 39 ++ dashboard-ui/components/viewcontainer-lite.js | 2 - dashboard-ui/css/librarybrowser.css | 26 +- dashboard-ui/css/site.css | 10 +- dashboard-ui/devices/ios/ios.css | 24 +- dashboard-ui/gamestudios.html | 2 +- dashboard-ui/mypreferencesdisplay.html | 2 +- dashboard-ui/mypreferenceshome.html | 25 +- dashboard-ui/mypreferenceslanguages.html | 57 +-- dashboard-ui/mypreferencesmenu.html | 2 +- dashboard-ui/reports.html | 2 +- dashboard-ui/scripts/plugincatalogpage.js | 4 +- dashboard-ui/scripts/site.js | 21 +- dashboard-ui/scripts/userparentalcontrol.js | 109 ++--- .../jquerymobile-1.4.5/jqm.collapsible.css | 102 ---- .../jquerymobile-1.4.5/jqm.collapsible.js | 388 --------------- .../jquerymobile-1.4.5/jqm.controlgroup.css | 121 ----- .../jquerymobile-1.4.5/jqm.panel.css | 12 +- .../jquerymobile-1.4.5/jqm.popup.css | 12 +- .../jquery.mobile.custom.theme.css | 441 ------------------ .../thirdparty/paper-button-style.css | 1 + dashboard-ui/userparentalcontrol.html | 78 +--- dashboard-ui/userprofiles.html | 8 +- 27 files changed, 313 insertions(+), 1301 deletions(-) create mode 100644 dashboard-ui/components/accessschedule/accessschedule.js create mode 100644 dashboard-ui/components/accessschedule/accessschedule.template.html delete mode 100644 dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.collapsible.css delete mode 100644 dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.collapsible.js delete mode 100644 dashboard-ui/thirdparty/jquerymobile-1.4.5/jqm.controlgroup.css delete mode 100644 dashboard-ui/thirdparty/jquerymobile-1.4.5/jquery.mobile.custom.theme.css diff --git a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js index 84719ba103..988f771092 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js +++ b/dashboard-ui/bower_components/emby-webcomponents/actionsheet/actionsheet.js @@ -25,7 +25,9 @@ results[i] = { top: box.top, - left: box.left + left: box.left, + width: box.width, + height: box.height }; } @@ -45,10 +47,10 @@ var pos = getOffsets([options.positionTo])[0]; if (options.positionY != 'top') { - pos.top += options.positionTo.offsetHeight / 2; + pos.top += (pos.height || 0) / 2; } - pos.left += options.positionTo.offsetWidth / 2; + pos.left += (pos.width || 0) / 2; var height = dlg.offsetHeight || 300; var width = dlg.offsetWidth || 160; diff --git a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js index f2b5ef3042..bbcdb866c8 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js +++ b/dashboard-ui/bower_components/emby-webcomponents/dialoghelper/dialoghelper.js @@ -281,7 +281,7 @@ })); } }; - if (!dlg.animationConfig || !dlg.animate) { + if (!dlg.animationConfig) { onAnimationFinish(); return; } @@ -312,7 +312,7 @@ } }; - if (!dlg.animationConfig || !dlg.animate) { + if (!dlg.animationConfig) { onAnimationFinish(); return; } diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css b/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css index 96d9522955..4237df422f 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-button/emby-button.css @@ -28,7 +28,6 @@ font-weight: 500; /* Disable webkit tap highlighting */ -webkit-tap-highlight-color: rgba(0,0,0,0); - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); } .emby-button::-moz-focus-inner { diff --git a/dashboard-ui/components/accessschedule/accessschedule.js b/dashboard-ui/components/accessschedule/accessschedule.js new file mode 100644 index 0000000000..d6545acea3 --- /dev/null +++ b/dashboard-ui/components/accessschedule/accessschedule.js @@ -0,0 +1,113 @@ +define(['dialogHelper', 'datetime', 'emby-select', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper, datetime) { + + function getDisplayTime(hours) { + + var minutes = 0; + + var pct = hours % 1; + + if (pct) { + minutes = parseInt(pct * 60); + } + + return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0)); + } + + function populateHours(context) { + + var html = ''; + + for (var i = 0; i < 24; i++) { + + html += ''; + } + + html += ''; + + context.querySelector('#selectStart').innerHTML = html; + context.querySelector('#selectEnd').innerHTML = html; + } + + function loadSchedule(context, schedule) { + + context.querySelector('#selectDay').value = schedule.DayOfWeek || 'Sunday'; + context.querySelector('#selectStart').value = schedule.StartHour || 0; + context.querySelector('#selectEnd').value = schedule.EndHour || 0; + } + + function submitSchedule(context, options) { + + var updatedSchedule = { + DayOfWeek: context.querySelector('#selectDay').value, + StartHour: context.querySelector('#selectStart').value, + EndHour: context.querySelector('#selectEnd').value + }; + + if (parseFloat(updatedSchedule.StartHour) >= parseFloat(updatedSchedule.EndHour)) { + + alert(Globalize.translate('ErrorMessageStartHourGreaterThanEnd')); + + return; + } + + context.submitted = true; + options.schedule = Object.assign(options.schedule, updatedSchedule); + dialogHelper.close(context); + } + + return { + show: function (options) { + return new Promise(function (resolve, reject) { + + var xhr = new XMLHttpRequest(); + xhr.open('GET', 'components/accessschedule/accessschedule.template.html', true); + + xhr.onload = function (e) { + + var template = this.response; + var dlg = dialogHelper.createDialog({ + removeOnClose: true, + size: 'small' + }); + + dlg.classList.add('formDialog'); + + var html = ''; + + html += Globalize.translateDocument(template); + + dlg.innerHTML = html; + + populateHours(dlg); + loadSchedule(dlg, options.schedule); + + dialogHelper.open(dlg); + + dlg.addEventListener('close', function () { + + if (dlg.submitted) { + resolve(options.schedule); + } else { + reject(); + } + }); + + dlg.querySelector('.btnCancel').addEventListener('click', function (e) { + + dialogHelper.close(dlg); + }); + + dlg.querySelector('form').addEventListener('submit', function (e) { + + submitSchedule(dlg, options); + + e.preventDefault(); + return false; + }); + } + + xhr.send(); + }); + } + }; +}); \ No newline at end of file diff --git a/dashboard-ui/components/accessschedule/accessschedule.template.html b/dashboard-ui/components/accessschedule/accessschedule.template.html new file mode 100644 index 0000000000..a388acbf1f --- /dev/null +++ b/dashboard-ui/components/accessschedule/accessschedule.template.html @@ -0,0 +1,39 @@ +
+ +

+ ${HeaderAccessSchedule} +

+
+
+
+
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+
+
\ No newline at end of file diff --git a/dashboard-ui/components/viewcontainer-lite.js b/dashboard-ui/components/viewcontainer-lite.js index a9b60ce15a..2f902a47ef 100644 --- a/dashboard-ui/components/viewcontainer-lite.js +++ b/dashboard-ui/components/viewcontainer-lite.js @@ -45,10 +45,8 @@ define(['browser'], function (browser) { if (isPluginpage) { dependencies.push('jqmpopup'); - dependencies.push('jqmcollapsible'); dependencies.push('legacy/dashboard'); dependencies.push('legacy/selectmenu'); - dependencies.push('jqmcontrolgroup'); dependencies.push('jqmlistview'); dependencies.push('fnchecked'); } diff --git a/dashboard-ui/css/librarybrowser.css b/dashboard-ui/css/librarybrowser.css index 62cf7ec2d9..5b408d3185 100644 --- a/dashboard-ui/css/librarybrowser.css +++ b/dashboard-ui/css/librarybrowser.css @@ -512,25 +512,13 @@ span.itemCommunityRating:not(:empty) + .userDataIcons { text-overflow: ellipsis; overflow: hidden; position: relative; + margin: 1.5em 0 1em; + display: flex; + align-items: center; } -.ui-body-a .detailSectionHeader { - border: 1px solid #ddd; - border-width: 0 0 1px 0; -} - -.ui-body-b .detailSectionHeader { - border: 1px solid #444; - border-width: 0 0 1px 0; -} - -.detailSectionHeader, .detailSectionHeader h3 { - font-size: 20px; - font-weight: 400; -} - - .detailSectionHeader button { - font-size: 13px; + .detailSectionHeader > h1 { + margin: 0; } .detailSectionHeaderButton { @@ -702,10 +690,6 @@ span.itemCommunityRating:not(:empty) + .userDataIcons { align-items: center; } -.mediaInfoItem { - white-space: nowrap; -} - @media all and (max-width: 600px) { .portraitDetailImageContainer + .primaryDetailsContainer { diff --git a/dashboard-ui/css/site.css b/dashboard-ui/css/site.css index 5fbb047590..08b397cc38 100644 --- a/dashboard-ui/css/site.css +++ b/dashboard-ui/css/site.css @@ -35,10 +35,18 @@ html { margin: 0; padding: 0; height: 100%; - font-family: 'San Francisco', 'Helvetica Neue', Roboto, 'Open Sans', 'Segoe UI', sans-serif; + font-family: -apple-system, 'San Francisco', 'Helvetica Neue', Roboto, 'Open Sans', 'Segoe UI', sans-serif; font-size: 14px; } +h1 { + font-family: -apple-system-headline, 'San Francisco', 'Helvetica Neue', Roboto, 'Open Sans', 'Segoe UI', sans-serif; +} + +h2 { + font-family: -apple-system-subheadline, 'San Francisco', 'Helvetica Neue', Roboto, 'Open Sans', 'Segoe UI', sans-serif; +} + body { overflow-y: scroll !important; /* This is needed to prevent a horizontal scrollbar while neon-animated-pages are animating. */ diff --git a/dashboard-ui/devices/ios/ios.css b/dashboard-ui/devices/ios/ios.css index e85e6c2a78..045f5173a4 100644 --- a/dashboard-ui/devices/ios/ios.css +++ b/dashboard-ui/devices/ios/ios.css @@ -28,6 +28,16 @@ body:not(.dashboardDocument) .mainDrawerButton { height: 50px; } +/*.viewMenuBar, .ui-body-b .libraryViewNav { + background: rgba(34,35,38,.90); + -webkit-backdrop-filter: blur(5px); + backdrop-filter: blur(5px); +} + + .viewMenuBar.semiTransparent { + background-color: rgba(15, 15, 15, .3); + }*/ + .emby-tab-button { font-weight: 400; text-transform: none !important; @@ -55,6 +65,10 @@ h1, h1 a { font-weight: 400; } +.cardImageContainer { + border-radius: 8px; +} + .noSecondaryNavPage .itemBackdrop { margin-top: 0; } @@ -67,10 +81,6 @@ h1, h1 a { font-size: 200% !important; } -.alphabetPicker { - right: 5px !important; -} - .txtSearch { padding-bottom: .5em !important; text-indent: 0 !important; @@ -84,3 +94,9 @@ h1, h1 a { .categorySyncButton, .btnSync { display: none !important; } + +.dialog.background-theme-b { + background: rgba(28,28,28,.88); + -webkit-backdrop-filter: blur(5px); + backdrop-filter: blur(5px); +} diff --git a/dashboard-ui/gamestudios.html b/dashboard-ui/gamestudios.html index 166231c164..74ce50045c 100644 --- a/dashboard-ui/gamestudios.html +++ b/dashboard-ui/gamestudios.html @@ -1,4 +1,4 @@ -
+
${TabSuggestions} ${TabGames} diff --git a/dashboard-ui/mypreferencesdisplay.html b/dashboard-ui/mypreferencesdisplay.html index 5e147319dc..bfbcc42402 100644 --- a/dashboard-ui/mypreferencesdisplay.html +++ b/dashboard-ui/mypreferencesdisplay.html @@ -1,4 +1,4 @@ -
+
diff --git a/dashboard-ui/mypreferenceshome.html b/dashboard-ui/mypreferenceshome.html index b869701a2d..5b9bd1371b 100644 --- a/dashboard-ui/mypreferenceshome.html +++ b/dashboard-ui/mypreferenceshome.html @@ -1,4 +1,4 @@ -
+
@@ -9,9 +9,8 @@


-
- - @@ -23,10 +22,8 @@
-
-
- - @@ -39,10 +36,8 @@
-
-
- - @@ -55,10 +50,8 @@
-
-
- - diff --git a/dashboard-ui/mypreferenceslanguages.html b/dashboard-ui/mypreferenceslanguages.html index 92cdacbce4..8db30628ff 100644 --- a/dashboard-ui/mypreferenceslanguages.html +++ b/dashboard-ui/mypreferenceslanguages.html @@ -1,4 +1,4 @@ -
+
@@ -10,11 +10,9 @@ ${HeaderAudioSettings}


-
- - +
+
-