diff --git a/dist/index.html b/dist/index.html index 4a917ab..7e83312 100644 --- a/dist/index.html +++ b/dist/index.html @@ -1 +1 @@ -Team Toolbox
Team ToolBox Build your teams randomly!

{{~it.teams :team:idx}}

{{=team.name}}

    {{~team.members :member:idxm}}
  • {{=member.name}}
  • {{~}}
{{~}} {{? it.orphans }}

Team Orphan(s)

    {{~it.orphans :orphan:idx}}
  • {{=orphan.name}}
  • {{~}}
{{?}}

{{~it :team:idx}}

{{=team.name}}

    {{~team.members :member:idxm}}
  • {{=member.name}}
  • {{~}}
{{~}}
{{ for(var prop in it) { }}

{{=it[prop].name}}

    {{~it[prop].members :member:idxm}}
  • {{~}}
{{ } }}

Random ordered list:

    {{~it :member:idx}}
  1. {{=member.name}}
  2. {{~}}

group {{=it.name}}:

members:

Welcome to Team ToolBox, a project to help you work or play with teams/groups randomly!

It helps whenever we need to pick someone, don't find volunteers, define teams (practical exercises, collective workshops etc...) , define passing order or assign tasks.

This tool may be useful for trainers, teachers, managers or anyone else who works with or within groups.

This site does not retain any of your data. Your data is stored in your browser's local storage. Use remoteStorage by clicking the icon in the top-right corner if you want to synchronize your data across devices.

Developer: This is a sample Single Page Application built with several tiny components, more information and source code here.

Also, this demonstrates that for little apps, there is no need for big MV* frameworks and framework's related code. Almost only vanilla JS!.

archive: {{=it.date || '' }} - {{=it.name}}

description:

{{=it.description}}

{{~it.teams :team:idx}}

{{=team.name}}

    {{~team.members :member:idxm}}
  • {{=member.name}}
  • {{~}}
{{~}}

Team names:

This names will be displayed as team names when using random team generator:

Upgrade:

{{ for(var prop in it) { }}

{{=it[prop].name}}

    {{~it[prop].members :member:idxm}}
  • {{~}}
{{ } }}
{{ for(var prop in it) { }}

{{=it[prop].name}}

    {{~it[prop].members :member:idxm}}
  • {{~}}
{{ } }}

Matches:

    {{~it.left :name:idx}}
  • {{=name}}
  • {{~}}
    {{~it.right :name:idx}}
  • {{=name}}
  • {{~}}
×

\ No newline at end of file +Team Toolbox
Team ToolBox Build your teams randomly!


Random ordered list:

    {{~it :member:idx}}
  1. {{=member.name}}
  2. {{~}}

group {{=it.name}}:

members:

Welcome to Team ToolBox, a project to help you work or play with teams/groups randomly!

It helps whenever we need to pick someone, don't find volunteers, define teams (practical exercises, collective workshops etc...) , define passing order or assign tasks.

This tool may be useful for trainers, teachers, managers or anyone else who works with or within groups.

This site does not retain any of your data. Your data is stored in your browser's local storage. Use remoteStorage by clicking the icon in the top-right corner if you want to synchronize your data across devices.

Developer: This is a sample Single Page Application built with several tiny components, more information and source code here.

Also, this demonstrates that for little apps, there is no need for big MV* frameworks and framework's related code. Almost only vanilla JS!.

archive: {{=it.date || '' }} - {{=it.name}}

description:

{{=it.description}}

{{~it.teams :team:idx}}

{{=team.name}}

    {{~team.members :member:idxm}}
  • {{=member.name}}
  • {{~}}
{{~}}

Team names:

This names will be displayed as team names when using random team generator:

Upgrade:

Result:

×

{{ for(var prop in it) { }}

{{=it[prop].name}}

    {{~it[prop].members :member:idxm}}
  • {{~}}
{{ } }}
{{ for(var prop in it) { }}{{ } }}
{{~it.teams :team:idx}}

{{=team.name}}

    {{~team.members :member:idxm}}
  • {{=member.name}}
  • {{~}}
{{~}} {{? it.orphans }}

Team Orphan(s)

    {{~it.orphans :orphan:idx}}
  • {{=orphan.name}}
  • {{~}}
{{?}}
\ No newline at end of file diff --git a/dist/manifest.appcache b/dist/manifest.appcache index 69c4c09..333b75e 100644 --- a/dist/manifest.appcache +++ b/dist/manifest.appcache @@ -1,7 +1,7 @@ CACHE MANIFEST # team-tool-box v0.0.1 # This manifest was generated by grunt-manifest HTML5 Cache Manifest Generator -# Time: Mon Mar 20 2017 17:26:23 GMT+0100 (CET) +# Time: Wed Mar 22 2017 09:43:47 GMT+0100 (CET) CACHE: index.html @@ -15,4 +15,4 @@ NETWORK: SETTINGS: prefer-online -# hash: 474708f06777cb2b4193a038619fa93210acbc91d315ac417052c822725b7116 \ No newline at end of file +# hash: 93bd3242693a264b9c82dc1f61abe79d3d54cef7a9c38490434f8de0472540ad \ No newline at end of file diff --git a/dist/scripts/scripts.js b/dist/scripts/scripts.js index 07f6cd8..6e173e2 100644 --- a/dist/scripts/scripts.js +++ b/dist/scripts/scripts.js @@ -1 +1 @@ -RemoteStorage.defineModule("teams",function(a,b){a.cache("","ALL"),a.declareType("team",{type:"object",properties:{id:{type:"string"},name:{type:"string"},members:{type:"array",default:[],items:{type:"object",properties:{id:{type:"string"},name:{type:"string"}}}}},required:["id","name"]});var c=function(a){return a.getAll("team/").then(function(b){var c=[],d=[];for(var e in b)c.push(a.storeObject("",e,b[e])),d.push(a.remove("team/"+e));return d.push(a.remove("team/")),0!=c.length&&Promise.all(c).then(function(){return console.log("items moved from teams/team/ to teams/"),Promise.all(c).then(function(){return console.log("items removed at teams/team/*"),!0}).catch(function(a){return console.log("oups..."+a),!1})}).catch(function(a){return console.log("oups..."+a),!1})})},d={upgrade:function(){return c(a)},store:function(b){return b.id||(b.id=g(),b.members=[]),a.storeObject("team",b.id,b).then(function(){return b})},addMember:function(a,b){return remoteStorage.teams.find(a).then(function(a){return b.id=g(),a.members.push(b),remoteStorage.teams.store(a)})},findMember:function(b){return a.getAll("").then(function(a){for(var c in a){var d=h(a[c].members,b);if(d)return d}return null})},updateMember:function(b){return a.getAll("").then(function(a){for(var c in a)for(var d=a[c].members,e=0;e a");d.onclick=b,remoteStorage.access.claim("teams","rw"),remoteStorage.access.claim("archives","rw"),remoteStorage.access.claim("config","rw"),remoteStorage.on("ready",function(){remoteStorage.teams.findAll().then(function(a){0===Object.keys(a).length&&app.alert("alert-info",'hello ;-). Welcome to Team Tool Box!. Maybe your first time here, please have a look to the About section. For those who may not retrieve your datas, be sure to be synced with remoteStorage or see settings to upgrade')})}),remoteStorage.displayWidget();var e=document.querySelector("#navigation h1"),f=document.querySelector("#navigation a"),g=function(a){var b=a.detail.title||"Home",c="home"===a.detail.currentPage?"⌂":"←";e.innerHTML=b,f.innerHTML=c};document.addEventListener("page.shown",g),window.dispatchEvent(new CustomEvent("hashchange"))},document.addEventListener("DOMContentLoaded",app.init),app.page("tool-build-teams",function(){var a=document.getElementById("tool-build-teams"),b=a.querySelector(".nb-members"),c=a.querySelector(".team-list"),d=a.querySelector(".teams-result"),e=a.querySelector('input[type="submit"]'),f=doT.template(c.innerHTML),g=doT.template(d.innerHTML),h=null,i=null,j=function(){var a=c.value;a==-1?remoteStorage.teams.findAll().then(function(a){var b={members:[]};for(var c in a)b.members.push.apply(b.members,a[c].members);k(b)}):remoteStorage.teams.find(a).then(k)},k=function(a){var c=i.team_names||[1,2,3,4,5,6,7,8,9,10],e=a.members;if(0==e.length)return d.innerHTML=null,void app.alert("alert-info",'humm, no members found, you can add members by clicking on the "My Groups" menu');var f,g,h=e.map(function(a,b){return b}),j=parseInt(b.value),k=Math.floor(e.length/j),m={teams:[]};if(0==k)m.teams.push({name:"Team "+c[0],members:e}),h=[];else{for(var o=0;o0){var p=h.map(function(a,b){return e[a]});m.orphans=p}}if(n(m),m.orphans){var r=d.querySelector(".team-orphans button");r.onclick=function(){l(m.teams,m.orphans),m.orphans=null,n(m)}}},l=function(a,b){for(var c=0,d=a.length-1;b.length>0;){var e=b.pop();c>=d&&(c=0),a[c].members.push(e),c++}},m=function(){if(h){var a=h.teams;h.orphans&&a.push({name:"Team orphan(s)",members:h.orphans}),app("archive-save",a)}},n=function(a){h=a,d.innerHTML=g(a);var b=d.querySelector('button[name="save"]');b.onclick=m};return c.innerHTML='',d.innerHTML=null,e.onclick=function(a){a.preventDefault(),j()},function(a){if(remoteStorage.teams.findAll().then(function(a){0===Object.keys(a).length&&app.alert("alert-info",'humm, no members found, you can add members by clicking on the "My Groups" menu'),c.innerHTML=f(a)}),remoteStorage.config.get().then(function(a){i=a}),a&&"onSavedOutput"==a.event){var b=d.querySelector('button[name="save"]');b.classList.toggle("btn-success"),b.classList.toggle("btn-default"),b.onclick=null}}}),app.page("tool-find-members",function(){var a=document.getElementById("tool-find-members"),b=a.querySelector(".nb-members"),c=a.querySelector(".team-list"),d=a.querySelector(".teams-result"),e=a.querySelector('input[type="submit"]'),f=doT.template(c.innerHTML),g=doT.template(d.innerHTML),h=null,i=function(){var a=c.value;a==-1?remoteStorage.teams.findAll().then(function(a){var b={members:[]};for(var c in a)b.members.push.apply(b.members,a[c].members);j(b)}):remoteStorage.teams.find(a).then(j)},j=function(a){var c=a.members;if(0==c.length)return d.innerHTML=null,void app.alert("alert-info",'humm, no members found, you can add members by clicking on the "My Groups" menu');for(var e,f,g=c.map(function(a,b){return b}),h=parseInt(b.value),i=[h],j=Math.min(h,c.length),a={name:"Hall of fame:"},l=0;l',c.innerHTML=null,d.innerHTML=null;var i=function(a){var b,c,d;for(d=a.length;d;d--)b=Math.floor(Math.random()*d),c=a[d-1],a[d-1]=a[b],a[b]=c},j=function(a){var b=a.currentTarget,c=b.checked;$checkbox_members=b.parentNode.parentNode.querySelectorAll('input[name="member_id"]');for(var d=0;d<$checkbox_members.length;d++)$checkbox_members[d].checked=c},k=function(b){b.preventDefault();var c=[];$checkbox_members=a.querySelectorAll('input[name="member_id"]');for(var e=0;e<$checkbox_members.length;e++)$checkbox_members[e].checked&&c.push(h[$checkbox_members[e].value]);i(c),d.innerHTML=g(c),window.scrollTo(0,document.body.scrollHeight)},l=function(b){h={};for(var e in b)for(var g=b[e].members,i=0;i0&&remoteStorage.teams.addMember(g,{name:c.value}).then(function(a){j(a)})},j=function(g){d.innerHTML=f(g),b.innerHTML=e(g),c.value="",a.querySelector('button[name="remove"]').onclick=h};return a.querySelector('input[type="submit"]').onclick=i,function(a){g=a,remoteStorage.teams.find(g).then(function(a){j(a)})}}),app.page("team-add",function(){var a=document.querySelector('#team-add form input[name="name"]'),b=document.querySelector('#team-add form input[name="add"]');return b.onclick=function(b){b.preventDefault(),a.value.length>0&&remoteStorage.teams.store({name:a.value}).then(function(a){app("team-list-details",a.id)})},function(b){a.value=""}}),app.page("team-member-add",function(){var a=document.querySelector('#team-member-add form input[name="name"]'),b=document.querySelector('#team-member-add form input[name="add"]'),c=null;return b.onclick=function(b){b.preventDefault(),a.value.length>0&&remoteStorage.teams.addMember(c,{name:a.value}).then(function(){history.back()})},function(b){c=b,a.value=""}}),app.page("team-member-details",function(){var a=document.querySelector("#team-member-details form"),b=a.querySelector('[name="id"]'),c=a.querySelector('[name="name"]'),d=a.querySelector('input[name="update-member"]'),e=a.querySelector('input[name="remove-member"]'),f=null;return d.onclick=function(a){a.preventDefault(),f.name=c.value,remoteStorage.teams.updateMember(f).then(function(){history.back()})},e.onclick=function(a){a.preventDefault();var b=window.confirm("are you sure you want to remove "+c.value);b&&remoteStorage.teams.removeMember(f.id).then(function(){history.back()})},function(a){remoteStorage.teams.findMember(a).then(function(a){a&&(f=a,b.value=f.id,c.value=f.name)})}}),app.page("archive-save",function(){var a,b=document.querySelector("#archive-save form"),c=b.querySelector('input[name="name"]'),d=b.querySelector('textarea[name="description"]'),e=b.querySelector('button[name="cancel"]'),f=b.querySelector('input[type="submit"]');return e.onclick=function(a){a.preventDefault(),app.back()},f.onclick=function(b){if(b.preventDefault(),0==c.value.length)return!1;var e=new Date,f=e.getFullYear()+"/"+(e.getMonth()+1)+"/"+e.getDate(),g={name:c.value,description:d.value,date:f,teams:a};remoteStorage.archives.store(g).then(function(){alert("cool, generated teams archived, you can retrieve it in Archives menu"),app.back({event:"onSavedOutput"})})},function(b){a=b,c.value="",d.value=""}}),app.page("archive-list",function(){var a=document.querySelector("#archive-list .archive-list"),b=doT.template(a.innerHTML);return a.innerHTML=null,function(c){remoteStorage.archives.findAll().then(function(c){Object.keys(c).length>0?a.innerHTML=b(c):(a.innerHTML=null,app.alert("alert-info","no archives found, random generated teams when saved will be displayed here."))})}}),app.page("archive-details",function(){var a=document.getElementById("archive-details"),b=doT.template(a.innerHTML),c=null;a.innerHTML=null;var d=function(){return confirm("sure you want to remove this archive ?")&&remoteStorage.archives.remove(c.id).then(function(){history.back()}),!1},e=function(b){b.preventDefault();var d=a.querySelector("textarea");return 0!=d.value.length&&(c.comment=d.value,void remoteStorage.archives.store(c).then(function(a){f(a)}))},f=function(c){a.innerHTML=b(c),a.querySelector('button[name="remove"]').onclick=d,a.querySelector('input[name="add"]').onclick=e};return function(a){remoteStorage.archives.find(a).then(function(a){c=a,f(a)})}}),app.page("settings",function(){var a=document.getElementById("settings"),b=a.querySelector('input[name="team_names"]'),c=a.querySelector('input[name="submit"]'),d=a.querySelector('button[name="upgrade"]'),e=null;return c.onclick=function(a){a.preventDefault();var c=b.value.split(",");c.length>0&&(e.team_names=c,remoteStorage.config.set(e),alert("cool, config stored"))},d.onclick=function(a){a.stopPropagation(),remoteStorage.teams.upgrade().then(function(a){if(!a)return void app.alert("alert-info","nothing to do for teams")}),remoteStorage.archives.upgrade().then(function(a){a?app.alert("alert-info",'ok, upgrade done, just need to reload the app now: click here '):app.alert("alert-info","nothing to do")})},function(a){remoteStorage.config.get().then(function(a){e=a,b.value=a.team_names})}}),app.page("tool-match",function(){var a=document.getElementById("tool-match"),b=a.querySelector(".team-list"),c=a.querySelector(".teams-result"),d=doT.template(b.innerHTML),e=doT.template(c.innerHTML);b.innerHTML='',c.innerHTML=null;var f=function(b){c.innerHTML=e(b);var d=c.querySelectorAll('input[name="member_name"]');c.querySelector('input[name="tick_all"]').onclick=function(){for(var a=this.checked,b=0;b',c.innerHTML=null;var f={},g=function(b){c.innerHTML=e(b);var d=c.querySelectorAll('input[name="member_name"]');c.querySelector('input[name="tick_all"]').onclick=function(){for(var a=this.checked,b=0;b a");d.onclick=b,remoteStorage.access.claim("teams","rw"),remoteStorage.access.claim("archives","rw"),remoteStorage.access.claim("config","rw"),remoteStorage.on("ready",function(){remoteStorage.teams.findAll().then(function(a){0===Object.keys(a).length&&app.alert("alert-info",'hello ;-). Welcome to Team Tool Box!. Maybe your first time here, please have a look to the About section. For those who may not retrieve your datas, be sure to be synced with remoteStorage or see settings to upgrade')})}),remoteStorage.displayWidget();var e=document.querySelector("#navigation h1"),f=document.querySelector("#navigation a"),g=function(a){var b=a.detail.title||"Home",c="home"===a.detail.currentPage?"⌂":"←";e.innerHTML=b,f.innerHTML=c};document.addEventListener("page.shown",g),window.dispatchEvent(new CustomEvent("hashchange"))},document.addEventListener("DOMContentLoaded",app.init),app.checkList=function(){function a(a){var b={};for(var c in a)for(var d=a[c].members,e=0;e0){var p=g.map(function(b,c){return a[b]});m.orphans=p}}if(l(m),m.orphans){var r=d.querySelector(".team-orphans button");r.onclick=function(){j(m.teams,m.orphans),m.orphans=null,l(m)}}},j=function(a,b){for(var c=0,d=a.length-1;b.length>0;){var e=b.pop();c>=d&&(c=0),a[c].members.push(e),c++}},k=function(){if(g){var a=g.teams;g.orphans&&a.push({name:"Team orphan(s)",members:g.orphans}),app("archive-save",a)}},l=function(a){g=a,d.render(a),f.style.display="block"};return f.onclick=k,e.onclick=function(a){a.preventDefault();var b=c.getSelectedItems(),d=[];for(var e in b)d.push.apply(d,b[e].members);i(d)},function(a){c.populate(),remoteStorage.config.get().then(function(a){h=a}),a&&"onSavedOutput"==a.event&&(f.classList.toggle("btn-success"),f.classList.toggle("btn-default"),f.onclick=null)}}),app.page("tool-find-members",function(){var a=document.getElementById("tool-find-members"),b=a.querySelector(".nb-members"),c=a.querySelector(".team-list"),d=a.querySelector(".teams-result"),e=a.querySelector('input[type="submit"]'),f=a.querySelector("button");f.style.display="none",app.selectList.applyTo(c),app.list.applyTo(d);var g=null,h=function(a){if(0==a.length)return d.innerHTML=null,void app.alert("alert-info",'humm, no members found, you can add members by clicking on the "My Groups" menu');for(var c,e,f=a.map(function(a,b){return b}),g=parseInt(b.value),h=[g],j=Math.min(g,a.length),k={name:"Hall of fame:"},l=0;l0&&remoteStorage.teams.addMember(g,{name:c.value}).then(function(a){j(a)})},j=function(g){d.innerHTML=f(g),b.innerHTML=e(g),c.value="",a.querySelector('button[name="remove"]').onclick=h};return a.querySelector('input[type="submit"]').onclick=i,function(a){g=a,remoteStorage.teams.find(g).then(function(a){j(a)})}}),app.page("team-add",function(){var a=document.querySelector('#team-add form input[name="name"]'),b=document.querySelector('#team-add form input[name="add"]');return b.onclick=function(b){b.preventDefault(),a.value.length>0&&remoteStorage.teams.store({name:a.value}).then(function(a){app("team-list-details",a.id)})},function(b){a.value=""}}),app.page("team-member-add",function(){var a=document.querySelector('#team-member-add form input[name="name"]'),b=document.querySelector('#team-member-add form input[name="add"]'),c=null;return b.onclick=function(b){b.preventDefault(),a.value.length>0&&remoteStorage.teams.addMember(c,{name:a.value}).then(function(){history.back()})},function(b){c=b,a.value=""}}),app.page("team-member-details",function(){var a=document.querySelector("#team-member-details form"),b=a.querySelector('[name="id"]'),c=a.querySelector('[name="name"]'),d=a.querySelector('input[name="update-member"]'),e=a.querySelector('input[name="remove-member"]'),f=null;return d.onclick=function(a){a.preventDefault(),f.name=c.value,remoteStorage.teams.updateMember(f).then(function(){history.back()})},e.onclick=function(a){a.preventDefault();var b=window.confirm("are you sure you want to remove "+c.value);b&&remoteStorage.teams.removeMember(f.id).then(function(){history.back()})},function(a){remoteStorage.teams.findMember(a).then(function(a){a&&(f=a,b.value=f.id,c.value=f.name)})}}),app.page("archive-save",function(){var a,b=document.querySelector("#archive-save form"),c=b.querySelector('input[name="name"]'),d=b.querySelector('textarea[name="description"]'),e=b.querySelector('button[name="cancel"]'),f=b.querySelector('input[type="submit"]');return e.onclick=function(a){a.preventDefault(),app.back()},f.onclick=function(b){if(b.preventDefault(),0==c.value.length)return!1;var e=new Date,f=e.getFullYear()+"/"+(e.getMonth()+1)+"/"+e.getDate(),g={name:c.value,description:d.value,date:f,teams:a};remoteStorage.archives.store(g).then(function(){alert("cool, generated teams archived, you can retrieve it in Archives menu"),app.back({event:"onSavedOutput"})})},function(b){a=b,c.value="",d.value=""}}),app.page("archive-list",function(){var a=document.querySelector("#archive-list .archive-list"),b=doT.template(a.innerHTML);return a.innerHTML=null,function(c){remoteStorage.archives.findAll().then(function(c){Object.keys(c).length>0?a.innerHTML=b(c):(a.innerHTML=null,app.alert("alert-info","no archives found, random generated teams when saved will be displayed here."))})}}),app.page("archive-details",function(){var a=document.getElementById("archive-details"),b=doT.template(a.innerHTML),c=null;a.innerHTML=null;var d=function(){return confirm("sure you want to remove this archive ?")&&remoteStorage.archives.remove(c.id).then(function(){history.back()}),!1},e=function(b){b.preventDefault();var d=a.querySelector("textarea");return 0!=d.value.length&&(c.comment=d.value,void remoteStorage.archives.store(c).then(function(a){f(a)}))},f=function(c){a.innerHTML=b(c),a.querySelector('button[name="remove"]').onclick=d,a.querySelector('input[name="add"]').onclick=e};return function(a){remoteStorage.archives.find(a).then(function(a){c=a,f(a)})}}),app.page("settings",function(){var a=document.getElementById("settings"),b=a.querySelector('input[name="team_names"]'),c=a.querySelector('input[name="submit"]'),d=a.querySelector('button[name="upgrade"]'),e=null;return c.onclick=function(a){a.preventDefault();var c=b.value.split(",");c.length>0&&(e.team_names=c,remoteStorage.config.set(e),alert("cool, config stored"))},d.onclick=function(a){a.stopPropagation(),remoteStorage.teams.upgrade().then(function(a){if(!a)return void app.alert("alert-info","nothing to do for teams")}),remoteStorage.archives.upgrade().then(function(a){a?app.alert("alert-info",'ok, upgrade done, just need to reload the app now: click here '):app.alert("alert-info","nothing to do")})},function(a){remoteStorage.config.get().then(function(a){e=a,b.value=a.team_names})}}),app.page("tool-match",function(){var a=document.getElementById("tool-match"),b=a.querySelector(".team-list"),c=a.querySelector(".teams-result"),d=a.querySelector("button");return app.selectList.applyTo(b),app.checkList.applyTo(c),d.style.display="none",b.onchange=function(a){c.render(b.getSelectedItems()),d.style.display="block"},d.onclick=function(a){var b=c.getSelectedItems();app("tool-match2",b)},function(a){b.populate()}}),app.page("tool-match2",function(){var a=document.getElementById("tool-match2"),b=a.querySelector(".team-list"),c=a.querySelector(".teams-result"),d=a.querySelector("button");app.checkList.applyTo(c),app.selectList.applyTo(b),d.style.display="none";var e={},f=function(a){for(var b=e.left,c=0;c2){for(var f=arguments.length,g=new Array( widget:'
{{view_connect}}
{{ERROR_MSG}}

{{view_error_plz_report}}

{{USER_ADDRESS}}

{{view_unauthorized}}

{{view_invalid_key}}

{{view_info}}
Connect to Dropbox Connect to Google Drive ',widgetCss:'/** encoding:utf-8 **/ /* RESET */ #remotestorage-widget{text-align:left;}#remotestorage-widget input, #remotestorage-widget button{font-size:11px;}#remotestorage-widget form input[type=email]{margin-bottom:0;/* HTML5 Boilerplate */}#remotestorage-widget form input[type=submit]{margin-top:0;/* HTML5 Boilerplate */}/* /RESET */ #remotestorage-widget, #remotestorage-widget *{-moz-box-sizing:border-box;box-sizing:border-box;}#remotestorage-widget{position:absolute;right:10px;top:10px;font:normal 16px/100% sans-serif !important;user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:default;z-index:10000;}#remotestorage-widget .rs-bubble{background:rgba(80, 80, 80, .7);border-radius:5px 15px 5px 5px;color:white;font-size:0.8em;padding:5px;position:absolute;right:3px;top:9px;min-height:24px;white-space:nowrap;text-decoration:none;}.rs-bubble .rs-bubble-text{padding-right:32px;/* make sure the bubble doesn\'t "jump" when initially opening. */ min-width:182px;}#remotestorage-widget .rs-action{cursor:pointer;}/* less obtrusive cube when connected */ #remotestorage-widget.remotestorage-state-connected .rs-cube, #remotestorage-widget.remotestorage-state-busy .rs-cube{opacity:.3;-webkit-transition:opacity .3s ease;-moz-transition:opacity .3s ease;-ms-transition:opacity .3s ease;-o-transition:opacity .3s ease;transition:opacity .3s ease;}#remotestorage-widget.remotestorage-state-connected:hover .rs-cube, #remotestorage-widget.remotestorage-state-busy:hover .rs-cube, #remotestorage-widget.remotestorage-state-connected .rs-bubble:not(.rs-hidden) + .rs-cube{opacity:1 !important;}#remotestorage-widget .rs-backends{position:relative;top:5px;right:0;}#remotestorage-widget .rs-cube{position:relative;top:5px;right:0;}/* pulsing animation for cube when loading */ #remotestorage-widget .rs-cube.remotestorage-loading{-webkit-animation:remotestorage-loading .5s ease-in-out infinite alternate;-moz-animation:remotestorage-loading .5s ease-in-out infinite alternate;-o-animation:remotestorage-loading .5s ease-in-out infinite alternate;-ms-animation:remotestorage-loading .5s ease-in-out infinite alternate;animation:remotestorage-loading .5s ease-in-out infinite alternate;}@-webkit-keyframes remotestorage-loading{to{opacity:.7}}@-moz-keyframes remotestorage-loading{to{opacity:.7}}@-o-keyframes remotestorage-loading{to{opacity:.7}}@-ms-keyframes remotestorage-loading{to{opacity:.7}}@keyframes remotestorage-loading{to{opacity:.7}}#remotestorage-widget a{text-decoration:underline;color:inherit;}#remotestorage-widget form{margin-top:.7em;position:relative;}#remotestorage-widget form input{display:table-cell;vertical-align:top;border:none;border-radius:6px;font-weight:bold;color:white;outline:none;line-height:1.5em;height:2em;}#remotestorage-widget form input:disabled{color:#999;background:#444 !important;cursor:default !important;}#remotestorage-widget form input[type=email]:focus, #remotestorage-widget form input[type=password]:focus{background:#223;}#remotestorage-widget form input[type=email], #remotestorage-widget form input[type=password]{background:#000;width:100%;height:26px;padding:0 30px 0 5px;border-top:1px solid #111;border-bottom:1px solid #999;}#remotestorage-widget form input[type=email]:focus, #remotestorage-widget form input[type=password]:focus{background:#223;}#remotestorage-widget button:focus, #remotestorage-widget input:focus{box-shadow:0 0 4px #ccc;}#remotestorage-widget form input[type=email]::-webkit-input-placeholder, #remotestorage-widget form input[type=password]::-webkit-input-placeholder{color:#999;}#remotestorage-widget form input[type=email]:-moz-placeholder, #remotestorage-widget form input[type=password]:-moz-placeholder{color:#999;}#remotestorage-widget form input[type=email]::-moz-placeholder, #remotestorage-widget form input[type=password]::-moz-placeholder{color:#999;}#remotestorage-widget form input[type=email]:-ms-input-placeholder, #remotestorage-widget form input[type=password]:-ms-input-placeholder{color:#999;}#remotestorage-widget form input[type=submit]{background:#000;cursor:pointer;padding:0 5px;}#remotestorage-widget form input[type=submit]:hover{background:#333;}#remotestorage-widget .rs-info-msg{font-size:10px;color:#eee;margin-top:0.7em;white-space:normal;}#remotestorage-widget .rs-info-msg.last-synced-message{display:inline;white-space:nowrap;margin-bottom:.7em}#remotestorage-widget .rs-info-msg a:hover, #remotestorage-widget .rs-info-msg a:active{color:#fff;}#remotestorage-widget button img{vertical-align:baseline;}#remotestorage-widget button{border:none;border-radius:6px;font-weight:bold;color:white;outline:none;line-height:1.5em;height:26px;width:26px;background:#000;cursor:pointer;margin:0;padding:5px;}#remotestorage-widget button:hover{background:#333;}#remotestorage-widget .rs-bubble button.connect, #remotestorage-widget .rs-bubble button.rs-cipher, #remotestorage-widget .rs-bubble button.rs-nocipher{display:block;background:none;position:absolute;right:0;top:0;opacity:1;/* increase clickable area of connect, rs-cipher & rs-nocipher buttons */ margin:-5px;padding:10px;width:36px;height:36px;}#remotestorage-widget .rs-bubble button.rs-cipher{width:46px;}#remotestorage-widget .rs-bubble button.rs-nocipher{height:26px;margin:0;padding:4px 5px 5px;right:-32px;width:26px;}#remotestorage-widget .rs-bubble button.connect:not([disabled]):hover, #remotestorage-widget .rs-bubble button.rs-cipher:not([disabled]):hover, #remotestorage-widget .rs-bubble button.rs-nocipher:not([disabled]):hover{background:rgba(150,150,150,.5);}#remotestorage-widget .rs-bubble button.connect[disabled], #remotestorage-widget .rs-bubble button.rs-cipher[disabled]{opacity:.5;cursor:default !important;}#remotestorage-widget .rs-bubble button.rs-sync{position:relative;left:-5px;bottom:-5px;padding:4px 4px 0 4px;background:#555;}#remotestorage-widget .rs-bubble button.rs-sync:hover{background:#444;}#remotestorage-widget .rs-bubble button.rs-disconnect{background:#721;position:absolute;right:0;bottom:0;padding:4px 4px 0 4px;}#remotestorage-widget .rs-bubble button.rs-disconnect:hover{background:#921;}#remotestorage-widget .remotestorage-error-info{color:#f92;}#remotestorage-widget .remotestorage-reset{width:100%;background:#721;}#remotestorage-widget .remotestorage-reset:hover{background:#921;}#remotestorage-widget .rs-bubble .rs-content{margin-top:7px;}#remotestorage-widget pre{user-select:initial;-webkit-user-select:initial;-moz-user-select:text;max-width:27em;margin-top:1em;overflow:auto;}#remotestorage-widget .rs-centered-text{text-align:center;}#remotestorage-widget .rs-bubble.rs-hidden{padding-bottom:2px;border-radius:5px 15px 15px 5px;}#remotestorage-widget .rs-error-msg{min-height:5em;}.rs-bubble.rs-hidden .rs-bubble-expandable{display:none;}.remotestorage-state-connected .rs-bubble.rs-hidden{display:none;}.remotestorage-connected{display:none;}.remotestorage-state-connected .remotestorage-connected{display:block;}.remotestorage-cipher-form{display:none;}.remotestorage-cipher .remotestorage-cipher-form{display:block;}.remotestorage-invalid-key{display:none;}.remotestorage-invalid-key.remotestorage-cipher-error{display:block;}.remotestorage-initial{display:none;}.remotestorage-state-initial .remotestorage-initial{display:block;}.remotestorage-error{display:none;}.remotestorage-state-error .remotestorage-error{display:block;}.remotestorage-state-authing .remotestorage-authing{display:block;}.remotestorage-state-offline .remotestorage-connected, .remotestorage-state-offline .remotestorage-offline{display:block;}.remotestorage-unauthorized{display:none;}.remotestorage-state-unauthorized .rs-bubble.rs-hidden{display:none;}.remotestorage-state-unauthorized .remotestorage-connected, .remotestorage-state-unauthorized .remotestorage-unauthorized{display:block;}.remotestorage-state-unauthorized .rs-sync{display:none;}.remotestorage-state-busy .rs-bubble.rs-hidden{display:none;}.remotestorage-state-busy .rs-bubble{display:block;}.remotestorage-state-busy .remotestorage-connected{display:block;}.remotestorage-state-authing .rs-bubble-expandable{display:none;}'},function(a){function b(a,b,c){return RemoteStorage.log("[Widget] Producing stateSetter for",b),function(){RemoteStorage.log("[Widget] Setting state",b,c),e&&(localStorage[f]=b),a.view?(a.rs.remote&&a.view.setUserAddress(a.rs.remote.userAddress),a.view.setState(b,c)):a._rememberedState=b}}function c(a){return function(c){var d;c instanceof RemoteStorage.DiscoveryError?(console.error("Discovery failed",c,'"'+c.message+'"'),d=b(a,"initial",c.message)):c instanceof RemoteStorage.SyncError?d=b(a,"offline"):c instanceof RemoteStorage.Unauthorized?d=b(a,"unauthorized"):(RemoteStorage.log("[Widget] Unknown error"),d=b(a,"error",[c])),d.apply()}}function d(a){return"GET"!==a.method||!a.isFolder}var e,f="remotestorage:widget:state",g={initial:!0,connected:!0,offline:!0};RemoteStorage.Widget=function(a){var h=this,i=0;if(this.rs=a,this.rs.remote.on("connected",b(this,"connected")),this.rs.on("disconnected",b(this,"initial")),this.rs.on("connecting",b(this,"authing")),this.rs.on("authing",b(this,"authing")),this.rs.on("error",c(this)),this.rs.remote&&(this.rs.remote.on("wire-busy",function(a){d(a)&&(i++,b(h,"busy")())}),this.rs.remote.on("wire-done",function(a){d(a)&&i--,0>=i&&a.success&&b(h,"connected")()})),e){var j=localStorage[f];j&&g[j]&&(this._rememberedState=j)}},RemoteStorage.Widget.prototype={display:function(a){return"string"==typeof a?a={domID:a}:"undefined"==typeof a&&(a={}),this.view||this.setView(new RemoteStorage.Widget.View(this.rs)),this.view.display(a),this},linkWidgetToSync:function(){"object"==typeof this.rs.sync&&"function"==typeof this.rs.sync.sync?this.view.on("sync",this.rs.sync.sync.bind(this.rs.sync)):(RemoteStorage.log("[Widget] typeof this.rs.sync check fail",this.rs.sync),setTimeout(this.linkWidgetToSync.bind(this),1e3))},setView:function(a){this.view=a,this.view.on("connect",function(a){"string"==typeof a?this.rs.connect(a):a.special&&this.rs[a.special].connect(a)}.bind(this)),this.view.on("secret-entered",function(a){this.view.setUserSecretKey(a),b(this,"ciphered")()}.bind(this)),this.view.on("secret-cancelled",function(){b(this,"notciphered")()}.bind(this)),this.view.on("disconnect",this.rs.disconnect.bind(this.rs)),this.linkWidgetToSync();try{this.view.on("reset",function(){var a=RemoteStorage.Authorize.getLocation();this.rs.on("disconnected",a.reload.bind(a)),this.rs.disconnect()}.bind(this))}catch(a){if(!a.message||!a.message.match(/Unknown event/))throw a}this._rememberedState&&(setTimeout(b(this,this._rememberedState),0),delete this._rememberedState)}},RemoteStorage.prototype.displayWidget=function(a){return this.widget.display(a)},RemoteStorage.Widget._rs_init=function(a){e=RemoteStorage.util.localStorageAvailable(),a.widget||(a.widget=new RemoteStorage.Widget(a))},RemoteStorage.Widget._rs_supported=function(a){return"undefined"!=typeof document}}("undefined"!=typeof window?window:global),function(a){function b(a,b){return a.classList.remove(b)}function c(a,b){return a.classList.add(b)}function d(a){"function"==typeof a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}function e(a,b,c,d){var e=a.querySelector("."+b);if("undefined"!=typeof c){var f=e.querySelector("img");(f||e).src=RemoteStorage.Assets[c]}return e.addEventListener("click",d),e}function f(a){a.target.value?a.target.nextElementSibling.removeAttribute("disabled"):a.target.nextElementSibling.setAttribute("disabled","disabled")}var g=RemoteStorage.I18n.translate;RemoteStorage.Widget.View=function(a){if(this.rs=a,"undefined"==typeof document)throw"Widget not supported";RemoteStorage.eventHandling(this,"connect","secret-entered","secret-cancelled","disconnect","sync","display","reset");for(var b in this.events)this.events[b]=this.events[b].bind(this);this.hideBubbleOnBodyClick=function(a){for(var b=a.target;b!==document.body;b=b.parentElement)if("remotestorage-widget"===b.id)return;this.hideBubble()}.bind(this)},RemoteStorage.Widget.View.prototype={connectGdrive:function(){this._emit("connect",{special:"googledrive"})},connectDropbox:function(){this._emit("connect",{special:"dropbox"})},setState:function(a,b){RemoteStorage.log("[View] widget.view.setState(",a,",",b,");");var c=this.states[a];if("undefined"==typeof c)throw new Error("Bad State assigned to view: "+a);c.apply(this,[b])},setUserAddress:function(a){this.userAddress=a||"";var b;this.div&&(b=this.div.querySelector("form.remotestorage-initial").userAddress)&&(b.value=this.userAddress)},setUserSecretKey:function(a){this.userSecretKey=a},toggleBubble:function(a){this.bubble.className.search("rs-hidden")<0?this.hideBubble(a):this.showBubble(a)},hideBubble:function(){c(this.bubble,"rs-hidden"),document.body.removeEventListener("click",this.hideBubbleOnBodyClick)},showBubble:function(a){b(this.bubble,"rs-hidden"),"undefined"!=typeof a&&d(a),document.body.addEventListener("click",this.hideBubbleOnBodyClick),this.div.querySelector(".remotestorage-connected").classList.contains("remotestorage-cipher")&&!this.userSecretKey?this.bubble.querySelector("form.remotestorage-cipher-form").userSecretKey.focus():this.bubble.querySelector("form.remotestorage-initial").userAddress.focus()},display:function(a){if("undefined"!=typeof this.div)return this.div;var b=document.createElement("div"),c=document.createElement("style");if(c.innerHTML=RemoteStorage.Assets.widgetCss,b.id="remotestorage-widget",b.innerHTML=RemoteStorage.Assets.widget,b.appendChild(c),a.domID){var d=document.getElementById(a.domID);if(!d)throw'Failed to find target DOM element with id="'+a.domID+'"';d.appendChild(b)}else document.body.appendChild(b);e(b,"rs-sync","syncIcon",this.events.sync),e(b,"rs-disconnect","disconnectIcon",this.events.disconnect),e(b,"remotestorage-reset",void 0,this.events.reset),e(b,"connect","connectIcon",this.events.connect),this.form=b.querySelector("form.remotestorage-initial");var g=this.form.userAddress;if(g.addEventListener("load",f),g.addEventListener("keyup",f),this.userAddress&&(g.value=this.userAddress),a.encryption){this.cipher=!0;var h=b.querySelector("form.remotestorage-cipher-form").userSecretKey;h.type="password",e(b,"rs-cipher","cipherIcon",this.events["secret-entered"]),h.addEventListener("load",f),h.addEventListener("keyup",f),e(b,"rs-nocipher","nocipherIcon",this.events["secret-cancelled"])}this.cube=e(b,"rs-cube","remoteStorageIcon",this.toggleBubble.bind(this)),e(b,"rs-dropbox","dropbox",this.connectDropbox.bind(this)),e(b,"rs-googledrive","googledrive",this.connectGdrive.bind(this));var i={INPUT:!0,BUTTON:!0,IMG:!0},j=function(a){i[a.target.tagName]||this.div.classList.contains("remotestorage-state-unauthorized")||this.showBubble(a)}.bind(this);return this.bubble=e(b,"rs-bubble",void 0,j),this.hideBubble(),this.div=b,this.states.initial.call(this),this.events.display.call(this),this.div},states:{initial:function(a){var c=this.cube,d=a||g("view_info");c.src=RemoteStorage.Assets.remoteStorageIcon,this._renderTranslatedInitialContent(),a?(c.src=RemoteStorage.Assets.remoteStorageIconError,b(this.cube,"remotestorage-loading"),this.showBubble(),setTimeout(function(){c.src=RemoteStorage.Assets.remoteStorageIcon},2e3)):this.hideBubble(),this.div.className="remotestorage-state-initial",this.userSecretKey&&delete this.userSecretKey;var e=1;this._activateBackend("dropbox")&&(e+=1),this._activateBackend("googledrive")&&(e+=1),this.div.querySelector(".rs-bubble-text").style.paddingRight=32*e+8+"px";var f=this.div.querySelector(".connect");this.form.userAddress.value&&f.removeAttribute("disabled");var h=this.div.querySelector(".rs-info-msg");h.innerHTML=d,a?h.classList.add("remotestorage-error-info"):h.classList.remove("remotestorage-error-info")},authing:function(){this.div.removeEventListener("click",this.events.connect),this.div.className="remotestorage-state-authing",this.div.querySelector(".rs-status-text").innerHTML=g("view_connecting",this.userAddress),c(this.cube,"remotestorage-loading")},connected:function(){var a=this.cube;this.div.className="remotestorage-state-connected",this.div.querySelector(".userAddress").innerHTML=this.userAddress,a.src=RemoteStorage.Assets.remoteStorageIcon,b(a,"remotestorage-loading"),this.cipher&&(this.userSecretKey?this.userSecretKeyError?(a.src=RemoteStorage.Assets.remoteStorageIconError,c(this.div.querySelector(".remotestorage-connected"),"remotestorage-cipher"),c(this.div.querySelector(".remotestorage-invalid-key"),"remotestorage-cipher-error"),this.showBubble(),setTimeout(function(){a.src=RemoteStorage.Assets.remoteStorageIcon},5e3)):(b(this.div.querySelector(".remotestorage-invalid-key"),"remotestorage-cipher-error"),a.src=RemoteStorage.Assets.remoteStorageIconCiphered):(c(this.div.querySelector(".remotestorage-connected"),"remotestorage-cipher"),this.showBubble()));var d={googledrive:this.div.querySelector(".rs-googledrive"),dropbox:this.div.querySelector(".rs-dropbox")};d.googledrive.style.display=d.dropbox.style.display="none",d[this.rs.backend]?(d[this.rs.backend].style.display="inline-block",this.div.querySelector(".rs-bubble-text").style.paddingRight="72px"):this.div.querySelector(".rs-bubble-text").style.paddingRight="40px"},ciphered:function(){this.div.querySelector("form.remotestorage-cipher-form").userSecretKey.value="",b(this.div.querySelector(".remotestorage-invalid-key"),"remotestorage-cipher-error"),b(this.div.querySelector(".remotestorage-connected"),"remotestorage-cipher"),this.cube.src=RemoteStorage.Assets.remoteStorageIconCiphered,this.hideBubble()},notciphered:function(){this.cipher=!1,b(this.div.querySelector(".remotestorage-invalid-key"),"remotestorage-cipher-error"),b(this.div.querySelector(".remotestorage-connected"),"remotestorage-cipher"),this.hideBubble()},busy:function(){this.div.className="remotestorage-state-busy",c(this.cube,"remotestorage-loading")},offline:function(){this.div.className="remotestorage-state-offline",this.cube.src=RemoteStorage.Assets.remoteStorageIconOffline,this.div.querySelector(".rs-status-text").innerHTML=g("view_offline")},error:function(a){var b=a;this.div.className="remotestorage-state-error",this.div.querySelector(".rs-bubble-text").innerHTML=""+g("view_error_occured")+"",a instanceof Error&&(b=a.message+"\n\n"+a.stack),this.div.querySelector(".rs-error-msg").textContent=b,this.cube.src=RemoteStorage.Assets.remoteStorageIconError,this.showBubble()},unauthorized:function(){this.div.className="remotestorage-state-unauthorized",this.cube.src=RemoteStorage.Assets.remoteStorageIconError,this.showBubble(),this.div.addEventListener("click",this.events.connect)}},events:{connect:function(a){d(a),a.preventDefault(),this._emit("connect",this.div.querySelector("form.remotestorage-initial").userAddress.value)},"secret-entered":function(a){d(a),a.preventDefault(),this._emit("secret-entered",this.div.querySelector("form.remotestorage-cipher-form").userSecretKey.value)},"secret-cancelled":function(a){d(a),a.preventDefault(),this._emit("secret-cancelled")},sync:function(a){d(a),a.preventDefault(),this._emit("sync")},disconnect:function(a){d(a),a.preventDefault(),this._emit("disconnect")},reset:function(b){b.preventDefault();var c=a.confirm(g("view_confirm_reset"));c&&this._emit("reset")},display:function(a){a&&a.preventDefault(),this._emit("display")}},_renderTranslatedInitialContent:function(){this.div.querySelector(".rs-status-text").innerHTML=g("view_connect"),this.div.querySelector(".remotestorage-reset").innerHTML=g("view_get_me_out"),this.div.querySelector(".rs-error-plz-report").innerHTML=g("view_error_plz_report"),this.div.querySelector(".remotestorage-unauthorized").innerHTML=g("view_unauthorized"),this.div.querySelector(".remotestorage-invalid-key").innerHTML=g("view_invalid_key")},_activateBackend:function(a){var b="rs-"+a;return this.rs.apiKeys[a]?(this.div.querySelector("."+b).style.display="inline-block",!0):(this.div.querySelector("."+b).style.display="none",!1)}}}("undefined"!=typeof window?window:global),function(a,b){"function"==typeof define&&define.amd?define([],b):"undefined"!=typeof module&&module.exports?module.exports=b():a.tv4=b()}(this,function(){function a(a){return encodeURI(a).replace(/%25[0-9][0-9]/g,function(a){return"%"+a.substring(3)})}function b(b){var c="";m[b.charAt(0)]&&(c=b.charAt(0),b=b.substring(1));var d="",e="",f=!0,g=!1,h=!1;"+"===c?f=!1:"."===c?(e=".",d="."):"/"===c?(e="/",d="/"):"#"===c?(e="#",f=!1):";"===c?(e=";",d=";",g=!0,h=!0):"?"===c?(e="?",d="&",g=!0):"&"===c&&(e="&",d="&",g=!0);for(var i=[],j=b.split(","),k=[],l={},o=0;o0&&(c+=l.suffices["*"]?d||",":",",l.suffices["*"]&&g&&(c+=l.name+"=")),c+=f?encodeURIComponent(m[n]).replace(/!/g,"%21"):a(m[n])}else if("object"==typeof m){g&&!l.suffices["*"]&&(c+=l.name+"=");var o=!0;for(var p in m)o||(c+=l.suffices["*"]?d||",":","),o=!1,c+=f?encodeURIComponent(p).replace(/!/g,"%21"):a(p),c+=l.suffices["*"]?"=":",",c+=f?encodeURIComponent(m[p]).replace(/!/g,"%21"):a(m[p])}else g&&(c+=l.name,h&&""===m||(c+="=")),null!=l.truncate&&(m=m.substring(0,l.truncate)),c+=f?encodeURIComponent(m).replace(/!/g,"%21"):a(m)}return c};return u.varNames=i,{prefix:e,substitution:u}}function c(a){if(!(this instanceof c))return new c(a);for(var d=a.split("{"),e=[d.shift()],f=[],g=[],h=[];d.length>0;){var i=d.shift(),j=i.split("}")[0],k=i.substring(j.length+1),l=b(j);g.push(l.substitution),f.push(l.prefix),e.push(k),h=h.concat(l.substitution.varNames)}this.fill=function(a){for(var b=e[0],c=0;c0&&"/"===b.charAt(a.length-1)||"#"===c.charAt(0)||"?"===c.charAt(0))return!0}return!1}function l(a){var b,c,d=new o,e={setErrorReporter:function(a){return"string"==typeof a?this.language(a):(c=a,!0)},addFormat:function(){d.addFormat.apply(d,arguments)},language:function(a){return a?(v[a]||(a=a.split("-")[0]),!!v[a]&&(b=a,a)):b},addLanguage:function(a,b){var c;for(c in r)b[c]&&!b[r[c]]&&(b[r[c]]=b[c]);var d=a.split("-")[0];if(v[d]){v[a]=Object.create(v[d]);for(c in b)"undefined"==typeof v[d][c]&&(v[d][c]=b[c]),v[a][c]=b[c]}else v[a]=b,v[d]=b;return this},freshApi:function(a){var b=l();return a&&b.language(a),b},validate:function(a,e,f,g){var h=i(b),j=c?function(a,b,d){return c(a,b,d)||h(a,b,d)}:h,k=new o(d,!1,j,f,g);"string"==typeof e&&(e={$ref:e}),k.addSchema("",e);var l=k.validateAll(a,e,null,null,"");return!l&&g&&(l=k.banUnknownProperties(a,e)),this.error=l,this.missing=k.missing,this.valid=null===l,this.valid},validateResult:function(){var a={};return this.validate.apply(a,arguments),a},validateMultiple:function(a,e,f,g){var h=i(b),j=c?function(a,b,d){return c(a,b,d)||h(a,b,d)}:h,k=new o(d,!0,j,f,g);"string"==typeof e&&(e={$ref:e}),k.addSchema("",e),k.validateAll(a,e,null,null,""),g&&k.banUnknownProperties(a,e);var l={};return l.errors=k.errors,l.missing=k.missing,l.valid=0===l.errors.length,l},addSchema:function(){return d.addSchema.apply(d,arguments)},getSchema:function(){return d.getSchema.apply(d,arguments)},getSchemaMap:function(){return d.getSchemaMap.apply(d,arguments)},getSchemaUris:function(){return d.getSchemaUris.apply(d,arguments)},getMissingUris:function(){return d.getMissingUris.apply(d,arguments)},dropSchemas:function(){d.dropSchemas.apply(d,arguments)},defineKeyword:function(){d.defineKeyword.apply(d,arguments)},defineError:function(a,b,c){if("string"!=typeof a||!/^[A-Z]+(_[A-Z]+)*$/.test(a))throw new Error("Code name must be a string in UPPER_CASE_WITH_UNDERSCORES");if("number"!=typeof b||b%1!==0||1e4>b)throw new Error("Code number must be an integer > 10000");if("undefined"!=typeof r[a])throw new Error("Error already defined: "+a+" as "+r[a]);if("undefined"!=typeof s[b])throw new Error("Error code already used: "+s[b]+" as "+b);r[a]=b,s[b]=a,u[a]=u[b]=c;for(var d in v){var e=v[d];e[a]&&(e[b]=e[b]||e[a])}},reset:function(){d.reset(),this.error=null,this.missing=[],this.valid=!0},missing:[],error:null,valid:!0,normSchema:h,resolveUrl:f,getDocumentUri:g,errorCodes:r};return e.language(a||"en"),e}Object.keys||(Object.keys=function(){var a=Object.prototype.hasOwnProperty,b=!{toString:null}.propertyIsEnumerable("toString"),c=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],d=c.length;return function(e){if("object"!=typeof e&&"function"!=typeof e||null===e)throw new TypeError("Object.keys called on non-object");var f=[];for(var g in e)a.call(e,g)&&f.push(g);if(b)for(var h=0;d>h;h++)a.call(e,c[h])&&f.push(c[h]);return f}}()),Object.create||(Object.create=function(){function a(){}return function(b){if(1!==arguments.length)throw new Error("Object.create implementation only accepts one parameter.");return a.prototype=b,new a}}()),Array.isArray||(Array.isArray=function(a){return"[object Array]"===Object.prototype.toString.call(a)}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){if(null===this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=0;if(arguments.length>1&&(d=Number(arguments[1]),d!==d?d=0:0!==d&&d!==1/0&&d!==-(1/0)&&(d=(d>0||-1)*Math.floor(Math.abs(d)))),d>=c)return-1;for(var e=d>=0?d:Math.max(c-Math.abs(d),0);c>e;e++)if(e in b&&b[e]===a)return e;return-1}),Object.isFrozen||(Object.isFrozen=function(a){for(var b="tv4_test_frozen_key";a.hasOwnProperty(b);)b+=Math.random();try{return a[b]=!0,delete a[b],!1}catch(a){return!0}});var m={"+":!0,"#":!0,".":!0,"/":!0,";":!0,"?":!0,"&":!0},n={"*":!0};c.prototype={toString:function(){return this.template},fillFromObject:function(a){return this.fill(function(b){return a[b]})}};var o=function(a,b,c,d,e){if(this.missing=[],this.missingMap={},this.formatValidators=a?Object.create(a.formatValidators):{},this.schemas=a?Object.create(a.schemas):{},this.collectMultiple=b,this.errors=[],this.handleError=b?this.collectError:this.returnError,d&&(this.checkRecursive=!0,this.scanned=[],this.scannedFrozen=[],this.scannedFrozenSchemas=[],this.scannedFrozenValidationErrors=[],this.validatedSchemasKey="tv4_validation_id",this.validationErrorsKey="tv4_validation_errors_id"),e&&(this.trackUnknownProperties=!0,this.knownPropertyPaths={},this.unknownPropertyPaths={}),this.errorReporter=c||i("en"),"string"==typeof this.errorReporter)throw new Error("debug");if(this.definedKeywords={},a)for(var f in a.definedKeywords)this.definedKeywords[f]=a.definedKeywords[f].slice(0)};o.prototype.defineKeyword=function(a,b){this.definedKeywords[a]=this.definedKeywords[a]||[],this.definedKeywords[a].push(b)},o.prototype.createError=function(a,b,c,d,e,f,g){var h=new j(a,b,c,d,e);return h.message=this.errorReporter(h,f,g),h},o.prototype.returnError=function(a){return a},o.prototype.collectError=function(a){return a&&this.errors.push(a),null},o.prototype.prefixErrors=function(a,b,c){for(var d=a;d=p&&q>d)return this.createError(r.NUMBER_MULTIPLE_OF,{value:a,multipleOf:c},"","",null,a,b)}return null},o.prototype.validateMinMax=function(a,b){if("number"!=typeof a)return null;if(void 0!==b.minimum){if(ab.maximum)return this.createError(r.NUMBER_MAXIMUM,{value:a,maximum:b.maximum},"","/maximum",null,a,b);if(b.exclusiveMaximum&&a===b.maximum)return this.createError(r.NUMBER_MAXIMUM_EXCLUSIVE,{value:a,maximum:b.maximum},"","/exclusiveMaximum",null,a,b)}return null},o.prototype.validateNaN=function(a,b){return"number"!=typeof a?null:isNaN(a)===!0||a===1/0||a===-(1/0)?this.createError(r.NUMBER_NOT_A_NUMBER,{value:a},"","/type",null,a,b):null},o.prototype.validateString=function(a,b,c){return this.validateStringLength(a,b,c)||this.validateStringPattern(a,b,c)||null},o.prototype.validateStringLength=function(a,b){return"string"!=typeof a?null:void 0!==b.minLength&&a.lengthb.maxLength?this.createError(r.STRING_LENGTH_LONG,{length:a.length,maximum:b.maxLength},"","/maxLength",null,a,b):null},o.prototype.validateStringPattern=function(a,b){if("string"!=typeof a||"string"!=typeof b.pattern&&!(b.pattern instanceof RegExp))return null;var c;if(b.pattern instanceof RegExp)c=b.pattern;else{var d,e="",f=b.pattern.match(/^\/(.+)\/([img]*)$/);f?(d=f[1],e=f[2]):d=b.pattern,c=new RegExp(d,e)}return c.test(a)?null:this.createError(r.STRING_PATTERN,{pattern:b.pattern},"","/pattern",null,a,b)},o.prototype.validateArray=function(a,b,c){return Array.isArray(a)?this.validateArrayLength(a,b,c)||this.validateArrayUniqueItems(a,b,c)||this.validateArrayItems(a,b,c)||null:null},o.prototype.validateArrayLength=function(a,b){var c;return void 0!==b.minItems&&a.lengthb.maxItems&&(c=this.createError(r.ARRAY_LENGTH_LONG,{length:a.length,maximum:b.maxItems},"","/maxItems",null,a,b),this.handleError(c))?c:null},o.prototype.validateArrayUniqueItems=function(a,b){if(b.uniqueItems)for(var c=0;cb.maxProperties&&(c=this.createError(r.OBJECT_PROPERTIES_MAXIMUM,{propertyCount:d.length,maximum:b.maxProperties},"","/maxProperties",null,a,b),this.handleError(c))?c:null},o.prototype.validateObjectRequiredProperties=function(a,b){if(void 0!==b.required)for(var c=0;cc;c++)e[c]=d[0|Math.random()*b];else{var f;for(e[8]=e[13]=e[18]=e[23]="-",e[14]="4",c=0;36>c;c++)e[c]||(f=0|16*Math.random(),e[c]=d[19==c?3&f|8:f])}return e.join("")},function(a){function b(a,b){console.log("WARNING: "+a+" is deprecated. Use "+b+" instead.")}var c=RemoteStorage;c.BaseClient=function(a,b){if("/"!==b[b.length-1])throw"Not a folder: "+b;"/"===b&&(this.makePath=function(a){return("/"===a[0]?"":"/")+a}),this.storage=a,this.base=b;var d=this.base.split("/");d.length>2?this.moduleName=d[1]:this.moduleName="root",c.eventHandling(this,"change"),this.on=this.on.bind(this),a.onChange(this.base,this._fireChange.bind(this))},c.BaseClient.prototype={extend:function(a){for(var b in a)this[b]=a[b];return this},scope:function(a){return new c.BaseClient(this.storage,this.makePath(a))},getListing:function(a,b){if("string"!=typeof a)a="";else if(a.length>0&&"/"!==a[a.length-1])return Promise.reject("Not a folder: "+a);return this.storage.get(this.makePath(a),b).then(function(a){return 404===a.statusCode?{}:a.body})},getAll:function(a,b){if("string"!=typeof a)a="";else if(a.length>0&&"/"!==a[a.length-1])return Promise.reject("Not a folder: "+a);return this.storage.get(this.makePath(a),b).then(function(c){if(404===c.statusCode)return{};if("object"==typeof c.body){var d=Object.keys(c.body);if(0===d.length)return{};var e=d.map(function(d){return this.storage.get(this.makePath(a+d),b).then(function(a){if("string"==typeof a.body)try{a.body=JSON.parse(a.body)}catch(a){}"object"==typeof a.body&&(c.body[d]=a.body)})}.bind(this));return Promise.all(e).then(function(){return c.body})}}.bind(this))},getFile:function(a,b){return"string"!=typeof a?Promise.reject("Argument 'path' of baseClient.getFile must be a string"):this.storage.get(this.makePath(a),b).then(function(a){return{data:a.body,contentType:a.contentType,revision:a.revision}})},storeFile:function(a,b,c){return"string"!=typeof a?Promise.reject("Argument 'mimeType' of baseClient.storeFile must be a string"):"string"!=typeof b?Promise.reject("Argument 'path' of baseClient.storeFile must be a string"):"string"!=typeof c&&"object"!=typeof c?Promise.reject("Argument 'body' of baseClient.storeFile must be a string, ArrayBuffer, or ArrayBufferView"):(this.storage.access.checkPathPermission(this.makePath(b),"rw")||console.warn("WARNING: Editing a document to which only read access ('r') was claimed"),this.storage.put(this.makePath(b),c,a).then(function(a){return 200===a.statusCode||201===a.statusCode?a.revision:Promise.reject("Request (PUT "+this.makePath(b)+") failed with status: "+a.statusCode)}.bind(this)))},getObject:function(a,b){return"string"!=typeof a?Promise.reject("Argument 'path' of baseClient.getObject must be a string"):this.storage.get(this.makePath(a),b).then(function(b){if("object"==typeof b.body)return b.body;if("string"==typeof b.body)try{return JSON.parse(b.body)}catch(b){throw"Not valid JSON: "+this.makePath(a)}else if("undefined"!=typeof b.body&&200===b.statusCode)return Promise.reject("Not an object: "+this.makePath(a))}.bind(this))},storeObject:function(a,b,c){if("string"!=typeof a)return Promise.reject("Argument 'typeAlias' of baseClient.storeObject must be a string");if("string"!=typeof b)return Promise.reject("Argument 'path' of baseClient.storeObject must be a string");if("object"!=typeof c)return Promise.reject("Argument 'object' of baseClient.storeObject must be an object");this._attachType(c,a);try{var d=this.validate(c);if(!d.valid)return Promise.reject(d)}catch(a){return Promise.reject(a)}return this.storage.put(this.makePath(b),JSON.stringify(c),"application/json; charset=UTF-8").then(function(a){return 200===a.statusCode||201===a.statusCode?a.revision:Promise.reject("Request (PUT "+this.makePath(b)+") failed with status: "+a.statusCode)}.bind(this))},remove:function(a){return"string"!=typeof a?Promise.reject("Argument 'path' of baseClient.remove must be a string"):(this.storage.access.checkPathPermission(this.makePath(a),"rw")||console.warn("WARNING: Removing a document to which only read access ('r') was claimed"),this.storage.delete(this.makePath(a)))},cache:function(a,c){if("string"!=typeof a)throw"Argument 'path' of baseClient.cache must be a string";if(c===!1?(b("caching strategy ",'<"FLUSH">'),c="FLUSH"):void 0===c?c="ALL":"string"!=typeof c&&(b("that caching strategy",'<"ALL">'),c="ALL"),"FLUSH"!==c&&"SEEN"!==c&&"ALL"!==c)throw'Argument \'strategy\' of baseclient.cache must be one of ["FLUSH", "SEEN", "ALL"]';return this.storage.caching.set(this.makePath(a),c),this},flush:function(a){return this.storage.local.flush(a)},makePath:function(a){return this.base+(a||"")},_fireChange:function(a){RemoteStorage.config.changeEvents[a.origin]&&(["new","old","lastCommon"].forEach(function(b){if((!a[b+"ContentType"]||/^application\/(.*)json(.*)/.exec(a[b+"ContentType"]))&&"string"==typeof a[b+"Value"])try{a[b+"Value"]=JSON.parse(a[b+"Value"])}catch(a){}}),this._emit("change",a))},_cleanPath:RemoteStorage.util.cleanPath,getItemURL:function(a){if("string"!=typeof a)throw"Argument 'path' of baseClient.getItemURL must be a string";return this.storage.connected?(a=this._cleanPath(this.makePath(a)),this.storage.remote.href+a):void 0},uuid:function(){return Math.uuid()}},c.BaseClient._rs_init=function(){c.prototype.scope=function(a){if("string"!=typeof a)throw"Argument 'path' of baseClient.scope must be a string";if(!this.access.checkPathPermission(a,"r")){var b=a.replace(/(['\\])/g,"\\$1");console.warn("WARNING: please call remoteStorage.access.claim('"+b+"', 'r') (read only) or remoteStorage.access.claim('"+b+"', 'rw') (read/write) first")}return new c.BaseClient(this,a)}}}("undefined"!=typeof window?window:global),function(a){RemoteStorage.BaseClient.Types={uris:{},schemas:{},aliases:{},declare:function(a,b,c,d){var e=a+"/"+b;if(d.extends){var f,g=d.extends.split("/");f=1===g.length?a+"/"+g.shift():g.join("/");var h=this.uris[f];if(!h)throw"Type '"+e+"' tries to extend unknown schema '"+f+"'";d.extends=this.schemas[h]}this.uris[e]=c,this.aliases[c]=e,this.schemas[c]=d},resolveAlias:function(a){return this.uris[a]},getSchema:function(a){return this.schemas[a]},inScope:function(a){var b=a.length,c={};for(var d in this.uris)if(d.substr(0,b+1)===a+"/"){var e=this.uris[d];c[e]=this.schemas[e]}return c}};var b=function(a){var b=new Error("Schema not found: "+a);return b.name="SchemaNotFound",b};b.prototype=Error.prototype,RemoteStorage.BaseClient.Types.SchemaNotFound=b,RemoteStorage.BaseClient.prototype.extend({declareType:function(a,b,c){c||(c=b,b=this._defaultTypeURI(a)),RemoteStorage.BaseClient.Types.declare(this.moduleName,a,b,c)},validate:function(a){var c=RemoteStorage.BaseClient.Types.getSchema(a["@context"]);if(c)return tv4.validateResult(a,c);throw new b(a["@context"])},_defaultTypeURI:function(a){return"http://remotestorage.io/spec/modules/"+encodeURIComponent(this.moduleName)+"/"+encodeURIComponent(a)},_attachType:function(a,b){a["@context"]=RemoteStorage.BaseClient.Types.resolveAlias(this.moduleName+"/"+b)||this._defaultTypeURI(b)}}),Object.defineProperty(RemoteStorage.BaseClient.prototype,"schemas",{configurable:!0,get:function(){return RemoteStorage.BaseClient.Types.inScope(this.moduleName)}})}("undefined"!=typeof window?window:global),function(a){var b=RemoteStorage.util.containingFolder;RemoteStorage.Caching=function(){this.reset()},RemoteStorage.Caching.prototype={pendingActivations:[],set:function(a,b){if("string"!=typeof a)throw new Error("path should be a string");if(!RemoteStorage.util.isFolder(a))throw new Error("path should be a folder");if(this._remoteStorage&&this._remoteStorage.access&&!this._remoteStorage.access.checkPathPermission(a,"r"))throw new Error('No access to path "'+a+'". You have to claim access to it first.');if(!b.match(/^(FLUSH|SEEN|ALL)$/))throw new Error("strategy should be 'FLUSH', 'SEEN', or 'ALL'");this._rootPaths[a]=b,"ALL"===b&&(this.activateHandler?this.activateHandler(a):this.pendingActivations.push(a))},enable:function(a){this.set(a,"ALL")},disable:function(a){this.set(a,"FLUSH")},onActivate:function(a){var b;for(RemoteStorage.log("[Caching] Setting activate handler",a,this.pendingActivations),this.activateHandler=a,b=0;b1e3&&36e5>a}var g=1e4,h=6e4,i=!1,j=RemoteStorage.util.isFolder,k=RemoteStorage.util.isDocument,l=RemoteStorage.util.equal,m=RemoteStorage.util.deepClone,n=RemoteStorage.util.pathsFromRoot;RemoteStorage.Sync=function(a,b,c,d){this.local=a,this.local.onDiff(function(a){this.addTask(a),this.doTasks()}.bind(this)),this.remote=b,this.access=c,this.caching=d,this._tasks={},this._running={},this._timeStarted={},RemoteStorage.eventHandling(this,"done","req-done"),this.caching.onActivate(function(a){this.addTask(a),this.doTasks()}.bind(this))},RemoteStorage.Sync.prototype={now:function(){return(new Date).getTime()},queueGetRequest:function(a){var b=Promise.defer();return this.remote.connected?this.remote.online?(this.addTask(a,function(){this.local.get(a).then(function(a){return b.resolve(a)})}.bind(this)),this.doTasks()):b.reject("cannot fulfill maxAge requirement - remote is not online"):b.reject("cannot fulfill maxAge requirement - remote is not connected"),b.promise},corruptServerItemsMap:function(a,b){if("object"!=typeof a||Array.isArray(a))return!0;for(var c in a){var d=a[c];if("object"!=typeof d)return!0;if("string"!=typeof d.ETag)return!0;if(j(c)){if(-1!==c.substring(0,c.length-1).indexOf("/"))return!0}else{if(-1!==c.indexOf("/"))return!0;if(b){if("string"!=typeof d["Content-Type"])return!0;if("number"!=typeof d["Content-Length"])return!0}}}return!1},corruptItemsMap:function(a){if("object"!=typeof a||Array.isArray(a))return!0;for(var b in a)if("boolean"!=typeof a[b])return!0;return!1},corruptRevision:function(a){return"object"!=typeof a||Array.isArray(a)||a.revision&&"string"!=typeof a.revision||a.body&&"string"!=typeof a.body&&"object"!=typeof a.body||a.contentType&&"string"!=typeof a.contentType||a.contentLength&&"number"!=typeof a.contentLength||a.timestamp&&"number"!=typeof a.timestamp||a.itemsMap&&this.corruptItemsMap(a.itemsMap)},isCorrupt:function(a){return"object"!=typeof a||Array.isArray(a)||"string"!=typeof a.path||this.corruptRevision(a.common)||a.local&&this.corruptRevision(a.local)||a.remote&&this.corruptRevision(a.remote)||a.push&&this.corruptRevision(a.push)},hasTasks:function(){return Object.getOwnPropertyNames(this._tasks).length>0},collectDiffTasks:function(){var a=0;return this.local.forAllNodes(function(b){a>100||(this.isCorrupt(b)?(RemoteStorage.log("[Sync] WARNING: corrupt node in local cache",b),"object"==typeof b&&b.path&&(this.addTask(b.path),a++)):this.needsFetch(b)&&this.access.checkPathPermission(b.path,"r")?(this.addTask(b.path),a++):k(b.path)&&this.needsPush(b)&&this.access.checkPathPermission(b.path,"rw")&&(this.addTask(b.path),a++))}.bind(this)).then(function(){return a},function(a){throw a})},inConflict:function(a){return a.local&&a.remote&&(void 0!==a.remote.body||a.remote.itemsMap)},needsRefresh:function(a){return!!a.common&&(!a.common.timestamp||this.now()-a.common.timestamp>g)},needsFetch:function(a){return!!this.inConflict(a)||(!(!a.common||void 0!==a.common.itemsMap||void 0!==a.common.body)||!(!a.remote||void 0!==a.remote.itemsMap||void 0!==a.remote.body))},needsPush:function(a){return!this.inConflict(a)&&(!(!a.local||a.push)||void 0)},needsRemotePut:function(a){return a.local&&a.local.body},needsRemoteDelete:function(a){return a.local&&a.local.body===!1},getParentPath:function(a){var b=a.match(/^(.*\/)([^\/]+\/?)$/);if(b)return b[1];throw new Error('Not a valid path: "'+a+'"')},deleteChildPathsFromTasks:function(){for(var a in this._tasks)for(var b=n(a),c=1;c=b)return!0;for(c in this._tasks)if(!this._running[c]&&(this._timeStarted[c]=this.now(),this._running[c]=this.doTask(c),this._running[c].then(this.finishTask.bind(this)),d++,d>=b))return!0;return d>=b},collectTasks:function(a){return this.hasTasks()||this.stopped?Promise.resolve():this.collectDiffTasks().then(function(b){return b||a===!1?Promise.resolve():this.collectRefreshTasks()}.bind(this),function(a){throw a})},addTask:function(a,b){this._tasks[a]||(this._tasks[a]=[]),"function"==typeof b&&this._tasks[a].push(b)},sync:function(){return this.done=!1,this.doTasks()?Promise.resolve():this.collectTasks().then(function(){try{this.doTasks()}catch(a){console.error("[Sync] doTasks error",a)}}.bind(this),function(a){throw console.error("[Sync] Sync error",a),new Error("Local cache unavailable")})}},RemoteStorage.prototype.getSyncInterval=function(){return g},RemoteStorage.prototype.setSyncInterval=function(a){if(!f(a))throw a+" is not a valid sync interval";var b=g;g=parseInt(a,10),this._emit("sync-interval-change",{oldValue:b,newValue:a})},RemoteStorage.prototype.getBackgroundSyncInterval=function(){return h},RemoteStorage.prototype.setBackgroundSyncInterval=function(a){if(!f(a))throw a+" is not a valid sync interval";var b=h;h=parseInt(a,10),this._emit("sync-interval-change",{oldValue:b,newValue:a})},RemoteStorage.prototype.getCurrentSyncInterval=function(){return i?h:g};var o=function(a){var b="Sync failed: ";b+="object"==typeof a&&"message"in a?a.message:a,this.originalError=a,this.message=b};o.prototype=new Error,o.prototype.constructor=o,RemoteStorage.SyncError=o,RemoteStorage.prototype.syncCycle=function(){this.sync.stopped||(this.sync.on("done",function(){RemoteStorage.log("[Sync] Sync done. Setting timer to",this.getCurrentSyncInterval()),this.sync.stopped||(this._syncTimer&&clearTimeout(this._syncTimer),this._syncTimer=setTimeout(this.sync.sync.bind(this.sync),this.getCurrentSyncInterval()))}.bind(this)),this.sync.sync())},RemoteStorage.prototype.stopSync=function(){this.sync?(RemoteStorage.log("[Sync] Stopping sync"),this.sync.stopped=!0):(RemoteStorage.log("[Sync] Will instantiate sync stopped"),this.syncStopped=!0)},RemoteStorage.prototype.startSync=function(){this.sync.stopped=!1,this.syncStopped=!1,this.sync.sync()};var p;RemoteStorage.Sync._rs_init=function(a){p=function(){RemoteStorage.log("[Sync] syncCycleCb calling syncCycle"),RemoteStorage.Env.isBrowser()&&e.bind(a)(),a.sync||(a.sync=new RemoteStorage.Sync(a.local,a.remote,a.access,a.caching),a.syncStopped&&(RemoteStorage.log("[Sync] Instantiating sync stopped"),a.sync.stopped=!0,delete a.syncStopped)),RemoteStorage.log("[Sync] syncCycleCb calling syncCycle"),a.syncCycle()},syncOnConnect=function(){a.removeEventListener("connected",syncOnConnect),a.startSync()},a.on("ready",p),a.on("connected",syncOnConnect)},RemoteStorage.Sync._rs_cleanup=function(a){a.stopSync(),a.removeEventListener("ready",p),a.removeEventListener("connected",syncOnConnect),delete a.sync}}("undefined"!=typeof window?window:global),function(){function a(a){if("object"==typeof a&&"string"==typeof a.path)if(e(a.path)){if(a.local&&a.local.itemsMap)return a.local;if(a.common&&a.common.itemsMap)return a.common}else{if(a.local&&a.local.body&&a.local.contentType)return a.local;if(a.common&&a.common.body&&a.common.contentType)return a.common;if(a.body&&a.contentType)return{body:a.body,contentType:a.contentType}}}function b(b,c){var d;for(d in b){if(b[d]&&b[d].remote)return!0;var e=a(b[d]);if(e&&e.timestamp&&(new Date).getTime()-e.timestamp<=c)return!1;if(!e)return!0}return!0}function c(a){var b={path:a,common:{}};return e(a)&&(b.common.itemsMap={}),b}function d(a,b){return a.common||(a.common={itemsMap:{}}),a.common.itemsMap||(a.common.itemsMap={}),a.local||(a.local=g(a.common)),a.local.itemsMap||(a.local.itemsMap=a.common.itemsMap),a.local.itemsMap[b]=!0,a}var e=RemoteStorage.util.isFolder,f=RemoteStorage.util.isDocument,g=RemoteStorage.util.deepClone,h=(RemoteStorage.util.equal,RemoteStorage.util.pathsFromRoot),i={get:function(c,d,f){var g=this;return"number"==typeof d?g.getNodes(h(c)).then(function(e){var g=a(e[c]);return b(e,d)?f(c):g?{statusCode:200,body:g.body||g.itemsMap,contentType:g.contentType}:{statusCode:404}}):g.getNodes([c]).then(function(b){var d=a(b[c]);if(d){if(e(c))for(var f in d.itemsMap)d.itemsMap.hasOwnProperty(f)&&d.itemsMap[f]===!1&&delete d.itemsMap[f];return{statusCode:200,body:d.body||d.itemsMap,contentType:d.contentType}}return{statusCode:404}})},put:function(b,e,f){function g(b,g){try{for(var h=0,i=b.length;i>h;h++){var j,k=b[h],l=g[k];if(l||(g[k]=l=c(k)),0===h)j=a(l),l.local={body:e,contentType:f,previousBody:j?j.body:void 0,previousContentType:j?j.contentType:void 0};else{var m=b[h-1].substring(k.length);l=d(l,m)}}return g}catch(a){throw RemoteStorage.log("[Cachinglayer] Error during PUT",g,h,a),a}}var i=h(b);return this._updateNodes(i,g)},delete:function(b){var c=h(b);return this._updateNodes(c,function(b,c){for(var d=0,e=b.length;e>d;d++){var f=b[d],h=c[f];if(!h)throw new Error("Cannot delete non-existing node "+f);if(0===d)previous=a(h),h.local={body:!1,previousBody:previous?previous.body:void 0,previousContentType:previous?previous.contentType:void 0};else{h.local||(h.local=g(h.common));var i=b[d-1].substring(f.length);if(delete h.local.itemsMap[i],Object.getOwnPropertyNames(h.local.itemsMap).length>0)break}}return c})},flush:function(a){var b=this;return b._getAllDescendentPaths(a).then(function(a){return b.getNodes(a)}).then(function(a){for(var c in a){var d=a[c];d&&d.common&&d.local&&b._emitChange({path:d.path,origin:"local",oldValue:d.local.body===!1?void 0:d.local.body,newValue:d.common.body===!1?void 0:d.common.body}),a[c]=void 0}return b.setNodes(a)})},_emitChange:function(a){RemoteStorage.config.changeEvents[a.origin]&&this._emit("change",a)},fireInitial:function(){if(RemoteStorage.config.changeEvents.local){var b=this;b.forAllNodes(function(c){var d;f(c.path)&&(d=a(c),d&&b._emitChange({path:c.path,origin:"local",oldValue:void 0,oldContentType:void 0,newValue:d.body,newContentType:d.contentType}))}).then(function(){b._emit("local-events-done")})}},onDiff:function(a){this.diffHandler=a},migrate:function(a){return"object"!=typeof a||a.common||(a.common={},"string"==typeof a.path?"/"===a.path.substr(-1)&&"object"==typeof a.body&&(a.common.itemsMap=a.body):(a.local||(a.local={}),a.local.body=a.body,a.local.contentType=a.contentType)),a},_updateNodesRunning:!1,_updateNodesQueued:[],_updateNodes:function(a,b){var c=Promise.defer();return this._doUpdateNodes(a,b,c),c.promise},_doUpdateNodes:function(a,b,c){var d=this;return d._updateNodesRunning?void d._updateNodesQueued.push({paths:a,cb:b,promise:c}):(d._updateNodesRunning=!0,void d.getNodes(a).then(function(e){var h,i=g(e),j=[],k=RemoteStorage.util.equal;e=b(a,e);for(var l in e)h=e[l],k(h,i[l])?delete e[l]:f(l)&&(k(h.local.body,h.local.previousBody)&&h.local.contentType===h.local.previousContentType||j.push({path:l,origin:"window",oldValue:h.local.previousBody,newValue:h.local.body===!1?void 0:h.local.body,oldContentType:h.local.previousContentType,newContentType:h.local.contentType}),delete h.local.previousBody,delete h.local.previousContentType);d.setNodes(e).then(function(){d._emitChangeEvents(j),c.resolve({statusCode:200})})}).then(function(){return Promise.resolve()},function(a){c.reject(a)}).then(function(){d._updateNodesRunning=!1;var a=d._updateNodesQueued.shift();a&&d._doUpdateNodes(a.paths,a.cb,a.promise)}))},_emitChangeEvents:function(a){for(var b=0,c=a.length;c>b;b++)this._emitChange(a[b]),this.diffHandler&&this.diffHandler(a[b].path)},_getAllDescendentPaths:function(b){var c=this;return e(b)?c.getNodes([b]).then(function(d){var e=[b],f=a(d[b]),g=Object.keys(f.itemsMap),h=g.map(function(a){return c._getAllDescendentPaths(b+a).then(function(a){for(var b=0,c=a.length;c>b;b++)e.push(a[b])})});return Promise.all(h).then(function(){return e})}):Promise.resolve([b])},_getInternals:function(){return{getLatest:a,makeNode:c,isOutdated:b}}};RemoteStorage.cachingLayer=function(a){for(var b in i)a[b]=i[b]}}(),function(a){var b,c=RemoteStorage,d=2,e="remotestorage";c.IndexedDB=function(a){return this.db=a||b,this.db?(c.cachingLayer(this),c.eventHandling(this,"change","local-events-done"),this.getsRunning=0,this.putsRunning=0,this.changesQueued={},void(this.changesRunning={})):void RemoteStorage.log("[IndexedDB] Failed to open DB")},c.IndexedDB.prototype={getNodes:function(a){for(var b=[],c={},d=0,e=a.length;e>d;d++)void 0!==this.changesQueued[a[d]]?c[a[d]]=RemoteStorage.util.deepClone(this.changesQueued[a[d]]||void 0):void 0!==this.changesRunning[a[d]]?c[a[d]]=RemoteStorage.util.deepClone(this.changesRunning[a[d]]||void 0):b.push(a[d]);return b.length>0?this.getNodesFromDb(b).then(function(a){for(var b in c)a[b]=c[b];return a}):Promise.resolve(c)},setNodes:function(a){for(var b in a)this.changesQueued[b]=a[b]||!1;return this.maybeFlush(),Promise.resolve()},maybeFlush:function(){0===this.putsRunning?this.flushChangesQueued():this.commitSlownessWarning||(this.commitSlownessWarning=setInterval(function(){console.log("WARNING: waited more than 10 seconds for previous commit to finish")},1e4))},flushChangesQueued:function(){this.commitSlownessWarning&&(clearInterval(this.commitSlownessWarning),this.commitSlownessWarning=null),Object.keys(this.changesQueued).length>0&&(this.changesRunning=this.changesQueued,this.changesQueued={},this.setNodesInDb(this.changesRunning).then(this.flushChangesQueued.bind(this)))},getNodesFromDb:function(a){var b=Promise.defer(),c=this.db.transaction(["nodes"],"readonly"),d=c.objectStore("nodes"),e={};return(new Date).getTime(),this.getsRunning++,a.map(function(a,b){d.get(a).onsuccess=function(b){e[a]=b.target.result}}),c.oncomplete=function(){b.resolve(e),this.getsRunning--}.bind(this),c.onerror=c.onabort=function(){b.reject("get transaction error/abort"),this.getsRunning--}.bind(this),b.promise},setNodesInDb:function(a){var b=Promise.defer(),c=this.db.transaction(["nodes"],"readwrite"),d=c.objectStore("nodes"),e=(new Date).getTime();this.putsRunning++,RemoteStorage.log("[IndexedDB] Starting put",a,this.putsRunning);for(var f in a){var g=a[f];if("object"==typeof g)try{d.put(g)}catch(a){throw RemoteStorage.log("[IndexedDB] Error while putting",g,a),a}else try{d.delete(f)}catch(a){throw RemoteStorage.log("[IndexedDB] Error while removing",d,g,a),a}}return c.oncomplete=function(){this.putsRunning--,RemoteStorage.log("[IndexedDB] Finished put",a,this.putsRunning,(new Date).getTime()-e+"ms"),b.resolve()}.bind(this),c.onerror=function(){this.putsRunning--,b.reject("transaction error")}.bind(this),c.onabort=function(){b.reject("transaction abort"),this.putsRunning--}.bind(this),b.promise},reset:function(a){var b=this.db.name,d=this;this.db.close(),c.IndexedDB.clean(this.db.name,function(){c.IndexedDB.open(b,function(b,c){b?RemoteStorage.log("[IndexedDB] Error while resetting local storage",b):d.db=c,"function"==typeof a&&a(d)})})},forAllNodes:function(a){var b=Promise.defer(),c=this.db.transaction(["nodes"],"readonly"),d=c.objectStore("nodes").openCursor();return d.onsuccess=function(c){var d=c.target.result;d?(a(this.migrate(d.value)),d.continue()):b.resolve()}.bind(this),b.promise},closeDB:function(){this.db.close()}},c.IndexedDB.open=function(a,b){var e=setTimeout(function(){b("timeout trying to open db")},1e4);try{var f=indexedDB.open(a,d);f.onerror=function(){RemoteStorage.log("[IndexedDB] Opening DB failed",f),clearTimeout(e),b(f.error)},f.onupgradeneeded=function(a){var b=f.result;RemoteStorage.log("[IndexedDB] Upgrade: from ",a.oldVersion," to ",a.newVersion),1!==a.oldVersion&&(RemoteStorage.log("[IndexedDB] Creating object store: nodes"),b.createObjectStore("nodes",{keyPath:"path"})),RemoteStorage.log("[IndexedDB] Creating object store: changes"),b.createObjectStore("changes",{keyPath:"path"})},f.onsuccess=function(){clearTimeout(e);var d=f.result;return d.objectStoreNames.contains("nodes")&&d.objectStoreNames.contains("changes")?void b(null,f.result):(RemoteStorage.log("[IndexedDB] Missing object store. Resetting the database."),void c.IndexedDB.clean(a,function(){c.IndexedDB.open(a,b)}))}}catch(d){RemoteStorage.log("[IndexedDB] Failed to open database: "+d),RemoteStorage.log("[IndexedDB] Resetting database and trying again."),clearTimeout(e),c.IndexedDB.clean(a,function(){c.IndexedDB.open(a,b)})}},c.IndexedDB.clean=function(a,b){var c=indexedDB.deleteDatabase(a);c.onsuccess=function(){RemoteStorage.log("[IndexedDB] Done removing DB"),b()},c.onerror=c.onabort=function(b){console.error('Failed to remove database "'+a+'"',b)}},c.IndexedDB._rs_init=function(a){var d=Promise.defer();return c.IndexedDB.open(e,function(c,e){c?d.reject(c):(b=e,e.onerror=function(){a._emit("error",c)},d.resolve())}),d.promise},c.IndexedDB._rs_supported=function(){var b=Promise.defer();a.indexedDB=a.indexedDB||a.webkitIndexedDB||a.mozIndexedDB||a.oIndexedDB||a.msIndexedDB;var c=!1;if("undefined"!=typeof a.navigator&&a.navigator.userAgent.match(/Android (2|3|4\.[0-3])/)&&(navigator.userAgent.match(/Chrome|Firefox/)||(c=!0)),"indexedDB"in a&&!c)try{var d=indexedDB.open("rs-check");d.onerror=function(a){b.reject()},d.onsuccess=function(a){d.result.close(),indexedDB.deleteDatabase("rs-check"),b.resolve()}}catch(a){b.reject()}else b.reject();return b.promise},c.IndexedDB._rs_cleanup=function(a){var b=Promise.defer();return a.local&&a.local.closeDB(),c.IndexedDB.clean(e,function(){b.resolve()}),b.promise}}("undefined"!=typeof window?window:global),function(a){function b(a){return a.substr(0,d.length)===d||a.substr(0,e.length)===e}function c(a){return a.substr(0,d.length)===d}var d="remotestorage:cache:nodes:",e="remotestorage:cache:changes:";RemoteStorage.LocalStorage=function(){RemoteStorage.cachingLayer(this),RemoteStorage.log("[LocalStorage] Registering events"),RemoteStorage.eventHandling(this,"change","local-events-done")},RemoteStorage.LocalStorage.prototype={getNodes:function(a){for(var b={},c=0,e=a.length;e>c;c++)try{b[a[c]]=JSON.parse(localStorage[d+a[c]])}catch(d){b[a[c]]=void 0}return Promise.resolve(b)},setNodes:function(a){for(var b in a)localStorage[d+b]=JSON.stringify(a[b]);return Promise.resolve()},forAllNodes:function(a){for(var b,d=0,e=localStorage.length;e>d;d++)if(c(localStorage.key(d))){try{b=this.migrate(JSON.parse(localStorage[localStorage.key(d)]))}catch(a){b=void 0}b&&a(b)}return Promise.resolve()}},RemoteStorage.LocalStorage._rs_init=function(){},RemoteStorage.LocalStorage._rs_supported=function(){return RemoteStorage.util.localStorageAvailable()},RemoteStorage.LocalStorage._rs_cleanup=function(){for(var a=[],c=0,d=localStorage.length;d>c;c++){var e=localStorage.key(c);b(e)&&a.push(e)}a.forEach(function(a){RemoteStorage.log("[LocalStorage] Removing",a),delete localStorage[a]})}}("undefined"!=typeof window?window:global),function(a){RemoteStorage.InMemoryStorage=function(){RemoteStorage.cachingLayer(this),RemoteStorage.log("[InMemoryStorage] Registering events"),RemoteStorage.eventHandling(this,"change","local-events-done"),this._storage={}},RemoteStorage.InMemoryStorage.prototype={getNodes:function(a){for(var b={},c=0,d=a.length;d>c;c++)b[a[c]]=this._storage[a[c]];return Promise.resolve(b)},setNodes:function(a){for(var b in a)void 0===a[b]?delete this._storage[b]:this._storage[b]=a[b];return Promise.resolve()},forAllNodes:function(a){for(var b in this._storage)a(this.migrate(this._storage[b]));return Promise.resolve()}},RemoteStorage.InMemoryStorage._rs_init=function(){},RemoteStorage.InMemoryStorage._rs_supported=function(){return!0},RemoteStorage.InMemoryStorage._rs_cleanup=function(){}}("undefined"!=typeof window?window:global),function(){RemoteStorage.MODULES={},RemoteStorage.defineModule=function(a,b){if(RemoteStorage.MODULES[a]=b,Object.defineProperty(RemoteStorage.prototype,a,{configurable:!0,get:function(){var b=this._loadModule(a);return Object.defineProperty(this,a,{value:b}),b}}),-1!==a.indexOf("-")){var c=a.replace(/\-[a-z]/g,function(a){return a[1].toUpperCase()});Object.defineProperty(RemoteStorage.prototype,c,{get:function(){return this[a]}})}},RemoteStorage.prototype._loadModule=function(a){var b=RemoteStorage.MODULES[a];if(b){var c=b(new RemoteStorage.BaseClient(this,"/"+a+"/"),new RemoteStorage.BaseClient(this,"/public/"+a+"/"));return c.exports}throw"Unknown module: "+a},RemoteStorage.prototype.defineModule=function(a){console.log("remoteStorage.defineModule is deprecated, use RemoteStorage.defineModule instead!"),RemoteStorage.defineModule.apply(RemoteStorage,arguments)}}(),function(){function a(a,b,c){function d(a,b,c,d){[b,c,d].forEach(function(b){var c=document.createElement("td");c.textContent=b||"",a.appendChild(c)})}function e(a){function c(b,c,f,g){if(200===b){var i=document.createElement("tr");if(h.appendChild(i),d(i,a,f,g),"/"===a[a.length-1])for(var j in c)e(a+j)}}b.connected!==!1&&b.get(a).then(c)}a.setAttribute("border","1"),a.style.margin="8px",a.style.color="white",a.innerHTML="";var f=document.createElement("thead");a.appendChild(f);var g=document.createElement("tr");f.appendChild(g),["Path","Content-Type","Revision"].forEach(function(a){var b=document.createElement("th");b.textContent=a,f.appendChild(b)});var h=document.createElement("tbody");a.appendChild(h),c.forEach(e)}function b(b,c,d,e){var f=document.createElement("div"),g=document.createElement("h2");g.textContent=b,f.appendChild(g);var h=document.createElement("button");if(h.textContent="Refresh",h.onclick=function(){a(c,d,e)},f.appendChild(h),d.reset){var i=document.createElement("button");i.textContent="Reset",i.onclick=function(){d.reset(function(b){d=b,a(c,d,e)})},f.appendChild(i)}return f.appendChild(c),a(c,d,e),f}function c(a){function b(){f.innerHTML="",a.forAllNodes(function(a){if(a.local&&a.local.body){var b=document.createElement("li");b.textContent=JSON.stringify(a.local),f.appendChild(b)}})}var c=document.createElement("div"),d=document.createElement("h2");d.textContent="Outgoing changes",c.appendChild(d);var e=document.createElement("button");e.textContent="Refresh",c.appendChild(e);var f=document.createElement("ul");return f.style.fontFamily="courier",c.appendChild(f),e.onclick=b,b(),c}RemoteStorage.prototype.inspect=function(){var d=document.createElement("div");d.id="remotestorage-inspect",d.style.position="absolute",d.style.top=0,d.style.left=0,d.style.background="black",d.style.color="white",d.style.border="groove 5px #ccc";var e=document.createElement("div");e.style.position="absolute",e.style.top=0,e.style.left=0;var f=document.createElement("strong");f.textContent=" remotestorage.js inspector ",e.appendChild(f);var g;this.local&&(g=document.createElement("button"),g.textContent="Synchronize",e.appendChild(g));var h=document.createElement("button");h.textContent="Close",h.onclick=function(){document.body.removeChild(d)},e.appendChild(h),d.appendChild(e);var i=[];for(var j in this.caching._rootPaths)this.caching._rootPaths.hasOwnProperty(j)&&i.push(j);var k=document.createElement("table"),l=document.createElement("table");d.appendChild(b("Remote",k,this.remote,i)),this.local&&(d.appendChild(b("Local",l,this.local,["/"])),d.appendChild(c(this.local)),g.onclick=function(){this.log("sync clicked"),this.sync.sync().then(function(){this.log("SYNC FINISHED"),a(l,this.local,["/"])}.bind(this),function(a){console.error("SYNC FAILED",a,a.stack)})}.bind(this)),document.body.appendChild(d)}}(),function(a){function b(a){return"/"===a.substr(-1)&&(a=a.substr(0,a.length-1)),decodeURIComponent(a)}function c(a){return a.replace(/[^\/]+\/?$/,"")}function d(a){var b=a.split("/");return"/"===a.substr(-1)?b[b.length-2]+"/":b[b.length-1]}var e=RemoteStorage,f="https://www.googleapis.com",g="https://accounts.google.com/o/oauth2/auth",h="https://www.googleapis.com/auth/drive",i="application/vnd.google-apps.folder",j="application/json; charset=UTF-8",k=RemoteStorage.util.isFolder,l=function(a){this.maxAge=a,this._items={}};l.prototype={get:function(a){var b=this._items[a],c=(new Date).getTime();return b&&b.t>=c-this.maxAge?b.v:void 0},set:function(a,b){this._items[a]={v:b,t:(new Date).getTime()}}},e.GoogleDrive=function(a,b){e.eventHandling(this,"change","connected","wire-busy","wire-done","not-connected"),this.rs=a,this.clientId=b,this._fileIdCache=new l(300)},e.GoogleDrive.prototype={connected:!1,online:!0,configure:function(a){a.token?(localStorage["remotestorage:googledrive:token"]=a.token,this.token=a.token,this.connected=!0,this._emit("connected")):(this.connected=!1,delete this.token,delete localStorage["remotestorage:googledrive:token"])},connect:function(){this.rs.setBackend("googledrive"),e.Authorize(this.rs,g,h,String(e.Authorize.getLocation()),this.clientId)},stopWaitingForToken:function(){this.connected||this._emit("not-connected")},get:function(a,b){return"/"===a.substr(-1)?this._getFolder(a,b):this._getFile(a,b)},put:function(a,b,c,d){function e(a){if(a.status>=200&&a.status<300){var b=JSON.parse(a.responseText),c=b.etag.substring(1,b.etag.length-1);return Promise.resolve({statusCode:200,contentType:b.mimeType,revision:c})}return 412===a.status?Promise.resolve({statusCode:412,revision:"conflict"}):Promise.reject("PUT failed with status "+a.status+" ("+a.responseText+")")}var f=this;return f._getFileId(a).then(function(g){return g?d&&"*"===d.ifNoneMatch?e({status:412}):f._updateFile(g,a,b,c,d).then(e):f._createFile(a,b,c,d).then(e)})},delete:function(a,b){var c=this;return c._getFileId(a).then(function(a){return a?c._getMeta(a).then(function(d){var e;return"object"==typeof d&&"string"==typeof d.etag&&(e=d.etag.substring(1,d.etag.length-1)),b&&b.ifMatch&&b.ifMatch!==e?{statusCode:412,revision:e}:c._request("DELETE",f+"/drive/v2/files/"+a,{}).then(function(a){return 200===a.status||204===a.status?{statusCode:200}:Promise.reject("Delete failed: "+a.status+" ("+a.responseText+")")})}):Promise.resolve({statusCode:200})})},_updateFile:function(a,b,c,d,e){var g=this,h={mimeType:d},i={"Content-Type":"application/json; charset=UTF-8"};return e&&e.ifMatch&&(i["If-Match"]='"'+e.ifMatch+'"'),g._request("PUT",f+"/upload/drive/v2/files/"+a+"?uploadType=resumable",{body:JSON.stringify(h),headers:i}).then(function(a){return 412===a.status?a:g._request("PUT",a.getResponseHeader("Location"),{body:d.match(/^application\/json/)?JSON.stringify(c):c})})},_createFile:function(a,c,e,g){var h=this;return h._getParentId(a).then(function(g){var i=d(a),j={title:b(i),mimeType:e,parents:[{kind:"drive#fileLink",id:g}]};return h._request("POST",f+"/upload/drive/v2/files?uploadType=resumable",{body:JSON.stringify(j),headers:{"Content-Type":"application/json; charset=UTF-8"}}).then(function(a){return h._request("POST",a.getResponseHeader("Location"),{body:e.match(/^application\/json/)?JSON.stringify(c):c})})})},_getFile:function(a,b){var c=this;return c._getFileId(a).then(function(a){return c._getMeta(a).then(function(a){var d;if("object"==typeof a&&"string"==typeof a.etag&&(d=a.etag.substring(1,a.etag.length-1)),b&&b.ifNoneMatch&&d===b.ifNoneMatch)return Promise.resolve({statusCode:304 -});var e={};if(!a.downloadUrl){if(!a.exportLinks||!a.exportLinks["text/html"])return Promise.resolve({statusCode:200,body:"",contentType:a.mimeType,revision:d});a.mimeType+=";export=text/html",a.downloadUrl=a.exportLinks["text/html"]}return a.mimeType.match(/charset=binary/)&&(e.responseType="blob"),c._request("GET",a.downloadUrl,e).then(function(b){var c=b.response;if(a.mimeType.match(/^application\/json/))try{c=JSON.parse(c)}catch(a){}return Promise.resolve({statusCode:200,body:c,contentType:a.mimeType,revision:d})})})})},_getFolder:function(a,b){var c=this;return c._getFileId(a).then(function(b){var d,e,g,h,k;return b?(d="'"+b+"' in parents",e="items(downloadUrl,etag,fileSize,id,mimeType,title)",c._request("GET",f+"/drive/v2/files?q="+encodeURIComponent(d)+"&fields="+encodeURIComponent(e)+"&maxResults=1000",{}).then(function(b){if(200!==b.status)return Promise.reject("request failed or something: "+b.status);try{g=JSON.parse(b.responseText)}catch(a){return Promise.reject("non-JSON response from GoogleDrive")}k={};for(var d=0,e=g.items.length;e>d;d++)h=g.items[d].etag.substring(1,g.items[d].etag.length-1),g.items[d].mimeType===i?(c._fileIdCache.set(a+g.items[d].title+"/",g.items[d].id),k[g.items[d].title+"/"]={ETag:h}):(c._fileIdCache.set(a+g.items[d].title,g.items[d].id),k[g.items[d].title]={ETag:h,"Content-Type":g.items[d].mimeType,"Content-Length":g.items[d].fileSize});return Promise.resolve({statusCode:200,body:k,contentType:j,revision:void 0})})):Promise.resolve({statusCode:404})})},_getParentId:function(a){var b=c(a),d=this;return d._getFileId(b).then(function(a){return a?Promise.resolve(a):d._createFolder(b)})},_createFolder:function(a){var c=this;return c._getParentId(a).then(function(e){return c._request("POST",f+"/drive/v2/files",{body:JSON.stringify({title:b(d(a)),mimeType:i,parents:[{id:e}]}),headers:{"Content-Type":"application/json; charset=UTF-8"}}).then(function(a){var b=JSON.parse(a.responseText);return Promise.resolve(b.id)})})},_getFileId:function(a){var b,d=this;return"/"===a?Promise.resolve("root"):(b=this._fileIdCache.get(a))?Promise.resolve(b):d._getFolder(c(a)).then(function(){return b=d._fileIdCache.get(a),b?Promise.resolve(b):"/"===a.substr(-1)?d._createFolder(a).then(function(){return d._getFileId(a)}):Promise.resolve()})},_getMeta:function(a){return this._request("GET",f+"/drive/v2/files/"+a,{}).then(function(b){return 200===b.status?Promise.resolve(JSON.parse(b.responseText)):Promise.reject("request (getting metadata for "+a+") failed with status: "+b.status)})},_request:function(a,b,c){var d=this;return c.headers||(c.headers={}),c.headers.Authorization="Bearer "+d.token,this._emit("wire-busy",{method:a,isFolder:k(b)}),e.WireClient.request.call(this,a,b,c).then(function(c){return c&&401===c.status?void d.connect():(d.online||(d.online=!0,d.rs._emit("network-online")),d._emit("wire-done",{method:a,isFolder:k(b),success:!0}),Promise.resolve(c))},function(c){return d.online&&(d.online=!1,d.rs._emit("network-offline")),d._emit("wire-done",{method:a,isFolder:k(b),success:!1}),Promise.reject(c)})}},e.GoogleDrive._rs_init=function(a){var b=a.apiKeys.googledrive;b&&(a.googledrive=new e.GoogleDrive(a,b.clientId),"googledrive"===a.backend&&(a._origRemote=a.remote,a.remote=a.googledrive))},e.GoogleDrive._rs_supported=function(a){return!0},e.GoogleDrive._rs_cleanup=function(a){a.setBackend(void 0),a._origRemote&&(a.remote=a._origRemote,delete a._origRemote)}}(this),function(a){function b(a){this.defaultValue=a,this._storage={},this.set=this.justSet,this.delete=this.justDelete}function c(a){a._dropboxOrigSync||(a._dropboxOrigSync=a.sync.sync.bind(a.sync),a.sync.sync=function(){return this.dropbox.fetchDelta.apply(this.dropbox,arguments).then(a._dropboxOrigSync,function(b){return a._emit("error",new RemoteStorage.SyncError(b)),Promise.reject(b)})}.bind(a))}function d(a){a._dropboxOrigSync&&(a.sync.sync=a._dropboxOrigSync,delete a._dropboxOrigSync)}function e(a){a._origBaseClientGetItemURL||(a._origBaseClientGetItemURL=l.BaseClient.prototype.getItemURL,l.BaseClient.prototype.getItemURL=function(b){var c=a.dropbox._itemRefs[b];return c?c:""})}function f(a){a._origBaseClientGetItemURL&&(l.BaseClient.prototype.getItemURL=a._origBaseClientGetItemURL,delete a._origBaseClientGetItemURL)}function g(a){a._origRemote||(a._origRemote=a.remote,a.remote=a.dropbox)}function h(a){a._origRemote&&(a.remote=a._origRemote,delete a._origRemote)}function i(a){g(a),a.sync?c(a):a.on("connected",function(){a.sync&&c(a)}),e(a)}function j(a){h(a),d(a),f(a)}var k,l=RemoteStorage,m="https://www.dropbox.com/1/oauth2/authorize",n="remotestorage:dropbox",o="/remotestorage",p=RemoteStorage.util.isFolder,q=function(a){return l.WireClient.cleanPath(o+"/"+a)},r=function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));return b.join("&")};b.prototype={get:function(a){a=a.toLowerCase();var b=this._storage[a];return"undefined"==typeof b&&(b=this.defaultValue,this._storage[a]=b),b},propagateSet:function(a,b){return a=a.toLowerCase(),this._storage[a]===b?b:(this._propagate(a,b),this._storage[a]=b,b)},propagateDelete:function(a){return a=a.toLowerCase(),this._propagate(a,this._storage[a]),delete this._storage[a]},_activatePropagation:function(){return this.set=this.propagateSet,this.delete=this.propagateDelete,!0},justSet:function(a,b){return a=a.toLowerCase(),this._storage[a]=b,b},justDelete:function(a,b){return a=a.toLowerCase(),delete this._storage[a]},_propagate:function(a,b){for(var c=a.split("/").slice(0,-1),d="",e=0,f=c.length;f>e;e++)d+=c[e]+"/",b||(b=this._storage[d]+1),this._storage[d]=b}};var s;l.Dropbox=function(a){this.rs=a,this.connected=!1,this.rs=a;var c=this;if(s=function(a){a instanceof RemoteStorage.Unauthorized&&c.configure({userAddress:null,href:null,storageApi:null,token:null,options:null})},l.eventHandling(this,"change","connected","wire-busy","wire-done","not-connected"),a.on("error",s),this.clientId=a.apiKeys.dropbox.appKey,this._revCache=new b("rev"),this._itemRefs={},this._metadataCache={},k){var d;try{d=JSON.parse(localStorage[n])}catch(a){}d&&this.configure(d);try{this._itemRefs=JSON.parse(localStorage[n+":shares"])}catch(a){}}this.connected&&setTimeout(this._emit.bind(this),0,"connected")},l.Dropbox.prototype={online:!0,connect:function(){this.rs.setBackend("dropbox"),this.token?i(this.rs):l.Authorize(this.rs,m,"",String(l.Authorize.getLocation()),this.clientId)},configure:function(a){"undefined"!=typeof a.userAddress&&(this.userAddress=a.userAddress),"undefined"!=typeof a.token&&(this.token=a.token),this.token?(this.connected=!0,this.userAddress||this.info().then(function(a){this.userAddress=a.display_name,this.rs.widget.view.setUserAddress(this.userAddress),this._emit("connected")}.bind(this))):this.connected=!1,k&&(localStorage[n]=JSON.stringify({userAddress:this.userAddress,token:this.token}))},stopWaitingForToken:function(){this.connected||this._emit("not-connected")},_getFolder:function(a,b){var c="https://api.dropbox.com/1/metadata/auto"+q(a),d=this._revCache,e=this;return this._request("GET",c,{}).then(function(b){var c=b.status;if(304===c)return Promise.resolve({statusCode:c});var f,g,h,i;try{g=JSON.parse(b.responseText)}catch(a){return Promise.reject(a)}return i=e._revCache.get(a),h="application/json; charset=UTF-8",g.contents&&(f=g.contents.reduce(function(b,c){var e=c.path.split("/").slice(-1)[0]+(c.is_dir?"/":"");return c.is_dir?b[e]={ETag:d.get(a+e)}:b[e]={ETag:c.rev},b},{})),Promise.resolve({statusCode:c,body:f,contentType:h,revision:i})})},get:function(a,b){if(!this.connected)return Promise.reject("not connected (path: "+a+")");var c="https://api-content.dropbox.com/1/files/auto"+q(a),d=this,e=this._revCache.get(a);return null===e?Promise.resolve({statusCode:404}):b&&b.ifNoneMatch&&e&&e===b.ifNoneMatch?Promise.resolve({statusCode:304}):"/"===a.substr(-1)?this._getFolder(a,b):this._request("GET",c,{}).then(function(b){var c,e,f,g,h=b.status;if(200!==h)return Promise.resolve({statusCode:h});e=b.responseText;try{c=JSON.parse(b.getResponseHeader("x-dropbox-metadata"))}catch(a){return Promise.reject(a)}if(f=c.mime_type,g=c.rev,d._revCache.set(a,g),d._shareIfNeeded(a),!b.getResponseHeader("Content-Type")||b.getResponseHeader("Content-Type").match(/charset=binary/)){var i=Promise.defer();return l.WireClient.readBinaryData(b.response,f,function(a){i.resolve({statusCode:h,body:a,contentType:f,revision:g})}),i.promise}if(f&&f.search("application/json")>=0,!0)try{e=JSON.parse(e),f="application/json; charset=UTF-8"}catch(a){}return Promise.resolve({statusCode:h,body:e,contentType:f,revision:g})})},put:function(a,b,c,d){var e=this;if(!this.connected)throw new Error("not connected (path: "+a+")");var f=this._revCache.get(a);if(d&&d.ifMatch&&f&&f!==d.ifMatch)return Promise.resolve({statusCode:412,revision:f});if(d&&"*"===d.ifNoneMatch&&f&&"rev"!==f)return Promise.resolve({statusCode:412,revision:f});if(!c.match(/charset=/)&&(b instanceof ArrayBuffer||l.WireClient.isArrayBufferView(b))&&(c+="; charset=binary"),b.length>157286400)return Promise.reject(new Error("Cannot upload file larger than 150MB"));var g,h=d&&(d.ifMatch||"*"===d.ifNoneMatch),i={body:b,contentType:c,path:a};return g=h?this._getMetadata(a).then(function(a){return d&&"*"===d.ifNoneMatch&&a?Promise.resolve({statusCode:412,revision:a.rev}):d&&d.ifMatch&&a&&a.rev!==d.ifMatch?Promise.resolve({statusCode:412,revision:a.rev}):e._uploadSimple(i)}):e._uploadSimple(i),g.then(function(b){return e._shareIfNeeded(a),b})},delete:function(a,b){var c=this;if(!this.connected)throw new Error("not connected (path: "+a+")");var d=this._revCache.get(a);return b&&b.ifMatch&&d&&b.ifMatch!==d?Promise.resolve({statusCode:412,revision:d}):b&&b.ifMatch?this._getMetadata(a).then(function(d){return b&&b.ifMatch&&d&&d.rev!==b.ifMatch?Promise.resolve({statusCode:412,revision:d.rev}):c._deleteSimple(a)}):c._deleteSimple(a)},_shareIfNeeded:function(a){a.match(/^\/public\/.*[^\/]$/)&&void 0===this._itemRefs[a]&&this.share(a)},share:function(a){var b=this,c="https://api.dropbox.com/1/media/auto"+q(a);return this._request("POST",c,{}).then(function(d){if(200!==d.status)return Promise.reject(new Error('Invalid Dropbox API response status when sharing "'+a+'":'+d.status));try{d=JSON.parse(d.responseText)}catch(b){return Promise.reject(new Error('Invalid Dropbox API response when sharing "'+a+'": '+d.responseText))}return b._itemRefs[a]=d.url,k&&(localStorage[n+":shares"]=JSON.stringify(b._itemRefs)),Promise.resolve(c)},function(b){return err.message='Sharing dropbox file or folder ("'+a+'") failed.'+err.message,Promise.reject(b)})},info:function(){var a="https://api.dropbox.com/1/account/info";return this._request("GET",a,{}).then(function(a){try{var b=JSON.parse(a.responseText);return Promise.resolve(b)}catch(a){return Promise.reject(a)}})},_request:function(b,c,d){var e=this;return d.headers||(d.headers={}),d.headers.Authorization="Bearer "+this.token,this._emit("wire-busy",{method:b,isFolder:p(c)}),l.WireClient.request.call(this,b,c,d).then(function(f){return f&&503===f.status?(e.online&&(e.online=!1,e.rs._emit("network-offline")),a.setTimeout(e._request(b,c,d),3210)):(e.online||(e.online=!0,e.rs._emit("network-online")),e._emit("wire-done",{method:b,isFolder:p(c),success:!0}),Promise.resolve(f))},function(a){return e.online&&(e.online=!1,e.rs._emit("network-offline")),e._emit("wire-done",{method:b,isFolder:p(c),success:!1}),Promise.reject(a)})},fetchDelta:function(){var a=Array.prototype.slice.call(arguments),c=this,d={path_prefix:o};return c._deltaCursor&&(d.cursor=c._deltaCursor),c._request("POST","https://api.dropbox.com/1/delta",{body:r(d),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then(function(d){if(200!==d.status)return 400===d.status?(c.rs._emit("error",new RemoteStorage.Unauthorized),Promise.resolve(a)):Promise.reject("dropbox.fetchDelta returned "+d.status+d.responseText);var e;try{e=JSON.parse(d.responseText)}catch(a){return l.log("fetchDeltas can not parse response",a),Promise.reject("can not parse response of fetchDelta : "+a.message)}return e.entries?(e.reset&&(c._revCache=new b("rev")),e.cursor&&(c._deltaCursor=e.cursor),e.entries.forEach(function(a){var b,d=a[0].substr(o.length);if(a[1]){if(a[1].is_dir)return;b=a[1].rev}else b=null;c._revCache.set(d,b)}),Promise.resolve(a)):Promise.reject("dropbox.fetchDeltas failed, no entries found")},function(b){return this.rs.log("fetchDeltas",b),this.rs._emit("error",new RemoteStorage.SyncError("fetchDeltas failed."+b)),Promise.resolve(a)}.bind(this)).then(function(){if(c._revCache){var a=Array.prototype.slice.call(arguments);return c._revCache._activatePropagation(),Promise.resolve(a)}})},_getMetadata:function(a,b){var c=this,d=this._metadataCache[a],e="https://api.dropbox.com/1/metadata/auto"+q(a);return e+="?list="+(b&&b.list?"true":"false"),d&&d.hash&&(e+="&hash="+encodeURIComponent(d.hash)),this._request("GET",e,{}).then(function(b){if(304===b.status)return Promise.resolve(d);if(200===b.status){var e=JSON.parse(b.responseText);return c._metadataCache[a]=e,Promise.resolve(e)}return Promise.resolve()})},_uploadSimple:function(a){var b=this,c="https://api-content.dropbox.com/1/files_put/auto"+q(a.path)+"?";return a&&a.ifMatch&&(c+="parent_rev="+encodeURIComponent(a.ifMatch)),b._request("PUT",c,{body:a.body,headers:{"Content-Type":a.contentType}}).then(function(c){if(200!==c.status)return Promise.resolve({statusCode:c.status});var d;try{d=JSON.parse(c.responseText)}catch(a){return Promise.reject(a)}if(d.path!==q(a.path)){var e="https://api.dropbox.com/1/fileops/delete?root=auto&path="+encodeURIComponent(d.path);return b._request("POST",e,{}),b._getMetadata(a.path).then(function(a){return Promise.resolve({statusCode:412,revision:a.rev})})}return b._revCache.propagateSet(a.path,d.rev),Promise.resolve({statusCode:c.status})})},_deleteSimple:function(a){var b=this,c="https://api.dropbox.com/1/fileops/delete?root=auto&path="+encodeURIComponent(q(a));return b._request("POST",c,{}).then(function(c){return 406===c.status?Promise.reject(new Error("Cannot delete '"+a+"': too many files involved")):((200===c.status||404===c.status)&&(b._revCache.delete(a),delete b._itemRefs[a]),Promise.resolve({statusCode:c.status}))})}},l.Dropbox._rs_init=function(a){k=RemoteStorage.util.localStorageAvailable(),a.apiKeys.dropbox&&(a.dropbox=new l.Dropbox(a)),"dropbox"===a.backend&&i(a)},l.Dropbox._rs_supported=function(){return!0},l.Dropbox._rs_cleanup=function(a){j(a),k&&delete localStorage[n],a.removeEventListener("error",s),a.setBackend(void 0)}}(this),remoteStorage=new RemoteStorage,!function(){"use strict";function a(b,c,d){return("string"==typeof c?c:c.toString()).replace(b.define||f,function(a,c,e,f){return 0===c.indexOf("def.")&&(c=c.substring(4)),c in d||(":"===e?(b.defineParams&&f.replace(b.defineParams,function(a,b,e){d[c]={arg:b,text:e}}),c in d||(d[c]=f)):new Function("def","def['"+c+"']="+f)(d)),""}).replace(b.use||f,function(c,e){b.useParams&&(e=e.replace(b.useParams,function(a,b,c,e){if(d[c]&&d[c].arg&&e){var f=(c+":"+e).replace(/'|\\/g,"_");return d.__exp=d.__exp||{},d.__exp[f]=d[c].text.replace(new RegExp("(^|[^\\w$])"+d[c].arg+"([^\\w$])","g"),"$1"+e+"$2"),b+"def.__exp['"+f+"']"}}));var f=new Function("def","return "+e)(d);return f?a(b,f,d):f})}function b(a){return a.replace(/\\('|\\)/g,"$1").replace(/[\r\t\n]/g," ")}var c,d={version:"1.1.1",templateSettings:{evaluate:/\{\{([\s\S]+?(\}?)+)\}\}/g,interpolate:/\{\{=([\s\S]+?)\}\}/g,encode:/\{\{!([\s\S]+?)\}\}/g,use:/\{\{#([\s\S]+?)\}\}/g,useParams:/(^|[^\w$])def(?:\.|\[[\'\"])([\w$\.]+)(?:[\'\"]\])?\s*\:\s*([\w$\.]+|\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})/g,define:/\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g,defineParams:/^\s*([\w$]+):([\s\S]+)/,conditional:/\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g,iterate:/\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/g,varname:"it",strip:!0,append:!0,selfcontained:!1,doNotSkipEncoded:!1},template:void 0,compile:void 0,log:!0};d.encodeHTMLSource=function(a){var b={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},c=a?/[&<>"'\/]/g:/&(?!#?\w+;)|<|>|"|'|\//g;return function(a){return a?a.toString().replace(c,function(a){return b[a]||a}):""}},c=function(){return this||(0,eval)("this")}(),"undefined"!=typeof module&&module.exports?module.exports=d:"function"==typeof define&&define.amd?define(function(){return d}):c.doT=d;var e={append:{start:"'+(",end:")+'",startencode:"'+encodeHTML("},split:{start:"';out+=(",end:");out+='",startencode:"';out+=encodeHTML("}},f=/$^/;d.template=function(g,h,i){h=h||d.templateSettings;var j,k,l=h.append?e.append:e.split,m=0,n=h.use||h.define?a(h,g,i||{}):g;n=("var out='"+(h.strip?n.replace(/(^|\r|\n)\t* +| +\t*(\r|\n|$)/g," ").replace(/\r|\n|\t|\/\*[\s\S]*?\*\//g,""):n).replace(/'|\\/g,"\\$&").replace(h.interpolate||f,function(a,c){return l.start+b(c)+l.end}).replace(h.encode||f,function(a,c){return j=!0,l.startencode+b(c)+l.end}).replace(h.conditional||f,function(a,c,d){return c?d?"';}else if("+b(d)+"){out+='":"';}else{out+='":d?"';if("+b(d)+"){out+='":"';}out+='"}).replace(h.iterate||f,function(a,c,d,e){return c?(m+=1,k=e||"i"+m,c=b(c),"';var arr"+m+"="+c+";if(arr"+m+"){var "+d+","+k+"=-1,l"+m+"=arr"+m+".length-1;while("+k+"0?c[0]:null,g=e.call(f,b);"function"==typeof g&&(c.hasAttribute("[no-ctl-cache]")||(pageHandlers[a]=g),g.call(f,b))}currentPageName&&(d!==!0&&document.body.classList.remove(currentPageName),$currentPage&&(document.dispatchEvent(new CustomEvent("page.hidden",{currentPage:currentPageName})),$currentPage.hasAttribute("[no-ctl-cache]")&&($currentPage.innerHTML=null))),oldPageName=currentPageName,document.body.classList.add(currentPageName=a),($currentPage=c)&&document.dispatchEvent(new CustomEvent("page.shown",{detail:{currentPage:currentPageName,title:c.getAttribute("title")}}))}function app(a,b){var c=document.body.querySelector("section#"+a);c||console.error("page"+a+" is not declared has a section");var d=c.getAttribute("src");d&&!c.hasChildNodes()?app.get(d,c,a,b):show(a,b)}function onhashchange(){var a=location.hash||"#"+document.querySelector("section[default]").getAttribute("id"),b=/#([-0-9A-Za-z]+)(\:(.+))?/,c=b.exec(a);a=c[1];var d=c[3];app(a,d)}var pageHandlers={},currentPageName=null,oldPageName=null,$currentPage=null;app.back=function(a){app(oldPageName,a)},app.page=function(a,b){pageHandlers[a]=b},app.get=function(src,$page,pageName,param,modal){var request=new XMLHttpRequest;request.open("GET",src,!0),request.onload=function(){request.status>=200&&request.status<400?($page.innerHTML=request.responseText,$script=$page.querySelector("script"),$script&&eval($script.text),show(pageName,param,modal)):console.warn("failed to get %s page!",pageName)},request.onerror=function(){console.warn("failed to get %s page!",pageName)},request.send()},window.addEventListener("hashchange",onhashchange),window.app=app}(this); \ No newline at end of file +});var e={};if(!a.downloadUrl){if(!a.exportLinks||!a.exportLinks["text/html"])return Promise.resolve({statusCode:200,body:"",contentType:a.mimeType,revision:d});a.mimeType+=";export=text/html",a.downloadUrl=a.exportLinks["text/html"]}return a.mimeType.match(/charset=binary/)&&(e.responseType="blob"),c._request("GET",a.downloadUrl,e).then(function(b){var c=b.response;if(a.mimeType.match(/^application\/json/))try{c=JSON.parse(c)}catch(a){}return Promise.resolve({statusCode:200,body:c,contentType:a.mimeType,revision:d})})})})},_getFolder:function(a,b){var c=this;return c._getFileId(a).then(function(b){var d,e,g,h,k;return b?(d="'"+b+"' in parents",e="items(downloadUrl,etag,fileSize,id,mimeType,title)",c._request("GET",f+"/drive/v2/files?q="+encodeURIComponent(d)+"&fields="+encodeURIComponent(e)+"&maxResults=1000",{}).then(function(b){if(200!==b.status)return Promise.reject("request failed or something: "+b.status);try{g=JSON.parse(b.responseText)}catch(a){return Promise.reject("non-JSON response from GoogleDrive")}k={};for(var d=0,e=g.items.length;e>d;d++)h=g.items[d].etag.substring(1,g.items[d].etag.length-1),g.items[d].mimeType===i?(c._fileIdCache.set(a+g.items[d].title+"/",g.items[d].id),k[g.items[d].title+"/"]={ETag:h}):(c._fileIdCache.set(a+g.items[d].title,g.items[d].id),k[g.items[d].title]={ETag:h,"Content-Type":g.items[d].mimeType,"Content-Length":g.items[d].fileSize});return Promise.resolve({statusCode:200,body:k,contentType:j,revision:void 0})})):Promise.resolve({statusCode:404})})},_getParentId:function(a){var b=c(a),d=this;return d._getFileId(b).then(function(a){return a?Promise.resolve(a):d._createFolder(b)})},_createFolder:function(a){var c=this;return c._getParentId(a).then(function(e){return c._request("POST",f+"/drive/v2/files",{body:JSON.stringify({title:b(d(a)),mimeType:i,parents:[{id:e}]}),headers:{"Content-Type":"application/json; charset=UTF-8"}}).then(function(a){var b=JSON.parse(a.responseText);return Promise.resolve(b.id)})})},_getFileId:function(a){var b,d=this;return"/"===a?Promise.resolve("root"):(b=this._fileIdCache.get(a))?Promise.resolve(b):d._getFolder(c(a)).then(function(){return b=d._fileIdCache.get(a),b?Promise.resolve(b):"/"===a.substr(-1)?d._createFolder(a).then(function(){return d._getFileId(a)}):Promise.resolve()})},_getMeta:function(a){return this._request("GET",f+"/drive/v2/files/"+a,{}).then(function(b){return 200===b.status?Promise.resolve(JSON.parse(b.responseText)):Promise.reject("request (getting metadata for "+a+") failed with status: "+b.status)})},_request:function(a,b,c){var d=this;return c.headers||(c.headers={}),c.headers.Authorization="Bearer "+d.token,this._emit("wire-busy",{method:a,isFolder:k(b)}),e.WireClient.request.call(this,a,b,c).then(function(c){return c&&401===c.status?void d.connect():(d.online||(d.online=!0,d.rs._emit("network-online")),d._emit("wire-done",{method:a,isFolder:k(b),success:!0}),Promise.resolve(c))},function(c){return d.online&&(d.online=!1,d.rs._emit("network-offline")),d._emit("wire-done",{method:a,isFolder:k(b),success:!1}),Promise.reject(c)})}},e.GoogleDrive._rs_init=function(a){var b=a.apiKeys.googledrive;b&&(a.googledrive=new e.GoogleDrive(a,b.clientId),"googledrive"===a.backend&&(a._origRemote=a.remote,a.remote=a.googledrive))},e.GoogleDrive._rs_supported=function(a){return!0},e.GoogleDrive._rs_cleanup=function(a){a.setBackend(void 0),a._origRemote&&(a.remote=a._origRemote,delete a._origRemote)}}(this),function(a){function b(a){this.defaultValue=a,this._storage={},this.set=this.justSet,this.delete=this.justDelete}function c(a){a._dropboxOrigSync||(a._dropboxOrigSync=a.sync.sync.bind(a.sync),a.sync.sync=function(){return this.dropbox.fetchDelta.apply(this.dropbox,arguments).then(a._dropboxOrigSync,function(b){return a._emit("error",new RemoteStorage.SyncError(b)),Promise.reject(b)})}.bind(a))}function d(a){a._dropboxOrigSync&&(a.sync.sync=a._dropboxOrigSync,delete a._dropboxOrigSync)}function e(a){a._origBaseClientGetItemURL||(a._origBaseClientGetItemURL=l.BaseClient.prototype.getItemURL,l.BaseClient.prototype.getItemURL=function(b){var c=a.dropbox._itemRefs[b];return c?c:""})}function f(a){a._origBaseClientGetItemURL&&(l.BaseClient.prototype.getItemURL=a._origBaseClientGetItemURL,delete a._origBaseClientGetItemURL)}function g(a){a._origRemote||(a._origRemote=a.remote,a.remote=a.dropbox)}function h(a){a._origRemote&&(a.remote=a._origRemote,delete a._origRemote)}function i(a){g(a),a.sync?c(a):a.on("connected",function(){a.sync&&c(a)}),e(a)}function j(a){h(a),d(a),f(a)}var k,l=RemoteStorage,m="https://www.dropbox.com/1/oauth2/authorize",n="remotestorage:dropbox",o="/remotestorage",p=RemoteStorage.util.isFolder,q=function(a){return l.WireClient.cleanPath(o+"/"+a)},r=function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));return b.join("&")};b.prototype={get:function(a){a=a.toLowerCase();var b=this._storage[a];return"undefined"==typeof b&&(b=this.defaultValue,this._storage[a]=b),b},propagateSet:function(a,b){return a=a.toLowerCase(),this._storage[a]===b?b:(this._propagate(a,b),this._storage[a]=b,b)},propagateDelete:function(a){return a=a.toLowerCase(),this._propagate(a,this._storage[a]),delete this._storage[a]},_activatePropagation:function(){return this.set=this.propagateSet,this.delete=this.propagateDelete,!0},justSet:function(a,b){return a=a.toLowerCase(),this._storage[a]=b,b},justDelete:function(a,b){return a=a.toLowerCase(),delete this._storage[a]},_propagate:function(a,b){for(var c=a.split("/").slice(0,-1),d="",e=0,f=c.length;f>e;e++)d+=c[e]+"/",b||(b=this._storage[d]+1),this._storage[d]=b}};var s;l.Dropbox=function(a){this.rs=a,this.connected=!1,this.rs=a;var c=this;if(s=function(a){a instanceof RemoteStorage.Unauthorized&&c.configure({userAddress:null,href:null,storageApi:null,token:null,options:null})},l.eventHandling(this,"change","connected","wire-busy","wire-done","not-connected"),a.on("error",s),this.clientId=a.apiKeys.dropbox.appKey,this._revCache=new b("rev"),this._itemRefs={},this._metadataCache={},k){var d;try{d=JSON.parse(localStorage[n])}catch(a){}d&&this.configure(d);try{this._itemRefs=JSON.parse(localStorage[n+":shares"])}catch(a){}}this.connected&&setTimeout(this._emit.bind(this),0,"connected")},l.Dropbox.prototype={online:!0,connect:function(){this.rs.setBackend("dropbox"),this.token?i(this.rs):l.Authorize(this.rs,m,"",String(l.Authorize.getLocation()),this.clientId)},configure:function(a){"undefined"!=typeof a.userAddress&&(this.userAddress=a.userAddress),"undefined"!=typeof a.token&&(this.token=a.token),this.token?(this.connected=!0,this.userAddress||this.info().then(function(a){this.userAddress=a.display_name,this.rs.widget.view.setUserAddress(this.userAddress),this._emit("connected")}.bind(this))):this.connected=!1,k&&(localStorage[n]=JSON.stringify({userAddress:this.userAddress,token:this.token}))},stopWaitingForToken:function(){this.connected||this._emit("not-connected")},_getFolder:function(a,b){var c="https://api.dropbox.com/1/metadata/auto"+q(a),d=this._revCache,e=this;return this._request("GET",c,{}).then(function(b){var c=b.status;if(304===c)return Promise.resolve({statusCode:c});var f,g,h,i;try{g=JSON.parse(b.responseText)}catch(a){return Promise.reject(a)}return i=e._revCache.get(a),h="application/json; charset=UTF-8",g.contents&&(f=g.contents.reduce(function(b,c){var e=c.path.split("/").slice(-1)[0]+(c.is_dir?"/":"");return c.is_dir?b[e]={ETag:d.get(a+e)}:b[e]={ETag:c.rev},b},{})),Promise.resolve({statusCode:c,body:f,contentType:h,revision:i})})},get:function(a,b){if(!this.connected)return Promise.reject("not connected (path: "+a+")");var c="https://api-content.dropbox.com/1/files/auto"+q(a),d=this,e=this._revCache.get(a);return null===e?Promise.resolve({statusCode:404}):b&&b.ifNoneMatch&&e&&e===b.ifNoneMatch?Promise.resolve({statusCode:304}):"/"===a.substr(-1)?this._getFolder(a,b):this._request("GET",c,{}).then(function(b){var c,e,f,g,h=b.status;if(200!==h)return Promise.resolve({statusCode:h});e=b.responseText;try{c=JSON.parse(b.getResponseHeader("x-dropbox-metadata"))}catch(a){return Promise.reject(a)}if(f=c.mime_type,g=c.rev,d._revCache.set(a,g),d._shareIfNeeded(a),!b.getResponseHeader("Content-Type")||b.getResponseHeader("Content-Type").match(/charset=binary/)){var i=Promise.defer();return l.WireClient.readBinaryData(b.response,f,function(a){i.resolve({statusCode:h,body:a,contentType:f,revision:g})}),i.promise}if(f&&f.search("application/json")>=0,!0)try{e=JSON.parse(e),f="application/json; charset=UTF-8"}catch(a){}return Promise.resolve({statusCode:h,body:e,contentType:f,revision:g})})},put:function(a,b,c,d){var e=this;if(!this.connected)throw new Error("not connected (path: "+a+")");var f=this._revCache.get(a);if(d&&d.ifMatch&&f&&f!==d.ifMatch)return Promise.resolve({statusCode:412,revision:f});if(d&&"*"===d.ifNoneMatch&&f&&"rev"!==f)return Promise.resolve({statusCode:412,revision:f});if(!c.match(/charset=/)&&(b instanceof ArrayBuffer||l.WireClient.isArrayBufferView(b))&&(c+="; charset=binary"),b.length>157286400)return Promise.reject(new Error("Cannot upload file larger than 150MB"));var g,h=d&&(d.ifMatch||"*"===d.ifNoneMatch),i={body:b,contentType:c,path:a};return g=h?this._getMetadata(a).then(function(a){return d&&"*"===d.ifNoneMatch&&a?Promise.resolve({statusCode:412,revision:a.rev}):d&&d.ifMatch&&a&&a.rev!==d.ifMatch?Promise.resolve({statusCode:412,revision:a.rev}):e._uploadSimple(i)}):e._uploadSimple(i),g.then(function(b){return e._shareIfNeeded(a),b})},delete:function(a,b){var c=this;if(!this.connected)throw new Error("not connected (path: "+a+")");var d=this._revCache.get(a);return b&&b.ifMatch&&d&&b.ifMatch!==d?Promise.resolve({statusCode:412,revision:d}):b&&b.ifMatch?this._getMetadata(a).then(function(d){return b&&b.ifMatch&&d&&d.rev!==b.ifMatch?Promise.resolve({statusCode:412,revision:d.rev}):c._deleteSimple(a)}):c._deleteSimple(a)},_shareIfNeeded:function(a){a.match(/^\/public\/.*[^\/]$/)&&void 0===this._itemRefs[a]&&this.share(a)},share:function(a){var b=this,c="https://api.dropbox.com/1/media/auto"+q(a);return this._request("POST",c,{}).then(function(d){if(200!==d.status)return Promise.reject(new Error('Invalid Dropbox API response status when sharing "'+a+'":'+d.status));try{d=JSON.parse(d.responseText)}catch(b){return Promise.reject(new Error('Invalid Dropbox API response when sharing "'+a+'": '+d.responseText))}return b._itemRefs[a]=d.url,k&&(localStorage[n+":shares"]=JSON.stringify(b._itemRefs)),Promise.resolve(c)},function(b){return err.message='Sharing dropbox file or folder ("'+a+'") failed.'+err.message,Promise.reject(b)})},info:function(){var a="https://api.dropbox.com/1/account/info";return this._request("GET",a,{}).then(function(a){try{var b=JSON.parse(a.responseText);return Promise.resolve(b)}catch(a){return Promise.reject(a)}})},_request:function(b,c,d){var e=this;return d.headers||(d.headers={}),d.headers.Authorization="Bearer "+this.token,this._emit("wire-busy",{method:b,isFolder:p(c)}),l.WireClient.request.call(this,b,c,d).then(function(f){return f&&503===f.status?(e.online&&(e.online=!1,e.rs._emit("network-offline")),a.setTimeout(e._request(b,c,d),3210)):(e.online||(e.online=!0,e.rs._emit("network-online")),e._emit("wire-done",{method:b,isFolder:p(c),success:!0}),Promise.resolve(f))},function(a){return e.online&&(e.online=!1,e.rs._emit("network-offline")),e._emit("wire-done",{method:b,isFolder:p(c),success:!1}),Promise.reject(a)})},fetchDelta:function(){var a=Array.prototype.slice.call(arguments),c=this,d={path_prefix:o};return c._deltaCursor&&(d.cursor=c._deltaCursor),c._request("POST","https://api.dropbox.com/1/delta",{body:r(d),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then(function(d){if(200!==d.status)return 400===d.status?(c.rs._emit("error",new RemoteStorage.Unauthorized),Promise.resolve(a)):Promise.reject("dropbox.fetchDelta returned "+d.status+d.responseText);var e;try{e=JSON.parse(d.responseText)}catch(a){return l.log("fetchDeltas can not parse response",a),Promise.reject("can not parse response of fetchDelta : "+a.message)}return e.entries?(e.reset&&(c._revCache=new b("rev")),e.cursor&&(c._deltaCursor=e.cursor),e.entries.forEach(function(a){var b,d=a[0].substr(o.length);if(a[1]){if(a[1].is_dir)return;b=a[1].rev}else b=null;c._revCache.set(d,b)}),Promise.resolve(a)):Promise.reject("dropbox.fetchDeltas failed, no entries found")},function(b){return this.rs.log("fetchDeltas",b),this.rs._emit("error",new RemoteStorage.SyncError("fetchDeltas failed."+b)),Promise.resolve(a)}.bind(this)).then(function(){if(c._revCache){var a=Array.prototype.slice.call(arguments);return c._revCache._activatePropagation(),Promise.resolve(a)}})},_getMetadata:function(a,b){var c=this,d=this._metadataCache[a],e="https://api.dropbox.com/1/metadata/auto"+q(a);return e+="?list="+(b&&b.list?"true":"false"),d&&d.hash&&(e+="&hash="+encodeURIComponent(d.hash)),this._request("GET",e,{}).then(function(b){if(304===b.status)return Promise.resolve(d);if(200===b.status){var e=JSON.parse(b.responseText);return c._metadataCache[a]=e,Promise.resolve(e)}return Promise.resolve()})},_uploadSimple:function(a){var b=this,c="https://api-content.dropbox.com/1/files_put/auto"+q(a.path)+"?";return a&&a.ifMatch&&(c+="parent_rev="+encodeURIComponent(a.ifMatch)),b._request("PUT",c,{body:a.body,headers:{"Content-Type":a.contentType}}).then(function(c){if(200!==c.status)return Promise.resolve({statusCode:c.status});var d;try{d=JSON.parse(c.responseText)}catch(a){return Promise.reject(a)}if(d.path!==q(a.path)){var e="https://api.dropbox.com/1/fileops/delete?root=auto&path="+encodeURIComponent(d.path);return b._request("POST",e,{}),b._getMetadata(a.path).then(function(a){return Promise.resolve({statusCode:412,revision:a.rev})})}return b._revCache.propagateSet(a.path,d.rev),Promise.resolve({statusCode:c.status})})},_deleteSimple:function(a){var b=this,c="https://api.dropbox.com/1/fileops/delete?root=auto&path="+encodeURIComponent(q(a));return b._request("POST",c,{}).then(function(c){return 406===c.status?Promise.reject(new Error("Cannot delete '"+a+"': too many files involved")):((200===c.status||404===c.status)&&(b._revCache.delete(a),delete b._itemRefs[a]),Promise.resolve({statusCode:c.status}))})}},l.Dropbox._rs_init=function(a){k=RemoteStorage.util.localStorageAvailable(),a.apiKeys.dropbox&&(a.dropbox=new l.Dropbox(a)),"dropbox"===a.backend&&i(a)},l.Dropbox._rs_supported=function(){return!0},l.Dropbox._rs_cleanup=function(a){j(a),k&&delete localStorage[n],a.removeEventListener("error",s),a.setBackend(void 0)}}(this),remoteStorage=new RemoteStorage,!function(){"use strict";function a(b,c,d){return("string"==typeof c?c:c.toString()).replace(b.define||f,function(a,c,e,f){return 0===c.indexOf("def.")&&(c=c.substring(4)),c in d||(":"===e?(b.defineParams&&f.replace(b.defineParams,function(a,b,e){d[c]={arg:b,text:e}}),c in d||(d[c]=f)):new Function("def","def['"+c+"']="+f)(d)),""}).replace(b.use||f,function(c,e){b.useParams&&(e=e.replace(b.useParams,function(a,b,c,e){if(d[c]&&d[c].arg&&e){var f=(c+":"+e).replace(/'|\\/g,"_");return d.__exp=d.__exp||{},d.__exp[f]=d[c].text.replace(new RegExp("(^|[^\\w$])"+d[c].arg+"([^\\w$])","g"),"$1"+e+"$2"),b+"def.__exp['"+f+"']"}}));var f=new Function("def","return "+e)(d);return f?a(b,f,d):f})}function b(a){return a.replace(/\\('|\\)/g,"$1").replace(/[\r\t\n]/g," ")}var c,d={version:"1.1.1",templateSettings:{evaluate:/\{\{([\s\S]+?(\}?)+)\}\}/g,interpolate:/\{\{=([\s\S]+?)\}\}/g,encode:/\{\{!([\s\S]+?)\}\}/g,use:/\{\{#([\s\S]+?)\}\}/g,useParams:/(^|[^\w$])def(?:\.|\[[\'\"])([\w$\.]+)(?:[\'\"]\])?\s*\:\s*([\w$\.]+|\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})/g,define:/\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g,defineParams:/^\s*([\w$]+):([\s\S]+)/,conditional:/\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g,iterate:/\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/g,varname:"it",strip:!0,append:!0,selfcontained:!1,doNotSkipEncoded:!1},template:void 0,compile:void 0,log:!0};d.encodeHTMLSource=function(a){var b={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"},c=a?/[&<>"'\/]/g:/&(?!#?\w+;)|<|>|"|'|\//g;return function(a){return a?a.toString().replace(c,function(a){return b[a]||a}):""}},c=function(){return this||(0,eval)("this")}(),"undefined"!=typeof module&&module.exports?module.exports=d:"function"==typeof define&&define.amd?define(function(){return d}):c.doT=d;var e={append:{start:"'+(",end:")+'",startencode:"'+encodeHTML("},split:{start:"';out+=(",end:");out+='",startencode:"';out+=encodeHTML("}},f=/$^/;d.template=function(g,h,i){h=h||d.templateSettings;var j,k,l=h.append?e.append:e.split,m=0,n=h.use||h.define?a(h,g,i||{}):g;n=("var out='"+(h.strip?n.replace(/(^|\r|\n)\t* +| +\t*(\r|\n|$)/g," ").replace(/\r|\n|\t|\/\*[\s\S]*?\*\//g,""):n).replace(/'|\\/g,"\\$&").replace(h.interpolate||f,function(a,c){return l.start+b(c)+l.end}).replace(h.encode||f,function(a,c){return j=!0,l.startencode+b(c)+l.end}).replace(h.conditional||f,function(a,c,d){return c?d?"';}else if("+b(d)+"){out+='":"';}else{out+='":d?"';if("+b(d)+"){out+='":"';}out+='"}).replace(h.iterate||f,function(a,c,d,e){return c?(m+=1,k=e||"i"+m,c=b(c),"';var arr"+m+"="+c+";if(arr"+m+"){var "+d+","+k+"=-1,l"+m+"=arr"+m+".length-1;while("+k+"0?c[0]:null,g=e.call(f,b);"function"==typeof g&&(c.hasAttribute("[no-ctl-cache]")||(pageHandlers[a]=g),g.call(f,b))}if(currentPageName&&(d!==!0&&document.body.classList.remove(currentPageName),$currentPage&&(document.dispatchEvent(new CustomEvent("page.hidden",{currentPage:currentPageName})),$currentPage.hasAttribute("[no-ctl-cache]")&&($currentPage.innerHTML=null))),oldPageName=currentPageName,document.body.classList.add(currentPageName=a),($currentPage=c)&&(document.dispatchEvent(new CustomEvent("page.shown",{detail:{currentPage:currentPageName,title:c.getAttribute("title")}})),!c.hasAttribute("default")&&!d)){var h="#"+currentPageName;b&&"object"!=typeof b&&(h+=":"+b),location.hash!==h&&history.pushState(null,null,h)}}function app(a,b){var c=document.body.querySelector("section#"+a);c||console.error("page"+a+" is not declared has a section");var d=c.getAttribute("src");d&&!c.hasChildNodes()?app.get(d,c,a,b):show(a,b)}function onhashchange(){var a=location.hash||"#"+document.querySelector("section[default]").getAttribute("id"),b=/#([-0-9A-Za-z]+)(\:(.+))?/,c=b.exec(a);a=c[1];var d=c[3];app(a,d)}var pageHandlers={},currentPageName=null,oldPageName=null,$currentPage=null;app.back=function(a){app(oldPageName,a)},app.page=function(a,b){pageHandlers[a]=b},app.get=function(src,$page,pageName,param,modal){var request=new XMLHttpRequest;request.open("GET",src,!0),request.onload=function(){request.status>=200&&request.status<400?($page.innerHTML=request.responseText,$script=$page.querySelector("script"),$script&&eval($script.text),show(pageName,param,modal)):console.warn("failed to get %s page!",pageName)},request.onerror=function(){console.warn("failed to get %s page!",pageName)},request.send()},window.addEventListener("hashchange",onhashchange),window.app=app}(this); \ No newline at end of file diff --git a/dist/styles/main.css b/dist/styles/main.css index 3e26c95..a928486 100644 --- a/dist/styles/main.css +++ b/dist/styles/main.css @@ -1 +1 @@ -#navigation,.alert-closebtn,.brand a{font-weight:700}.modal>div,select,textarea{box-sizing:border-box}.actions ul,.list,.result>ul,ol li,ul.topnav{list-style-type:none}body{margin:0;font-family:Verdana,sans-serif;font-size:14px}h1{font-size:1.1em}.remove-link,h2,h3{font-size:1em}a{text-decoration:none}body>section{margin:1em;display:none}.alert,section>div{width:50%;margin:auto}body.about>section#about,body.archive-details>section#archive-details,body.archive-list>section#archive-list,body.archive-save>section#archive-save,body.home>section#home,body.settings>section#settings,body.sync>section#sync,body.team-add>section#team-add,body.team-list-details>section#team-list-details,body.team-list>section#team-list,body.team-member-add>section#team-member-add,body.team-member-details>section#team-member-details,body.tool-build-teams>section#tool-build-teams,body.tool-find-members>section#tool-find-members,body.tool-match2>section#tool-match2,body.tool-match3>section#tool-match3,body.tool-match>section#tool-match,body.tool-next-member>section#tool-next-member{display:block}body.about #menu a[href="#about"],body.archive-details #menu a[href="#archive-list "],body.archive-list #menu a[href="#archive-list "],body.archive-save #menu a[href="#archive-list "],body.home #menu a[href="#home"],body.settings #menu a[href="#settings"],body.team-add #menu a[href="#team-list"],body.team-list #menu a[href="#team-list"],body.team-list-details #menu a[href="#team-list"],body.team-member-add #menu a[href="#team-list"],body.team-member-details #menu a[href="#team-list"]{background-color:#555}body>header{background-color:#04102A;color:#f2f2f2;top:0;width:100%}#navigation{background:#fff;color:#04102A;display:flex;align-items:center;padding:0 16px}header h2{display:inline-block}footer{position:absolute;right:0;bottom:0;left:0;padding:10px;background-color:#efefef;text-align:center}.remove-link{margin:0;color:#D9534F}.brand a,ul.topnav li a{color:#f2f2f2;text-decoration:none}body .brand{padding:14px 12px;text-align:left}.brand span{display:block}#archive-save .team-list{font-size:.7em;opacity:.7}select.spinner{background-image:url(loader.gif);background-repeat:no-repeat;background-position:5px 5px}ul.topnav{text-align:right;margin:0;padding:0;overflow:hidden;background-color:#04102A}ul.topnav li{display:inline}ul.topnav li a{display:inline-block;text-align:center;padding:14px 16px;transition:.3s}ul.topnav li a.selected,ul.topnav li a:hover{background-color:#555}ul.topnav li.icon{display:none}@media screen and (max-width:680px){ul.topnav{position:absolute;top:0}ul.topnav li{display:none}ul.topnav li.icon{display:inline-block}body .brand{padding:14px 0 14px 50px;text-align:left}.brand span{display:none}.alert,section>div{width:94%;margin:auto}#remotestorage-widget{right:8px!important;top:0!important;opacity:.8}#remotestorage-widget .rs-bubble-text{color:grey;display:none}#remotestorage-widget .rs-bubble{width:250px;top:25px!important}#remotestorage-widget .rs-hidden{background-color:inherit!important}ul.topnav.responsive{position:absolute;left:0;top:0;padding-right:30px}ul.topnav.responsive li.icon{position:absolute;right:0}ul.topnav.responsive li{float:none;display:inline}ul.topnav.responsive li a{display:block;text-align:left}}.link-home{color:#000;text-decoration:none;padding-right:12px}.modal{margin:0;display:none;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:#000;background-color:rgba(0,0,0,.4)}.modal:target,.modal>div{display:block}.modal>div{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:80%;margin:auto;background-color:#fff;padding:12px}.alert{display:none;border:1px solid #bce8f1;border-radius:4px}.alert-info{background-color:#d9edf7;color:#31708f}.alert-closebtn{margin:2px;text-decoration:none;float:right;font-size:1.2em;color:inherit}.alert-closebtn:hover{cursor:pointer;color:#000}.alert-msg{padding:16px}#tool-build-teams form,#tool-find-members form,#tool-match form,#tool-next-member form{border:1px solid #dbdbdb;border-radius:4px;padding:8px;box-shadow:1px 1px 0 #dbdbdb;background-color:#fff;margin-top:8px}.actions{margin-top:50px;margin-left:auto;margin-right:auto}.actions ul{padding:0}.actions a{display:block;margin-top:8px;padding:14px;font-weight:400;color:#337AB7;background-color:#fff;box-shadow:1px 1px 0 #dbdbdb;border-radius:5px;font-size:1.1em}.actions a:hover{background-color:#F5F5F5}#teams-result{border:1px solid #ddd;padding:8px}#tool-match .list li,#tool-next-member .list li{padding:0}#tool-match .list li label,#tool-next-member .list li label{display:block;padding:10px 16px}#tool-match .list li input,#tool-next-member .list li input{float:right}.danger-zone{padding:1em;margin:1em 0;border:1px dashed grey;text-align:center}.list{margin:0;padding:0;border:1px solid #ddd;background-color:#fff}.list li{padding:0;border-bottom:1px solid #ddd}.list li a{display:block;padding:10px 16px;text-decoration:none;color:#4078c0}.list li a:hover{background-color:#F5F5F5}.list li:last-child{border-bottom:none}ol{counter-reset:nbres}ol li{counter-increment:nbres;margin-bottom:10px;border-bottom:: 1px solid #ddd}ol li::before{content:counter(nbres);padding:0 20px 6px;margin-right:8px;vertical-align:top;background:#678;-moz-border-radius:60px;border-radius:60px;font-weight:700;font-size:.8em;color:#fff}.header-tbl,div.team h3{margin:0;padding:12px 0;border-bottom:0;font-weight:700}.team li{padding:10px 16px}div.team li:first-child{color:green}.header-tbl{text-align:right}section header{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;padding:0}.radio-group,select{display:inline-block}select{padding:7px;background-color:#fff;border:1px solid #D1D1D1;border-radius:4px;box-shadow:none;font-size:.9em}input[type=email],input[type=password],input[type=tel],input[type=text],input[type=url]{color:#5f5f5f;box-sizing:border-box;box-shadow:1px 2px 4px 0 rgba(0,0,0,.08);padding:8px;border:1px solid #dbdbdb}.btn-default,button,input[type=button],input[type=submit]{border-radius:2px;color:#fff;box-shadow:1px 2px 4px 0 rgba(0,0,0,.08)}.btn-danger{background-color:#D9534F}.btn-cancel{background-color:#8CB7C8}.btn-default{background-color:#337AB7;border:0}.btn-success{background-color:#5CB85C}button,input[type=button],input[type=submit]{display:inline-block;margin-top:12px;font-weight:700;padding:8px 12px;border:0}a.add-link{border-radius:2px;color:#fff;box-shadow:1px 2px 4px 0 rgba(0,0,0,.08);padding:6px 8px;border:0}button,input[type=button]:hover,input[type=submit]{cursor:pointer}.radio-group{margin:0;padding:7px;font-size:.9em}textarea{color:#5f5f5f;width:100%;height:80px;box-shadow:1px 2px 4px 0 rgba(0,0,0,.08);font:400 13px sans-serif;border:1px solid #dbdbdb;resize:vertical;display:block}@media screen and (max-width:680px){button,input[type=button],input[type=submit],input[type=text],select,textarea{width:100%}#team-list-details input,input[type=radio]{width:auto}.radio-group{display:block}.actions{width:100%}}.result>ul{padding:0;margin:0}.matches-left li,.matches-right li{padding:8px 12px;margin:2px 8px;color:#fff}.matches-left{float:left;width:50%}.matches-right{float:right;width:50%}.matches-left li{background:#8d8d8d}.matches-right li{background:#927373} \ No newline at end of file +#navigation,.alert-closebtn,.brand a{font-weight:700}.actions ul,.list,ol li,ul.topnav{list-style-type:none}.modal>div,select,textarea{box-sizing:border-box}body{margin:0;font-family:Verdana,sans-serif;font-size:14px}h1{font-size:1.1em}.remove-link,h2,h3{font-size:1em}a{text-decoration:none}body>section{margin:1em;display:none}.alert,section>div{width:50%;margin:auto}body.about>section#about,body.archive-details>section#archive-details,body.archive-list>section#archive-list,body.archive-save>section#archive-save,body.home>section#home,body.settings>section#settings,body.sync>section#sync,body.team-add>section#team-add,body.team-list-details>section#team-list-details,body.team-list>section#team-list,body.team-member-add>section#team-member-add,body.team-member-details>section#team-member-details,body.tool-build-teams>section#tool-build-teams,body.tool-find-members>section#tool-find-members,body.tool-match2>section#tool-match2,body.tool-match3>section#tool-match3,body.tool-match>section#tool-match,body.tool-next-member>section#tool-next-member{display:block}body.about #menu a[href="#about"],body.archive-details #menu a[href="#archive-list "],body.archive-list #menu a[href="#archive-list "],body.archive-save #menu a[href="#archive-list "],body.home #menu a[href="#home"],body.settings #menu a[href="#settings"],body.team-add #menu a[href="#team-list"],body.team-list #menu a[href="#team-list"],body.team-list-details #menu a[href="#team-list"],body.team-member-add #menu a[href="#team-list"],body.team-member-details #menu a[href="#team-list"]{background-color:#555}#components{display:none}body>header{background-color:#04102A;color:#f2f2f2;top:0;width:100%}#navigation{background:#fff;color:#04102A;display:flex;align-items:center;padding:0 16px}header h2{display:inline-block}footer{position:absolute;right:0;bottom:0;left:0;padding:10px;background-color:#efefef;text-align:center}.remove-link{margin:0;color:#D9534F}.brand a,ul.topnav li a{color:#f2f2f2;text-decoration:none}body .brand{padding:14px 12px;text-align:left}.brand span{display:block}#archive-save .team-list{font-size:.7em;opacity:.7}select.spinner{background-image:url(loader.gif);background-repeat:no-repeat;background-position:5px 5px}ul.topnav{text-align:right;margin:0;padding:0;overflow:hidden;background-color:#04102A}ul.topnav li{display:inline}ul.topnav li a{display:inline-block;text-align:center;padding:14px 16px;transition:.3s}ul.topnav li a.selected,ul.topnav li a:hover{background-color:#555}ul.topnav li.icon{display:none}@media screen and (max-width:680px){ul.topnav{position:absolute;top:0}ul.topnav li{display:none}ul.topnav li.icon{display:inline-block}body .brand{padding:14px 0 14px 50px;text-align:left}.brand span{display:none}.alert,section>div{width:94%;margin:auto}#remotestorage-widget{right:8px!important;top:0!important;opacity:.8}#remotestorage-widget .rs-bubble-text{color:grey;display:none}#remotestorage-widget .rs-bubble{width:250px;top:25px!important}#remotestorage-widget .rs-hidden{background-color:inherit!important}ul.topnav.responsive{position:absolute;left:0;top:0;padding-right:30px}ul.topnav.responsive li.icon{position:absolute;right:0}ul.topnav.responsive li{float:none;display:inline}ul.topnav.responsive li a{display:block;text-align:left}}.link-home{color:#000;text-decoration:none;padding-right:12px}.modal{margin:0;display:none;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:#000;background-color:rgba(0,0,0,.4)}.modal:target,.modal>div{display:block}.modal>div{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:80%;margin:auto;background-color:#fff;padding:12px}.alert{display:none;border:1px solid #bce8f1;border-radius:4px}.alert-info{background-color:#d9edf7;color:#31708f}.alert-closebtn{margin:2px;text-decoration:none;float:right;font-size:1.2em;color:inherit}.alert-closebtn:hover{cursor:pointer;color:#000}.alert-msg{padding:16px}#tool-build-teams form,#tool-find-members form,#tool-match form,#tool-next-member form{border:1px solid #dbdbdb;border-radius:4px;padding:8px;box-shadow:1px 1px 0 #dbdbdb;background-color:#fff;margin-top:8px}.actions{margin-top:50px;margin-left:auto;margin-right:auto}.actions ul{padding:0}.actions a{display:block;margin-top:8px;padding:14px;font-weight:400;color:#337AB7;background-color:#fff;box-shadow:1px 1px 0 #dbdbdb;border-radius:5px;font-size:1.1em}.actions a:hover{background-color:#F5F5F5}#teams-result{border:1px solid #ddd;padding:8px}.checklist li{padding:0}.checklist li label{display:block;padding:10px 16px}.checklist li input{float:right}.danger-zone{padding:1em;margin:1em 0;border:1px dashed grey;text-align:center}.list{margin:0;padding:0;border:1px solid #ddd;background-color:#fff}.list li{padding:0;border-bottom:1px solid #ddd}.list li a{display:block;padding:10px 16px;text-decoration:none;color:#4078c0}.list li a:hover{background-color:#F5F5F5}.list li:last-child{border-bottom:none}ol{counter-reset:nbres}ol li{counter-increment:nbres;margin-bottom:10px;border-bottom:: 1px solid #ddd}ol li::before{content:counter(nbres);padding:0 20px 6px;margin-right:8px;vertical-align:top;background:#678;-moz-border-radius:60px;border-radius:60px;font-weight:700;font-size:.8em;color:#fff}.header-tbl,div.team h3{margin:0;padding:12px 0;border-bottom:0;font-weight:700}.team li{padding:10px 16px}div.team li:first-child{color:green}.header-tbl{text-align:right}section header{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;padding:0}.radio-group,select{display:inline-block}select{padding:7px;background-color:#fff;border:1px solid #D1D1D1;border-radius:4px;box-shadow:none;font-size:.9em}input[type=email],input[type=password],input[type=tel],input[type=text],input[type=url]{color:#5f5f5f;box-sizing:border-box;box-shadow:1px 2px 4px 0 rgba(0,0,0,.08);padding:8px;border:1px solid #dbdbdb}.btn-default,button,input[type=button],input[type=submit]{border-radius:2px;color:#fff;box-shadow:1px 2px 4px 0 rgba(0,0,0,.08)}.btn-danger{background-color:#D9534F}.btn-cancel{background-color:#8CB7C8}.btn-default{background-color:#337AB7;border:0}.btn-success{background-color:#5CB85C}button,input[type=button],input[type=submit]{display:inline-block;margin-top:12px;font-weight:700;padding:8px 12px;border:0}a.add-link{border-radius:2px;color:#fff;box-shadow:1px 2px 4px 0 rgba(0,0,0,.08);padding:6px 8px;border:0}button,input[type=button]:hover,input[type=submit]{cursor:pointer}.radio-group{margin:0;padding:7px;font-size:.9em}textarea{color:#5f5f5f;width:100%;height:80px;box-shadow:1px 2px 4px 0 rgba(0,0,0,.08);font:400 13px sans-serif;border:1px solid #dbdbdb;resize:vertical;display:block}@media screen and (max-width:680px){button,input[type=button],input[type=submit],input[type=text],select,textarea{width:100%}#team-list-details input,input[type=radio]{width:auto}.radio-group{display:block}.actions{width:100%}} \ No newline at end of file