forked from axiom-team/astrXbian
14 lines
1.2 MiB
14 lines
1.2 MiB
/* minified */
|
||
function e(e,n){"use strict";var t=this;n&&n.length?_.forEach(n,(function(n){t[n]=e[n]})):["currency","issuer","medianTime","number","version","powMin","dividend","membersCount","hash","identities","joiners","actives","leavers","revoked","excluded","certifications","transactions"].forEach((function(n){t[n]=e[n]})),t.identitiesCount=t.identities?t.identities.length:0,t.joinersCount=t.joiners?t.joiners.length:0,t.activesCount=t.actives?t.actives.length:0,t.leaversCount=t.leavers?t.leavers.length:0,t.revokedCount=t.revoked?t.revoked.length:0,t.excludedCount=t.excluded?t.excluded.length:0,t.certificationsCount=t.certifications?t.certifications.length:0,t.transactionsCount=t.transactions?t.transactions.length:0,t.empty=t.isEmpty()}function n(e,n){e.extensionPoint=n.extensions.points.current.get()}function t(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f,h){e.walletData=p.data,e.search={},e.login=p.isLogin(),e.motion=d.motion.default,e.fullscreen=d.screen.fullscreen.isEnabled(),e.showHome=function(){return s.nextViewOptions({historyRoot:!0}),t.go("app.home").then(d.loading.hide)},e.createHelptipScope=function(t,a){if(t||!n.tour&&n.settings.helptip.enable&&!d.screen.isSmall()){a=a||"HelpTipCtrl";var i=e.$new();return r(a,{$scope:i}),i}},e.startHelpTour=function(t,a){if(t&&t.defaultPrevented)return!1;if(n.tour=!0,!a)return s.clearHistory(),s.clearCache().then((function(){e.startHelpTour(null,!0)}));var i=e.createHelptipScope(!0);return i.startHelpTour().then((function(){i.$destroy(),delete n.tour})).catch((function(e){delete n.tour}))},e.disableHelpTour=function(e){e&&(e.preventDefault(),e.stopPropagation()),g.data.helptip&&g.data.helptip.enable&&(n.settings.helptip.enable=!1,g.store())},e.isLogin=function(){return e.login},e.loadWalletData=function(e){return e=e||{},p.loadData(e).then((function(e){if(!e)throw"CANCELLED";return e}))},e.loadWallet=function(n){return c.isStarted()?(n=n||{},p.isLogin()?p.data.loaded?i.when(p.data):p.loadData(n):e.showLoginModal(n).then((function(e){if(e)return n&&n.minData&&(n.minData=!1),p.loadData(n)})).then((function(e){if(e)return e;throw"CANCELLED"}))):c.ready().then((function(){return e.loadWallet(n)}))},e.loginAndGo=function(n,a){if(e.closeProfilePopover(),n=n||"app.view_wallet",p.isLogin())return t.go(n,a);if(f.httpsMode&&l.location&&"https:"!==l.location.protocol){var i=l.location.href,o=i.indexOf("#"),s=-1!==o?i.substr(0,o):i;if(i=(s="https"+s.substr(4))+t.href(n),!f.httpsModeDebug)return void(l.location.href=i);console.debug("[httpsMode] --- Should redirect to: "+i)}return e.showLoginModal().then((function(e){if(e)return t.go(n,a).then(d.loading.hide)}))},e.showLoginModal=function(t){return(t=t||{}).templateUrl=t.templateUrl||f.login&&f.login.templateUrl,t.controller=t.controller||f.login&&f.login.controller,E.showLogin(t).then((function(e){if(e)return g.data.rememberMe!==e.rememberMe&&(g.data.rememberMe=e.rememberMe,g.data.useLocalStorage=!!g.data.rememberMe||g.data.useLocalStorage,g.store()),p.login(e.username,e.password)})).then((function(e){return e&&(n.walletData=e),e})).catch((function(n){if("RETRY"===n)return d.loading.hide(),e.showLoginModal(t);d.onError("ERROR.CRYPTO_UNKNOWN_ERROR")(n)}))},e.logout=function(n){return!(n=n||{}).force&&e.profilePopover?e.profilePopover.hide().then((function(){return n.force=!0,e.logout(n)})):n.askConfirm?d.alert.confirm("CONFIRM.LOGOUT").then((function(t){if(t)return n.askConfirm=!1,e.logout(n)})):(d.loading.show(),p.logout().then((function(){return a.isOpenLeft()&&a.toggleLeft(),s.clearHistory(),s.clearCache().then((function(){return e.showHome()}))})).catch(d.onError()))},e.isUserPubkey=function(e){return p.isUserPubkey(e)},p.api.data.on.login(e,(function(n,t){return e.login=!0,t?t.resolve():i.when()})),p.api.data.on.logout(e,(function(){e.login=!1})),e.showTransferModal=function(e){},e.showAboutModal=function(){return E.showAbout()},e.showJoinModal=function(){return e.closeProfilePopover(),E.showJoin()},e.showSettings=function(){return e.closeProfilePopover(),t.go("app.settings")},e.showHelpModal=function(e){return E.showHelp(e)},e.showProfilePopover=function(n){return d.popover.show(n,{templateUrl:"templates/common/popover_profile.html",scope:e,afterShow:function(n){e.profilePopover=n,o((function(){d.ink({selector:"#profile-popover .ink, #profile-popover .ink-dark"})}),100)}})},e.closeProfilePopover=function(){e.profilePopover&&e.profilePopover.isShown()&&o((function(){e.profilePopover.hide()}))},e.showPeerInfoPopover=function(n){return d.popover.show(n,{templateUrl:"templates/network/popover_peer_info.html",scope:e.$new(!0)})},n.openLink=function(e,n,a){if(e.stopPropagation(),e.preventDefault(),n&&n.startsWith("@")){var i=n.substr(1);if(u.regexp.USER_ID.test(i))return t.go("app.user_identity_name",{name:i}),!1}return(a=a||{}).onError=function(){return d.popover.copy(e,n)},h.uri.open(n,a),!1},e.handleUri=function(e,n){if(!e)return i.when();console.info("[app] Trying to parse as uri: ",e);var a=t.current&&"app.home"===t.current.name;return u.uri.parse(e).then((function(n){if(!n)throw{message:"ERROR.UNKNOWN_URI_FORMAT"};return n.name?t.go("app.user_identity_name",angular.merge({name:n.name,action:n.params&&n.params.amount?"transfer":void 0},n.params),{reload:!0}):(console.warn("[app] TODO implement state redirection from URI result: ",n,e),t.go("app.user_lookup",{q:e},{reload:!0}))})).then((function(){if(a)return o((function(){s.backView()&&s.removeBackView()}),500)})).catch((function(t){if(!n)return console.error("[home] Error while handle uri {"+e+"': ",t),d.onError(e)(t);n(t)}))},e.registerProtocolHandlers=function(){_.each(["web+gchange"],(function(e){console.debug("[app] Registering protocol '{0}'...".format(e));try{navigator.registerProtocolHandler(e,"#/app/home?uri=%s","Cesium")}catch(n){console.error("[app] Error while registering protocol '{0}'".format(e),n)}}))},e.showFab=function(e,n){d.motion.toggleOn({selector:"#"+e+".button-fab"},n)},e.hideFab=function(e,n){d.motion.toggleOff({selector:"#"+e+".button-fab"},n)},e.doMotion=function(n){return e.motion.show(n)},e.askFullscreen=function(){if(!e.fullscreen&&d.screen.isSmall()&&m.isWeb())return d.alert.confirm("CONFIRM.FULLSCREEN",void 0,{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES"}).then((function(n){n&&e.toggleFullscreen()}))},e.toggleFullscreen=function(){e.fullscreen=!d.screen.fullscreen.isEnabled(),d.screen.fullscreen.toggleAll()},e.askFullscreen(),e.registerProtocolHandlers()}function a(e,n,t,a,i,o,s,r,l,c,d,u,p,m){e.loading=!0,e.locales=angular.copy(m.locales),e.bgImage=function(){var e;if(Math.random()<.5)e="service";else{var n=moment().format("D"),t=moment().format("M");e=t<3||3==t&&n<21||12==t&&n>=21?"winter":3==t&&n>=21||t<6||6==t&&n<21?"spring":6==t&&n>=21||t<9||9==t&&n<21?"summer":"autumn"}var a={service:12,spring:7,summer:11,autumn:7,winter:5}[e],i=Math.floor(Math.random()*a)+1;return"./img/bg/{0}-{1}.jpg".format(e,i)}(),e.enter=function(n,t){if(ionic.Platform.isIOS()&&window.StatusBar&&(StatusBar.overlaysWebView(!1),StatusBar.overlaysWebView(!0)),t&&t.stateParams&&t.stateParams.uri)return e.handleUri(t.stateParams.uri).then((function(){e.loading=!1}));t&&t.stateParams&&t.stateParams.error?(e.error=t.stateParams.error,e.node=p.data.node,e.loading=!1,e.cleanLocationHref(t)):u.ready().then((function(){e.loading=!1,e.loadFeeds()})).catch((function(n){e.node=p.data.node,e.loading=!1,e.error=n}))},e.$on("$ionicView.enter",e.enter),e.reload=function(){e.loading=!0,delete e.error,t(e.enter,200)},e.loadFeeds=function(){var n=m.getFeedUrl();if(n&&"string"==typeof n){var t=c.feed&&c.feed.maxContentLength||650,a=Date.now();console.debug("[home] Loading feeds from {0}...".format(n)),i.get(n,{timeout:m.data.timeout,responseType:"json",cache:d.get(null,d.constants.LONG)}).success((function(n){console.debug("[home] Feeds loaded in {0}ms".format(Date.now()-a)),n&&n.items&&n.items.length&&(n.items=n.items.reduce((function(e,a){if(!a||!a.title&&!a.content_text&&!a.content_html)return e;if(a.date_published&&(a.time=moment.utc(a.date_published).unix()),a.content_html?a.content=a.content_html:a.content=(a.content_text||"").replace(/\n/g,"<br/>"),-1!==t&&a.content&&a.content.length>t){var i=Math.max(a.content.lastIndexOf(" ",t),a.content.lastIndexOf("<",t));a.content=a.content.substr(0,i)+" (...)",a.truncated=!0}return a.author=a.author||n.author,e.concat(a)}),[]),e.feed=n)})).error((function(n,t){console.error("[home] Failed to load feeds."),e.feed=null}))}},e.doQuickFix=function(e){"settings"===e&&(a.nextViewOptions({historyRoot:!0}),n.go("app.settings"))},e.changeLanguage=function(n){o.use(n),e.hideLocalesPopover(),m.data.locale=_.findWhere(e.locales,{id:n}),m.store(),e.loadFeeds()},e.showLocalesPopover=function(n){l.popover.show(n,{templateUrl:"templates/common/popover_locales.html",scope:e,afterShow:function(n){e.localesPopover=n}})},e.hideLocalesPopover=function(){e.localesPopover&&(e.localesPopover.hide(),e.localesPopover=null)},e.cleanLocationHref=function(e){if(e&&e.stateParams){var t=angular.copy(e.stateParams);return delete t.uri,delete t.error,r.search(t).replace(),a.nextViewOptions({disableAnimate:!0,disableBack:!1,historyRoot:!1}),n.go(e.stateName,t,{reload:!1,inherit:!0,notify:!1})}}}function i(e,n){e((function(){n.showJoin()}),100)}function o(e,n,t,a,i,o,s,r,l){e.formData={pseudo:""},e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500}},e.isLastSlide=!1,e.search={looking:!0},e.showUsername=!1,e.showPassword=!1,e.smallscreen=t.screen.isSmall(),e.userIdPattern=l.constants.regex.USER_ID,e.slidePrev=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slidePrev(),e.slides.slider.lockSwipes(),e.isLastSlide=!1},e.slideNext=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slideNext(),e.slides.slider.lockSwipes(),e.isLastSlide=4===e.slides.slider.activeIndex},e.showAccountPubkey=function(){e.formData.computing=!0,a.scryptKeypair(e.formData.username,e.formData.password).then((function(n){e.formData.pubkey=a.util.encode_base58(n.signPk),e.formData.computing=!1})).catch((function(n){e.formData.computing=!1,console.error(">>>>>>>",n),t.alert.error("ERROR.CRYPTO_UNKNOWN_ERROR")}))},e.formDataChanged=function(){e.formData.computing=!1,e.formData.pubkey=null},e.doNext=function(n){if(console.debug("[join] form "+n+" OK. index="+e.slides.slider.activeIndex),n||(n=1===e.slides.slider.activeIndex?"passwordForm":2===e.slides.slider.activeIndex?"pseudoForm":n),n){if(e[n].$submitted=!0,!e[n].$valid)return;"passwordForm"===n?(e.slideNext(),e.showAccountPubkey()):(e.slideNext(),"pseudoForm"===n&&e.showAccountPubkey())}},e.doNewAccount=function(a){if(!a)return t.alert.confirm("ACCOUNT.NEW.CONFIRMATION_WALLET_ACCOUNT").then((function(n){n&&e.doNewAccount(!0)}));t.loading.show(),s.login(e.formData.username,e.formData.password).then((function(t){e.closeModal(),i.data.wallet=i.data.wallet||{},i.data.wallet.alertIfUnusedWallet=!1,r.setDefaultProfile({title:e.formData.pseudo}),n.go("app.view_wallet")})).catch((function(e){t.loading.hide(),console.error(">>>>>>>",e),t.alert.error("ERROR.CRYPTO_UNKNOWN_ERROR")}))},e.showHelpModal=function(n){n||(n=1==e.slides.slider.activeIndex?"join-salt":2==e.slides.slider.activeIndex?"join-password":"join-pseudo"),o.showHelp({anchor:n})}}function s(e,n,t,a,i,o,s){e.computing=!1,e.pubkey=null,e.formData={rememberMe:o.data.rememberMe},e.showSalt=o.data.showLoginSalt,e.showPubkeyButton=!1,e.autoComputePubkey=!1,s.ready().then((function(){e.autoComputePubkey="a"===ionic.Platform.grade.toLowerCase()&&!a.screen.isSmall()})),e.doLogin=function(){e.form.$valid&&(a.loading.show(),e.closeModal(e.formData))},e.formDataChanged=function(){e.computing=!1,e.pubkey=null,e.autoComputePubkey&&e.formData.username&&e.formData.password?e.showPubkey():e.showPubkeyButton=e.formData.username&&e.formData.password},e.$watch("formData.username",e.formDataChanged,!0),e.$watch("formData.password",e.formDataChanged,!0),e.showPubkey=function(){e.computing=!0,e.showPubkeyButton=!1,e.pubkey="",n((function(){var n=e.formData.username,i=e.formData.password;t.scryptKeypair(n,i).then((function(a){n!==e.formData.username||i!==e.formData.password?e.showPubkey():(e.pubkey=t.util.encode_base58(a.signPk),e.computing=!1)})).catch((function(n){e.pubkey="",e.computing=!1,a.loading.hide(),console.error(">>>>>>>",n),a.alert.error("ERROR.CRYPTO_UNKNOWN_ERROR")}))}),500)},e.showJoinModal=function(){e.closeModal(),n((function(){i.showJoin()}),300)},e.showAccountSecurityModal=function(){e.closeModal(),n((function(){i.showAccountSecurity()}),300)}}function r(e,n,t,a,i){e.$on("$ionicView.enter",(function(o){e.locale=i.data.locale.id,n.stateParams&&n.stateParams.anchor&&t((function(){a(n.stateParams.anchor)}),100)}))}function l(e,n,t,a,i){e.locale=a.data.locale.id,i&&i.anchor&&n((function(){t(i.anchor)}),100)}function c(e,n,t,a,i,o,s,r,l,c,d,u,p,m){e.tour=!1,e.continue=!0,e.executeStep=function(n,t,a){if((a=angular.isDefined(a)?a:0)>=t.length)return s.when(!0);var i=t[a];if("function"!=typeof i)throw new Error("[helptip] Invalid step at index {0} of '{1}' tour: step must be a function".format(a,n));var o=i();return"boolean"==typeof o&&(o=s.when(o)),o.then((function(i){return angular.isUndefined(i)?(e.continue=!1,a):i&&a!==t.length-1?e.executeStep(n,t,a+1):i?-1:a+1})).catch((function(t){return t&&"transition prevented"==t.message?console.error("ERROR: in help tour [{0}], in step [{1}] -> use large if exists, to prevent [transition prevented] error".format(n,a)):console.error("ERROR: in help tour [{0}], in step [{1}] : {2}".format(n,a,t)),e.continue=!1,a}))},e.showHelpTip=function(n,t){return(t=t||{}).bindings=t.bindings||{},t.bindings.value=t.bindings.value||"",t.bindings.hasNext=!angular.isDefined(t.bindings.hasNext)||t.bindings.hasNext,t.timeout=t.timeout||(p.enable?900:500),t.autoremove=!0,t.bindings.tour=e.tour,t.backdropClickToClose=!e.tour,l.popover.helptip(n,t)},e.showHelpModal=function(e){Modals.showHelp({anchor:e})},e.startHelpTour=function(){return e.tour=!0,e.continue=!0,e.startCurrencyTour(0,!0).then((function(n){return!(!n||e.cancelled)&&(d.data.helptip.currency=n,d.store(),e.continue)})).then((function(n){return!!n&&e.startNetworkTour(0,!0).then((function(n){return!(!n||e.cancelled)&&(d.data.helptip.network=n,d.store(),e.continue)}))})).then((function(n){return!!n&&e.startWotTour(0,!0).then((function(n){return!(!n||e.cancelled)&&(d.data.helptip.wot=n,d.store(),e.continue)}))})).then((function(n){return!!n&&e.startWotCertTour(0,!0).then((function(n){return!!n&&(d.data.helptip.wotCerts=n,d.store(),e.continue)}))})).then((function(n){return!!n&&e.startWalletNoLoginTour(0,!0)})).then((function(n){return!!n&&(!m.isLogin()||e.startWalletTour(0,!0).then((function(n){return!!n&&(d.data.helptip.wallet=n,d.store(),e.continue)})))})).then((function(n){return!!n&&(!m.isLogin()||e.startWalletCertTour(0,!0).then((function(n){return!!n&&(d.data.helptip.walletCerts=n,d.store(),e.continue)})))})).then((function(n){return!!n&&(!m.isLogin()||e.startTxTour(0,!0).then((function(n){return!!n&&(d.data.helptip.tx=n,d.store(),e.continue)})))})).then((function(n){return!!n&&e.startHeaderTour(0,!0)})).then((function(n){return!!n&&e.startSettingsTour(0,!0)})).then((function(n){return!!n&&e.finishTour()}))},e.startCurrencyTour=function(n,a){var o,s=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-currency",{bindings:{content:"HELP.TIP.MENU_BTN_CURRENCY",icon:{position:"left"}}})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go(l.screen.isSmall()?"app.currency":"app.currency_view_lg").then((function(){return e.showHelpTip("helptip-currency-mass-member",{bindings:{content:"HELP.TIP.CURRENCY_MASS",icon:{position:"center"}}})}))},function(){return!d.data.useRelative||e.showHelpTip("helptip-currency-mass-member-unit",{bindings:{content:"HELP.TIP.CURRENCY_UNIT_RELATIVE",contentParams:o,icon:{position:l.screen.isSmall()?"right":"center"}}})},function(){return!d.data.useRelative||e.showHelpTip("helptip-currency-change-unit",{bindings:{content:"HELP.TIP.CURRENCY_CHANGE_UNIT",contentParams:o,icon:{position:l.screen.isSmall()?"right":"center"}}})},function(){return!!d.data.useRelative||e.showHelpTip("helptip-currency-change-unit",{bindings:{content:"HELP.TIP.CURRENCY_CHANGE_UNIT_TO_RELATIVE",contentParams:o,icon:{position:l.screen.isSmall()?"right":"center"}}})},function(){return l.screen.isSmall()&&r("helptip-currency-rules-anchor"),e.showHelpTip("helptip-currency-rules",{bindings:{content:"HELP.TIP.CURRENCY_RULES",icon:{position:"center",glyph:"ion-information-circled"}}})},function(){return t.is("app.currency.tab_parameters")&&t.go("app.currency.tab_wot"),e.showHelpTip("helptip-currency-newcomers",{bindings:{content:"HELP.TIP.CURRENCY_WOT",icon:{position:"center"}},timeout:1200})}];return u.default().then((function(t){return o=t.parameters,e.executeStep("currency",s,n)}))},e.startNetworkTour=function(n,s){var r=function(){t.is("app.currency")&&o((function(){var e=a.document.querySelectorAll("ion-tabs .tabs a");e&&3==e.length&&angular.element(e[2]).triggerHandler("click")}),100)},p=[function(){return!!l.screen.isSmall()||(i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-network",{bindings:{content:"HELP.TIP.MENU_BTN_NETWORK",icon:{position:"left"}}}))},function(){return i.isOpen()&&i.toggleLeft(!1),t.go(l.screen.isSmall()?"app.currency.tab_network":"app.network").then((function(){return r(),e.showHelpTip("helptip-network-peers",{bindings:{content:"HELP.TIP.NETWORK_BLOCKCHAIN",icon:{position:"center",glyph:"ion-information-circled"}},timeout:1200})}))},function(){return r(),e.showHelpTip("helptip-network-peer-0",{bindings:{content:"HELP.TIP.NETWORK_PEERS",icon:{position:l.screen.isSmall()?void 0:"center"}},timeout:1e3,retry:20})},function(){return r(),e.showHelpTip("helptip-network-peer-0-block",{bindings:{content:"HELP.TIP.NETWORK_PEERS_BLOCK_NUMBER",icon:{position:l.screen.isSmall()?void 0:"center"}}})},function(){r();var n=d.data.locale.id;return e.showHelpTip("helptip-network-peers",{bindings:{content:"HELP.TIP.NETWORK_PEERS_PARTICIPATE",contentParams:{installDocUrl:c.helptip&&c.helptip.installDocUrl?c.helptip.installDocUrl[n]?c.helptip.installDocUrl[n]:c.helptip.installDocUrl:"http://duniter.org"},icon:{position:"center",glyph:"ion-information-circled"},hasNext:s}})}];return u.default().then((function(t){return t.parameters,e.executeStep("network",p,n)}))},e.startWotTour=function(s,r){var c,d=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-wot",{bindings:{content:"HELP.TIP.MENU_BTN_WOT",icon:{position:"left"}},onError:"continue"})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go("app.user_lookup").then((function(){return e.showHelpTip("helptip-wot-search-text",{bindings:{content:l.screen.isSmall()?"HELP.TIP.WOT_SEARCH_TEXT_XS":"HELP.TIP.WOT_SEARCH_TEXT",icon:{position:"center"}}})}))},function(){return e.showHelpTip("helptip-wot-search-result-0",{bindings:{content:"HELP.TIP.WOT_SEARCH_RESULT",icon:{position:"center"}},timeout:700,retry:15})},function(){var n=a.document.getElementById("helptip-wot-search-result-0");return!n||(o((function(){angular.element(n).triggerHandler("click")})),e.showHelpTip("helptip-wot-view-certifications",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS"},timeout:2500}))},function(){return e.showHelpTip("helptip-wot-view-certifications",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS_COUNT",contentParams:c,icon:{position:"center",glyph:"ion-information-circled"}}})},function(){return e.showHelpTip("helptip-wot-view-certifications-count",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFICATIONS_CLICK",icon:{position:"center"},hasNext:r}})}];return u.default().then((function(t){return(c=t.parameters).currentUD=n.walletData.currentUD,e.executeStep("wot",d,s)}))},e.startWotCertTour=function(n,i){var s=[function(){if(t.is("app.user_identity")){var n=a.document.getElementById("helptip-wot-view-certifications");if(!n)return!0;o((function(){angular.element(n).triggerHandler("click")}))}return e.showHelpTip(l.screen.isSmall()?"fab-certify":"helptip-certs-certify",{bindings:{content:"HELP.TIP.WOT_VIEW_CERTIFY",icon:{position:l.screen.isSmall()?"bottom-right":"center"}},timeout:l.screen.isSmall()?2e3:1e3,retry:10})},function(){return e.showHelpTip(l.screen.isSmall()?"fab-certify":"helptip-certs-certify",{bindings:{content:"HELP.TIP.CERTIFY_RULES",icon:{position:"center",glyph:"ion-alert-circled"},hasNext:i}})}];return e.executeStep("certs",s,n)},e.startWalletNoLoginTour=function(t,a){if(m.isLogin())return s.when(!0);var o=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-account",{bindings:{content:n.walletData.isMember?"HELP.TIP.MENU_BTN_ACCOUNT_MEMBER":"HELP.TIP.MENU_BTN_ACCOUNT",icon:{position:"left"},hasNext:a}})}];return e.executeStep("wallet-no-login",o,t)},e.startWalletTour=function(a,o){if(!m.isLogin())return s.when(!0);var c=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-account",{bindings:{content:n.walletData.isMember?"HELP.TIP.MENU_BTN_ACCOUNT_MEMBER":"HELP.TIP.MENU_BTN_ACCOUNT",icon:{position:"left"}}})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go("app.view_wallet").then((function(){return e.showHelpTip(l.screen.isSmall()?"helptip-wallet-options-xs":"helptip-wallet-options",{bindings:{content:"HELP.TIP.WALLET_OPTIONS",icon:{position:l.screen.isSmall()?"right":"center"}}})}))},function(){return r("helptip-wallet-pubkey"),e.showHelpTip("helptip-wallet-pubkey",{bindings:{content:"HELP.TIP.WALLET_PUBKEY",icon:{position:"bottom-center"}},timeout:l.screen.isSmall()?2e3:500,retry:10})},function(){return r("helptip-wallet-certifications"),e.showHelpTip("helptip-wallet-certifications",{bindings:{content:l.screen.isSmall()?"HELP.TIP.WALLET_RECEIVED_CERTIFICATIONS":"HELP.TIP.WALLET_CERTIFICATIONS",icon:{position:"center"}},timeout:500,onError:"continue",hasNext:o})}];return u.default().then((function(t){return t.parameters.currentUD=n.walletData.currentUD,e.executeStep("wallet",c,a)}))},e.startWalletCertTour=function(n,i){if(!m.isLogin())return s.when(!0);var r=!1,c=[function(){if(t.is("app.view_wallet")){var n=a.document.getElementById("helptip-wallet-certifications");if(!n)return r=!0,!0;o((function(){angular.element(n).triggerHandler("click")}))}return!l.screen.isSmall()||e.showHelpTip("helptip-received-certs",{bindings:{content:"HELP.TIP.WALLET_RECEIVED_CERTS"}})},function(){return!(!r&&l.screen.isSmall())||t.go("app.view_wallet").then((function(){return e.showHelpTip("helptip-wallet-given-certifications",{bindings:{content:"HELP.TIP.WALLET_GIVEN_CERTIFICATIONS",icon:{position:"center"}},timeout:500})}))},function(){if(r)return!0;if(t.is("app.view_wallet")){var n=a.document.getElementById("helptip-wallet-given-certifications");if(!n)return r=!0,!0;o((function(){angular.element(n).triggerHandler("click")}),500)}return e.showHelpTip(l.screen.isSmall()?"fab-select-certify":"helptip-certs-select-certify",{bindings:{content:"HELP.TIP.WALLET_CERTIFY",icon:{position:l.screen.isSmall()?"bottom-right":"center"}},timeout:l.screen.isSmall()?2e3:500,retry:10})},function(){return e.tour||r?i:e.showHelpTip("helptip-certs-stock",{bindings:{content:"HELP.TIP.CERTIFY_RULES",icon:{position:"center",glyph:"ion-alert-circled"},hasNext:i}})}];return u.default().then((function(t){return t.parameters,e.executeStep("certs",c,n)}))},e.startTxTour=function(a,o){if(!m.isLogin())return s.when(!0);var r,l=[function(){return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-tx",{bindings:{content:n.walletData.isMember?"HELP.TIP.MENU_BTN_TX_MEMBER":"HELP.TIP.MENU_BTN_TX",icon:{position:"left"}}})},function(){return i.isOpen()&&i.toggleLeft(!1),t.go("app.view_wallet_tx").then((function(){return e.showHelpTip("helptip-wallet-balance",{bindings:{content:d.data.useRelative?"HELP.TIP.WALLET_BALANCE_RELATIVE":"HELP.TIP.WALLET_BALANCE",contentParams:r,icon:{position:"center"}},retry:20})}))},function(){return e.showHelpTip("helptip-wallet-balance",{bindings:{content:"HELP.TIP.WALLET_BALANCE_CHANGE_UNIT",contentParams:r,icon:{position:"center",glyph:"ion-information-circled"}}})}];return u.default().then((function(t){return(r=t.parameters).currentUD=n.walletData.currentUD,e.executeStep("tx",l,a)}))},e.startHeaderTour=function(n,t){if(l.screen.isSmall())return s.when(!0);function r(){var e=a.document.querySelectorAll("#helptip-header-bar-btn-profile");return e&&e.length?_.find(e,(function(e){return e.offsetWidth>0})):null}var c=[function(){if(l.screen.isSmall())return!0;var n=r();return!n||e.showHelpTip(n,{bindings:{content:"HELP.TIP.HEADER_BAR_BTN_PROFILE",icon:{position:"right"}}})},function(){if(l.screen.isSmall())return i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"left"},hasNext:t},timeout:1e3});var n=r();return!n||(o((function(){angular.element(n).triggerHandler("click")})),e.showHelpTip("helptip-popover-profile-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"center"},hasNext:t},timeout:1e3}).then((function(n){return e.closeProfilePopover(),n})))}];return e.executeStep("header",c,n)},e.startSettingsTour=function(n,a){var o,s=[function(){return!l.screen.isSmall()||(i.toggleLeft(!0),e.showHelpTip("helptip-menu-btn-settings",{bindings:{content:"HELP.TIP.MENU_BTN_SETTINGS",icon:{position:"left"}},timeout:1e3}))},function(){return i.isOpen()&&i.toggleLeft(!1),t.go("app.settings").then((function(){return e.showHelpTip("helptip-settings-btn-unit-relative",{bindings:{content:"HELP.TIP.SETTINGS_CHANGE_UNIT",contentParams:o,icon:{position:"right",style:"margin-right: 60px"},hasNext:a},timeout:1e3})}))}];return u.default().then((function(t){return o=t.parameters,e.executeStep("settings",s,n)}))},e.finishTour=function(){return i.isOpen()&&i.toggleLeft(!1),m.isLogin()?t.go("app.view_wallet").then((function(){return e.showHelpTip("helptip-wallet-certifications",{bindings:{content:"HELP.TIP.END_LOGIN",hasNext:!1}})})):s.all([e.showHome(),u.default().then((function(e){n=e}))]).then((function(){return e.showHelpTip("helptip-home-logo",{bindings:{content:"HELP.TIP.END_NOT_LOGIN",contentParams:n,hasNext:!1}})}));var n}}function d(e){e.$on("$ionicView.enter",(function(n,t){e.startHelpTour()}))}function u(e,n,t,a,i,o,s,r,l,c,d){e.loading=!0,e.settings=c.data,e.qrcodeId="qrcode-wallet-"+e.$id,e.toggleQRCode=!1,e.likeData={views:{},likes:{},follows:{},abuses:{},stars:{}},e.enter=function(n,t){if(e.loading=e.loading||t.stateParams&&t.stateParams.refresh,e.loading)return e.cleanLocationHref(t),e.load();o.loading.hide(10),a(e.updateView,300),e.$broadcast("$recordView.enter",t)},e.$on("$ionicView.enter",e.enter),e.load=function(){return e.loadWallet().then((function(n){e.formData=n,e.loading=!1,e.updateView(),e.addListeners(),o.loading.hide(10)})).catch((function(n){"CANCELLED"!==n?o.onError("ERROR.LOAD_WALLET_DATA_ERROR")(n):e.showHome()}))},e.updateView=function(){e.motion.show({selector:"#wallet .item"}),e.$broadcast("$$rebind::rebind")},e.setRegisterForm=function(n){e.registerForm=n},e.onWalletLogout=function(){e.hideQRCode(),e.removeListeners(),delete e.formData,e.loading=!0},e.addListeners=function(){e.listeners=[s.api.data.on.logout(e,e.onWalletLogout),e.$watchCollection("formData.events",(function(n,t){!t||e.loading||angular.equals(n,t)||e.updateView()}))]},e.removeListeners=function(){_.forEach(e.listeners,(function(e){e()})),e.listeners=[]},e.doUpdate=function(n){return console.debug("[wallet] Updating wallet..."),(n?s.refreshData():o.loading.show().then(s.refreshData).then(o.loading.hide)).then(e.updateView).catch(o.onError("ERROR.REFRESH_WALLET_DATA"))},e.doQuickFix=function(e){alert("TODO doQuickFix:",e)},e.startWalletTour=function(){return e.hideActionsPopover(),e.showHelpTip(0,!0)},e.showHelpTip=function(n,t){if(n=angular.isDefined(n)?n:c.data.helptip.wallet,t=!!angular.isDefined(t)&&t,!(n<0)){var a=e.createHelptipScope(t);if(a)return a.tour=t,a.startWalletTour(n,!1).then((function(e){a.$destroy(),t||(c.data.helptip.wallet=e,c.store())}))}},e.showQRCode=function(n,t,a){if(e.qrcodeId){var i=angular.element(document.querySelector("#"+e.qrcodeId+" .content"));if(i)return s.loadQrCode().then((function(n){i.html(n),o.motion.toggleOn({selector:"#"+e.qrcodeId},a||1100)}));console.error("[wallet-controller] Cannot found div #{0} for the QRCode. Skipping.".format(e.qrcodeId))}},e.hideQRCode=function(){e.qrcodeId&&angular.element(document.querySelector("#"+e.qrcodeId))&&o.motion.toggleOff({selector:"#"+e.qrcodeId})},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):r.fromTemplateUrl("templates/wallet/popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.showSharePopover=function(n){e.hideActionsPopover();var t=e.formData.name||e.formData.pubkey,a=d.getUrl("/user/profile/"+e.formData.pubkey+"/_share");o.screen.isSmall()&&(n=angular.element(document.querySelector("#wallet-share-anchor"))||n),o.popover.share(n,{bindings:{url:a,titleKey:"WOT.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:t},postMessage:t}})},e.showSecurityModal=function(){e.hideActionsPopover(),l.showAccountSecurity()},e.cleanLocationHref=function(e){e&&e.stateParams&&e.stateParams.refresh&&a((function(){var n=angular.copy(e.stateParams);delete n.refresh,$location.search(n).replace()}),300)}}function p(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E){e.search={text:"",loading:!0,type:null,results:[]},e._source=["issuer","title","city","time","avatar._content_type"],e.entered=!1,e.wotSearchTextId="wotSearchText",e.enableFilter=!0,e.allowMultiple=!1,e.selection=[],e.showResultLabel=!0,e.parameters={},e.enter=function(n,i){e.entered||(i.stateParams&&i.stateParams.q?(e.search.text=i.stateParams.q,t((function(){e.doSearch()}),100)):i.stateParams&&i.stateParams.hash?(e.search.text="#"+i.stateParams.hash,t((function(){e.doSearch()}),100)):t((function(){"newcomers"!==i.stateParams.type&&(r.initPhase||i.stateParams.type)||e.doGetNewcomers(0,void 0,!0)}),100),a(e.wotSearchTextId),e.entered=!0,t(s.ink,100),e.showHelpTip())},e.$on("$ionicView.enter",e.enter),e.resetWotSearch=function(){e.search={text:null,loading:!1,type:"newcomers",results:[]}},e.updateLocationHref=function(){var t={q:void 0,hash:void 0,type:void 0};if("text"===e.search.type){var a=e.search.text.trim();a.match(/^#[\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+$/)?t.hash=a.substr(1):t.q=a}else t.type=e.search.type;o.nextViewOptions({disableAnimate:!0,disableBack:!0,historyRoot:!0}),n.go("app.user_lookup",t,{reload:!1,inherit:!0,notify:!1})},e.doSearchText=function(){e.doSearch(),e.updateLocationHref()},e.doSearch=function(n,t){var a=e.search.text.trim();if(s.screen.isSmall()&&a.length<3||!a.length)return e.search.results=[],e.search.type="none",$q.when();e.search.loading=!0;var i={from:n||0,size:t||10,_source:e._source};return e.search.type="text",E.searchText(a,i).then((function(i){"text"===e.search.type&&e.search.text.trim()===a&&(i&&i.length||!u.regexp.PUBKEY.test(a)?e.doDisplayResult(i,n,t):e.doDisplayResult([{pubkey:a}]))})).catch(s.onError("ERROR.WOT_LOOKUP_FAILED"))},e.doGetNewcomers=function(n,t,a){n=n||0,(t=t||10)<10&&(t=10),e.hideActionsPopover(),e.search.loading=0===n,e.search.type="newcomers",n||a||e.updateLocationHref();var i={index:"user",type:"profile",from:n,size:t,sort:{creationTime:"desc"}};return E.search(i).then((function(a){return"newcomers"===e.search.type&&(e.doDisplayResult(a,n,t),!0)})).catch((function(t){e.search.loading=!1,e.search.results=n>0?e.search.results:[],e.search.hasMore=!1,s.onError("ERROR.LOAD_NEWCOMERS_FAILED")(t)}))},e.showMore=function(){var n=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,("newcomers"===e.search.type?e.doGetNewcomers:e.doGetPending)(n).then((function(n){n&&(e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete"))})).catch((function(n){console.error(n),e.search.loadingMore=!1,e.search.hasMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.select=function(e){p.isUserPubkey(e.pubkey)?n.go("app.view_wallet"):n.go("app.user_identity",{pubkey:e.pubkey,name:e.name})},e.next=function(){alert("Selected identities:",e.selection)},e.toggleCheck=function(n,t){var a=e.search.results[n];a.checked?e.addToSelection(a):e.removeSelection(a,t)},e.toggleSelect=function(e){e.selected=!e.selected},e.addToSelection=function(n){var t=angular.copy(n);t.name&&(t.name=t.name.replace("<em>","").replace("</em>","")),e.selection.push(t)},e.removeSelection=function(n,t){var a=_.findWhere(e.selection,{id:n.id});if(a&&e.selection.splice(e.selection.indexOf(a),1),!e.search.loading){var i=_.findWhere(e.search.results,{id:n.id});i&&i.checked&&(i.checked=!1)}},e.scanQrCode=function(){d.barcode.enable&&d.barcode.scan().then((function(n){n&&u.uri.parse(n).then((function(t){t.pubkey?e.search.text=t.pubkey:n.name?e.search.text=t.name:e.search.text=n,e.doSearch()}))})).catch(s.onError("ERROR.SCAN_FAILED"))},e.showHelpTip=function(){if(e.isLogin()){var n=angular.isDefined(n)?n:c.data.helptip.wot;if(!(n<0)){0===n&&(n=1);var t=e.createHelptipScope();if(t)return t.startWotTour(n,!1).then((function(e){t.$destroy(),c.data.helptip.wot=e,c.store()}))}}},e.doDisplayResult=function(n,t,a){n=n||{},e.allowMultiple&&n.length&&e.selection.length&&_.forEach(e.selection,(function(e){var t=_.findWhere(n,{id:e.id});t&&(t.checked=!0)})),e.search.results=t?e.search.results.concat(n):n||[],e.search.loading=!1,e.search.hasMore=n.length&&e.search.results.length>=t+a,e.smallscreen=s.screen.isSmall(),e.search.results.length&&n.length>0&&e.motion&&e.motion.show({selector:".lookupForm .list .item",ink:!0})},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):i.fromTemplateUrl("templates/wot/lookup_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()}}function m(e,n,t,a){angular.extend(this,n("WotLookupCtrl",{$scope:e})),a=a||{},e.search.loading=!1,e.enableFilter=!!angular.isDefined(a.enableFilter)&&a.enableFilter,e.allowMultiple=!!angular.isDefined(a.allowMultiple)&&a.allowMultiple,e.parameters=a,e.showResultLabel=!1,e.wotSearchTextId="wotSearchTextModal",e.allowMultiple&&a.selection&&(e.selection=a.selection),e.cancel=function(){e.closeModal()},e.select=function(n){e.closeModal({pubkey:n.pubkey,name:n.name&&n.name.replace(/<\/?em>/gi,"")})},e.next=function(){e.closeModal(e.selection)},e.updateLocationHref=function(){},e.showHelpTip=function(){},t(e.wotSearchTextId)}function E(e,n,t,a,i,o,s,r,l,c){e.formData={hasSelf:!0},e.loading=!0,e.load=function(n,t,a){return l.load(n,t,a).then((function(n){if(!n)return i.onError("ERROR.IDENTITY_NOT_FOUND")().then(e.showHome);e.formData=n,e.loading=!1,e.updateView(),i.loading.hide(10)})).catch((function(n){e.loading=!1,i.onError("ERROR.LOAD_IDENTITY_FAILED")(n)}))},e.refresh=function(){if(!e.loading&&e.formData.pubkey)return e.load(e.formData.pubkey,!1)},e.updateView=function(){e.$broadcast("$$rebind::rebind")},e.removeActionParamInLocationHref=function(e){if(e&&e.stateParams&&e.stateParams.action){var n=angular.copy(e.stateParams);n.action=null,a.nextViewOptions({disableAnimate:!0,disableBack:!1,historyRoot:!1}),t.go(e.stateName,n,{reload:!1,inherit:!0,notify:!1})}},e.showSharePopover=function(n){var t=e.formData.name||e.formData.name||e.formData.pubkey,a=s.getUrl("/user/profile/"+e.formData.pubkey+"/_share");i.screen.isSmall()&&(n=angular.element(document.querySelector("#wot-share-anchor-"+e.formData.pubkey))||n),i.popover.share(n,{bindings:{url:a,titleKey:"WOT.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:t},postMessage:t}})}}function g(e,n,t,a,i,o){angular.extend(this,t("WotIdentityAbstractCtrl",{$scope:e})),e.motion=i.motion.fadeSlideInRight,e.options=e.options||{},e.options.like={kinds:["VIEW","LIKE","ABUSE","FOLLOW","STAR"],index:"user",type:"profile"},e.likeData={views:{},likes:{},follows:{},abuses:{},stars:{}},e.enter=function(n,t){var i=function(){t.stateParams&&t.stateParams.action&&(a((function(){e.doAction(t.stateParams.action.trim())}),100),e.removeActionParamInLocationHref(t),e.likeData.id=e.formData.pubkey)};if(t.stateParams&&t.stateParams.pubkey&&t.stateParams.pubkey.trim().length>0){if(e.loading)return e.load(t.stateParams.pubkey.trim(),!0,t.stateParams.name).then(i)}else if(t.stateParams&&t.stateParams.name&&t.stateParams.name.trim().length>0){if(e.loading)return e.load(null,!0,t.stateParams.name).then(i)}else if(o.isLogin()){if(e.loading)return e.load(o.data.pubkey,!0,o.data.name).then(i)}else e.showHome()},e.$on("$ionicView.enter",e.enter),e.updateView=function(){console.debug("[identity] Updating view"),e.motion.show({selector:".view-identity .list .item"}),e.$broadcast("$csExtension.motion"),e.$broadcast("$$rebind::rebind")}}function f(e,n,t,a,i,o,s,r,l,c,d,u,p,m){e.formData=angular.copy(p.data),e.popupData={},e.loading=!0,e.nodePopup={},e.bma=c,e.$on("$ionicView.enter",(function(){p.ready().then(e.load)})),e.setPopupForm=function(n){e.popupForm=n},e.load=function(){return e.loading=!0,e.locales=angular.copy(p.locales),angular.merge(e.formData,p.data),e.formData.locale=p.data.locale&&p.data.locale.id&&_.findWhere(e.locales,{id:p.data.locale.id})||_.findWhere(e.locales,{id:p.defaultSettings.locale.id}),o((function(){e.loading=!1,r.ink({selector:".item"}),e.showHelpTip()}),100)},e.reset=function(){e.actionsPopover&&e.actionsPopover.hide(),e.pendingSaving=!0,p.reset().then(m.restart).then((function(){e.load(),e.pendingSaving=!1}))},e.changeLanguage=function(e){s.use(e)},e.changeNode=function(n){var t=e.formData.node.port&&80!=e.formData.node.port&&443!=e.formData.node.port?e.formData.node.port:void 0;n=n||{host:e.formData.node.host,port:t,useSsl:angular.isDefined(e.formData.node.useSsl)?e.formData.node.useSsl:443==e.formData.node.port},e.showNodePopup(n).then((function(n){if(n.host!==e.formData.node.host||n.port!==e.formData.node.port||n.useSsl!==e.formData.node.useSsl||e.formData.node.temporary){r.loading.show();var t=c.instance(n.host,n.port,n.useSsl,!0);t.isAlive().then((function(i){return i?(r.loading.hide(),angular.merge(e.formData.node,n),delete e.formData.node.temporary,c.copy(t),e.bma=c,m.restart(),a.clearCache()):(r.loading.hide(),r.alert.error("ERROR.INVALID_NODE_SUMMARY").then((function(){e.changeNode(n)})))}))}}))},e.showNodeList=function(){var n=!!("true"===u.httpsMode||!0===u.httpsMode||"force"===u.httpsMode||t.location&&"https:"===t.location.protocol);return i._popupStack[0].responseDeferred.promise.close(),l.showNetworkLookup({enableFilter:!0,bma:!0,ssl:!!n||void 0}).then((function(e){if(e){var n=e.getBMA();return{host:n.dns?n.dns:e.hasValid4(n)?n.ipv4:n.ipv6,port:n.port||80,useSsl:n.useSsl||443==n.port}}})).then((function(n){e.changeNode(n)}))},e.showNodePopup=function(t){return n((function(n,a){e.popupData.newNode=t.port?[t.host,t.port].join(":"):t.host,e.popupData.useSsl=t.useSsl,e.popupForm&&e.popupForm.$setPristine(),s(["SETTINGS.POPUP_PEER.TITLE","COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then((function(t){i.show({templateUrl:"templates/settings/popup_node.html",title:t["SETTINGS.POPUP_PEER.TITLE"],scope:e,buttons:[{text:t["COMMON.BTN_CANCEL"]},{text:t["COMMON.BTN_OK"],type:"button-positive",onTap:function(n){if(e.popupForm.$submitted=!0,e.popupForm.$valid&&e.popupForm.newNode)return{server:e.popupData.newNode,useSsl:e.popupData.useSsl};n.preventDefault()}}]}).then((function(e){if(e){var t=e.server.split(":");t[1]=t[1]?t[1]:e.useSsl?443:80,n({host:t[0],port:t[1],useSsl:e.useSsl})}else r.loading.hide()}))}))}))},e.save=function(){return e.loading||e.pendingSaving?n.when():e.saving?(e.pendingSaving=!0,o((function(){return e.pendingSaving=!1,e.save()}),500)):(e.saving=!0,o((function(){return e.cleanupHelpTip(),p.apply(e.formData),p.store()}),100).then((function(){e.saving=!1})))},e.onDataChanged=function(t,a,i){return e.loading||e.pendingSaving?n.when():e.saving?(e.pendingSaving=!0,o((function(){return e.pendingSaving=!1,e.onDataChanged(t,a,i)}),500)):void(i!==e||angular.equals(t,a)||e.save())},e.$watch("formData",e.onDataChanged,!0),e.getServer=function(){return e.formData.node&&e.formData.node.host?d.getServer(e.formData.node.host,e.formData.node.port):""},e.cleanupHelpTip=function(){if(e.formData.helptip.enable!==p.data.helptip.enable){var n=e.formData.helptip.enable;e.formData.helptip=angular.merge({},p.defaultSettings.helptip),e.formData.helptip.enable=n}},e.showActionsPopover=function(n){r.popover.show(n,{templateUrl:"templates/settings/popover_actions.html",scope:e,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.startSettingsTour=function(){return e.hideActionsPopover(),e.showHelpTip(0,!0)},e.showHelpTip=function(n,t){if((e.isLogin()||t)&&!((n=angular.isDefined(n)?n:p.data.helptip.settings)<0)){0===n&&(n=1);var a=e.createHelptipScope(t);if(a)return a.startSettingsTour(n,!1).then((function(e){a.$destroy(),p.data.helptip.settings=e,p.store()}))}}}function h(e){var n=this;Object.keys(e).forEach((function(t){n[t]=e[t]})),n.endpoints=n.endpoints||[]}function T(e,n){var t,a,i={user:"EVENT.USER.",page:"EVENT.PAGE.",market:"EVENT.MARKET."},o=this;function s(e){return e?e.substr(0,4)+e.substr(e.length-4):""}return e=e||{},o.id=e.id||""+Date.now(),o.type=e.type&&e.type.toLowerCase(),o.time=e.time,o.hash=e.hash,o.read=!!e.read_signature,o.message=e.reference&&i[e.reference.index]?i[e.reference.index]+e.code:"EVENT."+e.code,o.params=e.params,n&&"function"==typeof n&&(o.markAsReadCallback=n),o.markAsRead=function(){o.markAsReadCallback&&o.markAsReadCallback(o)},e.code=e.code||"",e.code.startsWith("MEMBER_")?(o.avatarIcon="ion-person",o.icon="ion-information-circled positive",o.state="app.view_wallet",o.medianTime=o.time):e.code.startsWith("TX_")?(o.avatarIcon="ion-card",o.icon="TX_SENT"===e.code?"ion-paper-airplane dark":"ion-archive balanced",o.medianTime=o.time,(t=e.params.length>0?e.params[0]:null)&&-1==t.indexOf(",")&&(o.pubkey=t),o.state="app.view_wallet_tx",o.stateParams={refresh:!0}):e.code.startsWith("CERT_")?(o.avatarIcon="CERT_RECEIVED"===e.code?"ion-ribbon-b":"ion-ribbon-a",o.icon="CERT_RECEIVED"===e.code?"ion-ribbon-b balanced":"ion-ribbon-a gray",o.pubkey=e.params.length>0?e.params[0]:null,o.medianTime=o.time,o.state="app.wallet_cert",o.stateParams={type:"CERT_RECEIVED"===e.code?"received":"given"}):e.code.startsWith("MESSAGE_")?(o.avatarIcon="ion-email",o.icon="ion-email dark",(t=e.params.length>0?e.params[0]:null)&&-1===t.indexOf(",")&&(o.pubkey=t),o.id=e.reference.id):e.reference&&"user"===e.reference.index&&"profile"===e.reference.type?(o.pubkey=e.params.length>0?e.params[0]:null,o.state="app.user_identity",o.stateParams={pubkey:o.pubkey,name:e.params&&e.params[3]},e.code.startsWith("LIKE_")?(o.avatarIcon="ion-person",o.icon="ion-ios-heart positive"):e.code.startsWith("STAR_")?(o.avatarIcon="ion-person",o.icon="ion-star gray"):e.code.startsWith("FOLLOW_")?(o.avatarIcon="ion-person",o.icon="ion-ios-people gray"):e.code.startsWith("ABUSE_")&&(o.avatarIcon="ion-person",o.icon="ion-android-warning assertive"),e.code.startsWith("MODERATION_")?(o.state="app.user_identity",o.stateParams={pubkey:e.reference.id,name:e.params&&e.params[3]},o.avatarIcon="ion-alert-circled",o.icon="ion-alert-circled energized",a=e.params&&e.params[4]||0,"MODERATION_RECEIVED"===e.code&&5==a&&(o.message="EVENT.USER.DELETION_RECEIVED",o.icon="ion-trash-a assertive")):(o.icon="ion-person dark",o.state="app.view_wallet")):e.reference&&"page"===e.reference.index?(o.pubkey=e.params.length>0?e.params[0]:null,o.avatarIcon="ion-social-buffer",e.reference.anchor?(o.icon="ion-ios-chatbubble-outline dark",o.state="app.view_page_anchor",o.stateParams={id:e.reference.id,title:e.params[1],anchor:s(e.reference.anchor)}):(o.icon="ion-social-buffer dark",o.state="app.view_page",o.stateParams={id:e.reference.id,title:e.params[1]}),e.code.startsWith("LIKE_")?(o.icon="ion-ios-heart positive",o.state="app.user_identity",o.stateParams={pubkey:o.pubkey,name:e.params&&e.params[3]}):e.code.startsWith("FOLLOW_")?(o.avatarIcon="ion-person",o.state="app.user_identity",o.stateParams={pubkey:o.pubkey,name:e.params&&e.params[3]}):e.code.startsWith("ABUSE_")?(o.icon="ion-alert-circled energized",o.state="app.user_identity",o.stateParams={pubkey:o.pubkey,name:e.params&&e.params[3]}):e.code.startsWith("MODERATION_")&&(o.avatarIcon="ion-alert-circled",o.icon="ion-alert-circled energized",a=e.params&&e.params[4]||0,"MODERATION_RECEIVED"===e.code&&5==a&&(o.message="EVENT.PAGE.DELETION_RECEIVED",o.icon="ion-trash-a assertive"))):e.reference&&"market"===e.reference.index?(o.avatarIcon="ion-speakerphone",o.pubkey=e.params.length>0?e.params[0]:null,e.reference.anchor?(o.icon="ion-ios-chatbubble-outline dark",o.state="app.market_view_record_anchor",o.stateParams={id:e.reference.id,title:e.params[2],anchor:s(e.reference.anchor)}):(o.icon="ion-speakerphone dark",o.state="app.market_view_record",o.stateParams={id:e.reference.id,title:e.params[2]}),e.code.startsWith("LIKE_")?o.icon="ion-ios-heart positive":e.code.startsWith("FOLLOW_")?o.avatarIcon="ion-person":e.code.startsWith("ABUSE_")?o.icon="ion-alert-circled energized":e.code.startsWith("MODERATION_")&&(o.avatarIcon="ion-alert-circled",o.icon="ion-alert-circled energized","MODERATION_RECEIVED"===e.code&&5==a&&(o.message="EVENT.MARKET.DELETION_RECEIVED",o.icon="ion-trash-a assertive"))):"INFO"===e.type?(o.avatarIcon="ion-information",o.icon="ion-information-circled positive"):"WARN"===e.type?(o.avatarIcon="ion-alert-circled",o.icon="ion-alert-circled energized"):"ERROR"===e.type&&(o.avatarIcon="ion-close",o.icon="ion-close-circled assertive"),o}function b(e,n){var t=this;t.id=e,t.message=null,t.html=null,t.issuer=null,t.time=null,t.creationTime=null,t.reply_to=null,t.replyCount=0,t.parent=null,t.replies=[],t.onRemoveListeners=[],t.copy=function(e){t.message=e.message,t.html=e.html,t.issuer=e.issuer,t.time=e.time,t.creationTime=e.creationTime||t.time,t.id=e.id||t.id,t.reply_to=e.reply_to||t.reply_to,t.name=e.name||t.name,t.avatarStyle=e.avatarStyle||t.avatarStyle,e.parent&&(t.parent=e.parent),e.replies&&t.setReplies(e.replies)},t.copyFromJson=function(e){t.message=e.message,t.issuer=e.issuer,t.time=e.time,t.creationTime=e.creationTime||t.time,t.reply_to=e.reply_to},t.addOnRemoveListener=function(e){e&&"function"==typeof e&&t.onRemoveListeners.push(e)},t.cleanAllListeners=function(){t.onRemoveListeners=[]},t.setReplies=function(e){t.removeAllReplies(),t.addReplies(e)},t.addReplies=function(e){e&&e.length&&(e=e.sort((function(e,n){return e.time-n.time})),_.forEach(e,(function(e){e.parent=t,t.replies.push(e)})),t.replyCount+=e.length)},t.containsReply=function(e){return-1!=t.replies.indexOf(e)},t.addReply=function(e){t.replyCount+=1,t.replies.push(e),t.replies=t.replies.sort((function(e,n){return e.time-n.time})),e.parent=t},t.removeAllReplies=function(){if(t.replyCount){var e=t.replies.splice(0,t.replies.length);t.replyCount=0,_.forEach(e,(function(e){e.remove()}))}},t.removeReply=function(e){var n=_.findIndex(t.replies,{id:e});-1!=n&&(t.replyCount--,delete t.replies.splice(n,1)[0].parent)},t.remove=function(){t.parent&&(t.parent.removeReply(t.id),delete t.parent),t.onRemoveListeners.length&&(_.forEach(t.onRemoveListeners,(function(e){e(t)})),t.issuer=null,t.message=null,t.cleanAllListeners())},n&&"object"==typeof n&&t.copyFromJson(n)}function v(e,n,t,a){e.selectNewPicture=function(n){if(a.enable)e.openPicturePopup();else{var t=angular.element(document.querySelector(n||"#pictureFile"));t&&t.length>0&&t[0].click()}},e.openPicturePopup=function(){a.camera.getPicture().then((function(n){e.pictures.push({src:"data:image/png;base64,"+n,isnew:!0})})).catch(n.onError("ERROR.TAKE_PICTURE_FAILED"))},e.onFileChanged=function(t){if(t&&t.file){n.loading.show();var a=t.file;return n.image.resizeFile(a).then((function(t){e.pictures.push({src:t,isnew:!0}),n.loading.hide(100)})).catch((function(e){console.error(e),n.loading.hide()}))}},e.removePicture=function(n){e.pictures.splice(n,1)},e.favoritePicture=function(n){if(n>0){var t=e.pictures[n];e.pictures.splice(n,1),e.pictures.splice(0,0,t)}},e.rotatePicture=function(t){var a=e.pictures[t];n.image.rotateSrc(a.src).then((function(e){a.src=e}))}}function O(e,n,t,a){e.loading=!0,e.allCategories=[],e.categories=[],this.searchText="",this.title=a&&a.title,e.afterLoad=function(a){e.categories=a,e.allCategories=a,e.loading=!1,t((function(){n.ink()}),10)},this.doSearch=function(){var n=this.searchText.toLowerCase().trim();n.length>1?(e.loading=!0,e.categories=e.allCategories.reduce((function(e,t){return t.parent&&-1!=t.name.toLowerCase().search(n)?e.concat(t):e}),[]),e.loading=!1):e.categories=e.allCategories},a&&a.categories?e.afterLoad(a.categories):a&&a.load&&a.load().then((function(n){e.afterLoad(n)}))}function R(e,n,t,a,i,o,s){e.loading=!0,e.defaultCommentSize=5,e.formData={},e.comments={},e.$on("$recordView.enter",(function(n,t){e.loading?e.anchor=t&&t.stateParams.anchor:e.id&&e.load(e.id,{animate:!1})})),e.$on("$recordView.load",(function(n,t,a){e.id=t||e.id,e.service=a.comment||e.service,e.service?(console.debug("[ES] [comment] Will use {"+e.service.index+"} service"),e.id&&e.load(e.id).then((function(){if(e.anchor)return i(e.scrollToAnchor,500)}))):console.error("[ES] [comment] Missing service in the emitted event '$recordView.load' !")})),e.load=function(n,t){return(t=t||{}).from=t.from||0,t.size=t.size||e.anchor&&-1,t.size=t.size||e.defaultCommentSize,t.animate=!angular.isDefined(t.animate)||t.animate,t.loadAvatarAllParent=!angular.isDefined(t.loadAvatarAllParent)||t.loadAvatarAllParent,e.loading=!0,e.service.load(n,t).then((function(a){!t.animate&&a.result.length&&_.forEach(a.result,(function(e){e.isnew=!0})),e.comments=a,e.comments.hasMore=a.total>a.result.length,e.loading=!1,e.service.changes.start(n,a,e),e.motion.show({selector:".comments .item",ink:!1})}))},e.$on("$recordView.beforeLeave",(function(){if(e.comments){if(!e.service)return void console.error("[comment] Comment controller has no service ! Unable to listen changes...");e.service.changes.stop(e.comments)}})),e.scrollToAnchor=function(){if(e.anchor){var n=document.getElementsByName(e.anchor);if(!n||!n.length)return i(e.scrollToAnchor,500);for(var t=0;t<n.length-1;t++)angular.element(n[t]).remove();o(e.anchor),i((function(){e.anchor=null}),1500)}},e.showMore=function(){e.load(e.id,{from:0,size:-1,loadAvatarAllParent:!1}).then((function(){e.motion.show({selector:".card-avatar"})}))},e.onKeypress=function(n){n&&10==n.charCode&&n.ctrlKey&&(e.save(),n.preventDefault())},e.save=function(){e.formData.message&&e.formData.message.length&&e.loadWallet({minData:!0,auth:!0}).then((function(){s.loading.hide();var n=e.formData;return e.formData={},e.focusNewComment(),e.service.save(e.id,e.comments,n)})).then((function(){e.comments.total++})).catch(s.onError("COMMENTS.ERROR.FAILED_SAVE_COMMENT"))},e.share=function(a,i){var o,r=angular.copy(t.params);r.anchor?(r.anchor=n("formatHash")(i.id),o=t.href(t.current.name,r,{absolute:!0})):o=t.href(t.current.name,r,{absolute:!0})+"/"+n("formatHash")(i.id);var l=_.findIndex(e.comments.result,{id:i.id}),c=o+"?u="+(i.name||n("formatPubkey")(i.issuer));s.popover.show(a,{templateUrl:"templates/common/popover_share.html",scope:e,bindings:{titleKey:"COMMENTS.POPOVER_SHARE_TITLE",titleValues:{number:l?l+1:1},date:i.creationTime,value:c,postUrl:o,postMessage:i.message},autoselect:".popover-share input"})},e.edit=function(n){var t=new b;t.copy(n),e.formData=t},e.remove=function(n){n&&(n.remove(),e.comments.total--)},e.reply=function(n){n&&n.id&&(e.formData={parent:n},e.focusNewComment(!0))},e.cancel=function(){e.formData={},e.focusNewComment()},e.focusNewComment=function(e){s.screen.isSmall()?e&&a("comment-form-input"):a("comment-form-textarea")},e.removeParentLink=function(){delete e.formData.parent,delete e.formData.reply_to,e.focusNewComment()},e.toggleExpandedReplies=function(e,n){e.expandedReplies=e.expandedReplies||{},e.expandedReplies[n]=!e.expandedReplies[n]},e.toggleExpandedParent=function(e,n){e.expandedParent=e.expandedParent||{},e.expandedParent[n]=!e.expandedParent[n]}}function I(e,n,t,a,i){e.socialData={url:null,reorder:!1},e.addSocialNetwork=function(){if(e.socialData.url&&0!==e.socialData.url.trim().length){e.formData.socials=e.formData.socials||[];var o=e.socialData.url.trim();if(_.findWhere(e.formData.socials,{url:o}))e.socialData.url="";else{var s=i.get(o);if(!s)return a.alert.error("PROFILE.ERROR.INVALID_SOCIAL_NETWORK_FORMAT"),void n("socialUrl");e.formData.socials.push(s),e.socialData.url="",e.motion.show({selector:"#social-"+t("formatSlug")(s.url),startVelocity:1e4})}}},e.editSocialNetwork=function(t){var a=e.formData.socials[t];e.formData.socials.splice(t,1),e.socialData.url=a.url,n("socialUrl")},e.reorderSocialNetwork=function(n,t,a){n&&t!==a&&(e.formData.socials.splice(t,1),e.formData.socials.splice(a,0,n))},e.filterFn=function(e){return!e.recipient||e.valid}}function N(e){e.openSocial=function(n,t){return n.stopPropagation(),e.openLink(n,t.url,{type:t.type})},e.filterFn=function(e){return!e.recipient||e.valid}}function S(e,n){e.formData={initCrop:!1,imageCropStep:0,imgSrc:void 0,result:void 0,resultBlob:void 0},e.onFileChanged=function(t){if(t&&t.file){var a=new FileReader;a.readAsDataURL(t.file),a.onload=function(t){var a=this.result;e.$applyAsync((function(){e.formData.imgSrc=n.getTrustedHtml(a)}))}}},e.doNext=function(){2===e.formData.imageCropStep?e.doCrop():3===e.formData.imageCropStep&&e.closeModal(e.formData.result)},e.doPrevious=function(){e.formData.imageCropStep-=1,1===e.formData.imageCropStep&&(e.formData.imgSrc=void 0)},e.doCrop=function(){e.formData.initCrop=!0},e.clear=function(){e.formData={initCrop:!1,imageCropStep:1,imgSrc:void 0,result:void 0,resultBlob:void 0}}}function A(e,n,t,a){var i=n.plugins&&n.plugins.es&&n.plugins.es.defaultCountry,o=!1;e.options=e.options||{},e.options.position=e.options.position||{showCheckbox:!0,required:!1},e.formPosition={loading:!1,enable:!!angular.isDefined(e.options.position.required)&&e.options.position.required},e.searchModalOpened=!1,e.tryToLocalize=function(){if(!e.formPosition.loading&&!o){var n=e.getAddressToSearch();return n?(e.formPosition.loading=!0,t.point.searchByAddress(n).then((function(t){return t&&1===t.length?e.updateGeoPoint(t[0]):e.openSearchLocationModal({text:n,results:t||[],forceFallback:!t||!t.length})})).then((function(){e.formPosition.loading=!1})).catch((function(n){console.error(n),e.formPosition.loading=!1}))):(o=!0,t.point.current().then(e.updateGeoPoint).then((function(){o=!1})).catch((function(e){console.error(e),o=!1})))}},e.onCityChanged=function(){if(!e.loading)return e.formPosition.enable?(e.formData.geoPoint&&(e.formData.geoPoint.lat=void 0,e.formData.geoPoint.lon=void 0),e.tryToLocalize()):void 0},e.onUseGeopointChanged=function(){e.loading||(e.formPosition.enable?e.tryToLocalize():e.formData.geoPoint&&(e.formData.geoPoint.lat=void 0,e.formData.geoPoint.lon=void 0,e.dirty=!0))},e.onGeopointChanged=function(){e.loading&&(e.formPosition.enable=e.formData.geoPoint&&!!e.formData.geoPoint.lat&&!!e.formData.geoPoint.lon)},e.$watch("formData.geoPoint",e.onGeopointChanged),e.getAddressToSearch=function(){return e.formData.address&&e.formData.city?[e.formData.address.trim(),e.formData.city.trim()].join(", "):e.formData.city||e.formData.address||e.formData.location},e.updateGeoPoint=function(n){if(n&&n.lat&&n.lon&&(e.dirty=!0,e.formData.geoPoint=e.formData.geoPoint||{},e.formData.geoPoint.lat=parseFloat(n.lat),e.formData.geoPoint.lon=parseFloat(n.lon),n.address&&n.address.city)){var t=[n.address.city];n.address.postcode&&t.push(n.address.postcode),n.address.country!==i&&t.push(n.address.country),e.formData.city=t.join(", ")}},e.openSearchLocationModal=function(n){if(!e.searchModalOpened){e.searchModalOpened=!0;var t={text:(n=n||{}).text||e.getAddressToSearch(),results:n.results,fallbackText:n.fallbackText||e.formData.city,forceFallback:angular.isDefined(n.forceFallback)?n.forceFallback:void 0};return a.show("plugins/es/templates/common/modal_location.html","ESSearchPositionModalCtrl",t,{focusFirstInput:!0}).then((function(n){e.searchModalOpened=!1,e.updateGeoPoint(n)})).catch((function(n){console.error(n),e.searchModalOpened=!1}))}}}function D(e,n,t,a,i){var o=t.plugins&&t.plugins.es&&t.plugins.es.defaultCountry,s=!1;e.geoDistanceLabels=[5,10,20,50,100,250,500].reduce((function(e,n){return e[n]={labelKey:"LOCATION.DISTANCE_OPTION",labelParams:{value:n}},e}),{}),e.geoDistances=_.keys(e.geoDistanceLabels),e.searchPosition=function(t){if(s)return n.when();s=!0;var i=t?a.point.searchByAddress(t).then((function(n){return n&&1===n.length?(n[0].exact=!0,n[0]):e.openSearchLocationModal({text:t,results:n||[],forceFallback:!n||!n.length}).then((function(e){if(e&&e.address&&e.address.city){var n=[e.address.city];e.address.postcode&&n.push(e.address.postcode),e.address.country!==o&&n.push(e.address.country),e.shortName=n.join(", ")}return e}))})):a.point.current();return i.then((function(e){if(s=!1,e&&e.lat&&e.lon)return{lat:parseFloat(e.lat),lon:parseFloat(e.lon),name:e.shortName,exact:e.exact}})).catch((function(e){console.error(e),s=!1})),i},e.openSearchLocationModal=function(n){var t={text:(n=n||{}).text||e.getAddressToSearch(),results:n.results,fallbackText:n.fallbackText||e.search.location,forceFallback:angular.isDefined(n.forceFallback)?n.forceFallback:void 0};return i.show("plugins/es/templates/common/modal_location.html","ESSearchPositionModalCtrl",t,{focusFirstInput:!0})}}function C(e,n,t,a,i,o){var s=i.plugins&&i.plugins.es&&i.plugins.es.defaultCountry,r=!1;e.locations=void 0,e.selectLocationIndex=-1,e.onKeydown=function(n){switch(n.keyCode){case 27:e.hideDropdown();break;case 13:e.locations&&e.locations.length&&e.onEnter();break;case 38:e.onArrowUpOrDown(-1),n.preventDefault();break;case 40:e.onArrowUpOrDown(1),n.preventDefault();break;case 8:case 45:case 46:break;case 37:case 39:case 16:case 17:case 35:case 36:break;default:e.showDropdown()}},e.onEnter=function(){e.selectLocationIndex>-1?e.selectLocation(e.locations[e.selectLocationIndex]):e.selectLocation(e.locations[0])},e.onArrowUpOrDown=function(n){e.locations&&(e.selectLocationIndex+=n,e.selectLocationIndex>=e.locations.length&&(e.selectLocationIndex=0),e.selectLocationIndex<0&&(e.selectLocationIndex=e.locations.length-1),_.forEach(e.locations||[],(function(n,t){n.selected=t===e.selectLocationIndex})))},e.onLocationChanged=function(){r||e.search.loading||(e.search.geoPoint=void 0,e.showDropdown())},e.showDropdown=function(){var n=e.search.location&&e.search.location.trim();if(!n||n.length<3)return e.hideDropdown(!0);var t=e.requestId&&e.requestId+1||1;return e.requestId=t,r=!0,o.point.searchByAddress(n).then((function(n){e.requestId===t&&(r=!1,e.locations=n||[],e.license=n&&n.length&&n[0].license)})).catch((function(n){throw e.hideDropdown(),n}))},e.hideDropdown=function(t){return t?(e.locations=void 0,e.selectLocationIndex=-1,e.license=void 0,void(r=!1)):n((function(){r||(e.locations=void 0,e.license=void 0,r=!1)}),500)},e.selectLocation=function(n,t){if(r=!0,n)if(e.search.geoPoint=e.search.geoPoint||{},e.search.geoPoint.lat=parseFloat(n.lat),e.search.geoPoint.lon=parseFloat(n.lon),t)e.search.geoPoint.exact=!0;else if(n&&n.address&&n.address.city){var a=[n.address.city];n.address.postcode&&a.push(n.address.postcode),n.address.country!==s&&a.push(n.address.country),e.search.location=a.join(", ")}e.hideDropdown(!0)},e.openSearchLocationModal=function(n){var t={text:(n=n||{text:e.search.location}).text||e.search.location};return a.show("plugins/es/templates/common/modal_location.html","ESSearchPositionModalCtrl",t,{focusFirstInput:!0}).then(e.selectLocation)},e.showDistancePopover=function(n){t.popover.show(n,{templateUrl:"plugins/es/templates/common/popover_distances.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.selectDistance=function(n){e.search.geoDistance=n,e.actionsPopover&&e.actionsPopover.hide()}}function P(e,n,t,a,i){e.search={text:i.text||"",fallbackText:i.fallbackText||void 0,forceFallback:!!angular.isDefined(i.forceFallback)&&i.forceFallback,loading:!1,results:i.results||void 0},e.$on("modal.shown",(function(){e.doSearch(!0)})),e.doSearch=function(i){var o=e.search.text&&e.search.text.trim();if(!o)return n.when();e.search.loading=!0;var s=i&&e.search.fallbackText&&e.search.fallbackText.trim();return s=s&&s!==o?s:void 0,(i&&e.search.forceFallback&&e.search.results?n.when(e.search.results):a.point.searchByAddress(o)).then((function(e){return e&&e.length||!s?e:n.all([t("LOCATION.MODAL.ALTERNATIVE_RESULT_DIVIDER",{address:s}),a.point.searchByAddress(s)]).then((function(e){var n=e[0];return(e=e[1])&&e.length?[{name:n}].concat(e):e}))})).then((function(n){e.search.loading=!1,e.search.results=n||[],e.license=n&&n.length&&n[0].license})).catch((function(n){throw e.search.loading=!1,e.search.results=[],e.license=void 0,n}))}}function y(e,n,t,a,i,o,s,r,l){e.entered=!1,e.abuseData={},e.abuseLevels=[{value:1,label:"LOW"},{value:2,label:"LOW"}],e.staring=!1,e.options=e.options||{},e.options.like=e.options.like||{kinds:l.constants.KINDS,index:void 0,type:void 0,id:void 0},e.$on("$recordView.enter",(function(n,t){e.entered?e.likeData.id&&e.loadLikes(e.likeData.id):e.entered=!1})),e.$on("$recordView.load",(function(n,t){e.likeData.id=t||e.likeData.id,e.likeData.id&&e.loadLikes(e.likeData.id)})),e.initLikes=function(){if(!e.likeData)throw Error("Missing 'likeData' in scope. Cannot load likes counter");if(!e.options.like.service){if(!e.options.like.index||!e.options.like.type)throw Error("Missing 'options.like.index' or 'options.like.type' in scope. Cannot load likes counter");e.options.like.service=l.instance(e.options.like.index,e.options.like.type)}e.options.like.kinds||(e.options.like.kinds=_.filter(l.constants.KINDS,(function(n){var t=n.toLowerCase()+"s";return angular.isDefined(e.likeData[t])})))},e.loadLikes=function(t){if(!e.likeData.loading){t=t||e.likeData.id,e.initLikes();var a=e.options.like.kinds||[];if(a.length){e.likeData.loading=!0;var i=Date.now();return console.debug("[ES] Loading counter of {0}... ({1})".format(t.substring(0,8),a)),n.all(_.map(a,(function(n){var a=n.toLowerCase()+"s";return e.options.like.service.count(t,{issuer:s.isLogin()?s.data.pubkey:void 0,kind:n}).then((function(n){e.likeData[a]&&angular.merge(e.likeData[a],n)}))}))).then((function(){e.likeData.id=t,console.debug("[ES] Loading counter of {0} [OK] in {1}ms".format(t.substring(0,8),Date.now()-i)),_.contains(a,"VIEW")&&!e.canEdit&&e.markAsView(),e.$parent&&(console.debug("[ES] [likes] Adding data and functions to parent scope"),e.$parent.toggleLike=e.toggleLike,e.$parent.reportAbuse=e.reportAbuse),e.likeData.loading=!1})).catch((function(n){console.error(n&&n.message||n),e.likeData.loading=!1}))}}},e.markAsView=function(){if(e.likeData&&e.likeData.views&&!e.likeData.views.wasHit&&!(e.canEdit||e.formData&&s.isUserPubkey(e.formData.issuer))){var n=t((function(){s.isLogin()&&e.options.like.service.add(e.likeData.id,{kind:"view"}).then((function(){e.likeData.views.total=(e.likeData.views.total||0)+1})),n=null}),3e3);e.$on("$destroy",(function(){n&&t.cancel(n)}))}},e.toggleLike=function(a,i){if(e.initLikes(),!e.likeData.id)throw Error("Missing 'likeData.id' in scope. Cannot apply toggle");(i=i||{}).kind=i.kind&&i.kind.toUpperCase()||"LIKE";var r=i.kind.toLowerCase()+"s";return e.likeData[r]=e.likeData[r]||{},!0===e.likeData[r].loading||e.likeData.loading?(a.preventDefault(),n.reject()):"LIKE"===i.kind&&e.dislikes&&e.dislikes.wasHit?e.toggleLike(a,{kind:"dislike"}).then((function(){e.toggleLike(a,i)})):"DISLIKE"===i.kind&&e.likes&&e.likes.wasHit?e.toggleLike(a,{kind:"LIKE"}).then((function(){e.toggleLike(a,i)})):(e.likeData[r].loading=!0,(s.isLogin()?n.when():e.loadWallet({minData:!0})).then((function(){return e.options.like.service.toggle(e.likeData.id,i)})).then((function(n){o.loading.hide(),0!==n&&(e.likeData[r].total=(e.likeData[r].total||0)+n,e.likeData[r].wasHit=n>0),t((function(){e.likeData[r].loading=!1}),1e3)})).catch((function(n){console.error(n),e.likeData[r].loading=!1,o.loading.hide(),a.preventDefault()})))},e.setAbuseForm=function(n){e.abuseForm=n},e.showAbuseCommentPopover=function(n){return a(["COMMON.REPORT_ABUSE.TITLE","COMMON.REPORT_ABUSE.SUB_TITLE","COMMON.BTN_SEND","COMMON.BTN_CANCEL"]).then((function(n){return o.loading.hide(),i.show({templateUrl:"plugins/es/templates/common/popup_report_abuse.html",title:n["COMMON.REPORT_ABUSE.TITLE"],subTitle:n["COMMON.REPORT_ABUSE.SUB_TITLE"],cssClass:"popup-report-abuse",scope:e,buttons:[{text:n["COMMON.BTN_CANCEL"],type:"button-stable button-clear gray"},{text:n["COMMON.BTN_SEND"],type:"button button-positive ink",onTap:function(n){if(e.abuseForm.$submitted=!0,e.abuseForm.$valid&&e.abuseData.comment)return e.abuseData;n.preventDefault()}}]})})).then((function(n){if(e.abuseData={},n&&n.comment)return n;o.loading.hide()}))},e.reportAbuse=function(t,a){if(!(e.likeData&&e.likeData.abuses&&e.likeData.abuses.wasHit))return(a=a||{}).comment?(a.kind="ABUSE",e.toggleLike(t,a).then((function(){o.toast.show("COMMON.REPORT_ABUSE.CONFIRM.SENT")}))):(s.isLogin()?n.when():e.loadWallet({minData:!0})).then((function(){return e.showAbuseCommentPopover(t)})).then((function(n){if(n&&n.comment)return a.comment=n.comment,a.level=n.level||n.delete&&5||void 0,e.reportAbuse(t,a)}))},e.addStar=function(n){if(e.starsPopover)return e.starsPopover.hide().then((function(){e.starsPopover=null,e.addStar(n)}));if(!e.likeData.loading&&e.likeData.stars&&!e.likeData.stars.loading){if(!s.isLogin())return e.loadWallet({minData:!0}).then((function(t){if(t)return o.loading.show(),e.options.like.service.count(e.likeData.id,{issuer:t.pubkey,kind:"STAR"}).then((function(t){angular.merge(e.stars,t),e.addStar(n)}))})).catch((function(e){}));e.likeData.stars.loading=!0;var a=angular.merge({total:0,levelAvg:0,levelSum:0,level:0,wasHit:!1,wasHitId:void 0},e.likeData.stars),i=function(){a.wasHit=!0,a.level=n,a.levelAvg=Math.floor(10*(a.levelSum/a.total+.5))/10-.5,angular.merge(e.likeData.stars,a),o.loading.hide()};return a.wasHitId?(console.debug("[ES] Deleting previous star level... "+a.wasHitId),e.options.like.service.remove(a.wasHitId).catch((function(e){if(!e||404!==e.ucode)throw e})).then((function(){return console.debug("[ES] Deleting previous star level [OK]"),a.levelSum=a.levelSum-a.level+n,i(),t((function(){return console.debug("[ES] Sending new star level..."),e.options.like.service.add(e.likeData.id,{kind:"star",level:n||1})}),2e3)})).then((function(n){return a.wasHitId=n,console.debug("[ES] Star level successfully sent... "+n),o.loading.hide(),t((function(){e.likeData.stars.loading=!1}),1e3)})).catch((function(n){console.error(n&&n.message||n),e.likeData.stars.loading=!1,o.onError("MARKET.WOT.ERROR.FAILED_STAR_PROFILE")(n),e.loadLikes()}))):e.options.like.service.add(e.likeData.id,{kind:"star",level:n||1}).then((function(t){a.levelSum+=n,a.wasHitId=t,a.total+=1,i(),console.debug("[ES] Star level successfully sent... "+t),e.likeData.stars.loading=!1,o.loading.hide()})).catch((function(n){console.error(n&&n.message||n),e.likeData.stars.loading=!1,o.onError("MARKET.WOT.ERROR.FAILED_STAR_PROFILE")(n)}))}},e.removeStar=function(n){e.starsPopover&&e.starsPopover.hide(),e.likeData.loading||(e.likeData.stars.level=void 0,e.toggleLike(n,{kind:"star"}).then((function(){return t((function(){e.loadLikes()}),1e3)})))},e.showStarPopover=function(n){e.initLikes(),e.likeData.stars.loading||(angular.isUndefined(e.likeData.stars.level)&&(e.likeData.stars.level=0),o.popover.show(n,{templateUrl:"plugins/es/templates/common/popover_star.html",scope:e,autoremove:!0,afterShow:function(n){e.starsPopover=n}}))},s.api.data.on.reset(e,(function(){_.forEach(e.options.like.kinds||[],(function(n){var t=n.toLowerCase()+"s";e.likeData[t]&&(e.likeData[t].wasHit=!1,e.likeData[t].wasHitId=void 0,e.likeData[t].level=void 0)})),e.$broadcast("$$rebind::like")}),this)}function k(e,n,t){e.extensionPoint=t.extensions.points.current.get(),e.enable=!0}function M(e,n,t){e.extensionPoint=t.extensions.points.current.get(),e.enable=!0}function w(e,n,t,a,i){e.extensionPoint=t.extensions.points.current.get(),e.enable=a.isEnable(),e.showRegistryLookupView=function(){n.go(i.screen.isSmall()?"app.registry_lookup":"app.registry_lookup_lg")},e.showNotificationsPopover=function(n){return i.popover.show(n,{templateUrl:"plugins/es/templates/notification/popover_notification.html",scope:e,autoremove:!1})},e.showMessagesPopover=function(n){return i.popover.show(n,{templateUrl:"plugins/es/templates/message/popover_message.html",scope:e,autoremove:!1})},e.showInvitationsPopover=function(n){return i.popover.show(n,{templateUrl:"plugins/es/templates/invitation/popover_invitation.html",scope:e,autoremove:!1})},a.api.state.on.changed(e,(function(n){e.enable=n}))}function U(e,n,t,a){e.updateView=function(){e.enable=a.isLogin()&&(t.data.plugins&&t.data.plugins.es?t.data.plugins.es.enable:!!t.data.plugins.host)},e.showEditUserProfile=function(){e.closeProfilePopover(),n.go("app.user_edit_profile")},t.api.data.on.changed(e,e.updateView),t.api.data.on.ready(e,e.updateView),a.api.data.on.login(e,(function(n,t){return t=t||$q.defer(),e.updateView(),t.resolve(),t.promise})),a.api.data.on.logout(e,e.updateView),e.updateView()}function x(e,n,t,a,i,o,s,r,l,c,d,u,p){e.hasWindowNotification=!!("Notification"in window),e.formData={},e.popupData={},e.loading=!0,e.enter=function(n,t){e.load()},e.$on("$ionicView.enter",e.enter),e.load=function(n){e.loading=!0;var t=e.formData.enable;e.formData=c.data.plugins&&c.data.plugins.es?angular.copy(c.data.plugins.es):{enable:!1,host:void 0,port:void 0},n&&t&&(e.formData.enable=t),e.isFallbackNode=e.formData.enable&&d.node.isFallback(),e.server=e.getServer(d),e.loading=!1},u.api.state.on.changed(e,(function(n){e.load(!0)})),e.setPopupForm=function(n){e.popupForm=n},e.changeEsNode=function(n){n=n||{host:e.formData.host,port:e.formData.port&&80!=e.formData.port&&443!=e.formData.port?e.formData.port:void 0,useSsl:angular.isDefined(e.formData.useSsl)?e.formData.useSsl:443==e.formData.port},e.showNodePopup(n).then((function(n){if(n.host!=e.formData.host||n.port!=e.formData.port||n.useSsl!=e.formData.useSsl){o.loading.show();var t=d.instance(n.host,n.port,n.useSsl);return t.isAlive().then((function(a){return a?(e.formData.host=t.host,e.formData.port=t.port,e.formData.useSsl=t.useSsl,d.copy(t)):(o.loading.hide(),o.alert.error("ERROR.INVALID_NODE_SUMMARY").then((function(){e.changeEsNode(n)})))})).then((function(){e.server=e.getServer(d),e.isFallbackNode=!1,o.loading.hide()}))}o.loading.hide()}))},e.showNodePopup=function(n){return t((function(t,s){var r=[n.host];n.port&&80!=n.port&&r.push(n.port),e.popupData.newNode=r.join(":"),e.popupData.useSsl=angular.isDefined(n.useSsl)?n.useSsl:443==n.port,e.popupForm&&e.popupForm.$setPristine(),a(["ES_SETTINGS.POPUP_PEER.TITLE","ES_SETTINGS.POPUP_PEER.HELP","COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then((function(n){i.show({templateUrl:"templates/settings/popup_node.html",title:n["ES_SETTINGS.POPUP_PEER.TITLE"],subTitle:n["ES_SETTINGS.POPUP_PEER.HELP"],scope:e,buttons:[{text:n["COMMON.BTN_CANCEL"]},{text:n["COMMON.BTN_OK"],type:"button-positive",onTap:function(n){if(e.popupForm.$submitted=!0,e.popupForm.$valid&&e.popupForm.newNode)return{server:e.popupData.newNode,useSsl:e.popupData.useSsl};n.preventDefault()}}]}).then((function(e){if(e){var n=e.server.split(":");n[1]=n[1]?n[1]:e.useSsl?443:80,t({host:n[0],port:n[1],useSsl:e.useSsl})}else o.loading.hide()}))}))}))},e.showNodeList=function(){var t=!!("true"===l.httpsMode||!0===l.httpsMode||"force"===l.httpsMode||n.location&&"https:"===n.location.protocol);return i._popupStack[0].responseDeferred.promise.close(),p.showNetworkLookup({enableFilter:!0,endpoint:d.constants.GCHANGE_API,ssl:!!t||void 0}).then((function(e){if(e){var n=e.getEndpoints().reduce((function(e,n){var t=d.node.parseEndPoint(n);return t?e.concat(t):e}),[]);if(n.length){var t=n[0];return{host:t.dns?t.dns:e.hasValid4(t)?t.ipv4:t.ipv6,port:t.port||80,useSsl:t.useSsl||443==t.port}}}})).then((function(n){e.changeEsNode(n)}))},e.onFormChanged=function(){e.loading||(e.formData.notifications=e.formData.notifications||{},e.hasWindowNotification&&e.formData.notifications.emitHtml5!==("granted"===window.Notification.permission)?window.Notification.requestPermission((function(n){e.formData.notifications.emitHtml5="granted"===n,e.onFormChanged()})):(e.loading=!0,c.data.plugins=c.data.plugins||{},c.data.plugins.es=c.data.plugins.es?angular.merge(c.data.plugins.es,e.formData):e.formData,delete c.data.plugins.es.newNode,c.store().then((function(){e.loading=!1}))))},e.$watch("formData",e.onFormChanged,!0),e.getServer=function(n){if((n=n||e.formData).host)return r.getServer(n.host,n.port)}}function F(e,n,t,a,i){angular.extend(this,n("ESExtensionCtrl",{$scope:e})),e.showNewPageModal=function(e){return i.showNewPage(e)}}function H(e,n,t,a,i){e.options=e.options||{},e.options.like=e.options.like||{index:"user",type:"profile",service:i.like},e.canEdit=!0,angular.extend(this,n("ESLikesCtrl",{$scope:e})),angular.extend(this,n("ESExtensionCtrl",{$scope:e})),e.$watch("formData.pubkey",(function(n){n&&e.loadLikes(n)}))}function B(e,n,t,a,i,o,s,r,l){e.options=e.options||{},e.options.like=e.options.like||{kinds:r.constants.KINDS,index:"user",type:"profile",service:s.like},e.smallscreen=angular.isDefined(e.smallscreen)?e.smallscreen:a.screen.isSmall(),angular.extend(this,n("ESLikesCtrl",{$scope:e})),angular.extend(this,n("ESExtensionCtrl",{$scope:e})),e.showNewMessageModal=function(n){return e.loadWallet({minData:!0}).then((function(){return a.loading.hide(),!(!n&&!e.formData.profile)||a.alert.confirm("MESSAGE.CONFIRM.USER_HAS_NO_PROFILE").then((function(e){if(e)return!0}))})).then((function(n){return!!n&&l.showMessageCompose({destPub:e.formData.pubkey,destUid:e.formData.name||e.formData.uid}).then((function(e){e&&a.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))}))},e.$watch("formData.pubkey",(function(n){n&&e.loadLikes(n)})),e.showActionsPopover=function(n){a.popover.show(n,{templateUrl:"plugins/es/templates/wot/view_popover_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){return e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null),!0},"buttons-top-fab"===e.extensionPoint&&e.$on("$csExtension.motion",(function(n){e.formData.profile&&e.showFab("fab-compose-"+e.formData.pubkey)}))}function V(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E){e.formData={title:null,description:null,socials:[],geoPoint:{}},e.loading=!0,e.dirty=!1,e.walletData=null,e.avatar=null,e.existing=!1,e.socialData={url:null},e.socialReorder=!0,e.pubkeyPattern=d.regexp.PUBKEY,e.enter=function(n,t){e.loadWallet().then(e.load).catch((function(n){if("CANCELLED"===n)return c.loading.hide(10),void e.cancel();c.onError("PROFILE.ERROR.LOAD_PROFILE_FAILED")(n)}))},e.$on("$ionicView.enter",e.enter),e.$on("$stateChangeStart",(function(n,t,a,o){if(e.dirty&&!e.saving&&!n.defaultPrevented)return n.preventDefault(),e.loading?void 0:(e.loading=!0,c.alert.confirm("CONFIRM.SAVE_BEFORE_LEAVE","CONFIRM.SAVE_BEFORE_LEAVE_TITLE",{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES_SAVE"}).then((function(n){return e.loading=!1,n?(e.form.$submitted=!0,e.save(!1,!0).then((function(n){return n&&(e.dirty=!1),n}))):(e.dirty=!1,!0)})).then((function(e){e&&(l.nextViewOptions({historyRoot:!0}),i.go(t.name,a))})).catch((function(e){})))})),e.load=function(n){return e.loading=!0,p.get(n.pubkey,{raw:!0}).then((function(t){return t?(e.avatar=u.image.fromAttachment(t.source.avatar),e.existing=!0,e.updateView(n,t.source)):(e.avatar=void 0,e.existing=!1,e.updateView(n,{})),c.loading.hide(),a((function(){e.loading=!1}),1e3)})).then((function(){o("profile-name")})).catch(c.onError("PROFILE.ERROR.LOAD_PROFILE_FAILED"))},e.setForm=function(n){e.form=n},e.updateView=function(n,t){e.walletData=n,e.formData=t,t.avatar&&(e.avatarStyle={"background-image":'url("'+e.avatar.src+'")'}),e.formData.geoPoint=e.formData.geoPoint||{},e.motion.show()},e.onFormDataChanged=function(){e.loading||(e.dirty=!0)},e.$watch("formData",e.onFormDataChanged,!0),e.save=function(i,o){if(e.form.$invalid||!n.walletData||e.saving&&!o)return t.reject();if(!o)return console.debug("[ES] [profile] Waiting debounce end, before saving..."),e.saving=!0,a((function(){return e.save(i,!0)}),650);console.debug("[ES] [profile] Saving user profile...");var r=function(n){return function(t){e.saving=!1,c.onError(n)(t)}},l=function(n){n&&(e.walletData.name=n.title,e.avatar?e.walletData.avatar=e.avatar:delete e.walletData.avatar,e.walletData.profile=angular.copy(n),e.walletData.profile.description=u.util.parseAsHtml(n.description))},d=function(){if(!i)return s("PROFILE.INFO.PROFILE_SAVED").then((function(e){c.toast.show(e)}))},m=function(t){return t.socials&&t.socials.length&&(t.socials=_.uniq(t.socials,!1,(function(e){return e.url}))),t.position&&(t.position=null),t.geoPoint&&t.geoPoint.lat&&t.geoPoint.lon?(t.geoPoint.lat=parseFloat(t.geoPoint.lat),t.geoPoint.lon=parseFloat(t.geoPoint.lon)):t.geoPoint=null,e.existing?p.update(t,{id:n.walletData.pubkey}).then((function(){return console.info("[ES] Profile successfully updated."),e.saving=!1,e.dirty=!1,l(t),d(),!0})).catch(r("PROFILE.ERROR.SAVE_PROFILE_FAILED")):p.add(t).then((function(){return console.info("[ES] [profile] Successfully created."),e.existing=!0,e.saving=!1,e.dirty=!1,l(t),d(),!0})).catch(r("PROFILE.ERROR.SAVE_PROFILE_FAILED"))};return e.avatar&&e.avatar.src?c.image.resizeSrc(e.avatar.src,!0).then((function(n){return e.formData.avatar=u.image.toAttachment({src:n}),m(e.formData)})):(delete e.formData.avatar,m(e.formData))},e.saveAndClose=function(){return e.save().then((function(n){n&&e.close()}))},e.submitAndSaveAndClose=function(){e.form.$submitted=!0,e.saveAndClose()},e.cancel=function(){return e.dirty=!1,i.go("app.view_wallet")},e.close=function(){return i.go("app.view_wallet",{refresh:!0})},e.showAvatarModal=function(){return E.camera.enable?E.camera.getPicture().then((function(n){n&&(e.avatar={src:"data:image/png;base64,"+n},e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0)})).catch(c.onError("ERROR.TAKE_PICTURE_FAILED")):m.show("plugins/es/templates/common/modal_edit_avatar.html","ESAvatarModalCtrl",{}).then((function(n){n&&(e.avatar={src:n},e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0)}))},e.rotateAvatar=function(){if(e.avatar&&e.avatar.src&&!e.rotating)return e.rotating=!0,c.image.rotateSrc(e.avatar.src).then((function(n){e.avatar.src=n,e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0,e.rotating=!1})).catch((function(n){console.error(n),e.rotating=!1}))},e.removeProfile=function(){return e.hideActionsPopover(),e.existing&&e.loadWallet({minData:!0}).then((function(n){c.loading.hide(),c.alert.confirm("PROFILE.CONFIRM.DELETE",void 0,{okText:"COMMON.BTN_DELETE"}).then((function(t){if(t)return console.debug("[ES] [profile] Deleting user profile..."),p.remove(n.pubkey).then((function(){return n.name=null,n.profile=null,n.avatar=null,console.debug("[ES] [profile] Successfully deleted"),e.dirty=!1,e.close()})).then((function(){return a((function(){c.toast.show("PROFILE.INFO.PROFILE_REMOVED")}),750)})).catch(c.onError("PROFILE.ERROR.REMOVE_PROFILE_FAILED"))}))}))},e.showActionsPopover=function(n){c.popover.show(n,{templateUrl:"plugins/es/templates/user/edit_popover_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)}}function G(e,n,t,a,i,o,s,r,l,c){e.loading=!0,e.messages=[],e.$on("$ionicView.enter",(function(t,i){e.loadWallet({minData:!0}).then((function(){e.entered||(e.entered=!0,e.type=i.stateParams&&i.stateParams.type||"inbox",e.load()),e.showFab("fab-add-message-record")})).catch((function(e){"CANCELLED"===e&&(a.nextViewOptions({historyRoot:!0}),n.go("app.home"))}))})),e.refresh=function(n){return e.load(void 0,void 0,n)},e.load=function(n,t,a){var i={};return i.from=t||0,i.size=n||20,i.type=e.type,e.loading=!a,c.load(i).then((function(n){e.messages=n,r.loading.hide(),e.loading=!1,n.length>0&&e.motion.show({selector:".view-messages .list .item"})})).catch((function(n){r.onError("MESSAGE.ERROR.LOAD_MESSAGES_FAILED")(n),e.messages=[],e.loading=!1}))},e.setType=function(n){e.type=n,e.load()},e.markAllAsRead=function(){e.hideActionsPopover(),e.messages&&e.messages.length&&r.alert.confirm("MESSAGE.CONFIRM.MARK_ALL_AS_READ").then((function(n){n&&c.markAllAsRead().then((function(){_.forEach(e.messages,(function(e){e.read=!0}))})).catch(r.onError("MESSAGE.ERROR.MARK_ALL_AS_READ_FAILED"))}))},e.delete=function(n){var t=e.messages[n];t&&r.alert.confirm("MESSAGE.CONFIRM.REMOVE").then((function(a){a&&c.remove(t.id,e.type).then((function(){e.messages.splice(n,1),r.toast.show("MESSAGE.INFO.MESSAGE_REMOVED")})).catch(r.onError("MESSAGE.ERROR.REMOVE_MESSAGE_FAILED"))}))},e.deleteAll=function(){e.hideActionsPopover(),e.messages&&e.messages.length&&r.alert.confirm("MESSAGE.CONFIRM.REMOVE_ALL").then((function(n){n&&c.removeAll(e.type).then((function(){e.messages.splice(0,e.messages.length),r.toast.show("MESSAGE.INFO.All_MESSAGE_REMOVED")})).catch(r.onError("MESSAGE.ERROR.REMOVE_All_MESSAGES_FAILED"))}))},e.showNewMessageModal=function(n){return e.loadWallet({minData:!0}).then((function(){return r.loading.hide(),s.showMessageCompose(n).then((function(e){e&&r.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))}))},e.showReplyModal=function(n){var a=e.messages[n];a&&t("MESSAGE.REPLY_TITLE_PREFIX").then((function(e){var n=a.content?a.content.replace(/^/g," > "):null;return n=(n=n?n.replace(/\n/g,"\n > "):null)?n+"\n":null,s.showMessageCompose({destPub:a.issuer,destUid:a.name,title:e+a.title,content:n,isReply:!0})})).then((function(e){e&&r.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):i.fromTemplateUrl("plugins/es/templates/message/lookup_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.onMessageDelete=function(n){var t=_.findIndex(e.messages,(function(e){return e.id==n}));t&&e.messages.splice(t,1)},c.api.data.on.delete(e,e.onMessageDelete),e.onNewOutboxMessage=function(n){if("outbox"==e.type)return e.loading=!0,o((function(){return c.get(n,{type:e.type,summary:!0})}),500).then((function(n){e.messages.splice(0,0,n),e.loading=!1,e.motion.show({selector:".view-messages .list .item"})})).catch((function(){e.loading=!1}))},c.api.data.on.sent(e,e.onNewOutboxMessage),e.onNewInboxMessage=function(n){if("inbox"==e.type&&e.entered)return e.loading=!0,c.get(n.id,{type:e.type,summary:!0}).then((function(n){e.messages.splice(0,0,n),e.loading=!1,e.motion.show({selector:".view-messages .list .item"})})).catch((function(){e.loading=!1}))},c.api.data.on.new(e,e.onNewInboxMessage),e.onUnauth=function(){e.messages=void 0,e.loading=!1,e.entered=!1},l.api.data.on.unauth(e,e.onUnauth)}function W(e,n,t){angular.extend(this,n("ESMessageComposeModalCtrl",{$scope:e,parameters:{}})),e.$on("$ionicView.enter",(function(n,a){a.stateParams&&(a.stateParams.pubkey&&(e.formData.destPub=a.stateParams.pubkey,a.stateParams.name?(e.destUid=a.stateParams.name,e.destPub=""):(e.destUid="",e.destPub=e.formData.destPub)),a.stateParams.title&&(e.formData.title=a.stateParams.title),a.stateParams.content&&(e.formData.content=a.stateParams.content)),e.loadWallet({minData:!0}).then((function(){t.loading.hide()})).catch((function(n){"CANCELLED"===n&&e.showHome()}))})),e.cancel=function(){e.showHome()},e.setForm=function(n){e.form=n},e.closeModal=function(){e.showHome()}}function Y(e,n,t,a,i,o,s){e.formData={title:s?s.title:null,content:s?s.content:null,destPub:s?s.destPub:null},e.destUid=s?s.destUid:null,e.destPub=s&&!s.destUid?s.destPub:null,e.isResponse=!!s&&s.isResponse,e.doSend=function(n){if(e.form.$submitted=!0,e.form.$valid){if(!(n||e.formData.content&&e.formData.content.trim().length))return t.alert.confirm("MESSAGE.COMPOSE.CONTENT_CONFIRMATION").then((function(n){n&&e.doSend(!0)}));t.loading.show();var s={issuer:a.data.pubkey,recipient:e.formData.destPub,title:e.formData.title,content:e.formData.content,time:i.date.now()};o.send(s).then((function(n){e.id=n,t.loading.hide(),e.closeModal(n)})).catch(t.onError("MESSAGE.ERROR.SEND_MSG_FAILED"))}},e.showWotLookupModal=function(){n.showWotLookup().then((function(n){n&&(n.name?(e.destUid=n.name,e.destPub=""):(e.destUid="",e.destPub=n.pubkey),e.formData.destPub=n.pubkey)}))},e.cancel=function(){e.closeModal()}}function $(e,n,t,a,i,o,s,r,l){e.formData={},e.id=null,e.loading=!0,e.$on("$ionicView.enter",(function(a,i){i.stateParams&&i.stateParams.id?(e.loading&&(e.type=i.stateParams.type||"inbox",e.load(i.stateParams.id,e.type).then((function(n){e.loading=!1,s.loading.hide(),n&&(e.id=n.id,e.formData=n,e.canDelete=!0,e.motion.show({selector:".view-message .list .item"}),n.read||t((function(){e.id===n.id&&l.markAsRead(n,e.type).then((function(){console.debug("[message] marked as read")})).catch(s.onError("MESSAGE.ERROR.MARK_AS_READ_FAILED"))}),2e3))}))),e.showFab("fab-view-message-reply")):n.go("app.user_message")})),e.load=function(t,a){return a=a||"inbox",e.loadWallet({minData:!0}).then((function(){return l.get(t,{type:a})})).catch(s.onError("MESSAGE.ERROR.LOAD_MESSAGE_FAILED")).then((function(t){return t.valid?t:s.alert.error(e.isUserPubkey(t.recipient)?"MESSAGE.ERROR.NOT_AUTHENTICATED_MESSAGE":"MESSAGE.ERROR.USER_NOT_RECIPIENT","MESSAGE.ERROR.MESSAGE_NOT_READABLE").then((function(){n.go("app.user_message",{type:a})}))}))},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.delete=function(){e.hideActionsPopover(),setTimeout((function(){return s.alert.confirm("MESSAGE.CONFIRM.REMOVE").then((function(t){if(t)return l.remove(e.id,e.type).then((function(){i.nextViewOptions({historyRoot:!0}),n.go("app.user_message",{type:e.type}),s.toast.show("MESSAGE.INFO.MESSAGE_REMOVED")})).catch(s.onError("MESSAGE.ERROR.REMOVE_MESSAGE_FAILED"))}))}),100)},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):o.fromTemplateUrl("plugins/es/templates/message/view_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showReplyModal=function(){var n="inbox"===e.type?"issuer":"recipient";a("MESSAGE.REPLY_TITLE_PREFIX").then((function(t){var a=e.formData.content?e.formData.content.replace(/^/g," > "):null;return a=(a=a?a.replace(/\n/g,"\n > "):null)?a+"\n":null,r.showMessageCompose({destPub:e.formData[n],destUid:e.formData.name,title:t+e.formData.title,content:a,isReply:!0})})).then((function(e){e&&s.toast.show("MESSAGE.INFO.MESSAGE_SENT").then((function(){i.goBack()}))}))}}function j(e,n,t,a,i,o,s,r){e.search={loading:!0,results:null,hasMore:!1,loadingMore:!1,limit:40},e.$on("popover.shown",(function(){e.search.loading&&e.load()})),e.load=function(t,a){var i={};return i.from=t||0,i.size=a||40,s.notifications.load(i).then((function(n){e.search.results=t?e.search.results.concat(n):n,e.search.loading=!1,e.search.hasMore=e.search.results&&e.search.results.length>=e.search.limit,e.updateView()})).catch((function(a){e.search.loading=!1,t||(e.search.results=[]),e.search.hasMore=!1,n.onError("MESSAGE.ERROR.LOAD_NOTIFICATIONS_FAILED")(a)}))},e.updateView=function(){e.motion&&e.search.results&&e.search.results.length&&e.motion.show({selector:".popover-notification .item"})},e.showMore=function(){e.search.limit=e.search.limit||40,e.search.limit=2*e.search.limit,e.search.limit<40&&(e.search.limit=40),e.search.loadingMore=!0,e.load(e.search.results.length,e.search.limit).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.onNewMessageNotification=function(n){e.search.loading||e.search.loadingMore||(e.search.results.splice(0,0,n),e.updateView())},e.select=function(n){n.read||(n.read=!0),t.go("app.user_view_message",{id:n.id,type:"inbox"}),e.closePopover(n)},e.resetData=function(){e.search.loading||(console.debug("[ES] [messages] Resetting data (settings or account may have changed)"),e.search.hasMore=!1,e.search.results=[],e.search.loading=!0,delete e.search.limit)},e.showNewMessageModal=function(t){e.closePopover(),a((function(){r.showMessageCompose(t).then((function(e){e&&n.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))}),500)},i.api.data.on.logout(e,e.resetData),o.api.node.on.stop(e,e.resetData),o.api.node.on.start(e,e.load),s.api.data.on.new(e,e.onNewMessageNotification)}function K(e,n,t,a,i,o,s,r,l,c){e.search={loading:!0,results:null,hasMore:!1,loadingMore:!1,limit:40,options:{codes:{excludes:c.constants.EXCLUDED_CODES}}},e.$on("$ionicView.enter",(function(){e.search.loading&&(e.load(),i((function(){e.resetUnreadCount()}),1e3))})),e.load=function(n,t){var a=angular.copy(e.search.options);return a.from=a.from||n||0,a.size=a.size||t||40,e.search.loading=!0,c.load(l.data.pubkey,a).then((function(t){n?t&&(e.search.results=e.search.results.concat(t)):e.search.results=t||[],e.search.loading=!1,e.search.hasMore=e.search.results.length>=e.search.limit,e.updateView()})).catch((function(t){e.search.loading=!1,n||(e.search.results=[]),e.search.hasMore=!1,o.onError("COMMON.NOTIFICATIONS.LOAD_NOTIFICATIONS_FAILED")(t)}))},e.updateView=function(){e.motion&&e.motion.ionListClass&&e.search.results.length&&e.motion.show({selector:".view-notification .item"})},e.markAllAsRead=function(){e.hideActionsPopover(),e.search.results.length&&o.loading.show().then((function(){n.walletData.notifications.unreadCount=0;var t=e.search.results[0];return n.walletData.notifications.readTime=t?t.time:0,_.forEach(e.search.results,(function(e){e.markAsRead&&"function"==typeof e.markAsRead&&e.markAsRead()})),o.loading.hide()}))},e.resetUnreadCount=function(){if(l.data.notifications.unreadCount&&e.search.results&&e.search.results.length){l.data.notifications.unreadCount=0;var n=e.search.results[0],t=n.time?n.time:0;!t||r.data.wallet&&r.data.wallet.notificationReadTime==t||(r.data.wallet=r.data.wallet||{},r.data.wallet.notificationReadTime=t,r.store())}},e.select=function(e){e.markAsRead&&"function"==typeof e.markAsRead&&e.markAsRead(),e.state&&a.go(e.state,e.stateParams)},e.showMore=function(){e.search.limit=e.search.limit||40,e.search.limit+=40,e.search.limit<40&&(e.search.limit=40),e.search.loadingMore=!0,e.load(e.search.results.length,e.search.limit).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.onNewNotification=function(n){if(!e.search.loading&&!e.search.loadingMore){var t=_.findIndex(e.search.results,(function(e){return n.time>e.time}));t<0&&(t=0),e.search.results.splice(t,0,n),e.updateView()}},e.resetData=function(){e.search.loading||(console.debug("[ES] [notifications] Resetting data (settings or account may have changed)"),e.search.hasMore=!1,e.search.results=[],e.search.loading=!0,delete e.search.limit)},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):t.fromTemplateUrl("plugins/es/templates/notification/popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},l.api.data.on.logout(e,e.resetData),s.api.node.on.stop(e,e.resetData),s.api.node.on.start(e,e.load),c.api.data.on.new(e,e.onNewNotification)}function q(e,n,t,a,i){angular.extend(this,t("NotificationsCtrl",{$scope:e})),e.motion=null,e.$on("popover.shown",(function(){e.search.loading&&e.load()})),e.updateView=function(){e.search.results.length&&n((function(){a.ink({selector:".popover-notification .item.ink"})}),100)},e.$on("popover.hidden",e.resetUnreadCount),e.select=function(n){n&&(n.markAsRead&&"function"==typeof n.markAsRead&&n.markAsRead(),n.state&&i.go(n.state,n.stateParams),e.closePopover(n))}}function z(e,n,t,a,i,o,s,r){var l;e.loading=!0,e.popupData={},e.search={results:[],loading:!0},e.emailFrequencies=[{id:"daily",label:"daily"},{id:"weekly",label:"weekly"}],e.enter=function(n,a){if(e.loading){if(!(l=a.stateParams&&a.stateParams.id?i.children.get(a.stateParams.id):i))return o.alert.error("ERROR.UNKNOWN_WALLET_ID"),e.showHome();e.loadWallet({wallet:l,auth:!0,minData:!0}).then((function(){return o.loading.hide(),e.load()})).then((function(){e.showFab("fab-add-subscription-record")})).catch((function(n){if("CANCELLED"===n)return o.loading.hide(10),e.loading=!0,void t.goBack();o.onError("SUBSCRIPTION.ERROR.LOAD_SUBSCRIPTIONS_FAILED")(n)}))}},e.$on("$ionicView.enter",e.enter),e.load=function(){return e.loading=!0,r.record.load(l.data.pubkey,l.data.keypair).then((function(e){var n=_.groupBy(e||[],(function(e){return[e.type,e.recipient].join("|")}));return _.keys(n).reduce((function(e,t){var a=t.split("|");return e.concat({type:a[0],recipient:a[1],items:n[t]})}),[])})).then((function(e){return a.extendAll(e,"recipient")})).then(e.updateView).catch((function(n){o.loading.hide(10),n&&404==n.ucode?(e.updateView([]),e.existing=!1):o.onError("PROFILE.ERROR.LOAD_PROFILE_FAILED")(n)}))},e.updateView=function(n){n&&(e.search.results=n),e.search.results&&e.search.results.length&&e.motion.show(),e.search.loading=!1},e.addSubscription=function(){e.showCategoryModal().then((function(n){if(n){if("email"===n.id)return e.showEmailModal();o.alert.notImplemented()}})).then((function(n){n&&(o.loading.show(),r.record.add(n,l).then(e.addToUI).then((function(){l.data.subscriptions=l.data.subscriptions||{count:0},l.data.subscriptions.count++,o.loading.hide(),e.updateView()})).catch(o.onError("SUBSCRIPTION.ERROR.ADD_SUBSCRIPTION_FAILED")))}))},e.editSubscription=function(n){var t,a=angular.copy(n);if("email"===n.type&&(t=e.showEmailModal(n)),t)return t.then((function(t){if(t)return o.loading.show(),n.id=a.id,r.record.update(n,l).then((function(){if(a.type!==n.type||a.recipient!==n.recipient)return e.removeFromUI(a),e.addToUI(n)})).then((function(){o.loading.hide(),e.updateView()})).catch(o.onError("SUBSCRIPTION.ERROR.UPDATE_SUBSCRIPTION_FAILED"))}))},e.deleteSubscription=function(n,t){if(n&&n.id){if(!t)return o.alert.confirm("SUBSCRIPTION.CONFIRM.DELETE_SUBSCRIPTION").then((function(t){if(t)return e.deleteSubscription(n,t)}));o.loading.show(),r.record.remove(n.id,{wallet:l}).then((function(){l.data.subscriptions=l.data.subscriptions||{count:1},l.data.subscriptions.count--,e.removeFromUI(n),o.loading.hide()})).catch(o.onError("SUBSCRIPTION.ERROR.DELETE_SUBSCRIPTION_FAILED"))}},e.removeFromUI=function(n){var t=_.findWhere(e.search.results,{type:n.type,recipient:n.recipient}),a=_.findIndex(t.items,n);a>=0&&t.items.splice(a,1),t.items.length||(a=_.findIndex(e.search.results,t),e.search.results.splice(a,1))},e.addToUI=function(t){e.search.results=e.search.results||[];var i=_.findWhere(e.search.results,{type:t.type,recipient:t.recipient});return i?(i.items.push(t),n.when(t)):(i={type:t.type,recipient:t.recipient,items:[]},a.extendAll([i],"recipient").then((function(){return i.items.push(t),e.search.results.push(i),t})))},e.showCategoryModal=function(){return r.category.all().then((function(e){return s.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(e){if(e&&e.parent)return e}))},e.showEmailModal=function(e){return s.show("plugins/es/templates/subscription/modal_email.html","ModalEmailSubscriptionsCtrl",e,{focusFirstInput:!0})}}function X(e,n,t,a,i,o,s){e.frequencies=[{id:"daily",label:"daily"},{id:"weekly",label:"weekly"}],e.formData=s||{},e.formData.content=e.formData.content||{},e.formData.content.frequency=e.formData.content.frequency||e.frequencies[0].id,e.recipient={},e.$on("modal.shown",(function(){return e.formData.recipient?(e.recipient={pubkey:e.formData.recipient},i.extendAll([e.recipient])):a.network.peering.self().then((function(n){if(n)return e.formData.recipient=n.pubkey,e.recipient={pubkey:e.formData.recipient},i.extendAll([e.recipient])}))})),e.doSubmit=function(){if(e.form.$submitted=!0,e.form.$valid&&e.formData.content.email&&e.formData.content.frequency){var n={type:"email",recipient:e.formData.recipient,content:{email:e.formData.content.email,locale:t.data.locale.id,frequency:e.formData.content.frequency}};e.closeModal(n)}},e.cancel=function(){e.closeModal()},e.subscriptionForm&&e.subscriptionForm.$setPristine(),e.showNetworkLookup=function(){return o.showNetworkLookup({enableFilter:!0,endpointFilter:a.constants.ES_SUBSCRIPTION_API}).then((function(n){n&&(e.recipient=n,e.formData.recipient=n.pubkey)}))}}function Q(e,n,t,a,i,o,s,r,l){e.search=e.search||{loading:!0,hasMore:!1,text:void 0,index:"invitation",type:"certification",results:[],sort:"time",asc:!1,loadingMore:!1},e.entered=!1,e.searchTextId="documentSearchText",e.ionItemClass="item-border-large",e.defaultSizeLimit=e.defaultSizeLimit||(s.screen.isSmall()?50:100),e.helptipPrefix="helptip-document",e.compactMode=!angular.isDefined(e.compactMode)||e.compactMode,e._source=e._source||["issuer","hash","time","creationTime","title","message"],e.enter=function(n,t){e.entered||(e.entered=!0,e.search.index=t.stateParams&&t.stateParams.index||e.search.index,e.search.type=t.stateParams&&t.stateParams.type||e.search.type,e.search.text=t.stateParams&&t.stateParams.q||e.search.text,e.search.last=!e.search.text,e.load()),e.expertMode=angular.isDefined(e.expertMode)?e.expertMode:!s.screen.isSmall()&&i.data.expertMode},e.$on("$ionicView.enter",e.enter),e.computeOptions=function(n,t){var a={index:e.search.index,type:e.search.type,from:n||0,size:t||e.defaultSizeLimit};return e.search.sort?(a.sort={},a.sort[e.search.sort]=e.search.asc?"asc":"desc"):a.sort={time:"desc"},a._source=a._source||e._source,a},e.load=function(n,t,a){if(!e.search.error){var i=e.computeOptions(n,t);return e.search.loading=!a,(e.search.last?l.search(i):l.searchText(e.search.text||"",i)).then((function(t){n?e.search.results=e.search.results.concat(t.hits):(e.search.results=t.hits,e.search.took=t.took),e.search.total=t.total,s.loading.hide(),e.search.loading=!1,e.search.hasMore=t.hits&&t.hits.length>0&&t.total>e.search.results.length,e.updateView()})).catch((function(n){e.search.results=[],e.search.loading=!1,e.search.error=!0,e.search.hasMore=!1,s.onError("DOCUMENT.ERROR.LOAD_DOCUMENTS_FAILED")(n).then((function(){e.search.error=!1}))}))}},e.updateView=function(){e.motion&&e.search.results&&e.search.results.length&&e.motion.show({selector:".list .item.item-document"}),e.$broadcast("$$rebind::rebind")},e.doSearchText=function(){return e.search.last=!e.search.text,e.load().then((function(){t.search({q:e.search.text}).replace()}))},e.doSearchLast=function(){return e.search.last=!0,e.search.text=void 0,e.load()},e.removeAll=function(){if(e.hideActionsPopover(),e.search.results&&e.search.results.length)return s.alert.confirm("DOCUMENT.CONFIRM.REMOVE_ALL").then((function(n){if(n)return s.loading.show(),l.removeAll(e.search.results).then((function(){return e.search.loading=!1,a((function(){return s.toast.show("DOCUMENT.INFO.REMOVED"),e.load()}),1e3)})).catch(s.onError("DOCUMENT.ERROR.REMOVE_ALL_FAILED"))}))},e.remove=function(n,t){var a=e.search.results[t];a&&!n.defaultPrevented&&(n.stopPropagation(),s.alert.confirm("DOCUMENT.CONFIRM.REMOVE").then((function(n){if(n)return l.remove(a).then((function(){e.search.results.splice(t,1),e.$broadcast("$$rebind::rebind"),s.toast.show("DOCUMENT.INFO.REMOVED")})).catch(s.onError("MESSAGE.ERROR.REMOVE_FAILED"))})))},e.selectDocument=function(n,t){console.debug("Selected document: ",t,r);var a=r.getUrl("/{0}/{1}/_search?pretty&q=_id:{2}".format(t.index,t.type,t.id));return e.openLink(n,a)},e.toggleCompactMode=function(){e.compactMode=!e.compactMode,e.updateView(),!e.search.hasMore&&e.search.results.length&&"last"==e.search.type&&a((function(){e.search.hasMore=!0}),500)},e.toggleSort=function(n){e.search.sort!==n||e.search.asc?(e.search.asc=e.search.sort!==n||!e.search.asc,e.search.sort=n):(e.search.asc=void 0,e.search.sort=void 0),e.load()},e.showMore=function(){e.search.loading||(e.search.loadingMore=!0,e.load(e.search.results.length,e.defaultSizeLimit,!0).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")})))},e.startListenChanges=function(){var n=Date.now(),t=e.search.index+"/"+e.search.type,a=r.websocket.changes(t);return a.open().then((function(){console.debug("[ES] [document] Websocket opened in {0} ms".format(Date.now()-n)),a.on((function(n){e.search.last&&n&&l.fromHit(n).then((function(t){"DELETE"===n._operation?e.onDeleteDocument(t):e.onNewDocument(t)}))}))}))},e.onNewDocument=function(n){if(e.search.last&&!e.search.loading){console.debug("[ES] [document] Detected new document: ",n);var t=_.findIndex(e.search.results,{id:n.id,index:n.index,type:n.type});t<0?(e.search.total++,e.search.results.splice(0,0,n)):(n.updated=!0,a((function(){n.updated=!1}),2e3),e.search.results.splice(t,1,n)),e.updateView()}},e.onDeleteDocument=function(n){e.search.last&&!e.search.loading&&a((function(){var t=_.findIndex(e.search.results,{id:n.id,index:n.index,type:n.type});t<0||(console.debug("[ES] [document] Detected document deletion: ",n),e.search.results.splice(t,1),e.search.total--,e.updateView())}),750)},e.showActionsPopover=function(n){s.popover.show(n,{templateUrl:"plugins/es/templates/document/lookup_popover_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)},e.resetData=function(){e.search.loading||(console.debug("[ES] [document] Resetting data (settings or account may have changed)"),e.search.results=[],e.search.loading=!1,e.search.total=void 0,e.search.loadingMore=!1,e.entered=!1,delete e.search.limit)},o.api.data.on.logout(e,e.resetData)}function J(e,n,t,a){e.search={loading:!0,hasMore:!0,text:void 0,index:"user,page,group",type:"profile,record,comment",results:void 0,sort:"time",asc:!1},e.expertMode=!1,e.defaultSizeLimit=20,e._source=["issuer","hash","time","creationTime","title","avatar._content_type","city","message","record"],angular.extend(this,n("ESDocumentLookupCtrl",{$scope:e})),e.$on("$ionicParentView.enter",e.enter),e.selectDocument=function(e,n){var t;n&&e&&!e.defaultPrevented&&(e.stopPropagation(),"user"===n.index&&"profile"===n.type?a.go("app.user_identity",{pubkey:n.pubkey,name:n.name}):"page"===n.index&&"record"===n.type?a.go("app.view_page",{title:n.title,id:n.id}):"page"===n.index&&"comment"===n.type?(t=$filter("formatHash")(n.id),a.go("app.view_page_anchor",{title:n.title,id:n.record,anchor:t})):"group"===n.index&&"record"===n.type?a.go("app.view_group",{title:n.title,id:n.id}):"group"===n.index&&"comment"===n.type?(t=$filter("formatHash")(n.id),a.go("app.view_group_anchor",{title:n.title,id:n.record,anchor:t})):console.warn("Click on this kind of document not implement yet!",n))};var i=e.computeOptions;e.computeOptions=function(n,t){var a=i(n,t);if(!a.sort||a.sort.time){var o=a.sort&&a.sort.time||o;a.sort=[{time:o}]}return a._source=a._source||e._source,a.getTimeFunction=function(e){return e.time=e.creationTime||e.time,e.time},a},t((function(){e.startListenChanges()}),1e3)}function Z(e,n,t,a,i,o,s,r,l,c,d,u,p){e.networkStarted=!1,e.ionItemClass="",e.expertMode=c.data.expertMode&&!r.screen.isSmall(),e.isHttps="https:"===i.location.protocol,e.search={text:"",loading:!0,online:!0,results:[],endpointFilter:s.constants.GCHANGE_API,sort:void 0,asc:!0},e.listeners=[],e.helptipPrefix="helptip-network",e.enableLocationHref=!0,e.removeListeners=function(){e.listeners.length&&(console.debug("[ES] [network] Closing listeners"),_.forEach(e.listeners,(function(e){e()})),e.listeners=[])},e.enter=function(n,t){e.networkStarted||(e.networkStarted=!0,e.search.loading=!0,d.get().then((function(n){n&&(e.node=s.node.same(n.node.host,n.node.port)?s:s.instance(n.node.host,n.node.port),t&&t.stateParams&&("true"==t.stateParams.online&&(e.search.online=!0),t.stateParams.expert&&(e.expertMode="true"==t.stateParams.expert)),e.load())})).catch((function(n){r.onError("ERROR.GET_CURRENCY_FAILED")(n),e.networkStarted=!1})))},e.$on("$ionicParentView.enter",e.enter),e.leave=function(){e.networkStarted&&(e.removeListeners(),u.close(),e.networkStarted=!1,e.search.loading=!0)},e.$on("$ionicView.beforeLeave",e.leave),e.$on("$ionicParentView.beforeLeave",e.leave),e.$on("$destroy",e.leave),e.computeOptions=function(){return{filter:{member:!e.search.type||"member"===e.search.type,mirror:!e.search.type||"mirror"===e.search.type,endpointFilter:angular.isDefined(e.search.endpointFilter)?e.search.endpointFilter:null,online:e.search.online&&!0},sort:{type:e.search.sort,asc:e.search.asc},expertMode:e.expertMode,timeout:l.timeout&&(e.expertMode?l.timeout/10:l.timeout/100)}},e.load=function(){e.search.loading&&(u.start(e.node,e.computeOptions()),e.refreshing=!1,e.listeners.push(u.api.data.on.changed(e,(function(n){e.refreshing||(e.refreshing=!0,p.extendAll(n.peers).then((function(){e.networkStarted&&e.updateView(n),e.refreshing=!1})))}))))},e.updateView=function(n){console.debug("[peers] Updating UI"),e.search.results=n.peers,e.search.memberPeersCount=n.memberPeersCount,e.search.loading=!e.networkStarted||u.isBusy(),e.motion&&e.search.results&&e.search.results.length>0&&e.motion.show({selector:".item-peer"}),e.loading||e.$broadcast("$$rebind::rebind")},e.refresh=function(){return e.search.loading=!0,u.loadPeers()},e.sort=function(){e.search.loading=!0,e.refreshing=!0,u.sort(e.computeOptions()),e.updateView(u.data)},e.toggleOnline=function(n){e.hideActionsPopover(),e.search.online=!1!==n,u.close(),e.search.loading=!0,e.load(),e.enableLocationHref&&t.search({online:e.search.online}).replace()},e.toggleSearchEndpoint=function(n){e.hideActionsPopover(),e.search.endpointFilter===n||null===n?e.search.endpointFilter=null:e.search.endpointFilter=n,e.sort()},e.toggleSort=function(n){e.search.sort!==n||e.search.asc?(e.search.asc=e.search.sort!==n||!e.search.asc,e.search.sort=n):(e.search.asc=void 0,e.search.sort=void 0),e.sort()},e.selectPeer=function(e){if(e.online){var t={server:e.getServer()};e.isSsl()&&(t.ssl=!0),e.isTor()&&(t.tor=!0),n.go("app.view_es_peer",t)}},e.$on("csView.action.refresh",(function(n,t){"peers"===t&&e.refresh()})),e.$on("csView.action.showActionsPopover",(function(n,t){e.showActionsPopover(t)})),e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):a.fromTemplateUrl("templates/network/lookup_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showEndpointsPopover=function(e,n,t){var a=n.getEndpoints(t);(a=(a||[]).reduce((function(e,t){var a=s.node.parseEndPoint(t);return e.concat({label:"NETWORK.VIEW.NODE_ADDRESS",value:n.getServer()+(a.path||"")})}),[])).length&&(r.popover.show(e,{templateUrl:"templates/network/popover_endpoints.html",bindings:{titleKey:"NETWORK.VIEW.ENDPOINTS."+t,items:a}}),e.stopPropagation())},e.showWs2pPopover=function(e,n){return e.stopPropagation(),o("NETWORK.VIEW.PRIVATE_ACCESS").then((function(t){r.popover.show(e,{templateUrl:"templates/network/popover_endpoints.html",bindings:{titleKey:"NETWORK.VIEW.ENDPOINTS.WS2P",valueKey:"NETWORK.VIEW.NODE_ADDRESS",items:[{label:"NETWORK.VIEW.NODE_ADDRESS",value:n.bma.private?t:n.getServer()+(n.bma.path||"")},{label:"NETWORK.VIEW.WS2PID",value:n.bma.ws2pid},{label:"NETWORK.VIEW.POW_PREFIX",value:n.powPrefix}]}})}))}}function ee(e,n,t){angular.extend(this,n("ESNetworkLookupCtrl",{$scope:e})),t=t||{},e.enableFilter=!angular.isDefined(t.enableFilter)||t.enableFilter,e.search.type=angular.isDefined(t.type)?t.type:e.search.type,e.search.endpointFilter=angular.isDefined(t.endpointFilter)?t.endpointFilter:e.search.endpointFilter,e.expertMode=angular.isDefined(t.expertMode)?t.expertMode:e.expertMode,e.ionItemClass=t.ionItemClass||"item-border-large",e.enableLocationHref=!1,e.helptipPrefix="",e.selectPeer=function(n){e.closeModal(n)},e.$on("modal.hidden",(function(){e.leave()})),e.showHelpTip=function(){},e.enter()}function ne(e,n){angular.extend(this,n("NetworkLookupCtrl",{$scope:e}));var t=t||{};e.enableFilter=!angular.isDefined(t.enableFilter)||t.enableFilter,e.search.type=angular.isDefined(t.type)?t.type:e.search.type,e.search.endpointFilter=angular.isDefined(t.endpointFilter)?t.endpointFilter:e.search.endpointFilter,e.expertMode=angular.isDefined(t.expertMode)?t.expertMode:e.expertMode,e.ionItemClass=t.ionItemClass||"item-border-large",e.helptipPrefix="",e.selectPeer=function(n){e.closePopover(n)},e.$on("popover.hidden",(function(){e.leave()})),e.showHelpTip=function(){},e.enter()}function te(e,n,t,a,i,o){e.loading=!0,e.formData={},e.load=function(){return e.loading=!0,e.formData={},n.all([a.blockchain.current().then((function(n){e.formData.number=n.number,e.formData.medianTime=n.medianTime,e.formData.powMin=n.powMin,e.formData.useSsl=o.useSsl})).catch((function(){delete e.formData.number,delete e.formData.medianTime,delete e.formData.powMin,delete e.formData.useSsl})),o.node.summary().then((function(n){e.formData.version=n&&n.duniter&&n.duniter.version,e.formData.software=n&&n.duniter&&n.duniter.software})).catch((function(){delete e.formData.version,delete e.formData.software})),o.version.latest().then((function(n){e.formData.latestRelease=n})).catch((function(){delete e.formData.latestRelease}))]).then((function(){if(e.formData.latestRelease&&"duniter"==e.formData.software){var n=i.version.compare(e.formData.version,e.formData.latestRelease.version);e.formData.isPreRelease=n>0,e.formData.hasNewRelease=n<0}else e.formData.isPreRelease=!1,e.formData.hasNewRelease=!1;e.loading=!1,e.$broadcast("$$rebind::rebind")}))},a.api.data.on.newBlock(e,(function(n){e.loading||(console.debug("[peer info] Received new block. Reload content"),e.load())})),t.api.data.on.changed(e,(function(n){e.loading||(console.debug("[peer info] Peer settings changed. Reload content"),e.load())})),e.load()}function ae(e,n,t,a,i,o,s,r,l){e.node={},e.loading=!0,e.isHttps="https:"===t.location.protocol,e.isReachable=!0,e.options={document:{index:l.data.plugins.es&&l.data.plugins.es.document&&l.data.plugins.es.document.index||"user",type:l.data.plugins.es&&l.data.plugins.es.document&&l.data.plugins.es.document.type||"profile"}},e.$on("$ionicView.beforeEnter",(function(e,n){n.enableBack=!!i.screen.isSmall()||n.enableBack})),e.$on("$ionicView.enter",(function(n,t){var a=!t.stateParams||!t.stateParams.server,i=t.stateParams&&t.stateParams.server||s.server,o=t.stateParams&&"true"==t.stateParams.ssl||!!a&&s.useSsl,r="true"==t.stateParams.tor||!!a&&s.useTor;return e.load(i,o,r).then((function(){return e.$broadcast("$csExtension.enter",n,t)})).then((function(){e.loading=!1}))})),e.load=function(t,a,l){var c={server:t,host:t,useSsl:a,useTor:l},d=t.split(":");return 2==d.length&&(c.host=d[0],c.port=d[1]),c.url=r.getUrl(c.host,c.port,void 0,c.useSsl),angular.merge(e.node,l?s.lightInstance(c.host+".to",443,443,!0,6e4):s.lightInstance(c.host,c.port,c.useSsl),c),e.isReachable=!e.isHttps||a,e.isReachable?n.all([e.node.network.peering.self().then((function(n){e.node.pubkey=n.pubkey,e.node.currency=n.currency})),e.node.record.count(e.options.document.index,e.options.document.type).then((function(n){e.node.docCount=n})),e.node.network.peers().then((function(n){var t=n.peers.reduce((function(e,n){var t=new h(n);return t.hasEndpoint("GCHANGE_API")?(t.online="UP"===n.status,t.blockNumber=t.block.replace(/-.+$/,""),t.ep=s.node.parseEndPoint(t.getEndpoints("GCHANGE_API")[0]),t.dns=t.getDns(),t.id=t.keyID(),t.server=t.getServer(),e.concat(t)):e}),[]);return o.extendAll([e.node].concat(t)).then((function(){e.peers=_.sortBy(t,(function(e){var n=1;return n+=1e4*(e.online?1:0),n+=1e3*(e.hasMainConsensusBlock?1:0),-(n+=100*(e.name?1:0))})),e.motion.show({selector:".item-peer"})}))})),e.node.blockchain.current().then((function(n){e.current=n}))]).catch(i.onError(l?"PEER.VIEW.ERROR.LOADING_TOR_NODE_ERROR":"PEER.VIEW.ERROR.LOADING_NODE_ERROR")):s.network.peers().then((function(n){var t=(n&&n.peers||[]).reduce((function(e,n){var t=new h(n);if(!t.hasEndpoint("GCHANGE_API"))return e;var a=s.node.parseEndPoint(t.getEndpoints("GCHANGE_API")[0]);return a.dns!=c.host&&a.ipv4!=c.host&&a.ipv6!=c.host||a.port!=c.port?e:(t.ep=a,e.concat(t))}),[]),a=t.length&&t[0];if(a)return e.node.pubkey=a.pubkey,e.node.currency=a.currency,o.extend(e.node);console.warn("Could not get peer from /network/peers")}))},e.selectPeer=function(e){if(e.online){var n={server:e.getServer()};e.isSsl()&&(n.ssl=!0),e.isTor()&&(n.tor=!0),a.go("app.view_es_peer",n)}},e.openRawPeering=function(n){return e.openLink(n,e.node.url+"/network/peering?pretty")},e.openRawCurrentBlock=function(n){return e.openLink(n,e.node.url+"/network/peering?pretty")}}function ie(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f){angular.extend(this,i("ESLookupPositionCtrl",{$scope:e})),e.search={text:"",results:[],loading:!0,lastRecords:!0,type:null,category:null,location:null,advanced:null,issuer:null,geoDistance:isNaN(p.data.plugins.es.geoDistance)?20:p.data.plugins.es.geoDistance,sortAttribute:null,sortDirection:"desc",compactMode:p.data.plugins.market&&p.data.plugins.market.compactMode},e.searchTextId="registrySearchText",e.enableFilter=!0,e.smallscreen=angular.isDefined(e.smallscreen)?e.smallscreen:c.screen.isSmall(),e.options=angular.merge(e.options||{},{location:{show:!0,help:"REGISTRY.SEARCH.LOCATION_HELP"},description:{show:!e.search.compactMode}}),e.enter=function(t,a){if(!e.entered||!e.search.results||0===e.search.results.length){if(!e.geoUnit)return s("LOCATION.DISTANCE_UNIT").then((function(n){return e.geoUnit=n,e.enter(t,a)}));var i=function(){e.searchTextId&&n(e.searchTextId),e.entered=!0,e.doSearch()};if(a.stateParams&&a.stateParams.q&&"string"==typeof a.stateParams.q&&(e.search.text=a.stateParams.q),a.stateParams&&a.stateParams.hash&&(e.search.text="#"+a.stateParams.hash),a.stateParams&&a.stateParams.location)e.search.location=a.stateParams.location,a.stateParams.lat&&a.stateParams.lon&&(e.search.geoPoint={lat:parseFloat(a.stateParams.lat),lon:parseFloat(a.stateParams.lon)}),a.stateParams.d&&(e.search.geoDistance=a.stateParams.d);else{var o=p.data.plugins.es.registry&&p.data.plugins.es.registry.defaultSearch;if(o&&(o.location?angular.merge(e.search,p.data.plugins.es.registry.defaultSearch):o=void 0),!o&&m.isLogin()&&m.data.profile){if(!m.isDataLoaded())return c.loading.show(),m.loadData().then((function(){return c.loading.hide(),e.enter(t,a)}));e.search.geoPoint=m.data.profile.geoPoint,e.search.location=m.data.profile.city||(m.data.profile.geoPoint?s.instant("LOCATION.PROFILE_POSITION"):void 0)}}a.stateParams&&(a.stateParams.type||a.stateParams.last)?a.stateParams.last||"last"===a.stateParams.type?(e.search.lastRecords=!0,e.search.type=void 0):e.search.type=a.stateParams.type:e.search.lastRecords=!1,a.stateParams&&a.stateParams.issuer&&(e.search.issuer=a.stateParams.issuer),a.stateParams&&a.stateParams.category?g.category.get({id:a.stateParams.category}).then((function(n){e.search.category=n,i()})).catch(c.onError("REGISTRY.ERROR.LOAD_CATEGORY_FAILED")):i()}e.showFab("fab-add-registry-record")},e.$on("$ionicView.enter",(function(n,t){return e.enter(n,t)})),e.updateSettings=function(n){var a=!1;p.data.plugins.market=p.data.plugins.market||{},p.data.plugins.market.defaultSearch=p.data.plugins.market.defaultSearch||{};var i=e.search.location&&e.search.location.trim(),o=p.data.plugins.market.defaultSearch.location;o&&o===i||(p.data.plugins.market.defaultSearch=angular.merge(p.data.plugins.market.defaultSearch,{location:i,geoPoint:i&&e.search.geoPoint?angular.copy(e.search.geoPoint):void 0,geoShape:i&&e.search.geoShape?angular.copy(e.search.geoShape):void 0}),a=!0);var s=p.data.plugins.es.geoDistance;s&&s===e.search.geoDistance||(p.data.plugins.es.geoDistance=e.search.geoDistance,a=!0);var r=p.data.plugins.market.compactMode;if(void 0!==r&&r==e.search.compactMode||(p.data.plugins.market.compactMode=e.search.compactMode,a=!0),a)return console.debug("[market] [search] Storing search location to local settings..."),n?p.store():t(p.store,100)},e.leave=function(){var n=!1;p.data.plugins.es.registry=p.data.plugins.es.registry||{},p.data.plugins.es.registry.defaultSearch=p.data.plugins.es.registry.defaultSearch||{};var a=e.search.location&&e.search.location.trim(),i=p.data.plugins.es.registry.defaultSearch.location;i&&i===a||(p.data.plugins.es.registry.defaultSearch={location:a,geoPoint:a&&e.search.geoPoint?angular.copy(e.search.geoPoint):void 0},n=!0);var o=p.data.plugins.es.geoDistance;o&&o===e.search.geoDistance||(p.data.plugins.es.geoDistance=e.search.geoDistance,n=!0),n&&t((function(){p.store()}))},e.$on("$ionicView.leave",(function(){return e.leave()})),e.onGeoPointChanged=function(){e.search.loading||e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoPoint.lon&&!e.search.geoPoint.exact&&(e.doSearch(),e.updateLocationHref())},e.$watch("search.geoPoint",e.onGeoPointChanged,!0),e.resolveLocationPosition=function(){if(!e.search.loadingPosition)return e.search.loadingPosition=!0,e.searchPosition(e.search.location).then((function(n){if(!n)throw e.search.loading=!1,e.search.results=void 0,e.search.total=0,e.search.loadingPosition=!1,e.search.geoPoint=void 0,"CANCELLED";e.search.geoPoint=n,n.shortName&&!n.exact&&(e.search.location=n.shortName),e.search.loadingPosition=!1}))},e.doGetLastRecords=function(n){return e.hidePopovers(),e.search.text=void 0,e.doSearch(n)},e.doSearchText=function(){e.doSearch()},e.doSearch=function(n){if(e.search.loading=!n,e.search.location&&e.search.location.length>=3&&!e.search.geoPoint)return e.resolveLocationPosition().then((function(){return e.doSearch(n)}));var t=e.search.text&&e.search.text.trim()||"";e.search.lastRecords=!t||!t.length;var a=[],i=[];if(t&&t.length)if(u.regexp.PUBKEY.test(t))i.push({term:{pubkey:t}});else{var o=(t=t.toLowerCase())?f.util.parseTags(t):void 0;a.push({multi_match:{query:t,fields:["title","description","city","address"],type:"phrase_prefix"}}),a.push({match:{title:{query:t,boost:2}}}),a.push({prefix:{title:t}}),a.push({match:{description:t}}),a.push({nested:{path:"category",query:{bool:{filter:{match:{"category.name":t}}}}}}),o&&o.length&&i.push({terms:{tags:o}})}else e.search.issuer&&i.push({term:{issuer:e.search.issuer}});e.search.type&&i.push({term:{type:e.search.type}}),e.search.category&&i.push({nested:{path:"category",query:{bool:{filter:{term:{"category.id":e.search.category.id}}}}}});var s=e.search.location&&e.search.location.trim().toLowerCase();if(e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoPoint.lon)if(s&&s.length){var r=s.split(",")[0];i.push({or:[{and:[{not:{exists:{field:"geoPoint"}}},{match_phrase:{city:r}}]},{geo_distance:{distance:e.search.geoDistance+e.geoUnit,geoPoint:{lat:e.search.geoPoint.lat,lon:e.search.geoPoint.lon}}}]})}else i.push({geo_distance:{distance:e.search.geoDistance+e.geoUnit,geoPoint:{lat:e.search.geoPoint.lat,lon:e.search.geoPoint.lon}}});var l={highlight:{fields:{title:{},description:{},tags:{}}},from:n};a.length>0&&(l.query=l.query||{bool:{}},l.query.bool.should=a,l.query.bool.minimum_should_match=1),i.length>0&&(l.query=l.query||{bool:{}},l.query.bool.filter=i),e.search.lastRecords&&(l.sort={creationTime:"desc"});var c=e.queryId&&e.queryId+1||0;return e.queryId=c,e.updateLocationHref(),e.doRequest(l,(function(){return e.queryId==c}))},e.doRequest=function(n,t){return(n=n||{}).from=n.from||0,n.size=n.size||10,
|
||
n.size<10&&(n.size=10),e.search.loading=0===n.from,g.record.search(n).then((function(i){if(!t||t()){if(!i||!i.hits||!i.hits.length)return e.search.results=n.from>0?e.search.results:[],e.search.total=n.from>0?e.search.total:0,e.search.loading=!1,void(e.search.hasMore=!1);var o=a("formatSlug");_.forEach(i.hits,(function(e){e.urlTitle=o(e.title)})),n.from?e.search.results=e.search.results.concat(i.hits):(e.search.results=i.hits,e.search.total=i.total),e.search.hasMore=e.search.results.length<i.total,e.search.loading=!1,e.motion.show({selector:".list .item",ink:!0})}})).catch((function(t){e.search.loading=!1,e.search.results=n.from>0?e.search.results:[],e.search.total=n.from>0?e.search.total:0,e.search.hasMore=!1,c.onError("REGISTRY.ERROR.LOOKUP_RECORDS_FAILED")(t)}))},e.showMore=function(){var n=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,(e.search.lastRecords?e.doGetLastRecords:e.doSearch)(n).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")})).catch((function(n){console.error(n),e.search.loadingMore=!1,e.search.hasMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.removeText=function(){e.search.text=null,e.doSearch(),e.updateLocationHref()},e.removeType=function(){e.search.type=null,e.doSearch(),e.updateLocationHref()},e.removeCategory=function(){e.search.category=null,e.category=null,e.doSearch(),e.updateLocationHref()},e.removeLocation=function(){e.search.location=null,e.search.geoPoint=null,e.doSearch(),e.updateLocationHref()},e.updateLocationHref=function(n){n||t((function(){var n=e.search.text&&e.search.text.trim(),t=e.search.location&&e.search.location.trim(),a={location:t&&t.length?t:void 0,category:e.search.category?e.search.category.id:void 0,last:!!e.search.lastRecords||void 0,type:e.search.type?e.search.type:void 0,lat:e.search.geoPoint&&e.search.geoPoint.lat||void 0,lon:e.search.geoPoint&&e.search.geoPoint.lon||void 0,d:e.search.geoPoint&&e.search.geoDistance||void 0};n&&n.match(/^#\w+$/)?a.hash=n.substr(1):n&&n.length&&(a.q=n),o.search(a).replace()}))},e.onToggleAdvanced=function(){e.search.entered&&!e.search.lastRecords&&(e.doSearch(),e.updateLocationHref())},e.$watch("search.advanced",e.onToggleAdvanced,!0),e.toggleAdvanced=function(){e.search.advanced=!e.search.advanced,t(e.hidePopovers,200)},e.toggleCompactMode=function(){e.search.compactMode=!e.search.compactMode,e.options.description.show=!e.search.compactMode,e.updateSettings()},e.showRecordTypeModal=function(n){e.hidePopovers(),t((function(){n.isDefaultPrevented()||d.show("plugins/es/templates/registry/modal_record_type.html").then((function(n){n&&(e.search.type=n,e.doSearch(),e.updateLocationHref())}))}),350)},e.showCategoryModal=function(n){t((function(){n.isDefaultPrevented()||g.category.all().then((function(e){return d.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(n){n&&n.parent&&(e.search.category=n,e.doSearch(),e.updateLocationHref())}))}),350)},e.showNewPageModal=function(){return e.hidePopovers(),e.loadWallet().then((function(e){if(c.loading.hide(),e)return E.showNewPage()}))},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):r.fromTemplateUrl("plugins/es/templates/registry/lookup_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showFiltersPopover=function(n){e.filtersPopover?e.filtersPopover.show(n):r.fromTemplateUrl("plugins/es/templates/registry/lookup_popover_filters.html",{scope:e}).then((function(t){e.filtersPopover=t,e.$on("$destroy",(function(){e.filtersPopover.remove()})),e.filtersPopover.show(n)}))},e.hideFiltersPopover=function(){e.filtersPopover&&e.filtersPopover.hide()},e.hidePopovers=function(){e.hideActionsPopover(),e.hideFiltersPopover()}}function oe(e,n,t,a,i){angular.extend(this,n("ESRegistryLookupCtrl",{$scope:e})),e.searchTextId=void 0,e.enter=function(n,i){return e.entered?i.stateParams&&i.stateParams.refresh?t(e.doSearch,2e3):void 0:e.loadWallet({minData:!0}).then((function(n){a.loading.hide(),e.search.issuer=n.pubkey,e.search.advanced=!0,t(e.doSearch,100),e.showFab("fab-wallet-add-registry-record")}))},e.doUpdate=function(){if(i.isLogin())return e.search.issuer=i.data.pubkey,e.search.advanced=!0,e.doSearch()}}function se(e,n,t,a,i,o,s,r,l,c,d,u,p,m){e.formData={},e.id=null,e.category={},e.pictures=[],e.canEdit=!1,e.loading=!0,e.motion=p.motion.fadeSlideIn,e.$on("$ionicView.beforeEnter",(function(e,n){n.enableBack=!!p.screen.isSmall()||n.enableBack})),e.$on("$ionicView.enter",(function(n,a){a.stateParams&&a.stateParams.id?((e.loading||a.stateParams.refresh)&&e.load(a.stateParams.id,a.stateParams.anchor),e.$broadcast("$recordView.enter",a)):t.go("app.registry_lookup")})),e.$on("$ionicView.beforeLeave",(function(n,t){e.$broadcast("$recordView.beforeLeave",t)})),e.load=function(n,o){return n=n||e.id,e.loading=!0,a.all([u.record.load(n).then((function(n){e.id=n.id,e.formData=n.record,e.canEdit=d.isUserPubkey(e.formData.issuer),e.issuer=n.issuer,e.avatar=e.formData.avatar,e.avatarStyle=e.formData.avatar&&{"background-image":'url("'+e.avatar.src+'")'},p.loading.hide(),e.loading=!1,e.motion.show({selector:".list > .item, .list > ng-if > .item"})})).catch((function(i){e.secondTry?(e.loading=!1,i&&404===i.ucode?(p.toast.show("REGISTRY.ERROR.RECORD_NOT_EXISTS"),t.go("app.registry_lookup")):p.onError("REGISTRY.ERROR.LOAD_RECORD_FAILED")(i)):(e.secondTry=!0,a((function(){e.load(n)}),100))})),u.record.picture.all({id:n}).then((function(n){e.pictures=n._source.pictures&&n._source.pictures.reduce((function(e,n){return e.concat(m.image.fromAttachment(n.file))}),[]),e.pictures.length>0&&e.motion.show({selector:".lazy-load .item.card-gallery",startVelocity:3e3})})).catch((function(){e.pictures=[]})),i((function(){return e.$broadcast("$recordView.load",n,u.record)}))]).then((function(){e.motion.show({selector:".lazy-load .item",startVelocity:3e3}),o&&i((function(){l(o)}),1e3)}))},e.edit=function(){p.loading.show(),t.go("app.registry_edit_record",{id:e.id})},e.delete=function(){var n;e.hideActionsPopover(),r(["REGISTRY.VIEW.REMOVE_CONFIRMATION","REGISTRY.INFO.RECORD_REMOVED"]).then((function(e){return n=e,p.alert.confirm(e["REGISTRY.VIEW.REMOVE_CONFIRMATION"])})).then((function(a){a&&u.record.remove(e.id).then((function(){d.data.pages&&d.data.pages.count&&d.data.pages.count--,s.nextViewOptions({historyRoot:!0}),t.go("app.wallet_pages",{refresh:!0}),p.toast.show(n["REGISTRY.INFO.RECORD_REMOVED"])})).catch(p.onError("REGISTRY.ERROR.REMOVE_RECORD_FAILED"))}))},e.showActionsPopover=function(n){e.actionsPopover?e.actionsPopover.show(n):o.fromTemplateUrl("plugins/es/templates/registry/view_popover_actions.html",{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showSharePopover=function(n){e.hideActionsPopover();var t=e.formData.title,a=m.getUrl("/page/record/"+e.id+"/_share");p.screen.isSmall()&&(n=angular.element(document.querySelector("#registry-share-anchor-"+e.id))||n),p.popover.share(n,{bindings:{url:a,titleKey:"REGISTRY.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:t},time:e.formData.time,postMessage:t}})}}function re(e,n,t,a,i,o,s,r,l,c,d,u,p,m){angular.extend(this,r("ESPositionEditCtrl",{$scope:e})),e.formData={title:null,description:null,socials:[],geoPoint:null},e.loading=!0,e.dirty=!1,e.walletData=null,e.id=null,e.avatar=null,e.pictures=[],e.setForm=function(n){e.form=n},e.$on("$ionicView.enter",(function(n,t){e.loadWallet({minData:!0}).then((function(n){e.walletData=n,t.stateParams&&t.stateParams.id?e.load(t.stateParams.id):t.stateParams&&t.stateParams.type&&e.updateView({record:{type:t.stateParams.type}}),o("registry-record-title")}))})),e.$on("$stateChangeStart",(function(n,a,o,s){if(e.dirty&&!e.saving&&!n.defaultPrevented)return n.preventDefault(),e.loading?void 0:(e.loading=!0,c.alert.confirm("CONFIRM.SAVE_BEFORE_LEAVE","CONFIRM.SAVE_BEFORE_LEAVE_TITLE",{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES_SAVE"}).then((function(n){return e.loading=!1,n?(e.form.$submitted=!0,e.save(!1,!0).then((function(n){return n&&(e.dirty=!1),n}))):(e.dirty=!1,!0)})).then((function(e){e&&(i.nextViewOptions({historyRoot:!0}),t.go(a.name,o))})).catch((function(e){})))})),e.load=function(n){e.loading=!0,m.record.load(n,{raw:!0}).then((function(n){n&&n.record?e.updateView(n):e.updateView({record:{}})})).catch((function(n){c.loading.hide(10),e.loading=!1,c.onError("REGISTRY.ERROR.LOAD_RECORD_FAILED")(n)}))},e.updateView=function(t){e.formData=t.record||{},e.id=t.id,e.avatar=e.formData.avatar,e.avatar?(e.avatarStyle=e.avatar&&{"background-image":'url("'+e.avatar.src+'")'},e.avatarClass={}):(e.avatarStyle=void 0,e.avatarClass={},e.avatarClass["cion-page-"+e.formData.type]=!e.avatar),e.pictures=t.record&&t.record.pictures||[],delete t.record.pictures,e.motion.show({selector:".animate-ripple .item, .card-gallery",startVelocity:3e3}),c.loading.hide(),n((function(){e.loading=!1}),1e3)},e.onFormDataChanged=function(){e.loading||(e.dirty=!0)},e.$watch("formData",e.onFormDataChanged,!0),e.needCategory=function(){return e.formData.type&&("company"==e.formData.type||"shop"==e.formData.type)},e.save=function(o,r){return e.form.$submitted=!0,!e.saving&&e.form.$valid&&("shop"!==e.formData.type&&"company"!==e.formData.type||e.formData.category&&e.formData.category.id)?r?(e.saving=!0,console.debug("[ES] [page] Saving record..."),a.when().then((function(){var n=e.formData;return e.needCategory()||delete n.category,n.time=p.date.now(),n.geoPoint&&n.geoPoint.lat&&n.geoPoint.lon?(n.geoPoint.lat=parseFloat(n.geoPoint.lat),n.geoPoint.lon=parseFloat(n.geoPoint.lon)):n.geoPoint=null,n.socials&&n.socials.length&&(n.socials=_.uniq(n.socials,!1,(function(e){return e.url}))),n.picturesCount=e.pictures.length,n.picturesCount>0?n.pictures=e.pictures.reduce((function(e,n){return e.concat({file:p.image.toAttachment(n)})}),[]):n.pictures=[],e.avatar&&e.avatar.src?c.image.resizeSrc(e.avatar.src,!0).then((function(e){return n.avatar=p.image.toAttachment({src:e}),n})):(n.avatar={_content:"",_content_type:""},n)})).then((function(n){return e.id?m.record.update(n,{id:e.id}):m.record.add(n)})).then((function(n){return console.info("[ES] [page] Record successfully saved."),!e.id&&u.data.pages&&u.data.pages.count&&u.data.pages.count++,e.id=e.id||n,e.saving=!1,e.dirty=!1,o||s("REGISTRY.INFO.RECORD_SAVED").then((function(e){c.toast.show(e)})),i.clearCache(i.currentView().stateId),i.nextViewOptions({historyRoot:!0}),t.go("app.view_page",{id:e.id,refresh:!0})})).catch((function(n){e.saving=!1,c.onError("REGISTRY.ERROR.SAVE_RECORD_FAILED")(n)}))):(console.debug("[ES] [page] Waiting debounce end, before saving..."),n((function(){return e.save(o,!0)}),650)):a.reject()},e.openPicturePopup=function(){l.camera.getPicture().then((function(n){n&&e.pictures.push({src:"data:image/png;base64,"+n})})).catch(c.onError("ERROR.TAKE_PICTURE_FAILED"))},e.rotateAvatar=function(){if(e.avatar&&e.avatar.src&&!e.rotating)return e.rotating=!0,c.image.rotateSrc(e.avatar.src).then((function(n){e.avatar.src=n,e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0,e.rotating=!1})).catch((function(n){console.error(n),e.rotating=!1}))},e.fileChanged=function(n){return c.loading.show(),a((function(t,a){var i=n.target.files[0];c.image.resizeFile(i).then((function(n){e.pictures.push({src:n}),c.loading.hide(),t()}))}))},e.removePicture=function(n){e.pictures.splice(n,1)},e.favoritePicture=function(n){if(n>0){var t=e.pictures[n];e.pictures.splice(n,1),e.pictures.splice(0,0,t)}},e.cancel=function(){i.goBack()},e.showAvatarModal=function(){return l.camera.enable?l.camera.getPicture().then((function(n){n&&(e.avatar={src:"data:image/png;base64,"+n},e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0,e.avatarClass={})})).catch(c.onError("ERROR.TAKE_PICTURE_FAILED")):d.show("plugins/es/templates/common/modal_edit_avatar.html","ESAvatarModalCtrl",{}).then((function(n){n&&(e.avatar={src:n},e.avatarStyle={"background-image":'url("'+n+'")'},e.dirty=!0,e.avatarClass={})}))},e.showRecordTypeModal=function(){d.show("plugins/es/templates/registry/modal_record_type.html").then((function(n){n&&(e.formData.type=n,e.avatar||(e.avatarClass["cion-page-"+n]=!0))}))},e.showCategoryModal=function(n){m.category.all().then((function(e){return d.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(n){n&&n.parent&&(e.formData.category=n)}))}}function le(e,n){e.extensionPoint=n.extensions.points.current.get()}function ce(e,n,t,a,i){e.smallscreen=t.screen.isSmall(),e.start=function(){e.smallscreen?e.loading=!1:(angular.extend(this,n("MkListCategoriesCtrl",{$scope:e})),e.onCategoryClick=function(e){return i.go("app.market_lookup",{category:e&&e.id,location:void 0})},e.load())},a.ready().then(e.start)}function de(e,n,t,a,i,o,s,r,l,c,d,u,p){angular.extend(this,a("MkLookupCtrl",{$scope:e})),e.smallscreen=angular.isDefined(e.smallscreen)?e.smallscreen:c.screen.isSmall(),e.options=e.options||angular.merge({type:{show:!0},location:{show:!0,prefix:void 0}},d.plugins&&d.plugins.market&&d.plugins.market.record||{}),e.enter=function(n,t){if(!u.isStarted())return u.ready().then((function(){return e.enter(n,t)}));var a=u.data.plugins.market.defaultSearch;return a&&(console.info("[market] [search] Restoring last search from settings",a),angular.merge(e.search,a)),e.entered?void 0:(console.debug("[market] [home] Init home buttons"),e.init().then((function(){e.entered=!0,e.search.loading=!1,e.doGetLastRecords()})))},e.$on("$ionicParentView.enter",e.enter);var m=e.doRequest;e.doRequest=function(n,t){return e.smallscreen?r.when():((n=n||{}).size=0,m(n,t).then((function(){e.$broadcast("$$rebind::total")})))},e.openSearch=function(a){var i={},o=(e.search.text||"").trim();if(o.length&&(i.q=o),!e.search.geoPoint&&!e.search.geoShape)return e.searchPosition(e.search.location).then((function(n){if(n)return e.search.geoPoint=n,e.search.location?e.openSearch():(e.search.geoPoint.exact=!0,s("MARKET.COMMON.AROUND_ME").then((function(n){return e.openSearch(n)})))})).catch((function(e){return console.error(e),t.go("app.market_lookup",i)}));var r=a||e.search.location&&e.search.location.split(", ")[0];return r&&e.search.geoPoint?(n.geoPoints=n.geoPoints||{},n.geoPoints[r]=e.search.geoPoint,i=angular.merge(i,{lat:e.search.geoPoint&&e.search.geoPoint.lat,lon:e.search.geoPoint&&e.search.geoPoint.lon,location:r,dist:e.search.geoDistance})):e.search.geoPoint=void 0,e.updateSettings(),t.go("app.market_lookup",i)},e.showNewRecordModal=function(){return e.loadWallet({minData:!0}).then((function(){return c.loading.hide()})).then((function(){return!e.options.type.show&&e.options.type.default?e.options.type.default:l.show("plugins/market/templates/record/modal_record_type.html")})).then((function(e){e&&t.go("app.market_add_record",{type:e})}))},e.updateLocationHref=function(e){},e.$parent.showJoinModal=p.showJoin,e.$parent.showLoginModal=p.showLogin,e.$parent.showHelpModal=p.showHelp}function ue(e,n){angular.extend(this,n("LoginModalCtrl",{$scope:e}))}function pe(e,n,t,a,i,o){angular.extend(this,n("LoginModalCtrl",{$scope:e}));var s="^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,6}$";e.usernamePattern=s+"|^[0-9]{9,10}$",e.onWalletLogin=function(n,i){i=i||t.defer();var r=a.plugins&&a.plugins.market&&a.plugins.market.defaultAdminPubkeys;if(r&&r.length){console.error("[market] [login] Storing username into user profile socials");var l=new RegExp(s).test(e.formData.username),c={url:e.formData.username,type:l?"email":"phone"},d=[angular.merge({recipient:n.pubkey},c)];d=(r||[]).reduce((function(e,n){return e.concat(angular.merge({recipient:n},c))}),d),o.setDefaultProfile({socials:d})}return i.resolve(n),i.promise},i.api.data.on.login(e,e.onWalletLogin,this)}function me(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f,h){angular.extend(this,s("ESLookupPositionCtrl",{$scope:e})),e.search={text:"",type:null,lastRecords:!0,results:[],loading:!0,category:null,location:null,geoPoint:null,geoShape:null,options:null,loadingMore:!1,showClosed:!1,showOld:!1,geoDistance:isNaN(u.data.plugins.es.geoDistance)?50:u.data.plugins.es.geoDistance,sortAttribute:null,sortDirection:"desc",compactMode:u.data.plugins.market&&u.data.plugins.market.compactMode},e.options=e.options||angular.merge({type:{show:!0},category:{show:!0,withOld:!1,withStock:!0},description:{show:!e.search.compactMode},location:{show:!0,prefix:void 0},fees:{show:!0},filter:{lastRecords:!0}},d.plugins&&d.plugins.market&&d.plugins.market.record||{}),e.$watch("search.showOld+search.showClosed",(function(){!e.search.loading&&e.entered&&e.doRefresh()}),!0),e.init=function(){return a.all([h.currencies().then((function(n){e.currencies=n})),o("LOCATION.DISTANCE_UNIT").then((function(n){e.geoUnit="LOCATION.DISTANCE_UNIT"!==n?n:"km"}))]).then((function(){r((function(){l.ink({selector:".item"}),l.loading.hide(10)}),200)}))},e.toggleAdType=function(n){n===e.search.type?e.search.type=void 0:e.search.type=n,e.doSearch()},e.doSearch=function(n,t){if(n=n||0,t=t||{withCache:!0},e.search.loading=!n,e.search.advanced||(e.search.advanced=!1),e.search.sortAttribute=e.search.sortAttribute||"creationTime",e.search.sortDirection=e.search.sortDirection||("creationTime"===e.search.sortAttribute?"desc":"asc"),e.search.location&&!e.search.geoPoint&&!e.search.geoShape)return e.searchPosition(e.search.location).then((function(a){return a?(e.search.geoPoint=a,e.search.location=a.name&&a.name.split(",")[0]||e.search.location,e.doSearch(n,t)):(e.search.loading=!1,l.alert.error("MARKET.ERROR.GEO_LOCATION_NOT_FOUND"))}));var a=e.search.text&&e.search.text.trim();if(e.search.lastRecords=!a||0===a.length,!n){var i=a?E.util.parseTags(a):void 0,o=i&&i.join(" ");_.forEach(i||[],(function(e){a=a.replace("#"+e,"").trim()})),e.updateLocationHref({q:a||void 0,hash:o,last:!!e.search.lastRecords||void 0,category:e.search.category&&e.search.category.id||void 0,type:e.search.type,location:e.search.location&&e.search.location.trim()||void 0,lat:e.search.geoPoint&&e.search.geoPoint.lat,lon:e.search.geoPoint&&e.search.geoPoint.lon,dist:e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoDistance||void 0,shape:e.search.geoShape&&(e.search.geoShape.id||e.search.geoShape.properties&&e.search.geoShape.properties.id),old:!!e.search.showOld||void 0,closed:!!e.search.showClosed||void 0})}var s=f.record.createSearchRequest(angular.merge({},e.search,{from:n,geoDistance:e.search.geoDistance+e.geoUnit}));return e.doRequest(s,t)},e.updateLocationHref=function(e){console.debug("[market] [search] Update location href"),i.search(e).replace()},e.doGetLastRecords=function(){return e.hideActionsPopover(),e.text=void 0,e.doSearch()},e.doRefresh=function(n){return e.doSearch(0,n)},e.refresh=function(){return e.doRefresh({withCache:!1})},e.showMore=function(){var n=e.search.results?e.search.results.length:0;return e.search.loadingMore=!0,e.doSearch(n).then((function(){e.search.loadingMore=!1,e.$broadcast("scroll.infiniteScrollComplete")})).catch((function(n){console.error(n),e.search.loadingMore=!1,e.search.hasMore=!1,e.$broadcast("scroll.infiniteScrollComplete")}))},e.doRequest=function(n,a){return(n=n||{}).from=n.from||0,n.size=isNaN(n.size)?10:n.size,e.search.loading=0===n.from,f.record.search(n,a).then((function(a){if(!a||!a.hits||!a.hits.length)return e.search.results=n.from>0?e.search.results:[],e.search.total=n.from>0?e.search.total:a.total||0,void(e.search.hasMore=!1);var i=t("formatSlug");return _.forEach(a.hits,(function(e){e.urlTitle=i(e.title)})),m.fillAvatars(a.hits,"issuer").then((function(t){n.from?e.search.results=e.search.results.concat(t):(e.search.results=t,e.search.total=a.total),e.search.hasMore=e.search.results.length<e.search.total}))})).then((function(){e.search.loading=!1,e.search.results.length>0&&e.motion&&e.motion.show()})).catch((function(t){e.search.loading=!1,e.search.results=n.from>0?e.search.results:[],e.search.total=n.from>0?e.search.total:0,e.search.hasMore=!1,l.onError("MARKET.ERROR.LOOKUP_RECORDS_FAILED")(t)}))},e.showCategoryModal=function(){return g.all().then((function(e){return c.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(n){n&&n.parent&&(e.search.category=n,e.doSearch())}))},e.showNewRecordModal=function(){return e.loadWallet({minData:!0}).then((function(){return l.loading.hide()})).then((function(){return!e.options.type.show&&e.options.type.default?e.options.type.default:c.show("plugins/market/templates/record/modal_record_type.html")})).then((function(e){e&&n.go("app.market_add_record",{type:e})}))},e.showRecord=function(t,a){if(!t.defaultPrevented){var i=e.search.results[a];i&&n.go("app.market_view_record",{id:i.id,title:i.title})}},e.showActionsPopover=function(n,t){return l.popover.show(n,{templateUrl:t=t||"plugins/market/templates/search/lookup_actions_popover.html",scope:e,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showSortPopover=function(n){e.showActionsPopover(n,"plugins/market/templates/search/lookup_sort_popover.html")},e.toggleSort=function(n,t){e.hideActionsPopover(),t="desc"===t?"desc":"asc",this.search.sortAttribute===n&&this.search.sortDirection===t||(this.search.sortAttribute=n,this.search.sortDirection=t,e.doSearch())},e.toggleShowClosed=function(){e.hideActionsPopover(),e.search.showClosed=!e.search.showClosed},e.toggleShowOld=function(){e.hideActionsPopover(),e.search.showOld=!e.search.showOld},e.toggleCompactMode=function(){e.search.compactMode=!e.search.compactMode,e.options.description.show=!e.search.compactMode}}function Ee(e,n,t,a,i,o,s,r,l,c,d,u){angular.extend(this,t("MkLookupAbstractCtrl",{$scope:e})),e.search.sortAttribute="creationTime",e.search.sortDirection="desc",e.enter=function(n,t){if(!e.entered||!e.search.results||0===e.search.results.length){var a=!1,i=[];if(e.search.compactMode=d.data.plugins.market.compactMode,e.options.description.show=!e.search.compactMode,t.stateParams){t.stateParams.q?(e.search.text=t.stateParams.q,e.search.lastRecords=!1):t.stateParams.last&&(e.search.lastRecords=!0),t.stateParams.type&&(e.search.type=t.stateParams.type);var o=t.stateParams.location&&t.stateParams.location.trim();if(t.stateParams.lat&&t.stateParams.lon)e.search.geoPoint={lat:parseFloat(t.stateParams.lat),lon:parseFloat(t.stateParams.lon)},e.search.location=o;else if(t.stateParams.shape)i.push(u.get(t.stateParams.shape).then((function(n){e.search.geoShape=n,e.search.location=o})));else{var s=d.data.plugins.market&&d.data.plugins.market.defaultSearch;s&&(console.info("[market] [search] Restoring last search from settings",s),angular.merge(e.search,s))}t.stateParams.dist&&(e.search.geoDistance=parseInt(t.stateParams.dist)),t.stateParams.hash&&(e.search.lastRecords=!1,e.search.text?e.search.text="#"+t.stateParams.hash+" "+e.search.text:e.search.text="#"+t.stateParams.hash),angular.isDefined(t.stateParams.closed)&&(e.search.showClosed=!0,a=!0),angular.isDefined(t.stateParams.old)&&(e.search.showOld=!0,a=!0)}var c=t.stateParams&&(t.stateParams.category||t.stateParams.cat);if(c){var p,m=c.split(":");m.length>1&&(c=m[0],p=m[1]),i.push(l.get({id:c}).catch((function(e){return console.error(e&&e.message||e),{id:c,name:p||c}})).then((function(n){e.search.category=n})))}return(i.length?r.all(i):r.when()).then(e.init).then((function(){return e.finishEnter(a)}))}},e.$on("$ionicView.enter",e.enter),e.finishEnter=function(n){e.search.advanced=!!n||e.search.advanced,e.doSearch().then((function(){e.showFab("fab-add-market-record")})),a("marketSearchText"),e.entered=!0},e.updateSettings=function(n){var t=!1;d.data.plugins.market=d.data.plugins.market||{},d.data.plugins.market.defaultSearch=d.data.plugins.market.defaultSearch||{};var a=e.search.location&&e.search.location.trim(),o=d.data.plugins.market.defaultSearch.location,s=d.data.plugins.market.defaultSearch.geoDistance;o&&o===a&&s&&s===e.search.geoDistance||(d.data.plugins.market.defaultSearch=angular.merge(d.data.plugins.market.defaultSearch,{location:a,geoPoint:a&&e.search.geoPoint?angular.copy(e.search.geoPoint):void 0,geoShape:a&&e.search.geoShape?angular.copy(e.search.geoShape):void 0,geoDistance:a&&e.search.geoPoint?e.search.geoDistance:void 0}),d.data.plugins.es.geoDistance=e.search.geoDistance,t=!0);var r=d.data.plugins.market.compactMode;if(void 0!==r&&r==e.search.compactMode||(d.data.plugins.market.compactMode=e.search.compactMode,t=!0),t)return console.debug("[market] [search] Storing search location to local settings..."),n?d.store():i(d.store,100)},e.leave=function(){return e.updateSettings(!0)},e.$on("$ionicView.beforeLeave",(function(){return e.leave()})),e.onGeoPointChanged=function(){e.search.loading||e.search.geoPoint&&e.search.geoPoint.lat&&e.search.geoPoint.lon&&!e.search.geoPoint.exact&&e.doSearch()},e.$watch("search.geoPoint",e.onGeoPointChanged,!0),e.onLocationChanged=function(){e.search.loading||e.search.location||e.removeLocation()},e.$watch("search.location",e.onLocationChanged,!0),e.onGeoDistanceChanged=function(){!e.search.loading&&e.entered&&e.search.location&&e.doRefresh()},e.$watch("search.geoDistance",e.onGeoDistanceChanged,!0),e.onCategoryClick=function(n){n&&(e.search.category=n,e.options.category.show=!0,e.search.showCategories=!1,e.doSearch())},e.removeText=function(){e.search.text=null,e.doSearch()},e.removeCategory=function(){e.search.category=null,e.category=null,e.doSearch()},e.removeLocation=function(){e.search.location=null,e.search.geoPoint=null,e.search.geoShape=null,e.updateSettings(),e.doSearch()},e.showActionPopover=function(n,t){t=t||"plugins/market/templates/search/lookup_actions_popover.html",e.actionsPopoverUrl&&e.actionsPopoverUrl!==t&&(e.actionsPopover.hide(),e.actionsPopover=null),e.actionsPopoverUrl=t,e.actionsPopover?e.actionsPopover.show(n):o.fromTemplateUrl(t,{scope:e}).then((function(t){e.actionsPopover=t,e.$on("$destroy",(function(){e.actionsPopover.remove()})),e.actionsPopover.show(n)}))},e.hideActionsPopover=function(){e.actionsPopover&&e.actionsPopover.hide()},e.showSortPopover=function(n){e.showActionsPopover(n,"plugins/market/templates/search/lookup_sort_popover.html")},e.toggleSort=function(n,t){e.hideActionsPopover(),t="desc"===t?"desc":"asc",this.search.sortAttribute===n&&this.search.sortDirection===t||(this.search.sortAttribute=n,this.search.sortDirection=t,e.doSearch())},e.toggleCompactMode=function(){e.search.compactMode=!e.search.compactMode,e.options.description.show=!e.search.compactMode,e.updateSettings()}}function ge(e,n,t,a,i,o,s,r,l,c,d){angular.extend(this,a("ESLookupPositionCtrl",{$scope:e})),e.entered=!1,e.categories=[],e.activeCategoryIndex=void 0,e.activePictureIndex=void 0,e.options=e.options||angular.merge({location:{show:!0,prefix:""},category:{filter:void 0},slideDuration:1e4},r.plugins&&r.plugins.market&&r.plugins.market.record||{}),e.search=e.search||angular.merge({loading:!1,text:null,location:null,geoPoint:null,geoShape:null,showClosed:!1,showOld:!1,geoDistance:l.data.plugins.market&&l.data.plugins.market,from:0,hasMore:!0},e.search),e.search.size=10,e.search.type="all",e.slideDurationLabels={3e3:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:3}},5e3:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:5}},1e4:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:10}},15e3:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:15}},2e4:{labelKey:"MARKET.GALLERY.SLIDE_DURATION_OPTION",labelParams:{value:20}}},e.slideDurations=_.keys(e.slideDurationLabels),e.adTypeLabels={all:"MARKET.GALLERY.ALL_AD_TYPES",offer:"MARKET.TYPE.OFFER_SHORT",need:"MARKET.TYPE.NEED_SHORT",crowdfunding:"MARKET.TYPE.CROWDFUNDING_SHORT"},e.adTypes=_.keys(e.adTypeLabels),e.enter=function(n,t){var a=l.data.plugins.market&&l.data.plugins.market.defaultSearch;a&&!a.geoShape&&(console.info("[market] [gallery] Restoring last search from settings",a),angular.merge(e.search,a)),e.entered||(t&&t.stateParams&&t.stateParams.q&&(e.search.text=t.stateParams.q.trim()),e.entered=!0)},e.$on("$ionicView.enter",e.enter),e.start=function(n){if(void 0!==e.activeCategoryIndex)return e.openSlideShowModal(e.activeCategoryIndex,e.activePictureIndex);e.stop(),(n=n||{}).filter=n.filter||e.options&&e.options.category&&e.options.category.filter,n.withStock=!e.options||!e.options.showClosed,n.withOld=e.options&&e.options.showOld,n.text=e.search&&e.search.text,e.search.loading=!0;var t={q:n.text};return i.search(t).replace(),d.category.stats(n).then((function(n){return e.categories=_.filter(n,(function(e){return e.count>0&&e.children&&e.children.length})),e.fetchNextPictures()})).then((function(n){var t=n&&n[0];if(t){var a=_.findIndex(e.categories,(function(e){return e.id===t.id}));return e.openSlideShowModal(a,0)}})).catch((function(n){"END"===n?console.info("All pictures displayed"):console.error(n),e.search.loading=!1})).then((function(){e.search.loading=!1}))},e.stop=function(){delete e.activeCategoryIndex,delete e.categories,delete e.activeCategoryIndex,e.search.loading=!1},e.removeLocation=function(){e.search.location=null,e.search.geoPoint=null,e.search.geoShape=null},e.openSlideShowModal=function(n,t,a){e.activeCategoryIndex=n||0,e.activePictureIndex=t||0;var i=e.categories[n];console.info("Opening slide show on category "+i.id+" on picture "+e.activePictureIndex);var o=!0;return c.show("plugins/market/templates/gallery/modal_slideshow.html","MkGallerySlideModalCtrl",{category:i,activeSlide:t,slideDuration:e.options.slideDuration,started:!0!==a,lastSlideCallback:function(){return e.fetchNextPictures().then((function(n){var t=n&&n[0],a=n&&n[1]||0;t&&(o=!1,e.openSlideShowModal(e.activeCategoryIndex,a,!1))}))}}).then((function(n){o&&void 0!==n&&(console.info("User closed, on picture index: "+n),e.activePictureIndex=n)}))},e.fetchNextPictures=function(t){if(!e.categories||!e.categories.length)return n.when();e.search.size=e.search.size||0,e.activeCategoryIndex>=e.categories.length-1&&(e.activeCategoryIndex=void 0),void 0===e.activeCategoryIndex?(e.activeCategoryIndex=0,e.search.from=0):t||!1===e.search.hasMore?(e.activeCategoryIndex++,e.search.from=0):e.search.from+=e.search.size;var a=e.categories[e.activeCategoryIndex],i=Date.now();console.info("Loading pictures for category : "+a.id+"...");var o={categories:_.pluck(a.children,"id"),text:e.search.text,type:"all"===e.search.type?void 0:e.search.type,withStock:!e.search.showClosed,withOld:!e.search.showOld,from:e.search.from,size:e.search.size,location:e.search.location,geoPoint:e.search.geoPoint,geoShape:e.search.geoShape};return e.search.loading=0===o.from,d.record.pictures(o).then((function(n){var t=n&&n.hits||[];if(e.categories)return t.length?(o.from?a.pictures=a.pictures.concat(t):(a.pictures=t,e.search.total=n.total),e.search.hasMore=a.pictures.length<e.search.total,console.info("[market] [category] "+a.pictures.length+"/"+e.search.total+" pictures fetched in "+(Date.now()-i)+"ms"),[a,o.from]):(console.info("No pictures found in category "+a.id+". Skipping"),a.pictures=[],e.search.total=o.from>0?e.search.total:n.total||0,e.search.hasMore=!1,e.fetchNextPictures(!0))}))},e.isLoadedCategory=function(e){return e.pictures&&e.pictures.length>0}}function fe(e,n,t,a,i,o,s){e.zoomMin=1,e.activeSlide=s&&s.activeSlide||0,e.category=s&&s.category||{},e.lastSlideCallback=s&&s.lastSlideCallback||void 0,e.started=s&&!1!==s.started,e.motion=o.motion.fadeSlideInRight,e.options={slideDuration:s&&s.slideDuration||5e3},e.shown=function(){e.started&&e.startTimer()},e.$on("modal.shown",e.shown),e.startTimer=function(){e.interval&&t.cancel(e.interval),console.debug("[market] [gallery] Start slideshow ("+e.options.slideDuration+"ms)"),e.interval=t((function(){e.nextSlide()}),e.options.slideDuration),e.showDescription()},e.stopTimer=function(){e.interval&&(console.debug("[market] [gallery] Stop slideshow"),t.cancel(e.interval),delete e.interval)},e.slideChanged=function(n){e.activeSlide=n,e.showDescription()},e.nextSlide=function(){if(e.category&&e.category.pictures&&e.category.pictures.length&&e.activeSlide!==e.category.pictures.length-1)e.activeSlide++,console.debug("[market] [gallery] Slide index="+e.activeSlide),e.showDescription();else{if("function"==typeof e.lastSlideCallback)return e.loading=!0,e.stopTimer(),e.lastSlideCallback().then((function(){return i(e.closeModal,500)}));e.closeModal(),e.showDescription()}},e.showDescription=function(){var n=e.category.pictures[e.activeSlide];n&&n.description&&!n.showDescription&&i((function(){n.showDescription=!0}),500)},e.updateSlideStatus=function(n){$ionicScrollDelegate.$getByHandle("scroll"+n).getScrollPosition().zoom===e.zoomMin?a.enableSlide(!0):a.enableSlide(!1)},e.stopAndCloseModal=function(){e.stopTimer(),e.closeModal(e.activeSlide)}}function he(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f,h,_,T,b,v,O){function R(n,t){return t=t||s.defer(),e.updateButtons(),e.loadLikes(),t.resolve(),t.promise}e.formData={},e.id=null,e.category={},e.pictures=[],e.canEdit=!1,e.maxCommentSize=10,e.loading=!0,e.motion=u.motion.fadeSlideInRight,e.smallscreen=u.screen.isSmall(),e.moreAdMotion=u.motion.default,e.smallpictures=!1,e.options=e.options||angular.merge({type:{show:!0},category:{show:!0},location:{show:!0,prefix:void 0},like:{kinds:["VIEW","LIKE","FOLLOW","ABUSE"],index:"market",type:"record",service:v.record.like}},E.plugins&&E.plugins.market&&E.plugins.market.record||{}),e.likeData={views:{},likes:{},follows:{},abuses:{}},e.search={type:null,results:[],total:0,loading:!0},angular.extend(this,r("ESLikesCtrl",{$scope:e})),e.enter=function(n,t){t.stateParams&&t.stateParams.id?(e.loading||t.stateParams.refresh?e.load(t.stateParams.id):(u.loading.hide(),e.updateButtons(),e.updatePaymentData()),e.$broadcast("$recordView.enter",t)):i.go("app.market_lookup")},e.$on("$ionicView.enter",e.enter),e.$on("$ionicView.beforeLeave",(function(n,t){e.$broadcast("$recordView.beforeLeave",t)})),e.refresh=function(){return e.loading||!e.formData.id?s.when():e.load(e.formData.id)},e.load=function(n){n=n||e.formData.id,e.loading=!0,e.formData={};var t=v.record.load(n,{fetchPictures:!1,convertPrice:!0,html:!0}).then((function(n){e.formData=n.record,e.formData.feesCurrency=n.record.feesCurrency||n.record.currency,delete e.formData.useRelative,e.id=n.id,e.issuer=n.issuer,e.loadIssuerStars(e.issuer.issuer),e.smallscreen||e.loadMoreLikeThis(n),e.loading=!1,e.updateView(),u.loading.hide(10)})).catch((function(t){e.secondTry?(e.loading=!1,u.loading.hide(),t&&404===t.ucode?(u.toast.show("MARKET.ERROR.RECORD_NOT_EXISTS"),i.go("app.market_lookup")):u.onError("MARKET.ERROR.LOAD_RECORD_FAILED")(t)):(e.secondTry=!0,l((function(){e.load(n)}),100))}));return l((function(){e.loadPictures(n),e.$broadcast("$recordView.load",n,v.record)})),t},e.loadPictures=function(n){return n=n||e.id,v.record.picture.all({id:n}).then((function(n){n._source.pictures&&(e.pictures=n._source.pictures.reduce((function(e,n){return e.concat(b.image.fromAttachment(n.file))}),[]),e.pictures.length&&e.motion.show({selector:".lazy-load .item.card-gallery",ink:!1}))})).catch((function(){e.pictures=[]}))},e.loadMoreLikeThis=function(n){return v.record.moreLikeThis(n.id,{category:n.record.category.id,type:n.record.type,city:n.record.city}).then((function(n){n&&n.total&&(e.search.results=n.hits,e.search.total=n.total,e.search.loading=!1,e.motion.show({selector:".list.list-more-record .item",ink:!0}))}))},e.loadIssuerStars=function(n){this.canEdit||h.isLogin()&&h.isUserPubkey(n)||T.like.count(n,{kind:"star",issuer:h.isLogin()?h.data.pubkey:void 0}).then((function(n){e.issuer.stars=n}))},e.updateView=function(){e.updateButtons(),e.updatePaymentData(),e.motion.show({selector:".list > .item",ink:!0}),e.canEdit||e.showFab("fab-like-market-record-"+e.id)},e.updateButtons=function(){e.canEdit=e.formData&&h.isUserPubkey(e.formData.issuer),e.canSold=e.canEdit&&e.formData.stock>0,e.canReopen=e.canEdit&&0===e.formData.stock,e.canReopen&&(e.canEdit=!1)},e.markAsView=function(){if(e.likeData&&e.likeData.views&&!e.likeData.views.wasHit&&!e.canEdit&&!h.isUserPubkey(e.formData.issuer)){var n=l((function(){h.isLogin()&&e.options.like.service.add(e.id,{kind:"view"}).then((function(){e.likeData.views.total=(e.likeData.views.total||0)+1})),n=null}),3e3);e.$on("$destroy",(function(){n&&l.cancel(n)}))}},e.refreshConvertedPrice=function(){e.loading=!0},e.$watch("$root.settings.useRelative",e.refreshConvertedPrice,!0),e.edit=function(){i.go("app.market_edit_record",{id:e.id,title:c("formatSlug")(e.formData.title)}),e.loading=!0},e.delete=function(){e.hideActionsPopover(),u.alert.confirm("MARKET.VIEW.REMOVE_CONFIRMATION").then((function(n){n&&v.record.remove(e.id).then((function(){o.nextViewOptions({historyRoot:!0}),i.go("app.market_lookup"),u.toast.show("MARKET.INFO.RECORD_REMOVED")})).catch(u.onError("MARKET.ERROR.REMOVE_RECORD_FAILED"))}))},e.sold=function(){e.hideActionsPopover(),u.alert.confirm("MARKET.VIEW.SOLD_CONFIRMATION").then((function(n){if(n)return u.loading.show(),v.record.setStock(e.id,0).then((function(){e.canSold=!1,e.canReopen=!0,e.canEdit=!1})).catch(u.onError("MARKET.ERROR.SOLD_RECORD_FAILED")).then((function(){o.nextViewOptions({disableBack:!0,disableAnimate:!1,historyRoot:!0}),l((function(){u.toast.show("MARKET.INFO.RECORD_SOLD")}),500),i.go("app.market_lookup")}))}))},e.reopen=function(){e.hideActionsPopover(),u.alert.confirm("MARKET.VIEW.REOPEN_CONFIRMATION").then((function(n){if(n)return u.loading.show().then((function(){return v.record.setStock(e.id,1).then((function(){return e.canSold=!0,e.canReopen=!1,e.canEdit=!0,u.loading.hide()})).then((function(){u.toast.show("MARKET.INFO.RECORD_REOPEN")})).catch(u.onError("MARKET.ERROR.REOPEN_RECORD_FAILED"))}))}))},e.showActionsPopover=function(n){u.popover.show(n,{templateUrl:"plugins/market/templates/record/view_popover_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){return e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null),!0},e.showSharePopover=function(n){if(e.hideActionsPopover(),!e.loading&&e.formData.title){var t=e.formData.title;e.formData.price&&e.formData.currency&&(t+=" | {0} {1}".format(e.formData.price/100,c("abbreviate")(e.formData.currency)));var a=b.getUrl("/market/record/"+e.id+"/_share"),i=(e.formData.tags&&e.formData.tags.slice()||[]).join(" #");i=i.length?"#"+i+" ":"",g.data.share.defaultHastags&&(i+=g.data.share.defaultHastags),u.screen.isSmall()&&(n=angular.element(document.querySelector("#record-share-anchor-"+e.id))||n),u.popover.share(n,{bindings:{url:a,titleKey:"MARKET.VIEW.POPOVER_SHARE_TITLE",titleValues:{title:t},time:e.formData.time,postMessage:t,postImage:e.pictures.length>0?e.pictures[0]:null,postHashtags:i}})}},e.showNewMessageModal=function(){return s.all([d("MARKET.VIEW.NEW_MESSAGE_TITLE",e.formData),e.loadWallet({minData:!0})]).then((function(n){var t=n[0];return u.loading.hide(),_.showMessageCompose({title:t,destPub:e.issuer.pubkey,destUid:e.issuer.name})})).then((function(e){e&&u.toast.show("MESSAGE.INFO.MESSAGE_SENT")}))},e.showRecord=function(n,t){if(!n.defaultPrevented){var a=e.search.results[t];a&&i.go("app.market_view_record",{id:a.id,title:a.title})}},e.updatePaymentData=function(){var n=e.formData;if(n&&n.stock>0){var t,a=n.price,i=n.pubkey||e.issuer.pubkey;if("crowdfunding"===n.type?(a=void 0,t=O.record.computePrefix(n),i=n.pubkey||i):"auction"===n.type&&(t=O.record.computePrefix(n)),!i)return console.warn("[market] [record] No pubkey found in the issuer profile or in the Ad"),e.showPayment=!1,void(e.paymentData=null);var o=m.util.pkChecksum(i);e.paymentData={pubkey:i,pubkeyWithChecksum:i+":"+o,amount:a,comment:t,currency:n.currency},O.uri.compute(e.paymentData).then((function(n){e.paymentData.uris=n})),e.showPayment=!0}else e.canPay=!1},e.showPaymentModal=function(){if(e.showPayment&&e.paymentData)return p.show("plugins/market/templates/record/modal_payment.html","MkRecordPaymentModalCtrl",e.paymentData)},e.showIssuers=function(n){var t=e.paymentData.comment;if(t)return e.openLink(n,'https://demo.cesium.app/#/app/data/search/g1/movement?q=comment:"'+t+'"')},h.api.data.on.login(e,R,this),h.api.data.on.logout(e,R,this)}function _e(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f,h){e.options=e.options||angular.merge({recordType:{show:!0,canEdit:!0},category:{show:!0,filter:void 0},description:{show:!0},location:{show:!0,required:!0},position:{showCheckbox:!0,required:!0,warningMessage:"MARKET.EDIT.WARNING.NO_GEO_POINT"},unit:{canEdit:!0},login:{type:"full"}},m.plugins&&m.plugins.market&&m.plugins.market.record||{}),angular.extend(this,c("ESPositionEditCtrl",{$scope:e})),e.formData={type:null,price:null,category:{},geoPoint:null,useRelative:g.data.useRelative,pubkey:null},e.id=null,e.pictures=[],e.loading=!0,e.pubkeyPattern=p.regexp.PUBKEY,e.motion=d.motion.ripple,e.setForm=function(n){e.form=n},e.enter=function(n,a){return t.all([h.currencies(),e.loadWallet({minData:!0})]).then((function(n){e.currencies=n[0];var t=n[1];if(a.stateParams&&a.stateParams.id)return e.load(a.stateParams.id);a.stateParams&&a.stateParams.type&&(e.formData.type=a.stateParams.type),e.formData.type=e.formData.type||e.options.type&&e.options.type.default||"offer",e.formData.currency=e.currencies&&e.currencies[0],t.profile&&("crowdfunding"===e.formData.type&&t.profile.pubkey&&(e.formData.pubkey=t.profile.pubkey),t.profile.city&&(e.formData.address=t.profile.address,e.formData.city=t.profile.city,t.profile.geoPoint&&t.profile.geoPoint.lat&&t.profile.geoPoint.lon&&(e.formData.geoPoint=t.profile.geoPoint)))})).then((function(){e.loading=!1,d.loading.hide(),e.motion.show(),e.options.focus&&!d.screen.isSmall()&&l("market-record-title")})).catch((function(n){"CANCELLED"===n?(e.motion.hide(),e.showHome()):console.error(n)}))},e.$on("$ionicView.enter",e.enter),e.onFreePriceChanged=function(){e.formData.freePrice&&(e.formData.price=null)},e.showUnitPopover=function(n){d.popover.show(n,{templateUrl:"templates/wallet/popover_unit.html",scope:e,autoremove:!0}).then((function(n){e.formData.useRelative=n}))},e.cancel=function(){e.closeModal()},e.load=function(n){return d.loading.show(),s.record.load(n,{fetchPictures:!0,convertPrice:!1}).then((function(n){angular.merge(e.formData,n.record),e.formData.useRelative="UD"===n.record.unit,e.formData.useRelative||(e.formData.price=e.formData.price?e.formData.price/100:void 0,e.formData.fees=e.formData.fees?e.formData.fees/100:void 0),e.formData.currency||(e.formData.currency=e.currency),!e.formData.city&&e.formData.location&&(e.formData.city=e.formData.location),e.formData.location&&(e.formData.location=null),e.id=n.id,e.pictures=n.record.pictures||[],delete e.formData.pictures,e.dirty=!1,e.motion.show({selector:".animate-ripple .item, .card-gallery"}),d.loading.hide(),o((function(){e.loading=!1}),1e3)})).catch(d.onError("MARKET.ERROR.LOAD_RECORD_FAILED"))},e.save=function(i,l){return e.form.$submitted=!0,!e.saving&&e.form.$valid&&e.formData.category.id?l?(e.saving=!0,console.debug("[ES] [market] Saving record..."),d.loading.show({delay:0}).then((function(){var n=angular.copy(e.formData);delete n.useRelative;var t=e.formData.useRelative?"UD":"unit";return angular.isDefined(n.price)&&null!=n.price?("string"==typeof n.price&&(n.price=parseFloat(n.price.replace(new RegExp("[.,]"),"."))),n.unit=t,"unit"===t&&(n.price=100*n.price),n.currency||(n.currency=e.currency)):(n.unit=null,n.price=null,n.currency||(n.currency=e.currency)),n.fees?("string"==typeof n.fees&&(n.fees=parseFloat(n.fees.replace(new RegExp("[.,]"),"."))),"unit"===t&&(n.fees=100*n.fees),n.feesCurrency||(n.feesCurrency=n.currency||e.currency),n.unit=n.unit||t):(n.fees=null,n.feesCurrency=null),n.time=E.date.now(),n.geoPoint&&n.geoPoint.lat&&n.geoPoint.lon?(n.geoPoint.lat=parseFloat(n.geoPoint.lat),n.geoPoint.lon=parseFloat(n.geoPoint.lon)):n.geoPoint=null,angular.isDefined(n.location)&&(n.location=null),n.picturesCount=e.pictures.length,n.picturesCount?d.image.resizeSrc(e.pictures[0].src,!0).then((function(t){return n.thumbnail=E.image.toAttachment({src:t}),n.pictures=e.pictures.reduce((function(e,n){return e.concat({file:E.image.toAttachment({src:n.src})})}),[]),n})):(e.formData.thumbnail&&(n.thumbnail={_content:"",_content_type:""}),n.pictures=[],n)})).then((function(n){return e.id?s.record.update(n,{id:e.id}):(n.creationTime=E.date.now(),n.stock=angular.isDefined(n.stock)?n.stock:1,s.record.add(n))})).then((function(t){var i=!e.id;if(e.id=e.id||t,e.saving=!1,e.dirty=!1,r.backView()){var o=n.$on("$stateChangeSuccess",(function(n,t,i,s,r){n.preventDefault(),a.go("app.market_view_record",{id:e.id},{location:"replace",reload:!0}),o()}));r.goBack(i?-1:-2)}else r.nextViewOptions({historyRoot:!0}),a.go("app.market_view_record",{id:e.id})})).catch((function(n){e.saving=!1,n&&"ES_HTTP.ERROR.MAX_UPLOAD_BODY_SIZE"===n.message&&(n.message="MARKET.ERROR.RECORD_EXCEED_UPLOAD_SIZE"),d.onError("MARKET.ERROR.FAILED_SAVE_RECORD")(n)}))):(console.debug("[ES] [market] Waiting debounce end, before saving..."),o((function(){return e.save(i,!0)}),650)):t.reject()},e.openCurrencyLookup=function(){alert("Not implemented yet. Please submit an issue if occur again.")},e.cancel=function(){e.dirty=!1,r.goBack()},e.$on("$stateChangeStart",(function(n,t,i,o){if(e.dirty&&!e.saving&&!n.defaultPrevented&&(n.preventDefault(),!e.loading))return d.alert.confirm("CONFIRM.SAVE_BEFORE_LEAVE","CONFIRM.SAVE_BEFORE_LEAVE_TITLE",{cancelText:"COMMON.BTN_NO",okText:"COMMON.BTN_YES_SAVE"}).then((function(n){if(n)return e.save()})).then((function(){e.dirty=!1,r.nextViewOptions({historyRoot:!0}),a.go(t.name,i),d.loading.hide()}))})),e.onFormDataChanged=function(){e.loading||(e.dirty=!0)},e.$watch("formData",e.onFormDataChanged,!0),e.showRecordTypeModal=function(){u.show("plugins/market/templates/record/modal_record_type.html").then((function(n){n&&(e.formData.type=n)}))},e.showCategoryModal=function(){(e.options&&e.options.category&&e.options.category.filter?s.category.filtered({filter:e.options.category.filter}):s.category.all()).then((function(e){return u.show("plugins/es/templates/common/modal_category.html","ESCategoryModalCtrl as ctrl",{categories:e},{focusFirstInput:!0})})).then((function(n){n&&n.parent&&(e.formData.category=n)}))}}function Te(e,n,t,a){e.loading=!0,e.formData={helpSiteUrl:t.data.userForumUrl},e.openHelpSite=function(n){return e.openLink(n,t.data.userForumUrl||"https://forum.monnaie-libre.fr")},e.load=function(){return console.debug("[market] Display payment info",n),angular.merge(e.formData,n),a.uri.compute(n).then((function(n){e.links=n,e.loading=!1}))},e.load()}function be(e,n,t){angular.extend(this,n("MkLookupAbstractCtrl",{$scope:e})),e.search.showClosed=!1,e.search.showOld=!1,e.options.filter.lastRecords=!1,e.smallscreen=t.screen.isSmall(),e.enter=function(n,t){return e.entered?e.search.results&&0!==e.search.results.length?void 0:e.doSearch():e.loadWallet().then((function(n){if(e.search.text=n.pubkey,e.search.lastRecords=!1,e.search.sortAttribute="creationTime",e.search.sortDirection="desc",!e.entered||!e.search.results||0===e.search.results.length)return e.init().then(e.doSearch).then((function(){e.entered=!0,e.showFab("fab-wallet-add-market-record")}))})).catch((function(n){if("CANCELLED"===n)return e.showHome();console.error(n),e.entered=!1}))},e.$on("$ionicView.enter",e.enter)}function ve(e,n,t,a,i){angular.extend(this,n("MkLookupAbstractCtrl",{$scope:e})),e.search.showClosed=!1,e.search.showOld=!1,e.options.filter.lastRecords=!1,e.smallscreen=t.screen.isSmall(),e.enter=function(n,t){return e.entered?e.search.results&&0!==e.search.results.length?void 0:e.doSearch():e.loadWallet({minData:!0}).then((function(e){return i.record.like.load({issuer:e.pubkey,kinds:["LIKE","FOLLOW"]})})).then((function(n){if(e.search.ids=n&&n.hits,e.search.sortAttribute="creationTime",e.search.sortDirection="desc",console.debug("[market] [favorites] Loading favorites...",e.search.ids),!e.entered||!e.search.results||0===e.search.results.length)return e.init().then((function(){return e.doSearch()})).then((function(){e.entered=!0,e.showFab("fab-wallet-add-market-record")}))})).catch((function(n){if("CANCELLED"===n)return e.showHome();console.error(n),e.entered=!1}))},e.$on("$ionicView.enter",e.enter);var o=e.doSearch;e.doSearch=function(n,t){return i.record.like.load({issuer:a.data.pubkey,kinds:["LIKE","FOLLOW"],from:n,_source:["id","time"]}).then((function(a){return e.search.ids=a&&_.pluck(a.hits,"id"),console.debug("Found like ids:",e.search.ids),o(n,t)}))}}function Oe(e,n,t,a,i,o){e.locale=void 0,e.loading=!0,e.motion=t.motion.ripple,e.listeners=void 0,e.options=e.options||angular.merge({category:{filter:void 0,withCache:!1,withStats:!0,withOld:!1,withStock:!0,nbsp:!0},showClosed:!1,showOld:!1},a.plugins&&a.plugins.market&&a.plugins.market.record||{}),e.load=function(t){return(t=t||{}).filter=t.filter||e.options&&e.options.category&&e.options.category.filter,t.withStats=!angular.isDefined(e.options&&e.options.category&&e.options.category.withStats)||e.options.category.withStats,t.withStock=angular.isDefined(t.withStock)?t.withStock:!e.options||!e.options.showClosed,t.withOld=angular.isDefined(t.withOld)?t.withOld:!e.options||e.options.showOld,t.silent=!angular.isDefined(t.silent)||t.silent,t.locale=angular.isDefined(t.locale)?t.locale:n.use(),t.nbsp=angular.isDefined(t.nbsp)?t.nbsp:e.options&&e.options.category&&e.options.category.nbsp,t.silent||(e.loading=!0),e.locale=t.locale,angular.merge(e.options.category,t),console.debug("[market] [categories] Loading...",t),(t.withStats?i.stats(t):i.filtered(t).then(i.asTree)).then((function(n){n=n||[],t.nbsp&&(n=_.map(n,(function(e){return e.name=e.name&&e.name.split(" ").join(" "),e}))),e.categories=n,e.totalCount=e.categories.reduce((function(e,n){return e+n.count}),0),e.loading=!1,e.motion.show&&!t.silent&&e.motion.show(),e.listeners||e.addListeners()}))},e.onOptionsChange=function(){!e.loading&&e.locale&&((e.options.category.withStock||!1)===e.options.showClosed||(e.options.category.withOld||!1)!==e.options.showOld)&&e.load()},e.onLocaleChange=function(n){e.locale&&e.locale!==n&&(console.debug("[market] [categories] Need reload for locale {{0]]...".format(n)),e.load({locale:n,silent:!0}))},e.addListeners=function(){e.listeners=[e.$watch("options.showClosed",e.onOptionsChange,!0),e.$watch("options.showOld",e.onOptionsChange,!0),o.api.locale.on.changed(e,e.onLocaleChange,this)]}}function Re(e,n,t){e.entered=!1,angular.extend(this,n("MkListCategoriesCtrl",{$scope:e})),e.enter=function(n,t){return e.load({silent:!0}).then((function(){e.loading=!1,e.entered||e.motion.show(),e.entered=!0}))},e.$on("$ionicView.enter",e.enter),e.onCategoryClick=function(e){return t.go("app.market_lookup",{category:e&&e.id,location:""})}}function Ie(e,n,t,a,i,o,s,r,l){e.entered=!1,e.reorderRoot=!1,e.reorderChildren=!1,e.dirty=!1,e.locales=angular.merge({},r.locales),e.defaultLocale=r.fixLocale(s.defaultLanguage)||"en",e.idPattern=l.regexp.ID,angular.extend(this,n("MkListCategoriesCtrl",{$scope:e})),e.options.category.withStats=!1,e.options.category.withCache=!1,e.enter=function(n,t){return e.load({silent:!0,withStats:!1,withCache:!1}).then((function(){e.loading=!1,e.entered||e.motion.show({selector:".list .item"}),e.entered=!0}))},e.$on("$ionicView.enter",e.enter),e.cancel=function(n){return e.dirty&&!n?o.alert.confirm("MARKET.CATEGORY.EDIT.CONFIRM.CANCEL").then((function(n){if(n)return e.cancel(!0)})):(e.loading=!0,e.load())},e.save=function(){if(e.dirty&&!e.saving)return console.debug("[market] [category] Saving categories..."),e.saving=!0,l.saveAll(e.categories).then((function(){e.saving=!1,e.dirty=!1,o.toast.show("MARKET.CATEGORY.EDIT.INFO.SAVED")})).catch((function(n){return e.saving=!1,console.error(n&&n.message||n),o.onError("MARKET.CATEGORY.EDIT.ERROR.CANNOT_SAVE")(n)}))},e.getName=function(n,t){if(!n)throw new Error("Missing category");var a=n.localizedNames&&n.localizedNames[e.locale];return a?a||"":t&&e.defaultLocale!==e.locale?'<span class="text-italic">'+(n.localizedNames&&e.defaultLocale&&n.localizedNames[e.defaultLocale]||n.name)+"</span>":n.name||""},e.reorderRootCategory=function(n,t,a){n&&t!==a&&(e.categories.splice(t,1),e.categories.splice(a,0,n),e.dirty=!0)},e.reorderChildrenCategory=function(n,t,a,i){n&&t&&a!==i&&(n.children=n.children||[],n.children.splice(a,1),n.children.splice(i,0,t),e.dirty=!0)},e.editRootCategory=function(n){var t=e.categories[n];return e.showEditPopup(t).then((function(n){n&&(angular.merge(t,n),e.dirty=!0)}))},e.addRootCategory=function(){return e.showEditPopup().then((function(n){n&&(e.categories.push(n),e.dirty=!0)}))},e.editChildCategory=function(n,t){var a=n.children[t];return e.showEditPopup(a,n).then((function(n){n&&(angular.merge(a,n),e.dirty=!0)}))},e.addChildCategory=function(n){return e.showEditPopup().then((function(t){t&&(n.children=n.children||[],n.children.push(t),e.dirty=!0)}))},e.removeRootCategory=function(n){e.categories.splice(n,1),e.dirty=!0},e.removeChildCategory=function(n,t){var a=n.children[t];n.children=n.children||[],n.children.splice(t,1),n.count-=a.count||0,e.dirty=!0},e.onChangeLocale=function(n){console.debug("[market] [category] Changing categories locale to: "+n.label),e.locale=n.id},e.setEditForm=function(n){e.editForm=n},e.showEditPopup=function(n,s){e.formData={id:n&&n.id,name:n&&e.getName(n),parent:s&&s.id,localizedNames:n&&angular.merge({},n.localizedNames)||{}};var r=!n,l=r?"MARKET.CATEGORY.EDIT.POPUP.TITLE_NEW":"MARKET.CATEGORY.EDIT.POPUP.TITLE_EDIT";return i((function(i,s){a([l,"COMMON.BTN_OK","COMMON.BTN_CANCEL"]).then((function(a){t.show({templateUrl:"plugins/market/templates/category/popup_edit_category.html",title:a[l],scope:e,buttons:[{text:a["COMMON.BTN_CANCEL"]},{text:a["COMMON.BTN_OK"],type:"button-positive",onTap:function(n){if(e.editForm.$submitted=!0,r&&e.editForm.id.$setValidity("duplicate",e.checkIdNotUsed(e.formData.id)),e.editForm.$valid&&e.formData.id&&e.formData.name)return e.formData;n.preventDefault()}}]}).then((function(t){if(!t)return delete e.formData,void o.loading.hide();t.localizedNames[e.locale]=t.name,n&&n.name?t.name=n.name:delete t.name,i(t)})).catch(s)}))}))},e.checkIdNotUsed=function(n){return-1===_.findIndex(e.categories||[],(function(e){return e.id===n}))}}function Ne(e,n,t){angular.extend(this,n("MkLookupAbstractCtrl",{$scope:e})),e.options.filter.lastRecords=!1,e.smallscreen=t.screen.isSmall(),e.enter=function(n,t){if(!e.entered)return e.pubkey=t&&t.stateParams&&t.stateParams.pubkey,e.pubkey?(e.search.text=e.pubkey,e.search.lastRecords=!1,e.init().then(e.doSearch).then((function(){e.entered=!0})).catch((function(n){console.error(n),e.entered=!0}))):e.showHome()},e.$on("$ionicView.enter",e.enter)}function Se(e,n,t,a,i){angular.extend(this,n("ESLastDocumentsCtrl",{$scope:e})),e.search.index="user,page,group,market",e.search.type="profile,record,comment",e._source=["issuer","hash","time","creationTime","title","price","unit","currency","picturesCount","thumbnail._content_type","city","message","record"],e.inheritedSelectDocument=e.selectDocument,e.selectDocument=function(n,t){if("market"===t.index){if(t&&n&&!n.defaultPrevented)if(n.stopPropagation(),"market"===t.index&&"record"===t.type)a.go("app.market_view_record",{id:t.id,title:t.title});else if("market"===t.index&&"comment"===t.type){var o=i("formatHash")(t.id);a.go("app.market_view_record_anchor",{id:t.record,anchor:o})}}else e.inheritedSelectDocument(n,t)}}function Ae(e,n,t,a,i,o,s,r){function l(n){return moment.unix(n).utc().startOf(e.formData.rangeDuration).unix()}e.loading=!0,e.formData=e.formData||{useRelative:o.data.useRelative,timePct:100,rangeDuration:"day",firstBlockTime:0,scale:"linear",hide:[],beginAtZero:!0},e.formData.useRelative=!1,e.scale="linear",e.height=void 0,e.width=void 0,e.maintainAspectRatio=!0,e.times=[],e.enter=function(n,t){if(e.loading){if(t&&t.stateParams&&(e.stateName=t&&t.stateName,e.stateParams=angular.copy(t&&t.stateParams||{}),!e.formData.currency&&t&&t.stateParams&&t.stateParams.currency&&(e.formData.currency=t.stateParams.currency),t.stateParams.t?e.formData.timePct=t.stateParams.t:t.stateParams.timePct&&(e.formData.timePct=t.stateParams.timePct),t.stateParams.stepUnit&&(e.formData.rangeDuration=t.stateParams.stepUnit),t.stateParams.scale&&(e.formData.scale=t.stateParams.scale),t.stateParams.hide&&(e.formData.hide=t.stateParams.hide.split(",").reduce((function(e,n){return e.concat(parseInt(n))}),[]))),e.init(n,t),!e.formData.currency)return s.get().then((function(a){return e.formData.currency=a?a.name:null,e.formData.firstBlockTime=a?l(a.firstBlockTime):0,e.formData.firstBlockTime||console.warn("[graph] currency.firstBlockTime not loaded ! Should have been loaded by currrency service!"),e.formData.currencyAge=l(moment().utc().unix())-e.formData.firstBlockTime,e.enter(n,t)}));e.load().then((function(){e.setScale(e.formData.scale),e.updateHiddenDataset(),e.loading=!1}))}},e.$on("$csExtension.enter",e.enter),e.$on("$ionicParentView.enter",e.enter),e.updateLocation=function(){e.stateName&&(a.nextViewOptions({disableAnimate:!0,disableBack:!0,historyRoot:!0}),e.stateParams=e.stateParams||{},e.stateParams.t=e.formData.timePct>=0&&e.formData.timePct<100?e.formData.timePct:void 0,e.stateParams.stepUnit="day"!=e.formData.rangeDuration?e.formData.rangeDuration:void 0,e.stateParams.hide=e.formData.hide&&e.formData.hide.length?e.formData.hide.join(","):void 0,e.stateParams.scale="linear"!=e.formData.scale?e.formData.scale:void 0,i.go(e.stateName,e.stateParams,{reload:!1,inherit:!0,notify:!1}))},e.setSize=function(n,t,a){e.height=n,e.width=t,e.maintainAspectRatio=angular.isDefined(a)?a:e.maintainAspectRatio},e.$on("csView.action.refresh",(function(n,t){if(!t||"currency"==t)return e.load()})),e.init=function(e,n){},e.load=function(){},e.toggleScale=function(){e.setScale("linear"===e.formData.scale?"logarithmic":"linear"),e.updateLocation()},e.setScale=function(t){if(e.hideActionsPopover(),e.formData.scale=t,e.options&&e.options.scales&&e.options.scales.yAxes){var a=n("formatInteger");_.forEach(e.options.scales.yAxes,(function(n,i){n.type=t,n.ticks=n.ticks||{},"linear"==t?(n.ticks.beginAtZero=!angular.isDefined(e.formData.beginAtZero)||e.formData.beginAtZero,delete n.ticks.min,n.ticks.callback=function(e){return a(e)}):(delete n.ticks.beginAtZero,delete n.ticks.callback,n.ticks.callback=function(e,n){if(e)return Math.log10(e)%1==0||Math.log10(e/3)%1==0?a(e):""})}))}},e.setRangeDuration=function(n){e.hideActionsPopover(),e.formData&&n==e.formData.rangeDuration||(e.formData.rangeDuration=n,delete e.formData.startTime,delete e.formData.endTime,delete e.formData.rangeDurationSec,e.load(),e.updateLocation())},e.updateHiddenDataset=function(n){n=n||e.datasetOverride||{},_.forEach(e.formData.hide||[],(function(t){if(n[t]){n[t].hidden=!0;var a=n[t].yAxisID,i=a&&e.options&&e.options.scales&&_.findWhere(e.options.scales.yAxes||[],{id:a});a&&i&&1==_.filter(n,(function(e){return e.yAxisID===a})).length&&(i.display=!1)}}))},e.onLegendClick=function(n,t){var a=t.datasetIndex,i=this.chart,o=i.getDatasetMeta(a);o.hidden=null===o.hidden?!i.data.datasets[a].hidden:null,i.config&&i.config.data&&i.config.data.datasets&&1===_.filter(i.config.data.datasets,(function(e){return e.yAxisID&&e.yAxisID===o.yAxisID})).length&&(i.scales[o.yAxisID].options.display=!0!==o.hidden),i.update(),e.formData.hide=e.formData.hide||[],e.formData.hide=o.hidden?_.union(e.formData.hide,[a]):_.difference(e.formData.hide,[a]),e.updateLocation()},e.goPreviousRange=function(){e.loadingRange||(e.loadingRange=!0,e.formData.startTime-=e.times.length*e.formData.rangeDurationSec,e.formData.startTime<e.formData.firstBlockTime&&(e.formData.startTime=e.formData.firstBlockTime),e.formData.endTime=e.formData.startTime+e.times.length*e.formData.rangeDurationSec,e.load().then((function(){e.updateLocation(),e.loadingRange=!1})))},e.goNextRange=function(){e.loadingRange||(e.loadingRange=!0,e.formData.startTime+=e.times.length*e.formData.rangeDurationSec,e.formData.startTime>e.formData.firstBlockTime+e.formData.currencyAge-e.formData.timeWindow&&(e.formData.startTime=e.formData.firstBlockTime+e.formData.currencyAge-e.formData.timeWindow),e.formData.endTime=e.formData.startTime+e.times.length*e.formData.rangeDurationSec,e.load().then((function(){e.updateLocation(),e.loadingRange=!1})))},e.onRangeChanged=function(){e.loadingRange||(e.loadingRange=!0,e.formData.startTime=e.formData.firstBlockTime+parseFloat(e.formData.timePct)/100*(e.formData.currencyAge-e.formData.timeWindow),e.formData.endTime=e.formData.startTime+e.times.length*e.formData.rangeDurationSec,e.load().then((function(){e.updateLocation(),e.loadingRange=!1})))},e.updateRange=function(n,t,a){a=!angular.isDefined(a)||a,e.formData.startTime=n,e.formData.endTime=t,e.formData.timeWindow=e.formData.timeWindow||e.formData.endTime-e.formData.startTime,e.formData.rangeDurationSec=e.formData.rangeDurationSec||e.formData.timeWindow/(e.times.length-1),a&&(e.formData.timePct=Math.ceil(100*(e.formData.startTime-e.formData.firstBlockTime)/(e.formData.currencyAge-e.formData.timeWindow)))},e.showActionsPopover=function(n){r.popover.show(n,{templateUrl:"plugins/graph/templates/common/popover_range_actions.html",scope:e,autoremove:!0,afterShow:function(n){e.actionsPopover=n}})},e.hideActionsPopover=function(){e.actionsPopover&&(e.actionsPopover.hide(),e.actionsPopover=null)}}function De(e,n,t,a,i,o,s,r){angular.extend(this,t("GpCurrencyAbstractCtrl",{$scope:e})),e.formData.rangeDuration="month",e.displayRightAxis=!0,e.hiddenDatasets=[],e.chartIdPrefix="docstats-chart-",e.charts=[{id:"market",title:"GRAPH.DOC_STATS.MARKET.TITLE",series:[{key:"market_record",label:"GRAPH.DOC_STATS.MARKET.AD",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"market",type:"record"}}},{key:"market_comment",label:"GRAPH.DOC_STATS.MARKET.COMMENT",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray(),clickState:{name:"app.document_search",params:{index:"market",type:"comment"}}}]},{id:"user_delta",title:"GRAPH.DOC_STATS.MARKET_DELTA.TITLE",series:[{key:"market_record_delta",label:"GRAPH.DOC_STATS.MARKET_DELTA.AD",type:"line",yAxisID:"y-axis-delta",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal()},{key:"market_comment_delta",label:"GRAPH.DOC_STATS.MARKET_DELTA.COMMENT",type:"line",yAxisID:"y-axis-delta",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray()}]},{id:"user",title:"GRAPH.DOC_STATS.USER.TITLE",series:[{key:"user_profile",label:"GRAPH.DOC_STATS.USER.USER_PROFILE",color:o.rgba.royal(.7),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"user",type:"profile"}}},{key:"user_settings",label:"GRAPH.DOC_STATS.USER.USER_SETTINGS",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray(),clickState:{name:"app.document_search",params:{index:"user",type:"settings"}}}]},{id:"user_delta",title:"GRAPH.DOC_STATS.USER_DELTA.TITLE",series:[{key:"user_profile_delta",label:"GRAPH.DOC_STATS.USER_DELTA.USER_PROFILE",type:"line",yAxisID:"y-axis-delta",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal()},{key:"user_settings_delta",label:"GRAPH.DOC_STATS.USER_DELTA.USER_SETTINGS",type:"line",yAxisID:"y-axis-delta",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray()}]},{id:"message",title:"GRAPH.DOC_STATS.MESSAGE.TITLE",series:[{key:"message_inbox",label:"GRAPH.DOC_STATS.MESSAGE.MESSAGE_INBOX",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"message",type:"inbox"}}},{key:"message_outbox",label:"GRAPH.DOC_STATS.MESSAGE.MESSAGE_OUTBOX",color:o.rgba.calm(),pointHoverBackgroundColor:o.rgba.calm(),clickState:{name:"app.document_search",params:{index:"message",type:"outbox"}}}]},{id:"social",title:"GRAPH.DOC_STATS.SOCIAL.TITLE",series:[{key:"page_record",label:"GRAPH.DOC_STATS.SOCIAL.PAGE_RECORD",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"page",type:"record"}}},{key:"group_record",label:"GRAPH.DOC_STATS.SOCIAL.GROUP_RECORD",color:o.rgba.calm(),pointHoverBackgroundColor:o.rgba.calm(),clickState:{name:"app.document_search",params:{index:"group",type:"record"}}},{key:"page_comment",label:"GRAPH.DOC_STATS.SOCIAL.PAGE_COMMENT",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray(),clickState:{name:"app.document_search",params:{index:"page",type:"comment"}}}]},{id:"subscription",title:"GRAPH.DOC_STATS.SUBSCRIPTION.TITLE",series:[{key:"subscription_record",label:"GRAPH.DOC_STATS.SUBSCRIPTION.EMAIL",color:o.rgba.royal(),pointHoverBackgroundColor:o.rgba.royal(),clickState:{name:"app.document_search",params:{index:"subscription",type:"record"}}}]},{id:"other",title:"GRAPH.DOC_STATS.OTHER.TITLE",series:[{key:"history_delete",label:"GRAPH.DOC_STATS.OTHER.HISTORY_DELETE",color:o.rgba.gray(.5),pointHoverBackgroundColor:o.rgba.gray(),clickState:{name:"app.document_search",params:{index:"history",type:"delete"}}}]}];var l=r("formatInteger");e.defaultChartOptions={responsive:!0,maintainAspectRatio:e.maintainAspectRatio,title:{display:!0},legend:{display:!0,onClick:e.onLegendClick},scales:{xAxes:[{stacked:!0}],yAxes:[{id:"y-axis",stacked:!0},{id:"y-axis-delta",stacked:!1},{id:"y-axis-delta-right",stacked:!1,display:e.displayRightAxis,position:"right",gridLines:{drawOnChartArea:!1}}]},tooltips:{enabled:!0,mode:"index",callbacks:{label:function(e,n){return n.datasets[e.datasetIndex].label+": "+l(e.yLabel)}}}},e.init=function(e,n){n&&n.stateParams},e.load=function(n){return a.all([i(e.charts.reduce((function(e,n){return e.concat(n.series.reduce((function(e,n){return e.concat(n.label)}),[n.title]))}),["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.DATE_MONTH_YEAR_PATTERN"])),s.docstat.get(e.formData)]).then((function(t){var a=t[0],i={hour:a["COMMON.DATE_PATTERN"],day:a["COMMON.DATE_SHORT_PATTERN"],month:a["COMMON.DATE_MONTH_YEAR_PATTERN"]};if((t=t[1])&&t.times){e.times=t.times;var s=i[e.formData.rangeDuration];e.labels=_.map(t.times,(function(e){return moment.unix(e).local().format(s)})),e.updateRange(t.times[0],t.times[t.times.length-1],n),e.setScale(e.scale),_.forEach(e.charts,(function(n){var i={};n.data=_.map(n.series,(function(e){if(i[e.yAxisID||"y-axis"]=!0,e.key.endsWith("_delta")){var n=e.key.substring(0,e.key.length-"_delta".length);return((a=t[n])?_.map(a,(function(e){var n=void 0!==e&&void 0!==o?e-(o||e):void 0;return o=e,n})):void 0)||[]}var a,o;return t[e.key]||[]})),n.options=angular.copy(e.defaultChartOptions),n.options.title.text=a[n.title],n.options.scales.yAxes=n.options.scales.yAxes.reduce((function(e,n){return i[n.id]?e.concat(n):e}),[]),n.datasetOverride=_.map(n.series,(function(e){return{yAxisID:e.yAxisID||"y-axis",type:e.type||"line",label:a[e.label],fill:"line"!==e.type,borderWidth:2,pointRadius:"line"!==e.type?0:2,pointHitRadius:4,pointHoverRadius:3,borderColor:e.color,backgroundColor:e.color,pointBackgroundColor:e.color,pointBorderColor:e.color,pointHoverBackgroundColor:e.pointHoverBackgroundColor||e.color,pointHoverBorderColor:e.pointHoverBorderColor||o.rgba.white()}}))}))}}))},e.onChartClick=function(t,a,i){if(i){var o=_.find(e.charts,(function(n){return e.chartIdPrefix+n.id==i._chart.canvas.id})).series[i._datasetIndex];if(o&&o.clickState&&o.clickState.name){var s=o.clickState.params?angular.copy(o.clickState.params):{},r=e.times[i._index],l=moment.unix(r).utc().add(1,e.formData.rangeDuration).unix();return s.q="time:>={0} AND time:<{1}".format(r,l),n.go(o.clickState.name,s)}console.debug("Click on item index={0}".format(i._index))}}}function Ce(e,n,t,a,i,o,s){angular.extend(this,n("GpCurrencyAbstractCtrl",{$scope:e})),e.formData.rangeDuration="month",e.hiddenDatasets=[],e.charts=[{id:"count",title:"GRAPH.SYNCHRO.COUNT.TITLE",series:[{key:"inserts",type:"bar",label:"GRAPH.SYNCHRO.COUNT.INSERTS",color:i.rgba.royal(),pointHoverBackgroundColor:i.rgba.royal()},{key:"updates",type:"bar",label:"GRAPH.SYNCHRO.COUNT.UPDATES",color:i.rgba.calm(),pointHoverBackgroundColor:i.rgba.calm()},{key:"deletes",type:"bar",label:"GRAPH.SYNCHRO.COUNT.DELETES",color:i.rgba.assertive(.5),pointHoverBackgroundColor:i.rgba.assertive()}]},{id:"peer",title:"GRAPH.SYNCHRO.PEER.TITLE",series:[{key:"ES_USER_API",label:"GRAPH.SYNCHRO.PEER.ES_USER_API",color:i.rgba.royal(),pointHoverBackgroundColor:i.rgba.royal()},{key:"ES_SUBSCRIPTION_API",label:"GRAPH.SYNCHRO.PEER.ES_SUBSCRIPTION_API",color:i.rgba.gray(.5),pointHoverBackgroundColor:i.rgba.gray()}]},{id:"performance",title:"GRAPH.SYNCHRO.PERFORMANCE.TITLE",series:[{key:"duration",type:"bar",label:"GRAPH.SYNCHRO.PERFORMANCE.DURATION",color:i.rgba.gray(.5),pointHoverBackgroundColor:i.rgba.gray()}]}];var r=s("formatInteger");e.defaultChartOptions={responsive:!0,maintainAspectRatio:e.maintainAspectRatio,title:{display:!0},legend:{display:!0,onClick:e.onLegendClick},scales:{xAxes:[{stacked:!0}],yAxes:[{stacked:!0,id:"y-axis"}]},tooltips:{enabled:!0,mode:"index",callbacks:{label:function(e,n){return n.datasets[e.datasetIndex].label+": "+r(e.yLabel)}}}},e.init=function(e,n){n&&n.stateParams},e.load=function(n){return t.all([a(e.charts.reduce((function(e,n){return e.concat(n.series.reduce((function(e,n){return e.concat(n.label)}),[n.title]))}),["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.DATE_MONTH_YEAR_PATTERN"])),o.synchro.execution.get(e.formData)]).then((function(t){var a=t[0],o={hour:a["COMMON.DATE_PATTERN"],day:a["COMMON.DATE_SHORT_PATTERN"],month:a["COMMON.DATE_MONTH_YEAR_PATTERN"]};if((t=t[1])&&t.times){e.times=t.times;var s=o[e.formData.rangeDuration];e.labels=t.times.reduce((function(e,n){return e.concat(moment.unix(n).local().format(s))}),[]),e.updateRange(t.times[0],t.times[t.times.length-1],n),e.setScale(e.scale),_.forEach(e.charts,(function(n){n.data=[],_.forEach(n.series,(function(e){n.data.push(t[e.key]||[])})),n.options=angular.copy(e.defaultChartOptions),n.options.title.text=a[n.title],n.datasetOverride=n.series.reduce((function(e,n){return e.concat({yAxisID:"y-axis",type:n.type||"line",label:a[n.label],fill:!0,borderWidth:2,pointRadius:0,pointHitRadius:4,pointHoverRadius:3,borderColor:n.color,backgroundColor:n.color,pointBackgroundColor:n.color,pointBorderColor:n.color,pointHoverBackgroundColor:n.pointHoverBackgroundColor||n.color,pointHoverBorderColor:n.pointHoverBorderColor||i.rgba.white()})}),[])}))}}))}}function Le(e,n,t){e.extensionPoint=n.extensions.points.current.get(),e.enable=t.isEnable(),t.api.state.on.changed(e,(function(n){e.enable=n}))}function Pe(e,n,t,a,i,o){e.extensionPoint=t.extensions.points.current.get(),e.enable=a.isEnable(),e.loading=!0,e.node=e.node||{},a.api.state.on.changed(e,(function(n){e.enable=n})),e.enter=function(t,a){return!e.node.currency&&a&&a.stateParams&&a.stateParams.currency&&(e.node.currency=a.stateParams.currency),e.node.currency?e.node.pubkey?e.load():n((function(){return e.enter(t,a)}),500):i.get().then((function(n){return e.node.currency=n?n.name:null,e.enter(t,a)}))},e.$on("$csExtension.enter",e.enter),e.load=function(){if(e.node.currency||e.node.pubkey)return console.info("[Graph] [peer] Loading blocks count for [{0}]".format(e.node.pubkey.substr(0,8))),o.node.blockCount(e.node.currency,e.node.pubkey).then((function(n){e.blockCount=n,e.loading=!1}))}}function ye(e,n,t,a,i,o,s,r,l){e.loading=!0,e.shapeId="shape-"+e.$id,e.formData={country:null},e.countriesMap={fr:"France",be:"Belgium",es:"Spain",gb:"United Kingdom",us:"USA"},e.countries=null,e.load=function(n){if(n=n||{},!e.countries)return e.loadAllCountries().then((function(t){if(t&&t.length)return e.load(n);e.loading=!1}));var t,a=e.getDefaultCountry(n);return e.formData.country=a,n&&!0===n.silent||(e.loading=!0,t=Date.now()),console.debug("[shape] Loading shape for country {{0}}...".format(a)),l.geoJson.search({country:a}).then((function(n){e.updateView(n),e.addListeners(),t&&console.debug("[shape] Shape loaded in {0}ms".format(Date.now()-t)),e.loading=!1})).catch((function(n){console.error("Cannot load shape for country '{0}'".format(a),n),e.loading=!1}))},e.loadAllCountries=function(){return l.getAllCountries().then((function(n){return e.countries=_(n||[]).pluck("id"),e.countries})).catch((function(e){console.error("[shape] Error child loading countries: "+(e&&e.message||e),e)}))},e.getDefaultCountry=function(t){var a=t&&t.country;if(!a){var i=r.data.locale||{id:n.use()},o=i&&i.country||i.id.split("-")[1];a=o&&_.find(e.countries,(function(e){return e.toUpperCase()===o.toUpperCase()}))}return!a&&s.plugins&&s.plugins.es&&s.plugins.es.defaultCountry&&(a=_.find(e.countries,(function(n){var t=e.countriesMap[n];return!(!t||t.toUpperCase()!==s.plugins.es.defaultCountry.toUpperCase())&&n}))||"fr"),a||"fr"},e.updateView=function(n){n?l.svg.createMosaic(n,{selector:"#"+e.shapeId,onclick:e.onClick}):l.svg.remove({selector:"#"+e.shapeId})},e.onCountryChange=function(n){if(n)return console.debug("[shape] Select country map:",n),e.load({country:n})},e.onLocaleChange=function(t){console.debug("[market] [map] Reloading map, because locale changed to "+t);var a=_.findWhere(r.locales,{id:t})||{id:n.use()},i=a&&(a.country||a.id.split("-")[1]);return e.onCountryChange(i)},e.addListeners=function(){e.listeners||(e.listeners=[r.api.locale.on.changed(e,e.onLocaleChange,this)])},e.onClick=function(e,n){e&&e.defaultPrevented||console.warn("[shape] No handler for SVG element click",n)}}function ke(e,n,t,a,i,o,s,r,l,c,d,u,p){e.entered=!1,e.saving=!1,e.formData={country:null,errors:null},e.configData={geoViewBox:{leftLng:null,rightLng:null,topLat:null,bottomLat:null},scale:1,translateX:0,translateY:0,removeHole:!0,applyRound:!0,degreePrecision:p.constants.projection.degreePrecision,strictMode:!1},e.showConfig=!1,e.elementData={country:null,id:null,title:null,position:"main",order:void 0},e.dirty=!1,e.countries=[],e.iso2Pattern=/^[a-z][a-z]$/,e.positions=p.constants.positions,e.positionPattern=new RegExp("^("+p.constants.positions.join("|")+")$"),e.showLeaflet=!1,angular.extend(this,a("MapShapeViewCtrl",{$scope:e})),e.mapId="map-"+e.$id,e.map=d.map({markers:{},center:{zoom:4},defaults:{tileLayerOptions:{attribution:'© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'}},geojson:{data:null,style:{fillColor:p.constants.style.defaults.fill,fillOpacity:.7,color:p.constants.style.defaults.stroke,opacity:1,weight:1}}}),e.enter=function(n,t){e.entered||(e.entered=!0,e.load())},e.$on("$ionicView.enter",e.enter),e.load=function(n){return n=n||{},e.dirty=!1,n.silent||(e.loading=!0,c.loading.show()),o.all([n.country?p.geoJson.search({country:n.country}):o.when(),e.loadAllCountries()]).then((function(t){var a=t[0]||null;return e.updateView(a,n)})).then((function(){e.loading=!1,c.loading.hide()})).catch((function(n){console.error(n),c.alert.error(n&&n.message||n),e.loading=!1}))},e.resetForms=function(n){e.resetForm(n),e.resetConfigForm(n),e.resetElementForm(n)},e.resetForm=function(n){e.formData.country=n&&n.country||null,e.formData.errors=n&&n.errors||null},e.resetConfigForm=function(n){angular.merge(e.configData,{geoViewBox:{leftLng:n&&n.geoViewBox&&n.geoViewBox.leftLng||-180,rightLng:n&&n.geoViewBox&&n.geoViewBox.rightLng||180,topLat:n&&n.geoViewBox&&n.geoViewBox.topLat||90,bottomLat:n&&n.geoViewBox&&n.geoViewBox.bottomLat||-90},scale:n&&n.scale||1,translateX:n&&n.translateX||0,translateY:n&&n.translateY||0,svgText:n&&n.svgText||null,removeHole:!0,applyRound:!0,degreePrecision:p.constants.projection.degreePrecision,strictMode:!1})},e.resetElementForm=function(n){var t=n&&n.position||"main";angular.merge(e.elementData,{id:n&&n.id||null,title:n&&n.title||null,country:n&&n.country||e.formData&&e.formData.country,position:t,order:"main"!==t&&n.order||void 0}),e.elementData.element=n&&n.element||null},e.markAsDirty=function(){e.loading||e.saving||(e.dirty=!0)},e.$watch("formData.country",e.markAsDirty,!0),e.setCountryForm=function(n){e.countryForm=n},e.setConfigForm=function(n){e.configForm=n},e.setElementForm=function(n){e.elementForm=n},e.onFileChanged=function(n){if(n&&n.file&&n.fileContent){e.loading=!0;try{n.file.type.startsWith("image/svg")?(console.debug("[map] [shape] Loading SVG file {0}".format(n.fileData&&n.fileData.name)),e.updateFromSvgFile(n.fileContent)):(console.debug("[map] [shape] Loading GeoJson file {0}".format(n.fileData&&n.fileData.name)),e.updateFromGeoJson(n.fileContent))}catch(n){console.error(n),c.onError("MAP.SHAPE.EDIT.ERROR.INVALID_SVG")(n),e.resetForms(),e.dirty=!1,e.showConfigForm=!1}finally{e.loading=!1}}},e.updateFromSvgFile=function(n){c.loading.show();try{var t=p.svg.createFromText(n,{selector:"#"+e.shapeId}),a={geoViewBox:p.svg.findGeoViewBox(t),customProjection:!0,scale:1,translateX:0,translateY:0,svgText:n};if(a.geoViewBox){var i=p.svg.projectionData(t,{geoViewBox:a.geoViewBox});i&&(a.customProjection=!1,a.scale=i.scale,a.translateX=i.translate[0],a.translateY=i.translate[1])}e.resetConfigForm(a),e.showConfig=!0,e.applySvgConfig(t,angular.merge(a,{customProjection:!0})),t.remove()}finally{c.loading.hide()}},e.updateFromGeoJson=function(n){n="string"==typeof n?JSON.parse(n):n,e.showConfigForm=!1,e.resetForms(),e.markAsDirty(),e.updateView(n)},e.updateView=function(n,t){var a="#"+e.shapeId;return n?(_(e.positions).each((function(e){d3.selectAll([a,"."+e,"svg"].join(" ")).remove()})),_(n.features||[]).each((function(n){n.properties=e.getNormalizeProperties(n.properties||{},t)})),p.svg.createMosaic(n,{selector:a,onclick:e.onPathClick})):p.svg.remove({selector:a}),e.resetElementForm({country:t&&t.country}),e.map.geojson.data=n,o.when()},e.applySvgConfig=function(n,t){if(t=t||e.configData,!e.configForm||(e.configForm.$submitted=!0,e.configForm.$valid)){console.debug("[map] [shape] Apply config: ",t),n=n||p.svg.createFromText(t.svgText,{selector:"#"+e.shapeId,class:"ng-hide"});var a={selector:"#"+e.shapeId,geoViewBox:t.geoViewBox,precision:e.configData.applyRound&&e.configData.degreePrecision,strictMode:e.configData.strictMode,removeHole:e.configData.removeHole};t.customProjection&&(a.scale=t.scale||1,a.translate=[t.translateX||0,t.translateY||0]);var i=p.svg.toGeoJson(n,a);e.updateView(i)}},e.onPathClick=function(n,t){console.debug("[map] [shape] Start edit element:",t);var a=d3.select(t).data()[0]||{},i=e.getNormalizeProperties(a.properties||{});e.resetElementForm(i),e.elementData.element=t,e.$apply()},e.deleteElement=function(){if(e.elementData.element){var n=d3.select(e.elementData.element.parentNode);d3.select(e.elementData.element).remove();var t={type:"FeatureCollection",features:n.selectAll("path").data()};return e.resetElementForm(),e.markAsDirty(),e.updateView(t)}},e.confirmEditElement=function(){if(e.elementData.element&&(e.elementForm.$submitted=!0,e.elementForm.$valid)){var n=d3.select(e.elementData.element),t=e.map.geojson.data,a=n.data()[0]||{};if(!a)throw new Error("No data found in the selected <path> element");var i=JSON.stringify(a);if(!(a=_.find(t.features,(function(e){return e.type===a.type&&JSON.stringify(e)===i}))))throw new Error("Feature not found in the source content");a.properties=a.properties||{},delete e.elementData.element,angular.merge(a.properties,e.elementData),e.resetElementForm(),e.markAsDirty(),e.updateView(t)}},e.cancelEditElement=function(){e.resetElementForm()},e.cancel=function(){e.resetForms(),e.map.geojson.data=null,e.showConfig=!1,d3.select("#"+e.shapeId+" *").remove()},e.save=function(){var n=e.map.geojson.data;if(n&&e.dirty){if(e.formData.errors=null,e.countryForm.$submitted=!0,e.saving||!e.countryForm.$valid||!e.formData.country)return o.reject();if(!u.isLogin())return e.loadWallet().then(e.save);e.saving=!0;var t=e.formData.country||"fr";return c.loading.show({template:"Saving..."}).then((function(){return p.save(n,{country:t,removeHole:e.configData.removeHole,precision:e.configData.applyRound&&e.configData.degreePrecision||null,strictMode:e.configData.strictMode,updateProgression:function(e,n,t){var a=e.properties&&(e.properties.title||e.properties.id)||""+n;c.loading.show({template:"Saving... ({1}/{2})<br/><b>{0}</b>".format(a,n+1,t)})}})})).then((function(){return e.saving=!1,i((function(){return e.load({country:t})}),2e3)})).then((function(){return c.toast.show("MAP.SHAPE.EDIT.INFO.SAVED")})).catch((function(n){c.onError("MAP.SHAPE.EDIT.ERROR.SAVE_FAILED")(n),n&&n.errors?e.formData.errors=n&&n.errors||null:n.message&&(e.formData.errors=[n])})).then((function(){e.saving=!1}))}},e.getNormalizeProperties=function(e,n){return{id:e&&e.id||n&&n.id||e&&e.code,title:e&&(e.title||e.name||e.label||e.nom),country:e&&e.country||n&&n.country,position:e&&e.position,order:e&&e.order||void 0}},e.findSvgElementFromPath=function(e){var n=d3.select(e);alert(n),alert(n.bounds())},e.searchOnPath=function(){if(e.elementData.element){var a=d3.select(e.elementData.element).data();if(a&&a.length){var i=a[0],o=e.getNormalizeProperties(i.properties).name;n.geoShapes=n.geoShapes||{},n.geoShapes[o]=i.geometry,t.go("app.market_lookup",{location:o})}}},e.download=function(){if(!e.loading&&!e.saving&&e.map.geojson.data){var n=JSON.stringify(e.map.geojson.data),t=new Blob([n],{type:"application/geo+json; charset=utf-8"}),a=(e.formData.country||"export")+".geojson";l.saveAs(t,a)}},e.centerMap=function(n){console.debug("[map] [shape] Center map to:",n),n.lng=angular.isDefined(n.lon)?n.lon:n.lng,n.zoom=n.zoom||e.map.center.zoom||10,n.lat===e.map.center.lat&&n.lng===e.map.center.lng&&n.zoom===e.map.center.zoom&&(n.zoom+=2),angular.merge(e.map.center,n)}}function Me(e,n,t,a,i,o,s,r){angular.extend(this,t("MapShapeViewCtrl",{$scope:e})),e.onClick=function(e,n){if(!e||!e.defaultPrevented){console.debug("[map] [home] Handling click on a SVG element...");var t=d3.select(n).data();if(t&&t.length){var i=t[0],o=i.properties,l=o.title&&o.title.trim();if(l&&l.length)return s.cache.put(i).then((function(e){return a.go("app.market_lookup",{shape:e,location:l})})).then((function(){r.data.plugins.market=r.data.plugins.market||{},r.data.plugins.defaultSearch=angular.merge(r.data.plugins.defaultSearch||{},{location:l,geoShape:i,geoPoint:void 0,geoDistance:void 0})}));console.error("[map] [home] Invalid GeoJson data. Missing or empty attribute 'properties.title'.")}else console.error("[map] [home] Invalid SVG element: no geoJson data found.")}},e.start=function(){console.debug("[home] [shape] Starting"),e.load()},i.ready().then(e.start)}if(angular.module("cesium.settings.services",["ngApi","cesium.config"]).factory("csSettings",["$rootScope","$q","$window","Api","localStorage","$translate","csConfig",function(e,n,t,a,i,o,s){var r=[{id:"en",label:"English",flag:"us",country:"us"},{id:"en-GB",label:"English (UK)",flag:"gb",country:"gb"},{id:"eo-EO",label:"Esperanto",flag:"eo"},{id:"fr-FR",label:"Français",flag:"fr",country:"fr"},{id:"fr-BE",label:"Français (BE)",flag:"be",country:"be"},{id:"es-ES",label:"Spanish",flag:"es",country:"es"}],l=s.fallbackLanguage?c(s.fallbackLanguage):"en";function c(e){if(!e)return l;if(_.findWhere(r,{id:e}))return e;var n=e.split("-");if(n.length>1)return c(n[0]);var t=_.find(r,(function(n){return String.prototype.startsWith.call(n.id,e)}));return t?t.id:l}var d,u,p,m,E={STORAGE_KEY:"GCHANGE_SETTINGS",KEEP_AUTH_IDLE_SESSION:9999},g={timeout:4e3,cacheTimeMs:6e4,timeWarningExpireMembership:5184e3,timeWarningExpire:7776e3,minVersion:"1.7.0",newIssueUrl:"https://github.com/duniter-gchange/gchange-client/issues/new?labels=bug",userForumUrl:"https://forum.monnaie-libre.fr",latestReleaseUrl:"https://api.github.com/repos/duniter-gchange/gchange-client/releases/latest",httpsMode:!1,share:{mastodonAuthor:"@gchange@framapiaf.org",defaultHastags:"#gchange"}},f=angular.merge({useRelative:!1,useLocalStorage:!!t.localStorage,useLocalStorageEncryption:!1,persistCache:!1,walletHistoryTimeSecond:2592e3,walletHistorySliceSecond:432e3,walletHistoryAutoRefresh:!0,rememberMe:!0,keepAuthIdle:600,showUDHistory:!0,showLoginSalt:!1,expertMode:!1,decimalCount:2,uiEffects:!0,blockValidityWindow:6,helptip:{enable:!1,installDocUrl:"https://github.com/duniter-gchange/gchange-client/blob/master/README.md",currency:0,network:0,wotLookup:0,wot:0,wotCerts:0,wallet:0,walletCerts:0,wallets:0,header:0,settings:0},currency:{allRules:!1,allWotRules:!1},wallet:{showPubkey:!0,alertIfUnusedWallet:!0,notificationReadTime:0},locale:{id:(p=s.defaultLanguage||o.use(),m=c(p),p!==m&&console.debug("[settings] Fix locale [{0}] -> [{1}]".format(p,m)),m)}},g,s),h={},T=!1,b=new a(this,"csSettings"),v=function(){if(angular.isUndefined(d)||!angular.equals(d,h))return d=angular.copy(h),b.data.raise.changed(h)},O=function(){return T?(h.useLocalStorage?!0===h.node.temporary?i.getObject(E.STORAGE_KEY).then((function(e){var n=angular.copy(h);return n.node=e&&e.node||{},delete n.temporary,i.setObject(E.STORAGE_KEY,n)})):i.setObject(E.STORAGE_KEY,h):i.setObject(E.STORAGE_KEY,null)).then((function(){return h.useLocalStorage&&console.debug("[setting] Saved locally"),b.data.raisePromise.store(h)})).then(v):(console.debug("[setting] Waiting start finished..."),(u||N()).then(O))},R=function(e){if(e){var n=!1;if(e.locale&&e.locale.id){var t=c(e.locale.id);e.locale=_.findWhere(r,{id:t}),n=!h.locale||e.locale.id!==h.locale.id||e.locale.id!==o.use()}if(_.keys(g).forEach((function(n){e[n]=f[n]})),angular.merge(h,e),(e&&e.node&&!e.node.temporary||!h.node.temporary)&&delete h.node.temporary,h.plugins&&h.plugins.es.host&&h.plugins.es.port&&(!h.node||h.node.host!==h.plugins.es.host)){var a=h.node.host,i=h.plugins.es.host;console.warn("[settings] Replacing duniter node {{0}} with gchange pod {{1}}".format(a,i)),h.node={host:i,port:h.plugins.es.port,useSsl:h.plugins.es.useSsl}}n&&o.use(h.locale.id)}},I=function(){var e=Date.now();return i.getObject(E.STORAGE_KEY).then((function(n){if(!n)return console.debug("[settings] No settings in local storage. Using defaults."),R(f),void v();R(n),console.debug("[settings] Loaded from local storage in "+(Date.now()-e)+"ms"),v()}))},N=function(){return console.debug("[settings] Starting..."),u=i.ready().then(I).then((function(){console.debug("[settings] Started"),T=!0,u=null,b.data.raise.ready(h)}))};return e.$on("$translateChangeSuccess",(function(){var e=o.use();console.debug("[settings] Locale ["+e+"]");try{moment.locale(e.toLowerCase())}catch(n){try{moment.locale(e.substr(0,2))}catch(e){moment.locale("en-gb"),console.warn("[settings] Unknown local for moment lib. Using default [en]")}}try{numeral.language(e.toLowerCase())}catch(n){try{numeral.language(e.substring(0,2))}catch(e){numeral.language("en-gb"),console.warn("[settings] Unknown local for numeral lib. Using default [en]")}}b.locale.raise.changed(e)})),b.registerEvent("data","reset"),b.registerEvent("data","changed"),b.registerEvent("data","store"),b.registerEvent("data","ready"),b.registerEvent("locale","changed"),R(f),{isStarted:function(){return T},ready:function(){return T?n.when():u||N()},start:N,data:h,apply:R,getByPath:function(e,n){var t=h;return _.each(e.split("."),(function(e){t=t[e],angular.isUndefined(t)&&(t=n)})),t},reset:function(){return _.keys(h).forEach((function(e){delete h[e]})),R(f),b.data.raisePromise.reset(h).then(O)},store:O,restore:I,getFeedUrl:function(){var e=h.locale&&h.locale.id||s.defaultLanguage||"en";return s.feed&&s.feed.jsonFeed?s.feed.jsonFeed[e]?s.feed.jsonFeed[e]:f.feed.jsonFeed[s.defaultLanguage||"en"]||s.feed:void 0},defaultSettings:f,api:b,locales:r,constants:E,fixLocale:c}}]),angular.module("cesium.crypto.services",["cesium.utils.services"]).factory("CryptoUtils",["$q","$timeout","ionicReady",function(e,n,t){function a(){this.loaded=!1;var e=this;this.copy=function(n){_.forEach(_.keys(n),(function(t){e[t]=n[t]}))},this.isLoaded=function(){return this.loaded},this.util=this.util||{},this.util.array_to_string=function(e,n){var t=new Blob([new Uint8Array(e)]),a=new FileReader;a.onload=function(e){n(e.target.result)},a.readAsText(t)}}a.prototype.constants={crypto_sign_BYTES:64,crypto_secretbox_NONCEBYTES:24,crypto_box_MACBYTES:16,SEED_LENGTH:32,SCRYPT_PARAMS:{SIMPLE:{N:2048,r:8,p:1,memory:-1},DEFAULT:{N:4096,r:16,p:1,memory:-1}}},a.prototype.async_load_base58=function(e){var t=this;if(null!==Base58)return e(Base58);n((function(){t.async_load_base58(e)}),100)},a.prototype.async_load_scrypt=function(e,t){var a=this;null!==scrypt_module_factory?scrypt_module_factory(e,t):n((function(){a.async_load_scrypt(e,t)}),100)},a.prototype.async_load_nacl_js=function(e,t){var a=this;null!==nacl_factory?nacl_factory.instantiate(e,t):n((function(){a.async_load_nacl_js(e,t)}),100)},a.prototype.async_load_base64=function(e){var t=this;null!==Base64?e(Base64):n((function(){t.async_load_base64(e)}),100)},a.prototype.async_load_sha256=function(e){var t=this;if(null!==sha256)return e(sha256);n((function(){t.async_load_sha256(e)}),100)},a.prototype.seed_from_signSk=function(e){for(var n=new Uint8Array(that.constants.SEED_LENGTH),t=0;t<n.length;t++)n[t]=e[t];return n},a.prototype.seed_from_signSk=function(e){for(var n=new Uint8Array(that.constants.SEED_LENGTH),t=0;t<n.length;t++)n[t]=e[t];return n};var i=window.crypto||window.msCrypto||window.Crypto;function o(){this.id="FullJS",this.scrypt=null,this.nacl=null,this.base58=null,this.base64=null;var n=this;function t(e,n){if(0!==n)throw{message:"nacl_raw."+e+" signalled an error"}}function a(e,t,a,o,s){return function(e,n,t,a){if(t.length!==a)throw{message:"nacl."+e+" expected "+a+"-byte "+n+" but got length "+t.length}}(e,t,a,o),function(e,t){var a=t||0,o=i(e.length+a);n.nacl.nacl_raw.HEAPU8.set(e,o+a);for(var s=o;s<o+a;s++)n.nacl.nacl_raw.HEAPU8[s]=0;return o}(a,s)}function i(e){var t=n.nacl.nacl_raw._malloc(e);if(0===t)throw{message:"malloc() failed",nbytes:e};return t}function o(e){n.nacl.nacl_raw._free(e)}function s(e){this.length=e,this.address=i(e)}this.util=this.util||{},this.util.decode_utf8=function(e){var n,t=unescape(encodeURIComponent(e)),a=new Uint8Array(t.length);for(n=0;n<t.length;n++)a[n]=t.charCodeAt(n);return a},this.util.encode_utf8=function(e){return n.nacl.encode_utf8(e)},this.util.encode_base58=function(e){return n.base58.encode(e)},this.util.decode_base58=function(e){var t,a=n.base58.decode(e),i=new Uint8Array(a.length);for(t=0;t<a.length;t++)i[t]=a[t];return i},this.util.decode_base64=function(e){return n.base64.decode(e)},this.util.encode_base64=function(e){return n.base64.encode(e)},this.util.hash_sha256=function(t){return e((function(e){var a=n.util.decode_utf8(t);e(n.nacl.to_hex(n.nacl.crypto_hash_sha256(a)).toUpperCase())}))},this.util.random_nonce=function(){if(n.crypto&&n.crypto.getRandomValues){var t=new Uint8Array(n.constants.crypto_secretbox_NONCEBYTES);return n.crypto.getRandomValues(t),e.when(t)}return e.when(n.nacl.crypto_box_random_nonce())},this.util.crypto_hash_sha256=function(e){return n.nacl.crypto_hash_sha256(e)},this.util.crypto_scrypt=function(t,a,i,o,s,r){return e((function(e,l){try{e(n.scrypt.crypto_scrypt(t,a,i,o,s,r))}catch(e){l(e)}}))},this.box_keypair_from_sign=function(i){return i.boxSk&&i.boxPk?e.when(i):e((function(e,r){try{e((l=a("crypto_box_keypair_from_sign_sk","sk",i.signSk,n.nacl.nacl_raw._crypto_sign_secretkeybytes()),c=new s(n.nacl.nacl_raw._crypto_box_secretkeybytes()),t("_crypto_sign_ed25519_sk_to_curve25519",n.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(c.address,l)),o(l),n.nacl.crypto_box_keypair_from_raw_sk(c.extractBytes())))}catch(e){r(e)}var l,c}))},this.box_pk_from_sign=function(i){return e((function(e,r){try{e((l=a("crypto_box_pk_from_sign_pk","pk",i,n.nacl.nacl_raw._crypto_sign_publickeybytes()),c=new s(n.nacl.nacl_raw._crypto_box_publickeybytes()),t("_crypto_sign_ed25519_pk_to_curve25519",n.nacl.nacl_raw._crypto_sign_ed25519_pk_to_curve25519(c.address,l)),o(l),c.extractBytes()))}catch(e){r(e)}var l,c}))},this.box_sk_from_sign=function(i){return e((function(e,r){try{e((l=a("crypto_box_sk_from_sign_sk","sk",i,n.nacl.nacl_raw._crypto_sign_secretkeybytes()),c=new s(n.nacl.nacl_raw._crypto_box_secretkeybytes()),t("_crypto_sign_ed25519_sk_to_curve25519",n.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(c.address,l)),o(l),c.extractBytes()))}catch(e){r(e)}var l,c}))},this.box=function(t,a,i,o){return e((function(e,s){if(t){var r=n.nacl.encode_utf8(t);"string"==typeof i&&(i=n.util.decode_base58(i));try{var l=n.nacl.crypto_box(r,a,i,o);e(n.util.encode_base64(l))}catch(e){s(e)}}else e(t)}))},this.box_open=function(t,a,i,o){return e((function(e,s){if(t){var r=n.util.decode_base64(t);"string"==typeof i&&(i=n.util.decode_base58(i));try{var l=n.nacl.crypto_box_open(r,a,i,o);e(n.nacl.decode_utf8(l))}catch(e){s(e)}}else e(t)}))},this.scryptKeypair=function(e,t,a){return n.util.crypto_scrypt(n.util.encode_utf8(t),n.util.encode_utf8(e),a&&a.N||n.constants.SCRYPT_PARAMS.DEFAULT.N,a&&a.r||n.constants.SCRYPT_PARAMS.DEFAULT.r,a&&a.p||n.constants.SCRYPT_PARAMS.DEFAULT.p,n.constants.SEED_LENGTH).then((function(e){var t=n.nacl.crypto_sign_seed_keypair(e),a=n.nacl.crypto_box_seed_keypair(e);return{signPk:t.signPk,signSk:t.signSk,boxPk:a.boxPk,boxSk:a.boxSk}}))},this.seedKeypair=function(t){return e((function(e,a){var i=n.nacl.crypto_sign_seed_keypair(t),o=n.nacl.crypto_box_seed_keypair(t);e({signPk:i.signPk,signSk:i.signSk,boxPk:o.boxPk,boxSk:o.boxSk})}))},this.scryptSignPk=function(t,a,i){return e((function(e,o){try{var s=n.scrypt.crypto_scrypt(n.util.encode_utf8(a),n.util.encode_utf8(t),i&&i.N||n.constants.SCRYPT_PARAMS.DEFAULT.N,i&&i.r||n.constants.SCRYPT_PARAMS.DEFAULT.r,i&&i.p||n.constants.SCRYPT_PARAMS.DEFAULT.p,n.constants.SEED_LENGTH);e(n.nacl.crypto_sign_seed_keypair(s).signPk)}catch(e){o(e)}}))},this.verify=function(t,a,i){return e((function(e,o){var s,r=n.util.decode_utf8(t),l=n.util.decode_base64(a),c=n.util.decode_base58(i),d=new Uint8Array(n.constants.crypto_sign_BYTES+r.length);for(s=0;s<n.constants.crypto_sign_BYTES;s++)d[s]=l[s];for(s=0;s<r.length;s++)d[s+n.constants.crypto_sign_BYTES]=r[s];e(null!==n.nacl.crypto_sign_open(d,c))}))},this.sign=function(t,a){return e((function(e,i){for(var o=n.util.decode_utf8(t),s=a.signSk,r=n.nacl.crypto_sign(o,s),l=new Uint8Array(n.constants.crypto_sign_BYTES),c=0;c<l.length;c++)l[c]=r[c];e(n.base64.encode(l))}))},this.load=function(){var t=e.defer(),a={},i={};"a"!=ionic.Platform.grade.toLowerCase()&&(console.info("Reduce NaCl memory to 16mb, because plateform grade is not [a] but [{0}]".format(ionic.Platform.grade)),a.requested_total_memory=16777216);var o=0,s=function(){4==++o&&(n.loaded=!0,t.resolve())};return this.async_load_nacl_js((function(e){n.nacl=e,s()}),a),this.async_load_scrypt((function(e){n.scrypt=e,n.scrypt.requested_total_memory=i.requested_total_memory,s()}),i),this.async_load_base58((function(e){n.base58=e,s()})),n.async_load_base64((function(e){n.base64=e,s()})),t.promise},this.util.hash=n.util.hash_sha256,this.box={keypair:{fromSignKeypair:n.box_keypair_from_sign,skFromSignSk:n.box_sk_from_sign,pkFromSignPk:n.box_pk_from_sign},pack:n.box,open:n.box_open},s.prototype.extractBytes=function(e){var t=function(e,t){var a=new Uint8Array(t);return a.set(n.nacl.nacl_raw.HEAPU8.subarray(e,e+t)),a}(this.address+(e||0),this.length-(e||0));return o(this.address),this.address=null,t}}i&&i.getRandomValues&&(a.prototype.crypto=i,a.prototype.util={},a.prototype.util.random_nonce=function(){var n=new Uint8Array(crypto_secretbox_NONCEBYTES);return this.crypto.getRandomValues(n),e.when(n)}),o.prototype=new a,new a;var s=new a;return t().then((function(){console.debug("[crypto] Starting...");var e,n=Date.now();console.debug("[crypto] Loading 'FullJS' implementation..."),(e=new o).load().catch((function(e){throw console.error(e),e})).then((function(){s.copy(e),console.debug("[crypto] Loaded '{0}' implementation in {1}ms".format(s.id,Date.now()-n))}))})),s}]).factory("csCrypto",["$q","$rootScope","$timeout","CryptoUtils","UIUtils","Modals",function(e,n,t,a,i,o){function s(e){return new RegExp(e)}function r(e,n){for(var t=Math.max(e.length,n.length),a=new Uint8Array(t),i=0;i<t;++i)a[i]=e[i]^n[i];return a}function l(e,n){var t=new Uint8Array(e.byteLength+n.byteLength);return t.set(new Uint8Array(e),0),t.set(new Uint8Array(n),e.byteLength),t}var c={WIF:{DATA_LENGTH:35},EWIF:{SALT_LENGTH:4,DERIVED_HALF_LENGTH:16,DATA_LENGTH:39,SCRYPT_PARAMS:{N:16384,r:8,p:8}},REGEXP:{PUBKEY:"[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}",SECKEY:"[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{86,88}",FILE:{TYPE_LINE:"^Type: ([a-zA-Z0-9]+)\n",VERSION:"Version: ([0-9]+)\n",PUB:"[Pp]ub: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44})\n",SEC:"[Ss]ec: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{86,88})(\n|$)",DATA:"[Dd]ata: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+)(\n|$)"}}},d={FILE:{TYPE_LINE:s(c.REGEXP.FILE.TYPE_LINE),VERSION:s(c.REGEXP.FILE.VERSION),PUB:s(c.REGEXP.FILE.PUB),SEC:s(c.REGEXP.FILE.SEC),DATA:s(c.REGEXP.FILE.DATA)}},u={BAD_PASSWORD:3001,BAD_CHECKSUM:3002};function p(n,t){if(!n)return e.reject("Argument [content] is missing");var i;(t=t||{}).withSecret=!!angular.isDefined(t.withSecret)&&t.withSecret,t.defaultType=t.defaultType||"PubSec";var o=d.FILE.TYPE_LINE.exec(n),s=o&&o[1];if(!s&&t.defaultType)return p("Type: {0}\n{1}".format(t.defaultType,n),t);if("PubSec"===s){if(!(i=d.FILE.PUB.exec(n)))return e.reject("Missing [pub] field in file, or invalid public key value");var r={signPk:a.base58.decode(i[1])};return t.withSecret?(i=d.FILE.SEC.exec(n))?(r.signSk=a.base58.decode(i[1]),e.resolve(r)):e.reject("Missing [sec] field in file, or invalid secret key value"):e.resolve(r)}return"WIF"==s||"EWIF"==s?(i=d.FILE.DATA.exec(n))?m(i[1],{type:s,password:t.password}).then((function(e){return e&&!t.withSecret?{signPk:e.signPk}:e})):e.reject("Missing [Data] field in file. This is required for WIF or EWIF format"):t.defaultType?e.reject("Bad file format: missing Type field"):e.reject("Bad file format, unknown type ["+s+"]")}function m(n,t){t=t||{};var i=n&&a.base58.decode(n);return!i||i.length!=c.EWIF.DATA_LENGTH&&i.length!=c.WIF.DATA_LENGTH?e.reject("Invalid WIF or EWIF format (invalid bytes count)."):(t.type=t.type||1==i[0]&&"WIF"||2==i[0]&&"EWIF","WIF"===t.type?function(n){var t=a.util.decode_base58(n);if(1!=t[0])return e.reject({message:"Invalid WIF v1 format: expected [0x01] as first byte"});if(t.length!=c.WIF.DATA_LENGTH)return e.reject({message:"Invalid WIF v1 format: Data must be a "+c.WIF.DATA_LENGTH+" bytes array, encoded in base 58."});var i=t.slice(0,-2),o=t.slice(1,-2),s=t.slice(-2),r=a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(i)).slice(0,2);return a.util.encode_base58(s)!=a.util.encode_base58(r)&&e.reject({message:"Invalid WIF format: bad checksum"}),a.seedKeypair(o)}(n):"EWIF"===t.type?"function"!=typeof t.password||(t.password=t.password(),t.password)?"object"==typeof t.password&&t.password.then?t.password.then((function(e){if(!e)throw"CANCELLED";return E(n,e)})):"string"==typeof t.password?E(n,t.password):e.reject({message:"Invalid EWIF options.password. Waiting a callback function, a promise or a string."}):e.reject({message:"Invalid callback result for 'options.password()': must return a promise or a string."}):e.reject({message:"Invalid WIF or EWIF format: unknown first byte identifier."}))}function E(n,t){var i=a.util.decode_base58(n);if(2!=i[0])return e.reject({message:"Invalid EWIF v1 format: Expected [0x02] as first byte"});if(i.length!=c.EWIF.DATA_LENGTH)return e.reject({message:"Invalid EWIF v1 format: Expected {0} bytes, encoded in base 58.".format(c.EWIF.DATA_LENGTH)});var o=i.slice(0,-2),s=i.slice(-2),d=i.slice(1,5),p=i.slice(5,21),m=i.slice(21,37);return a.util.crypto_scrypt(a.util.encode_utf8(t),d,c.EWIF.SCRYPT_PARAMS.N,c.EWIF.SCRYPT_PARAMS.r,c.EWIF.SCRYPT_PARAMS.p,64).then((function(e){var n=e.slice(0,32),t=e.slice(32,64),a=new aesjs.ModeOfOperation.ecb(t),i=a.decrypt(p),o=a.decrypt(m);return i=new Uint8Array(i),o=new Uint8Array(o),l(r(i,n.slice(0,16)),r(o,n.slice(16,32)))})).then(a.seedKeypair).then((function(e){var n=a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(e.signPk)).slice(0,4);if(a.util.encode_base58(d)!==a.util.encode_base58(n))throw{ucode:u.BAD_PASSWORD,message:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD"};var t=a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(o)).slice(0,2);if(a.util.encode_base58(s)!=a.util.encode_base58(t))throw{ucode:u.BAD_CHECKSUM,message:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_CHECKSUM"};return e}))}function g(n){if(!n)throw new Error("Missing keypair");return n.boxPk&&n.boxSk?e.when(n):e.all([a.box.keypair.skFromSignSk(n.signSk),a.box.keypair.pkFromSignPk(n.signPk)]).then((function(e){return{boxSk:e[0],boxPk:e[1]}}))}return{errorCodes:u,constants:c,util:angular.extend({pkChecksum:function(e){var n=a.util.decode_base58(e);return a.util.encode_base58(a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(n))).substring(0,3)}},a.util),keyfile:{read:function(n,t){return n&&n.content?p(n.content,t):e((function(e,a){if(!n)return a("Argument [file] is missing");var i=new FileReader;i.onload=function(n){p(n.target.result,t).then(e).catch(a)},i.readAsText(n,"utf8")}))},parseData:function e(n,a){return(a=a||{}).withSecret=!angular.isDefined(a.withSecret)||a.withSecret,a.silent=!!angular.isDefined(a.withSecret)&&a.silent,a.password=function(){return i.loading.hide(100).then((function(){return o.showPassword({title:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE",subTitle:"ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP",error:a.error,scope:a.scope})})).then((function(e){return t((function(){return e&&i.loading.show(),e}),150)}))},a.silent||i.loading.show(),m(n,a).then((function(e){return e})).catch((function(t){if(!t||"CANCELLED"!==t){if(t&&t.ucode==u.BAD_PASSWORD)return e(n,{withSecret:a.withSecret,error:"ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD"});throw console.error("[crypto] Unable to parse as WIF or EWIF format: "+(t&&t.message||t)),t}}))},generateContent:function n(t,i){switch((i=i||{}).type=i.type||"PubSec",i.type){case"PubSec":return e.resolve("Type: PubSec\nVersion: 1\npub: "+a.base58.encode(t.signPk)+"\nsec: "+a.base58.encode(t.signSk)+"\n");case"WIF":return function(n){var t=a.seed_from_signSk(n.signSk);if(!t||t.byteLength!==a.constants.SEED_LENGTH)throw"Bad see format. Expected {0} bytes".format(a.constants.SEED_LENGTH);var i=new Uint8Array(1);i[0]=1;var o=l(i,t),s=l(o,a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(o)).slice(0,2));return e.when(a.util.encode_base58(s))}(t).then((function(e){return"Type: WIF\nVersion: 1\nData: "+e+"\n"}));case"EWIF":return i.password?i.password&&"function"==typeof i.password&&(console.debug("[crypto] [EWIF] Executing 'options.password()' to resolve the password..."),i.password=i.password(),!i.password)?e.reject({message:"Invalid callback result for 'options.password()': must return a promise or a string."}):i.password&&"object"==typeof i.password&&i.password.then?i.password.then((function(e){if(!e)throw"CANCELLED";return n(t,angular.merge({},i,{password:e}))})):i.password&&"string"==typeof i.password?function(n,t){var i=a.seed_from_signSk(n.signSk);if(!i||i.byteLength!==a.constants.SEED_LENGTH)return e.reject({message:"Bad see format. Expected {0} bytes".format(a.constants.SEED_LENGTH)});var o=a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(n.signPk)).slice(0,4);return a.util.crypto_scrypt(a.util.encode_utf8(t),o,c.EWIF.SCRYPT_PARAMS.N,c.EWIF.SCRYPT_PARAMS.r,c.EWIF.SCRYPT_PARAMS.p,64).then((function(e){var n=e.slice(0,32),t=e.slice(32,64),s=r(i.slice(0,16),n.slice(0,16)),c=r(i.slice(16,32),n.slice(16,32)),d=new aesjs.ModeOfOperation.ecb(t),u=d.encrypt(s),p=d.encrypt(c);u=new Uint8Array(u),p=new Uint8Array(p);var m=new Uint8Array(1);return m[0]=2,m=l(m,o),m=l(m,u),m=l(m,p),m=l(m,a.util.crypto_hash_sha256(a.util.crypto_hash_sha256(m)).slice(0,2)),a.util.encode_base58(m)}))}(t,i.password).then((function(e){return"Type: EWIF\nVersion: 1\nData: "+e+"\n"})):e.reject({message:"Invalid EWIF options.password. Waiting a callback function, a promise or a string."}):e.reject({message:"Missing EWIF options.password."});default:return e.reject({message:"Unknown keyfile format: "+i.type})}}},box:{getKeypair:g,pack:function(n,t,i,o,s){if(!n[i=i||"recipient"])return e.reject({message:"ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY"});"string"==typeof(o=o||"content")&&(o=[o]),n=angular.copy(n);var r=a.util.decode_base58(n[i]);return e.all([g(t),a.box.keypair.pkFromSignPk(r),s?e.when(s):a.util.random_nonce()]).then((function(t){var i=t[0].boxSk,s=t[1],r=t[2];return e.all(o.reduce((function(e,t){return n[t]?e.concat(a.box.pack(n[t],r,s,i)):e}),[])).then((function(e){var t=0;return _.forEach(o,(function(a){n[a]?n[a]=e[t++]:n[a]=null})),n.nonce=a.util.encode_base58(r),n}))}))},open:function(n,t,i,o){i=i||"issuer","string"==typeof(o=o||"content")&&(o=[o]);var s=Date.now(),r={},l=[g(t)];return e.all(n.reduce((function(e,n){var t=n[i];if(!t)throw"Record has no "+i;return r[t]?res:e.concat(a.box.keypair.pkFromSignPk(a.util.decode_base58(t)).then((function(e){r[t]=e})))}),l)).then((function(t){var s=t[0];return e.all(n.reduce((function(e,n){var t=r[n[i]],l=a.util.decode_base58(n.nonce);return n.valid=!0,e.concat(o.reduce((function(e,i){return n[i]?e.concat(a.box.open(n[i],l,t,s.boxSk).then((function(e){n[i]=e})).catch((function(e){console.error(e),console.warn("[ES] [crypto] a record may have invalid cypher "+i),n.valid=!1}))):e}),[]))}),[]))})).then((function(){return console.debug("[ES] [crypto] All record decrypted in "+(Date.now()-s)+"ms"),n}))}}}}]),angular.module("cesium.utils.services",["angular-fullscreen-toggle"]).factory("ionicReady",["$ionicPlatform",function(e){var n;return function(){return n||(n=e.ready()),n}}]).factory("UIUtils",["$ionicLoading","$ionicPopup","$ionicConfig","$ionicHistory","$translate","$q","ionicMaterialInk","ionicMaterialMotion","$window","$timeout","Fullscreen","localStorage","csSettings","$ionicPopover","$state","$rootScope","screenmatch",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f){var h,T=null,b={smallscreen:f.bind("xs, sm",g)},v={};function O(e,t){return e?o((function(a){i([e,"ERROR.POPUP_TITLE","ERROR.UNKNOWN_ERROR","COMMON.BTN_OK",t||"_NON_NULL_"]).then((function(i){var o=e.message||i[e];return n.show({template:"<p>"+(o||i["ERROR.UNKNOWN_ERROR"])+"</p>",title:i["ERROR.POPUP_TITLE"],subTitle:t&&i[t]||void 0,buttons:[{text:"<b>"+i["COMMON.BTN_OK"]+"</b>",type:"button-assertive",onTap:function(e){a(e)}}]})}))})):o.when()}function R(e,t,a){return e?((a=a||{}).cssClass=a.cssClass||"info",a.okText=a.okText||"COMMON.BTN_OK",o((function(o){i([e,"INFO.POPUP_TITLE",a.okText,t||"_NON_NULL_"]).then((function(i){n.show({template:"<p>"+i[e]+"</p>",title:i["INFO.POPUP_TITLE"],subTitle:t&&i[t]||void 0,cssClass:a.cssClass,buttons:[{text:i[a.okText],type:"button-positive",onTap:function(e){o(e)}}]})}))}))):o.reject("Missing 'message' argument")}function I(n){return n?c((function(){return e.hide()}),n):e.hide()}function N(n){return T?((n=n||{}).template=n.template||T,e.show(n)):i("COMMON.LOADING").then((function(e){return T=e,N(n)}))}function S(){return b.smallscreen.active}function A(e,n,t){return function(n){var a,i=n.target.width,o=n.target.height,s=t?200:640,r=t?200:480,l=document.createElement("canvas");if(t){i>o?(i*=r/o,o=r):(o*=s/i,i=s),l.width=s,l.height=r,a=l.getContext("2d");var c=Math.trunc((s-i)/2+.5),d=Math.trunc((r-o)/2+.5);a.drawImage(n.target,c,d,s+-2*c,r+-2*d)}else i>o?i>s&&(o*=s/i,i=s):o>r&&(i*=r/o,o=r),l.width=i,l.height=o,(a=l.getContext("2d")).drawImage(n.target,0,0,l.width,l.height);var u=l.toDataURL();l.remove(),e(u)}}function D(e,n){var t=o.defer();(n=n||{}).templateUrl=n.templateUrl?n.templateUrl:"templates/common/popover_copy.html",n.scope=n.scope||g,n.scope.popovers=n.scope.popovers||{},n.autoselect=n.autoselect||!1,n.autoremove=!angular.isDefined(n.autoremove)||n.autoremove,n.backdropClickToClose=!angular.isDefined(n.backdropClickToClose)||n.backdropClickToClose,n.focusFirstInput=!!angular.isDefined(n.focusFirstInput)&&n.focusFirstInput;var a=function(a){(a=a||n.scope.popovers[n.templateUrl]).isResolved=!1,a.deferred=t,a.options=n,n.bindings&&angular.merge(a.scope,n.bindings),c((function(){a.show(e).then((function(){var e;n.autoselect?(e=document.querySelectorAll(n.autoselect)[0])&&(l.getSelection&&!l.getSelection().toString()?(e.setSelectionRange(0,e.value.length),e.focus()):e.focus()):n.autofocus&&(e=document.querySelectorAll(n.autofocus)[0])&&e.focus(),a.scope.$parent.$emit("popover.shown"),n.afterShow&&n.afterShow(a)}))}))},i=function(e){(e=e||n.scope.popovers[n.templateUrl])&&(delete n.scope.popovers[n.templateUrl],e.remove().then((function(){angular.element(l.document.querySelectorAll("body")[0]).removeClass("popover-open")})))},s=n.scope.popovers[n.templateUrl];return s?a(s):m.fromTemplateUrl(n.templateUrl,{scope:n.scope,backdropClickToClose:n.backdropClickToClose}).then((function(e){e.isResolved=!1,e.scope.closePopover=function(n){var t=e.options&&e.options.autoremove;e.options&&delete e.options.autoremove,e.hide().then((function(){if(t)return i(e)})).then((function(){e.deferred&&e.deferred.resolve(n),delete e.deferred,delete e.options}))},e.scope.$on("popover.hidden",(function(){e.options&&e.options.afterHidden&&e.options.afterHidden(),e.options&&e.options.autoremove&&i(e)})),n.scope.$on("$remove",(function(){e.deferred&&e.deferred.resolve(),i()})),n.scope.popovers[n.templateUrl]=e,a(e)})),t.promise}function C(e,n){var t=S()?100:10,a=".list.{0} .item, .list .{0} .item".format(n,n);return{ionListClass:n,show:function(n){return(n=n||{}).selector=n.selector||a,n.ink=!angular.isDefined(n.ink)||n.ink,n.startVelocity=n.startVelocity||(S()?1100:3e3),c((function(){n.ink&&h.ink(),e(n)}),n.timeout||t)}}}function L(e,n,t,a,i){i=i||"default",qrcode.stringToBytes=qrcode.stringToBytesFuncs[i];var o=qrcode(n||4,t||"M");return o.addData(e,a),o.make(),o}function P(e,n){if("string"==typeof e&&(e={selector:e}),void 0===e.selector||""===e.selector)return console.error("invalid toggleOn selector"),!1;c((function(){var n=document.querySelectorAll(e.selector);n&&_.forEach(n,(function(e){e.classList.toggle("on",!0)}))}),n||100)}function y(e,n){if("string"==typeof e&&(e={selector:e}),void 0===e.selector||""===e.selector)return console.error("invalid toggleOff selector"),!1;c((function(){var n=document.querySelectorAll(e.selector);n&&_.forEach(n,(function(e){e.classList.toggle("on",!1)}))}),n||900)}return v.motion={enable:!0,default:C(r.ripple,"animate-ripple"),blinds:C(r.blinds,"animate-blinds"),fadeSlideIn:C(r.fadeSlideIn,"animate-fade-slide-in"),fadeSlideInRight:C(r.fadeSlideInRight,"animate-fade-slide-in-right"),panInLeft:C(r.panInLeft,"animate-pan-in-left"),pushDown:C(r.pushDown,"push-down"),ripple:C(r.ripple,"animate-ripple"),slideUp:C(r.slideUp,"slide-up"),fadeIn:C((function(e){P(e)}),"fade-in"),toggleOn:P,toggleOff:y},h={alert:{error:O,info:R,confirm:function(e,t,a){return e?(t=t||"CONFIRM.POPUP_TITLE",(a=a||{}).cssClass=a.cssClass||"confirm",a.cancelText=a.cancelText||"COMMON.BTN_CANCEL",a.okText=a.okText||"COMMON.BTN_OK",i([e,t,a.cancelText,a.okText]).then((function(i){return n.confirm({template:i[e],cssClass:a.cssClass,title:i[t],cancelText:i[a.cancelText],cancelType:a.cancelType,okText:i[a.okText],okType:a.okType})}))):o.reject("Missing 'message' argument")},notImplemented:function(){return R("INFO.FEATURES_NOT_IMPLEMENTED")}},loading:{show:N,hide:I,update:function(n){return e._getLoader().then((function(e){if(e&&e.isShown)return n&&n.template?i(n&&n.template).then((function(t){return n.template=t,e})):void 0})).then((function(e){if(e&&e.isShown)return N(n)}))}},toast:{show:function(n,t,a){return n?(t=t||"short",a=a||"bottom",i(n).then((function(n){return"string"==typeof t&&(t="short"===t?2e3:5e3),e.show({template:n,noBackdrop:!0,duration:t})}))):o.reject("Missing 'message' argument")}},onError:function(e,n){return function(t){var a,i=e;if(t&&t.message?(i=t.message,a=e):e||(i=t),!n)return"CANCELLED"===i?I(10):(I(10),O(i,a));n(i)}},screen:{isSmall:S,fullscreen:d},ink:s.displayEffect,motion:v.motion,setEffects:function(e){if(h.motion.enable!==e){if(console.debug("[UI] [effects] "+(e?"Enable":"Disable")),h.motion.enable=e,e)t.views.transition("platform"),angular.merge(h.motion,v.motion);else{t.views.transition("none");var n={class:void 0,show:function(){}};angular.merge(h.motion,{enable:!1,default:n,fadeSlideIn:n,fadeSlideInRight:n,panInLeft:n,pushDown:n,ripple:n,slideUp:n,fadeIn:n,toggleOn:P,toggleOff:y}),g.motion=n}a.clearCache()}},qrcode:{svg:function(e,n,t,a,i){return L(e,n,t,a,i).createSvgTag()},img:function(e,n,t,a,i){return L(e,n,t,a,i).createImgTag()}},fab:{show:function(e,n){n||(n=900),c((function(){var n=document.getElementsByClassName("button-fab");_.forEach(n,(function(n){n.id==e&&n.classList.toggle("on",!0)}))}),n)},hide:function(e,n){n||(n=10),c((function(){var n=document.getElementsByClassName("button-fab");_.forEach(n,(function(n){n.id==e&&n.classList.toggle("on",!1)}))}),n)}},popover:{show:D,copy:function(e,n){var t=n&&n.indexOf("\n")>=0?n.split("\n").length:1;return D(e,{templateUrl:"templates/common/popover_copy.html",bindings:{value:n,rows:t},autoselect:".popover-copy "+(t<=1?"input":"textarea")})},share:function(e,n){return(n=n||{}).templateUrl=n.templateUrl?n.templateUrl:"templates/common/popover_share.html",n.autoselect=n.autoselect||".popover-share input",n.bindings=n.bindings||{},n.bindings.value=n.bindings.value||n.bindings.url||E.href(E.current,E.params,{absolute:!0}),n.bindings.postUrl=n.bindings.postUrl||n.bindings.value,n.bindings.postMessage=n.bindings.postMessage||"",n.bindings.titleKey=n.bindings.titleKey||"COMMON.POPOVER_SHARE.TITLE",n.bindings.shareOnMastodon=function(){!function(e,n){(n=n||{}).templateUrl="templates/common/popover_instance_address.html",n.autoselect=".popover-instance-address input",n.bindings=n.bindings||{},n.bindings.value=n.bindings.value||n.bindings.url||E.href(E.current,E.params,{absolute:!0}),n.bindings.postUrl=n.bindings.postUrl||n.bindings.value,n.bindings.postMessage=n.bindings.postMessage||"",n.bindings.postAuthor=n.bindings.postAuthor||p.data.share.mastodonAuthor,n.bindings.postHashtags=n.bindings.postHashtags||p.data.share.defaultHastags,n.bindings.titleKey=n.bindings.titleKey||"COMMON.POPOVER_SHARE.TITLE",u.get("mastodon_instance").then((function(t){return n.bindings.instance=t||"https://",t&&(n.autoselect=void 0),D(e,n)})).then((function(e){if(e){e.startsWith("https://")||e.startsWith("http://")||(e="https://"+e);var t=document.querySelectorAll('meta[property="og:title"]')[0].getAttribute("content");t||(t=document.getElementsByTagName("title")[0].innerHTML),e.endsWith("/")||(e+="/"),u.put("mastodon_instance",e);var a=e+"share?text="+encodeURIComponent(n.bindings.postMessage+"\n\n"+n.bindings.postUrl+"\n\n"+n.bindings.postHashtags+" "+(n.bindings.postAuthor||""));return console.debug("[utils] Mastodon share link: "+a),window.open(a,"mastodon-share","menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=370"),!1}}))}(e,n)},D(e,n)},helptip:function e(n,t){var a="string"==typeof n&&n?l.document.getElementById(n):n;n||a||!t.selector||(a=l.document.querySelector(t.selector));var i=(t=t||{}).deferred||o.defer();if(a&&!t.timeout)t.preAction&&a[t.preAction](),t.templateUrl=t.templateUrl?t.templateUrl:"templates/common/popover_helptip.html",t.autofocus=t.autofocus||"#helptip-btn-ok",t.bindings=t.bindings||{},t.bindings.icon=t.bindings.icon||{},t.bindings.icon.position=t.bindings.icon.position||!1,t.bindings.icon.glyph=t.bindings.icon.glyph||(t.bindings.icon.position&&t.bindings.icon.position.startsWith("bottom-")?"ion-arrow-down-c":"ion-arrow-up-c"),t.bindings.icon.class=t.bindings.icon.class||"calm icon "+t.bindings.icon.glyph,t.bindings.tour=!!angular.isDefined(t.bindings.tour)&&t.bindings.tour,D(a,t).then((function(e){t.postAction&&a[t.postAction](),i.resolve(e)})).catch((function(e){t.postAction&&a[t.postAction](),i.reject(e)}));else if(t.timeout){var s=t.timeout;t.retryTimeout=t.retryTimeout||s,delete t.timeout,t.deferred=i,c((function(){e(n,t)}),s)}else angular.isDefined(t.retry)&&!t.retry?"continue"===t.onError?c((function(){i.resolve(!0)})):c((function(){i.reject("[helptip] element now found: "+n)})):(t.retry=angular.isUndefined(t.retry)?2:t.retry-1,t.deferred=i,c((function(){e(n,t)}),t.timeout||t.retryTimeout||100));return i.promise}},selection:{select:function e(n){if(n.value||"text"===n.type||"textarea"===n.type)l.getSelection&&!l.getSelection().toString()&&n.setSelectionRange(0,n.value.length);else if(n.childNodes&&n.childNodes.length>0)e(n.childNodes[0]);else{var t=l.document.createRange();t.selectNodeContents(n);var a=l.getSelection();a.removeAllRanges(),a.addRange(t)}},get:function(){var e="";return window.getSelection&&(e=l.getSelection().toString()),e}},image:{resizeFile:function(e,n){var t=document.createElement("img");return o((function(a,i){if(e){var o=new FileReader;o.onload=function(e){t.onload=A(a,0,n),t.src=e.target.result},o.readAsDataURL(e)}else i("no file to resize")})).then((function(e){return t.remove(),e}))},resizeSrc:function(e,n){var t=document.createElement("img");return o((function(a,i){t.onload=A(a,0,n),t.src=e})).then((function(e){return t.remove(),e}))},rotateSrc:function(e,n){var t=document.createElement("img");return o((function(n,a){t.onload=function(e,n){var t=Math.PI/180*90;return function(n){var a=n.target.width,i=n.target.height;a>i?a>640&&(i*=640/a,a=640):i>480&&(a*=480/i,i=480);var o=document.createElement("canvas");o.width=i,o.height=a;var s=o.getContext("2d");s.rotate(t),s.drawImage(n.target,0,-1*o.width);var r=o.toDataURL();o.remove(),e(r)}}(n),t.src=e})).then((function(e){return t.remove(),e}))}},raw:v}}]).factory("$focus",["$timeout","$window",function(e,n){return function(t){e((function(){var e=n.document.getElementById(t);e&&e.focus()}))}}]),angular.module("cesium.cache.services",["angular-cache"]).factory("csCache",["$rootScope","$http","$window","csSettings","CacheFactory",function(e,n,t,a,i){var o={VERY_LONG:54e6,LONG:36e5,MEDIUM:3e5,SHORT:a.defaultSettings.cacheTimeMs},s=l(),r=[];function l(e){return(e=e||a.data)&&e.useLocalStorage&&e.persistCache&&t.localStorage?"localStorage":"memory"}function c(e){return(e=e||{}).storageMode=l(),e.deleteOnExpire="localStorage"===e.storageMode||e.onExpire?"aggressive":"passive",e.cacheFlushInterval="passive"===e.deleteOnExpire?36e5:null,e}function d(e){var n=l(e);n!==s&&(s=n,console.debug("[cache] Updating caches with {storageMode: {0}}".format(s)),_.forEach(_.keys(r),(function(e){var n=i.get(e);n&&n.setOptions(c(),!0)})))}return function(){a.api.data.on.changed(e,d,this)}(),{get:function(e,n,t){var a,s=(e=e||"")+((n=n||o.SHORT)/1e3+"s");if(t&&"function"==typeof t){for(var l=1;i.get(s+l);)l++;s+=l}else a=i.get(s);if(r[s]||(r[s]=!0),a)return a;var d=c({maxAge:n,onExpire:t||null});return console.debug("[cache] Creating cache {{0}} with {storageMode: {1}}...".format(s,d.storageMode)),i.createCache(s,d)},clear:function(e){_.forEach(_.keys(r),(function(n){if(n.startsWith(e)){var t=i.get(n);t&&t.removeAll()}}))},clearAll:function(){console.debug("[cache] Cleaning all caches..."),_.forEach(_.keys(r),(function(e){var n=i.get(e);n&&n.removeAll()}))},constants:o}}]),angular.module("cesium.modal.services",[]).controller("EmptyModalCtrl",(function(){})).controller("AboutModalCtrl",["$scope","UIUtils","csHttp",function(e,n,t){e.openLink=function(e,a,i){return(i=i||{}).onError=function(){return n.popover.copy(e,a)},t.uri.open(a,i)}}]).factory("ModalUtils",["$ionicModal","$rootScope","$q","$injector","$controller","$timeout",function(e,n,t,a,i,o){function s(e,n,a){e.deferred=n||t.defer(),e.resolved=!1,e.openModal=function(){return e.modal.show()},e.closeModal=function(n){return e.resolved=!0,e.modal.remove().then((function(){
|
||
return e.deferred.resolve(n),n}))},e.setForm=function(n,t){t?e[t]=n:e.form=n},e.getParameters=function(){return a},e.$on("modal.hidden",(function(){e.resolved||(e.resolved=!0,o((function(){return e.deferred.resolve(),e.modal.remove()}),(e.modal.hideDelay||320)+20))}))}return{show:function(a,o,r,l){var c,d,u,p=t.defer();if((l=l||{}).animation=l.animation||"slide-in-up",o){l.scope=l.scope?l.scope.$new():n.$new(),s.call({},l.scope,p,r);var m={$scope:l.scope,parameters:r},E=(d={isControllerAs:!1,controllerName:"",propName:""},u=((c=o)||"").trim().split(/\s+/),d.isControllerAs=3===u.length&&"as"===(u[1]||"").toLowerCase(),d.isControllerAs?(d.controllerName=u[0],d.propName=u[2]):d.controllerName=c,d),g=i(o,m);E.isControllerAs&&(g.openModal=l.scope.openModal,g.closeModal=l.scope.closeModal)}return e.fromTemplateUrl(a,l).then((function(e){if(o)e.scope.$parent.modal=e;else{var n=e.scope;s.call({},n,p,r),n.modal=e}return e.show()}),(function(e){p.reject(e)})),p.promise}}}]).factory("Modals",["ModalUtils",function(e){return{showTransfer:function(n){return e.show("templates/wallet/modal_transfer.html","TransferModalCtrl",n,{focusFirstInput:!0})},showLogin:function(n){var t=angular.copy(n||{});return delete t.templateUrl,delete t.controller,e.show(n&&n.templateUrl||"templates/login/modal_login.html",n&&n.controller||"LoginModalCtrl",t,{focusFirstInput:!0})},showWotLookup:function(n){return e.show("templates/wot/modal_lookup.html","WotLookupModalCtrl",n||{},{focusFirstInput:!0})},showNetworkLookup:function(n){return e.show("templates/network/modal_network.html","NetworkLookupModalCtrl",n,{focusFirstInput:!0})},showAbout:function(n){return e.show("templates/modal_about.html","AboutModalCtrl",n)},showJoin:function(n){return e.show("templates/join/modal_join.html","JoinModalCtrl",n)},showHelp:function(n){return e.show("templates/help/modal_help.html","HelpModalCtrl",n)},showAccountSecurity:function(n){return e.show("templates/wallet/modal_security.html","WalletSecurityModalCtrl",n)}}}]),angular.module("cesium.http.services",["cesium.cache.services"]).factory("csHttp",["$http","$q","$timeout","$window","csSettings","csCache","Device",function(e,n,t,a,i,o,s){var r=i.data.timeout,l=[],c={},d={POSITIVE_INTEGER:/^\d+$/,VERSION_PART_REGEXP:/^[0-9]+|alpha[0-9]+|beta[0-9]+|rc[0-9]+|[0-9]+-SNAPSHOT$/};function u(e,n){return e?e+(n&&80!=n&&443!=n?":"+n:""):null}function p(e,n,t,a){return(443==n||a?"https":"http")+"://"+u(e,n)+(t||"")}function m(e,n,t,a){n&&n.message?e(n):403==a?e({ucode:403,message:"Resource is forbidden"+(t?" ("+t+")":"")}):404==a?e({ucode:404,message:"Resource not found"+(t?" ("+t+")":"")}):n&&n.error?e({status:a,message:n.error}):t?(console.error("[http] Get HTTP error {status: "+a+"} on ["+t+"]"),e("Error while requesting ["+t+"]")):e("Unknown error from node")}function E(e,n,t,a){var i=[],o={},s=e;return"object"==typeof n&&(i=_.keys(n)),_.forEach(i,(function(e){s===(s=s.replace(":"+e,n[e]))&&(o[e]=n[e])})),t.params=o,a(s,t)}function g(e){var n,t;if(e.startsWith("june:")||e.startsWith("web+june:")){n="june:";var a=e.replace(/^(web\+june|june):(\/\/)?/,"");-1!==(t=a).indexOf("/")&&(t=t.substr(0,a.indexOf("/"))),-1!==t.indexOf("?")&&(t=t.substr(0,a.indexOf("?"))),e="http://"+a}var i=document.createElement("a");i.href=e;var o,s=i.pathname;s&&s.startsWith("/")&&(s=s.substring(1)),i.search&&i.search.startsWith("?")&&(o=i.search.substr(1).split("&").reduce((function(e,n){if(-1!==n.indexOf("=")){var t=n.substr(0,n.indexOf("=")),a=n.substr(n.indexOf("=")+1);e[t]=a}else e[n]=!0;return e}),{}));var r={protocol:n||i.protocol,hostname:t||i.hostname,host:i.host,port:i.port,username:i.username,password:i.password,pathname:s,pathSegments:s?s.split("/"):[],search:i.search,searchParams:o,hash:i.hash};return i.remove(),r}function f(e,n){var t=e.split("."),a=n.split(".");function i(e){for(var n=0;n<e.length;n++){var t=d.POSITIVE_INTEGER.test(e[n]);if(0===n&&!t)return!1;if(!t&&!d.VERSION_PART_REGEXP.test(e[n]))return!1;t&&(e[n]=parseInt(e[n]))}return!0}if(!i(t)||!i(a))return NaN;for(var o=0;o<t.length;++o){if(a.length===o)return 1;if(t[o]!==a[o])return t[o]>a[o]?1:-1}return t.length!=a.length?-1:0}return r||(r=4e3),{get:function(t,a,i,o,s){if(!t)return n.reject("[http] invalid URL from host: "+t);var l=p(t,a,i,o);return function(t){return n((function(n,a){E(l,t,{timeout:s||r,responseType:"json"},(function(t,i){e.get(t,i).success((function(e,t,a,i){n(e)})).error((function(e,n,i,o){m(a,e,t,n)}))}))}))}},getWithCache:function(t,a,i,s,l,d,u,g){var f=p(t,a,i,s);return g=g||"csHttp-",l=l||o.constants.LONG,c[g]=!0,function(t){return n((function(n,a){var i={timeout:u||r,responseType:"json"};i.cache=d?o.get(g,l,(function(n,t,a){console.debug("[http] Refreshing cache for {{0}} ".format(n)),e.get(n,i).success((function(e){i.cache.put(n,e),a&&a(n,e)}))})):o.get(g,l),E(f,t,i,(function(t,i){e.get(t,i).success((function(e){n(e)})).error((function(e,n){m(a,e,t,n)}))}))}))}},post:function(t,a,i,o,s){var l=p(t,a,i,o);return function(t,a){return n((function(n,i){E(l,a,{timeout:s||r,headers:{"Content-Type":"application/json;charset=UTF-8"}},(function(a,o){e.post(a,t,o).success((function(e){n(e)})).error((function(e,n){m(i,e,a,n)}))}))}))}},ws:function(e,a,o,s,r){if(!o)throw console.error("calling csHttp.ws without path argument"),"calling csHttp.ws without path argument";var c=function(e,n,t,a){return(443==n||a?"wss":"ws")+"://"+u(e,n)+(t||"")}(e,a,o,s);function d(e){if(!e.delegate)throw new Error("Websocket {0} was closed!".format(c));return 1==e.delegate.readyState?n.when(e.delegate):3==e.delegate.readyState?n.reject("Unable to connect to websocket ["+e.delegate.url+"]"):(e.waitDuration>=r?(e.waitRetryDelay=e.waitRetryDelay&&Math.min(e.waitRetryDelay+2e3,3e4)||2e3,console.debug("[http] Will retry websocket [{0}] in {1}s...".format(e.path,Math.round(e.waitRetryDelay/1e3)))):Math.round(e.waitDuration/1e3)%10==0&&console.debug("[http] Waiting websocket ["+e.path+"]..."),t((function(){return e.waitDuration+=e.waitRetryDelay,d(e)}),e.waitRetryDelay))}function p(e,n,t){return e.delegate||(e.path=o,e.callbacks=[],e.waitDuration=0,e.waitRetryDelay=200,E(c,t,{},(function(n){e.delegate=new WebSocket(n),e.delegate.onerror=function(n){e.delegate.readyState=3},e.delegate.onmessage=function(n){var t=JSON.parse(n.data);_.forEach(e.callbacks,(function(e){e(t)}))},e.delegate.onopen=function(n){console.debug("[http] Listening on websocket ["+e.path+"]..."),l.push(e),e.delegate.openTime=Date.now()},e.delegate.onclose=function(n){var a=_.findIndex(l,(function(n){return n.path===e.path}));a>=0&&l.splice(a,1),e.delegate.closing?e.delegate=null:e.delegate.openTime?(console.debug("[http] Unexpected close of websocket [{0}] (open {1} ms ago): re-opening...",o,Date.now()-e.delegate.openTime),e.delegate=null,p(e,null,t)):n&&(console.debug("[http] Unexpected close of websocket [{0}]: error code: ".format(o),n&&n.code||n),e.delegate=null,p(e,null,t))}}))),n&&e.callbacks.push(n),d(e)}function m(e){e.delegate&&(e.delegate.closing=!0,console.debug("[http] Closing websocket ["+e.path+"]..."),e.delegate.close(),e.callbacks=[],e.onclose&&e.onclose())}return r=r||i.data.timeout,{open:function(e){return p(this,null,e)},on:function(e,n){return p(this,e,n)},onListener:function(e,n){var t=this;return p(t,e,n),function(){!function(e,n){e.callbacks=_.reject(e.callbacks,(function(e){return e===n})),e.callbacks.length||m(e)}(t,e)}},send:function(e){var n=this;return d(n).then((function(){n.delegate&&n.delegate.send(e)}))},close:function(){m(this)},isClosed:function(){return!this.delegate||this.delegate.closing}}},closeAllWs:function(){l.length>0&&(console.debug("[http] Closing all websocket..."),_.forEach(l,(function(e){e.close()})),l=[])},getUrl:p,getServer:u,uri:{parse:g,open:function(e,n){if(n=n||{},!e.startsWith("http://")&&!e.startsWith("https://")){var t=g(e);if(!t.protocol&&n.type&&(t.protocol="email"===n.type?"mailto:":"phone"===n.type?"tel:":"",e=t.protocol+e),"mailto:"===t.protocol&&s.isDesktop())try{return void nw.Shell.openExternal(e)}catch(e){console.error("[http] Failed not open 'mailto:' URI into external tool.")}s.enable&&("mailto:"===t.protocol||"tel:"===t.protocol)||t.protocol,0}var i,o=n.target||(s.enable?"_system":"_blank");if("_blank"===o||"_system"===o&&s.isDesktop())try{return void nw.Shell.openExternal(e)}catch(e){console.error("[http] Failed not open URI into external browser.")}if("_blank"===o&&s.isDesktop()){if(nw&&nw.Shell)return nw.Shell.openExternal(e),!1;i="location=1,titlebar=1,status=1,menubar=1,toolbar=1,resizable=1,scrollbars=1",a.screen&&a.screen.width&&a.screen.height&&(i+=",width={0},height={1}".format(Math.trunc(a.screen.width/2),Math.trunc(a.screen.height/2)))}var r=a.open(e,o,i);i&&a.screen&&a.screen.width&&a.screen.height&&(r.moveTo(a.screen.width/2/2,a.screen.height/2/2),r.focus())}},date:{now:function(){return moment().utc().unix()}},version:{compare:f,isCompatible:function(e,n){return console.debug("[http] Checking actual version [{0}] is compatible with min expected version [{1}]".format(n,e)),f(e,n)<=0}},cache:angular.merge({clear:function(e){e=e||"csHttp-",console.debug("[http] Cleaning cache {prefix: '{0}'}...".format(e)),o.clear(e)},clearAll:function(){console.debug("[http] Cleaning all caches..."),_.keys(c).forEach((function(e){o.clear(e)}))}},o.constants)}}]),angular.module("cesium.storage.services",["cesium.config"]).factory("sessionStorage",["$window","$q",function(e,n){var t={storage:e.sessionStorage||{},put:function(e,a){return t.storage[e]=a,n.when()},get:function(e,a){return n.when(t.storage[e]||a)},setObject:function(e,a){return t.storage[e]=JSON.stringify(a),n.when()},getObject:function(e){return n.when(JSON.parse(t.storage[e]||"null"))}};return t}]).factory("localStorage",["$window","$q","$log","sessionStorage",function(e,n,t,a){var i,o=!1,s={standard:{storage:null},secure:{storage:null}};function r(){if(i)return i;var t=Date.now();return(e.localStorage?(console.debug("[storage] Starting {local} storage..."),s.standard.storage=e.localStorage,_.forEach(_.keys(s.standard),(function(e){s[e]=s.standard[e]}))):(console.debug("[storage] Starting {session} storage..."),_.forEach(_.keys(a),(function(e){s[e]=a[e]}))),i=n.when()).then((function(){console.debug("[storage] Started in "+(Date.now()-t)+"ms"),o=!0,i=null}))}return s.standard.put=function(e,t){return angular.isDefined(t)&&null!=t?s.standard.storage[e]=t:s.standard.storage.removeItem(e),n.when()},s.standard.get=function(e,t){return n.when(s.standard.storage[e]||t)},s.standard.setObject=function(e,t){return s.standard.storage[e]=JSON.stringify(t),n.when()},s.standard.getObject=function(e){return n.when(JSON.parse(s.standard.storage[e]||"null"))},s.secure.put=function(e,a){return n((function(n,i){null!=a?s.secure.storage.set((function(e){n()}),(function(e){t.error(e),i(e)}),e,a):s.secure.storage.remove((function(){n()}),(function(e){t.error(e),n()}),e)}))},s.secure.get=function(e,a){return n((function(n,i){s.secure.storage.get((function(e){n(!e&&a?a:e)}),(function(e){t.error(e),n()}),e)}))},s.secure.setObject=function(e,a){return t.debug("[storage] Setting object into secure storage, using key="+e),n((function(n,t){s.secure.storage.set(n,t,e,a?JSON.stringify(a):void 0)}))},s.secure.getObject=function(e){return t.debug("[storage] Getting object from secure storage, using key="+e),n((function(n,a){s.secure.storage.get((function(e){n(JSON.parse(e||"null"))}),(function(e){t.error(e),n()}),e)}))},s.isStarted=function(){return o},s.ready=function(){return o?n.when():i||r()},r(),s}]),angular.module("cesium.device.services",["cesium.utils.services","cesium.settings.services"]).factory("Device",["$rootScope","$translate","$ionicPopup","$q","Api","ionicReady",function(e,n,t,a,i,o){var s,r=new i(this,"Device"),l={enable:!0},c={},d=!1;function u(e){if(!l.enable)return a.reject("Barcode scanner not enable. Please call 'ionicReady()' once before use (e.g in app.js).");var n=a.defer();return cordova.plugins.barcodeScanner.scan((function(e){e.cancelled?(console.debug("[device] barcode scanner scan: CANCELLED"),n.resolve()):(console.debug("[device] barcode scanner scan: "+e.text),n.resolve(e.text))}),(function(e){console.error("[device] Error while using barcode scanner: "+e),n.reject(e)}),e),n.promise}return l.enable=!1,l.clipboard={copy:function(e,n){if(!l.enable)return a.reject("Device disabled");var t=a.defer();return $cordovaClipboard.copy(e).then((function(){n&&n(),t.resolve()}),(function(){t.reject({message:"ERROR.COPY_CLIPBOARD"})})),t.promise}},l.camera={getPicture:function(e){return l.camera.enable?(e&&"string"==typeof e&&(e={sourceType:e}),e=e||{},angular.isUndefined(e.sourceType)?n(["SYSTEM.PICTURE_CHOOSE_TYPE","SYSTEM.BTN_PICTURE_GALLERY","SYSTEM.BTN_PICTURE_CAMERA"]).then((function(n){return t.show({title:n["SYSTEM.PICTURE_CHOOSE_TYPE"],buttons:[{text:n["SYSTEM.BTN_PICTURE_GALLERY"],type:"button",onTap:function(e){return navigator.camera.PictureSourceType.PHOTOLIBRARY}},{text:n["SYSTEM.BTN_PICTURE_CAMERA"],type:"button button-positive",onTap:function(e){return navigator.camera.PictureSourceType.CAMERA}}]}).then((function(n){return console.info("[camera] User select sourceType:"+n),e.sourceType=n,l.camera.getPicture(e)}))})):(e.quality=e.quality||50,e.destinationType=e.destinationType||navigator.camera.DestinationType.DATA_URL,e.encodingType=e.encodingType||navigator.camera.EncodingType.PNG,e.targetWidth=e.targetWidth||400,e.targetHeight=e.targetHeight||400,$cordovaCamera.getPicture(e))):a.reject("Camera not enable. Please call 'ionicReady()' once before use (e.g in app.js).")},scan:function(e){return console.warn("Deprecated use of Device.camera.scan(). Use Device.barcode.scan() instead"),u(e)}},l.barcode={enable:!1,scan:u},l.keyboard={enable:!1,close:function(){l.keyboard.enable&&cordova.plugins.Keyboard.close()}},window.handleOpenURL=function(e){e&&(console.info("[device] Received new intent: ",e),c.lastIntent=e,r.intent.raise.new(e))},l.intent={enable:!1,last:function(){return a.when(c.lastIntent)},clear:function(){c.lastIntent=void 0}},l.keyboard.digit={settings:{bindModel:function(n,t,a){n=n||e;var i=function(){return(t||"").split(".").reduce((function(e,n){return e?e[n]:void 0}),n)},o=function(e){var a=(t||"").split("."),i=a.length&&a[a.length-1];a.reduce((function(n,t){if(t!=i)return n[t];n[i]=e}),n)};return(a=a||{}).animation=a.animation||"pop",a.action=a.action||function(e){o((i()||"")+e)},a.decimal&&(a.decimalSeparator=a.decimalSeparator||".",a.leftButton={html:"<span>.</span>",action:function(){var e=i()||"";e.indexOf(a.decimalSeparator)>=0||(e.trim().length||(e="0"),o(e+a.decimalSeparator))}}),a.rightButton=a.rightButton||{html:'<i class="icon ion-backspace-outline"></i>',action:function(){var e=i();e&&e.length&&(e=e.slice(0,-1),o(e))}},a}}},l.isIOS=function(){return!!navigator.userAgent.match(/iPhone | iPad | iPod/i)||ionic.Platform.isIOS()},l.isOSX=function(){return!!navigator.userAgent.match(/Macintosh/i)||ionic.Platform.is("osx")},l.isDesktop=function(){if(!angular.isDefined(c.isDesktop))try{c.isDesktop=!(l.enable||!process||!nw||!nw.App)}catch(e){c.isDesktop=!1}return c.isDesktop},l.isWeb=function(){return!l.enable&&!l.isDesktop()},l.isMobile=function(){return l.enable},l.ready=function(){return d?a.when():s||l.start()},l.start=function(){return s=o().then((function(){l.enable=window.cordova&&cordova&&cordova.plugins,l.enable?(l.camera.enable=!!navigator.camera,l.keyboard.enable=cordova&&cordova.plugins&&!!cordova.plugins.Keyboard,l.barcode.enable=cordova&&cordova.plugins&&!!cordova.plugins.barcodeScanner&&!l.isOSX(),l.clipboard.enable=cordova&&cordova.plugins&&!!cordova.plugins.clipboard,l.intent.enable=window&&!!window.plugins.launchmyapp,l.keyboard.enable&&angular.extend(l.keyboard,cordova.plugins.Keyboard),console.debug("[device] Ionic platform ready, with {camera: {0}, barcode: {1}, keyboard: {2}, clipboard: {3}, intent: {4}}".format(l.camera.enable,l.barcode.enable,l.keyboard.enable,l.clipboard.enable,l.intent.enable)),cordova.InAppBrowser&&(console.debug("[device] Enabling InAppBrowser"),window.open=cordova.InAppBrowser.open)):console.debug("[device] Ionic platform ready - no device detected."),d=!0,s=null}))},r.registerEvent("intent","new"),l.api=r,l}]),angular.module("cesium.currency.services",["ngApi","cesium.bma.services"]).factory("csCurrency",["$rootScope","$q","$timeout","BMA","Api","csSettings",function(n,t,a,i,o,s){function r(i,r){var l,c,d={WELL_KNOWN_CURRENCIES:{g1:{firstBlockTime:1488987127,medianTimeOffset:3600}}},u={},p=!1,m=new o(this,"csCurrency-"+i);function E(){u.name=null,u.parameters=null,u.firstBlockTime=null,u.membersCount=null,u.cache={},u.node=r,u.currentUD=null,u.medianTimeOffset=0,p=!1,l=void 0,m.data.raise.reset(u)}function g(){return t.all([r.blockchain.parameters().then((function(e){return u.name=e.currency,u.parameters=e,u.medianTimeOffset=e.avgGenTime*e.medianTimeBlocks/2,e})).then((function(e){return n=e.currency,d.WELL_KNOWN_CURRENCIES[n]?(angular.merge(u,d.WELL_KNOWN_CURRENCIES[n]),t.when()):r.blockchain.block({block:0}).then((function(e){u.firstBlockTime=e.medianTime})).catch((function(e){if(e&&e.ucode===r.errorCodes.BLOCK_NOT_FOUND)return u.firstBlockTime=0,u.initPhase=!0,void console.warn("[currency] Blockchain not launched: Enable init phase mode");throw e}));var n})),r.blockchain.stats.ud().then((function(e){return e.result.blocks.length?function e(n,t){if(!n.result.blocks.length||t<0)return u.currentUD=u.parameters?u.parameters.ud0:-1,u.currentUD;var a=n.result.blocks[t];return r.blockchain.block({block:a}).then((function(e){var n,t;return u.currentUD=(n=e.dividend,(t=e.unitbase)<=0?n:n*Math.pow(10,t)),u.currentUD})).catch((function(i){if(console.error("[currency] Unable to load last block with UD, with number {0}".format(a)),t>0)return console.error("[currency] Retrying to load UD from a previous block..."),e(n,t-1);throw u.currentUD=null,i}))}(e,e.result.blocks.length-1):(u.currentUD=u.parameters?u.parameters.ud0:-1,u.currentUD)})).catch((function(e){throw u.currentUD=null,e})),m.data.raisePromise.load(u)]).catch((function(e){throw E(),e}))}function f(){return p?t.when(u):l||O()}function h(e){return function(){return p?t.when(u[e]):l||O().then((function(){return u[e]}))}}function T(n){var t=new e(n);t.cleanData(),console.debug("[currency] Received new block ["+t.number+"-"+t.hash+"]"),u.currentBlock=t,u.currentBlock.receivedAt=moment().utc().unix(),u.medianTime=t.medianTime,u.membersCount=t.membersCount,t.dividend&&(u.currentUD=t.dividend),m.data.raise.newBlock(t)}function b(){console.debug("[currency] Stopping..."),_.forEach(c,(function(e){e()})),c=[],E()}function v(){return b(),a(O,200)}function O(){console.debug("[currency] Starting...");var e=Date.now();return l=r.ready().then(g).then((function(){!function(){c=[r.api.node.on.restart(n,v,this),r.websocket.block().onListener(T)]}(),console.debug("[currency] Started in "+(Date.now()-e)+"ms"),p=!0,l=null,m.data.raise.ready(u)})).then((function(){return u}))}var R=h("currentBlock");function I(e){return R().then((function(n){var t=moment().utc().unix();if(e){if(n&&t-n.receivedAt<60)return n;n||console.warn("[currency] No current block in cache: get it from network. Websocket [/ws/block] may not be started ?")}return r.blockchain.current().catch((function(e){if(e&&e.ucode==r.errorCodes.NO_CURRENT_BLOCK)return{number:0,hash:r.constants.ROOT_BLOCK_HASH,medianTime:moment().utc().unix()};throw e})).then((function(e){return u.currentBlock=e,u.currentBlock.receivedAt=t,e}))}))}return m.registerEvent("data","ready"),m.registerEvent("data","load"),m.registerEvent("data","reset"),m.registerEvent("data","newBlock"),E(),{ready:function(){return p?t.when(u):l||O()},start:O,stop:b,data:u,get:f,name:h("name"),parameters:h("parameters"),currentUD:h("currentUD"),medianTimeOffset:h("medianTimeOffset"),blockchain:{current:I,lastValid:function(){return s.data.blockValidityWindow<=0?I(!0):I(!0).then((function(e){var n=e.number-s.data.blockValidityWindow;return n>0?r.blockchain.block({block:n}):e}))}},date:{now:function(){return moment().utc().unix()-(u.medianTimeOffset||d.WELL_KNOWN_CURRENCIES.g1.medianTimeOffset)}},api:m,default:function(){return console.warn("[currency] 'csCurrency.default()' has been DEPRECATED - Please use 'csCurrency.get()' instead."),f()}}}var l=r("default",i);return l.instance=r,l}]),angular.module("cesium.bma.services",["ngApi","cesium.http.services","cesium.settings.services"]).factory("BMA",["$q","$window","$rootScope","$timeout","Api","Device","csConfig","csSettings","csHttp",function(e,n,t,a,i,o,s,r,l){function c(o,c,d,u){var p,m="[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}",E="SIG\\(([0-9a-zA-Z]{43,44})\\)",g="OBJ\\(([0-9]+)\\)",f="( ([a-z_][a-z0-9-_.ğĞ]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))( (.+))?",h={BMA:"BASIC_MERKLED_API",BMAS:"BMAS",WS2P:"WS2P",BMATOR:"BMATOR",WS2PTOR:"WS2PTOR"},T={USER_ID:"[0-9a-zA-Z-_]+",CURRENCY:"[0-9a-zA-Z-_]+",PUBKEY:m,PUBKEY_WITH_CHECKSUM:"("+m+"):([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{3})",COMMENT:"[ a-zA-Z0-9-_:/;*\\[\\]()?!^\\+=@&~#{}|\\\\<>%.]*",INVALID_COMMENT_CHARS:"[^ a-zA-Z0-9-_:/;*\\[\\]()?!^\\+=@&~#{}|\\\\<>%.]*",URI_WITH_AT:"duniter://(?:([A-Za-z0-9_-]+):)?("+m+"@([a-zA-Z0-9-.]+.[ a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+)",URI_WITH_PATH:"duniter://([a-zA-Z0-9-.]+.[a-zA-Z0-9-_:.]+)/("+m+")(?:/([A-Za-z0-9_-]+))?",BMA_ENDPOINT:h.BMA+f,BMAS_ENDPOINT:h.BMAS+f,WS2P_ENDPOINT:h.WS2P+" ([a-f0-9]{8})"+f,BMATOR_ENDPOINT:h.BMATOR+" ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?",WS2PTOR_ENDPOINT:h.WS2PTOR+" ([a-f0-9]{8}) ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?(?: (.+))?"},b={PROTOCOL_VERSION:10,ROOT_BLOCK_HASH:"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",LIMIT_REQUEST_COUNT:5,LIMIT_REQUEST_DELAY:1e3,regexp:T,api:h},v=this;function O(e,n,t,a){v.started&&v.stop(),v.alive=!1,v.cache={getByPath:{},postByPath:{},wsByPath:{}},r.data&&r.data.node&&(e=e||r.data.node.host,n=n||r.data.node.port,t=angular.isDefined(t)?t:443==n||r.data.node.useSsl||v.forceUseSsl,a=!angular.isDefined(a)||a),e&&(v.host=e,v.port=n||80,v.useSsl=angular.isDefined(t)?t:443==v.port||v.forceUseSsl,v.useCache=!!angular.isDefined(a)&&a,v.server=l.getServer(e,n),v.url=l.getUrl(e,n,"",t))}function R(e){return new RegExp("^"+e+"$")}function I(e){return new RegExp(e)}function N(){v.cache&&(console.warn("[BMA] Closing all websockets..."),_.keys(v.cache.wsByPath||{}).forEach((function(e){v.cache.wsByPath[e].close()})),v.cache.wsByPath={})}function S(e){l.getUrl(e.node.host,e.node.port,"",e.node.useSsl)!=v.url&&(O(e.node.host,e.node.port,e.node.useSsl,v.useCache),v.restart())}v.api=new i(this,"BMA-"+v.server),v.started=!1,v.init=O,v.forceUseSsl=!!("true"===s.httpsMode||!0===s.httpsMode||"force"===s.httpsMode||n.location&&"https:"===n.location.protocol),v.forceUseSsl&&console.debug("[BMA] Enable SSL (forced by config or detected in URL)"),o&&O(o,c,d,u),v.useCache=u,v.cleanCache=function(){console.debug("[BMA] Cleaning requests cache..."),N(),v.cache={getByPath:{},postByPath:{},wsByPath:{}}},get=function(e,n){n=v.useCache&&n;var t=e+(n?"#"+n:""),i=function(o){if(!v.started)return v._startPromise||console.warn("[BMA] Trying to get [{0}] before start(). Waiting...".format(e)),v.ready().then((function(){return i(o)}));var s=v.cache.getByPath[t];s||(s=n?l.getWithCache(v.host,v.port,e,v.useSsl,n):l.get(v.host,v.port,e,v.useSsl),v.cache.getByPath[t]=s);var r=1;return s(o).catch((function(e){if(e&&e.ucode==A.errorCodes.HTTP_LIMITATION&&r<=A.constants.LIMIT_REQUEST_COUNT)return 1===r&&(console.warn("[BMA] Too many HTTP requests: Will wait then retry..."),UIUtils.loading.update({template:"COMMON.LOADING_WAIT"})),a((function(){return r++,s(o)}),A.constants.LIMIT_REQUEST_DELAY);throw e}))};return i},post=function(e){var n=function(t,a){if(!v.started)return v._startPromise||console.error("[BMA] Trying to post [{0}] before start()...".format(e)),v.ready().then((function(){return n(t,a)}));var i=v.cache.postByPath[e];return i||(i=l.post(v.host,v.port,e,v.useSsl),v.cache.postByPath[e]=i),i(t,a)};return n},ws=function(e){return function(){var n=v.cache.wsByPath[e];return n&&!n.isClosed()||((n=l.ws(v.host,v.port,e,v.useSsl)).onclose=function(){delete v.cache.wsByPath[e]},v.cache.wsByPath[e]=n),n}},v.isAlive=function(){return l.get(v.host,v.port,"/node/summary",v.useSsl)().then((function(e){var n=e&&e.duniter&&e.duniter.software,t=!0;return"duniter"===n&&e.duniter.version&&r.data.minVersion?t=l.version.isCompatible(r.data.minVersion,e.duniter.version):"gchange-pod"===n&&e.duniter.version&&r.data.plugins.es.minVersion?t=l.version.isCompatible(r.data.plugins.es.minVersion,e.duniter.version):console.debug("[BMA] Unknown node software [{0} v{1}]: could not check compatibility.".format(n||"?",e.duniter.version||"?")),t||console.error("[BMA] Incompatible node [{0} v{1}]: expected at least v{2}".format(n,e.duniter.version,r.data.minVersion)),t})).catch((function(){return!1}))},v.isStarted=function(){return v.started},v.ready=function(){return v.started?e.when(!0):v._startPromise||v.start()},v.start=function(){if(v._startPromise)return v._startPromise;if(v.started)return e.when(v.alive);if(!v.host)return r.ready().then((function(){return v.init(),v.useCache=!0,v.start()}));v.useSsl?console.debug("[BMA] Starting [{0}] (SSL on)...".format(v.server)):console.debug("[BMA] Starting [{0}]...".format(v.server));var n=Date.now();return v._startPromise=e.all([r.ready,v.isAlive()]).then((function(e){return v.alive=e[1],v.alive?(p&&0!==p.length||function(){p=[r.api.data.on.changed(t,S,this)]}(),console.debug("[BMA] Started in "+(Date.now()-n)+"ms"),v.api.node.raise.start(),v.started=!0,delete v._startPromise,!0):(console.error("[BMA] Could not start [{0}]: node unreachable".format(v.server)),v.started=!0,delete v._startPromise,!1)})),v._startPromise},v.stop=function(){console.debug("[BMA] Stopping..."),_.forEach(p,(function(e){e()})),p=[],l.cache.clear(),v.cleanCache(),v.alive=!1,v.started=!1,delete v._startPromise,v.api.node.raise.stop()},v.restart=function(){return v.stop(),a(v.start,200).then((function(e){return e&&v.api.node.raise.restart(),e}))},v.api.registerEvent("node","start"),v.api.registerEvent("node","stop"),v.api.registerEvent("node","restart");var A={errorCodes:{REVOCATION_ALREADY_REGISTERED:1002,HTTP_LIMITATION:1006,IDENTITY_SANDBOX_FULL:1007,NO_MATCHING_IDENTITY:2001,UID_ALREADY_USED:2003,NO_MATCHING_MEMBER:2004,NO_IDTY_MATCHING_PUB_OR_UID:2021,WRONG_SIGNATURE_MEMBERSHIP:2006,MEMBERSHIP_ALREADY_SEND:2007,NO_CURRENT_BLOCK:2010,BLOCK_NOT_FOUND:2011,SOURCE_ALREADY_CONSUMED:2015,TX_INPUTS_OUTPUTS_NOT_EQUAL:2024,TX_OUTPUT_SUM_NOT_EQUALS_PREV_DELTAS:2025,TX_ALREADY_PROCESSED:2030},constants:b,regexp:{USER_ID:R(T.USER_ID),COMMENT:R(T.COMMENT),PUBKEY:R(T.PUBKEY),PUBKEY_WITH_CHECKSUM:R(T.PUBKEY_WITH_CHECKSUM),CURRENCY:R(T.CURRENCY),URI:R(T.URI),BMA_ENDPOINT:R(T.BMA_ENDPOINT),BMAS_ENDPOINT:R(T.BMAS_ENDPOINT),WS2P_ENDPOINT:R(T.WS2P_ENDPOINT),BMATOR_ENDPOINT:R(T.BMATOR_ENDPOINT),WS2PTOR_ENDPOINT:R(T.WS2PTOR_ENDPOINT),TX_OUTPUT_SIG:R(E),TX_OUTPUT_FUNCTION:I("SIG\\(([0-9a-zA-Z]{43,44})\\)|XHX\\(([A-F0-9]{1,64})\\)|CSV\\(([0-9]{1,8})\\)|CLTV\\(([0-9]{1,10})\\)"),TX_OUTPUT_OBJ_OPERATOR_AND:I(g+"([ ]*&&[ ]*("+g+"))+"),TX_OUTPUT_OBJ_OPERATOR_OR:I(g+"([ ]*\\|\\|[ ]*("+g+"))+"),TX_OUTPUT_OBJ:I(g),TX_OUTPUT_OBJ_OPERATOR:I("OBJ\\(([0-9]+)\\)[ ]*(&&)|(\\|\\|)[ ]*OBJ\\(([0-9]+)\\)"),TX_OUTPUT_OBJ_PARENTHESIS:I("\\(("+g+")\\)"),TX_OUTPUT_FUNCTIONS:I("SIG\\(([0-9a-zA-Z]{43,44})\\)|XHX\\(([A-F0-9]{1,64})\\)|CSV\\(([0-9]{1,8})\\)|CLTV\\(([0-9]{1,10})\\)([ ]*(&&)|(\\|\\|)[ ]*SIG\\(([0-9a-zA-Z]{43,44})\\)|XHX\\(([A-F0-9]{1,64})\\)|CSV\\(([0-9]{1,8})\\)|CLTV\\(([0-9]{1,10})\\))*")},node:{summary:get("/node/summary",l.cache.LONG),same:function(e,n){return e===v.host&&(!v.port&&!n||v.port==n||80)&&v.useSsl==(n&&443===n)},forceUseSsl:v.forceUseSsl},network:{peering:{self:get("/network/peering"),peers:get("/network/peering/peers")},peers:get("/network/peers"),ws2p:{info:get("/network/ws2p/info"),heads:get("/network/ws2p/heads")}},wot:{lookup:get("/wot/lookup/:search",l.cache.MEDIUM),certifiedBy:get("/wot/certified-by/:pubkey"),certifiersOf:get("/wot/certifiers-of/:pubkey"),member:{all:get("/wot/members",l.cache.LONG),pending:get("/wot/pending",l.cache.SHORT)},requirements:function(e,n){return!0!==n?A.raw.wot.requirements(e):A.raw.wot.requirementsWithCache(e)},add:post("/wot/add"),certify:post("/wot/certify"),revoke:post("/wot/revoke")},blockchain:{parameters:get("/blockchain/parameters",l.cache.VERY_LONG),block:get("/blockchain/block/:block",l.cache.SHORT),blocksSlice:get("/blockchain/blocks/:count/:from"),current:get("/blockchain/current",l.cache.SHORT),membership:post("/blockchain/membership"),stats:{ud:get("/blockchain/with/ud",l.cache.MEDIUM),tx:get("/blockchain/with/tx"),newcomers:get("/blockchain/with/newcomers",l.cache.MEDIUM),hardship:get("/blockchain/hardship/:pubkey"),difficulties:get("/blockchain/difficulties")}},tx:{sources:get("/tx/sources/:pubkey",l.cache.SHORT),process:post("/tx/process"),history:{all:function(e){return A.raw.tx.history.all(e).then((function(e){return e.history=e.history||{},e.history.sending=[],e.history.pendings=[],e}))},times:function(e,n){return(!0!==n?A.raw.tx.history.times(e):A.raw.tx.history.timesWithCache(e)).then((function(e){return e.history=e.history||{},e.history.sending=[],e.history.pendings=[],e}))},blocks:get("/tx/history/:pubkey/blocks/:from/:to",l.cache.LONG),pending:get("/tx/history/:pubkey/pending")}},ud:{history:get("/ud/history/:pubkey")},uri:{},version:{},raw:{wot:{requirementsWithCache:get("/wot/requirements/:pubkey",l.cache.LONG),requirements:get("/wot/requirements/:pubkey")},tx:{history:{timesWithCache:get("/tx/history/:pubkey/times/:from/:to",l.cache.LONG),times:get("/tx/history/:pubkey/times/:from/:to"),all:get("/tx/history/:pubkey")}}}};A.tx.parseUnlockCondition=function(e){for(var n,t,a,i,o=e,s=[],r={},l=A.regexp.TX_OUTPUT_FUNCTION.exec(o);l;)n={},t="OBJ("+s.length+")",n.type=o.substr(l.index,l[0].indexOf("(")),n.value=l[1]||l[2]||l[3]||l[4],s.push(n),r[n.type]=r[n.type]++||1,o=o.replace(l[0],t),l=A.regexp.TX_OUTPUT_FUNCTION.exec(o);for(var c=!0;c;){for(c=!!(l=A.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(o));l;){for(n={},t="OBJ("+s.length+")",n.type="AND",n.children=[],s.push(n),a=l[0],i=A.regexp.TX_OUTPUT_OBJ.exec(a);i;)n.children.push(s[i[1]]),a=a.replace(i[0],""),i=A.regexp.TX_OUTPUT_OBJ.exec(a);o=o.replace(l[0],t),l=A.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(a)}for(l=A.regexp.TX_OUTPUT_OBJ_OPERATOR_OR.exec(o),c=c||!!l;l;){for(n={},t="OBJ("+s.length+")",n.type="OR",n.children=[],s.push(n),a=l[0],i=A.regexp.TX_OUTPUT_OBJ.exec(a);i;)n.children.push(s[i[1]]),a=a.replace(i[0],""),i=A.regexp.TX_OUTPUT_OBJ.exec(a);o=o.replace(l[0],t),l=A.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(o)}for(l=A.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(o),c=c||!!l;l;)o=o.replace(l[0],l[1]),l=A.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(o)}if(0!==(r=_.keys(r)).length)return console.debug("[BMA] Unlock conditions successfully parsed:",n),{unlockFunctions:r,unlockTree:n};console.error("[BMA] Unparseable unlock condition: ",output)},A.node.parseEndPoint=function(e,n){var t=A.regexp.BMA_ENDPOINT.exec(e);return t?{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:t[8]||80,useSsl:t[8]&&443==t[8],path:t[10],useBma:!0}:(t=A.regexp.BMAS_ENDPOINT.exec(e))?{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:t[8]||80,useSsl:!0,path:t[10],useBma:!0}:(t=A.regexp.BMATOR_ENDPOINT.exec(e))?{dns:t[1]||"",port:t[2]||80,useSsl:!1,useTor:!0,useBma:!0}:(t=A.regexp.WS2P_ENDPOINT.exec(e))?{ws2pid:t[1]||"",dns:t[3]||"",ipv4:t[5]||"",ipv6:t[7]||"",port:t[9]||80,useSsl:t[9]&&443==t[9],path:t[11]||"",useWs2p:!0}:(t=A.regexp.WS2PTOR_ENDPOINT.exec(e))?{ws2pid:t[1]||"",dns:t[2]||"",port:t[3]||80,path:t[4]||"",useSsl:!1,useTor:!0,useWs2p:!0}:n&&(t=R(n+f).exec(e))?{dns:t[2]||"",ipv4:t[4]||"",ipv6:t[6]||"",port:t[8]||80,useSsl:t[8]&&443==t[8],path:t[10],useBma:!1}:void 0},A.copy=function(n){var t=v.started;if(l.getUrl(n.host,n.port,"",n.useSsl)!==v.url)return v.init(n.host,n.port,n.useSsl,v.useCache),t?v.restart():e.when()},A.wot.member.uids=function(){return A.wot.member.all().then((function(e){return e.results.reduce((function(e,n){return e[n.pubkey]=n.uid,e}),{})}))},A.wot.member.get=function(e){return A.wot.member.uids().then((function(n){var t=n[e];return{pubkey:e,uid:t||null}}))},A.wot.member.getByUid=function(e){return A.wot.member.all().then((function(n){return _.findWhere(n.results,{uid:e})}))},A.blockchain.blocks=function(e){return A.raw.getHttpRecursive(A.blockchain.block,"block",e)},A.network.peering.peersByLeaves=function(e){return A.raw.getHttpRecursive(A.network.peering.peers,"leaf",e,0,10)},A.raw.getHttpRecursive=function(n,t,i,o,s){return o=angular.isDefined(o)?o:0,s=s||A.constants.LIMIT_REQUEST_COUNT,e((function(r,l){var c=[],d=[];_.each(i.slice(o,o+s),(function(e){var a={};a[t]=e,d.push(n(a).then((function(e){e&&c.push(e)})))})),e.all(d).then((function(){o<i.length-1?a((function(){A.raw.getHttpRecursive(n,t,i,o+s,s).then((function(e){e&&e.length?r(c.concat(e)):r(c)})).catch((function(e){l(e)}))}),A.constants.LIMIT_REQUEST_DELAY):r(c)})).catch((function(e){e&&e.ucode===A.errorCodes.HTTP_LIMITATION?r(c):l(e)}))}))},A.raw.getHttpWithRetryIfLimitation=function(e){return e().catch((function(n){if(n&&n.ucode==A.errorCodes.HTTP_LIMITATION)return a((function(){return A.raw.getHttpWithRetryIfLimitation(e)}),A.constants.LIMIT_REQUEST_DELAY)}))},A.blockchain.lastUd=function(){return A.blockchain.stats.ud().then((function(e){if(!e.result.blocks||!e.result.blocks.length)return null;var n=e.result.blocks[e.result.blocks.length-1];return A.blockchain.block({block:n}).then((function(e){return e.unitbase>0?e.dividend*Math.pow(10,e.unitbase):e.dividend}))}))},A.uri.parse=function(n){return e((function(e,t){var a;if(R(T.PUBKEY).test(n))e({pubkey:n});else if(R(T.PUBKEY_WITH_CHECKSUM).test(n)){console.debug("[BMA.parse] Detecting a pubkey with checksum: "+n);var i=A.regexp.PUBKEY_WITH_CHECKSUM.exec(n);a=i[1];var o=i[2];console.debug("[BMA.parse] Detecting a pubkey {"+a+"} with checksum {"+o+"}");var s=csCrypto.util.pkChecksum(a);console.debug("[BMA.parse] Expecting checksum for pubkey is {"+s+"}"),o!=s?t({message:"ERROR.PUBKEY_INVALID_CHECKSUM"}):e({pubkey:a})}else if(n.startsWith("duniter://")){var r,c=l.uri.parse(n),d=-1===c.host.indexOf(".")?c.host:null,u=-1!==c.host.indexOf(".")?c.host:null;if(c.username&&(c.password?(r=c.username,a=c.password):a=c.username),c.pathname){var p=c.pathname.split("/"),m=p?p.length:0,E=0;if(!d&&m>E&&(d=p[E++]),!a&&m>E&&(a=p[E++]),!r&&m>E&&(r=p[E++]),m>E)return void t({message:"Bad Duniter URI format. Invalid path (incomplete or redundant): "+c.pathname})}if(d)return u||e({uid:r,pubkey:a,currency:d}),l.get(u+"/blockchain/parameters")().then((function(n){n.currency===d?e({uid:r,pubkey:a,host:u,currency:d}):t({message:"Node's currency ["+n.currency+"] does not matched URI's currency ["+d+"]."})})).catch((function(e){console.error(e),t({message:"Could not get node parameter. Currency could not be retrieve"})}));if(!u)return void t({message:"Bad Duniter URI format. Missing currency name (or node address)."});l.get(u+"/blockchain/parameters")().then((function(n){e({uid:r,pubkey:a,host:u,currency:n.currency})})).catch((function(e){console.error(e),t({message:"Could not get node parameter. Currency could not be retrieve"})}))}else console.debug("[BMA.parse] Could not parse URI: "+n),t({message:"ERROR.UNKNOWN_URI_FORMAT"})})).then((function(e){if(e){if(e.pubkey&&!R(T.PUBKEY).test(e.pubkey))throw{message:"Invalid pubkey format ["+e.pubkey+"]"};if(e.uid&&!R(T.USER_ID).test(e.uid))throw{message:"Invalid uid format ["+e.uid+"]"};if(e.currency&&!R(T.CURRENCY).test(e.currency))throw{message:"Invalid currency format ["+e.currency+"]"};return e}}))};var D=r.data.duniterLatestReleaseUrl&&l.uri.parse(r.data.duniterLatestReleaseUrl);A.raw.getLatestRelease=D?l.getWithCache(D.host,D.port,"/"+D.pathname,443==+D.port||"https:"===D.protocol||v.forceUseSsl,l.cache.LONG):function(){return e.when()},A.version.latest=function(){return A.raw.getLatestRelease().then((function(e){if(e)return e.name&&e.html_url?{version:e.name,url:e.html_url}:e.tag_name&&e.html_url?{version:e.tag_name.substring(1),url:e.html_url}:void 0})).catch((function(e){console.error("[BMA] Failed to get Duniter latest version",e)}))},A.websocket={block:ws("/ws/block"),peer:ws("/ws/peer"),close:N},angular.merge(v,A)}var d=new c(void 0,void 0,void 0,!0);return d.instance=function(e,n,t,a){return new c(e,n,t,a)},d.lightInstance=function(e,n,t,a){return{host:e,port:n=n||80,useSsl:t=angular.isDefined(t)?t:443==n,url:l.getUrl(e,n,"",t),node:{summary:l.getWithCache(e,n,"/node/summary",t,l.cache.LONG,!1,a)},network:{peering:{self:l.get(e,n,"/network/peering",t,a)},peers:l.get(e,n,"/network/peers",t,a)},blockchain:{current:l.get(e,n,"/blockchain/current",t,a),stats:{hardship:l.get(e,n,"/blockchain/hardship/:pubkey",t,a)}}}},d}]),angular.module("cesium.wot.services",["ngApi","cesium.bma.services","cesium.crypto.services","cesium.utils.services","cesium.settings.services"]).factory("csWot",["$q","$timeout","BMA","Api","CacheFactory","csConfig","csCurrency","csSettings","csCache",function(e,n,t,a,i,o,s,r,l){function c(i){var o=new a(this,"csWot-"+i),c=l.get("csWot-idty-",l.constants.SHORT),d=function(e){var n={};return e.reduce((function(e,t){return t.id=t.id||t.uid+"-"+t.pubkey,n[t.id]?e:(n[t.id]=!0,e.concat(t))}),[])},u=function(e,n,t){return n=n||0,e=d(e),e=_.sortBy(e,(function(e){var n=1;return n+=1e6*e.block,-(n+=10*(900-e.uid.toLowerCase().charCodeAt(0)))})),angular.isDefined(t)&&e.length>t&&(e=e.slice(n,n+t)),e},p=function(e,n){return t.wot.lookup({search:e||n}).then((function(a){if(!a||!a.results||!a.results.length)return{uid:null,pubkey:e,hasSelf:!1};var i=a.results.reduce((function(e,n){return e.concat(n.uids.reduce((function(e,t){var a=t.meta.timestamp.split("-",2);return e.concat({uid:t.uid,pubkey:n.pubkey,timestamp:t.meta.timestamp,number:parseInt(a[0]),hash:a[1],revoked:t.revoked,revocationNumber:t.revoked_on,sig:t.self})}),[]))}),[]);i.length&&(i=_.sortBy(i,(function(e){var t=0;return t+=1e10*(n&&e.uid===n?1:0),t+=1e9*(e.revoked?0:1),-(t+=1*(e.number?e.number:0))})));var o=i[0],r=[o.number];return o.revocationNumber&&r.push(o.revocationNumber),t.blockchain.blocks(r).then((function(e){return o.sigDate=e[0].medianTime,0!==o.number&&o.hash!==e[0].hash&&(o.hasBadSelfBlock=!0),o.revocationNumber&&(o.revocationTime=e[1].medianTime),o})).catch((function(e){if(e&&e.ucode==t.errorCodes.BLOCK_NOT_FOUND&&0===o.number)return o.sigDate=s.date.now(),o;throw e}))})).catch((function(n){if(n&&n.ucode==t.errorCodes.NO_MATCHING_IDENTITY)return{uid:null,pubkey:e,hasSelf:!1};throw n}))},m=function(e,n,a,i,o,l){function c(e,n){return e+"-"+n}var d=!0,u=a?a.reduce((function(e,n){var t=c(n.pubkey,n.cert_time?n.cert_time.block:n.sigDate);return n.cert_time||(d=!1),e[t]=n,e}),{}):{};return e({pubkey:n}).then((function(e){return e.certifications.reduce((function(e,n){var t=!n.written,a=n.cert_time?n.cert_time.medianTime:null,s=a?t?a+i.sigWindow-o:a+i.sigValidity-o:0;s=s<0?0:s;var l=c(n.pubkey,d&&n.cert_time?n.cert_time.block:n.sigDate);return delete u[l],e.concat({pubkey:n.pubkey,uid:n.uid,time:a,isMember:n.isMember,wasMember:n.wasMember,expiresIn:s,willExpire:s&&s<=r.data.timeWarningExpire,pending:t,block:null!==n.written?n.written.number:n.cert_time?n.cert_time.block:null,valid:s>0})}),[])})).catch((function(e){if(e&&e.ucode==t.errorCodes.NO_MATCHING_MEMBER)return[];throw e})).then((function(e){var n=_.values(u);if(!n.length)return e;if(s.data.initPhase)return n.reduce((function(e,n){return e.concat({pubkey:n.pubkey,uid:n.uid,isMember:n.isMember,wasMember:n.wasMember,time:null,expiresIn:i.sigWindow,willExpire:!1,pending:!0,block:0,valid:!0})}),e);var a=n.reduce((function(e,n){var t=d&&n.cert_time?n.cert_time.block:n.sigDate?n.sigDate.split("-")[0]:null;return angular.isDefined(t)&&(e[t]?e[t].push(n):e[t]=[n]),e}),{});return t.blockchain.blocks(_.keys(a)).then((function(n){return e=n.reduce((function(e,n){return e.concat(a[n.number].reduce((function(e,t){var a=n.medianTime,s=Math.max(0,a+i.sigWindow-o),c=!t.cert_time||!t.cert_time.block_hash||t.cert_time.block_hash==n.hash;c||console.debug("[wot] Invalid cert {0}: block hash changed".format(t.pubkey.substring(0,8)));var u=s>0&&(!l||t.isMember)&&c;return e.concat({pubkey:t.pubkey,uid:t.uid,isMember:t.isMember,wasMember:t.wasMember,time:a,expiresIn:s,willExpire:s&&s<=r.data.timeWarningExpire,pending:!0,block:d&&t.cert_time?t.cert_time.block:t.sigDate?t.sigDate.split("-")[0]:null,valid:u})}),[]))}),e)}))})).then((function(e){var n=e.reduce((function(e,n){return!n.pending&&n.valid&&n.expiresIn>=i.sigWindow&&(e[n.pubkey]=!0),e}),{});e=function(e){return _.sortBy(e,(function(e){var n=1;return n+=1e12*(e.expiresIn?e.expiresIn:0),n+=1e7*(e.isMember?1:0),-(n+=10*(e.block?e.block:0))}))}(e);var t=[],a=[];return{valid:e.reduce((function(e,i){return i.pending?(i.valid&&!n[i.pubkey]?t.push(i):i.valid||n[i.pubkey]||a.push(i),e):e.concat(i)}),[]),pending:t,error:a}}))},E=function(n,a,i,r){var l;if(!n&&i&&!r)return t.wot.member.getByUid(i).then((function(e){return e?E(e.pubkey,a,e.uid):E(n,a,i,!0)}));if(n){if((l=a?c.get(n):null)&&(!i||l.uid==i))return console.debug("[wot] Identity "+n.substring(0,8)+" found in cache"),e.when(l);console.debug("[wot] Loading identity "+n.substring(0,8)+"..."),l={pubkey:n}}else console.debug("[wot] Loading identity from uid "+i),l={};var d,u,g=Date.now();return e.all([s.parameters().then((function(e){d=e,l.sigQty=d.sigQty,l.sigStock=d.sigStock})),s.blockchain.current().then((function(e){u=e.medianTime})).catch((function(e){if(!e||e.ucode!=t.errorCodes.NO_CURRENT_BLOCK)throw e;u=Math.trunc((new Date).getTime()/1e3)})),e.when().then((function(){l.requirements={},l.isMember=!1})),p(n,i).then((function(e){angular.merge(l,e)}))]).then((function(){if(l.requirements.uid){var n=l.requirements.uid+"-"+l.requirements.meta.timestamp;return e.all([m(t.wot.certifiersOf,l.pubkey,l.lookup?l.lookup.certifications[n]:null,d,u,!0).then((function(e){l.received_cert=e.valid,l.received_cert_pending=e.pending,l.received_cert_error=e.error})),m(t.wot.certifiedBy,l.pubkey,l.lookup?l.lookup.givenCertifications:null,d,u,!1).then((function(e){l.given_cert=e.valid,l.given_cert_pending=e.pending,l.given_cert_error=e.error}))])}})).then((function(){return function(e){e.requirements.needCertificationCount=!e.requirements.needMembership&&e.requirements.certificationCount<e.sigQty?e.sigQty-e.requirements.certificationCount:0,e.requirements.willNeedCertificationCount=!e.requirements.needMembership&&!e.requirements.needCertificationCount&&e.requirements.certificationCount-e.requirements.willExpireCertificationCount<e.sigQty?e.sigQty-e.requirements.certificationCount+e.requirements.willExpireCertificationCount:0,e.requirements.pendingCertificationCount=e.received_cert_pending?e.received_cert_pending.length:0,e.requirements.revoked=angular.isDefined(e.requirements.revoked)?e.requirements.revoked:e.revoked,e.requirements.revoked?(delete e.hasBadSelfBlock,b(e,{type:"error",message:"ERROR.IDENTITY_REVOKED",messageParams:{revocationTime:e.revocationTime}}),console.debug("[wot] Identity [{0}] has been revoked".format(e.uid))):e.requirements.pendingRevocation?(b(e,{type:"error",message:"ERROR.IDENTITY_PENDING_REVOCATION"}),console.debug("[wot] Identity [{0}] has pending revocation".format(e.uid))):e.hasBadSelfBlock?(delete e.hasBadSelfBlock,e.isMember||(b(e,{type:"error",message:"ERROR.IDENTITY_INVALID_BLOCK_HASH"}),console.debug("[wot] Invalid membership for {0}: block hash changed".format(e.uid)))):e.requirements.expired?(b(e,{type:"error",message:"ERROR.IDENTITY_EXPIRED"}),console.debug("[wot] Identity {0} expired (in sandbox)".format(e.uid))):e.requirements.willNeedCertificationCount>0&&(b(e,{type:"error",message:"INFO.IDENTITY_WILL_MISSING_CERTIFICATIONS",messageParams:e.requirements}),console.debug("[wot] Identity {0} will need {1} certification(s)".format(e.uid,e.requirements.willNeedCertificationCount)))}(l),o.data.raisePromise.load(l).catch((function(e){console.debug("Error while loading identity data, on extension point."),console.error(e)}))})).then((function(){if(l.pubkey)return delete l.lookup,c.put(l.pubkey,l),console.debug("[wot] Identity "+l.pubkey.substring(0,8)+" loaded in "+(Date.now()-g)+"ms"),l}))},g=function(n,a){if(!n||n.trim()!==n)return e.when(void 0);var i=n.replace(/(^|\s)#\w+/g,"");return i=(i=i.replace(/[^a-zA-Z0-9_-\s]+/g,"")).replace(/\s+/g," ").trim(),(a=a||{}).addUniqueId=!angular.isDefined(a.addUniqueId)||a.addUniqueId,a.allowExtension=!angular.isDefined(a.allowExtension)||a.allowExtension,a.excludeRevoked=!!angular.isDefined(a.excludeRevoked)&&a.excludeRevoked,(i?e.all(i.split(" ").reduce((function(e,n){return console.debug("[wot] Will search on: '"+n+"'"),e.concat(t.wot.lookup({search:n}))}),[])).then((function(e){return e.reduce((function(e,n){return e.concat(n.results.reduce((function(e,n){return e.concat(n.uids.reduce((function(e,t){var i=t.meta.timestamp.split("-",2),o=!t.revoked&&t.revocation_sig;return a.excludeRevoked&&o?e:e.concat({uid:t.uid,pubkey:n.pubkey,number:i[0],hash:i[1],revoked:o})}),[]))}),[]))}),[])})).catch((function(e){if(e&&e.ucode==t.errorCodes.NO_MATCHING_IDENTITY)return[];throw e})):e.when([])).then((function(e){if(!a.allowExtension)return a.addUniqueId?d(e):e;var i=e.length;return o.data.raisePromise.search(n,e,"pubkey").then((function(){if(e.length>i&&_.filter(e,(function(e){return!e.uid&&e.pubkey})).length)return t.wot.member.uids().then((function(n){_.forEach(e,(function(e){!e.uid&&e.pubkey&&(e.uid=n[e.pubkey])}))}))})).then((function(){return a.addUniqueId?d(e):e}))}))},f=function(a,i,o,s){return e((function(r,l){var c=[],d=[];_.each(a.slice(i,i+o),(function(e){d.push(t.blockchain.block({block:e}).then((function(e){e&&e.joiners&&_.each(e.joiners,(function(n){var t=n.split(":"),a=t[t.length-1]+"-"+t[0];c.push({id:a,uid:t[t.length-1],pubkey:t[0],memberDate:e.medianTime,block:e.number})}))})))})),e.all(d).then((function(){c.length<s&&i<a.length-1?n((function(){f(a,i+o,o,s-c.length).then((function(e){r(c.concat(e))})).catch((function(e){l(e)}))}),1e3):r(c)})).catch((function(e){e&&e.ucode===t.errorCodes.HTTP_LIMITATION?r(c):l(e)}))}))},h=function(a,i,o){return e((function(s,r){var l=[],c={},d=[];_.each(a.slice(i,i+o),(function(e){d.push(g(e,{addUniqueId:!1,allowExtension:!1}).then((function(e){e&&e.length&&(l=e.reduce((function(e,n){return c[n.pubkey]?e:(c[n.pubkey]=!0,e.concat(n))}),l))})))})),e.all(d).then((function(){i<a.length-1?n((function(){h(a,i+o,o).then((function(e){e&&e.length?s(e.reduce((function(e,n){return c[n.pubkey]?e:(c[n.pubkey]=!0,e.concat(n))}),l)):s(l)})).catch((function(e){r(e)}))}),t.constants.LIMIT_REQUEST_DELAY):s(l)})).catch((function(e){e&&e.ucode===t.errorCodes.HTTP_LIMITATION?s(l):r(e)}))}))},T=function(n,a,i){a=a||"pubkey";var s=[];return i||s.push(t.wot.member.uids()),s.push(o.data.raisePromise.search(null,n,a).catch((function(e){console.debug("Error while search identities, on extension point."),console.error(e)}))),e.all(s).then((function(e){if(!i){var t=e[0];_.forEach(n,(function(e){!e.uid&&e[a]&&(e.uid=t[e[a]],e.uid&&e.uid==e.name&&delete e.name)}))}return n}))},b=function(e,n){(n=n||{}).type=n.type||"info",n.message=n.message||"",n.messageParams=n.messageParams||{},e.events=e.events||[],e.events.push(n)};return o.registerEvent("data","load"),o.registerEvent("data","search"),{id:i,load:E,search:g,newcomers:function(e,n){return e=e||0,n=n||20,t.blockchain.stats.newcomers().then((function(t){if(!t.result.blocks||!t.result.blocks.length)return null;var a=_.sortBy(t.result.blocks,(function(e){return-e}));return f(a,0,5,e+n)})).then((function(t){return t&&t.length?(t=u(t,e,n),T(t,"pubkey",!0)):null}))},pending:function(n,a){return n=n||0,a=a||20,e.all([t.wot.member.uids(),t.wot.member.pending().then((function(e){return e.memberships&&e.memberships.length?e.memberships:void 0}))]).then((function(i){var o=i[0],s=i[1];if(s){var r={},l={};_.forEach(s,(function(e){if("IN"==e.membership&&!o[e.pubkey]){var n={uid:e.uid,pubkey:e.pubkey,block:e.blockNumber,blockHash:e.blockHash},t=l[e.pubkey];if(t&&n.block>t.block)return;l[n.pubkey]=n,r[n.block]?r[n.block].push(n):r[n.block]=[n],t&&(r[t.block]=r[t.block].reduce((function(e,n){return n.pubkey==t.pubkey?e:(e||[]).concat(n)}),null),null===r[t.block]&&delete r[t.block])}}));var c=u(_.values(l),n,a),d=c.reduce((function(e,n){return e.concat(n.block)}),[]);return e.all([t.blockchain.blocks(_.uniq(d)).then((function(e){_.forEach(e,(function(e){_.forEach(r[e.number],(function(n){n.sigDate=e.medianTime,0!==e.number&&n.blockHash!==e.hash&&(b(n,{type:"error",message:"ERROR.WOT_PENDING_INVALID_BLOCK_HASH"}),console.debug("Invalid membership for uid={0}: block hash changed".format(n.uid)))}))}))})),T(c,"pubkey",!0)]).then((function(){return c}))}}))},all:function(){return h(["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","u","v","w","x","y","z"],0,t.constants.LIMIT_REQUEST_COUNT).then((function(e){return T(e,"pubkey",!0).then((function(){return d(e)}))}))},extend:function(e,n,t){return T([e],n,t).then((function(e){return e[0]}))},extendAll:T,api:o}}var d=c("default");return d.instance=c,d}]),angular.module("cesium.tx.services",["ngApi","cesium.bma.services","cesium.settings.services","cesium.wot.services"]).factory("csTx",["$q","$timeout","$filter","$translate","UIUtils","BMA","Api","csConfig","csSettings","csWot","FileSaver",function(e,n,t,a,i,o,s,r,l,c,d){function u(n,o){var r=new s(this,"csTx-"+n),u=function(e,n,t,a,i){n&&0!==n.length&&_.forEach(n,(function(n){if(n.block_number||i){var s,r,l=!1,c=n.issuers.reduce((function(n,t){return l=t===e||l,n+(t!==e?", "+t:"")}),"");c.length>0&&(c=c.substring(2));var d,u=[],p=n.outputs.reduce((function(t,a,i){var p=a.split(":",3);r=parseInt(p[1]);var E=m(parseInt(p[0]),r),g=p[2],f=o.regexp.TX_OUTPUT_SIG.exec(g);if(f){var h=f[1];if(h==e){if(!l)return t+E;null===n.block_number&&u.push({amount:parseInt(p[0]),base:r,type:"T",identifier:n.hash,noffset:i,consumed:!1})}else if(""!==h&&h!=c&&(s=h),l)return t-E}else if(-1!=g.indexOf("SIG("+e+")")){var _=o.tx.parseUnlockCondition(g);if(_)return _.amount=E,(d=d||[]).push(_),console.debug("[tx] has locked output:",_),t+E}return t}),0),E=p>0?c:s,g=n.time||n.blockstampTime,f=p+":"+n.hash+":"+g;if(!a[f]&&0!==p){a[f]=!0;var h={time:g,amount:p,pubkey:E,comment:n.comment,isUD:!1,hash:n.hash,locktime:n.locktime,block_number:n.block_number};l&&null===n.block_number&&(h.inputs=n.inputs,h.sources=u),d&&(h.lockedOutputs=d),t.push(h)}}}))},p=function(n,t,a){return e((function(a,i){var s=[],r=[],c=[],d=Math.trunc((new Date).getTime()/1e3);t=t||d-l.data.walletHistoryTimeSecond;var p={},m={pendings:[]},E=function(e){u(n,e.history.sent,s,p),u(n,e.history.received,s,p),u(n,e.history.sending,s,p),u(n,e.history.pending,c,p,!0)},g=[o.tx.history.pending({pubkey:n}).then(E)];if(-1!==t){for(var f=l.data.walletHistorySliceSecond,h=t-t%f;h-f<d;h+=f)g.push(o.tx.history.times({pubkey:n,from:h,to:h+f-1}).then(E));g.push(o.tx.history.timesNoCache({pubkey:n,from:d-d%f,to:d+999999999}).then(E))}else g.push(o.tx.history.all({pubkey:n}).then(E));e.all(g).then((function(){m.history=s.concat(r).sort((function(e,n){return n.time-e.time})),m.pendings=c,m.fromTime=t,m.toTime=m.history.length?m.history[0].time:t,a(m)})).catch((function(e){m.history=[],m.pendings=[],m.errors=[],delete m.fromTime,delete m.toTime,i(e)}))}))},m=function(e,n){return n<=0?e:e*Math.pow(10,n)},E=function(e,n){_(n).forEach((function(n){!function(e,n,t){var a=e.type+":"+e.identifier+":"+e.noffset;angular.isUndefined(t[a])&&(n.push(e),t[a]=n.length-1)}(n,e.sources,e.sourcesIndexByKey)}))},g=function(e){return o.tx.sources({pubkey:e}).then((function(e){var n={sources:[],sourcesIndexByKey:[],balance:0};return e.sources&&e.sources.length&&(_.forEach(e.sources,(function(e){e.consumed=!1,n.balance+=m(e.amount,e.base)})),E(n,e.sources)),n}))},f=function(n,t){var a=(new Date).getTime(),i={};return e.all([g(n),p(n,t)]).then((function(e){angular.merge(i,e[0]),i.tx=e[1];var n=[],t=[],a=i.balance;function o(e){var o=[],s=!0;e.amount>0?s=!1:(_.forEach(e.inputs,(function(e){var n=e.split(":").slice(2).join(":"),t=i.sourcesIndexByKey[n];if(!angular.isDefined(t))return s=!1,!1;o.push(i.sources[t])})),e.sources&&E(i,e.sources),delete e.sources,delete e.inputs),s?(a+=e.amount,n.push(e),_.forEach(o,(function(e){e.consumed=!0}))):t.push(e)}for(var s=i.tx.pendings,r=!0;s&&s.length>0;)_.forEach(s,o),t.length>0&&n.length>0&&r?(s=t,t=[],r=!1):s=null;return i.tx.pendings=n,i.tx.errors=t,i.balance=a,c.extendAll((i.tx.history||[]).concat(i.tx.pendings||[]),"pubkey")})).then((function(){return console.debug("[tx] TX and sources loaded in "+((new Date).getTime()-a)+"ms"),i}))};return downloadHistoryFile=function(n,s){return(s=s||{}).fromTime=s.fromTime||-1,console.debug("[tx] Exporting TX history for pubkey [{0}]".format(n.substr(0,8))),e.all([a(["ACCOUNT.HEADERS.TIME","COMMON.UID","COMMON.PUBKEY","ACCOUNT.HEADERS.AMOUNT","ACCOUNT.HEADERS.COMMENT"]),o.blockchain.current(),f(n,s.fromTime)]).then((function(e){var o=e[0],s=e[1],r=s&&s.medianTime||moment().utc().unix(),l=s&&s.currency;return(e=e[2])&&e.tx&&e.tx.history?a("ACCOUNT.FILE_NAME",{currency:l,pubkey:n,currentTime:r}).then((function(e){var n=t("formatDecimal"),a=(t("formatPubkey"),t("formatDate")),i=(t("formatDateForFile"),t("currencySymbolNoHtml")),s=[o["ACCOUNT.HEADERS.TIME"],o["COMMON.UID"],o["COMMON.PUBKEY"],o["ACCOUNT.HEADERS.AMOUNT"]+" ("+i(l)+")",o["ACCOUNT.HEADERS.COMMENT"]],r=e.tx.history.reduce((function(e,t){return e.concat([a(t.time),t.uid,t.pubkey,n(t.amount/100),'"'+t.comment+'"'].join(";")+"\n")}),[s.join(";")+"\n"]),c=new Blob(r,{type:"text/plain; charset=utf-8"});d.saveAs(c,e)})):i.toast.show("INFO.EMPTY_TX_HISTORY")}))},{id:n,load:f,downloadHistoryFile:downloadHistoryFile,api:r}}var p=u("default",o);return p.instance=u,p}]),angular.module("cesium.wallet.services",["ngApi","ngFileSaver","cesium.bma.services","cesium.crypto.services","cesium.utils.services","cesium.settings.services"]).factory("csWallet",["$q","$rootScope","$timeout","$translate","$filter","Api","localStorage","CryptoUtils","BMA","csConfig","csSettings","FileSaver","Blob","csWot","csTx","csCurrency",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g){function f(a,i){var l,m,E,f={},h=new o(this,"csWallet-"+a),T=function(e){f.loaded=!1,f.pubkey=null,f.qrcode=null,f.uid=null,f.isNew=null,f.events=[],b(),m=!1,E=void 0,e?h.data.raise.init(f):(d.data.useLocalStorage||d.reset(),h.data.raise.reset(f))},b=function(){f.keypair={signSk:null,signPk:null}},v=function(){return!!f.pubkey},O=function(n){return m?v()?e.when(f.keypair):e.reject("Not auth"):(E||M()).then((function(){return O(n)}))},R=function(){if(d.data.useLocalStorage)if(v()&&d.data.rememberMe){var e={keypair:f.keypair,pubkey:f.pubkey,version:c.version};s.setObject("GCHANGE_DATA",e)}else s.setObject("GCHANGE_DATA",null);else s.setObject("GCHANGE_DATA",null);s.setObject("CESIUM_DATA",null)},I=function(){return s.get("GCHANGE_DATA").then((function(e){if(e)return e;try{return s.get("CESIUM_DATA").catch((function(){console.debug("No settings stored in CESIUM_DATA key. Continue")}))}catch(e){return void console.debug("No settings stored in CESIUM_DATA key. Continue")}})).then((function(e){if(e)return P(e,!1).then((function(e){if(e&&e.keypair&&e.pubkey)return f.keypair=e.keypair,f.pubkey=e.pubkey,f.loaded=!1,h.data.raisePromise.login(f)})).then((function(){return f}))}))},N=function(e){return e&&e.minData?A(e):e||f.loaded?D(e):S()},S=function(){return f.loaded=!1,e.all([h.data.raisePromise.load(f,null).catch((function(e){console.error("Error while loading wallet data, on extension point. Try to continue"),console.error(e)}))]).then((function(){return h.data.raisePromise.finishLoad(f).catch((function(e){console.error("Error while finishing wallet data load, on extension point. Try to continue"),console.error(e)}))})).then((function(){return f.loaded=!0,f})).catch((function(e){throw f.loaded=!1,e}))},A=function(e){return D(e=e||{})},D=function(n){n=n||{api:!0};var t=[];return L("requirements"),t.length&&!n.api||t.push(h.data.raisePromise.load(f,n)),e.all(t).then((function(){return h.data.raisePromise.finishLoad(f)})).then((function(){return f})).catch((function(e){console.error("Failed to execute refreshData() jobs:",e)}))},C=function(e){var n=Math.round(e.answer.length/2),t=e.answer.substr(0,n),a=e.answer.substr(n);return r.scryptKeypair(t,a).then((function(n){return e.pubkey=r.util.encode_base58(n.signPk),e.keypair=n,e}))},L=function(e){f.events=f.events.reduce((function(n,t){return t.context&&t.context==e?n:n.concat(t)}),[])},P=function(n,t){return t=!!angular.isUndefined(t)||t,e((function(e,a){var i=JSON.parse(n||"{}");if(i&&i.keypair&&i.keypair.signPk&&i.keypair.signSk){var o,s={},r=new Uint8Array(32);for(o=0;o<32;o++)r[o]=i.keypair.signPk[o];s.signPk=r;var l=new Uint8Array(64);for(o=0;o<64;o++)l[o]=i.keypair.signSk[o];if(s.signSk=l,i.version&&i.keypair.boxPk){var c=new Uint8Array(32);for(o=0;o<32;o++)c[o]=i.keypair.boxPk[o];s.boxPk=c}if(i.version&&i.keypair.boxSk){var d=new Uint8Array(32);for(o=0;o<64;o++)d[o]=i.keypair.boxSk[o];s.boxSk=d}e({pubkey:i.pubkey,keypair:s,tx:i.tx})}else t?a("Not a valid Wallet.data object"):e()}))};function y(){console.debug("[wallet] Stopping..."),_.forEach(l,(function(e){e()})),l=[],T()}function k(){return y(),t(M,200)}function M(){console.debug("[wallet] Starting...");var t=(new Date).getTime();return E=e.all([d.ready(),g.ready(),i.ready()]).then(I).then((function(e){if(e&&e.pubkey)return N({minData:!0})})).then((function(){!function(){l=[d.api.data.on.changed(n,R,this),i.api.node.on.restart(n,k,this)]}(),console.debug("[wallet] Started in "+((new Date).getTime()-t)+"ms"),m=!0,E=null,h.data.raise.ready(f)})).then((function(){return f}))}return h.registerEvent("data","ready"),h.registerEvent("data","init"),h.registerEvent("data","loginCheck"),h.registerEvent("data","login"),h.registerEvent("data","load"),h.registerEvent("data","finishLoad"),h.registerEvent("data","logout"),h.registerEvent("data","unauth"),h.registerEvent("data","reset"),h.registerEvent("error","send"),h.registerEvent("action","certify"),T(!0),{id:a,data:f,ready:function(){return m?e.when():E||M()},start:M,stop:y,login:function(e,n){if(!e||!n)throw Error("Missing required arguments");return r.scryptKeypair(e,n).then((function(e){return f.pubkey=r.util.encode_base58(e.signPk),f.keypair=e,h.data.raisePromise.loginCheck(f).catch((function(e){throw T(),e})).then((function(){return h.data.raisePromise.login(f)}))})).then((function(){return d.data.useLocalStorage&&R(),f}))},logout:function(){return e((function(e,n){T(),R(),h.data.raise.logout(),h.data.raise.unauth(),e()}))},isLogin:v,getKeypair:O,isDataLoaded:function(e){return e&&e.minData,f.loaded},isNeverUsed:function(){if(f.loaded)return!f.pubkey||!(f.name||f.profile||f.avatar)},isNew:function(){return!!f.isNew},isUserPubkey:function(e){return v()&&f.pubkey===e},getData:function(){return f},loadQrCode:function(){return!f.pubkey||f.qrcode?e.when(f.qrcode):(console.debug("[wallet] Creating SVG QRCode..."),t((function(){return f.qrcode=UIUtils.qrcode.svg(f.pubkey),f.qrcode})))},loadData:N,refreshData:D,downloadSaveId:function(e){return function(e){var n="Version: 10 \nType: SaveID\nQuestions: \n"+e.questions+"Issuer: "+f.pubkey+"\nCrypted-Nonce: "+e.nonce+"\nCrypted-Pubkey: "+e.pubkey+"\nCrypted-Salt: "+e.salt+"\nCrypted-Pwd: "+e.pwd+"\n";return r.sign(n,f.keypair).then((function(e){return n+=e+"\n",console.debug("Has generate an SaveID document:\n----\n"+n+"----"),n}))}(e).then((function(e){var n=new p([e],{type:"text/plain; charset=utf-8"});u.saveAs(n,"saveID.txt")}))},getCryptedId:function(e){return C(e).then((function(){return r.util.random_nonce()})).then((function(n){return e.nonce=n,r.box.pack(e.salt,e.nonce,e.keypair.boxPk,e.keypair.boxSk)})).then((function(n){return e.salt=n,r.box.pack(e.pwd,e.nonce,e.keypair.boxPk,e.keypair.boxSk)})).then((function(n){return e.pwd=n,e.nonce=r.util.encode_base58(e.nonce),e}))},recoverId:function(e){var n=r.util.decode_base58(e.cypherNonce);return C(e).then((function(e){return r.box.open(e.cypherSalt,n,e.keypair.boxPk,e.keypair.boxSk)})).then((function(t){return e.salt=t,r.box.open(e.cypherPwd,n,e.keypair.boxPk,e.keypair.boxSk)})).then((function(n){return e.pwd=n,e})).catch((function(e){console.warn("Incorrect answers - Unable to recover passwords")}))},events:{add:function(e,n){(e=e||{}).type=e.type||"info",e.message=e.message||"",e.messageParams=e.messageParams||{},e.context=e.context||"undefined",e.message.trim().length?n?f.events.splice(0,0,e):f.events.push(e):console.debug("Event without message. Skipping this event")},cleanByContext:L},api:h}}var h=f("default",l);return h.instance=f,h}]),angular.module("cesium.plugin.services",[]).provider("PluginService",(function(){var e=[],n={};this.registerEagerLoadingService=function(n){return e.push(n),this},this.extendState=function(e,t){return angular.isDefined(e)&&angular.isDefined(t)&&(n[e]||(n[e]=[]),n[e].push(t)),this},this.extendStates=function(e,n){var t=this;return e.forEach((function(e){t.extendState(e,n)})),this},this.$get=["$injector","$state",function(t,a){var i;return{start:function(){e.length>0&&_.forEach(e,(function(e){t.get(e)}))},extensions:{points:{getActivesByName:function(e){return _.keys(n).reduce((function(e,t){return a.includes(t)?e.concat(n[t]):e}),[]).reduce((function(n,t){return t.points&&t.points[e]?n.concat(t.points[e]):n}),[])},current:{get:function(){return i},set:function(e){i=e}}}}}}]})),angular.module("cesium.services",["cesium.config","cesium.settings.services","cesium.http.services","cesium.bma.services","cesium.crypto.services","cesium.utils.services","cesium.modal.services","cesium.storage.services","cesium.device.services","cesium.currency.services","cesium.wallet.services","cesium.tx.services","cesium.wot.services","cesium.plugin.services"]),e.prototype.isEmpty=function(){"use strict";return!(this.transactionsCount||this.certificationsCount||this.joinersCount||this.dividend||this.activesCount||this.identitiesCount||this.leaversCount||this.excludedCount||this.revokedCount)},e.prototype.parseData=function(){this.identities=this.parseArrayValues(this.identities,["pubkey","signature","buid","uid"]),this.joiners=this.parseArrayValues(this.joiners,["pubkey","signature","mBuid","iBuid","uid"]),this.actives=this.parseArrayValues(this.actives,["pubkey","signature","mBuid","iBuid","uid"]),this.leavers=this.parseArrayValues(this.leavers,["pubkey","signature","mBuid","iBuid","uid"]),this.revoked=this.parseArrayValues(this.revoked,["pubkey","signature"]),this.excluded=this.parseArrayValues(this.excluded,["pubkey"]),this.certifications=this.parseArrayValues(this.certifications,["from","to","block","signature"]),this.transactions=this.parseTransactions(this.transactions),delete this.raw},e.prototype.cleanData=function(){delete this.identities,delete this.joiners,delete this.actives,delete this.leavers,delete this.revoked,delete this.excluded,delete this.certifications,delete this.transactions,delete this.raw},e.prototype.parseArrayValues=function(e,n){return e&&e.length?e.reduce((function(e,t){var a=t.split(":");if(a.length!=n.length)return console.debug("[block] Bad format for '{0}': [{1}]. Expected {1} parts. Skipping".format(arrayProperty,t,n.length)),e;for(var i={},o=0;o<n.length;o++)i[n[o]]=a[o];return e.concat(i)}),[]):[]},e.prototype.regexp={TX_OUTPUT_SIG:("SIG\\(([0-9a-zA-Z]{43,44})\\)",new RegExp("^SIG\\(([0-9a-zA-Z]{43,44})\\)$"))},e.prototype.parseTransactions=function(n){return n&&n.length?n.reduce((function(n,t){var a={issuers:t.issuers,time:t.time};return a.outputs=t.outputs.reduce((function(n,a){var i=a.split(":");if(3!=i.length)return console.debug("[block] Bad format a 'transactions': [{0}]. Expected 3 parts. Skipping".format(a)),n;var o=i[0],s=i[1],r=i[2],l=e.prototype.regexp.TX_OUTPUT_SIG.exec(i[2]);if(l){var c=l[1];return t.issuers&&-1==t.issuers.indexOf(c)?n.concat({amount:s<=0?o:o*Math.pow(10,s),unitbase:s,pubkey:c}):n}return n.concat({amount:s<=0?o:o*Math.pow(10,s),unitbase:s,unlockCondition:r})}),[]),a.error||a.outputs.length||(a.toHimself=!0),n.concat(a)}),[]):[]},t.$inject=["$scope","$rootScope","$state","$ionicSideMenuDelegate","$q","$timeout","$ionicHistory","$controller","$window","csPlatform","UIUtils","BMA","csWallet","Device","Modals","csSettings","csConfig","csHttp"],n.$inject=["$scope","PluginService"],angular.module("cesium.app.controllers",["cesium.platform","cesium.services"]).config(["$stateProvider","$urlRouterProvider",function(e,n){e.state("app",{url:"/app",abstract:!0,templateUrl:"templates/menu.html",controller:"AppCtrl",data:{large:!1}}),n.otherwise("/app/home")}]).controller("AppCtrl",t).controller("PluginExtensionPointCtrl",n),a.$inject=["$scope","$state","$timeout","$ionicHistory","$http","$translate","$q","$location","UIUtils","csConfig","csCache","csPlatform","csCurrency","csSettings"],angular.module("cesium.home.controllers",["cesium.platform","cesium.services"]).config(["$stateProvider","$urlRouterProvider",function(e,n){e.state("app.home",{url:"/home?error&uri",views:{menuContent:{templateUrl:"templates/home/home.html",controller:"HomeCtrl"}}}),n.otherwise("/app/home")}]).controller("HomeCtrl",a),i.$inject=["$timeout","Modals"],o.$inject=["$scope","$state","UIUtils","CryptoUtils","csSettings","Modals","csWallet","mkWallet","BMA"],angular.module("cesium.join.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.join",{url:"/join",views:{menuContent:{templateUrl:"templates/home/home.html",controller:"JoinCtrl"}}})}]).controller("JoinCtrl",i).controller("JoinModalCtrl",o),s.$inject=["$scope","$timeout","CryptoUtils","UIUtils","Modals","csSettings","Device"],angular.module("cesium.login.controllers",["cesium.services"]).controller("LoginModalCtrl",s),r.$inject=["$scope","$state","$timeout","$anchorScroll","csSettings"],l.$inject=["$scope","$timeout","$anchorScroll","csSettings","parameters"],c.$inject=["$scope","$rootScope","$state","$window","$ionicSideMenuDelegate","$timeout","$q","$anchorScroll","UIUtils","csConfig","csSettings","csCurrency","Device","csWallet"],d.$inject=["$scope"],angular.module("cesium.help.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.help_tour",{url:"/tour",views:{menuContent:{templateUrl:"templates/home/home.html",controller:"HelpTourCtrl"}}}).state("app.help",{url:"/help?anchor",views:{menuContent:{templateUrl:"templates/help/view_help.html",controller:"HelpCtrl"}}}).state("app.help_anchor",{url:"/help/:anchor",views:{menuContent:{templateUrl:"templates/help/view_help.html",controller:"HelpCtrl"}}})}]).controller("HelpCtrl",r).controller("HelpModalCtrl",l).controller("HelpTipCtrl",c).controller("HelpTourCtrl",d),u.$inject=["$scope","$q","$ionicPopup","$timeout","$state","UIUtils","csWallet","$ionicPopover","Modals","csSettings","esHttp"],angular.module("cesium.wallet.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.view_wallet",{url:"/wallet",views:{menuContent:{templateUrl:"templates/wallet/view_wallet.html",controller:"WalletCtrl"}}})}]).controller("WalletCtrl",u),p.$inject=["$scope","$state","$timeout","$focus","$ionicPopover","$ionicHistory","UIUtils","csConfig","csCurrency","csSettings","Device","BMA","csWallet","esDocument","esProfile"],m.$inject=["$scope","$controller","$focus","parameters"],E.$inject=["$scope","$rootScope","$state","$ionicHistory","UIUtils","Modals","esHttp","csCurrency","csWot","csWallet"],g.$inject=["$scope","$rootScope","$controller","$timeout","UIUtils","csWallet"],angular.module("cesium.wot.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.user_lookup",{url:"/user?q&type&hash",views:{menuContent:{templateUrl:"templates/wot/lookup.html",controller:"WotLookupCtrl"}}}).state("app.user_identity",{url:"/user/:pubkey/:name?action",views:{menuContent:{templateUrl:"templates/wot/view_identity.html",controller:"WotIdentityViewCtrl"}}}).state("app.user_identity_name",{url:"/lookup/:name?action",views:{menuContent:{templateUrl:"templates/wot/view_identity.html",controller:"WotIdentityViewCtrl"}}})}]).controller("WotLookupCtrl",p).controller("WotLookupModalCtrl",m).controller("WotIdentityAbstractCtrl",E).controller("WotIdentityViewCtrl",g),f.$inject=["$scope","$q","$window","$ionicHistory","$ionicPopup","$timeout","$translate","UIUtils","Modals","BMA","csHttp","csConfig","csSettings","csPlatform"],angular.module("cesium.settings.controllers",["cesium.services"]).config(["$stateProvider",function(e){e.state("app.settings",{url:"/settings",views:{menuContent:{templateUrl:"templates/settings/settings.html",controller:"SettingsCtrl"}}})}]).controller("SettingsCtrl",f),angular.module("cesium.controllers",["cesium.app.controllers","cesium.home.controllers","cesium.join.controllers","cesium.login.controllers","cesium.help.controllers","cesium.settings.controllers","cesium.wallet.controllers","cesium.wot.controllers"]),angular.module("cesium.templates",[]).run(["$templateCache",function(e){e.put("templates/common/form_error_messages.html",'<div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT"></span></div><div class="form-error" ng-message="maxlength"><span translate="ERROR.FIELD_TOO_LONG"></span></div><div class="form-error" ng-message="pattern"><span translate="ERROR.FIELD_ACCENT"></span></div><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div>'),e.put("templates/common/popover_copy.html",'<ion-popover-view class="popover-copy" style="height: {{(!rows || rows <= 1) ? 50 : rows*22}}px"><ion-content scroll="false"><div class="list"><div class="item item-input"><input type="text" ng-if="!rows || rows <= 1" ng-model="value"> <textarea ng-if="rows && rows > 1" ng-model="value" rows="{{rows}}" cols="10">\n </textarea></div></div></ion-content></ion-popover-view>'),e.put("templates/common/popover_helptip.html",'<ion-popover-view class="popover-helptip"><ion-content scroll="false" class="list"><p><i ng-if="icon.position && !icon.position.startsWith(\'bottom-\')" class="{{icon.class}} icon-{{icon.position}} hidden-xs" style="{{icon.style}}"></i><a ng-click="closePopover()" class="pull-right button-close" ng-class="{\'pull-left\': icon.position === \'right\', \'pull-right\': icon.position !== \'right\'}"><i class="ion-close"></i> </a><span> </span></p><p class="padding light"><ng-bind-html ng-bind-html="content | translate:contentParams"></ng-bind-html><ng-bind-html ng-bind-html="trustContent"></ng-bind-html></p><div class="text-center" ng-if="!tour"><button class="button button-small button-stable" ng-if="!hasNext" ng-click="closePopover(true)" translate>COMMON.BTN_UNDERSTOOD</button> <button class="button button-small button-stable" id="helptip-btn-ok" ng-if="hasNext" ng-click="closePopover(false)" translate>COMMON.BTN_UNDERSTOOD</button> <button id="helptip-btn-ok" class="button button-small button-positive icon-right ink" ng-if="hasNext" ng-click="closePopover(true)"><i class="icon ion-chevron-right"></i></button></div><div class="text-center" ng-if="tour"><button class="button button-small button-positive" id="helptip-btn-ok" ng-if="!hasNext" ng-click="closePopover(false)" translate>COMMON.BTN_CLOSE</button> <button id="helptip-btn-ok" class="button button-small button-positive icon-right ink" ng-if="hasNext" ng-click="closePopover(true)">{{\'COMMON.BTN_CONTINUE\'|translate}} <i class="icon ion-chevron-right"></i></button></div><p><i ng-if="icon.position && icon.position.startsWith(\'bottom-\')" class="{{icon.class}} icon-{{icon.position}} hidden-xs"></i></p></ion-content></ion-popover-view>'),e.put("templates/common/popover_instance_address.html",'<ion-popover-view class="popover-instance-address"><ion-content scroll="false"><form><div class="list"><div class="item item-text-wrap padding item-no-border"><span translate>COMMON.POPOVER_SHARE.INSTANCE_ADDRESS_HELP</span></div><div class="item item-input item-floating-label item-no-border"><span class="input-label" ng-bind-html="\'SETTINGS.POPUP_PEER.HOST\'|translate"></span> <input type="text" ng-model="instance"></div></div><div class="padding text-right"><button class="button button-clear button-dark ink" ng-click="closePopover()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-raised button-positive ink" ng-click="closePopover(instance)" translate>COMMON.BTN_SHARE</button></div></form></ion-content></ion-popover-view>'),e.put("templates/common/popover_locales.html",'<ion-popover-view class="fit popover-locales" style="height: {{locales.length*48}}px;"><ion-content scroll="false"><div class="list item-text-wrap block"><a ng-repeat="l in locales track by l.id" class="item item-icon-left ink" ng-click="changeLanguage(l.id)"><i class="item-image avatar" style="background-image: url(./img/flag-{{l.flag}}.png)"></i> {{l.label | translate}}</a></div></ion-content></ion-popover-view>'),e.put("templates/common/popover_profile.html",'<ion-popover-view class="fit has-header popover-profile hidden-xs hidden-sm"><ion-content scroll="false"><div class="row"><div class="col col-33"><i class="avatar avatar-member" ng-if="!$root.walletData.avatar" ng-class="{\'royal-bg\': login, \'stable-bg\': !login}"></i> <i class="avatar" ng-if="$root.walletData.avatar" style="background-image: url(\'{{$root.walletData.avatar.src}}\')"></i></div><div class="col col-66" ng-if="login"><h4>{{$root.walletData.name||$root.walletData.uid}}</h4><h4 class="gray" ng-if="!$root.walletData.name && !$root.walletData.uid" copy-on-click="{{$root.walletData.pubkey}}"><i class="icon ion-key"></i> {{$root.walletData.pubkey|formatPubkey}}</h4></div></div><div class="row" ng-show="login"><div class="col col-66 col-offset-33"><cs-extension-point name="profile-popover-user"></cs-extension-point></div></div><div class="row" ng-show="!login"><div class="col col-66 col-offset-33"><div class="text-center no-padding gray">{{\'LOGIN.NO_ACCOUNT_QUESTION\'|translate}}<br class="visible-xs"><b><button class="button button-calm button-small ink" ng-click="showJoinModal()">{{\'LOGIN.CREATE_ACCOUNT\'|translate}}</button></b></div></div></div></ion-content><ion-footer-bar class="stable-bg row"><div class="col"><button class="button button-raised button-block button-stable ink ink-dark" id="helptip-popover-profile-btn-settings" ng-click="showSettings()" ui-sref="app.settings"><i class="icon ion-android-settings"></i> {{\'MENU.SETTINGS\' | translate}}</button></div><div class="col"><button class="button button-raised button-block button-stable ink ink-dark" ng-show="login" ng-click="logout()" translate>COMMON.BTN_LOGOUT</button> <button class="button button-raised button-block button-positive ink" ng-show="!login" ng-click="loginAndGo(\'app.view_wallet\')" translate>COMMON.BTN_LOGIN</button></div></ion-footer-bar></ion-popover-view>'),e.put("templates/common/popover_share.html",'<ion-popover-view class="popover-share"><ion-content scroll="false"><div class="bar bar-header"><h1 class="title" ng-bind-html="titleKey|translate:titleValues"></h1><span class="gray pull-right hidden-xs">{{time|formatDate}}</span></div><div class="list no-margin no-padding has-header has-footer block"><div class="item item-input"><input type="text" ng-model="value"></div></div><div class="bar bar-footer"><div class="button-bar"><a class="button button-icon positive icon ion-social-facebook" href="https://www.facebook.com/sharer/sharer.php?u={{postUrl|formatEncodeURI}}&title={{postMessage|formatEncodeURI}}" onclick="window.open(this.href, \'facebook-share\',\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\');return false;" title="{{\'COMMON.POPOVER_SHARE.SHARE_ON_FACEBOOK\'|translate}}"></a> <a class="button button-icon positive icon ion-social-twitter" href="https://twitter.com/intent/tweet?url={{postUrl|formatEncodeURI}}&text={{postMessage|formatEncodeURI}}" onclick="window.open(this.href, \'twitter-share\',\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\');return false;" title="{{\'COMMON.POPOVER_SHARE.SHARE_ON_TWITTER\'|translate}}"></a> <a class="button button-icon positive icon ion-social-diaspora" href="https://sharetodiaspora.github.io/?title={{postMessage|formatEncodeURI}}&url={{postUrl|formatEncodeURI}}" onclick="window.open(this.href, \'diaspora-share\',\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\');return false;" title="{{\'COMMON.POPOVER_SHARE.SHARE_ON_DIASPORA\'|translate}}"></a> <a class="button button-icon positive icon ion-social-mastodon" ng-click="shareOnMastodon()" title="{{\'COMMON.POPOVER_SHARE.SHARE_ON_MASTODON\'|translate}}"></a> <a class="button-close" title="{{\'COMMON.BTN_CLOSE\'|translate}}" ng-click="closePopover()"><i class="icon ion-close"></i></a></div></div></ion-content></ion-popover-view>'),e.put("templates/common/qrcode.html",'<a ng-attr-id="{{ qrcodeId }}" ng-show="!loading" class="qrcode fade-in pull-right" ng-class="{\'active\': toggleQRCode}" ng-click="toggleQRCode = !toggleQRCode"><div class="content"></div><div class="footer item item-icon-left item-text-wrap ink" on-hold="copy(formData.pubkey)" copy-on-click="{{:rebind:formData.pubkey}}" ng-click="$event.stopPropagation()"><i class="icon ion-key"></i> <span>{{:locale:\'COMMON.PUBKEY\'|translate}}</span><h4 id="pubkey" class="dark">{{:rebind:formData.pubkey}}</h4></div></a>'),e.put("templates/help/help.html",'<a name="join"></a><h2 translate>HELP.JOIN.SECTION</h2><a name="join-salt"></a><div class="row responsive-sm"><div class="col col-20 gray" translate>LOGIN.SALT</div><div class="col" translate>HELP.JOIN.SALT</div></div><a name="join-password"></a><div class="row responsive-sm"><div class="col col-20 gray" translate>LOGIN.PASSWORD</div><div class="col" translate>HELP.JOIN.PASSWORD</div></div><a name="glossary"></a><h2 translate>HELP.GLOSSARY.SECTION</h2><a name="pubkey"></a><div class="row responsive-sm"><div class="col col-20 gray" translate>COMMON.PUBKEY</div><div class="col" translate>HELP.GLOSSARY.PUBKEY_DEF</div></div><a name="universal_dividend"></a><div class="row responsive-sm"><div class="col col-20 gray" translate>COMMON.UNIVERSAL_DIVIDEND</div><div class="col" translate>HELP.GLOSSARY.UNIVERSAL_DIVIDEND_DEF</div></div>'),e.put("templates/help/modal_help.html",'<ion-view class="modal slide-in-up ng-enter active ng-enter-active"><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CLOSE</button><h1 class="title" translate>HELP.TITLE</h1></ion-header-bar><ion-content scroll="true" class="padding"><ng-include src="\'plugins/market/templates/help/help.html\'"></ng-include><div class="padding hidden-xs text-center"><button class="button button-positive ink" type="submit" ng-click="closeModal()">{{\'COMMON.BTN_CLOSE\' | translate}}</button></div></ion-content></ion-view>'),e.put("templates/help/view_help.html",'<ion-view left-buttons="leftButtons"><ion-nav-title><span class="visible-xs visible-sm" translate>HELP.TITLE</span></ion-nav-title><ion-content scroll="true" class="padding"><h1 class="hidden-xs hidden-sm" translate>HELP.TITLE</h1><ng-include src="\'templates/help/help.html\'"></ng-include></ion-content></ion-view>'),e.put("templates/home/home.html",'<ion-view id="home"><ion-nav-title></ion-nav-title><ion-nav-buttons side="secondary"><cs-extension-point name="header-buttons"></cs-extension-point><button class="button button-clear hidden-xs hidden-sm flag" ng-click="showLocalesPopover($event)" style="align-content: center"><i class="flag-image" ng-if=":locale:$root.settings.locale" style="background-image: url(./img/flag-{{$root.settings.locale.country}}.png);"></i> <b class="ion-arrow-down-b gray"></b></button></ion-nav-buttons><ion-content class="has-header no-padding-xxs bg-image-cover" style="background-image: url({{bgImage}})"><div class="row no-padding-xxs responsive-lg"><div class="col col-md-10 hidden-xs hidden-sm" ng-class="{\'col-30 no-padding\': !feed, \'col-15 no-padding\': feed}"> </div><div class="col text-center main-column"><div class="logo"></div><p class="hidden-xs"> </p><div class="main-content center padding light-bg"><h4><span class="hidden-xs" translate>HOME.MESSAGE</span> <span ng-show="!loading" ng-bind-html="\'HOME.MESSAGE_CURRENCY\'|translate:{currency: $root.currency.name}"></span></h4><br class="hidden-xs"><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><div class="animate-fade-in animate-show-hide ng-hide" ng-show="!loading && error"><div class="card card-item padding"><p class="item-content item-text-wrap"><span class="dark" trust-as-html="\'HOME.CONNECTION_ERROR\'|translate:node"></span></p><button type="button" class="button button-positive icon icon-left ion-refresh ink" ng-click="reload()">{{:locale:\'COMMON.BTN_REFRESH\'|translate}}</button></div></div><div class="center animate-fade-in animate-show-hide ng-hide" ng-show="!loading && !error"><cs-extension-point name="buttons"></cs-extension-point><button type="button" class="button button-block button-positive button-raised icon ink-dark" ng-click="showJoinModal()" ng-if="!login" translate>LOGIN.CREATE_FREE_ACCOUNT</button> <button type="button" class="button button-block button-positive button-raised icon icon-left ion-person ink-dark" ui-sref="app.view_wallet" ng-show="login" translate>MENU.ACCOUNT</button><br class="visible-xs visible-sm"><div class="text-center no-padding" ng-show="!login"><br class="visible-xs visible-sm">{{\'LOGIN.HAVE_ACCOUNT_QUESTION\'|translate}} <b><a class="positive hidden-xs hidden-sm" ng-click="loginAndGo(\'app.view_wallet\')" translate>COMMON.BTN_LOGIN</a></b></div><div class="text-center no-padding hidden-xs hidden-sm" ng-show="login"><span class="dark" ng-bind-html="\'HOME.NOT_YOUR_ACCOUNT_QUESTION\'|translate:$root.walletData"></span><br><b><a class="assertive" ng-click="logout()" translate>HOME.BTN_CHANGE_ACCOUNT</a></b></div><button type="button" class="button button-block button-stable button-raised ink visible-xs visible-sm" ui-sref="app.view_wallet" ng-if="!login" translate>COMMON.BTN_LOGIN</button> <button type="button" class="button button-block button-assertive button-raised icon icon-left ion-log-out ink-dark visible-xs visible-sm" ng-click="logout()" ng-if="login" translate>COMMON.BTN_LOGOUT</button></div><br><div class="text-center no-padding visible-xs dark"><br>{{:locale:\'COMMON.APP_VERSION\'|translate:{version: config.version} }} | <a href="#" ng-click="showAboutModal()" translate>HOME.BTN_ABOUT</a></div></div></div><div class="col col-lg-10 hidden-xs hidden-sm" ng-class="{\'col-30 no-padding\': !feed, \'col-15 no-padding\': feed}"> </div><div class="col col-30 no-padding" ng-if="feed"><div class="feed padding-horizontal no-padding-xs padding-top"><h3 class="padding-left"><i class="icon ion-speakerphone"></i> {{feed.title}} <small><a ng-click="openLink($event, feed.home_page_url)" class="gray"><span translate>HOME.SHOW_ALL_FEED</span> <i class="icon ion-chevron-right"></i></a></small></h3><div class="animate-show-hide ng-hide" ng-show="feed"><div ng-repeat="item in feed.items" class="card padding no-margin-xs"><div class="header"><i ng-if="item.author.avatar" class="avatar" style="background-image: url({{item.author.avatar}});"></i> <a ng-class="{\'avatar-left-padding\': item.author.avatar}" class="author" ng-click="item.author.url && openLink($event, item.author.url)">{{item.author.name}} </a><a ng-if="item.time" title="{{item.time|formatDate}}" ng-click="openLink($event, item.url)" class="item-note"><small><i class="icon ion-clock"></i> {{item.time|formatFromNow}}</small></a></div><h2 class="title feed-title"><a ng-click="openLink($event, item.url)">{{item.title}}</a></h2><div ng-if="item.content" class="content feed-content" trust-as-html="item.content"></div><h4 class="card-footer feed-footer text-right positive-100"><a ng-click="openLink($event, item.url)"><span ng-if="item.truncated" translate>HOME.READ_MORE</span> <span ng-if="!item.truncated" translate>COMMON.BTN_SHOW</span> <i class="icon ion-chevron-right"></i></a></h4></div></div></div></div></div><div class="row responsive-lg footer no-margin no-padding"><div class="col no-padding no-margin"><cs-extension-point name="footer-start"></cs-extension-point></div><div class="col col-33 no-padding no-margin"><cs-extension-point name="footer-end"></cs-extension-point></div></div></ion-content></ion-view>'),e.put("templates/join/modal_join.html",'<ion-modal-view class="modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-if="!slides.slider.activeIndex" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button> <button class="button button-icon button-clear icon ion-ios-arrow-back buttons header-item" ng-click="slidePrev()" ng-if="slides.slider.activeIndex"></button> <button class="button button-icon button-clear icon ion-ios-help-outline visible-xs" ng-if="!isLastSlide" ng-click="showHelpModal()"></button><h1 class="title" translate>ACCOUNT.NEW.TITLE</h1><button class="button button-clear icon-right visible-xs" ng-if="!isLastSlide" ng-click="doNext()"><span translate>COMMON.BTN_NEXT</span> <i class="icon ion-ios-arrow-right"></i></button> <button class="button button-clear icon-right visible-xs" ng-if="isLastSlide" ng-click="doNewAccount()"><i class="icon ion-android-send"></i></button></ion-header-bar><ion-slides options="slides.options" slider="slides.slider"><ion-slide-page><ion-content class="has-header" scroll="false"><form name="saltForm" novalidate="" ng-submit="doNext(\'saltForm\')"><div class="list" ng-init="setForm(saltForm, \'saltForm\')"><div class="item item-text-wrap text-center padding hidden-xs"><a class="pull-right icon-help" ng-click="showHelpModal(\'join-salt\')"></a> <span translate>ACCOUNT.NEW.SALT_WARNING</span></div><div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.username.$invalid}"><span class="input-label" translate>LOGIN.SALT</span> <input ng-if="!showUsername" name="username" type="password" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" ng-change="formDataChanged()" ng-model="formData.username" ng-minlength="8" required> <input ng-if="showUsername" name="username" type="text" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" ng-change="formDataChanged()" ng-model="formData.username" ng-minlength="8" required></div><div class="form-errors" ng-show="saltForm.$submitted && saltForm.username.$error" ng-messages="saltForm.username.$error"><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span></div><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.confirmSalt.$invalid}"><span class="input-label pull-right" translate>ACCOUNT.NEW.SALT_CONFIRM</span> <input ng-if="!showUsername" name="confirmUsername" type="password" placeholder="{{\'ACCOUNT.NEW.SALT_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmUsername" compare-to="formData.username"> <input ng-if="showUsername" name="confirmUsername" type="text" placeholder="{{\'ACCOUNT.NEW.SALT_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmUsername" compare-to="formData.username"></div><div class="form-errors" ng-show="saltForm.$submitted && saltForm.confirmUsername.$error" ng-messages="saltForm.confirmUsername.$error"><div class="form-error" ng-message="compareTo"><span translate="ERROR.SALT_NOT_CONFIRMED"></span></div></div><div class="item item-toggle dark"><span translate>COMMON.SHOW_VALUES</span> <label class="toggle toggle-royal"><input type="checkbox" ng-model="showUsername"><div class="track"><div class="handle"></div></div></label></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>COMMON.BTN_NEXT <i class="icon ion-arrow-right-a"></i></button></div></div></form></ion-content></ion-slide-page><ion-slide-page><ion-content class="has-header" scroll="false"><form name="passwordForm" novalidate="" ng-submit="doNext(\'passwordForm\')"><div class="item item-text-wrap text-center padding hidden-xs"><a class="pull-right icon-help" ng-click="showHelpModal(\'join-password\')"></a> <span translate>ACCOUNT.NEW.PASSWORD_WARNING</span></div><div class="list" ng-init="setForm(passwordForm, \'passwordForm\')"><div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.password.$invalid}"><span class="input-label" translate>LOGIN.PASSWORD</span> <input ng-if="!showPassword" name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-change="formDataChanged()" ng-minlength="6" required> <input ng-if="showPassword" name="text" type="text" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-change="formDataChanged()" ng-minlength="6" required></div><div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.password.$error" ng-messages="passwordForm.password.$error"><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span></div><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.confirmPassword.$invalid}"><span class="input-label" translate>ACCOUNT.NEW.PASSWORD_CONFIRM</span> <input ng-if="!showPassword" name="confirmPassword" type="password" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" compare-to="formData.password"> <input ng-if="showPassword" name="confirmPassword" type="text" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" compare-to="formData.password"></div><div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.confirmPassword.$error" ng-messages="passwordForm.confirmPassword.$error"><div class="form-error" ng-message="compareTo"><span translate="ERROR.PASSWORD_NOT_CONFIRMED"></span></div></div><div class="item item-toggle dark"><span translate>COMMON.SHOW_VALUES</span> <label class="toggle toggle-royal"><input type="checkbox" ng-model="showPassword"><div class="track"><div class="handle"></div></div></label></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>COMMON.BTN_NEXT</button></div><div class="padding hidden-xs"></div></form></ion-content></ion-slide-page><ion-slide-page><ion-content class="has-header" scroll="false"><form name="pseudoForm" novalidate="" ng-submit="doNext(\'pseudoForm\')"><div class="item item-text-wrap text-center padding hidden-xs"><span translate>PROFILE.JOIN.TITLE_WARNING</span></div><div class="list" ng-init="setForm(pseudoForm, \'pseudoForm\')"><div class="item item-input" ng-class="{\'item-input-error\': pseudoForm.$submitted && pseudoForm.pseudo.$invalid}"><span class="input-label" translate>PROFILE.TITLE</span> <input name="pseudo" type="text" placeholder="{{\'PROFILE.TITLE_HELP\' | translate}}" ng-model="formData.pseudo" ng-minlength="4" ng-maxlength="100" required></div><div class="form-errors" ng-show="pseudoForm.$submitted && pseudoForm.pseudo.$error" ng-messages="pseudoForm.pseudo.$error"><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 3}"></span></div><div class="form-error" ng-message="maxlength"><span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 100}"></span></div><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>COMMON.BTN_NEXT</button></div></div></form></ion-content></ion-slide-page><ion-slide-page><ion-content class="has-header" scroll="false"><div class="padding text-center" translate>PROFILE.JOIN.LAST_SLIDE_CONGRATULATION</div><div class="list"><ion-item class="item item-text-wrap item-border"><div class="dark pull-right padding-right" ng-if="formData.computing"><ion-spinner icon="android"></ion-spinner></div><span class="input-label" translate>COMMON.PUBKEY</span> <span class="gray text-no-wrap" ng-if="formData.computing" translate>ACCOUNT.NEW.COMPUTING_PUBKEY </span><span class="gray text-no-wrap" ng-if="formData.pubkey">{{formData.pubkey}}</span></ion-item></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-positive ink" ng-click="doNewAccount()" translate>COMMON.BTN_SEND <i class="icon ion-android-send"></i></button></div></ion-content></ion-slide-page></ion-slides></ion-modal-view>'),e.put("templates/login/modal_login.html",'<ion-modal-view class="modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button><h1 class="title" ng-bind-html="\'LOGIN.TITLE\' | translate"></h1><div class="buttons buttons-right"><span class="secondary-buttons visible-xs"><button class="button button-positive button-icon button-clear icon ion-android-done" style="color: #fff;" ng-click="doLogin()"></button></span></div></ion-header-bar><ion-content><form name="loginForm" novalidate="" ng-submit="doLogin()"><div class="list" ng-init="setForm(loginForm)"><label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.username.$invalid}"><span class="input-label hidden-xs" translate>LOGIN.SALT</span> <input ng-if="!showSalt" name="username" type="password" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" autocomplete="off" ng-model="formData.username" ng-model-options="{ debounce: 650 }" class="highlight-light" required> <input ng-if="showSalt" name="username" type="text" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" autocomplete="off" ng-model="formData.username" ng-model-options="{ debounce: 650 }" class="highlight-light" required></label><div class="form-errors" ng-show="form.$submitted && form.username.$error" ng-messages="form.username.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><div class="item item-toggle dark"><span translate>LOGIN.SHOW_SALT</span> <label class="toggle toggle-stable"><input type="checkbox" ng-model="showSalt"><div class="track"><div class="handle"></div></div></label></div><label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.password.$invalid}"><span class="input-label hidden-xs" translate>LOGIN.PASSWORD</span> <input name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-model-options="{ debounce: 650 }" select-on-click required></label><div class="form-errors" ng-show="form.$submitted && form.password.$error" ng-messages="form.password.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div></div><div class="item item-toggle dark hidden-xs"><span translate>SETTINGS.REMEMBER_ME</span> <label class="toggle toggle-calm"><input type="checkbox" ng-model="formData.rememberMe"><div class="track"><div class="handle"></div></div></label></div><div class="item item-button-right left"><span ng-if="formData.username && formData.password" class="input-label" translate>COMMON.PUBKEY</span> <a class="button button-light button-small ink animate-if" ng-click="showPubkey()" ng-if="showPubkeyButton">{{\'COMMON.BTN_SHOW_PUBKEY\' | translate}}</a><h3 class="gray text-no-wrap" ng-if="!computing">{{pubkey}}</h3><h3 ng-if="computing"><ion-spinner icon="android"></ion-spinner></h3></div></div><div class="padding hidden-xs text-right"><button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL</button> <button class="button button-positive ink" type="submit">{{\'COMMON.BTN_LOGIN\' | translate}}</button></div><div class="text-center no-padding">{{\'LOGIN.NO_ACCOUNT_QUESTION\'|translate}}<br class="visible-xs"><a ng-click="showJoinModal()" translate>LOGIN.CREATE_ACCOUNT</a></div><div class="text-center no-padding"><a ng-click="showAccountSecurityModal()" translate>LOGIN.FORGOTTEN_ID</a></div></form></ion-content></ion-modal-view>'),e.put("templates/menu.html",'<ion-side-menus enable-menu-with-back-views="true" bind-notifier="{locale:$root.settings.locale.id}"><ion-side-menu-content><ion-nav-bar class="bar-dark" title-align="left"><ion-nav-back-button class="no-text"></ion-nav-back-button><ion-nav-buttons side="left"><button class="button button-bar button-clear visible-nomenu" menu-toggle="left"><i class="icon ion-navicon"></i></button></ion-nav-buttons><ion-nav-buttons side="right"><cs-extension-point name="nav-buttons-right"></cs-extension-point><a id="helptip-header-bar-btn-profile" class="button button-icon button-clear hidden-xs hidden-sm" ng-click="showProfilePopover($event)"><i class="avatar avatar-member" ng-if="!$root.walletData.avatar" ng-class="{\'disable\': !login, \'royal-bg\': login}"></i> <i class="avatar" ng-if="$root.walletData.avatar" style="background-image: url(\'{{$root.walletData.avatar.src}}\')"></i></a></ion-nav-buttons></ion-nav-bar><ion-nav-view name="menuContent"></ion-nav-view></ion-side-menu-content><ion-side-menu id="menu" side="left" expose-aside-when="(min-width: 768px)" enable-menu-with-back-views="false" width="225"><ion-header-bar><h1 class="title dark hidden-sm hidden-xs" translate>COMMON.APP_NAME</h1><div class="visible-sm visible-xs hero"><div class="content"><i class="avatar avatar-member hero-icon" ng-if="!$root.walletData.avatar" ng-class="{\'royal-bg\': login, \'stable-bg\': !login}" ng-click="!login ? showHome() : loginAndGo(\'app.view_wallet\')" menu-close></i> <i class="avatar hero-icon" ng-if="$root.walletData.avatar" style="background-image: url(\'{{$root.walletData.avatar.src}}\')" ng-click="loginAndGo(\'app.view_wallet\')" menu-close></i><h4 ng-if="login"><a class="light" ui-sref="app.view_wallet" menu-close>{{$root.walletData.name||$root.walletData.uid}} <span ng-if="!$root.walletData.name && !$root.walletData.uid"><i class="icon ion-key"></i> {{$root.walletData.pubkey|formatPubkey}}</span></a></h4><h4 ng-if="!login"><a class="light" ui-sref="app.view_wallet" menu-close>{{\'COMMON.BTN_LOGIN\'|translate}} <i class="ion-arrow-right-b"></i></a></h4><cs-extension-point name="menu-profile-user"></cs-extension-point></div></div><a ng-if="::$root.device.isWeb()" ng-click="toggleFullscreen()" class="button-icon visible-sm visible-xs" style="position: absolute; top: 5px; right: 5px; z-index: 999;"><i class="icon ion-arrow-expand" ng-class="{\'ion-arrow-shrink\': fullscreen}"></i></a></ion-header-bar><ion-content scroll="false" class="scroll-content ionic-scroll" ng-class="{\'overflow-scroll\': smallscreen, \'scroll-content-false\': !smallscreen}"><ion-list class="list" ng-class="{\'scroll\': smallscreen}"><ion-item menu-close class="item-icon-left" ui-sref="app.home" active-link="active"><i class="icon ion-home"></i> {{:locale:\'MENU.HOME\'|translate}}</ion-item><div class="item item-divider"></div><cs-extension-point name="menu-main"></cs-extension-point><div class="item item-divider"></div><a menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/wallet" ui-sref="app.view_wallet" ng-class="{\'item-menu-disable\': !login}"><i class="icon ion-person"></i> {{:locale:\'MENU.ACCOUNT\'|translate}} </a><a id="helptip-menu-btn-account"></a><cs-extension-point name="menu-user"></cs-extension-point><div class="item-spacer hidden-readonly"></div><div class="item item-divider visible-xs visible-sm"></div><a menu-close class="item item-icon-left" id="helptip-menu-btn-wot" active-link="active" active-link-path-prefix="#/app/user" ui-sref="app.user_lookup"><i class="icon ion-person-stalker"></i> {{:locale:\'MENU.WOT\'|translate}}</a><cs-extension-point name="menu-discover"></cs-extension-point><div class="item item-divider visible-xs visible-sm"></div><a menu-close class="item item-icon-left visible-xs visible-sm" active-link="active" active-link-path-prefix="#/app/help" ui-sref="app.help"><i class="icon ion-ios-help-outline"></i> {{:locale:\'HOME.BTN_HELP\'|translate}} </a><a menu-close class="item item-icon-left visible-xs visible-sm" active-link="active" active-link-path-prefix="#/app/settings" ui-sref="app.settings"><i class="icon ion-android-settings"></i> {{:locale:\'MENU.SETTINGS\'|translate}} </a><a id="helptip-menu-btn-settings"></a><div class="item item-divider visible-xs visible-sm margin-top" ng-if="login"></div><a menu-close ng-if="login" class="item item-icon-left visible-xs visible-sm" ng-click="logout({askConfirm: true})"><i class="icon ion-log-out assertive"></i> <span class="assertive" translate>{{:locale:\'COMMON.BTN_LOGOUT\'|translate}}</span></a></ion-list></ion-content><ion-footer-bar class="bar-stable footer hidden-xs hidden-sm"><a class="pull-left icon-help" menu-toggle="left" title="{{:locale:\'HOME.BTN_HELP\'|translate}}" ui-sref="app.help"></a> <a class="title gray" ng-click="showAboutModal()" title="{{:locale:\'HOME.BTN_ABOUT\'|translate}}"><span ng-class="{\'assertive\': $root.newRelease}"><i ng-if="$root.newRelease" class="ion-alert-circled assertive"></i> {{:locale:\'COMMON.APP_VERSION\'|translate:{version: config.version} }} </span>| <span translate>HOME.BTN_ABOUT</span></a></ion-footer-bar></ion-side-menu></ion-side-menus>'),e.put("templates/modal_about.html",'<ion-modal-view class="about"><ion-header-bar class="bar-positive"><button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CLOSE</button><h1 class="title" translate>ABOUT.TITLE</h1></ion-header-bar><ion-content class="text-center" scroll="true"><div class="list item-wrap-text"><ion-item class="item-icon-left item-text-wrap"><ng-bind-html ng-bind-html="\'COMMON.APP_NAME\'|translate"></ng-bind-html> <b>{{\'COMMON.APP_VERSION\'|translate:$root.config}}</b> <i ng-if="$root.newRelease" class="assertive ion-alert-circled"></i><h3 ng-if="$root.config.build" class="gray">{{\'COMMON.APP_BUILD\'|translate:$root.config}}</h3><span translate>ABOUT.LICENSE</span></ion-item><ion-item class="item-icon-left" ng-if="$root.newRelease"><i class="item-image icon ion-alert-circled assertive"></i> <span ng-if="!$root.device.isWeb()" ng-bind-html="\'ABOUT.PLEASE_UPDATE\' | translate:$root.newRelease "></span> <span ng-if="$root.device.isWeb()" ng-bind-html="\'ABOUT.LATEST_RELEASE\' | translate:$root.newRelease "></span><h3 ng-if="!$root.device.enable"><a ng-click="openLink($event, $root.newRelease.url)" translate>{{::$root.newRelease.url}}</a></h3></ion-item><div class="item item-icon-left"><i class="item-image icon ion-social-github"></i> {{\'ABOUT.CODE\' | translate}}<h3><a ng-click="openLink($event, \'https://github.com/duniter-gchange/gchange-client\')">https://github.com/duniter-gchange/gchange-client</a></h3></div><div class="item item-icon-left"><i class="item-image icon ion-chatbubbles"></i> {{\'ABOUT.FORUM\' | translate}}<h3><a ng-click="openLink($event, $root.settings.userForumUrl)">{{::$root.settings.userForumUrl}}</a></h3></div><div class="item item-icon-left"><i class="item-image icon ion-person-stalker"></i> {{\'ABOUT.DEVELOPERS\' | translate}}<h3><a ng-click="openLink($event, \'https://github.com/blavenie\')">Benoit Lavenier</a></h3></div><ion-item class="item item-icon-left item-text-wrap"><i class="item-image icon ion-bug"></i><h2>{{\'ABOUT.DEV_WARNING\'|translate}}</h2><span translate>ABOUT.DEV_WARNING_MESSAGE</span><br><a ng-click="openLink($event, $root.settings.newIssueUrl)" translate>ABOUT.REPORT_ISSUE</a></ion-item><div class="padding hidden-xs text-center"><button class="button button-positive ink" type="submit" ng-click="closeModal()">{{\'COMMON.BTN_CLOSE\' | translate}}</button></div></div></ion-content></ion-modal-view>'),e.put("templates/settings/popover_actions.html",'<ion-popover-view class="fit has-header"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink visible-xs visible-sm" ng-click="reset()"><i class="icon ion-refresh"></i> {{\'SETTINGS.BTN_RESET\' | translate}} </a><a class="item item-icon-left ink" ng-click="startSettingsTour()"><i class="icon ion-easel"></i> {{\'COMMON.BTN_HELP_TOUR_SCREEN\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("templates/settings/popup_node.html",'<form name="popupForm" ng-submit=""><div class="list no-padding" ng-init="setPopupForm(popupForm)"><div class="item item-input item-floating-label" ng-class="{\'item-input-error\': popupForm.$submitted && popupForm.newNode.$invalid}"><span class="input-label" ng-bind-html="\'SETTINGS.POPUP_PEER.HOST\'|translate"></span> <input name="newNode" type="text" placeholder="{{\'SETTINGS.POPUP_PEER.HOST_HELP\' | translate}}" ng-model="popupData.newNode" ng-minlength="3" required></div><div class="form-errors" ng-if="popupForm.$submitted && popupForm.newNode.$error" ng-messages="popupForm.newNode.$error"><div class="form-error" ng-message="required"><span translate="ERROR.FIELD_REQUIRED"></span></div><div class="form-error" ng-message="minlength"><span translate="ERROR.FIELD_TOO_SHORT"></span></div></div><div class="item item-toggle"><span class="input-label">{{\'SETTINGS.POPUP_PEER.USE_SSL\' | translate}}</span><h4><small class="gray" ng-bind-html="\'SETTINGS.POPUP_PEER.USE_SSL_HELP\' | translate"></small></h4><label class="toggle toggle-royal no-padding-right"><input type="checkbox" ng-model="popupData.useSsl"><div class="track"><div class="handle"></div></div></label></div><a class="button button-positive button-clear positive button-outline button-full button-small-padding icon-left ink no-padding" ng-click="showNodeList()"><i class="icon ion-search"></i> {{\'SETTINGS.POPUP_PEER.BTN_SHOW_LIST\' | translate}}</a></div><button type="submit" class="hide"></button></form>'),e.put("templates/settings/settings.html",'<ion-view left-buttons="leftButtons" cache-view="false" class="settings"><ion-nav-title translate>SETTINGS.TITLE</ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)"></button></ion-nav-buttons><ion-content><div class="padding text-center hidden-xs hidden-sm"><button class="button button-raised button-stable ink" ng-click="reset()"><i class="icon ion-refresh"></i> {{\'SETTINGS.BTN_RESET\' | translate}}</button></div><div class="row no-padding responsive-sm responsive-md responsive-lg"><div class="col col-50 list item-border-large padding-left padding-right no-padding-xs no-padding-sm" style="margin-bottom: 2px;"><span class="item item-divider" translate>SETTINGS.DISPLAY_DIVIDER</span> <label class="item item-input item-select"><div class="input-label" translate>COMMON.LANGUAGE</div><select ng-model="formData.locale" ng-change="changeLanguage(formData.locale.id)" ng-options="l as l.label for l in locales track by l.id"></select></label><div class="item item-toggle dark"><div class="input-label">{{\'COMMON.BTN_RELATIVE_UNIT\' | translate}}</div><label class="toggle toggle-royal" id="helptip-settings-btn-unit-relative"><input type="checkbox" ng-model="formData.useRelative"><div class="track"><div class="handle"></div></div></label></div><span class="item item-divider" translate>SETTINGS.STORAGE_DIVIDER</span><div class="item item-text-wrap item-toggle dark"><div class="input-label">{{\'SETTINGS.USE_LOCAL_STORAGE\' | translate}}</div><h4 class="gray" ng-bind-html="\'SETTINGS.USE_LOCAL_STORAGE_HELP\' | translate"></h4><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.useLocalStorage"><div class="track"><div class="handle"></div></div></label></div><div class="item item-text-wrap item-toggle dark"><div class="input-label" ng-class="{\'gray\': !formData.useLocalStorage}" ng-bind-html="\'SETTINGS.PERSIST_CACHE\' | translate"></div><h4 class="gray" ng-bind-html="\'SETTINGS.PERSIST_CACHE_HELP\' | translate"></h4><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.persistCache" ng-if="formData.useLocalStorage"> <input type="checkbox" ng-model="formData.useLocalStorage" ng-if="!formData.useLocalStorage" disabled="disabled"><div class="track"><div class="handle"></div></div></label></div><cs-extension-point name="common"></cs-extension-point><span class="item item-divider">{{\'SETTINGS.AUTHENTICATION_SETTINGS\' | translate}}</span><div class="item item-toggle item-text-wrap"><div class="input-label" ng-class="{\'gray\': !formData.useLocalStorage}">{{\'SETTINGS.REMEMBER_ME\' | translate}}</div><h4 class="gray text-wrap" ng-bind-html="\'SETTINGS.REMEMBER_ME_HELP\' | translate"></h4><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.rememberMe" ng-if="formData.useLocalStorage"> <input type="checkbox" ng-model="formData.useLocalStorage" ng-if="!formData.useLocalStorage" disabled="disabled"><div class="track"><div class="handle"></div></div></label></div></div><div class="col col-50 list item-border-large padding-left padding-right no-padding-xs no-padding-sm no-margin-xs no-margin-sm"><span class="item item-divider" translate>SETTINGS.NETWORK_SETTINGS</span><div class="item ink item-text-wrap item-icon-right hidden-xs hidden-sm" ng-click="changeNode()"><div class="input-label" translate>SETTINGS.PEER</div><ng-if ng-if="formData.node.temporary"><h4 class="gray text-wrap assertive"><i class="icon ion-alert-circled"></i> <span ng-bind-html="\'SETTINGS.PEER_CHANGED_TEMPORARY\' | translate "></span></h4><div class="item-note assertive text-italic">{{bma.server}}</div></ng-if><div class="badge badge-balanced" ng-if="!formData.node.temporary">{{bma.server}}</div><i class="icon ion-ios-arrow-right"></i></div><ion-item class="ink item-icon-right visible-xs visible-sm" ng-click="changeNode()"><div class="input-label hidden-xs" translate>SETTINGS.PEER</div><div class="input-label visible-xs" translate>SETTINGS.PEER_SHORT</div><ng-if ng-if="formData.node.temporary"><h4 class="gray text-wrap assertive"><b class="ion-alert-circled"></b> <span ng-bind-html="\'SETTINGS.PEER_CHANGED_TEMPORARY\' | translate "></span></h4><div class="badge badge-assertive">{{bma.server}}</div></ng-if><div class="badge badge-balanced" ng-if="!formData.node.temporary">{{bma.server}}</div><i class="icon ion-ios-arrow-right"></i></ion-item><div class="item item-text-wrap item-toggle dark"><div class="input-label" ng-bind-html="\'SETTINGS.EXPERT_MODE\' | translate"></div><h4 class="gray" ng-bind-html="\'SETTINGS.EXPERT_MODE_HELP\' | translate"></h4><label class="toggle toggle-royal"><input type="checkbox" ng-model="formData.expertMode"><div class="track"><div class="handle"></div></div></label></div><cs-extension-point name="network"></cs-extension-point><span class="item item-divider" ng-if="$root.config.plugins" translate>SETTINGS.PLUGINS_SETTINGS</span><cs-extension-point name="plugins"></cs-extension-point></div></div></ion-content></ion-view>'),e.put("templates/wallet/popover_actions.html",'<ion-popover-view class="fit has-header popover-wallet-actions"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink visible-xs visible-sm" ng-click="showSharePopover($event)"><i class="icon ion-android-share-alt"></i> {{\'COMMON.BTN_SHARE\' | translate}} </a><a class="item item-icon-left ink" ng-if="walletData.requirements.needSelf" ng-click="self()"><i class="icon ion-flag"></i> {{\'ACCOUNT.BTN_SEND_IDENTITY_DOTS\' | translate}} </a><a class="item item-icon-left ink visible-xs visible-sm" ng-if="walletData.requirements.needMembership" ng-click="membershipIn()"><i class="icon ion-person"></i> {{\'ACCOUNT.BTN_MEMBERSHIP_IN_DOTS\' | translate}} </a><a class="item item-icon-left ink hidden-xs hidden-sm" ng-class="{\'gray\':!walletData.requirements.needMembership}" ng-click="membershipIn()"><i class="icon ion-person"></i> {{\'ACCOUNT.BTN_MEMBERSHIP_IN_DOTS\' | translate}} </a><a class="item item-icon-left ink visible-xs visible-sm" ng-if="walletData.requirements.needRenew" ng-click="renewMembership()"><i class="icon ion-loop"></i> {{\'ACCOUNT.BTN_MEMBERSHIP_RENEW_DOTS\' | translate}} </a><a class="item item-icon-left ink hidden-xs hidden-sm" ng-class="{\'gray\':!walletData.requirements.needRenew}" ng-click="renewMembership()"><i class="icon ion-loop"></i> {{\'ACCOUNT.BTN_MEMBERSHIP_RENEW_DOTS\' | translate}} </a><a class="item item-icon-left assertive ink" ng-if="walletData.requirements.canMembershipOut" ng-click="membershipOut()"><i class="icon ion-log-out"></i> {{\'ACCOUNT.BTN_MEMBERSHIP_OUT_DOTS\' | translate}} </a><a class="item item-icon-left ink" ng-click="showSecurityModal()"><i class="icon ion-android-lock"></i> <span ng-bind-html="\'ACCOUNT.BTN_SECURITY_DOTS\' | translate"></span></a><div class="item-divider hidden-sm hidden-xs"></div><a class="item item-icon-left ink hidden-sm hidden-xs" ng-click="startWalletTour()"><i class="icon ion-easel"></i> {{\'COMMON.BTN_HELP_TOUR_SCREEN\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("templates/wallet/popover_unit.html",'<ion-popover-view class="popover-unit"><ion-content scroll="false"><div class="list"><a class="item item-icon-left" ng-class="{ \'selected\': !formData.useRelative}" ng-click="closePopover(false)"><i class="icon" ng-class="{ \'ion-ios-checkmark-empty\': !formData.useRelative}"></i> <i ng-bind-html="$root.currency.name | currencySymbol:false"></i> </a><a class="item item-icon-left" ng-class="{ \'selected\': formData.useRelative}" ng-click="closePopover(true)"><i class="icon" ng-class="{ \'ion-ios-checkmark-empty\': formData.useRelative}"></i> <i ng-bind-html="$root.currency.name | currencySymbol:true"></i></a></div></ion-content></ion-popover-view>'),e.put("templates/wallet/view_wallet.html",'<ion-view left-buttons="leftButtons" class="view-wallet" id="wallet"><ion-nav-title></ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="doUpdate()"></button><cs-extension-point name="nav-buttons"></cs-extension-point></ion-nav-buttons><ion-content scroll="true" bind-notifier="{ rebind:settings.useRelative, locale:$root.settings.locale.id}"><div class="positive-900-bg hero" id="wallet-header" ng-class="{\'hero-qrcode-active\': toggleQRCode}"><div class="content" ng-if="!loading"><i class="avatar avatar-member" ng-if=":rebind:!formData.avatar"></i> <i class="avatar" ng-if=":rebind:formData.avatar" style="background-image: url({{:rebind:formData.avatar.src}})"></i><ng-if ng-if=":rebind:formData.name"><h3 class="light">{{:rebind:formData.name}}</h3></ng-if><cs-extension-point name="hero"></cs-extension-point></div><h4 class="content light" ng-if="loading"><ion-spinner icon="android"></ion-spinner></h4></div><a id="wallet-share-anchor"></a><div class="hidden-xs hidden-sm padding text-center" ng-if="!loading"><button class="button button-stable button-small-padding icon ion-android-share-alt ink" ng-click="showSharePopover($event)" title="{{\'COMMON.BTN_SHARE\' | translate}}"></button> <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doUpdate()" title="{{\'COMMON.BTN_REFRESH\' | translate}}"></button><cs-extension-point name="buttons"></cs-extension-point> <div ng-if="formData.requirements.needRenew"><br><button class="button button-raised button-stable ink" ng-click="renewMembership()"><span class="assertive">{{:locale:\'ACCOUNT.BTN_MEMBERSHIP_RENEW\' | translate}}</span></button></div></div><div class="visible-xs visible-sm padding text-center" ng-if="!loading"><button class="button button-assertive button-small-padding ink" ng-click="logout({askConfirm: true})"><i class="icon ion-log-out"></i> {{\'COMMON.BTN_LOGOUT\' | translate}}</button></div><div class="row no-padding"><div class="col col-20 hidden-xs hidden-sm"> </div><div class="col"><div class="list" ng-class="::motion.ionListClass" ng-hide="loading"><span class="item item-divider" translate>WOT.GENERAL_DIVIDER</span><cs-extension-point name="general"></cs-extension-point><cs-extension-point name="after-general"></cs-extension-point></div></div><div class="col col-20 hidden-xs hidden-sm"> </div></div></ion-content></ion-view>'),e.put("templates/wot/identity.html",'<i ng-if="::!identity.avatar" class="item-image icon ion-person"></i> <i ng-if="::identity.avatar" class="item-image avatar" style="background-image: url({{::identity.avatar.src}})"></i><h2><span ng-bind-html="::identity.name"></span></h2><h4 class="gray" ng-class="{\'pull-right\': !smallscreen}" ng-if="identity.profile.creationTime"><i class="ion-clock"></i> {{::\'WOT.LOOKUP.REGISTERED\' | translate: {time: identity.profile.creationTime } }}</h4><h4 class="gray"><span class="positive" ng-if="::identity.city"><i class="ion-location"></i> {{::identity.city}} </span></h4><h4 ng-if="::identity.events||identity.tags"><span ng-repeat="event in ::identity.events" class="assertive"><i class="ion-alert-circled" ng-if="::!identity.valid"></i> <span ng-bind-html="::event.message|translate:event.messageParams"></span> </span><span ng-if="::identity.tags" class="dark"><ng-repeat ng-repeat="tag in ::identity.tags">#<ng-bind-html ng-bind-html="::tag"></ng-bind-html></ng-repeat></span></h4>'),
|
||
e.put("templates/wot/lookup_form.html",'<div class="lookupForm"><div class="item no-padding"><div class="double-padding-x padding-top-xs item-text-wrap" ng-if="::allowMultiple" style="height: 36px;"><div class="gray padding-top" ng-if="!selection.length && parameters.help">{{::parameters.help|translate}}</div><div ng-repeat="identity in selection track by identity.id" class="button button-small button-text button-stable button-icon-event ink" ng-class="{\'button-text-positive\': identity.selected}"><span ng-bind-html="identity.name||identity.uid||(identity.pubkey|formatPubkey)"></span> <i class="icon ion-close" ng-click="removeSelection(identity, $event)"> </i></div></div><div class="item-input"><i class="icon ion-search placeholder-icon"></i> <input type="text" class="visible-xs visible-sm" placeholder="{{\'WOT.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()"> <input type="text" class="hidden-xs hidden-sm" id="{{wotSearchTextId}}" placeholder="{{\'WOT.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearchText()"><div class="helptip-anchor-center"><a id="helptip-wot-search-text"></a></div></div></div><div class="padding-top padding-xs" style="display: block; height: 60px;" ng-class="::{\'hidden-xs\': !showResultLabel}"><div class="pull-left" ng-if="!search.loading && showResultLabel"><h4 ng-if="search.type==\'newcomers\'" translate>WOT.LOOKUP.NEWCOMERS</h4><h4 ng-if="search.type==\'text\'" translate>COMMON.RESULTS_LIST</h4></div><div class="pull-right hidden-xs hidden-sm"><a ng-if="enableFilter" class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.type==\'newcomers\'}" ng-click="doGetNewcomers()"><i class="icon ion-person-stalker"></i> {{\'WOT.LOOKUP.BTN_NEWCOMERS\' | translate}} </a> <button class="button button-small button-stable ink" ng-click="doSearch()">{{\'COMMON.BTN_SEARCH\' | translate}}</button> <button class="button button-small button-positive {{parameters.okType}} ink" ng-if="::allowMultiple" ng-disabled="!selection.length" ng-click="next()">{{parameters.okText||\'COMMON.BTN_NEXT\' | translate}}</button></div></div><div class="text-center" ng-if="search.loading"><p class="gray" ng-if="::$root.currency.initPhase" translate>WOT.SEARCH_INIT_PHASE_WARNING</p><ion-spinner icon="android"></ion-spinner></div><ng-if ng-if="!search.loading"><div class="assertive padding" ng-if="!search.results.length"><span ng-if="search.type==\'text\'" translate>COMMON.SEARCH_NO_RESULT</span> <span ng-if="search.type==\'newcomers\'" translate>WOT.LOOKUP.NO_NEWCOMERS</span></div><div ng-if="!allowMultiple" class="list {{::motion.ionListClass}}"><div ng-repeat="identity in search.results" id="helptip-wot-search-result-{{$index}}" class="item item-border-large item-avatar item-icon-right ink" ng-click="::select(identity)"><ng-include src="\'templates/wot/identity.html\'"></ng-include><i class="icon ion-ios-arrow-right"></i></div></div><div ng-if="::allowMultiple" class="list {{::motion.ionListClass}}"><ion-checkbox ng-repeat="identity in search.results" ng-model="identity.checked" class="item item-border-large item-avatar ink" ng-click="toggleCheck($index, $event)"><ng-include src="\'templates/wot/identity.html\'"></ng-include></ion-checkbox></div><ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="2%"></ion-infinite-scroll></ng-if></div>'),e.put("templates/wot/lookup_popover_actions.html",'<ion-popover-view class="fit has-header visible-sm visible-xs"><ion-header-bar><h1 class="title" translate>COMMON.POPOVER_FILTER_TITLE</h1></ion-header-bar><ion-content scroll="false"><div class="list item-text-wrap"><a class="item item-icon-left ink" ng-click="doGetNewcomers()"><i class="icon ion-person"></i> {{\'WOT.LOOKUP.BTN_NEWCOMERS\' | translate}} </a><a class="item item-icon-left ink" ng-click="doGetPending()"><i class="icon ion-clock"></i> {{\'WOT.LOOKUP.BTN_PENDING\' | translate}}</a></div></ion-content></ion-popover-view>'),e.put("templates/wot/lookup.html",'<ion-view><ion-nav-title>{{\'WOT.LOOKUP.TITLE\' | translate}}</ion-nav-title><ion-nav-buttons side="secondary"><button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)"><i class="icon ion-android-funnel"></i></button></ion-nav-buttons><ion-content class="padding no-padding-xs" scroll="true"><ng-include src="\'templates/wot/lookup_form.html\'"></ion-content></ion-view>'),e.put("templates/wot/modal_lookup.html",'<ion-modal-view id="wotLookup" class="modal-full-height"><ion-header-bar class="bar-positive"><button class="button button-clear" ng-click="closeModal()" translate="">COMMON.BTN_CANCEL</button><h1 class="title hidden-xs">{{::parameters.title?parameters.title:\'WOT.MODAL.TITLE\'|translate}}</h1><button class="button button-clear icon-right visible-xs ink" ng-if="allowMultiple && selection.length" ng-click="closeModal(selection)">{{::parameters.okText||\'COMMON.BTN_NEXT\' | translate}} <i ng-if="::!parameters.okText||parameters.okIcon" class="icon {{::parameters.okIcon||\'ion-ios-arrow-right\'}}"></i></button></ion-header-bar><ion-content class="padding no-padding-xs no-padding-sm" scroll="true"><div class="visible-xs visible-sm text-right stable-bg stable"><button class="button button-icon button-small-padding dark ink" ng-click="showActionsPopover($event)"><i class="icon ion-android-funnel"></i></button></div><ng-include src="\'templates/wot/lookup_form.html\'"></ng-include></ion-content></ion-modal-view>'),e.put("templates/wot/view_identity_tx.html",'<ion-view left-buttons="leftButtons"><ion-nav-title><span class="visible-xs visible-sm">{{::formData.name||formData.uid}}</span> <span class="hidden-xs hidden-sm" ng-if="!loading" translate="WOT.OPERATIONS.TITLE" translate-values="{uid: formData.name || formData.uid}"></span></ion-nav-title><ion-content><div class="hidden-xs hidden-sm padding text-center" ng-if="!loading"><button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doUpdate()" title="{{\'COMMON.BTN_REFRESH\' | translate}}"></button> <button class="button button-stable button-small-padding icon ion-android-download ink" ng-click="downloadHistoryFile()" title="{{\'COMMON.BTN_DOWNLOAD_ACCOUNT_STATEMENT\' | translate}}"></button><cs-extension-point name="buttons"></cs-extension-point></div><div class="center padding" ng-if="loading"><ion-spinner icon="android"></ion-spinner></div><div class="list {{motion.ionListClass}}" ng-if="!loading"><div class="row"><div class="col col-15 hidden-xs hidden-sm"> </div><div class="col"><div class="item item-divider item-tx">{{\'ACCOUNT.BALANCE_ACCOUNT\'|translate}}<div class="badge badge-balanced">{{balance|formatAmount}} <span ng-bind-html="$root.currency.name|currencySymbol"></span></div></div><span class="item item-divider" ng-if="!loading">{{:locale:\'ACCOUNT.LAST_TX\'|translate}} <a id="helptip-wallet-tx" style="position: relative; bottom: 0; right: 0px;"> </a></span><div class="item item-tx item-icon-left" ng-repeat="tx in history" ng-include="\'templates/wallet/item_tx.html\'"></div><div class="item item-text-wrap text-center" ng-if="tx.fromTime > 0"><p><a ng-click="showMoreTx()">{{:locale:\'ACCOUNT.SHOW_MORE_TX\'|translate}}</a> <span class="gray" translate="ACCOUNT.TX_FROM_DATE" translate-values="{fromTime: tx.fromTime}"></span> <span class="gray">|</span> <a ng-click="showMoreTx(-1)" translate>ACCOUNT.SHOW_ALL_TX</a></p></div></div><div class="col col-15 hidden-xs hidden-sm"> </div></div></div></ion-content></ion-view>'),e.put("templates/wot/view_identity.html",'<ion-view left-buttons="leftButtons" class="view-identity"><ion-nav-title></ion-nav-title><ion-content scroll="true" class="refresher-top-bg"><ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()"></ion-refresher><div class="hero dark-bg" ng-class="{\'positive-900-bg\': !loading && formData.isMember}"><div class="content" ng-if="!loading"><i class="avatar" ng-if=":rebind:!formData.avatar" ng-class="{\'avatar-wallet\': !formData.isMember, \'avatar-member\': formData.isMember}"></i> <i class="avatar" ng-if=":rebind:formData.avatar" style="background-image: url({{::formData.avatar.src}})"></i><ng-if ng-if=":rebind:formData.name" title="{{:rebind:formData.name}}"><h3 class="light">{{:rebind:formData.name|truncText: 30}}</h3></ng-if><ng-if ng-if=":rebind:!formData.name"><h3 class="light"><i class="ion-key"></i> {{::formData.pubkey | formatPubkey}}</h3></ng-if><cs-extension-point name="hero"></cs-extension-point></div><h4 class="content light" ng-if="loading"><ion-spinner icon="android"></ion-spinner></h4></div><a id="wot-share-anchor-{{::formData.pubkey}}"></a><div class="hidden-xs hidden-sm padding text-center"><button class="button button-stable button-small-padding icon ion-android-share-alt ink" ng-click="showSharePopover($event)" title="{{\'COMMON.BTN_SHARE\' | translate}}"></button><cs-extension-point name="buttons"></cs-extension-point></div><div class="row no-padding"><div class="visible-xs visible-sm"><cs-extension-point name="buttons-top-fab"></cs-extension-point></div><div class="col col-20 hidden-xs hidden-sm"> </div><div class="col list" ng-class="::motion.ionListClass" bind-notifier="{ rebind:loading}"><span class="item item-divider" translate>WOT.GENERAL_DIVIDER</span><div class="item item-text-wrap item-icon-left item-wallet-event assertive" ng-repeat="event in :rebind:formData.events | filter: {type: \'error\'}"><i class="icon ion-alert-circled"></i> <span trust-as-html="event.message | translate:event.messageParams"></span></div><cs-extension-point name="general"></cs-extension-point><cs-extension-point name="after-general"></cs-extension-point></div><div class="col col-20 hidden-xs hidden-sm"> </div></div></ion-content></ion-view>')}]),angular.module("cesium.translations",[]).config(["$translateProvider",function(e){e.translations("en-GB",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"build {{build}}",PUBKEY:"Public key",MEMBER:"Member",BLOCK:"Block",BTN_OK:"OK",BTN_YES:"Yes",BTN_NO:"No",BTN_SEND:"Send",BTN_SEND_MONEY:"Transfer money",BTN_SEND_MONEY_SHORT:"Transfer",BTN_SAVE:"Save",BTN_YES_SAVE:"Yes, Save",BTN_YES_CONTINUE:"Yes, Continue",BTN_SHOW:"Show",BTN_SHOW_PUBKEY:"Show key",BTN_RELATIVE_UNIT:"Display amounts in UD?",BTN_BACK:"Back",BTN_NEXT:"Next",BTN_IMPORT:"Import",BTN_CANCEL:"Cancel",BTN_CLOSE:"Close",BTN_COPY:"Copy",BTN_LATER:"Later",BTN_LOGIN:"Sign In",BTN_LOGOUT:"Logout",BTN_ADD_ACCOUNT:"New Account",BTN_SHARE:"Share",BTN_EDIT:"Edit",BTN_DELETE:"Delete",BTN_ADD:"Add",BTN_SEARCH:"Search",BTN_REFRESH:"Refresh",BTN_RETRY:"Retry",BTN_START:"Start",BTN_CONTINUE:"Continue",BTN_CREATE:"Create",BTN_UNDERSTOOD:"I understand",BTN_OPTIONS:"Options",BTN_HELP_TOUR:"Features tour",BTN_HELP_TOUR_SCREEN:"Discover this screen",BTN_DOWNLOAD:"Download",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Download account statement",BTN_MODIFY:"Modify",CHOOSE_FILE:"Drag your file<br/>or click to select",DAYS:"days",NO_ACCOUNT_QUESTION:"Not a member yet? Register now!",SEARCH_NO_RESULT:"No result found",LOADING:"Loading...",LOADING_WAIT:"Loading...<br/><small>(Waiting for node availability)</small>",SEARCHING:"Searching...",FROM:"From",TO:"To",COPY:"Copy",LANGUAGE:"Language",UNIVERSAL_DIVIDEND:"Universal dividend",UD:"UD",DATE_PATTERN:"DD/MM/YYYY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"DD/MM/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(empty)",UID:"Pseudonym",ENABLE:"Enabled",DISABLE:"Disabled",RESULTS_LIST:"Results:",RESULTS_COUNT:"{{count}} results",EXECUTION_TIME:"executed in {{duration|formatDurationMs}}",SHOW_VALUES:"Display values openly?",POPOVER_ACTIONS_TITLE:"Options",POPOVER_FILTER_TITLE:"Filters",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit at {{limit}})",POPOVER_SHARE:{TITLE:"Share",SHARE_ON_TWITTER:"Share on Twitter",SHARE_ON_FACEBOOK:"Share on Facebook",SHARE_ON_DIASPORA:"Share on Diaspora*",SHARE_ON_MASTODON:"Share on Mastodon",INSTANCE_ADDRESS_HELP:"Enter an intance address (ex: https://framapiaf.org):"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Size:",VALIDATING:"Validating..."}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Choose source:",BTN_PICTURE_GALLERY:"Gallery",BTN_PICTURE_CAMERA:"<b>Camera</b>"},MENU:{HOME:"Home",WOT:"Registry",CURRENCY:"Currency",ACCOUNT:"My Account",WALLETS:"My wallets",TRANSFER:"Transfer",SCAN:"Scan",SETTINGS:"Settings",NETWORK:"Network",TRANSACTIONS:"My transactions"},ABOUT:{TITLE:"About",LICENSE:"<b>Free/libre software</b> (License GNU AGPLv3).",LATEST_RELEASE:"There is a <b>newer version</ b> of {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)",PLEASE_UPDATE:"Please update {{'COMMON.APP_NAME' | translate}} (latest version: <b>v{{version}}</b>)",CODE:"Source code:",OFFICIAL_WEB_SITE:"Official web site:",DEVELOPERS:"Developers:",FORUM:"Forum:",DEV_WARNING:"Warning",DEV_WARNING_MESSAGE:"This application is still in active development.<br/>Please report any issue to us!",DEV_WARNING_MESSAGE_SHORT:"This App is still unstable (still under development).",REPORT_ISSUE:"Report an issue"},HOME:{TITLE:"Cesium",MESSAGE:"Welcome to the {{'COMMON.APP_NAME'|translate}} Application!",MESSAGE_CURRENCY:"Make exchanges in the libre currency {{currency|abbreviate}}!",BTN_CURRENCY:"Explore currency",BTN_ABOUT:"about",BTN_HELP:"Help",REPORT_ISSUE:"Report an issue",NOT_YOUR_ACCOUNT_QUESTION:'You do not own the account <b><i class="ion-key"></i> {{pubkey|formatPubkey}}</b>?',BTN_CHANGE_ACCOUNT:"Disconnect this account",CONNECTION_ERROR:'Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change node <a class="positive" ng-click="doQuickFix(\'settings\')">in the settings</a>.',SHOW_ALL_FEED:"Show all",READ_MORE:"Read more",FEED_SOURCE:"Source"},SETTINGS:{TITLE:"Settings",DISPLAY_DIVIDER:"Display",STORAGE_DIVIDER:"Storage",NETWORK_SETTINGS:"Network",PEER:"Duniter peer address",PEER_SHORT:"Peer address",PEER_CHANGED_TEMPORARY:"Address used temporarily",PERSIST_CACHE:"Keep navigation data (experimental)",PERSIST_CACHE_HELP:"Allows faster navigation, locally retaining the data received, for use from one session to another.",USE_LOCAL_STORAGE:"Enable local storage",USE_LOCAL_STORAGE_HELP:"Allows you to save your settings",ENABLE_HELPTIP:"Enable contextual help tips",ENABLE_UI_EFFECTS:"Enable visual effects",HISTORY_SETTINGS:"Account operations",DISPLAY_UD_HISTORY:"Display produced dividends?",AUTHENTICATION_SETTINGS:"Authentication",REMEMBER_ME:"Remember me ?",REMEMBER_ME_HELP:"Allows to remain identified from one session to another, keeping the public key locally.",PLUGINS_SETTINGS:"Extensions",BTN_RESET:"Restore default values",EXPERT_MODE:"Enable expert mode",EXPERT_MODE_HELP:"Allow to see more details",POPUP_PEER:{TITLE:"Duniter peer",HOST:"Address",HOST_HELP:"Address: server:port",USE_SSL:"Secured?",USE_SSL_HELP:"(SSL Encryption)",BTN_SHOW_LIST:"Peer's list"}},BLOCKCHAIN:{HASH:"Hash: {{hash}}",VIEW:{HEADER_TITLE:"Block #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Current block",TITLE:"Block #{{number|formatInteger}}",COMPUTED_BY:"Computed by",SHOW_RAW:"Show raw data",TECHNICAL_DIVIDER:"Technical informations",VERSION:"Format version",HASH:"Computed hash",UNIVERSAL_DIVIDEND_HELP:"Money co-produced by each of the {{membersCount}} members",EMPTY:"Aucune donnée dans ce bloc",POW_MIN:"Minimal difficulty",POW_MIN_HELP:"Difficulty imposed in calculating hash",DATA_DIVIDER:"Data",IDENTITIES_COUNT:"New identities",JOINERS_COUNT:"Joiners",ACTIVES_COUNT:"Renewals",ACTIVES_COUNT_HELP:"Members having renewed their membership",LEAVERS_COUNT:"Leavers",LEAVERS_COUNT_HELP:"Members that now refused certification",EXCLUDED_COUNT:"Excluded members",EXCLUDED_COUNT_HELP:"Old members, excluded because missing membreship renewal or certifications",REVOKED_COUNT:"Revoked identities",REVOKED_COUNT_HELP:"These accounts may no longer be member",TX_COUNT:"Transactions",CERT_COUNT:"Certifications",TX_TO_HIMSELF:"Change",TX_OUTPUT_UNLOCK_CONDITIONS:"Unlock conditions",TX_OUTPUT_OPERATOR:{AND:"and",OR:"or"},TX_OUTPUT_FUNCTION:{SIG:"<b>Sign</b> of the public key",XHX:"<b>Password</b>, including SHA256 =",CSV:"Blocked during",CLTV:"Bloqué until"}},LOOKUP:{TITLE:"Blocks",NO_BLOCK:"No bloc",LAST_BLOCKS:"Last blocks:",BTN_COMPACT:"Compact"}},CURRENCY:{VIEW:{TITLE:"Currency",TAB_CURRENCY:"Currency",TAB_WOT:"Web of trust",TAB_NETWORK:"Network",TAB_BLOCKS:"Blocks",CURRENCY_SHORT_DESCRIPTION:"{{currency|capitalize}} is a <b>libre money</b>, started {{firstBlockTime | formatFromNow}}. It currently counts <b>{{N}} members </b>, who produce and collect a <a ng-click=\"showHelpModal('ud')\">Universal Dividend</a> (DU), each {{dt | formatPeriod}}.",NETWORK_RULES_DIVIDER:"Network rules",CURRENCY_NAME:"Currency name",MEMBERS:"Members count",MEMBERS_VARIATION:"Variation since {{duration|formatDuration}} (since last UD)",MONEY_DIVIDER:"Money",MASS:"Monetary mass",SHARE:"Money share",UD:"Universal Dividend",C_ACTUAL:"Current growth",MEDIAN_TIME:"Current blockchain time",POW_MIN:"Common difficulty",MONEY_RULES_DIVIDER:"Rules of currency",C_RULE:"Theoretical growth target",UD_RULE:"Universal dividend (formula)",DT_REEVAL:"Period between two re-evaluation of the UD",REEVAL_SYMBOL:"reeval",DT_REEVAL_VALUE:"Every <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Date of first reevaluation of the UD",SIG_QTY_RULE:"Required number of certifications to become a member",SIG_STOCK:"Maximum number of certifications sent by a member",SIG_PERIOD:"Minimum delay between 2 certifications sent by one and the same issuer.",SIG_WINDOW:"Maximum delay before a certification will be treated",SIG_VALIDITY:"Lifetime of a certification that has been treated",MS_WINDOW:"Maximum delay before a pending membership will be treated",MS_VALIDITY:"Lifetime of a membership that has been treated",STEP_MAX:"Maximum distance between a newcomer and each referring members.",WOT_RULES_DIVIDER:"Rules for web of trust",SENTRIES:"Required number of certifications (given <b>and</b> received) to become a referring member",SENTRIES_FORMULA:"Required number of certifications to become a referring member (formula)",XPERCENT:"Minimum percent of referring member to reach to match the distance rule",AVG_GEN_TIME:"The average time between 2 blocks",CURRENT:"current",MATH_CEILING:"CEILING",DISPLAY_ALL_RULES:"Display all rules?",BTN_SHOW_LICENSE:"Show license",WOT_DIVIDER:"Web of trust"},LICENSE:{TITLE:"Currency license",BTN_DOWNLOAD:"Download file",NO_LICENSE_FILE:"License file not found."}},NETWORK:{VIEW:{MEDIAN_TIME:"Blockchain time",LOADING_PEERS:"Loading peers...",NODE_ADDRESS:"Address:",SOFTWARE:"Software:",WARN_PRE_RELEASE:"Pre-release (latest stable: <b>{{version}}</b>)",WARN_NEW_RELEASE:"Version <b>{{version}}</b> available",WS2PID:"Identifier:",PRIVATE_ACCESS:"Private access",POW_PREFIX:"Proof of work prefix:",ENDPOINTS:{BMAS:"Secure endpoint (SSL)",BMATOR:"TOR endpoint",WS2P:"WS2P endpoint",ES_USER_API:"Cesium+ data node"}},INFO:{ONLY_SSL_PEERS:"Non-SSL nodes have a degraded display because Cesium works in HTTPS mode."}},PEER:{PEERS:"Peers",SIGNED_ON_BLOCK:"Signed on block",MIRROR:"mirror",MIRRORS:"Mirrors",MIRROR_PEERS:"Mirror peers",PEER_LIST:"Peer's list",MEMBERS:"Members",MEMBER_PEERS:"Member peers",ALL_PEERS:"All peers",DIFFICULTY:"Difficulty",API:"API",CURRENT_BLOCK:"Block #",POPOVER_FILTER_TITLE:"Filter",OFFLINE:"Offline",OFFLINE_PEERS:"Offline peers",BTN_SHOW_PEER:"Show peer",VIEW:{TITLE:"Peer",OWNER:"Owned by ",SHOW_RAW_PEERING:"See peering document",SHOW_RAW_CURRENT_BLOCK:"See current block (raw format)",LAST_BLOCKS:"Last blocks",KNOWN_PEERS:"Known peers :",GENERAL_DIVIDER:"General information",ERROR:{LOADING_TOR_NODE_ERROR:"Could not get peer data, using the TOR network.",LOADING_NODE_ERROR:"Could not get peer data"}}},WOT:{SEARCH_HELP:"Search (name, hashtag)",SEARCH_INIT_PHASE_WARNING:"During the pre-registration phase, the search for pending registrations <b>may be long</b>. Please wait ...",REGISTERED_SINCE:"Registered on",REGISTERED_SINCE_BLOCK:"Registered since block #",NO_CERTIFICATION:"No validated certification",NO_GIVEN_CERTIFICATION:"No given certification",NOT_MEMBER_PARENTHESIS:"(non-member)",IDENTITY_REVOKED_PARENTHESIS:"(identity revoked)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(being revoked)",EXPIRE_IN:"Expires",NOT_WRITTEN_EXPIRE_IN:"Deadline<br/>treatment",EXPIRED:"Expired",PSEUDO:"Pseudonym",SIGNED_ON_BLOCK:"Emitted on block #{{block}}",WRITTEN_ON_BLOCK:"Written on block #{{block}}",GENERAL_DIVIDER:"General information",NOT_MEMBER_ACCOUNT:"Non-member account",NOT_MEMBER_ACCOUNT_HELP:"This is a simple wallet, with no pending membership application.",TECHNICAL_DIVIDER:"Technical data",BTN_CERTIFY:"Certify",BTN_YES_CERTIFY:"Yes, certify",BTN_SELECT_AND_CERTIFY:"New certification",ACCOUNT_OPERATIONS:"Account operations",VIEW:{POPOVER_SHARE_TITLE:"Identity {{title}}"},LOOKUP:{TITLE:"Registry",NEWCOMERS:"New members:",NEWCOMERS_COUNT:"{{count}} members",PENDING:"Pending registrations:",PENDING_COUNT:"{{count}} pending registrations",REGISTERED:"Registered {{time | formatFromNow}}",MEMBER_FROM:"Member since {{time|formatFromNowShort}}",BTN_NEWCOMERS:"Latest members",BTN_PENDING:"Pending registrations",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit to {{limit}})",NO_PENDING:"No pending registrations.",NO_NEWCOMERS:"No members."},CONTACTS:{TITLE:"Contacts"},MODAL:{TITLE:"Search"},CERTIFICATIONS:{TITLE:"{{uid}} - Certifications",SUMMARY:"Received certifications",LIST:"Details of received certifications",PENDING_LIST:"Pending certifications",RECEIVED:"Received certifications",RECEIVED_BY:"Certifications received by {{uid}}",ERROR:"Received certifications in error",SENTRY_MEMBER:"Referring member"},OPERATIONS:{TITLE:"{{uid}} - Operations"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Certifications sent",SUMMARY:"Sent certifications",LIST:"Details of sent certifications",PENDING_LIST:"Pending certifications",SENT:"Sent certifications",SENT_BY:"Certifications sent by {{uid}}",ERROR:"Sent certifications with error"}},LOGIN:{TITLE:'<i class="icon ion-log-in"></i> Login',SCRYPT_FORM_HELP:"Please enter your credentials. <br> Remember to check the public key for your account.",PUBKEY_FORM_HELP:"Please enter a public account key:",FILE_FORM_HELP:"Choose the keychain file to use:",SCAN_FORM_HELP:"Scan the QR code of a wallet.",SALT:"Identifier",SALT_HELP:"Identifier",SHOW_SALT:"Display identifier?",PASSWORD:"Password",PASSWORD_HELP:"Password",PUBKEY_HELP:"Example: « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »",NO_ACCOUNT_QUESTION:"Don't have an account yet?",HAVE_ACCOUNT_QUESTION:"Already have an account ?",CREATE_ACCOUNT:"Create an account",CREATE_FREE_ACCOUNT:"Create a free account",FORGOTTEN_ID:"Forgot password?",ASSOCIATED_PUBKEY:"Public key :",BTN_METHODS:"Other methods",BTN_METHODS_DOTS:"Change method...",METHOD_POPOVER_TITLE:"Methods",MEMORIZE_AUTH_FILE:"Memorize this keychain during the navigation session",SCRYPT_PARAMETERS:"Paramètres (Scrypt) :",AUTO_LOGOUT:{TITLE:"Information",MESSAGE:'<i class="ion-android-time"></i> You were <b>logout</ b> automatically, due to prolonged inactivity.',BTN_RELOGIN:"Sign In",IDLE_WARNING:"You will be logout... {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Secret and password",SCRYPT_ADVANCED:"Advanced salt",FILE:"Keychain file",PUBKEY:"Public key only",SCAN:"Scan a QR code"},SCRYPT:{SIMPLE:"Light salt",DEFAULT:"Standard salt",SECURE:"Secure salt",HARDEST:"Hardest salt",EXTREME:"Extreme salt",USER:"Personal value",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Size:",VALIDATING:"Validating...",HELP:"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF)."}},ACCOUNT:{TITLE:"My Account",SHOW_MORE_TX:"Show more",SHOW_ALL_TX:"Show all",EVENTS:"Events",BTN_RECEIVE_MONEY:"Receive",BTN_SECURITY_DOTS:"Sign-in and security...",BTN_SHOW_DETAILS:"Display technical data",NEW:{TITLE:"Registration",INTRO_WARNING_TIME:"Creating an account on {{name|capitalize}} is very simple. Please take sufficient time to do this correctly (not to forget the usernames, passwords, etc.).",INTRO_WARNING_SECURITY:"Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.",INTRO_WARNING_SECURITY_HELP:"Up-to-date anti-virus, firewall enabled, session protected by password or pin code...",INTRO_HELP:"Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.",REGISTRATION_NODE:"Your registration will be registered via the Duniter peer <b>{{server}}</b> node, which will then be distributed to the rest of the currency network.",REGISTRATION_NODE_HELP:"If you do not trust this peer, please change <a ng-click=\"doQuickFix('settings')\">in the settings</a> of Cesium.",SELECT_ACCOUNT_TYPE:"Choose the type of account to create:",MEMBER_ACCOUNT:"Member account",MEMBER_ACCOUNT_TITLE:"Create a member account",MEMBER_ACCOUNT_HELP:"If you are not yet registered as an individual (one account possible per individual).",WALLET_ACCOUNT:"Simple wallet",WALLET_ACCOUNT_TITLE:"Create a wallet",WALLET_ACCOUNT_HELP:"If you represent a company, association, etc. or simply need an additional wallet. No universal dividend will be created by this account.",SALT_WARNING:"Choose a identifier.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this identifier</b>.<br/>If lost, there are no means to retrieve it!",PASSWORD_WARNING:"Choose a password.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this password</b>.<br/>If lost, there are no means to retrieve it!",PSEUDO_WARNING:"Choose a pseudonym.<br/>It may be used by other people to find you more easily.<br/><br/>.Use of <b>commas, spaces and accents</b> is not allowed.<br/><div class='hidden-xs'><br/>Example: <span class='gray'>JohnDalton, JackieChan, etc.</span>",PSEUDO:"Pseudonym",PSEUDO_HELP:"joe123",SALT_CONFIRM:"Confirm",SALT_CONFIRM_HELP:"Confirm the identifier",PASSWORD_CONFIRM:"Confirm",PASSWORD_CONFIRM_HELP:"Confirm the password",SLIDE_6_TITLE:"Confirmation:",COMPUTING_PUBKEY:"Computing...",LAST_SLIDE_CONGRATULATION:"You completed all required fields.<br/><b>You can send the account creation request</b>.<br/><br/>For information, the public key below identifies your future account.<br/>It can be communicated to third parties to receive their payment.<br/>Once your account has been approved, you can find this key under <b>{{'ACCOUNT.TITLE'|translate}}</b>.",CONFIRMATION_MEMBER_ACCOUNT:'<b class="assertive">Warning:</b> your identifier, password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to send this account creation request?',CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Warning:</b> your password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to continue?',CHECKING_PSEUDO:"Checking...",PSEUDO_AVAILABLE:"This pseudonym is available",PSEUDO_NOT_AVAILABLE:"This pseudonym is not available",INFO_LICENSE:"To be able to adhere to the currency, we ask you to kindly read and accept this license.",BTN_ACCEPT:"I accept",BTN_ACCEPT_LICENSE:"I accept the license"},POPUP_REGISTER:{TITLE:"Enter a pseudonym",HELP:"A pseudonym is needed to let other members find you."},HEADERS:{TIME:"Date",AMOUNT:"Amount",COMMENT:"Comment"}},TRANSFER:{TITLE:"Transfer",SUB_TITLE:"Transfer money",FROM:"From",TO:"To",AMOUNT:"Amount",AMOUNT_HELP:"Amount",COMMENT:"Comment",COMMENT_HELP:"Comment (optional)",BTN_SEND:"Send",BTN_ADD_COMMENT:"Add comment?",MODAL:{TITLE:"Transfer"}},ERROR:{UNKNOWN_URI_FORMAT:"Unknown URI format",PUBKEY_INVALID_CHECKSUM:"Invalid public key (bad checksum).",POPUP_TITLE:"Error",UNKNOWN_ERROR:"Unknown error",CRYPTO_UNKNOWN_ERROR:"Your browser is not compatible with cryptographic features.",EQUALS_TO_PSEUDO:"Must be different from pseudonym",EQUALS_TO_SALT:"Must be different from secret identifier",FIELD_REQUIRED:"This field is required.",FIELD_TOO_SHORT:"Value is too short (min {{minLength]] characters).",FIELD_TOO_SHORT_WITH_LENGTH:"This field value is too short.",FIELD_TOO_LONG:"Value is exceeding max length.",FIELD_TOO_LONG_WITH_LENGTH:"Value is too long (max {{maxLength}} characters).",FIELD_MIN:"Minimum value: {{min}}",FIELD_MAX:"Maximal value: {{max}}",FIELD_ACCENT:"Commas and accent characters not allowed",FIELD_NOT_NUMBER:"Value is not a number",FIELD_NOT_INT:"Value is not an integer",FIELD_NOT_EMAIL:"Email adress not valid",PASSWORD_NOT_CONFIRMED:"Must match previous password.",SALT_NOT_CONFIRMED:"Must match previous identifier.",SEND_IDENTITY_FAILED:"Error while trying to register.",SEND_CERTIFICATION_FAILED:"Could not certify identity.",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"You could not send certification, because your account is <b>not a member account</b>.",NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF:"You could not send certification now, because your are <b>not a member</b> yet.<br/><br/>You still need certification to become a member.",NOT_MEMBER_FOR_CERTIFICATION:"Your account is not a member account yet.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"This account could not be certified. No registration found, or need to renew.",LOGIN_FAILED:"Error while sign in.",LOAD_IDENTITY_FAILED:"Could not load identity.",LOAD_REQUIREMENTS_FAILED:"Could not load identity requirements.",SEND_MEMBERSHIP_IN_FAILED:"Error while sending registration as member.",SEND_MEMBERSHIP_OUT_FAILED:"Error while sending membership revocation.",REFRESH_WALLET_DATA:"Could not refresh wallet.",GET_CURRENCY_PARAMETER:"Could not get currency parameters.",GET_CURRENCY_FAILED:"Could not load currency. Please retry later.",SEND_TX_FAILED:"Could not send transaction.",ALL_SOURCES_USED:"Please wait the next block computation (All transaction sources has been used).",NOT_ENOUGH_SOURCES:"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Error while creating your member account.",RESTORE_WALLET_DATA_ERROR:"Error while reloading settings from local storage",LOAD_WALLET_DATA_ERROR:"Error while loading wallet data.",COPY_CLIPBOARD_FAILED:"Could not copy to clipboard",TAKE_PICTURE_FAILED:"Could not get picture.",SCAN_FAILED:"Could not scan QR code.",SCAN_UNKNOWN_FORMAT:"Code not recognized.",WOT_LOOKUP_FAILED:"Search failed.",LOAD_PEER_DATA_FAILED:"Duniter peer not accessible. Please retry later.",NEED_LOGIN_FIRST:"Please sign in first.",AMOUNT_REQUIRED:"Amount is required.",AMOUNT_NEGATIVE:"Negative amount not allowed.",NOT_ENOUGH_CREDIT:"Not enough credit.",INVALID_NODE_SUMMARY:"Unreachable peer or invalid address",INVALID_USER_ID:"Field 'pseudonym' must not contains spaces or special characters.",INVALID_COMMENT:"Field 'reference' has a bad format.",INVALID_PUBKEY:"Public key has a bad format.",INVALID_PUBKEY_CHECKSUM:"Invalid checksum.",IDENTITY_REVOKED:"This identity <b>has been revoked {{revocationTime|formatFromNow}}</b> ({{revocationTime|formatDate}}). It can no longer become a member.",IDENTITY_PENDING_REVOCATION:"The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.",IDENTITY_INVALID_BLOCK_HASH:"This membership application is no longer valid (because it references a block that network peers are cancelled): the person must renew its application for membership <b>before</b> being certified.",IDENTITY_EXPIRED:"This identity has expired: this person must re-apply <b>before</b> being certified.",IDENTITY_SANDBOX_FULL:"Could not register, because peer's sandbox is full.<br/><br/>Please retry later or choose another Duniter peer (in <b>Settings</b>).",IDENTITY_NOT_FOUND:"Identity not found",IDENTITY_TX_FAILED:"Error while getting identity's transactions",WOT_PENDING_INVALID_BLOCK_HASH:"Membership not valid.",WALLET_INVALID_BLOCK_HASH:"Your membership application is no longer valid (because it references a block that network peers are cancelled).<br/>You must <a ng-click=\"doQuickFix('renew')\">renew your application for membership</a> to fix this issue.",WALLET_IDENTITY_EXPIRED:"The publication of your identity <b>has expired</b>.<br/>You must <a ng-click=\"doQuickFix('fixIdentity')\">re-issue your identity</a> to resolve this issue.",WALLET_REVOKED:"Your identity has been <b>revoked</b>: neither your pseudonym nor your public key will be used in the future for a member account.",WALLET_HAS_NO_SELF:"Your identity must first have been published, and not expired.",AUTH_REQUIRED:"Authentication required.",AUTH_INVALID_PUBKEY:"The public key does not match the connected account.",AUTH_INVALID_SCRYPT:"Invalid username or password.",AUTH_INVALID_FILE:"Invalid keychain file.",AUTH_FILE_ERROR:"Failed to open keychain file",IDENTITY_ALREADY_CERTIFY:"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).",UNABLE_TO_CERTIFY_TITLE:"Unable to certify",LOAD_NEWCOMERS_FAILED:"Unable to load new members.",LOAD_PENDING_FAILED:"Unable to load pending registrations.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"You must <b>be a member</b> in order to perform this action.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"You must have <b>published your identity</b> in order to perform this action.",GET_BLOCK_FAILED:"Error while getting block",INVALID_BLOCK_HASH:"Block not found (incorrect hash)",DOWNLOAD_REVOCATION_FAILED:"Error while downloading revocation file.",REVOCATION_FAILED:"Error while trying to revoke the identity.",SALT_OR_PASSWORD_NOT_CONFIRMED:"Wrong identifier or password ",RECOVER_ID_FAILED:"Could not recover password",LOAD_FILE_FAILED:"Unable to load file",NOT_VALID_REVOCATION_FILE:"Invalid revocation file (wrong file format)",NOT_VALID_SAVE_ID_FILE:"Invalid credentials backup file (wrong file format)",NOT_VALID_KEY_FILE:"Invalid keychain file (unrecognized format)",EXISTING_ACCOUNT:"Your identifiers correspond to an already existing account, whose <a ng-click=\"showHelpModal('pubkey')\">public key</a> is:",EXISTING_ACCOUNT_REQUEST:"Please modify your credentials so that they correspond to an unused account.",GET_LICENSE_FILE_FAILED:"Unable to get license file",CHECK_NETWORK_CONNECTION:"No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>."},INFO:{POPUP_TITLE:"Information",CERTIFICATION_DONE:"Identity successfully signed",NOT_ENOUGH_CREDIT:"Not enough credit",TRANSFER_SENT:"Transfer request successfully sent",COPY_TO_CLIPBOARD_DONE:"Copy succeeded",MEMBERSHIP_OUT_SENT:"Membership revocation sent",NOT_NEED_MEMBERSHIP:"Already a member.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"This identity will soon lack certification (at least {{willNeedCertificationCount}}).",REVOCATION_SENT:"Revocation sent successfully",REVOCATION_SENT_WAITING_PROCESS:"Revocation <b>has been sent successfully</b>. It is awaiting processing.",FEATURES_NOT_IMPLEMENTED:"This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)",EMPTY_TX_HISTORY:"No operations to export"},CONFIRM:{POPUP_TITLE:"<b>Confirmation</b>",POPUP_WARNING_TITLE:"<b>Warning</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Security warning</b>',CERTIFY_RULES_TITLE_UID:"Certify {{uid}}",CERTIFY_RULES:'<b class="assertive">Don\'t certify an account</b> if you believe that: <ul><li>1.) the issuers identity might be faked.<li>2.) the issuer already has another certified account.<li>3.) the issuer purposely or carelessly violates rule 1 or 2 (he certifies faked or double accounts).</ul></small><br/>Are you sure you want to certify this identity?',FULLSCREEN:"View the application in full screen?",EXIT_APP:"Close the application ?",LOGIN_UNUSED_WALLET_TITLE:"Typing error?",LOGIN_UNUSED_WALLET:"The account seems to be <b>inactive</b>.<br/><br/>It's probably a <b>typing error</b> when sign in. Please try again, checking that <b>public key is yours<b/>.",SAVE_BEFORE_LEAVE:"Do you want to <b>save your changes</b> before leaving the page?",SAVE_BEFORE_LEAVE_TITLE:"Changes not saved",LOGOUT:"Are you sure you want to logout?",USE_FALLBACK_NODE:"Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?"},HELP:{TITLE:"Online help",JOIN:{SECTION:"Join",SALT:'The identifier is very important. It is used to hash you password, which in turn is used to calculate your <span class="text-italic">public account key</span> (its number) and the private key to access it.<br/><b>Please remeber this identifier well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good identifier must be sufficiently long (8 characters at the very least) and as original as possible.',PASSWORD:"The password is very important. Together with the identifier, it is use to calculate your account number (pblic key) and the private key to access it.<br/><b>Please remember it well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good password is made (ideally) of at least 8 characters, with at least one capital and one number."},GLOSSARY:{SECTION:"Glossary",PUBKEY_DEF:"A public key always identifies a wallet. It may identify a member. In Cesium it is calculated using the identifier and the password.",UNIVERSAL_DIVIDEND_DEF:'The Universal Dividend (UD) is the quantity of money co-created by each member, according to the period and the calculation defined in the <span class="text-italic">currency rules</span>.<br/>Every term, the members receive an equal amount of new money on their account.<br/><br/>The UD undergoes a steady growth, to remain fair under its members (current and future), calculated by an average life expectancy, as demonstrated in the Relative Theory of Money (RTM).<br/><a href="http://trm.creationmonetaire.info" target="_system">Read more about RTM</a> and open money.'}}}),e.translations("en",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"build {{build}}",PUBKEY:"Public key",MEMBER:"Member",BLOCK:"Block",BTN_OK:"OK",BTN_YES:"Yes",BTN_NO:"No",BTN_SEND:"Send",BTN_SEND_MONEY:"Transfer money",BTN_SEND_MONEY_SHORT:"Transfer",BTN_SAVE:"Save",BTN_YES_SAVE:"Yes, Save",BTN_YES_CONTINUE:"Yes, Continue",BTN_SHOW:"Show",BTN_SHOW_PUBKEY:"Show key",BTN_RELATIVE_UNIT:"Display amounts in UD?",BTN_BACK:"Back",BTN_NEXT:"Next",BTN_IMPORT:"Import",BTN_CANCEL:"Cancel",BTN_CLOSE:"Close",BTN_COPY:"Copy",BTN_LATER:"Later",BTN_LOGIN:"Sign In",BTN_LOGOUT:"Logout",BTN_ADD_ACCOUNT:"New Account",BTN_SHARE:"Share",BTN_EDIT:"Edit",BTN_DELETE:"Delete",BTN_ADD:"Add",BTN_SEARCH:"Search",BTN_REFRESH:"Refresh",BTN_RETRY:"Retry",BTN_START:"Start",BTN_CONTINUE:"Continue",BTN_CREATE:"Create",BTN_UNDERSTOOD:"I understand",BTN_OPTIONS:"Options",BTN_HELP_TOUR:"Features tour",BTN_HELP_TOUR_SCREEN:"Discover this screen",BTN_DOWNLOAD:"Download",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Download account statement",BTN_MODIFY:"Modify",CHOOSE_FILE:"Drag your file<br/>or click to select",DAYS:"days",NO_ACCOUNT_QUESTION:"Not a member yet? Register now!",SEARCH_NO_RESULT:"No result found",LOADING:"Loading...",LOADING_WAIT:"Loading...<br/><small>(Waiting for node availability)</small>",SEARCHING:"Searching...",FROM:"From",TO:"To",COPY:"Copy",LANGUAGE:"Language",UNIVERSAL_DIVIDEND:"Universal dividend",UD:"UD",DATE_PATTERN:"MM/DD/YYYY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"MM/DD/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(empty)",UID:"Pseudonym",ENABLE:"Enabled",DISABLE:"Disabled",RESULTS_LIST:"Results:",RESULTS_COUNT:"{{count}} results",EXECUTION_TIME:"executed in {{duration|formatDurationMs}}",SHOW_VALUES:"Display values openly?",POPOVER_ACTIONS_TITLE:"Options",POPOVER_FILTER_TITLE:"Filters",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit at {{limit}})",POPOVER_SHARE:{TITLE:"Share",SHARE_ON_TWITTER:"Share on Twitter",SHARE_ON_FACEBOOK:"Share on Facebook",SHARE_ON_DIASPORA:"Share on Diaspora*",SHARE_ON_MASTODON:"Share on Mastodon",INSTANCE_ADDRESS_HELP:"Enter an intance address (ex: https://framapiaf.org):"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Size:",VALIDATING:"Validating..."}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Choose source:",BTN_PICTURE_GALLERY:"Gallery",BTN_PICTURE_CAMERA:"<b>Camera</b>"},MENU:{HOME:"Home",WOT:"Registry",CURRENCY:"Currency",ACCOUNT:"My Account",WALLETS:"My wallets",TRANSFER:"Transfer",SCAN:"Scan",SETTINGS:"Settings",NETWORK:"Network",TRANSACTIONS:"My transactions"},ABOUT:{TITLE:"About",LICENSE:"<b>Free/libre software</b> (License GNU AGPLv3).",LATEST_RELEASE:"There is a <b>newer version</ b> of {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)",PLEASE_UPDATE:"Please update {{'COMMON.APP_NAME' | translate}} (latest version: <b>v{{version}}</b>)",CODE:"Source code:",OFFICIAL_WEB_SITE:"Official web site:",DEVELOPERS:"Developers:",FORUM:"Forum:",DEV_WARNING:"Warning",DEV_WARNING_MESSAGE:"This application is still in active development.<br/>Please report any issue to us!",DEV_WARNING_MESSAGE_SHORT:"This App is still unstable (still under development).",REPORT_ISSUE:"Report an issue"},HOME:{TITLE:"Cesium",MESSAGE:"Welcome to the {{'COMMON.APP_NAME'|translate}} Application!",MESSAGE_CURRENCY:"Make exchanges in the libre currency {{currency|abbreviate}}!",BTN_CURRENCY:"Explore currency",BTN_ABOUT:"about",BTN_HELP:"Help",REPORT_ISSUE:"Report an issue",NOT_YOUR_ACCOUNT_QUESTION:'You do not own the account <b><i class="ion-key"></i> {{pubkey|formatPubkey}}</b>?',BTN_CHANGE_ACCOUNT:"Disconnect this account",CONNECTION_ERROR:'Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change node <a class="positive" ng-click="doQuickFix(\'settings\')">in the settings</a>.',SHOW_ALL_FEED:"Show all",READ_MORE:"Read more",FEED_SOURCE:"Source"},SETTINGS:{TITLE:"Settings",DISPLAY_DIVIDER:"Display",STORAGE_DIVIDER:"Storage",NETWORK_SETTINGS:"Network",PEER:"Duniter peer address",PEER_SHORT:"Peer address",PEER_CHANGED_TEMPORARY:"Address used temporarily",PERSIST_CACHE:"Keep navigation data (experimental)",PERSIST_CACHE_HELP:"Allows faster navigation, locally retaining the data received, for use from one session to another.",USE_LOCAL_STORAGE:"Enable local storage",USE_LOCAL_STORAGE_HELP:"Allows you to save your settings",ENABLE_HELPTIP:"Enable contextual help tips",ENABLE_UI_EFFECTS:"Enable visual effects",HISTORY_SETTINGS:"Account operations",DISPLAY_UD_HISTORY:"Display produced dividends?",AUTHENTICATION_SETTINGS:"Authentication",REMEMBER_ME:"Remember me ?",REMEMBER_ME_HELP:"Allows to remain identified from one session to another, keeping the public key locally.",PLUGINS_SETTINGS:"Extensions",BTN_RESET:"Restore default values",EXPERT_MODE:"Enable expert mode",EXPERT_MODE_HELP:"Allow to see more details",POPUP_PEER:{TITLE:"Duniter peer",HOST:"Address",HOST_HELP:"Address: server:port",USE_SSL:"Secured?",USE_SSL_HELP:"(SSL Encryption)",BTN_SHOW_LIST:"Peer's list"}},BLOCKCHAIN:{HASH:"Hash: {{hash}}",VIEW:{HEADER_TITLE:"Block #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Current block",TITLE:"Block #{{number|formatInteger}}",COMPUTED_BY:"Computed by",SHOW_RAW:"Show raw data",TECHNICAL_DIVIDER:"Technical informations",VERSION:"Format version",HASH:"Computed hash",UNIVERSAL_DIVIDEND_HELP:"Money co-produced by each of the {{membersCount}} members",EMPTY:"Aucune donnée dans ce bloc",POW_MIN:"Minimal difficulty",POW_MIN_HELP:"Difficulty imposed in calculating hash",DATA_DIVIDER:"Data",IDENTITIES_COUNT:"New identities",JOINERS_COUNT:"Joiners",ACTIVES_COUNT:"Renewals",ACTIVES_COUNT_HELP:"Members having renewed their membership",LEAVERS_COUNT:"Leavers",LEAVERS_COUNT_HELP:"Members that now refused certification",EXCLUDED_COUNT:"Excluded members",EXCLUDED_COUNT_HELP:"Old members, excluded because missing membreship renewal or certifications",REVOKED_COUNT:"Revoked identities",REVOKED_COUNT_HELP:"These accounts may no longer be member",TX_COUNT:"Transactions",CERT_COUNT:"Certifications",TX_TO_HIMSELF:"Change",TX_OUTPUT_UNLOCK_CONDITIONS:"Unlock conditions",TX_OUTPUT_OPERATOR:{AND:"and",OR:"or"},TX_OUTPUT_FUNCTION:{SIG:"<b>Sign</b> of the public key",XHX:"<b>Password</b>, including SHA256 =",CSV:"Blocked during",CLTV:"Bloqué until"}},LOOKUP:{TITLE:"Blocks",NO_BLOCK:"No bloc",LAST_BLOCKS:"Last blocks:",BTN_COMPACT:"Compact"}},CURRENCY:{VIEW:{TITLE:"Currency",TAB_CURRENCY:"Currency",TAB_WOT:"Web of trust",TAB_NETWORK:"Network",TAB_BLOCKS:"Blocks",CURRENCY_SHORT_DESCRIPTION:"{{currency|capitalize}} is a <b>libre money</b>, started {{firstBlockTime | formatFromNow}}. It currently counts <b>{{N}} members </b>, who produce and collect a <a ng-click=\"showHelpModal('ud')\">Universal Dividend</a> (DU), each {{dt | formatPeriod}}.",NETWORK_RULES_DIVIDER:"Network rules",CURRENCY_NAME:"Currency name",MEMBERS:"Members count",MEMBERS_VARIATION:"Variation since {{duration|formatDuration}} (since last UD)",MONEY_DIVIDER:"Money",MASS:"Monetary mass",SHARE:"Money share",UD:"Universal Dividend",C_ACTUAL:"Current growth",MEDIAN_TIME:"Current blockchain time",POW_MIN:"Common difficulty",MONEY_RULES_DIVIDER:"Rules of currency",C_RULE:"Theoretical growth target",UD_RULE:"Universal dividend (formula)",DT_REEVAL:"Period between two re-evaluation of the UD",REEVAL_SYMBOL:"reeval",DT_REEVAL_VALUE:"Every <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Date of first reevaluation of the UD",SIG_QTY_RULE:"Required number of certifications to become a member",SIG_STOCK:"Maximum number of certifications sent by a member",SIG_PERIOD:"Minimum delay between 2 certifications sent by one and the same issuer.",SIG_WINDOW:"Maximum delay before a certification will be treated",SIG_VALIDITY:"Lifetime of a certification that has been treated",MS_WINDOW:"Maximum delay before a pending membership will be treated",MS_VALIDITY:"Lifetime of a membership that has been treated",STEP_MAX:"Maximum distance between a newcomer and each referring members.",WOT_RULES_DIVIDER:"Rules for web of trust",SENTRIES:"Required number of certifications (given <b>and</b> received) to become a referring member",SENTRIES_FORMULA:"Required number of certifications to become a referring member (formula)",XPERCENT:"Minimum percent of referring member to reach to match the distance rule",AVG_GEN_TIME:"The average time between 2 blocks",CURRENT:"current",MATH_CEILING:"CEILING",DISPLAY_ALL_RULES:"Display all rules?",BTN_SHOW_LICENSE:"Show license",WOT_DIVIDER:"Web of trust"},LICENSE:{TITLE:"Currency license",BTN_DOWNLOAD:"Download file",NO_LICENSE_FILE:"License file not found."}},NETWORK:{VIEW:{MEDIAN_TIME:"Blockchain time",LOADING_PEERS:"Loading peers...",NODE_ADDRESS:"Address:",SOFTWARE:"Software:",WARN_PRE_RELEASE:"Pre-release (latest stable: <b>{{version}}</b>)",WARN_NEW_RELEASE:"Version <b>{{version}}</b> available",WS2PID:"Identifier:",PRIVATE_ACCESS:"Private access",POW_PREFIX:"Proof of work prefix:",ENDPOINTS:{BMAS:"Secure endpoint (SSL)",BMATOR:"TOR endpoint",WS2P:"WS2P endpoint",ES_USER_API:"Cesium+ data node"}},INFO:{ONLY_SSL_PEERS:"Non-SSL nodes have a degraded display because Cesium works in HTTPS mode."}},PEER:{PEERS:"Peers",SIGNED_ON_BLOCK:"Signed on block",MIRROR:"mirror",MIRRORS:"Mirrors",MIRROR_PEERS:"Mirror peers",PEER_LIST:"Peer's list",MEMBERS:"Members",MEMBER_PEERS:"Member peers",ALL_PEERS:"All peers",DIFFICULTY:"Difficulty",API:"API",CURRENT_BLOCK:"Block #",POPOVER_FILTER_TITLE:"Filter",OFFLINE:"Offline",OFFLINE_PEERS:"Offline peers",BTN_SHOW_PEER:"Show peer",VIEW:{TITLE:"Peer",OWNER:"Owned by ",SHOW_RAW_PEERING:"See peering document",SHOW_RAW_CURRENT_BLOCK:"See current block (raw format)",LAST_BLOCKS:"Last blocks",KNOWN_PEERS:"Known peers :",GENERAL_DIVIDER:"General information",ERROR:{LOADING_TOR_NODE_ERROR:"Could not get peer data, using the TOR network.",LOADING_NODE_ERROR:"Could not get peer data"}}},WOT:{SEARCH_HELP:"Search (name, hashtag)",SEARCH_INIT_PHASE_WARNING:"During the pre-registration phase, the search for pending registrations <b>may be long</b>. Please wait ...",REGISTERED_SINCE:"Registered on",REGISTERED_SINCE_BLOCK:"Registered since block #",NO_CERTIFICATION:"No validated certification",NO_GIVEN_CERTIFICATION:"No given certification",NOT_MEMBER_PARENTHESIS:"(non-member)",IDENTITY_REVOKED_PARENTHESIS:"(identity revoked)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(being revoked)",EXPIRE_IN:"Expires",NOT_WRITTEN_EXPIRE_IN:"Deadline<br/>treatment",EXPIRED:"Expired",PSEUDO:"Pseudonym",SIGNED_ON_BLOCK:"Emitted on block #{{block}}",WRITTEN_ON_BLOCK:"Written on block #{{block}}",GENERAL_DIVIDER:"General information",NOT_MEMBER_ACCOUNT:"Non-member account",NOT_MEMBER_ACCOUNT_HELP:"This is a simple wallet, with no pending membership application.",TECHNICAL_DIVIDER:"Technical data",BTN_CERTIFY:"Certify",BTN_YES_CERTIFY:"Yes, certify",BTN_SELECT_AND_CERTIFY:"New certification",ACCOUNT_OPERATIONS:"Account operations",VIEW:{POPOVER_SHARE_TITLE:"Identity {{title}}"},LOOKUP:{TITLE:"Registry",NEWCOMERS:"New members:",NEWCOMERS_COUNT:"{{count}} members",PENDING:"Pending registrations:",PENDING_COUNT:"{{count}} pending registrations",REGISTERED:"Registered {{time | formatFromNow}}",MEMBER_FROM:"Member since {{time|formatFromNowShort}}",BTN_NEWCOMERS:"Latest members",BTN_PENDING:"Pending registrations",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit to {{limit}})",NO_PENDING:"No pending registrations.",NO_NEWCOMERS:"No members."},CONTACTS:{TITLE:"Contacts"},MODAL:{TITLE:"Search"},CERTIFICATIONS:{TITLE:"{{uid}} - Certifications",SUMMARY:"Received certifications",LIST:"Details of received certifications",PENDING_LIST:"Pending certifications",RECEIVED:"Received certifications",RECEIVED_BY:"Certifications received by {{uid}}",ERROR:"Received certifications in error",SENTRY_MEMBER:"Referring member"},OPERATIONS:{TITLE:"{{uid}} - Operations"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Certifications sent",SUMMARY:"Sent certifications",LIST:"Details of sent certifications",PENDING_LIST:"Pending certifications",SENT:"Sent certifications",SENT_BY:"Certifications sent by {{uid}}",ERROR:"Sent certifications with error"}},LOGIN:{TITLE:'<i class="icon ion-log-in"></i> Login',SCRYPT_FORM_HELP:"Please enter your credentials. <br> Remember to check the public key for your account.",PUBKEY_FORM_HELP:"Please enter a public account key:",FILE_FORM_HELP:"Choose the keychain file to use:",SCAN_FORM_HELP:"Scan the QR code of a wallet.",SALT:"Identifier",SALT_HELP:"Identifier",SHOW_SALT:"Display identifier?",PASSWORD:"Password",PASSWORD_HELP:"Password",PUBKEY_HELP:"Example: « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »",NO_ACCOUNT_QUESTION:"Don't have an account yet?",HAVE_ACCOUNT_QUESTION:"Already have an account ?",CREATE_ACCOUNT:"Create an account",CREATE_FREE_ACCOUNT:"Create a free account",FORGOTTEN_ID:"Forgot password?",ASSOCIATED_PUBKEY:"Public key :",BTN_METHODS:"Other methods",BTN_METHODS_DOTS:"Change method...",METHOD_POPOVER_TITLE:"Methods",MEMORIZE_AUTH_FILE:"Memorize this keychain during the navigation session",SCRYPT_PARAMETERS:"Paramètres (Scrypt) :",AUTO_LOGOUT:{TITLE:"Information",MESSAGE:'<i class="ion-android-time"></i> You were <b>logout</ b> automatically, due to prolonged inactivity.',BTN_RELOGIN:"Sign In",IDLE_WARNING:"You will be logout... {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Secret and password",SCRYPT_ADVANCED:"Advanced salt",FILE:"Keychain file",PUBKEY:"Public key only",SCAN:"Scan a QR code"},SCRYPT:{SIMPLE:"Light salt",DEFAULT:"Standard salt",SECURE:"Secure salt",HARDEST:"Hardest salt",EXTREME:"Extreme salt",USER:"Personal value",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Size:",VALIDATING:"Validating...",HELP:"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF)."}},ACCOUNT:{TITLE:"My Account",SHOW_MORE_TX:"Show more",SHOW_ALL_TX:"Show all",EVENTS:"Events",BTN_RECEIVE_MONEY:"Receive",BTN_SECURITY_DOTS:"Sign-in and security...",BTN_SHOW_DETAILS:"Display technical data",NEW:{TITLE:"Registration",INTRO_WARNING_TIME:"Creating an account on {{name|capitalize}} is very simple. Please take sufficient time to do this correctly (not to forget the usernames, passwords, etc.).",INTRO_WARNING_SECURITY:"Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.",INTRO_WARNING_SECURITY_HELP:"Up-to-date anti-virus, firewall enabled, session protected by password or pin code...",INTRO_HELP:"Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.",REGISTRATION_NODE:"Your registration will be registered via the Duniter peer <b>{{server}}</b> node, which will then be distributed to the rest of the currency network.",REGISTRATION_NODE_HELP:"If you do not trust this peer, please change <a ng-click=\"doQuickFix('settings')\">in the settings</a> of Cesium.",SELECT_ACCOUNT_TYPE:"Choose the type of account to create:",MEMBER_ACCOUNT:"Member account",MEMBER_ACCOUNT_TITLE:"Create a member account",MEMBER_ACCOUNT_HELP:"If you are not yet registered as an individual (one account possible per individual).",WALLET_ACCOUNT:"Simple wallet",WALLET_ACCOUNT_TITLE:"Create a wallet",WALLET_ACCOUNT_HELP:"If you represent a company, association, etc. or simply need an additional wallet. No universal dividend will be created by this account.",SALT_WARNING:"Choose a identifier.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this identifier</b>.<br/>If lost, there are no means to retrieve it!",PASSWORD_WARNING:"Choose a password.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this password</b>.<br/>If lost, there are no means to retrieve it!",PSEUDO_WARNING:"Choose a pseudonym.<br/>It may be used by other people to find you more easily.<br/><br/>.Use of <b>commas, spaces and accents</b> is not allowed.<br/><div class='hidden-xs'><br/>Example: <span class='gray'>JohnDalton, JackieChan, etc.</span>",PSEUDO:"Pseudonym",PSEUDO_HELP:"joe123",SALT_CONFIRM:"Confirm",SALT_CONFIRM_HELP:"Confirm the identifier",PASSWORD_CONFIRM:"Confirm",PASSWORD_CONFIRM_HELP:"Confirm the password",SLIDE_6_TITLE:"Confirmation:",COMPUTING_PUBKEY:"Computing...",LAST_SLIDE_CONGRATULATION:"You completed all required fields.<br/><b>You can send the account creation request</b>.<br/><br/>For information, the public key below identifies your future account.<br/>It can be communicated to third parties to receive their payment.<br/>Once your account has been approved, you can find this key under <b>{{'ACCOUNT.TITLE'|translate}}</b>.",CONFIRMATION_MEMBER_ACCOUNT:'<b class="assertive">Warning:</b> your identifier, password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to send this account creation request?',CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Warning:</b> your password and pseudonym can not be changed.<br/><b>Make sure you always remember it!</b><br/><b>Are you sure</b> you want to continue?',CHECKING_PSEUDO:"Checking...",PSEUDO_AVAILABLE:"This pseudonym is available",PSEUDO_NOT_AVAILABLE:"This pseudonym is not available",INFO_LICENSE:"To be able to adhere to the currency, we ask you to kindly read and accept this license.",BTN_ACCEPT:"I accept",BTN_ACCEPT_LICENSE:"I accept the license"},POPUP_REGISTER:{TITLE:"Enter a pseudonym",HELP:"A pseudonym is needed to let other members find you."},HEADERS:{TIME:"Date",AMOUNT:"Amount",COMMENT:"Comment"}},TRANSFER:{TITLE:"Transfer",SUB_TITLE:"Transfer money",FROM:"From",TO:"To",AMOUNT:"Amount",AMOUNT_HELP:"Amount",COMMENT:"Comment",COMMENT_HELP:"Comment (optional)",BTN_SEND:"Send",BTN_ADD_COMMENT:"Add comment?",MODAL:{TITLE:"Transfer"}},ERROR:{UNKNOWN_URI_FORMAT:"Unknown URI format",PUBKEY_INVALID_CHECKSUM:"Invalid public key (bad checksum).",POPUP_TITLE:"Error",UNKNOWN_ERROR:"Unknown error",CRYPTO_UNKNOWN_ERROR:"Your browser is not compatible with cryptographic features.",EQUALS_TO_PSEUDO:"Must be different from pseudonym",EQUALS_TO_SALT:"Must be different from secret identifier",FIELD_REQUIRED:"This field is required.",FIELD_TOO_SHORT:"Value is too short (min {{minLength]] characters).",FIELD_TOO_SHORT_WITH_LENGTH:"This field value is too short.",FIELD_TOO_LONG:"Value is exceeding max length.",FIELD_TOO_LONG_WITH_LENGTH:"Value is too long (max {{maxLength}} characters).",FIELD_MIN:"Minimum value: {{min}}",FIELD_MAX:"Maximal value: {{max}}",FIELD_ACCENT:"Commas and accent characters not allowed",FIELD_NOT_NUMBER:"Value is not a number",FIELD_NOT_INT:"Value is not an integer",FIELD_NOT_EMAIL:"Email adress not valid",PASSWORD_NOT_CONFIRMED:"Must match previous password.",SALT_NOT_CONFIRMED:"Must match previous identifier.",SEND_IDENTITY_FAILED:"Error while trying to register.",SEND_CERTIFICATION_FAILED:"Could not certify identity.",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"You could not send certification, because your account is <b>not a member account</b>.",NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF:"You could not send certification now, because your are <b>not a member</b> yet.<br/><br/>You still need certification to become a member.",NOT_MEMBER_FOR_CERTIFICATION:"Your account is not a member account yet.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"This account could not be certified. No registration found, or need to renew.",LOGIN_FAILED:"Error while sign in.",LOAD_IDENTITY_FAILED:"Could not load identity.",LOAD_REQUIREMENTS_FAILED:"Could not load identity requirements.",SEND_MEMBERSHIP_IN_FAILED:"Error while sending registration as member.",SEND_MEMBERSHIP_OUT_FAILED:"Error while sending membership revocation.",REFRESH_WALLET_DATA:"Could not refresh wallet.",GET_CURRENCY_PARAMETER:"Could not get currency parameters.",GET_CURRENCY_FAILED:"Could not load currency. Please retry later.",SEND_TX_FAILED:"Could not send transaction.",ALL_SOURCES_USED:"Please wait the next block computation (All transaction sources has been used).",NOT_ENOUGH_SOURCES:"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Error while creating your member account.",RESTORE_WALLET_DATA_ERROR:"Error while reloading settings from local storage",LOAD_WALLET_DATA_ERROR:"Error while loading wallet data.",COPY_CLIPBOARD_FAILED:"Could not copy to clipboard",TAKE_PICTURE_FAILED:"Could not get picture.",SCAN_FAILED:"Could not scan QR code.",SCAN_UNKNOWN_FORMAT:"Code not recognized.",WOT_LOOKUP_FAILED:"Search failed.",LOAD_PEER_DATA_FAILED:"Duniter peer not accessible. Please retry later.",NEED_LOGIN_FIRST:"Please sign in first.",AMOUNT_REQUIRED:"Amount is required.",AMOUNT_NEGATIVE:"Negative amount not allowed.",NOT_ENOUGH_CREDIT:"Not enough credit.",INVALID_NODE_SUMMARY:"Unreachable peer or invalid address",INVALID_USER_ID:"Field 'pseudonym' must not contains spaces or special characters.",INVALID_COMMENT:"Field 'reference' has a bad format.",INVALID_PUBKEY:"Public key has a bad format.",INVALID_PUBKEY_CHECKSUM:"Invalid checksum.",IDENTITY_REVOKED:"This identity <b>has been revoked {{revocationTime|formatFromNow}}</b> ({{revocationTime|formatDate}}). It can no longer become a member.",IDENTITY_PENDING_REVOCATION:"The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.",IDENTITY_INVALID_BLOCK_HASH:"This membership application is no longer valid (because it references a block that network peers are cancelled): the person must renew its application for membership <b>before</b> being certified.",IDENTITY_EXPIRED:"This identity has expired: this person must re-apply <b>before</b> being certified.",IDENTITY_SANDBOX_FULL:"Could not register, because peer's sandbox is full.<br/><br/>Please retry later or choose another Duniter peer (in <b>Settings</b>).",IDENTITY_NOT_FOUND:"Identity not found",IDENTITY_TX_FAILED:"Error while getting identity's transactions",WOT_PENDING_INVALID_BLOCK_HASH:"Membership not valid.",WALLET_INVALID_BLOCK_HASH:"Your membership application is no longer valid (because it references a block that network peers are cancelled).<br/>You must <a ng-click=\"doQuickFix('renew')\">renew your application for membership</a> to fix this issue.",WALLET_IDENTITY_EXPIRED:"The publication of your identity <b>has expired</b>.<br/>You must <a ng-click=\"doQuickFix('fixIdentity')\">re-issue your identity</a> to resolve this issue.",WALLET_REVOKED:"Your identity has been <b>revoked</b>: neither your pseudonym nor your public key will be used in the future for a member account.",WALLET_HAS_NO_SELF:"Your identity must first have been published, and not expired.",AUTH_REQUIRED:"Authentication required.",AUTH_INVALID_PUBKEY:"The public key does not match the connected account.",AUTH_INVALID_SCRYPT:"Invalid username or password.",AUTH_INVALID_FILE:"Invalid keychain file.",AUTH_FILE_ERROR:"Failed to open keychain file",IDENTITY_ALREADY_CERTIFY:"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).",UNABLE_TO_CERTIFY_TITLE:"Unable to certify",LOAD_NEWCOMERS_FAILED:"Unable to load new members.",LOAD_PENDING_FAILED:"Unable to load pending registrations.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"You must <b>be a member</b> in order to perform this action.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"You must have <b>published your identity</b> in order to perform this action.",GET_BLOCK_FAILED:"Error while getting block",INVALID_BLOCK_HASH:"Block not found (incorrect hash)",DOWNLOAD_REVOCATION_FAILED:"Error while downloading revocation file.",REVOCATION_FAILED:"Error while trying to revoke the identity.",SALT_OR_PASSWORD_NOT_CONFIRMED:"Wrong identifier or password ",RECOVER_ID_FAILED:"Could not recover password",LOAD_FILE_FAILED:"Unable to load file",NOT_VALID_REVOCATION_FILE:"Invalid revocation file (wrong file format)",NOT_VALID_SAVE_ID_FILE:"Invalid credentials backup file (wrong file format)",NOT_VALID_KEY_FILE:"Invalid keychain file (unrecognized format)",EXISTING_ACCOUNT:"Your identifiers correspond to an already existing account, whose <a ng-click=\"showHelpModal('pubkey')\">public key</a> is:",EXISTING_ACCOUNT_REQUEST:"Please modify your credentials so that they correspond to an unused account.",GET_LICENSE_FILE_FAILED:"Unable to get license file",CHECK_NETWORK_CONNECTION:"No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>."},INFO:{POPUP_TITLE:"Information",CERTIFICATION_DONE:"Identity successfully signed",NOT_ENOUGH_CREDIT:"Not enough credit",TRANSFER_SENT:"Transfer request successfully sent",COPY_TO_CLIPBOARD_DONE:"Copy succeeded",MEMBERSHIP_OUT_SENT:"Membership revocation sent",NOT_NEED_MEMBERSHIP:"Already a member.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"This identity will soon lack certification (at least {{willNeedCertificationCount}}).",REVOCATION_SENT:"Revocation sent successfully",REVOCATION_SENT_WAITING_PROCESS:"Revocation <b>has been sent successfully</b>. It is awaiting processing.",FEATURES_NOT_IMPLEMENTED:"This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)",EMPTY_TX_HISTORY:"No operations to export"},CONFIRM:{POPUP_TITLE:"<b>Confirmation</b>",POPUP_WARNING_TITLE:"<b>Warning</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Security warning</b>',CERTIFY_RULES_TITLE_UID:"Certify {{uid}}",CERTIFY_RULES:'<b class="assertive">Don\'t certify an account</b> if you believe that: <ul><li>1.) the issuers identity might be faked.<li>2.) the issuer already has another certified account.<li>3.) the issuer purposely or carelessly violates rule 1 or 2 (he certifies faked or double accounts).</ul></small><br/>Are you sure you want to certify this identity?',FULLSCREEN:"View the application in full screen?",EXIT_APP:"Close the application ?",LOGIN_UNUSED_WALLET_TITLE:"Typing error?",LOGIN_UNUSED_WALLET:"The account seems to be <b>inactive</b>.<br/><br/>It's probably a <b>typing error</b> when sign in. Please try again, checking that <b>public key is yours<b/>.",SAVE_BEFORE_LEAVE:"Do you want to <b>save your changes</b> before leaving the page?",SAVE_BEFORE_LEAVE_TITLE:"Changes not saved",LOGOUT:"Are you sure you want to logout?",USE_FALLBACK_NODE:"Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?"},HELP:{TITLE:"Online help",JOIN:{SECTION:"Join",SALT:'The identifier is very important. It is used to hash you password, which in turn is used to calculate your <span class="text-italic">public account key</span> (its number) and the private key to access it.<br/><b>Please remeber this identifier well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good identifier must be sufficiently long (8 characters at the very least) and as original as possible.',PASSWORD:"The password is very important. Together with the identifier, it is use to calculate your account number (pblic key) and the private key to access it.<br/><b>Please remember it well</b>, because there is no way to recover it when lost.<br/>Furthermore, it cannot be changed without having to create a new account.<br/><br/>A good password is made (ideally) of at least 8 characters, with at least one capital and one number."},GLOSSARY:{SECTION:"Glossary",PUBKEY_DEF:"A public key always identifies a wallet. It may identify a member. In Cesium it is calculated using the identifier and the password.",UNIVERSAL_DIVIDEND_DEF:'The Universal Dividend (UD) is the quantity of money co-created by each member, according to the period and the calculation defined in the <span class="text-italic">currency rules</span>.<br/>Every term, the members receive an equal amount of new money on their account.<br/><br/>The UD undergoes a steady growth, to remain fair under its members (current and future), calculated by an average life expectancy, as demonstrated in the Relative Theory of Money (RTM).<br/><a href="http://trm.creationmonetaire.info" target="_system">Read more about RTM</a> and open money.'}}}),e.translations("eo-EO",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"dato: {{build}}",PUBKEY:"Publika ŝlosilo",MEMBER:"Membro",BLOCK:"Bloko",BTN_OK:"OK",BTN_YES:"Jes",BTN_NO:"Ne",BTN_SEND:"Sendi",BTN_SEND_MONEY:"Fari elspezon",BTN_SEND_MONEY_SHORT:"Elspezo",BTN_SAVE:"Konservi",BTN_YES_SAVE:"Jes, Konservi",BTN_YES_CONTINUE:"Jes, Daŭrigi",BTN_SHOW:"Vidi",BTN_SHOW_PUBKEY:"Afiŝi la publikan ŝlosilon",BTN_RELATIVE_UNIT:"Afiŝi la sumojn en UD?",BTN_BACK:"Reiro",BTN_NEXT:"Sekva",BTN_IMPORT:"Enporti",BTN_CANCEL:"Nuligi",BTN_CLOSE:"Fermi",BTN_COPY:"Kopii",BTN_LATER:"Poste",BTN_LOGIN:"Konektiĝi",BTN_LOGOUT:"Malkonektiĝo",BTN_ADD_ACCOUNT:"Nova konto",BTN_SHARE:"Diskonigi",BTN_EDIT:"Modifi",BTN_DELETE:"Forigi",BTN_ADD:"Aldoni",BTN_SEARCH:"Traserĉi",BTN_REFRESH:"Aktualigi",BTN_RETRY:"Rekomenci",BTN_START:"Komenci",BTN_CONTINUE:"Daŭrigi",BTN_CREATE:"Krei",BTN_UNDERSTOOD:"Mi komprenis",BTN_OPTIONS:"Kromeblecoj",BTN_HELP_TOUR:"Gvidata vizito",BTN_HELP_TOUR_SCREEN:"Malkovri tiun ĉi paĝon",BTN_DOWNLOAD:"Elŝuti",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Elŝuti la konto-tabelon",BTN_MODIFY:"Modifi",CHOOSE_FILE:"Almetu vian dosieron <br/>aŭ klaku por selekti ĝin",DAYS:"tagoj",NO_ACCOUNT_QUESTION:"Ankoraŭ sen konto? Kreu ĝin senpage!",SEARCH_NO_RESULT:"Neniu rezulto trovita",LOADING:"Bonvolu pacienci...",LOADING_WAIT:"Bonvolu pacienci...<br/><small>(ğchange petadas la reton)</small>",SEARCHING:"Serĉanta...",FROM:"De",TO:"Al",COPY:"Kopii",LANGUAGE:"Lingvo",UNIVERSAL_DIVIDEND:"Universala dividendo",UD:"UD",DATE_PATTERN:"DD/MM/YY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"DD/MM/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(malplena)",UID:"Pseŭdonimo",ENABLE:"Aktiva",DISABLE:"Malaktiva",RESULTS_LIST:"Rezultoj",RESULTS_COUNT:"{{count}} rezultoj",EXECUTION_TIME:"plenumita en {{duration|formatDurationMs}}",SHOW_VALUES:"Afiŝi la signojn klare?",POPOVER_ACTIONS_TITLE:"Kromeblecoj",POPOVER_FILTER_TITLE:"Filtriloj",SHOW_MORE:"Afiŝi pli",SHOW_MORE_COUNT:"(nuna limo je {{limit}})",POPOVER_SHARE:{TITLE:"Diskonigi",SHARE_ON_TWITTER:"Diskonigi ĉe Twitter",SHARE_ON_FACEBOOK:"Diskonigi ĉe Facebook",SHARE_ON_DIASPORA:"Diskonigi ĉe Diaspora*",SHARE_ON_MASTODON:"Diskonigi ĉe Mastodon",INSTANCE_ADDRESS_HELP:"Tajpi la retligon (ekzemple: https://framapiaf.org):"},FILE:{DATE:"Dato:",TYPE:"Tipo:",SIZE:"Amplekso:",VALIDATING:"Validiĝanta..."}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Elekti la fonton:",BTN_PICTURE_GALLERY:"Bildaro",BTN_PICTURE_CAMERA:"<b>Kamerao</b>"},MENU:{HOME:"Hejmpaĝo",WOT:"Kontaro",CURRENCY:"Mono",ACCOUNT:"Mia konto",WALLETS:"Miaj monujoj",TRANSFER:"Elspezo",SCAN:"Skani",SETTINGS:"Parametroj",NETWORK:"Reto",TRANSACTIONS:"Miaj spezoj"},ABOUT:{TITLE:"Prie",LICENSE:"Programo <b>libera</b> (licenco GNU AGPLv3).",LATEST_RELEASE:"Ekzistas <b>pli freŝdata versio</b> de {{'COMMON.APP_NAME'|translate}} (<b>v{{version}}</b>)",PLEASE_UPDATE:"Bonvolu ĝisdatigi {{'COMMON.APP_NAME'|translate}} (lasta versio: <b>v{{version}}</b>)",CODE:"Fonto-kodo:",OFFICIAL_WEB_SITE:"Oficiala retejo:",DEVELOPERS:"Programita de:",FORUM:"Forumo:",DEV_WARNING:"Averto",DEV_WARNING_MESSAGE:"Tiu ĉi programo daŭre estas programiĝanta.<br/>Ne hezitu sciigi al ni la renkontitajn fuŝaĵojn!",DEV_WARNING_MESSAGE_SHORT:"Tiu ĉi programo daŭre estas programiĝanta.",REPORT_ISSUE:"Sciigi problemon"},HOME:{TITLE:"ğ<b>change</b>",MESSAGE:"Bonvenon ĉe ğ<b>change</b>!",MESSAGE_CURRENCY:"Interŝanĝi <b>tra la mondo</b> per {{currency|abbreviate}} fariĝas... tre simple!",BTN_CURRENCY:"Esplori la monon {{name|abbreviate}}",BTN_ABOUT:"Prie",BTN_HELP:"Ret-helpo",REPORT_ISSUE:"fuŝaĵo",NOT_YOUR_ACCOUNT_QUESTION:"Vi ne posedas la konton<br/><b>{{name|| (pubkey|formatPubkey) }}</b> ?",BTN_CHANGE_ACCOUNT:"Malkonektu tiun ĉi konton",CONNECTION_ERROR:'Nodo <b>{{server}}</b> neatingebla por aliri la monon, aŭ adreso nevalida.<br/><br/>Kontrolu vian retkonekton, aŭ ŝanĝu nodon <a class="positive" ng-click="doQuickFix(\'settings\')">ĉe la parametroj</a>.',SHOW_ALL_FEED:"Vidi ĉion",READ_MORE:"Legi la sekvon",FEED_SOURCE:"Fonto"},SETTINGS:{TITLE:"Parametroj",DISPLAY_DIVIDER:"Afiŝado",STORAGE_DIVIDER:"Stokado",NETWORK_SETTINGS:"Reto",PEER:"Adreso de la nodo Duniter",PEER_SHORT:"Adreso de la nodo",PEER_CHANGED_TEMPORARY:"Adreso provizore uzata",PERSIST_CACHE:"Konservi la datenojn pri retumado (provaĵo)",PERSIST_CACHE_HELP:"Ebligas pli rapidan retumadon, loke konservante la ricevitajn datenojn, por uzi ilin de seanco al alia.",USE_LOCAL_STORAGE:"Aktivigi lokan stokadon",USE_LOCAL_STORAGE_HELP:"Ebligas konservi viajn parametrojn",ENABLE_HELPTIP:"Aktivigi la rilatigajn help-vezikojn",ENABLE_UI_EFFECTS:"Aktivigi la vid-efikojn",HISTORY_SETTINGS:"Miaj spezoj",DISPLAY_UD_HISTORY:"Afiŝi la produktitajn dividendojn?",AUTHENTICATION_SETTINGS:"Aŭtentigado",REMEMBER_ME:"Memori min?",REMEMBER_ME_HELP:"Ebligas resti ĉiam konektita.",PLUGINS_SETTINGS:"Krom-programoj",BTN_RESET:"Restarigi la originajn valorojn",EXPERT_MODE:"Aktivigi la spertan moduson",EXPERT_MODE_HELP:"Ebligas pli detalan afiŝadon",POPUP_PEER:{TITLE:"Nodo Duniter",HOST:"Adreso",HOST_HELP:"Adreso : servilo:konektujo",USE_SSL:"Sekurigita?",USE_SSL_HELP:"(SSL-ĉifrado)",BTN_SHOW_LIST:"Listo de la nodoj"}},BLOCKCHAIN:{HASH:"Haketo: {{hash}}",VIEW:{HEADER_TITLE:"Bloko #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Nuna bloko",TITLE:"Bloko #{{number|formatInteger}}",COMPUTED_BY:"Kalkulita de la nodo de",SHOW_RAW:"Vidi la kompletan dosieron",TECHNICAL_DIVIDER:"Teknikaj informoj",VERSION:"Versio de la daten-strukturo",HASH:"Kalkulita haketo",UNIVERSAL_DIVIDEND_HELP:"Mono kunproduktita de ĉiu el la {{membersCount}} membroj",EMPTY:"Neniu dateno en tiu ĉi bloko",POW_MIN:"Minimuma malfacileco",POW_MIN_HELP:"Malfacileco trudita por la haket-kalkulo",DATA_DIVIDER:"Darenoj",IDENTITIES_COUNT:"Novaj identecoj",JOINERS_COUNT:"Novaj membroj",ACTIVES_COUNT:"Revalidigoj",ACTIVES_COUNT_HELP:"Membroj revalidigintaj sian membrecon",LEAVERS_COUNT:"Membroj elirintaj",LEAVERS_COUNT_HELP:"Membroj ne plu dezirantaj atestaĵon",EXCLUDED_COUNT:"Membroj eksigitaj",EXCLUDED_COUNT_HELP:"Malnovaj membroj eksigitaj pro nerevalidiĝo aŭ manko de atestaĵoj",REVOKED_COUNT:"Nuligitaj identecoj",REVOKED_COUNT_HELP:"Tiuj kontoj ne plu povos esti membroj",TX_COUNT:"Spezoj",CERT_COUNT:"Atestaĵoj",TX_TO_HIMSELF:"Operacio pri monŝanĝo",TX_OUTPUT_UNLOCK_CONDITIONS:"Kondiĉoj por malblokado",TX_OUTPUT_OPERATOR:{AND:"kaj",OR:"aŭ"},TX_OUTPUT_FUNCTION:{SIG:"<b>Subskribo</b> de ",XHX:"<b>Pasvorto</b>, el kiu SHA256 =",CSV:"Blokita dum",CLTV:"Blokita ĝis"}},LOOKUP:{TITLE:"Blokoj",NO_BLOCK:"Neniu bloko",LAST_BLOCKS:"Lastaj blokoj:",BTN_COMPACT:"Densigi"}},CURRENCY:{VIEW:{TITLE:"Mono",TAB_CURRENCY:"Mono",TAB_WOT:"Reto de fido",TAB_NETWORK:"Reto",TAB_BLOCKS:"Blokoj",CURRENCY_SHORT_DESCRIPTION:"{{currency|abbreviate}} estas <b>libera mono</b>, kiu ekis {{firstBlockTime|formatFromNow}}. Ĝi nombras nun <b>{{N}} membrojn</b>, kiuj produktas kaj ricevas <a ng-click=\"showHelpModal('ud')\">Universalan Dividendon</a> (UD), ĉiun {{dt|formatPeriod}}n.",NETWORK_RULES_DIVIDER:"Reguloj de la reto",CURRENCY_NAME:"Nomo de la mono",MEMBERS:"Nombro de membroj",MEMBERS_VARIATION:"Variado post la lasta UD",MONEY_DIVIDER:"Mono",MASS:"Mona maso",SHARE:"Maso por membro",UD:"Universala dividendo",C_ACTUAL:"Nuna kreskado",MEDIAN_TIME:"Horo de la blokĉeno",POW_MIN:"Minimuma nivelo pri malfacileco de kalkulo",MONEY_RULES_DIVIDER:"Reguloj de la mono",C_RULE:"Teoria kreskado celata",UD_RULE:"Kalkulo de la universala dividendo",DT_REEVAL:"Periodo de revalorigo de la UD",REEVAL_SYMBOL:"reval",DT_REEVAL_VALUE:"Ĉiuj <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Dato de la unua revalorigo",SIG_QTY_RULE:"Nombro de necesaj atestaĵoj por fariĝi membro",SIG_STOCK:"Maksimuma nombro da senditaj atestaĵoj por membro",SIG_PERIOD:"Minimuma daŭro de atendado inter 2 sinsekvaj atestaĵoj senditaj de sama persono",SIG_WINDOW:"Limdaŭro por akcepti atestaĵon",SIG_VALIDITY:"Vivdaŭro de atestaĵo, kiu estis akceptita",MS_WINDOW:"Limdaŭro por akcepti aliĝ-peton kiel membron",MS_VALIDITY:"Vivdaŭro de aliĝo, kiu estis akceptita",STEP_MAX:"Maksimuma distanco, per la atestaĵoj, inter nova eniranto kaj la referencaj membroj",WOT_RULES_DIVIDER:"Reguloj de la reto de fido",SENTRIES:"Nombro de atestaĵoj (senditaj <b>kaj</b> ricevitaj) por fariĝi referenca membro",SENTRIES_FORMULA:"Nombro de atestaĵoj (senditaj <b>kaj</b> ricevitaj) por fariĝi referenca membro (formulo)",XPERCENT:"Minimuma procento da referencaj membroj atingenda por konformiĝi al la regulo pri distanco",AVG_GEN_TIME:"Meza daŭro inter du blokoj",CURRENT:"nuna",MATH_CEILING:"PLAFONO",DISPLAY_ALL_RULES:"Afiŝi ĉiujn regulojn?",BTN_SHOW_LICENSE:"Vidi la licencon",WOT_DIVIDER:"Reto de fido"},LICENSE:{TITLE:"Licenco de la mono",BTN_DOWNLOAD:"Elŝuti la dosieron",NO_LICENSE_FILE:"Dosiero pri licenco ne trovita."}},NETWORK:{VIEW:{MEDIAN_TIME:"Horo de la blokĉeno",LOADING_PEERS:"Nodoj ŝarĝiĝantaj...",NODE_ADDRESS:"Adreso:",SOFTWARE:"Programo",WARN_PRE_RELEASE:"Antaŭ-versio (lasta stabila versio: <b>{{version}}</b>)",WARN_NEW_RELEASE:"Versio <b>{{version}}</b> disponebla",WS2PID:"Identigilo:",PRIVATE_ACCESS:"Privata aliro",POW_PREFIX:"Prefikso pri labor-pruvo:",ENDPOINTS:{BMAS:"Sekurigita interfaco (SSL)",BMATOR:"Reta interfaco TOR",WS2P:"Interfaco WS2P",ES_USER_API:"Nodo de datenoj Cesium+"}},INFO:{ONLY_SSL_PEERS:"La nodoj ne-SSL estas mis-afiŝitaj, ĉar Cesium funkcias laŭ moduso HTTPS."}},PEER:{PEERS:"Nodoj",SIGNED_ON_BLOCK:"Skribita en la bloko",MIRROR:"spegulo",MIRRORS:"Speguloj",MIRROR_PEERS:"Spegul-nodoj",PEER_LIST:"Listo de la nodoj",MEMBERS:"Membroj",MEMBER_PEERS:"Membro-nodoj",ALL_PEERS:"Ĉiuj nodoj",DIFFICULTY:"Malfacileco",API:"API",CURRENT_BLOCK:"Bloko #",POPOVER_FILTER_TITLE:"Filtrilo",OFFLINE:"Nekonektita",OFFLINE_PEERS:"Nekonektitaj nodoj",BTN_SHOW_PEER:"Vidi la nodon",VIEW:{TITLE:"Nodo",OWNER:"Apartenas al",SHOW_RAW_PEERING:"Vidi la samrangan dokumenton",SHOW_RAW_CURRENT_BLOCK:"Vidi la lastan blokon (kompleta strukturo)",LAST_BLOCKS:"Lastaj blokoj konataj",KNOWN_PEERS:"Konataj nodoj:",GENERAL_DIVIDER:"Ĝeneralaj informoj",ERROR:{LOADING_TOR_NODE_ERROR:"Neeblas ricevi la informojn de la nodo. La limdaŭro de atendado estas transpasita.",LOADING_NODE_ERROR:"Neeblas ricevi la informojn de la nodo"}}},WOT:{SEARCH_HELP:"Traserĉado (familia nomo, persona nomo, markvorto)",SEARCH_INIT_PHASE_WARNING:"Dum la periodo de antaŭ-aliĝo, la traserĉado de la atendantaj aliĝoj <b>povas esti longa</b>. Bonvolu pacienci...",REGISTERED_SINCE:"Enskribita la",REGISTERED_SINCE_BLOCK:"Enskribita en la bloko #",NO_CERTIFICATION:"Neniu atestaĵo validigita",NO_GIVEN_CERTIFICATION:"Neniu atestaĵo sendita",NOT_MEMBER_PARENTHESIS:"(ne membro)",IDENTITY_REVOKED_PARENTHESIS:"(identeco nuligita)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(nuliĝanta)",EXPIRE_IN:"Finiĝo",NOT_WRITTEN_EXPIRE_IN:"Limdato<br/>de traktado",EXPIRED:"Finiĝinta",PSEUDO:"Pseŭdonimo",SIGNED_ON_BLOCK:"Sendita en la bloko #{{block}}",WRITTEN_ON_BLOCK:"Enskribita en la bloko #{{block}}",GENERAL_DIVIDER:"Ĝeneralaj informoj",NOT_MEMBER_ACCOUNT:"Simpla konto (ne membro)",NOT_MEMBER_ACCOUNT_HELP:"Temas pri simpla monujo, sen aliĝ-peto atendanta.",TECHNICAL_DIVIDER:"Teknikaj informoj",BTN_CERTIFY:"Atesti",BTN_YES_CERTIFY:"Jes, atesti",BTN_SELECT_AND_CERTIFY:"Nova atestaĵo",ACCOUNT_OPERATIONS:"Spezoj en la konto",VIEW:{POPOVER_SHARE_TITLE:"Identeco {{title}}"},LOOKUP:{TITLE:"Kontaro",NEWCOMERS:"Novaj membroj:",NEWCOMERS_COUNT:"{{count}} membroj",PENDING:"Atendantaj enskribiĝoj",PENDING_COUNT:"{{count}} atendantaj enskribiĝoj",REGISTERED:"Enskribita {{time | formatFromNow}}",MEMBER_FROM:"Membro depost {{time|formatFromNowShort}}",BTN_NEWCOMERS:"Novaj membroj",BTN_PENDING:"Atendantaj enskribiĝoj",SHOW_MORE:"Afiŝi pli",SHOW_MORE_COUNT:"(nuna limo je {{limit}})",NO_PENDING:"Neniu enskribiĝo atendanta.",NO_NEWCOMERS:"Neniu membro."},CONTACTS:{TITLE:"Kontaktoj"},MODAL:{TITLE:"Traserĉado"},CERTIFICATIONS:{TITLE:"{{uid}} - Atestaĵoj",SUMMARY:"Ricevitaj atestaĵoj",LIST:"Detalo pri la ricevitaj atestaĵoj",PENDING_LIST:"Atestaĵoj atendantaj traktadon",RECEIVED:"Ricevitaj atestaĵoj",RECEIVED_BY:"Atestaĵoj ricevitaj de {{uid}}",ERROR:"Atestaĵoj erare ricevitaj",SENTRY_MEMBER:"Referenca membro"},OPERATIONS:{TITLE:"{{uid}} - Spezoj"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Senditaj atestaĵoj",SUMMARY:"Senditaj atestaĵoj",LIST:"Detalo pri la senditaj atestaĵoj",PENDING_LIST:"Atestaĵoj atendantaj traktadon",SENT:"Senditaj atestaĵoj",SENT_BY:"Atestaĵoj senditaj de {{uid}}",ERROR:"Atestaĵoj erare senditaj"}},LOGIN:{TITLE:'<i class="icon ion-log-in"></i> Konektiĝo',SCRYPT_FORM_HELP:"Bonvolu tajpi viajn identigilojn.<br>Pensu kontroli, ke la publika ŝlosilo estas tiu de via konto.",PUBKEY_FORM_HELP:"Bonvolu tajpi publikan ŝlosilon de konto:",FILE_FORM_HELP:"Elektu la ŝlosilaro-dosieron uzotan:",SCAN_FORM_HELP:"Skani la QR-kodon de monujo.",SALT:"Identigilo",SALT_HELP:"Identigilo",SHOW_SALT:"Afiŝi la identigilon?",PASSWORD:"Pasvorto",PASSWORD_HELP:"Pasvorto",PUBKEY_HELP:"Ekzemple: « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »",NO_ACCOUNT_QUESTION:"Vi ankoraŭ ne havas konton?",HAVE_ACCOUNT_QUESTION:"Vi jam havas konton?",CREATE_ACCOUNT:"Krei konton...",CREATE_FREE_ACCOUNT:"Krei konton senpage",FORGOTTEN_ID:"Pasvorto forgesita?",ASSOCIATED_PUBKEY:"Publika ŝlosilo de la ŝlosilaro:",BTN_METHODS:"Aliaj metodoj",BTN_METHODS_DOTS:"Ŝanĝi metodon...",METHOD_POPOVER_TITLE:"Metodoj",MEMORIZE_AUTH_FILE:"Memorigi tiun ŝlosilaron por la daŭro de la sesio de retumado",SCRYPT_PARAMETERS:"Parametroj (Skripto):",AUTO_LOGOUT:{TITLE:"Informo",MESSAGE:'<i class="ion-android-time"></i> Vi estis <b>malkonektita</b> aŭtomate, pro tro longa senaktiveco.',BTN_RELOGIN:"Rekonektiĝi",IDLE_WARNING:"Vi estos malkonektita... {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Identigilo kaj pasvorto",SCRYPT_ADVANCED:"Sperta salumado",FILE:"Dosiero pri ŝlosilaro",PUBKEY:"Publika ŝlosilo aŭ pseŭdonimo",SCAN:"Skani QR-kodon"},SCRYPT:{SIMPLE:"Malpeza salumado",DEFAULT:"Kutima salumado",SECURE:"Sekura salumado",HARDEST:"Plej sekura salumado",EXTREME:"Ekstrema salumado",USER:"Personigita salumado",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{DATE:"Dato:",TYPE:"Tipo:",SIZE:"Amplekso:",VALIDATING:"Validigo...",HELP:"Atendita strukturo de dosiero: <b>.yml</b> aŭ <b>.dunikey</b> (tipo PubSec, WIF aŭ EWIF)."}},ACCOUNT:{TITLE:"Mia konto",SHOW_MORE_TX:"Afiŝi pli",SHOW_ALL_TX:"Afiŝi ĉion",EVENTS:"Okazaĵoj",BTN_RECEIVE_MONEY:"Enkasigi",BTN_SECURITY_DOTS:"Konto kaj sekureco...",BTN_SHOW_DETAILS:"Afiŝi la teknikajn informojn",NEW:{TITLE:"Enskribiĝo",INTRO_WARNING_TIME:"La kreado de konto ĉe {{name|capitalize}} estas tre simpla. Bonvolu tamen dediĉi sufiĉe da tempo por ĝuste efektivigi tiun proceduron (por ne forgesi la identigilojn, pasvortojn, ktp.).",INTRO_WARNING_SECURITY:"Kontrolu ke la aparatoj, kiujn vi nun uzas (komputilo, tabuleto, telefono), <b>estas sekurigitaj kaj fidindaj</b>.",INTRO_WARNING_SECURITY_HELP:"Senvirusigilo ĝisdata, fajroŝirmilo aktivigita, sesio protektita per pasvorto aŭ PIN-kodo, ktp.",INTRO_HELP:"Alklaku <b>{{'COMMON.BTN_START'|translate}}</b> por ekigi la kreadon de konto. Vi estos gvidata paŝon post paŝo.",REGISTRATION_NODE:"Via aliĝo estos registrita tra la nodo Duniter <b>{{server}}</b>, kiu dissendos ĝin poste al la cetero de la mon-reto.",REGISTRATION_NODE_HELP:"Se vi ne fidas tiun nodon, bonvolu ŝanĝi ĝin <a ng-click=\"doQuickFix('settings')\">en la parametroj</a> de Cesium.",SELECT_ACCOUNT_TYPE:"Elektu la tipon de konto kreota:",MEMBER_ACCOUNT:"Membro-konto",MEMBER_ACCOUNT_TITLE:"Kreado de membro-konto",MEMBER_ACCOUNT_HELP:"Se vi ankoraŭ ne enskribiĝis kiel individuo (nur unu konto eblas por unu individuo). Tia konto ebligas kunprodukti la monon, ricevante <b> universalan dividendon</b> ĉiun {{parameters.dt|formatPeriod}}n.",WALLET_ACCOUNT:"Simpla monujo",WALLET_ACCOUNT_TITLE:"Kreado de monujo",WALLET_ACCOUNT_HELP:"Por ĉiuj aliaj kazoj, ekzemple se vi bezonas plian konton.<br/>Neniu universala dividendo estos kreita per tia konto.",SALT_WARNING:"Elektu vian sekretan identigilon.<br/>Oni petos ĝin de vi ĉiufoje, kiam vi konektiĝos al tiu konto.<br/><br/><b>Bone memorigu ĝin</b>: kaze de perdo, neniu alia povos aliri vian konton!",PASSWORD_WARNING:"Elektu pasvorton.<br/>Oni petos ĝin de vi ĉiufoje, kiam vi konektiĝos al tiu konto.<br/><br/><b>Bone memorigu tiun pasvorton</b: kaze de perdo, neniu alia povos aliri vian konton!",PSEUDO_WARNING:"Elektu pseŭdonimon.<br/>Ĝi utilas al la aliaj membroj, por identigi vin pli facile.<div class='hidden-xs'><br/>Ĝi <b>ne povos esti modifita</b>, sen rekrei konton.</div><br/><br/>Ĝi entenu <b>nek spacon, nek diakritan literon (kun supersigno, ktp.)</b>.<div class='hidden-xs'><br/>Ekzemple: <span class='gray'>NataljaBelulino, JohanoStelaro, ktp.</span>",PSEUDO:"Pseŭdonimo",PSEUDO_HELP:"Pseŭdonimo",SALT_CONFIRM:"Konfirmo",SALT_CONFIRM_HELP:"Konfirmo de la sekreta identigilo",PASSWORD_CONFIRM:"Konfirmo",PASSWORD_CONFIRM_HELP:"Konfirmo de la pasvorto",SLIDE_6_TITLE:"Konfirmo:",COMPUTING_PUBKEY:"Kalkulanta...",LAST_SLIDE_CONGRATULATION:"Vi tajpis ĉiujn necesajn informojn: Gratulon!<br/>Vi nun povas <b>sendi la peton por kreado</b> de la konto.</b><br/><br/>Por informo, la publika ŝlosilo ĉi-sube identigos vian estontan konton.<br/>Ĝi povos estis sciigita al aliuloj por ricevi iliajn pagojn.<br/><b>Ne estas devige</b> noti ĝin nun, vi ankaŭ povos fari tion poste.",CONFIRMATION_MEMBER_ACCOUNT:'<b class="assertive">Averto:</b> la sekreta identigilo, la pasvorto kaj la pseŭdonimo ne plu povos esti modifitaj.<br/><br/><b>Certiĝu, ke vi ĉiam rememorigos ĝin!</b><br/><br/><b>Ĉu vi certas</b>, ke vi deziras sendi tiun ĉi aliĝo-peton?',CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Averto:</b> la sekreta identigilo kaj la pasvorto ne plu povos esti modifitaj.<br/><br/><b>Certiĝu, ke vi ĉiam rememorigos ĝin!</b><br/><br/><b>Ĉu vi certas</b>, ke vi deziras daŭrigi per tiuj ĉi identigiloj?',CHECKING_PSEUDO:"Kontrolo...",PSEUDO_AVAILABLE:"Pseŭdonimo disponebla",PSEUDO_NOT_AVAILABLE:"Pseŭdonimo ne disponebla",INFO_LICENSE:"Antaŭ ol krei membro-konton, <b>bonvolu legi kaj akcepti la licencon</b> pri uzado de la mono:",BTN_ACCEPT:"Mi akceptas",BTN_ACCEPT_LICENSE:"Mi akceptas la licencon"},POPUP_REGISTER:{TITLE:"Elektu pseŭdonimon",HELP:"Pseŭdonimo estas deviga por fariĝi membro."},HEADERS:{TIME:"Dato",AMOUNT:"Sumo",COMMENT:"Komento"}},TRANSFER:{TITLE:"Elspezo",SUB_TITLE:"Fari elspezon",FROM:"De",TO:"Al",AMOUNT:"Sumo",AMOUNT_HELP:"Sumo",COMMENT:"Komento",COMMENT_HELP:"Komento",BTN_SEND:"Sendi",BTN_ADD_COMMENT:"Aldoni komenton?",MODAL:{TITLE:"Elspezo"}},ERROR:{UNKNOWN_URI_FORMAT:"URI-formato nekonata",PUBKEY_INVALID_CHECKSUM:"Publika ŝlosilo nevalida (bad checksum).",POPUP_TITLE:"Eraro",UNKNOWN_ERROR:"Eraro nekonata",CRYPTO_UNKNOWN_ERROR:"Via retumilo ŝajnas ne kongrua kun la kriptografiaj funkcioj.",EQUALS_TO_PSEUDO:"Devas esti malsama ol la pseŭdonimo",EQUALS_TO_SALT:"Devas esti malsama ol la sekreta identigilo",FIELD_REQUIRED:"Deviga kampo",FIELD_TOO_SHORT:"Signaro tro mallonga",FIELD_TOO_SHORT_WITH_LENGTH:"Signaro tro mallonga ({{minLength}} signoj minimume)",FIELD_TOO_LONG:"Signaro tro longa",FIELD_TOO_LONG_WITH_LENGTH:"Signaro tro longa ({{maxLength}} signoj maksimume)",FIELD_MIN:"Minimuma longeco: {{min}}",FIELD_MAX:"Maksimuma longeco: {{max}}",FIELD_ACCENT:"Diakritaj literoj kaj komoj ne permesataj",FIELD_NOT_NUMBER:"Nombra valoro atendata",FIELD_NOT_INT:"Entjera nombro atendata",FIELD_NOT_EMAIL:"Retadreso nevalida",PASSWORD_NOT_CONFIRMED:"Ne kongruas kun la pasvorto",SALT_NOT_CONFIRMED:"Ne kongruas kun la sekreta identigilo",SEND_IDENTITY_FAILED:"Aliĝo malsukcesa",SEND_CERTIFICATION_FAILED:"Atestado malsukcesa",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"Vi ne povas efektivigi atestadon, ĉar via konto <b>ne estas membro</b>.",NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF:"Vi ne povas efektivigi atestadon, ĉar via konto ankoraŭ ne estas membro.<br/><br/>Ankoraŭ mankas al vi atestaĵoj, aŭ tiuj ĉi ankoraŭ ne estis validigitaj.",NOT_MEMBER_FOR_CERTIFICATION:"Via konto ankoraŭ ne estas membro.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"Konto ne atestebla. Neniu aliĝo-peto estis farita, aŭ la aliĝo ne estis revalidigita.",LOGIN_FAILED:"Eraro dum konektiĝo.",LOAD_IDENTITY_FAILED:"Eraro por ŝarĝi la identecon.",LOAD_REQUIREMENTS_FAILED:"Eraro por ŝarĝi la antaŭ-necesaĵoj de la identeco.",SEND_MEMBERSHIP_IN_FAILED:"Malsukceso pri la provado eniri la komunumon.",SEND_MEMBERSHIP_OUT_FAILED:"Malsukceso pri la ĉesigo de la aliĝo.",REFRESH_WALLET_DATA:"Malsukceso pri la ĝisdatigo de la monujo.",GET_CURRENCY_PARAMETER:"Malsukceso por ricevi la regulojn de la mono.",GET_CURRENCY_FAILED:"Ne eblis ŝarĝi la monon. Bonvolu reprovi pli poste.",SEND_TX_FAILED:"Elspezado malsukcesa.",ALL_SOURCES_USED:"Bonvolu atendi la kalkulon de la venonta bloko (ĉiuj viaj monfontoj estis uzitaj).",NOT_ENOUGH_SOURCES:"Ne sufiĉe da mono por sendi tiun ĉi sumon per ununura spezo.<br/>Maksimuma sumo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Malsukceso por krei la membro-konton.",RESTORE_WALLET_DATA_ERROR:"Malsukceso por reŝarĝi la parametrojn de la loka stokaĵo",LOAD_WALLET_DATA_ERROR:"Malsukceso por ŝarĝi la datenojn de la monujo.",COPY_CLIPBOARD_FAILED:"Ne eblis kopii la valoron.",TAKE_PICTURE_FAILED:"Malsukceso por ricevi la foton.",SCAN_FAILED:"Malsukceso por skani la QR-kodon.",SCAN_UNKNOWN_FORMAT:"Kodo nerekonata.",WOT_LOOKUP_FAILED:"Serĉado malsukcesa.",LOAD_PEER_DATA_FAILED:"Ne eblis legi la nodon Duniter. Bonvolu reprovi poste.",NEED_LOGIN_FIRST:"Bonvolu unue konektiĝi.",AMOUNT_REQUIRED:"La monsumo estas deviga.",AMOUNT_NEGATIVE:"Negativa sumo nepermesata.",NOT_ENOUGH_CREDIT:"Saldo nesufiĉa.",INVALID_NODE_SUMMARY:"Nodo neatingebla aŭ adreso nevalida.",INVALID_USER_ID:"La pseŭdonimo devas enteni nek spacon nek signon specialan aŭ kun supersigno.",INVALID_COMMENT:"La kampo 'referenco' ne devas enteni literojn kun supersigno.",INVALID_PUBKEY:"La publika ŝlosilo ne havas la atenditan strukturon.",INVALID_PUBKEY_CHECKSUM:"Kontrolsumo nevalida.",IDENTITY_REVOKED:"Tiu ĉi identeco <b>estis nuligita</b>. Ĝi ne plu povas fariĝi membro.",IDENTITY_PENDING_REVOCATION:"La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon. La atestado estas do malaktivigita.",IDENTITY_INVALID_BLOCK_HASH:"Tiu ĉi aliĝo-peto ne plu validas (ĉar ĝi rilatas al bloko, kiun nuligis la nodoj de la reto): tiu persono devas refari sian aliĝo-peton <b>antaŭ ol</b> esti atestita.",IDENTITY_EXPIRED:"La publikigo de tiu ĉi identeco finiĝis: tiu persono devas fari novan aliĝo-peton <b>antaŭ ol</b> esti atestita.",IDENTITY_SANDBOX_FULL:"La nodo Duniter uzata de Cesium ne plu povas ricevi novajn identecojn, ĉar ĝia atendo-vico estas plena.<br/><br/>Bonvolu reprovi poste aŭ ŝanĝi la nodon (per la menuo <b>Parametroj</b>).",IDENTITY_NOT_FOUND:"Identeco ne trovita.",IDENTITY_TX_FAILED:"Malsukceso por ŝarĝi la spezojn.",WOT_PENDING_INVALID_BLOCK_HASH:"Aliĝo ne valida.",WALLET_INVALID_BLOCK_HASH:"Via aliĝo-peto ne plu validas (ĉar ĝi rilatas al bloko, kiun nuligis la nodoj de la reto).<br/>Vi devas <a ng-click=\"doQuickFix('fixMembership')\">sendi novan peton</a> por solvi tiun ĉi problemon.",WALLET_IDENTITY_EXPIRED:"La publikigo de <b>via identeco finiĝis</b>.<br/>Vi devas <a ng-click=\"doQuickFix('fixIdentity')\">publikigi denove vian identecon</a> por solvi tiun ĉi problemon.",WALLET_REVOKED:"Via identeco estis <b>nuligita</b>: nek via pseŭdonimo nek via publika ŝlosilo povos esti uzata en la estonteco por membro-konto.",WALLET_HAS_NO_SELF:"Via identeco devas unue esti publikigita, kaj ne esti finiĝinta.",AUTH_REQUIRED:"Aŭtentigado necesa.",AUTH_INVALID_PUBKEY:"La publika ŝlosilo ne rilatas al la konektita konto.",AUTH_INVALID_SCRYPT:"Identigilo aŭ pasvorto nevalida.",AUTH_INVALID_FILE:"Dosiero pri ŝlosilaro nevalida.",AUTH_FILE_ERROR:"Malsukceso por malfermi la dosieron pri ŝlosilaro.",IDENTITY_ALREADY_CERTIFY:"Vi <b>jam atestis</b> tiun identecon.<br/><br/>Tiu atestado daŭre validas (finiĝo {{expiresIn|formatDurationTo}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"Vi <b>jam atestis</b> tiun identecon.<br/><br/>Tiu atestado atendas traktadon (limdato de traktado {{expiresIn|formatDurationTo}}).",UNABLE_TO_CERTIFY_TITLE:"Atestado neebla",LOAD_NEWCOMERS_FAILED:"Malsukceso por ŝarĝi la novajn membrojn.",LOAD_PENDING_FAILED:"Malsukceso por ŝarĝi la atendantajn aliĝojn.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"Vi devas <b>esti membro</b> por rajti efektivigi tiun ĉi agon.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"Via identeco devas <b>jam esti publikigita</b>, por ke vi rajtu efektivigi tiun ĉi agon.",GET_BLOCK_FAILED:"Malsukceso por ricevi la blokon.",INVALID_BLOCK_HASH:"Bloko ne trovita (haketo malsama)",DOWNLOAD_REVOCATION_FAILED:"Malsukceso por elŝuti la dosieron pri nuligo.",REVOCATION_FAILED:"Malsukceso pri nuligo.",SALT_OR_PASSWORD_NOT_CONFIRMED:"Sekreta identigilo aŭ pasvorto malĝusta.",RECOVER_ID_FAILED:"Malsukceso por ricevi la identigilojn",LOAD_FILE_FAILED:"Malsukceso por ŝarĝi la dosieron",NOT_VALID_REVOCATION_FILE:"Dosiero pri nuligo ne valida (malĝusta strukturo de dosiero)",NOT_VALID_SAVE_ID_FILE:"Dosiero pri konservado ne valida (malĝusta strukturo de dosiero)",NOT_VALID_KEY_FILE:"Dosiero pri ŝlosilaro ne valida (strukturo ne rekonata)",EXISTING_ACCOUNT:"Viaj identigiloj rilatas al jam ekzistanta konto, kies <a ng-click=\"showHelpModal('pubkey')\">publika ŝlosilo</a> estas:",EXISTING_ACCOUNT_REQUEST:"Bonvolu modifi viajn identigilojn, por ke ili rilatu al ne uzata konto.",GET_LICENSE_FILE_FAILED:"La ricevo de la dosiero pri licenco ne eblis.",CHECK_NETWORK_CONNECTION:"Neniu nodo ŝajnas atingebla.<br/><br/>Bonvolu <b>kontroli vian retkonekton</b>."},INFO:{POPUP_TITLE:"Informo",CERTIFICATION_DONE:"Atestaĵo sendita",NOT_ENOUGH_CREDIT:"Saldo nesufiĉa",TRANSFER_SENT:"Elspezo sendita",COPY_TO_CLIPBOARD_DONE:"Kopiita en la loka memoro",MEMBERSHIP_OUT_SENT:"Eksiĝo sendita",NOT_NEED_MEMBERSHIP:"Vi jam estas membro.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"Al tiu ĉi identeco baldaŭ mankos atestaĵoj (almenaŭ {{willNeedCertificationCount}}).",REVOCATION_SENT:"Nuligo sendita",REVOCATION_SENT_WAITING_PROCESS:"La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon.",FEATURES_NOT_IMPLEMENTED:"Tiu ĉi funkciaro ankoraŭ estas programiĝanta.<br/>Kial ne <b>kontribui al Cesium</b>, por ekhavi ĝin pli rapide? ;)",EMPTY_TX_HISTORY:"Neniu spezo elportota"},CONFIRM:{POPUP_TITLE:"<b>Konfirmo</b>",POPUP_WARNING_TITLE:"<b>Averto</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Averto pri sekureco</b>',CERTIFY_RULES_TITLE_UID:"Atesti {{uid}}",CERTIFY_RULES:'<b class="assertive">NE atestu</b> konton, se vi pensas ke:<br/><br/><ul><li>1.) ĝi ne rilatas al persono <b>fizika kaj vivanta</b>.<li>2.) ĝia posedanto <b>havas alian konton</b> jam atestitan.<li>3.) ĝia posedanto malobservas (vole aŭ ne) la regulon 1 aŭ 2 (ekzemple atestante falsajn kontojn aŭ duoblajn).</ul><br/><b>Ĉu vi certas,</b> ke vi tamen volas atesti tiun ĉi identecon?',FULLSCREEN:"Afiŝi la programon plen-ekrane?",EXIT_APP:"Fermi la programon?",LOGIN_UNUSED_WALLET_TITLE:"Tajperaro?",LOGIN_UNUSED_WALLET:"La konektita konto ŝajnas <b>neaktiva</b>.<br/><br/>Temas probable pri <b>tajperaro</b> en viaj konekto-identigiloj. Bonvolu rekomenci, kontrolante ke <b>la publika ŝlosilo estas tiu de via konto</b>.",SAVE_BEFORE_LEAVE:"Ĉu vi volas <b>konservi viajn modifojn</b> antaŭ ol eliri el la paĝo?",SAVE_BEFORE_LEAVE_TITLE:"Modifoj ne registritaj",LOGOUT:"Ĉu vi certas, ke vi volas malkonektiĝi?",USE_FALLBACK_NODE:"Nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la nodon <b>{{new}}</b> ?"},HELP:{TITLE:"Ret-helpo",JOIN:{SECTION:"Enskribiĝo",SALT:'La sekreta identigilo estas tre grava. Ĝi utilas por miksi la pasvorton, antaŭ ol ĝi servos por kalkuli la <span class="text-italic">publikan ŝlosilon</span> de via konto (ties numeron) kaj la sekretan ŝlosilon por aliri ĝin.<br/><b>Zorgu pri ĝia bona memorigado</b>, ĉar neniu rimedo estas nuntempe planita por retrovi ĝin kaze de perdo.<br/>Krom tio, ĝi ne povas esti modifita sen devige krei novan konton.<br/><br/>Bona sekreta identigilo devas esti sufiĉe longa (kun almenaŭ 8 signoj) kaj kiel eble plej originala.',PASSWORD:"La pasvorto estas tre grava. Kun la sekreta identigilo, ĝi servas por kalkuli la numeron (la publikan ŝlosilon) de via konto, kaj la sekretan ŝlosilon por aliri ĝin.<br/><b>Zorgu pri ĝia bona memorigado</b>, ĉar neniu rimedo estas planita por retrovi ĝin kaze de perdo (krom se oni generas konserv-dosieron).<br/>Krom tio, ĝi ne povas esti modifita sen devige krei novan konton.<br/><br/>Bona pasvorto entenas (ideale) almenaŭ 8 signojn, inter kiuj estas almenaŭ unu majusklo kaj unu cifero."},GLOSSARY:{SECTION:"Glosaro",PUBKEY_DEF:'Publika ŝlosilo identigas monujon, kiu povas identigi membron aŭ rilati al anonima monujo. Ĉe Cesium la publika ŝlosilo estas kalkulita (implicite) dank\'al la sekreta identigilo kaj la pasvorto.<br/><a href="https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique" target="_system">Scii pli pri kriptografio</a> per publika ŝlosilo.',UNIVERSAL_DIVIDEND_DEF:'La Universala Dividendo (UD) estas la kvanto de mono kunkreita de ĉiu membro, laŭ la periodo kaj kalkulo difinitaj en la <span class="text-italic">reguloj de la mono</span>.<br/>Por ĉiu perioda dato, la membroj ricevas en sian konton la saman kvanton da nova mono.<br/><br/>La UD spertas regulan kreskon, por resti justa inter la membroj (nunaj kaj venontaj), kalkulitan depende de la meza vivespero, kiel estas demonstrite en la Teorio Relativa pri la Mono (TRM).<br/><a href="http://trm.creationmonetaire.info" target="_system">Scii pli pri la TRM</a> kaj la liberaj monoj.'}}}),e.translations("es-ES",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"fecha: {{build}}",PUBKEY:"Llave pública",MEMBER:"Miembro",BLOCK:"Bloque",BTN_OK:"OK",BTN_YES:"Sí",BTN_NO:"No",BTN_SEND:"Enviar",BTN_SEND_MONEY:"Hacer un pago",BTN_SEND_MONEY_SHORT:"Pago",BTN_SAVE:"Guardar",BTN_YES_SAVE:"Sí, guardar",BTN_YES_CONTINUE:"Sí, continuar",BTN_SHOW:"Ver",BTN_SHOW_PUBKEY:"Ver la llave",BTN_RELATIVE_UNIT:"Mostrar importes en DU",BTN_BACK:"Anterior",BTN_NEXT:"Siguiente",BTN_IMPORT:"Importar",BTN_CANCEL:"Cancelar",BTN_CLOSE:"Cerrar",BTN_LATER:"Más tarde",BTN_LOGIN:"Conectarse",BTN_LOGOUT:"Desconexión",BTN_ADD_ACCOUNT:"Nueva cuenta",BTN_SHARE:"Compartir",BTN_EDIT:"Modificar",BTN_DELETE:"Suprimir",BTN_ADD:"Añadir",BTN_SEARCH:"Buscar",BTN_REFRESH:"Actualizar",BTN_RETRY:"Empezar de nuevo",BTN_START:"Empezar",BTN_CONTINUE:"Continuar",BTN_COPY:"Copiar",BTN_CREATE:"Crear",BTN_UNDERSTOOD:"Entendido",BTN_OPTIONS:"Opciones",BTN_HELP_TOUR:"Visita guiada",BTN_HELP_TOUR_SCREEN:"Explicar esta pantalla",BTN_DOWNLOAD:"Descargar",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Descargar historial de cuenta",BTN_MODIFY:"Modificar",CHOOSE_FILE:"Arrastre el archivo<br/>o haga clic para seleccionarlo",DAYS:"Días",NO_ACCOUNT_QUESTION:"¿Todavía no es miembro? ¡Crear una cuenta!",SEARCH_NO_RESULT:"Ningún resultado encontrado",LOADING:"Espere por favor…",LOADING_WAIT:"Espere por favor…<br/><small>(Esperando disponibilidad de nodo)</small>",SEARCHING:"Búsqueda en proceso…",FILE:{DATE:"Fecha:",SIZE:"Tamaño:",TYPE:"Tipo:",VALIDATING:"Validando..."},FROM:"De",TO:"A",COPY:"Copiar",LANGUAGE:"Idioma",UNIVERSAL_DIVIDEND:"Dividendo universal",UD:"DU",DATE_PATTERN:"DD/MM/YYYY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"DD/MM/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(vacío)",UID:"Seudónimo",ENABLE:"Activado",DISABLE:"Desactivado",RESULTS_LIST:"Resultados:",RESULTS_COUNT:"{{count}} resultados",EXECUTION_TIME:"ejecutado en {{duration|formatDurationMs}}",SHOW_VALUES:"¿Publicar los valores no codificados?",POPOVER_ACTIONS_TITLE:"Opciones",POPOVER_FILTER_TITLE:"Filtros",SHOW_MORE:"Mostrar más",SHOW_MORE_COUNT:"(límite actual {{limit}})",POPOVER_SHARE:{TITLE:"Compartir",INSTANCE_ADDRESS_HELP:"Introduce la dirección de la instancia (ej: https://red.confederac.io/):",SHARE_ON_MASTODON:"Compartir en Mastodon",SHARE_ON_TWITTER:"Compartir en Twitter",SHARE_ON_FACEBOOK:"Compartir en Facebook",SHARE_ON_DIASPORA:"Compartir en Diaspora*",SHARE_ON_GOOGLEPLUS:"Compartir en Google+"}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Elegir la fuente:",BTN_PICTURE_GALLERY:"Galería",BTN_PICTURE_CAMERA:"<b>Cámara</b>"},MENU:{CURRENCIES:"Monedas",SCAN:"Escanear",TRANSFER:"Transferir",HOME:"Inicio",WOT:"Directorio",CURRENCY:"Moneda",ACCOUNT:"Mi cuenta",SETTINGS:"Ajustes",NETWORK:"Red",TRANSACTIONS:"Mis transacciones",WALLETS:"Mis monederos"},ABOUT:{LATEST_RELEASE:"Hay una <b>versión nueva</b> de {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)",OFFICIAL_WEB_SITE:"Sitio Web Oficial:",PLEASE_UPDATE:"Por favor actualice {{'COMMON.APP_NAME' | translate}} (última versión: <b>v{{version}}</b>)",DEV_WARNING:"Advertencia",DEV_WARNING_MESSAGE:"Esta aplicación todavía se encuentra en desarrollo.<br/>¡No dude en reportarnos las anomalías encontradas!",DEV_WARNING_MESSAGE_SHORT:"Esta app todavía está en desarrollo.",TITLE:"Acerca de",LICENSE:"Software <b>libre</b> (licencia GNU AGPLv3).",CODE:"Código fuente:",DEVELOPERS:"Desarrollado por:",FORUM:"Foro:",REPORT_ISSUE:"Reportar un problema"},HOME:{FEED_SOURCE:"Fuente",READ_MORE:"Leer más",SHOW_ALL_FEED:"Ver todo",TITLE:"ğ<b>change</b>",MESSAGE:"¿ ğ<b>change</b> ?",BTN_CURRENCY:"Explorar la moneda",MESSAGE_CURRENCY:"¡Intercambiar en {{currency|abbreviate}} ahora es… muy sencillo!",BTN_ABOUT:"Acerca de",BTN_HELP:"Ayuda en línea",REPORT_ISSUE:"anomalía",NOT_YOUR_ACCOUNT_QUESTION:'¿No es suya la cuenta <b><i class="ion-key"></i> {{pubkey|formatPubkey}}</b>?',BTN_CHANGE_ACCOUNT:"Desconectar esta cuenta",CONNECTION_ERROR:'Nodo <b>{{servidor}}</b> inalcanzable o dirección inválida.<br/><br/>Compruebe su conexión a Internet, o nodo de conmutación <a class="positive" ng-click="doQuickFix(\'settings\')">en los ajustes</a>.'},SETTINGS:{AUTO_LOGOUT:"Desconexión automática",AUTO_LOGOUT_HELP:"Periodo de inactividad antes de la desconexión",AUTO_LOGOUT_OPTION_HOUR:"Despúes de {{value}} hora",AUTO_LOGOUT_OPTION_MINUTE:"Despúes de {{value}} minuto",AUTO_LOGOUT_OPTION_MINUTES:"Despúes de {{value}} minuto",AUTO_LOGOUT_OPTION_NEVER:"Nunca",AUTO_LOGOUT_OPTION_SECONDS:"Despúes de {{value}} segundos",TITLE:"Ajustes",DISPLAY_DIVIDER:"Visualización",STORAGE_DIVIDER:"Almacenamiento",NETWORK_SETTINGS:"Red",PEER:"Dirección del nodo Duniter",PEER_CHANGED_TEMPORARY:"Dirección utilizada temporalmente",PEER_SHORT:"Nodo Duniter",PERSIST_CACHE:"Conservar los datos de navegación (experimental)",PERSIST_CACHE_HELP:"Permite una navegación más rápida, conservando localmente los datos recibidos, para usar de una sesión a otra.",USE_LOCAL_STORAGE:"Activar el almacenamiento local",USE_LOCAL_STORAGE_HELP:"Permitir conservar sus ajustes",ENABLE_HELPTIP:"Activar la ayuda contextual",ENABLE_UI_EFFECTS:"Activar los efectos visuales",HISTORY_SETTINGS:"Transacciones de la cuenta",DISPLAY_UD_HISTORY:"Mostrar los DU creados",AUTHENTICATION_SETTINGS:"Autenticación",REMEMBER_ME:"Recordarme",REMEMBER_ME_HELP:"Permite mantenerse siempre conectado (no recomendado), conservando localmente la llave pública.",PLUGINS_SETTINGS:"Extensiones",BTN_RESET:"Restaurar los valores por defecto",EXPERT_MODE:"Modo experto",EXPERT_MODE_HELP:"Permite una visualización más detallada",POPUP_PEER:{TITLE:"Nodo Duniter",HOST:"Dirección",HOST_HELP:"Dirección: servidor:puerto",USE_SSL:"Conexión segura",USE_SSL_HELP:"(Cifrado SSL)",BTN_SHOW_LIST:"Lista de nodos"}},BLOCKCHAIN:{HASH:"Hash: {{hash}}",VIEW:{HEADER_TITLE:"Bloque #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Bloque actual",TITLE:"Bloque #{{number|formatInteger}}",COMPUTED_BY:"Calculado por el nodo de",SHOW_RAW:"Ver el fichero en bruto",TECHNICAL_DIVIDER:"Informaciones técnicas",VERSION:"Versión del formato",HASH:"Hash calculado",UNIVERSAL_DIVIDEND_HELP:"Moneda co-producida por cada uno de los {{membersCount}} miembros",EMPTY:"Ningún dato en este bloque",POW_MIN:"Dificultad mínima",POW_MIN_HELP:"Dificultad impuesta por el cálculo del hash",DATA_DIVIDER:"Datos",IDENTITIES_COUNT:"Nuevas identidades",JOINERS_COUNT:"Nuevos miembros",ACTIVES_COUNT:"Renovaciones",ACTIVES_COUNT_HELP:"Miembros que han renovado sus adhesiones",LEAVERS_COUNT:"Miembros salientes",LEAVERS_COUNT_HELP:"Miembros salientes que ya no quieren estar certificados",EXCLUDED_COUNT:"Miembros excluidos",EXCLUDED_COUNT_HELP:"Antiguos miembros excluidos por no renovación o falta de certificaciones",REVOKED_COUNT:"Identidades revocadas",REVOKED_COUNT_HELP:"Estas cuentas no podrán ser miembros",TX_COUNT:"Transacciones",CERT_COUNT:"Certificaciones",TX_TO_HIMSELF:"Operación de cambio",TX_OUTPUT_UNLOCK_CONDITIONS:"Condiciones de desbloqueo",TX_OUTPUT_OPERATOR:{AND:"y",OR:"o"},TX_OUTPUT_FUNCTION:{SIG:"<b>Firma</b> de ",XHX:"<b>Contraseña</b>, cuyo SHA256 =",CSV:"Bloqueado durante",CLTV:"Bloqueado hasta"}},LOOKUP:{TITLE:"Bloques",NO_BLOCK:"Ningún bloque",LAST_BLOCKS:"Últimos bloques:",BTN_COMPACT:"Compactar"}},CURRENCY:{VIEW:{TITLE:"Moneda",TAB_CURRENCY:"Moneda",TAB_WOT:"Red de confianza",TAB_NETWORK:"Red",TAB_BLOCKS:"Bloques",CURRENCY_SHORT_DESCRIPTION:"{{currency|abbreviate}} es una <b>moneda libre</b>, originada {{firstBlockTime|formatFromNow}}. Cuenta actualmente con <b>{{N}} miembros</b>, que producen y reciben un <a ng-click=\"showHelpModal('ud')\">Dividendo Universal</a> (DU) cada {{dt|formatPeriod}}.",NETWORK_RULES_DIVIDER:"Reglas de la red",CURRENCY_NAME:"Nombre de la moneda",MEMBERS:"Cantidad de miembros",MEMBERS_VARIATION:"Variación desde último DU",MONEY_DIVIDER:"Moneda",MASS:"Masa monetaria",SHARE:"Masa media por miembro",UD:"Dividendo Universal",C_ACTUAL:"Crecimiento actual",MEDIAN_TIME:"Hora de la cadena de bloques",POW_MIN:"Nivel mínimo de dificultad de cálculo",MONEY_RULES_DIVIDER:"Reglas de la moneda",C_RULE:"Crecimiento teórico objetivo",UD_RULE:"Cálculo del dividendo universal",DT_REEVAL:"Periodo de revalorización del DU",REEVAL_SYMBOL:"reval",DT_REEVAL_VALUE:"Todos los <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Fecha de la primera revalorización",SIG_QTY_RULE:"Certificaciones requeridas para ser miembro",SIG_STOCK:"Máximo de certificaciones emitibles por miembros",SIG_PERIOD:"Espera mínima entre 2 certificaciones sucesivas emitidas por la misma persona",SIG_WINDOW:"Límite para tener en cuenta una certificación",SIG_VALIDITY:"Duración de una certificación que ya ha sido aceptada",MS_WINDOW:"Límite para aprobar una solicitud de membresía",STEP_MAX:"Distancia máxima entre una nueva candidatura y cada miembro referente",WOT_RULES_DIVIDER:"Reglas de la red de confianza",SENTRIES:"Certificaciones necesarias para ser miembro referente",SENTRIES_FORMULA:"Fórmula de las certificaciones necesarias para ser miembro referente",XPERCENT:"Porcentaje mínimo necesario de miembros referentes respentando la regla de distancia máxima",AVG_GEN_TIME:"Tiempo medio entre dos bloques",MS_VALIDITY:"Duración de una candidatura que ya ha sido aceptada",CURRENT:"actual",MATH_CEILING:"TECHO",DISPLAY_ALL_RULES:"¿Ver todas las reglas?",BTN_SHOW_LICENSE:"Ver la licencia",WOT_DIVIDER:"Red de confianza"},LICENSE:{TITLE:"Licencia de la moneda",BTN_DOWNLOAD:"Descargar el fichero",NO_LICENSE_FILE:"Fichero de licencia no encontrado."}},NETWORK:{VIEW:{MEDIAN_TIME:"Hora de la cadena de bloques",LOADING_PEERS:"Cargando nodos…",NODE_ADDRESS:"Dirección:",SOFTWARE:"Software:",WARN_PRE_RELEASE:"Prelanzamiento (última versión estable: <b>{{version}}</b>)",WARN_NEW_RELEASE:"Versión <b>{{version}}</b> disponible",WS2PID:"ID:",PRIVATE_ACCESS:"Acceso privado",POW_PREFIX:"Prefijo de la prueba de trabajo:",ENDPOINTS:{BMAS:"Interfaz segura (SSL)",BMATOR:"Interfaz red TOR",WS2P:"Interfaz WS2P",ES_USER_API:"Nodo de datos Cesium+"}},INFO:{ONLY_SSL_PEERS:"La visualización de los nodos sin SSL aparece degradada porque Cesium funciona en modo HTTPS."}},PEER:{PEERS:"Nodos",SIGNED_ON_BLOCK:"Firmado sobre el bloque",MIRROR:"espejo",MIRROR_PEERS:"Nodos espejo",MIRRORS:"Espejo",PEER_LIST:"Lista de nodos",MEMBERS:"Miembro",MEMBER_PEERS:"Nodos miembro",ALL_PEERS:"Todos los nodos",DIFFICULTY:"Dificultad",API:"API",CURRENT_BLOCK:"Bloque #",POPOVER_FILTER_TITLE:"Filtro",OFFLINE:"Fuera de línea",OFFLINE_PEERS:"Nodos fuera de línea",BTN_SHOW_PEER:"Ver nodo",VIEW:{TITLE:"Nodo",OWNER:"Propiedad de",SHOW_RAW_PEERING:"Ver la ficha del nodo",SHOW_RAW_CURRENT_BLOCK:"Ver el bloque actual (en formato crudo)",LAST_BLOCKS:"Bloques recientes",KNOWN_PEERS:"Nodos conocidos:",GENERAL_DIVIDER:"Información general",ERROR:{LOADING_TOR_NODE_ERROR:"No se pudo obtener la información del nodo usando la red TOR.",LOADING_NODE_ERROR:"No se pudo obtener la información del nodo"}}},WOT:{SEARCH_HELP:"Buscar (apellido, primer nombre, hashtag)",SEARCH_INIT_PHASE_WARNING:"Durante la etapa de preinscripción, el tiempo de búsqueda de las candidaturas en espera <b>puede tardar</b>. Por favor espere…",REGISTERED_SINCE:"Se registró en",REGISTERED_SINCE_BLOCK:"Se registró en el bloque #",NO_CERTIFICATION:"Ninguna certificación validada",NO_GIVEN_CERTIFICATION:"Ninguna certificación emitida",NOT_MEMBER_PARENTHESIS:"(no miembro)",IDENTITY_REVOKED_PARENTHESIS:"(identidad revocada)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(revocación en proceso)",EXPIRE_IN:"Expira",NOT_WRITTEN_EXPIRE_IN:"Fecha límite<br/>de procesamiento",EXPIRED:"Expirado",PSEUDO:"Seudónimo",SIGNED_ON_BLOCK:"Emitida en el bloque #{{block}}",WRITTEN_ON_BLOCK:"Escrita en el bloque #{{block}}",GENERAL_DIVIDER:"Informaciones generales",NOT_MEMBER_ACCOUNT:"Cuenta no miembro",NOT_MEMBER_ACCOUNT_HELP:"Se trata de un monedero simple, sin solicitud de membresía en espera",TECHNICAL_DIVIDER:"Informaciones técnicas",BTN_CERTIFY:"Certificar",BTN_YES_CERTIFY:"Sí, certificar",BTN_SELECT_AND_CERTIFY:"Nueva certificación",ACCOUNT_OPERATIONS:"Transacciones de la cuenta",VIEW:{POPOVER_SHARE_TITLE:"Identidad {{title}}"},LOOKUP:{TITLE:"Directorio",NEWCOMERS:"Nuevos miembros:",NEWCOMERS_COUNT:"{{count}} miembros",PENDING:"Inscripciones en espera:",PENDING_COUNT:"{{count}} inscripciones en espera",REGISTERED:"Se inscribió {{sigDate | formatFromNow}}",MEMBER_FROM:"Miembro desde {{memberDate|medianFromNowShort}}",BTN_NEWCOMERS:"Miembros recientes",BTN_PENDING:"Candidaturas en espera",SHOW_MORE:"Mostrar más",SHOW_MORE_COUNT:"(mostrar solo {{limit}})",NO_PENDING:"Ninguna candidatura en espera.",NO_NEWCOMERS:"Sin miembros."},MODAL:{TITLE:"Buscar"},CERTIFICATIONS:{TITLE:"{{uid}} - Certificaciones",SUMMARY:"Certificaciones recibidas",LIST:"Detalle de las certificaciones recibidas",PENDING_LIST:"Certificaciones en espera de tratamiento",RECEIVED:"Certificaciones recibidas",RECEIVED_BY:"Certificaciones recibidas por {{uid}}",ERROR:"Certificaciones recibidas por error",SENTRY_MEMBER:"Miembro referente"},CONTACTS:{TITLE:"Contactos"},OPERATIONS:{TITLE:"{{uid}} - Transacciones"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Certificaciones emitidas",SUMMARY:"Certificaciones emitidas",LIST:"Detalle de las certificaciones emitidas",PENDING_LIST:"Certificaciones en espera a ser procesadas",SENT:"Certificaciones emitidas",SENT_BY:"Certificaciones emitidas por {{uid}}",ERROR:"Certificaciones emitidas por error"}},LOGIN:{FILE:{HELP:"Formato de archivo esperado: <b>.dunikey</b> (tipo PubSec). Otros formatos en desarrollo todavía (EWIF, WIF).",DATE:"Fecha:",TYPE:"Tipo:",SIZE:"Tamaño:",VALIDATING:"Validando…"},TITLE:'<i class="icon ion-locked"></i> Conexión',SCRYPT_FORM_HELP:"Ingrese sus credenciales.<br>Recuerde comprobar que la llave pública pertenece a su cuenta.",PUBKEY_FORM_HELP:"Por favor ingrese una llave pública de cuenta:",FILE_FORM_HELP:"Elija el archivo de llavero a usar:",SALT:"Identificador",SALT_HELP:"Identificador",SHOW_SALT:"Mostrar el identificador",PASSWORD:"Contraseña",PASSWORD_HELP:"Contraseña",PUBKEY_HELP:"llave pública",NO_ACCOUNT_QUESTION:"¿Aún no tiene cuenta? ",HAVE_ACCOUNT_QUESTION:"¿Ya tiene cuenta?",CREATE_ACCOUNT:"Crear una cuenta",CREATE_FREE_ACCOUNT:"Crear una cuenta gratis",FORGOTTEN_ID:"¿Olvidó su contraseña?",ASSOCIATED_PUBKEY:"Llave pública del llavero:",BTN_METHODS:"Otros métodos",BTN_METHODS_DOTS:"Otras vías…",METHOD_POPOVER_TITLE:"Métodos",SCAN_FORM_HELP:"Escanee el código QR de un monedero.",MEMORIZE_AUTH_FILE:"Memorizar las llaves durante la sesión de navegación",SCRYPT_PARAMETERS:"Ajustes (Scrypt):",AUTO_LOGOUT:{TITLE:"Información",MESSAGE:'<i class="ion-android-time"></i> Se ha <b>desconectado</b> de forma automática, después de un periodo de inactividad prolongada.',BTN_RELOGIN:"Volver a conectarme",IDLE_WARNING:"Será desconectado en… {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Estándar (por defecto)",SCRYPT_ADVANCED:"Aleatoriedad avanzada",FILE:"Archivo de llaves",PUBKEY:"Llave pública o seudónimo",SCAN:"Escanear un código QR"},SCRYPT:{SIMPLE:"Ligero",DEFAULT:"Predeterminado",SECURE:"Seguro",HARDEST:"El más seguro",EXTREME:"Extremo",USER:"Personalizado",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"}},AUTH:{TITLE:'<i class="icon ion-locked"></i> Autenticación',BTN_AUTH:"Autenticar",ERROR:{FILE:"Archivo llavero",SCRYPT_ADVANCED:"Aleatoriedad avanzada",SCRYPT_DEFAULT:"Estándar (por defecto)"},METHOD_LABEL:"Método de autenticación",SCRYPT_FORM_HELP:"Autentíquese :"},ACCOUNT:{BTN_MEMBERSHIP_IN_DOTS:"Registrarse como miembro…",BTN_SEND_IDENTITY_DOTS:"Publicar su identidad…",TITLE:"Mi cuenta",BALANCE:"Saldo",LAST_TX:"Últimas transacciones validadas",BALANCE_ACCOUNT:"Saldo de la cuenta",NO_TX:"Ninguna transacción",SHOW_MORE_TX:"Mostrar más",SHOW_ALL_TX:"Mostrar todo",TX_FROM_DATE:"(mostrar solo {{fromTime|medianFromNowShort}})",PENDING_TX:"Transacciones pendientes",ERROR_TX:"Transacciones no ejecutadas",ERROR_TX_SENT:"Transacciones ejecutadas fallidas",PENDING_TX_RECEIVED:"Tansacciones en espera de recepción",EVENTS:"Eventos",WAITING_MEMBERSHIP:"Solicitud de membresía emitida. En espera de aceptación.",WAITING_CERTIFICATIONS:"Debe obtener {{needCertificationCount}} certificación(es) para ser miembro.",WILL_MISSING_CERTIFICATIONS:"Pronto le van a <b>faltar certificaciones</b> (al menos {{willNeedCertificationCount}} son necesarias)",WILL_NEED_RENEW_MEMBERSHIP:"Su adhesión como miembro <b>va a expirar {{membershipExpiresIn|formatDurationTo}}</b>. Piense en <a ng-click=\"doQuickFix('renew')\">renovar su adhesión</a> mientras tanto.",NEED_RENEW_MEMBERSHIP:"No es miembro porque su adhesión <b>ha expirado</b>. Piense en <a ng-click=\"doQuickFix('renew')\">renovar su adhesión</a>.",CERTIFICATION_COUNT:"Certificaciones recibidas",CERTIFICATION_COUNT_SHORT:"Certificaciones",SIG_STOCK:"Certificaciones emitidas",BTN_RECEIVE_MONEY:"Recibir",BTN_MEMBERSHIP_RENEW:"Renovar la membresía",BTN_MEMBERSHIP_RENEW_DOTS:"Renovar la membresía…",BTN_MEMBERSHIP_OUT_DOTS:"Cancelar la membresía…",BTN_SECURITY_DOTS:"Cuenta y seguridad…",BTN_SHOW_DETAILS:"Publicar la información técnica",LOCKED_OUTPUTS_POPOVER:{TITLE:"Importe bloqueado",DESCRIPTION:"Aquí están las condiciones para desbloquear este importe:",DESCRIPTION_MANY:"Esta transacción esta compuesta de varias partes, cuyas condiciones de desbloqueo son:",LOCKED_AMOUNT:"Condiciones del importe:"},NEW:{TITLE:"Registrarse",INTRO_WARNING_TIME:"Crear una cuenta en {{name|capitalize}} es muy simple. Sin embargo, por favor tome el tiempo suficiente para hacerlo correctamente (generar y memorizar bien las credenciales, etc.)",INTRO_WARNING_SECURITY:"Asegúrese de que el dispositivo actual (ordenador, tablet, teléfono) <b>es seguro y de confianza</b>.",INTRO_WARNING_SECURITY_HELP:"Antivirus, cortafuegos, sesión protegida por contraseña o número PIN, etc.",INTRO_HELP:"Haga clic en <b>{{'COMMON.BTN_START'|translate}}</b> para iniciar la creación de la cuenta. Se le guiará paso a paso.",REGISTRATION_NODE:"Su registro será grabado a través del nodo Duniter <b>{{server}}</b>, que luego se transmitirá al resto del sistema de la moneda.",REGISTRATION_NODE_HELP:"Si no confía en este nodo, <a ng-click=\"doQuickFix('settings')\">cambie los ajustes</a> de Cesium.",SELECT_ACCOUNT_TYPE:"Elegir el tipo de cuenta a crear:",MEMBER_ACCOUNT:"Cuenta miembro",MEMBER_ACCOUNT_TITLE:"Crear una cuenta miembro",MEMBER_ACCOUNT_HELP:"Si todavía no tiene membresía (solamente una cuenta miembro posible por persona).",WALLET_ACCOUNT:"Simple monedero",WALLET_ACCOUNT_TITLE:"Crear una cuenta simple",WALLET_ACCOUNT_HELP:"Monedero simple para todos los otros casos, por ejemplo si necesita una cuenta suplementaria.<br/>El Dividendo Universal no será producido para esta cuenta.",SALT_WARNING:"Elija su identificador.<br/>Se solicitará cada vez que se conectará con esta cuenta.<br/><br/><b>Conserve bien este identificador</b>.<br/>¡En caso de pérdida, nadie podrá acceder a su cuenta!",PASSWORD_WARNING:"Elija su contraseña.<br/>Se solicitará cada vez que se conectará con esta cuenta.<br/><br/><b>Conserve bien esta contraseña</b>.<br/>¡En caso de pérdida, nadie podrá acceder su cuenta!",PSEUDO_WARNING:"Elija un seudónimo.<br/>Sirve para que los otros miembros puedan encontrarlo más fácilmente.<br/><br/>No debe contener <b>ni espacios ni caracteres acentuados</b>.<div class='hidden-xs'><br/>Ejemplo: <span class='gray'>SophieDupond, MarcelChemin, etc.</span>",PSEUDO:"Seudónimo",PSEUDO_HELP:"Seudónimo",SALT_CONFIRM:"Confirmación",SALT_CONFIRM_HELP:"Confirmación del identificador",PASSWORD_CONFIRM:"Confirmación",PASSWORD_CONFIRM_HELP:"Confirmación de la contraseña",SLIDE_6_TITLE:"Confirmación:",COMPUTING_PUBKEY:"Cálculo en proceso…",LAST_SLIDE_CONGRATULATION:"<b>¡Bien!</b> Ha introducido todas los datos necesarios.<br/><b>Puede solicitar</b> la creación de su cuenta.</b><br/><br/>Para su información, la llave pública que se muestra más abajo identificará su futura cuenta.<br/>Esta podrá ser comunicada a terceros para recibir pagos.",CONFIRMATION_MEMBER_ACCOUNT:'<b class="assertive">Advertencia:</b> el identificador, la contraseña y el seudónimo no podrán ser modificados.<br/><b>¡Asegúrese siempre de recordarlos!</b><br/><br/><b>¿Desea</b> solicitar la inscripción?',CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Advertencia:</b> el identificador y la contraseña no podrán ser modificados.<br/><b>¡Asegúrese de recordarlos siempre!</b><br/><br/><b>¿Desea</b> continuar?',CHECKING_PSEUDO:"Verificando…",PSEUDO_AVAILABLE:"Este nombre está disponible",PSEUDO_NOT_AVAILABLE:"Este nombre de usuario no está disponible",INFO_LICENSE:"Para unirse a la moneda, le pedimos leer y aceptar esta licencia.",BTN_ACCEPT:"Acepto",BTN_ACCEPT_LICENSE:"Acepto la licencia"},POPUP_REGISTER:{TITLE:"Elija un seudónimo",HELP:"Un seudónimo es obligatorio para ser miembro."},SECURITY:{ADD_QUESTION:"Añadir pregunta personalizada",BTN_CLEAN:"Limpiar",BTN_RESET:"Reiniciar",DOWNLOAD_REVOKE:"Guardar un archivo de revocación",DOWNLOAD_REVOKE_HELP:"Tener un archivo de revocación es importante, en caso de perdida de las credenciales. Le permitirá <b>invalidar y sacar su cuenta miembro fuera de la Red de Confianza</b>, convirtíendose en un monedero simple.",HELP_LEVEL:"Elija <strong> al menos {{nb}} preguntas:</strong>",LEVEL:"Nivel de seguridad",LOW_LEVEL:'Bajo <span class="hidden-xs">(2 preguntas min.)</span>',MEDIUM_LEVEL:'Medio <span class="hidden-xs">(4 preguntas min.)</span>',QUESTION_1:"¿Cómo se llamaba su mejor amigo de la adolescencia?",QUESTION_2:"¿Cómo se llamaba su primer animal de compañía?",QUESTION_3:"¿Cuál es el primer plato que aprendió a cocinar?",QUESTION_4:"¿Cuál es la primera película que vió en un cine?",QUESTION_5:"¿Cuál era el destino del primer avión que cogió?",QUESTION_6:"¿Cómo se llamaba su docente favorito en la escuela primaria?",QUESTION_7:"¿Cuál sería para usted el mejor oficio?",QUESTION_8:"¿Cuál es su libro infantil preferido?",QUESTION_9:"¿Cuál fue el modelo de su primer vehículo?",QUESTION_10:"¿Cuál fue su sobrenombre durante su infancia?",QUESTION_11:"¿Cuál fue su personaje o actor/actriz preferido/a cuando era estudiante?",QUESTION_12:"¿Cuál fue su cantante o grupo preferido cuando era estudiante?",QUESTION_13:"¿En qué ciudad sus padres se encontraron?",QUESTION_14:"¿Cómo se llamaba su primer jefe/a?",QUESTION_15:"¿Cómo se llama la calle donde creció?",QUESTION_16:"¿Cómo se llama la primera playa donde se bañó?",QUESTION_17:"¿Cuál es el primer álbum que compró?",QUESTION_18:"¿Cuál es el nombre de su equipo deportivo preferido?",QUESTION_19:"¿Cuál fue el oficio de su abuelo?",RECOVER_ID:"Recuperar sus credenciales",REVOCATION_WITH_FILE:"Revocar una identidad a partir de un fichero",REVOCATION_WITH_FILE_HELP:"Para <b>revocar permanentemente</b> una cuenta miembro, arrastre el archivo de revocación en el cuadro siguiente o haga clic en el cuadro para seleccionar un archivo.",REVOCATION_FILENAME:"revocacion-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt",REVOCATION_WALLET:"Revocar esta identidad",SAVE_ID:"Guardar mis credenciales",STRONG_LEVEL:'Alto <span class="hidden-xs ">(6 preguntas min.)</span>',TITLE:"Cuenta y seguridad",
|
||
RECOVER_ID_HELP:"Si dispone de un <b>archivo de recuperación de sus credenciales</b>, las puede reobtener respondiendo correctamente a las preguntas personales elegidas en su momento.",REVOCATION_WALLET_HELP:"Pedir la revocación de vuestra identidad comporta la <b>salida de la red de confianza</b> (definitiva para el seudónimo y la llave pública asociada). La cuenta no producirá ya más el Dividendo Universal.<br/>Podrá seguir usándola como monedero simple.",SAVE_ID_HELP:"Creación de un archivo de recuperación, para <b>reobtener su contraseña</b> (e identificador) en caso de olvido. El archivo se <b>cifra</b> con ayuda de las preguntas personales elegidas."},FILE_NAME:"{{currency}}_HistorialDeCuenta_{{pubkey|formatPubkey}}_{{currentTime|formatDateForFile}}.csv",HEADERS:{TIME:"Fecha",AMOUNT:"Cantidad",COMMENT:"Comentario"}},TRANSFER:{TITLE:"Transferencia",SUB_TITLE:"Hacer una transferencia",FROM:"De",TO:"A",AMOUNT:"Importe",AMOUNT_HELP:"Importe",COMMENT:"Comentario",COMMENT_HELP:"Comentario",BTN_SEND:"Enviar",BTN_ADD_COMMENT:"Añadir un comentario",MODAL:{TITLE:"Transferencia"}},ERROR:{UNKNOWN_URI_FORMAT:"Formato URI desconocido",PUBKEY_INVALID_CHECKSUM:"Llave pública no válida (suma de comprobación incorrecta).",POPUP_TITLE:"Error",UNKNOWN_ERROR:"Error desconocido",CRYPTO_UNKNOWN_ERROR:"Su navegador parece incompatible con las funcionalidades de cryptografía.",DOWNLOAD_KEYFILE_FAILED:"Error al generar el archivo de llaves.",EQUALS_TO_PSEUDO:"Debe ser diferente del seudónimo.",EQUALS_TO_SALT:"Debe ser diferente del identificador.",FIELD_REQUIRED:"Campo obligatorio.",FIELD_TOO_SHORT:"Valor demasiado corta.",FIELD_TOO_SHORT_WITH_LENGTH:"Valor demasiado corta ({{minLength}} carácteres mín)",FIELD_TOO_LONG:"Valor demasiado largo",FIELD_TOO_LONG_WITH_LENGTH:"Valor demasiado largo, ({{maxLength}} carácteres máx)",FIELD_MIN:"Valor mínimo: {{min}}",FIELD_MAX:"Valor máximo: {{max}}",FIELD_ACCENT:"Caracteres acentuados y comas no autorizados",FIELD_NOT_NUMBER:"Valor numérico esperado",FIELD_NOT_INT:"Valor entero esperado",FIELD_NOT_EMAIL:"Correo electrónico no válido",PASSWORD_NOT_CONFIRMED:"No coincide con la contraseña anterior.",SALT_NOT_CONFIRMED:"No corresponde al identificador anterior.",SEND_IDENTITY_FAILED:"Error de la inscripción.",SEND_CERTIFICATION_FAILED:"Error de la certificación.",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"No se puede certificar, porque su cuenta no <b>es miembro</b>.",NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF:"No se puede certificar, porque su cuenta todavía no es miembro.<br/><br/>Todavía faltan certificaciones para serlo.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"Esta cuenta no se pudo certificar. No se ha solicitado la membresía, o se necesita renovarla.",LOGIN_FAILED:"Error durante la autentificación.",LOAD_IDENTITY_FAILED:"Error de carga de la identidad.",LOAD_REQUIREMENTS_FAILED:"Error de carga de las condiciones de la identidad.",SEND_MEMBERSHIP_IN_FAILED:"Error en el intento de entrada en la comunidad.",SEND_MEMBERSHIP_OUT_FAILED:"Error en la interrupción de adhesión.",REFRESH_WALLET_DATA:"Error en la actualización del monedero.",GET_CURRENCY_PARAMETER:"Error en la recuperación de las reglas de moneda.",GET_CURRENCY_FAILED:"Carga de la moneda imposible. Por favor, intente más tarde.",SEND_TX_FAILED:"Error en la transferencia.",ALL_SOURCES_USED:"Por favor, espera el cálculo del bloque siguiente (Todas sus fuentes de moneda fueron utilizada).",NOT_ENOUGH_SOURCES:"No lo bastante cambio para mandar este importe en una sola transacción.<br/>Importe máximo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",NOT_MEMBER_FOR_CERTIFICATION:"Su cuenta no es todavía de tipo miembro.",ACCOUNT_CREATION_FAILED:"Error en la creación de la cuenta miembro.",RESTORE_WALLET_DATA_ERROR:"Error en la recarga de los ajustes desde el almacenamiento local",LOAD_WALLET_DATA_ERROR:"Error en la carga de los datos del monedero.",COPY_CLIPBOARD_FAILED:"Copia de la valor imposible.",TAKE_PICTURE_FAILED:"Error en la recuperación de la foto.",SCAN_FAILED:"Error en el escán del Codigo QR",SCAN_UNKNOWN_FORMAT:"Codigo no reconocido.",WOT_LOOKUP_FAILED:"Error en la búsqueda",LOAD_PEER_DATA_FAILED:"Lectura del nodo Duniter imposible. Por favor, intente más tarde.",NEED_LOGIN_FIRST:"Por favor, conéctese en primer lugar.",AMOUNT_REQUIRED:"El importe es obligatorio.",AMOUNT_NEGATIVE:"Importe negativo no autorizado.",NOT_ENOUGH_CREDIT:"Crédito insuficiente.",INVALID_NODE_SUMMARY:"Nodo ilocalizable o dirección inválida.",INVALID_USER_ID:"El seudónimo no debe contener ni espacios ni caracteres especiales o acentuado.",INVALID_COMMENT:"El campo 'referencia’ no debe contener carácteres acentuados.",INVALID_PUBKEY:"La llave pública no tiene el formato esperado.",INVALID_PUBKEY_CHECKSUM:"Suma de comprobación inválida.",IDENTITY_REVOKED:"Esta identidad <b>fue revocada</b>. No puede volver a convertirla en miembro.",IDENTITY_PENDING_REVOCATION:"La <b>revocación de esta identidad</b> fue solicitado y esta en espera de tratamiento. Por lo que, la certificación es desactivada.",IDENTITY_INVALID_BLOCK_HASH:"Esta solicitud de adhesión no es valida (porque denomina un bloque los nodos de la red han anulado): esta persona debe renovelar su solicitud de adhesión <b>antes que</b> estar certificada.",IDENTITY_EXPIRED:"La publicación de esta identidad ha caducada: esta persona debe realizar una nueva solicitud de adhesión <b>antes que</b> estar certificada.",IDENTITY_SANDBOX_FULL:"EL nodo Duniter utilizado por Cesium ya no puede recibir más nuevas identidades, porque la fila de espera es llena.<br/><br/>Por favor, intenta ulteriormente o cambia de nodo (vía el menú <b>Ajustes</b>).",IDENTITY_NOT_FOUND:"Identidad no encontrada",WOT_PENDING_INVALID_BLOCK_HASH:"Adhesión no validada.",WALLET_INVALID_BLOCK_HASH:"Su solicitud de adhesión ya no está validada (porque denomina un bloque los nodos de la red han anulado).<br/>Debe <a ng-click=\"doQuickFix('fixMembership')\">mandar una nueva solicitud</a> para resolver este problema.",WALLET_IDENTITY_EXPIRED:"La publicación de <b>su identidad ha caducada</b>.<br/>Debe <a ng-click=\"doQuickFix('fixIdentity')\">publicar une outra vez su identidad</a> para resolver este problema.",WALLET_REVOKED:"Su identidad fue <b>revocada</b>: ni su seudónimo ni su llave pública podrán estar utilizados en el futuro por una cuenta miembro.",WALLET_HAS_NO_SELF:"Su identidad debe en primer lugar haber estado publicado, y no estar caducada.",AUTH_REQUIRED:"Autenticación requerida.",AUTH_INVALID_PUBKEY:"La llave pública no se corresponde con la cuenta conectada",AUTH_INVALID_SCRYPT:"De usuario o contraseña no válidos.",AUTH_INVALID_FILE:"archivo de llave no válido.",AUTH_FILE_ERROR:"No se pudo abrir el archivo de llave",IDENTITY_ALREADY_CERTIFY:"Ya <b>ha certificado</b> esta identidad.<br/><br/>Esta certificación todavía es valida (expiration {{expiresIn|formatDurationTo}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"Ya <b>ha certificado</b> esta identidad.<br/><br/>Esta certificación está en espera de tratamiento (fecha límite de tratamiento {{expiresIn|formatDurationTo}}).",IDENTITY_TX_FAILED:"Error al obtener las transacciones de la identidad",UNABLE_TO_CERTIFY_TITLE:"Certificación imposible",LOAD_NEWCOMERS_FAILED:"No se pudo cargar las nuevas membresías.",LOAD_PENDING_FAILED:"No se pudo cargar las inscripciones pendientes.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"Debe <b>ser miembro</b> para poder realizar esta acción.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"Debe haber <b>publicado su identidad</b> para poder realizar esta acción.",GET_BLOCK_FAILED:"Error en la recuperación del bloque",INVALID_BLOCK_HASH:"Bloque no encontrado (hash diferente)",DOWNLOAD_REVOCATION_FAILED:"Debe seleccionar un fichero de texto",REVOCATION_FAILED:"Error en la revocación.",SALT_OR_PASSWORD_NOT_CONFIRMED:"identificador o contraseña incorrectos",RECOVER_ID_FAILED:"Error en la recuperación de las credenciales",LOAD_FILE_FAILED:"Error en la carga del archivo",NOT_VALID_REVOCATION_FILE:"Archivo de revocación no válido (formato de archivo erróneo)",NOT_VALID_SAVE_ID_FILE:"Archivo no válido (formato de archivo erróneo)",NOT_VALID_KEY_FILE:"Archivo no válido (formato de archivo erróneo)",EXISTING_ACCOUNT:"Sus credenciales corresponden a una cuenta existente, la <a ng-click=\"showHelpModal('pubkey')\">llave pública</a> es:",EXISTING_ACCOUNT_REQUEST:"Por favor, cambie sus credenciales para que coincida con una cuenta sin usar.",GET_LICENSE_FILE_FAILED:"Error al obtener el archivo de licencia",CHECK_NETWORK_CONNECTION:"No se puede conectar a ningún nodo.<br/><br/><b>Compruebe la conexión a Internet</b>."},INFO:{POPUP_TITLE:"Información",CERTIFICATION_DONE:"Certificación enviada",NOT_ENOUGH_CREDIT:"Crédito insuficiente",TRANSFER_SENT:"Transferencia enviada",COPY_TO_CLIPBOARD_DONE:"Copia realizada",MEMBERSHIP_OUT_SENT:"Anulación enviada",NOT_NEED_MEMBERSHIP:"Ya es miembro.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"Esta identidad pronto va a necesitar certificaciones (al menos {{willNeedCertificationCount}}).",REVOCATION_SENT:"Revocación enviada",REVOCATION_SENT_WAITING_PROCESS:"La <b>revocación de esta identidad</b> fue solicitada y está en espera de ser procesada.",FEATURES_NOT_IMPLEMENTED:"Esta funcionalidad todavía está en proceso de desarrollo.<br/><br/>¿Por qué no <b>contribuir a Cesium</b>, para obtenerla más rápido? ;)",EMPTY_TX_HISTORY:"Ninguna operación a exportar"},CONFIRM:{CERTIFY_RULES:'<b class="assertive">NO CERTIFICAR</b> una cuenta si piensa que :<br/><br/><ul><li>1.) no corresponde a una persona <b>física y viva</b>.<li>2.) su propietario <b>posee otra cuenta</b> ya certificada.<li>3.) su propietario viola (voluntariamente o no) la regla 1 o 2 (por ejemplo certificando cuentas falsas o duplicadas).</ul><br/><b>¿Desea</b> todavía certificar esta identidad?',CERTIFY_RULES_TITLE_UID:"Certificar {{uid}}",EXIT_APP:"¿ Cerrar la aplicación ?",FULLSCREEN:"¿ Mostrar la aplicación en pantalla completa ?",LOGIN_UNUSED_WALLET:"Las credenciales introducidas corresponden a una cuenta que parece <b>inactiva</b>.<br/></br/><b>¿Quiere sin embargo continuar con esta cuenta?</b>",LOGIN_UNUSED_WALLET_TITLE:"¿Error de introducción de datos?",LOGOUT:"¿Desea desconectarse?",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Advertencia de seguridad</b>',POPUP_TITLE:"<b>Confirmación</b>",POPUP_WARNING_TITLE:"<b>Advertencia</b>",SAVE_BEFORE_LEAVE:"¿Desea <b>guardar sus cambios</b> antes de abandonar la página?",SAVE_BEFORE_LEAVE_TITLE:"Cambios no registrados",USE_FALLBACK_NODE:"Nodo <b>{{old}}</b> inalcanzable o dirección inválida.<br/><br/>¿Desea utilizar temporalmente el nodo <b>{{new}}</b>?"},DOWNLOAD:{POPUP_TITLE:"<b>Revocación del archivo</b>",POPUP_REVOKE_MESSAGE:"Para proteger su cuenta, descargue el <b>documento de revocación de cuenta</b>. Le permitirá cancelar su cuenta (en caso de robo, cambio de identificador, cuenta creada incorrectamente, etc.).<br/><br/><b>Por favor, almacénelo en un lugar seguro.</b>"},HELP:{TITLE:"Ayuda en línea",JOIN:{SECTION:"Inscripción",SALT:'El identificador es muy importante. Sirve para mezclar(<span class="text-italic">hash</span>) la contraseña, antes de calcular la <span class="text-italic">llave pública</span> (el número de cuenta) y la <span class="text-italic">llave privada</span> para acceder a esta.<br/><b>Por favor, memorícelo muy bien</b> porque no existe ninguna forma de recuperarlo en caso de pérdida.<br/>No puede ser modificado. Deberá crear una nueva cuenta si lo pierde o se olvida.<br/><br/>Un buen identificador debe ser suficientemente largo (al menos 8 carácteres) y lo más original posible.',PASSWORD:'La contraseña es muy importante. Junto al identificador, sirve para calcular la llave pública (el número de cuenta), y la llave privada para acceder a ella.<br/><b>Por favor, memorícela muy bien</b> porque no existe ninguna forma de recuperarla en caso de pérdida (excepto si se tuviese un fichero de respaldo o <span class="text-italic">backup</span>.).<br/>No puede ser modificada. Deberá crear una nueva cuenta si la pierde o se olvida.<br/><br/>Una buena contraseña contiene al menos 8 carácteres, con al menos una mayúscula y un dígito.'},GLOSSARY:{SECTION:"Glosario",PUBKEY_DEF:"Una llave pública identifica un monedero, que puede estar asociado a un miembro o ser un monedero anónimo. En Cesium se calcula a partir del identificador y la contraseña.",UNIVERSAL_DIVIDEND_DEF:'El Dividendo Universal (DU) es la cantidad de moneda co-creada por cada miembro, dependiendo del periodo y del cálculo definidos en las <span class="text-italic">reglas de la moneda</span>.<br/>En cada periodo, los miembros reciben en sus cuentas la misma cantidad de moneda.<br/><br/>El DU crece regularmente, para ser justo entre cada miembro (actualmente y en el futuro), y calculado en función de la esperanza de vida media, como se demuestra en la <span class="text-italic">Teoría Relativa de la Moneda</span> (TRM, de Stéphane Laborde).<br/><a href="http://trm.creationmonetaire.info">Más información</a> sobre la TRM y las monedas libres.'}}}),e.translations("fr-FR",{COMMON:{APP_NAME:"ğ<b>change</b>",APP_VERSION:"v{{version}}",APP_BUILD:"date : {{build}}",PUBKEY:"Clé publique",MEMBER:"Membre",BLOCK:"Bloc",BTN_OK:"OK",BTN_YES:"Oui",BTN_NO:"Non",BTN_SEND:"Envoyer",BTN_SEND_MONEY:"Faire un virement",BTN_SEND_MONEY_SHORT:"Virement",BTN_SAVE:"Enregistrer",BTN_YES_SAVE:"Oui, Enregistrer",BTN_YES_CONTINUE:"Oui, Continuer",BTN_SHOW:"Voir",BTN_SHOW_PUBKEY:"Afficher la clé publique",BTN_RELATIVE_UNIT:"Afficher les montants en DU ?",BTN_BACK:"Retour",BTN_NEXT:"Suivant",BTN_IMPORT:"Importer",BTN_CANCEL:"Annuler",BTN_CLOSE:"Fermer",BTN_COPY:"Copier",BTN_LATER:"Plus tard",BTN_LOGIN:"Se connecter",BTN_LOGOUT:"Déconnexion",BTN_ADD_ACCOUNT:"Nouveau compte",BTN_SHARE:"Partager",BTN_EDIT:"Modifier",BTN_DELETE:"Supprimer",BTN_ADD:"Ajouter",BTN_SEARCH:"Rechercher",BTN_REFRESH:"Actualiser",BTN_RETRY:"Recommencer",BTN_START:"Commencer",BTN_CONTINUE:"Continuer",BTN_CREATE:"Créer",BTN_UNDERSTOOD:"J'ai compris",BTN_OPTIONS:"Options",BTN_HELP_TOUR:"Visite guidée",BTN_HELP_TOUR_SCREEN:"Découvrir cet écran",BTN_DOWNLOAD:"Télécharger",BTN_DOWNLOAD_ACCOUNT_STATEMENT:"Télécharger le relevé du compte",BTN_MODIFY:"Modifier",CHOOSE_FILE:"Déposez votre fichier <br/>ou cliquez pour le sélectionner",DAYS:"jours",NO_ACCOUNT_QUESTION:"Pas encore de compte ? Créez-en un gratuitement !",SEARCH_NO_RESULT:"Aucun résultat trouvé",LOADING:"Veuillez patienter...",LOADING_WAIT:"Veuillez patienter...<br/><small>(ğchange interroge le réseau)</small>",SEARCHING:"Recherche en cours...",FROM:"De",TO:"À",COPY:"Copier",LANGUAGE:"Langue",UNIVERSAL_DIVIDEND:"Dividende universel",UD:"DU",DATE_PATTERN:"DD/MM/YY HH:mm",DATE_FILE_PATTERN:"YYYY-MM-DD",DATE_SHORT_PATTERN:"DD/MM/YY",DATE_MONTH_YEAR_PATTERN:"MM/YYYY",EMPTY_PARENTHESIS:"(vide)",UID:"Pseudonyme",ENABLE:"Activé",DISABLE:"Désactivé",RESULTS_LIST:"Résultats",RESULTS_COUNT:"{{count}} résultats",EXECUTION_TIME:"exécuté en {{duration|formatDurationMs}}",SHOW_VALUES:"Afficher les valeurs en clair ?",POPOVER_ACTIONS_TITLE:"Options",POPOVER_FILTER_TITLE:"Filtres",SHOW_MORE:"Afficher plus",SHOW_MORE_COUNT:"(limite actuelle à {{limit}})",POPOVER_SHARE:{TITLE:"Partager",SHARE_ON_TWITTER:"Partager sur Twitter",SHARE_ON_FACEBOOK:"Partager sur Facebook",SHARE_ON_DIASPORA:"Partager sur Diaspora*",SHARE_ON_MASTODON:"Partager sur Mastodon",INSTANCE_ADDRESS_HELP:"Entrer l'adresse de l'instance (ex: https://framapiaf.org) :"},FILE:{DATE:"Date :",TYPE:"Type :",SIZE:"Taille :",VALIDATING:"Validation en cours..."}},SYSTEM:{PICTURE_CHOOSE_TYPE:"Choisir la source :",BTN_PICTURE_GALLERY:"Galerie",BTN_PICTURE_CAMERA:"<b>Caméra</b>"},MENU:{HOME:"Accueil",WOT:"Annuaire",CURRENCY:"Monnaie",ACCOUNT:"Mon compte",WALLETS:"Mes portefeuilles",TRANSFER:"Virement",SCAN:"Scanner",SETTINGS:"Paramètres",NETWORK:"Réseau",TRANSACTIONS:"Mes opérations"},ABOUT:{TITLE:"À propos",LICENSE:"Application <b>libre</b> (Licence GNU AGPLv3).",LATEST_RELEASE:"Il existe une <b>version plus récente</b> de {{'COMMON.APP_NAME'|translate}} (<b>v{{version}}</b>)",PLEASE_UPDATE:"Veuillez mettre à jour {{'COMMON.APP_NAME'|translate}} (dernière version : <b>v{{version}}</b>)",CODE:"Code source :",OFFICIAL_WEB_SITE:"Site web officiel :",DEVELOPERS:"Développé par :",FORUM:"Forum :",DEV_WARNING:"Avertissement",DEV_WARNING_MESSAGE:"Cette application est toujours en développement.<br/>N'hésitez pas à nous remonter les anomalies rencontrées !",DEV_WARNING_MESSAGE_SHORT:"Cette application est toujours en développement.",REPORT_ISSUE:"Remonter un problème"},HOME:{TITLE:"ğ<b>change</b>",MESSAGE:"ğ<b>change</b> ?",MESSAGE_CURRENCY:"Un logiciel pour <b>garder le contrôle</b> de vos petites annonces en {{currency|abbreviate}}",BTN_CURRENCY:"Explorer la monnaie {{name|abbreviate}}",BTN_ABOUT:"à propos",BTN_HELP:"Aide en ligne",REPORT_ISSUE:"anomalie",NOT_YOUR_ACCOUNT_QUESTION:"Vous n'êtes pas propriétaire du compte<br/><b>{{name|| (pubkey|formatPubkey) }}</b> ?",BTN_CHANGE_ACCOUNT:"Déconnecter ce compte",CONNECTION_ERROR:'Nœud <b>{{server}}</b> d\'accès à la monnaie injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou changez de nœud <a class="positive" ng-click="doQuickFix(\'settings\')">dans les paramètres</a>.',SHOW_ALL_FEED:"Voir tout",READ_MORE:"Lire la suite",FEED_SOURCE:"Source"},SETTINGS:{TITLE:"Paramètres",DISPLAY_DIVIDER:"Affichage",STORAGE_DIVIDER:"Stockage",NETWORK_SETTINGS:"Réseau",PEER:"Adresse du nœud Duniter",PEER_SHORT:"Adresse du nœud",PEER_CHANGED_TEMPORARY:"Adresse utilisée temporairement",PERSIST_CACHE:"Conserver les données de navigation (expérimental)",PERSIST_CACHE_HELP:"Permet une navigation plus rapide, en conservant localement les données reçues, pour les utiliser d'une session à l'autre.",USE_LOCAL_STORAGE:"Activer le stockage local",USE_LOCAL_STORAGE_HELP:"Permet de sauvegarder vos paramètres",ENABLE_HELPTIP:"Activer les bulles d'aide contextuelles",ENABLE_UI_EFFECTS:"Activer les effets visuels",HISTORY_SETTINGS:"Mes opérations",DISPLAY_UD_HISTORY:"Afficher les dividendes produits ?",AUTHENTICATION_SETTINGS:"Authentification",REMEMBER_ME:"Se souvenir de moi ?",REMEMBER_ME_HELP:"Permet de rester toujours connecté.",PLUGINS_SETTINGS:"Extensions",BTN_RESET:"Restaurer les valeurs par défaut",EXPERT_MODE:"Activer le mode expert",EXPERT_MODE_HELP:"Permet un affichage plus détaillé",POPUP_PEER:{TITLE:"Nœud Duniter",HOST:"Adresse",HOST_HELP:"Adresse : serveur:port",USE_SSL:"Sécurisé ?",USE_SSL_HELP:"(Chiffrement SSL)",BTN_SHOW_LIST:"Liste des noeuds"}},BLOCKCHAIN:{HASH:"Hash : {{hash}}",VIEW:{HEADER_TITLE:"Bloc #{{number}}-{{hash|formatHash}}",TITLE_CURRENT:"Bloc courant",TITLE:"Bloc #{{number|formatInteger}}",COMPUTED_BY:"Calculé par le noeud de",SHOW_RAW:"Voir le fichier brut",TECHNICAL_DIVIDER:"Informations techniques",VERSION:"Version du format",HASH:"Hash calculé",UNIVERSAL_DIVIDEND_HELP:"Monnaie co-produite par chacun des {{membersCount}} membres",EMPTY:"Aucune donnée dans ce bloc",POW_MIN:"Difficulté minimale",POW_MIN_HELP:"Difficulté imposée pour le calcul du hash",DATA_DIVIDER:"Données",IDENTITIES_COUNT:"Nouvelles identités",JOINERS_COUNT:"Nouveaux membres",ACTIVES_COUNT:"Renouvellements",ACTIVES_COUNT_HELP:"Membres ayant renouvelé leur adhésion",LEAVERS_COUNT:"Membres sortants",LEAVERS_COUNT_HELP:"Membres ne souhaitant plus de certification",EXCLUDED_COUNT:"Membres exclus",EXCLUDED_COUNT_HELP:"Anciens membres exclus par non renouvellement ou manque de certifications",REVOKED_COUNT:"Identités révoquées",REVOKED_COUNT_HELP:"Ces comptes ne pourront plus être membres",TX_COUNT:"Transactions",CERT_COUNT:"Certifications",TX_TO_HIMSELF:"Opération de change",TX_OUTPUT_UNLOCK_CONDITIONS:"Conditions de déblocage",TX_OUTPUT_OPERATOR:{AND:"et",OR:"ou"},TX_OUTPUT_FUNCTION:{SIG:"<b>Signature</b> de ",XHX:"<b>Mot de passe</b>, dont SHA256 =",CSV:"Bloqué pendant",CLTV:"Bloqué jusqu'à"}},LOOKUP:{TITLE:"Blocs",NO_BLOCK:"Aucun bloc",LAST_BLOCKS:"Derniers blocs :",BTN_COMPACT:"Compacter"}},CURRENCY:{VIEW:{TITLE:"Monnaie",TAB_CURRENCY:"Monnaie",TAB_WOT:"Toile de confiance",TAB_NETWORK:"Réseau",TAB_BLOCKS:"Blocs",CURRENCY_SHORT_DESCRIPTION:"{{currency|abbreviate}} est une <b>monnaie libre</b>, démarrée {{firstBlockTime|formatFromNow}}. Elle compte actuellement <b>{{N}} membres</b>, qui produisent et perçoivent un <a ng-click=\"showHelpModal('ud')\">Dividende Universel</a> (DU), chaque {{dt|formatPeriod}}.",NETWORK_RULES_DIVIDER:"Règles du réseau",CURRENCY_NAME:"Nom de la monnaie",MEMBERS:"Nombre de membres",MEMBERS_VARIATION:"Variation depuis le dernier DU",MONEY_DIVIDER:"Monnaie",MASS:"Masse monétaire",SHARE:"Masse par membre",UD:"Dividende universel",C_ACTUAL:"Croissance actuelle",MEDIAN_TIME:"Heure de la blockchain",POW_MIN:"Niveau minimal de difficulté de calcul",MONEY_RULES_DIVIDER:"Règles de la monnaie",C_RULE:"Croissance théorique cible",UD_RULE:"Calcul du dividende universel",DT_REEVAL:"Période de revalorisation du DU",REEVAL_SYMBOL:"reval",DT_REEVAL_VALUE:"Tous les <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",UD_REEVAL_TIME0:"Date de la 1ère revalorisation",SIG_QTY_RULE:"Nombre de certifications requises pour devenir membre",SIG_STOCK:"Nombre maximal de certifications émises par membre",SIG_PERIOD:"Délai minimal d'attente entre 2 certifications successives émises par une même personne",SIG_WINDOW:"Délai limite de prise en compte d'une certification",SIG_VALIDITY:"Durée de vie d'une certification qui a été prise en compte",MS_WINDOW:"Délai limite de prise en compte d'une demande d'adhésion comme membre",MS_VALIDITY:"Durée de vie d'une adhésion qui a été prise en compte",STEP_MAX:"Distance maximale, par les certifications, entre un nouvel entrant et les membres référents",WOT_RULES_DIVIDER:"Règles de la toile de confiance",SENTRIES:"Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent",SENTRIES_FORMULA:"Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent (formule)",XPERCENT:"Pourcentage minimum de membres référents à atteindre pour respecter la règle de distance",AVG_GEN_TIME:"Temps moyen entre deux blocs",CURRENT:"actuel",MATH_CEILING:"PLAFOND",DISPLAY_ALL_RULES:"Afficher toutes les règles ?",BTN_SHOW_LICENSE:"Voir la licence",WOT_DIVIDER:"Toile de confiance"},LICENSE:{TITLE:"Licence de la monnaie",BTN_DOWNLOAD:"Télécharger le fichier",NO_LICENSE_FILE:"Fichier de licence non trouvé."}},NETWORK:{VIEW:{MEDIAN_TIME:"Heure de la blockchain",LOADING_PEERS:"Chargement des noeuds...",NODE_ADDRESS:"Adresse :",SOFTWARE:"Logiciel",WARN_PRE_RELEASE:"Pré-version (dernière version stable : <b>{{version}}</b>)",WARN_NEW_RELEASE:"Version <b>{{version}}</b> disponible",WS2PID:"Identifiant :",PRIVATE_ACCESS:"Accès privé",POW_PREFIX:"Préfixe de preuve de travail :",ENDPOINTS:{BMAS:"Interface sécurisée (SSL)",BMATOR:"Interface réseau TOR",WS2P:"Interface WS2P",ES_USER_API:"Noeud de données Cesium+"}},INFO:{ONLY_SSL_PEERS:"Les noeuds non SSL ont un affichage dégradé, car Cesium fonctionne en mode HTTPS."}},PEER:{PEERS:"Nœuds",SIGNED_ON_BLOCK:"Signé sur le bloc",MIRROR:"miroir",MIRRORS:"Miroirs",MIRROR_PEERS:"Nœuds miroirs",PEER_LIST:"Liste des nœuds",MEMBERS:"Membres",MEMBER_PEERS:"Nœuds membres",ALL_PEERS:"Tous les nœuds",DIFFICULTY:"Difficulté",API:"API",CURRENT_BLOCK:"Bloc #",POPOVER_FILTER_TITLE:"Filtre",OFFLINE:"Hors ligne",OFFLINE_PEERS:"Nœuds hors ligne",BTN_SHOW_PEER:"Voir le nœud",VIEW:{TITLE:"Nœud",OWNER:"Appartient à",SHOW_RAW_PEERING:"Voir la fiche de pair",SHOW_RAW_CURRENT_BLOCK:"Voir le dernier bloc (format brut)",LAST_BLOCKS:"Derniers blocs connus",KNOWN_PEERS:"Nœuds connus :",GENERAL_DIVIDER:"Informations générales",ERROR:{LOADING_TOR_NODE_ERROR:"Récupération des informations du noeud impossible. Le délai d'attente est dépassé.",LOADING_NODE_ERROR:"Récupération des informations du noeud impossible"}}},WOT:{SEARCH_HELP:"Recherche (nom, prénom, hashtag)",SEARCH_INIT_PHASE_WARNING:"Durant la phase de pré-inscription, la recherche des inscriptions en attente <b>peut être longue</b>. Merci de patienter...",REGISTERED_SINCE:"Inscrit le",REGISTERED_SINCE_BLOCK:"Inscrit au bloc #",NO_CERTIFICATION:"Aucune certification validée",NO_GIVEN_CERTIFICATION:"Aucune certification émise",NOT_MEMBER_PARENTHESIS:"(non membre)",IDENTITY_REVOKED_PARENTHESIS:"(identité révoquée)",MEMBER_PENDING_REVOCATION_PARENTHESIS:"(en cours de révocation)",EXPIRE_IN:"Expiration",NOT_WRITTEN_EXPIRE_IN:"Date limite<br/>de traitement",EXPIRED:"Expiré",PSEUDO:"Pseudonyme",SIGNED_ON_BLOCK:"Emise au bloc #{{block}}",WRITTEN_ON_BLOCK:"Ecrite au bloc #{{block}}",GENERAL_DIVIDER:"Informations générales",NOT_MEMBER_ACCOUNT:"Compte simple (non membre)",NOT_MEMBER_ACCOUNT_HELP:"Il s'agit d'un simple portefeuille, sans demande d'adhésion en attente.",TECHNICAL_DIVIDER:"Informations techniques",BTN_CERTIFY:"Certifier",BTN_YES_CERTIFY:"Oui, certifier",BTN_SELECT_AND_CERTIFY:"Nouvelle certification",ACCOUNT_OPERATIONS:"Opérations sur le compte",VIEW:{POPOVER_SHARE_TITLE:"Identité {{title}}"},LOOKUP:{TITLE:"Annuaire",NEWCOMERS:"Nouveaux membres :",NEWCOMERS_COUNT:"{{count}} membres",PENDING:"Inscriptions en attente :",PENDING_COUNT:"{{count}} inscriptions en attente",REGISTERED:"Inscrit {{time | formatFromNow}}",MEMBER_FROM:"Membre depuis {{time|formatFromNowShort}}",BTN_NEWCOMERS:"Nouveaux membres",BTN_PENDING:"Inscriptions en attente",SHOW_MORE:"Afficher plus",SHOW_MORE_COUNT:"(limite actuelle à {{limit}})",NO_PENDING:"Aucune inscription en attente.",NO_NEWCOMERS:"Aucun membre."},CONTACTS:{TITLE:"Contacts"},MODAL:{TITLE:"Recherche"},CERTIFICATIONS:{TITLE:"{{uid}} - Certifications",SUMMARY:"Certifications reçues",LIST:"Détail des certifications reçues",PENDING_LIST:"Certifications en attente de traitement",RECEIVED:"Certifications reçues",RECEIVED_BY:"Certifications reçues par {{uid}}",ERROR:"Certifications reçues en erreur",SENTRY_MEMBER:"Membre référent"},OPERATIONS:{TITLE:"{{uid}} - Opérations"},GIVEN_CERTIFICATIONS:{TITLE:"{{uid}} - Certifications émises",SUMMARY:"Certifications émises",LIST:"Détail des certifications émises",PENDING_LIST:"Certifications en attente de traitement",SENT:"Certifications émises",SENT_BY:"Certifications émises par {{uid}}",ERROR:"Certifications émises en erreur"}},LOGIN:{TITLE:'<i class="icon ion-log-in"></i> Connexion',SCRYPT_FORM_HELP:"Veuillez saisir vos identifiants.<br>Pensez à vérifier que la clé publique est celle de votre compte.",PUBKEY_FORM_HELP:"Veuillez saisir une clé publique de compte :",FILE_FORM_HELP:"Choisissez le fichier de trousseau à utiliser :",SCAN_FORM_HELP:"Scanner le QR code d'un portefeuille.",SALT:"Identifiant",SALT_HELP:"Identifiant",SHOW_SALT:"Afficher l'identifiant ?",PASSWORD:"Mot de passe",PASSWORD_HELP:"Mot de passe",PUBKEY_HELP:"Exemple : « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »",NO_ACCOUNT_QUESTION:"Vous n'avez pas encore de compte ?",HAVE_ACCOUNT_QUESTION:"Vous avez déjà un compte ?",CREATE_ACCOUNT:"Créer un compte...",CREATE_FREE_ACCOUNT:"Créer un compte gratuitement",FORGOTTEN_ID:"Mot de passe oublié ?",ASSOCIATED_PUBKEY:"Clé publique du trousseau :",BTN_METHODS:"Autres méthodes",BTN_METHODS_DOTS:"Changer de méthode...",METHOD_POPOVER_TITLE:"Méthodes",MEMORIZE_AUTH_FILE:"Mémoriser ce trousseau le temps de la session de navigation",SCRYPT_PARAMETERS:"Paramètres (Scrypt) :",AUTO_LOGOUT:{TITLE:"Information",MESSAGE:'<i class="ion-android-time"></i> Vous avez été <b>déconnecté</b> automatiquement, suite à une inactivité prolongée.',BTN_RELOGIN:"Me reconnecter",IDLE_WARNING:"Vous allez être déconnecté... {{countdown}}"},METHOD:{SCRYPT_DEFAULT:"Identifiant et mot de passe",SCRYPT_ADVANCED:"Salage avancé",FILE:"Fichier de trousseau",PUBKEY:"Clé publique ou pseudonyme",SCAN:"Scanner un QR code"},SCRYPT:{SIMPLE:"Salage léger",DEFAULT:"Salage standard",SECURE:"Salage sûr",HARDEST:"Salage le plus sûr",EXTREME:"Salage extrême",USER:"Salage personnalisé",N:"N (Loop):",r:"r (RAM):",p:"p (CPU):"},FILE:{DATE:"Date:",TYPE:"Type:",SIZE:"Taille:",VALIDATING:"Validation...",HELP:"Format de fichier attendu : <b>.yml</b> ou <b>.dunikey</b> (type PubSec, WIF ou EWIF)."}},ACCOUNT:{TITLE:"Mon compte",SHOW_MORE_TX:"Afficher plus",SHOW_ALL_TX:"Afficher tout",EVENTS:"Evénements",BTN_RECEIVE_MONEY:"Encaisser",BTN_SECURITY_DOTS:"Compte et sécurité...",BTN_SHOW_DETAILS:"Afficher les infos techniques",NEW:{TITLE:"Inscription",INTRO_WARNING_TIME:"La création d'un compte sur {{name|capitalize}} est très simple. Veuillez néanmoins prendre suffisament de temps pour faire correctement cette formalité (pour ne pas oublier les identifiants, mots de passe, etc.).",INTRO_WARNING_SECURITY:"Vérifier que le matériel que vous utilisez actuellement (ordinateur, tablette, téléphone) <b>est sécurisé et digne de confiance</b>.",INTRO_WARNING_SECURITY_HELP:"Anti-virus à jour, pare-feu activé, session protégée par mot de passe ou code pin, etc.",INTRO_HELP:"Cliquez sur <b>{{'COMMON.BTN_START'|translate}}</b> pour débuter la création de compte. Vous serez guidé étape par étape.",REGISTRATION_NODE:"Votre inscription sera enregistrée via le noeud Duniter <b>{{server}}</b>, qui le diffusera ensuite au reste du réseau de la monnaie.",REGISTRATION_NODE_HELP:"Si vous ne faites pas confiance à ce noeud, veuillez en changer <a ng-click=\"doQuickFix('settings')\">dans les paramètres</a> de Cesium.",SELECT_ACCOUNT_TYPE:"Choisissez le type de compte à créer :",MEMBER_ACCOUNT:"Compte membre",MEMBER_ACCOUNT_TITLE:"Création d'un compte membre",MEMBER_ACCOUNT_HELP:"Si vous n'êtes pas encore inscrit en tant qu'individu (un seul compte possible par individu). Ce compte permet de co-produire la monnaie, en recevant un <b>dividende universel</b> chaque {{parameters.dt|formatPeriod}}.",WALLET_ACCOUNT:"Simple portefeuille",WALLET_ACCOUNT_TITLE:"Création d'un portefeuille",WALLET_ACCOUNT_HELP:"Pour tous les autres cas, par exemple si vous avez besoin d'un compte supplémentaire.<br/>Aucun dividende universel ne sera créé par ce compte.",SALT_WARNING:"Choisissez votre identifiant.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez-le bien</b>.<br/>En cas de perte, plus personne ne pourra accéder à votre compte !",PASSWORD_WARNING:"Choisissez un mot de passe.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez bien ce mot de passe</b>.<br/>En cas de perte, plus personne ne pourra accéder à votre compte !",PSEUDO_WARNING:"Choisissez un pseudonyme.<br/>Il sert aux autres membres, pour vous identifier plus facilement.<div class='hidden-xs'><br/>Il <b>ne pourra pas être modifié</b>, sans refaire un compte.</div><br/><br/>Il ne doit contenir <b>ni espace, ni de caractère accentué</b>.<div class='hidden-xs'><br/>Exemple : <span class='gray'>SophieDupond, MarcelChemin, etc.</span>",PSEUDO:"Pseudonyme",PSEUDO_HELP:"Pseudonyme",SALT_CONFIRM:"Confirmation",SALT_CONFIRM_HELP:"Confirmation de l'identifiant",PASSWORD_CONFIRM:"Confirmation",PASSWORD_CONFIRM_HELP:"Confirmation du mot de passe",SLIDE_6_TITLE:"Confirmation :",COMPUTING_PUBKEY:"Calcul en cours...",LAST_SLIDE_CONGRATULATION:"Vous avez saisi toutes les informations nécessaires : Bravo !<br/>Vous pouvez maintenant <b>envoyer la demande de création</b> de compte.</b><br/><br/>Pour information, la clé publique ci-dessous identifiera votre futur compte.<br/>Elle pourra être communiquée à des tiers pour recevoir leur paiement.<br/><b>Il n'est pas obligatoire</b> de la noter ici, vous pourrez également le faire plus tard.",CONFIRMATION_MEMBER_ACCOUNT:"<b class=\"assertive\">Avertissement :</b> l'identifiant, le mot de passe et le pseudonyme ne pourront plus être modifiés.<br/><br/><b>Assurez-vous de toujours vous en rappeler !</b><br/><br/><b>Êtes-vous sûr</b> de vouloir envoyer cette demande d'inscription ?",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Avertissement :</b> l\'identifiant et le mot de passe ne pourront plus être modifiés.<br/><br/><b>Assurez-vous de toujours vous en rappeler !</b><br/><br/><b>Êtes-vous sûr</b> de vouloir continuer avec ces identifiants ?',CHECKING_PSEUDO:"Vérification...",PSEUDO_AVAILABLE:"Pseudonyme disponible",PSEUDO_NOT_AVAILABLE:"Pseudonyme non disponible",INFO_LICENSE:"Avant de créer un compte membre, <b>veuillez lire et accepter la licence</b> d'usage de la monnaie :",BTN_ACCEPT:"J'accepte",BTN_ACCEPT_LICENSE:"J'accepte la licence"},POPUP_REGISTER:{TITLE:"Choisissez un pseudonyme",HELP:"Un pseudonyme est obligatoire pour devenir membre."},HEADERS:{TIME:"Date",AMOUNT:"Montant",COMMENT:"Commentaire"}},TRANSFER:{TITLE:"Virement",SUB_TITLE:"Faire un virement",FROM:"De",TO:"À",AMOUNT:"Montant",AMOUNT_HELP:"Montant",COMMENT:"Commentaire",COMMENT_HELP:"Commentaire",BTN_SEND:"Envoyer",BTN_ADD_COMMENT:"Saisir un commentaire ?",MODAL:{TITLE:"Virement"}},ERROR:{UNKNOWN_URI_FORMAT:"Format d'URI inconnu",PUBKEY_INVALID_CHECKSUM:"Clé publique invalide (bad checksum).",POPUP_TITLE:"Erreur",UNKNOWN_ERROR:"Erreur inconnue",CRYPTO_UNKNOWN_ERROR:"Votre navigateur ne semble pas compatible avec les fonctionnalités de cryptographie.",EQUALS_TO_PSEUDO:"Doit être différent du pseudonyme",EQUALS_TO_SALT:"Doit être différent de l'identifiant secret",FIELD_REQUIRED:"Champ obligatoire",FIELD_TOO_SHORT:"Valeur trop courte",FIELD_TOO_SHORT_WITH_LENGTH:"Valeur trop courte ({{minLength}} caractères min)",FIELD_TOO_LONG:"Valeur trop longue",FIELD_TOO_LONG_WITH_LENGTH:"Valeur trop longue ({{maxLength}} caractères max)",FIELD_MIN:"Valeur minimale : {{min}}",FIELD_MAX:"Valeur maximale : {{max}}",FIELD_ACCENT:"Caractères accentués et virgules non autorisés",FIELD_NOT_NUMBER:"Valeur numérique attendue",FIELD_NOT_INT:"Valeur entière attendue",FIELD_NOT_EMAIL:"Adresse email non valide",PASSWORD_NOT_CONFIRMED:"Ne correspond pas au mot de passe",SALT_NOT_CONFIRMED:"Ne correspond pas à l'identifiant",SEND_IDENTITY_FAILED:"Échec de l'inscription",SEND_CERTIFICATION_FAILED:"Échec de la certification",NEED_MEMBER_ACCOUNT_TO_CERTIFY:"Vous ne pouvez pas effectuer de certification, car votre compte n'est <b>pas membre</b>.",NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF:"Vous ne pouvez pas effectuer de certification, car votre compte n'est pas encore membre.<br/><br/>Il vous manque encore des certifications, ou bien celles-ci n'ont pas encore été validées.",NOT_MEMBER_FOR_CERTIFICATION:"Votre compte n'est pas encore membre.",IDENTITY_TO_CERTIFY_HAS_NO_SELF:"Compte non certifiable. Aucune demande d'adhésion n'a été faite, ou bien elle n'a pas été renouvelée.",LOGIN_FAILED:"Erreur lors de la connexion.",LOAD_IDENTITY_FAILED:"Erreur de chargement de l'identité.",LOAD_REQUIREMENTS_FAILED:"Erreur de chargement des prérequis de l'identité.",SEND_MEMBERSHIP_IN_FAILED:"Échec de la tentative d'entrée dans la communauté.",SEND_MEMBERSHIP_OUT_FAILED:"Échec de l'arrêt de l'adhésion.",REFRESH_WALLET_DATA:"Échec du rafraîchissement du portefeuille.",GET_CURRENCY_PARAMETER:"Échec de la récupération des règles de la monnaie.",GET_CURRENCY_FAILED:"Chargement de la monnaie impossible. Veuillez réessayer plus tard.",SEND_TX_FAILED:"Échec du virement.",ALL_SOURCES_USED:"Veuillez attendre le calcul du prochain bloc (toutes vos sources de monnaie ont été utilisées).",NOT_ENOUGH_SOURCES:"Pas assez de change pour envoyer ce montant en une seule transaction.<br/>Montant maximum : {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",ACCOUNT_CREATION_FAILED:"Échec de la création du compte membre.",RESTORE_WALLET_DATA_ERROR:"Échec du rechargement des paramètres depuis le stockage local",LOAD_WALLET_DATA_ERROR:"Échec du chargement des données du portefeuille.",COPY_CLIPBOARD_FAILED:"Copie de la valeur impossible.",TAKE_PICTURE_FAILED:"Échec de la récupération de la photo.",SCAN_FAILED:"Échec du scan de QR-code.",SCAN_UNKNOWN_FORMAT:"Code non reconnu.",WOT_LOOKUP_FAILED:"Échec de la recherche.",LOAD_PEER_DATA_FAILED:"Lecture du nœud Duniter impossible. Veuillez réessayer ultérieurement.",NEED_LOGIN_FIRST:"Veuillez d'abord vous connecter.",AMOUNT_REQUIRED:"Le montant est obligatoire.",AMOUNT_NEGATIVE:"Montant négatif non autorisé.",NOT_ENOUGH_CREDIT:"Crédit insuffisant.",INVALID_NODE_SUMMARY:"Nœud injoignable ou adresse invalide.",INVALID_USER_ID:"Le pseudonyme ne doit contenir ni espace ni caractère spécial ou accentué.",INVALID_COMMENT:"Le champ 'référence' ne doit pas contenir de caractères accentués.",INVALID_PUBKEY:"La clé publique n'a pas le format attendu.",INVALID_PUBKEY_CHECKSUM:"Somme de contrôle invalide.",IDENTITY_REVOKED:"Cette identité <b>a été révoquée {{revocationTime|formatFromNow}}</b> ({{revocationTime|formatDate}}). Elle ne peut plus devenir membre.",IDENTITY_PENDING_REVOCATION:"La <b>révocation de cette identité</b> a été demandée et est en attente de traitement. La certification est donc désactivée.",IDENTITY_INVALID_BLOCK_HASH:"Cette demande d'adhésion n'est plus valide (car elle référence un bloc que les nœuds du réseau ont annulé) : cette personne doit renouveler sa demande d'adhésion <b>avant</b> d'être certifiée.",IDENTITY_EXPIRED:"La publication de cette identité a expiré : cette personne doit effectuer une nouvelle demande d'adhésion <b>avant</b> d'être certifiée.",IDENTITY_SANDBOX_FULL:"Le nœud Duniter utilisé par Cesium ne peut plus recevoir de nouvelles identités, car sa file d'attente est pleine.<br/><br/>Veuillez réessayer ultérieurement ou changer de nœud (via le menu <b>Paramètres</b>).",IDENTITY_NOT_FOUND:"Identité non trouvée.",IDENTITY_TX_FAILED:"Échec du chargement des opérations.",WOT_PENDING_INVALID_BLOCK_HASH:"Adhésion non valide.",WALLET_INVALID_BLOCK_HASH:"Votre demande d'adhésion n'est plus valide (car elle référence un bloc que les nœuds du réseau ont annulé).<br/>Vous devez <a ng-click=\"doQuickFix('fixMembership')\">envoyer une nouvelle demande</a> pour résoudre ce problème.",WALLET_IDENTITY_EXPIRED:"La publication de <b>votre identité a expiré</b>.<br/>Vous devez <a ng-click=\"doQuickFix('fixIdentity')\">publier à nouveau votre identité</a> pour résoudre ce problème.",WALLET_REVOKED:"Votre identité a été <b>révoquée</b> : ni votre pseudonyme ni votre clef publique ne pourra être utilisé à l'avenir pour un compte membre.",WALLET_HAS_NO_SELF:"Votre identité doit d'abord avoir été publiée, et ne pas être expirée.",AUTH_REQUIRED:"Authentification requise.",AUTH_INVALID_PUBKEY:"La clé publique ne correspond pas au compte connecté.",AUTH_INVALID_SCRYPT:"Identifiant ou mot de passe invalide.",AUTH_INVALID_FILE:"Fichier de trousseau invalide.",AUTH_FILE_ERROR:"Échec de l'ouverture du fichier de trousseau",IDENTITY_ALREADY_CERTIFY:"Vous avez <b>déjà certifié</b> cette identité.<br/><br/>Cette certification est encore valide (expiration {{expiresIn|formatDurationTo}}).",IDENTITY_ALREADY_CERTIFY_PENDING:"Vous avez <b>déjà certifié</b> cette identité.<br/><br/>Cette certification est en attente de traitement (date limite de traitement {{expiresIn|formatDurationTo}}).",UNABLE_TO_CERTIFY_TITLE:"Certification impossible",LOAD_NEWCOMERS_FAILED:"Échec du chargement des nouveaux membres.",LOAD_PENDING_FAILED:"Échec du chargement des inscriptions en attente.",ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION:"Vous devez <b>être membre</b> pour pouvoir effectuer cette action.",ONLY_SELF_CAN_EXECUTE_THIS_ACTION:"Vous devez avoir <b>publié votre identité</b> pour pouvoir effectuer cette action.",GET_BLOCK_FAILED:"Échec de la récupération du bloc",INVALID_BLOCK_HASH:"Bloc non trouvé (hash différent)",DOWNLOAD_REVOCATION_FAILED:"Échec du téléchargement du fichier de révocation.",REVOCATION_FAILED:"Échec de la révocation.",SALT_OR_PASSWORD_NOT_CONFIRMED:"Identifiant ou mot de passe incorrect",RECOVER_ID_FAILED:"Échec de la récupération des identifiants",LOAD_FILE_FAILED:"Échec du chargement du fichier",NOT_VALID_REVOCATION_FILE:"Fichier de révocation non valide (mauvais format de fichier)",NOT_VALID_SAVE_ID_FILE:"Fichier de récupération non valide (mauvais format de fichier)",NOT_VALID_KEY_FILE:"Fichier de trousseau non valide (format non reconnu)",EXISTING_ACCOUNT:"Vos identifiants correspondent à un compte déjà existant, dont la <a ng-click=\"showHelpModal('pubkey')\">clef publique</a> est :",EXISTING_ACCOUNT_REQUEST:"Veuillez modifier vos identifiants afin qu'ils correspondent à un compte non utilisé.",GET_LICENSE_FILE_FAILED:"Récupération du fichier de licence impossible",CHECK_NETWORK_CONNECTION:"Aucun nœud ne semble accessible.<br/><br/>Veuillez <b>vérifier votre connexion Internet</b>."},INFO:{POPUP_TITLE:"Information",CERTIFICATION_DONE:"Certification envoyée",NOT_ENOUGH_CREDIT:"Crédit insuffisant",TRANSFER_SENT:"Virement envoyé",COPY_TO_CLIPBOARD_DONE:"Copié dans le presse-papier",MEMBERSHIP_OUT_SENT:"Résiliation envoyée",NOT_NEED_MEMBERSHIP:"Vous êtes déjà membre.",IDENTITY_WILL_MISSING_CERTIFICATIONS:"Cette identité va bientôt manquer de certifications (au moins {{willNeedCertificationCount}}).",REVOCATION_SENT:"Révocation envoyée",REVOCATION_SENT_WAITING_PROCESS:"La <b>révocation de cette identité</b> a été demandée et est en attente de traitement.",FEATURES_NOT_IMPLEMENTED:"Cette fonctionnalité est encore en cours de développement.<br/>Pourquoi ne pas <b>contribuer à Cesium</b>, pour l'obtenir plus rapidement ? ;)",EMPTY_TX_HISTORY:"Aucune opération à exporter"},CONFIRM:{POPUP_TITLE:"<b>Confirmation</b>",POPUP_WARNING_TITLE:"<b>Avertissement</b>",POPUP_SECURITY_WARNING_TITLE:'<i class="icon ion-alert-circled"></i> <b>Avertissement de sécurité</b>',CERTIFY_RULES_TITLE_UID:"Certifier {{uid}}",CERTIFY_RULES:'<b class="assertive">Ne PAS certifier</b> un compte si vous pensez que :<br/><br/><ul><li>1.) il ne correspond pas à une personne <b>physique et vivante</b>.<li>2.) son propriétaire <b>possède un autre compte</b> déjà certifié.<li>3.) son propriétaire viole (volontairement ou non) la règle 1 ou 2 (par exemple en certifiant des comptes factices ou en double).</ul><br/><b>Êtes-vous sûr</b> de vouloir néanmoins certifier cette identité ?',FULLSCREEN:"Afficher l'application en plein écran ?",EXIT_APP:"Fermer l'application ?",LOGIN_UNUSED_WALLET_TITLE:"Erreur de saisie ?",LOGIN_UNUSED_WALLET:"Le compte connecté semble <b>inactif</b>.<br/><br/>Il s'agit probablement d'une <b>erreur de saisie</b> dans vos identifiants de connexion. Veuillez recommencer, en vérifiant que <b>la clé publique est celle de votre compte</b>.",SAVE_BEFORE_LEAVE:"Voulez-vous <b>sauvegarder vos modifications</b> avant de quitter la page ?",SAVE_BEFORE_LEAVE_TITLE:"Modifications non enregistrées",LOGOUT:"Êtes-vous de vouloir vous déconnecter ?",USE_FALLBACK_NODE:"Nœud <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud <b>{{new}}</b> ?"},HELP:{TITLE:"Aide en ligne",JOIN:{SECTION:"Inscription",SALT:"L'identifiant sert à vous identifier sur votre compte gchange.<br/><b>Veillez à bien le mémoriser</b>, car aucun moyen n'est actuellement prévu pour le retrouver en cas de perte.<br/>Par ailleurs, il ne peut pas être modifié sans devoir créer un nouveau compte.<br/><br/>Un bon identifiant doit être suffisamment long (au moins 8 caractères) et le plus original possible.",PASSWORD:"Le mot de passe est très essentiel pour accéder à votre compte.<br/><b>Veillez à bien le mémoriser</b>, car aucun moyen n'est actuellement prévu pour le retrouver en cas de perte (sauf à générer un fichier de sauvegarde).<br/>Par ailleurs, il ne peut pas être modifié sans devoir créer un nouveau compte.<br/><br/>Un bon mot de passe contient (idéalement) au moins 8 caractères, dont au moins une majuscule et un chiffre."},GLOSSARY:{SECTION:"Glossaire",PUBKEY_DEF:"Une clé publique identifie un compte. Elle est calculée grâce à l'identifiant et au mot de passe.",UNIVERSAL_DIVIDEND_DEF:'Le Dividende Universel (DU) est la quantité de monnaie co-créée par chaque membre, suivant la période et le calcul définis dans les <span class="text-italic">règles de la monnaie</span>.<br/>A chaque échéance, les membres reçoivent sur leur compte la même quantité de nouvelle monnaie.<br/><br/>Le DU subit une croissance régulière, pour rester juste entre les membres (actuels et à venir), calculée en fonction de l\'espérance de vie moyenne, telle que démontré dans la Thérorie Relative de la Monnaie (TRM).<br/><a href="http://trm.creationmonetaire.info" target="_system">En savoir plus sur la TRM</a> et les monnaies libres.'}}})}]),angular.module("cesium.plugins",["cesium.plugins.translations","cesium.plugins.templates","cesium.es.plugin","cesium.market.plugin","cesium.map.plugin","cesium.graph.plugin"]),angular.module("cesium.plugins.translations",[]).config(["$translateProvider",function(e){e.translations("en-GB",{COMMON:{CATEGORY:"Category",CATEGORY_SELECT_HELP:"Select",CATEGORIES:"Categories",CATEGORY_SEARCH_HELP:"Search",COMMENT_HELP:"Comments",LAST_MODIFICATION_DATE:"Updated on ",BTN_LIKE:"I like",BTN_FOLLOW:"Follow",BTN_STOP_FOLLOW:"Stop following",LIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} liked this page",DISLIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} disliked this page",VIEWS_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} viewed this page",FOLLOWS_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} follows this page",ABUSES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page",BTN_REPORT_ABUSE_DOTS:"Report a problem or an abuse...",BTN_REMOVE_REPORTED_ABUSE:"Cancel my problem report",SUBMIT_BY:"Submitted by",GEO_DISTANCE_SEARCH:"Search distance",GEO_DISTANCE_OPTION:"{{value}} km",BTN_PUBLISH:"Publish",BTN_PICTURE_DELETE:"Delete",BTN_PICTURE_FAVORISE:"Default",BTN_PICTURE_ROTATE:"Rotate",BTN_ADD_PICTURE:"Add picture",NOTIFICATION:{TITLE:"New notification | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"You have {{count}} unread notification{{count>0?'s':''}}"},NOTIFICATIONS:{TITLE:"Notifications",MARK_ALL_AS_READ:"Mark all as read",NO_RESULT:"No notification",SHOW_ALL:"Show all",LOAD_NOTIFICATIONS_FAILED:"Could not load notifications"},REPORT_ABUSE:{TITLE:"Report a problem",SUB_TITLE:"Please explain briefly the problem:",REASON_HELP:"I explain the problem...",ASK_DELETE:"Request removal?",CONFIRM:{SENT:"Request sent. Thank you!"}}},MENU:{REGISTRY:"Pages",USER_PROFILE:"My Profile",MESSAGES:"Messages",NOTIFICATIONS:"Notifications",INVITATIONS:"Invitations"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Account for an organization",ORGANIZATION_ACCOUNT_HELP:"If you represent a company, association, etc.<br/>No universal dividend will be created by this account."},EVENT:{MEMBER_WITHOUT_PROFILE:'To obtain your certification more quickly, fill in <a ui-sref="app.user_edit_profile">your user profile</a>. Members will more easily put their trust in a verifiable identity.'},ERROR:{WS_CONNECTION_FAILED:"Cesium can not receive notifications because of a technical error (connection to the Cesium + data node).<br/><br/>If the problem persists, please <b>choose another data node</b> in Cesium+ settings."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Suggest identities to certify...",BTN_ASK_CERTIFICATIONS_DOTS:"Ask members to certify me...",BTN_ASK_CERTIFICATION:"Ask a certification",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Suggest certifications",HELP:"Select your suggestions"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Ask certifications",HELP:"Select recipients"},SEARCH:{DIVIDER_PROFILE:"Profile",DIVIDER_PAGE:"Pages",DIVIDER_GROUP:"Groups"},VIEW:{SENIORITY:"Seniority on {{'COMMON.APP_NAME'|translate}}",STARS:"Trust level",STAR_HIT_COUNT:"{{total}} rate{{total>1 ? 's' : ''}}",BTN_STAR_HELP:"Rate this profile",BTN_STARS_REMOVE:"Remove my note",BTN_REDO_STAR_HELP:"Update your rate for this profile",BTN_FOLLOW:"Follow the activity of this profile",BTN_STOP_FOLLOW:"Stop following this profile"}},COMMENTS:{DIVIDER:"Comments",SHOW_MORE_COMMENTS:"Show previous comments",COMMENT_HELP:"Your comment, question...",COMMENT_HELP_REPLY_TO:"Your answer...",BTN_SEND:"Send",POPOVER_SHARE_TITLE:"Message #{{number}}",REPLY:"Reply",REPLY_TO:"Respond to:",REPLY_TO_LINK:"In response to ",REPLY_TO_DELETED_COMMENT:"In response to a deleted comment",REPLY_COUNT:"{{replyCount}} responses",DELETED_COMMENT:"Comment deleted",MODIFIED_ON:"modified on {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modified then)",ERROR:{FAILED_SAVE_COMMENT:"Saving comment failed",FAILED_REMOVE_COMMENT:"Deleting comment failed"}},MESSAGE:{REPLY_TITLE_PREFIX:"Re: ",FORWARD_TITLE_PREFIX:"Fw: ",BTN_REPLY:"Reply",BTN_COMPOSE:"New message",BTN_WRITE:"Write",NO_MESSAGE_INBOX:"No message received",NO_MESSAGE_OUTBOX:"No message sent",NOTIFICATIONS:{TITLE:"Messages",MESSAGE_RECEIVED:"You <b>received a message</b><br/>from"},LIST:{INBOX:"Inbox",OUTBOX:"Outbox",LAST_INBOX:"New messages",LAST_OUTBOX:"Sent messages",BTN_LAST_MESSAGES:"Recent messages",TITLE:"Private messages",SEARCH_HELP:"Search in messages",POPOVER_ACTIONS:{TITLE:"Options",DELETE_ALL:"Delete all messages"}},COMPOSE:{TITLE:"New message",TITLE_REPLY:"Reply",SUB_TITLE:"New message",TO:"To",OBJECT:"Object",OBJECT_HELP:"Object",ENCRYPTED_HELP:"Please note this message will be encrypted before sending so that only the recipient can read it and be sure you are the author.",MESSAGE:"Message",MESSAGE_HELP:"Message content",CONTENT_CONFIRMATION:"No message content.<br/><br/>Are your sure you want to send this message?"},VIEW:{TITLE:"Message",SENDER:"Sent by",RECIPIENT:"Sent to",NO_CONTENT:"Empty message",DELETE:"Delete the message"},CONFIRM:{REMOVE:"Are you sure you want to <b>delete this message</b>?<br/><br/> This operation is irreversible.",REMOVE_ALL:"Are you sure you want to <b>delete all messages</b>?<br/><br/> This operation is irreversible.",MARK_ALL_AS_READ:"Are you sure you want to <b>mark all message as read</b>?",USER_HAS_NO_PROFILE:"This identity has no Cesium + profile. It may not use the Cesium + extension, so it <b>will not read your message</b>.<br/><br/>Are you sure you want <b>to continue</b>?"},INFO:{MESSAGE_REMOVED:"Message successfully deleted",All_MESSAGE_REMOVED:"Messages successfully deleted",MESSAGE_SENT:"Message sent"},ERROR:{SEND_MSG_FAILED:"Error while sending message.",LOAD_MESSAGES_FAILED:"Error while loading messages.",LOAD_MESSAGE_FAILED:"Error while loading message.",MESSAGE_NOT_READABLE:"Unable to read message.",USER_NOT_RECIPIENT:"You are not the recipient of this message: unable to read it.",NOT_AUTHENTICATED_MESSAGE:"The authenticity of the message is not certain or its content is corrupted.",REMOVE_MESSAGE_FAILED:"Error while deleting message",MESSAGE_CONTENT_TOO_LONG:"Value too long ({{maxLength}} characters max).",MARK_AS_READ_FAILED:"Unable to mark the message as 'read'.",LOAD_NOTIFICATIONS_FAILED:"Error while loading messages notifications.",REMOVE_All_MESSAGES_FAILED:"Error while removing all messages.",MARK_ALL_AS_READ_FAILED:"Error while marking messages as read.",RECIPIENT_IS_MANDATORY:"Recipient is mandatory."}},REGISTRY:{CATEGORY:"Main activity",GENERAL_DIVIDER:"Basic information",LOCATION_DIVIDER:"Address",SOCIAL_NETWORKS_DIVIDER:"Social networks, web sites",TECHNICAL_DIVIDER:"Technical data",BTN_SHOW_WOT:"People",BTN_SHOW_WOT_HELP:"Search for people",BTN_SHOW_PAGES:"Pages",BTN_SHOW_PAGES_HELP:"Search for pages",BTN_NEW:"New page",MY_PAGES:"My pages",NO_PAGE:"No page",SEARCH:{TITLE:"Pages",SEARCH_HELP:"What, Who: hairdresser, Lili's restaurant, ...",BTN_ADD:"New",BTN_LAST_RECORDS:"Recent pages",BTN_ADVANCED_SEARCH:"Advanced search",BTN_OPTIONS:"Advanced search",TYPE:"Kind of organization",LOCATION_HELP:"Where: City, Country",RESULTS:"Results",RESULT_COUNT_LOCATION:"{{count}} result{{count>0?'s':''}}, near {{location}}",RESULT_COUNT:"{{count}} result{{count>0?'s':''}}",LAST_RECORDS:"Recent pages",LAST_RECORD_COUNT_LOCATION:"{{count}} recent page{{count>0?'s':''}}, near {{location}}",LAST_RECORD_COUNT:"{{count}} recent page{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Advanced options?"}},VIEW:{TITLE:"Registry",CATEGORY:"Main activity:",LOCATION:"Address:",MENU_TITLE:"Options",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Are you sure you want to delete this reference?<br/><br/>This is irreversible."},TYPE:{TITLE:"New page",SELECT_TYPE:"Kind of organization:",ENUM:{SHOP:"Local shops",COMPANY:"Company",ASSOCIATION:"Association",INSTITUTION:"Institution"}},EDIT:{TITLE:"Edit",TITLE_NEW:"New page",RECORD_TYPE:"Kind of organization",RECORD_TITLE:"Name",RECORD_TITLE_HELP:"Name",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Describe activity",RECORD_ADDRESS:"Street",RECORD_ADDRESS_HELP:"Street, building...",RECORD_CITY:"City",RECORD_CITY_HELP:"City, Country",RECORD_SOCIAL_NETWORKS:"Social networks and web site",RECORD_PUBKEY:"Public key",RECORD_PUBKEY_HELP:"Public key to receive payments"},WALLET:{REGISTRY_DIVIDER:"Pages",REGISTRY_HELP:"Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions."},ERROR:{LOAD_CATEGORY_FAILED:"Loading main activities failed",LOAD_RECORD_FAILED:"Loading failed",LOOKUP_RECORDS_FAILED:"Error while loading records.",REMOVE_RECORD_FAILED:"Deleting failed",SAVE_RECORD_FAILED:"Saving failed",RECORD_NOT_EXISTS:"Record not found",GEO_LOCATION_NOT_FOUND:"City or zip code not found"},INFO:{RECORD_REMOVED:"Page successfully deleted",RECORD_SAVED:"Page successfully saved"}},PROFILE:{PROFILE_DIVIDER:"ğchange profile",PROFILE_DIVIDER_HELP:"It is related data, stored in the ğchange network.",NO_PROFILE_DEFINED:"No ğchange profile",BTN_ADD:"Create my profile",BTN_EDIT:"Edit my profile",BTN_DELETE:"Delete my profile",BTN_REORDER:"Reorder",UID:"Pseudonym",TITLE:"Lastname, FirstName",TITLE_HELP:"Name",DESCRIPTION:"About me",DESCRIPTION_HELP:"About me...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"General data",SOCIAL_NETWORKS_DIVIDER:"Social networks and web site",STAR:"Trust level",TECHNICAL_DIVIDER:"Technical data",MODAL_AVATAR:{TITLE:"Avatar",SELECT_FILE_HELP:"<b>Choose an image file</b>, by clicking on the button below:",BTN_SELECT_FILE:"Choose an image",RESIZE_HELP:"<b>Re-crop the image</b> if necessary. A click on the image allows to move it. Click on the area at the bottom left to zoom in.",RESULT_HELP:"<b>Here is the result</b> as seen on your profile:"},CONFIRM:{DELETE:"Are you sure you want to <b>delete your Cesium+ profile ?</b><br/><br/>This operation is irreversible."},ERROR:{REMOVE_PROFILE_FAILED:"Deleting profile failed",LOAD_PROFILE_FAILED:"Could not load user profile.",SAVE_PROFILE_FAILED:"Saving profile failed",INVALID_SOCIAL_NETWORK_FORMAT:"Invalid format: please fill a valid Internet address.<br/><br/>Examples :<ul><li>- A Facebook page (https://www.facebook.com/user)</li><li>- A web page (http://www.domain.com)</li><li>- An email address (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Error while resizing picture"},INFO:{PROFILE_REMOVED:"Profile deleted",PROFILE_SAVED:"Profile saved"},HELP:{WARNING_PUBLIC_DATA:"Please note that the information published here <b>is public</b>: visible including by <b>not logged in people</b>."}},LOCATION:{BTN_GEOLOC_ADDRESS:"Find my address on the map",USE_GEO_POINT:"Verify address (recommended)?",LOADING_LOCATION:"Searching address...",LOCATION_DIVIDER:"Localisation",ADDRESS:"Address",ADDRESS_HELP:"Address (optional)",CITY:"City",CITY_HELP:"City, Country",DISTANCE:"Maximum distance around the city",DISTANCE_UNIT:"mi",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"City, Country",PROFILE_POSITION:"Profile position",MODAL:{TITLE:"Search address",SEARCH_HELP:"City, Country",ALTERNATIVE_RESULT_DIVIDER:"Alternative results for <b>{{address}}</b>:",POSITION:"lat/lon : {{lat}} / {{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Required if a street has been filled",REQUIRED_FOR_LOCATION:"Required field to appear on the map",INVALID_FOR_LOCATION:"Unknown address",GEO_LOCATION_FAILED:"Unable to retrieve your current position. Please use the search button.",ADDRESS_LOCATION_FAILED:"Unable to retrieve the address position"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Online services",SUBSCRIPTION_DIVIDER_HELP:"Online services offer optional additional services, delegated to a third party.",BTN_ADD:"Add a service",BTN_EDIT:"Manage my services",NO_SUBSCRIPTION:"No service defined",SUBSCRIPTION_COUNT:"Services / Subscription",EDIT:{TITLE:"Online services",HELP_TEXT:"Manage your subscriptions and other online services here",PROVIDER:"Provider:"},TYPE:{ENUM:{EMAIL:"Receive email notifications"}},CONFIRM:{DELETE_SUBSCRIPTION:"Are you sur you want to <b>delete this subscription</b>?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Error while loading online services",ADD_SUBSCRIPTION_FAILED:"Error while adding subscription",UPDATE_SUBSCRIPTION_FAILED:"Error during subscription update",DELETE_SUBSCRIPTION_FAILED:"Error while deleting subscription"},MODAL_EMAIL:{TITLE:"Notification by email",HELP:"Fill out this form to <b>be notified by email</ b> of your account's events. <br/>Your email address will be encrypted only to be visible to the service provider.",EMAIL_LABEL:"Your email:",EMAIL_HELP:"john@domain.com",FREQUENCY_LABEL:"Frequency of notifications:",FREQUENCY_DAILY:"Daily",FREQUENCY_WEEKLY:"Weekly",PROVIDER:"Service Provider:"}},DOCUMENT:{HASH:"Hash: ",LOOKUP:{TITLE:"Document search",BTN_ACTIONS:"Actions",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS_DOTS:"Last documents :",LAST_DOCUMENTS:"Last documents",SHOW_QUERY:"Show query",HIDE_QUERY:"Hide query",HEADER_TIME:"Time/Hour",HEADER_ISSUER:"Issuer",HEADER_RECIPIENT:"Recipient",READ:"Read",DOCUMENT_TYPE:"Type",DOCUMENT_TITLE:"Title",BTN_REMOVE:"Delete this document",BTN_COMPACT:"Compact",HAS_REGISTERED:"create or edit his profile",POPOVER_ACTIONS:{TITLE:"Actions",REMOVE_ALL:"Delete these documents..."},TYPE:{USER_PROFILE:"Profile",MARKET_RECORD:"Ad",MARKET_COMMENT:"Comment on a ad",PAGE_RECORD:"Page",PAGE_COMMENT:"Comment on a page",GROUP_RECORD:"Group",GROUP_COMMENT:"Comment on a group"}},INFO:{REMOVED:"Deleted document"},CONFIRM:{REMOVE:"Are you sure you want to <b>delete this document</b>?",REMOVE_ALL:"Are you sure you want to <b>delete these documents</b>?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Error searching documents",REMOVE_FAILED:"Error deleting the document",REMOVE_ALL_FAILED:"Error deleting documents"}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"User profiles, notifications, private messages",ENABLE_TOGGLE:"Enable extension?",ENABLE_MESSAGE_TOGGLE:"Enable messages?",ENABLE_SETTINGS_TOGGLE:"Enable remote storage for settings?",PEER:"Data peer address",POPUP_PEER:{TITLE:"Data peer",HELP:"Set the address of the peer to use:",PEER_HELP:"server.domain.com:port"},NOTIFICATIONS:{DIVIDER:"Notifications",HELP_TEXT:"Enable the types of notifications you want to receive:",ENABLE_TX_SENT:"Notify the validation of <b>sent payments</b>?",ENABLE_TX_RECEIVED:"Notify the validation of <b>received payments</b>?",ENABLE_CERT_SENT:"Notify the validation of <b>sent certifications</b>?",ENABLE_CERT_RECEIVED:"Notify the validation of <b>received certifications</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"New features",ASK_ENABLE:'Some new features are available: <ul><li> <b><i class="icon ion-person"></i> user profiles</b>;<li> <b><i class="icon ion-android-notifications"></i> Notifications</b>;<li> <b><i class="icon ion-email"></i> Private messages</b>.</ul><br/>They have been <b>disabled</b> in your settings.<br/><br/><b>Do you want to enable</b> these features?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"A recipient is required for encryption."}},ES_PEER:{NAME:"Name",DOCUMENTS:"Documents",SOFTWARE:"Software",DOCUMENT_COUNT:"Number of documents",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} subscribers to email notification"},EVENT:{NODE_STARTED:"Your node ES API <b>{{params[0]}}</b> is UP",NODE_BMA_DOWN:"Node <b>{{params[0]}}:{{params[1]}}</b> (used by your ES API) is <b>unreachable</b>.",NODE_BMA_UP:"Node <b>{{params[0]}}:{{params[1]}}</b> is reachable again.",MEMBER_JOIN:"You are now a <b>member</b> of currency <b>{{params[0]}}</b>!",MEMBER_LEAVE:"You are <b>not a member anymore</b> of currency <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"You are <b>not more member</b> of the currency <b>{{params[0]}}</b>, for lack of renewal or lack of certifications.",MEMBER_REVOKE:"Your account has been revoked. It will no longer be a member of the currency <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Your membership to <b>{{params[0]}}</b> has been <b>renewed successfully</b>.",TX_SENT:'Your payment to <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> was executed.',TX_SENT_MULTI:"Your payment to <b>{{params[1]}}</b> was executed.",TX_RECEIVED:'You received a payment from <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',TX_RECEIVED_MULTI:"You received a payment from <b>{{params[1]}}</b>.",CERT_SENT:'Your <b>certification</b> to <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> was executed.',CERT_RECEIVED:'You have <b>received a certification</b> from <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> like your profile',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> follows your activity',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> rated you ({{params[3]}} <i class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> asks you for a moderation on the profile: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> reported a profile to be deleted: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has requested moderation on your profile'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his comment on your referencing: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has replied to your comment on the referencing: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on the page: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his comment on the page: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> added a page: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> updated the page: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> asks you for a moderation on the page: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> reported a page to be deleted: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>'}},CONFIRM:{ES_USE_FALLBACK_NODE:"Data node <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> data node?"},ERROR:{ES_CONNECTION_ERROR:'Data node <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change data node in <a class="positive" ng-click="doQuickFix(\'settings\')">advanced settings</a>.',ES_MAX_UPLOAD_BODY_SIZE:"The volume of data to be sent exceeds the limit set by the server.<br/><br/>Please try again after, for example, deleting photos."}}),e.translations("en",{COMMON:{CATEGORY:"Category",CATEGORY_SELECT_HELP:"Select",CATEGORIES:"Categories",CATEGORY_SEARCH_HELP:"Search",COMMENT_HELP:"Comments",LAST_MODIFICATION_DATE:"Updated on ",BTN_LIKE:"I like",BTN_FOLLOW:"Follow",BTN_STOP_FOLLOW:"Stop following",LIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} liked this page",DISLIKES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} disliked this page",VIEWS_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} viewed this page",FOLLOWS_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} follows this page",ABUSES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page",BTN_REPORT_ABUSE_DOTS:"Report a problem or an abuse...",BTN_REMOVE_REPORTED_ABUSE:"Cancel my problem report",SUBMIT_BY:"Submitted by",GEO_DISTANCE_SEARCH:"Search distance",GEO_DISTANCE_OPTION:"{{value}} km",BTN_PUBLISH:"Publish",BTN_PICTURE_DELETE:"Delete",BTN_PICTURE_FAVORISE:"Default",BTN_PICTURE_ROTATE:"Rotate",BTN_ADD_PICTURE:"Add picture",NOTIFICATION:{TITLE:"New notification | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"You have {{count}} unread notification{{count>0?'s':''}}"},NOTIFICATIONS:{TITLE:"Notifications",MARK_ALL_AS_READ:"Mark all as read",NO_RESULT:"No notification",SHOW_ALL:"Show all",LOAD_NOTIFICATIONS_FAILED:"Could not load notifications"},REPORT_ABUSE:{TITLE:"Report a problem",SUB_TITLE:"Please explain briefly the problem:",REASON_HELP:"I explain the problem...",ASK_DELETE:"Request removal?",CONFIRM:{SENT:"Request sent. Thank you!"}}},MENU:{REGISTRY:"Pages",USER_PROFILE:"My Profile",MESSAGES:"Messages",NOTIFICATIONS:"Notifications",INVITATIONS:"Invitations"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Account for an organization",ORGANIZATION_ACCOUNT_HELP:"If you represent a company, association, etc.<br/>No universal dividend will be created by this account."},EVENT:{MEMBER_WITHOUT_PROFILE:'To obtain your certification more quickly, fill in <a ui-sref="app.user_edit_profile">your user profile</a>. Members will more easily put their trust in a verifiable identity.'},ERROR:{WS_CONNECTION_FAILED:"Cesium can not receive notifications because of a technical error (connection to the Cesium + data node).<br/><br/>If the problem persists, please <b>choose another data node</b> in Cesium+ settings."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Suggest identities to certify...",BTN_ASK_CERTIFICATIONS_DOTS:"Ask members to certify me...",BTN_ASK_CERTIFICATION:"Ask a certification",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Suggest certifications",HELP:"Select your suggestions"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Ask certifications",HELP:"Select recipients"},SEARCH:{DIVIDER_PROFILE:"Profile",DIVIDER_PAGE:"Pages",DIVIDER_GROUP:"Groups"},VIEW:{SENIORITY:"Seniority on {{'COMMON.APP_NAME'|translate}}",STARS:"Trust level",STAR_HIT_COUNT:"{{total}} rate{{total>1 ? 's' : ''}}",BTN_STAR_HELP:"Rate this profile",BTN_STARS_REMOVE:"Remove my note",BTN_REDO_STAR_HELP:"Update your rate for this profile",BTN_FOLLOW:"Follow the activity of this profile",BTN_STOP_FOLLOW:"Stop following this profile"}},COMMENTS:{DIVIDER:"Comments",SHOW_MORE_COMMENTS:"Show previous comments",COMMENT_HELP:"Your comment, question...",COMMENT_HELP_REPLY_TO:"Your answer...",BTN_SEND:"Send",POPOVER_SHARE_TITLE:"Message #{{number}}",REPLY:"Reply",REPLY_TO:"Respond to:",REPLY_TO_LINK:"In response to ",REPLY_TO_DELETED_COMMENT:"In response to a deleted comment",REPLY_COUNT:"{{replyCount}} responses",DELETED_COMMENT:"Comment deleted",MODIFIED_ON:"modified on {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modified then)",ERROR:{FAILED_SAVE_COMMENT:"Saving comment failed",FAILED_REMOVE_COMMENT:"Deleting comment failed"}},MESSAGE:{REPLY_TITLE_PREFIX:"Re: ",FORWARD_TITLE_PREFIX:"Fw: ",BTN_REPLY:"Reply",BTN_COMPOSE:"New message",BTN_WRITE:"Write",NO_MESSAGE_INBOX:"No message received",NO_MESSAGE_OUTBOX:"No message sent",NOTIFICATIONS:{TITLE:"Messages",MESSAGE_RECEIVED:"You <b>received a message</b><br/>from"},LIST:{INBOX:"Inbox",OUTBOX:"Outbox",LAST_INBOX:"New messages",LAST_OUTBOX:"Sent messages",BTN_LAST_MESSAGES:"Recent messages",TITLE:"Private messages",SEARCH_HELP:"Search in messages",POPOVER_ACTIONS:{TITLE:"Options",DELETE_ALL:"Delete all messages"}},COMPOSE:{TITLE:"New message",TITLE_REPLY:"Reply",SUB_TITLE:"New message",TO:"To",OBJECT:"Object",OBJECT_HELP:"Object",ENCRYPTED_HELP:"Please note this message will be encrypted before sending so that only the recipient can read it and be sure you are the author.",MESSAGE:"Message",MESSAGE_HELP:"Message content",CONTENT_CONFIRMATION:"No message content.<br/><br/>Are your sure you want to send this message?"},VIEW:{TITLE:"Message",SENDER:"Sent by",RECIPIENT:"Sent to",NO_CONTENT:"Empty message",DELETE:"Delete the message"},CONFIRM:{REMOVE:"Are you sure you want to <b>delete this message</b>?<br/><br/> This operation is irreversible.",REMOVE_ALL:"Are you sure you want to <b>delete all messages</b>?<br/><br/> This operation is irreversible.",MARK_ALL_AS_READ:"Are you sure you want to <b>mark all message as read</b>?",USER_HAS_NO_PROFILE:"This identity has no Cesium + profile. It may not use the Cesium + extension, so it <b>will not read your message</b>.<br/><br/>Are you sure you want <b>to continue</b>?"},INFO:{MESSAGE_REMOVED:"Message successfully deleted",All_MESSAGE_REMOVED:"Messages successfully deleted",MESSAGE_SENT:"Message sent"},ERROR:{SEND_MSG_FAILED:"Error while sending message.",LOAD_MESSAGES_FAILED:"Error while loading messages.",LOAD_MESSAGE_FAILED:"Error while loading message.",MESSAGE_NOT_READABLE:"Unable to read message.",USER_NOT_RECIPIENT:"You are not the recipient of this message: unable to read it.",NOT_AUTHENTICATED_MESSAGE:"The authenticity of the message is not certain or its content is corrupted.",REMOVE_MESSAGE_FAILED:"Error while deleting message",MESSAGE_CONTENT_TOO_LONG:"Value too long ({{maxLength}} characters max).",MARK_AS_READ_FAILED:"Unable to mark the message as 'read'.",LOAD_NOTIFICATIONS_FAILED:"Error while loading messages notifications.",REMOVE_All_MESSAGES_FAILED:"Error while removing all messages.",MARK_ALL_AS_READ_FAILED:"Error while marking messages as read.",RECIPIENT_IS_MANDATORY:"Recipient is mandatory."}},REGISTRY:{CATEGORY:"Main activity",GENERAL_DIVIDER:"Basic information",LOCATION_DIVIDER:"Address",SOCIAL_NETWORKS_DIVIDER:"Social networks, web sites",TECHNICAL_DIVIDER:"Technical data",BTN_SHOW_WOT:"People",BTN_SHOW_WOT_HELP:"Search for people",BTN_SHOW_PAGES:"Pages",BTN_SHOW_PAGES_HELP:"Search for pages",BTN_NEW:"New page",MY_PAGES:"My pages",NO_PAGE:"No page",SEARCH:{TITLE:"Pages",SEARCH_HELP:"What, Who: hairdresser, Lili's restaurant, ...",BTN_ADD:"New",BTN_LAST_RECORDS:"Recent pages",BTN_ADVANCED_SEARCH:"Advanced search",BTN_OPTIONS:"Advanced search",TYPE:"Kind of organization",LOCATION_HELP:"Where: City, Country",RESULTS:"Results",RESULT_COUNT_LOCATION:"{{count}} result{{count>0?'s':''}}, near {{location}}",RESULT_COUNT:"{{count}} result{{count>0?'s':''}}",LAST_RECORDS:"Recent pages",LAST_RECORD_COUNT_LOCATION:"{{count}} recent page{{count>0?'s':''}}, near {{location}}",LAST_RECORD_COUNT:"{{count}} recent page{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Advanced options?"}},VIEW:{TITLE:"Registry",CATEGORY:"Main activity:",LOCATION:"Address:",MENU_TITLE:"Options",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Are you sure you want to delete this reference?<br/><br/>This is irreversible."},TYPE:{TITLE:"New page",SELECT_TYPE:"Kind of organization:",ENUM:{SHOP:"Local shops",COMPANY:"Company",ASSOCIATION:"Association",INSTITUTION:"Institution"}},EDIT:{TITLE:"Edit",TITLE_NEW:"New page",RECORD_TYPE:"Kind of organization",RECORD_TITLE:"Name",RECORD_TITLE_HELP:"Name",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Describe activity",RECORD_ADDRESS:"Street",RECORD_ADDRESS_HELP:"Street, building...",RECORD_CITY:"City",RECORD_CITY_HELP:"City, Country",RECORD_SOCIAL_NETWORKS:"Social networks and web site",RECORD_PUBKEY:"Public key",RECORD_PUBKEY_HELP:"Public key to receive payments"},WALLET:{REGISTRY_DIVIDER:"Pages",REGISTRY_HELP:"Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions."},ERROR:{LOAD_CATEGORY_FAILED:"Loading main activities failed",LOAD_RECORD_FAILED:"Loading failed",LOOKUP_RECORDS_FAILED:"Error while loading records.",REMOVE_RECORD_FAILED:"Deleting failed",SAVE_RECORD_FAILED:"Saving failed",RECORD_NOT_EXISTS:"Record not found",GEO_LOCATION_NOT_FOUND:"City or zip code not found"},INFO:{RECORD_REMOVED:"Page successfully deleted",RECORD_SAVED:"Page successfully saved"}},PROFILE:{PROFILE_DIVIDER:"ğchange profile",PROFILE_DIVIDER_HELP:"It is related data, stored in the ğchange network.",NO_PROFILE_DEFINED:"No ğchange profile",BTN_ADD:"Create my profile",BTN_EDIT:"Edit my profile",BTN_DELETE:"Delete my profile",BTN_REORDER:"Reorder",UID:"Pseudonym",TITLE:"Lastname, FirstName",TITLE_HELP:"Name",DESCRIPTION:"About me",DESCRIPTION_HELP:"About me...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"General data",SOCIAL_NETWORKS_DIVIDER:"Social networks and web site",STAR:"Trust level",TECHNICAL_DIVIDER:"Technical data",MODAL_AVATAR:{TITLE:"Avatar",SELECT_FILE_HELP:"<b>Choose an image file</b>, by clicking on the button below:",BTN_SELECT_FILE:"Choose an image",RESIZE_HELP:"<b>Re-crop the image</b> if necessary. A click on the image allows to move it. Click on the area at the bottom left to zoom in.",RESULT_HELP:"<b>Here is the result</b> as seen on your profile:"},CONFIRM:{DELETE:"Are you sure you want to <b>delete your Cesium+ profile ?</b><br/><br/>This operation is irreversible."},ERROR:{REMOVE_PROFILE_FAILED:"Deleting profile failed",LOAD_PROFILE_FAILED:"Could not load user profile.",SAVE_PROFILE_FAILED:"Saving profile failed",INVALID_SOCIAL_NETWORK_FORMAT:"Invalid format: please fill a valid Internet address.<br/><br/>Examples :<ul><li>- A Facebook page (https://www.facebook.com/user)</li><li>- A web page (http://www.domain.com)</li><li>- An email address (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Error while resizing picture"},INFO:{PROFILE_REMOVED:"Profile deleted",PROFILE_SAVED:"Profile saved"},HELP:{WARNING_PUBLIC_DATA:"Please note that the information published here <b>is public</b>: visible including by <b>not logged in people</b>."}},LOCATION:{BTN_GEOLOC_ADDRESS:"Find my address on the map",USE_GEO_POINT:"Verify address (recommended)?",LOADING_LOCATION:"Searching address...",LOCATION_DIVIDER:"Localisation",ADDRESS:"Address",ADDRESS_HELP:"Address (optional)",CITY:"City",CITY_HELP:"City, Country",DISTANCE:"Maximum distance around the city",DISTANCE_UNIT:"mi",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"City, Country",PROFILE_POSITION:"Profile position",MODAL:{TITLE:"Search address",SEARCH_HELP:"City, Country",ALTERNATIVE_RESULT_DIVIDER:"Alternative results for <b>{{address}}</b>:",POSITION:"lat/lon : {{lat}} / {{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Required if a street has been filled",REQUIRED_FOR_LOCATION:"Required field to appear on the map",INVALID_FOR_LOCATION:"Unknown address",GEO_LOCATION_FAILED:"Unable to retrieve your current position. Please use the search button.",ADDRESS_LOCATION_FAILED:"Unable to retrieve the address position"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Online services",SUBSCRIPTION_DIVIDER_HELP:"Online services offer optional additional services, delegated to a third party.",BTN_ADD:"Add a service",BTN_EDIT:"Manage my services",NO_SUBSCRIPTION:"No service defined",SUBSCRIPTION_COUNT:"Services / Subscription",EDIT:{TITLE:"Online services",HELP_TEXT:"Manage your subscriptions and other online services here",PROVIDER:"Provider:"},TYPE:{ENUM:{EMAIL:"Receive email notifications"}},CONFIRM:{DELETE_SUBSCRIPTION:"Are you sur you want to <b>delete this subscription</b>?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Error while loading online services",ADD_SUBSCRIPTION_FAILED:"Error while adding subscription",UPDATE_SUBSCRIPTION_FAILED:"Error during subscription update",DELETE_SUBSCRIPTION_FAILED:"Error while deleting subscription"},MODAL_EMAIL:{TITLE:"Notification by email",HELP:"Fill out this form to <b>be notified by email</ b> of your account's events. <br/>Your email address will be encrypted only to be visible to the service provider.",EMAIL_LABEL:"Your email:",EMAIL_HELP:"john@domain.com",FREQUENCY_LABEL:"Frequency of notifications:",FREQUENCY_DAILY:"Daily",FREQUENCY_WEEKLY:"Weekly",PROVIDER:"Service Provider:"}},DOCUMENT:{HASH:"Hash: ",LOOKUP:{TITLE:"Document search",BTN_ACTIONS:"Actions",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS_DOTS:"Last documents :",LAST_DOCUMENTS:"Last documents",SHOW_QUERY:"Show query",HIDE_QUERY:"Hide query",HEADER_TIME:"Time/Hour",HEADER_ISSUER:"Issuer",HEADER_RECIPIENT:"Recipient",READ:"Read",DOCUMENT_TYPE:"Type",DOCUMENT_TITLE:"Title",BTN_REMOVE:"Delete this document",BTN_COMPACT:"Compact",HAS_REGISTERED:"create or edit his profile",POPOVER_ACTIONS:{TITLE:"Actions",REMOVE_ALL:"Delete these documents..."},TYPE:{USER_PROFILE:"Profile",MARKET_RECORD:"Ad",MARKET_COMMENT:"Comment on a ad",PAGE_RECORD:"Page",PAGE_COMMENT:"Comment on a page",GROUP_RECORD:"Group",GROUP_COMMENT:"Comment on a group"}},INFO:{REMOVED:"Deleted document"},CONFIRM:{REMOVE:"Are you sure you want to <b>delete this document</b>?",REMOVE_ALL:"Are you sure you want to <b>delete these documents</b>?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Error searching documents",REMOVE_FAILED:"Error deleting the document",REMOVE_ALL_FAILED:"Error deleting documents"}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"User profiles, notifications, private messages",ENABLE_TOGGLE:"Enable extension?",ENABLE_MESSAGE_TOGGLE:"Enable messages?",ENABLE_SETTINGS_TOGGLE:"Enable remote storage for settings?",PEER:"Data peer address",POPUP_PEER:{TITLE:"Data peer",HELP:"Set the address of the peer to use:",PEER_HELP:"server.domain.com:port"},NOTIFICATIONS:{DIVIDER:"Notifications",HELP_TEXT:"Enable the types of notifications you want to receive:",ENABLE_TX_SENT:"Notify the validation of <b>sent payments</b>?",ENABLE_TX_RECEIVED:"Notify the validation of <b>received payments</b>?",ENABLE_CERT_SENT:"Notify the validation of <b>sent certifications</b>?",ENABLE_CERT_RECEIVED:"Notify the validation of <b>received certifications</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"New features",ASK_ENABLE:'Some new features are available: <ul><li> <b><i class="icon ion-person"></i> user profiles</b>;<li> <b><i class="icon ion-android-notifications"></i> Notifications</b>;<li> <b><i class="icon ion-email"></i> Private messages</b>.</ul><br/>They have been <b>disabled</b> in your settings.<br/><br/><b>Do you want to enable</b> these features?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"A recipient is required for encryption."}},ES_PEER:{NAME:"Name",DOCUMENTS:"Documents",SOFTWARE:"Software",DOCUMENT_COUNT:"Number of documents",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} subscribers to email notification"},EVENT:{NODE_STARTED:"Your node ES API <b>{{params[0]}}</b> is UP",NODE_BMA_DOWN:"Node <b>{{params[0]}}:{{params[1]}}</b> (used by your ES API) is <b>unreachable</b>.",NODE_BMA_UP:"Node <b>{{params[0]}}:{{params[1]}}</b> is reachable again.",MEMBER_JOIN:"You are now a <b>member</b> of currency <b>{{params[0]}}</b>!",MEMBER_LEAVE:"You are <b>not a member anymore</b> of currency <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"You are <b>not more member</b> of the currency <b>{{params[0]}}</b>, for lack of renewal or lack of certifications.",MEMBER_REVOKE:"Your account has been revoked. It will no longer be a member of the currency <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Your membership to <b>{{params[0]}}</b> has been <b>renewed successfully</b>.",TX_SENT:'Your payment to <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> was executed.',TX_SENT_MULTI:"Your payment to <b>{{params[1]}}</b> was executed.",TX_RECEIVED:'You received a payment from <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',TX_RECEIVED_MULTI:"You received a payment from <b>{{params[1]}}</b>.",CERT_SENT:'Your <b>certification</b> to <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> was executed.',CERT_RECEIVED:'You have <b>received a certification</b> from <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> like your profile',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> follows your activity',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> rated you ({{params[3]}} <i class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> asks you for a moderation on the profile: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> reported a profile to be deleted: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has requested moderation on your profile'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his comment on your referencing: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has replied to your comment on the referencing: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on the page: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his comment on the page: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> added a page: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> updated the page: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> asks you for a moderation on the page: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> reported a page to be deleted: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>'}},CONFIRM:{ES_USE_FALLBACK_NODE:"Data node <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> data node?"},ERROR:{ES_CONNECTION_ERROR:'Data node <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change data node in <a class="positive" ng-click="doQuickFix(\'settings\')">advanced settings</a>.',ES_MAX_UPLOAD_BODY_SIZE:"The volume of data to be sent exceeds the limit set by the server.<br/><br/>Please try again after, for example, deleting photos."}}),e.translations("eo-EO",{COMMON:{CATEGORY:"Kategorio",CATEGORY_SELECT_HELP:"Elekti",CATEGORIES:"Kategorioj",CATEGORY_SEARCH_HELP:"Serĉado",COMMENT_HELP:"Komento",LAST_MODIFICATION_DATE:"Ĝisdatigita la",BTN_LIKE:"Mi ŝatas",BTN_FOLLOW:"Sekvi",BTN_STOP_FOLLOW:"Ne plu sekvi",LIKES_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} ŝatis tiun ĉi paĝon",DISLIKES_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} ne ŝatis tiun ĉi paĝon",VIEWS_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} konsultis tiun ĉi paĝon",FOLLOWS_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} sekvas tiun ĉi paĝon",ABUSES_TEXT:"{{total}} persono{{total > 1 ? 'j' : ''}} atentigis pri problemo",BTN_REPORT_ABUSE_DOTS:"Atentigi pri problemo aŭ misuzo...",BTN_REMOVE_REPORTED_ABUSE:"Nuligi mian atentigon",SUBMIT_BY:"Submetita de",GEO_DISTANCE_SEARCH:"Distanco por serĉado",GEO_DISTANCE_OPTION:"{{value}} km",BTN_PUBLISH:"Publikigi",BTN_PICTURE_DELETE:"Forigi",BTN_PICTURE_FAVORISE:"Precipa",BTN_PICTURE_ROTATE:"Turni",BTN_ADD_PICTURE:"Aldoni foton",NOTIFICATION:{TITLE:"Nova avizo | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"Vi havas {{count}} avizo{{count>0?'j':''}}n ne legita{{count>0?'j':''}}n"},NOTIFICATIONS:{TITLE:"Avizoj",MARK_ALL_AS_READ:"Ĉion marki legita",NO_RESULT:"Neniu avizo",SHOW_ALL:"Vidi ĉion",LOAD_NOTIFICATIONS_FAILED:"Malsukceso por ŝarĝi la avizojn"},REPORT_ABUSE:{TITLE:"Atentigi pri problemo",SUB_TITLE:"Bonvolu klarigi rapide la problemon:",REASON_HELP:"Mi klarigas la problemon...",ASK_DELETE:"Peti la forigon?",CONFIRM:{SENT:"Atentigo sendita. Dankon!"}}},MENU:{REGISTRY:"Paĝoj",USER_PROFILE:"Mia profilo",MESSAGES:"Mesaĝoj",NOTIFICATIONS:"Avizoj",INVITATIONS:"Invitoj"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Konto por organizaĵo",ORGANIZATION_ACCOUNT_HELP:"Se vi reprezentas entreprenon, asocion, ktp.<br/>Neniu universala dividendo estos kreita per tiu ĉi konto."},EVENT:{MEMBER_WITHOUT_PROFILE:'Vi povas <a ui-sref="app.edit_profile">tajpi vian profilon Cesium+</a> (kromebleco) por disponi pli bonan videblecon por via konto. Tiu profilo estos stokata en <b>sendependa kontaro</b> de la mono, sed malcentralizita.'},ERROR:{WS_CONNECTION_FAILED:"ğchange ne povas ricevi la avizojn pro teknika eraro (konekto al la daten-nodo Cesium+).<br/><br/>Se la problemo daŭradas, bonvolu <b>elekti alian daten-nodon</b> ĉe la parametroj Cesium+."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Sugesti identecojn atestotajn...",BTN_ASK_CERTIFICATIONS_DOTS:"Peti membrojn atesti min...",BTN_ASK_CERTIFICATION:"Peti atestaĵon",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Sugesti atestadojn",HELP:"Selekti viajn sugestojn"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Peti atestaĵojn",HELP:"Selekti la ricevontojn"},SEARCH:{DIVIDER_PROFILE:"Kontoj",DIVIDER_PAGE:"Paĝoj",DIVIDER_GROUP:"Grupoj"},VIEW:{SENIORITY:"Delongeco ĉe {{'COMMON.APP_NAME'|translate}}",STARS:"Fido-nivelo",STAR_HIT_COUNT:"{{total}} noto{{total>1 ? 'j' : ''}}",BTN_STAR_HELP:"Noti tiun ĉi profilon",BTN_STARS_REMOVE:"Forigi mian noton",BTN_REDO_STAR_HELP:"Aktualigi vian noton",BTN_FOLLOW:"Sekvi la agojn de tiu ĉi profilo",BTN_STOP_FOLLOW:"Ne plu sekvi tiun ĉi profilon"}},COMMENTS:{DIVIDER:"Komentoj",SHOW_MORE_COMMENTS:"Afiŝi la antaŭajn komentojn",COMMENT_HELP:"Via komento, demando, ktp.",COMMENT_HELP_REPLY_TO:"Via respondo...",BTN_SEND:"Sendi",POPOVER_SHARE_TITLE:"Mesaĝo #{{number}}",REPLY:"Respondi",REPLY_TO:"Respondo al:",REPLY_TO_LINK:"Responde al ",REPLY_TO_DELETED_COMMENT:"Responde al forigita komento",REPLY_COUNT:"{{replyCount}} respondoj",DELETED_COMMENT:"Komento forigita",MODIFIED_ON:"modifita la {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modifita poste)",ERROR:{FAILED_SAVE_COMMENT:"Eraro dum la konservo de la komento",FAILED_REMOVE_COMMENT:"Eraro dum la forigo de la komento"}},MESSAGE:{REPLY_TITLE_PREFIX:"Resp: ",FORWARD_TITLE_PREFIX:"Tr: ",BTN_REPLY:"Respondi",BTN_COMPOSE:"Nova mesaĝo",BTN_WRITE:"Skribi",NO_MESSAGE_INBOX:"Neniu mesaĝo ricevita",NO_MESSAGE_OUTBOX:"Neniu mesaĝo sendita",NOTIFICATIONS:{TITLE:"Mesaĝoj",MESSAGE_RECEIVED:"Vi <b>ricevis mesaĝon</b><br/>de"},LIST:{INBOX:"Ricevujo",OUTBOX:"Senditaj mesaĝoj",LAST_INBOX:"Novaj mesaĝoj",LAST_OUTBOX:"Senditaj mesaĝoj",BTN_LAST_MESSAGES:"Freŝdataj mesaĝoj",TITLE:"Mesaĝoj",SEARCH_HELP:"Serĉado en la mesaĝoj",POPOVER_ACTIONS:{TITLE:"Kromaĵoj",DELETE_ALL:"Forigi ĉiujn mesaĝojn"}},COMPOSE:{TITLE:"Nova mesaĝo",TITLE_REPLY:"Respondi",SUB_TITLE:"Nova mesaĝo",TO:"Al",OBJECT:"Temo",OBJECT_HELP:"Temo",ENCRYPTED_HELP:"Bonvolu noti, ke tiu ĉi mesaĝo estos ĉifrita antaŭ sendo, tiel ke nur la adresato povos legi ĝin, kaj ke li estos certa, ke vi ja estas ties aŭtoro.",MESSAGE:"Mesaĝo",MESSAGE_HELP:"Enhavo de la mesaĝo",CONTENT_CONFIRMATION:"La enhavo de la mesaĝo estas malplena.<br/><br/>Ĉu vi volas tamen sendi la mesaĝon?"},VIEW:{TITLE:"Mesaĝo",SENDER:"Sendita de",RECIPIENT:"Sendita al",NO_CONTENT:"Mesaĝo malplena",DELETE:"Forigi la mesaĝon"},CONFIRM:{REMOVE:"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi mesaĝon</b>?<br/><br/>Tiu ago estas neinversigebla.",REMOVE_ALL:"Ĉu vi certas, ke vi volas <b>forigi ĉiujn mesaĝojn</b>?<br/><br/>Tiu ago estas neinversigebla.",MARK_ALL_AS_READ:"Ĉu vi certas, ke vi volas <b>marki ĉiujn mesaĝojn legitaj</b>?",USER_HAS_NO_PROFILE:"Tiu identeco havas neniun profilon Cesium+. Eblas ke ĝi ne uzas la krom-programon Cesium+, kaj <b>do ne legos vian mesaĝon</b>.<br/><br/>Ĉu vi certas, ke vi volas tamen <b>daŭrigi</b>?"},INFO:{MESSAGE_REMOVED:"Mesaĝo forigita",All_MESSAGE_REMOVED:"Ĉiuj mesaĝoj estis forigitaj",MESSAGE_SENT:"Mesaĝo sendita"},ERROR:{SEND_MSG_FAILED:"Eraro dum la sendo de la mesaĝo.",LOAD_MESSAGES_FAILED:"Eraro dum la ricevo de la mesaĝoj.",LOAD_MESSAGE_FAILED:"Eraro dum la ricevo de la mesaĝo.",MESSAGE_NOT_READABLE:"Legado de la mesaĝo neebla.",USER_NOT_RECIPIENT:"Vi ne estas la adresato de tiu ĉi mesaĝo: malĉifrado neebla.",NOT_AUTHENTICATED_MESSAGE:"La aŭtenteco de la mesaĝo estas dubinda aŭ ties enhavo estas difektita.",REMOVE_MESSAGE_FAILED:"Malsukceso por forigi la mesaĝon",MESSAGE_CONTENT_TOO_LONG:"Signaro tro longa ({{maxLength}} signoj maksimume).",MARK_AS_READ_FAILED:"Neeblas marki la mesaĝon 'legita'.",LOAD_NOTIFICATIONS_FAILED:"Eraro dum la ricevo de la mesaĝo-avizoj.",REMOVE_All_MESSAGES_FAILED:"Eraro dum la forigo de ĉiuj mesaĝoj.",MARK_ALL_AS_READ_FAILED:"Eraro por marki la mesaĝojn legitaj.",RECIPIENT_IS_MANDATORY:"La adresato estas deviga."}},REGISTRY:{CATEGORY:"Ĉefa agado",GENERAL_DIVIDER:"Ĝeneralaj informoj",LOCATION_DIVIDER:"Adreso",SOCIAL_NETWORKS_DIVIDER:"Sociaj retoj kaj retejo",TECHNICAL_DIVIDER:"Teknikaj informoj",BTN_SHOW_WOT:"Personoj",BTN_SHOW_WOT_HELP:"Traserĉi personojn",BTN_SHOW_PAGES:"Paĝoj",BTN_SHOW_PAGES_HELP:"Traserĉi paĝojn",BTN_NEW:"Krei paĝon",MY_PAGES:"Miaj paĝoj",NO_PAGE:"Neniu paĝo",SEARCH:{TITLE:"Paĝoj",SEARCH_HELP:"Kio, Kiu: restoracio, Ĉe Marcelo, ...",BTN_ADD:"Nova",BTN_LAST_RECORDS:"Freŝdataj paĝoj",BTN_ADVANCED_SEARCH:"Sperta serĉado",BTN_OPTIONS:"Sperta serĉado",TYPE:"Tipo de paĝo",LOCATION_HELP:"Kie: Poŝto-kodo, Urbo",RESULTS:"Rezultoj",RESULT_COUNT_LOCATION:"{{count}} rezulto{{count>0?'j':''}}, proksime de {{location}}",RESULT_COUNT:"{{count}} rezulto{{count>0?'j':''}}",LAST_RECORDS:"Freŝdataj paĝoj",LAST_RECORD_COUNT_LOCATION:"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}, proksime de {{location}}",LAST_RECORD_COUNT:"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Spertaj kromaĵoj?"}},VIEW:{TITLE:"Adresaro",CATEGORY:"Ĉefa agado:",LOCATION:"Adreso:",MENU_TITLE:"Kromaĵoj",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Ĉu vi certas, ke vi volas forigi tiun ĉi paĝon?<br/><br/>Tiu ago estas neinversigebla."},TYPE:{TITLE:"Tipoj",SELECT_TYPE:"Tipo de paĝo:",ENUM:{SHOP:"Loka komerco",COMPANY:"Entrepreno",ASSOCIATION:"Asocio",INSTITUTION:"Institucio"}},EDIT:{TITLE:"Redaktado",TITLE_NEW:"Nova paĝo",RECORD_TYPE:"Tipo de paĝo",RECORD_TITLE:"Nomo",RECORD_TITLE_HELP:"Nomo",RECORD_DESCRIPTION:"Priskribo",RECORD_DESCRIPTION_HELP:"Priskribo de la agado",RECORD_ADDRESS:"Strato",RECORD_ADDRESS_HELP:"Strato, konstruaĵo...",RECORD_CITY:"Urbo",RECORD_CITY_HELP:"Urbo",RECORD_SOCIAL_NETWORKS:"Sociaj retoj kaj retejo",RECORD_PUBKEY:"Publika ŝlosilo",RECORD_PUBKEY_HELP:"Publika ŝlosilo por ricevi la pagojn"},WALLET:{REGISTRY_DIVIDER:"Paĝoj",REGISTRY_HELP:"La paĝoj referencigas agadojn akceptantajn la monon aŭ favorigantajn ĝin: komercoj, entreprenoj, asocioj, institucioj."},ERROR:{LOAD_CATEGORY_FAILED:"Eraro dum la ŝarĝo de la listo de la agadoj",LOAD_RECORD_FAILED:"Eraro dum la ŝarĝo de la paĝo",LOOKUP_RECORDS_FAILED:"Eraro dum la serĉado",REMOVE_RECORD_FAILED:"Eraro dum la forigo de la paĝo",SAVE_RECORD_FAILED:"Eraro dum la konservado",RECORD_NOT_EXISTS:"Paĝo neekzistanta",GEO_LOCATION_NOT_FOUND:"Urbo aŭ poŝto-kodo ne trovita"},INFO:{RECORD_REMOVED:"Paĝo forigita",RECORD_SAVED:"Paĝo konservita"}},PROFILE:{PROFILE_DIVIDER:"Profilo ğchange",PROFILE_DIVIDER_HELP:"Temas pri kromaj datenoj, stokitaj ĉe la reto ğchange.",NO_PROFILE_DEFINED:"Neniu profilo tajpita",BTN_ADD:"Tajpi mian profilon",BTN_EDIT:"Redakti mian profilon",BTN_DELETE:"Forigi mian profilon",BTN_REORDER:"Reordigi",UID:"Pseŭdonimo",TITLE:"Familia nomo, Persona nomo",TITLE_HELP:"Familia nomo, Persona nomo",DESCRIPTION:"Pri mi",DESCRIPTION_HELP:"Pri mi...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Ĝeneralaj informoj",SOCIAL_NETWORKS_DIVIDER:"Sociaj retoj, retejoj",STAR:"Fido-nivelo",TECHNICAL_DIVIDER:"Teknikaj informoj",MODAL_AVATAR:{TITLE:"Profil-foto",SELECT_FILE_HELP:"Bonvolu <b>elekti bildo-dosieron</b>, alklakante la ĉi-suban butonon:",BTN_SELECT_FILE:"Elekti foton",RESIZE_HELP:"<b>Rekadri la bildon</b>, laŭbezone. Pluigi klakon sur la bildo ebligas movi ĝin. Alklaku la zonon malsupre maldekstre por zomi.",RESULT_HELP:"<b>Jen la rezulto</b> tiel videbla ĉe via profilo:"},CONFIRM:{DELETE:"Ĉu vi certas, ke vi volas <b>forigi vian profilon ğchange?</b><br/><br/>Tiu ago estas neinversigebla."},ERROR:{REMOVE_PROFILE_FAILED:"Malsukceso por forigi la profilon",LOAD_PROFILE_FAILED:"Malsukceso por ŝarĝi la profilon de la uzanto",SAVE_PROFILE_FAILED:"Eraro dum la konservado",INVALID_SOCIAL_NETWORK_FORMAT:"Strukturo ne rekonata: bonvolu tajpi validan adreson.<br/><br/>Ezemploj:<ul><li>- Facebook-paĝo (https://www.facebook.com/uzanto)</li><li>- Retpaĝo (http://www.miaretejo.net)</li><li>- Retadreso (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Eraro dum la reformatigo de la bildo"},INFO:{PROFILE_REMOVED:"Profilo forigita",PROFILE_SAVED:"Profilo konservita"},HELP:{WARNING_PUBLIC_DATA:"La informoj afiŝitaj en via profilo <b>estas publikaj</b>: videblaj inkluzive de la personoj <b>ne konektitaj</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"}},LOCATION:{BTN_GEOLOC_ADDRESS:"Trovi mian adreson surmape",USE_GEO_POINT:"Kontroli la adreson (konsilinda)?",LOADING_LOCATION:"Serĉado de la adreso...",LOCATION_DIVIDER:"Adreso",ADDRESS:"Strato",ADDRESS_HELP:"Strato, adres-aldonaĵo...",CITY:"Urbo",CITY_HELP:"Poŝto-kodo, Urbo, Lando",DISTANCE:"Maksimuma distanco ĉirkaŭ la urbo",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Poŝto-kodo, Urbo",PROFILE_POSITION:"Loko de la profilo",MODAL:{TITLE:"Serĉado de la adreso",SEARCH_HELP:"Urbo, Poŝto-kodo, Lando",ALTERNATIVE_RESULT_DIVIDER:"Alternativaj rezultoj por <b>{{address}}</b>:",POSITION:"Lat/Lon: {{lat}}/{{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Deviga kampo (ĉar strato estas tajpita)",REQUIRED_FOR_LOCATION:"Deviga kampo por aperi sur la mapo",INVALID_FOR_LOCATION:"Adreso nekonata",GEO_LOCATION_FAILED:"Neeblas ricevi vian lokiĝon. Bonvolu uzi la serĉo-butonon.",ADDRESS_LOCATION_FAILED:"Neeblas ricevi la lokon per la adreso"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Retaj servoj",SUBSCRIPTION_DIVIDER_HELP:"La retaj servoj proponas pliajn nedevigajn servojn, delegitajn al aliulo.",BTN_ADD:"Aldoni servon",BTN_EDIT:"Mastrumi miajn servojn",NO_SUBSCRIPTION:"Neniu servo uzata",SUBSCRIPTION_COUNT:"Servoj / Abonoj",EDIT:{TITLE:"Retaj servoj",HELP_TEXT:"Mastrumu ĉi tie viajn abonojn kaj aliajn retajn servojn",PROVIDER:"Provizanto:"},TYPE:{ENUM:{EMAIL:"Ricevi la avizojn per retmesaĝo"}},CONFIRM:{DELETE_SUBSCRIPTION:"Ĉu vi certas, ke vi volas <b>forigi tiun abonon</b>?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Eraro dum la ŝarĝo de la retaj servoj",ADD_SUBSCRIPTION_FAILED:"Malsukceso por sendi la abonon",UPDATE_SUBSCRIPTION_FAILED:"Malsukceso por ĝisdatigi la abonon",DELETE_SUBSCRIPTION_FAILED:"Eraro dum la forigo de la abono"},MODAL_EMAIL:{TITLE:"Avizo per retmesaĝo",HELP:"Plenigu tiun ĉi formularon por <b>esti avizita per retmesaĝo</b> pri la okazaĵoj ĉe via konto.<br/>Via retadreso estos ĉifrita por esti videbla nur de la servo-provizanto.",EMAIL_LABEL:"Via retadreso:",EMAIL_HELP:"johano.stelaro@esperanto.org",FREQUENCY_LABEL:"Periodo de la avizoj:",FREQUENCY_DAILY:"Ĉiutaga",FREQUENCY_WEEKLY:"Ĉiusemajna",PROVIDER:"Servo-provizanto:"}},DOCUMENT:{HASH:"Haketo: ",LOOKUP:{TITLE:"Serĉado de dokumentoj",BTN_ACTIONS:"Agoj",SEARCH_HELP:"Sendanto:AAA*, tempo:1508406169",LAST_DOCUMENTS_DOTS:"Lastaj dokumentoj:",LAST_DOCUMENTS:"Lastaj dokumentoj",SHOW_QUERY:"Vidi la informpeton",HIDE_QUERY:"Kaŝi la informpeton",HEADER_TIME:"Dato/Horo",HEADER_ISSUER:"Sendanto",HEADER_RECIPIENT:"Ricevonto",READ:"Legita",DOCUMENT_TYPE:"Tipo",DOCUMENT_TITLE:"Titolo",BTN_REMOVE:"Forigi tiun ĉi dokumenton",BTN_COMPACT:"Densigi",HAS_REGISTERED:"kreis aŭ modifis sian profilon",POPOVER_ACTIONS:{TITLE:"Agoj",REMOVE_ALL:"Forigi tiujn ĉi dokumentojn..."},TYPE:{USER_PROFILE:"Profilo",MARKET_RECORD:"Anonco",MARKET_COMMENT:"Komento ĉe anonco",PAGE_RECORD:"Paĝo",PAGE_COMMENT:"Komento ĉe paĝo",GROUP_RECORD:"Grupo",GROUP_COMMENT:"Komento ĉe grupo"}},INFO:{REMOVED:"Dokumento forigita"},CONFIRM:{REMOVE:"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi dokumenton</b>?",REMOVE_ALL:"Ĉu vi certas, ke vi volas <b>forigi tiujn ĉi dokumentojn</b>?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Eraro dum la serĉado de dokumentoj",REMOVE_FAILED:"Eraro dum la forigo de la dokumento",REMOVE_ALL_FAILED:"Eraro dum la forigo de la dokumentoj"}},ES_SETTINGS:{PLUGIN_NAME:"Spertaj parametroj",PLUGIN_NAME_HELP:"Filtrado de avizoj, ktp.",ENABLE_TOGGLE:"Aktivigi la krom-programon?",ENABLE_MESSAGE_TOGGLE:"Aktivigi la privatajn mesaĝojn?",ENABLE_SETTINGS_TOGGLE:"Aktivigi la foran stokadon de la parametroj?",PEER:"Adreso de la daten-nodo",POPUP_PEER:{TITLE:"Daten-nodo",HELP:"Tajpu la adreson de la nodo, kiun vi volas uzi:",PEER_HELP:"servo.domajno.com:port"},NOTIFICATIONS:{DIVIDER:"Avizoj",HELP_TEXT:"Aktivigu la avizo-tipojn, kiujn vi deziras ricevi:",ENABLE_TX_SENT:"Avizi pri la <b>senditaj pagoj</b>?",ENABLE_TX_RECEIVED:"Avizi pri la <b>ricevitaj pagoj</b>?",ENABLE_CERT_SENT:"Avizi pri la <b>senditaj atestaĵoj</b>?",ENABLE_CERT_RECEIVED:"Avizi pri <b>la ricevitaj atestaĵoj</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"Kromaj funkcioj",ASK_ENABLE:'La krom-programo Cesium+ estas <b>malaktivigita</b> ĉe viaj parametroj, kio senaktivigas la funkciojn: <ul><li> <b><i class="icon ion-person"></i> Profiloj Cesium+</b>;<li> <b><i class="icon ion-android-notifications"></i> Avizoj</b>;<li> <b><i class="icon ion-email"></i> Privataj mesaĝoj</b>.<li> <b><i class="icon ion-location"></i> Mapoj, ktp.</b>.</ul><br/><b>Ĉu vi deziras reaktivigi</b> la krom-programon?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Adresito estas deviga por la ĉifrado."}},ES_PEER:{NAME:"Nomo",DOCUMENTS:"Dokumentoj",SOFTWARE:"Programo",DOCUMENT_COUNT:"Nombro de dokumentoj",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} abonantoj pri avizoj per retmesaĝoj"},EVENT:{NODE_STARTED:"Via nodo ES API <b>{{params[0]}}</b> ekis",NODE_BMA_DOWN:"La nodo <b>{{params[0]}}:{{params[1]}}</b> (uzata de via nodo ES API) estas <b>neatingebla</b>.",NODE_BMA_UP:"La nodo <b>{{params[0]}}:{{params[1]}}</b> estas denove alirebla.",MEMBER_JOIN:"Vi estas nun <b>membro</b> de la mono <b>{{params[0]}}</b>!",MEMBER_LEAVE:"Vi <b>ne plu estas membro</b> de la mono <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"Vi <b>ne plu estas membro</b> de la mono <b>{{params[0]}}</b>, pro ne revalidiĝo aŭ pro manko da atestaĵoj.",MEMBER_REVOKE:"La nuligo de via konto efektiviĝis. Ĝi ne plu povos esti membro-konto de la mono <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"La revalidiĝo de via aliĝo al la mono <b>{{params[0]}}</b> estis <b>ricevita</b>.",TX_SENT:"Via <b>pago</b> al <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> efektiviĝis.",TX_SENT_MULTI:"Via <b>pago</b> al <b>{{params[1]}}</b> efektiviĝis.",TX_RECEIVED:"Vi <b>ricevis pagon</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span>.",TX_RECEIVED_MULTI:"Vi <b>ricevis pagon</b> de <b>{{params[1]}}</b>.",CERT_SENT:"Via <b>atestado</b> al <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> efektiviĝis.",CERT_RECEIVED:"Vi <b>ricevis atestaĵon</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span>.",USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> ŝatas vian profilon',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> sekvas viajn agojn',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> notis vin ({{params[3]}} <b class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> petas de vi moderigon pri la profilo: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> atentigis pri profilo foriginda: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> atentigis pri via profilo'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> komentis vian paĝon: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis sian komenton ĉe via paĝo: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> respondis al via komento ĉe la paĝo: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis sian respondon al via komento ĉe la paĝo: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> komentis la paĝon: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis sian komenton ĉe la paĝo: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> aldonis la paĝon: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis la paĝon: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> petas de vi moderigon pri la paĝo: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> atentigis pri paĝo foriginda: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> atentigis pri via paĝo: <b>{{params[2]}}</b>'}},CONFIRM:{ES_USE_FALLBACK_NODE:"Daten-nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la daten-nodon <b>{{new}}</b> ?"},ERROR:{ES_CONNECTION_ERROR:'Daten-nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Kontrolu vian retkonekton, aŭ ŝanĝu la daten-nodon en la <a class="positive" ng-click="doQuickFix(\'settings\')">spertaj parametroj</a>.',ES_MAX_UPLOAD_BODY_SIZE:"La kvanto de datenoj sendotaj superas la limon fiksitan de la servilo.<br/>Bonvolu reprovi post, ekzemple, forigo de fotoj."}}),e.translations("es-ES",{COMMON:{ABUSES_TEXT:"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page",BTN_FOLLOW:"Seguir",BTN_LIKE:"Me gusta",BTN_REMOVE_REPORTED_ABUSE:"Cancelar mi reporte o problema",BTN_REPORT_ABUSE_DOTS:"Reportar un problema o abuso...",BTN_STOP_FOLLOW:"Dejar de seguir",COMMENT_HELP:"Comentarios",DISLIKES_TEXT:"A {{total}} {{total > 1 ? 'personas no les' : 'persona no le'}} gusta esta página",LIKES_TEXT:"A {{total}} {{total > 1 ? 'personas les' : 'persona le'}} gusta esta página",FOLLOWS_TEXT:"{{total}} {{total > 1 ? 'personas siguen' : 'persona sigue'}} esta página",VIEWS_TEXT:"{{total}} 'personas vieron' : 'persona vió'}} esta página",GEO_DISTANCE_OPTION:"{{value}} km",GEO_DISTANCE_SEARCH:"Buscar por proximidad",NOTIFICATION:{HAS_UNREAD:"Tiene {{count}} notificaci{{count>0?'ón':'ones'}} no leída{{count>0?'s':''}}",TITLE:"Nueva notificación | {{'COMMON.APP_NAME'|translate}}"},REPORT_ABUSE:{ASK_DELETE:"¿Solicitar eliminación?",CONFIRM:{SENT:"Solicitud enviada. ¡Gracias!"},REASON_HELP:"Yo explico el problema...",SUB_TITLE:"Por favor explique brevemente el problema:",TITLE:"Reportar un problema"},CATEGORY:"Categoría",CATEGORIES:"Categorías",CATEGORY_SEARCH_HELP:"Búsqueda",CATEGORY_SELECT_HELP:"Seleccionar",LAST_MODIFICATION_DATE:"Actualización el",SUBMIT_BY:"Sometido por",BTN_PUBLISH:"Publicar",BTN_PICTURE_DELETE:"Suprimir",BTN_PICTURE_FAVORISE:"Principal",BTN_PICTURE_ROTATE:"Girar",BTN_ADD_PICTURE:"Añadir una foto",NOTIFICATIONS:{TITLE:"Notificaciones",MARK_ALL_AS_READ:"Marcar todo como leído",NO_RESULT:"Ningúna notificación",SHOW_ALL:"Ver todo",LOAD_NOTIFICATIONS_FAILED:"Fracaso en la carga de las notificaciones"}},MENU:{REGISTRY:"Páginas",USER_PROFILE:"Mi perfil",MESSAGES:"Mensajes",NOTIFICATIONS:"Notificaciones",INVITATIONS:"Invitaciones"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Cuenta para una organización",ORGANIZATION_ACCOUNT_HELP:"Si representa una empresa, una asociación, etc.<br/>Ningún dividendo universal será creído por esta cuenta."},EVENT:{MEMBER_WITHOUT_PROFILE:'Para obtener sus certificaciones más rapidamente, complete <a ui-sref="app.edit_profile">su perfil usuario</a>. Los miembros concederán más fácilmente su confianza a una identidad verificable.'},ERROR:{WS_CONNECTION_FAILED:"ğchange no puede recibir las notificaciones, a causa de un error técnico (conexión al nodo de datos ğchange).<br/><br/>Si el problema persiste, por favor <b>elija otro nodo de datos</b> en los ajustes."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Sugerir identidades a certificar…",BTN_ASK_CERTIFICATIONS_DOTS:"Pedir a miembros que le certifiquen…",BTN_ASK_CERTIFICATION:"Pedir una certificación",VIEW:{BTN_FOLLOW:"Seguir la actividad de este perfil",BTN_REDO_STAR_HELP:"Actualizar su puntuación",BTN_STAR_HELP:"Puntuar este perfil",BTN_STARS_REMOVE:"Suprimir mi puntuación",BTN_STOP_FOLLOW:"Dejar de seguir este perfil",SENIORITY:"Antigüedad en {{'COMMON.APP_NAME'|translate}}",STAR_HIT_COUNT:"{{total}} puntuaci{{total>1 ? 'ones' : 'ón'}}",STARS:"Nivel de confianza"},SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Sugerir certificaciones",HELP:"Selectionar sus sugerencias"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Solicitar certificaciones",HELP:"Selectionar los destinatarios"},SEARCH:{DIVIDER_PROFILE:"Cuentas",DIVIDER_PAGE:"Páginas",DIVIDER_GROUP:"Grupos"},CONFIRM:{SUGGEST_CERTIFICATIONS:"¿Desea <b>enviar estas sugerencias de certificatión</b> ?",ASK_CERTIFICATION:"¿Desea <b>enviar una solicitud de certificación</b> ?",ASK_CERTIFICATIONS:"¿Desea <b>enviar una solicitud de certificación</b> a estas personas ?"}},INVITATION:{TITLE:"Invitaciones",NO_RESULT:"Ningúna invitación en espera",BTN_DELETE_ALL:"Suprimir todas las invitaciones",BTN_DELETE:"Suprimir la invitación",BTN_NEW_INVITATION:"Nueva invitación",ASK_CERTIFICATION:'<a href="#/app/wot/{{pubkey}}/{{::uid}}">{{::name||uid}}</a> solicita su certificación',SUGGESTION_CERTIFICATION:'<a href="#/app/wot/{{::pubkey}}/{{::uid}}">{{::name||uid}}</a> él es sugerido por certificación',SUGGESTED_BY:'Sugerencia mandada por <a class="positive" href="#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}">{{::issuer.name||issuer.uid}}</a>',NOTIFICATIONS:{TITLE:"Invitaciones"},LIST:{TITLE:"Invitaciones"},NEW:{TITLE:"Nueva invitación",RECIPIENTS:"A",RECIPIENTS_HELP:"Destinatarios de la invitación",RECIPIENTS_MODAL_TITLE:"Destinatarios",RECIPIENTS_MODAL_HELP:"Por favor, elige los destinatarios :",SUGGESTION_IDENTITIES:"Sugerencia de certificación",SUGGESTION_IDENTITIES_HELP:"Certificaciones a sugerir",SUGGESTION_IDENTITIES_MODAL_TITLE:"Sugerencias",SUGGESTION_IDENTITIES_MODAL_HELP:"Por favor, elige sus sugerencias :"},CONFIRM:{DELETE_ALL_CONFIRMATION:"La supresión de las invitaciones es una <b>operación ireversible</b>.<br/><br/>¿ Desea continuar ?",SEND_INVITATIONS_TO_CERTIFY:"¿ Desea <b>mandar esta invitación a certificar</b> ?"},INFO:{INVITATION_SENT:"Invitación mandada"},ERROR:{LOAD_INVITATIONS_FAILED:"Fracaso en la carga de las invitaciones",REMOVE_INVITATION_FAILED:"Fracaso durante la supresión de la invitación",REMOVE_ALL_INVITATIONS_FAILED:"Fracaso durante la supresión de las invitaciones",SEND_INVITATION_FAILED:"Fracaso durante el envío de la invitación",BAD_INVITATION_FORMAT:'<span class="assertive"><i class="ion-close-circled"></i> Invitación ilegible (formato desconocido)</span> - mandada por <a ui-sref="app.user_identity({pubkey: \'{{::pubkey}}\', uid: \'{{::uid}}\' })">{{::name||uid}}</a>'}},COMMENTS:{DIVIDER:"Comentarios",SHOW_MORE_COMMENTS:"Visualizar los comentarios anteriores",COMMENT_HELP:"Su comentario, preguntas, etc.",COMMENT_HELP_REPLY_TO:"Su repuesta…",MODIFIED_ON:"modificado el {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modificado entonces)",BTN_SEND:"Mandar",POPOVER_SHARE_TITLE:"Mensaje #{{number}}",REPLY:"Responder",REPLY_TO:"Repuesta a :",REPLY_TO_LINK:"En repuesta a ",REPLY_TO_DELETED_COMMENT:"En repuesta a un comentario suprimido",REPLY_COUNT:"{{replyCount}} repuestas",DELETED_COMMENT:"Comentario suprimido",ERROR:{FAILED_SAVE_COMMENT:"Fracaso durante el respaldo del comentario",FAILED_REMOVE_COMMENT:"Fracaso durante la supresión del comentario"}},MESSAGE:{REPLY_TITLE_PREFIX:"Rep: ",FORWARD_TITLE_PREFIX:"Tr: ",BTN_REPLY:"Responder",BTN_COMPOSE:"Nuevo mensaje",BTN_WRITE:"Escribir",NO_MESSAGE_INBOX:"Ningun mensaje recibido",NO_MESSAGE_OUTBOX:"Ningun mensaje mandado",NOTIFICATIONS:{TITLE:"Mensajes",MESSAGE_RECEIVED:"Ha <b>recibido un mensaje</b><br/>de"},LIST:{INBOX:"Bandeja de entrada",OUTBOX:"Mensajes enviados",LAST_INBOX:"Nuevos mensajes",LAST_OUTBOX:"Mensajes enviados",BTN_LAST_MESSAGES:"Mensajes recientes",TITLE:"Mensajes",SEARCH_HELP:"Buscar en mensajes",POPOVER_ACTIONS:{TITLE:"Opciones",DELETE_ALL:"Suprimir todos los mensajes"}},COMPOSE:{TITLE:"Nuevo mensaje",TITLE_REPLY:"Responder",SUB_TITLE:"Nuevo mensaje",TO:"A",OBJECT:"Objeto",OBJECT_HELP:"Objeto",ENCRYPTED_HELP:"Tenga en cuenta que este mensaje será cifrado antes del envío, con el fin de que solo el destinatario pueda leerlo, y que se tenga la seguridad de que la autoría es suya.",MESSAGE:"Mensaje",MESSAGE_HELP:"Contenido del mensaje",CONTENT_CONFIRMATION:"El contenido del mensaje está vacío.<br/><br/>Sin embargo, ¿ quiere mandar el mensaje ?"},VIEW:{TITLE:"Mensaje",SENDER:"Enviado por",RECIPIENT:"Enviado a",NO_CONTENT:"Mensaje vacío",DELETE:"Eliminar el mensaje"},CONFIRM:{REMOVE:"¿Desea <b>suprimir este mensaje</b> ?<br/><br/>Esta operación es ireversible.",REMOVE_ALL:"¿Desea <b>suprimir todos los mensajes</b> ?<br/><br/>Esta operación es ireversible.",MARK_ALL_AS_READ:"¿Desea <b>marcar todos los mensajes como leído</b> ?",USER_HAS_NO_PROFILE:"Esta identidad no tiene ningún perfil Cesium+. Puede que no tenga habilitada la extensión Cesium+, y <b>no podrá ver su mensaje</b>.<br/><br/>¿ Desea <b>continuar</b> a pesar de todo ?"},INFO:{MESSAGE_REMOVED:"Mensaje suprimido",All_MESSAGE_REMOVED:"Todos los mensajes fueron suprimido",MESSAGE_SENT:"Mensaje mandado"},ERROR:{SEND_MSG_FAILED:"Fracaso durante el envío del mensaje.",LOAD_MESSAGES_FAILED:"Fracaso durante la recuperación de los mensajes.",LOAD_MESSAGE_FAILED:"Fracaso durante la recuperación del mensaje.",MESSAGE_NOT_READABLE:"Lectura del mensaje imposible.",USER_NOT_RECIPIENT:"No esta el destinatario de este mensaje : deciframiento imposible.",NOT_AUTHENTICATED_MESSAGE:"La autenticidad del mensaje es dudosa o su contenido es corrupto.",REMOVE_MESSAGE_FAILED:"Fracaso en la supresión del mensaje",MESSAGE_CONTENT_TOO_LONG:"Valor demasiado largo ({{maxLength}} carácteres max).",MARK_AS_READ_FAILED:"Imposible marcar el mensaje como 'leído'.",LOAD_NOTIFICATIONS_FAILED:"Fracaso durante la recuperación de las notificaciones de mensajes.",REMOVE_All_MESSAGES_FAILED:"Fracaso durante la supresión de todos los mensajes.",MARK_ALL_AS_READ_FAILED:"Fracaso durante el marcaje de los mensajes como leído.",RECIPIENT_IS_MANDATORY:"El destinatario es obligatorio."}},REGISTRY:{CATEGORY:"Actividad principal",GENERAL_DIVIDER:"Informaciones generales",LOCATION_DIVIDER:"Dirección",SOCIAL_NETWORKS_DIVIDER:"Redes sociales y sitio web",TECHNICAL_DIVIDER:"Informaciones técnicas",BTN_SHOW_WOT:"Personas",BTN_SHOW_WOT_HELP:"Buscar personas",BTN_SHOW_PAGES:"Páginas",BTN_SHOW_PAGES_HELP:"Búsqueda de páginas",BTN_NEW:"Crear una página",MY_PAGES:"Mis páginas",NO_PAGE:"Sin páginas",SEARCH:{TITLE:"Páginas",SEARCH_HELP:"Qué, Quién, ej: peluquería, restaurante Sol.",BTN_ADD:"Nuevo",BTN_LAST_RECORDS:"Páginas recientes",BTN_ADVANCED_SEARCH:"búsqueda avanzada",BTN_OPTIONS:"Búsqueda avanzada",TYPE:"Tipo de página",LOCATION_HELP:"Ciudad",RESULTS:"Resultados",RESULT_COUNT_LOCATION:"{{count}} Resultado{{count>0?'s':''}}, cerca de {{location}}",RESULT_COUNT:"{{count}} resultado{{count>0?'s':''}}",LAST_RECORDS:"Páginas recientes",LAST_RECORD_COUNT_LOCATION:"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}, cerca de {{location}}",LAST_RECORD_COUNT:"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Opciones avanzadas?"}},VIEW:{TITLE:"Anuario",CATEGORY:"Actividad principal :",LOCATION:"Dirección :",MENU_TITLE:"Opciones",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"¿Desea suprimir esta página ?<br/><br/>Esta operación es ireversible."},TYPE:{TITLE:"Nueva página",SELECT_TYPE:"Tipo de página :",ENUM:{SHOP:"Comercio local",COMPANY:"Empresa",ASSOCIATION:"Asociación",INSTITUTION:"Institución"}},EDIT:{TITLE:"Edición",TITLE_NEW:"Nueva página",RECORD_TYPE:"Tipo de página",RECORD_TITLE:"Nombre",RECORD_TITLE_HELP:"Nombre",RECORD_DESCRIPTION:"Descripción",RECORD_DESCRIPTION_HELP:"Descripción de la actividad",RECORD_ADDRESS:"Calle",RECORD_ADDRESS_HELP:"Calle, edificio…",RECORD_CITY:"Ciudad",RECORD_CITY_HELP:"Ciudad",RECORD_SOCIAL_NETWORKS:"Redes sociales y sitio web",RECORD_PUBKEY:"Llave pública",RECORD_PUBKEY_HELP:"Llave pública para recibir pagos"},WALLET:{REGISTRY_DIVIDER:"Páginas",REGISTRY_HELP:'Las páginas se refieren a colectivos que aceptan moneda o la promocionan: tiendas, empresas, negocios, asociaciones, instituciones. Se almacenan fuera de la red de la moneda, en <a ui-sref="app.es_network">la red Cesium+</a>.'},ERROR:{LOAD_CATEGORY_FAILED:"Fracaso en la carga de la lista de actividades",LOAD_RECORD_FAILED:"Fracaso durante la carga de la página",LOOKUP_RECORDS_FAILED:"Fracaso durante la ejecución de la búsqueda.",REMOVE_RECORD_FAILED:"Fracaso en la supresión de la página",SAVE_RECORD_FAILED:"Fracaso durante el respaldo",RECORD_NOT_EXISTS:"Página inexistente",GEO_LOCATION_NOT_FOUND:"Ciudad o código postal no encontrado"},INFO:{RECORD_REMOVED:"Página suprimida",RECORD_SAVED:"Página guardada"}},PROFILE:{PROFILE_DIVIDER:"Perfil Cesium+",PROFILE_DIVIDER_HELP:"Estos son datos auxiliares, almacenados fuera de la red monetaria",NO_PROFILE_DEFINED:"Ningún perfil Cesium+",BTN_ADD:"Ingresar mi perfil",BTN_EDIT:"Editar mi perfil",BTN_DELETE:"Eliminar mi perfil",BTN_REORDER:"Reordenar",UID:"Seudónimo",TITLE:"Nombre, Apellidos",TITLE_HELP:"Nombre, Apellidos",DESCRIPTION:"Sobre mí",DESCRIPTION_HELP:"Escriba algo sobre usted…",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Informaciones generales",SOCIAL_NETWORKS_DIVIDER:"Redes sociales, sitios web",TECHNICAL_DIVIDER:"Informaciones técnicas",STAR:"Nivel de confianza",MODAL_AVATAR:{TITLE:"Foto de perfil",SELECT_FILE_HELP:"Por favor, <b>elija una imagen</b>, haciendo clic sobre el cuadro de abajo:",BTN_SELECT_FILE:"Eligir una imagen",RESIZE_HELP:"<b>Encuadre la imagen</b>, si es necesario. Un clic presionado sobre la imagen permite desplazarla. Haga clic en la zona inferior izquierda para hacer zoom.",RESULT_HELP:"<b>Aquí está el resultado</b> tal como se verá sobre su perfil :"},CONFIRM:{DELETE:"¿Desea <b>eliminar su perfil Cesium+?</b><br/><br/>Esta operación es irreversible."},ERROR:{REMOVE_PROFILE_FAILED:"Error de eliminación de perfil",LOAD_PROFILE_FAILED:"Fracaso en la carga del perfil usuario.",SAVE_PROFILE_FAILED:"Fracaso durante el respaldo",INVALID_SOCIAL_NETWORK_FORMAT:"Formato inválido: por favor, indique una dirección válida.<br/><br/>Ejemplos :<ul><li>- Una página Facebook (https://www.facebook.com/user)</li><li>- Una página web (http://www.misitio.es)</li><li>- Una dirección de correo (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Falló el redimensionado de la imagen"},INFO:{PROFILE_REMOVED:"Perfil eliminado",PROFILE_SAVED:"Perfil guardado"},HELP:{WARNING_PUBLIC_DATA:"La información de su perfil <b>es pública</b>: visible también por personas <b>sin cuenta</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"}},LOCATION:{BTN_GEOLOC_ADDRESS:"Actualizar desde la dirección",USE_GEO_POINT:"Comprobar la dirección (recomendado)",LOADING_LOCATION:"Encontrar la dirección…",LOCATION_DIVIDER:"Dirección",ADDRESS:"Calle",ADDRESS_HELP:"Calle, número, etc…",CITY:"Ciudad",CITY_HELP:"Ciudad, País",DISTANCE:"Distancia máxima alrededor de la ciudad",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Ciudad, País",PROFILE_POSITION:"Posición del perfil",MODAL:{TITLE:"Búsqueda de dirección",SEARCH_HELP:"Ciudad, País",ALTERNATIVE_RESULT_DIVIDER:"Resultados alternativos para <b>{{address}}</b> :",POSITION:"Latitud/Longitud : {{lat}} / {{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Requerido si una calle ha sido llenada",REQUIRED_FOR_LOCATION:"Campo obligatorio para aparecer en el mapa",INVALID_FOR_LOCATION:"Dirección desconocida",
|
||
GEO_LOCATION_FAILED:"No se puede recuperar su ubicación Por favor usa el botón de búsqueda.",ADDRESS_LOCATION_FAILED:"No se puede recuperar la posición de la dirección."}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Servicios en línea",SUBSCRIPTION_DIVIDER_HELP:"Los servicios en línea ofrecen servicios adicionales, proporcionados por un tercero.",BTN_ADD:"Agregar un servicio",BTN_EDIT:"Administrar mis servicios",NO_SUBSCRIPTION:"Ningún servicio definido",SUBSCRIPTION_COUNT:"Servicios / Suscripción",EDIT:{TITLE:"Servicios en línea",HELP_TEXT:"Gestione sus suscripciones y otros servicios en línea aquí",PROVIDER:"Proveedor:"},TYPE:{ENUM:{EMAIL:"Recibir notificaciones por correo electrónico"}},CONFIRM:{DELETE_SUBSCRIPTION:"¿ Deseas <b>eliminar</b> esta suscripción ?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Error al cargar servicios en línea",ADD_SUBSCRIPTION_FAILED:"Error al agregar suscripción",UPDATE_SUBSCRIPTION_FAILED:"Error durante la actualización de la suscripción",DELETE_SUBSCRIPTION_FAILED:"Error al eliminar la suscripción"},MODAL_EMAIL:{TITLE:"Notificación por correo electrónico",HELP:"Rellene este formulario para <b>ser notificado por correo electrónico</b> de los eventos de su cuenta. <br/> Su dirección de correo electrónico se cifrará y únicamente será visible para el proveedor de servicios.",EMAIL_LABEL:"Su correo electrónico :",EMAIL_HELP:"maria@dominio.com",FREQUENCY_LABEL:"Frecuencia de las notificaciones :",FREQUENCY_DAILY:"Diaria",FREQUENCY_WEEKLY:"Semanal",PROVIDER:"Proveedor de servicio:"}},DOCUMENT:{HASH:"Hash: ",LOOKUP:{TITLE:"Búsqueda de documentos",BTN_ACTIONS:"Acciones",BTN_COMPACT:"Compactar",DOCUMENT_TITLE:"Título",DOCUMENT_TYPE:"Tipo",HAS_REGISTERED:"ha creado o modificado su perfil",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS:"Últimos documentos",LAST_DOCUMENTS_DOTS:"Últimos documentos :",SHOW_QUERY:"Ver la búsqueda",HIDE_QUERY:"Esconder la búsqueda",HEADER_TIME:"Fecha/Hora",HEADER_ISSUER:"Emisor",HEADER_RECIPIENT:"Destinatario",READ:"Leído",BTN_REMOVE:"Sumprimer este documento",TYPE:{GROUP_COMMENT:"Comentario en un grupo",GROUP_RECORD:"Grupo",MARKET_COMMENT:"Comentario en un anuncio",MARKET_RECORD:"Anuncio",PAGE_COMMENT:"Comentario en una página",PAGE_RECORD:"Página",USER_PROFILE:"Perfil"},POPOVER_ACTIONS:{TITLE:"Acciones",REMOVE_ALL:"Suprimir estos documentos..."}},INFO:{REMOVED:"Documento suprimido"},CONFIRM:{REMOVE:"¿ Desea <b>suprimir este documento</b> ?",REMOVE_ALL:"¿ Desea <b>suprimer estos documentos</b> ?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Error al buscar documentos",REMOVE_FAILED:"Error al suprimir el documento",REMOVE_ALL_FAILED:"Error al suprimir los documentos"}},ES_PEER:{DOCUMENT_COUNT:"Número de documentos",DOCUMENTS:"Documentos",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} suscritas/os a notificaciones por correo",NAME:"Nombre",SOFTWARE:"Software"},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",PLUGIN_NAME_HELP:"Perfiles, notificaciones, mensajes privados",ENABLE_TOGGLE:"Activar la extensión",ENABLE_MESSAGE_TOGGLE:"Activar los mensajes privados",ENABLE_SETTINGS_TOGGLE:"Activar el almacenamiento a distancia de los ajustes",PEER:"Dirección del nodo de datos",POPUP_PEER:{TITLE:"Nodo de datos",HELP:"Ingrese la dirección del nodo que quiere utilizar:",PEER_HELP:"servidor.dominio.com:puerto"},NOTIFICATIONS:{DIVIDER:"Notificaciones",HELP_TEXT:"Active los tipos de notificaciones que desea recibir:",ENABLE_TX_SENT:"Notificar la validación de los <b>pagos emitidos</b>",ENABLE_TX_RECEIVED:"Notificar la validación de los <b>pagos recibidos</b>",ENABLE_CERT_SENT:"Notificar la validación de las <b>certificaciones emitidas</b>",ENABLE_CERT_RECEIVED:"Notificar la validación de las <b>certificaciones recibidas</b>"},CONFIRM:{ASK_ENABLE_TITLE:"Otras funcionalidades",ASK_ENABLE:'La extensión de Cesium+ está deshabilitada en sus ajutes, desactivando ciertas funcionalidades: <ul><li> <b><i class="icon ion-person"></i> Perfiles de usuario/a</b>;<li> <b><i class="icon ion-android-notifications"></i> Notificaciones</b>;<li> <b><i class="icon ion-email"></i> Mensajes privados</b>.</ul><br/><br/>¿<b>Desea re-activar</b> la extensión?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Un destinatario es obligatorio para el cifrado."}},EVENT:{NODE_STARTED:"Su nodo ES API <b>{{params[0]}}</b> ha comenzado",NODE_BMA_DOWN:"El nodo <b>{{params[0]}}:{{params[1]}}</b> (utilizado por su nodo ES API) <b>no es localizable</b>.",NODE_BMA_UP:"El nodo <b>{{params[0]}}:{{params[1]}}</b> es de nuevo accesible.",MEMBER_JOIN:"Ahora es <b>miembro</b> de la moneda <b>{{params[0]}}</b> !",MEMBER_LEAVE:"No es <b>miembro</b> de la moneda <b>{{params[0]}}</b>!",MEMBER_EXCLUDE:"Usted ya no es miembro de la moneda <b>{{params[0]}}</b>, por falta de renovación o certificaciones.",MEMBER_REVOKE:"Su membresía ha sido revocada. Ya no es miembro de la moneda <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Su membresía a <b>{{params[0]}}</b> ha sido <b>renovada con éxito</b>.",TX_SENT:"Su <b>pago</b> a <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> fue efectuado.",TX_SENT_MULTI:"Su <b>pago</b> a <b>{{params[1]}}</b> fue efectuado.",TX_RECEIVED:"Ha <b>recibido un pago</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span>.",TX_RECEIVED_MULTI:"Ha <b>recibido un pago</b> de <b>{{params[1]}}</b>.",PAGE:{ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha reportardo su anuncio : <b>{{params[2]}}</b>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha reportado un anuncio para moderar : <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha cerrado el anuncio : <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha añadido el anuncio : <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha comentado el anuncio : <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> sigue su anuncio : <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha modificado el anuncio : <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha modificado su comentario en el anuncio : <b>{{params[2]}}</b>',LIKE_RECEIVED:'A <span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> le ha gustado su anuncio : <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> os pide moderación sobre el anuncio : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha comentado su anuncio : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha modificado su comentario sobre su anuncio : <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha contestado a su comentario sobre el anuncio : <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha modificado la repuesta a su comentario sobre el anuncio : <b>{{params[2]}}</b>'},USER:{ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> ha reportado su perfil',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> ha reportado un perfil a eliminar: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> sigue su actividad',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> le gusta su perfil',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> os pide una moderación sobre el perfil: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> os ha puntuado ({{params[3]}} <b class="ion-star">)'},CERT_SENT:"Su <b>certificación</b> a <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> fue efectuada.",CERT_RECEIVED:"Ha <b>recibido una certificación</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span>.",REGISTRY:{NEW_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> ha comentado su referencia : <b>{{params[2]}}</b>",UPDATE_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> ha modificado su comentario sobre su referencia : <b>{{params[2]}}</b>",NEW_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> ha contestado a su comentario sobre la referencia : <b>{{params[2]}}</b>",UPDATE_REPLY_COMMENT:"<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> ha modificado la repuesta a su comentario sobre la referencia : <b>{{params[2]}}</b>"}},CONFIRM:{ES_USE_FALLBACK_NODE:"Nodo de datos <b>{{old}}</b> inalcanzable o dirección no válida.<br/><br/>¿Desea utilizar temporalmente el nodo de datos <b>{{new}}</b>?"},ERROR:{ES_CONNECTION_ERROR:'Nodo de datos <b>{{server}}</b> inalcanzable o dirección no válida.<br/><br/>Cesium continuará funcionando, <b>sin la extensión Cesium+</b> (perfiles de usuario, mensajes privados), mapas y gráficos).<br/><br/>Verifique su conexión a Internet, o cambie el nodo de datos en <a class="positive" ng-click="doQuickFix(\'settings\')"> los ajustes de la extensión </a>.',ES_MAX_UPLOAD_BODY_SIZE:"El volumen de datos a enviar excede el límite establecido por el servidor.<br/><br/>Por favor, inténtelo de nuevo después, por ejemplo, borrando fotos."}}),e.translations("fr-FR",{COMMON:{CATEGORY:"Catégorie",CATEGORY_SELECT_HELP:"Sélectionner",CATEGORIES:"Catégories",CATEGORY_SEARCH_HELP:"Recherche",COMMENT_HELP:"Commentaire",LAST_MODIFICATION_DATE:"Mise à jour le",BTN_LIKE:"J'aime",BTN_FOLLOW:"Suivre",BTN_STOP_FOLLOW:"Ne plus suivre",LIKES_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} aimé cette page",DISLIKES_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'n\\'ont' : 'n\\'a'}} pas aimé cette page",VIEWS_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} consulté cette page",FOLLOWS_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'suivent' : 'suit'}} cette page",ABUSES_TEXT:"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} signalé un problème",BTN_REPORT_ABUSE_DOTS:"Signaler un problème ou un abus...",BTN_REMOVE_REPORTED_ABUSE:"Annuler mon signalement",SUBMIT_BY:"Soumis par",GEO_DISTANCE_SEARCH:"Distance de recherche",GEO_DISTANCE_OPTION:"{{value}} km",BTN_PUBLISH:"Publier",BTN_PICTURE_DELETE:"Supprimer",BTN_PICTURE_FAVORISE:"Principale",BTN_PICTURE_ROTATE:"Tourner",BTN_ADD_PICTURE:"Ajouter une photo",NOTIFICATION:{TITLE:"Nouvelle notification | {{'COMMON.APP_NAME'|translate}}",HAS_UNREAD:"Vous avez {{count}} notification{{count>0?'s':''}} non lue{{count>0?'s':''}}"},NOTIFICATIONS:{TITLE:"Notifications",MARK_ALL_AS_READ:"Tout marquer comme lu",NO_RESULT:"Aucune notification",SHOW_ALL:"Voir tout",LOAD_NOTIFICATIONS_FAILED:"Erreur de chargement des notifications"},REPORT_ABUSE:{TITLE:"Signaler un problème",SUB_TITLE:"Merci d'expliquer succintement le problème :",REASON_HELP:"J'explique le problème...",ASK_DELETE:"Demander la suppression ?",CONFIRM:{SENT:"Signalement envoyé. Merci !"}}},MENU:{REGISTRY:"Pages",USER_PROFILE:"Mon profil",MESSAGES:"Messages",NOTIFICATIONS:"Notifications",INVITATIONS:"Invitations"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Compte pour une organisation",ORGANIZATION_ACCOUNT_HELP:"Si vous représentez une entreprise, une association, etc.<br/>Aucun dividende universel ne sera créé par ce compte."},EVENT:{MEMBER_WITHOUT_PROFILE:'Vous pouvez <a ui-sref="app.edit_profile">saisir votre profil Cesium+</a> (optionnel) pour offrir une meilleure visibilité de votre compte. Ce profil sera stocké dans <b>un annuaire indépendant</b> de la monnaie, mais décentralisé.'},ERROR:{WS_CONNECTION_FAILED:"ğchange ne peut pas recevoir les notifications à cause d'une erreur technique (connexion au noeud de données ğchange).<br/><br/>Si le problème persiste, veuillez <b>choisir un autre noeud de données</b> dans les paramètres."}},WOT:{BTN_SUGGEST_CERTIFICATIONS_DOTS:"Suggérer des identités à certifier...",BTN_ASK_CERTIFICATIONS_DOTS:"Demander à des membres de me certifier...",BTN_ASK_CERTIFICATION:"Demander une certification",SUGGEST_CERTIFICATIONS_MODAL:{TITLE:"Suggérer des certifications",HELP:"Sélectionner vos suggestions"},ASK_CERTIFICATIONS_MODAL:{TITLE:"Demander des certifications",HELP:"Sélectionner les destinataires"},SEARCH:{DIVIDER_PROFILE:"Comptes",DIVIDER_PAGE:"Pages",DIVIDER_GROUP:"Groupes"},VIEW:{SENIORITY:"Ancienneté sur {{'COMMON.APP_NAME'|translate}}",STARS:"Niveau de confiance",STAR_HIT_COUNT:"{{total}} note{{total>1 ? 's' : ''}}",BTN_STAR_HELP:"Noter ce profil",BTN_STARS_REMOVE:"Supprimer ma note",BTN_REDO_STAR_HELP:"Actualiser votre note",BTN_FOLLOW:"Suivre l'activité de ce profil",BTN_STOP_FOLLOW:"Ne plus suivre ce profil"}},COMMENTS:{DIVIDER:"Commentaires",SHOW_MORE_COMMENTS:"Afficher les commentaires précédents",COMMENT_HELP:"Votre commentaire, question, etc.",COMMENT_HELP_REPLY_TO:"Votre réponse...",BTN_SEND:"Envoyer",POPOVER_SHARE_TITLE:"Message #{{number}}",REPLY:"Répondre",REPLY_TO:"Réponse à :",REPLY_TO_LINK:"En réponse à ",REPLY_TO_DELETED_COMMENT:"En réponse à un commentaire supprimé",REPLY_COUNT:"{{replyCount}} réponses",DELETED_COMMENT:"Commentaire supprimé",MODIFIED_ON:"modifié le {{time|formatDate}}",MODIFIED_PARENTHESIS:"(modifié ensuite)",ERROR:{FAILED_SAVE_COMMENT:"Erreur lors de la sauvegarde du commentaire",FAILED_REMOVE_COMMENT:"Erreur lors de la suppression du commentaire"}},MESSAGE:{REPLY_TITLE_PREFIX:"Rep: ",FORWARD_TITLE_PREFIX:"Tr: ",BTN_REPLY:"Répondre",BTN_COMPOSE:"Nouveau message",BTN_WRITE:"Ecrire",NO_MESSAGE_INBOX:"Aucun message reçu",NO_MESSAGE_OUTBOX:"Aucun message envoyé",NOTIFICATIONS:{TITLE:"Messages",MESSAGE_RECEIVED:"Vous avez <b>reçu un message</b><br/>de"},LIST:{INBOX:"Boîte de réception",OUTBOX:"Messages envoyés",LAST_INBOX:"Nouveaux messages",LAST_OUTBOX:"Messages envoyés",BTN_LAST_MESSAGES:"Messages récents",TITLE:"Messages",SEARCH_HELP:"Recherche dans les messages",POPOVER_ACTIONS:{TITLE:"Options",DELETE_ALL:"Supprimer tous les messages"}},COMPOSE:{TITLE:"Nouveau message",TITLE_REPLY:"Répondre",SUB_TITLE:"Nouveau message",TO:"A",OBJECT:"Objet",OBJECT_HELP:"Objet",ENCRYPTED_HELP:"Veuillez noter que ce message sera chiffré avant envoi, afin que seul le destinataire puisse le lire, et qu'il soit assuré que vous soyez bien son auteur.",MESSAGE:"Message",MESSAGE_HELP:"Contenu du message",CONTENT_CONFIRMATION:"Le contenu du message est vide.<br/><br/>Voulez-vous néanmoins envoyer le message ?"},VIEW:{TITLE:"Message",SENDER:"Envoyé par",RECIPIENT:"Envoyé à",NO_CONTENT:"Message vide",DELETE:"Supprimer le message"},CONFIRM:{REMOVE:"Êtes-vous sûr de vouloir <b>supprimer ce message</b> ?<br/><br/>Cette opération est irréversible.",REMOVE_ALL:"Êtes-vous sûr de vouloir <b>supprimer tous les messages</b> ?<br/><br/>Cette opération est irréversible.",MARK_ALL_AS_READ:"Êtes-vous sûr de vouloir <b>marquer tous les messages comme lu</b> ?",USER_HAS_NO_PROFILE:"Cette identité n'a aucun profil. Il se peut qu'elle n'utilise pas l'extension de gestion des messages privés, et <b>ne consultera donc pas votre message</b>.<br/><br/>Êtes-vous sûr de vouloir <b>continuer</b> malgré tout ?"},INFO:{MESSAGE_REMOVED:"Message supprimé",All_MESSAGE_REMOVED:"Tous les messages ont été supprimés",MESSAGE_SENT:"Message envoyé"},ERROR:{SEND_MSG_FAILED:"Erreur lors de l'envoi du message.",LOAD_MESSAGES_FAILED:"Erreur lors de la récupération des messages.",LOAD_MESSAGE_FAILED:"Erreur lors de la récupération du message.",MESSAGE_NOT_READABLE:"Lecture du message impossible.",USER_NOT_RECIPIENT:"Vous n'êtes pas le destinataire de ce message : déchiffrement impossible.",NOT_AUTHENTICATED_MESSAGE:"L'authenticité du message est douteuse ou son contenu est corrompu.",REMOVE_MESSAGE_FAILED:"Erreur de suppression du message",MESSAGE_CONTENT_TOO_LONG:"Valeur trop longue ({{maxLength}} caractères max).",MARK_AS_READ_FAILED:"Impossible de marquer le message comme 'lu'.",LOAD_NOTIFICATIONS_FAILED:"Erreur lors de la récupération des notifications de messages.",REMOVE_All_MESSAGES_FAILED:"Erreur lors de la suppression de tous les messages.",MARK_ALL_AS_READ_FAILED:"Erreur lors du marquage des messages comme lu.",RECIPIENT_IS_MANDATORY:"Le destinataire est obligatoire."}},REGISTRY:{CATEGORY:"Activité principale",GENERAL_DIVIDER:"Informations générales",LOCATION_DIVIDER:"Adresse",SOCIAL_NETWORKS_DIVIDER:"Réseaux sociaux et site web",TECHNICAL_DIVIDER:"Informations techniques",BTN_SHOW_WOT:"Personnes",BTN_SHOW_WOT_HELP:"Rechercher des personnes",BTN_SHOW_PAGES:"Pages",BTN_SHOW_PAGES_HELP:"Rechercher des pages",BTN_NEW:"Créer une page",MY_PAGES:"Mes pages",NO_PAGE:"Aucune page",SEARCH:{TITLE:"Pages",SEARCH_HELP:"Quoi, Qui : restaurant, Chez Marcel, ...",BTN_ADD:"Nouveau",BTN_LAST_RECORDS:"Pages récentes",BTN_ADVANCED_SEARCH:"Recherche avancée",BTN_OPTIONS:"Recherche avancée",TYPE:"Type de page",LOCATION_HELP:"Où : Code postal, Ville",RESULTS:"Résultats",RESULT_COUNT_LOCATION:"{{count}} résultat{{count>0?'s':''}}, près de {{location}}",RESULT_COUNT:"{{count}} résultat{{count>0?'s':''}}",LAST_RECORDS:"Pages récentes",LAST_RECORD_COUNT_LOCATION:"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}, près de {{location}}",LAST_RECORD_COUNT:"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}",POPOVER_FILTERS:{BTN_ADVANCED_SEARCH:"Options avancées ?"}},VIEW:{TITLE:"Annuaire",CATEGORY:"Activité principale :",LOCATION:"Adresse :",MENU_TITLE:"Options",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Êtes-vous sûr de vouloir supprimer cette page ?<br/><br/>Cette opération est irréversible."},TYPE:{TITLE:"Types",SELECT_TYPE:"Type de page :",ENUM:{SHOP:"Commerce local",COMPANY:"Entreprise",ASSOCIATION:"Association",INSTITUTION:"Institution"}},EDIT:{TITLE:"Edition",TITLE_NEW:"Nouvelle page",RECORD_TYPE:"Type de page",RECORD_TITLE:"Nom",RECORD_TITLE_HELP:"Nom",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description de l'activité",RECORD_ADDRESS:"Rue",RECORD_ADDRESS_HELP:"Rue, bâtiment...",RECORD_CITY:"Ville",RECORD_CITY_HELP:"Ville",RECORD_SOCIAL_NETWORKS:"Réseaux sociaux et site web",RECORD_PUBKEY:"Clé publique",RECORD_PUBKEY_HELP:"Clé publique de réception des paiements"},WALLET:{REGISTRY_DIVIDER:"Pages",REGISTRY_HELP:"Les pages référencent des activités acceptant la monnaie ou la favorisant : commerces, entreprises, associations, institutions."},ERROR:{LOAD_CATEGORY_FAILED:"Erreur de chargement de la liste des activités",LOAD_RECORD_FAILED:"Erreur lors du chargement de la page",LOOKUP_RECORDS_FAILED:"Erreur lors de l'exécution de la recherche",REMOVE_RECORD_FAILED:"Erreur lors de la suppression de la page",SAVE_RECORD_FAILED:"Erreur lors de la sauvegarde",RECORD_NOT_EXISTS:"Page inexistante",GEO_LOCATION_NOT_FOUND:"Ville ou code postal non trouvé"},INFO:{RECORD_REMOVED:"Page supprimée",RECORD_SAVED:"Page sauvegardée"}},PROFILE:{PROFILE_DIVIDER:"Profil ğchange",PROFILE_DIVIDER_HELP:"Il s'agit de données annexes, stockées sur le réseau ğchange.",NO_PROFILE_DEFINED:"Aucun profil saisi",BTN_ADD:"Saisir mon profil",BTN_EDIT:"Editer mon profil",BTN_DELETE:"Supprimer mon profil",BTN_REORDER:"Réordonner",UID:"Pseudonyme",TITLE:"Nom, Prénom",TITLE_HELP:"Nom, Prénom",DESCRIPTION:"A propos de moi",DESCRIPTION_HELP:"A propos de moi...",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Informations générales",SOCIAL_NETWORKS_DIVIDER:"Réseaux sociaux, sites web",STAR:"Niveau de confiance",TECHNICAL_DIVIDER:"Informations techniques",MODAL_AVATAR:{TITLE:"Photo de profil",SELECT_FILE_HELP:"Veuillez <b>choisir un fichier image</b>, en cliquant sur le bouton ci-dessous :",BTN_SELECT_FILE:"Choisir une photo",RESIZE_HELP:"<b>Recadrez l'image</b>, si besoin. Un clic maintenu sur l'image permet de la déplacer. Cliquez sur la zone en bas à gauche pour zoomer.",RESULT_HELP:"<b>Voici le résultat</b> tel que visible sur votre profil :"},CONFIRM:{DELETE:"Êtes-vous sûr de vouloir <b>supprimer votre profil ğchange ?</b><br/><br/>Cette opération est irréversible."},ERROR:{REMOVE_PROFILE_FAILED:"Erreur de suppression du profil",LOAD_PROFILE_FAILED:"Erreur de chargement du profil utilisateur",SAVE_PROFILE_FAILED:"Erreur lors de la sauvegarde",INVALID_SOCIAL_NETWORK_FORMAT:"Format non pris en compte : veuillez indiquer une adresse valide.<br/><br/>Exemples :<ul><li>- Une page Facebook (https://www.facebook.com/user)</li><li>- Une page web (http://www.monsite.fr)</li><li>- Une adresse email (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Erreur lors du redimensionnement de l'image"},INFO:{PROFILE_REMOVED:"Profil supprimé",PROFILE_SAVED:"Profil sauvegardé"},HELP:{WARNING_PUBLIC_DATA:"Les informations renseignées dans votre profil <b>sont publiques</b> : visibles y compris par des personnes <b>non connectées</b>."}},LOCATION:{BTN_GEOLOC_ADDRESS:"Trouver mon adresse sur la carte",USE_GEO_POINT:"Vérifier l'adresse (recommandé) ?",LOADING_LOCATION:"Recherche de l'adresse...",LOCATION_DIVIDER:"Adresse",ADDRESS:"Rue",ADDRESS_HELP:"Rue, complément d'adresse...",CITY:"Ville",CITY_HELP:"Code postal, Ville, Pays",DISTANCE:"Distance maximale autour de la ville",DISTANCE_UNIT:"km",DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SEARCH_HELP:"Code postal, Ville",PROFILE_POSITION:"Position du profil",MODAL:{TITLE:"Recherche de l'adresse",SEARCH_HELP:"Ville, Code postal, Pays",ALTERNATIVE_RESULT_DIVIDER:"Résultats alternatifs pour <b>{{address}}</b> :",POSITION:"Lat/Lon : {{lat}}/{{lon}}"},ERROR:{CITY_REQUIRED_IF_STREET:"Champ obligatoire (car une rue est saisie)",REQUIRED_FOR_LOCATION:"Champ obligatoire pour apparaître sur la carte",INVALID_FOR_LOCATION:"Adresse inconnue",GEO_LOCATION_FAILED:"Impossible de récupérer votre position. Veuillez utiliser le bouton de recherche.",ADDRESS_LOCATION_FAILED:"Impossible de récupérer la position à partir de l'adresse"}},SUBSCRIPTION:{SUBSCRIPTION_DIVIDER:"Services en ligne",SUBSCRIPTION_DIVIDER_HELP:"Les services en ligne offrent des services supplémentaires optionnels, délégués à un tiers.",BTN_ADD:"Ajouter un service",BTN_EDIT:"Gérer mes services",NO_SUBSCRIPTION:"Aucun service utilisé",SUBSCRIPTION_COUNT:"Services / Abonnements",EDIT:{TITLE:"Services en ligne",HELP_TEXT:"Gérez ici vos abonnements et autres services en ligne",PROVIDER:"Prestataire :"},TYPE:{ENUM:{EMAIL:"Recevoir les notifications par email"}},CONFIRM:{DELETE_SUBSCRIPTION:"Êtes-vous sûr de vouloir <b>supprimer cet abonnement</b> ?"},ERROR:{LOAD_SUBSCRIPTIONS_FAILED:"Erreur lors du chargement des services en ligne",ADD_SUBSCRIPTION_FAILED:"Erreur de l'envoi de l'abonnement",UPDATE_SUBSCRIPTION_FAILED:"Erreur de la mise à jour de l'abonnement",DELETE_SUBSCRIPTION_FAILED:"Erreur lors de la suppression de l'abonnement"},MODAL_EMAIL:{TITLE:"Notification par email",HELP:"Remplissez ce formulaire pour <b>être notifié par email</b> des événements de votre compte.<br/>Votre adresse email sera chiffrée pour n'être visible que par le prestataire de service.",EMAIL_LABEL:"Votre email :",EMAIL_HELP:"jean.dupond@domaine.com",FREQUENCY_LABEL:"Fréquence des notifications :",FREQUENCY_DAILY:"Journalier",FREQUENCY_WEEKLY:"Hebdomadaire",PROVIDER:"Prestataire du service :"}},DOCUMENT:{HASH:"Hash : ",LOOKUP:{TITLE:"Recherche de documents",BTN_ACTIONS:"Actions",SEARCH_HELP:"issuer:AAA*, time:1508406169",LAST_DOCUMENTS_DOTS:"Derniers documents :",LAST_DOCUMENTS:"Derniers documents",SHOW_QUERY:"Voir la requête",HIDE_QUERY:"Masquer la requête",HEADER_TIME:"Date/Heure",HEADER_ISSUER:"Emetteur",HEADER_RECIPIENT:"Destinataire",READ:"Lu",DOCUMENT_TYPE:"Type",DOCUMENT_TITLE:"Titre",BTN_REMOVE:"Supprimer ce document",BTN_COMPACT:"Compacter",HAS_REGISTERED:"a créé ou modifié son profil",POPOVER_ACTIONS:{TITLE:"Actions",REMOVE_ALL:"Supprimer ces documents..."},TYPE:{USER_PROFILE:"Profil",MARKET_RECORD:"Annonce",MARKET_COMMENT:"Commentaire sur une annonce",PAGE_RECORD:"Page",PAGE_COMMENT:"Commentaire sur une page",GROUP_RECORD:"Groupe",GROUP_COMMENT:"Commentaire sur un groupe"}},INFO:{REMOVED:"Document supprimé"},CONFIRM:{REMOVE:"Êtes-vous sûr de vouloir <b>supprimer ce document</b> ?",REMOVE_ALL:"Êtes-vous sûr de vouloir <b>supprimer ces documents</b> ?"},ERROR:{LOAD_DOCUMENTS_FAILED:"Erreur lors de la recherche de documents",REMOVE_FAILED:"Erreur lors de la suppression du document",REMOVE_ALL_FAILED:"Erreur lors de la suppression des documents"}},ES_SETTINGS:{PLUGIN_NAME:"Paramètres avancés",PLUGIN_NAME_HELP:"Filtrage des notifications, etc.",ENABLE_TOGGLE:"Activer l'extension ?",ENABLE_MESSAGE_TOGGLE:"Activer les messages privés ?",ENABLE_SETTINGS_TOGGLE:"Activer le stockage distant des paramètres ?",PEER:"Adresse du nœud de données",POPUP_PEER:{TITLE:"Nœud de données",HELP:"Saisissez l'adresse du nœud que vous voulez utiliser :",PEER_HELP:"serveur.domaine.com:port"},NOTIFICATIONS:{DIVIDER:"Notifications",HELP_TEXT:"Activez les types de notifications que vous souhaitez recevoir :",ENABLE_TX_SENT:"Notifier les <b>paiements émis</b> ?",ENABLE_TX_RECEIVED:"Notifier les <b>paiements reçus</b> ?",ENABLE_CERT_SENT:"Notifier les <b>certifications émises</b> ?",ENABLE_CERT_RECEIVED:"Notifier les <b>certifications reçues</b> ?"},CONFIRM:{ASK_ENABLE_TITLE:"Fonctionnalités optionnelles",ASK_ENABLE:'L\'extension Cesium+ est <b>désactivée</b> dans vos paramètres, rendant inactives les fonctionnalités : <ul><li> <b><i class="icon ion-person"></i> Profils Cesium+</b>;<li> <b><i class="icon ion-android-notifications"></i> Notifications</b>;<li> <b><i class="icon ion-email"></i> Messages privés</b>.<li> <b><i class="icon ion-location"></i> Cartes, etc.</b>.</ul><br/><b>Souhaitez-vous ré-activer</b> l\'extension ?'}},ES_WALLET:{ERROR:{RECIPIENT_IS_MANDATORY:"Un destinataire est obligatoire pour le chiffrement."}},ES_PEER:{NAME:"Nom",DOCUMENTS:"Documents",SOFTWARE:"Logiciel",DOCUMENT_COUNT:"Nombre de documents",EMAIL_SUBSCRIPTION_COUNT:"{{emailSubscription}} abonnés aux notifications par email"},EVENT:{NODE_STARTED:"Votre noeud ES API <b>{{params[0]}}</b> est démarré",NODE_BMA_DOWN:"Le noeud <b>{{params[0]}}:{{params[1]}}</b> (utilisé par votre noeud ES API) est <b>injoignable</b>.",NODE_BMA_UP:"Le noeud <b>{{params[0]}}:{{params[1]}}</b> est à nouveau accessible.",MEMBER_JOIN:"Vous êtes maintenant <b>membre</b> de la monnaie <b>{{params[0]}}</b> !",MEMBER_LEAVE:"Vous n'êtes <b>plus membre</b> de la monnaie <b>{{params[0]}}</b> !",MEMBER_EXCLUDE:"Vous n'êtes <b>plus membre</b> de la monnaie <b>{{params[0]}}</b>, faute de non renouvellement ou par manque de certifications.",MEMBER_REVOKE:"La révocation de votre compte a été effectuée. Il ne pourra plus être un compte membre de la monnaie <b>{{params[0]}}</b>.",MEMBER_ACTIVE:"Votre renouvellement d'adhésion à la monnaie <b>{{params[0]}}</b> a été <b>pris en compte</b>.",TX_SENT:'Votre <b>paiement</b> à <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> a été effectué.',TX_SENT_MULTI:"Votre <b>paiement</b> à <b>{{params[1]}}</b> a été effectué.",TX_RECEIVED:'Vous avez <b>reçu un paiement</b> de <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',TX_RECEIVED_MULTI:"Vous avez <b>reçu un paiement</b> de <b>{{params[1]}}</b>.",CERT_SENT:'Votre <b>certification</b> à <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> a été effectuée.',CERT_RECEIVED:'Vous avez <b>reçu une certification</b> de <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',USER:{LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> aime votre profil',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> suit votre activité',STAR_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> vous a noté ({{params[3]}} <b class="ion-star">)',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> vous demande une modération sur le profil : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> a signalé un profil à supprimer : <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[2]}}</span> a signalé votre profil'},PAGE:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a commenté votre page : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié son commentaire sur votre page : <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a répondu à votre commentaire sur la page : <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié sa réponse à votre commentaire sur la page : <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a commenté la page : <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié son commentaire sur la page : <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a ajouté la page : <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié la page : <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> vous demande une modération sur la page : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a signalé une page à supprimer : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a signalé votre page : <b>{{params[2]}}</b>'}},CONFIRM:{ES_USE_FALLBACK_NODE:"Nœud de données <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud de données <b>{{new}}</b> ?"},ERROR:{ES_CONNECTION_ERROR:'Nœud de données <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou changer de nœud de données dans les <a class="positive" ng-click="doQuickFix(\'settings\')">paramètres avancés</a>.',ES_MAX_UPLOAD_BODY_SIZE:"Le volume des données à envoyer dépasse la limite fixée par le serveur.<br/>Veuillez ré-essayer après avoir, par exemple, supprimer des photos."}}),e.translations("nl-NL",{COMMON:{CATEGORY:"Categorie",CATEGORIES:"Categorieën",CATEGORY_SEARCH_HELP:"Zoeken",LAST_MODIFICATION_DATE:"Vernieuws op ",SUBMIT_BY:"Ingediend door",BTN_PUBLISH:"Publiceren",BTN_PICTURE_DELETE:"Wissen",BTN_PICTURE_FAVORISE:"Default",BTN_ADD_PICTURE:"Afbeelding toevoegen",NOTIFICATIONS:{TITLE:"Notificaties",MARK_ALL_AS_READ:"Markeer alles als gelezen",NO_RESULT:"Geen berichten",SHOW_ALL:"Toon alles",LOAD_NOTIFICATIONS_FAILED:"Kan berichten niet laden"}},MENU:{REGISTRY:"Ondernemingen",USER_PROFILE:"Mijn profiel",MESSAGES:"Berichten"},ACCOUNT:{NEW:{ORGANIZATION_ACCOUNT:"Ondernemingsrekening",ORGANIZATION_ACCOUNT_HELP:"Als je een onderneming, vereniging etc. vertegenwoordigd.<br/>Deze rekening zal geen dividend créeren."},EVENT:{MEMBER_WITHOUT_PROFILE:'Vul <a ui-sref="app.user_edit_profile"je gebruikersprofiel</a> in om sneller een certificering te verkrijgen. Leden zullen een verfifieerbare identiteit eerder vertrouwen.'}},COMMENTS:{DIVIDER:"Commentaren",SHOW_MORE_COMMENTS:"Toon eerder commentaren",COMMENT_HELP:"Jouw commentaar, vraag...",COMMENT_HELP_REPLY_TO:"Jouw antwoord...",BTN_SEND:"Verzenden",POPOVER_SHARE_TITLE:"Bericht #{{number}}",REPLY:"Antwoord",REPLY_TO:"Antwoorden op:",REPLY_TO_LINK:"In antwoord op ",REPLY_TO_DELETED_COMMENT:"In antwoord op een gewist bericht",REPLY_COUNT:"{{replyCount}} antwoorden",DELETED_COMMENT:"Bericht gewist"},MESSAGE:{REPLY_TITLE_PREFIX:"Re: ",FORWARD_TITLE_PREFIX:"Fw: ",BTN_REPLY:"Antwoord",BTN_COMPOSE:"Nieuw bericht",BTN_WRITE:"Schrijven",NO_MESSAGE_INBOX:"Geen bericht ontvangen",NO_MESSAGE_OUTBOX:"Geen bericht verzonden",NOTIFICATIONS:{TITLE:"Berichten",MESSAGE_RECEIVED:"Je hebt een <b>bericht ontvangen</b><br/>van"},LIST:{INBOX:"Inbox",OUTBOX:"Verzonden",TITLE:"Privé",POPOVER_ACTIONS:{TITLE:"Opties",DELETE_ALL:"Alle berichten wissen"}},COMPOSE:{TITLE:"Nieuw bericht",TITLE_REPLY:"Antwoord",SUB_TITLE:"Nieuw bericht",TO:"Aan",OBJECT:"Onderwerp",OBJECT_HELP:"Onderwerp",ENCRYPTED_HELP:"Please note this message will by encrypt before sending zodat alleen de ontvanger het kan lezen en zeker kan zijn dat jij de auteur bent.",MESSAGE:"Bericht",MESSAGE_HELP:"Berichtinhoud",CONTENT_CONFIRMATION:"Geen berichtinhoud.<br/><br/>Weet je zeker dat je dit bericht wil verzenden?"},VIEW:{TITLE:"Bericht",SENDER:"Verzonden door",RECIPIENT:"Verzonden aan",NO_CONTENT:"Leeg bericht"},CONFIRM:{REMOVE:"Weet je zeker dat je <b>dit bericht wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.",REMOVE_ALL:"Weet je zeker dat je <b>alle berichten wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.",MARK_ALL_AS_READ:"Weet je zeker dat je <b>alle berichten als gelezen wil markeren</b>?"},INFO:{MESSAGE_REMOVED:"Bericht succesvol gewist",All_MESSAGE_REMOVED:"Berichten succesvol gewist",MESSAGE_SENT:"Bericht verzonden"},ERROR:{SEND_MSG_FAILED:"Fout tijdens verzending.",LOAD_MESSAGES_FAILED:"Kan berichten niet laden.",LOAD_MESSAGE_FAILED:"Kan bericht niet laden.",MESSAGE_NOT_READABLE:"Kan bericht niet lezen.",USER_NOT_RECIPIENT:"Je bent niet de geadresseerde van dit bericht: het kan niet gelezen worden.",NOT_AUTHENTICATED_MESSAGE:"De authenticiteit van het bericht is onduidelijk of de inhoud is gecorrumpeerd.",REMOVE_MESSAGE_FAILED:"Kan bericht niet wissen.",MESSAGE_CONTENT_TOO_LONG:"Waarde te land (max {{maxLength}} characters).",MARK_AS_READ_FAILED:"Kan bericht niet als gelezen markeren.",LOAD_NOTIFICATIONS_FAILED:"Kan niet alle berichtnotificaties laden.",REMOVE_All_MESSAGES_FAILED:"Kan niet alle berichten wissen.",MARK_ALL_AS_READ_FAILED:"Kan berichten niet als gelezen markeren."}},REGISTRY:{CATEGORY:"Hoofdactiviteit",GENERAL_DIVIDER:"Basisinformatie",LOCATION_DIVIDER:"Adres",SOCIAL_NETWORKS_DIVIDER:"Sociale media en website",TECHNICAL_DIVIDER:"Technische informatie",BTN_NEW:"Toevoegen",SEARCH:{TITLE:"Bedrijfsregister",TITLE_SMALL_DEVICE:"Bedrijfsregister",SEARCH_HELP:"Wie, Wat: kapper, Lili's restaurant, ...",BTN_ADD:"Nieuw",BTN_OPTIONS:"Geavanceerd zoeken",TYPE:"Soort organisatie",LOCATION:"Locatie",LOCATION_HELP:"Plaats",LAST_RECORDS:"Nieuwste referenties:",RESULTS:"Resultaten:"},VIEW:{TITLE:"Register",CATEGORY:"Hoofdactiviteit:",LOCATION:"Adres:",MENU_TITLE:"Opties",POPOVER_SHARE_TITLE:"{{title}}",REMOVE_CONFIRMATION:"Weet je zeker dat je deze referentie wil verwijderen?<br/><br/>Dit kan niet ongedaan worden gemaakt."},TYPE:{TITLE:"Nieuwe referentie",SELECT_TYPE:"Soort organizatie:",ENUM:{SHOP:"Locale winkel",COMPANY:"Onderneming",ASSOCIATION:"Stichting",INSTITUTION:"Instituut"}},EDIT:{TITLE:"Bewerk",TITLE_NEW:"Nieuwe referentie",RECORD_TYPE:"Soort organizatie",RECORD_TITLE:"Naam",RECORD_TITLE_HELP:"Naam",RECORD_DESCRIPTION:"Beschrijving",RECORD_DESCRIPTION_HELP:"Omschrijf activiteit",RECORD_ADDRESS:"Adres",RECORD_ADDRESS_HELP:"Adres: straat, gebouw...",RECORD_CITY:"Plaats",RECORD_CITY_HELP:"Plaats",RECORD_SOCIAL_NETWORKS:"Sociale media en website",RECORD_PUBKEY:"Publieke sleutel",RECORD_PUBKEY_HELP:"Publieke sleutel om betalingen te ontvangen"},ERROR:{LOAD_CATEGORY_FAILED:"Laden hoofdactiveiten mislukt",LOAD_RECORD_FAILED:"Laden datasheet mislukt",LOOKUP_RECORDS_FAILED:"Opzoeken datasheets is mislukt.",REMOVE_RECORD_FAILED:"Verwijderen datasheet mislukt",SAVE_RECORD_FAILED:"Opslaan datasheet mislukt",RECORD_NOT_EXISTS:"Datasheet niet gevonden"},INFO:{RECORD_REMOVED:"Datasheet succesvol verwijderd"}},PROFILE:{UID:"Pseudoniem",TITLE:"Naam",TITLE_HELP:"Naam",DESCRIPTION:"Over mij",DESCRIPTION_HELP:"Over mij...",ADDRESS:"Adres",ADDRESS_HELP:"Adres (optioneel)",CITY:"Plaats",CITY_HELP:"Plaats (optioneel)",SOCIAL_HELP:"http://...",GENERAL_DIVIDER:"Algemene informatie",LOCATION_DIVIDER:"Localisatie",SOCIAL_NETWORKS_DIVIDER:"Sociale media en website",TECHNICAL_DIVIDER:"Technische informatie",ERROR:{LOAD_PROFILE_FAILED:"Kon gebruikersprofiel niet laden.",SAVE_PROFILE_FAILED:"Opslaan profiel mislukt",INVALID_SOCIAL_NETWORK_FORMAT:"Ongeldig formaat: vul een geldig internetadres in.<br/><br/>Voorbeelden:<ul><li>- Een Facebookpagina (https://www.facebook.com/user)</li><li>- Een webpagina (http://www.domain.com)</li><li>- Een emailadres (joe@dalton.com)</li></ul>",IMAGE_RESIZE_FAILED:"Fout tijdens afbeelding schalen"},INFO:{PROFILE_SAVED:"Profiel opgeslagen"},HELP:{WARNING_PUBLIC_DATA:"Let op, de informatie die hier is vastgelegd <b>is publiek</b>: zichtbaar ook voor <b>niet ingelogde gebruikers</b>."}},ES_SETTINGS:{PLUGIN_NAME:"Cesium+",ENABLE_TOGGLE:"Uitbreiding inschakelen?",ENABLE_MESSAGE_TOGGLE:"Berichten inschakelen?",ENABLE_SETTINGS_TOGGLE:"Globale opslag voor instellingen inschakelen?",PEER:"Adres dataknooppunt",POPUP_PEER:{TITLE:"Dataknoop",HELP:"Stel het te gebruiken adres in:",PEER_HELP:"server.domein.com:poort"},NOTIFICATIONS:{DIVIDER:"Notificaties",HELP_TEXT:"Schakel het type notificatie dat je wil ontvangen in:",ENABLE_TX_SENT:"Bericht bij validatie van <b>verzonden betalingen</b>?",ENABLE_TX_RECEIVED:"Bericht bij validatie van <b>ontvangen betalingen</b>?",ENABLE_CERT_SENT:"Bericht bij validatie van <b>verzonden certificaties</b>?",ENABLE_CERT_RECEIVED:"Bericht bij validatie van <b>ontvangen certificaties</b>?"},CONFIRM:{ASK_ENABLE_TITLE:"Nieuwe functies",ASK_ENABLE:'Er zijn nieuwe functies beschikbaar: <ul><li> <b><i class="icon ion-person"></i> Profile Cesium+</b>;<li> <b><i class="icon ion-android-notifcaitions"></i> Notifications</b>;<li> <b><i class="icon ion-email"></i> Privé berichten</b>.</ul><br/>Deze zijn <b>uitgeschakeld</b> in je instellingen.<br/><br/>Wil je deze functies <b>inschakelen</b>?'}},EVENT:{NODE_STARTED:"Je knoop ES API <b>{{params[0]}}</b> is UP",NODE_BMA_DOWN:"Knooppunt <b>{{params[0]}}:{{params[1]}}</b> (gebruikt door je ES API) is <b>onbereikbaar</b>.",NODE_BMA_UP:"Knooppunt <b>{{p0}}:{{params[1]}}</b> is weer onbereikbaar.",MEMBER_JOIN:"Je bent nu <b>lid</b> van valuta <b>{{params[0]}}</b>!",MEMBER_LEAVE:"Je bent <b>geen lid meer</b> van valuta <b>{{params[0]}}</b>!",MEMBER_ACTIVE:"Je lidmaatschap bij <b>{{params[0]}}</b> is met <b>succes verlengd</b>.",TX_SENT:'Je <b>betaling</b> aan <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> is uitgevoerd.',TX_SENT_MULTI:"Je <b>betaling</b> aan <b>{{params[1]}}</b> is uitgevoerd.",TX_RECEIVED:'Je hebt een <b>betaling ontvangen</b> van <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',TX_RECEIVED_MULTI:"Je hebt een <b>betaling ontvangen</b> van <b>{{params[1]}}</b>.",CERT_SENT:'Je <b>certificatie</b> van <span class="positive" ><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> is uitgevoerd.',CERT_RECEIVED:'Je hebt een <b>certificatie ontvangen</b> van <span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span>.',REGISTRY:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft gereageerd op jouw referentie: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft zijn/aar reactie op jouw referentie bewerkt: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> hheeft gereageerd op jouw commentaar op referentie: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft zijn/haar reactie op jouw commentaar bewerkt, op referentie: <b>{{params[2]}}</b>'}},ERROR:{}}),e.translations("en-GB",{NETWORK:{VIEW:{BTN_GRAPH:"Statistics"}},GRAPH:{COMMON:{LINEAR_SCALE:"Linear scale",LOGARITHMIC_SCALE:"Logarithmic scale",BTN_SHOW_STATS:"See statistics",BTN_SHOW_DETAILED_STATS:"Detailed statistics",RANGE_DURATION_DIVIDER:"Step unit:",RANGE_DURATION:{HOUR:"Group by <b>hour</b>",DAY:"Group by <b>day</b>",MONTH:"Group by <b>month</b>"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Computed blocks count",BLOCK_COUNT:"{{count}} blocks",NO_BLOCK:"No block"}},DOC_STATS:{TITLE:"Data storage statistics",MARKET:{TITLE:"Number of Ads",AD:"Ads",COMMENT:"Comments"},USER:{TITLE:"Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},MESSAGE:{TITLE:"Number of documents related to the communication",MESSAGE_INBOX:"Messages in inbox",MESSAGE_OUTBOX:"Messages in outbox",INVITATION_CERTIFICATION:"Invitations to certify"},SOCIAL:{TITLE:"Number of page or group",PAGE_COMMENT:"Comments",PAGE_RECORD:"Pages",GROUP_RECORD:"Groups"},SUBSCRIPTION:{TITLE:"Number of online subscriptions",EMAIL:"Email notifications"},OTHER:{TITLE:"Other documents",HISTORY_DELETE:"Deletion of documents"}}}}),e.translations("en",{NETWORK:{VIEW:{BTN_GRAPH:"Statistics"}},GRAPH:{COMMON:{LINEAR_SCALE:"Linear scale",LOGARITHMIC_SCALE:"Logarithmic scale",BTN_SHOW_STATS:"See statistics",BTN_SHOW_DETAILED_STATS:"Detailed statistics",RANGE_DURATION_DIVIDER:"Step unit:",RANGE_DURATION:{HOUR:"Group by <b>hour</b>",DAY:"Group by <b>day</b>",MONTH:"Group by <b>month</b>"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Computed blocks count",BLOCK_COUNT:"{{count}} blocks",NO_BLOCK:"No block"}},DOC_STATS:{TITLE:"Data storage statistics",MARKET:{TITLE:"Number of Ads",AD:"Ads",COMMENT:"Comments"},USER:{TITLE:"Number of documents linked to an account",USER_PROFILE:"User profiles",USER_SETTINGS:"Saved settings"},MESSAGE:{TITLE:"Number of documents related to the communication",MESSAGE_INBOX:"Messages in inbox",MESSAGE_OUTBOX:"Messages in outbox",INVITATION_CERTIFICATION:"Invitations to certify"},SOCIAL:{TITLE:"Number of page or group",PAGE_COMMENT:"Comments",PAGE_RECORD:"Pages",GROUP_RECORD:"Groups"},SUBSCRIPTION:{TITLE:"Number of online subscriptions",EMAIL:"Email notifications"},OTHER:{TITLE:"Other documents",HISTORY_DELETE:"Deletion of documents"}}}}),e.translations("eo-EO",{NETWORK:{VIEW:{BTN_GRAPH:"Statistikoj"}},GRAPH:{COMMON:{LINEAR_SCALE:"Lineara skalo",LOGARITHMIC_SCALE:"Logaritma skalo",BTN_SHOW_STATS:"Vidi la statistikojn",BTN_SHOW_DETAILED_STATS:"Detalaj statistikoj",RANGE_DURATION_DIVIDER:"Tempo-unuo:",RANGE_DURATION:{HOUR:"Horo",DAY:"Tago",MONTH:"Monato"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Nombro de blokoj kalkulitaj",BLOCK_COUNT:"{{count}} blokoj",NO_BLOCK:"Neniu bloko"}},DOC_STATS:{TITLE:"Statistikoj pri stokado",MARKET:{TITLE:"Nombro de anoncoj",AD:"Anoncoj",COMMENT:"Komentoj"},MARKET_DELTA:{TITLE:"Variado de la nombro de anoncoj",AD:"Anoncoj",COMMENT:"Komentoj"},USER:{TITLE:"Nombro de dokumentoj ligitaj al konto",USER_PROFILE:"Uzanto-profiloj",USER_SETTINGS:"Parametroj konservitaj"},USER_DELTA:{TITLE:"Variado de la nombro de dokumentoj ligitaj al konto",USER_PROFILE:"Uzanto-profiloj",USER_SETTINGS:"Parametroj konservitaj"},MESSAGE:{TITLE:"Nombro de dokumentoj ligitaj al komunikado",MESSAGE_INBOX:"Mesaĝoj en ricevujo",MESSAGE_OUTBOX:"Senditaj mesaĝoj konservitaj",INVITATION_CERTIFICATION:"Invitoj atestotaj"},SOCIAL:{TITLE:"Nombro de paĝoj aŭ grupoj",PAGE_COMMENT:"Komentoj",PAGE_RECORD:"Paĝoj",GROUP_RECORD:"Grupoj"},SUBSCRIPTION:{TITLE:"Nombro de abonoj",EMAIL:"Avizoj per retmesaĝoj"},OTHER:{TITLE:"Aliaj dokumentoj",HISTORY_DELETE:"Forigoj de dokumentoj"}},SYNCHRO:{TITLE:"Statistikoj pri sinkronigoj",COUNT:{TITLE:"Kvanto sinkronigita",INSERTS:"Enmetoj",UPDATES:"Ĝisdatigoj",DELETES:"Forigoj"},PEER:{TITLE:"Nodoj informpetitaj",ES_USER_API:"Nodoj pri datenoj de uzantoj",ES_SUBSCRIPTION_API:"Nodoj pri retaj servoj"},PERFORMANCE:{TITLE:"Efikecoj pri efektiviĝo",DURATION:"Tempo por efektiviĝo (ms)"}}}}),e.translations("es-ES",{NETWORK:{VIEW:{BTN_GRAPH:"Estadística"}},GRAPH:{COMMON:{LINEAR_SCALE:"Escala lineal",LOGARITHMIC_SCALE:"Escala logarítmica",BTN_SHOW_STATS:"Ver estadísticas",BTN_SHOW_DETAILED_STATS:"Estadísticas detalladas",RANGE_DURATION_DIVIDER:"Unidad de tiempo:",RANGE_DURATION:{HOUR:"Agrupar por <b>horas</b>",DAY:"Agrupar por <b>días</b>",MONTH:"Agrupar por <b>meses</b>"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Número de bloques calculados",BLOCK_COUNT:"{{count}} bloques",NO_BLOCK:"Ningún bloque"}}}}),e.translations("fr-FR",{NETWORK:{VIEW:{BTN_GRAPH:"Statistiques"}},GRAPH:{COMMON:{LINEAR_SCALE:"Echelle linéaire",LOGARITHMIC_SCALE:"Echelle logarithmique",BTN_SHOW_STATS:"Voir les statistiques",BTN_SHOW_DETAILED_STATS:"Statistiques détaillées",RANGE_DURATION_DIVIDER:"Unité de temps :",RANGE_DURATION:{HOUR:"Heure",DAY:"Jour",MONTH:"Mois"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Nombre de blocs calculés",BLOCK_COUNT:"{{count}} blocs",NO_BLOCK:"Aucun bloc"}},DOC_STATS:{TITLE:"Statistiques de stockage",MARKET:{TITLE:"Nombre d'annonces",AD:"Annonces",COMMENT:"Commentaires"},MARKET_DELTA:{TITLE:"Variation du nombre d'annonces",AD:"Annonces",COMMENT:"Commentaires"},USER:{TITLE:"Nombre de documents liés à un compte",USER_PROFILE:"Profils utilisateur",USER_SETTINGS:"Paramètres sauvegardés"},USER_DELTA:{TITLE:"Variation du nombre de documents liés à un compte",USER_PROFILE:"Profils utilisateur",USER_SETTINGS:"Paramètres sauvegardés"},MESSAGE:{TITLE:"Nombre de documents liés à la communication",MESSAGE_INBOX:"Messages en boîte de réception",MESSAGE_OUTBOX:"Messages envoyés sauvegardés",INVITATION_CERTIFICATION:"Invitations à certifier"},SOCIAL:{TITLE:"Nombre de pages ou groupes",PAGE_COMMENT:"Commentaires",PAGE_RECORD:"Pages",GROUP_RECORD:"Groupes"},SUBSCRIPTION:{TITLE:"Nombre d'abonnements",EMAIL:"Notifications emails"},OTHER:{TITLE:"Autres documents",HISTORY_DELETE:"Suppressions de documents"}},SYNCHRO:{TITLE:"Statistiques de synchronisations",COUNT:{TITLE:"Volume synchronisé",INSERTS:"Insertions",UPDATES:"Mises à jour",DELETES:"Suppressions"},PEER:{TITLE:"Noeuds requêtés",ES_USER_API:"Noeuds données utilisateurs",ES_SUBSCRIPTION_API:"Noeuds services en ligne"},PERFORMANCE:{TITLE:"Performances d'exécution",DURATION:"Temps d'exécution (ms)"}}}}),e.translations("it-IT",{NETWORK:{VIEW:{BTN_GRAPH:"Statistiche"}},GRAPH:{COMMON:{LINEAR_SCALE:"Scala lineare",LOGARITHMIC_SCALE:"Scala logaritmica",BTN_SHOW_STATS:"Vedere le statistiche",BTN_SHOW_DETAILED_STATS:"Statistiche dettagliate",RANGE_DURATION_DIVIDER:"Unità di tempo :",RANGE_DURATION:{HOUR:"Ora",DAY:"Giorno",MONTH:"Mese"}},PEER:{VIEW:{BLOCK_COUNT_LABEL:"Numero di blocchi calcolati",BLOCK_COUNT:"{{count}} blocchi",NO_BLOCK:"Nessun blocco"}},DOC_STATS:{TITLE:"Statistiche di stoccaggio",USER:{TITLE:"Numero di documenti legati ad un conto",USER_PROFILE:"Profili dell'utente",USER_SETTINGS:"Impostazioni salvate"},MESSAGE:{TITLE:"Numero di documenti legati alla conversazione",MESSAGE_INBOX:"Messaggi in arrivo",MESSAGE_OUTBOX:"Messaggi inviati salvati",INVITATION_CERTIFICATION:"Invitazioni da certificare"},SOCIAL:{TITLE:"Numero di pagine o gruppi",PAGE_COMMENT:"Commenti",PAGE_RECORD:"Pagine",GROUP_RECORD:"Gruppi"},OTHER:{TITLE:"Altri documenti",HISTORY_DELETE:"Cronologia eliminazione documenti"}},SYNCHRO:{TITLE:"Statistiche di sincronizzazioni",COUNT:{TITLE:"Volume sincronizzato",INSERTS:"Inserimenti",UPDATES:"Aggiornamenti",DELETES:"Eliminazioni"},PEER:{TITLE:"Nodi interrogati",ES_USER_API:"Nodi dati utenti",ES_SUBSCRIPTION_API:"Noeuds servizi online"},PERFORMANCE:{TITLE:"Prestazioni (performance) di esecuzione",DURATION:"Tempo di esecuzione (ms)"}}}}),e.translations("nl-NL",{NETWORK:{VIEW:{BTN_GRAPH:"Statistieken"}},GRAPH:{COMMON:{LINEAR_SCALE:"Lineaire schaal",LOGARITHMIC_SCALE:"Logaritmische schaal",BTN_SHOW_STATS:"Zie statistieken",BTN_SHOW_DETAILED_STATS:"Gedetailleerde statistieken",RANGE_DURATION_DIVIDER:"Stap eenheid:",RANGE_DURATION:{HOUR:"Groep per <b>uur</b>",DAY:"Groep per <b>dag</b>",MONTH:"Groep per <b>maand</b>"}}}}),e.translations("en-GB",{MAP:{COMMON:{SEARCH_DOTS:"Search...",BTN_SHOW_ON_MAP:"SHow on map",CHOOSE_FILE:"Drop a file (svg, geojson)<br/>or click to select"},SHAPE:{EDIT:{TITLE:"Country map",COUNTRY_DOTS:"Country:",COUNTRY_HELP:"Country code (ISO2)",CONFIG_FORM_DIVIDER:"Configuration :",ERROR_DIVIDER:"Detected errors :",LEFT_LNG:"West",RIGHT_LNG:"East",TOP_LAT:"North",BOTTOM_LAT:"South",SCALE:"Scale",TRANSLATE_X:"Translate X",TRANSLATE_Y:"Translate Y",AREA_FORM_DIVIDER:"Area edit:",ID:"Unique identifier",NAME:"Label",POSITION_DOTS:"Position:",ORDER:"Sort order",BTN_APPLY:"Apply",BTN_DELETE:"Delete the area",CUSTOM_PROJECTION:"Manually set projection settings",BTN_TEST_SEARCH:"Test a search on this area",STRICT_MODE:"Compatible with OCG (hand right rule)",REMOVE_HOLE:"Remove holes inside polygons",APPLY_ROUND:"Round to precision:",DEGREES_PRECISION:"Precision (decimal degrees)",INFO:{SAVED:"The map has been saved"},ERROR:{INVALID_SVG:"Bad SVG format.",INVALID_COUNTRY_CODE:"Country code (need ISO2, in lower case)",SAVE_FAILED:"Error while saving map",SELF_INTERSECTION:"Self-intersection in polygon <b>{{id}}</b>",HOLE_LIES_OUTSIDE:"Hole lies outside shell <b>{{id}}</b>",HOLE_NOT_WITHIN_POLYGON:"Invalid hole (not within polygon) <b>{{id}}</b>"}}},WOT:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open map"},VIEW:{TITLE:"Members map",LAYER:{MEMBER:"Members",PENDING:"Pending registrations",WALLET:"Simple wallets"}}},PROFILE:{MARKER_HELP:"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map."},ERROR:{LOCALIZE_ME_FAILED:"Unable to retrieve your current position"}}}),e.translations("en",{MAP:{COMMON:{SEARCH_DOTS:"Search...",BTN_SHOW_ON_MAP:"SHow on map",CHOOSE_FILE:"Drop a file (svg, geojson)<br/>or click to select"},SHAPE:{EDIT:{TITLE:"Country map",COUNTRY_DOTS:"Country:",COUNTRY_HELP:"Country code (ISO2)",CONFIG_FORM_DIVIDER:"Configuration :",ERROR_DIVIDER:"Detected errors :",LEFT_LNG:"West",RIGHT_LNG:"East",TOP_LAT:"North",BOTTOM_LAT:"South",SCALE:"Scale",TRANSLATE_X:"Translate X",TRANSLATE_Y:"Translate Y",AREA_FORM_DIVIDER:"Area edit:",ID:"Unique identifier",NAME:"Label",POSITION_DOTS:"Position:",ORDER:"Sort order",BTN_APPLY:"Apply",BTN_DELETE:"Delete the area",CUSTOM_PROJECTION:"Manually set projection settings",BTN_TEST_SEARCH:"Test a search on this area",STRICT_MODE:"Compatible with OCG (hand right rule)",REMOVE_HOLE:"Remove holes inside polygons",APPLY_ROUND:"Round to precision:",DEGREES_PRECISION:"Precision (decimal degrees)",INFO:{SAVED:"The map has been saved"},ERROR:{INVALID_SVG:"Bad SVG format.",INVALID_COUNTRY_CODE:"Country code (need ISO2, in lower case)",SAVE_FAILED:"Error while saving map",SELF_INTERSECTION:"Self-intersection in polygon <b>{{id}}</b>",HOLE_LIES_OUTSIDE:"Hole lies outside shell <b>{{id}}</b>",HOLE_NOT_WITHIN_POLYGON:"Invalid hole (not within polygon) <b>{{id}}</b>"}}},WOT:{LOOKUP:{BTN_MAP:"Map",BTN_MAP_HELP:"Open map"},VIEW:{TITLE:"Members map",LAYER:{MEMBER:"Members",PENDING:"Pending registrations",WALLET:"Simple wallets"}}},PROFILE:{MARKER_HELP:"<b>Drag and drop</b> this marker to <b>update<br/>your position</b>, or use the buttons<br/>on top of the map."},ERROR:{LOCALIZE_ME_FAILED:"Unable to retrieve your current position"}}}),e.translations("eo-EO",{MAP:{COMMON:{SEARCH_DOTS:"Traserĉi...",BTN_SHOW_ON_MAP:"Vidi surmape",BTN_LOCALIZE_ME:"Lokalizi min",BTN_MOVE_DOWN:"Movi malsupren",BTN_MOVE_UP:"Movi supren",BTN_MOVE_LEFT:"Movi maldekstren",BTN_MOVE_RIGHT:"Movi dekstren",CHOOSE_FILE:"Ŝovmetu vian dosieron (svg, geojson)<br/>aŭ klaku por elekti ĝin"},SHAPE:{EDIT:{TITLE:"Landaj mapoj",COUNTRY_DOTS:"Lando:",COUNTRY_HELP:"Lando-kodo (ISO2)",CONFIG_FORM_DIVIDER:"Agordo:",ERROR_DIVIDER:"Eraroj eltrovitaj:",LEFT_LNG:"Okcidento",RIGHT_LNG:"Oriento",TOP_LAT:"Nordo",BOTTOM_LAT:"Sudo",SCALE:"Skalo",TRANSLATE_X:"X-delokiĝo",TRANSLATE_Y:"Y-delokiĝo",AREA_FORM_DIVIDER:"Eldono de la zono:",ID:"Unika identigilo",NAME:"Nomo",POSITION_DOTS:"Pozicio:",ORDER:"Ordigo-senco",BTN_APPLY:"Apliki",BTN_DELETE:"Forigi la zonon",CUSTOM_PROJECTION:"Mana tajpado de la projekci-parametroj",BTN_TEST_SEARCH:"Testi serĉadon sur tiu ĉi zono",STRICT_MODE:"OCG-kongrueco (regulo de dekstra mano)",REMOVE_HOLE:"Forigi la truojn interne de la poligonoj",APPLY_ROUND:"Rondigi ĝis la precizeco:",DEGREES_PRECISION:"Precizeco (decimalaj gradoj)",INFO:{SAVED:"La mapo estis bone konservita"},ERROR:{INVALID_SVG:"SVG-Formato neĝusta",INVALID_COUNTRY_CODE:"Lando-kodo neĝusta (ISO2 atendata, minuskle)",SAVE_FAILED:"Eraro dum la konservado de la mapo",SELF_INTERSECTION:"Mem-interkruciĝo en la poligono <b>{{id}}</b>",HOLE_LIES_OUTSIDE:"La truo troviĝas ekter la poligono <b>{{id}}</b>",HOLE_NOT_WITHIN_POLYGON:"Truo nevalida (ne en poligono) <b>{{id}}</b>"}}},WOT:{LOOKUP:{BTN_MAP:"Mapo",BTN_MAP_HELP:"Malfermi la mapon pri membroj"},VIEW:{TITLE:"Mapo pri membroj",LAYER:{MEMBER:"Membroj",PENDING:"Aliĝoj atendantaj",WALLET:"Simplaj monujoj"}}},PROFILE:{MARKER_HELP:"<b>Ŝovu-demetu</b> tiun ĉi markilon por <b>aktualigi<br/> vian lokon</b> sur la mapo, aŭ uzu la serĉo-butonon<br/>super la mapo."},ERROR:{LOCALIZE_ME_FAILED:"Neeblas ricevi vian nunan lokon"}}}),e.translations("fr-FR",{MAP:{COMMON:{SEARCH_DOTS:"Rechercher...",BTN_SHOW_ON_MAP:"Voir sur la carte",BTN_LOCALIZE_ME:"Me localiser",BTN_MOVE_DOWN:"Déplacer vers le bas",BTN_MOVE_UP:"Déplacer vers le haut",BTN_MOVE_LEFT:"Déplacer vers la gauche",BTN_MOVE_RIGHT:"Déplacer vers la droite",CHOOSE_FILE:"Déposez votre fichier (svg, geojson)<br/>ou cliquez pour le sélectionner"},SHAPE:{EDIT:{TITLE:"Cartes des pays",COUNTRY_DOTS:"Pays :",COUNTRY_HELP:"Code pays (ISO2)",CONFIG_FORM_DIVIDER:"Configuration :",ERROR_DIVIDER:"Erreurs dectectées :",LEFT_LNG:"Ouest",RIGHT_LNG:"Est",TOP_LAT:"Nord",BOTTOM_LAT:"Sud",SCALE:"Echelle",TRANSLATE_X:"Décalage X",TRANSLATE_Y:"Décalage Y",AREA_FORM_DIVIDER:"Edition de la zone :",ID:"Identifiant unique",NAME:"Libellé",POSITION_DOTS:"Position :",ORDER:"Ordre de tri",BTN_APPLY:"Appliquer",BTN_DELETE:"Supprimer la zone",CUSTOM_PROJECTION:"Saisie manuelle des paramètres de projection",BTN_TEST_SEARCH:"Tester une recherche sur cette zone",STRICT_MODE:"Compatibilité OCG (right-hand rule)",REMOVE_HOLE:"Supprimer les trous intérieurs aux polygones",APPLY_ROUND:"Arrondir à la précision :",DEGREES_PRECISION:"Précision (degrés décimaux)",INFO:{SAVED:"La carte a bien été sauvegardée"},ERROR:{INVALID_SVG:"Format SVG incorrect",INVALID_COUNTRY_CODE:"Code pays incorrect (ISO2 attendu, en minuscule)",SAVE_FAILED:"Erreur lors de la sauvegarde de la carte",SELF_INTERSECTION:"Auto-intersection dans le polygone <b>{{id}}</b>",HOLE_LIES_OUTSIDE:"Le trou se trouve à l'extérieur du polygone <b>{{id}}</b>",HOLE_NOT_WITHIN_POLYGON:"Trou invalide (pas dans un polygone) <b>{{id}}</b>"}}},WOT:{LOOKUP:{BTN_MAP:"Carte",BTN_MAP_HELP:"Ouvrir la carte des membres"},VIEW:{TITLE:"Carte des membres",LAYER:{MEMBER:"Membres",PENDING:"Inscriptions en attente",WALLET:"Simples portefeuilles"}}},PROFILE:{MARKER_HELP:"<b>Glissez-déposez</b> ce marqueur pour <b>mettre<br/>à jour votre position</b>, ou utilisez les boutons<br/>au dessus de la carte."},ERROR:{LOCALIZE_ME_FAILED:"Impossible de récupérer votre position actuelle"}}}),e.translations("en-GB",{MENU:{MARKET:"Ads",MY_RECORDS:"My ads"},MARKET:{COMMON:{PRICE:"Price",BTN_NEW_AD:"New ad",SOLD:"Close ad",LAST_UPDATE:"Last update",AROUND_ME:"Around me",CROWDFUNDING_PROGRESS:"{{pct|formatInteger}}% funded",FREE:"Free",FREE_PRICE:"Free price"},JOIN:{PROFILE:{WARNING:"You now have to complete your user profile.<br/><br/>This is <b>public information</b>, accessible to everyone.",TITLE:"Lastname, Firstname",TITLE_HELP:"Lastname, Firstname or pseudonym",DESCRIPTION:"Abut me",DESCRIPTION_HELP:"Say something about you..."},SUBSCRIPTION:{EMAIL:"Email",EMAIL_HELP:"Email (optional)"},LAST_SLIDE_CONGRATULATION:"You have entered all necessary information: Congratulations!<br/>You can now <b>send the creation request </b>.<br/><br/>For information, the public key below will identify your future account:",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Warning:</b> The identifier and the password can not be changed.<br/><br/>You should <b>always remember it!</b><br/><br/><b>Are you sure</b> you want to continue with these credentials?'},PROFILE:{DEFAULT_TITLE:"User {{pubkey|formatPubkey}}",IDENTITY_RECORDS_TITLE:"User ads"},LOGIN:{HELP:"Please fill your account credentials:",REMEMBER_ME:"Remember me?"},EVENT_LOGIN:{TITLE:"Contact information",HELP:"Please indicate a <b>email or phone number</b>, so that we can contact you during the event:",EMAIL_OR_PHONE:"Email or phone number",EMAIL_OR_PHONE_HELP:"Email or phone number",REMEMBER_ME:"Remember me?",ERROR:{INVALID_USERNAME:"Email or phone number invalid"}},HOME:{BTN_NEW_AD:"Place an ad",BTN_SHOW_MARKET_OFFER:"Explore Ads",LOCATION_LABEL:"Find ads near by:",LOCATION_HELP:"City, Country",ERROR:{GEO_LOCATION_NOT_FOUND:"City or zip code not found"}},CATEGORY:{ALL:"All categories",UNKNOWN:"Unlnown category",EDIT:{TITLE:"Categories management",ID:"Identifier",NAME:"Name",ROOT_CATEGORIES:"Root categories",BTN_ADD:"Add",BTN_REORDER:"Reorder",POPUP:{TITLE_EDIT:"Edit the category",TITLE_NEW:"New category"},CONFIRM:{CANCEL:"Some changes has not been saved.<br/><br/><b>Are you sure</b> you want to continue this operation?"},INFO:{SAVED:"Categories successfully saved"},ERROR:{CANNOT_SAVE:"Erreur lors de la sauvegarde des categories",INVALID_ID_PATTERN:"Format 'catNNN' not respected",ID_ALREADY_USED:"Identifier already in use"}}},SEARCH:{TITLE:"Market",CATEGORY:"Category: ",SEARCH_HELP:"Search (car, sweat...)",BY:"by",BTN_ADD:"New",BTN_CATEGORIES:"Categories",BTN_OPTIONS:"Advanced search",BTN_AROUND_ME:"Around me",GEO_DISTANCE:"Maximum distance around the city",GEO_DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit to {{limit}})",LOCATION:"City",LOCATION_HELP:"City, Country",RESULTS:"Results",RESULT_COUNT_LOCATION:"{{count}} result{{count>0?'s':''}}, near {{location}}",RESULT_COUNT:"{{count}} result{{count>0?'s':''}}",LAST_RECORDS:"Recent ads:",LAST_RECORD_COUNT_LOCATION:"{{count}} recent ad{{count>0?'s':''}}, near {{location}}",LAST_RECORD_COUNT:"{{count}} recent ad{{count>0?'s':''}}",BTN_LAST_RECORDS:"Recent ads",BTN_SHOW_CATEGORIES:"Show categories",BTN_OFFERS:"Offers",BTN_CROWDFUNDING:"Crowdfunding",BTN_FAVORITES:"Favorites",BTN_AUCTION:"Auction",BTN_NEEDS:"Needs",SHOW_CLOSED_RECORD:"Display closed ads?",SHOW_OLD_RECORD:"Display old ads?",RECORD_STOCK:"Stock:",SORT:{PREFIX:"Sort: ",DATE:"Date",PRICE:"Price",DATE_ASC:"Older",DATE_DESC:"Most recent",PRICE_ASC:"Increasing prices",PRICE_DESC:"Descending prices"}},GALLERY:{TITLE:"Slideshow",BTN_START:"Start",BTN_CONTINUE:"Resume",BTN_PAUSE:"Pause",BTN_STOP:"Stop",SLIDE_DURATION:"Display time:",AD_TYPE:"Ad type:",ALL_AD_TYPES:"All",SLIDE_DURATION_OPTION:"{{value}} seconds"},VIEW:{TITLE:"Ad",BTN_SOLD_AD:"Close the ad",BTN_SOLD:"Close",BTN_REOPEN:"Reopen the ad",BTN_WRITE:"Write a message",BTN_FOLLOW:"Follow this ad",BTN_STOP_FOLLOW:"Stop following this ad",BTN_PAYMENT_HELP:"How to make a payment?",MENU_TITLE:"Options",RECORD_FEES_PARENTHESIS:"(fees)",RECORD_STOCK:"Available stock:",POPOVER_SHARE_TITLE:"Ad {{title}}",REMOVE_CONFIRMATION:"Are you sure you want to delete this ad?<br/><br/> This is irreversible.",SOLD_CONFIRMATION:"<b>Are you sure</b> you want to close this ad?",REOPEN_CONFIRMATION:"<b>Are you sure</b> you want to repoen this ad?",NEW_MESSAGE_TITLE:'About your ad "{{title}}"...',MORE_LIKE_THIS:"This might interest you:",PAYMENT:'<b> To make a payment </b>, send {{currency | abbreviate}}:<ul><li> - to the public key <a class="positive" copy-on-click="{{pubkeyWithChecksum || pubkey}} "title="Copy key">{{pubkey}}</a></li></p>',PAYMENT_WITH_COMMENT:'<b> To make a payment </b>, send {{currency | abbreviate}}:<ul><li> - to the public key <a class="positive" copy-on-click="{{pubkeyWithChecksum || pubkey}} "title="Copy key">{{pubkey}}</a></li>- with the comment <a class="positive" copy-on-click="{{comment}}" title="Copy the comment">{{comment}}</a> for monitoring.</li></p>',CROWDFUNDING_ISSUERS:"{{issuers.length}} donor{{issuers.length > 1 ? 's' : ''}}",SHOW_CROWDFUNDING_ISSUERS:"Show donors"},WALLET:{DUNITER_PUBKEY:"Public key to receive payments",DUNITER_ACCOUNT:"Receipt of payments in {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"The public key (above) indicates the destination of the payments you will receive.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"No public account key has been entered. You will need to give it to prospective buyers.<br/>You can enter it at any time, <b>by editing your profile</b>."},TYPE:{TITLE:"New ad",SELECT_TYPE:"Kind of ad:",OFFER:"Offer",OFFER_SHORT:"Offer",CROWDFUNDING:"Crowdfunding",CROWDFUNDING_SHORT:"Crowdfunding",NEED:"Need",NEED_SHORT:"Need",AUCTION:"Auction",AUCTION_SHORT:"Auction"},LOCAL_SALE:{LOCATION:"Stand number",LOCATION_HELP:"Stand number: 1, 2, ...",LOCATION_PREFIX:"Stand #"},EDIT:{TITLE:"Edit",RECORD_TITLE:"Title",RECORD_TITLE_HELP:"Title",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description",RECORD_LOCATION:"Address",RECORD_LOCATION_HELP:"City, Country",RECORD_PRICE:"Price",RECORD_PRICE_HELP:"Price (optional)",FREE_PRICE:"Free price ?",RECORD_CURRENCY:"Currency",RECORD_FEES:"Fees",RECORD_FEES_HELP:"Fees (optional)",RECORD_STOCK:"Available stock",RECORD_STOCK_HELP:"Available stock",AUCTION:{TITLE_NEW:"New auction",START_PRICE_HELP:"Starting price (optional)"},OFFER:{TITLE_NEW:"New ad"},NEED:{TITLE_NEW:"Nouvelle demande",MAX_PRICE_HELP:"Prix maximum (optionnel)"},CROWDFUNDING:{TITLE_NEW:"New crowdfunding campaign",TITLE_HELP:"Campaign title",DESCRIPTION_HELP:"Description: Describe your project here",PRICE_HELP:"Expected amount"},WARNING:{NO_GEO_POINT:"Your ad <b>will not be visible</b> in spatial searches."}},WOT:{VIEW:{BTN_RECORDS:"Ads",DUNITER_PUBKEY:"Public key to receive payments",DUNITER_ACCOUNT:"Receipt of payments in {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"The public key (above) is the account to be used to pay for this user.",DUNITER_ACCOUNT_HELP_ASK_USER:'This user has not communicated their account public key. <a ng-click="showNewMessageModal()">Contact him</a> to get it.'},ERROR:{FAILED_STAR_PROFILE:"Error sending your rate. Please try again later."}},PAYMENT:{MODAL:{TITLE:"Make a payment",SOFTWARE_HELP:'Don\'t know <b> how to send {{currency | abbreviate}}?</b><ul><li> - <a ng-click="openHelpSite($event)"> Consult the user forum;</a><li> - Install compatible software: <a ng-click="openLink($event,\'https://cesium.app\')"> Cesium </a> (Linux, Windows, Mac), Silkaj (Linux) or Sakia (Linux).</li>',PAYMENT_LINK_HELP:"Payment links (bêta) :"}},ERROR:{INVALID_LOGIN_CREDENTIALS:"Invalid credentials.<br/>Please try again.",FAILED_SAVE_RECORD:"Saving ad failed",FAILED_UPDATE_RECORD:"Updating Ad failed",LOAD_CATEGORY_FAILED:"Loading categories failed",LOOKUP_RECORDS_FAILED:"Error while loading records.",LOAD_RECORD_FAILED:"Loading ad failed",REMOVE_RECORD_FAILED:"Deleting ad failed",SOLD_RECORD_FAILED:"Error while closing the ad",REOPEN_RECORD_FAILED:"Error while reopening the ad",FAILED_SAVE_COMMENT:"Saving comment failed",FAILED_REMOVE_COMMENT:"Deleting comment failed",RECORD_NOT_EXISTS:"Ad not found",RECORD_EXCEED_UPLOAD_SIZE:"It seems that your <b> ad is too big </ b> to be accepted by the data node.<br/><br/>You can delete <b>delete photos</b> again.",GEO_LOCATION_NOT_FOUND:"City or zip code not found"},INFO:{RECORD_REMOVED:"Ad successfully deleted",RECORD_SOLD:"Ad closed",RECORD_REOPEN:"Ad reopen"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on your ad: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his/her comment on your ad: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has replied to your comment on the ad: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his/her answer to your comment on the ad: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his/her comment on the ad: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> added the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> updated the ad: <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> sold the ad: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> asks for moderation on the ad: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> posted an ad to moderate: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span>reported abuse on your ad: <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> liked your ad: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> follows your ad: <b>{{params[2]}}</b>'}}}),e.translations("en",{MENU:{MARKET:"Ads",MY_RECORDS:"My ads"},MARKET:{COMMON:{PRICE:"Price",BTN_NEW_AD:"New ad",SOLD:"Close ad",LAST_UPDATE:"Last update",AROUND_ME:"Around me",CROWDFUNDING_PROGRESS:"{{pct|formatInteger}}% funded",FREE:"Free",FREE_PRICE:"Free price"},JOIN:{PROFILE:{WARNING:"You now have to complete your user profile.<br/><br/>This is <b>public information</b>, accessible to everyone.",TITLE:"Lastname, Firstname",TITLE_HELP:"Lastname, Firstname or pseudonym",DESCRIPTION:"Abut me",DESCRIPTION_HELP:"Say something about you..."},SUBSCRIPTION:{EMAIL:"Email",EMAIL_HELP:"Email (optional)"},LAST_SLIDE_CONGRATULATION:"You have entered all necessary information: Congratulations!<br/>You can now <b>send the creation request </b>.<br/><br/>For information, the public key below will identify your future account:",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Warning:</b> The identifier and the password can not be changed.<br/><br/>You should <b>always remember it!</b><br/><br/><b>Are you sure</b> you want to continue with these credentials?'},PROFILE:{DEFAULT_TITLE:"User {{pubkey|formatPubkey}}",IDENTITY_RECORDS_TITLE:"User ads"},LOGIN:{HELP:"Please fill your account credentials:",REMEMBER_ME:"Remember me?"},EVENT_LOGIN:{TITLE:"Contact information",HELP:"Please indicate a <b>email or phone number</b>, so that we can contact you during the event:",EMAIL_OR_PHONE:"Email or phone number",EMAIL_OR_PHONE_HELP:"Email or phone number",REMEMBER_ME:"Remember me?",ERROR:{INVALID_USERNAME:"Email or phone number invalid"}},HOME:{BTN_NEW_AD:"Place an ad",BTN_SHOW_MARKET_OFFER:"Explore Ads",LOCATION_LABEL:"Find ads near by:",LOCATION_HELP:"City, Country",ERROR:{GEO_LOCATION_NOT_FOUND:"City or zip code not found"}},CATEGORY:{ALL:"All categories",UNKNOWN:"Unlnown category",EDIT:{TITLE:"Categories management",ID:"Identifier",NAME:"Name",ROOT_CATEGORIES:"Root categories",BTN_ADD:"Add",BTN_REORDER:"Reorder",POPUP:{TITLE_EDIT:"Edit the category",TITLE_NEW:"New category"},CONFIRM:{CANCEL:"Some changes has not been saved.<br/><br/><b>Are you sure</b> you want to continue this operation?"},INFO:{SAVED:"Categories successfully saved"},ERROR:{CANNOT_SAVE:"Erreur lors de la sauvegarde des categories",INVALID_ID_PATTERN:"Format 'catNNN' not respected",ID_ALREADY_USED:"Identifier already in use"}}},SEARCH:{TITLE:"Market",CATEGORY:"Category: ",SEARCH_HELP:"Search (car, sweat...)",BY:"by",BTN_ADD:"New",BTN_CATEGORIES:"Categories",BTN_OPTIONS:"Advanced search",BTN_AROUND_ME:"Around me",GEO_DISTANCE:"Maximum distance around the city",GEO_DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SHOW_MORE:"Show more",SHOW_MORE_COUNT:"(current limit to {{limit}})",LOCATION:"City",LOCATION_HELP:"City, Country",RESULTS:"Results",RESULT_COUNT_LOCATION:"{{count}} result{{count>0?'s':''}}, near {{location}}",RESULT_COUNT:"{{count}} result{{count>0?'s':''}}",LAST_RECORDS:"Recent ads:",LAST_RECORD_COUNT_LOCATION:"{{count}} recent ad{{count>0?'s':''}}, near {{location}}",LAST_RECORD_COUNT:"{{count}} recent ad{{count>0?'s':''}}",BTN_LAST_RECORDS:"Recent ads",BTN_SHOW_CATEGORIES:"Show categories",BTN_OFFERS:"Offers",BTN_CROWDFUNDING:"Crowdfunding",BTN_FAVORITES:"Favorites",BTN_AUCTION:"Auction",BTN_NEEDS:"Needs",SHOW_CLOSED_RECORD:"Display closed ads?",SHOW_OLD_RECORD:"Display old ads?",RECORD_STOCK:"Stock:",SORT:{PREFIX:"Sort: ",DATE:"Date",PRICE:"Price",DATE_ASC:"Older",DATE_DESC:"Most recent",PRICE_ASC:"Increasing prices",PRICE_DESC:"Descending prices"}},GALLERY:{TITLE:"Slideshow",BTN_START:"Start",BTN_CONTINUE:"Resume",BTN_PAUSE:"Pause",BTN_STOP:"Stop",SLIDE_DURATION:"Display time:",AD_TYPE:"Ad type:",ALL_AD_TYPES:"All",SLIDE_DURATION_OPTION:"{{value}} seconds"},VIEW:{TITLE:"Ad",BTN_SOLD_AD:"Close the ad",BTN_SOLD:"Close",BTN_REOPEN:"Reopen the ad",BTN_WRITE:"Write a message",BTN_FOLLOW:"Follow this ad",BTN_STOP_FOLLOW:"Stop following this ad",BTN_PAYMENT_HELP:"How to make a payment?",MENU_TITLE:"Options",RECORD_FEES_PARENTHESIS:"(fees)",RECORD_STOCK:"Available stock:",POPOVER_SHARE_TITLE:"Ad {{title}}",REMOVE_CONFIRMATION:"Are you sure you want to delete this ad?<br/><br/> This is irreversible.",SOLD_CONFIRMATION:"<b>Are you sure</b> you want to close this ad?",REOPEN_CONFIRMATION:"<b>Are you sure</b> you want to repoen this ad?",NEW_MESSAGE_TITLE:'About your ad "{{title}}"...',MORE_LIKE_THIS:"This might interest you:",PAYMENT:'<b> To make a payment </b>, send {{currency | abbreviate}}:<ul><li> - to the public key <a class="positive" copy-on-click="{{pubkeyWithChecksum || pubkey}} "title="Copy key">{{pubkey}}</a></li></p>',PAYMENT_WITH_COMMENT:'<b> To make a payment </b>, send {{currency | abbreviate}}:<ul><li> - to the public key <a class="positive" copy-on-click="{{pubkeyWithChecksum || pubkey}} "title="Copy key">{{pubkey}}</a></li>- with the comment <a class="positive" copy-on-click="{{comment}}" title="Copy the comment">{{comment}}</a> for monitoring.</li></p>',CROWDFUNDING_ISSUERS:"{{issuers.length}} donor{{issuers.length > 1 ? 's' : ''}}",SHOW_CROWDFUNDING_ISSUERS:"Show donors"},WALLET:{DUNITER_PUBKEY:"Public key to receive payments",DUNITER_ACCOUNT:"Receipt of payments in {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"The public key (above) indicates the destination of the payments you will receive.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"No public account key has been entered. You will need to give it to prospective buyers.<br/>You can enter it at any time, <b>by editing your profile</b>."},TYPE:{TITLE:"New ad",SELECT_TYPE:"Kind of ad:",OFFER:"Offer",OFFER_SHORT:"Offer",CROWDFUNDING:"Crowdfunding",CROWDFUNDING_SHORT:"Crowdfunding",NEED:"Need",NEED_SHORT:"Need",AUCTION:"Auction",AUCTION_SHORT:"Auction"},LOCAL_SALE:{LOCATION:"Stand number",LOCATION_HELP:"Stand number: 1, 2, ...",LOCATION_PREFIX:"Stand #"},EDIT:{TITLE:"Edit",RECORD_TITLE:"Title",RECORD_TITLE_HELP:"Title",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description",RECORD_LOCATION:"Address",RECORD_LOCATION_HELP:"City, Country",RECORD_PRICE:"Price",RECORD_PRICE_HELP:"Price (optional)",FREE_PRICE:"Free price ?",RECORD_CURRENCY:"Currency",RECORD_FEES:"Fees",RECORD_FEES_HELP:"Fees (optional)",RECORD_STOCK:"Available stock",RECORD_STOCK_HELP:"Available stock",AUCTION:{TITLE_NEW:"New auction",START_PRICE_HELP:"Starting price (optional)"},OFFER:{TITLE_NEW:"New ad"},NEED:{TITLE_NEW:"Nouvelle demande",MAX_PRICE_HELP:"Prix maximum (optionnel)"},CROWDFUNDING:{TITLE_NEW:"New crowdfunding campaign",TITLE_HELP:"Campaign title",DESCRIPTION_HELP:"Description: Describe your project here",PRICE_HELP:"Expected amount"},WARNING:{NO_GEO_POINT:"Your ad <b>will not be visible</b> in spatial searches."}},WOT:{VIEW:{BTN_RECORDS:"Ads",DUNITER_PUBKEY:"Public key to receive payments",DUNITER_ACCOUNT:"Receipt of payments in {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"The public key (above) is the account to be used to pay for this user.",DUNITER_ACCOUNT_HELP_ASK_USER:'This user has not communicated their account public key. <a ng-click="showNewMessageModal()">Contact him</a> to get it.'},ERROR:{FAILED_STAR_PROFILE:"Error sending your rate. Please try again later."}},PAYMENT:{MODAL:{TITLE:"Make a payment",SOFTWARE_HELP:'Don\'t know <b> how to send {{currency | abbreviate}}?</b><ul><li> - <a ng-click="openHelpSite($event)"> Consult the user forum;</a><li> - Install compatible software: <a ng-click="openLink($event,\'https://cesium.app\')"> Cesium </a> (Linux, Windows, Mac), Silkaj (Linux) or Sakia (Linux).</li>',PAYMENT_LINK_HELP:"Payment links (bêta) :"}},ERROR:{INVALID_LOGIN_CREDENTIALS:"Invalid credentials.<br/>Please try again.",FAILED_SAVE_RECORD:"Saving ad failed",FAILED_UPDATE_RECORD:"Updating Ad failed",LOAD_CATEGORY_FAILED:"Loading categories failed",LOOKUP_RECORDS_FAILED:"Error while loading records.",LOAD_RECORD_FAILED:"Loading ad failed",REMOVE_RECORD_FAILED:"Deleting ad failed",SOLD_RECORD_FAILED:"Error while closing the ad",REOPEN_RECORD_FAILED:"Error while reopening the ad",FAILED_SAVE_COMMENT:"Saving comment failed",FAILED_REMOVE_COMMENT:"Deleting comment failed",RECORD_NOT_EXISTS:"Ad not found",RECORD_EXCEED_UPLOAD_SIZE:"It seems that your <b> ad is too big </ b> to be accepted by the data node.<br/><br/>You can delete <b>delete photos</b> again.",GEO_LOCATION_NOT_FOUND:"City or zip code not found"},INFO:{RECORD_REMOVED:"Ad successfully deleted",RECORD_SOLD:"Ad closed",RECORD_REOPEN:"Ad reopen"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on your ad: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his/her comment on your ad: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has replied to your comment on the ad: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his/her answer to your comment on the ad: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has commented on the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> has modified his/her comment on the ad: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> added the ad: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> updated the ad: <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> sold the ad: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> asks for moderation on the ad: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> posted an ad to moderate: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span>reported abuse on your ad: <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> liked your ad: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> follows your ad: <b>{{params[2]}}</b>'}}}),e.translations("eo-EO",{MENU:{MARKET:"Anoncoj",MY_RECORDS:"Miaj anoncoj"},MARKET:{COMMON:{PRICE:"Prezo",BTN_NEW_AD:"Mi metas anoncon",SOLD:"Anonco fermita",LAST_UPDATE:"Lasta ĝisdatigo",AROUND_ME:"Ĉirkaŭ mi",CROWDFUNDING_PROGRESS:"Financita ĝis {{pct|formatInteger}} %",FREE:"Senpaga",FREE_PRICE:"Prezo libera"},JOIN:{PROFILE:{WARNING:"Nun restas al vi kompletigi vian uzant-profilon.<br/><br/>Temas pri <b>publikaj informoj</b>, alireblaj de ĉiuj.",TITLE:"Familia nomo, Persona nomo",TITLE_HELP:"Familia nomo, Persona nomo aŭ pseŭdonimo",DESCRIPTION:"Pri mi",DESCRIPTION_HELP:"Diru ion pri vi..."},SUBSCRIPTION:{EMAIL:"Retadreso",EMAIL_HELP:"Retadreso (nedeviga)"},LAST_SLIDE_CONGRATULATION:"Vi tajpis ĉiujn necesajn informojn: Gratulon!<br/>Vi nun povas <b>sendi la peton pri kreado</b> de konto.<br/><br/>Ne forgesu viajn identigilojn, vi ne povos ŝanĝi ilin!",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Averto:</b> la identigilo kaj la pasvorto ne plu povos esti modifitaj.<br/><br/><b>Certiĝu, ke vi ĉiam rememoros ilin!</b><br/><br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi per tiuj identigiloj?'},PROFILE:{DEFAULT_TITLE:"Uzanto {{pubkey|formatPubkey}}",IDENTITY_RECORDS_TITLE:"Uzanto-anoncoj"},LOGIN:{HELP:"Bonvolu tajpi viajn identigilojn por konektiĝi:",REMEMBER_ME:"Memori min?"},EVENT_LOGIN:{TITLE:"Kontakteblecoj",HELP:"Bonvolu indiki <b>retadreson aŭ poŝtelefon-numeron</b>, tiel ke la organizantoj povu kontakti vin dum la evento:",EMAIL_OR_PHONE:"Retadreso aŭ telefono",EMAIL_OR_PHONE_HELP:"Retadreso aŭ telefon-numero",REMEMBER_ME:"Memori min?",ERROR:{INVALID_USERNAME:"Retadreso aŭ telefon-numero nevalida"}},HOME:{BTN_NEW_AD:"Meti anoncon",BTN_SHOW_MARKET_OFFER:"Vidi la anoncojn",LOCATION_LABEL:"Serĉado de anoncoj laŭ urbo:",LOCATION_HELP:"Poŝt-kodo, Urbo",ERROR:{GEO_LOCATION_NOT_FOUND:"Urbo aŭ poŝt-kodo ne trovita"}},CATEGORY:{ALL:"Ĉiuj kategorioj",UNKNOWN:"Kategorio nekonata",EDIT:{TITLE:"Mastrumado de la kategorioj",ID:"Identigilo",NAME:"Nomo",ROOT_CATEGORIES:"Supraj kategorioj",BTN_ADD:"Aldoni",BTN_REORDER:"Reordigi",POPUP:{TITLE_EDIT:"Modifi la kategorion",TITLE_NEW:"Nova kategorio"},CONFIRM:{CANCEL:"Iuj modifoj ne estis registritaj.<br/><br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi tiun ĉi agon?"},INFO:{SAVED:"Kategorioj sukcese registritaj"},ERROR:{CANNOT_SAVE:"Eraro dum la konservado de la kategorioj",INVALID_ID_PATTERN:"Nekonforma al la formato 'catNNN'",ID_ALREADY_USED:"Identigilo jam uzata"}}},SEARCH:{TITLE:"Anoncoj",CATEGORY:"Kategorio: ",SEARCH_HELP:"Serĉado (biciklo, ŝuoj...)",BY:"de",BTN_ADD:"Nova",BTN_CATEGORIES:"Kategorioj",BTN_OPTIONS:"Detala serĉado",BTN_AROUND_ME:"Ĉirkaŭ mi",GEO_DISTANCE:"Maksimuma distanco ĉirkaŭ la urbo:",GEO_DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SHOW_MORE:"Afiŝi pli",SHOW_MORE_COUNT:"(nuna limo je {{limit}})",LOCATION:"Urbo",LOCATION_HELP:"Poŝt-kodo, Urbo",RESULTS:"Rezultoj",RESULT_COUNT_LOCATION:"{{count}} rezulto{{count>0?'j':''}}, proksime de {{location}}",RESULT_COUNT:"{{count}} rezulto{{count>0?'j':''}}",LAST_RECORDS:"Lastaj anoncoj",LAST_RECORD_COUNT_LOCATION:"{{count}} freŝdata{{count>0?'j':''}} anonco{{count>0?'j':''}}, proksime de {{location}}",LAST_RECORD_COUNT:"{{count}} freŝdata{{count>0?'j':''}} anonco{{count>0?'j':''}}",BTN_LAST_RECORDS:"Lastaj anoncoj",BTN_SHOW_CATEGORIES:"Trarigardi la kategoriojn",BTN_OFFERS:"Proponoj",BTN_CROWDFUNDING:"Financadoj",BTN_FAVORITES:"Preferoj",BTN_AUCTION:"Aŭkcioj",BTN_NEEDS:"Petoj",SHOW_CLOSED_RECORD:"Afiŝi la fermitajn anoncojn?",SHOW_OLD_RECORD:"Afiŝi la malnovajn anoncojn?",RECORD_STOCK:"Stoko:",SORT:{PREFIX:"Ordigo: ",DATE:"Dato",PRICE:"Prezo",DATE_ASC:"Pli malnovaj",DATE_DESC:"Pli freŝdataj",PRICE_ASC:"Kreskantaj prezoj",PRICE_DESC:"Malkreskantaj prezoj"}},GALLERY:{TITLE:"Bildaro",BTN_START:"Komenci",BTN_CONTINUE:"Malpaŭzi",BTN_PAUSE:"Paŭzi",BTN_STOP:"Ĉesi",SLIDE_DURATION:"Afiŝo-daŭro:",AD_TYPE:"Anonco-tipo:",ALL_AD_TYPES:"Ĉiuj",SLIDE_DURATION_OPTION:"{{value}} sekundoj"},VIEW:{TITLE:"Anonco",BTN_SOLD_AD:"Fermi la anoncon",BTN_SOLD:"Fermi",BTN_REOPEN:"Reaperigi la anoncon",BTN_WRITE:"Skribi mesaĝon",BTN_FOLLOW:"Sekvi tiun ĉi anoncon",BTN_STOP_FOLLOW:"Ne plu sekvi tiun ĉi anoncon",BTN_PAYMENT_HELP:"Kiel fari pagon?",MENU_TITLE:"Kromeblecoj",RECORD_FEES_PARENTHESIS:"(kostoj)",RECORD_STOCK:"Stoko disponebla:",POPOVER_SHARE_TITLE:"Anonco {{title}}",REMOVE_CONFIRMATION:"Ĉu vi certas, ke vi volas forigi tiun ĉi anoncon?<br/><br/>Tiu ago estas neinversigebla.",SOLD_CONFIRMATION:"<b>Ĉu vi certas</b>, ke vi volas fermi tiun ĉi anoncon?",REOPEN_CONFIRMATION:"<b>Ĉu vi certas</b>, ke vi volas reaperigi tiun ĉi anoncon?",NEW_MESSAGE_TITLE:'Pri la anonco "{{title}}"...',MORE_LIKE_THIS:"Tio ĉi povus interesi vin:",PAYMENT:'<b>Por fari pagon</b>, sendi monon {{currency|abbreviate}}:<ul><li>- al la publika ŝlosilo <a class="positive" copy-on-click="{{pubkeyWithChecksum||pubkey}}" title="Kopii la ŝlosilon">{{pubkey}}</a></li></p>',PAYMENT_WITH_COMMENT:'<b>Por fari pagon</b>, sendi monon {{currency|abbreviate}}:<ul><li>- al la publika ŝlosilo <a class="positive" copy-on-click="{{pubkeyWithChecksum||pubkey}}" title="Kopii la ŝlosilon">{{pubkey}}</a></li><li> - kun la komento <a class="positive" copy-on-click="{{comment}}" title="Kopii la komenton">{{comment}}</a> por la sekvado.</li></ul></p>',CROWDFUNDING_ISSUERS:"{{issuers.length}} donacinto{{issuers.length > 1 ? 'j': ''}}",SHOW_CROWDFUNDING_ISSUERS:"Vidi la donacintojn"},WALLET:{DUNITER_PUBKEY:"Publika ŝlosilo por ricevi la pagojn",DUNITER_ACCOUNT:"Ricevo de la pagoj en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La publika ŝlosilo (ĉi-supre) indikas la celkonton de la pagoj, kiujn vi ricevos.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"Neniu publika ŝlosilo de konto estis sciigita. Vi devos doni ĝin al la eventualaj aĉetontoj.<br/>Vi povas tajpi ĝin iam ajn, <b>redaktante vian profilon</b>."},TYPE:{TITLE:"Nova anonco",SELECT_TYPE:"Tipo de anonco:",OFFER:"Propono, Vendo",OFFER_SHORT:"Propono",CROWDFUNDING:"Multpersona financado",CROWDFUNDING_SHORT:"Financado",NEED:"Peto, Serĉo",NEED_SHORT:"Peto",AUCTION:"Aŭkcia vendado",AUCTION_SHORT:"Aŭkcio"},LOCAL_SALE:{LOCATION:"Numero de budo",LOCATION_HELP:"Numero de budo: 1, 2, ...",LOCATION_PREFIX:"Budo n°"},EDIT:{TITLE:"Redaktado",RECORD_TITLE:"Titolo",RECORD_TITLE_HELP:"Titolo: biciklo, libro...",RECORD_DESCRIPTION:"Priskribo",RECORD_DESCRIPTION_HELP:"Priskribo",RECORD_LOCATION:"Urbo",RECORD_LOCATION_HELP:"Poŝt-kodo, Urbo",RECORD_PRICE:"Prezo",RECORD_PRICE_HELP:"Prezo (nedeviga)",FREE_PRICE:"Libera prezo?",RECORD_CURRENCY:"Mono",RECORD_FEES:"Sendo-kostoj",RECORD_FEES_HELP:"Kostoj (nedeviga)",RECORD_STOCK:"Stoko disponebla",RECORD_STOCK_HELP:"Stoko disponebla",AUCTION:{TITLE_NEW:"Nova aŭkcio",START_PRICE_HELP:"Komenca prezo (nedeviga)"},OFFER:{TITLE_NEW:"Nova anonco"},NEED:{TITLE_NEW:"Nova peto",MAX_PRICE_HELP:"Maksimuma prezo (nedeviga)"},CROWDFUNDING:{TITLE_NEW:"Nova financada kampanjo",TITLE_HELP:"Titolo de la kampanjo",DESCRIPTION_HELP:"Priskribo: detaligu vian projekton ĉi tie",PRICE_HELP:"Sumo dezirata"},WARNING:{NO_GEO_POINT:"Via anonco <b>ne estos videbla</b> dum la geografiaj serĉadoj."}},WOT:{VIEW:{BTN_RECORDS:"Anoncoj",DUNITER_PUBKEY:"Publika ŝlosilo por ricevi la pagojn",DUNITER_ACCOUNT:"Ricevo de la pagoj en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La publika ŝlosilo (ĉi-supre) rilatas al la konto uzota por pagi tiun ĉi anoncanton.",DUNITER_ACCOUNT_HELP_ASK_USER:'Tiu ĉi anoncanto ne sciigis la publikan ŝlosilon de sia konto. <a ng-click="showNewMessageModal()">Kontaktu lin/ŝin</a> por ekhavi ĝin.'},ERROR:{FAILED_STAR_PROFILE:"Eraro dum la sendo de via noto. Bonvolu reprovi pli poste."}},PAYMENT:{MODAL:{TITLE:"Fari pagon",SOFTWARE_HELP:'Vi ne scias <b>kiel sendi monon {{currency|abbreviate}}?</b><ul><li>- <a ng-click="openHelpSite($event)">Konsulti la forumon por uzantoj;</a><li>- Instali kongruan programon: <a ng-click="openLink($event, \'https://cesium.app/eo/\')">Cesium</a> (Linukso, Vindozo, Makintoŝo), Silkaj (Linukso) aŭ Sakia (Linukso).</li>',PAYMENT_LINK_HELP:"Ligoj por pago (provaĵo):"}},ERROR:{INVALID_LOGIN_CREDENTIALS:"Identigilo aŭ pasvorto nevalida.<br/><br/>Kontrolu, ke ili ja rilatas al konto <b>kreita ĉe ğchange</b>.",FAILED_SAVE_RECORD:"Eraro dum la registrado de la anonco",FAILED_UPDATE_RECORD:"Eraro dum la ĝisdatigo de la anonco",LOAD_CATEGORY_FAILED:"Eraro dum la ekstarigo de la kategorioj",LOOKUP_RECORDS_FAILED:"Eraro dum la disvolviĝo de la serĉado",LOAD_RECORD_FAILED:"Eraro dum la ŝarĝado de la anonco",REMOVE_RECORD_FAILED:"Eraro dum la forigo de la anonco",SOLD_RECORD_FAILED:"Eraro dum la fermo de la anonco",REOPEN_RECORD_FAILED:"Eraro dum la reaperigo de la anonco",FAILED_SAVE_COMMENT:"Eraro dum la konservo de la komento",FAILED_REMOVE_COMMENT:"Eraro dum la forigo de la komento",RECORD_NOT_EXISTS:"Anonco neekzistanta",RECORD_EXCEED_UPLOAD_SIZE:"Ŝajnas, ke via anonco <b>estas tro ampleksa</b> por esti akceptata de la daten-nodo.<br/><br/>Vi povas ekzemple <b>forigi fotojn</b>, kaj poste provi denove.",GEO_LOCATION_NOT_FOUND:"Urbo aŭ post-kodo ne trovita"},INFO:{RECORD_REMOVED:"Anonco forigita",RECORD_SOLD:"Anonco fermita",RECORD_REOPEN:"Anonco reaperigita"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> komentis vian anoncon: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis sian komenton ĉe via anonco: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> respondis al via komento ĉe la anonco: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis la respondon al via komento ĉe la anonco: <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> komentis la anoncon: <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis sian komenton ĉe la anonco: <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> aldonis la anoncon: <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> modifis la anoncon: <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> fermis la anoncon: <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> petas de vi moderigon ĉe la anonco: <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> atentigis pri anonco moderiginda: <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> atentigis pri via anonco: <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ŝatis vian anoncon: <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> sekvas vian anoncon: <b>{{params[2]}}</b>'}}}),e.translations("es-ES",{EVENT:{MARKET:{ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha reportardo su anuncio : <b>{{params[2]}}</b>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha reportado un anuncio para moderar : <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha cerrado el anuncio : <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha añadido el anuncio : <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha comentado el anuncio : <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> sigue su anuncio : <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha modificado el anuncio : <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha modificado su comentario en el anuncio : <b>{{params[2]}}</b>',LIKE_RECEIVED:'A <span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> le ha gustado su anuncio : <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> os pide moderación sobre el anuncio : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha comentado su anuncio : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha modificado su comentario sobre su anuncio : <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha contestado a su comentario sobre el anuncio : <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> ha modificado la repuesta a su comentario sobre el anuncio : <b>{{params[2]}}</b>'}},MARKET:{CATEGORY:{ALL:"Todas las categorías",EDIT:{BTN_ADD:"Añadir",BTN_REORDER:"Reordenar",CONFIRM:{CANCEL:"Las modificaciones no han sido guardadas.<br/><br/>¿<b>Desea</b> continuar con esta operación?"},ERROR:{CANNOT_SAVE:"Error al guardar las categorías",ID_ALREADY_USED:"Identificador ya utilizado",INVALID_ID_PATTERN:"Formato 'catNNN' no respetado"},ID:"Identificador",INFO:{SAVED:"Categorías guardadas con éxito"},NAME:"Edición",POPUP:{TITLE_EDIT:"Modificar la categoría",TITLE_NEW:"Nueva categoría"},ROOT_CATEGORIES:"Categorias superiores",TITLE:"Gestión de las categorias"},UNKNOWN:"Categoriá desconocida"},COMMON:{PRICE:"Precio",BTN_NEW_AD:"Poner un anuncio",SOLD:"Cerrar anuncio",LAST_UPDATE:"Última actualización",AROUND_ME:"Alrededor mío",CROWDFUNDING_PROGRESS:"Financiado al {{pct|formatInteger}} %",FREE:"Gratuito",FREE_PRICE:"Precio libre"},EDIT:{TITLE:"Edición",RECORD_TITLE:"Título",RECORD_TITLE_HELP:"Título",RECORD_DESCRIPTION:"Descripción",RECORD_DESCRIPTION_HELP:"Descripción",RECORD_LOCATION:"Dirección",RECORD_LOCATION_HELP:"Ciudad, País",RECORD_PRICE:"Precio",RECORD_PRICE_HELP:"Precio (opcional)",FREE_PRICE:"¿Precio libre?",RECORD_CURRENCY:"Moneda",RECORD_FEES:"Gastos de envío",RECORD_FEES_HELP:"Gastos de envío (opcional)",RECORD_STOCK:"Stock disponible",RECORD_STOCK_HELP:"Stock disponible",AUCTION:{TITLE_NEW:"Nueva subasta",START_PRICE_HELP:"Precio inicial (opcional)"},OFFER:{TITLE_NEW:"Anuncio nuevo"},NEED:{TITLE_NEW:"Nouvelle demande",MAX_PRICE_HELP:"Precio máximo (opcional)"},CROWDFUNDING:{TITLE_NEW:"Nueva campaña de crowdfunding",TITLE_HELP:"Título de la campaña",DESCRIPTION_HELP:"Descripción: Describa su proyecto aquí",PRICE_HELP:"Cantidad necesitada"},WARNING:{NO_GEO_POINT:"Su anuncio <b> no será visible </b> en búsquedas espaciales."}},ERROR:{GEO_LOCATION_NOT_FOUND:"Localidad o código postal no encontrados",RECORD_EXCEED_UPLOAD_SIZE:"Parece que su anuncio <b>ha excedido el tamaño máximo</b>.<br/><br/>Puede por ejemplo <b>suprimir fotos</b>, y reintentarlo.",INVALID_LOGIN_CREDENTIALS:"Identificador o contraseña no válidos.<br/>Por favor, inténtelo de nuevo.",FAILED_SAVE_RECORD:"Hubo un fallo guardando el anuncio",FAILED_UPDATE_RECORD:"Fallo durante la actualización del anuncio",LOAD_CATEGORY_FAILED:"Error cargando las categorías",LOOKUP_RECORDS_FAILED:"Fallo durante la ejecución de la búsqueda.",LOAD_RECORD_FAILED:"Fallo durante la carga del anuncio.",REMOVE_RECORD_FAILED:"Error de la supresión del anuncio",SOLD_RECORD_FAILED:"Error del cierre del anuncio",REOPEN_RECORD_FAILED:"Error de la reapertura del anuncio",FAILED_SAVE_COMMENT:"Fallo mientras se guardaba el comentario",FAILED_REMOVE_COMMENT:"Fallo durante la supresión del comentario",RECORD_NOT_EXISTS:"Anuncio inexistente"},EVENT_LOGIN:{EMAIL_OR_PHONE:"Correo electrónico o teléfono",EMAIL_OR_PHONE_HELP:"Correo electrónico o teléfono",ERROR:{INVALID_USERNAME:"Correo electrónico o teléfono no válidos"},HELP:"Introduce un <b>correo electrónico o teléfono</b>, para poder contactarle durante el evento:",REMEMBER_ME:"Recordarme",TITLE:"Coordenadas"},GALLERY:{TITLE:"Galería",BTN_START:"Comenzar",BTN_CONTINUE:"Continuar",BTN_PAUSE:"Pausar",BTN_STOP:"Detener",SLIDE_DURATION:"Duración de visionado :",SLIDE_DURATION_OPTION:"{{value}} segundos"},HOME:{BTN_NEW_AD:"Poner un anuncio",BTN_SHOW_MARKET_OFFER:"Consultar los anuncios",LOCATION_LABEL:"Buscar anuncios por localidad :",LOCATION_HELP:"Código postal, Localidad",ERROR:{GEO_LOCATION_NOT_FOUND:"Localidad o código postal no encontrados"}},INFO:{RECORD_REMOVED:"Anuncio suprimido",RECORD_SOLD:"Anuncio cerrado",RECORD_REOPEN:"Anuncio reabierto"},JOIN:{PROFILE:{WARNING:"Complete su perfil con <b>información pública</b>, accesible por todo el mundo.",TITLE:"Nombre, Apellidos",TITLE_HELP:"Nombre, Apellidos",DESCRIPTION:"Sobre mí",DESCRIPTION_HELP:"Escriba algo sobre usted…"},SUBSCRIPTION:{EMAIL:"Correo electrónico",EMAIL_HELP:"Correo electrónico (opcional)"},LAST_SLIDE_CONGRATULATION:"<b>¡Bien!</b> Ha introducido todas los datos necesarios.<br/><b>Puede solicitar</b> la creación de su cuenta.</b><br/><br/>Para su información, la llave pública que se muestra más abajo identificará su futura cuenta.<br/>Esta podrá ser comunicada a terceros para recibir pagos.",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Advertencia:</b> el identificador secreto y la contraseña no podrán ser modificados.<br/><b>¡Asegúrese de recordarlos siempre!</b><br/><br/><b>¿Desea</b> continuar?'},LOCAL_SALE:{LOCATION:"Número de stand",LOCATION_HELP:"Número de stand : 1, 2, …",LOCATION_PREFIX:"Stand n°"},PAYMENT:{MODAL:{PAYMENT_LINK_HELP:"Enlaces de pago (en beta) :",SOFTWARE_HELP:'¿ No sabe <b>cómo pagar con la moneda {{currency|abbreviate}} ?</b><ul><li>- <a ng-click="openHelpSite($event)">Consulte el foro de usuaries;</a><li>- Instale un programa compatible : <a ng-click="openLink($event, \'https://cesium.app\')">Cesium</a> (GNU/Linux, Windows, Mac), Silkaj (GNU/Linux) o Sakia (GNU/Linux).</li>',TITLE:"Hacer un pago"}},LOGIN:{HELP:"Introduzca sus credenciales de conexión :",REMEMBER_ME:"Recordar mi sesión"},PROFILE:{DEFAULT_TITLE:"Usuario/a {{pubkey|formatPubkey}}"},SEARCH:{GEO_DISTANCE:"Distancia máxima desde la localidad :",GEO_DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",LAST_RECORD_COUNT:"{{count}} anuncio{{count>0?'s':''}} reciente{{count>0?'s':''}}",LAST_RECORD_COUNT_LOCATION:"{{count}} anuncio{{count>0?'s':''}} recente{{count>0?'s':''}}, cerca de {{location}}",RESULT_COUNT:"{{count}} resultado{{count>0?'s':''}}",RESULT_COUNT_LOCATION:"{{count}} resultado{{count>0?'s':''}}, cerca de {{location}}",TITLE:"Anuncios",CATEGORY:"Categoría: ",SEARCH_HELP:"Búsqueda (coche, libro...)",BY:"por",BTN_ADD:"Nuevo",BTN_OPTIONS:"Búsqueda avanzada",BTN_AROUND_ME:"Alrededor mío",SHOW_MORE:"Mostrar más",SHOW_MORE_COUNT:"(mostrar sólo {{limit}})",LOCATION:"localidad",LOCATION_HELP:"Ciudad",LAST_RECORDS:"Anuncios recientes:",SHOW_OLD_RECORD:"Mostrar anuncios viejos",RESULTS:"Resultados :",BTN_CROWDFUNDING:"Crowdfunding",BTN_FAVORITES:"Favoritas",BTN_AUCTION:"Auction",BTN_LAST_RECORDS:"Anuncios recientes",BTN_SHOW_CATEGORIES:"Mostrar categorías",BTN_OFFERS:"Ofertas",BTN_NEEDS:"Demandas",SHOW_CLOSED_RECORD:"Mostrar anuncios cerrados",RECORD_STOCK:"Stock :"},TYPE:{TITLE:"Nuevo anuncio",SELECT_TYPE:"Tipo de anuncio :",OFFER:"Oferta, Venta",OFFER_SHORT:"Oferta",CROWDFUNDING:"Financiamiento participativo",CROWDFUNDING_SHORT:"Financiamiento participativo",NEED:"Demanda, Necesidad",NEED_SHORT:"Demanda",AUCTION:"Subasta",AUCTION_SHORT:"Subasta"},VIEW:{BTN_FOLLOW:"Seguir este anuncio",BTN_STOP_FOLLOW:"Dejar de seguir este anuncio",BTN_PAYMENT_HELP:"¿ Cómo hacer un pago ?",CROWDFUNDING_ISSUERS:"{{issuers.length}} contribuidor{{issuers.length > 1 ? 'es' : ''}}",PAYMENT:'<b>Para hacer un pago</b>, envía moneda {{currency|abbreviate}} :<ul><li>- a la llave pública <a class="positive" copy-on-click="{{pubkeyWithChecksum||pubkey}}" title="Copiar la llave">{{pubkey}}</a></li></p>',PAYMENT_WITH_COMMENT:'<b>Para hacer un pago</b>, envía moneda {{currency|abbreviate}} :<ul><li>- a la llave pública <a class="positive" copy-on-click="{{pubkeyWithChecksum||pubkey}}" title="Copiar la llave">{{pubkey}}</a></li><li> - con el comentario <a class="positive" copy-on-click="{{comment}}" title="Copiar el comentario">{{comment}}</a> para hacer seguimiento.</li></ul></p>',SHOW_CROWDFUNDING_ISSUERS:"Ver contribuidores",MORE_LIKE_THIS:"Esto le podría interesar :",NEW_MESSAGE_TITLE:'Sobre el anuncio "{{title}}"...',REOPEN_CONFIRMATION:"¿<b>Desea</b> reabrir este anuncio ?",SOLD_CONFIRMATION:"¿<b>Desea</b> cerrar este anuncio ?",TITLE:"Anuncio",BTN_SOLD_AD:"Cerrar anuncio",BTN_SOLD:"Cerrado",BTN_REOPEN:"Reabrir anuncio",BTN_WRITE:"Escribir",MENU_TITLE:"Opciones",RECORD_FEES_PARENTHESIS:"(costes)",RECORD_STOCK:"Stock disponible :",POPOVER_SHARE_TITLE:"Anuncio {{title}}",REMOVE_CONFIRMATION:"¿ Desea suprimir este anuncio ?<br/><br/>Esta operación es irreversible."},WALLET:{DUNITER_PUBKEY:"Llave pública de recepción de pagos",DUNITER_ACCOUNT:"Recepción de pagos en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La llave pública (de arriba) indica el destino de los pagos que recibirá.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"Ninguna llave pública ha sido introducida. Deberá enviársela a los eventuales compradores.<br/>La puede obtener en cualquier momento <b>editando su perfil</b>."},WOT:{ERROR:{FAILED_STAR_PROFILE:"Error durante el envío de su nota. Inténtelo más tarde."},VIEW:{BTN_RECORDS:"Anuncios",DUNITER_ACCOUNT:"Recepción de pagos en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La llave pública (de arriba) indica el destino de los pagos que recibirá.",DUNITER_ACCOUNT_HELP_ASK_USER:'Este usuario no ha comunicado su llave pública. <a ng-click="showNewMessageModal()">Contáctelo</a> para obtenerla.',DUNITER_PUBKEY:"Llave pública para recepción de pagos"}}},MENU:{MARKET:"Anuncios",MY_RECORDS:"Mis anuncios"}}),e.translations("fr-FR",{MENU:{MARKET:"Annonces",MY_RECORDS:"Mes annonces",FAVORITES:"Favoris"},MARKET:{COMMON:{PRICE:"Prix",BTN_NEW_AD:"Je dépose une annonce",SOLD:"Annonce close",LAST_UPDATE:"Dernière mise à jour",AROUND_ME:"Autour de moi",CROWDFUNDING_PROGRESS:"Financé à {{pct|formatInteger}} %",FREE:"Gratuit",FREE_PRICE:"Prix libre"},JOIN:{PROFILE:{WARNING:"Il vous reste maintenant à compléter votre profil utilisateur.<br/><br/>Il s'agit <b>d'informations publiques</b>, accessibles par tous.",TITLE:"Nom, Prénom",TITLE_HELP:"Nom, Prénom ou pseudonyme",DESCRIPTION:"A propos de moi",DESCRIPTION_HELP:"Dites quelque chose à propos de vous..."},SUBSCRIPTION:{EMAIL:"Email",EMAIL_HELP:"Email (optionnel)"},LAST_SLIDE_CONGRATULATION:"Vous avez saisi toutes les informations nécessaires : Bravo !<br/>Vous pouvez maintenant <b>envoyer la demande de création</b> de compte.<br/><br/>N'oubliez pas vos identifiants, vous ne pourrez pas en changer !",CONFIRMATION_WALLET_ACCOUNT:'<b class="assertive">Avertissement :</b> l\'identifiant et le mot de passe ne pourront plus être modifiés.<br/><br/><b>Assurez-vous de toujours vous en rappeler !</b><br/><br/><b>Etes-vous sûr</b> de vouloir continuer avec ces identifiants ?'},PROFILE:{DEFAULT_TITLE:"Utilisateur {{pubkey|formatPubkey}}",IDENTITY_RECORDS_TITLE:"Annonces utilisateur"},LOGIN:{HELP:"Veuillez saisir vos identifiants de connexion :",REMEMBER_ME:"Se souvenir de moi ?"},EVENT_LOGIN:{TITLE:"Coordonnées",HELP:"Veuillez indiquer un <b>email ou numéro de téléphone</b> portable, afin que les organisateurs puissent vous contacter durant l'événement :",EMAIL_OR_PHONE:"Email ou téléphone",EMAIL_OR_PHONE_HELP:"Email ou numéro de téléphone",REMEMBER_ME:"Se souvenir de moi ?",ERROR:{INVALID_USERNAME:"Email ou numéro de téléphone non valide"}},HOME:{BTN_NEW_AD:"Déposer une annonce",BTN_SHOW_MARKET_OFFER:"Voir les annonces",LOCATION_LABEL:"Recherche d'annonces par ville :",LOCATION_HELP:"Code postal, Ville",ERROR:{GEO_LOCATION_NOT_FOUND:"Ville ou code postal non trouvé"}},CATEGORY:{ALL:"Toutes les catégories",UNKNOWN:"Catégorie inconnue",EDIT:{TITLE:"Gestion des catégories",ID:"Identifiant",NAME:"Libellé",ROOT_CATEGORIES:"Catégories parentes",BTN_ADD:"Ajouter",BTN_REORDER:"Réordonner",POPUP:{TITLE_EDIT:"Modifier la catégorie",TITLE_NEW:"Nouvelle catégorie"},CONFIRM:{CANCEL:"Des modifications n'ont pas été enregistrées.<br/><br/><b>Êtes-vous sûr</b> de vouloir continuer cette opération ?"},INFO:{SAVED:"Catégories enregistrées avec succès"},ERROR:{CANNOT_SAVE:"Erreur lors de la sauvegarde des catégories",INVALID_ID_PATTERN:"Format 'catNNN' non respecté",ID_ALREADY_USED:"Identifiant déjà utilisé"}}},SEARCH:{TITLE:"Annonces",CATEGORY:"Catégorie : ",SEARCH_HELP:"Recherche (vélo, rollers...)",BY:"par",BTN_ADD:"Nouveau",BTN_CATEGORIES:"Catégories",BTN_OPTIONS:"Recherche avancée",BTN_AROUND_ME:"Autour de moi",GEO_DISTANCE:"Distance maximale autour de la ville :",GEO_DISTANCE_OPTION:"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}",SHOW_MORE:"Afficher plus",SHOW_MORE_COUNT:"(limite actuelle à {{limit}})",LOCATION:"Ville",LOCATION_HELP:"Code postal, Ville",RESULTS:"Résultats",RESULT_COUNT_LOCATION:"{{count}} résultat{{count>0?'s':''}}, près de {{location}}",RESULT_COUNT:"{{count}} résultat{{count>0?'s':''}}",LAST_RECORDS:"Dernières annonces",LAST_RECORD_COUNT_LOCATION:"{{count}} annonce{{count>0?'s':''}} récente{{count>0?'s':''}}, près de {{location}}",LAST_RECORD_COUNT:"{{count}} annonce{{count>0?'s':''}} récente{{count>0?'s':''}}",BTN_LAST_RECORDS:"Dernières annonces",BTN_SHOW_CATEGORIES:"Parcourir les catégories",BTN_OFFERS:"Offres",BTN_CROWDFUNDING:"Financements",BTN_FAVORITES:"Favoris",BTN_AUCTION:"Enchères",BTN_NEEDS:"Demandes",SHOW_CLOSED_RECORD:"Afficher les annonces closes ?",SHOW_OLD_RECORD:"Afficher les anciennes annonces ?",RECORD_STOCK:"Stock :",SORT:{PREFIX:"Tri: ",DATE:"Date",PRICE:"Prix",DATE_ASC:"Plus anciennes",DATE_DESC:"Plus récentes",PRICE_ASC:"Prix croissants",PRICE_DESC:"Prix décroissants"}},GALLERY:{TITLE:"Diaporama",BTN_START:"Démarrer",BTN_CONTINUE:"Reprendre",BTN_PAUSE:"Pause",BTN_STOP:"Arrêter",SLIDE_DURATION:"Durée d'affichage :",AD_TYPE:"Type d'annonce :",ALL_AD_TYPES:"Tous",SLIDE_DURATION_OPTION:"{{value}} secondes"},VIEW:{TITLE:"Annonce",BTN_SOLD_AD:"Clore l'annonce",BTN_SOLD:"Clore",BTN_REOPEN:"Réouvrir l'annonce",BTN_WRITE:"Ecrire un message",BTN_FOLLOW:"Suivre cette annonce",BTN_STOP_FOLLOW:"Ne plus suivre cette annonce",BTN_PAYMENT_HELP:"Comment faire un paiement ?",MENU_TITLE:"Options",RECORD_FEES_PARENTHESIS:"(frais)",RECORD_STOCK:"Stock disponible :",POPOVER_SHARE_TITLE:"Annonce {{title}}",REMOVE_CONFIRMATION:"Êtes-vous sûr de vouloir supprimer cette annonce ?<br/><br/>Cette opération est irréversible.",SOLD_CONFIRMATION:"<b>Êtes-vous sûr</b> de vouloir clore cette annonce ?",REOPEN_CONFIRMATION:"<b>Êtes-vous sûr</b> de vouloir réouvrir cette annonce ?",NEW_MESSAGE_TITLE:'Au sujet de l\'annonce "{{title}}"...',MORE_LIKE_THIS:"Ceci pourrait vous intéresser :",PAYMENT:'<b>Pour faire un paiement</b>, envoyer de la monnaie {{currency|abbreviate}} :<ul><li>- à la clé publique <a class="positive" copy-on-click="{{pubkeyWithChecksum||pubkey}}" title="Copier la clef">{{pubkey}}</a></li></p>',PAYMENT_WITH_COMMENT:'<b>Pour faire un paiement</b>, envoyer de la monnaie {{currency|abbreviate}} :<ul><li>- à la clé publique <a class="positive" copy-on-click="{{pubkeyWithChecksum||pubkey}}" title="Copier la clef">{{pubkey}}</a></li><li> - avec le commentaire <a class="positive" copy-on-click="{{comment}}" title="Copier le commentaire">{{comment}}</a> pour le suivi.</li></ul></p>',CROWDFUNDING_ISSUERS:"{{issuers.length}} donateur{{issuers.length > 1 ? 's' : ''}}",SHOW_CROWDFUNDING_ISSUERS:"Voir les donateurs"},WALLET:{DUNITER_PUBKEY:"Clé publique de réception des paiements",DUNITER_ACCOUNT:"Réception des paiements en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La clef publique (ci-dessus) indique la destination des paiements que vous recevrez.",DUNITER_ACCOUNT_NO_PUBKEY_HELP:"Aucune clé publique de compte n'a été renseignée. Vous devrez la donner aux acheteurs éventuels.<br/>Vous pouvez la saisir à tout moment, <b>en éditant votre profil</b>."},TYPE:{TITLE:"Nouvelle annonce",SELECT_TYPE:"Type d'annonce :",OFFER:"Offre, Vente",OFFER_SHORT:"Offre",CROWDFUNDING:"Financement participatif",CROWDFUNDING_SHORT:"Financement",NEED:"Demande, Recherche",NEED_SHORT:"Demande",AUCTION:"Vente aux enchères",AUCTION_SHORT:"Enchère"},LOCAL_SALE:{LOCATION:"Numéro du stand",LOCATION_HELP:"Numéro du stand : 1, 2, ...",LOCATION_PREFIX:"Stand n°"},EDIT:{TITLE:"Edition",RECORD_TITLE:"Titre",RECORD_TITLE_HELP:"Titre : vélo, livre...",RECORD_DESCRIPTION:"Description",RECORD_DESCRIPTION_HELP:"Description",RECORD_LOCATION:"Ville",RECORD_LOCATION_HELP:"Code postal, Ville",RECORD_PRICE:"Prix",RECORD_PRICE_HELP:"Prix (optionnel)",FREE_PRICE:"Prix libre ?",RECORD_CURRENCY:"Monnaie",RECORD_FEES:"Frais d'envoi",RECORD_FEES_HELP:"Frais (optionnel)",RECORD_STOCK:"Stock disponible",RECORD_STOCK_HELP:"Stock disponible",AUCTION:{TITLE_NEW:"Nouvelle enchère",START_PRICE_HELP:"Prix de départ (optionnel)"},OFFER:{TITLE_NEW:"Nouvelle annonce"},NEED:{TITLE_NEW:"Nouvelle demande",MAX_PRICE_HELP:"Prix maximum (optionnel)"},CROWDFUNDING:{TITLE_NEW:"Nouvelle campagne de financement",TITLE_HELP:"Titre de la campagne",DESCRIPTION_HELP:"Description : Décrivez votre projet ici",PRICE_HELP:"Montant recherché"},WARNING:{NO_GEO_POINT:"Votre annonce <b>ne sera pas visible</b> dans les recherches spatiales."}},WOT:{VIEW:{BTN_RECORDS:"Annonces",DUNITER_PUBKEY:"Clé publique de réception des paiements",DUNITER_ACCOUNT:"Réception des paiements en {{currency|currencySymbol}}",DUNITER_ACCOUNT_HELP:"La clef publique (ci-dessus) correspond au compte à utiliser pour payer cet utilisateur.",DUNITER_ACCOUNT_HELP_ASK_USER:"Cet utilisateur n'a pas communiqué sa clef publique de compte. <a ng-click=\"showNewMessageModal()\">Contactez-le</a> pour l'obtenir."},ERROR:{FAILED_STAR_PROFILE:"Erreur lors de l'envoi de votre note. Veuillez réessayer ultérieurement."}},PAYMENT:{MODAL:{TITLE:"Faire un paiement",SOFTWARE_HELP:'Vous ne savez pas <b>comment envoyer de la monnaie {{currency|abbreviate}} ?</b><ul><li>- <a ng-click="openHelpSite($event)">Consulter le forum utilisateur;</a><li>- Installer un logiciel compatible : <a ng-click="openLink($event, \'https://cesium.app\')">Cesium</a> (Linux, Windows, Mac), Silkaj (Linux) ou Sakia (Linux).</li>',PAYMENT_LINK_HELP:"Liens de paiement (bêta) :"}},ERROR:{INVALID_LOGIN_CREDENTIALS:"Identifiant ou mot de passe invalide.<br/><br/>Vérifiez qu'ils correspondent bien à un compte <b>créé sur ğchange</b>.",FAILED_SAVE_RECORD:"Erreur lors de l'enregistrement de l'annonce",FAILED_UPDATE_RECORD:"Erreur lors de la mise à jour de l'annonce",LOAD_CATEGORY_FAILED:"Erreur d'initialisation des catégories",LOOKUP_RECORDS_FAILED:"Erreur lors de l'exécution de la recherche",LOAD_RECORD_FAILED:"Erreur lors du chargement de l'annonce",REMOVE_RECORD_FAILED:"Erreur de la suppression de l'annonce",SOLD_RECORD_FAILED:"Erreur lors de la fermeture de l'annonce",REOPEN_RECORD_FAILED:"Erreur lors de la réouverture de l'annonce",FAILED_SAVE_COMMENT:"Erreur lors de la sauvegarde du commentaire",FAILED_REMOVE_COMMENT:"Erreur lors de la suppression du commentaire",RECORD_NOT_EXISTS:"Annonce inexistante",RECORD_EXCEED_UPLOAD_SIZE:"Il semble que votre annonce <b>soit trop volumineuse</b> pour être acceptée par le noeud de données.<br/><br/>Vous pouvez par exemple <b>supprimer des photos</b>, puis essayer à nouveau.",GEO_LOCATION_NOT_FOUND:"Ville ou code postal non trouvé"},INFO:{RECORD_REMOVED:"Annonce supprimée",RECORD_SOLD:"Annonce close",RECORD_REOPEN:"Annonce réouverte"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a commenté votre annonce : <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié son commentaire sur votre annonce : <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a répondu à votre commentaire sur l\'annonce : <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié la réponse à votre commentaire sur l\'annonce : <b>{{params[2]}}</b>',FOLLOW_NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a commenté l\'annonce : <b>{{params[2]}}</b>',FOLLOW_UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié son commentaire sur l\'annonce : <b>{{params[2]}}</b>',FOLLOW_NEW:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a ajouté l\'annonce : <b>{{params[2]}}</b>',FOLLOW_UPDATE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a modifié l\'annonce : <b>{{params[2]}}</b>',FOLLOW_CLOSE:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a clôturé l\'annonce : <b>{{params[2]}}</b>',MODERATION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> vous demande une modération sur l\'annonce : <b>{{params[2]}}</b><br/><b class="dark ion-quote"> </b><span class="text-italic">{{params[3]}}</span>',DELETION_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a signalé une annonce à modérer : <b>{{params[2]}}</b>',ABUSE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a signalé votre annonce : <b>{{params[2]}}</b>',LIKE_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> a aimé votre annonce : <b>{{params[2]}}</b>',FOLLOW_RECEIVED:'<span class="positive"><i class="icon ion-person"></i> {{name||params[1]}}</span> suit votre annonce : <b>{{params[2]}}</b>'}}}),e.translations("nl-NL",{MENU:{MARKET:"Advertenties"},MARKET:{COMMON:{PRICE:"Prijs",BTN_BUY:"Koop",BTN_BUY_DOTS:"Koop...",BTN_NEW_AD:"Nieuwe advertentie",AROUND_ME:"In mijn omgeving"},SEARCH:{TITLE:"Markt",SEARCH_HELP:"Wat, waar: auto, Utrecht, ...",BTN_ADD:"Nieuw",BTN_OPTIONS:"Geavanceerd zoeken",BTN_AROUND_ME:"In mijn omgeving",SHOW_MORE:"Toon meer",SHOW_MORE_COUNT:"(huidige limiet op {{limit}})",LOCATION:"Locatie",LOCATION_HELP:"Plaats",LAST_RECORDS:"Nieuwste advertenties:",RESULTS:"Resultaat:",BTN_OFFERS:"Aangeboden",BTN_NEEDS:"Gezocht"},VIEW:{TITLE:"Advertentie",MENU_TITLE:"Opties",POPOVER_SHARE_TITLE:"Advertentie {{title}}",REMOVE_CONFIRMATION:"Weet je zeker dat je deze advertentie wil wissen?<br/><br/>Dit kan niet ongedaan worden gemaakt."},TYPE:{TITLE:"Nieuwe advertentie",SELECT_TYPE:"Soort advertentie:",OFFER:"Aanbod",NEED:"Vraag"},EDIT:{TITLE:"Bewerk",TITLE_NEW:"Nieuwe advertentie",RECORD_TITLE:"Titel",RECORD_TITLE_HELP:"Titel",RECORD_DESCRIPTION:"Beschrijving",RECORD_DESCRIPTION_HELP:"Beschrijving",RECORD_LOCATION:"Adres",RECORD_LOCATION_HELP:"Straat, Plaats",RECORD_PRICE:"Prijs",RECORD_PRICE_HELP:"Prijs (optioneel)",RECORD_CURRENCY:"Valuta"},ERROR:{FAILED_SAVE_RECORD:"Advertentie opslaan mislukt",FAILED_UPDATE_RECORD:"Advertentie aanpassen mislukt",LOAD_CATEGORY_FAILED:"Categorieên laden mislukt",LOOKUP_RECORDS_FAILED:"Fout tijdens laden van advertenties.",LOAD_RECORD_FAILED:"Advertentie laden mislukt",REMOVE_RECORD_FAILED:"Advertentie wissen mislukt",FAILED_SAVE_COMMENT:"Commentaar opslaan mislukt",FAILED_REMOVE_COMMENT:"Commentaar wissen mislukt",RECORD_NOT_EXISTS:"Advertentie niet gevonden"},INFO:{RECORD_REMOVED:"Advertentie succesvol verwijderd"}},EVENT:{MARKET:{NEW_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft gereageerd op jouw advertentie: <b>{{params[2]}}</b>',UPDATE_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft zijn/aar reactie op jouw advertentie bewerkt: <b>{{params[2]}}</b>',NEW_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft gereageerd op jouw commentaar op advertentie: <b>{{params[2]}}</b>',UPDATE_REPLY_COMMENT:'<span class="positive"><i class="icon ion-person"></i> {{name||uid||params[1]}}</span> heeft zijn/haar reactie op jouw commentaar bewerkt, op advertentie: <b>{{params[2]}}</b>'}}})}]),angular.module("cesium.plugins.templates",[]).run(["$templateCache",function(e){e.put("plugins/es/templates/common/dropdown_locations.html",'\n \x3c!-- dropdown --\x3e\n <ul class="item no-padding list dropdown-list" ng-if="locations" scroll="true">\n\n <div ng-if="!locations.length" class="item padding assertive">\n <span translate>COMMON.SEARCH_NO_RESULT</span>\n </div>\n\n <a ng-repeat="res in locations" class="item item-border-large item-text-wrap ink done in {{res.selected && \'active\' || \'\'}}" ng-class="::{\'item-divider\': !res.address, \'item-icon-left\': res.address}" ng-click="::res.address ? selectLocation(res) : false">\n\n \x3c!-- if divider --\x3e\n <h4 class="text-italic" ng-if="::!res.address" ng-bind-html="res.name"></h4>\n\n \x3c!-- if divider --\x3e\n <ng-if ng-if="::res.address">\n\n <i class="icon ion-location"></i>\n\n <h3 ng-if="res.address.road">\n {{::res.address.road}}\n </h3>\n <h3>\n <span ng-if="res.address.postcode">{{::res.address.postcode}}</span>\n {{::res.address.city||res.address.village}}\n <span class="gray">| {{::res.address.country}}</span>\n </h3>\n <h5 class="gray">\n {{\'LOCATION.MODAL.POSITION\'|translate:res }}\n </h5>\n </ng-if>\n\n </a>\n\n </ul>\n'),e.put("plugins/es/templates/common/edit_pictures.html",'<div class="gallery" ng-controller="ESPicturesEditCtrl as ctrl">\n\n \x3c!-- Picture list --\x3e\n <div ng-repeat="picture in pictures" class="item card card-gallery stable-bg" ng-class="{\'in done\': picture.isnew}">\n <div>\n <h2 ng-if="picture.title">{{picture.title}}</h2>\n <img ng-src="{{picture.src}}">\n </div>\n <div class="item done in tabs tabs-secondary tabs-icon-left">\n <a class="tab-item stable-bg assertive" ng-click="removePicture($index)" title="{{\'COMMON.BTN_PICTURE_DELETE\' | translate}}"><i class="icon ion-trash-a"></i>{{\'COMMON.BTN_PICTURE_DELETE\'|translate}}</a>\n <a class="tab-item stable-bg dark" ng-click="rotatePicture($index)" title="{{\'COMMON.BTN_PICTURE_ROTATE\' | translate}}"><i class="icon ion-forward"></i>{{\'COMMON.BTN_PICTURE_ROTATE\'|translate}}</a>\n <a class="tab-item stable-bg" ng-click="favoritePicture($index)" ng-class="{\'gray\': $index !== 0, \'positive\': $index === 0}" title="{{\'COMMON.BTN_PICTURE_FAVORISE\' | translate}}"><i class="icon ion-star"></i>{{\'COMMON.BTN_PICTURE_FAVORISE\'|translate}}</a>\n </div>\n </div>\n\n \x3c!-- Add picture button --\x3e\n <div class="item card card-gallery card-gallery-new text-center padding ink" file-select="onFileChanged(file)" accept="image/*">\n <i class="ion-image stable" style="font-size:150px"></i>\n <b class="ion-plus gray" style="font-size:80px; position:absolute; top:25px; right: 5px;"></b>\n <p translate>COMMON.BTN_ADD_PICTURE</p>\n </div>\n\n</div>\n\n'),
|
||
e.put("plugins/es/templates/common/edit_position.html",'<div class="item item-divider" translate>LOCATION.LOCATION_DIVIDER</div>\n\n\x3c!-- street --\x3e\n<ion-item class="item-input item-floating-label item-button-right">\n <span class="input-label">{{\'LOCATION.ADDRESS\' | translate}}</span>\n <textarea placeholder="{{\'LOCATION.ADDRESS_HELP\' | translate}}" ng-model="formData.address" ng-model-options="{ debounce: 350 }" rows="4" cols="10">\n </textarea>\n</ion-item>\n\n\x3c!-- city --\x3e\n<div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.geoPoint.$invalid}">\n <span class="input-label" translate>LOCATION.CITY</span>\n <input type="text" placeholder="{{\'LOCATION.CITY_HELP\'|translate}}" name="city" ng-model="formData.city" ng-model-options="{ updateOn: \'blur\' }" required-if="formData.address" ng-change="onCityChanged()">\n</div>\n<input type="hidden" name="geoPoint" ng-model="formData.geoPoint" required-if="formPosition.enable" geo-point>\n<div class="form-errors" ng-show="form.$submitted && form.city.$error" ng-messages="form.city.$error">\n <div class="form-error" ng-message="required">\n <span translate="LOCATION.ERROR.CITY_REQUIRED_IF_STREET"></span>\n </div>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.geoPoint.$error" ng-messages="form.geoPoint.$error">\n <div class="form-error" ng-message="required">\n <span translate="LOCATION.ERROR.REQUIRED_FOR_LOCATION" ng-if="!formData.city"></span>\n <span translate="LOCATION.ERROR.INVALID_FOR_LOCATION" ng-if="formData.city"></span>\n </div>\n <div class="form-error" ng-message="geoPoint">\n <span translate="LOCATION.ERROR.REQUIRED_FOR_LOCATION" ng-if="!formData.city"></span>\n <span translate="LOCATION.ERROR.INVALID_FOR_LOCATION" ng-if="formData.city"></span>\n </div>\n</div>\n\n\n\x3c!-- Position (lat/lon) --\x3e\n<div class="item row item-text-wrap no-padding">\n\n <div class="col no-padding">\n\n \x3c!-- appear on map ? --\x3e\n <ion-checkbox ng-if="options.position.showCheckbox" ng-model="formPosition.enable" ng-change="onUseGeopointChanged()" class="item item-border-large done in">\n <div class="item-content">\n <span translate>LOCATION.USE_GEO_POINT</span>\n\n \x3c!-- warning if no position--\x3e\n <h4 class="assertive" ng-if="options.position.warningMessage && !formPosition.enable">\n <i class="icon ion-android-warning"></i>\n <span ng-bind-html="options.position.warningMessage|translate"></span>\n </h4>\n\n \x3c!-- loading --\x3e\n <h4 class="gray" ng-if="formPosition.loading">\n <ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner>\n <span translate>LOCATION.LOADING_LOCATION</span>\n </h4>\n </div>\n </ion-checkbox>\n </div>\n\n <div class="col col-10 no-padding" style="min-width: 60px;">\n <div class="row text-center">\n\n <a class="button button-stable button-small-padding" title="{{\'LOCATION.BTN_GEOLOC_ADDRESS\'|translate}}" ng-disabled="!formPosition.enable" ng-click="openSearchLocationModal()">\n <i class="icon ion-home" style="left: 15px;"></i>\n <b class="icon-secondary ion-search" style="top: -9px; left:32px; font-size: 18px;"></b>\n </a>\n\n </div>\n </div>\n</div>\n\n<cs-extension-point name="after-position"></cs-extension-point>\n'),e.put("plugins/es/templates/common/edit_socials.html",'<div class="list no-padding {{::motion.ionListClass}}">\n \x3c!-- divider --\x3e\n <div class="item item-divider">\n\n <span translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</span>\n\n <a class="badge button button-text button-small button-small-padding" ng-class="{\'button-text-positive\': socialData.reorder}" ng-if="formData.socials && formData.socials.length > 1" ng-click="socialData.reorder=!socialData.reorder">\n <span translate>PROFILE.BTN_REORDER</span>\n </a>\n </div>\n</div>\n\n<ion-list show-reorder="socialData.reorder">\n\n <ion-item class="item-icon-left item-social-edit done in" type="no-padding item-text-wrap" ng-if="formData.socials && formData.socials.length" ng-repeat="social in formData.socials | filter:filterFn track by social.url" id="social-{{social.url|formatSlug}}">\n <i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type === \'other\', \'ion-link\': social.type === \'web\', \'ion-email\': social.type === \'email\', \'ion-iphone\': social.type === \'phone\'}"></i>\n <p ng-if="social.type && social.type != \'web\'">\n {{social.type}}\n <i class="ion-locked" ng-if="social.recipient"></i>\n </p>\n <h2>\n <a href="{{social.url}}" ng-if="social.type != \'email\' && social.type != \'phone\'" target="_blank">{{social.url}}</a>\n <a href="mailto:{{social.url}}" ng-if="social.type == \'email\'">{{social.url}}</a>\n <a href="tel:{{social.url}}" ng-if="social.type == \'phone\'">{{social.url}}</a>\n <a class="gray hidden-device" ng-if="!social.recipient && !socialData.reorder" ng-click="formData.socials.splice($index, 1); dirty = true;">\n <b class="ion ion-trash-a"></b> \n </a>\n <a class="gray hidden-device" ng-if="!social.recipient && !socialData.reorder" ng-click="editSocialNetwork($index)">\n <b class="ion ion-edit"></b> \n </a>\n </h2>\n <ion-option-button class="button-assertive" ng-if="!social.recipient" ng-click="formData.socials.splice($index, 1); dirty = true;">\n {{\'COMMON.BTN_DELETE\'|translate}}\n </ion-option-button>\n <ion-option-button class="button-info" ng-if="!social.recipient" ng-click="editSocialNetwork($index)">\n {{\'COMMON.BTN_EDIT\'|translate}}\n </ion-option-button>\n <ion-reorder-button class="ion-drag" on-reorder="reorderSocialNetwork(social, $fromIndex, $toIndex)">\n </ion-reorder-button>\n </ion-item>\n</ion-list>\n\n<ion-list class="no-padding">\n <div class="item item-complex item-input-inset">\n <label class="item-input-wrapper">\n <input type="text" style="width:100%" placeholder="{{\'PROFILE.SOCIAL_HELP\'|translate}}" id="socialUrl" on-return="addSocialNetwork($event);" ng-model="socialData.url">\n </label>\n <button class="button button-small hidden-xs" type="button" ng-click="addSocialNetwork($event)" translate>COMMON.BTN_ADD</button>\n <button class="button button-small button-icon icon ion-android-add visible-xs" type="button" ng-click="addSocialNetwork($event)">\n </button>\n </div>\n\n</ion-list>\n'),e.put("plugins/es/templates/common/item_comment_content.html",'\n <div class="item item-avatar done in">\n <span class="avatar avatar-member" ng-if="::!comment.avatar"></span>\n <span class="avatar" ng-if="::comment.avatar" style="background-image: url({{::comment.avatar.src}})"></span>\n\n <a class="pull-left" ui-sref="app.user_identity({pubkey:comment.issuer, name: comment.name})">\n <span class="positive" ng-if="::comment.name">\n {{::comment.name}}\n </span>\n <span ng-if="::!comment.name" class="gray">\n <i class="icon ion-key gray"></i>\n {{::comment.issuer|formatPubkey}}\n </span>\n </a> \n <span trust-as-html="comment.html"></span>\n </div>\n'),e.put("plugins/es/templates/common/item_comment.html",'<ng-init ng-init="level = level + 1; hash=(comment.id|formatHash)">\n <a name="{{::hash}}"></a>\n\n <ion-item id="comment-{{::comment.id|formatHash}}" class="card card-comment card-avatar stable-900-bg item-text-wrap no-padding" ng-class="{\'in done\': comment.isnew, \'positive-100-bg\': (hash == anchor)}">\n\n \x3c!-- Parent comment --\x3e\n <div class="card-header padding-left" ng-if="comment.parent && !hideParent">\n <h5 class="gray underline">\n <ng-if ng-if="!comment.parent.issuer">\n {{\'COMMENTS.REPLY_TO_DELETED_COMMENT\'|translate}}\n </ng-if>\n <ng-if ng-if="comment.parent.issuer">\n <a ng-click="toggleExpandedParent(comment, $index)">\n {{\'COMMENTS.REPLY_TO_LINK\'|translate}}\n <ng-if ng-if="::comment.parent.name">\n {{::comment.parent.name}}\n </ng-if>\n <ng-if ng-if="::!comment.parent.name">\n <i class="ion-key"></i>\n {{::comment.parent.issuer|formatPubkey}}\n </ng-if>\n </a>\n <i ng-class="::{\'ion-arrow-down-b\': !comment.expandedParent[$index], \'ion-arrow-up-b\': comment.expandedParent[$index]}"></i>\n </ng-if>\n </h5>\n <div class="padding-left" ng-if="comment.expandedParent[$index]">\n <div class="card card-avatar card-avatar-small stable-bg item-text-wrap no-padding in done">\n <ng-include ng-init="comment = comment.parent" src="\'plugins/es/templates/common/item_comment_content.html\'">\n </ng-include>\n </div>\n </div>\n </div>\n\n <ng-include src="\'plugins/es/templates/common/item_comment_content.html\'"></ng-include>\n\n <div class="card-footer gray">\n <small class="underline">\n <a ng-click="share($event, comment, $index)" title="{{comment.creationTime | formatDate}}{{ (comment.creationTime != comment.time) ? (\' - \' + (\'COMMENTS.MODIFIED_ON\'|translate:comment)) : \'\'}}">{{comment.creationTime | formatFromNow}}\n <span ng-if="comment.time && comment.creationTime != comment.time" translate>COMMENTS.MODIFIED_PARENTHESIS</span>\n </a>\n\n <ng-if ng-if="comment.replyCount">\n | <a class="dark" ng-click="toggleExpandedReplies(comment, $index)">{{\'COMMENTS.REPLY_COUNT\'|translate:comment}}</a>\n <i ng-class="{\'ion-arrow-down-b\': !comment.showReplies, \'ion-arrow-up-b\': comment.showReplies}"></i>\n </ng-if>\n </small>\n\n <div class="pull-right">\n <a class="ion-android-share-alt" ng-click="share($event, comment)">\n </a>\n <a class="ion-edit" ng-if="isUserPubkey(comment.issuer)" ng-click="edit(comment)">\n </a>\n <a class="ion-trash-a" ng-if="isUserPubkey(comment.issuer)" ng-click="remove(comment, $index)">\n </a>\n <a class="ion-reply" ng-click="reply(comment)">\n {{::\'COMMENTS.REPLY\'|translate}}\n </a>\n </div>\n </div>\n </ion-item>\n\n \x3c!-- replies --\x3e\n <div ng-if="comment.expandedReplies[$index]" class="padding-left card-avatar-small expanded" ng-init="hideParent=true">\n <ng-include ng-repeat="comment in comment.replies track by comment.id" src="\'plugins/es/templates/common/item_comment.html\'">\n </ng-include>\n </div>\n\n</ng-init>\n'),e.put("plugins/es/templates/common/item_location_search.html",' \x3c!-- search text --\x3e\n <div class="item no-padding">\n <div class="item-input light-bg item-button-right">\n <div class="animate-show-hide selected-values ng-hide" ng-show="entered">\n\n \x3c!-- selected location --\x3e\n <div ng-show="search.location && (search.geoPoint || search.geoShape)" class="button button-small button-text button-stable button-icon-event stable-900-bg" style="margin-right: 10px;">\n <i class="icon ion-location"></i>\n {{search.location.split(\',\')[0]}}\n <i class="icon ion-close" ng-click="removeLocation()"> </i>\n </div>\n\n </div>\n\n <i class="icon ion-ios-location placeholder-icon" ng-if="!search.geoPoint && !search.geoShape"></i>\n <input type="text" ng-if="!search.geoPoint && !search.geoShape" id="searchLocationInput" autocomplete="off" placeholder="{{(options.location.help||\'LOCATION.SEARCH_HELP\')|translate}}" ng-model-options="{ debounce: 350 }" ng-model="search.location" ng-keydown="onKeydown($event)" ng-change="onLocationChanged()" ng-blur="hideDropdown()">\n\n <a class="button button-clear button-small button-stable gray ink no-padding" tabindex="-1" ng-click="showDistancePopover($event)">\n <span>{{\'COMMON.GEO_DISTANCE_OPTION\' | translate: {value: search.geoDistance} }}</span>\n <b class="ion-arrow-down-b" style="font-size: 12pt;"></b>\n </a>\n\n </div>\n </div>\n\n \x3c!-- dropdown --\x3e\n <ng-include src="\'plugins/es/templates/common/dropdown_locations.html\'"></ng-include>\n\n'),e.put("plugins/es/templates/common/modal_category.html",'<ion-modal-view class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title">{{ (ctrl.title || \'COMMON.CATEGORIES\') | translate}}</h1>\n </ion-header-bar>\n\n <ion-content class="categoryModal">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list">\n <label class="item item-input">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" placeholder="{{\'COMMON.CATEGORY_SEARCH_HELP\'|translate}}" ng-model="ctrl.searchText" ng-model-options="{ debounce: 350 }" ng-change="ctrl.doSearch()">\n </label>\n\n\n <div ng-repeat="cat in categories" class="item item-category item-text-wrap" ng-class="{\'item-divider\': !cat.parent}" ng-click="cat.parent ? closeModal(cat) : false">\n <h2 ng-bind-html="cat.name"></h2>\n </div>\n </div>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/common/modal_edit_avatar.html",'<ion-modal-view>\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs visible-sm" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n\n <h1 class="title" translate>PROFILE.MODAL_AVATAR.TITLE</h1>\n\n <button class="button button-clear icon-right visible-xs" ng-click="doCrop()" ng-disabled="formData.imageCropStep == 1" ng-if="formData.imageCropStep <= 2">\n <span translate>COMMON.BTN_NEXT</span>\n <i class="icon ion-ios-arrow-right"></i>\n </button>\n <button class="button button-clear icon-right visible-xs" ng-click="closeModal(formData.result)" ng-if="formData.imageCropStep == 3">\n <i class="icon ion-android-done"></i>\n </button>\n </ion-header-bar>\n\n <ion-content class="modal-avatar padding">\n\n\n <div ng-show="formData.imageCropStep == 1">\n\n <p translate>PROFILE.MODAL_AVATAR.SELECT_FILE_HELP</p>\n\n \x3c!-- Add picture drop zone --\x3e\n <div drop-zone="onFileChanged(file)">\n <div file-select="onFileChanged(file)" accept="image/*">\n <i class="ion-image stable" style="font-size:150px"></i>\n <b class="ion-plus gray" style="position:relative; font-size:80px; top:-51px; right: 19px;"></b>\n <p class="gray" translate>COMMON.CHOOSE_FILE</p>\n </div>\n </div>\n </div>\n\n <div ng-show="formData.imageCropStep == 2">\n <p translate>PROFILE.MODAL_AVATAR.RESIZE_HELP</p>\n\n \x3c!-- <image-crop\n data-height="200" //shape\'s height\n data-width="150" //shape\'s width\n data-shape="square" //the shape.. square or circle\n data-step="imageCropStep"//scope variable that will contain the current step of the crop (1. Waiting for source image; 2. Image loaded, waiting for crop; 3. Crop done)\n src="imgSrc" //scope variable that will be the source image for the crop (may be a Blob or base64 string)\n data-result-blob="result" //scope variable that will contain the Blob information\n data-result="resultDataUrl" //scope variable that will contain the image\'s base64 string representation\n crop="initCrop" //scope variable that must be set to true when the image is ready to be cropped\n padding="250" //space, in pixels, rounding the shape\n max-size="1024" //max of the image, in pixels\n ></image-crop> --\x3e\n\n <div class="item card text-center padding ink">\n <image-crop data-height="200" data-width="200" data-shape="circle" data-step="formData.imageCropStep" src="formData.imgSrc" data-result="formData.result" data-result-blob="formData.resultBlob" crop="formData.initCrop" padding="150" max-size="1024">\n </image-crop>\n </div>\n </div>\n\n <div ng-show="formData.imageCropStep == 3">\n <p translate>PROFILE.MODAL_AVATAR.RESULT_HELP</p>\n\n <div class="item card padding hero" style="height: 110px;">\n <div class="content">\n <img class="avatar" ng-src="{{formData.result|trustAsHtml}}" style="height: 88px; width: 88px;">\n </div>\n </div>\n </div>\n\n \x3c!-- buttons bar --\x3e\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" ng-if="formData.imageCropStep <= 2" translate>\n COMMON.BTN_CANCEL\n </button>\n <button class="button button-stable icon-left ion-chevron-left ink" ng-click="doPrevious()" translate ng-if="formData.imageCropStep >= 2">\n COMMON.BTN_BACK\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" ng-click="doCrop()" translate ng-disabled="formData.imageCropStep === 1" ng-if="formData.imageCropStep <= 2">\n COMMON.BTN_NEXT\n </button>\n <button class="button button-positive ink" ng-click="closeModal(formData.result)" translate ng-if="formData.imageCropStep === 3">\n COMMON.BTN_CONTINUE\n </button>\n </div>\n\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/common/modal_location.html",'<ion-modal-view class="modal-full-height modal-search-location">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>LOCATION.MODAL.TITLE</h1>\n </ion-header-bar>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n\n \x3c!-- search text --\x3e\n <div class="item item-input">\n <i class="icon ion-search placeholder-icon"></i>\n\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'LOCATION.MODAL.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()">\n <input type="text" class="hidden-xs hidden-sm" placeholder="{{\'LOCATION.MODAL.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearch()">\n </div>\n\n <div class="padding-top padding-xs" style="display: block; height: 60px;">\n <div class="pull-left" ng-if="!search.loading && search.results">\n <h4 translate>COMMON.RESULTS_LIST</h4>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <button class="button button-small button-stable ink" ng-click="doSearch()">\n {{\'COMMON.BTN_SEARCH\' | translate}}\n </button>\n </div>\n\n </div>\n\n <div class="center padding" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div ng-if="!search.loading && search.results && (!search.results.length || !search.results[0].address)" class="assertive padding">\n <span translate>COMMON.SEARCH_NO_RESULT</span>\n </div>\n\n <ion-list ng-if="!search.loading" class="padding-top {{::motion.ionListClass}}">\n <div ng-repeat="res in search.results" class="item item-border-large item-text-wrap ink" ng-class="::{\'item-divider\': !res.address, \'item-icon-left item-icon-right\': res.address}" ng-click="res.address ? closeModal(res) : false">\n\n \x3c!-- if divider --\x3e\n <h4 class="text-italic" ng-if="::!res.address" ng-bind-html="res.name"></h4>\n\n \x3c!-- if divider --\x3e\n <ng-if ng-if="::res.address">\n\n <i class="icon ion-location"></i>\n\n <h2 ng-if="res.address.road">\n {{::res.address.road}}\n </h2>\n <h3>\n <span ng-if="res.address.postcode">{{::res.address.postcode}}</span>\n {{::res.address.city||res.address.village}}\n <span class="gray">| {{::res.address.country}}</span>\n </h3>\n <h5 class="gray">\n {{\'LOCATION.MODAL.POSITION\'|translate:res }}\n </h5>\n\n <i class="icon ion-ios-arrow-right"></i>\n </ng-if>\n\n </div>\n </ion-list>\n </ion-content>\n\n <ion-footer-bar class="stable-bg padding-left padding-right block" ng-if="license">\n <div class="pull-right copyright">\n <span class="dark">© </span>\n <a class="positive" href="{{license.url}}" target="_blank">{{license.name}}</a>\n </div>\n </ion-footer-bar>\n</ion-modal-view>\n'),e.put("plugins/es/templates/common/popover_distances.html",'<ion-popover-view class="popover-light popover-distance" style="height: {{33 + 5 * 53}}px">\n <ion-header-bar class="bar bar-header stable-bg">\n <div class="title" translate>COMMON.GEO_DISTANCE_SEARCH</div>\n </ion-header-bar>\n <ion-content scroll="true">\n <a class="item ink" ng-repeat="value in geoDistances" ng-click="selectDistance(value)">\n <b class="ion-checkmark" ng-if="search.geoDistance==value"></b>\n <b ng-if="search.geoDistance==value">{{\'COMMON.GEO_DISTANCE_OPTION\' | translate: {value: value} }}</b>\n <span ng-if="search.geoDistance!=value">{{\'COMMON.GEO_DISTANCE_OPTION\' | translate: {value: value} }}</span>\n </a>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/common/popover_profile_extend.html",' \x3c!-- profile --\x3e\n <button ng-if="enable" class="button button-positive button-small ink" ng-click="showEditUserProfile()">\n {{\'PROFILE.BTN_EDIT\' | translate}}\n </button>\n\n'),e.put("plugins/es/templates/common/popover_star.html",'<ion-popover-view class="popover-star" style="height: {{likeData.stars.wasHit ? 90 : 50}}px">\n <ion-content scroll="false" class="padding-left padding-right">\n <h1>\n <a ng-repeat="level in [1,2,3,4,5]" ng-click="addStar(level)">\n <b class="dark ion-android-star" ng-if="level <= likeData.stars.level"></b>\n <b class="dark ion-android-star-half" ng-if="level > likeData.stars.level && level - 0.5 <= likeData.stars.level"></b>\n <b class="dark ion-android-star-outline" ng-if="level > likeData.stars.level && level - 0.5 > likeData.stars.level"></b>\n </a>\n </h1>\n <a ng-if="likeData.stars.wasHit" ng-click="removeStar(event)" translate>WOT.VIEW.BTN_STARS_REMOVE</a>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/common/popup_report_abuse.html",'<form name="abuseForm" ng-submit="">\n <div class="list" ng-init="setAbuseForm(abuseForm)">\n\n \x3c!-- reason --\x3e\n <label class="item item-input" ng-class="{\'item-input-error\': abuseForm.$submitted && abuseForm.comment.$invalid}">\n <textarea class="padding" style="background-color: transparent;" name="comment" type="text" placeholder="{{\'COMMON.REPORT_ABUSE.REASON_HELP\' | translate}}" rows="3" ng-model="abuseData.comment" ng-minlength="8" required></textarea>\n </label>\n <div class="form-errors" ng-if="abuseForm.$submitted && abuseForm.comment.$error" ng-messages="abuseForm.comment.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n </div>\n\n <div class="item item-toggle item-text-wrap dark">\n <div class="input-label" translate>COMMON.REPORT_ABUSE.ASK_DELETE</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="abuseData.delete">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </div>\n</form>\n\n\n'),e.put("plugins/es/templates/common/view_comments.html",'\n<form class="comments" ng-controller="ESCommentsCtrl" ng-submit="save()">\n\n <div class="item item-divider">\n <i class="icon ion-chatboxes"></i>\n <span translate>COMMENTS.DIVIDER</span>\n <span class="gray" ng-if="comments.total">({{comments.total}})</span>\n </div>\n\n <span class="item item-more-comments" ng-if="comments.hasMore">\n <small><a ng-click="showMore()" translate>COMMENTS.SHOW_MORE_COMMENTS</a></small>\n </span>\n\n <div class="padding-right">\n <ng-repeat ng-repeat="comment in comments.result track by comment.id" ng-include="\'plugins/es/templates/common/item_comment.html\'">\n </ng-repeat>\n </div>\n\n <div class="hidden-xs hidden-sm padding-right">\n <div class="card card-comment item item-input item-button-right">\n\n \x3c!-- reply to comment--\x3e\n <ng-if ng-if="formData.parent">\n <div class="padding card-header text-right pull-left" translate>COMMENTS.REPLY_TO</div><br>\n <div class="padding-left">\n <div class="card card-avatar card-avatar-small stable-900-bg item-text-wrap no-padding in done">\n <ng-include ng-if="formData.parent.message" ng-init="comment = formData.parent" src="\'plugins/es/templates/common/item_comment_content.html\'">\n </ng-include>\n <div class="item dark done in gray" ng-if="!formData.parent.message">\n {{::\'COMMENTS.DELETED_COMMENT\'|translate}}\n </div>\n <div class="card-footer text-right gray">\n <div class="pull-right">\n <a class="ion-close" ng-click="removeParentLink()">\n {{::\'COMMON.BTN_CANCEL\'|translate}}\n </a>\n </div>\n </div>\n </div>\n </div>\n </ng-if>\n <textarea class="padding" style="background-color: transparent;" id="comment-form-textarea" rows="3" placeholder="{{formData.replyTo ? \'COMMENTS.COMMENT_HELP_REPLY_TO\' : \'COMMENTS.COMMENT_HELP\'|translate}}" ng-model="formData.message" ng-keypress="onKeypress($event)">\n </textarea>\n <div class="card-footer text-right">\n <button type="button" class="button button-small button-small-padding" ng-class="{\'button-positive\': formData.message.length}" ng-if="!formData.id" ng-click="save()" translate>\n COMMON.BTN_SEND\n </button>\n \x3c!-- Edit buttons --\x3e\n <ng-if ng-if="formData.id">\n <button type="button" class="button button-small button-small-padding" ng-click="cancel()" translate>\n COMMON.BTN_CANCEL\n </button>\n <button type="button" class="button button-small button-small-padding button-positive" ng-click="save()" translate>\n COMMON.BTN_SAVE\n </button>\n </ng-if>\n </div>\n </div>\n </div>\n\n <div class="visible-xs visible-sm" style="margin-bottom">\n <div class="block">\n \x3c!-- reply to comment--\x3e\n <div class="item item-input-inset done in" ng-if="formData.parent">\n <div class="padding text-right pull-left" translate>COMMENTS.REPLY_TO</div><br>\n <div class="padding-left expanded">\n <div class="card card-comment stable-900-bg item-text-wrap no-padding in done">\n <ng-include ng-if="::formData.parent.message" ng-init="comment = formData.parent" src="\'plugins/es/templates/common/item_comment_content.html\'">\n </ng-include>\n <span ng-if="::!formData.parent.message" translate>\n COMMENTS.DELETED_COMMENT\n </span>\n <div class="card-footer text-right gray">\n <div class="pull-right">\n <a class="ion-close" ng-click="removeParentLink()">\n {{::\'COMMON.BTN_CANCEL\'|translate}}\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="item item-input-inset">\n <div class="item-input-wrapper">\n <input type="text" id="comment-form-input" style="width: 100%" placeholder="{{\'COMMENTS.COMMENT_HELP\'|translate}}" on-return="save();" ng-model="formData.message">\n <button type="submit" class="button button-small button-small-padding button-icon button-dark button-icon gray">\n <i class="icon ion-android-send"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n</form>\n'),e.put("plugins/es/templates/common/view_likes.html",'\n<div class="likes">\n \x3c!-- views --\x3e\n <span class="gray" ng-if="likeData.views" title="{{\'COMMON.VIEWS_TEXT\'|translate: likeData.views }}">\n {{likeData.views.total || 0}}\n <i class="icon ion-eye"></i>\n <ng-if ng-if="likeData.likes||likeData.dislikes"> | </ng-if>\n </span>\n\n \x3c!-- likes / dislikes --\x3e\n <ng-if ng-if="likeData.likes||likeData.dislikes">\n <span ng-class="{\'gray\': !likeData.likes.wasHit, \'positive\': likeData.likes.wasHit}">\n <a title="{{\'COMMON.LIKES_TEXT\'|translate: likeData.likes }}" ng-click="!canEdit && toggleLike($event, {kind: \'like\'})">\n {{likeData.likes.total || 0}}\n <i class="icon ion-heart"></i>\n </a>\n </span>\n <span ng-if="likeData.dislikes" ng-class="{\'gray\': !likeData.dislikes.wasHit, \'positive\': likeData.dislikes.wasHit}">\n <a title="{{\'COMMON.DISLIKES_TEXT\'|translate: likeData.dislikes }}" ng-click="!canEdit && toggleLike($event, {kind: \'dislike\'})">\n {{likeData.dislikes.total || 0}}\n <i class="icon ion-heart-broken"></i>\n </a>\n </span>\n </ng-if>\n\n \x3c!-- follow--\x3e\n <span class="gray" ng-if="likeData.follows"> | </span>\n <a ng-if="likeData.follows" ng-click="!canEdit && toggleLike($event, {kind: \'follow\'})">\n <span ng-class="{\'gray\': !likeData.follows.wasHit, \'positive\': likeData.follows.wasHit}" title="{{\'COMMON.FOLLOWS_TEXT\'|translate: follows }}">\n {{likeData.follows.total || 0}}\n <i class="icon ion-android-people"></i> \n </span>\n <span ng-if="!canEdit" class="hidden-xs" ng-class="{\'assertive\': likeData.follows.wasHit, \'positive\': !likeData.follows.wasHit}">\n ({{likeData.follows.wasHit ? \'COMMON.BTN_STOP_FOLLOW\': \'COMMON.BTN_FOLLOW\' | translate }})\n </span>\n </a>\n <span class="gray" ng-if="likeData.abuses.total"> | </span>\n <a ng-if="likeData.abuses.total && !likeData.abuses.wasHit" ng-click="!canEdit && reportAbuse($event)" title="{{\'COMMON.ABUSES_TEXT\'|translate: likeData.abuses }}">\n {{likeData.abuses.total || 0}}\n <i class="icon ion-android-warning"></i>\n </a>\n <span ng-if="likeData.abuses.total && likeData.abuses.wasHit" class="assertive" title="{{\'COMMON.ABUSES_TEXT\'|translate: likeData.abuses }}">\n {{likeData.abuses.total || 0}}\n <i class="icon ion-android-warning"></i>\n </span>\n</div>\n'),e.put("plugins/es/templates/common/view_pictures.html",'<div ng-if="pictures && pictures.length>0" class="item gallery done in">\n <div ng-repeat="picture in pictures" class="item card card-gallery">\n <h2 ng-if="::picture.title">{{::picture.title}}</h2>\n <img ng-src="{{::picture.src}}">\n </div>\n</div>\n'),e.put("plugins/es/templates/document/item_document_comment.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-document-comment item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'compacted\': compactMode}" ng-click="selectDocument($event, doc)">\n\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:!doc.avatar" class="icon ion-ios-chatbubble-outline stable"></i>\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:doc.avatar" class="avatar" style="background-image: url(\'{{:rebind:doc.avatar.src}}\')"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4>\n <i class="ion-ios-chatbubble-outline dark"></i>\n <span class="gray" ng-if=":rebind:doc.name">\n <i class="ion-person" ng-show=":rebind:!compactMode"></i>\n {{:rebind:doc.name}}:\n </span>\n <span class="dark">\n <i class="ion-quote" ng-if=":rebind:!compactMode"></i>\n {{:rebind:doc.message|truncText:50}}\n </span>\n </h4>\n <h4 class="gray"> <i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}</h4>\n </div>\n\n <div class="col">\n <h3>\n <a ui-sref="app.user_identity({pubkey: doc.pubkey, name: doc.name})">\n\n </a>\n </h3>\n </div>\n\n <div class="col" ng-if=":rebind:!compactMode">\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right hidden-xs hidden-sm" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/es/templates/document/item_document_profile.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'compacted\': compactMode}" ng-click="selectDocument($event, doc)">\n\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:doc.avatar" class="avatar" style="background-image: url({{:rebind:doc.avatar.src}})"></i>\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:!doc.avatar" class="icon ion-person stable"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4 ng-if=":rebind:doc.title">\n <i class="ion-person gray"></i>\n <span class="dark">\n {{:rebind:doc.title}}\n </span>\n <span class="gray">\n {{:rebind:\'DOCUMENT.LOOKUP.HAS_REGISTERED\'|translate}}\n </span>\n </h4>\n <h4>\n <span class="dark" ng-if=":rebind:doc.city">\n <i class="ion-location"></i> {{:rebind:doc.city}}\n </span>\n <span class="gray">\n <i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}\n </span>\n </h4>\n </div>\n\n <div class="col" ng-if=":rebind:!compactMode">\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/es/templates/document/item_document.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left ink item-text-wrap {{::ionItemClass}} no-padding-top no-padding-bottom" ng-click="selectDocument($event, doc)">\n\n <i class="icon ion-document stable" ng-if=":rebind:!doc.avatar"></i>\n <i class="avatar" ng-if=":rebind:doc.avatar" style="background-image: url(\'{{:rebind:doc.avatar.src}}\')"></i>\n\n <div class="row no-padding">\n\n <div class="col">\n <h3>\n <a ui-sref="app.user_identity({pubkey: doc.pubkey, name: doc.name})">\n <span class="positive" ng-if=":rebind:doc.name">\n <i class="ion-person"></i> {{:rebind:doc.name}}\n </span>\n </a>\n </h3>\n </div>\n\n <div class="col">\n <h3 class="dark">\n <i class="ion-locked" ng-if=":rebind:doc.nonce"></i>\n {{:rebind:doc.time|formatDate}}</h3>\n <h4 class="gray">{{:rebind:\'DOCUMENT.HASH\'|translate}} {{:rebind:doc.hash|formatHash}}</h4>\n </div>\n\n <div class="col col-50">\n <h4 class="gray">\n {{:rebind:\'DOCUMENT.LOOKUP.TYPE.\' + (doc.index + \'_\' + doc.type | uppercase) | translate}}\n </h4>\n <h4 ng-if="doc.type!=\'profile\'">\n {{:rebind:doc.title||doc.message|truncText: 150}}\n </h4>\n </div>\n\n\n\n \x3c!--<div class="col">--\x3e\n \x3c!--<a--\x3e\n \x3c!--ng-if=":rebind:login && doc.pubkey==walletData.pubkey"--\x3e\n \x3c!--ng-click="remove($event, $index)"--\x3e\n \x3c!--class="gray pull-right"--\x3e\n \x3c!--title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">--\x3e\n \x3c!--<i class="ion-trash-a"></i>--\x3e\n \x3c!--</a>--\x3e\n \x3c!--<h3 ng-if=":rebind:doc.recipient">--\x3e\n \x3c!--<a ui-sref="app.user_identity({pubkey: doc.recipient.pubkey, name: doc.recipient.name})">--\x3e\n \x3c!--<span class="gray">--\x3e\n \x3c!--<i class="ion-key"></i> {{:rebind:doc.recipient.pubkey|formatPubkey}}--\x3e\n \x3c!--</span>--\x3e\n \x3c!--<span class="positive" ng-if=":rebind:doc.recipient.name">--\x3e\n \x3c!--<i class="ion-person"></i> {{:rebind:doc.recipient.name}}--\x3e\n \x3c!--</span>--\x3e\n \x3c!--</a>--\x3e\n \x3c!--</h3>--\x3e\n \x3c!--<h4 class="gray" ng-if=":rebind:doc.read_signature">--\x3e\n \x3c!--<i class="ion-checkmark"></i>--\x3e\n \x3c!--<span translate>DOCUMENT.LOOKUP.READ</span>--\x3e\n \x3c!--</h4>--\x3e\n\n \x3c!--</div>--\x3e\n\n </div>\n</ion-item>\n'),e.put("plugins/es/templates/document/items_documents.html",'\n<div class="item row row-header done in hidden-xs hidden-sm">\n\n <a class="no-padding dark col col-header" ng-if=":rebind:expertMode" ng-click="toggleSort(\'issuer\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'issuer\'"></cs-sort-icon>\n {{\'DOCUMENT.LOOKUP.HEADER_ISSUER\' | translate}}\n </a>\n <a class="no-padding dark col col-header" ng-if=":rebind:expertMode" ng-click="toggleSort(\'time\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'time\'"></cs-sort-icon>\n {{\'DOCUMENT.LOOKUP.HEADER_TIME\' | translate}}\n </a>\n <div class="no-padding dark col col-50 col-header" ng-if=":rebind:expertMode">\n <span class="gray">{{\'DOCUMENT.LOOKUP.DOCUMENT_TYPE\' | translate}} /</span> {{\'DOCUMENT.LOOKUP.DOCUMENT_TITLE\' | translate}}\n </div>\n</div>\n\n<div class="padding gray" ng-if=":rebind:!search.loading && !search.results.length" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n\n\x3c!-- for each doc --\x3e\n<ng-repeat ng-repeat="doc in :rebind:search.results track by doc.id" ng-switch on="doc.type">\n <div ng-switch-when="comment">\n <ng-include src="::\'plugins/es/templates/document/item_document_comment.html\'"></ng-include>\n </div>\n <div ng-switch-when="profile">\n <ng-include src="::\'plugins/es/templates/document/item_document_profile.html\'"></ng-include>\n </div>\n <div ng-switch-default>\n <ng-include src="::\'plugins/es/templates/document/item_document.html\'"></ng-include>\n </div>\n</ng-repeat>\n'),e.put("plugins/es/templates/document/lookup_form.html",'<div class="lookupForm">\n\n\n <div class="item no-padding">\n\n \x3c!--<div class="button button-small button-text button-stable button-icon-event padding no-padding-right ink"\n ng-repeat="filter in search.filters" ng-if="filter">\n <span ng-bind-html="\'DOCUMENT.LOOKUP.TX_SEARCH_FILTER.\'+filter.type|translate:filter"></span>\n <i class="icon ion-close" ng-click="itemRemove($index)"></i>\n\n </div>--\x3e\n\n <label class="item-input">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'DOCUMENT.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearchText()">\n <input type="text" class="hidden-xs hidden-sm" id="{{searchTextId}}" placeholder="{{\'DOCUMENT.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearchText()">\n <div class="helptip-anchor-center">\n <a id="{{helptipPrefix}}-search-text"></a>\n </div>\n\n </label>\n </div>\n\n\n <div class="padding-top padding-xs" style="display: block; height: 60px;">\n <div class="pull-left">\n <h4 ng-if="search.last" translate>\n DOCUMENT.LOOKUP.LAST_DOCUMENTS\n </h4>\n <h4 ng-if="!search.last">\n {{\'COMMON.RESULTS_LIST\'|translate}}\n </h4>\n <h5 class="dark" ng-if="!search.loading && search.total">\n <span translate="COMMON.RESULTS_COUNT" translate-values="{count: search.total}"></span>\n <small class="gray" ng-if=":rebind:search.took && expertMode">\n - {{:rebind:\'COMMON.EXECUTION_TIME\'|translate: {duration: search.took} }}\n </small>\n <small class="gray" ng-if=":rebind:expertMode && search.filters && search.filters.length">\n - <a ng-click="toggleShowQuery()" ng-if="!showQuery">\n <span translate>DOCUMENT.LOOKUP.SHOW_QUERY</span>\n <i class="icon ion-arrow-down-b gray"></i>\n </a>\n <a ng-click="toggleShowQuery()" ng-if="showQuery">\n <span translate>DOCUMENT.LOOKUP.HIDE_QUERY</span>\n <i class="icon ion-arrow-up-b gray"></i>\n </a>\n </small>\n </h5>\n <h5 class="gray" ng-if="search.loading">\n <ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner>\n <span translate>COMMON.SEARCHING</span>\n <br>\n </h5>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a class="button button-text button-small ink" ng-if="login" ng-click="showActionsPopover($event)">\n {{\'DOCUMENT.LOOKUP.BTN_ACTIONS\' | translate}}\n <i class="icon ion-arrow-down-b"></i>\n </a>\n \n <button class="button button-small button-stable ink" ng-click="doSearchText()">\n {{\'COMMON.BTN_SEARCH\' | translate:search}}\n </button>\n </div>\n </div>\n\n <div class="item no-border no-padding" ng-if=":rebind:search.filters && search.filters.length && expertMode">\n <small class="no-padding no-margin" ng-if="showQuery">\n <span class="gray text-wrap dark">{{:rebind:search.query}}</span>\n </small>\n </div>\n\n <ion-list class="list" ng-class="::motion.ionListClass">\n\n <ng-include src="\'plugins/es/templates/document/items_documents.html\'"></ng-include>\n\n </ion-list>\n\n <ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n </ion-infinite-scroll>\n\n</div>'),e.put("plugins/es/templates/document/lookup_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>DOCUMENT.LOOKUP.POPOVER_ACTIONS.TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n <a class="item item-icon-left assertive ink" ng-class="{\'gray\': !search.total}" ng-click="removeAll()">\n <i class="icon ion-trash-a"></i>\n {{\'DOCUMENT.LOOKUP.POPOVER_ACTIONS.REMOVE_ALL\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/document/lookup.html",'<ion-view>\n <ion-nav-title>\n <span translate>DOCUMENT.LOOKUP.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n <ng-include src="\'plugins/es/templates/document/lookup_form.html\'"></ng-include>\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/group/edit_group.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span class="visible-xs" ng-if="id" ng-bind-html="formData.title"></span>\n <span class="visible-xs" ng-if="!loading && !id" translate>GROUP.EDIT.TITLE_NEW</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear visible-xs visible-sm" ng-class="{\'ion-android-send\':!id, \'ion-android-done\': id}" ng-click="save()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n <div class="row no-padding">\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col">\n \x3c!-- loading --\x3e\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <form name="recordForm" novalidate="" ng-submit="save()">\n\n \x3c!-- --\x3e\n <div class="list" ng-class="motion.ionListClass" ng-init="setForm(recordForm)">\n\n <div class="item hidden-xs">\n <h1 ng-if="id" ng-bind-html="formData.title"></h1>\n <h1 ng-if="!id" translate>GROUP.EDIT.TITLE_NEW</h1>\n <h2 class="balanced" ng-if="!id">\n <i class="icon ion-android-people"></i>\n <i class="icon ion-android-lock" ng-if="formData.type==\'managed\'"></i>\n {{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}\n </h2>\n </div>\n <div class="item" ng-if="id">\n <h4 class="gray">\n <i class="icon ion-calendar"></i>\n {{\'COMMON.LAST_MODIFICATION_DATE\'|translate}} {{formData.time | formatDate}}\n </h4>\n <div class="badge badge-balanced badge-editable" ng-click="showRecordTypeModal()">\n {{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}\n </div>\n </div>\n\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_pictures.html\'"></ng-include>\n\n <div class="item item-divider" translate>GROUP.GENERAL_DIVIDER</div>\n\n \x3c!-- title --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>GROUP.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'GROUP.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="group-record-title" ng-model="formData.title" ng-minlength="3" ng-required="true">\n </div>\n <div class="form-errors" ng-if="form.$submitted && form.title.$error" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n </div>\n\n \x3c!-- description --\x3e\n <div class="item item-input item-floating-label">\n <span class="input-label" translate>GROUP.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'GROUP.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10">\n </textarea>\n </div>\n\n \x3c!-- social networks --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_socials.html\'"></ng-include>\n\n </div>\n\n <div class="padding hidden-xs hidden-sm text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>\n COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive button-raised ink" type="submit" ng-if="!id" translate>\n COMMON.BTN_PUBLISH\n </button>\n <button class="button button-assertive button-raised ink" type="submit" ng-if="id" translate>\n COMMON.BTN_SAVE\n </button>\n </div>\n </form>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n </div>\n \n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/group/item_group.html",'<a name="group-{{:rebind:group.hash}}"></a>\n<ion-item id="group-{{:rebind:block.hash}}" class="item item-icon-left item-group {{ionItemClass}}" ng-click="select(group)">\n\n <i class="icon ion-cube stable" ng-if=":rebind:(!group.empty && !group.avatar)"></i>\n <i class="avatar" ng-if=":rebind:!group.empty && group.avatar" style="background-image: url(\'{{:rebind:block.avatar.src}}\')"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4 class="dark">\n <i class="ion-clock"></i>\n {{:rebind:group.creationTime|formatDate}}\n </h4>\n <h4>\n \x3c!-- membersCount --\x3e\n <i class="dark ion-person"></i>\n <span class="dark" ng-if=":rebind:group.membersCount">+{{:rebind:group.membersCount}}</span>\n </h4>\n </div>\n\n <div class="col col-33 positive hidden-md">\n <h4><i class="ion-person"></i> <span ng-bind-html=":rebind:group.title"></span></h4>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/es/templates/group/items_groups.html",'\n\n<div class="item row row-header hidden-xs hidden-sm" ng-if="expertMode">\n\n <a class="no-padding dark col col-header" ng-click="toggleSort(\'medianTime\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'medianTime\'"></cs-sort-icon>\n {{\'GROUP.LOOKUP.HEADER_CREATION_TIME\' | translate}}\n </a>\n <a class="no-padding dark col col-header" ng-click="toggleSort(\'issuer\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'issuer\'"></cs-sort-icon>\n {{\'GROUP.LOOKUP.HEADER_ISSUER\' | translate}}\n </a>\n <div class="col col-20"> \n </div>\n <a class="no-padding dark col col-20 col-header" ng-click="toggleSort(\'number\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'number\'"></cs-sort-icon>\n {{\'GROUP.LOOKUP.HEADER_NAME\' | translate}}\n </a>\n</div>\n\n<div class="padding gray" ng-if=":rebind:!search.loading && !search.results.length" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n\n<ng-repeat ng-repeat="group in :rebind:search.results" ng-include="\'plugins/es/templates/group/item_group.html\'">\n</ng-repeat>\n'),e.put("plugins/es/templates/group/list.html",'<ion-list class="{{::motion.ionListClass}}">\n\n <ion-item ng-repeat="notification in search.results" class="item-border-large item-text-wrap ink item-avatar" ng-class="{\'unread\': !notification.read}" ng-click="select(notification)">\n\n <i ng-if="!notification.avatar" class="item-image icon {{::notification.avatarIcon}}"></i>\n <i ng-if="notification.avatar" class="item-image avatar" style="background-image: url({{::notification.avatar.src}})"></i>\n\n <h3 trust-as-html="notification.message | translate:notification"></h3>\n <h4>\n <i class="icon {{notification.icon}}"></i> <span class="dark">{{notification.time|formatFromNow}}</span>\n <span class="gray">| {{notification.time|formatDate}}</span>\n </h4>\n </ion-item>\n</ion-list>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n</ion-infinite-scroll>\n'),e.put("plugins/es/templates/group/lookup_form.html",'<div class="lookupForm">\n\n <button class="button button-small button-positive button-clear ink pull-right padding-right hidden-sm hidden-xs" ng-click="showNewRecordModal()">\n <i class="icon ion-plus"></i>\n {{\'GROUP.LOOKUP.BTN_NEW\' | translate}}\n </button>\n\n \x3c!-- search text--\x3e\n <label class="item item-input">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'GROUP.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearchText()">\n <input type="text" class="hidden-xs hidden-sm" id="{{searchTextId}}" placeholder="{{\'GROUP.LOOKUP.SEARCH_HELP\'|translate}}" ng-model="search.text" on-return="doSearchText()">\n <div class="helptip-anchor-center">\n <a id="helptip-group-search-text"></a>\n </div>\n\n </label>\n\n <div class="padding-top padding-xs" style="display: block; height: 60px;">\n <div class="pull-left">\n <h4 ng-if="search.type==\'open\'" translate>\n GROUP.LOOKUP.OPEN_RESULTS_LIST\n </h4>\n <h4 ng-if="search.type==\'last\'" translate>\n GROUP.LOOKUP.LAST_RESULTS_LIST\n </h4>\n <h4 ng-if="search.type==\'managed\'" translate>\n GROUP.LOOKUP.MANAGED_RESULTS_LIST\n </h4>\n <h4 ng-if="search.type==\'text\'">\n {{\'COMMON.RESULTS_LIST\'|translate}}\n </h4>\n <h5 class="dark" ng-if="!search.loading && search.total">\n <span translate="COMMON.RESULTS_COUNT" translate-values="{count: search.total}"></span>\n <small class="gray" ng-if=":rebind:search.took && expertMode">\n - {{:rebind:\'COMMON.EXECUTION_TIME\'|translate: {duration: search.took} }}\n </small>\n </h5>\n <h5 class="gray" ng-if="search.loading">\n <ion-spinner class="icon ion-spinner-small" icon="android"></ion-spinner>\n <span translate>COMMON.SEARCHING</span>\n <br>\n </h5>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a ng-if="enableFilter" class="button button-text button-small ink icon ion-clock" ng-class="{\'button-text-positive\': search.type==\'last\'}" ng-click="doSearchLast()">\n {{\'GROUP.LOOKUP.BTN_LAST\' | translate}}\n </a>\n \n <button class="button button-small button-stable ink" ng-click="doSearchText()">\n {{\'COMMON.BTN_SEARCH\' | translate:search}}\n </button>\n </div>\n </div>\n\n <ion-list class="list {{ionListClass}}">\n\n <ng-include src="\'plugins/es/templates/group/items_groups.html\'"></ng-include>\n\n </ion-list>\n\n <ion-infinite-scroll ng-if="search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n </ion-infinite-scroll>\n\n</div>'),e.put("plugins/es/templates/group/lookup.html",'<ion-view class="view-group">\n <ion-nav-title>\n <span translate>GROUP.LOOKUP.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n <ng-include src="\'plugins/es/templates/group/lookup_form.html\'"></ng-include>\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/group/modal_record_type.html",'<ion-modal-view>\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>GROUP.TYPE.TITLE</h1>\n </ion-header-bar>\n\n <ion-content class="lookupForm padding">\n <h3 translate>GROUP.TYPE.SELECT_TYPE</h3>\n\n \t<div class="list">\n\n \x3c!-- open group --\x3e\n <div class="item item-complex card stable-bg item-icon-left ink" ng-click="closeModal(\'open\')">\n <div class="item-content item-text-wrap">\n <i class="item-image icon ion-android-people dark"></i>\n <h2 translate>GROUP.TYPE.OPEN_GROUP</h2>\n <h4 class="gray" translate>GROUP.TYPE.OPEN_GROUP_HELP</h4>\n </div>\n </div>\n\n \x3c!-- managed group --\x3e\n <div class="item item-complex card stable-bg item-icon-left ink" ng-click="closeModal(\'managed\')">\n <div class="item-content item-text-wrap">\n <i class="item-image icon ion-android-people dark"></i>\n <i class="icon-secondary ion-android-lock dark" style="left: 10px; top: -8px;"></i>\n <h2 translate>GROUP.TYPE.MANAGED_GROUP</h2>\n <h4 class="gray" translate>GROUP.TYPE.MANAGED_GROUP_HELP</h4>\n </div>\n </div>\n\n </div>\n</ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/group/view_record.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit">\n <i class="icon ion-android-create"></i>\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n <div class="positive-900-bg hero">\n <div class="content" ng-if="!loading">\n <i class="avatar cion-registry-{{formData.type}}" ng-if="!formData.thumbnail"></i>\n <i class="avatar" style="background-image: url({{::formData.thumbnail.src}})" ng-if="formData.thumbnail"></i>\n <h3 ng-bind-html="formData.title"></h3>\n <h4> </h4>\n </div>\n <h4 class="content light" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </h4>\n </div>\n\n <div class="row no-padding-xs">\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n\n <div class="col list item-text-wrap no-padding-xs" ng-class="motion.ionListClass">\n\n <div class="item">\n <h2 class="gray">\n <a ng-if="formData.city" ui-sref="app.groups({location:formData.city})">\n <i class="icon ion-location"></i>\n <span ng-bind-html="formData.city"></span>\n </a>\n <span ng-if="formData.city && formData.type"> | </span>\n <a ng-if="formData.type" ui-sref="app.groups({type:formData.type})">\n <i class="icon ion-flag"></i>\n {{\'GROUP.TYPE.ENUM.\'+formData.type|upper|translate}}\n </a>\n </h2>\n <h4>\n <i class="icon ion-clock" ng-if="formData.time"></i>\n <span translate>COMMON.SUBMIT_BY</span>\n <a ng-class="{\'positive\': issuer.name, \'gray\': !issuer.name}" ui-sref="app.user_identity({pubkey:issuer.pubkey, name: issuer.name})">\n <ng-if ng-if="issuer.name">\n <i class="icon ion-person"></i>\n {{::issuer.name}}\n </ng-if>\n <span ng-if="!issuer.name">\n <i class="icon ion-key"></i>\n {{issuer.pubkey|formatPubkey}}\n </span>\n </a>\n <span>\n {{formData.time|formatFromNow}}\n <h4 class="gray hidden-xs">|\n {{formData.time | formatDate}}\n </h4>\n </span>\n </h4>\n </div>\n\n \x3c!-- Buttons bar--\x3e\n <div class="item large-button-bar hidden-xs hidden-sm">\n <button class="button button-stable button-small-padding icon ion-android-share-alt" ng-click="showSharePopover($event)">\n </button>\n <button class="button button-stable icon-left ink-dark" ng-if="canEdit" ng-click="delete()">\n <i class="icon ion-trash-a assertive"></i>\n <span class="assertive"> {{\'COMMON.BTN_DELETE\' | translate}}</span>\n </button>\n <button class="button button-calm icon-left ion-android-create ink" ng-if="canEdit" ng-click="edit()">\n {{\'COMMON.BTN_EDIT\' | translate}}\n </button>\n </div>\n\n <ion-item>\n <h2>\n <span class="text-keep-lines" ng-bind-html="formData.description"></span>\n </h2>\n </ion-item>\n\n <ion-item>\n <h4 ng-if="formData.address">\n <span class="gray" translate>REGISTRY.VIEW.LOCATION</span>\n <a class="positive" target="_blank" href="https://www.google.fr/maps/?q={{formData.address}},%20{{formData.city}}">\n <span ng-bind-html="formData.address"></span>\n <span ng-if="formData.city"> - </span>\n <span ng-bind-html="formData.city"></span>\n </a>\n </h4>\n </ion-item>\n\n \x3c!-- Socials networks --\x3e\n <ng-if ng-if="formData.socials && formData.socials.length>0">\n <ion-item class="item-icon-left" type="no-padding item-text-wrap" ng-repeat="social in formData.socials track by social.url" id="social-{{social.url|formatSlug}}">\n <i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\'}"></i>\n <p ng-if="social.type && social.type != \'web\'">{{social.type}}</p>\n <h2>\n <a href="{{social.url}}" ng-if="social.type != \'email\'" target="_blank">{{social.url}}</a>\n <a href="mailto:{{social.url}}" ng-if="social.type == \'email\'">{{social.url}}</a>\n </h2>\n </ion-item>\n </ng-if>\n\n <div class="lazy-load">\n\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/view_pictures.html\'"></ng-include>\n\n\n <span class="item item-divider" ng-if="formData.pubkey">\n <span translate>REGISTRY.TECHNICAL_DIVIDER</span>\n </span>\n\n \x3c!-- pubkey --\x3e\n <div class="item item-icon-left item-text-wrap ink" ng-if="formData.pubkey" copy-on-click="{{::formData.pubkey}}">\n <i class="icon ion-key"></i>\n <span translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <h4 class="dark">{{::formData.pubkey}}</h4>\n </div>\n\n \x3c!-- comments --\x3e\n <ng-include src="\'plugins/es/templates/common/view_comments.html\'"></ng-include>\n </div>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n </div>\n </ion-content>\n\n\n\n</ion-view>\n'),e.put("plugins/es/templates/home/home_extend.html",'\x3c!-- notifications --\x3e\n<ng-if ng-if=":state:extensionPoint=== \'header-buttons\'" class="visible-xs visible-sm">\n \x3c!-- messages --\x3e\n <button class="button button-clear icon ion-email" ng-if="login && $root.walletData.messages.unreadCount" ui-sref="app.user_message">\n <span ng-if="$root.walletData.messages.unreadCount" class="badge badge-button badge-positive">{{$root.walletData.messages.unreadCount}}</span>\n </button>\n\n \x3c!-- notifications --\x3e\n <button class="button button-clear icon ion-android-notifications" ng-if="login && $root.walletData.notifications.unreadCount" ui-sref="app.view_notifications">\n <span class="badge badge-button badge-positive">{{$root.walletData.notifications.unreadCount}}</span>\n </button>\n</ng-if>\n'),e.put("plugins/es/templates/join/modal_join_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'select-account-type\'">\n\n \x3c!-- ornigzation wallet --\x3e\n <div class="item item-complex card stable-bg item-icon-left item-icon-right ink" ng-class="{ activated: accountTypeMember != null && !accountTypeMember }" ng-click="selectAccountType(\'organization\')">\n <div class="item-content item-text-wrap">\n <i class="item-image icon dark cion-registry-association"></i>\n <h2 translate>ACCOUNT.NEW.ORGANIZATION_ACCOUNT</h2>\n <h4 class="gray" translate>ACCOUNT.NEW.ORGANIZATION_ACCOUNT_HELP</h4>\n <i class="icon dark ion-ios-arrow-right"></i>\n </div>\n </div>\n\n</ng-if>\n\n\x3c!-- Add a slide --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'last-slide\'">\n\n \x3c!-- STEP 6: organization type --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n\n <p>TOTO</p>\n\n </ion-content>\n </ion-slide-page>\n\n</ng-if>\n'),e.put("plugins/es/templates/menu_extend.html",'\n\x3c!-- Main section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'menu-discover\'">\n <ion-item menu-close ng-if="$root.settings.expertMode" class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/network/data" ui-sref="app.es_network">\n <i class="icon ion-cloud"></i>\n <span translate>MENU.NETWORK</span>\n </ion-item>\n <a id="helptip-menu-btn-network"></a>\n\n</ng-if>\n\n\x3c!-- Toolbar section --\x3e\n<div ng-if=":state:enable && extensionPoint === \'nav-buttons-right\'" class="hidden-xs hidden-sm">\n\n \x3c!-- messages --\x3e\n <button class="button button-clear icon ion-email" ng-if="login" active-link="gray" active-link-path-prefix="#/app/message" ng-click="showMessagesPopover($event)">\n <span ng-if="$root.walletData.messages.unreadCount" class="badge badge-button badge-positive">{{walletData.messages.unreadCount}}</span>\n </button>\n\n \x3c!-- notifications --\x3e\n <button class="button button-clear icon ion-android-notifications" ng-if="login" active-link="gray" active-link-path-prefix="#/app/notifications" ng-click="showNotificationsPopover($event)">\n <span ng-if="walletData.notifications.unreadCount" class="badge badge-button badge-positive">{{walletData.notifications.unreadCount}}</span>\n </button>\n</div>\n\n\x3c!-- User section --\x3e\n<div ng-if=":state:enable && extensionPoint === \'menu-user\'" class="visible-xs visible-sm">\n\n <a menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/message" ng-class="{\'item-menu-disable\': !login}" ng-click="loginAndGo(\'app.user_message\')">\n <i class="icon ion-email"></i>\n <span translate>MENU.MESSAGES</span>\n <span class="badge badge-positive" ng-if="walletData.messages.unreadCount">{{walletData.messages.unreadCount}}</span>\n </a>\n\n <a menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/notifications" ng-class="{\'item-menu-disable\': !login}" ng-click="loginAndGo(\'app.view_notifications\')">\n <i class="icon ion-android-notifications"></i>\n <span translate>MENU.NOTIFICATIONS</span>\n <span class="badge badge-positive" ng-if="walletData.notifications.unreadCount">{{walletData.notifications.unreadCount}}</span>\n </a>\n\n</div>\n'),e.put("plugins/es/templates/message/compose_form.html",' <form name="messageForm" novalidate="" ng-submit="doSend()">\n\n <div class="list no-margin" ng-init="setForm(messageForm)">\n\n <a class="item item-icon-right gray ink" ng-class="{\'item-input-error\': form.$submitted && !formData.destPub}" ng-click="showWotLookupModal()">\n <span class="gray" translate>MESSAGE.COMPOSE.TO</span>\n <span class="badge badge-royal" ng-if="destUid"><i class="ion-person"></i> {{destUid}}</span> \n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n <div class="form-errors" ng-if="form.$submitted && !formData.destPub">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n <div class="item item-text-wrap">\n <span class="gray" translate>TRANSFER.FROM</span>\n <span class="badge badge-balanced">\n <ion-spinner icon="android" ng-if="!$root.walletData.pubkey"></ion-spinner>\n <span ng-if="$root.walletData.pubkey && !$root.walletData.name">\n {{$root.walletData.pubkey| formatPubkey}} \n </span>\n <span ng-if="$root.walletData.pubkey && $root.walletData.name">\n {{$root.walletData.name}}\n </span>\n </span>\n </div>\n\n \x3c!-- Object --\x3e\n <div class="item item-input" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n \x3c!--<span class="input-label">{{\'MESSAGE.COMPOSE.OBJECT\' | translate}}</span>--\x3e\n <input type="text" placeholder="{{\'MESSAGE.COMPOSE.OBJECT_HELP\' | translate}}" name="title" ng-model="formData.title" ng-maxlength="256" required>\n \n </div>\n <div class="form-errors" ng-show="form.$submitted && form.title.$error" ng-messages="form.title.$error">\n <div class="form-error" ng-message="maxlength">\n <span translate="MESSAGE.ERROR.MESSAGE_CONTENT_TOO_LONG" translate-values="{maxLength: 256}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- Content --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.content.$invalid}">\n <span class="input-label">{{\'MESSAGE.COMPOSE.MESSAGE\' | translate}}</span>\n <textarea placeholder="{{\'MESSAGE.COMPOSE.MESSAGE_HELP\' | translate}}" name="content" ng-model="formData.content" rows="8" ng-maxlength="5000">\n </textarea>\n </div>\n <div class="form-errors" ng-show="form.$submitted && form.content.$error" ng-messages="form.content.$error">\n <div class="form-error" ng-message="maxlength">\n <span translate="MESSAGE.ERROR.MESSAGE_CONTENT_TOO_LONG" translate-values="{maxLength: 5000}"></span>\n </div>\n </div>\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL</button>\n <button class="button button-positive ink" type="submit" translate>TRANSFER.BTN_SEND</button>\n </div>\n\n \x3c!-- Encryption info --\x3e\n <div class="list no-padding">\n <div class="item item-icon-left item-text-wrap">\n <i class="icon ion-ios-information-outline positive"></i>\n <h4 class="positive" translate>MESSAGE.COMPOSE.ENCRYPTED_HELP</h4>\n </div>\n </div>\n </form>\n\n'),e.put("plugins/es/templates/message/compose.html",'<ion-view left-buttons="leftButtons" id="composeMessage">\n <ion-nav-title>\n <span class="visible-xs visible-sm" nf-if="!isReply" translate>MESSAGE.COMPOSE.TITLE</span>\n <span class="visible-xs visible-sm" nf-if="isReply" translate>MESSAGE.COMPOSE.TITLE_REPLY</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSend()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n <div class="row">\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n <div class="col">\n <h2 class="hidden-xs hidden-sm">\n {{\'MESSAGE.COMPOSE.SUB_TITLE\'|translate}}\n </h2>\n <h4 class="hidden-xs hidden-sm"> </h4>\n <ng-include src="\'plugins/es/templates/message/compose_form.html\'"></ng-include>\n </div>\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/message/list.html",'<ion-view left-buttons="leftButtons" class="view-messages">\n <ion-nav-title>\n <span translate>MESSAGE.LIST.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="load()">\n </button>\n\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-more-vertical"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs">\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh(true)">\n </ion-refresher>\n\n \x3c!-- Buttons bar--\x3e\n <ion-list>\n <div class="item large-button-bar hidden-xs hidden-sm">\n\n <button class="button button-stable button-small-padding icon ion-loop" ng-click="load()">\n </button>\n\n <button class="button button-calm icon ion-compose" ng-click="showNewMessageModal()">\n {{\'MESSAGE.BTN_COMPOSE\' | translate}}\n </button>\n\n <button class="button button-stable icon-right ink" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-more-vertical"></i> \n {{\'COMMON.BTN_OPTIONS\' | translate}}\n </button>\n </div>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a class="button button-text button-small ink icon ion-archive" ng-class="{\'button-text-positive\': type==\'inbox\'}" ng-click="setType(\'inbox\')">\n {{\'MESSAGE.LIST.INBOX\' | translate}}\n </a>\n \n <a class="button button-text button-small ink icon ion-paper-airplane" ng-class="{\'button-text-positive\': type==\'outbox\'}" ng-click="setType(\'outbox\')" class="badge-balanced">\n {{\'MESSAGE.LIST.OUTBOX\' | translate}}\n </a>\n </div>\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n </ion-list>\n\n <ion-list class="{{::motion.ionListClass}}" can-swipe="$root.device.enable" ng-hide="loading">\n\n <div class="padding gray" ng-if="!messages.length">\n <span ng-if="type==\'inbox\'" translate>MESSAGE.NO_MESSAGE_INBOX</span>\n <span ng-if="type==\'outbox\'" translate>MESSAGE.NO_MESSAGE_OUTBOX</span>\n </div>\n\n <ion-item class="item item-border-large item-avatar item-icon-right ink" ng-repeat="msg in messages" ui-sref="app.user_view_message({type:type, id:msg.id})">\n\n <i ng-if="::!msg.avatar" class="item-image icon" ng-class="{\'ion-person\': msg.name, \'ion-email\': !msg.name}"></i>\n <i ng-if="::msg.avatar" class="item-image avatar" style="background-image: url({{::msg.avatar.src}})"></i>\n\n <h4 class="pull-right hidden-xs hidden-sm">\n <span class="dark"><i class="ion-clock"></i> {{::msg.time|formatFromNow}}</span>\n <span class="gray">| {{::msg.time|formatDate}}</span>\n </h4>\n <h4 class="pull-right visible-xs visible-sm dark"><i class="ion-clock"></i> {{::msg.time|formatFromNow}}</h4>\n <h3>\n <a class="positive" ng-if="::msg.name" ui-sref="app.user_identity({pubkey:msg.issuer, name:msg.name})">\n <i class="ion-person"></i>\n {{::msg.name}}\n </a>\n <a class="gray" ng-if="::!msg.name" ui-sref="app.user_identity({pubkey:msg.issuer})">\n <i class="ion-key"></i>\n {{::msg.issuer|formatPubkey}}\n </a>\n </h3>\n <h2 ng-class="{\'unread\': !msg.read}">{{::msg.title}}</h2>\n <p>{{::msg.summary||msg.content}}</p>\n <i class="icon ion-ios-arrow-right"></i>\n <ion-option-button class="button-stable" ng-click="showReplyModal($index)" translate>MESSAGE.BTN_REPLY</ion-option-button>\n <ion-option-button class="button-assertive" ng-click="delete($index)" translate>COMMON.BTN_DELETE</ion-option-button>\n\n </ion-item>\n </ion-list>\n </ion-content>\n\n <button id="fab-add-message-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-compose visible-xs visible-sm spin" ng-click="showNewMessageModal()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/message/lookup_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>MESSAGE.LIST.POPOVER_ACTIONS.TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n <a class="item item-icon-left ink" ng-class="{\'gray\': (type != \'inbox\' && !messages.length)}" ng-click="markAllAsRead()">\n <i class="icon ion-android-checkmark-circle"></i>\n {{\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\' | translate}}\n </a>\n\n <a class="item item-icon-left assertive ink" ng-class="{\'gray\': !messages.length}" ng-click="deleteAll()">\n <i class="icon ion-trash-a"></i>\n {{\'MESSAGE.LIST.POPOVER_ACTIONS.DELETE_ALL\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/message/modal_compose.html",'<ion-modal-view id="composeMessage" class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" ng-if="!isReply" translate>MESSAGE.COMPOSE.TITLE</h1>\n <h1 class="title" ng-if="isReply" translate>MESSAGE.COMPOSE.TITLE_REPLY</h1>\n\n <button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSend()">\n </button>\n </ion-header-bar>\n\n <ion-content scroll="true">\n <ng-include src="\'plugins/es/templates/message/compose_form.html\'"></ng-include>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/message/popover_message.html",'<ion-popover-view class="fit hidden-xs hidden-sm popover-notification" ng-controller="PopoverMessageCtrl">\n <ion-header-bar class="stable-bg block">\n <div class="title" translate>MESSAGE.NOTIFICATIONS.TITLE</div>\n\n <div class="pull-right">\n <a class="positive" ng-click="showNewMessageModal()" translate>MESSAGE.BTN_COMPOSE</a>\n </div>\n </ion-header-bar>\n <ion-content scroll="true">\n <div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n <div class="padding gray" ng-if="!search.loading && !search.results.length" translate>\n MESSAGE.NO_MESSAGE_INBOX\n </div>\n\n <ion-list>\n\n <ion-item ng-repeat="notification in search.results" class="item-border-large item-text-wrap ink item-avatar" ng-class="{\'unread\': !notification.read}" ng-click="select(notification)">\n\n <i ng-if="::!notification.avatar" class="item-image icon ion-email"></i>\n <i ng-if="::notification.avatar" class="item-image avatar" style="background-image: url({{::notification.avatar.src}})"></i>\n\n <h3>\n <span translate>MESSAGE.NOTIFICATIONS.MESSAGE_RECEIVED</span>\n <span class="positive" ng-if="::notification.name"><i class="ion-person"></i> {{::notification.name}}</span>\n <span class="gray" ng-if="::!notification.name"><i class="ion-key"></i> {{::notification.issuer|formatPubkey}}</span>\n </h3>\n <h4>\n <i class="icon ion-archive balanced"></i> <span class="dark">{{notification.time|formatFromNow}}</span>\n <span class="gray">| {{::notification.time|formatDate}}</span>\n </h4>\n </ion-item>\n </ion-list>\n\n <ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n </ion-infinite-scroll>\n </ion-content>\n\n <ion-footer-bar class="stable-bg block">\n\n \x3c!-- show all --\x3e\n <div class="pull-right">\n <a class="positive" ui-sref="app.user_message" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\n </div>\n </ion-footer-bar>\n</ion-popover-view>\n'),e.put("plugins/es/templates/message/view_message.html",'<ion-view left-buttons="leftButtons" class="view-message">\n <ion-nav-title>\n <span translate>MESSAGE.VIEW.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col no-padding">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list animate-fade-slide-in item-text-wrap">\n\n \x3c!-- Buttons bar--\x3e\n <div class="item large-button-bar hidden-xs hidden-sm">\n <button class="button button-stable icon-left ink-dark" ng-click="delete()">\n <i class="icon ion-trash-a assertive"></i>\n <span class="assertive"> {{\'COMMON.BTN_DELETE\' | translate}}</span>\n </button>\n <button class="button button-stable icon ion-reply" ng-click="showReplyModal()">\n {{\'MESSAGE.BTN_REPLY\' | translate}}\n </button>\n \x3c!--<button class="button button-small button-stable icon ion-reply"\n ng-click="showForwardModal()">\n {{\'MESSAGE.BTN_FORWARD\' | translate}}\n </button>--\x3e\n </div>\n\n <div class="item item-avatar" ng-class="{\'item-avatar\': formData.avatar}">\n\n <i ng-if="!formData.avatar" class="item-image ion-person"></i>\n <i ng-if="formData.avatar" class="item-image avatar" style="background-image: url({{::formData.avatar.src}})"></i>\n\n <h1 class="title hidden-xs hidden-sm" ng-bind-html="formData.title"></h1>\n <h4>\n {{type == \'inbox\' ? \'MESSAGE.VIEW.SENDER\': \'MESSAGE.VIEW.RECIPIENT\'|translate}}\n <a class="positive" ui-sref="app.user_identity({pubkey: (type == \'inbox\') ? formData.issuer : formData.recipient, uid: formData.name||formData.uid})">\n <span ng-if="formData.name||formData.uid">\n <i class="ion-person"></i>\n {{formData.name||formData.uid}}\n </span>\n <span ng-if="!formData.name&&!formData.uid" class="gray">\n <i class="ion-key gray"></i>\n {{formData.issuer|formatPubkey}}\n </span>\n </a>\n <span class="hidden-xs hidden-sm">\n <i class="ion-clock"></i>\n {{formData.time|formatFromNow}}\n <span class="gray">|\n {{formData.time | formatDate}}\n </span>\n </span>\n </h4>\n <h5 class="gray visible-xs visible-sm">\n <i class="ion-clock"></i> {{formData.time | formatDate}}\n </h5>\n </div>\n\n \x3c!-- content --\x3e\n <ion-item class="visible-xs visible-sm">\n <h1 class="title" ng-bind-html="formData.title"></h1>\n </ion-item>\n\n \x3c!-- content --\x3e\n <ion-item>\n <p ng-bind-html="formData.html">\n </p>\n\n <div class="padding gray" ng-if="!formData.content" translate>\n MESSAGE.VIEW.NO_CONTENT\n </div>\n </ion-item>\n\n\n </div>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n </div>\n </ion-content>\n\n <button id="fab-view-message-reply" class="button button-fab button-fab-bottom-right button-calm icon ion-reply visible-xs visible-sm spin" ng-click="showReplyModal()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/message/view_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left assertive ink" ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'MESSAGE.VIEW.DELETE\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/item_content_peer.html",'\n <i class="icon ion-android-desktop" ng-class=":rebind:{\'balanced\': peer.online && peer.hasMainConsensusBlock, \'energized\': peer.online && peer.hasConsensusBlock, \'gray\': peer.online && !peer.hasConsensusBlock && !peer.hasMainConsensusBlock, \'stable\': !peer.online}" ng-if=":rebind:!peer.avatar"></i>\n <b class="icon-secondary ion-person" ng-if=":rebind:!peer.avatar" ng-class=":rebind:{\'balanced\': peer.online && peer.hasMainConsensusBlock, \'energized\': peer.online && peer.hasConsensusBlock, \'gray\': peer.online && !peer.hasConsensusBlock && !peer.hasMainConsensusBlock, \'stable\': !peer.online}" style="left: 26px; top: -3px;"></b>\n <i class="avatar" ng-if=":rebind:peer.avatar" style="background-image: url(\'{{:rebind:peer.avatar.src}}\')"></i>\n <b class="icon-secondary assertive ion-close-circled" ng-if=":rebind:!peer.online" style="left: 37px; top: -10px;"></b>\n\n <div class="row no-padding">\n <div class="col no-padding">\n <h3 class="dark">{{:rebind:peer.dns || peer.server}}</h3>\n <h4>\n <span class="gray" ng-if=":rebind:!peer.name">\n <i class="ion-key"></i> {{:rebind:peer.pubkey|formatPubkey}}\n </span>\n <span class="positive" ng-if=":rebind:peer.name">\n <i class="ion-person"></i> {{:rebind:peer.name}}\n </span>\n <span class="gray">{{:rebind:peer.dns && (\' | \' + peer.server) + (peer.ep.path||\'\') }}</span>\n </h4>\n </div>\n <div class="col col-15 no-padding text-center hidden-xs hidden-sm" ng-if="::expertMode">\n <div style="min-width: 50px; padding-top: 5px;">\n <span ng-if=":rebind:peer.isSsl()" title="SSL">\n <i class="ion-locked"></i><small class="hidden-md"> SSL</small>\n </span>\n <span ng-if=":rebind:peer.hasEndpoint(\'GCHANGE_SUBSCRIPTION_API\')" title="{{\'ES_PEER.EMAIL_SUBSCRIPTION_COUNT\'|translate: peer.docCount }}">\n <i class="ion-email"></i> {{:rebind:peer.docCount.emailSubscription || \'?\'}}\n </span>\n </div>\n <div ng-if=":rebind:peer.isTor()">\n <i class="ion-bma-tor-api"></i>\n </div>\n <div ng-if=":rebind:peer.isWs2p()&&peer.isTor()" ng-click="showWs2pPopover($event, peer)">\n <i class="ion-bma-tor-api"></i>\n </div>\n </div>\n <div class="col col-20 no-padding text-center" ng-if="::!expertMode && search.type != \'offline\'">\n <div style="min-width: 50px; padding-top: 5px;" ng-if=":rebind:peer.docCount.emailSubscription!==undefined">\n <span ng-if=":rebind:peer.hasEndpoint(\'GCHANGE_SUBSCRIPTION_API\')" title="{{\'ES_PEER.EMAIL_SUBSCRIPTION_COUNT\'|translate: peer.docCount }}">\n <i class="ion-email"></i> {{:rebind:peer.docCount.emailSubscription || \'?\'}}\n </span>\n </div>\n </div>\n <div class="col col-20 no-padding text-center" ng-if="::expertMode && search.type != \'offline\'">\n <h4 class="hidden-sm hidden-xs gray">\n {{:rebind:peer.software||\'?\'}}\n </h4>\n <h4 class="hidden-sm hidden-xs gray">{{:rebind: peer.version ? (\'v\'+peer.version) : \'\'}}</h4>\n </div>\n <div class="col col-20 no-padding text-center" id="{{$index === 0 ? helptipPrefix + \'-peer-0-block\' : \'\'}}">\n <span class="badge badge-stable">\n {{:rebind:peer.docCount.record !== undefined ? (peer.docCount.record|formatInteger) : \'?\'}}\n <span ng-if=":rebind:!expertMode && peer.docCount.record!==undefined">\n {{::\'ES_PEER.DOCUMENTS\'|translate|lowercase }}\n </span>\n </span>\n <span class="badge badge-secondary" ng-class=":rebind:{\'balanced\': peer.hasMainConsensusBlock, \'energized\': peer.hasConsensusBlock, \'ng-hide\': !peer.currentNumber }" ng-if="::expertMode">\n {{:rebind:\'BLOCKCHAIN.VIEW.TITLE\'|translate: {number:peer.currentNumber} }}\n </span>\n\n </div>\n </div>\n'),e.put("plugins/es/templates/network/items_peers.html",'<div ng-class="::motion.ionListClass" class="no-padding">\n\n <div class="item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic" ng-if="::isHttps && expertMode">\n <small><i class="icon ion-alert-circled"></i> {{::\'NETWORK.INFO.ONLY_SSL_PEERS\'|translate}}</small>\n </div>\n\n <div class="item row row-header hidden-xs hidden-sm done in" ng-if="::expertMode">\n <a class="col col-header no-padding dark" ng-click="toggleSort(\'name\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'name\'"></cs-sort-icon>\n {{::\'ES_PEER.NAME\' | translate}} / {{::\'COMMON.PUBKEY\' | translate}}\n </a>\n <a class="no-padding dark hidden-md col col-15 col-header" ng-click="toggleSort(\'api\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'api\'"></cs-sort-icon>\n {{::\'PEER.API\' | translate}}\n </a>\n <a class="no-padding dark col col-20 col-header" ng-click="toggleSort(\'difficulty\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'software\'"></cs-sort-icon>\n {{::\'ES_PEER.SOFTWARE\' | translate}}\n </a>\n <a class="col col-20 col-header no-padding dark" ng-click="toggleSort(\'doc_count\')">\n <cs-sort-icon asc="search.asc" sort="search.sort" toggle="\'doc_count\'"></cs-sort-icon>\n {{::\'ES_PEER.DOCUMENTS\' | translate}}\n </a>\n </div>\n\n <div ng-repeat="peer in :rebind:search.results track by peer.id" class="item item-peer item-icon-left ink" ng-class="::ionItemClass" id="{{helptipPrefix}}-peer-{{$index}}" ng-click="selectPeer(peer)" ng-include="\'plugins/es/templates/network/item_content_peer.html\'">\n </div>\n\n</div>\n'),e.put("plugins/es/templates/network/lookup_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>PEER.POPOVER_FILTER_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left item-icon-right ink" ng-click="toggleSearchType(\'member\')">\n <i class="icon ion-person"></i>\n {{\'PEER.MEMBERS\' | translate}}\n <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'member\'"></i>\n </a>\n\n <a class="item item-icon-left item-icon-right ink" ng-click="toggleSearchType(\'mirror\')">\n <i class="icon ion-radio-waves"></i>\n {{\'PEER.MIRRORS\' | translate}}\n <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'mirror\'"></i>\n </a>\n\n <a class="item item-icon-left item-icon-right ink" ng-click="toggleSearchType(\'offline\')">\n <i class="icon ion-eye-disabled"></i>\n {{\'PEER.OFFLINE\' | translate}}\n <i class="icon ion-ios-checkmark-empty" ng-show="search.type==\'offline\'"></i>\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/modal_network.html",'<ion-modal-view id="nodes" class="modal-full-height" cache-view="false">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>PEER.PEER_LIST</h1>\n <div class="buttons buttons-right header-item">\n <span class="secondary">\n <button class="button button-clear icon ion-loop button-clear" ng-click="refresh()">\n\n </button>\n <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </span>\n </div>\n </ion-header-bar>\n\n <ion-content>\n <div class="list">\n <div class="padding padding-xs" style="display: block; height: 60px;">\n\n <div class="pull-left">\n <h4>\n <span ng-if="!enableFilter || !search.type" translate>PEER.ALL_PEERS</span>\n <span ng-if="!search.loading">({{search.results.length}})</span>\n </h4>\n </div>\n\n <div class="pull-right">\n <ion-spinner class="icon" icon="android" ng-if="search.loading"></ion-spinner> \n </div>\n </div>\n\n <ng-include src="\'plugins/es/templates/network/items_peers.html\'"></ng-include>\n\n\t </div>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/network/popover_endpoints.html",'<ion-popover-view class="popover-endpoints popover-light" style="height: {{(titleKey?30:0)+((!items || items.length <= 1) ? 55 : 3+items.length*52)}}px">\n <ion-header-bar class="bar bar-header stable-bg" ng-if="titleKey">\n <div class="title">\n {{titleKey | translate:titleValues }}\n </div>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list" ng-class="{\'has-header\': titleKey}">\n <div class="item item-text-wrap" ng-repeat="item in items">\n <div class="item-label" ng-if="item.label">{{item.label | translate}}</div>\n <div id="endpoint_{{$index}}" class="badge item-note dark">{{item.value}}\n </div>\n </div>\n </div></ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/popover_network.html",'<ion-popover-view class="fit hidden-xs hidden-sm popover-notification popover-network" ng-controller="NetworkLookupPopoverCtrl">\n <ion-header-bar class="stable-bg block">\n <div class="title">\n {{\'MENU.NETWORK\'|translate}}\n <ion-spinner class="ion-spinner-small" icon="android" ng-if="search.loading"></ion-spinner>\n </div>\n\n <div class="pull-right">\n <a ng-class="{\'positive\': search.type==\'member\', \'dark\': search.type!==\'member\'}" ng-click="toggleSearchType(\'member\')" translate>PEER.MEMBERS</a>\n </div>\n </ion-header-bar>\n <ion-content scroll="true">\n <div class="list no-padding">\n <ng-include src="\'plugins/es/templates/network/items_peers.html\'"></ng-include>\n </div>\n </ion-content>\n\n <ion-footer-bar class="stable-bg block">\n \x3c!-- settings --\x3e\n <div class="pull-left">\n <a class="positive" ui-sref="app.settings" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SETTINGS</a>\n </div>\n\n \x3c!-- show all --\x3e\n <div class="pull-right">\n <a class="positive" ui-sref="app.es_network" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\n </div>\n </ion-footer-bar>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/popover_peer_info.html",'<ion-popover-view class="fit hidden-xs hidden-sm popover-notification popover-peer-info" ng-controller="PeerInfoPopoverCtrl">\n <ion-header-bar class="stable-bg block">\n <div class="title">\n {{\'PEER.VIEW.TITLE\'|translate}}\n </div>\n </ion-header-bar>\n <ion-content scroll="true">\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list no-padding" ng-if="!loading">\n\n <div class="item" ng-if=":rebind:formData.software">\n <i class="ion-outlet"></i>\n {{\'NETWORK.VIEW.SOFTWARE\'|translate}}\n <div class="badge" ng-class=":rebind:{\'badge-energized\': formData.isPreRelease, \'badge-assertive\': formData.hasNewRelease }">\n {{formData.software}} v{{:rebind:formData.version}}\n </div>\n <div class="gray badge badge-secondary" ng-if="formData.isPreRelease">\n <i class="ion-alert-circled"></i>\n <span ng-bind-html="\'NETWORK.VIEW.WARN_PRE_RELEASE\'|translate: formData.latestRelease"></span>\n </div>\n <div class="gray badge badge-secondary" ng-if="formData.hasNewRelease">\n <i class="ion-alert-circled"></i>\n <span ng-bind-html="\'NETWORK.VIEW.WARN_NEW_RELEASE\'|translate: formData.latestRelease"></span>\n </div>\n </div>\n\n <div class="item">\n <i class="ion-locked"></i>\n {{\'NETWORK.VIEW.ENDPOINTS.BMAS\'|translate}}\n <div class="badge badge-balanced" ng-if=":rebind:formData.useSsl" translate>COMMON.BTN_YES</div>\n <div class="badge badge-assertive" ng-if=":rebind:!formData.useSsl" translate>COMMON.BTN_NO</div>\n </div>\n\n <div class="item">\n <i class="ion-cube"></i>\n {{\'BLOCKCHAIN.VIEW.TITLE_CURRENT\'|translate}}\n <div class="badge badge-balanced">\n {{:rebind:formData.number | formatInteger}}\n </div>\n </div>\n\n <div class="item">\n <i class="ion-clock"></i>\n {{\'CURRENCY.VIEW.MEDIAN_TIME\'|translate}}\n <div class="badge dark">\n {{:rebind:formData.medianTime | medianDate}}\n </div>\n </div>\n\n <div class="item">\n <i class="ion-lock-combination"></i>\n {{\'CURRENCY.VIEW.POW_MIN\'|translate}}\n <div class="badge dark">\n {{:rebind:formData.powMin | formatInteger}}\n </div>\n </div>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="default"></cs-extension-point>\n\n </div>\n </ion-content>\n\n <ion-footer-bar class="stable-bg block">\n \x3c!-- settings --\x3e\n <div class="pull-left">\n <a class="positive" ui-sref="app.settings" ng-click="closePopover()" translate>MENU.SETTINGS</a>\n </div>\n\n \x3c!-- show all --\x3e\n <div class="pull-right">\n <a class="positive" ui-sref="app.view_es_peer" ng-click="closePopover()" translate>PEER.BTN_SHOW_PEER</a>\n </div>\n </ion-footer-bar>\n</ion-popover-view>\n'),e.put("plugins/es/templates/network/view_es_network.html",'<ion-view>\n <ion-nav-title>\n <span translate>MENU.NETWORK</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="refresh()">\n </button>\n </ion-nav-buttons>\n\n\n <ion-content scroll="true" ng-init="enableFilter=true; ionItemClass=\'item-border-large\';">\n\n <div class="row responsive-sm responsive-md responsive-lg">\n <div class="col list col-border-right">\n <div class="padding padding-xs" style="display: block; height: 60px;">\n <div class="pull-left">\n <h4>\n <span ng-if="enableFilter && !search.online" translate>PEER.OFFLINE_PEERS</span>\n <span ng-if="!enableFilter || search.online" translate>PEER.ALL_PEERS</span>\n <span ng-if="search.results.length">({{search.results.length}})</span>\n <ion-spinner ng-if="search.loading" class="icon ion-spinner-small" icon="android"></ion-spinner>\n </h4>\n </div>\n\n <div class="pull-right">\n\n <div class="pull-right" ng-if="enableFilter">\n\n <a class="button button-text button-small hidden-xs hidden-sm ink" ng-class="{\'button-text-positive\': !search.online, \'button-text-stable\': search.online}" ng-click="toggleOnline(!search.online)">\n <i class="icon ion-close-circled light-gray"></i>\n <span>{{\'PEER.OFFLINE\'|translate}}</span>\n </a>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="filter-buttons"></cs-extension-point>\n </div>\n </div>\n </div>\n\n <div id="helptip-network-peers" style="display: block"></div>\n\n <ng-include src="\'plugins/es/templates/network/items_peers.html\'"></ng-include>\n </div>\n\n <div class="col col-33" ng-controller="MkLastDocumentsCtrl">\n <div class="padding padding-xs" style="display: block;">\n <h4 translate>DOCUMENT.LOOKUP.LAST_DOCUMENTS_DOTS</h4>\n\n <div class="pull-right hidden-xs hidden-sm">\n <a class="button button-text button-small ink" ng-class="{\'button-text-positive\': compactMode, \'button-text-stable\': !compactMode}" ng-click="toggleCompactMode()">\n <i class="icon ion-navicon"></i>\n <b class="icon-secondary ion-arrow-down-b" style="top: -8px; left: 5px; font-size: 8px;"></b>\n <b class="icon-secondary ion-arrow-up-b" style="top: 3px; left: 5px; font-size: 8px;"></b>\n <span>{{\'DOCUMENT.LOOKUP.BTN_COMPACT\'|translate}}</span>\n </a>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="buttons"></cs-extension-point>\n\n <a class="button button-text button-small ink" ui-sref="app.document_search({index: search.index, type: search.type})">\n <i class="icon ion-android-search"></i>\n <span>{{\'COMMON.BTN_SEARCH\'|translate}}</span>\n </a>\n\n </div>\n </div>\n\n <ng-include src="\'plugins/market/templates/document/list_documents.html\'"></ng-include>\n\n </div>\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/network/view_es_peer.html",'<ion-view>\n <ion-nav-title>\n <span translate>PEER.VIEW.TITLE</span>\n </ion-nav-title>\n\n <ion-content class="has-header" scroll="true">\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n\n <div class="col list">\n\n <ion-item>\n <h1>\n <span translate>PEER.VIEW.TITLE</span>\n <span class="gray">\n {{node.host}}\n </span>\n </h1>\n <h2 class="gray">\n <i class="gray icon ion-android-globe"></i>\n {{node.ep.dns || node.server}}\n <span class="gray" ng-if="!loading && node.useSsl">\n <i class="gray ion-locked"></i> <small>SSL</small>\n </span>\n <span class="gray" ng-if="!loading && node.useTor">\n <i class="gray ion-bma-tor-api"></i>\n </span>\n </h2>\n\n \x3c!-- node owner --\x3e\n <h3>\n <span class="dark">\n <i class="icon ion-android-desktop"></i>\n {{\'PEER.VIEW.OWNER\'|translate}}\n </span>\n <a class="positive" ng-if="node.name" ui-sref="app.user_identity({pubkey: node.pubkey, uid: node.name})">\n <i class="ion-person"></i> {{node.name}}\n </a>\n <span ng-if="!loading && !node.name">\n <a class="gray" ui-sref="app.user_identity({pubkey: node.pubkey})">\n <i class="ion-key"></i>\n {{node.pubkey|formatPubkey}}\n </a>\n </span>\n </h3>\n\n <h3>\n <a ng-click="openRawPeering($event)">\n <i class="icon ion-share"></i> {{\'PEER.VIEW.SHOW_RAW_PEERING\'|translate}}\n </a>\n\n <span class="gray" ng-if="!isReachable"> | </span>\n <a ng-if="!isReachable" ng-click="openRawCurrentBlock($event)">\n <i class="icon ion-share"></i> <span translate>PEER.VIEW.SHOW_RAW_CURRENT_BLOCK</span>\n </a>\n </h3>\n </ion-item>\n\n\n <div class="item item-divider" translate>\n PEER.VIEW.GENERAL_DIVIDER\n </div>\n\n <ion-item class="item-icon-left item-text-wrap ink" copy-on-click="{{node.pubkey}}">\n <i class="icon ion-key"></i>\n <span translate>COMMON.PUBKEY</span>\n <h4 class="dark text-left">{{node.pubkey}}</h4>\n </ion-item>\n\n <ion-item class="item item-icon-left item-text-wrap ink" ng-if="isReachable">\n <i class="icon ion-cube"></i>\n <span translate>BLOCKCHAIN.VIEW.TITLE_CURRENT</span>\n <div class="badge badge-calm" ng-if="!loading">\n {{current.number|formatInteger}}\n </div>\n </ion-item>\n\n <ion-item class="item item-icon-left item-text-wrap" ng-if="isReachable">\n <i class="icon ion-document"></i>\n <span translate>ES_PEER.DOCUMENT_COUNT</span>\n <div class="badge badge-stable" ng-if="!loading">\n {{node.docCount|formatInteger}}\n </div>\n </ion-item>\n\n <a class="item item-icon-left item-icon-right item-text-wrap ink" ng-if="isReachable" ui-sref="app.document_search(options.document)">\n <i class="icon ion-document" style="font-size: 25px;"></i>\n <i class="icon-secondary ion-clock" style="font-size: 18px; left: 33px; top: -12px;"></i>\n <span translate>DOCUMENT.LOOKUP.LAST_DOCUMENTS</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="general"></cs-extension-point>\n\n <div class="item item-divider" ng-hide="loading || !isReachable" translate>\n PEER.VIEW.KNOWN_PEERS\n </div>\n\n <ion-item class="item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic" ng-show="!loading && !isReachable">\n <small><i class="icon ion-alert-circled"></i> {{\'NETWORK.INFO.ONLY_SSL_PEERS\'|translate}}</small>\n </ion-item>\n\n <div class="item center" ng-if="loading">\n <ion-spinner class="icon" icon="android"></ion-spinner>\n </div>\n\n <div class="list no-padding {{::motion.ionListClass}}" ng-if="isReachable">\n\n <div ng-repeat="peer in :rebind:peers track by peer.id" class="item item-peer item-icon-left ink" ng-class="::ionItemClass" ng-click="selectPeer(peer)" ng-include="\'plugins/es/templates/network/item_content_peer.html\'">\n </div>\n\n </div>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n </div>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/notification/list_notification.html",'<ion-list class="{{::motion.ionListClass}}">\n\n <ion-item ng-repeat="notification in search.results" class="item-border-large item-text-wrap ink item-avatar" ng-class="{\'unread\': !notification.read}" ng-click="select(notification)">\n\n <i ng-if="!notification.avatar" class="item-image icon {{::notification.avatarIcon}}"></i>\n <i ng-if="notification.avatar" class="item-image avatar" style="background-image: url({{::notification.avatar.src}})"></i>\n\n <h3 trust-as-html="notification.message | translate:notification"></h3>\n <h4>\n <i class="icon {{notification.icon}}"></i> <span class="dark">{{notification.time|formatFromNow}}</span>\n <span class="gray">| {{notification.time|formatDate}}</span>\n </h4>\n </ion-item>\n</ion-list>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n</ion-infinite-scroll>\n'),e.put("plugins/es/templates/notification/popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink" ng-disabled="!search.results.length" ng-click="markAllAsRead()">\n <i class="icon ion-android-checkmark-circle"></i>\n {{\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\' | translate}}\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/notification/popover_notification.html",'<ion-popover-view class="fit popover-notification" ng-controller="PopoverNotificationsCtrl">\n <ion-header-bar class="stable-bg block">\n <div class="title" translate>COMMON.NOTIFICATIONS.TITLE</div>\n\n <div class="pull-right">\n <a class="positive" ng-click="markAllAsRead()" translate>COMMON.NOTIFICATIONS.MARK_ALL_AS_READ</a>\n </div>\n </ion-header-bar>\n\n <ion-content scroll="true">\n <div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n <div class="padding gray" ng-if="!search.loading && !search.results.length" translate>\n COMMON.NOTIFICATIONS.NO_RESULT\n </div>\n\n <ng-include src="\'plugins/es/templates/notification/list_notification.html\'"></ng-include>\n\n </ion-content>\n\n <ion-footer-bar class="stable-bg block">\n \x3c!-- settings\n <div class="pull-left">\n <a class="positive"\n ui-sref="app.es_settings"\n ng-click="closePopover()"\n translate>MENU.SETTINGS</a>\n </div> --\x3e\n\n \x3c!-- show all --\x3e\n <div class="pull-right">\n <a class="positive" ui-sref="app.view_notifications" ng-click="closePopover()" translate>COMMON.NOTIFICATIONS.SHOW_ALL</a>\n </div>\n </ion-footer-bar>\n</ion-popover-view>\n'),e.put("plugins/es/templates/notification/view_notifications.html",'<ion-view left-buttons="leftButtons" class="view-notification">\n <ion-nav-title>\n {{\'COMMON.NOTIFICATIONS.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="load()">\n </button>\n\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-more-vertical"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="load()">\n </button>\n\n <button class="button button-raised icon-left ion-checkmark ink" ng-click="markAllAsRead()">\n {{\'COMMON.NOTIFICATIONS.MARK_ALL_AS_READ\' | translate}}\n </button>\n </div>\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col">\n\n <div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="padding gray" ng-if="!search.loading && !search.results.length" translate>\n COMMON.NOTIFICATIONS.NO_RESULT\n </div>\n\n <ng-include src="\'plugins/es/templates/notification/list_notification.html\'"></ng-include>\n\n\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n </div>\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/es/templates/registry/edit_record.html",'<ion-view left-buttons="leftButtons" class="view-page">\n <ion-nav-title>\n <span class="visible-xs" ng-if="id" ng-bind-html="formData.title"></span>\n <span class="visible-xs" ng-if="!loading && !id" translate>REGISTRY.EDIT.TITLE_NEW</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear visible-xs visible-sm" ng-class="{\'ion-android-send\':!id, \'ion-android-done\': id}" ng-click="save()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n\n <div class="hero">\n <div class="content">\n <i class="avatar" ng-class="avatarClass" ng-style="avatarStyle">\n <button class="button button-positive button-large button-clear flat icon ion-camera visible-xs visible-sm" style="display: inline-block;" ng-click="showAvatarModal()"></button>\n <button ng-if="avatar.src" class="button button-positive button-large button-clear flat visible-xs visible-sm" style="display: inline-block; left: 85px; bottom:15px;" ng-click="rotateAvatar()">\n <i class="icon-secondary ion-image" style="left: 24px; top: 3px; font-size: 24px;"></i>\n <i class="icon-secondary ion-forward" style="left: 26px; top: -13px;"></i>\n </button>\n <button class="button button-positive button-large button-clear icon ion-camera hidden-xs hidden-sm" ng-click="showAvatarModal()"></button>\n </i>\n <h3 class="dark">\n <span ng-if="!loading && formData.title">{{formData.title}}</span>\n <span ng-if="!loading && !id && !formData.title" translate>REGISTRY.EDIT.TITLE_NEW</span>\n </h3>\n <h4 class="dark">\n <ion-spinner ng-if="loading" icon="android"></ion-spinner>\n </h4>\n </div>\n </div>\n\n <div class="row no-padding">\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col no-padding-xs">\n\n <form name="recordForm" novalidate="" ng-submit="save()">\n <div class="list {{::motion.ionListClass}}" ng-init="setForm(recordForm)">\n <div class="item" ng-if="id">\n <h4 class="gray">\n <i class="icon ion-calendar"></i>\n {{\'COMMON.LAST_MODIFICATION_DATE\'|translate}} {{formData.time | formatDate}}\n </h4>\n <div class="badge badge-balanced badge-editable" ng-click="showRecordTypeModal()">\n {{\'REGISTRY.TYPE.ENUM.\'+formData.type|upper|translate}}\n </div>\n </div>\n\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_pictures.html\'"></ng-include>\n\n <div class="item item-divider" translate>REGISTRY.GENERAL_DIVIDER</div>\n\n \x3c!-- title --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'REGISTRY.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="registry-record-title" ng-model="formData.title" ng-minlength="3" ng-required="true">\n </div>\n <div class="form-errors" ng-if="form.$submitted && form.title.$error" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n </div>\n\n \x3c!-- description --\x3e\n <div class="item item-input item-floating-label">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'REGISTRY.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10">\n </textarea>\n </div>\n\n \x3c!-- category --\x3e\n <div class="item item-icon-right ink" ng-if="loading || formData.type===\'company\' || formData.type===\'shop\'" ng-class="{\'item-input-error\': form.$submitted && !formData.category.id, \'done in\': !loading}" ng-click="showCategoryModal()">\n <span translate>REGISTRY.CATEGORY</span>\n <span class="badge badge-royal">{{formData.category.name | formatCategory}}</span> \n <i class="gray icon ion-ios-arrow-right"></i>\n </div>\n <input type="hidden" name="category" ng-model="formData.category.id" required-if="formData.type==\'company\' || formData.type==\'shop\'">\n <div class="form-errors" ng-if="form.$submitted && form.category.$error" ng-messages="form.category.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- position --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_position.html\'"></ng-include>\n\n \x3c!-- social networks --\x3e\n <ng-include src="\'plugins/es/templates/common/edit_socials.html\'" ng-controller="ESSocialsEditCtrl"></ng-include>\n\n <div class="item item-divider" translate>REGISTRY.TECHNICAL_DIVIDER</div>\n\n \x3c!-- pubkey --\x3e\n <div class="item item-input item-floating-label">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <input type="text" placeholder="{{\'REGISTRY.EDIT.RECORD_PUBKEY_HELP\'|translate}}" ng-model="formData.pubkey">\n </div>\n\n </div>\n\n <div class="padding hidden-xs hidden-sm text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>\n COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive button-raised ink" type="submit" ng-if="!id" translate>\n COMMON.BTN_PUBLISH\n </button>\n <button class="button button-assertive button-raised ink" type="submit" ng-if="id" translate>\n COMMON.BTN_SAVE\n </button>\n </div>\n </form>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n </div>\n \n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/registry/item_record.html",'<a class="item item-record ink no-padding" ui-sref="app.view_page({id: item.id, title: item.urlTitle})">\n\n <div class="row row-record">\n <div class="col item-text-wrap item-thumbnail-left">\n <i ng-if="::item.avatar" class="item-image" style="background-image: url({{::item.avatar.src}})"></i>\n <i ng-if="::!item.avatar" class="item-image icon cion-page-{{item.type}}"></i>\n\n \x3c!-- title --\x3e\n <h2 title="{{item.title|noHtml}}" ng-bind-html="::item.title"></h2>\n\n \x3c!-- category --\x3e\n <h4 class="gray text-nowrap">\n <ng-if ng-if="::item.category">\n <span class="visible-xs">\n {{::item.category.name|noHtml|truncText:60}}\n </span>\n <span class="hidden-xs">\n {{::item.category.name}}\n </span>\n </ng-if>\n <ng-if ng-if="::!item.category">{{::\'REGISTRY.TYPE.ENUM.\'+item.type|uppercase|translate}}</ng-if>\n </h4>\n\n <br class="hidden-xxs hidden-xs hidden-sm">\n\n <h4>\n <span class="positive" ng-if="::item.city">\n <b class="ion-location"></b>\n <span ng-bind-html="::item.city"></span>\n </span>\n <span class="gray" ng-if="::item.distance">\n ({{::item.distance|formatDecimal}} {{::geoUnit}})\n </span>\n </h4>\n\n \x3c!-- creation date --\x3e\n <h4>\n <span class="gray" ng-if="::item.creationTime">\n <i class="icon ion-clock"></i>\n {{::item.creationTime | formatFromNow}}\n </span>\n <span ng-if="::item.tags" class="dark">\n <ng-repeat ng-repeat="tag in ::item.tags">\n #<ng-bind-html ng-bind-html="::tag"></ng-bind-html>\n </ng-repeat>\n </span>\n </h4>\n <span ng-if="::item.picturesCount > 1" class="badge badge-balanced badge-picture-count hidden-xxs">{{::item.picturesCount}} <i class="icon ion-camera"></i></span>\n </div>\n\n <div class="col" ng-if="options.description.show">\n <p class="gray text-italic" ng-if="::!!item.description">\n <i class="icon ion-quote"></i>\n <span ng-bind-html="::item.description | truncText:500"></span>\n </p>\n </div>\n </div>\n\n</a>\n'),e.put("plugins/es/templates/registry/lookup_form_options.html",'\n <div class="item item-icon-left item-icon-right item-input stable-bg" ng-click="showRecordTypeModal($event)" ng-if="search.advanced && !search.type">\n <b class="icon-secondary ion-help gray" style="left:10px; top: -8px;"></b>\n <b class="icon-secondary cion-page-association gray" style="left:14px; top: 2px;"></b>\n <b class="icon-secondary cion-page-company gray" style="left:28px; top: -6px;"></b>\n\n <span class="input-label item-icon-left-padding" translate>REGISTRY.SEARCH.TYPE</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </div>\n\n <div class="item item-icon-left item-icon-right item-input stable-bg" ng-click="showCategoryModal($event)" ng-if="search.advanced && !search.category">\n <i class="icon ion-flag gray"></i>\n <span class="input-label item-icon-left-padding" translate>REGISTRY.CATEGORY</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </div>\n'),
|
||
e.put("plugins/es/templates/registry/lookup_form.html",'\n<form ng-submit="doSearch()" class="light-bg">\n <div class="row no-padding responsive-lg">\n\n \x3c!-- search text --\x3e\n <div class="col no-padding no-margin">\n <div class="item no-padding">\n <div class="item-input light-bg">\n\n <div class="animate-show-hide selected-values ng-hide" ng-show="entered">\n\n \x3c!-- selected type --\x3e\n <div ng-show="search.type" class="button button-small button-text button-stable button-icon-event stable-900-bg">\n <i class="icon cion-page-{{search.type}}"></i>\n <span>{{\'REGISTRY.TYPE.ENUM.\'+search.type|uppercase|translate}}</span>\n <i class="icon ion-close" ng-click="removeType()"> </i>\n </div>\n\n \x3c!-- selected category --\x3e\n <div ng-show="search.category.name" class="button button-small button-text button-stable button-icon-event stable-900-bg">\n <i class="icon ion-flag"></i>\n <span>{{search.category.name|truncText:40}}</span>\n <i class="icon ion-close" ng-click="removeCategory()"> </i>\n </div>\n </div>\n\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" class="visible-xs visible-sm" placeholder="{{\'REGISTRY.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()" on-return="doSearchText()" select-on-click>\n <input type="text" class="hidden-xs hidden-sm" placeholder="{{\'REGISTRY.SEARCH.SEARCH_HELP\'|translate}}" id="registrySearchText" ng-model="search.text" on-return="doSearchText()">\n\n <button type="button" class="button button-icon button-small pull-left button-small-padding ink" ng-if="search.text" tabindex="-1" ng-click="removeText()">\n <i class="gray ion-close"></i>\n </button>\n </div>\n </div>\n\n </div>\n\n \x3c!-- location --\x3e\n <div class="col col-40 no-padding no-margin" ng-include="::\'plugins/es/templates/common/item_location_search.html\'" ng-controller="ESSearchPositionItemCtrl">\n </div>\n\n </div>\n\n \x3c!-- options --\x3e\n <ng-include src="::\'plugins/es/templates/registry/lookup_form_options.html\'"></ng-include>\n</form>\n\n<div class="padding-top hidden-xs hidden-sm disable-user-behavior" style="display: block; height: 60px;">\n <div class="pull-left">\n\n <a class="button button-text button-small ink" ng-class="{\'button-text-stable\': !search.advanced, \'button-text-positive\': search.advanced}" ng-click="search.advanced=!search.advanced">\n {{\'REGISTRY.SEARCH.BTN_ADVANCED_SEARCH\' | translate}}\n <i class="icon" ng-class="{\'ion-arrow-down-b\': !search.advanced, \'ion-arrow-up-b\': search.advanced}"></i>\n </a>\n\n \n\n </div>\n\n <div class="pull-right">\n\n <a ng-if="enableFilter" class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.lastRecords}" ng-click="doGetLastRecords()">\n <i class="icon ion-clock"></i>\n {{\'REGISTRY.SEARCH.BTN_LAST_RECORDS\' | translate}}\n </a>\n \n\n \x3c!-- Allow extension here --\x3e\n <cs-extension-point name="filter-buttons"></cs-extension-point>\n\n \n\n <button class="button button-small button-stable ink" ng-click="doSearchText()">\n {{\'COMMON.BTN_SEARCH\' | translate}}\n </button>\n </div>\n</div>\n\n<div class="padding-xs padding-sm" style="display: block; height: 60px;">\n <div class="pull-left ng-hide" ng-show="!search.loading">\n <ng-if ng-if="search.lastRecords">\n <h4 translate>REGISTRY.SEARCH.LAST_RECORDS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'REGISTRY.SEARCH.LAST_RECORD_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'REGISTRY.SEARCH.LAST_RECORD_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n <ng-if ng-if="!search.lastRecords">\n <h4 translate>COMMON.RESULTS_LIST</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'REGISTRY.SEARCH.RESULT_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'REGISTRY.SEARCH.RESULT_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n </div>\n\n\n <div class="pull-right ng-hide padding-top" ng-show="!search.loading && search.total">\n <a class="button button-text button-small hidden-xs hidden-sm ink" ng-class="{\'button-text-positive\': search.compactMode}" ng-click="toggleCompactMode()">\n <i class="icon ion-navicon"></i>\n <b class="icon-secondary ion-arrow-down-b" style="top: -8px; left: 5px; font-size: 8px;"></b>\n <b class="icon-secondary ion-arrow-up-b" style="top: 3px; left: 5px; font-size: 8px;"></b>\n {{\'DOCUMENT.LOOKUP.BTN_COMPACT\' | translate}}\n </a>\n </div>\n</div>\n\n<div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n</div>\n\n<div class="padding assertive" ng-if="!search.loading && !search.results.length" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n'),e.put("plugins/es/templates/registry/lookup_lg.html",'<ion-view left-buttons="leftButtons" class="view-registry-search">\n <ion-nav-title>\n <span translate>REGISTRY.SEARCH.TITLE</span>\n </ion-nav-title>\n\n <ion-content class="lookupForm padding no-padding-xs stable-100-bg">\n\n <div class="hidden-xs hidden-sm" style="display: block; height: 45px;">\n <div class="pull-right">\n <button class="button button-small button-positive button-clear ink padding-right" ng-click="showNewPageModal()">\n <i class="icon ion-plus"></i>\n <span translate>REGISTRY.BTN_NEW</span>\n </button>\n </div>\n </div>\n\n <ng-include src="::\'plugins/es/templates/registry/lookup_form.html\'"></ng-include>\n\n <ng-include src="::\'plugins/es/templates/registry/lookup_list_lg.html\'"></ng-include>\n\n </ion-content>\n\n <button id="fab-add-registry-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin" ng-click="showNewPageModal()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/registry/lookup_list_lg.html",'<div class="row no-padding" ng-class="{\'ng-hide\': !search.total}">\n \x3c!-- left margin (when NOT compact mode) --\x3e\n <div class="col col-15 no-padding hidden-xs hidden-sm" ng-if="!search.compactMode"> </div>\n\n <div class="col no-padding">\n\n <div class="list {{::motion.ionListClass}}" ng-class="{\'flex-row\': search.compactMode}" ng-if="!search.loading && search.results.length">\n\n <div class="no-padding" ng-repeat="item in search.results" ng-include="::\'plugins/es/templates/registry/item_record.html\'">\n </div>\n </div>\n\n </div>\n\n \x3c!-- right margin (when NOT compact mode) --\x3e\n <div class="col col-15 no-padding hidden-xs hidden-sm" ng-if="!search.compactMode"> </div>\n</div>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="10%">\n</ion-infinite-scroll>\n'),e.put("plugins/es/templates/registry/lookup_list.html",'<div class="list {{::motion.ionListClass}}" ng-if="!search.loading && search.results.length" ng-init="options.description.show=false">\n\n <div class="no-padding" ng-repeat="item in search.results" ng-include="::\'plugins/es/templates/registry/item_record.html\'">\n </div>\n</div>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="10%">\n</ion-infinite-scroll>\n'),e.put("plugins/es/templates/registry/lookup_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- new page --\x3e\n <a class="item item-icon-left ink" ng-click="showNewPageModal();">\n <i class="icon ion-plus"></i>\n <span translate>REGISTRY.BTN_NEW</span>\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/registry/lookup_popover_filters.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_FILTER_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- new page --\x3e\n <a class="item item-icon-left ink" ng-click="doGetLastRecords()">\n <i class="icon ion-clock"></i>\n {{\'REGISTRY.SEARCH.BTN_LAST_RECORDS\' | translate}}\n </a>\n\n \x3c!-- advanced options --\x3e\n <a class="item item-icon-left ink" ng-click="toggleAdvanced();">\n <i class="icon ion-android-checkbox-outline-blank" ng-show="!search.advanced"></i>\n <i class="icon ion-android-checkbox-outline" ng-show="search.advanced"></i>\n <span translate>REGISTRY.SEARCH.POPOVER_FILTERS.BTN_ADVANCED_SEARCH</span>\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/registry/lookup.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span translate>REGISTRY.SEARCH.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="doUpdate()">\n </button>\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showFiltersPopover($event)">\n <i class="icon ion-android-funnel"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content class="lookupForm padding no-padding-xs no-padding-sm stable-100-bg">\n\n <ng-include src="::\'plugins/es/templates/registry/lookup_form.html\'"></ng-include>\n\n <ng-include src="::\'plugins/es/templates/registry/lookup_list.html\'"></ng-include>\n\n </ion-content>\n\n <button id="fab-add-registry-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin" ng-click="showNewPageModal()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/registry/modal_record_type.html",'<ion-modal-view>\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>{{getParameters().title||\'REGISTRY.TYPE.TITLE\'|translate}}</h1>\n </ion-header-bar>\n\n <ion-content class="lookupForm">\n <div class="list padding">\n <h3 translate>REGISTRY.TYPE.SELECT_TYPE</h3>\n <button class="button button-block button-stable icon-left cion-page-shop" ng-click="closeModal(\'shop\')" translate>REGISTRY.TYPE.ENUM.SHOP</button>\n\n <button class="button button-block button-stable icon-left cion-page-association" ng-click="closeModal(\'association\')" translate>REGISTRY.TYPE.ENUM.ASSOCIATION</button>\n\n <button class="button button-block button-stable icon-left cion-page-company" ng-click="closeModal(\'company\')" translate>REGISTRY.TYPE.ENUM.COMPANY</button>\n\n <button class="button button-block button-stable icon-left cion-page-institution" ng-click="closeModal(\'institution\')" translate>REGISTRY.TYPE.ENUM.INSTITUTION</button>\n </div>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/es/templates/registry/view_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>REGISTRY.VIEW.MENU_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink" ng-click="showSharePopover($event)">\n <i class="icon ion-android-share-alt"></i>\n {{\'COMMON.BTN_SHARE\' | translate}}\n </a>\n\n <a class="item item-icon-left assertive ink" ng-if="canEdit" ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'COMMON.BTN_DELETE\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/registry/view_record.html",'<ion-view left-buttons="leftButtons" class="view-page">\n <ion-nav-title>\n\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit">\n <i class="icon ion-android-create"></i>\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true" class="refresher-top-bg">\n\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="load()">\n </ion-refresher>\n\n <div class="hero">\n <div class="content" ng-if="!loading">\n <i class="avatar cion-page-{{formData.type}}" ng-if="!formData.avatar"></i>\n <i class="avatar" ng-style="{{avatarStyle}}" ng-if="formData.avatar"></i>\n <h3><span class="dark" ng-bind-html="formData.title"></span></h3>\n <h4> </h4>\n </div>\n <h4 class="content dark" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </h4>\n <h4 class="content gray hidden-xs hidden-sm" ng-if="formData.city">\n <i class="icon ion-location"></i>\n <span ng-bind-html="formData.city"></span>\n </h4>\n </div>\n\n <div class="row no-padding-xs">\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n\n <div class="col list animate-fade-slide-in item-text-wrap no-padding-xs">\n\n <div class="item">\n <h2 class="gray">\n <a ng-if="formData.city" ui-sref="app.registry_lookup({location:formData.city})">\n <i class="icon ion-location"></i>\n <span ng-bind-html="formData.city"></span>\n </a>\n <span ng-if="formData.city && formData.type"> | </span>\n <a ng-if="formData.type" ui-sref="app.registry_lookup({type:formData.type})">\n <i class="cion-page-{{formData.type}}"></i>\n {{\'REGISTRY.TYPE.ENUM.\'+formData.type|upper|translate}}\n </a>\n </h2>\n <h4>\n <i class="icon ion-clock" ng-if="formData.time"></i>\n <span translate>COMMON.SUBMIT_BY</span>\n <a ng-class="{\'positive\': issuer.name, \'gray\': !issuer.name}" ui-sref="app.user_identity({pubkey:issuer.pubkey, name: issuer.name})">\n <ng-if ng-if="issuer.name">\n <i class="icon ion-person"></i>\n {{::issuer.name}}\n </ng-if>\n <span ng-if="!issuer.name">\n <i class="icon ion-key"></i>\n {{issuer.pubkey|formatPubkey}}\n </span>\n </a>\n <span>\n {{formData.time|formatFromNow}}\n <h4 class="gray hidden-xs">|\n {{formData.time | formatDate}}\n </h4>\n </span>\n </h4>\n </div>\n\n \x3c!-- Buttons bar--\x3e\n <a id="registry-share-anchor-{{id}}"></a>\n <div class="item large-button-bar hidden-xs hidden-sm">\n <button class="button button-stable button-small-padding icon ion-android-share-alt" ng-click="showSharePopover($event)">\n </button>\n\n <button class="button button-stable icon-left ink-dark" ng-if="canEdit" ng-click="delete()">\n <i class="icon ion-trash-a assertive"></i>\n <span class="assertive"> {{\'COMMON.BTN_DELETE\' | translate}}</span>\n </button>\n <button class="button button-calm icon-left ion-android-create ink" ng-if="canEdit" ng-click="edit()">\n {{\'COMMON.BTN_EDIT\' | translate}}\n </button>\n </div>\n\n <ion-item>\n <h2 trust-as-html="formData.description"></h2>\n </ion-item>\n\n <ion-item ng-if="formData.category || formData.address">\n <h4 ng-if="formData.category">\n <span class="gray" translate>REGISTRY.VIEW.CATEGORY</span>\n <a class="positive" ng-if="formData.category" ui-sref="app.registry_lookup({category:formData.category.id})">\n <span ng-bind-html="formData.category.name"></span>\n </a>\n </h4>\n <h4 ng-if="formData.address">\n <span class="gray" translate>REGISTRY.VIEW.LOCATION</span>\n <a class="positive" target="_system" href="https://www.openstreetmap.org/search?query={{formData.address}},%20{{formData.city}}">\n <span ng-bind-html="formData.address"></span>\n <span ng-if="formData.city"> - </span>\n <span ng-bind-html="formData.city"></span>\n </a>\n </h4>\n </ion-item>\n\n \x3c!-- Socials networks --\x3e\n <ng-if ng-if="formData.socials && formData.socials.length>0">\n <ion-item class="item-icon-left" type="no-padding item-text-wrap" ng-repeat="social in formData.socials track by social.url" id="social-{{social.url|formatSlug}}">\n <i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\'}"></i>\n <p ng-if="social.type && social.type != \'web\'">{{social.type}}</p>\n <h2>\n <a ng-click="openLink($event, social.url, social.type)">{{social.url}}</a>\n </h2>\n </ion-item>\n </ng-if>\n\n \x3c!-- pubkey --\x3e\n <div class="item item-icon-left item-text-wrap ink" ng-if="formData.pubkey" copy-on-click="{{::formData.pubkey}}">\n <i class="icon ion-key"></i>\n <span translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <h4 class="dark">{{::formData.pubkey}}</h4>\n </div>\n\n <div class="lazy-load">\n\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/view_pictures.html\'"></ng-include>\n\n \x3c!-- comments --\x3e\n <ng-include src="\'plugins/es/templates/common/view_comments.html\'"></ng-include>\n </div>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n </div>\n </ion-content>\n\n\n\n</ion-view>\n'),e.put("plugins/es/templates/registry/view_wallet_pages.html",'<ion-view left-buttons="leftButtons" class="view-notification">\n <ion-nav-title>\n {{\'REGISTRY.MY_PAGES\' | translate}}\n </ion-nav-title>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n <ion-refresher pulling-text="{{:locale:\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="doUpdate()">\n </ion-refresher>\n\n \x3c!-- Buttons bar --\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="doUpdate()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n <button class="button button-calm icon-left ink" ng-click="showNewPageModal()">\n {{\'REGISTRY.BTN_NEW\' | translate}}\n </button>\n </div>\n\n <div class="center padding" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="center padding gray" ng-if="!search.loading && !search.results.length" translate>\n REGISTRY.NO_PAGE\n </div>\n\n <ng-include src="\'plugins/es/templates/registry/lookup_list.html\'"></ng-include>\n\n </ion-content>\n\n <button id="fab-wallet-add-registry-record" class="button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg spin" ng-click="showNewPageModal()">\n <i class="icon ion-plus"></i>\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/settings/plugin_settings.html",'<ion-view left-buttons="leftButtons" class="settings">\n <ion-nav-title translate>ES_SETTINGS.PLUGIN_NAME</ion-nav-title>\n\n <ion-content scroll="true">\n\n <span class="item item-divider" translate>SETTINGS.NETWORK_SETTINGS</span>\n\n <div class="item ink" ng-click="formData.enable && changeEsNode()" ng-disabled="!formData.enable">\n <div class="input-label" ng-class="{\'gray\': !formData.enable}">\n {{\'ES_SETTINGS.PEER\' | translate}}\n </div>\n <span class="item-note" ng-class="{\'dark\': formData.enable}">{{getServer()}}</span>\n </div>\n\n \x3c!--span class="item item-divider" translate>ES_SETTINGS.NOTIFICATIONS.DIVIDER</span>\n\n <span class="item gray item-text-wrap" translate>ES_SETTINGS.NOTIFICATIONS.HELP_TEXT</span>\n\n <div class="item item-toggle dark" >\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_SENT</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.notifications.txSent" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n <div class="item item-toggle dark" >\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_RECEIVED</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.notifications.txReceived" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n <div class="item item-toggle dark" >\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_SENT</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.notifications.certSent" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n <div class="item item-toggle dark" >\n <div class="input-label" ng-class="{\'gray\': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_RECEIVED</div>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="formData.notifications.certReceived" ng-disabled="!formData.enable">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div--\x3e\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/es/templates/settings/settings_extend.html",'\n\x3c!--<span class="item item-divider" translate>SETTINGS.PLUGINS_SETTINGS</span>--\x3e\n\n<div class="item item-text-wrap ink item-icon-right" ui-sref="app.es_settings">\n <div class="input-label ng-binding" translate>ES_SETTINGS.PLUGIN_NAME</div>\n \x3c!--<h4 class="gray" translate>ES_SETTINGS.PLUGIN_NAME_HELP</h4>--\x3e\n <i class="gray icon ion-ios-arrow-right"></i>\n</div>\n'),e.put("plugins/es/templates/subscription/edit_subscriptions.html",'<ion-view left-buttons="leftButtons" class="view-notification">\n <ion-nav-title>\n {{\'SUBSCRIPTION.EDIT.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content class="padding no-padding-xs" scroll="true">\n\n <ion-refresher pulling-text="{{:locale:\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="load()">\n </ion-refresher>\n\n \x3c!-- Buttons bar --\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="load()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n <button class="button button-calm ink" ng-click="addSubscription()">\n {{\'SUBSCRIPTION.BTN_ADD\' | translate}}\n </button>\n </div>\n\n <div class="center padding" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="center padding gray" ng-if="!search.loading && !search.results.length" translate>\n SUBSCRIPTION.NO_SUBSCRIPTION\n </div>\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col list {{::motion.ionListClass}} item-border-large">\n\n \x3c!-- emails --\x3e\n <ng-repeat ng-repeat="subscriptions in search.results | filter: { type: \'email\' }" ng-include="\'plugins/es/templates/subscription/item_\' + subscriptions.type.toLowerCase() + \'_subscription.html\'">>\n </ng-repeat>\n\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n </div>\n\n </ion-content>\n\n <button id="fab-add-subscription-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus hidden-md hidden-lg spin" ng-click="addSubscription()">\n </button>\n</ion-view>\n'),e.put("plugins/es/templates/subscription/item_email_subscription.html",'<div class="item item-avatar">\n <i class="item-image icon ion-email"></i>\n <h3>\n {{\'SUBSCRIPTION.TYPE.ENUM.\' + subscriptions.type.toUpperCase() | translate}}\n </h3>\n <h4 class="gray">\n {{\'SUBSCRIPTION.EDIT.PROVIDER\'|translate}}\n <a ui-sref="app.user_identity({pubkey: subscriptions.recipient, name: subscriptions.name})">\n <span ng-class="{\'positive\': subscriptions.name, \'dark\': !subscriptions.name}" ng-if="subscriptions.name">\n <i class="ion-person" ng-if="subscriptions.name"></i>\n {{subscriptions.name}}\n </span>\n <span class="gray" ng-if="!subscriptions.name">\n <i class="ion-key"></i>\n {{subscriptions.recipient | formatPubkey}}\n </span>\n </a>\n </h4>\n <div class="item-note text-right">\n <span ng-repeat="item in subscriptions.items">\n {{item.content.email}}\n <a class="ion-trash-a gray padding-left" ng-click="deleteSubscription(item)"></a>\n <a class="ion-edit gray padding-left" ng-click="editSubscription(item)"></a>\n <br>\n </span>\n </div>\n</div>\n'),e.put("plugins/es/templates/subscription/modal_email.html",'\n<ion-modal-view id="composeMessage" class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>SUBSCRIPTION.MODAL_EMAIL.TITLE</h1>\n\n <button class="button button-icon button-clear icon ion-android-send visible-xs" ng-click="doSubmit()">\n </button>\n </ion-header-bar>\n\n <ion-content scroll="true">\n\n \x3c!-- Encryption info --\x3e\n <div class="item item-icon-left item-text-wrap">\n <i class="icon ion-ios-information-outline positive"></i>\n <h4 class="positive" translate>SUBSCRIPTION.MODAL_EMAIL.HELP</h4>\n </div>\n\n <form name="subscriptionForm" novalidate="" ng-submit="doSubmit()">\n\n <div class="list" ng-init="setForm(subscriptionForm)">\n\n \x3c!-- email --\x3e\n <label class="item item-input" ng-class="{\'item-input-error\': form.$submitted && (form.email.$invalid || form.email.$error)}">\n <span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.EMAIL_LABEL</span>\n <input name="email" type="text" placeholder="{{\'SUBSCRIPTION.MODAL_EMAIL.EMAIL_HELP\' | translate}}" ng-model="formData.content.email" ng-minlength="3" required email>\n </label>\n <div class="form-errors" ng-if="form.$submitted && (form.email.$invalid || form.email.$error)" ng-messages="form.email.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n <div class="form-error" ng-message="email">\n <span translate="ERROR.FIELD_NOT_EMAIL"></span>\n </div>\n </div>\n\n \x3c!-- Frequency --\x3e\n <label class="item item-input item-select" ng-class="{\'item-input-error\': form.$submitted && !formData.content.frequency}">\n <span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_LABEL</span>\n <select name="frequency" ng-model="formData.content.frequency" style="height: 46px;margin-top: 1px;">\n <option value="weekly" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_WEEKLY</option>\n <option value="daily" translate>SUBSCRIPTION.MODAL_EMAIL.FREQUENCY_DAILY</option>\n </select>\n </label>\n <div class="form-errors" ng-if="form.$submitted && !formData.content.frequency">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- Recipient (service provider) --\x3e\n <a class="item item-input item-icon-right gray ink" ng-class="{\'item-input-error\': form.$submitted && !formData.recipient}" ng-click="showNetworkLookup()" style="height: 67px;">\n <span class="input-label" translate>SUBSCRIPTION.MODAL_EMAIL.PROVIDER</span>\n <span class="badge animate-fade-in animate-show-hide ng-hide" ng-class="{\'badge-royal\': recipient.name, \'badge-stable\': !recipient.name}" ng-show="recipient && (recipient.name)">\n <i class="ion-person" ng-if="recipient.name"></i> {{recipient.name}}\n </span>\n <span class="badge badge-secondary animate-fade-in animate-show-hide ng-hide" ng-show="formData.recipient">\n <i class="ion-key"></i> {{formData.recipient | formatPubkey}}\n </span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n <div class="form-errors" ng-if="form.$submitted && !formData.recipient">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" type="submit">\n {{\'COMMON.BTN_ADD\' | translate}}\n </button>\n </div>\n\n </form>\n </ion-content>\n</ion-modal-view>\n\n\n\n\n'),e.put("plugins/es/templates/user/edit_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- delete profile --\x3e\n <a class="item item-icon-left assertive ink" ng-click="removeProfile()">\n <i class="icon ion-trash-a"></i>\n {{\'PROFILE.BTN_DELETE\' | translate}}\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/es/templates/user/edit_profile.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n \x3c!-- no title--\x3e\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n \x3c!-- remove button --\x3e\n <button class="button button-icon button-clear button-assertive ion-trash-a visible-xs visible-sm" ng-click="removeProfile()" ng-if="existing">\n </button>\n \x3c!-- save button --\x3e\n <button class="button button-icon button-clear ion-android-done visible-xs visible-sm" ng-click="submitAndSaveAndClose()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n\n <div class="positive-900-bg hero">\n <div class="content">\n <i class="avatar" ng-style="avatarStyle" ng-class="{\'avatar-wallet\': !loading && !avatar && walletData && !walletData.isMember, \'avatar-member\': !loading && !avatar && walletData.isMember}">\n <button class="button button-positive button-large button-clear flat icon ion-camera visible-xs visible-sm" style="display: inline-block;" ng-click="showAvatarModal()"></button>\n <button ng-if="avatar.src" class="button button-positive button-large button-clear flat visible-xs visible-sm" style="display: inline-block; left: 85px; bottom:15px;" ng-click="rotateAvatar()">\n <i class="icon-secondary ion-image" style="left: 24px; top: 3px; font-size: 24px;"></i>\n <i class="icon-secondary ion-forward" style="left: 26px; top: -13px;"></i>\n </button>\n <button class="button button-positive button-large button-clear icon ion-camera hidden-xs hidden-sm" ng-click="showAvatarModal()"></button>\n </i>\n <h3 class="light">\n <ng-if ng-if="!loading && formData.title">{{formData.title}}</ng-if>\n <ng-if ng-if="!loading && !formData.title && walletData">{{::walletData.pubkey | formatPubkey}}</ng-if>\n </h3>\n <h4 class="light">\n <ion-spinner ng-if="loading" icon="android"></ion-spinner>\n </h4>\n </div>\n </div>\n\n\n <div class="row no-padding">\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n\n <div class="col">\n\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center animate-show-hide ng-hide" ng-show="existing">\n\n <button class="button button-stable icon-right ink" ng-disabled="saving" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-more-vertical"></i> \n {{\'COMMON.BTN_OPTIONS\' | translate}}\n </button>\n </div>\n\n <form name="profileForm" novalidate="" ng-submit="saveAndClose()">\n\n <div class="list item-text-wrap {{::motion.ionListClass}}" ng-init="setForm(profileForm)">\n\n \x3c!-- Public info --\x3e\n <div class="item item-icon-left item-text-wrap">\n <i class="icon ion-ios-information-outline positive"></i>\n <h4 class="positive" translate>PROFILE.HELP.WARNING_PUBLIC_DATA</h4>\n </div>\n\n <div class="item item-divider" translate>PROFILE.GENERAL_DIVIDER</div>\n\n \x3c!-- title --\x3e\n <ion-item class="item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label">{{\'PROFILE.TITLE\' | translate}}</span>\n <input type="text" name="title" placeholder="{{\'PROFILE.TITLE_HELP\' | translate}}" id="profile-name" ng-model="formData.title" ng-model-options="{ debounce: 350 }" ng-minlength="3" ng-maxlength="50" required>\n </ion-item>\n <div class="form-errors" ng-show="form.$submitted && form.title.$error" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n <div class="form-error" ng-message="maxlength">\n <span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 50}"></span>\n </div>\n </div>\n\n \x3c!-- description --\x3e\n <ion-item class="item-input item-floating-label item-button-right">\n <span class="input-label" style="width: 100%">{{\'PROFILE.DESCRIPTION\' | translate}}</span>\n <textarea placeholder="{{\'PROFILE.DESCRIPTION_HELP\' | translate}}" ng-model="formData.description" ng-model-options="{ debounce: 350 }" rows="4" cols="10">\n </textarea>\n </ion-item>\n\n \x3c!-- position --\x3e\n <ng-include src="::\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl"></ng-include>\n </div>\n\n \x3c!-- social networks --\x3e\n <ng-include src="::\'plugins/es/templates/common/edit_socials.html\'" ng-controller="ESSocialsEditCtrl"></ng-include>\n\n <div class="list item-text-wrap {{::motion.ionListClass}}">\n\n <div class="item item-divider" translate>PROFILE.TECHNICAL_DIVIDER</div>\n\n \x3c!-- pubkey --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.pubkey.$invalid}">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <input type="text" name="pubkey" placeholder="{{\'REGISTRY.EDIT.RECORD_PUBKEY_HELP\'|translate}}" ng-model="formData.pubkey" autocomplete="off" ng-pattern="pubkeyPattern" ng-model-options="{ debounce: 250 }">\n </div>\n <div class="form-errors" ng-show="form.pubkey.$error" ng-messages="form.pubkey.$error">\n <div class="form-error" ng-message="pattern">\n <span translate="ERROR.INVALID_PUBKEY"></span>\n </div>\n </div>\n\n <div class="item padding hidden-xs hidden-sm text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm ink" ng-class="{\'button-assertive\': dirty}" type="submit">\n {{\'COMMON.BTN_SAVE\' | translate}}\n </button>\n </div>\n </div>\n </form>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> \n </div>\n </div>\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/es/templates/user/items_profile.html",'<div ng-if="!formData.profile && !formData.name" class="item gray" translate>PROFILE.NO_PROFILE_DEFINED</div>\n\n\x3c!-- name --\x3e\n<div class="item" ng-if="formData.name && showName">\n <span class="gray" translate>PROFILE.TITLE</span>\n <h3>{{formData.name}}</h3>\n</div>\n\n\x3c!-- About me --\x3e\n<div class="item item-text-wrap" ng-if="formData.profile && formData.profile.description">\n <span class="gray" translate>PROFILE.DESCRIPTION</span>\n <h3 trust-as-html="formData.profile.description"></h3>\n</div>\n\n\x3c!-- Localisation --\x3e\n<div class="item" ng-if="formData.profile.address || formData.profile.city" copy-on-click="{{formData.profile.address ? formData.profile.address + \' \' : \'\'}}{{formData.profile.city}}">\n <span class="gray" translate>LOCATION.LOCATION_DIVIDER</span>\n <h3>\n <span class="text-keep-lines" ng-if="formData.profile.address">{{formData.profile.address}}<br></span>\n {{formData.profile.city}}\n </h3>\n</div>\n\n\x3c!-- Socials networks --\x3e\n<div class="item" ng-if="formData.profile.socials && formData.profile.socials.length" ng-controller="ESSocialsViewCtrl">\n <span class="gray" translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</span>\n <div class="list no-padding">\n <ion-item ng-repeat="social in formData.profile.socials | filter:filterFn track by social.url " id="social-{{::social.url|formatSlug}}" class="item-icon-left item-text-wrap no-padding-bottom ink" ng-click="openSocial($event, social)">\n <i class="icon ion-social-{{social.type}}" ng-class="{\'ion-bookmark\': social.type == \'other\', \'ion-link\': social.type == \'web\', \'ion-email\': social.type == \'email\', \'ion-iphone\': social.type == \'phone\'}"></i>\n <p ng-if="social.type && social.type != \'web\'">\n {{social.type}}\n <i class="ion-locked" ng-if="social.recipient"></i>\n </p>\n <h4>\n <a>{{::social.url}}</a>\n </h4>\n </ion-item>\n </div>\n</div>\n\n\n'),e.put("plugins/es/templates/wallet/view_wallet_extend.html",'<ng-if ng-if=":state:enable && extensionPoint === \'hero\'">\n \x3c!-- likes --\x3e\n <h4 class="light">\n <small ng-include="\'plugins/es/templates/common/view_likes.html\'" ng-init="canEdit=true"></small>\n </h4>\n</ng-if>\n\n<ng-if ng-if=":state:enable && extensionPoint === \'after-general\'">\n\n \x3c!-- profile --\x3e\n <div class="item item-divider item-divider-top-border">\n <span ng-bind-html="\'PROFILE.PROFILE_DIVIDER\' | translate"></span>\n <a class="badge button button-text button-small button-small-padding" ui-sref="app.user_edit_profile">\n <i class="icon ion-edit"></i>\n <span ng-if="!formData.profile" translate>PROFILE.BTN_ADD</span>\n <span ng-if="formData.profile" translate>PROFILE.BTN_EDIT</span>\n </a>\n </div>\n\n <ng-include src="\'plugins/es/templates/user/items_profile.html\'" ng-init="showName=true"></ng-include>\n\n \x3c!-- subscriptions --\x3e\n <div class="item item-divider item-divider-top-border">\n <span>\n {{\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER\' | translate}}\n <i style="font-size: 12pt; cursor: pointer;" ng-click="showSubscriptionHelp=!showSubscriptionHelp" class="icon positive ion-ios-help-outline" title="{{\'SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP\' | translate}}"></i>\n <span>\n\n <a class="badge button button-text button-small button-small-padding" ng-if="!formData.subscriptions.count" ui-sref="app.edit_subscriptions">\n <i class="icon ion-edit"></i>\n <span translate>SUBSCRIPTION.BTN_ADD</span>\n </a>\n </span></span></div>\n\n <div class="item item-text-wrap positive item-small-height" ng-show="showSubscriptionHelp">\n <small translate>SUBSCRIPTION.SUBSCRIPTION_DIVIDER_HELP</small>\n </div>\n\n <div ng-if="!formData.subscriptions.count" class="item gray" translate>SUBSCRIPTION.NO_SUBSCRIPTION</div>\n\n <a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.subscriptions.count" ui-sref="app.edit_subscriptions">\n <i class="icon ion-gear-a"></i>\n <span translate>SUBSCRIPTION.SUBSCRIPTION_COUNT</span>\n <span class="badge badge-calm">{{formData.subscriptions.count}}</span>\n\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n\n \x3c!-- page --\x3e\n <div class="item item-divider item-divider-top-border">\n <span>\n {{\'REGISTRY.WALLET.REGISTRY_DIVIDER\' | translate}}\n <i style="font-size: 12pt; cursor: pointer;" ng-click="showPagesHelp=!showPagesHelp" class="icon positive ion-ios-help-outline" title="{{\'REGISTRY.WALLET.REGISTRY_HELP\' | translate}}"></i>\n <span>\n\n <a class="badge button button-text button-small button-small-padding" ng-if="!formData.pages.count" ng-click="showNewPageModal($event)">\n <i class="icon ion-edit"></i>\n <span translate>REGISTRY.BTN_NEW</span>\n </a>\n </span></span></div>\n\n <div class="item item-text-wrap positive item-small-height" ng-show="showPagesHelp">\n <small translate>REGISTRY.WALLET.REGISTRY_HELP</small>\n </div>\n\n <div ng-if="!formData.pages.count" class="item gray" translate>REGISTRY.NO_PAGE</div>\n\n <a class="item item-icon-left item-text-wrap item-icon-right ink" ng-if="formData.pages.count" ui-sref="app.wallet_pages">\n <i class="icon ion-social-buffer"></i>\n <span translate>REGISTRY.MY_PAGES</span>\n <span class="badge badge-calm">{{formData.pages.count}}</span>\n\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n</ng-if>\n'),e.put("plugins/es/templates/wot/view_identity_extend.html",'\x3c!-- Hero --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'hero\'">\n \x3c!-- likes --\x3e\n <h4 class="light">\n <small ng-include="\'plugins/es/templates/common/view_likes.html\'"></small>\n </h4>\n</ng-if>\n\n\x3c!-- Top fab buttons --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons-top-fab\'">\n <button id="fab-compose-{{:rebind:formData.pubkey}}" class="button button-fab button-fab-top-left button-fab-hero mini button-stable spin" style="left: 88px;" ng-click="showNewMessageModal()">\n <i class="icon ion-compose"></i>\n </button>\n</ng-if>\n\n\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons\'">\n\n \x3c!-- message --\x3e\n <button class="button button-calm button-raised icon icon-left icon ion-compose ink" ng-click="showNewMessageModal()" title="{{\'MESSAGE.BTN_WRITE\' | translate}}" translate>\n MESSAGE.BTN_WRITE\n </button>\n \x3c!-- Star --\x3e\n <button class="button button-stable button-small-padding ink" ng-if="likeData.stars && !likeData.stars.wasHit" title="{{\'WOT.VIEW.BTN_STAR_HELP\'|translate: likeData.stars }}" ng-click="showStarPopover($event)">\n <i class="icon ion-android-star-outline"></i>\n </button>\n <button class="button button-stable button-small-padding ink" ng-if="likeData.stars.wasHit" title="{{\'WOT.VIEW.BTN_REDO_STAR_HELP\'|translate: likeData.stars }}" ng-click="showStarPopover($event)">\n <i class="icon" ng-class="{\'ion-android-star-half\': likeData.stars.level > 0 && likeData.stars.level <=3, \'ion-android-star\': likeData.stars.level > 3}"></i>\n <span>{{likeData.stars.level}}/5</span>\n </button>\n\n \x3c!-- options --\x3e\n <button class="button button-stable button-small-padding icon ion-android-more-vertical" ng-click="showActionsPopover($event)">\n </button>\n</ng-if>\n\n\x3c!-- General section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'general\'">\n\n \x3c!-- star level --\x3e\n <div class="item item-icon-left item-text-wrap" ng-if="likeData.stars" ng-click="smallscreen && showStarPopover($event)">\n\n <i class="icon" ng-class="{\'ion-android-star-outline\': likeData.stars.levelAvg <= 2, \'ion-android-star-half\': likeData.stars.levelAvg > 2 && likeData.stars.levelAvg <= 3, \'ion-android-star energized\': likeData.stars.levelAvg > 3}"></i>\n\n <span translate>WOT.VIEW.STARS</span>\n <h4 class="dark">{{\'WOT.VIEW.STAR_HIT_COUNT\' | translate: likeData.stars }}</h4>\n\n <div class="badge" ng-if="likeData.stars.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n <div class="badge" ng-if="!likeData.stars.loading">\n <span ng-repeat="value in [1,2,3,4,5]" ng-class="{\'energized\': likeData.stars.levelAvg > 3, \'assertive\': likeData.stars.levelAvg <= 2}">\n <b class="ion-android-star" ng-if="value <= likeData.stars.levelAvg"></b>\n <b class="ion-android-star-half" ng-if="value > likeData.stars.levelAvg && value - 0.5 <= likeData.stars.levelAvg"></b>\n <b class="ion-android-star-outline" ng-if="value > likeData.stars.levelAvg && value - 0.5 > likeData.stars.levelAvg"></b>\n </span>\n <small class="dark">({{likeData.stars.levelAvg}}/5)</small>\n </div>\n </div>\n\n \x3c!-- Registration date --\x3e\n <ion-item class="item-icon-left" ng-if="formData.profile.creationTime">\n <i class="icon ion-person"></i>\n <b class="ion-clock icon-secondary" style="font-size: 16px; left: 35px; top: -7px;"></b>\n <span translate>WOT.VIEW.SENIORITY</span>\n <h5 class="dark">\n <span translate>WOT.REGISTERED_SINCE</span>\n {{formData.profile.creationTime | formatDate}}\n </h5>\n <span class="badge badge-stable">{{formData.profile.creationTime | formatFromNowShort }}</span>\n </ion-item>\n</ng-if>\n\n\x3c!-- After general section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'after-general\'">\n\n <span class="item item-divider item-divider-top-border" translate>PROFILE.PROFILE_DIVIDER</span>\n\n <div class="double-padding-x padding-bottom">\n <ng-include src="\'plugins/es/templates/user/items_profile.html\'" ng-init="showName=false;"></ng-include>\n </div>\n\n</ng-if>\n'),e.put("plugins/es/templates/wot/view_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-click="showSharePopover($event)">\n <i class="icon ion-android-share-alt"></i>\n {{\'COMMON.BTN_SHARE\' | translate}}\n </a>\n\n \x3c!--<a class="item item-icon-left assertive ink "\n ng-if="canEdit"\n ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'COMMON.BTN_DELETE\' | translate}}\n </a>--\x3e\n\n \x3c!-- Follow --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.follows" ng-click="hideActionsPopover() && toggleLike($event, {kind: \'follow\'})">\n <i class="icon" ng-class="{\'ion-android-notifications-off\': likeData.follows.wasHit, \'ion-android-notifications\': !likeData.follows.wasHit}"></i>\n <b class="ion-plus icon-secondary" ng-if="!likeData.follows.wasHit" style="font-size: 16px; left: 38px; top: -7px;"></b>\n {{(!likeData.follows.wasHit ? \'WOT.VIEW.BTN_FOLLOW\' : \'WOT.VIEW.BTN_STOP_FOLLOW\' )| translate}}\n </a>\n\n \x3c!-- report abuse --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.abuses && !likeData.abuses.wasHit" ng-click="hideActionsPopover() && reportAbuse($event)">\n <i class="icon ion-android-warning"></i>\n {{\'COMMON.BTN_REPORT_ABUSE_DOTS\' | translate}}\n </a>\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.abuses && likeData.abuses.wasHit" ng-click="hideActionsPopover() && toggleLike($event, {kind: \'abuse\'})">\n <i class="icon ion-android-warning"></i>\n <b class="ion-close icon-secondary" style="font-size: 16px; left: 38px; top: -7px;"></b>\n {{\'COMMON.BTN_REMOVE_REPORTED_ABUSE\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/graph/templates/account/graph_balance.html",'\n \x3c!-- button bar --\x3e\n <div class="button-bar-inline" style="top: 33px; margin-top:-33px; position: relative;">\n <button class="button button-stable button-clear no-padding-xs pull-right" ng-click="showActionsPopover($event)">\n <i class="icon ion-navicon-round"></i>\n </button>\n </div>\n\n <div class="padding-left padding-right">\n <canvas id="account-balance" class="chart-bar" height="{{height}}" width="{{width}}" chart-data="data" chart-dataset-override="datasetOverride" chart-colors="colors" chart-options="options" chart-labels="labels" chart-click="onChartClick">\n </canvas>\n </div>\n\n <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/account/graph_certifications.html",'\n <div class="padding-left padding-right">\n <canvas id="account-certifications" class="chart-bar" height="{{height}}" width="{{width}}" chart-data="data" chart-dataset-override="datasetOverride" chart-colors="colors" chart-options="options" chart-labels="labels" chart-click="onChartClick">\n </canvas>\n </div>\n'),e.put("plugins/graph/templates/account/graph_sum_tx.html",'<div class="row responsive-sm" ng-if="!loading">\n\n <div class="col col-10 hidden-xs hidden-sm"> </div>\n\n <div class="col text-center">\n\n \x3c!-- [NEW] TX input chart --\x3e\n <p class="gray padding text-wrap" ng-if="inputChart.data.length" translate>GRAPH.ACCOUNT.INPUT_CHART_TITLE</p>\n <canvas id="chart-received-pie" class="chart-pie" chart-data="inputChart.data" chart-labels="inputChart.labels" chart-colors="inputChart.colors" chart-click="onInputChartClick">\n </canvas>\n\n </div>\n\n <div class="col col-10 hidden-xs hidden-sm"> </div>\n\n <div class="col text-center">\n\n \x3c!-- [NEW] TX input chart --\x3e\n <p class="gray padding text-wrap" ng-if="outputChart.data.length" translate>GRAPH.ACCOUNT.OUTPUT_CHART_TITLE</p>\n <canvas id="chart-sent-pie" class="chart-pie" chart-data="outputChart.data" chart-labels="outputChart.labels" chart-colors="outputChart.colors" chart-click="onOutputChartClick">\n </canvas>\n\n </div>\n\n <div class="col col-10 hidden-xs hidden-sm"> </div>\n\n</div>\n'),e.put("plugins/graph/templates/account/view_stats.html",'<ion-view left-buttons="leftButtons" cache-view="false">\n <ion-nav-title>\n {{\'GRAPH.ACCOUNT.TITLE\' | translate}}{{id}}\n </ion-nav-title>\n\n <ion-content scroll="true" class="no-padding">\n\n\n\n <div class="list">\n\n \x3c!-- - - - - Balance - - - - --\x3e\n <ng-controller ng-controller="GpAccountBalanceCtrl">\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="item item-divider" ng-if="!loading">\n {{\'GRAPH.ACCOUNT.BALANCE_DIVIDER\'|translate}}\n <ion-spinner ng-if="loadingRange" class="ion-spinner-small" icon="android"></ion-spinner>\n </div>\n\n <div class="item no-padding-xs" ng-if="!loading" ng-include="\'plugins/graph/templates/account/graph_balance.html\'" ng-init="setSize(350, 1000)">\n </div>\n </ng-controller>\n\n </div>\n\n <div class="item no-padding-xs" ng-include="\'plugins/graph/templates/account/graph_sum_tx.html\'" ng-controller="GpAccountSumTxCtrl">\n </div>\n\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/common/graph_range_bar.html",'\n <div class="range range-positive no-padding-left no-padding-right">\n <a class="button button-stable button-clear no-padding pull-left" ng-click="goPreviousRange($event)">\n <i class="icon ion-chevron-left"></i>\n </a>\n <input type="range" ng-model="formData.timePct" name="timePct" min="0" max="100" value="{{formData.timePct}}" ng-change="onRangeChanged();" ng-model-options="{ debounce: 250 }">\n <a class="button button-stable button-clear no-padding pull-right" ng-click="goNextRange($event)">\n <i class="icon ion-chevron-right"></i>\n </a>\n </div>\n'),e.put("plugins/graph/templates/common/popover_range_actions.html",'<ion-popover-view class="has-header popover-graph-currency">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_ACTIONS_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- duration divider --\x3e\n <div class="item item-divider">\n {{\'GRAPH.COMMON.RANGE_DURATION_DIVIDER\'|translate}}\n </div>\n\n \x3c!-- duration: hour --\x3e\n <a class="item item-icon-left ink" ng-click="setRangeDuration(\'hour\')">\n <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'hour\'"></i>\n <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.HOUR\' | translate"></span>\n </a>\n\n \x3c!-- duration: day --\x3e\n <a class="item item-icon-left ink" ng-click="setRangeDuration(\'day\')">\n <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'day\'"></i>\n <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.DAY\' | translate"></span>\n </a>\n\n \x3c!-- duration: month --\x3e\n <a class="item item-icon-left ink" ng-click="setRangeDuration(\'month\')">\n <i class="icon ion-ios-checkmark-empty" ng-show="formData.rangeDuration==\'month\'"></i>\n <span ng-bind-html="\'GRAPH.COMMON.RANGE_DURATION.MONTH\' | translate"></span>\n </a>\n\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/graph/templates/docstats/graph.html",'\n \x3c!-- graphs button bar --\x3e\n <div class="button-bar-inline" style="top: 33px; margin-top:-33px; position: relative;">\n <button class="button button-stable button-clear no-padding-xs pull-right" ng-click="showActionsPopover($event)">\n <i class="icon ion-navicon-round"></i>\n </button>\n </div>\n\n <canvas id="{{::chartIdPrefix}}{{chart.id}}" class="chart-line" height="{{height}}" width="{{width}}" chart-data="chart.data" chart-labels="labels" chart-dataset-override="chart.datasetOverride" chart-options="chart.options" chart-click="onChartClick">\n </canvas>\n\n <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/docstats/view_stats.html",'<ion-view left-buttons="leftButtons" cache-view="false">\n <ion-nav-title>\n {{\'GRAPH.DOC_STATS.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content scroll="true" class="padding">\n\n <div class="list">\n\n \x3c!-- Doc stat --\x3e\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="item no-padding-xs" ng-if="!loading" ng-repeat="chart in charts" ng-include="\'plugins/graph/templates/docstats/graph.html\'" ng-init="setSize(250, 1000)">\n </div>\n\n </div>\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/graph/templates/network/view_es_network_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'buttons\'">\n <a class="button button-text button-small ink" ui-sref="app.doc_stats_lg">\n <i class="icon ion-stats-bars"></i>\n <span>{{\'NETWORK.VIEW.BTN_GRAPH\'|translate}}</span>\n </a>\n</ng-if>\n'),e.put("plugins/graph/templates/network/view_es_peer_extend.html",'\x3c!-- Buttons section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'general\'">\n\n <a class="item item-icon-left item-icon-right item-text-wrap ink" ng-if="isReachable" ui-sref="app.doc_stats_lg">\n <i class="icon ion-stats-bars"></i>\n <span translate>GRAPH.DOC_STATS.TITLE</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n\n <a class="item item-icon-left item-icon-right item-text-wrap ink" ng-if="isReachable" ui-sref="app.doc_synchro_lg">\n <i class="icon ion-stats-bars"></i>\n <span translate>GRAPH.SYNCHRO.TITLE</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n</ng-if>\n\n'),e.put("plugins/graph/templates/synchro/graph.html",'\n \x3c!-- graphs button bar --\x3e\n <div class="button-bar-inline" style="top: 33px; margin-top:-33px; position: relative;">\n <button class="button button-stable button-clear no-padding-xs pull-right" ng-click="showActionsPopover($event)">\n <i class="icon ion-navicon-round"></i>\n </button>\n </div>\n\n <canvas id="synchro-chart-{{chart.id}}" class="chart-bar" height="{{height}}" width="{{width}}" chart-data="chart.data" chart-labels="labels" chart-dataset-override="chart.datasetOverride" chart-options="chart.options">\n </canvas>\n\n <ng-include src="\'plugins/graph/templates/common/graph_range_bar.html\'"></ng-include>\n'),e.put("plugins/graph/templates/synchro/view_stats.html",'<ion-view left-buttons="leftButtons" cache-view="false">\n <ion-nav-title>\n {{\'GRAPH.SYNCHRO.TITLE\' | translate}}\n </ion-nav-title>\n\n <ion-content scroll="true" class="padding">\n\n <div class="list">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="item no-padding-xs" ng-if="!loading" ng-repeat="chart in charts" ng-include="\'plugins/graph/templates/synchro/graph.html\'" ng-init="setSize(250, 1000)">\n </div>\n\n </div>\n\n </ion-content>\n\n</ion-view>\n'),e.put("plugins/map/templates/shape/edit_shape.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span translate>MAP.SHAPE.EDIT.TITLE</span>\n </ion-nav-title>\n\n \x3c!-- country form --\x3e\n <form name="countryForm" novalidate="" ng-submit="save()">\n\n <ion-header-bar class="stable-bg has-header" style="top:45px;" ng-init="setCountryForm(countryForm)">\n\n <div class="row no-padding no-margin">\n <div class="col no-padding no-margin"> \n </div>\n <div class="col no-margin floating">\n\n \x3c!-- country (select) --\x3e\n <label ng-if="!map.geojson.data" class="item item-input item-select stable-bg no-padding">\n <div class="input-label padding-left" translate>MAP.SHAPE.EDIT.COUNTRY_DOTS</div>\n <input type="text" name="country" ng-model="formData.country" class="ng-hide" required>\n <select ng-model="formData.country" ng-change="onCountryChange(formData.country)" ng-options="country as (countriesMap[country] || country) for country in countries track by country">\n </select>\n </label>\n\n \x3c!-- country (input) --\x3e\n <div ng-if="map.geojson.data" class="item item-input stable-bg no-padding" ng-class="{\'item-input-error\': countryForm.$submitted && countryForm.country.$invalid}">\n <span class="input-label padding-left" translate>MAP.SHAPE.EDIT.COUNTRY_DOTS</span>\n <input type="text" name="country" placeholder="{{\'MAP.SHAPE.EDIT.COUNTRY_HELP\'|translate}}" ng-model="formData.country" autocomplete="off" ng-pattern="iso2Pattern" required>\n </div>\n <div class="form-errors light-bg" ng-show="countryForm.$submitted && countryForm.country.$invalid" ng-messages="countryForm.country.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="pattern">\n <span translate="MAP.SHAPE.EDIT.ERROR.INVALID_COUNTRY_CODE"></span>\n </div>\n </div>\n </div>\n\n <div class="col no-padding no-margin">\n\n <div class="pull-right ng-hide" ng-show="map.geojson.data">\n <button class="button button-clear button-small ink" type="button" ng-click="download()">\n <span class="dark" translate>COMMON.BTN_DOWNLOAD</span>\n </button>\n <button class="button button-clear button-small ink" type="button" ng-click="cancel()">\n <span class="dark" translate>COMMON.BTN_CANCEL</span>\n </button>\n </div>\n </div>\n </div>\n\n </ion-header-bar>\n </form>\n\n <ion-content style="top:90px;">\n\n \x3c!-- Add file drop zone --\x3e\n <div class="block padding" ng-if="!map.geojson.data">\n <div drop-zone="onFileChanged(file)">\n <div file-select="onFileChanged(file)" accept="*.json">\n <i class="ion-map stable" style="font-size:150px"></i>\n <b class="ion-plus gray" style="position:relative; font-size:80px; top:-51px; right: 19px;"></b>\n <p class="gray" translate>MAP.COMMON.CHOOSE_FILE</p>\n </div>\n </div>\n </div>\n\n <div class="row no-padding no-margin" style="height: calc(100vh - 90px);">\n\n <div class="col col-75 no-padding" ng-style="{\'overflow-y\': map.geojson.data ? \'scroll\' : \'\'}">\n\n \x3c!-- leaflet map --\x3e\n <leaflet ng-if="map.geojson.data" height="40%" id="{{::mapId}}" lf-center="map.center" bounds="map.bounds" geojson="map.geojson">\n </leaflet>\n\n \x3c!-- Shape --\x3e\n <div id="{{::shapeId}}" class="shape-container compacted"></div>\n </div>\n\n\n <div class="col col-25 no-margin" style="border-left: 1px solid lightgrey;" ng-if="elementData.element || map.geojson.data">\n\n \x3c!-- ******** Config form ******** --\x3e\n\n <form name="configForm" novalidate="" ng-submit="applySvgConfig()" class="list">\n <div class="item item-divider" ng-init="setConfigForm(configForm)" translate>\n MAP.SHAPE.EDIT.CONFIG_FORM_DIVIDER\n </div>\n\n \x3c!-- top lat --\x3e\n <div class="item col-50 col-offset-25 item-input item-floating-label" ng-if="showConfig" ng-class="{\'item-input-error\': configForm.$submitted && configForm.topLat.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.TOP_LAT</span>\n <input type="number" name="topLat" class="" placeholder="{{\'MAP.SHAPE.EDIT.TOP_LAT\'|translate}}" ng-model="configData.geoViewBox.topLat" step="0.001" min="-90" max="90" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.topLat.$invalid" ng-messages="configForm.topLat.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n <div class="item row no-margin no-padding" ng-if="showConfig">\n <div class="col col-50">\n \x3c!-- left lng --\x3e\n <div class="item-input item-floating-label" ng-class="{\'item-input-error\': configForm.$submitted && configForm.leftLng.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.LEFT_LNG</span>\n <input type="number" name="leftLng" placeholder="{{\'MAP.SHAPE.EDIT.LEFT_LNG\'|translate}}" ng-model="configData.geoViewBox.leftLng" step="0.001" min="-180" max="180" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.leftLng.$invalid" ng-messages="configForm.leftLng.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n </div>\n\n <div class="col col-50" ng-if="showConfig">\n \x3c!-- right lng --\x3e\n <div class="item-input item-floating-label" ng-class="{\'item-input-error\': configForm.$submitted && configForm.rightLng.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.RIGHT_LNG</span>\n <input type="number" name="rightLng" placeholder="{{\'MAP.SHAPE.EDIT.RIGHT_LNG\'|translate}}" ng-model="configData.geoViewBox.rightLng" step="0.001" min="-180" max="180" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.rightLng.$invalid" ng-messages="configForm.rightLng.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n </div>\n </div>\n\n \x3c!-- bottom lat --\x3e\n <div class="row no-margin no-padding" ng-if="showConfig">\n <div class="item col col-offset-25 col-50 item-input item-floating-label" ng-class="{\'item-input-error\': configForm.$submitted && configForm.bottomLat.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.BOTTOM_LAT</span>\n <input type="number" name="leftLng" placeholder="{{\'MAP.SHAPE.EDIT.BOTTOM_LAT\'|translate}}" ng-model="configData.geoViewBox.bottomLat" step="0.001" min="-90" max="90" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.leftLng.$invalid" ng-messages="configForm.leftLng.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n </div>\n\n \x3c!-- Remove hole --\x3e\n <ion-checkbox ng-model="configData.removeHole" class="item ink item-text-wrap">\n <div class="item-content dark" translate>MAP.SHAPE.EDIT.REMOVE_HOLE</div>\n </ion-checkbox>\n\n \x3c!-- Strict mode --\x3e\n <ion-checkbox ng-model="configData.strictMode" class="item ink item-text-wrap">\n <div class="item-content dark" translate>MAP.SHAPE.EDIT.STRICT_MODE</div>\n </ion-checkbox>\n\n \x3c!-- Max precision --\x3e\n <ion-checkbox ng-if="showConfig" ng-model="configData.applyRound" class="item ink item-text-wrap">\n <div class="item-content dark" translate>MAP.SHAPE.EDIT.APPLY_ROUND</div>\n </ion-checkbox>\n\n \x3c!-- precision --\x3e\n <div class="item-input item-floating-label" ng-if="configData.applyRound" ng-class="{\'item-input-error\': configForm.$submitted && configForm.degreePrecision.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.DEGREES_PRECISION</span>\n <input type="number" name="degreePrecision" ng-model="configData.degreePrecision" placeholder="{{\'MAP.SHAPE.EDIT.DEGREES_PRECISION\'|translate}}" min="0" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.degreePrecision.$invalid" ng-messages="configForm.degreePrecision.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- Auto compute projection --\x3e\n <ion-checkbox ng-if="showConfig" ng-model="configData.customProjection" class="item ink item-text-wrap">\n <div class="item-content dark" translate>MAP.SHAPE.EDIT.CUSTOM_PROJECTION</div>\n </ion-checkbox>\n\n \x3c!-- translate--\x3e\n <div class="item row no-margin no-padding" ng-if="showConfig && configData.customProjection">\n <div class="col col-50">\n \x3c!-- translate X --\x3e\n <div class="item-input item-floating-label" ng-class="{\'item-input-error\': configForm.$submitted && configForm.translateX.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.TRANSLATE_X</span>\n <input type="number" name="translateX" placeholder="{{\'MAP.SHAPE.EDIT.TRANSLATE_X\'|translate}}" ng-model="configData.translateX" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.translateX.$invalid" ng-messages="configForm.translateX.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n </div>\n\n <div class="col col-50">\n \x3c!-- translate Y --\x3e\n <div class="item-input item-floating-label" ng-class="{\'item-input-error\': configForm.$submitted && configForm.translateY.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.TRANSLATE_Y</span>\n <input type="number" name="translateY" placeholder="{{\'MAP.SHAPE.EDIT.TRANSLATE_Y\'|translate}}" ng-model="configData.translateY" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.translateY.$invalid" ng-messages="configForm.translateY.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n </div>\n </div>\n\n \x3c!-- scale --\x3e\n <div class="item item-input item-floating-label item-button-right" ng-if="configData.customProjection" ng-class="{\'item-input-error\': configForm.$submitted && configForm.scale.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.SCALE</span>\n <input type="number" name="scale" placeholder="{{\'MAP.SHAPE.EDIT.SCALE\'|translate}}" ng-model="configData.scale" required>\n </div>\n <div class="form-errors" ng-show="configForm.$submitted && configForm.scale.$invalid" ng-messages="configForm.scale.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- config form buttons --\x3e\n <div class="padding-top text-right">\n \x3c!-- apply --\x3e\n <button ng-if="showConfig" class="button button-positive button-small button-small-padding ink" type="submit" translate>MAP.SHAPE.EDIT.BTN_APPLY</button>\n\n <button class="button button-assertive button-small button-small-padding ink" type="button" ng-disabled="!dirty" ng-click="save()">\n <span translate>COMMON.BTN_SAVE</span>\n </button>\n </div>\n\n \x3c!-- errors --\x3e\n <div class="item item-divider padding-top" ng-if="formData.errors" translate>MAP.SHAPE.EDIT.ERROR_DIVIDER\n </div>\n <div class="item item-text-wrap" ng-if="formData.errors" ng-repeat="err in formData.errors">\n\n <div class="assertive">\n <i class="icon ion-close-circled"></i>\n <span ng-bind-html="err.message | translate: err.messageParams"></span>\n </div>\n <h4>\n <a ng-if="err.lat && err.lon" ng-click="centerMap({lat: err.lat, lon: err.lon})">\n {{\'MAP.COMMON.BTN_SHOW_ON_MAP\'|translate}}\n </a>\n </h4>\n </div>\n\n </form>\n\n \x3c!-- Edit properties form --\x3e\n <form name="elementForm" novalidate="" ng-submit="confirmEditElement()" class="list" ng-if="elementData.element">\n <div class="item item-divider" ng-init="setElementForm(elementForm)" translate>\n MAP.SHAPE.EDIT.AREA_FORM_DIVIDER\n </div>\n\n \x3c!-- ID --\x3e\n <div class="item item-input" ng-class="{\'item-input-error\': elementForm.$submitted && elementForm.id.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.ID</span>\n <input type="text" name="id" autocomplete="off" placeholder="{{\'MAP.SHAPE.EDIT.ID\'|translate}}" ng-model="elementData.id" required>\n </div>\n <div class="form-errors" ng-show="elementForm.$submitted && elementForm.id.$invalid" ng-messages="elementForm.id.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- element title --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': elementForm.$submitted && elementForm.title.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.NAME</span>\n <input type="text" name="title" autocomplete="off" placeholder="{{\'MAP.SHAPE.EDIT.NAME\'|translate}}" ng-model="elementData.title" required>\n </div>\n <div class="form-errors" ng-show="elementForm.$submitted && elementForm.title.$invalid" ng-messages="elementForm.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- element position --\x3e\n <label class="item item-input item-select" style="margin-top: 2px;" ng-class="{\'item-input-error\': elementForm.$submitted && elementForm.position.$invalid}">\n <div class="input-label pull-right" translate>MAP.SHAPE.EDIT.POSITION_DOTS</div>\n <input type="text" name="position" ng-model="elementData.position" class="ng-hide" required>\n <select ng-model="elementData.position" ng-change="onPositionChange(elementData.position)" ng-options="position for position in positions track by position">\n </select>\n </label>\n <div class="form-errors" ng-show="elementForm.$submitted && elementForm.position.$invalid" ng-messages="elementForm.position.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- order --\x3e\n <div class="item item-input item-floating-label" ng-class="{\'item-input-error\': elementForm.$submitted && elementForm.order.$invalid}">\n <span class="input-label" translate>MAP.SHAPE.EDIT.ORDER</span>\n <input type="number" name="order" min="1" autocomplete="off" ng-disabled="elementData.position === \'main\'" placeholder="{{\'MAP.SHAPE.EDIT.ORDER\'|translate}}" ng-model="elementData.order" required-if="elementData.position !== \'main\'">\n </div>\n <div class="form-errors" ng-show="elementForm.$submitted && elementForm.order.$invalid" ng-messages="elementForm.order.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="min">\n <span translate="ERROR.FIELD_MIN" translate-values="{min: 1}"></span>\n </div>\n </div>\n\n \x3c!-- element form buttons --\x3e\n <div class="padding-top text-right">\n \x3c!-- cancel --\x3e\n <button class="button button-clear button-dark button-small button-small-padding ink" type="button" ng-click="cancelEditElement()" translate>COMMON.BTN_CANCEL</button>\n \x3c!-- apply --\x3e\n <button class="button button-positive button-small button-small-padding ink" type="submit" translate>MAP.SHAPE.EDIT.BTN_APPLY</button>\n </div>\n\n \x3c!-- more actions (delete, test search) --\x3e\n <div class="block padding-top text-center">\n <p>\n <a class="assertive" ng-click="deleteElement()" translate>MAP.SHAPE.EDIT.BTN_DELETE</a>\n <br>\n <a ng-click="searchOnPath()" translate>MAP.SHAPE.EDIT.BTN_TEST_SEARCH</a>\n </p>\n </div>\n\n </form>\n </div>\n\n\n </div>\n\n\n </ion-content>\n\n\n</ion-view>\n'),e.put("plugins/map/templates/shape/view_shape.html",'\n<div class="padding">\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n \x3c!-- Shape --\x3e\n <div id="{{::shapeId}}" class="shape-container compacted"></div>\n\n \x3c!-- Country links --\x3e\n <p ng-if="!loading && countries.length > 1" class="padding-top">\n <ng-repeat ng-repeat="country in countries">\n <span ng-if="$index"> | </span>\n <a ng-class="{\'bold\': country === selectedCountry}" ng-click="onCountryChange(country)">\n {{countriesMap[country] || (country|uppercase) }}\n </a>\n </ng-repeat>\n </p>\n\n \x3c!-- DEV ONLY\n <br/>\n <p>\n <a href="" id="demolink" target="_blank">View on a map, as GeoJSON</a>\n </p>--\x3e\n</div>\n'),e.put("plugins/map/templates/user/edit_profile_extend.html",'<div class="item no-padding {{ionItemClass}}" ng-if="formData.geoPoint && formData.geoPoint.lat && formData.geoPoint.lon">\n <leaflet height="250px" center="map.center" markers="map.markers" defaults="map.defaults">\n </leaflet>\n</div>\n'),e.put("plugins/market/templates/category/card_category_lg.html",'\n <div class="item card card-category stable-bg padding-bottom">\n \x3c!-- header: parent category --\x3e\n <div class="card-header">\n <a class="item block padding text-left" ng-class="{\'bold\': cat.count}" ng-click="onCategoryClick(cat)">\n <h3 class="dark bold"><span ng-bind-html="cat.name"></span>\n </h3>\n </a>\n </div>\n\n \x3c!-- children categories--\x3e\n <div class="list no-padding">\n <a ng-repeat="cat in cat.children" class="item item-small-height item-text-wrap positive ink" ng-click="onCategoryClick(cat)">\n <span ng-bind-html="cat.name"></span><ng-if ng-if="cat.count"> ({{cat.count}})</ng-if></a>\n </div>\n </div>\n'),e.put("plugins/market/templates/category/edit_categories.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span translate>MARKET.CATEGORY.EDIT.TITLE</span>\n </ion-nav-title>\n <ion-content>\n\n <div class="row">\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n <div class="col">\n\n\n <div class="center" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="padding assertive" ng-if="!loading && categories.length===0" translate>\n COMMON.SEARCH_NO_RESULT\n </div>\n\n \x3c!-- filter: locales and add/reorder buttons --\x3e\n <div class="list no-padding {{::motion.ionListClass}}">\n <div class="item item-text-wrap">\n <div class="col-60">\n <ng-repeat ng-repeat="l in locales">\n <span class="gray" ng-if="$index">| </span>\n <a class="button button-text button-small no-padding-bottom ink" ng-click="onChangeLocale(l)" ng-class="{\'button-text-positive\': l.id === locale, \'gray\': l.id !== locale}">{{l.label}}</a>\n </ng-repeat>\n </div>\n <div class="badge">\n <a class="button button-text button-small button-small-padding" ng-click="addRootCategory()">\n <span translate>MARKET.CATEGORY.EDIT.BTN_ADD</span>\n </a>\n\n <a class="button button-text button-small button-small-padding" ng-class="{\'button-text-positive\': reorderRoot}" ng-click="reorderRoot=!reorderRoot">\n <span translate>MARKET.CATEGORY.EDIT.BTN_REORDER</span>\n </a>\n </div>\n\n </div>\n </div>\n\n \x3c!-- List of root categories ONLY, when reorderRoot enable --\x3e\n <ion-list show-reorder="true" ng-if="reorderRoot">\n\n \x3c!-- loop on root categories --\x3e\n <ion-item ng-repeat="rootCat in categories track by rootCat.id" class="item-no-border item-icon-right stable-bg dark" ng-class="{\'bold\': rootCat.count}">\n <span ng-bind-html="getName(rootCat)"></span><ng-if ng-if="rootCat.count"> ({{rootCat.count}})</ng-if>\n <ion-reorder-button class="ion-drag" on-reorder="reorderRootCategory(rootCat, $fromIndex, $toIndex)">\n </ion-reorder-button>\n </ion-item>\n\n </ion-list>\n\n \x3c!-- Categories tree --\x3e\n <ng-if ng-if="!reorderRoot">\n\n \x3c!-- loop on root categories --\x3e\n <div class="card stable-bg padding" ng-repeat="rootCat in categories track by rootCat.id">\n <div class="item item-no-border item-icon-right bold">\n <span ng-bind-html="getName(rootCat, true)"></span><ng-if ng-if="rootCat.count"> ({{rootCat.count}})</ng-if>\n <a class="gray hidden-device" ng-click="removeRootCategory($index)">\n <b class="ion ion-trash-a"></b> \n </a>\n <a class="gray hidden-device" ng-click="editRootCategory($index)">\n <b class="ion ion-edit"></b> \n </a>\n\n <div class="badge">\n <a class="button button-text button-small button-small-padding" ng-click="addChildCategory(rootCat)">\n <span translate>MARKET.CATEGORY.EDIT.BTN_ADD</span>\n </a>\n <a class="button button-text button-small button-small-padding" ng-class="{\'button-text-positive\': reorderChildren === rootCat.id}" ng-click="reorderChildren=!(reorderChildren === rootCat.id) && rootCat.id">\n <span translate>MARKET.CATEGORY.EDIT.BTN_REORDER</span>\n </a>\n </div>\n </div>\n\n <ion-list show-reorder="reorderChildren === rootCat.id">\n\n\n \x3c!-- children categories--\x3e\n <ion-item ng-repeat="child in rootCat.children track by child.id" class="item item-icon-right item-border" id="{{child.id}}">\n <span ng-bind-html="getName(child, true)"></span><span ng-if="child.count"> ({{child.count}})</span>\n\n <a class="gray hidden-device" ng-if="reorderChildren !== rootCat.id" ng-click="removeChildCategory(rootCat, $index)">\n <b class="ion ion-trash-a"></b> \n </a>\n <a class="gray hidden-device" ng-if="reorderChildren !== rootCat.id" ng-click="editChildCategory(rootCat, $index)">\n <b class="ion ion-edit"></b> \n </a>\n\n <ion-reorder-button class="ion-drag" on-reorder="reorderChildrenCategory(rootCat, child, $fromIndex, $toIndex)">\n </ion-reorder-button>\n\n </ion-item>\n </ion-list>\n </div>\n\n </ng-if>\n\n\n <div class="item hidden-xs hidden-sm text-right no-border ng-hide" ng-show="!loading">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>COMMON.BTN_CANCEL</button>\n <button class="button button-calm ink" ng-class="{\'button-assertive\': dirty}" ng-click="save()" type="button" translate>COMMON.BTN_SAVE</button>\n </div>\n </div>\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n </div>\n\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/category/list_categories_lg.html",'<div class="row">\n <div class="col col-33">\n <ng-repeat ng-repeat="cat in categories track by cat.id" ng-if="$index % 3 == 0" ng-include="\'plugins/market/templates/category/card_category_lg.html\'">\n </ng-repeat>\n </div>\n\n <div class="col col-33">\n <ng-repeat ng-repeat="cat in categories track by cat.id" ng-if="$index % 3 == 1" ng-include="\'plugins/market/templates/category/card_category_lg.html\'">\n </ng-repeat>\n </div>\n\n <div class="col col-33">\n <ng-repeat ng-repeat="cat in categories track by cat.id" ng-if="$index % 3 == 2" ng-include="\'plugins/market/templates/category/card_category_lg.html\'">\n </ng-repeat>\n </div>\n</div>\n'),e.put("plugins/market/templates/category/popup_edit_category.html",'<form name="editForm" ng-submit="">\n <div class="list" ng-init="setEditForm(editForm)">\n \x3c!-- id --\x3e\n <label class="item item-input item-floating-label" ng-class="{\'item-input-error\': editForm.$submitted && editForm.id.$invalid}">\n <span class="input-label">{{\'MARKET.CATEGORY.EDIT.ID\' | translate}}</span>\n <input name="id" type="text" placeholder="{{\'MARKET.CATEGORY.EDIT.ID\' | translate}}" ng-model="formData.id" ng-minlength="4" ng-pattern="idPattern" required>\n </label>\n <div class="form-errors" ng-if="editForm.$submitted && editForm.id.$error" ng-messages="editForm.id.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n <div class="form-error" ng-message="pattern">\n <span translate="MARKET.CATEGORY.EDIT.ERROR.INVALID_ID_PATTERN"></span>\n </div>\n <div class="form-error" ng-message="duplicated">\n <span translate="MARKET.CATEGORY.EDIT.ERROR.ID_ALREADY_USED"></span>\n </div>\n </div>\n\n \x3c!-- name --\x3e\n <label class="item item-input item-floating-label" ng-class="{\'item-input-error\': editForm.$submitted && editForm.name.$invalid}">\n <span class="input-label">{{\'MARKET.CATEGORY.EDIT.NAME\' | translate}}</span>\n <input name="name" type="text" placeholder="{{\'MARKET.CATEGORY.EDIT.NAME\' | translate}}" ng-model="formData.name" ng-minlength="3" required>\n </label>\n <div class="form-errors" ng-if="editForm.$submitted && editForm.name.$error" ng-messages="editForm.name.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n </div>\n\n \x3c!-- TODO: parent --\x3e\n </div>\n</form>\n'),e.put("plugins/market/templates/category/view_categories_lg.html",'<ion-view left-buttons="leftButtons" class="market view-record">\n <ion-nav-title>\n \x3c!--<span translate>MARKET.VIEW.TITLE</span>--\x3e\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n \x3c!--<button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm"\n ng-click="showActionsPopover($event)">\n </button>--\x3e\n </ion-nav-buttons>\n\n <ion-content class="padding">\n\n <ng-include src="\'plugins/market/templates/category/list_categories_lg.html\'"></ng-include>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/category/view_categories.html",'<ion-view left-buttons="leftButtons" class="market view-record">\n <ion-nav-title>\n \x3c!--<span translate>MARKET.VIEW.TITLE</span>--\x3e\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="refresh()">\n </button>\n </ion-nav-buttons>\n\n <ion-content>\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list {{::motion.ionListClass}}" ng-if="!loading">\n\n \x3c!-- all categories --\x3e\n <a class="item item-border item-icon-left item-icon-right bold" ng-class="{\'bold\': totalCount}" ng-click="onCategoryClick()">\n <span translate>MARKET.CATEGORY.ALL</span> ({{totalCount}})\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n\n \x3c!-- loop on root categories --\x3e\n <ng-repeat ng-repeat="cat in categories track by cat.id">\n <a class="item stable-bg item-border item-icon-right" ng-class="{\'bold\': cat.count}" ng-click="onCategoryClick(cat)">\n <span ng-bind-html="cat.name"></span><ng-if ng-if="cat.count"> ({{cat.count}})</ng-if>\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n\n \x3c!-- children categories--\x3e\n <a ng-repeat="cat in cat.children track by cat.id" class="item item-border item-icon-right" ng-class="{\'text-italic\': !cat.count}" ng-click="onCategoryClick(cat)">\n <span ng-bind-html="cat.name"></span><span ng-if="cat.count"> ({{cat.count}})</span>\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n </ng-repeat>\n </div>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/document/item_document_comment.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-document-comment item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'compacted\': compactMode}" ng-click="selectDocument($event, doc)">\n\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:!doc.avatar" class="icon ion-ios-chatbubble-outline stable"></i>\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:doc.avatar" class="avatar" style="background-image: url(\'{{:rebind:doc.avatar.src}}\')"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4>\n <i class="ion-ios-chatbubble-outline dark"></i>\n <span class="gray" ng-if=":rebind:doc.name">\n <i class="ion-person" ng-show=":rebind:!compactMode"></i>\n {{:rebind:doc.name}}:\n </span>\n <span class="dark">\n <i class="ion-quote" ng-if=":rebind:!compactMode"></i>\n {{:rebind:doc.message|truncText:50}}\n </span>\n </h4>\n <h4 class="gray"> <i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}</h4>\n </div>\n\n <div class="col">\n\n </div>\n\n <div class="col" ng-if=":rebind:!compactMode">\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right hidden-xs hidden-sm" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/market/templates/document/item_document_profile.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'compacted\': compactMode}" ng-click="selectDocument($event, doc)">\n\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:doc.avatar" class="avatar" style="background-image: url({{:rebind:doc.avatar.src}})"></i>\n <i ng-show=":rebind:!compactMode" ng-if=":rebind:!doc.avatar" class="icon ion-person stable"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h4 ng-if=":rebind:doc.title">\n <i class="ion-person gray"></i>\n <span class="dark">\n {{:rebind:doc.title}}\n </span>\n <span class="gray">\n {{:rebind:\'DOCUMENT.LOOKUP.HAS_REGISTERED\'|translate}}\n </span>\n </h4>\n <h4>\n <span class="dark" ng-if=":rebind:doc.city">\n <i class="ion-location"></i> {{:rebind:doc.city}}\n </span>\n <span class="gray">\n <i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}\n </span>\n </h4>\n </div>\n\n <div class="col" ng-if=":rebind:!compactMode">\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/market/templates/document/item_document_record.html",'<ion-item id="doc-{{::doc.id}}" class="item item-document item-icon-left item-text-wrap ink {{::ionItemClass}} no-padding-top no-padding-bottom" ng-class="{\'positive-100-bg\': doc.updated}" ng-click="selectDocument($event, doc)">\n\n <i ng-if=":rebind:doc.thumbnail" class="avatar" style="background-image: url({{:rebind:doc.thumbnail.src}})"></i>\n <i ng-if=":rebind:!doc.thumbnail" class="icon ion-speakerphone stable"></i>\n\n <div class="row no-padding">\n <div class="col">\n <h3 ng-if="doc.title">\n <i class="ion-speakerphone dark"></i>\n {{:rebind:doc.title}}\n </h3>\n <h4>\n <span class="dark" ng-if=":rebind:doc.picturesCount > 1">\n <i class="ion-camera"></i> {{:rebind:doc.picturesCount}}\n </span>\n <span class="dark" ng-if=":rebind:doc.city">\n <i class="ion-location"></i> {{:rebind:doc.city}}\n </span>\n <span class="gray" ng-if=":rebind:doc.name">\n <i class="ion-person"></i> {{:rebind:doc.name}}\n </span>\n\n\n </h4>\n </div>\n\n <div class="col col-33">\n <small class="gray pull-right"><i class="ion-clock"></i> {{:rebind:doc.time|formatDate}}\n </small>\n <a ng-if=":rebind:login && doc.pubkey==walletData.pubkey" ng-click="remove($event, $index)" class="gray pull-right hidden-xs hidden-sm" title="{{\'DOCUMENT.LOOKUP.BTN_REMOVE\'|translate}}">\n <i class="ion-trash-a"></i>\n </a>\n </div>\n\n </div>\n</ion-item>\n'),e.put("plugins/market/templates/document/list_documents.html",'\n<ion-list class="list" ng-class="::motion.ionListClass">\n\n <ng-repeat ng-repeat="doc in :rebind:search.results track by doc.id" ng-switch on="doc.type">\n <div ng-switch-when="record">\n <ng-include src="::\'plugins/market/templates/document/item_document_record.html\'"></ng-include>\n </div>\n <div ng-switch-when="comment">\n <ng-include src="::\'plugins/market/templates/document/item_document_comment.html\'"></ng-include>\n </div>\n <div ng-switch-when="profile">\n <ng-include src="::\'plugins/market/templates/document/item_document_profile.html\'"></ng-include>\n </div>\n <div ng-switch-default>\n <ng-include src="::\'plugins/es/templates/document/item_document.html\'"></ng-include>\n </div>\n </ng-repeat>\n\n</ion-list>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n</ion-infinite-scroll>\n'),e.put("plugins/market/templates/gallery/modal_slideshow.html",'<ion-modal-view class="modal modal-pictures" on-swipe-down="stopAndCloseModal()">\n\n <ion-header-bar class="transparent">\n \x3c!-- start/stop buttons --\x3e\n <a class="button button-icon button-small-padding pull-left icon ion-play hidden-xs hidden-sm ink" ng-class="{\'light\': !interval, \'gray\': interval}" title="{{\'MARKET.GALLERY.BTN_START\'|translate}}" ng-click="startTimer()">\n </a>\n <a class="button button-icon button-small-padding pull-left icon ion-pause hidden-xs hidden-sm ink" ng-class="{\'light\': interval, \'gray\': !interval}" title="{{\'MARKET.GALLERY.BTN_PAUSE\'|translate}}" ng-click="stopTimer()">\n </a>\n\n <h1 class="title">\n <span class="balanced" ng-bind-html="category.name"></span>\n </h1>\n\n <div class="buttons buttons-right header-item">\n <span class="website gray">\n www.<span translate>COMMON.APP_NAME</span>.fr</span>\n <a class="button button-icon icon-right button-small-padding gray hidden-xs hidden-sm ink" ng-click="stopAndCloseModal()">\n <i class="icon ion-close gray"></i>\n </a>\n </div>\n </ion-header-bar>\n\n <ion-slide-box on-slide-changed="slideChanged(index)" active-slide="activeSlide" class="has-header">\n <ion-slide ng-repeat="record in category.pictures">\n <div class="image" ng-style="::{\'background-image\': record.src ? (\'url(\'+record.src+\')\') : \'\' }">\n <div class="item no-border item-text-wrap dark padding-left">\n <h1 class="item-text-wrap" ng-class="::{\'col-75\': (record.price && record.type === \'offer\' || record.type=== \'need\') }">\n <span ng-bind-html="::record.title"></span>\n </h1>\n\n <div class="badge badge-balanced badge-price" ng-if="::record.price && (record.type === \'offer\' || record.type === \'crowdfunding\')" ng-class="{\'sold\': !record.stock}">\n <span ng-bind-html="::record.price|formatAmount:record"></span>\n </div>\n <div class="badge badge-energized badge-price" ng-if="::record.type===\'need\'">\n <i class="cion-market-need"></i>\n <span translate>MARKET.TYPE.NEED_SHORT</span>\n </div>\n <span class="badge badge-assertive badge-secondary" ng-if="::!record.stock" translate>\n MARKET.COMMON.SOLD\n </span>\n </div>\n\n <div class="card card-avatar card-description animate-fade-in" ng-class="{\'done in\': record.showDescription}" ng-if="record.description">\n\n <div class="item item-avatar done in">\n <span class="avatar avatar-member" ng-if="::!record.avatar"></span>\n <span class="avatar" ng-if="::record.avatar" style="background-image: url({{::record.avatar.src}})"></span>\n <a class="pull-left" ui-sref="app.user_identity({pubkey:comment.issuer, name: record.name})">\n <span class="positive" ng-if="::record.name">\n {{::record.name}}\n </span>\n <span ng-if="::!record.name" class="gray">\n <i class="icon ion-key gray"></i>\n {{::record.name || (record.issuer|formatPubkey)}}\n </span>\n </a> \n\n <h3 ng-if="::record.city && record.stock">\n <i class="ion-location"></i> {{::options.location.prefix|translate}} {{::record.city}}\n </h3>\n </div>\n\n <div class="card-content">\n <div class="item item-text-wrap done in">\n <i class="ion-quote"></i>\n <span ng-bind-html="::record.description"></span>\n </div>\n </div>\n </div>\n </div>\n\n\n\n </ion-slide>\n </ion-slide-box>\n</ion-modal-view>\n'),e.put("plugins/market/templates/gallery/view_gallery.html",'<ion-view left-buttons="leftButtons" class="market view-record">\n <ion-nav-title>\n <span translate>MARKET.GALLERY.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n \x3c!--<button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit">\n <i class="icon ion-android-create"></i>\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm"\n ng-click="showActionsPopover($event)">\n </button>--\x3e\n </ion-nav-buttons>\n\n <ion-content class="has-header padding no-padding-xs stable-100-bg">\n\n <form ng-submit="start()" class="lookupForm">\n\n <div class="row no-padding responsive-lg">\n \x3c!-- search text --\x3e\n <div class="col no-padding no-margin">\n <div class="item no-padding light-bg">\n <div class="item-input light-bg">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" autocomplete="off" class="visible-xs visible-sm" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 950 }">\n <input type="text" autocomplete="off" class="hidden-xs hidden-sm" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" id="marketSearchText" ng-model="search.text">\n </div>\n </div>\n </div>\n\n \x3c!-- location --\x3e\n <div class="col col-40 no-padding no-margin">\n <ng-include src="::\'plugins/es/templates/common/item_location_search.html\'" ng-controller="ESSearchPositionItemCtrl"></ng-include>\n </div>\n\n </div>\n\n <div class="row no-padding no-margin responsive-lg">\n\n <div class="col no-padding no-margin">\n\n \x3c!-- Ad type --\x3e\n <div class="item item-icon-left item-input item-select stable-bg">\n\n <b class="icon-secondary ion-help gray" style="left:10px; top: -8px;"></b>\n <b class="icon-secondary cion-market-crowdfunding gray" style="left:15px; top: 4px;"></b>\n <b class="icon-secondary cion-market-need gray" style="left:28px; top: -6px;"></b>\n\n <div class="input-label item-icon-left-padding" translate>MARKET.GALLERY.AD_TYPE</div>\n <select ng-model="search.type" ng-options="i as (adTypeLabels[i] | translate ) for i in adTypes track by i">\n </select>\n </div>\n </div>\n\n <div class="col no-padding no-margin">\n\n \x3c!-- slide duration --\x3e\n <div class="item item-icon-left item-input item-select stable-bg">\n <i class="icon ion-ios-timer-outline gray"></i>\n <div class="input-label item-icon-left-padding" translate>MARKET.GALLERY.SLIDE_DURATION</div>\n <select ng-model="options.slideDuration" ng-options="i as (slideDurationLabels[i].labelKey | translate:slideDurationLabels[i].labelParams ) for i in slideDurations track by i">\n </select>\n </div>\n </div>\n </div>\n\n \x3c!-- advanced options --\x3e\n <ng-include src="::\'plugins/market/templates/search/lookup_options.html\'"></ng-include>\n\n <div class="padding-top padding-xs" style="display: block; height: 60px;">\n <div class="hidden-xs hidden-sm pull-left">\n\n <a class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.advanced, \'button-text-stable\': !search.advanced}" ng-click="search.advanced=!search.advanced">\n {{\'MARKET.SEARCH.BTN_OPTIONS\' | translate}}\n <i class="icon" ng-class="{\'ion-arrow-down-b\': !search.advanced, \'ion-arrow-up-b\': search.advanced}"></i>\n </a>\n \n\n </div>\n\n <div class="pull-right">\n\n <button type="submit" class="button button-small button-raised icon icon-left ion-play ink" ng-disabled="search.loading" title="{{!categories.length ? \'MARKET.GALLERY.BTN_START\' : \'MARKET.GALLERY.BTN_CONTINUE\' | translate}}">\n {{!categories.length ? \'MARKET.GALLERY.BTN_START\' : \'MARKET.GALLERY.BTN_CONTINUE\' | translate}}\n </button>\n \n <button type="button" class="button button-small button-raised icon icon-left ion-stop ink" title="{{\'MARKET.GALLERY.BTN_STOP\' | translate}}" ng-if="search.loading || categories.length" ng-click="stop()">\n {{\'MARKET.GALLERY.BTN_STOP\' | translate}}\n </button>\n </div>\n </div>\n </form>\n\n <div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list ng-hide" ng-show="!search.loading">\n <ng-repeat ng-repeat="cat in categories | filter:isLoadedCategory track by cat.id" ng-init="catIndex=$index">\n <div class="item item-divider">\n\n <span ng-bind-html="cat.name"></span> ({{cat.count}})\n </div>\n\n <a class="item item-list-detail">\n <ion-scroll direction="x">\n <img ng-repeat="picture in cat.pictures track by picture.id" ng-src="{{::picture.src}}" title="{{::picture.title}}{{::picture.price ? (\' (\' + (picture.price | formatAmount:picture) +\')\') : \'\' }}" ng-click="openSlideShowModal(catIndex, $index, true)" class="image-list-thumb">\n </ion-scroll>\n </a>\n </ng-repeat>\n </div>\n\n\n\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/help/help.html",'\n <a name="join"></a>\n <h2 translate>HELP.JOIN.SECTION</h2>\n\n <a name="join-salt"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>LOGIN.SALT</div>\n <div class="col" translate>HELP.JOIN.SALT</div>\n </div>\n\n <a name="join-password"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>LOGIN.PASSWORD</div>\n <div class="col" translate>HELP.JOIN.PASSWORD</div>\n </div>\n\n <a name="glossary"></a>\n <h2 translate>HELP.GLOSSARY.SECTION</h2>\n\n <a name="pubkey"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>COMMON.PUBKEY</div>\n <div class="col" translate>HELP.GLOSSARY.PUBKEY_DEF</div>\n </div>\n\n <a name="universal_dividend"></a>\n <div class="row responsive-sm">\n <div class="col col-20 gray" translate>COMMON.UNIVERSAL_DIVIDEND</div>\n <div class="col" translate>HELP.GLOSSARY.UNIVERSAL_DIVIDEND_DEF</div>\n </div>\n\n\n'),e.put("plugins/market/templates/help/modal_help.html",'<ion-view class="modal slide-in-up ng-enter active ng-enter-active">\n\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CLOSE\n </button>\n\n <h1 class="title" translate>HELP.TITLE</h1>\n </ion-header-bar>\n\n <ion-content scroll="true" class="padding">\n\n <ng-include src="\'templates/help/help.html\'"></ng-include>\n\n <div class="padding hidden-xs text-center">\n <button class="button button-positive ink" type="submit" ng-click="closeModal()">\n {{\'COMMON.BTN_CLOSE\' | translate}}\n </button>\n </div>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/help/view_help.html",'<ion-view left-buttons="leftButtons">\n <ion-nav-title>\n <span class="visible-xs visible-sm" translate>HELP.TITLE</span>\n </ion-nav-title>\n\n <ion-content scroll="true" class="padding">\n\n <h1 class="hidden-xs hidden-sm" translate>HELP.TITLE</h1>\n\n <ng-include src="\'templates/help/help.html\'"></ng-include>\n\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/home/home_buttons.html",'\n<h2 ng-if="::$root.config.plugins.market.homeMessage" ng-bind-html="::$root.config.plugins.market.homeMessage"></h2>\n\n<div class="item item-divider text-left no-padding-left">\n <span translate>MARKET.HOME.LOCATION_LABEL</span>\n</div>\n\n<form class="row list no-padding center lookupForm" ng-submit="openSearch()">\n\n \x3c!-- search text --\x3e\n <div class="item no-padding">\n <div class="item-input light-bg">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" id="marketSearchText" autocomplete="off" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 950 }" ng-change="doSearch()" ng-return="openSearch()">\n </div>\n </div>\n\n \x3c!-- location --\x3e\n <ng-include src="::\'plugins/es/templates/common/item_location_search.html\'" ng-if="entered && options.location.show" ng-controller="ESSearchPositionItemCtrl"></ng-include>\n\n <button type="submit" class="button button-block button-raised button-positive ink" ng-disabled="!entered">\n {{\'COMMON.BTN_SEARCH\' | translate}}\n <span ng-if=":total:!search.loading && search.total !== undefined">\n ({{:total:(\'MARKET.SEARCH.RESULT_COUNT\'|translate:{count: search.total}) }})\n </span>\n </button>\n</form>\n\n<br class="hidden-xs hidden-sm">\n<br class="hidden-xs hidden-sm">\n<br>\n\n<button type="button" class="button button-block button-balanced button-raised icon icon-left ion-compose ink-dark" ng-click="showNewRecordModal()" translate>MARKET.HOME.BTN_NEW_AD</button>\n\n\n<br class="hidden-xs">\n'),
|
||
e.put("plugins/market/templates/join/modal_join.html",'<ion-modal-view class="modal-full-height">\n\n <ion-header-bar class="bar-positive">\n\n <button class="button button-clear visible-xs" ng-if="!slides.slider.activeIndex" ng-click="closeModal()" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-icon button-clear icon ion-ios-arrow-back buttons header-item" ng-click="slidePrev()" ng-if="slides.slider.activeIndex">\n </button>\n <button class="button button-icon button-clear icon ion-ios-help-outline visible-xs" ng-if="!isLastSlide" ng-click="showHelpModal()"></button>\n\n <h1 class="title" translate>ACCOUNT.NEW.TITLE</h1>\n\n <button class="button button-clear icon-right visible-xs" ng-if="!isLastSlide" ng-click="doNext()">\n <span translate>COMMON.BTN_NEXT</span>\n <i class="icon ion-ios-arrow-right"></i>\n </button>\n <button class="button button-clear icon-right visible-xs" ng-if="isLastSlide" ng-click="doNewAccount()">\n <i class="icon ion-android-send"></i>\n </button>\n </ion-header-bar>\n\n\n <ion-slides options="slides.options" slider="slides.slider">\n\n \x3c!-- STEP: salt --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n <form name="saltForm" novalidate="" ng-submit="doNext(\'saltForm\')">\n\n <div class="list" ng-init="setForm(saltForm, \'saltForm\')">\n\n <div class="item item-text-wrap text-center padding hidden-xs">\n <a class="pull-right icon-help" ng-click="showHelpModal(\'join-salt\')"></a>\n <span translate>ACCOUNT.NEW.SALT_WARNING</span>\n </div>\n\n \x3c!-- salt --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.username.$invalid}">\n <span class="input-label" translate>LOGIN.SALT</span>\n <input name="username" type="text" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" autocomplete="off" ng-change="formDataChanged()" ng-model="formData.username" ng-minlength="8" required>\n </div>\n <div class="form-errors" ng-show="saltForm.$submitted && saltForm.username.$error" ng-messages="saltForm.username.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- confirm salt --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': saltForm.$submitted && saltForm.confirmSalt.$invalid}">\n <span class="input-label pull-right" translate>ACCOUNT.NEW.SALT_CONFIRM</span>\n <input name="confirmUsername" type="text" autocomplete="off" placeholder="{{\'ACCOUNT.NEW.SALT_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmUsername" compare-to="formData.username">\n </div>\n <div class="form-errors" ng-show="saltForm.$submitted && saltForm.confirmUsername.$error" ng-messages="saltForm.confirmUsername.$error">\n <div class="form-error" ng-message="compareTo">\n <span translate="ERROR.SALT_NOT_CONFIRMED"></span>\n </div>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>\n COMMON.BTN_NEXT\n <i class="icon ion-arrow-right-a"></i>\n </button>\n </div>\n </div>\n </form>\n </ion-content>\n </ion-slide-page>\n\n \x3c!-- STEP: password--\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n <form name="passwordForm" novalidate="" ng-submit="doNext(\'passwordForm\')">\n\n <div class="item item-text-wrap text-center padding hidden-xs">\n <a class="pull-right icon-help" ng-click="showHelpModal(\'join-password\')"></a>\n <span translate>ACCOUNT.NEW.PASSWORD_WARNING</span>\n </div>\n\n <div class="list" ng-init="setForm(passwordForm, \'passwordForm\')">\n\n \x3c!-- password --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.password.$invalid}">\n <span class="input-label" translate>LOGIN.PASSWORD</span>\n <input ng-if="!showPassword" name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-change="formDataChanged()" ng-minlength="8" required>\n <input ng-if="showPassword" name="text" type="text" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" autocomplete="off" ng-model="formData.password" ng-change="formDataChanged()" ng-minlength="8" required>\n </div>\n <div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.password.$error" ng-messages="passwordForm.password.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 8}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- confirm password --\x3e\n <div class="item item-input" ng-class="{ \'item-input-error\': passwordForm.$submitted && passwordForm.confirmPassword.$invalid}">\n <span class="input-label" translate>ACCOUNT.NEW.PASSWORD_CONFIRM</span>\n <input ng-if="!showPassword" name="confirmPassword" type="password" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" compare-to="formData.password">\n <input ng-if="showPassword" name="confirmPassword" type="text" autocomplete="off" placeholder="{{\'ACCOUNT.NEW.PASSWORD_CONFIRM_HELP\' | translate}}" ng-model="formData.confirmPassword" compare-to="formData.password">\n </div>\n <div class="form-errors" ng-show="passwordForm.$submitted && passwordForm.confirmPassword.$error" ng-messages="passwordForm.confirmPassword.$error">\n <div class="form-error" ng-message="compareTo">\n <span translate="ERROR.PASSWORD_NOT_CONFIRMED"></span>\n </div>\n </div>\n\n \x3c!-- Show values --\x3e\n <div class="item item-toggle dark">\n <span translate>COMMON.SHOW_VALUES</span>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="showPassword">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>\n COMMON.BTN_NEXT\n </button>\n </div>\n\n <div class="padding hidden-xs">\n </div>\n </form>\n </ion-content>\n </ion-slide-page>\n\n \x3c!-- STEP 5: profile --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n <form name="profileForm" novalidate="" ng-submit="doNext(\'profileForm\')">\n\n\n <div class="list" ng-init="setForm(profileForm, \'profileForm\')">\n\n <div class="item item-text-wrap text-center padding hidden-xs">\n <span translate>MARKET.JOIN.PROFILE.WARNING</span>\n </div>\n\n \x3c!-- title --\x3e\n <div class="item item-input" ng-class="{\'item-input-error\': profileForm.$submitted && profileForm.title.$invalid}">\n <span class="input-label" translate>MARKET.JOIN.PROFILE.TITLE</span>\n <input name="title" type="text" placeholder="{{\'MARKET.JOIN.PROFILE.TITLE_HELP\' | translate}}" autocomplete="off" ng-model="formData.title" ng-minlength="4" ng-maxlength="100" required>\n </div>\n <div class="form-errors" ng-show="profileForm.$submitted && profileForm.title.$error" ng-messages="profileForm.title.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 3}"></span>\n </div>\n <div class="form-error" ng-message="maxlength">\n <span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 100}"></span>\n </div>\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- description --\x3e\n <ion-item class="item-input">\n <span class="input-label" translate>MARKET.JOIN.PROFILE.DESCRIPTION</span>\n <textarea placeholder="{{\'MARKET.JOIN.PROFILE.DESCRIPTION_HELP\' | translate}}" ng-model="formData.description" ng-model-options="{ debounce: 350 }" rows="4" cols="10">\n </textarea>\n </ion-item>\n\n \x3c!-- email --\x3e\n <div class="item item-input" ng-class="{\'item-input-error\': profileForm.$submitted && profileForm.email.$invalid}">\n <span class="input-label" translate>MARKET.JOIN.SUBSCRIPTION.EMAIL</span>\n <input name="email" type="text" placeholder="{{\'MARKET.JOIN.SUBSCRIPTION.EMAIL_HELP\' | translate}}" ng-model="formData.email" autocomplete="off" ng-pattern="emailPattern" ng-minlength="4" ng-maxlength="100">\n </div>\n <div class="form-errors" ng-show="profileForm.$submitted && profileForm.email.$error" ng-messages="profileForm.email.$error">\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT_WITH_LENGTH" translate-values="{minLength: 3}"></span>\n </div>\n <div class="form-error" ng-message="maxlength">\n <span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 100}"></span>\n </div>\n <div class="form-error" ng-message="pattern">\n <span translate="ERROR.FIELD_NOT_EMAIL"></span>\n </div>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-calm icon-right ion-chevron-right ink" type="submit" translate>\n COMMON.BTN_NEXT\n </button>\n </div>\n </div>\n </form>\n </ion-content>\n </ion-slide-page>\n\n \x3c!--<cs-extension-point name="last-slide"></cs-extension-point>--\x3e\n\n \x3c!-- STEP 6: last slide --\x3e\n <ion-slide-page>\n <ion-content class="has-header" scroll="false">\n\n <div class="padding text-center" translate>MARKET.JOIN.LAST_SLIDE_CONGRATULATION</div>\n\n <div class="list">\n\n <ion-item class="item item-text-wrap item-border">\n <div class="dark pull-right padding-right" ng-if="formData.computing">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n </ion-item>\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" ng-click="doNewAccount()" translate>\n COMMON.BTN_SEND\n <i class="icon ion-android-send"></i>\n </button>\n </div>\n </ion-content>\n </ion-slide-page>\n\n \n</ion-slides></ion-modal-view>\n'),e.put("plugins/market/templates/login/modal_event_login.html",'<ion-modal-view class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL\n </button>\n <h1 class="title" translate>MARKET.EVENT_LOGIN.TITLE</h1>\n <div class="buttons buttons-right">\n <span class="secondary-buttons">\n <button class="button button-positive button-icon button-clear icon ion-android-done visible-xs" ng-click="doLogin()">\n </button>\n </span></div>\n\n </ion-header-bar>\n\n <ion-content>\n <form name="loginForm" novalidate="" ng-submit="doLogin()">\n\n\n <div class="list" ng-init="setForm(loginForm)">\n\n <div class="item item-text-wrap" ng-bind-html="\'MARKET.EVENT_LOGIN.HELP\' | translate">\n </div>\n\n \x3c!-- salt (=username, to enable browser login cache) --\x3e\n <label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.username.$invalid}">\n <span class="input-label hidden-xs" translate>MARKET.EVENT_LOGIN.EMAIL_OR_PHONE</span>\n <input name="username" type="text" placeholder="{{\'MARKET.EVENT_LOGIN.EMAIL_OR_PHONE_HELP\' | translate}}" ng-model="formData.username" ng-model-options="{ debounce: 650 }" class="highlight-light" ng-pattern="usernamePattern" required>\n </label>\n <div class="form-errors" ng-show="form.$submitted && form.username.$error" ng-messages="form.username.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="pattern">\n <span translate="MARKET.EVENT_LOGIN.ERROR.INVALID_USERNAME"></span>\n </div>\n </div>\n\n \x3c!-- password\n <label class="item item-input"\n ng-class="{ \'item-input-error\': form.$submitted && form.password.$invalid}">\n <span class="input-label hidden-xs" translate>LOGIN.PASSWORD</span>\n <input name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}"\n ng-model="formData.password"\n ng-model-options="{ debounce: 650 }"\n select-on-click\n required>\n </label>\n <div class="form-errors"\n ng-show="form.$submitted && form.password.$error"\n ng-messages="form.password.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>--\x3e\n\n\n \x3c!-- remember me --\x3e\n <ion-checkbox ng-model="formData.rememberMe" class="item item-border-large ink">\n <div class="item-content" translate>MARKET.EVENT_LOGIN.REMEMBER_ME</div>\n </ion-checkbox>\n\n \x3c!-- Show public key\n <div class="item item-button-right left">\n <span ng-if="formData.username && formData.password"\n class="input-label" translate>COMMON.PUBKEY</span>\n <a class="button button-light button-small ink animate-if"\n ng-click="showPubkey()"\n ng-if="showPubkeyButton"\n >\n {{\'COMMON.BTN_SHOW_PUBKEY\' | translate}}\n </a>\n <h3 class="gray text-no-wrap" ng-if="!computing">\n {{pubkey}}\n </h3>\n <h3 ng-if="computing">\n <ion-spinner icon="android"></ion-spinner>\n </h3>\n </div>--\x3e\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" type="submit">\n {{\'COMMON.BTN_LOGIN\' | translate}}\n </button>\n </div>\n\n \x3c!-- Register ?\n <div class="text-center no-padding">\n {{\'LOGIN.NO_ACCOUNT_QUESTION\'|translate}}\n <br class="visible-xs">\n <a ng-click="showJoinModal()" translate>\n LOGIN.CREATE_ACCOUNT\n </a>\n </div>\n\n <div class="text-center no-padding">\n <a ng-click="showAccountSecurityModal()" translate>\n LOGIN.FORGOTTEN_ID\n </a>\n </div>--\x3e\n\n \x3c!--div class="padding hidden-xs text-right">\n <a class="assertive ink" ng-click="openNewAccount()" type="button" translate>COMMON.NO_ACOUNT_QUESTION\n </a>\n </div--\x3e\n </form>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/market/templates/login/modal_login.html",'<ion-modal-view class="modal-full-height modal-login">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL\n </button>\n <h1 class="title" ng-bind-html="\'LOGIN.TITLE\' | translate">\n </h1>\n <div class="buttons buttons-right">\n <span class="secondary-buttons visible-xs">\n <button class="button button-positive button-icon button-clear icon ion-android-done" style="color: #fff;" ng-click="doLogin()">\n </button>\n </span></div>\n\n </ion-header-bar>\n\n <ion-content>\n <form name="loginForm" novalidate="" ng-submit="doLogin()">\n\n\n <div class="list" ng-init="setForm(loginForm)">\n\n <div class="item item-text-wrap" ng-bind-html="\'MARKET.LOGIN.HELP\' | translate">\n </div>\n\n \x3c!-- salt (=username, to enable browser login cache) --\x3e\n <label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.username.$invalid}">\n <span class="input-label hidden-xs" translate>LOGIN.SALT</span>\n <input name="username" type="text" placeholder="{{\'LOGIN.SALT_HELP\' | translate}}" ng-model="formData.username" autocomplete="off" ng-model-options="{ debounce: 650 }" class="highlight-light" required>\n </label>\n <div class="form-errors" ng-show="form.$submitted && form.username.$error" ng-messages="form.username.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n \x3c!-- password --\x3e\n <label class="item item-input" ng-class="{ \'item-input-error\': form.$submitted && form.password.$invalid}">\n <span class="input-label hidden-xs" translate>LOGIN.PASSWORD</span>\n <input name="password" type="password" placeholder="{{\'LOGIN.PASSWORD_HELP\' | translate}}" ng-model="formData.password" ng-model-options="{ debounce: 650 }" select-on-click required>\n </label>\n <div class="form-errors" ng-show="form.$submitted && form.password.$error" ng-messages="form.password.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n </div>\n\n\n \x3c!-- remember me --\x3e\n <ion-checkbox ng-model="formData.rememberMe" class="item item-border-large ink">\n <div class="item-content" translate>MARKET.LOGIN.REMEMBER_ME</div>\n </ion-checkbox>\n\n \x3c!-- Show public key\n <div class="item item-button-right left">\n <span ng-if="formData.username && formData.password"\n class="input-label" translate>COMMON.PUBKEY</span>\n <a class="button button-light button-small ink animate-if"\n ng-click="showPubkey()"\n ng-if="showPubkeyButton"\n >\n {{\'COMMON.BTN_SHOW_PUBKEY\' | translate}}\n </a>\n <h3 class="gray text-no-wrap" ng-if="!computing">\n {{pubkey}}\n </h3>\n <h3 ng-if="computing">\n <ion-spinner icon="android"></ion-spinner>\n </h3>\n </div>--\x3e\n\n </div>\n\n <div class="padding hidden-xs text-right">\n <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive ink" type="submit">\n {{\'COMMON.BTN_LOGIN\' | translate}}\n </button>\n </div>\n\n \x3c!-- Register ? --\x3e\n <div class="text-center no-padding">\n {{\'LOGIN.NO_ACCOUNT_QUESTION\'|translate}}\n <br class="visible-xs">\n <a ng-click="showJoinModal()" translate>\n LOGIN.CREATE_ACCOUNT\n </a>\n </div>\n\n \x3c!--<div class="text-center no-padding">\n <a ng-click="showAccountSecurityModal()" translate>\n LOGIN.FORGOTTEN_ID\n </a>\n </div>--\x3e\n </form>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/market/templates/map/map_country.html",'\n<div class="map-container">\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <svg-map ng-if="!loading" src="{{\'img/maps/\' + selectedCountry + \'.svg\'}}" init="initProps" props="props" events="bindingEvents" on-event="handleEvent($event)">\n </svg-map>\n\n <br>\n\n <p>\n <a ng-click="convert()" target="_blank">Convert !</a>\n <a href="" id="demolink" target="_blank">View on a map, as GeoJSON</a>\n </p>\n\n <p>\n <a ng-repeat="country in countries" ng-class="{\'bold\': country === selectedCountry}" ng-click="onChangeCountry(country)">\n <span ng-if="$index"> | </span>\n {{countriesMap[country]}}\n </a>\n </p>\n</div>\n'),e.put("plugins/market/templates/menu_extend.html",'\n\x3c!-- Toolbar section --\x3e\n<div ng-if="::extensionPoint === \'nav-buttons-right\'" class="hidden-xs hidden-sm">\n\n \x3c!-- favorites\n TODO update counter when changes\n <button class="button button-clear icon ion-heart"\n ng-if="login && walletData.favorites.count"\n ui-sref="app.market_favorites">\n <span\n ng-if="walletData.favorites.count"\n class="badge badge-button badge-positive">{{walletData.favorites.count}}</span>\n </button> --\x3e\n</div>\n\n\x3c!-- Menu: main section --\x3e\n<ng-if ng-if="::extensionPoint === \'menu-main\'">\n\n \x3c!-- view market --\x3e\n <ion-item menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/market" ui-sref="app.market_lookup">\n <i class="icon ion-speakerphone"></i>\n <span translate>MENU.MARKET</span>\n </ion-item>\n\n \x3c!-- view pages --\x3e\n <ion-item menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/page" ui-sref="app.registry_lookup">\n <i class="icon ion-social-buffer"></i>\n <span translate>MENU.REGISTRY</span>\n </ion-item>\n</ng-if>\n\n\x3c!-- Menu: user section --\x3e\n<ng-if ng-if="::extensionPoint === \'menu-user\'">\n \x3c!-- wallet records --\x3e\n <a menu-close class="item item-icon-left" active-link="active" active-link-path-prefix="#/app/records/wallet" ng-click="loginAndGo(\'app.market_wallet_records\')" ng-class="{\'item-menu-disable\': !login}">\n <i class="icon ion-person" style="font-size: 19px; left: 13px;"></i>\n <i class="icon-secondary ion-speakerphone" style="font-size: 16px; left: 32px; top: -6px;"></i>\n <span translate>MENU.MY_RECORDS</span>\n </a>\n\n \x3c!-- wallet records --\x3e\n <a menu-close class="item item-border item-icon-left" active-link="active" active-link-path-prefix="#/app/favorites" ng-click="loginAndGo(\'app.market_favorites\')" ng-class="{\'item-menu-disable\': !login}">\n <i class="icon ion-heart" style="font-size: 16px; left: 13px;"></i>\n <i class="icon-secondary ion-speakerphone" style="font-size: 16px; left: 32px; top: -6px;"></i>\n <span translate>MENU.FAVORITES</span>\n </a>\n</ng-if>\n\n<ng-if ng-if="::extensionPoint === \'menu-discover\'">\n \x3c!-- view market gallery --\x3e\n <ion-item menu-close class="item item-icon-left" ng-if="$root.settings.expertMode" active-link="active" active-link-path-prefix="#/app/gallery/market" ui-sref="app.market_gallery">\n <i class="icon ion-images"></i>\n <span translate>MARKET.GALLERY.TITLE</span>\n </ion-item>\n\n</ng-if>\n\n'),e.put("plugins/market/templates/record/edit_record.html",'<ion-view left-buttons="leftButtons" id="editMarket">\n <ion-nav-title>\n <span class="visible-xs" ng-if="id" ng-bind-html="formData.title"></span>\n <span class="visible-xs" ng-if="!id && formData.type">{{\'MARKET.EDIT.\' + formData.type + \'.TITLE_NEW\'|upper|translate}}</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-clear button-icon icon visible-xs visible-sm" ng-class="{\'ion-android-send\':!id, \'ion-android-done\': id}" ng-click="save()">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true">\n\n <div class="row no-padding">\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n <div class="col">\n\n <form name="recordForm" novalidate="" ng-submit="save()">\n <div class="list {{::motion.ionListClass}}" ng-init="setForm(recordForm)">\n\n <div class="item hidden-xs item-text-wrap">\n <h1 ng-if="id" ng-bind-html="formData.title"></h1>\n <h1 ng-if="!id && formData.type">{{\'MARKET.EDIT.\' + formData.type + \'.TITLE_NEW\'|upper|translate}}</h1>\n\n </div>\n <div class="item" ng-if="id||options.type.show">\n <h4 class="gray" ng-if="id">\n <i class="icon ion-calendar"></i>\n {{::\'COMMON.LAST_MODIFICATION_DATE\'|translate}} {{formData.time | formatDate}}\n </h4>\n <div class="badge badge-balanced" ng-if="options.type.show" ng-class="{\'badge-editable\': options.type.canEdit}" ng-click="options.type.canEdit ? showRecordTypeModal() : \'\'">\n <span>{{\'MARKET.TYPE.\'+formData.type|upper|translate}}</span>\n </div>\n </div>\n\n \x3c!-- pictures --\x3e\n <ng-include src="::\'plugins/es/templates/common/edit_pictures.html\'"></ng-include>\n\n \x3c!-- form content --\x3e\n <ng-include ng-if="formData.type" src="::\'plugins/market/templates/record/form_record_\'+formData.type+\'.html\'"></ng-include>\n\n \x3c!-- buttons --\x3e\n <div class="item padding hidden-xs hidden-sm text-right">\n <button class="button button-clear button-dark ink" ng-click="cancel()" type="button" translate>\n COMMON.BTN_CANCEL\n </button>\n <button class="button button-positive button-raised ink" type="submit" ng-if="!id" translate>\n COMMON.BTN_PUBLISH\n </button>\n <button class="button button-assertive button-raised ink" type="submit" ng-if="id" translate>\n COMMON.BTN_SAVE\n </button>\n </div>\n </div>\n </form>\n </div>\n\n <div class="col col-20 hidden-xs hidden-sm"> </div>\n\n </div>\n \n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/record/form_record_auction.html",'\n\x3c!-- category --\x3e\n<a class="item item-icon-right ink item-border" ng-if="options.category.show" ng-class="{\'item-input-error\': form.$submitted && !formData.category.id}" ng-click="showCategoryModal()">\n <span class="item-label" translate>COMMON.CATEGORY</span>\n <span ng-if="!formData.category.id" class="item-note">{{::\'COMMON.CATEGORY_SELECT_HELP\'|translate}}</span>\n <span class="badge badge-royal" ng-bind-html="formData.category.name"></span> \n <i class="gray icon ion-ios-arrow-right"></i>\n</a>\n<div class="form-errors" ng-show="form.$submitted && !formData.category.id">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n</div>\n\n\x3c!-- title --\x3e\n<div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>MARKET.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'MARKET.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="market-record-title" ng-model="formData.title" ng-minlength="3" required>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.title.$invalid" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n</div>\n\n<div class="item item-input item-floating-label" ng-if="options.description.show">\n <span class="input-label" translate>MARKET.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'MARKET.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10"></textarea>\n</div>\n\n\x3c!-- price --\x3e\n<ion-item class="item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.price.$invalid}">\n\n <div class="input-label">\n <span translate>MARKET.EDIT.RECORD_PRICE</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="price" placeholder="{{::\'MARKET.EDIT.AUCTION.START_PRICE_HELP\' | translate}}" ng-model="formData.price" number-float>\n <a class="button button-clear button-stable dark ink" tabindex="-1" style="z-index:110; padding: 0 16px;" ng-if="options.unit.canEdit" ng-click="showUnitPopover($event)">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n <b class="ion-arrow-down-b" style="font-size: 12pt;"></b>\n </a>\n</ion-item>\n<div class="form-errors" ng-show="form.$submitted && form.price.$invalid" ng-messages="form.price.$error">\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\x3c!-- fees --\x3e\n<div class="item item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.fees.$invalid}">\n <div class="input-label">\n <span translate>MARKET.EDIT.RECORD_FEES</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="fees" placeholder="{{::\'MARKET.EDIT.RECORD_FEES_HELP\' | translate}}" ng-model="formData.fees" number-float>\n <div class="button button-clear button-stable dark ink" tabindex="-1" style="z-index:110; padding: 0 16px;" ng-if="options.unit.canEdit">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n </div>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.fees.$invalid" ng-messages="form.fees.$error">\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\x3c!-- position --\x3e\n<ng-include src="\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl"></ng-include>\n'),e.put("plugins/market/templates/record/form_record_crowdfunding.html",'\n\x3c!-- category --\x3e\n<a class="item item-icon-right ink item-border" ng-if="options.category.show" ng-class="{\'item-input-error\': form.$submitted && !formData.category.id}" ng-click="showCategoryModal()">\n <span class="item-label" translate>COMMON.CATEGORY</span>\n <span ng-if="!formData.category.id" class="item-note">{{::\'COMMON.CATEGORY_SELECT_HELP\'|translate}}</span>\n <span class="badge badge-royal" ng-bind-html="formData.category.name"></span> \n <i class="gray icon ion-ios-arrow-right"></i>\n</a>\n<div class="form-errors" ng-show="form.$submitted && !formData.category.id">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n</div>\n\n\x3c!-- title --\x3e\n<div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>MARKET.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'MARKET.EDIT.CROWDFUNDING.TITLE_HELP\'|translate}}" name="title" id="market-record-title" ng-model="formData.title" ng-minlength="3" ng-maxlength="50" required>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.title.$invalid" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n <div class="form-error" ng-message="maxlength">\n <span translate="ERROR.FIELD_TOO_LONG_WITH_LENGTH" translate-values="{maxLength: 50}"></span>\n </div>\n</div>\n\n<div class="item item-input item-floating-label" ng-if="options.description.show">\n <span class="input-label" translate>MARKET.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'MARKET.EDIT.CROWDFUNDING.DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10"></textarea>\n</div>\n\n\x3c!-- price --\x3e\n<ion-item class="item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.price.$invalid}">\n\n <div class="input-label">\n <span translate>MARKET.EDIT.RECORD_PRICE</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="price" placeholder="{{::\'MARKET.EDIT.CROWDFUNDING.PRICE_HELP\' | translate}}" ng-model="formData.price" number-float required>\n <a class="button button-clear button-stable dark ink" tabindex="-1" style="z-index:110; padding: 0 16px;" ng-if="options.unit.canEdit" ng-click="showUnitPopover($event)">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n <b class="ion-arrow-down-b" style="font-size: 12pt;"></b>\n </a>\n</ion-item>\n<div class="form-errors" ng-show="form.$submitted && form.price.$invalid" ng-messages="form.price.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\x3c!-- pubkey --\x3e\n<div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.pubkey.$invalid}">\n <span class="input-label" translate>REGISTRY.EDIT.RECORD_PUBKEY</span>\n <input type="text" name="pubkey" placeholder="{{\'REGISTRY.EDIT.RECORD_PUBKEY_HELP\'|translate}}" ng-model="formData.pubkey" autocomplete="off" ng-pattern="pubkeyPattern" ng-model-options="{ debounce: 250 }" required>\n</div>\n<div class="form-errors" ng-show="form.pubkey.$error" ng-messages="form.pubkey.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="pattern">\n <span translate="ERROR.INVALID_PUBKEY"></span>\n </div>\n</div>\n\n\x3c!-- position --\x3e\n<ng-include src="\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl"></ng-include>\n'),e.put("plugins/market/templates/record/form_record_need.html",'\n\x3c!-- category --\x3e\n<a class="item item-icon-right ink item-border" ng-if="options.category.show" ng-class="{\'item-input-error\': form.$submitted && !formData.category.id}" ng-click="showCategoryModal()">\n <span class="item-label" translate>COMMON.CATEGORY</span>\n <span ng-if="!formData.category.id" class="item-note">{{::\'COMMON.CATEGORY_SELECT_HELP\'|translate}}</span>\n <span class="badge badge-royal" ng-bind-html="formData.category.name"></span> \n <i class="gray icon ion-ios-arrow-right"></i>\n</a>\n<div class="form-errors" ng-show="form.$submitted && !formData.category.id">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n</div>\n\n\x3c!-- title --\x3e\n<div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>MARKET.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'MARKET.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="market-record-title" ng-model="formData.title" ng-minlength="3" required>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.title.$invalid" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n</div>\n\n<div class="item item-input item-floating-label" ng-if="options.description.show">\n <span class="input-label" translate>MARKET.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'MARKET.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10"></textarea>\n</div>\n\n\x3c!-- max price--\x3e\n<ion-item class="item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.price.$invalid}">\n\n <div class="input-label">\n <span translate>MARKET.EDIT.RECORD_PRICE</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="price" placeholder="{{::\'MARKET.EDIT.NEED.MAX_PRICE_HELP\' | translate}}" ng-model="formData.price" number-float>\n <a class="button button-clear button-stable dark ink" tabindex="-1" style="z-index:110; padding: 0 16px;" ng-if="options.unit.canEdit" ng-click="showUnitPopover($event)">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n <b class="ion-arrow-down-b" style="font-size: 12pt;"></b>\n </a>\n</ion-item>\n<div class="form-errors" ng-show="form.$submitted && form.price.$invalid" ng-messages="form.price.$error">\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\n\x3c!-- position --\x3e\n<ng-include src="\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl"></ng-include>\n\n\n\n'),e.put("plugins/market/templates/record/form_record_offer.html",'\n\x3c!-- category --\x3e\n<a class="item item-icon-right ink item-border" ng-if="options.category.show" ng-class="{\'item-input-error\': form.$submitted && !formData.category.id}" ng-click="showCategoryModal()">\n <span class="item-label" translate>COMMON.CATEGORY</span>\n <span ng-if="!formData.category.id" class="item-note">{{::\'COMMON.CATEGORY_SELECT_HELP\'|translate}}</span>\n <span class="badge badge-royal" ng-bind-html="formData.category.name"></span> \n <i class="gray icon ion-ios-arrow-right"></i>\n</a>\n<div class="form-errors" ng-show="form.$submitted && !formData.category.id">\n <div class="form-error">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n</div>\n\n\x3c!-- title --\x3e\n<div class="item item-input item-floating-label" ng-class="{\'item-input-error\': form.$submitted && form.title.$invalid}">\n <span class="input-label" translate>MARKET.EDIT.RECORD_TITLE</span>\n <input type="text" placeholder="{{\'MARKET.EDIT.RECORD_TITLE_HELP\'|translate}}" name="title" id="market-record-title" ng-model="formData.title" ng-minlength="3" required>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.title.$invalid" ng-messages="form.title.$error">\n <div class="form-error" ng-message="required">\n <span translate="ERROR.FIELD_REQUIRED"></span>\n </div>\n <div class="form-error" ng-message="minlength">\n <span translate="ERROR.FIELD_TOO_SHORT"></span>\n </div>\n</div>\n\n<div class="item item-input item-floating-label" ng-if="options.description.show">\n <span class="input-label" translate>MARKET.EDIT.RECORD_DESCRIPTION</span>\n <textarea placeholder="{{\'MARKET.EDIT.RECORD_DESCRIPTION_HELP\'|translate}}" ng-model="formData.description" rows="8" cols="10"></textarea>\n</div>\n\n\n\x3c!-- price --\x3e\n<ion-item class="row responsive-sm no-padding">\n\n <div class="col item-button-right padding-left no-margin item-input item-floating-label">\n <div class="input-label" ng-class="{\'gray\': formData.freePrice}">\n <span translate>MARKET.EDIT.RECORD_PRICE</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="price" placeholder="{{::\'MARKET.EDIT.RECORD_PRICE_HELP\' | translate}}" ng-model="formData.price" ng-disabled="formData.freePrice" number-float>\n <a class="button button-clear button-stable button-small-padding dark ink" tabindex="-1" style="z-index:110; padding: 0 16px;" ng-if="options.unit.canEdit" ng-disabled="formData.freePrice" ng-click="showUnitPopover($event)">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n <b class="ion-arrow-down-b" style="font-size: 12pt;"></b>\n </a>\n </div>\n\n <div class="col col-20 item-input item-text-wrap padding-top" style="min-width: 160px;">\n <ion-checkbox ng-model="formData.freePrice" ng-change="onFreePriceChanged()" class="done in">\n <div class="item-content" translate>\n MARKET.EDIT.FREE_PRICE\n </div>\n </ion-checkbox>\n </div>\n\n</ion-item>\n<div class="form-errors" ng-show="form.$submitted && form.price.$invalid" ng-messages="form.price.$error">\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\n\x3c!-- fees --\x3e\n<div class="item item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.fees.$invalid}">\n <div class="input-label">\n <span translate>MARKET.EDIT.RECORD_FEES</span>\n (<span ng-bind-html="formData.currency| currencySymbol:formData.useRelative"></span>)\n </div>\n\n <input type="number" autocomplete="off" name="fees" placeholder="{{::\'MARKET.EDIT.RECORD_FEES_HELP\' | translate}}" ng-model="formData.fees" number-float>\n <a class="button button-clear button-stable button-small-padding dark ink" tabindex="-1" style="z-index:110; padding: 0 16px;" ng-if="options.unit.canEdit" ng-click="formData.freePrice && showUnitPopover($event)">\n <span ng-bind-html="$root.currency.name | currencySymbol:formData.useRelative">\n </span>\n <b class="ion-arrow-down-b" style="font-size: 12pt;" ng-if="formData.freePrice"></b>\n </a>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.fees.$invalid" ng-messages="form.fees.$error">\n <div class="form-error" ng-message="numberFloat">\n <span translate="ERROR.FIELD_NOT_NUMBER"></span>\n </div>\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\x3c!-- stock --\x3e\n<div class="item item-input item-floating-label item-button-right" ng-class="{\'item-input-error\': form.$submitted && form.stock.$invalid}">\n <div class="input-label">{{::\'MARKET.EDIT.RECORD_STOCK\' | translate}}</div>\n\n <input type="number" name="stock" placeholder="{{::\'MARKET.EDIT.RECORD_STOCK_HELP\' | translate}}" ng-model="formData.stock" number-int>\n</div>\n<div class="form-errors" ng-show="form.$submitted && form.stock.$invalid" ng-messages="form.stock.$error">\n <div class="form-error" ng-message="numberInt">\n <span translate="ERROR.FIELD_NOT_INT"></span>\n </div>\n</div>\n\n\x3c!-- position --\x3e\n<ng-include src="\'plugins/es/templates/common/edit_position.html\'" ng-controller="ESPositionEditCtrl"></ng-include>\n'),e.put("plugins/market/templates/record/modal_payment.html",'<ion-modal-view id="transfer" class="modal-full-height">\n <ion-header-bar class="bar-positive">\n <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>MARKET.PAYMENT.MODAL.TITLE</h1>\n\n </ion-header-bar>\n\n <ion-content scroll="true">\n <div class="padding item-no-border">\n <p ng-if="formData.comment" trust-as-html="\'MARKET.VIEW.PAYMENT_WITH_COMMENT\'|translate: formData"></p>\n <p ng-if="!formData.comment" trust-as-html="\'MARKET.VIEW.PAYMENT\'|translate: formData"></p>\n\n <p trust-as-html="\'MARKET.PAYMENT.MODAL.SOFTWARE_HELP\'|translate: formData"></p>\n </div>\n\n <div class="list">\n\n <span class="item item-divider" translate>\n MARKET.PAYMENT.MODAL.PAYMENT_LINK_HELP\n </span>\n\n <ion-item class="item-button-right item-text-wrap" ng-repeat="uri in formData.uris">\n <p>\n <a ng-click="openLink($event, uri)" class="positive">{{uri}}</a>\n </p>\n <a class="button button-clear button-positive ink" title="{{\'COMMON.BTN_COPY\'|translate}}" copy-on-click="{{::uri}}">\n <i class="icon ion-ios-copy-outline"></i>\n </a>\n </ion-item>\n\n \x3c!--<ng-include src="::\'templates/common/qrcode.html\'"></ng-include>\n <br/>--\x3e\n\n <div class="padding hidden-xs text-center" style="width: 100%;">\n <button class="button button-positive ink" ng-click="closeModal()" type="button">\n {{\'COMMON.BTN_CLOSE\' | translate}}\n </button>\n </div>\n </div>\n\n\n\n\n </ion-content>\n\n\n</ion-modal-view>\n'),e.put("plugins/market/templates/record/modal_record_type.html",'<ion-modal-view>\n <ion-header-bar class="bar-positive">\n <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>\n <h1 class="title" translate>MARKET.TYPE.TITLE</h1>\n </ion-header-bar>\n\n <ion-content class="lookupForm">\n <div class="list padding">\n <h3 translate>MARKET.TYPE.SELECT_TYPE</h3>\n <button class="button button-block button-stable icon icon-left cion-market-offer" ng-click="closeModal(\'offer\')" translate>MARKET.TYPE.OFFER</button>\n\n \x3c!--TODO\n <button class="button button-block button-stable icon icon-left cion-market-auction"\n ng-click="closeModal(\'auction\')"\n translate>MARKET.TYPE.AUCTION</button>--\x3e\n\n <br>\n <span class="item item-divider">\n </span>\n\n <button class="button button-block button-stable icon icon-left cion-market-need" ng-click="closeModal(\'need\')" translate>MARKET.TYPE.NEED</button>\n <button class="button button-block button-stable icon icon-left cion-market-crowdfunding" ng-click="closeModal(\'crowdfunding\')" translate>MARKET.TYPE.CROWDFUNDING</button>\n </div>\n </ion-content>\n</ion-modal-view>\n'),e.put("plugins/market/templates/record/popover_unit.html",'<ion-popover-view class="popover-unit">\n <ion-content scroll="false">\n <div class="list">\n <a class="item item-icon-left" ng-class="{ \'selected\': !useRelative}" ng-click="setUseRelative(false)">\n <i class="icon" ng-class="{ \'ion-ios-checkmark-empty\': !useRelative}"></i>\n <i ng-bind-html="formData.currency | currencySymbol:false"></i>\n </a>\n <a class="item item-icon-left" ng-class="{ \'selected\': $parent.useRelative}" ng-click="setUseRelative(true)">\n <i class="icon" ng-class="{ \'ion-ios-checkmark-empty\': useRelative}"></i>\n <i ng-bind-html="formData.currency | currencySymbol:true"></i>\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/market/templates/record/view_popover_actions.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>MARKET.VIEW.MENU_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-click="showSharePopover($event)">\n <i class="icon ion-android-share-alt"></i>\n {{\'COMMON.BTN_SHARE\' | translate}}\n </a>\n\n \x3c!--<a class="item item-icon-left assertive ink "\n ng-if="canEdit"\n ng-click="delete()">\n <i class="icon ion-trash-a"></i>\n {{\'COMMON.BTN_DELETE\' | translate}}\n </a>--\x3e\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-if="canSold" ng-click="sold()">\n <i class="icon ion-minus-circled"></i>\n {{\'MARKET.VIEW.BTN_SOLD_AD\' | translate}}\n </a>\n\n <a class="item item-icon-left ink visible-xs visible-sm" ng-if="canReopen" ng-click="reopen()">\n <i class="icon ion-unlocked"></i>\n {{\'MARKET.VIEW.BTN_REOPEN\' | translate}}\n </a>\n\n \x3c!-- Write to vendor --\x3e\n <a class="item item-icon-left ink visible-xs visible-sm" ng-if="!canEdit" ng-click="showNewMessageModal()">\n <i class="icon ion-compose"></i>\n {{\'MARKET.VIEW.BTN_WRITE\'|translate}}\n </a>\n\n \x3c!-- Follow --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit" ng-click="hideActionsPopover() && toggleLike($event, {kind: \'follow\'})">\n <i class="icon" ng-class="{\'ion-android-notifications-off\': likeData.follows.wasHit, \'ion-android-notifications\': !likeData.follows.wasHit}"></i>\n <b class="ion-plus icon-secondary" ng-if="!likeData.follows.wasHit" style="font-size: 16px; left: 38px; top: -7px;"></b>\n {{(!likeData.follows.wasHit ? \'MARKET.VIEW.BTN_FOLLOW\' : \'MARKET.VIEW.BTN_STOP_FOLLOW\' )| translate}}\n </a>\n\n \x3c!-- report abuse --\x3e\n <a class="item item-icon-left ink" ng-if="!canEdit && !likeData.abuses.wasHit" ng-click="hideActionsPopover() && reportAbuse($event)">\n <i class="icon ion-android-warning"></i>\n\x3c!-- <b class="ion-plus icon-secondary" style="font-size: 16px; left: 38px; top: -7px;"></b>--\x3e\n {{\'COMMON.BTN_REPORT_ABUSE_DOTS\' | translate}}\n </a>\n <a class="item item-icon-left ink" ng-if="!canEdit && likeData.abuses.wasHit" ng-click="hideActionsPopover() && toggleLike($event, {kind: \'abuse\'})">\n <i class="icon ion-android-warning"></i>\n <b class="ion-close icon-secondary" style="font-size: 16px; left: 38px; top: -7px;"></b>\n {{\'COMMON.BTN_REMOVE_REPORTED_ABUSE\' | translate}}\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/market/templates/record/view_record.html",'<ion-view left-buttons="leftButtons" class="market view-record">\n <ion-nav-title>\n <span translate>MARKET.VIEW.TITLE</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-bar button-icon button-clear visible-xs visible-sm" ng-click="edit()" ng-if="canEdit">\n <i class="icon ion-android-create"></i>\n </button>\n <button class="button button-bar button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showActionsPopover($event)">\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true" class="refresher-top-bg">\n\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()">\n </ion-refresher>\n\n <div class="row no-padding">\n <div class="col col-15 hidden-xs hidden-sm hidden-md"> </div>\n\n <div class="col col-main no-padding">\n\n <div class="center padding" ng-if="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n\n <div class="list {{::motion.ionListClass}} item-text-wrap no-padding-xs">\n\n \x3c!-- desktop : title and location --\x3e\n <div class="item item-text-wrap hidden-xs hidden-sm" ng-if="!smallscreen">\n\n \x3c!-- title --\x3e\n <h1 ng-bind-html="formData.title"></h1>\n\n \x3c!-- location and category--\x3e\n <h2 class="gray">\n <a class="positive" ng-if="formData.city" ui-sref="app.market_lookup({location:formData.city, lat: formData.geoPoint && formData.geoPoint.lat, lon:formData.geoPoint && formData.geoPoint.lon})">\n <i class="icon ion-location"></i>\n {{::options.location.prefix|translate}}<span ng-bind-html="::formData.city"></span>\n </a>\n <span ng-if="formData.city && formData.category.name"> | </span>\n <a ng-if="formData.category.name" ui-sref="app.market_lookup({category: (formData.category.id + \':\' + formData.category.name)})">\n <i class="icon ion-flag"></i>\n <span ng-bind-html="::formData.category.name"></span>\n </a>\n </h2>\n <h4>\n <i class="icon ion-clock"></i>\n <span translate>COMMON.SUBMIT_BY</span>\n <a ui-sref="app.user_identity({pubkey: issuer.issuer, name: issuer.name})">\n <span ng-if="issuer.name" class="positive">\n <i class="icon ion-person"></i>\n {{::issuer.name}}\n </span>\n <span ng-if="!issuer.name" class="gray">\n <i class="icon ion-key"></i>\n {{::issuer.issuer|formatPubkey}}\n </span>\n </a>\n <span>\n {{formData.creationTime|formatFromNow}}\n <span class="gray hidden-xs">|\n {{formData.creationTime | formatDate}}\n </span>\n </span>\n </h4>\n <h4 class="dark" ng-if="formData.time - formData.creationTime > 86400">\n <i class="icon ion-edit"></i>\n <span translate>MARKET.COMMON.LAST_UPDATE</span>\n <span>{{::formData.time | formatDate}}</span>\n </h4>\n \x3c!-- likes --\x3e\n <h4>\n <ng-include src="::\'plugins/es/templates/common/view_likes.html\'"></ng-include>\n </h4>\n <div class="badge badge-shadow" ng-if="::options.type.show" ng-class="{\'badge-calm\': formData.type===\'offer\'||formData.type===\'auction\', \'badge-energized\': formData.type===\'need\'||formData.type===\'crowdfunding\'}">\n <i class="cion-market-{{::formData.type}}"></i>\n <span>{{\'MARKET.TYPE.\'+formData.type|upper|translate}}</span>\n </div>\n </div>\n\n \x3c!-- mobile: title and location --\x3e\n <div class="item item-text-wrap" ng-if="smallscreen">\n\n \x3c!-- title --\x3e\n <h1 ng-bind-html="formData.title"></h1>\n\n\n <h2 class="gray">\n <a class="positive" ng-if="formData.city" ui-sref="app.market_lookup({location:formData.location})">\n <i class="icon ion-location"></i>\n {{::options.location.prefix|translate}}<span ng-bind-html="::formData.city"></span>\n </a>\n <br>\n <a ng-if="formData.category.name" ui-sref="app.market_lookup({category:formData.category.id})">\n <i class="icon ion-flag"></i>\n <span ng-bind-html="::formData.category.name"></span>\n </a>\n\n </h2>\n <h4>\n <i class="icon ion-clock"></i>\n <span translate>COMMON.SUBMIT_BY</span>\n <a ui-sref="app.user_identity({pubkey: issuer.issuer, name: issuer.name})">\n <span class="positive" ng-if="issuer.name">\n <i class="icon ion-person"></i>\n {{::issuer.name}}\n </span>\n <span class="gray" ng-if="!issuer.name">\n <i class="icon ion-key"></i>\n {{::issuer.issuer|formatPubkey}}\n </span>\n </a>\n <span>\n {{formData.time|formatFromNow}}\n <span class="gray hidden-xs">|\n {{formData.time | formatDate}}\n </span>\n </span>\n </h4>\n\n \x3c!-- likes --\x3e\n <h4>\n <ng-include src="\'plugins/es/templates/common/view_likes.html\'"></ng-include>\n </h4>\n\n \x3c!-- fab button--\x3e\n <div class="visible-xs visible-sm">\n\n \x3c!-- like --\x3e\n <button id="fab-like-market-record-{{id}}" class="button button-fab button-fab-top-right button-stable mini spin" ng-click="toggleLike($event)">\n <i class="icon ion-heart" ng-class="{\'gray\': !likeData.likes.wasHit, \'calm\': likeData.likes.wasHit}"></i>\n </button>\n\n </div>\n </div>\n\n\n \x3c!-- mobile: price --\x3e\n <div class="item visible-xs no-padding-top no-padding-bottom">\n\n <div class="badge badge-price badge-shadow" ng-if="options.type.show && !loading" ng-class="::{\'badge-calm\': formData.type===\'offer\'||formData.type===\'auction\', \'badge-energized\': formData.type===\'need\'||formData.type===\'crowdfunding\'}">\n <i class="icon cion-market-{{formData.type}}"></i>\n <span ng-if="::formData.price" ng-bind-html="::formData.price | formatAmount: {currency: formData.currency, useRelative: $root.settings.useRelative} "></span>\n <span ng-if="::!formData.price">{{\'MARKET.TYPE.\'+formData.type+\'_SHORT\'|upper|translate}}</span>\n </div>\n <div class="badge badge-secondary" ng-if="formData.fees">\n <span class="dark">\n <i class="ion-plus" ng-if="::formData.price"></i>\n <ng-bind-html ng-bind-html="::formData.fees | formatAmount: {currency: formData.feesCurrency, useRelative: $root.settings.useRelative}"></ng-bind-html>\n </span>\n <span class="gray">{{\'MARKET.VIEW.RECORD_FEES_PARENTHESIS\'|translate}} | </span>\n <span class="gray">\n <i class="ion-pie-graph"></i>\n {{\'MARKET.VIEW.RECORD_STOCK\'|translate}}\n <ng-if ng-if="formData.stock > 0"><span class="dark">{{::formData.stock}}</span> <i class="ion-checkmark balanced"></i></ng-if>\n <ng-if ng-if="formData.stock === 0"><i class="ion-close assertive"></i> <span class="assertive bold" translate>MARKET.COMMON.SOLD</span></ng-if>\n </span>\n </div>\n <div class="badge badge-secondary badge-assertive" ng-if="!formData.fees&&!formData.stock">\n <i class="ion-close"></i> <span class="bold" translate>MARKET.COMMON.SOLD</span>\n </div>\n </div>\n\n\n\n \x3c!-- Buttons bar--\x3e\n <a id="record-share-anchor-{{id}}"></a>\n <div class="item large-button-bar hidden-xs hidden-sm">\n\n \x3c!-- Share button --\x3e\n <button class="button button-stable button-small-padding icon ion-android-share-alt" ng-click="showSharePopover($event)">\n </button>\n\n \x3c!-- Message button --\x3e\n <button class="button button-stable button-small-padding icon ion-compose" ng-if="!canEdit" ng-click="showNewMessageModal()" title="{{\'MARKET.VIEW.BTN_WRITE\'|translate}}">\n </button>\n\n \x3c!-- Like button --\x3e\n <button class="button button-stable button-small-padding ink-dark" ng-if="!canEdit" title="{{\'COMMON.BTN_LIKE\' | translate }}" ng-click="toggleLike($event)">\n <i class="icon ion-heart" ng-class="{\'gray\': !likeData.likes.wasHit, \'calm\': likeData.likes.wasHit}"></i>\n </button>\n\n \x3c!--<button class="button button-stable icon-left ink-dark"\n ng-if="canEdit"\n ng-click="delete()">\n <i class="icon ion-trash-a assertive"></i>\n <span class="assertive"> {{\'COMMON.BTN_DELETE\' | translate}}</span>\n </button>--\x3e\n <button class="button button-stable icon-left ink-dark" ng-if="canSold" title="{{\'MARKET.VIEW.BTN_SOLD_AD\' | translate}}" ng-click="sold()">\n <i class="icon ion-minus-circled"></i>\n {{\'MARKET.VIEW.BTN_SOLD\' | translate}}\n </button>\n <button class="button button-stable icon-left ink-dark" ng-if="canReopen" ng-click="reopen()">\n <i class="icon ion-unlocked"></i>\n {{\'MARKET.VIEW.BTN_REOPEN\' | translate}}\n </button>\n <button class="button button-calm icon-left ion-android-create ink" ng-if="canEdit" ng-click="edit()">\n {{\'COMMON.BTN_EDIT\' | translate}}\n </button>\n\n <button class="button button-stable button-small-padding icon ion-android-more-vertical" ng-if="!canEdit" ng-click="showActionsPopover($event)">\n </button>\n\n </div>\n\n <ion-item class="item-text-wrap" ng-if="formData.description">\n <p class="text-italic enable-user-select">\n <i class="icon ion-quote"></i>\n <span trust-as-html="formData.description"></span>\n </p>\n </ion-item>\n\n \x3c!-- desktop price --\x3e\n <ion-item class="item-icon-left item-button-right hidden-xs" ng-if="formData.price||formData.fees">\n <ng-if>\n <i class="calm icon ion-pricetag"></i>\n <h1 class="calm" ng-if="formData.price" ng-bind-html="formData.price | formatAmount: {currency: formData.currency, useRelative: $root.settings.useRelative}"></h1>\n <h1 class="calm" ng-if="formData.price === 0" translate>MARKET.COMMON.FREE</h1>\n <h1 class="calm" ng-if="!formData.price && formData.price !== 0 && formData.freePrice" translate>MARKET.COMMON.FREE_PRICE</h1>\n </ng-if>\n <h3>\n \x3c!-- Tx progress --\x3e\n <div ng-if="formData.price && formData.tx">\n <span ng-class="{\'balanced\': formData.tx.pct >= 100, \'positive\': formData.tx.pct > 0 && formData.tx.pct < 100, \'calm\': formData.tx.pct === 0}">\n <i class="ion-android-checkmark-circle" ng-if="::formData.tx.pct>=100"></i>\n <b>{{\'MARKET.COMMON.CROWDFUNDING_PROGRESS\'|translate: formData.tx}}</b>\n </span>\n <ng-if ng-if="formData.tx.sum">\n (<span ng-bind-html="formData.tx.sum | formatAmount: {currency: formData.currency, useRelative: $root.settings.useRelative}"></span>)\n </ng-if>\n \x3c!-- issuers --\x3e\n <ng-if ng-if="formData.tx.issuers.length">\n <span class="gray"> | </span>\n <small><a ng-click="showIssuers($event)" title="{{\'MARKET.VIEW.SHOW_CROWDFUNDING_ISSUERS\'|translate}}">{{\'MARKET.VIEW.CROWDFUNDING_ISSUERS\'|translate: formData.tx}}</a></small>\n </ng-if>\n </div>\n\n \x3c!-- Fees --\x3e\n <ng-if ng-if="formData.fees">\n <span class="dark">\n <i class="ion-plus" ng-if="::formData.price"></i>\n <ng-bind-html ng-bind-html="formData.fees | formatAmount: {currency: formData.feesCurrency, useRelative: $root.settings.useRelative}"></ng-bind-html>\n </span>\n <span class="gray">{{\'MARKET.VIEW.RECORD_FEES_PARENTHESIS\'|translate}} | </span>\n </ng-if>\n\n \x3c!-- stock --\x3e\n <span class="gray" ng-if="formData.type===\'offer\' || formData.type===\'auction\'">\n <i class="ion-pie-graph"></i>\n {{\'MARKET.VIEW.RECORD_STOCK\'|translate}}\n <ng-if ng-if="formData.stock > 0"><span class="dark">{{::formData.stock}}</span> <i class="ion-checkmark balanced"></i></ng-if>\n <ng-if ng-if="formData.stock === 0"><i class="ion-close assertive"></i> <span class="assertive bold" translate>MARKET.COMMON.SOLD</span></ng-if>\n </span>\n </h3>\n </ion-item>\n <span class="item hidden-xs" ng-if="!formData.price && !formData.fees && formData.stock === 0">\n <div class="badge badge-secondary badge-assertive"><i class="ion-close"></i> <span class="bold" translate>MARKET.COMMON.SOLD</span></div>\n </span>\n\n \x3c!-- Payment details --\x3e\n <ion-item class="item-button-right" ng-if="paymentData">\n <p ng-if="::paymentData.comment" trust-as-html="\'MARKET.VIEW.PAYMENT_WITH_COMMENT\'|translate: paymentData"></p>\n <p ng-if="::!paymentData.comment" trust-as-html="\'MARKET.VIEW.PAYMENT\'|translate: paymentData"></p>\n\n \x3c!-- pay help button --\x3e\n <a class="button button-clear button-positive ink" title="{{\'MARKET.VIEW.BTN_PAYMENT_HELP\'|translate}}" ng-click="showPaymentModal($event)">\n <i class="icon ion-help-circled"></i>\n </a>\n </ion-item>\n\n <div class="lazy-load">\n \x3c!-- pictures --\x3e\n <ng-include src="\'plugins/es/templates/common/view_pictures.html\'"></ng-include>\n\n \x3c!-- comments --\x3e\n <ng-include src="\'plugins/es/templates/common/view_comments.html\'"></ng-include>\n </div>\n </div>\n </div>\n\n <div class="col col-33 hidden-xs hidden-sm hidden-md padding padding-top list" style="display: inline-block; max-width: 350px;">\n\n \x3c!-- issuer card --\x3e\n <a class="item item-avatar card-meta item item-border-large dark-100-bg dark animate-ripple animate-show-hide ng-hide" ng-show="!loading" ui-sref="app.user_identity({pubkey: issuer.issuer, name: issuer.name})">\n <div class="item-text-wrap light">\n\n <i ng-if="!issuer.avatar" class="item-image icon ion-person"></i>\n <i ng-if="issuer.avatar" class="item-image avatar" style="background-image: url({{issuer.avatar.src}})"></i>\n\n <h3>\n <span ng-if="issuer.name" class="positive">\n {{::issuer.name}}\n </span>\n <span ng-if="!issuer.name" class="gray">\n <b class="ion-key"></b>\n {{::issuer.issuer|formatPubkey}}\n </span>\n </h3>\n\n <h3 class="align-right" ng-if="issuer.stars" title="{{\'WOT.VIEW.STARS\' | translate }}">\n <span ng-repeat="value in [1,2,3,4,5]" ng-class="{\'energized\': issuer.stars.levelAvg > 3, \'assertive\': issuer.stars.levelAvg <= 2}">\n <b class="ion-android-star" ng-if="value <= issuer.stars.levelAvg"></b>\n <b class="ion-android-star-half" ng-if="value > issuer.stars.levelAvg && value - 0.5 <= issuer.stars.levelAvg"></b>\n <b class="ion-android-star-outline" ng-if="value > issuer.stars.levelAvg && value - 0.5 > issuer.stars.levelAvg"></b>\n </span>\n <span class="gray">{{issuer.stars.levelAvg}}/5 ({{\'WOT.VIEW.STAR_HIT_COUNT\' | translate: issuer.stars }})</span>\n </h3>\n <h4 class="gray" ng-if="issuer.profile.creationTime || issuer.profile.time">\n <i class="ion-clock"></i>\n {{::\'WOT.LOOKUP.REGISTERED\' | translate: {time: issuer.profile.creationTime||issuer.profile.time } }}\n </h4>\n </div>\n </a>\n\n \x3c!-- More similar ads --\x3e\n <div class="list list-record list-record-small list-more-record animate-ripple no-padding" ng-if="!search.loading && search.results.length" ng-init="options.description.show=false">\n\n <div class="item item-divider">\n <span translate>MARKET.VIEW.MORE_LIKE_THIS</span>\n </div>\n\n <div ng-repeat="item in search.results" ng-include="\'plugins/market/templates/search/item_record.html\'">\n </div>\n </div>\n </div>\n\n </div>\n </ion-content>\n</ion-view>\n'),e.put("plugins/market/templates/search/item_record.html",'<a class="item item-record ink no-padding" ui-sref="app.market_view_record({id: item.id, title: item.urlTitle})">\n\n <div class="row row-record">\n <div class="col item-text-wrap item-thumbnail-left">\n <i ng-if="::item.thumbnail" class="item-image" style="background-image: url({{::item.thumbnail.src}})"></i>\n <i ng-if="::!item.thumbnail" class="item-image icon cion-market-{{::item.type}}"></i>\n\n \x3c!-- title --\x3e\n <h2 title="{{item.title|noHtml}}" ng-bind-html="::item.title"></h2>\n\n \x3c!-- category --\x3e\n <h3 class="gray text-nowrap hidden-xxs">\n <span ng-if="::item.category" ng-bind-html="::item.category.name"></span>\n </h3>\n\n \x3c!--TODO --\x3e\n \x3c!--<i class="icon ink"\n title="{{\'MARKET..\'|translate}}"\n ng-click="toggleLike($event)"\n ng-class="{\'ion-ios-heart-outline\': !likeData.likes.wasHit, \'ion-ios-heart calm\': likeData.likes.wasHit}">\n </i>--\x3e\n <br class="hidden-xxs hidden-xs hidden-sm">\n\n \x3c!-- location --\x3e\n <h4>\n <span class="positive" ng-if="item.city">\n <i class="icon ion-location"></i>\n {{::options.location.prefix|translate}}<span ng-bind-html="::item.city"></span>\n </span>\n <span class="gray" ng-if="::item.distance">\n ({{::item.distance|formatDecimal}} {{::geoUnit}})\n </span>\n <span ng-if="::item.stock>1" class="gray"><i class="icon ion-pie-graph"></i> <span class="">{{::item.stock}} <i class="ion-checkmark balanced"></i></span></span>\n </h4>\n\n \x3c!-- creation date --\x3e\n <h4 class="gray" ng-if="item.creationTime">\n <i class="icon ion-clock"></i>\n {{::item.creationTime | formatFromNow}}\n <span class="hidden-xxs">{{::\'MARKET.SEARCH.BY\'|translate}}</span>\n <span class="hidden-xxs dark">{{::item.name || (item.pubkey|formatPubkey)}}</span>\n </h4>\n\n <span ng-if="::item.picturesCount > 1" class="badge badge-balanced badge-picture-count hidden-xxs">{{::item.picturesCount}} <i class="icon ion-camera"></i></span>\n\n \x3c!-- Tx progress --\x3e\n <div ng-if="::item.price && item.tx" class="badge badge-secondary" ng-class="{\'badge-balanced badge-shadow\': item.tx.pct>=100, \'badge-positive badge-shadow\': item.tx.pct < 100 && item.tx.pct > 0, \'badge-calm badge-shadow\': item.tx.pct === 0}">\n <i class="ion-android-checkmark-circle" ng-if="::item.tx.pct>=100"></i>\n <span>{{\'MARKET.COMMON.CROWDFUNDING_PROGRESS\'|translate: item.tx}}</span>\n </div>\n\n </div>\n\n <div class="col" ng-if="options.description.show">\n\n <p class="gray text-italic" ng-if="::!!item.description">\n <i class="icon ion-quote"></i>\n <span ng-bind-html="::item.description | truncText:500"></span>\n </p>\n\n </div>\n\n <div ng-if="::item.stock===0" class="badge badge-closed badge-shadow badge-assertive" translate>MARKET.COMMON.SOLD</div>\n\n \x3c!-- price --\x3e\n <div class="badge badge-price badge-shadow" ng-class="{\'badge-calm\': item.type===\'offer\'||item.type===\'auction\', \'badge-energized\': item.type===\'need\'||item.type===\'crowdfunding\', \'badge-price-closed\': !item.stock}">\n <i class="cion-market-{{item.type}}"></i>\n\n <span ng-if="::item.price" ng-bind-html=":rebind:item.price|formatAmount:{currency: item.currency, useRelative: $root.settings.useRelative, decimalCount: 0}"></span>\n <span ng-if="::item.price === 0">{{::\'MARKET.COMMON.FREE\'|translate}}</span>\n <span ng-if="::!item.price && item.freePrice">{{::\'MARKET.COMMON.FREE_PRICE\'|translate}}</span>\n <span ng-if="::!item.price && item.price !== 0 && !item.freePrice">{{::\'MARKET.TYPE.\'+item.type+\'_SHORT\'|upper|translate}}</span>\n </div>\n </div>\n</a>\n'),e.put("plugins/market/templates/search/list_records_lg.html",'\n<div class="padding-xs padding-sm" style="display: block; height: 60px;">\n <div class="pull-left ng-hide" ng-show="!search.loading">\n <ng-if ng-if="search.lastRecords">\n <h4 translate>MARKET.SEARCH.LAST_RECORDS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'MARKET.SEARCH.LAST_RECORD_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'MARKET.SEARCH.LAST_RECORD_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n <ng-if ng-if="!search.lastRecords">\n <h4 translate>MARKET.SEARCH.RESULTS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'MARKET.SEARCH.RESULT_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'MARKET.SEARCH.RESULT_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n </div>\n\n <div class="pull-right padding-top ng-hide" ng-show="!search.loading && search.total">\n <a class="button button-text button-small ink" ng-click="showSortPopover($event)" ng-class="{\'button-text-positive\': search.sortDirection === \'asc\' || search.sortAttribute === \'price\'}" style="padding-left: 16px;">\n <i class="icon-secondary ion-arrow-up-b" style="top: -5px; left: 5px; font-size: 10px;" ng-class="{\'positive\': search.sortDirection === \'asc\', \'medium\': search.sortDirection !== \'asc\'}"></i>\n <b class="icon-secondary ion-arrow-down-b" style="top: 1px; left: 5px; font-size: 10px;" ng-class="{\'positive\': search.sortDirection === \'desc\', \'medium\': search.sortDirection !== \'desc\'}"></b>\n <span class="hidden-xxs" translate>MARKET.SEARCH.SORT.PREFIX</span>\n <span ng-if="search.sortAttribute !== \'price\'" translate>MARKET.SEARCH.SORT.DATE</span>\n <span ng-if="search.sortAttribute === \'price\'" translate>MARKET.SEARCH.SORT.PRICE</span>\n </a>\n \n <a class="button button-text button-small hidden-xs hidden-sm ink" ng-class="{\'button-text-positive\': search.compactMode}" ng-click="toggleCompactMode()">\n <i class="icon ion-navicon"></i>\n <b class="icon-secondary ion-arrow-down-b" style="top: -8px; left: 5px; font-size: 8px;"></b>\n <b class="icon-secondary ion-arrow-up-b" style="top: 3px; left: 5px; font-size: 8px;"></b>\n {{\'DOCUMENT.LOOKUP.BTN_COMPACT\' | translate}}\n </a>\n\n </div>\n</div>\n\n<div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n</div>\n\n<div class="padding assertive" ng-if="!search.loading && search.results.length===0 && (search.advanced != null || search.lastRecords)" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n\n<div class="row no-padding" ng-class="{\'ng-hide\': !search.total}">\n \x3c!-- left margin (when NOT compact mode) --\x3e\n <div class="col col-15 no-padding hidden-xs hidden-sm" ng-if="!search.compactMode"> </div>\n\n <div class="col no-padding">\n\n <div class="list list-record {{::motion.ionListClass}}" ng-class="{\'flex-row\': search.compactMode}" ng-if="!search.loading && search.results.length">\n\n <div class="no-padding" ng-repeat="item in search.results" ng-include="::\'plugins/market/templates/search/item_record.html\'">\n </div>\n </div>\n </div>\n\n \x3c!-- right margin (when NOT compact mode) --\x3e\n <div class="col col-15 no-padding hidden-xs hidden-sm" ng-if="!search.compactMode"> </div>\n</div>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="10%">\n</ion-infinite-scroll>\n'),e.put("plugins/market/templates/search/list_records.html",'\x3c!-- result label --\x3e\n<div class="padding" style="display: block; height: 60px;">\n <div class="pull-left ng-hide" ng-show="!search.loading">\n <ng-if ng-if="search.lastRecords">\n <h4 translate>MARKET.SEARCH.LAST_RECORDS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'MARKET.SEARCH.LAST_RECORD_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'MARKET.SEARCH.LAST_RECORD_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n\n <ng-if ng-if="!search.lastRecords">\n <h4 translate>MARKET.SEARCH.RESULTS</h4>\n <small class="gray no-padding" ng-if="search.total">\n <span ng-if="search.geoPoint && search.total">{{\'MARKET.SEARCH.RESULT_COUNT_LOCATION\'|translate:{count: search.total, location: search.location} }}</span>\n <span ng-if="!search.geoPoint && search.total">{{\'MARKET.SEARCH.RESULT_COUNT\'|translate:{count: search.total} }}</span>\n </small>\n </ng-if>\n </div>\n\n <div class="pull-right padding-top ng-hide" ng-show="!search.loading && search.total">\n <a class="button button-text button-small ink" ng-click="showSortPopover($event)" ng-class="{\'button-text-positive\': search.sortDirection === \'asc\' || search.sortAttribute === \'price\'}" style="padding-left: 16px;">\n <i class="icon-secondary ion-arrow-up-b" style="top: -5px; left: 5px; font-size: 10px;" ng-class="{\'positive\': search.sortDirection === \'asc\', \'medium\': search.sortDirection !== \'asc\'}"></i>\n <b class="icon-secondary ion-arrow-down-b" style="top: 1px; left: 5px; font-size: 10px;" ng-class="{\'positive\': search.sortDirection === \'desc\', \'medium\': search.sortDirection !== \'desc\'}"></b>\n <span class="hidden-xxs" translate>MARKET.SEARCH.SORT.PREFIX</span>\n <span ng-if="search.sortAttribute !== \'price\'" translate>MARKET.SEARCH.SORT.DATE</span>\n <span ng-if="search.sortAttribute === \'price\'" translate>MARKET.SEARCH.SORT.PRICE</span>\n </a>\n </div>\n</div>\n\n<div class="center" ng-if="search.loading">\n <ion-spinner icon="android"></ion-spinner>\n</div>\n\n<div class="padding assertive" ng-if="!search.loading && search.results.length===0 && (search.advanced != null || search.lastRecords)" translate>\n COMMON.SEARCH_NO_RESULT\n</div>\n\n<div class="list list-record {{::motion.ionListClass}} no-padding" ng-if="!search.loading && search.results.length" ng-init="options.description.show=false">\n\n <div class="no-padding" ng-repeat="item in search.results" ng-include="\'plugins/market/templates/search/item_record.html\'">\n </div>\n\n</div>\n\n<ion-infinite-scroll ng-if="!search.loading && search.hasMore" spinner="android" on-infinite="showMore()" distance="1%">\n</ion-infinite-scroll>\n'),e.put("plugins/market/templates/search/lookup_actions_popover.html",'<ion-popover-view class="fit has-header">\n <ion-header-bar>\n <h1 class="title" translate>COMMON.POPOVER_FILTER_TITLE</h1>\n </ion-header-bar>\n <ion-content scroll="false">\n <div class="list item-text-wrap">\n\n \x3c!-- last record --\x3e\n <button type="button" class="item item-icon-left ink visible-sm visible-xs" ng-class="{\'button-text-positive\': search.lastRecords}" ng-if="options.filter.lastRecords" ng-click="doGetLastRecords()">\n <i class="icon ion-clock"></i>\n {{\'MARKET.SEARCH.BTN_LAST_RECORDS\' | translate}}\n </button>\n\n \x3c!-- show closed Ads ? --\x3e\n <a class="item item-icon-left ink" ng-click="toggleShowClosed()">\n <i class="icon ion-android-checkbox-outline-blank" ng-show="!search.showClosed"></i>\n <i class="icon ion-android-checkbox-outline" ng-show="search.showClosed"></i>\n <span translate>MARKET.SEARCH.SHOW_CLOSED_RECORD</span>\n </a>\n\n \x3c!-- show old Ads ? --\x3e\n <a class="item item-icon-left ink" ng-click="toggleShowOld()">\n <i class="icon ion-android-checkbox-outline-blank" ng-show="!search.showOld"></i>\n <i class="icon ion-android-checkbox-outline" ng-show="search.showOld"></i>\n <span translate>MARKET.SEARCH.SHOW_OLD_RECORD</span>\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n'),e.put("plugins/market/templates/search/lookup_lg.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span translate>MARKET.SEARCH.TITLE</span>\n </ion-nav-title>\n\n <ion-content class="lookupForm padding no-padding-xs stable-100-bg" bind-notifier="{ rebind:$root.settings.useRelative }">\n\n <div class="hidden-xs hidden-sm" style="display: block; height: 45px;">\n\n \x3c!-- show categories button --\x3e\n <div class="pull-left">\n <a class="button button-text button-small ink" ng-if="options.category.show" ng-class="{\'button-text-positive\': search.showCategories, \'button-text-dark\': !search.showCategories}" ng-click="search.showCategories=!search.showCategories;">\n <span translate>MARKET.SEARCH.BTN_SHOW_CATEGORIES</span>\n <i class="icon" ng-class="{\'ion-arrow-down-b\': !search.showCategories, \'ion-arrow-up-b\': search.showCategories}"></i>\n </a>\n </div>\n\n \x3c!-- new record button --\x3e\n <div class="pull-right">\n <button class="button button-small button-positive button-clear ink padding-right" ng-click="showNewRecordModal()">\n <i class="icon ion-plus"></i>\n <span translate>MARKET.COMMON.BTN_NEW_AD</span>\n </button>\n </div>\n </div>\n\n \x3c!-- categories drop down --\x3e\n <div class="list dropdown-list" ng-mouseleave="search.showCategories=false;" ng-show="search.showCategories" scroll="true" ng-controller="MkListCategoriesCtrl" ng-init="load()">\n <div class="text-center" ng-show="loading">\n <ion-spinner icon="android"></ion-spinner>\n </div>\n <div class="no-border no-padding" ng-show="!loading" ng-include="\'plugins/market/templates/category/list_categories_lg.html\'">\n </div>\n </div>\n\n <form ng-submit="doSearch()" class="light-bg">\n\n <div class="row no-padding responsive-lg">\n \x3c!-- search text --\x3e\n <div class="col no-padding no-margin">\n <div class="item no-padding">\n\n <div class="item-input light-bg">\n <div class="animate-show-hide selected-values ng-hide" ng-show="entered">\n \x3c!-- selected category --\x3e\n <div ng-show="search.category.name" class="button button-small button-text button-stable button-icon-event stable-900-bg" style="margin-right: 10px;">\n <i class="icon ion-flag"></i>\n {{\'MARKET.SEARCH.CATEGORY\'|translate}}\n <span ng-bind-html="search.category.name"></span>\n <i class="icon ion-close" ng-click="removeCategory()"> </i>\n </div>\n\n </div>\n\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" autocomplete="off" class="visible-xs visible-sm" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 950 }" ng-change="doSearch()">\n <input type="text" autocomplete="off" class="hidden-xs hidden-sm" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" id="marketSearchText" ng-model="search.text" on-return="doSearch()">\n\n <button type="button" class="button button-icon button-small pull-right button-small-padding ink" ng-if="search.text" tabindex="-1" ng-click="removeText()">\n <i class="gray ion-close"></i>\n </button>\n </div>\n </div>\n </div>\n\n \x3c!-- location --\x3e\n <div class="col col-40 no-padding no-margin" ng-include src="::\'plugins/es/templates/common/item_location_search.html\'" ng-controller="ESSearchPositionItemCtrl">\n </div>\n\n </div>\n\n \x3c!-- options --\x3e\n <ng-include src="::\'plugins/market/templates/search/lookup_options.html\'"></ng-include>\n </form>\n\n\n\n <div ng-if="!search.loading && !search.category && options.category.show" class="padding-right visible-xs visible-sm" style="display: block; height: 35px;">\n <a class="button button-text button-small button-text-positive pull-right ink" ui-sref="app.market_categories">\n <i class="icon ion-android-funnel"></i>\n <span translate>MARKET.SEARCH.BTN_SHOW_CATEGORIES</span>\n </a>\n </div>\n\n <div class="padding-top padding-xs disable-user-behavior" style="display: block; height: 60px;">\n <div class="hidden-xs hidden-sm pull-left">\n\n <a class="button button-text button-small ink" ng-class="{\'button-text-positive\': search.advanced, \'button-text-stable\': !search.advanced}" ng-click="search.advanced=!search.advanced">\n <span translate>MARKET.SEARCH.BTN_OPTIONS</span>\n <i class="icon" ng-class="{\'ion-arrow-down-b\': !search.advanced, \'ion-arrow-up-b\': search.advanced}"></i>\n </a>\n \n\n </div>\n\n <div class="hidden-xs hidden-sm pull-right">\n\n <a class="button button-text button-small ink icon ion-clock" ng-if="!options.type.show" ng-class="{\'button-text-positive\': search.type==\'last\'}" ng-click="doGetLastRecords()">\n <span translate>MARKET.SEARCH.BTN_LAST_RECORDS</span>\n </a>\n <a class="button button-text button-small ink icon cion-market-offer" ng-if="options.type.show" ng-class="{\'button-text-positive\': search.type==\'offer\'}" ng-click="toggleAdType(\'offer\')">\n <span translate>MARKET.SEARCH.BTN_OFFERS</span>\n </a>\n <a class="button button-text button-small ink icon cion-market-need" ng-if="options.type.show" ng-class="{\'button-text-positive\': search.type==\'need\'}" ng-click="toggleAdType(\'need\')">\n <span translate>MARKET.SEARCH.BTN_NEEDS</span>\n </a>\n <a class="button button-text button-small ink icon cion-market-crowdfunding" ng-if="options.type.show" ng-class="{\'button-text-positive\': search.type==\'crowdfunding\'}" ng-click="toggleAdType(\'crowdfunding\')">\n <span translate>MARKET.SEARCH.BTN_CROWDFUNDING</span>\n </a>\n\n \x3c!--<a class="button button-text button-small ink icon ion-heart"\n ng-if="options.type.show"\n ng-class="{\'button-text-positive\': search.type==\'star\'}"\n ng-click="toggleAdType(\'star\')">\n {{\'MARKET.SEARCH.BTN_FAVORITES\' | translate}}\n </a>--\x3e\n \n <button type="button" class="button button-small button-stable ink" ng-click="doSearch()">\n <span translate>COMMON.BTN_SEARCH</span>\n </button>\n </div>\n </div>\n\n \x3c!-- list of records --\x3e\n <ng-include src="::\'plugins/market/templates/search/list_records_lg.html\'"></ng-include>\n\n </ion-content>\n\n <button id="fab-add-market-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-compose hidden-md hidden-lg spin" ng-click="showNewRecordModal()">\n </button>\n</ion-view>\n'),e.put("plugins/market/templates/search/lookup_options.html",'\n<div class="row no-padding responsive-lg disable-user-behavior" ng-if="search.advanced">\n <div class="col no-padding no-margin">\n \x3c!-- Show closed ad ? --\x3e\n <div class="item item-icon-left item-input item-toggle stable-bg">\n <i class="icon ion-speakerphone gray"></i>\n <b class="icon-secondary ion-close-circled assertive" style="top:7px; left: 34px;"></b>\n <span class="input-label item-icon-left-padding" ng-click="search.showClosed=!search.showClosed">\n {{\'MARKET.SEARCH.SHOW_CLOSED_RECORD\' | translate}}\n </span>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="search.showClosed">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </div>\n\n <div class="col no-padding no-margin">\n \x3c!-- Show OLD ad ? --\x3e\n <div class="item item-icon-left item-input item-toggle stable-bg">\n <i class="icon ion-clock gray"></i>\n <b class="icon-secondary ion-close-circled assertive" style="top:7px; left: 34px;"></b>\n <span class="input-label item-icon-left-padding" ng-click="search.showOld=!search.showOld">\n {{\'MARKET.SEARCH.SHOW_OLD_RECORD\' | translate}}\n </span>\n <label class="toggle toggle-royal">\n <input type="checkbox" ng-model="search.showOld">\n <div class="track">\n <div class="handle"></div>\n </div>\n </label>\n </div>\n </div>\n\n</div>\n'),e.put("plugins/market/templates/search/lookup_sort_popover.html","<ion-popover-view class=\"fit\" style=\"height: 210px; width: 200px;\">\n <ion-content scroll=\"false\">\n <div class=\"list\">\n\n \x3c!-- creation date --\x3e\n <a class=\"item ink\" ng-click=\"toggleSort('creationTime', 'desc')\" ng-class=\"{'positive': search.sortAttribute==='creationTime' && search.sortDirection==='desc'}\">\n <span translate>MARKET.SEARCH.SORT.PREFIX</span>\n <span translate>MARKET.SEARCH.SORT.DATE_DESC</span>\n </a>\n <a class=\"item ink\" ng-click=\"toggleSort('creationTime', 'asc')\" ng-class=\"{'positive': search.sortAttribute==='creationTime' && search.sortDirection==='asc'}\">\n <span translate>MARKET.SEARCH.SORT.PREFIX</span>\n <span translate>MARKET.SEARCH.SORT.DATE_ASC</span>\n </a>\n\n \x3c!-- price --\x3e\n <a class=\"item ink\" ng-click=\"toggleSort('price', 'asc')\" ng-class=\"{'positive': search.sortAttribute==='price' && search.sortDirection==='asc'}\">\n <span translate>MARKET.SEARCH.SORT.PREFIX</span>\n <span translate>MARKET.SEARCH.SORT.PRICE_ASC</span>\n </a>\n <a class=\"item ink\" ng-click=\"toggleSort('price', 'desc')\" ng-class=\"{'positive': search.sortAttribute==='price' && search.sortDirection==='desc'}\">\n <span translate>MARKET.SEARCH.SORT.PREFIX</span>\n <span translate>MARKET.SEARCH.SORT.PRICE_DESC</span>\n </a>\n </div>\n </ion-content>\n</ion-popover-view>\n"),e.put("plugins/market/templates/search/lookup.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span ng-if="entered && !search.category" translate>MARKET.SEARCH.TITLE</span>\n <span ng-if="search.category" ng-bind-html="search.category.name"></span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <button class="button button-icon button-clear icon ion-loop visible-xs visible-sm" ng-click="refresh()">\n </button>\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-funnel"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content class="lookupForm stable-100-bg" bind-notifier="{ rebind: $root.settings.useRelative }">\n\n <form ng-submit="doSearch()" class="light-bg">\n\n <a class="item item-icon-right ink ng-hide" ng-show="entered && !search.category && options.category.show" ui-sref="app.market_categories">\n <span class="gray"> <i class="gray ion-android-funnel"></i> {{\'MARKET.SEARCH.BTN_SHOW_CATEGORIES\'|translate}}</span>\n <i class="gray icon ion-ios-arrow-right"></i>\n </a>\n\n <label class="item item-input">\n <i class="icon ion-search placeholder-icon"></i>\n <input type="text" placeholder="{{\'MARKET.SEARCH.SEARCH_HELP\'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()">\n\n \x3c!-- FIXME\n <button type="button" class="button button-icon button-small pull-right button-small-padding ink"\n ng-if="search.text"\n tabindex="-1"\n ng-click="removeText()">\n <i class="gray ion-close "></i>\n </button> --\x3e\n </label>\n\n \x3c!-- location --\x3e\n <ng-include src="\'plugins/es/templates/common/item_location_search.html\'" ng-controller="ESSearchPositionItemCtrl" ng-init=""></ng-include>\n\n \x3c!-- options --\x3e\n <ng-include src="::\'plugins/market/templates/search/lookup_options.html\'"></ng-include>\n </form>\n\n \n\n \x3c!-- list of records --\x3e\n <ng-include src="::\'plugins/market/templates/search/list_records.html\'"></ng-include>\n </ion-content>\n\n <button id="fab-add-market-record" class="button button-fab button-fab-bottom-right button-assertive icon ion-plus spin" ng-click="showNewRecordModal()">\n </button>\n</ion-view>\n'),e.put("plugins/market/templates/wallet/view_wallet_extend.html",'\n\n<ng-if ng-if=":state:enable && extensionPoint === \'general\'">\n\n\n <ion-item class="item-icon-left item-text-wrap ink" ng-if="formData.profile.pubkey" copy-on-click="{{:rebind:formData.profile.pubkey}}">\n <i class="icon ion-card"></i>\n <span translate>MARKET.WALLET.DUNITER_PUBKEY</span>\n <h4 id="pubkey" class="dark text-left">{{:rebind:formData.profile.pubkey}}</h4>\n </ion-item>\n\n <div class="item item-icon-left item-text-wrap">\n <i class="icon ion-ios-help-outline positive"></i>\n <span ng-bind-html="\'MARKET.WALLET.DUNITER_ACCOUNT\'|translate:{currency:$root.currency.name}"></span>\n\n <h4 ng-if="formData.profile.pubkey" class="gray" translate>MARKET.WALLET.DUNITER_ACCOUNT_HELP</h4>\n <h4 ng-if="!formData.profile.pubkey" class="gray" translate>MARKET.WALLET.DUNITER_ACCOUNT_NO_PUBKEY_HELP</h4>\n </div>\n\n \x3c!-- star level --\x3e\n <div class="item item-icon-left item-text-wrap" ng-if="likeData.stars">\n\n <i class="icon" ng-class="{\'ion-android-star-outline\': likeData.stars.levelAvg <= 2, \'ion-android-star-half\': likeData.stars.levelAvg > 2 && likeData.stars.levelAvg <= 3, \'ion-android-star energized\': likeData.stars.levelAvg > 3}"></i>\n <span translate>WOT.VIEW.STARS</span>\n <h4 class="dark">{{\'WOT.VIEW.STAR_HIT_COUNT\' | translate: likeData.stars }}</h4>\n\n <div class="badge">\n <span ng-repeat="value in [1,2,3,4,5]" ng-class="{\'energized\': likeData.stars.levelAvg > 3, \'assertive\': likeData.stars.levelAvg <= 2}">\n <b class="ion-android-star" ng-if="value <= likeData.stars.levelAvg"></b>\n <b class="ion-android-star-half" ng-if="value > likeData.stars.levelAvg && value - 0.5 <= likeData.stars.levelAvg"></b>\n <b class="ion-android-star-outline" ng-if="value > likeData.stars.levelAvg && value - 0.5 > likeData.stars.levelAvg"></b>\n </span>\n <small class="dark">({{likeData.stars.levelAvg}}/5)</small>\n </div>\n </div>\n\n <div class="visible-xs visible-sm">\n <div class="item item-divider item-divider-top-border">\n {{\'MENU.MARKET\' | translate}}\n </div>\n\n \x3c!-- market records --\x3e\n <a class="item item-icon-left item-icon-right" ui-sref="app.market_wallet_records">\n <i class="icon ion-speakerphone"></i>\n {{\'MENU.MY_RECORDS\' | translate}}\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n </div>\n\n</ng-if>\n'),e.put("plugins/market/templates/wallet/view_wallet_favorites.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span class="visible-xs visible-sm" translate>MENU.FAVORITES</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <cs-extension-point name="nav-buttons"></cs-extension-point>\n\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-funnel"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true" bind-notifier="{ rebind:settings.useRelative, locale:settings.locale.id}">\n\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()">\n </ion-refresher>\n\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="refresh()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n \n\n <button class="button button-stable button-small-padding icon ion-android-funnel ink" ng-click="showActionsPopover($event)" title="{{\'COMMON.BTN_OPTIONS\' | translate}}">\n </button>\n </div>\n\n \x3c!-- list of records --\x3e\n <div class="lookupForm padding no-padding-xs no-padding-sm">\n <ng-include src="::smallscreen ? \'plugins/market/templates/search/list_records.html\' : \'plugins/market/templates/search/list_records_lg.html\'"></ng-include>\n </div>\n </ion-content>\n\n <button id="fab-wallet-add-market-record" class="button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg drop" ng-click="showNewRecordModal()">\n <i class="icon ion-plus"></i>\n </button>\n</ion-view>\n'),e.put("plugins/market/templates/wallet/view_wallet_records.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span class="visible-xs visible-sm" translate>MENU.MY_RECORDS</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <cs-extension-point name="nav-buttons"></cs-extension-point>\n\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-funnel"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true" bind-notifier="{ rebind:settings.useRelative, locale:settings.locale.id}">\n\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()">\n </ion-refresher>\n\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="refresh()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n\n \n\n <button class="button button-calm ink" ng-click="showNewRecordModal()">\n {{\'MARKET.COMMON.BTN_NEW_AD\' | translate}}\n </button>\n\n <button class="button button-stable button-small-padding icon ion-android-funnel ink" ng-click="showActionsPopover($event)" title="{{\'COMMON.BTN_OPTIONS\' | translate}}">\n </button>\n </div>\n\n \x3c!-- list of records --\x3e\n <div class="lookupForm padding no-padding-xs no-padding-sm">\n <ng-include src="::smallscreen ? \'plugins/market/templates/search/list_records.html\' : \'plugins/market/templates/search/list_records_lg.html\'"></ng-include>\n </div>\n </ion-content>\n\n <button id="fab-wallet-add-market-record" class="button button-fab button-fab-bottom-right button-assertive hidden-md hidden-lg drop" ng-click="showNewRecordModal()">\n <i class="icon ion-plus"></i>\n </button>\n</ion-view>\n'),e.put("plugins/market/templates/wot/view_identity_extend.html",'\n\x3c!-- General section --\x3e\n<ng-if ng-if=":state:enable && extensionPoint === \'general\'">\n\n <ion-item class="item-icon-left item-text-wrap ink" ng-if="formData.profile.pubkey" copy-on-click="{{:rebind:formData.profile.pubkey}}">\n <i class="icon ion-card"></i>\n <span translate>MARKET.WOT.VIEW.DUNITER_PUBKEY</span>\n <h4 id="pubkey" class="dark text-left">{{:rebind:formData.profile.pubkey}}</h4>\n </ion-item>\n\n <div class="item item-icon-left item-text-wrap item-wallet-event">\n <i class="icon ion-ios-help-outline positive"></i>\n <span ng-bind-html="\'MARKET.WOT.VIEW.DUNITER_ACCOUNT\'|translate:{currency:$root.currency.name}"></span>\n <h4 class="gray" ng-if="formData.profile.pubkey" translate>MARKET.WOT.VIEW.DUNITER_ACCOUNT_HELP</h4>\n <h4 ng-if="!formData.profile.pubkey" trust-as-html="\'MARKET.WOT.VIEW.DUNITER_ACCOUNT_HELP_ASK_USER\'|translate"></h4>\n </div>\n</ng-if>\n\n<ng-if ng-if=":state:enable && extensionPoint === \'after-general\'">\n\n <div class="item item-divider item-divider-top-border">\n {{\'MENU.MARKET\' | translate}}\n </div>\n\n \x3c!-- market records --\x3e\n <a class="item item-icon-left item-icon-right" ui-sref="app.market_identity_records({pubkey: formData.pubkey})">\n <i class="icon ion-speakerphone"></i>\n {{\'MARKET.WOT.VIEW.BTN_RECORDS\' | translate}}\n <i class="icon ion-ios-arrow-right"></i>\n </a>\n\n</ng-if>\n'),e.put("plugins/market/templates/wot/view_identity_records.html",'<ion-view left-buttons="leftButtons" class="market">\n <ion-nav-title>\n <span class="visible-xs visible-sm">{{\'MARKET.PROFILE.IDENTITY_RECORDS_TITLE\'|translate}}</span>\n </ion-nav-title>\n\n <ion-nav-buttons side="secondary">\n <cs-extension-point name="nav-buttons"></cs-extension-point>\n\n <button class="button button-icon button-clear visible-xs visible-sm" ng-click="showActionsPopover($event)">\n <i class="icon ion-android-funnel"></i>\n </button>\n </ion-nav-buttons>\n\n <ion-content scroll="true" bind-notifier="{ rebind:settings.useRelative, locale:settings.locale.id}">\n\n <ion-refresher pulling-text="{{\'COMMON.BTN_REFRESH\' | translate}}" on-refresh="refresh()">\n </ion-refresher>\n\n \x3c!-- Buttons bar--\x3e\n <div class="hidden-xs hidden-sm padding text-center">\n\n <button class="button button-stable button-small-padding icon ion-loop ink" ng-click="refresh()" title="{{\'COMMON.BTN_REFRESH\' | translate}}">\n </button>\n <button class="button button-stable button-small-padding icon ion-android-funnel ink" ng-click="showActionsPopover($event)" title="{{\'COMMON.BTN_OPTIONS\' | translate}}">\n </button>\n </div>\n\n \x3c!-- list of records --\x3e\n <div class="lookupForm padding no-padding-xs no-padding-sm">\n <ng-include src="::smallscreen ? \'plugins/market/templates/search/list_records.html\' : \'plugins/market/templates/search/list_records_lg.html\'"></ng-include>\n </div>\n </ion-content>\n\n</ion-view>\n')}]),angular.module("cesium.es.plugin",["cesium.es.services","cesium.es.app.controllers","cesium.es.common.controllers","cesium.es.like.controllers","cesium.es.settings.controllers","cesium.es.wot.controllers","cesium.es.wallet.controllers","cesium.es.profile.controllers","cesium.es.message.controllers","cesium.es.notification.controllers","cesium.es.registry.controllers","cesium.es.subscription.controllers","cesium.es.document.controllers","cesium.es.network.controllers"]),h.prototype.regexp={API_REGEXP:/^([A-Z_]+)(?:[ ]+([a-z_][a-z0-9-_.ğĞ]*))?(?:[ ]+([0-9.]+))?(?:[ ]+([0-9a-f:]+))?(?:[ ]+([0-9]+))(?:\/[^\/]+)?$/,LOCAL_IP_ADDRESS:/^127[.]0[.]0.|192[.]168[.]|10[.]0[.]0[.]|172[.]16[.]/},h.prototype.keyID=function(){var e=this.ep||this.getEP();return e.useBma?[this.pubkey||"Unknown",e.dns,e.ipv4,e.ipv6,e.port,e.useSsl,e.path].join("-"):[this.pubkey||"Unknown",e.ws2pid,e.path].join("-")},h.prototype.copyValues=function(e){var n=this;["version","currency","pub","endpoints","hash","status","block","signature"].forEach((function(t){e[t]=n[t]}))},h.prototype.copyValuesFrom=function(e){var n=this;["version","currency","pub","endpoints","block","signature"].forEach((function(t){n[t]=e[t]}))},h.prototype.json=function(){var e=this,n={};return["version","currency","endpoints","status","block","signature"].forEach((function(t){n[t]=e[t]})),n.raw=this.raw&&this.getRaw(),n.pubkey=this.pubkey,n},h.prototype.getEP=function(){if(this.ep)return this.ep;var e=null,n=this.regexp.API_REGEXP;return this.endpoints.forEach((function(t){var a=!e&&n.exec(t);a&&(e={api:a[1]||"",dns:a[2]||"",ipv4:a[3]||"",ipv6:a[4]||"",port:a[5]||80,path:a[6]||"",useSsl:443==a[5]})})),e||{}},h.prototype.getEndpoints=function(e){return e?("string"==typeof e&&(e=new RegExp("^"+e)),this.endpoints.reduce((function(n,t){return t.match(e)?n.concat(t):n}),[])):this.endpoints},h.prototype.hasEndpoint=function(e){var n=this.regexp[e]||new RegExp("^"+e),t=this.getEndpoints(n);return t&&t.length>0},h.prototype.hasEsEndpoint=function(){var e=this.getEsEndpoints();return e&&e.length>0},h.prototype.getEsEndpoints=function(){return this.getEndpoints(/^(GCHANGE_API|GCHANGE_SUBSCRIPTION_API)/)},h.prototype.getDns=function(){var e=this.ep||this.getEP();return e.dns?e.dns:null},h.prototype.getIPv4=function(){var e=this.ep||this.getEP();return e.ipv4?e.ipv4:null},h.prototype.getIPv6=function(){var e=this.ep||this.getEP();return e.ipv6?e.ipv6:null},h.prototype.getPort=function(){var e=this.ep||this.getEP();return e.port?e.port:null},h.prototype.getHost=function(){var e=this.ep||this.getEP();return(443==e.port||e.useSsl)&&e.dns?e.dns:this.hasValid4(e)?e.ipv4:e.dns?e.dns:e.ipv6?"["+e.ipv6+"]":""},h.prototype.getURL=function(){var e=this.ep||this.getEP(),n=this.getHost();return(443==e.port||e.useSsl?"https":"http")+"://"+n+(e.port?":"+e.port:"")},h.prototype.getServer=function(){var e=this.ep||this.getEP(),n=this.getHost();return n+(n&&e.port?":"+e.port:"")},h.prototype.hasValid4=function(e){return!(!e.ipv4||e.ipv4.match(this.regexp.LOCAL_IP_ADDRESS))},h.prototype.isReachable=function(){return!!this.getServer()},h.prototype.isSsl=function(){return(this.ep||this.getEP()).useSsl},h.prototype.isTor=function(){return(this.ep||this.getEP()).useTor},h.prototype.isHttp=function(){return this.ep||this.getEP(),!bma.useTor},angular.module("cesium.es.services",["cesium.es.http.services","cesium.es.comment.services","cesium.es.social.services","cesium.es.settings.services","cesium.es.crypto.services","cesium.es.profile.services","cesium.es.notification.services","cesium.es.message.services","cesium.es.modal.services","cesium.es.wallet.services","cesium.es.subscription.services","cesium.es.geo.services","cesium.es.document.services","cesium.es.registry.services","cesium.es.network.services","cesium.es.like.services"]),angular.module("cesium.es.comment.services",["ngResource","cesium.services","cesium.es.http.services","cesium.es.profile.services"]).factory("esComment",["$rootScope","$q","UIUtils","BMA","esHttp","csWallet","csWot",function(e,n,t,a,i,o,s){return{instance:function(t){var a={commons:["issuer","creationTime","time","message","reply_to"]},r={index:t,fields:{commons:a.commons},raw:{search:i.post("/"+t+"/comment/_search"),remove:i.record.remove(t,"comment"),wsChanges:i.ws("/ws/_changes"),add:new i.record.post("/"+t+"/comment",{creationTime:!0}),update:new i.record.post("/"+t+"/comment/:id/_update",{creationTime:!0})}};return r.raw.refreshTreeLinks=function(e){return r.raw.addTreeLinks(e,!0)},r.raw.addTreeLinks=function(e,t){(e=e||{}).result=e.result||[],e.mapById=e.mapById||{};var o={};if(_.forEach(_.values(e.mapById),(function(n){if(n.reply_to&&!n.parent){var a=e.mapById[n.reply_to];a||(a=new b(n.reply_to),o[a.id]=n.id,e.mapById[a.id]=a),t&&a.containsReply(n)||a.addReply(n)}})),!_.size(o)){var s=n.defer();return s.resolve(e),s.promise}var l={query:{terms:{_id:_.keys(o)}},sort:[{creationTime:{order:"desc"}},{time:{order:"desc"}}],from:0,size:1e3,_source:a.commons};return console.debug("[ES] [comment] Getting missing comments in tree"),r.raw.search(l).then((function(n){return n.hits.total?(_.forEach(n.hits.hits,(function(n){var t=e.mapById[n._id];t.copyFromJson(n._source),t.html=i.util.parseAsHtml(t.message),delete o[t.id]})),_.size(o)&&console.error("Comments has invalid [reply_to]: "+_.values(o).join(",")),r.raw.addTreeLinks(e)):(console.error("[ES] [comment] Comments has invalid [reply_to]: "+_.values(o).join(",")),e)}))},r.raw.loadDataByRecordId=function(e,n){(n=n||{}).from=n.from||0,n.size=n.size||20,n.loadAvatar=!angular.isDefined(n.loadAvatar)||n.loadAvatar,n.loadAvatarAllParent=!!angular.isDefined(n.loadAvatarAllParent)&&n.loadAvatar&&n.loadAvatarAllParent,n.size<0&&(n.size=1e3);var t={query:{term:{record:e}},sort:[{creationTime:{order:"desc"}},{time:{order:"desc"}}],from:n.from,size:n.size,_source:a.commons},o={total:0,mapById:{},result:[],pendings:{}};return r.raw.search(t).then((function(e){return e.hits.total?(o.total=e.hits.total,o.result=e.hits.hits.reduce((function(e,n){var t=new b(n._id,n._source);return t.html=i.util.parseAsHtml(t.message),o.mapById[t.id]=t,e.concat(t)}),o.result),r.raw.addTreeLinks(o)):o})).then((function(){if(n.loadAvatar)return n.loadAvatarAllParent?s.extendAll(_.values(o.mapById),"issuer"):s.extendAll(o.result,"issuer")})).then((function(){return o.result=o.result.sort((function(e,n){return e.creationTime-n.creationTime})),o}))},r.raw.createOnDeleteListener=function(e){return function(n){var t=_.findIndex(e.result,{id:n.id});-1!==t&&(e.result.splice(t,1),delete e.mapById[n.id],o.isUserPubkey(n.issuer)&&r.raw.remove(n.id,o.data.keypair).catch((function(e){throw console.error(e),new Error("MARKET.ERROR.FAILED_REMOVE_COMMENT")})))}},r.raw.startListenChanges=function(n,a,l){(a=a||{}).result=a.result||[],a.mapById=a.mapById||{},a.pendings=a.pendings||{},l=l||e;var c=r.raw.createOnDeleteListener(a);_.forEach(a.result,(function(e){e.addOnRemoveListener(c)}));var d=Date.now();console.info("[ES] [comment] Starting websocket to listen comments on [{0}/record/{1}]".format(t,n.substr(0,8)));var u=i.websocket.changes(t+"/comment");return u.open().then((function(){console.debug("[ES] [comment] Websocket opened in {0} ms".format(Date.now()-d)),u.on((function(e){e&&l.$applyAsync((function(){var t=a.mapById[e._id];"DELETE"===e._operation?t&&t.remove():e._source&&e._source.record===n&&(t?(t.copyFromJson(e._source),t.html=i.util.parseAsHtml(t.message),r.raw.refreshTreeLinks(a)):a.pendings&&a.pendings[e._source.creationTime]||e._source.issuer==o.data.pubkey?console.debug("Skip comment received by WS (already in pending)"):((t=new b(e._id,e._source)).addOnRemoveListener(c),t.isnew=!0,t.html=i.util.parseAsHtml(t.message),a.mapById[e._id]=t,r.raw.refreshTreeLinks(a).then((function(){return s.extend(t,"issuer")})).then((function(){a.result.push(t)}))))}))}))}))},r.raw.save=function(e,n,t){(n=n||{}).result=n.result||[],n.mapById=n.mapById||{},n.pendings=n.pendings||{};var a,s=t.id,l={creationTime:s?t.creationTime||t.time:moment().utc().unix(),message:t.message,record:e,issuer:o.data.pubkey};return t.reply_to||t.parent?l.reply_to=t.reply_to||t.parent.id:l.reply_to=null,s?(a=n.mapById[s]).copy(t):((a=new b(null,l)).addOnRemoveListener(r.raw.createOnDeleteListener(n)),a.name=o.data.name,a.avatar=o.data.avatar,a.isnew=!0,t.parent&&t.parent.addReply(a),n.result.push(a)),a.html=i.util.parseAsHtml(a.message),s?r.raw.update(l,{id:s}).then((function(){return a})):(n.pendings=n.pendings||{},n.pendings[l.creationTime]=l,r.raw.add(l).then((function(e){return a.id=e,n.mapById[e]=a,delete n.pendings[l.creationTime],a})))},r.raw.stopListenChanges=function(e){console.debug("[ES] [comment] Stopping websocket on comments"),_.forEach(e.result,(function(e){e.cleanAllListeners()})),r.raw.wsChanges().close()},r.load=r.raw.loadDataByRecordId,r.save=r.raw.save,r.changes={start:r.raw.startListenChanges,stop:r.raw.stopListenChanges},r}}}]),angular.module("cesium.es.http.services",["ngResource","ngApi","cesium.services","cesium.config"]).factory("esHttp",["$q","$timeout","$rootScope","$state","$sce","$translate","$window","$filter","CryptoUtils","UIUtils","csHttp","csConfig","csSettings","csCache","BMA","csWallet","csPlatform","Api",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f,h){var T=!!("true"===u.httpsMode||!0===u.httpsMode||"force"===u.httpsMode||s.location&&"https:"===s.location.protocol);function b(a,i,s,b){var v,O,R=this,I={ES_USER_API:"GCHANGE_API",ES_SUBSCRIPTION_API:"GCHANGE_SUBSCRIPTION_API",ES_USER_API_ENDPOINT:"GCHANGE_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))",ANY_API_ENDPOINT:"([A-Z_]+)(?:[ ]+([a-z_][a-z0-9-_.ğĞ]*))?(?:[ ]+([0-9.]+))?(?:[ ]+([0-9a-f:]+))?(?:[ ]+([0-9]+))(?:\\/[^\\/]+)?",MAX_UPLOAD_BODY_SIZE:u.plugins&&u.plugins.es&&u.plugins.es.maxUploadBodySize||2097152,GCHANGE_API:"GCHANGE_API",like:{KINDS:["VIEW","LIKE","DISLIKE","FOLLOW","ABUSE","STAR"]}},N={IMAGE_SRC:y("data:([A-Za-z//]+);base64,(.+)"),URL:k("(www\\.|https?://(www\\.)?)[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)"),HASH_TAG:k("(?:^|[\t\n\rs ])#([0-9_-\\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+)"),USER_TAG:k("(?:^|[\t\n\rs ])@("+E.constants.regexp.USER_ID+")"),ES_USER_API_ENDPOINT:y(I.ES_USER_API_ENDPOINT),API_ENDPOINT:y(I.ANY_API_ENDPOINT)},S=0,A=r("truncUrl");function D(e,n,t,a){!e&&p.data&&(e=e||(p.data.plugins&&p.data.plugins.es?p.data.plugins.es.host:null),n=n||(e?p.data.plugins.es.port:null),t=angular.isDefined(t)?t:443==n||p.data.plugins.es.useSsl||T),R.alive=!1,R.host=e,R.port=n||(t||T?443:80),R.useSsl=angular.isDefined(t)?t:443==R.port||T,R.server=d.getServer(e,n)}function C(e){if(!(e=e||p.data).plugins||!e.plugins.es)return!1;var n=e.plugins.es.host,t=443==e.plugins.es.port||e.plugins.es.useSsl||T;return L(n,e.plugins.es.port||(t?443:80),t)}function L(e,n,t){return R.host===e&&R.port===n&&(angular.isUndefined(t)||t==R.useSsl)}function P(e){R.data.isFallback=e}function y(e){return new RegExp("^"+e+"$")}function k(e){return new RegExp(e)}function M(n,t){return t=t||e.defer(),R.data.isFallback&&R.started&&R.stop(),R.data.isFallback=!1,O=null,t.resolve(n),t.promise}function w(e,n){for(var t="@"===(n=n||"#")?N.USER_TAG:N.HASH_TAG,a=e&&t.exec(e),i=a&&[];a;){var o=a[1];_.contains(i,o)||i.push(o),a=(e=e.substr(a.index+a[1].length+1)).length>0&&t.exec(e)}return i}function U(e){return e?e.replace(/</g,"<").replace(/>/g,">"):e}R.data={isFallback:!1},R.cache={getByPath:{},postByPath:{},wsByPath:{}},R.api=new h(this,"esHttp"),R.started=!1,R.init=D,D(a,i,s),R.useCache=!!angular.isDefined(b)&&b,R.cleanCache=function(){console.debug("[ES] [http] Cleaning requests cache..."),_.keys(R.cache.wsByPath).forEach((function(e){R.cache.wsByPath[e].close()})),R.cache={getByPath:{},postByPath:{},wsByPath:{}},m.clear("esHttp-")},R.copy=function(e){return R.started&&R.stop(),R.init(e.host,e.port,e.useSsl||443==e.port),R.data.isTemporary=!1,R.start(!0)},R.date={now:d.date.now},R.byteCount=function(e){return e="string"==typeof e?e:JSON.stringify(e),encodeURI(e).split(/%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./).length-1},R.getUrl=function(e){return d.getUrl(R.host,R.port,e,R.useSsl)},R.get=function(n,t){t=R.useCache&&t;var a=n+(t?"#"+t:""),i=function(o){if(!R.started)return R._startPromise||console.warn("[ES] [http] Trying to get [{0}] before start(). Waiting...".format(n)),R.ready().then((function(n){return n?i(o):e.reject("ERROR.ES_CONNECTION_ERROR")}));var s=R.cache.getByPath[a];return s||(s=t?d.getWithCache(R.host,R.port,n,R.useSsl,t,null,null,"esHttp-"):d.get(R.host,R.port,n,R.useSsl),R.cache.getByPath[a]=s),s(o)};return i},R.post=function(n){var t=function(a,i){if(!R.started)return R._startPromise||console.error("[ES] [http] Trying to post [{0}] before start()...".format(n)),R.ready().then((function(n){return n?t(a,i):e.reject("ERROR.ES_CONNECTION_ERROR")}));var o=R.cache.postByPath[n];return o||(o=d.post(R.host,R.port,n,R.useSsl),R.cache.postByPath[n]=o),o(a,i)};return t},R.ws=function(e){return function(){var n=R.cache.wsByPath[e];return n&&!n.isClosed()||((n=d.ws(R.host,R.port,e,R.useSsl)).onclose=function(){delete R.cache.wsByPath[e]},R.cache.wsByPath[e]=n),n}},R.wsChanges=function(e){var n=R.ws("/ws/_changes")();if(!e)return n;var t=n.open;return n.open=function(){return t.call(n).then((function(n){n?n.send(e):console.warn("Trying to access ws changes, but no sock anymore... already open ?")}))},n},R.isAlive=function(){return d.get(R.host,R.port,"/node/summary",R.useSsl)().then((function(e){var n=e&&e.duniter&&e.duniter.software||"unknown";return"gchange-pod"===n||"cesium-plus-pod"===n||(console.error("[ES] [http] Not a Gchange Pod, but a {0} node. Please check '/summary/node'".format(n)),!1)})).catch((function(){return!1}))},R.checkNodeAlive=function(e){if(e)return P(!C()),!0;if(angular.isUndefined(e))return R.isAlive().then(R.checkNodeAlive);var n=p.data.plugins&&p.data.plugins.es||{};O=O||{host:n.host,port:n.port};var t=n.fallbackNodes&&S<n.fallbackNodes.length&&n.fallbackNodes[S++];if(!t)return o("ERROR.ES_CONNECTION_ERROR",{server:R.server}).then(c.alert.info),!1;var a=d.getServer(t.host,t.port);return c.loading.hide(),o("CONFIRM.ES_USE_FALLBACK_NODE",{old:R.server,new:a}).then(c.alert.confirm).then((function(e){return!!e&&(R.cleanCache(),R.init(t.host,t.port,t.useSsl||443==t.port),R.isAlive().then(R.checkNodeAlive))}))},R.isStarted=function(){return R.started},R.ready=function(){return R.started?e.when(!0):R._startPromise||R.start()},R.start=function(n){return R._startPromise?R._startPromise:R.started?e.when(R.alive):(R._startPromise=f.ready().then((function(){n||R.init()})).then((function(){console.debug("[ES] [http] Starting on [{0}]{1}...".format(R.server,R.useSsl?" (SSL on)":""));var e=Date.now();return R.checkNodeAlive().then((function(n){return R.alive=n,n?(v=[p.api.data.on.reset(t,M,R)],console.debug("[ES] [http] Started in "+(Date.now()-e)+"ms"),R.api.node.raise.start(),R.started=!0,delete R._startPromise,S=0,!0):(console.error("[ES] [http] Could not start [{0}]: node unreachable".format(R.server)),R.started=!0,delete R._startPromise,S=0,!1)}))})),R._startPromise)},R.stop=function(){return console.debug("[ES] [http] Stopping..."),_.forEach(v,(function(e){e()})),v=[],P(!1),delete R._startPromise,R.alive?(R.cleanCache(),R.alive=!1,R.started=!1,R.api.node.raise.stop()):R.started=!1,e.when()},R.restart=function(){return R.stop(),n(R.start,200)},R.image={},R.image.fromHit=function(e,n){if(e&&e._source){var t=e._source[n];if(t&&t._content_type&&t._content_type.startsWith("image/")){var a={};if(t._content)a.src="data:"+t._content_type+";base64,"+t._content;else{var i=t._content_type.substr(6),o=[e._index,e._type,e._id,"_image",n].join("/");o="/"+o+"."+i,a.src=R.getUrl(o)}
|
||
return t._title&&(a.title=t._title),t._name&&(a.name=t._name),a}}},R.api.registerEvent("node","start"),R.api.registerEvent("node","stop");var x={getServer:d.getServer,node:{summary:R.get("/node/summary"),parseEndPoint:function(e){var n=N.API_ENDPOINT.exec(e);if(n)return{api:n[1]||"",dns:n[2]||"",ipv4:n[3]||"",ipv6:n[4]||"",port:n[5]||80,path:n[6]||"",useSsl:443==n[5]}},same:L,sameAsSettings:C,isFallback:function(){return R.data.isFallback}},websocket:{changes:R.wsChanges,block:R.ws("/ws/block"),peer:R.ws("/ws/peer")},wot:{member:{uids:R.get("/wot/members")}},network:{peering:{self:R.get("/network/peering")},peers:R.get("/network/peers")},record:{post:function(n,t){t=t||{};var a=R.post(n);return function(n,i){if(!g.isLogin())return e.reject("Wallet must be login before sending record to ES node");t.creationTime&&!n.creationTime&&(n.creationTime=moment().utc().unix());var o=moment().utc().unix();n.time=!n.time||n.time<o?o:n.time+1;var s=g.data.keypair,r=angular.copy(n);delete r.signature,delete r.hash,r.issuer=g.data.pubkey,r.version||(r.version=2),t.tagFields&&function(e,n){n=n||["title","description"],e.tags=n.reduce((function(n,t){var a=e[t],i=a&&w(a);return i?n.concat(i):n}),[])}(r,t.tagFields);var c=JSON.stringify(r);return l.util.hash(c).then((function(e){return l.sign(e,s).then((function(n){return c='{"hash":"{0}","signature":"{1}",'.format(e,n)+c.substring(1),a(c,i).then((function(e){return m.clear("esHttp-"),e})).catch((function(e){var n=R.byteCount(r);if(n>I.MAX_UPLOAD_BODY_SIZE)throw{message:"ERROR.ES_MAX_UPLOAD_BODY_SIZE",length:n};throw e}))}))}))}},remove:function(n,t){return function(a){if(!g.isLogin())return e.reject("Wallet must be login before sending record to ES node");var i={version:2,index:n,type:t,id:a,issuer:g.data.pubkey,time:moment().utc().unix()},o=JSON.stringify(i);return l.util.hash(o).then((function(e){return l.sign(e,g.data.keypair).then((function(n){return o='{"hash":"{0}","signature":"{1}",'.format(e,n)+o.substring(1),R.post("/history/delete")(o).then((function(e){return e}))}))}))}},count:function(e,n,t){var a=R.get("/{0}/{1}/_search?size=0".format(e,n),t);return function(e){return a(e).then((function(e){return e&&e.hits&&e.hits.total}))}}},image:{fromAttachment:function(e){if(!e||!e._content_type||!e._content||0===e._content.length)return null;var n={src:"data:"+e._content_type+";base64,"+e._content};return e._title&&(n.title=e._title),e._name&&(n.name=e._name),n},toAttachment:function(e){if(!e||!e.src)return null;var n=N.IMAGE_SRC.exec(e.src);if(!n)return null;var t={_content_type:n[1],_content:n[2]};return e.title&&(t._title=e.title),e.name&&(t._name=e.name),t}},hit:{empty:function(){return{_id:null,_index:null,_type:null,_version:null,_source:{}}}},util:{parseTags:w,parseAsHtml:function(e,n){var t=e?U(e.trim()):void 0;if(t){(n=n||{}).tagState=n.tagState||"app.user_lookup",n.nameState=n.nameState||"app.user_identity_name",!n.newLine&&angular.isDefined(n.newLine)||(t=t.replace(/\n/g,"<br>\n"));var a=function(e){for(var n=e&&N.URL.exec(e),t=n&&[];n;){var a=n[0];_.contains(t,a)||t.push(a),n=(e=e.substr(n.index+n[0].length+1))&&N.URL.exec(e)}return t}(t);_.forEach(a,(function(e){var n=e.startsWith("http://")||e.startsWith("https://")?e:"http://"+e,a='<a on-tap="openLink($event, \'{0}\')" href="{1}" target="_blank">{2}</a>'.format(n,n,A(e));t=t.replace(e,a)}));var i=w(t);_.forEach(i,(function(e){var a="<a ui-sref=\"{0}({hash: '{1}'})\">#{2}</a>".format(n.tagState,e,e);t=t.replace("#"+e,a)}));var o=w(t,"@");_.forEach(o,(function(e){var a="<a ui-sref=\"{0}({name: '{1}'})\">@{2}</a>".format(n.nameState,e,e);t=t.replace("@"+e,a)}));var s=function(e,n,t){for(var a=k("(?:^|[\\r\\s])("+(n=n||"##")+"([^#></]+)<br>)"),i=e&&a.exec(e),o=i&&[],s=i&&[];i;){var r=i[1];_.contains(o,r)||(o.push(r),s.push({line:r,title:i[2]})),i=(e=e.substr(i.index+i[1].length+1)).length>0&&a.exec(e)}return s}(t,"#+[ ]*");_.forEach(s,(function(e){var n=e.line.lastIndexOf("#",5)+1;t=t.replace(e.line,"<h{0}>{1}</h{2}>".format(n,e.title,n))}))}return t},escapeHtmlTags:U,findObjectInTree:function e(n,t){if(n)return n[t]?n[t]:Array.isArray(n)?n.reduce((function(n,a){return n||e(a,t)}),!1):"object"==typeof n?_.reduce(_.keys(n),(function(a,i){return a||e(n[i],t)}),!1):void 0}},cache:d.cache,constants:I};x.constants.regexp=N,angular.merge(R,x)}T&&console.debug("[ES] [https] Enable SSL (forced by config or detected in URL)");var v=new b(void 0,void 0,void 0,!0);return v.instance=function(e,n,t,a){return new b(e,n,t,a)},v.lightInstance=function(e,n,t,a){function i(t,a){return d.get(e,n,t)(a).then((function(e){return e&&e.hits&&e.hits.total}))}return n=n||80,t=angular.isDefined(t)?t:443==+n,{host:e,port:n,useSsl:t,node:{summary:d.getWithCache(e,n,"/node/summary",t,d.cache.LONG,!1,a)},network:{peering:{self:d.get(e,n,"/network/peering",t,a)},peers:d.get(e,n,"/network/peers",t,a)},blockchain:{current:d.get(e,n,"/blockchain/current?_source=number,hash,medianTime",t,a)},record:{count:function(e,n){return i("/{0}/{1}/_search?size=0".format(e,n))}},subscription:{count:function(e){return i("/subscription/record/_search?size=0&q="+_.keys(e||{}).reduce((function(n,t){return(n&&n+" AND "||"")+t+":"+e[t]}),""))}}}},v}]),angular.module("cesium.es.settings.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esSettings")}]).factory("esSettings",["$rootScope","$q","$timeout","Api","esHttp","csConfig","csSettings","CryptoUtils","Device","UIUtils","csWallet",function(e,n,t,a,i,o,s,r,l,c,d){var u,p,m={includes:["locale","useRelative","useLocalStorage","expertMode","logoutIdle"],excludes:["newIssueVersion","timeout","cacheTimeMs","time","login","build"],plugins:{es:{excludes:["enable","host","port","useSsl","fallbackNodes","minVersion","document","maxUploadBodySize","defaultCountry","market"],notifications:{}}},helptip:{excludes:["installDocUrl"]}},E=angular.merge({plugins:{es:{askEnable:!1,notifications:{readTime:!0,txSent:!0,txReceived:!0,certSent:!0,certReceived:!0},invitations:{readTime:!0},defaultCountry:void 0,enableGoogleApi:!1,googleApiKey:void 0,wot:{enableMixedSearch:!0},geoDistance:"50km"}}},{plugins:{es:{minVersion:"1.2.0",document:{index:"user",type:"profile"}}}},{plugins:{es:o.plugins&&o.plugins.es||{}}}),g=this,f=new a("esSettings"),h=!1;function T(e,t){return t=t||n.defer(),angular.merge(e,E),t.resolve(e),t.promise}function b(e,a){return a=a||n.defer(),e&&e.pubkey&&e.keypair?r.isLoaded()?(console.debug("[ES] [settings] Loading user settings..."),(i=e.pubkey,o=e.keypair,l=Date.now(),n.all([r.box.keypair.fromSignKeypair(o),g.get({id:i}).catch((function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e}))]).then((function(e){var n=e[0];if((e=e[1])&&e._source){var t=e._source;if(t.time!==s.data.time){var a=r.util.decode_base58(t.nonce);return r.box.open(t.content,a,n.boxPk,n.boxSk).then((function(e){var n=JSON.parse(e||"{}");return n.time=t.time,console.debug("[ES] [settings] Loaded user settings in "+(Date.now()-l)+"ms"),n})).catch((function(e){return console.error("[ES] [settings] Could not read stored settings: "+(e&&e.message||"decryption error")),delete s.data.time,null}))}console.debug("[ES] [settings] Loaded user settings in "+(Date.now()-l)+"ms (no update need)")}}))).then((function(e){if(e)return angular.merge(s.data,e),u=e,console.debug("[ES] [settings] Successfully load settings from ES"),O()})).then((function(){a.resolve(e)})).catch((function(e){a.reject(e)})),a.promise):(console.debug("[ES] [settings] Waiting crypto lib loading..."),t((function(){return b(e,a)}),50)):(a.resolve(),a.promise);var i,o,l}function v(e){if(!h){var a=p&&p.length>0;R();var o=g.isEnable();d.isLogin()&&(!a&&o?b(d.data):function e(a){if(!d.isLogin())return n.when();var o=function e(n,t){var a={};return t.includes&&_.forEach(_.keys(t),(function(e){"includes"!==e&&"excludes"!==e&&t.includes.push(e)})),_.forEach(_.keys(n),(function(i){t.includes&&!_.contains(t.includes,i)||t.excludes&&_.contains(t.excludes,i)||(n[i]&&"object"==typeof n[i]&&t[i]&&"object"==typeof t[i]?a[i]=e(n[i],t[i]):a[i]=n[i])})),a}(a,m);if(u&&angular.equals(o,u))return n.when();if(!r.isLoaded())return console.debug("[ES] [settings] Waiting crypto lib loading..."),t((function(){return e()}),50);var l=i.date.now();return console.debug("[ES] [settings] Saving user settings... at time "+l),n.all([r.box.keypair.fromSignKeypair(d.data.keypair),r.util.random_nonce()]).then((function(e){var n=e[0],t=e[1],i={issuer:d.data.pubkey,nonce:r.util.encode_base58(t),time:l},s=JSON.stringify(o);return r.box.pack(s,t,n.boxPk,n.boxSk).then((function(e){return i.content=e,a.time?g.update(i,{id:i.issuer}):g.add(i)}))})).then((function(){return s.data.time=l,u=o,console.debug("[ES] [settings] Saved user settings in "+(i.date.now()-l)+"ms"),O()})).catch((function(e){throw console.error(e),e}))}(e))}}function O(){return h?n.when():(h=!0,s.store().then((function(){h=!1})).catch((function(e){throw h=!1,e})))}function R(){var n=g.isEnable();return!n&&p&&p.length>0?(console.debug("[ES] [settings] Disable"),_.forEach(p,(function(e){e()})),p=[],i.stop().then((function(){f.state.raise.changed(n)}))):!n||p&&0!==p.length?void 0:i.start().then((function(t){if(t){if(console.debug("[ES] [settings] Enable"),function(){p=[s.api.data.on.reset(e,T,this),d.api.data.on.login(e,b,this)]}(),d.isLogin())return b(d.data).then((function(){f.state.raise.changed(n)}));f.state.raise.changed(n)}else console.error("[ES] node could not be started !!")}))}return g.api=f,g.get=i.get("/user/settings/:id"),g.add=i.record.post("/user/settings"),g.update=i.record.post("/user/settings/:id/_update"),g.isEnable=function(){return s.data.plugins&&s.data.plugins.es&&s.data.plugins.es.enable&&!!s.data.plugins.es.host},g.setPluginSaveSpecs=function(e,n){e&&n&&(m.plugins[e]=angular.copy(n))},f.registerEvent("state","changed"),s.ready().then((function(){return s.api.data.on.changed(e,v,this),i.api.node.on.stop(e,(function(){u=null}),this),R()})),g}]),angular.module("cesium.es.social.services",["cesium.es.crypto.services"]).factory("SocialUtils",["$filter","$q","CryptoUtils","BMA","csWallet","esCrypto",function(e,n,t,a,i,o){function s(){var s={URI:"([a-zA−Z0-9]+)://[ a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",EMAIL:"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",PHONE:"[+]?[0-9. ]{9,15}",socials:{facebook:"https?://((fb.me)|((www.)?facebook.com))",twitter:"https?://(www.)?twitter.com",googleplus:"https?://plus.google.com(/u)?",youtube:"https?://(www.)?youtube.com",github:"https?://(www.)?github.com",tumblr:"https?://(www.)?tumblr.com",snapchat:"https?://(www.)?snapchat.com",linkedin:"https?://(www.)?linkedin.com",vimeo:"https?://(www.)?vimeo.com",instagram:"https?://(www.)?instagram.com",wordpress:"https?://([a-z]+)?wordpress.com",diaspora:"https?://(www.)?((diaspora[-a-z]+)|(framasphere)).org",duniter:"duniter://[a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",bitcoin:"bitcoin://[a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+",curve25519:"curve25519://("+a.constants.regexp.PUBKEY+"):([a-zA-Z0-9]+)@([a-zA-Z0-9-_:/;*?!^\\+=@&~#|<>%.]+)"}};function r(e){return new RegExp("^"+e+"$")}function l(e){var n;if(s.URI.test(e)){var t=s.URI.exec(e)[1],a=e;if("http"==t||"https"==t){var i=e.indexOf("/",t.length+3);i>0&&(a=e.substring(0,i))}_.keys(s.socials).forEach((function(e){if(s.socials[e].test(a))return n=e,!1})),n||(n="web")}else s.EMAIL.test(e)?n="email":s.PHONE.test(e)&&(n="phone");return n||console.warn("[ES] [social] Unable to detect type of social URL: "+e),n}function c(e){if((e=e?e.trim():e)&&e.length>0)return e.startsWith("www.")&&(e="http://"+e),{type:l(e),url:e}}function d(n){if(!n||!n.length)return[];var t={};return n.forEach((function(n){if("curve25519"==n.type?(delete n.issuer,n.valid&&angular.merge(n,c(n.url))):n=c(n.url),n){var a=e("formatSlug")(n.url);t[a]=n}})),_.values(t)}return s.URI=r(s.URI),s.EMAIL=r(s.EMAIL),s.PHONE=r(s.PHONE),_.keys(s.socials).forEach((function(e){s.socials[e]=r(s.socials[e])})),{get:c,reduce:d,createForEncryption:function(e,n){return{recipient:e,type:"curve25519",url:n}},open:function e(a,r,l){if(l=l||i.data.pubkey,!t.isLoaded())return console.debug("[socials] Waiting crypto lib loading..."),$timeout((function(){return e(a,r,l)}),100);var c=_.filter(a||[],(function(e){var n=e.url&&"curve25519"==e.type&&s.socials.curve25519.exec(e.url);return!!n&&(e.recipient=n[1],e.nonce=n[2],e.url=n[3],e.issuer=r,e.valid=e.recipient===l,e.valid)}));return c.length?o.box.open(c,void 0,"issuer","url").then((function(){return d(a)})):n.when(d(a))},pack:function e(a){if(!t.isLoaded())return console.debug("[socials] Waiting crypto lib loading..."),$timeout((function(){return e(a)}),100);var i=_.filter(a||[],(function(e){return"curve25519"==e.type&&e.url&&e.recipient}));return i.length?t.util.random_nonce().then((function(e){return n.all(i.reduce((function(n,t){return n.concat(o.box.pack(t,void 0,"recipient","url",e))}),[]))})).then((function(e){return e.reduce((function(e,n){return e.concat({type:"curve25519",url:"curve25519://{0}:{1}@{2}".format(n.recipient,n.nonce,n.url)})}),[])})):n.when(a)}}}var r=s();return r.instance=s,r}]),angular.module("cesium.es.crypto.services",["ngResource","cesium.services"]).factory("esCrypto",["$q","$rootScope","CryptoUtils",function(e,n,t){function a(n){if(!n)throw new Error("Missing keypair");return n.boxPk&&n.boxSk?e.when(n):e.all([t.box.keypair.skFromSignSk(n.signSk),t.box.keypair.pkFromSignPk(n.signPk)]).then((function(e){return{boxSk:e[0],boxPk:e[1]}}))}return{box:{getKeypair:a,pack:function(n,i,o,s,r){if(!n[o=o||"recipient"])return e.reject({message:"ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY"});"string"==typeof(s=s||"content")&&(s=[s]),n=angular.copy(n);var l=t.util.decode_base58(n[o]);return e.all([a(i),t.box.keypair.pkFromSignPk(l),r?e.when(r):t.util.random_nonce()]).then((function(a){var i=a[0].boxSk,o=a[1],r=a[2];return e.all(s.reduce((function(e,a){return n[a]?e.concat(t.box.pack(n[a],r,o,i)):e}),[])).then((function(e){var a=0;return _.forEach(s,(function(t){n[t]?n[t]=e[a++]:n[t]=null})),n.nonce=t.util.encode_base58(r),n}))}))},open:function(n,i,o,s){o=o||"issuer","string"==typeof(s=s||"content")&&(s=[s]);var r=(new Date).getTime(),l={},c=[a(i)];return e.all(n.reduce((function(e,n){var a=n[o];if(!a)throw"Record has no "+o;return l[a]?res:e.concat(t.box.keypair.pkFromSignPk(t.util.decode_base58(a)).then((function(e){l[a]=e})))}),c)).then((function(a){var i=a[0];return e.all(n.reduce((function(e,n){var a=l[n[o]],r=t.util.decode_base58(n.nonce);return n.valid=!0,e.concat(s.reduce((function(e,o){return n[o]?e.concat(t.box.open(n[o],r,a,i.boxSk).then((function(e){n[o]=e})).catch((function(e){console.error(e),console.warn("[ES] [crypto] a record may have invalid cypher "+o),n.valid=!1}))):e}),[]))}),[]))})).then((function(){return console.debug("[ES] [crypto] All record decrypted in "+((new Date).getTime()-r)+"ms"),n}))}}}}]),angular.module("cesium.es.profile.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esProfile")}]).factory("esProfile",["$rootScope","$q","esHttp","SocialUtils","csWot","csWallet","csPlatform","esLike",function(e,n,t,a,i,o,s,r){var l,c=this;function d(e,n){return((n=n||{}).raw?c.raw.getAll:c.raw.get)({id:e}).then((function(i){if(i&&i.found&&i._source){var s={name:i._source.title,source:i._source};return s.name&&s.name.length,s.avatar=t.image.fromHit(i,"avatar"),n.raw||(s.description=t.util.parseAsHtml(s.source.description)),s.source.socials&&s.source.socials.length&&(s.source.socials=_.uniq(s.source.socials,!1,(function(e){return e.url}))),o.isLogin()?a.open(s.source.socials,e).then((function(){return s})):(s.source.socials=_.filter(s.source.socials,(function(e){return"curve25519"!=e.type})),s)}})).catch((function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e}))}function u(e,n,a,i){if(!n||!n.hits||!n.hits.total)return e;var o,s={};a=a||{},i=i||"pubkey",_.forEach(n.hits.hits,(function(n){var r="avatar";if("user"===n._index){if(!(o=a&&a[n._id])){var l={};l[i]=n._id,o=[l],e.push(l)}}else if("user"!==n._index){s[n._index]||(s[n._index]=!0,e.push({id:"divider-"+n._index,divider:!0,index:n._index}));var c={id:n._index+"-"+n._id,index:n._index,templateUrl:"plugins/es/templates/wot/lookup_item_{0}.html".format(n._index),state:"app.view_{0}".format(n._index),stateParams:{id:n._id,title:n._source.title},creationTime:n._source.creationTime,memberCount:n._source.memberCount,type:n._source.type};o=[c],e.push(c),r="thumbnail"}avatar=t.image.fromHit(n,r),_.forEach(o,(function(e){e.avatar=avatar,function(e,n,a){e.avatar=e.avatar||t.image.fromHit(n,"avatar"),e.name=n._source.title,e.name&&e.name.length,e.description=n._source.description||e.description,e.city=n._source.city||e.city,e.profile=e.profile||{},e.profile.issuer=n._id,e.profile.creationTime=n._source.creationTime,e.profile.time=n._source.time,n._source.pubkey&&!e.pubkey&&(e.pubkey=n._source.pubkey),n.highlight&&(n.highlight.title&&(e.name=n.highlight.title[0]),n.highlight.tags&&(e.tags=n.highlight.tags.reduce((function(e,n){return e.concat(n.replace("<em>","").replace("</em>",""))}),[])))}(e,n)}))})),_.keys(s).length&&e.splice(0,0,{id:"divider-identities",divider:!0,index:"profile"})}function p(e,n){var a={highlight:{fields:{title:{},tags:{}}},from:(n=n||{}).from||0,size:n.size||100,_source:n._source||["title","avatar._content_type","time","city","creationTime","time"]};if(e){a.query={},a.query.bool={should:[{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]};var i=e?t.util.parseTags(e):void 0;i&&a.query.bool.should.push({terms:{tags:i}})}else delete a.highlight,a.sort=n.sort||{creationTime:"desc"};return n.mixedSearch&&(console.debug("[ES] [profile] Mixed search: enable"),e&&(a.indices_boost={user:100,page:1,group:.01}),a._source=a._source.concat(["description","membersCount","type"])),(n.mixedSearch?c.raw.mixedSearch:c.raw.search)(a).then((function(e){var n=[];return u(n,e),n}))}function m(e,a,i,o){if(o=o||n.defer(),!(e||a&&a.length))return o.resolve(a),o.promise;var s;console.debug("[ES] [profile] Searching on user profiles..."),i=i||"pubkey";var r=(e=e?e.toLowerCase().trim():e)?t.util.parseTags(e):void 0,l={query:{},highlight:{fields:{title:{},tags:{}}},from:0,size:100,_source:["title","avatar._content_type","pubkey","creationTime"]};if(a.length>0){s={},_.forEach(a,(function(e){var n=e[i];if(n){var t=s[n];t?t.push(e):(t=[e],s[n]=t)}}));var d=_.keys(s);l.size=d.length<=l.size?l.size:d.length,e?(l.query.constant_score={filter:{bool:{should:[{terms:{_id:d}},{bool:{must:[{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]}}]}}},r&&l.query.constant_score.filter.bool.should.push({terms:{tags:r}})):(delete l.highlight,l.query.constant_score={filter:{terms:{_id:d}}})}else{if(!e)return o.resolve(a),o.promise;l.query.bool={should:[{match:{title:{query:e,boost:2}}},{prefix:{title:e}}]},r&&l.query.bool.should.push({terms:{tags:r}})}return(0,c.raw.search)(l).then((function(e){u(a,e,s,i),o.resolve(a)})).catch((function(e){e&&e.ucode&&404==e.ucode?o.resolve(a):o.reject(e)})),o.promise}function E(e,t){return t=t||n.defer(),e&&e.pubkey?(d(e.pubkey).then((function(n){n&&(e.name=n.name,e.avatar=n.avatar,e.profile=n.source,e.profile.description=n.description),t.resolve(e)})).catch((function(n){t.reject(e)})),t.promise):(t.resolve(),t.promise)}function g(){var n=t.alive;!n&&l&&l.length>0?(console.debug("[ES] [profile] Disable"),_.forEach(l,(function(e){e()})),l=[]):!n||l&&0!==l.length||(console.debug("[ES] [profile] Enable"),function(){l=[i.api.data.on.load(e,E,this),i.api.data.on.search(e,m,this)]}())}return c.raw={getFields:t.get("/user/profile/:id?&_source_exclude=avatar._content&_source=:fields"),get:t.get("/user/profile/:id?&_source_exclude=avatar._content"),getAll:t.get("/user/profile/:id"),search:t.post("/user/profile/_search"),mixedSearch:t.post("/user,page/profile,record/_search")},s.ready().then((function(){return t.api.node.on.start(e,g,this),t.api.node.on.stop(e,g,this),g()})),{search:function(e){return p(void 0,e)},searchText:p,getAvatarAndName:function(e){return c.raw.getFields({id:e,fields:"title,avatar._content_type,pubkey,creationTime,time"}).then((function(e){var n;return e&&e._source&&((n={name:e._source.title,pubkey:e._source.pubkey}).avatar=t.image.fromHit(e,"avatar"),n.creationTime=e._source.creationTime,n.time=e._source.time),n})).catch((function(e){if(e&&e.ucode&&404==e.ucode)return null;throw e}))},get:d,add:t.record.post("/user/profile",{tagFields:["title","description"],creationTime:!0}),update:t.record.post("/user/profile/:id/_update",{tagFields:["title","description"],creationTime:!0}),remove:t.record.remove("user","profile"),avatar:t.get("/user/profile/:id?_source=avatar"),fillAvatars:function(e,n){return m(null,e,n)},like:r.instance("user","profile")}}]),angular.module("cesium.es.notification.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esNotification")}]).factory("esNotification",["$rootScope","$q","$timeout","$translate","$state","esHttp","csConfig","csSettings","csWallet","csWot","UIUtils","BMA","CryptoUtils","csPlatform","Api",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E){var g,f={MESSAGE_CODES:["MESSAGE_RECEIVED"],INVITATION_CODES:["INVITATION_TO_CERTIFY"],DEFAULT_LOAD_SIZE:20},h={commons:["type","code","params","reference","recipient","time","hash","read_signature"]},b=this,v=new E(this,"esNotification");function O(e,n){(n=n||{}).codes=n.codes||{},n.codes.excludes=n.codes.excludes||f.EXCLUDED_CODES;var t={bool:{must:[{term:{recipient:e}}]}};if(n.codes&&n.codes.includes)t.bool.must.push({terms:{code:n.codes.includes}});else{var a=[];r.getByPath("plugins.es.notifications.txSent",!1)||a.push("TX_SENT"),r.getByPath("plugins.es.notifications.txReceived",!0)||a.push("TX_RECEIVED"),r.getByPath("plugins.es.notifications.certSent",!1)||a.push("CERT_SENT"),r.getByPath("plugins.es.notifications.certReceived",!0)||a.push("CERT_RECEIVED"),n.codes.excludes&&_.forEach(n.codes.excludes,(function(e){a.push(e)})),a.length&&(t.bool.must_not={terms:{code:a}})}return n.readTime&&t.bool.must.push({range:{time:{gt:n.readTime}}}),t}function R(e,n){var t={query:O(e,n)};return t.query.bool.must.push({missing:{field:"read_signature"}}),b.raw.postCount(t).then((function(e){return e.count}))}function I(n){if(n&&l.isLogin())if(_.contains(f.INVITATION_CODES,n.code))v.event.raise.newInvitation(n);else{if(!_.contains(f.MESSAGE_CODES,n.code)){var t=new T(n,C);return t.id=n.id||t.id,c.extendAll([t]).then((function(){e.$$phase?N(t):e.$apply((function(){N(t)}))})).then((function(){return A(t)}))}v.event.raise.newMessage(n)}}function N(e){return l.data.notifications=l.data.notifications||{},l.data.notifications.unreadCount++,v.data.raise.new(e),e}function S(e){return e?String(e).replace(/<[^>]*>/gm,"").replace(/&[^;]+;/gm,""):""}function A(t,o){n.all([a(o||"COMMON.NOTIFICATION.TITLE"),a(t.message,t)]).then((function(n){D(S(n[0]),{body:S(n[1]),icon:t.avatar&&t.avatar.src||"./img/logo.png",lang:a.use(),tag:t.id,onclick:function(){e.$applyAsync((function(){"function"==typeof t.markAsRead&&t.markAsRead(),t.state&&i.go(t.state,t.stateParams)}))}})}))}function D(e,n){if("Notification"in window)if("granted"===Notification.permission){var t=new Notification(e,n);t.onclick=n.onclick||t.onclick}else"denied"!==Notification.permission&&Notification.requestPermission((function(t){"granted"===t&&D(e,n)}))}function C(e){!e.read&&e.id&&(e.id?(e.read=!0,p.sign(e.hash,l.data.keypair).then((function(n){return b.raw.postReadById(n,{id:e.id})})).catch((function(e){console.error("[ES] [notification] Error while trying to mark event as read.",e)}))):console.error("[ES] [notification] Could not mark as read: no 'id' found!",e))}function L(e){e.notifications=e.notifications||{},e.notifications.unreadCount=null,b.raw.ws.getUserEvent().close()}function P(e,a){if(a=a||n.defer(),!e||!e.pubkey||!e.keypair)return a.resolve(),a.promise;console.debug("[ES] [notification] Loading count...");var i=Date.now();return R(e.pubkey,{readTime:r.data.wallet?r.data.wallet.notificationReadTime:0,excludeCodes:f.EXCLUDED_CODES}).then((function(n){e.notifications=e.notifications||{},e.notifications.unreadCount=n,n>0&&t((function(){A({message:"COMMON.NOTIFICATION.HAS_UNREAD",count:n,state:"app.view_notifications"},"COMMON.APP_NAME")}),500),console.debug("[ES] [notification] Loaded count ({0}) in {1}ms".format(n,Date.now()-i)),a.resolve(e)})).catch((function(e){a.reject(e)})).then((function(){console.debug("[ES] [notification] Starting listen user event...");var n=b.raw.ws.getUserEvent();return g.push(n.close),n.on(I,{pubkey:e.pubkey,locale:r.data.locale.id}).catch((function(e){console.error("[ES] [notification] Unable to listen user event",e),d.alert.error("ACCOUNT.ERROR.WS_CONNECTION_FAILED")}))})),a.promise}function y(){var n=o.alive;if(!n&&g&&g.length>0)console.debug("[ES] [notification] Disable"),_.forEach(g,(function(e){e()})),g=[],l.isLogin()&&L(l.data);else if(n&&(!g||0===g.length)&&(console.debug("[ES] [notification] Enable"),function(){g=[l.api.data.on.login(e,P,this),l.api.data.on.init(e,L,this),l.api.data.on.reset(e,L,this)]}(),l.isLogin()))return P(l.data)}return f.EXCLUDED_CODES=f.MESSAGE_CODES.concat(f.INVITATION_CODES),b.raw={postCount:o.post("/user/event/_count"),postSearch:o.post("/user/event/_search"),postReadById:o.post("/user/event/:id/_read"),ws:{getUserEvent:o.ws("/ws/event/user/:pubkey/:locale"),getChanges:o.ws("/ws/_changes")}},v.registerEvent("data","new"),v.registerEvent("event","newInvitation"),v.registerEvent("event","newMessage"),m.ready().then((function(){return o.api.node.on.start(e,y,this),o.api.node.on.stop(e,y,this),y()})),b.load=function(e,n){(n=n||{}).from=n.from||0,n.size=n.size||f.DEFAULT_LOAD_SIZE;var t={query:O(e,n),sort:[{time:{order:"desc"}}],from:n.from,size:n.size,_source:h.commons};return b.raw.postSearch(t).then((function(e){if(!e.hits||!e.hits.total)return[];var n=e.hits.hits.reduce((function(e,n){var t=new T(n._source,C);return t.id=n._id,e.concat(t)}),[]);return c.extendAll(n)}))},b.unreadCount=R,b.html5={emit:D},b.api=v,b.websocket={event:b.raw.ws.getUserEvent,change:b.raw.ws.getChanges},b.constants=f,b}]),angular.module("cesium.es.message.services",["ngResource","cesium.services","cesium.crypto.services","cesium.wot.services","cesium.es.http.services","cesium.es.wallet.services","cesium.es.notification.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esMessage")}]).factory("esMessage",["$q","$rootScope","$timeout","UIUtils","Api","CryptoUtils","csPlatform","csConfig","csSettings","esHttp","csWallet","esWallet","csWot","esNotification",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m){var E,g={commons:["issuer","recipient","title","content","time","nonce","read_signature"],notifications:["issuer","time","hash","read_signature"]},f={postSearch:c.post("/message/inbox/_search"),postSearchByType:c.post("/message/:type/_search"),getByTypeAndId:c.get("/message/:type/:id"),postReadById:c.post("/message/inbox/:id/_read")},h=new i(this,"esMessage");function b(e){e.messages=e.messages||{},e.messages.unreadCount=null}function v(e){e.messages&&delete e.messages}function O(n,t){if(t=t||e.defer(),!n||!n.pubkey)return t.resolve(),t.promise;console.debug("[ES] [message] Loading count...");var a=(new Date).getTime();return function(e){if(!(e=e||(d.isLogin()?d.data.pubkey:e)))throw new Error("no pubkey, and user not connected.");var n={query:{bool:{must:[{term:{recipient:e}},{missing:{field:"read_signature"}}]}}};return c.post("/message/inbox/_count")(n).then((function(e){return e.count}))}(n.pubkey).then((function(e){n.messages=n.messages||{},n.messages.unreadCount=e,console.debug("[ES] [message] Loaded count ("+e+") in "+((new Date).getTime()-a)+"ms"),t.resolve(n)})).catch((function(e){console.error("Error chile counting message: "+(e.message?e.message:e)),t.resolve(n)})),t.promise}function R(e){console.debug("[ES] [message] detected new message (from notification service)");var n=new T(e);n.issuer=n.pubkey,delete n.pubkey,p.extend(n,"issuer").then((function(){d.data.messages=d.data.messages||{},d.data.messages.unreadCount++,h.data.raise.new(n)}))}function I(e,n,t,a){return t=t||"/message/inbox",u.box.record.pack(e,n,a,["title","content"]).then((function(e){return c.record.post(t)(e)}))}function N(n,t){if(n=n||d.data.pubkey,!d.isLogin())return e.when([]);(t=t||{}).type=t.type||"inbox",t.from=t.from||0,t.size=t.size||1e3,t._source=t._source||g.commons;var a={sort:{time:"desc"},from:t.from,size:t.size,_source:t._source};return"inbox"==t.type?a.query={bool:{filter:{term:{recipient:n}}}}:a.query={bool:{filter:{term:{issuer:n}}}},f.postSearchByType(a,{type:t.type}).then((function(e){if(!e||!e.hits||!e.hits.total)return[];var n=e.hits.hits.reduce((function(e,n){var a=n._source||{};return a.id=n._id,a.read="outbox"==t.type||!!a.read_signature,delete a.read_signature,e.concat(a)}),[]);return console.debug("[ES] [message] Loading {0} {1} messages".format(n.length,t.type)),n}))}function S(n,t,a){var i=(new Date).getTime(),s={},r=[u.box.getKeypair(t)];return e.all(n.reduce((function(e,n){return s[n.issuer]?res:e.concat(o.box.keypair.pkFromSignPk(o.util.decode_base58(n.issuer)).then((function(e){s[n.issuer]=e})))}),r)).then((function(t){var i=t[0];return e.all(n.reduce((function(e,n){var t=s[n.issuer],r=o.util.decode_base58(n.nonce);return n.valid=!0,e.concat(o.box.open(n.title,r,t,i.boxSk).then((function(e){n.title=e})).catch((function(e){console.error(e),console.warn("[ES] [message] may have invalid cypher title"),n.valid=!1})),o.box.open(n.content,r,t,i.boxSk).then((function(e){n.content=e,a?function(e){e.content&&(e.summary=e.content.replace(/(^|[\n\r]+)\s*>[^\n\r]*/g,"").trim(),e.summary.length>140&&(e.summary=e.summary.substr(0,137)+"..."))}(n):e&&(n.html=c.util.parseAsHtml(e))})).catch((function(e){console.error(e),console.warn("[ES] [message] may have invalid cypher content"),n.valid=!1})))}),[]))})).then((function(){return console.debug("[ES] [message] All messages decrypted in "+((new Date).getTime()-i)+"ms"),n}))}function A(n){var t=r.developers||[{pubkey:"38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE"}];n&&n.content&&t&&t.length&&(console.info("[ES] [message] Sending logs to developers..."),n.issuer=d.data.pubkey,n.title=n.title||"Sending log",n.time=c.date.now(),d.getKeypair().then((function(a){return e.all(t.reduce((function(e,t){return t.pubkey?e.concat(I(angular.merge({recipient:t.pubkey},n),a)):e}),[]))})).then((function(e){console.info("[ES] [message] Logs sent to {0} developers".format(e.length))})))}function D(){var e=c.alive;!e&&E&&E.length>0?(console.debug("[ES] [message] Disable"),_.forEach(E,(function(e){e()})),E=[],d.isLogin()&&v(d.data)):!e||E&&0!==E.length||(console.debug("[ES] [message] Enable"),function(){E=[d.api.data.on.login(n,O,this),d.api.data.on.init(n,b,this),d.api.data.on.reset(n,v,this),m.api.event.on.newMessage(n,R,this),d.api.error.on.send(n,A,this)]}(),d.isLogin()&&O(d.data))}return h.registerEvent("data","new"),h.registerEvent("data","delete"),h.registerEvent("data","sent"),s.ready().then((function(){return c.api.node.on.start(n,D,this),c.api.node.on.stop(n,D,this),D()})),{api:h,search:f.postSearch,notifications:{load:function(n){if(!d.isLogin())return e.when([]);(n=n||{}).from=n.from||0,n.size=n.size||10;var t={sort:{time:"desc"},query:{bool:{filter:{term:{recipient:d.data.pubkey}}}},from:n.from,size:n.size,_source:g.notifications};return f.postSearch(t).then((function(e){if(!e||!e.hits||!e.hits.total)return[];var n=e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,t.read=!!t.read_signature,delete t.read_signature,e.concat(t)}),[]);return p.extendAll(n,"issuer")}))}},load:function(n){return d.isLogin()?((n=n||{}).type=n.type||"inbox",n._source=g.commons,n.summary=!angular.isDefined(n.summary)||n.summary,N(d.data.pubkey,n).then((function(e){return S(e,d.data.keypair,n.summary)})).then((function(e){var t="inbox"==n.type?"issuer":"recipient";return p.extendAll(e,t)})).then((function(e){return d.data.messages=d.data.messages||{},d.data.messages.count=e.length,e}))):e.when([])},get:function(e,n){return(n=n||{}).type=n.type||"inbox",n.summary=!!angular.isDefined(n.summary)&&n.summary,f.getByTypeAndId({id:e,type:n.type}).then((function(e){if(e.found){var t=e._source;return t.id=e._id,t.read="outbox"==n.type||!!t.read_signature,delete t.read_signature,S([t],d.data.keypair,n.summary).then((function(){var e="inbox"==n.type?"issuer":"recipient";return p.extend(t,e)}))}}))},send:function(e){return d.getKeypair().then((function(n){return I(e,n).then((function(t){return l.data.plugins.es.message&&angular.isDefined(l.data.plugins.es.message.outbox)&&!l.data.plugins.es.message.outbox?t:I(e,n,"/message/outbox","issuer").catch((function(e){return console.error("Failed to store message to outbox: "+e),t}))})).then((function(e){return h.data.raise.sent(e),e}))}))},remove:function(e,n){return n=n||"inbox",c.record.remove("message",n)(e).then((function(t){return"inbox"==n&&(d.data.messages=d.data.messages||{},d.data.messages.count=d.data.messages.count>0?d.data.messages.count-1:0),h.data.raise.delete(e),t}))},removeAll:function(n){return n=n||"inbox",N(d.data.pubkey,{type:n,from:0,size:1e3,_source:!1}).then((function(t){if(t&&t.length){var a=_.pluck(t,"id");return e.all(t.reduce((function(e,t){return e.concat(c.record.remove("message",n)(t.id))}),[])).then((function(){return a}))}})).then((function(e){"inbox"==n&&(d.data.messages=d.data.messages||{},d.data.messages.count=0,d.data.messages.unreadCount=0),_.forEach(e,h.data.raise.delete)}))},markAsRead:function(n,t){if(t=t||"inbox",n.read){var a=e.defer();return a.resolve(),a.promise}return n.read=!0,d.getKeypair().then((function(e){return o.sign(n.hash,e)})).then((function(e){return f.postReadById(e,{id:n.id})})).then((function(){"inbox"==t&&(d.data.messages=d.data.messages||{},d.data.messages.unreadCount=d.data.messages.unreadCount?d.data.messages.unreadCount-1:0)}))},markAllAsRead:function(){return N(d.data.pubkey,{type:"inbox",from:0,size:1e3,_source:["hash","read_signature"]}).then((function(n){if(n&&n.length)return n=_.filter(n,{read:!1}),e.all(n.reduce((function(e,n){return e.concat(o.sign(n.hash,d.data.keypair).then((function(e){return f.postReadById(e,{id:n.id})})))}),[]))})).then((function(){d.data.messages=d.data.messages||{},d.data.messages.unreadCount=0}))},fields:{commons:g.commons}}}]),angular.module("cesium.es.modal.services",["cesium.modal.services","cesium.es.message.services"]).factory("esModals",["$state","ModalUtils","UIUtils","csWallet",function(e,n,t,a){function i(){if(a.data.notifications.unreadCount=0,a.data.notifications&&a.data.notifications.history.length){var e=a.data.notifications.history[0],n=e?e.time:0;csSettings.data.wallet=csSettings.data.wallet||{},n&&csSettings.data.wallet.notificationReadTime!=n&&(csSettings.data.wallet.notificationReadTime=n,csSettings.store())}}return{showMessageCompose:function(e){return n.show("plugins/es/templates/message/modal_compose.html","ESMessageComposeModalCtrl",e,{focusFirstInput:!0})},showNotifications:function(n,a){return t.popover.show(a,{templateUrl:"plugins/es/templates/common/popover_notification.html",scope:n,autoremove:!1,afterHidden:i}).then((function(n){n&&(n.onRead&&"function"==typeof n.onRead&&n.onRead(),n.state&&e.go(n.state,n.stateParams))}))},showNewInvitation:function(e){return n.show("plugins/es/templates/invitation/modal_new_invitation.html","ESNewInvitationModalCtrl",e)},showNewPage:function(t){return n.show("plugins/es/templates/registry/modal_record_type.html",void 0,{title:"REGISTRY.EDIT.TITLE_NEW"}).then((function(n){n&&e.go("app.registry_add_record",{type:n})}))},showNetworkLookup:function(e){return n.show("plugins/es/templates/network/modal_network.html","ESNetworkLookupModalCtrl",e,{focusFirstInput:!1})}}}]),angular.module("cesium.es.wallet.services",["ngResource","cesium.platform","cesium.es.http.services","cesium.es.crypto.services"]).factory("esWallet",["$q","$rootScope","$timeout","CryptoUtils","csPlatform","csWallet","esCrypto","esProfile","esHttp",function(e,n,t,a,i,o,s,r,l){var c;function d(e){e.avatar=null,e.profile=null,e.name=null,o.events.cleanByContext("esWallet"),e.keypair&&(delete e.keypair.boxSk,delete e.keypair.boxPk)}function u(n,i){if(i=i||e.defer(),!n||!n.pubkey||!n.keypair)return i.resolve(),i.promise;if(!a.isLoaded())return console.debug("[ES] [wallet] Waiting crypto lib loading..."),t((function(){return u(n,i)}),50);console.debug("[ES] [wallet] Loading user avatar+name...");var o=Date.now();return r.getAvatarAndName(n.pubkey).then((function(e){e?(n.name=e.name,n.avatarStyle=e.avatarStyle,n.avatar=e.avatar,console.debug("[ES] [wallet] Loaded user avatar+name in "+(Date.now()-o)+"ms")):console.debug("[ES] [wallet] No user avatar+name found"),i.resolve(n)})).catch((function(e){i.reject(e)})),i.promise}function p(n,t){t=t||e.defer(),o.events.cleanByContext("esWallet"),console.debug("[ES] [wallet] Loading full user profile...");var a=Date.now();return r.get(n.pubkey).then((function(e){e&&(n.name=e.name,n.avatar=e.avatar,n.profile=e.source,n.profile.description=e.description,console.debug("[ES] [wallet] Loaded full user profile in "+(Date.now()-a)+"ms")),t.resolve()})).catch(t.reject),t.promise}function m(){if(!o.isLogin())throw new Error("Unable to get box keypair: user not connected !");var n=o.data.keypair;return n&&n.boxPk&&n.boxSk?e.when(n):s.box.getKeypair(n).then((function(e){return o.data.keypair.boxSk=e.boxSk,o.data.keypair.boxPk=e.boxPk,console.debug("[ES] [wallet] Secret box keypair successfully computed"),o.data.keypair}))}function E(){var e=l.alive;if(!e&&c&&c.length>0){if(console.debug("[ES] [wallet] Disable"),_.forEach(c,(function(e){e()})),c=[],o.isLogin())return d(o.data)}else if(e&&(!c||0===c.length)&&(console.debug("[ES] [wallet] Enable"),function(){c=[o.api.data.on.login(n,u,this),o.api.data.on.finishLoad(n,p,this),o.api.data.on.init(n,d,this),o.api.data.on.reset(n,d,this)]}(),o.isLogin()))return u(o.data)}return i.ready().then((function(){return l.api.node.on.start(n,E,this),l.api.node.on.stop(n,E,this),E()})),this.box={getKeypair:m,record:{pack:function(e,n,t,a,i){return m().then((function(n){return s.box.pack(e,n,t,a,i)}))},open:function(e,n,t,a){return m().then((function(n){return s.box.open(e,n,t,a)}))}}},this}]),angular.module("cesium.es.geo.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esGeo")}]).factory("esGeo",["$rootScope","$q","csConfig","csSettings","csHttp",function(e,n,t,a,i){var o=this;function s(e){return o.raw.google.search({address:e,key:o.raw.google.apiKey}).then((function(e){if(e&&e.results&&e.results.length)return e.results.reduce((function(e,n){return e.concat({display_name:n.address_components&&n.address_components.reduce((function(e,n){return n.long_name?e.concat(n.long_name):e}),[]).join(", "),lat:n.geometry&&n.geometry.location&&n.geometry.location.lat,lon:n.geometry&&n.geometry.location&&n.geometry.location.lng})}),[])}))}o.raw={osm:{search:i.get("nominatim.openstreetmap.org",443,"/search.php?format=json"),license:{name:"OpenStreetMap",url:"https://www.openstreetmap.org/copyright"}},google:{apiKey:void 0,search:i.get("maps.google.com",443,"/maps/api/geocode/json")},searchByIP:i.get("freegeoip.net",443,"/json/:ip")},o.raw.google.apiKey=t.plugins&&t.plugins.es&&t.plugins.es.googleApiKey;var r=!!o.raw.google.apiKey;return a.ready().then((function(){function n(e){r||(o.raw.google.apiKey=e.plugins.es.googleApiKey),o.raw.google.enable=o.raw.google.apiKey&&e.plugins&&e.plugins.es&&e.plugins.es.enableGoogleApi}a.api.data.on.changed(e,n,this),n(a.data)})),{point:{current:function(){return navigator.geolocation?n((function(e,n){console.debug("[ES] [geo] Getting current GPS position..."),navigator.geolocation.getCurrentPosition((function(t){if(!t||!t.coords)return console.error("[ES] [geo] navigator geolocation > Unknown format:",t),void n({message:"navigator geolocation > Unknown format"});e({lat:t.coords.latitude,lon:t.coords.longitude})}),(function(e){n(e)}),{timeout:5e3})})):n.reject()},searchByAddress:function(e){"string"==typeof e&&(e={q:e}),e.q&&(e.q=e.q.trim().replace(/\n/g,",").replace(/(?:^|[\t\n\r\s ])([A−Z09-]+)(?:$|[\t\n\r\s ])/g,"").replace(/,[ ,]+/g,", ")),e.addressdetails=1;var n=new Date;return o.raw.osm.search(e).then((function(e){if(e)return e=e.reduce((function(e,n){return"waterway"!=n.class&&"railway"!=n.class&&n.address?(n.address.city=n.address.city||n.address.village||n.address.town||n.address.postcode,n.address.road=n.address.road||n.address.suburb||n.address.hamlet,n.address.postcode&&n.address.city==n.address.postcode&&delete n.address.postcode,n.address.city?e.concat({id:n.place_id,name:n.display_name,address:n.address,lat:n.lat,lon:n.lon,class:n.class,license:o.raw.osm.license}):e):e}),[]),console.debug("[ES] [geo] Found {0} address position(s)".format(e&&e.length||0,(new Date).getTime()-n.getTime()),e),e.length?e:void 0})).catch((function(n){return t=n,a=e.q?e.q:(e.street?e.street+", ":"")+e.city+(e.country?", "+e.country:""),console.debug("[ES] [geo] Search position failed on [OSM]. Trying [google] service"),s(a).catch((function(e){throw console.debug("[ES] [geo] Search position failed on [google] service"),t||e}));var t,a}))},searchByIP:function(e){return o.raw.searchByIP({ip:e}).then((function(e){return e?{lat:e.latitude,lng:e.longitude}:void 0}))},distance:function(e,n,t,a,i){var o=Math.PI*e/180,s=Math.PI*t/180,r=n-a,l=Math.PI*r/180,c=Math.sin(o)*Math.sin(s)+Math.cos(o)*Math.cos(s)*Math.cos(l);return c=60*(c=180*(c=Math.acos(c))/Math.PI)*1.1515,"km"==i?1.609344*c:"N"==i?.8684*c:c}},google:{isEnable:function(){return o.raw.google.enable&&o.raw.google.apiKey},searchByAddress:s}}}]),angular.module("cesium.es.subscription.services",["cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esSubscription")}]).factory("esSubscription",["$rootScope","$q","$timeout","esHttp","$state","$sce","$sanitize","esSettings","CryptoUtils","UIUtils","csWallet","csWot","BMA","csPlatform","esWallet",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E){var g,f=this;function h(e){e.subscriptions=null}function T(e,t,a){return a=a||n.defer(),e&&e.pubkey&&e.keypair?(console.debug("[ES] [subscription] Loading subscriptions count..."),f.raw.count({pubkey:e.pubkey}).then((function(n){e.subscriptions=e.subscriptions||{},e.subscriptions.count=n&&n.hits&&n.hits.total,console.debug("[ES] [subscription] Loaded count ("+e.subscriptions.count+")"),a.resolve(e)})).catch((function(n){console.error("[ES] [subscription] Error while counting subscription: "+(n.message?n.message:n)),a.resolve(e)})),a.promise):(a.resolve(),a.promise)}function b(){var n=a.alive;if(!n&&g&&g.length>0){if(console.debug("[ES] [subscription] Disable"),_.forEach(g,(function(e){e()})),g=[],d.isLogin())return h(d.data)}else if(n&&(!g||0===g.length)&&(console.debug("[ES] [subscription] Enable"),function(){g=[d.api.data.on.load(e,T,this),d.api.data.on.init(e,h,this),d.api.data.on.reset(e,h,this)]}(),d.isLogin()))return T(d.data)}return f.raw={getAll:a.get("/subscription/record/_search?_source_excludes=recipientContent&q=issuer::issuer"),count:a.get("/subscription/record/_search?size=0&q=issuer::pubkey"),add:a.record.post("/subscription/record"),update:a.record.post("/subscription/record/:id/_update"),category:{get:a.get("/subscription/category/:id"),all:a.get("/subscription/category/_search?sort=order&from=0&size=1000&_source=name,parent,key")}},m.ready().then((function(){return a.api.node.on.start(e,b,this),a.api.node.on.stop(e,b,this),b()})),f.record={load:function(e,n){return f.raw.getAll({issuer:e}).then((function(e){var t=e&&e.hits&&e.hits.total&&e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,e.concat(t)}),[])||[];return E.box.record.open(t,n,"issuer","issuerContent").then((function(e){return _.forEach(e,(function(e){e.content=JSON.parse(e.issuerContent||"{}"),delete e.issuerContent,delete e.recipientContent})),e}))}))},add:function(e){if(!(e&&e.type&&e.content&&e.recipient))return n.reject("Missing arguments 'record' or 'record.type' or 'record.content' or 'record.recipient'");var t=d.data.pubkey,a=JSON.stringify(e.content);return l.util.random_nonce().then((function(i){return n.all([E.box.record.pack({issuer:t,issuerContent:a},d.data.keypair,"issuer","issuerContent",i),E.box.record.pack({recipient:e.recipient,recipientContent:a},d.data.keypair,"recipient","recipientContent",i)])})).then((function(n){var t=angular.merge(n[0],n[1]);return t.type=e.type,f.raw.add(t).then((function(n){return e.id=n,e}))}))},update:function(e){if(!e||!e.content||!e.recipient)return n.reject("Missing arguments 'record' or 'record.content', or 'record.recipient'");var t=d.data.pubkey,a=JSON.stringify(e.content);return l.util.random_nonce().then((function(i){return n.all([E.box.record.pack({issuer:t,issuerContent:a},d.data.keypair,"issuer","issuerContent",i),E.box.record.pack({recipient:e.recipient,recipientContent:a},d.data.keypair,"recipient","recipientContent",i)])})).then((function(n){var t=angular.merge(n[0],n[1]);return t.type=e.type,f.raw.update(t,{id:e.id}).then((function(){return e}))}))},remove:a.record.remove("subscription","record")},f.category={all:function(){if(f.raw.categories&&f.raw.categories.length){var e=n.defer();return e.resolve(f.raw.categories),e.promise}return f.raw.category.all().then((function(e){if(0===e.hits.total)f.raw.categories=[];else{var n=e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,e.concat(t)}),[]);_.forEach(n,(function(e){n[e.id]=e})),f.raw.categories=n}return f.raw.categories}))},get:function(e){return f.raw.category.get(e).then((function(e){var n=e._source;return n.id=e._id,n}))}},f.constants={},f}]),angular.module("cesium.es.document.services",["ngResource","cesium.platform","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esDocument")}]).factory("esDocument",["$q","$rootScope","$timeout","UIUtils","Api","CryptoUtils","csPlatform","csConfig","csSettings","csWot","csWallet","esHttp",function(e,n,t,a,i,o,s,r,l,c,d,u){var p={commons:["issuer","pubkey","hash","time","recipient","nonce","read_signature"],peer:["*"],movement:["*"]},m={search:u.post("/:index/:type/_search"),searchText:u.get("/:index/:type/_search?q=:text&_source=:source")};function E(e){if(!e||!e.index||!e.type)throw new Error("Missing mandatory options [index, type]");var n="desc";return"peer"==e.type?(e.sort&&!e.sort.time||(n=e.sort&&e.sort.time||n,e.sort={"stats.medianTime":{nested_path:"stats",order:n}}),e._source=p.peer,e.getTimeFunction=function(e){return e.time=e.stats&&e.stats.medianTime,e.time}):"movement"==e.type&&(e.sort&&!e.sort.time||(n=e.sort&&e.sort.time||n,e.sort={medianTime:n}),e._source=e._source||p.movement,e.getTimeFunction=function(e){return e.time=e.medianTime,e.time}),e}function g(e,n){n.issuerField=n.issuerField||"pubkey";var t=(e&&e.hits&&e.hits.hits||[]).reduce((function(e,t){var a=t._source||{};return a.index=t._index,a.type=t._type,a.id=t._id,a.pubkey=a.issuer||n.issuerField&&a[n.issuerField]||a.pubkey,a.time=n.getTimeFunction&&n.getTimeFunction(a)||a.time,a.thumbnail=u.image.fromHit(t,"thumbnail"),e.concat(a)}),[]),a=t.reduce((function(e,n){return n.recipient?(n.recipient={pubkey:n.recipient},e.concat(n.recipient)):e}),[]);return c.extendAll(t.concat(a)).then((function(){return{hits:t,took:e.took,total:e&&e.hits&&e.hits.total||0}}))}return{search:function(e){var n={from:(e=E(e)).from||0,size:e.size||40,sort:e.sort||{time:"desc"},_source:e._source||p.commons};return e.query&&(n.query=e.query),m.search(n,{index:e.index,type:e.type}).then((function(n){return g(n,e)}))},searchText:function(e,n){var t={text:e,index:(n=n||{}).index||"user",type:n.type||"event",from:n.from||0,size:n.size||40,sort:n.sort||"time:desc",source:n._source&&n._source.join(",")||p.commons.join(",")};console.debug("[ES] [wallet] [document] [{0}/{1}] Loading documents...".format(n.index,n.type));var a=Date.now();return m.searchText(t).then((function(e){return g(e,n)})).then((function(e){return console.debug("[ES] [document] [{0}/{1}] Loading {2} documents in {3}ms".format(n.index,n.type,e&&e.hits&&e.hits.length||0,Date.now()-a)),e}))},remove:function(n,t){return n&&n.index&&n.type&&n.id?d.isLogin()?u.record.remove(n.index,n.type)(n.id,t):e.reject("User not login"):e.reject("Could not remove document: missing mandatory fields")},removeAll:function(n,t){return n&&n.length?d.isLogin()?e.all(n.reduce((function(e,n){return e.concat(u.record.remove(n.index,n.type)(n.id))}),[])):e.reject("User not login"):e.when()},fields:{commons:p.commons},fromHit:function(e){return g({hits:{hits:[e]}},E({index:e._index,type:e._type})).then((function(e){return e.hits[0]}))}}}]),angular.module("cesium.es.network.services",["ngApi","cesium.es.http.services"]).factory("esNetwork",["$rootScope","$q","$interval","$timeout","$window","csSettings","csConfig","esHttp","Api","BMA",function(e,n,t,a,i,o,s,r,l,c){factory=function(e){var d,u="https:"===i.location.protocol,p=new l(this,"csNetwork-"+e),m={pod:null,listeners:[],loading:!0,peers:[],filter:{endpointFilter:null,online:!0,ssl:void 0,tor:void 0},sort:{type:null,asc:!0},expertMode:!1,knownBlocks:[],mainBlock:null,searchingPeersOnNetwork:!1,timeout:s.timeout},E=function(e){return e&&[e.number,e.hash].join("-")},g=function(){m.peers=[],m.searchingPeersOnNetwork=!0,m.loading=!0,m.pod=m.pod||r;var e=[];return d&&t.cancel(d),d=t((function(){e.length?v(e):m.loading&&!m.searchingPeersOnNetwork&&(m.loading=!1,t.cancel(d),R(!0),console.debug("[network] Finish: {0} peers found.".format(m.peers.length)))}),1e3),n.when().then((function(){return m.filter.online?m.pod.network.peers().then((function(t){var a=[];if(_.forEach(t.peers,(function(n){"UP"==n.status&&a.push(f(n,e))})),a.length)return n.all(a)})).catch((function(e){console.error(e)})):m.pod.network.peers().then((function(t){var a=[];if(_.forEach(t.peers,(function(n){"UP"!==n.status&&a.push(f(n,e))})),a.length)return n.all(a)}))})).then((function(){m.searchingPeersOnNetwork=!1})).catch((function(e){console.error(e),m.searchingPeersOnNetwork=!1}))},f=function(e,t){t=t||m.newPeers;var a=T(e),i=!1,o=a.reduce((function(e,n){var a=_.findWhere(m.peers,{id:n.id}),o=a?a.buid:null,s=!!a&&a.online;return e.concat(b(n).then((function(e){a?!e||e.online!==m.filter.online&&"all"!==m.filter.online?(console.debug("[network] Peer [{0}] removed (cause: {1})".format(n.server,e?e.online?"UP":"DOWN":"filtered")),m.peers.splice(m.peers.indexOf(a),1),i=!0):e.buid!==o?(console.debug("[network] {0} endpoint [{1}] new current block".format(e.ep&&(e.ep.useBma?"BMA":"WS2P")||"null",e.server)),i=!0):s!==e.online?(console.debug("[network] {0} endpoint [{1}] is now {2}".format(e.ep&&(e.ep.useBma?"BMA":"WS2P")||"null",e.server,e.online?"UP":"DOWN")),i=!0):console.debug("[network] {0} endpoint [{1}] unchanged".format(e.ep&&(e.ep.useBma?"BMA":"WS2P")||"null",e.server)):!e||e.online!==m.filter.online&&"all"!==m.filter.online||(console.debug("[network] {0} endpoint [{1}] is {2}".format(e.ep&&e.ep.api||"",e.server,e.online?"UP":"DOWN")),t.push(e),i=!0)})))}),[]);return(1===o.length?o[0]:n.all(o)).then((function(){return i}))},T=function(e,n){if(!e)return[];var t=new h(e);if(!n){var a=t.getEndpoints();if(!a)return[];var i=a.reduce((function(e,n){var t=r.node.parseEndPoint(n);return t?e.concat(t):e}),[]);if(i.length>1)return i.reduce((function(n,t){return n.concat(T(e,t))}),[]);n=i[0]}return t.ep=n,t.server=t.getServer(),t.dns=t.getDns(),t.blockNumber=t.block&&t.block.replace(/-.+$/,""),t.id=t.keyID(),[t]},b=function(e){return function(e){return!(m.filter&&(m.filter.endpointFilter&&(e.ep&&e.ep.api&&e.ep.api!==m.filter.endpointFilter||!e.hasEndpoint(m.filter.endpointFilter))||!m.filter.online&&"UP"===e.status||angular.isDefined(m.filter.ssl)&&e.isSsl()!=m.filter.ssl||angular.isDefined(m.filter.tor)&&e.isTor()!=m.filter.tor))}(e)?!m.filter.online||"all"===m.filter.online&&"DOWN"===e.status||!e.getHost()?(e.online=!1,n.when(e)):u&&!e.isSsl()?(e.online="UP"===e.status,e.buid=-1,delete e.version,n.when(e)):e.ep.useTor?(e.online="UP"==e.status,e.buid=-1,delete e.software,delete e.version,n.when(e)):(e.api=e.api||r.lightInstance(e.getHost(),e.getPort(),e.isSsl(),m.timeout),e.api.blockchain.current().then((function(n){return e.currentNumber=n.number,e.online=!0,e.buid=E(n),e.medianTime=n.medianTime,-1===m.knownBlocks.indexOf(e.buid)&&m.knownBlocks.push(e.buid),e})).catch((function(n){if(n&&n.ucode==c.errorCodes.NO_CURRENT_BLOCK)return e.online=!0,e.buid=E({number:0,hash:c.constants.ROOT_BLOCK_HASH}),e.difficulty=0,e;if(!e.secondTry){var t=e.ep||e.getEP();if(t.dns&&-1==e.server.indexOf(t.dns))return e.secondTry=!0,e.api=r.lightInstance(t.dns,t.port,t.useSsl),b(e)}return e.online=!1,e.currentNumber=null,e.buid=null,e})).then((function(e){return m.filter.online&&e&&e.online?(e.docCount={},n.all([m.expertMode?e.api.node.summary().then((function(n){e.software=n&&n.duniter&&n.duniter.software||void 0,e.version=n&&n.duniter&&n.duniter.version||"?"})).catch((function(){e.software=void 0,e.version="?"})):n.when(),e.api.record.count(m.document.index,m.document.type).then((function(n){e.docCount.record=n})).catch((function(){e.docCount.record=void 0})),e.api.subscription.count({recipient:e.pubkey,type:"email"}).then((function(n){e.docCount.emailSubscription=n})).catch((function(){e.docCount.emailSubscription=void 0}))])):e})).then((function(){return delete e.api,e}))):n.when()},v=function(e,n){if((e=e||m.newPeers).length){var t=_.map(m.peers,(function(e){return e.id})),a=!1,i=0;_.forEach(e.splice(0),(function(e){t[e.id]||(m.peers.push(e),t[e.id]=e,a=!0,i++)})),a&&(console.debug("[network] Flushing {0} new peers...".format(i)),R(n))}},O=function(e,n,t){if(!e)return 0;var a=0;n>(e=e.toLowerCase()).length&&(n=e.length),a+=e.charCodeAt(0);for(var i=1;i<n;i++)a+=Math.pow(.001,i)*e.charCodeAt(i);return t?1e3-a:a},R=function(e){var n={};_.forEach(m.peers,(function(e){if(e.buid){var t=n[e.buid];t&&t.medianTime?!t.medianTime&&e.medianTime&&(t.medianTime=e.medianTime):(t={buid:e.buid,count:0,medianTime:e.medianTime},n[e.buid]=t),-1!=t.buid&&t.count++}})),_.forEach(_.values(n),(function(e){e.pct=100*e.count/m.peers.length}));var t=_.max(n,(function(e){return e.count}));_.forEach(m.peers,(function(e){e.hasMainConsensusBlock=e.buid==t.buid,e.hasConsensusBlock=e.buid&&!e.hasMainConsensusBlock&&n[e.buid].count>1,e.hasConsensusBlock&&(e.consensusBlockDelta=n[e.buid].medianTime-t.medianTime)})),m.peers=_.uniq(m.peers,!1,(function(e){return e.id})),m.peers=_.sortBy(m.peers,(function(e){var t=0;if(m.sort.type){var a=0;a+="name"==m.sort.type?O(e.name,10,m.sort.asc):0,a+="software"==m.sort.type?O(e.software,10,m.sort.asc):0,a+="api"==m.sort.type&&(e.hasEndpoint("GCHANGE_SUBSCRIPTION_API")&&(m.sort.asc?1:-1)||0)+(e.hasEndpoint("GCHANGE_API")&&(m.sort.asc?.01:-.01)||0)+(e.isSsl()&&(m.sort.asc?.75:-.75)||0)||0,t+=1e10*(a+="doc_count"==m.sort.type&&e.docCount?m.sort.asc?1e9-e.docCount:e.docCount:0)}return t+=1e9*(e.online?1:0),t+=1e8*(e.hasMainConsensusBlock?1:0),t+=1e6*(e.hasConsensusBlock?n[e.buid].pct:0),m.expertMode?(t+=100*(e.difficulty?1e4-e.difficulty:0),t+=1*(e.uid?O(e.uid,2,!0):0)):(t+=100*(e.uid?O(e.uid,2,!0):0),t+=1*(e.uid?0:O(e.pubkey,2,!0))),-t})),!e||!t.buid||m.mainBlock&&m.mainBlock.buid===t.buid||(m.mainBlock=t,p.data.raise.mainBlockChanged(t)),p.data.raise.changed(m)},I=function(e,n){return n=n||{},r.ready().then((function(){N(),m.pod=e||r,m.filter=n.filter?angular.merge(m.filter,n.filter):m.filter,m.sort=n.sort?angular.merge(m.sort,n.sort):m.sort,m.expertMode=angular.isDefined(n.expertMode)?n.expertMode:m.expertMode,m.timeout=angular.isDefined(n.timeout)?n.timeout:s.timeout,console.info("[network] Starting network from [{0}]".format(m.pod.server));var t=Date.now();return m.listeners=[m.pod.websocket.block().onListener((function(e){if(e&&!m.loading){var n=[e.number,e.hash].join("-");-1===m.knownBlocks.indexOf(n)&&(console.debug("[network] Receiving block: "+n.substring(0,20)),m.knownBlocks.push(n),1===m.knownBlocks.length||(m.loading=!0,a((function(){console.debug("[network] new block received by WS: will refresh peers"),g()}),2e3,!1)))}})),m.pod.websocket.peer().onListener((function(e){if(e&&!m.loading){var n=[];f(e,n).then((function(e){e&&(n.length>0?v(n,!0):(console.debug("[network] [ws] Peers updated received"),R(!0)))}))}}))],g().then((function(e){return console.debug("[network] Started in "+(Date.now()-t)+"ms"),e}))}))},N=function(){m.pod&&(console.info("[network-service] Stopping..."),_.forEach(m.listeners,(function(e){e()})),m.listeners=[]),m.pod=null,m.listeners=[],m.peers.splice(0),m.filter={endpointFilter:null,online:!0},m.sort={type:null,asc:!0},m.expertMode=!1,m.knownBlocks=[],m.mainBlock=null,m.loading=!0,m.searchingPeersOnNetwork=!1,m.timeout=s.timeout,m.document={index:o.data.plugins.es&&o.data.plugins.es.document&&o.data.plugins.es.document.index||"user",type:o.data.plugins.es&&o.data.plugins.es.document&&o.data.plugins.es.document.type||"profile"}},S=function(e){return m.pod?I().then((function(){return n(e)})):n(e)};return p.registerEvent("data","changed"),p.registerEvent("data","mainBlockChanged"),p.registerEvent("data","rollback"),{id:e,data:m,start:I,close:N,hasPeers:function(){return m.peers&&m.peers.length>0},getPeers:function(){return m.peers},sort:function(e){e=e||{},m.filter=e.filter?angular.merge(m.filter,e.filter):m.filter,m.sort=e.sort?angular.merge(m.sort,e.sort):m.sort,R(!1)},getTrustedPeers:function(){return S((function(e,n){e(m.peers.reduce((function(e,n){return n.hasMainConsensusBlock&&n.uid?e.concat(n):e}),[]))}))},getKnownBlocks:function(){return m.knownBlocks},getMainBlockUid:function(){return S((function(e,n){e(m.mainBuid)}))},loadPeers:g,isBusy:function(){return m.loading},api:p}};var d=factory("default");return d.instance=factory,d}]),angular.module("cesium.es.like.services",["ngResource","ngApi","cesium.services","cesium.config","cesium.es.http.services"]).factory("esLike",["$q","$timeout","$rootScope","$state","$sce","$translate","$window","$filter","CryptoUtils","UIUtils","csWallet","esHttp",function(e,n,t,a,i,o,s,r,l,c,d,u){return{constants:{KINDS:["VIEW","LIKE","DISLIKE","FOLLOW","ABUSE","STAR"]},instance:function(n,t){var a={postSearch:u.post("/like/record/_search"),getSearch:u.get("/like/record/_search?_source=false&q=:q"),add:u.record.post("/{0}/{1}/:id/_like".format(n,t)),remove:u.record.remove("like","record")};function i(i,o){if((o=o||{}).kind=o.kind&&o.kind.toUpperCase()||"LIKE",!d.isLogin())return e.reject("Wallet must be login before sending record to ES node");var s={version:2,index:n,type:t,id:i,kind:o.kind};return o.comment&&(s.comment=o.comment),angular.isDefined(o.level)&&(s.level=o.level),a.add(s)}return{toggle:function(o,s){return(s=s||{}).kind=s.kind||"LIKE",d.isLogin()?function(e,i){(i=i||{}).kind=i.kind||"LIKE";var o="index:{0} AND type:{1} AND id:{2}".format(n,t,e);return i.kind&&(o+=" AND kind:"+i.kind.toUpperCase()),i.issuer&&(o+=" AND issuer:"+i.issuer),a.getSearch({q:o}).then((function(e){return(e&&e.hits&&e.hits.hits||[]).map((function(e){return e._id}))}))}(o,{kind:s.kind,issuer:d.data.pubkey}).then((function(n){return n&&n.length?e.all(_.map(n,(function(e){return a.remove(e)}))).then((function(){return-1*n.length})):i(o,s).then((function(){return 1}))})):e.reject("Wallet must be login before sending record to ES node")},load:function(e){var i=[{term:{index:n}},{term:{type:t}}],o={query:{bool:{filter:i}},from:(e=e||{}).from||0,size:e.size||20,_source:e._source||["id","kind","time","level","issuer"]};return e.kinds?i.push({terms:{kind:_.map(e.kinds,(function(e){return e.toUpperCase()}))}}):e.kind&&i.push({term:{kind:e.kind.toUpperCase()}}),e.issuer&&i.push({term:{issuer:e.issuer}}),a.postSearch(o).then((function(e){if(e&&e.hits)return{total:e.hits.total||0,hits:_.pluck(e.hits.hits||[],"_source")}}))},add:i,remove:function(e){if(!e)throw new Error("Missing 'id' argument !");return a.remove(e)},count:function(e,i){(i=i||{}).kind=i.kind&&i.kind.toUpperCase()||"LIKE",i.level=angular.isDefined(i.level)?i.level:"STAR"===i.kind;var o={query:{bool:{filter:[{term:{index:n}},{term:{type:t}},{term:{id:e}},{term:{kind:i.kind.toUpperCase()}}]}},size:0};return i.issuer&&(o.query.bool.should={term:{issuer:i.issuer}},o.size=1,o._source=["issuer"]),i.level&&(o.aggs={level_sum:{sum:{field:"level"}}},o._source=o._source||[],o._source.push("level")),a.postSearch(o).then((function(e){var n=e&&e.hits,t=n&&i.issuer?_.findIndex(n.hits,(function(e){return e._source.issuer===i.issuer})):-1,a={total:n&&n.total||0,wasHit:-1!==t||!1,wasHitId:-1!==t&&n.hits[t]._id||!1};return i.level&&(a.level=-1!==t?n.hits[t]._source.level:void 0,a.levelSum=e.aggregations&&e.aggregations.level_sum.value||0,a.levelAvg=a.total&&Math.floor(10*(a.levelSum/a.total+.5))/10-.5||0),a}))}}}}}]),v.$inject=["$scope","UIUtils","$q","Device"],I.$inject=["$scope","$focus","$filter","UIUtils","SocialUtils"],N.$inject=["$scope"],R.$inject=["$scope","$filter","$state","$focus","$timeout","$anchorScroll","UIUtils"],O.$inject=["$scope","UIUtils","$timeout","parameters"],S.$inject=["$scope","$sce"],A.$inject=["$scope","csConfig","esGeo","ModalUtils"],D.$inject=["$scope","$q","csConfig","esGeo","ModalUtils"],C.$inject=["$scope","$timeout","UIUtils","ModalUtils","csConfig","esGeo"],P.$inject=["$scope","$q","$translate","esGeo","parameters"],angular.module("cesium.es.common.controllers",["ngResource","cesium.es.services"]).controller("ESPicturesEditCtrl",v).controller("ESPicturesEditCtrl",v).controller("ESSocialsEditCtrl",I).controller("ESSocialsViewCtrl",N).controller("ESCommentsCtrl",R).controller("ESCategoryModalCtrl",O).controller("ESAvatarModalCtrl",S).controller("ESPositionEditCtrl",A).controller("ESLookupPositionCtrl",D).controller("ESSearchPositionItemCtrl",C).controller("ESSearchPositionModalCtrl",P),y.$inject=["$scope","$q","$timeout","$translate","$ionicPopup","UIUtils","csWallet","esHttp","esLike"],angular.module("cesium.es.like.controllers",["ngResource","cesium.es.services"]).controller("ESLikesCtrl",y),k.$inject=["$scope","esSettings","PluginService"],M.$inject=["$scope","esSettings","PluginService"],w.$inject=["$scope","$state","PluginService","esSettings","UIUtils"],U.$inject=["$scope","$state","csSettings","csWallet"],angular.module("cesium.es.app.controllers",["ngResource","cesium.es.services"]).config(["PluginServiceProvider",function(e){e.extendState("app",{points:{"nav-buttons-right":{templateUrl:"plugins/es/templates/menu_extend.html",controller:"ESMenuExtendCtrl"},"menu-discover":{templateUrl:"plugins/es/templates/menu_extend.html",controller:"ESMenuExtendCtrl"},"menu-user":{templateUrl:"plugins/es/templates/menu_extend.html",controller:"ESMenuExtendCtrl"},"profile-popover-user":{templateUrl:"plugins/es/templates/common/popover_profile_extend.html",controller:"ESProfilePopoverExtendCtrl"}}}),e.extendState("app.home",{points:{"header-buttons":{templateUrl:"plugins/es/templates/home/home_extend.html",controller:"ESExtensionCtrl"}}})}]).controller("ESExtensionCtrl",k).controller("ESJoinCtrl",M).controller("ESMenuExtendCtrl",w).controller("ESProfilePopoverExtendCtrl",U),x.$inject=["$scope","$window","$q","$translate","$ionicPopup","UIUtils","Modals","csHttp","csConfig","csSettings","esHttp","esSettings","esModals"],angular.module("cesium.es.settings.controllers",["cesium.es.services"]).config(["PluginServiceProvider","$stateProvider","csConfig",function(e,n,t){t.plugins&&t.plugins.es&&(e.extendState("app.settings",{points:{plugins:{templateUrl:"plugins/es/templates/settings/settings_extend.html",controller:"ESExtensionCtrl"}}}),n.state("app.es_settings",{url:"/settings/es",views:{menuContent:{templateUrl:"plugins/es/templates/settings/plugin_settings.html",controller:"ESPluginSettingsCtrl"}}}))}]).controller("ESPluginSettingsCtrl",x),F.$inject=["$scope","$controller","$state","csWallet","esModals"],H.$inject=["$scope","$controller","UIUtils","esHttp","esProfile"],angular.module("cesium.es.wallet.controllers",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.extendState("app.view_wallet",{points:{hero:{templateUrl:"plugins/es/templates/wallet/view_wallet_extend.html",controller:"ESWalletLikesCtrl"},"after-general":{templateUrl:"plugins/es/templates/wallet/view_wallet_extend.html",controller:"ESWalletViewCtrl"}}})}]).controller("ESWalletViewCtrl",F).controller("ESWalletLikesCtrl",H),B.$inject=["$scope","$controller","$ionicPopover","UIUtils","csWallet","esHttp","esProfile","esLike","esModals"],angular.module("cesium.es.wot.controllers",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.extendStates(["app.user_identity","app.user_identity_name"],{points:{hero:{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},general:{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},"after-general":{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},buttons:{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"},"buttons-top-fab":{templateUrl:"plugins/es/templates/wot/view_identity_extend.html",controller:"ESWotIdentityViewCtrl"}}})}]).controller("ESWotIdentityViewCtrl",B),V.$inject=["$scope","$rootScope","$q","$timeout","$state","$focus","$translate","$controller","$ionicHistory","UIUtils","BMA","esHttp","esProfile","ModalUtils","Device"],angular.module("cesium.es.profile.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.user_edit_profile",{url:"/wallet/profile/edit",views:{menuContent:{templateUrl:"plugins/es/templates/user/edit_profile.html",controller:"ESViewEditProfileCtrl"}},cache:!1,data:{auth:!0}})}]).controller("ESViewEditProfileCtrl",V),G.$inject=["$scope","$state","$translate","$ionicHistory","$ionicPopover","$timeout","esModals","UIUtils","csWallet","esMessage"],W.$inject=["$scope","$controller","UIUtils"],Y.$inject=["$scope","Modals","UIUtils","csWallet","esHttp","esMessage","parameters"],$.$inject=["$scope","$state","$timeout","$translate","$ionicHistory","$ionicPopover","UIUtils","esModals","esMessage"],j.$inject=["$scope","UIUtils","$state","$timeout","csWallet","esHttp","esMessage","esModals"],angular.module("cesium.es.message.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.user_message",{url:"/message?type",views:{menuContent:{templateUrl:"plugins/es/templates/message/list.html",controller:"ESMessageListCtrl"}}}).state("app.user_new_message",{cache:!1,url:"/message/new?pubkey&name&title&content",views:{menuContent:{templateUrl:"plugins/es/templates/message/compose.html",controller:"ESMessageComposeCtrl"}}}).state("app.user_view_message",{cache:!1,url:"/message/view/:type/:id",views:{menuContent:{templateUrl:"plugins/es/templates/message/view_message.html",controller:"ESMessageViewCtrl"}}})}]).controller("ESMessageListCtrl",G).controller("ESMessageComposeCtrl",W).controller("ESMessageComposeModalCtrl",Y).controller("ESMessageViewCtrl",$).controller("PopoverMessageCtrl",j),K.$inject=["$scope","$rootScope","$ionicPopover","$state","$timeout","UIUtils","esHttp","csSettings","csWallet","esNotification"],q.$inject=["$scope","$timeout","$controller","UIUtils","$state"],angular.module("cesium.es.notification.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.view_notifications",{url:"/notifications",views:{menuContent:{templateUrl:"plugins/es/templates/notification/view_notifications.html",controller:"NotificationsCtrl"}}})}]).controller("NotificationsCtrl",K).controller("PopoverNotificationsCtrl",q),z.$inject=["$scope","$q","$ionicHistory","csWot","csWallet","UIUtils","ModalUtils","esSubscription"],X.$inject=["$scope","Modals","csSettings","esHttp","csWot","esModals","parameters"],angular.module("cesium.es.subscription.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.edit_subscriptions",{cache:!1,url:"/wallet/subscriptions",views:{menuContent:{templateUrl:"plugins/es/templates/subscription/edit_subscriptions.html",controller:"ViewSubscriptionsCtrl"}},data:{auth:!0,minData:!0}}).state("app.edit_subscriptions_by_id",{cache:!1,url:"/wallets/:id/subscriptions",views:{menuContent:{templateUrl:"plugins/es/templates/subscription/edit_subscriptions.html",controller:"ViewSubscriptionsCtrl"}},data:{login:!0,minData:!0}})}]).controller("ViewSubscriptionsCtrl",z).controller("ModalEmailSubscriptionsCtrl",X),Q.$inject=["$scope","$ionicPopover","$location","$timeout","csSettings","csWallet","UIUtils","esHttp","esDocument"],J.$inject=["$scope","$controller","$timeout","$state"],angular.module("cesium.es.document.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.document_search",{url:"/data/search/:index/:type?q",views:{menuContent:{templateUrl:"plugins/es/templates/document/lookup.html",controller:"ESDocumentLookupCtrl"}},data:{silentLocationChange:!0}})}]).controller("ESDocumentLookupCtrl",Q).controller("ESLastDocumentsCtrl",J),Z.$inject=["$scope","$state","$location","$ionicPopover","$window","$translate","esHttp","UIUtils","csConfig","csSettings","csCurrency","esNetwork","csWot"],ee.$inject=["$scope","$controller","parameters"],ae.$inject=["$scope","$q","$window","$state","UIUtils","csWot","esHttp","csHttp","csSettings"],ne.$inject=["$scope","$controller"],te.$inject=["$scope","$q","csSettings","csCurrency","csHttp","esHttp"],angular.module("cesium.es.network.controllers",["cesium.es.services"]).config(["$stateProvider",function(e){e.state("app.es_network",{url:"/network/data?online&expert",cache:!1,views:{menuContent:{templateUrl:"plugins/es/templates/network/view_es_network.html",controller:"ESNetworkLookupCtrl"}},data:{silentLocationChange:!0}}).state("app.view_es_peer",{url:"/network/data/peer/:server?ssl&tor",cache:!1,views:{menuContent:{templateUrl:"plugins/es/templates/network/view_es_peer.html",controller:"ESPeerViewCtrl"}},data:{preferHttp:!0}})}]).controller("ESNetworkLookupCtrl",Z).controller("ESNetworkLookupModalCtrl",ee).controller("ESPeerViewCtrl",ae).controller("ESNetworkLookupPopoverCtrl",ne).controller("ESPeerInfoPopoverCtrl",te),angular.module("cesium.es.registry.services",["ngResource","cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("esRegistry")}]).factory("esRegistry",["$rootScope","$q","csPlatform","csSettings","csWallet","csWot","esHttp","esComment","esGeo",function(e,n,t,a,i,o,s,r,l){var c,d={commons:["title","description","issuer","time","address","city","creationTime","avatar._content_type","picturesCount","type","category","socials","pubkey","geoPoint"]},u=this;function p(e){e.pages=null}function m(e,t){return t=t||n.defer(),e&&e.pubkey&&e.keypair?(console.debug("[ES] [registry] Loading pages count..."),u.raw.count({pubkey:e.pubkey}).then((function(n){e.pages=e.pages||{},e.pages.count=n&&n.hits&&n.hits.total,console.debug("[ES] [registry] Loaded pages count ("+e.pages.count+")"),t.resolve(e)})).catch((function(n){console.error("[ES] [registry] Error while counting page: "+(n.message?n.message:n)),t.resolve(e)})),t.promise):(t.resolve(),t.promise)}function E(){if(u.raw.categories&&u.raw.categories.length){var e=n.defer();return e.resolve(u.raw.categories),e.promise}return u.raw.category.all().then((function(e){if(0===e.hits.total)u.raw.categories=[];else{var n=e.hits.hits.reduce((function(e,n){var t=n._source;return t.id=n._id,e.concat(t)}),[]);_.forEach(n,(function(e){n[e.id]=e})),u.raw.categories=n}return u.raw.categories}))}function g(e,n){if(e){var t=e._source;return t.category&&t.category.id&&(t.category=n[t.category.id]),e.highlight&&(e.highlight.title&&(t.title=e.highlight.title[0]),e.highlight.description&&(t.description=e.highlight.description[0]),e.highlight.location&&(t.location=e.highlight.location[0]),e.highlight.tags&&(t.tags=e.highlight.tags.reduce((function(e,n){return e.concat(n.replace("<em>","").replace("</em>",""))}),[]))),t.avatar=s.image.fromHit(e,"avatar"),e._source.pictures&&e._source.pictures.reduce&&(t.pictures=e._source.pictures.reduce((function(e,n){return e.concat(s.image.fromAttachment(n.file))}),[])),t}}function f(){var n=s.alive;if(!n&&c&&c.length>0){if(console.debug("[ES] [subscription] Disable"),_.forEach(c,(function(e){e()})),c=[],i.isLogin())return p(i.data)}else if(n&&(!c||0===c.length)&&(console.debug("[ES] [subscription] Enable"),function(){c=[i.api.data.on.login(e,m,this),i.api.data.on.init(e,p,this),i.api.data.on.reset(e,p,this)]}(),i.isLogin()))return m(i.data)}return u.raw={count:s.get("/page/record/_search?size=0&q=issuer::pubkey"),searchText:s.get("/page/record/_search?q=:search"),search:s.post("/page/record/_search"),get:s.get("/page/record/:id"),getCommons:s.get("/page/record/:id?_source="+d.commons.join(",")),category:{get:s.get("/page/category/:id"),all:s.get("/page/category/_search?sort=order&from=0&size=1000&_source=name,parent")}},t.ready().then((function(){return s.api.node.on.start(e,f,this),s.api.node.on.stop(e,f,this),f()})),u.category={all:E,get:function(e){return u.raw.category.get(e).then((function(e){var n=e._source;return n.id=e._id,n}))}},u.record={search:function(e){return(e=e||{}).from=e.from||0,e.size=e.size||20,e._source=e._source||d.commons,e.highlight=e.highlight||{fields:{title:{},description:{}}},n.all([E(),u.raw.search(e)]).then((function(n){var t=n[0];if(!(n=n[1])||!n.hits||!n.hits.total)return{total:0,hits:[]};var a=s.util.findObjectInTree(e.query,"geo_distance"),i=a&&a.geoPoint,o=a&&a.distance&&a.distance.replace(new RegExp("[0-9 ]+","gm"),""),r=n.hits.hits.reduce((function(e,n){var a=g(n,t);return a.id=n._id,i&&a.geoPoint&&o&&(a.distance=l.point.distance(i.lat,i.lon,a.geoPoint.lat,a.geoPoint.lon,o)),e.concat(a)}),[]);return{total:n.hits.total,hits:r}}))},load:function(e,t){return(t=t||{}).raw=!!angular.isDefined(t.raw)&&t.raw,t.fecthPictures=angular.isDefined(t.fetchPictures)?t.fetchPictures:t.raw,n.all([E(),t.fecthPictures?u.raw.get({id:e}):u.raw.getCommons({id:e})]).then((function(e){var n=e[0],a=e[1],i=g(a,n);return t.raw||(i.description=s.util.parseAsHtml(i.description,{tagState:"app.registry_lookup"})),o.extend({pubkey:i.issuer}).then((function(e){return{id:a._id,issuer:e,record:i}}))}))},add:s.record.post("/page/record",{tagFields:["title","description"],creationTime:!0}),update:s.record.post("/page/record/:id/_update",{tagFields:["title","description"]}),remove:s.record.remove("page","record"),fields:{commons:d.commons},picture:{all:s.get("/page/record/:id?_source=pictures")},comment:r.instance("page")},u.currency={all:s.get("/currency/record/_search?_source=currencyName,peers.host,peers.port"),get:s.get("/currency/record/:id/_source")},u}]),ie.$inject=["$scope","$focus","$timeout","$filter","$controller","$location","$translate","$ionicPopover","Device","UIUtils","ModalUtils","BMA","csSettings","csWallet","esModals","esRegistry","esHttp"],oe.$inject=["$scope","$controller","$timeout","UIUtils","csWallet"],se.$inject=["$scope","$rootScope","$state","$q","$timeout","$ionicPopover","$ionicHistory","$translate","$anchorScroll","csConfig","csWallet","esRegistry","UIUtils","esHttp"],re.$inject=["$scope","$timeout","$state","$q","$ionicHistory","$focus","$translate","$controller","Device","UIUtils","ModalUtils","csWallet","esHttp","esRegistry"],angular.module("cesium.es.registry.controllers",["cesium.es.services","cesium.es.common.controllers"]).config(["$stateProvider",function(e){e.state("app.registry_lookup",{url:"/page?q&type&hash&category&location&issuer&reload&lat&lon&d&last",views:{menuContent:{templateUrl:"plugins/es/templates/registry/lookup.html",controller:"ESRegistryLookupCtrl"}},data:{large:"app.registry_lookup_lg",silentLocationChange:!0}}).state("app.registry_lookup_lg",{url:"/page/lg?q&type&hash&category&location&issuer&reload&lat&lon&d&last",views:{menuContent:{templateUrl:"plugins/es/templates/registry/lookup_lg.html",controller:"ESRegistryLookupCtrl"}},data:{silentLocationChange:!0}}).state("app.wallet_pages",{url:"/wallet/pages?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_wallet_pages.html",controller:"ESWalletPagesCtrl"}},data:{login:!0,minData:!0}}).state("app.view_page",{url:"/page/view/:id/:title?refresh",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_record.html",controller:"ESRegistryRecordViewCtrl"}}}).state("app.view_page_anchor",{url:"/page/view/:id/:title/:anchor",views:{menuContent:{templateUrl:"plugins/es/templates/registry/view_record.html",controller:"ESRegistryRecordViewCtrl"}}}).state("app.registry_add_record",{cache:!1,url:"/page/add/:type",views:{menuContent:{templateUrl:"plugins/es/templates/registry/edit_record.html",controller:"ESRegistryRecordEditCtrl"}},data:{auth:!0,minData:!0}}).state("app.registry_edit_record",{cache:!1,url:"/page/edit/:id/:title",views:{menuContent:{templateUrl:"plugins/es/templates/registry/edit_record.html",controller:"ESRegistryRecordEditCtrl"}},data:{auth:!0,minData:!0}})}]).controller("ESRegistryLookupCtrl",ie).controller("ESWalletPagesCtrl",oe).controller("ESRegistryRecordViewCtrl",se).controller("ESRegistryRecordEditCtrl",re),angular.module("cesium.market.services",["cesium.market.converse.services","cesium.market.modal.services","cesium.market.record.services","cesium.market.tx.services","cesium.market.wallet.services","cesium.market.settings.services","cesium.market.category.services"]),angular.module("cesium.market.plugin",["cesium.market.app.controllers","cesium.market.home.controllers","cesium.market.join.controllers","cesium.market.login.controllers","cesium.market.search.controllers","cesium.market.gallery.controllers","cesium.market.record.controllers","cesium.market.wallet.controllers","cesium.market.category.controllers","cesium.market.wot.controllers","cesium.market.document.controllers","cesium.market.services"]).run(["csConfig","Modals","mkModals",function(e,n,t){e.plugins&&e.plugins.market&&e.plugins.market.enable&&(console.debug("[plugin] [market] Override login and join modals"),n.showLogin=t.showLogin,n.showJoin=t.showJoin)}]),angular.module("cesium.market.modal.services",["cesium.modal.services"]).factory("mkModals",["ModalUtils",function(e){return{showHelp:function(n){return e.show("plugins/market/templates/help/modal_help.html","HelpModalCtrl",n)},showJoin:function(n){return e.show("plugins/market/templates/join/modal_join.html","MkJoinModalCtrl",n)},showLogin:function(n){return e.show("plugins/market/templates/login/modal_login.html","MarketLoginModalCtrl",n)},showEventLogin:function(n){return e.show("plugins/market/templates/login/modal_event_login.html","MarketEventLoginModalCtrl",n)}}}]),angular.module("cesium.market.category.services",["ngResource","cesium.services","cesium.es.services","cesium.market.settings.services"]).factory("mkCategory",["$q","$translate","csSettings","BMA","csConfig","esHttp","esComment","esGeo","csWot","csCurrency","mkSettings",function(e,n,t,a,i,o,s,r,l,c,d){var u={},p={get:o.get("/market/category/:id"),all:o.get("/market/category/_search?sort=order&size=1000&_source=name,parent,localizedNames"),search:o.post("/market/category/_search"),add:o.record.post("/market/category",{creationTime:!0}),update:o.record.post("/market/category/:id/_update",{creationTime:!0}),remove:o.record.remove("market","category"),record:{postSearch:o.post("/market/record/_search")}},m={locale:void 0};function E(e,n){var t=e._source;return t.id=e._id,t.localizedNames&&(t.name=t.localizedNames[n.locale]||n.fallbackLocalId&&t.localizedNames[n.fallbackLocalId]||t.name),t}function g(a){if((a=a||{}).withCache=!angular.isDefined(a.withCache)||a.withCache,a.locale=angular.isDefined(a.locale)?a.locale:n.use(),a.fallbackLocalId=t.fixLocale(i.defaultLanguage)||"en",a.withCache&&m.categories&&m.categories.length&&m.locale===a.locale){var o=e.defer();return o.resolve(m.categories),o.promise}return p.all().then((function(e){var n;return 0===e.hits.total?n=[]:(n=e.hits.hits.reduce((function(e,n){var t=E(n,a);return e.concat(t)}),[]),_.forEach(n,(function(e){n[e.id]=e}))),m.categories=n,m.locale!==a.locale&&(m.locale=a.locale,m.filteredCategories=void 0),n}))}function f(a){(a=a||{}).filter=angular.isDefined(a.filter)?a.filter:void 0,a.withCache=!angular.isDefined(a.withCache)||a.withCache,a.locale=angular.isDefined(a.locale)?a.locale:n.use(),a.fallbackLocalId=t.fixLocale(i.defaultLanguage)||"en";var o=a.withCache&&m.filteredCategories&&m.filteredCategories[a.filter];if(o&&o.length&&m.locale===a.locale){var s=e.defer();return s.resolve(o),s.promise}var r=a.filter&&u[a.filter]&&u[a.filter].excludes,l=r&&function(e){return _.contains(r,e)};return p.all().then((function(e){if(0===e.hits.total)return[];var n=e.hits.hits.reduce((function(e,n){var t=E(n,a);return l&&(t.parent&&l(t.parent)||l(t.id))?e:e.concat(t)}),[]);return _.forEach(n,(function(e){n[e.id]=e})),m.filteredCategories=m.filteredCategories||{},m.filteredCategories[a.type]=n,m.locale!==a.locale&&(m.locale=a.locale,m.categories=void 0),n}))}function h(e){return console.debug("[market] [category] Adding category",e),p.add(e)}function T(e){return console.debug("[market] [category] Updating category",e),p.update(e,{id:e.id})}function b(e){var n=_.groupBy(e,(function(e){return e.parent||"roots"}));return _.forEach(n.roots,(function(e){e.children=n[e.id]})),n.roots}return{all:g,filtered:f,asTree:b,get:function(e,n){return(n=n||{}).withCache=!angular.isDefined(n.withCache)||n.withCache,n.withChildren=!angular.isDefined(n.withChildren)||n.withChildren,n.withChildren||n.withCache?g(n).then((function(t){var a=t[e.id];return n.withChildren&&b(t),a})):p.get(e).then((function(e){return E(e)}))},searchText:o.get("/market/category/_search?q=:search"),search:o.post("/market/category/_search"),stats:function n(t){if(!(t=t||{}).currencies)return d.currencies().then((function(e){return t.currencies=e,n(t)}));t.asTree=!angular.isDefined(t.asTree)||t.asTree;var a={size:0,aggs:{category:{nested:{path:"category"},aggs:{by_id:{terms:{field:"category.id",size:1e3}}}}}},i=[],o=[];if(t.withStock&&i.push({range:{stock:{gt:0}}}),!t.withOld){var s=t.minTime?t.minTime:Date.now()/1e3-31536e3;s=60*Math.floor(s/60/60)*60,i.push({range:{time:{gte:s}}})}return t.currencies&&t.currencies.length&&i.push({terms:{currency:t.currencies}}),(o.length||i.length)&&(a.query={bool:{}},o.length&&(a.query.bool.should=o),i.length&&(a.query.bool.filter=i)),e.all([f(t),p.record.postSearch(a,{request_cache:!0})]).then((function(e){var n=e[0],t=(e=e[1]).aggregations.category&&e.aggregations.category.by_id&&e.aggregations.category.by_id.buckets||[],a={};return t.forEach((function(e){var t=n[e.key];t&&(a[e.key]=e.doc_count,t.parent&&(a[t.parent]=(a[t.parent]||0)+e.doc_count))})),n.reduce((function(e,n){return e.concat(angular.merge({count:a[n.id]||0},n))}),[])})).then((function(e){return t.asTree?b(e):e})).catch((function(e){console.error(e)}))},add:h,update:T,remove:function(e){return console.debug("[market] [category] Removing category: "+e),p.remove(e)},saveAll:function n(t,a){if(!(a=a||{}).parent){var i=Date.now();console.debug("[market] [category] Saving all categories...",t)}var o;return(a.existingCategories?e.when(a.existingCategories):g(!1)).then((function(i){return o=a.idsToDelete||_.pluck(i,"id"),e.all(_.map(t||[],(function(e){var t=i[e.id];o=_.without(o,e.id);var a=!t;console.debug("[market] [category] - {0} {1}".format(a?"Add":"Update",e.id));var s={id:e.id,localizedNames:e.localizedNames};e.parent&&(s.parent=e.parent),t&&t.name&&(s.name=e.name||null);var r=a?h(s,e.id):T(s,e.id);return e.children&&e.children.length?r.then((function(){return n(e.children,{parent:e,existingCategories:i,idsToDelete:o})})):r}),[]))})).then((function(){if(!a.parent&&o.length>0)return console.debug("[market] [category] Deleting categories with id:",o),e.all(_.map(o,p.remove))})).then((function(){a.parent||console.debug("[market] [category] Saved in {0}ms".format(Date.now()-i))}))},regexp:{ID:/^cat[0-9]+$/}}}]),angular.module("cesium.market.record.services",["ngApi","cesium.services","cesium.es.services","cesium.market.settings.services","cesium.market.category.services"]).factory("mkRecord",["$q","csSettings","BMA","csConfig","csWallet","csWot","csCurrency","csCache","Api","esHttp","esProfile","esComment","esGeo","esLike","mkSettings","mkCategory",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g){var f={likeMoreThis:null},h={commons:["category","title","description","issuer","time","creationTime","location","address","city","price","unit","currency","thumbnail._content_type","picturesCount","type","stock","fees","feesCurrency","geoPoint","pubkey","freePrice"],moreLikeThis:["category","title","issuer","time","creationTime","location","address","city","price","unit","currency","thumbnail._content_type","picturesCount","type","stock","fees","feesCurrency","geoPoint","pubkey","freePrice"]},T={postSearch:c.post("/market/record/_search"),searchText:c.get("/market/record/_search?q=:search"),get:c.get("/market/record/:id"),getCommons:c.get("/market/record/:id?_source="+h.commons.join(",")),add:c.record.post("/market/record",{tagFields:["title","description"],creationTime:!0}),update:c.record.post("/market/record/:id/_update",{tagFields:["title","description"],creationTime:!0}),remove:c.record.remove("market","record")},b={moreLikeThis:{current:void 0}},v=new l(this,"mkRecord");function O(e,n,t,a){a=a||{};var i=e._source;return i.category&&i.category.id&&(i.category=n[i.category.id]||i.category),i.price&&a.convertPrice&&t&&"UD"===i.unit&&(i.price=i.price*t),i.fees&&a.convertPrice&&t&&(!i.feesCurrency||i.feesCurrency===i.currency)&&"UD"===i.unit&&(i.fees=i.fees*t),a.html&&e.highlight?(e.highlight.title&&(i.title=e.highlight.title[0]),e.highlight.tags&&(i.tags=e.highlight.tags.reduce((function(e,n){return e.concat(n.replace("<em>","").replace("</em>",""))}),[])),e.highlight.description?i.description=e.highlight.description[0]:i.description=c.util.parseAsHtml(i.description,{tagState:"app.market_lookup"}),e.highlight.location&&(i.location=e.highlight.location[0]),e.highlight.city&&(i.city=e.highlight.city[0]),i.category&&e.highlight["category.name"]&&(i.category.name=e.highlight["category.name"][0])):a.html&&(i.description=c.util.parseAsHtml(i.description,{tagState:"app.market_lookup"})),i.thumbnail=c.image.fromHit(e,"thumbnail"),e._source.pictures&&e._source.pictures.reduce&&(i.pictures=e._source.pictures.reduce((function(e,n){return n&&n.file?e.concat(c.image.fromAttachment(n.file)):e}),[])),i.location&&!i.city&&(i.city=i.location),i}function R(n,t){console.debug("[market] [record] Loading Ads from request: ",n),(n=n||{}).from=n.from||0,n.size=isNaN(n.size)?20:n.size,n._source=n._source||h.commons,n.highlight=n.highlight||{fields:{title:{},description:{},"category.name":{},tags:{}}};var a={request_cache:t&&!0===t.withCache||!1};return e.all([g.all(),s.currentUD().then((function(e){return e})).catch((function(e){return console.error(e),1})),T.postSearch(n,a)]).then((function(e){var t=e[0],a=e[1];if(!(e=e[2])||!e.hits||!e.hits.total)return{total:0,hits:[]};var i=c.util.findObjectInTree(n.query,"geo_distance"),o=i&&i.geoPoint,s=i&&i.distance&&i.distance.replace(new RegExp("[0-9 ]+","gm"),""),r=e.hits.hits.reduce((function(e,n){var i=O(n,t,a,{convertPrice:!0,html:!0});return i.id=n._id,o&&i.geoPoint&&s&&(i.distance=p.point.distance(o.lat,o.lon,i.geoPoint.lat,i.geoPoint.lon,s)),e.concat(i)}),[]);return v.record.raisePromise.search(r).then((function(){return{total:e.hits.total,hits:r}}))})).catch((function(e){throw console.error(e),new Error("MARKET.ERROR.LOOKUP_RECORDS_FAILED")}))}function I(e){var n={from:(e=e||{}).from||0,size:e.size||20,_source:e._source||h.commons},a=[],i=[];if(e.ids&&i.push({terms:{_id:e.ids}}),e.category&&e.category.id){var o=e.category.children&&_.pluck(e.category.children,"id");o&&o.length?i.push({nested:{path:"category",query:{bool:{filter:{terms:{"category.id":o}}}}}}):i.push({nested:{path:"category",query:{bool:{filter:{term:{"category.id":e.category.id}}}}}})}else"number"==typeof e.category&&i.push({nested:{path:"category",query:{bool:{filter:{term:{"category.id":e.category}}}}}});if(e.categories&&e.categories.length&&i.push({nested:{path:"category",query:{bool:{filter:{terms:{"category.id":e.categories}}}}}}),e.type){var s="offer"===e.type?["offer","auction"]:"need"===e.type?["need","crowdfunding"]:[e.type];i.push({terms:{type:s}})}var r=(e.text||"").trim(),l=r.length>0?c.util.parseTags(r):void 0;if(r.length>1)if(t.regexp.PUBKEY.test(r))a=[],i.push({term:{issuer:r}});else{var d=r.toLowerCase();a.push({multi_match:{query:d,fields:["title^2","description"],type:"phrase_prefix"}}),a.push({match:{title:{query:d,boost:2}}}),a.push({prefix:{title:d}}),a.push({match:{description:d}}),a.push({nested:{path:"category",query:{bool:{filter:{match:{"category.name":d}}}}}})}if(l&&i.push({terms:{tags:l}}),!1!==e.withStock&&!0!==e.showClosed&&i.push({range:{stock:{gt:0}}}),e.withPictures&&i.push({range:{picturesCount:{gt:0}}}),!0!==e.withOld&&!0!==e.showOld){var u=e.minTime?e.minTime:E.getMinAdTime();u=60*Math.floor(u/60/60)*60,i.push({range:{time:{gte:u}}})}e.currencies&&e.currencies.length&&i.push({terms:{currency:e.currencies}});var p=e.location&&e.location.trim(),m=e.geoDistance||"50km";if(e.geoPoint&&e.geoPoint.lat&&e.geoPoint.lon)if(p&&p.length){var g=p.toLowerCase().split(",")[0];i.push({or:[{and:[{not:{exists:{field:"geoPoint"}}},{multi_match:{query:g,fields:["city^3","location"]}}]},{geo_distance:{distance:m,geoPoint:{lat:e.geoPoint.lat,lon:e.geoPoint.lon}}}]})}else i.push({geo_distance:{distance:m,geoPoint:{lat:e.geoPoint.lat,lon:e.geoPoint.lon}}});else if(e.geoShape&&e.geoShape.geometry){var f=e.geoShape.geometry.coordinates,T=e.geoShape.geometry.type;p&&("Polygon"===T||"MultiPolygon"===T)&&f&&f.length&&(1===f.length?i.push({geo_polygon:{geoPoint:{points:1===f.length?f[0]:f}}}):i.push({or:f.reduce((function(e,n){return e.concat(n.reduce((function(e,n){return e.concat({geo_polygon:{geoPoint:{points:n}}})}),[]))}),[])}))}return(a.length||i.length)&&(n.query={bool:{}},a.length&&(n.query.bool.should=a,n.query.bool.minimum_should_match=1),i.length&&(n.query.bool.filter=i)),e.sortAttribute&&(n.sort=n.sort||{},n.sort[e.sortAttribute]="asc"===e.sortDirection?"asc":"desc"),n}return v.registerEvent("record","load"),v.registerEvent("record","search"),{category:g,record:{createSearchRequest:I,search:R,load:function(n,t){var a;return(t=t||{}).fetchPictures=!angular.isDefined(t.fetchPictures)||t.fetchPictures,t.convertPrice=!!angular.isDefined(t.convertPrice)&&t.convertPrice,e.all([g.all(),s.currentUD().catch((function(e){return console.error("Could not get current UD",e),1})),t.fetchPictures?T.get({id:n}):T.getCommons({id:n})]).then((function(e){var n=e[0],i=e[1],o=O(a=e[2],n,i,t);return o.id=a._id,!o.currency&&o.price?E.currencies().then((function(e){return o.currency=e&&e[0],o})):o})).then((function(n){return e.all([o.extend({issuer:n.issuer},"issuer",!0),v.record.raisePromise.load(n).catch((function(e){console.debug("[market] [record-service] Error while executing extension point on record load."),console.error(e)}))]).then((function(e){var t=e[0];return{id:n.id,issuer:t,record:n}}))}))},setStock:function(e,n){return T.get({id:e}).then((function(t){if(t&&t._source){var a=t._source;return a.stock=n||0,a.id=e,T.update(a,{id:e})}}))},pictures:function(e){return(e=e||{})._source=e._source||["category","title","price","unit","currency","city","pictures","stock","unitbase","description","type","issuer","creationTime"],e.withPictures=!0,R(I(e)).then((function(e){var n=(e.hits||[]).reduce((function(e,n){return n.pictures&&n.pictures.length?(angular.merge(n,n.pictures[0]),delete n.pictures,delete n.thumbnail,e.concat(n)):e}),[]);return d.fillAvatars(n,"issuer").then((function(){return{hits:n,total:e.total}}))}))},add:T.add,update:T.update,remove:T.remove,moreLikeThis:function(n,t){if(!1!==(t=t||{}).cache&&f.likeMoreThis){var a=f.likeMoreThis.get(n);if(a)return e.when(a)}var l=Date.now(),c=20*(t.size||6),d=E.getMinAdTime(),u=i.isLogin()?i.data.pubkey:void 0,p=[];b.moreLikeThis.current=n;var m={from:t.from||0,size:c,_source:t._source||h.moreLikeThis,query:{more_like_this:{fields:["title","category.name","type","city"],like:[{_index:"market",_type:"record",_id:n}],min_term_freq:1,max_query_terms:12}}};if(t.type||t.category||t.city){var v={};t.type&&(v.type=t.type),t.category&&(v.category={id:t.category}),t.city&&(v.city=t.city),m.query.more_like_this.like.push({_index:"market",_type:"record",doc:v})}var R=function(e,t){if(!((t=void 0!==t?t:6)&&e&&e.hits&&e.hits.total))return{total:0,hits:[]};var a=e.hits.hits.reduce((function(e,n,a){return a>=t||0===n._source.stock||n._source.issuer===u?e:(n._source.time||n._source.creationTime)<d?(p.push(n),e):e.concat(n)}),[]),i=t-a.length;if(i>0&&Date.now()-l<1e4&&b.moreLikeThis.current===n){if(console.debug("[market] [record] Missing 'more like this' Ads (missing {0}. Fetching more...".format(i)),m.from+=c,m.from<e.hits.total)return T.postSearch(m).then((function(e){return R(e,i)})).then((function(n){return{total:e.hits.total,hits:a.concat(n.hits||[])}}));p.length>0&&(p.length>i&&p.splice(i),a=a.concat(p))}return{total:e.hits.total,hits:a}};return e.all([g.all(),s.currentUD().catch((function(e){return console.error("Could not get current UD",e),1})),T.postSearch(m).then(R)]).then((function(e){var t=e[0],a=e[1];return(e=e[2]).hits=_.map(e.hits,(function(e){var n=O(e,t,a,{convertPrice:!0,html:!0});return n.id=e._id,n})),o.extendAll(e.hits,"issuer",!0).then((function(t){return f.likeMoreThis=f.likeMoreThis||r.get("mkRecord",r.constants.MEDIUM),f.likeMoreThis.put(n,e),console.debug("[market] [record] {0} 'More like this' fetched, in {1}ms".format(e.hits.length,Date.now()-l)),e}))}))},fields:{commons:h.commons},picture:{all:c.get("/market/record/:id?_source=pictures")},comment:u.instance("market"),like:m.instance("market","record")},api:v}}]),angular.module("cesium.market.tx.services",["cesium.services","cesium.es.services","cesium.market.settings.services","cesium.market.record.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("mkTx")}]).factory("mkTx",["$rootScope","$q","csSettings","csPlatform","CryptoUtils","csConfig","esHttp","mkRecord",function(e,n,t,a,i,o,s,r){var l={COMMENTS_PREFIX:"GCHANGE"},c={postSearchByCurrency:{g1:s.post("/g1/movement/_search")}};function d(e){if(!e||!e.id)throw Error("Invalid record: missing record or record.id");return[l.COMMENTS_PREFIX,e.id].join(":").toUpperCase()}function u(e,n){(n=n||{}).withAvg=!!angular.isDefined(n.withAvg)&&n.withAvg,n.withIssuers=!!angular.isDefined(n.withIssuers)&&n.withIssuers;var t=Date.now();console.debug("[market] [tx] Loading TX stats of record {{0}}...".format(e.id)),n.prefix=n.prefix||d(e);var a={size:0,query:{bool:{must:{match:{comment:n.prefix}}}},aggs:{sum:{sum:{field:"amount"}}}};return e.pubkey&&(a.query.bool.filter=[{term:{recipient:e.pubkey}}]),n.withAvg&&(a.aggs.avg={avg:{field:"amount"}}),n.withIssuers&&(a.aggs.issuers={terms:{field:"issuer"}}),function(e,n){var t=c.postSearchByCurrency[e];return t||(t=s.post("/"+e+"/movement/_search"),c.postSearchByCurrency[e]=t),t(n)}(e.currency,a).then((function(a){var i=a.aggregations&&a.aggregations.sum&&a.aggregations.sum.value,o=e.price>0?100*i/e.price:void 0;return e.tx={sum:i,pct:o},n.withAvg&&(e.tx.avg=a.aggregations&&a.aggregations.avg&&a.aggregations.avg.value),n.withIssuers&&(e.tx.issuers=(a.aggregations&&a.aggregations.issuers&&a.aggregations.issuers.buckets||[]).reduce((function(e,n){return e.concat(n.key)}),[])),console.debug("[market] [tx] TX stats loaded in {1}ms".format(e.id,Date.now()-t),e.tx),e}))}function p(e,t){t=t||n.defer();var a=(e||[]).reduce((function(e,n){return"crowdfunding"===n.type&&n.pubkey?e.concat(u(n)):e}),[]);return a.length?n.all(a).then(t.resolve).catch(t.reject):t.resolve(),t.promise}function m(e,t){return t=t||n.defer(),"crowdfunding"===e.type&&e.pubkey?u(e,{withAvg:!0,withIssuers:!0}).then(t.resolve).catch(t.reject):(t.resolve(),t.promise)}return function(){r.api.record.on.search(e,p,this),r.api.record.on.load(e,m,this)}(),{record:{computePrefix:d,fillTx:u},uri:{compute:function(e){if(!e||!e.pubkey)return n.reject("Missing options.pubkey");if(e.currency=e.currency||"g1","g1"===e.currency){var t="june://"+e.pubkey,a=[];return e.amount&&a.push("amount="+e.amount/100),e.comment&&a.push("comment="+e.comment),a.length&&(t+="?"+a.join("&")),n.when([t,"web+"+t])}return n.when([])}},constants:l}}]),angular.module("cesium.market.wallet.services",["cesium.es.services"]).config(["PluginServiceProvider",function(e){e.registerEagerLoadingService("mkWallet")}]).factory("mkWallet",["$rootScope","$q","$timeout","esHttp","$state","$sce","$sanitize","$translate","UIUtils","csSettings","csWallet","csWot","BMA","Device","csPlatform","SocialUtils","CryptoUtils","esWallet","esProfile","esSubscription","mkRecord",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g,f,h,T,b,v){var O,R,I;function N(e){e.profile=void 0,e.name=void 0,e.favorites=e.favorites||{},e.favorites.count=null,O=void 0,R=void 0}function S(e,t){if(t=t||n.defer(),!e||!e.pubkey||!e.keypair)return t.resolve(),t.promise;if(e.name)return t.resolve(e),t.promise;var i=Date.now();return console.debug("[market] [wallet] Checking user profile..."),T.get(e.pubkey).then((function(a){return a?(e.name=a.name,e.avatar=a.avatar,e.profile=a.source,void(e.profile.description=a.description)):O?function(e){if(O){var t=Date.now();return console.debug("[market] [wallet] Saving user profile..."),e.profile=e.profile||{},angular.merge(e.profile,O),h.box.getKeypair().then((function(t){return n.all([r("MARKET.PROFILE.DEFAULT_TITLE",{pubkey:e.pubkey}),g.pack(angular.copy(e.profile.socials||[]),t)])})).then((function(n){var t=n[0],a=n[1];e.name=e.profile.title||t,e.profile.title=e.name,e.profile.issuer=e.pubkey;var i=angular.copy(e.profile);return i.socials=a,T.add(i)})).then((function(){O=void 0,console.info("[market] [wallet] Saving user profile in {0}ms".format(Date.now()-t))})).catch((function(e){throw O=void 0,console.error("[market] [wallet] Error while saving new profile",e),e}))}}(e):(l.alert.error("MARKET.ERROR.INVALID_LOGIN_CREDENTIALS"),t.reject("RETRY"),t.promise)})).then((function(){return function(e){if(R)return a.network.peering.self().then((function(e){if(e&&e.pubkey){var n=angular.merge({type:"email",recipient:e.pubkey,content:{locale:c.data.locale.id,frequency:"daily"}},R);if("email"!==n.type||n.content.email)return b.record.add(n,d);console.warn("Missing email attribute (subscription content). Cannot subscribe!")}})).then((function(){e.subscriptions=e.subscriptions||{count:0},e.subscriptions.count++,R=void 0})).catch((function(e){throw R=void 0,console.error("[market] [wallet] Error while saving new subscription",e),e}))}(e)})).then((function(){console.info("[market] [wallet] Checked user profile in {0}ms".format(Date.now()-i)),t.resolve(e)})).catch(t.reject),t.promise}function A(e,t){t=t||n.defer();var a=Date.now();return console.debug("[market] [user] Loading favorites..."),v.record.like.load({issuer:e.pubkey,kinds:["LIKE","FOLLOW"],size:0}).then((function(n){e.favorites=e.favorites||{},e.favorites.count=n&&n.total||0})).then((function(){console.info("[market] [wallet] Loaded favorites ({0}) in {1}ms".format(e.favorites.count,Date.now()-a)),t.resolve(e)})).catch(t.reject),t.promise}function D(){var n=a.alive;if(!n&&I&&I.length>0){if(console.debug("[market] [user] Disable"),_.forEach(I,(function(e){e()})),I=[],d.isLogin())return N(d.data)}else if(n&&(!I||0===I.length)&&(console.debug("[market] [user] Enable"),function(){I=[d.api.data.on.loginCheck(e,S,this),d.api.data.on.finishLoad(e,A,this),d.api.data.on.init(e,N,this),d.api.data.on.reset(e,N,this)]}(),d.isLogin()))return N(d.data),S(d.data).then(A)}return E.ready().then((function(){return a.api.node.on.start(e,D,this),a.api.node.on.stop(e,D,this),D()})),this.setDefaultProfile=function(e){O=angular.copy(e)},this.setDefaultSubscription=function(e){R=angular.copy(e)},this}]),angular.module("cesium.market.settings.services",["cesium.services","cesium.es.http.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.registerEagerLoadingService("mkSettings")}]).factory("mkSettings",["$rootScope","$q","$timeout","$ionicHistory","Api","csHttp","esHttp","csConfig","csSettings","esSettings","csCurrency",function(e,n,t,a,i,o,s,r,l,c,d){var u,p=angular.merge({plugins:{market:{enable:!0,compactMode:!1,cesiumApi:{enable:!0,baseUrl:"https://g1.duniter.fr/api"},defaultSearch:{geoDistance:50},maxAdAge:31536e3},converse:{jid:"anonymous.duniter.org",bosh_service_url:"https://chat.duniter.org/http-bind/",auto_join_rooms:["gchange@muc.duniter.org"]}}},{plugins:{market:r.plugins&&r.plugins.market||{}}},{plugins:{converse:r.plugins&&r.plugins.converse||{}}}),m=this,E=n.defer();function g(e,t){return t=t||n.defer(),e.plugins=e.plugins||{},e.plugins.market={},angular.merge(e,p),t.resolve(e),t.promise}function f(e){if(o.version.compare(e.version,"1.2.6")<=0&&e.plugins&&e.plugins.market){console.info("[market] [settings] Detected version previous <= 1.2.6 - Fix older settings..."),delete e.plugins.es.market;var t=e.plugins.market.geoDistance;delete e.plugins.market.geoDistance,e.plugins.market.defaultSearch=e.plugins.market.defaultSearch||{},e.plugins.market.defaultSearch.geoDistance=e.plugins.market.defaultSearch.geoDistance||t,e.plugins.market.maxAdAge=p.plugins.market.maxAdAge}e.plugins.es.document=e.plugins.es.document||{},e.plugins.es.document.index="user,page,group,market",e.plugins.es.document.type="profile,record,comment",function(e,t){if(t=t||n.defer(),m.enable){if(m.raw.currencies=e.plugins.market.currencies,m.raw.currencies||!e.plugins.market.defaultCurrency)return d.get().then((function(e){m.raw.currencies=[e.name],console.debug("[market] [settings] Currencies: ",m.raw.currencies),t&&t.resolve(m.raw.currencies)})).catch((function(e){if(!t)throw e;t.reject(e)}));m.raw.currencies=[e.plugins.market.defaultCurrency],console.debug("[market] [settings] Currencies: ",m.raw.currencies),t&&t.resolve(m.raw.currencies)}else m.raw.currencies=[],t&&t.resolve(m.raw.currencies);t.promise}(e)}return c.setPluginSaveSpecs("market",{includes:["geoDistance","compactMode","maxAdAge"],excludes:["enable","homeMessage","defaultTags","defaultAdminPubkeys","record","defaultSearch"],defaultSearch:{},cesiumApi:{}}),m.raw={currencies:void 0},m.isEnable=function(e){return(e=e||l.data).plugins&&e.plugins.es&&e.plugins.es.enable&&e.plugins.market&&e.plugins.market.enable},m.currencies=function(){return E?E.promise.then((function(){return m.raw.currencies})):n.when(m.raw.currencies)},m.getMaxAdAge=function(){return l.data.plugins.market&&l.data.plugins.market.maxAdAge||p.plugins.market.maxAdAge},m.getMinAdTime=function(){return Date.now()/1e3-m.getMaxAdAge()},m.ready=function(){return E?E.promise:n.when()},c.api.state.on.changed(e,(function(n){(n=n&&m.isEnable())!==m.enable&&(m.enable=n,n?(console.debug("[market] [settings] Enable"),function(){u=[l.api.data.on.reset(e,g,this),l.api.data.on.changed(e,f,this)]}()):(console.debug("[market] [settings] Disable"),_.forEach(u,(function(e){e()})),u=[]),f(l.data),E&&(E.resolve(),E=null))})),m}]),angular.module("cesium.market.converse.services",["cesium.es.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.market&&e.registerEagerLoadingService("mkConverse")}]).factory("mkConverse",["$rootScope","$q","$timeout","$translate","esHttp","UIUtils","csConfig","csWallet","Device","csSettings",function(e,n,t,a,i,o,s,r,l,c){var d,u=!1;function p(e){e.xmpp=null}function m(e,i){var r;if(e.name){if(!u)if(u=!0,s.plugins&&s.plugins.converse&&s.plugins.converse.enable)if(o.screen.isSmall())console.debug("[market] [converse] Disabled on small screen"),u=!0;else{var l=e.name?(r=e.name)?String(r).replace(/[^a-zA-Z0-9]+/gm,""):"":e.pubkey.substring(0,8),d=(new Date).getTime();console.debug("[market] [converse] Starting Chatroom with username {"+l+"}..."),converse.plugins.add("gchange-plugin",{initialize:function(){var e=this._converse;n.all([e.api.waitUntil("chatBoxesFetched"),e.api.waitUntil("roomsPanelRendered")]).then((function(){console.debug("[market] [converse] Chatroom started in "+((new Date).getTime()-d)+"ms")}))}});var p=angular.merge({allow_muc_invitations:!1,auto_login:!0,allow_logout:!0,authentication:"anonymous",jid:"anonymous.duniter.org",auto_away:300,auto_join_on_invite:!0,auto_reconnect:!0,minimized:!0,auto_join_rooms:["gchange@muc.duniter.org"],blacklisted_plugins:["converse-mam","converse-otr","converse-register","converse-vcard"],whitelisted_plugins:["gchange-plugin"],bosh_service_url:"https://chat.duniter.org/http-bind/",allow_registration:!1,show_send_button:!1,muc_show_join_leave:!1,notification_icon:"img/logo.png",i18n:a.use()},c.data.plugins&&c.data.plugins.converse||{});p.auto_join_rooms=_.map(p.auto_join_rooms||[],(function(e){return"string"==typeof e?{jid:e,nick:l}:(e.nick=l,e.minimized=!0,e)})),converse.initialize(p).catch(console.error)}else console.debug("[market] [converse] Disabled by config (property 'plugins.converse.enable')"),u=!0}else t((function(){return m(e)}),1e3);return i?i.resolve()&&i.promise:n.when()}function E(){var n=i.alive;if(!n&&d&&d.length>0){if(console.debug("[market] [converse] Disable"),_.forEach(d,(function(e){e()})),d=[],r.isLogin())return p(r.data)}else if(n&&(!d||0===d.length)&&(console.debug("[market] [converse] Enable"),function(){d=[r.api.data.on.login(e,m,this),r.api.data.on.init(e,p,this),r.api.data.on.reset(e,p,this)]}(),r.isLogin()))return m(r.data)}return l.ready().then((function(){return i.api.node.on.start(e,E,this),i.api.node.on.stop(e,E,this),E()})),this.setDefaultProfile=function(e){angular.copy(e)},this}]),le.$inject=["$scope","PluginService"],angular.module("cesium.market.app.controllers",["ngResource","cesium.es.services","cesium.market.modal.services"]).config(["PluginServiceProvider",function(e){e.extendState("app",{points:{"menu-main":{templateUrl:"plugins/market/templates/menu_extend.html",controller:"MarketMenuExtendCtrl"},"menu-user":{templateUrl:"plugins/market/templates/menu_extend.html",controller:"MarketMenuExtendCtrl"},"menu-discover":{templateUrl:"plugins/market/templates/menu_extend.html",controller:"MarketMenuExtendCtrl"}}})}]).controller("MarketMenuExtendCtrl",le),de.$inject=["$scope","$rootScope","$state","$controller","$focus","$timeout","$translate","$q","ModalUtils","UIUtils","csConfig","csSettings","mkModals"],ce.$inject=["$scope","$controller","UIUtils","csPlatform","$state"],angular.module("cesium.market.home.controllers",["ngResource","cesium.es.services","cesium.market.modal.services"]).config(["PluginServiceProvider",function(e){e.extendState("app.home",{points:{buttons:{templateUrl:"plugins/market/templates/home/home_buttons.html",controller:"MarketHomeButtonsCtrl"},"footer-start":{templateUrl:"plugins/market/templates/category/list_categories_lg.html",controller:"MarketHomeFooterCtrl"}}})}]).controller("MarketHomeButtonsCtrl",de).controller("MarketHomeFooterCtrl",ce),angular.module("cesium.market.join.controllers",["cesium.services","cesium.market.services"]).controller("MkJoinModalCtrl",["$scope","$timeout","$state","UIUtils","CryptoUtils","csSettings","csWallet","csCurrency","mkWallet","mkModals",function(e,n,t,a,i,o,s,r,l,c){e.emailPattern="^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,6}$",e.formData={pseudo:"",description:void 0,email:void 0},e.slides={slider:null,options:{loop:!1,effect:"slide",speed:500}},e.isLastSlide=!1,e.showUsername=!1,e.showPassword=!1,e.smallscreen=a.screen.isSmall(),e.enter=function(){r.get().then((function(n){e.currency=n}))},e.$on("modal.shown",e.enter),e.slidePrev=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slidePrev(),e.slides.slider.lockSwipes(),e.isLastSlide=!1},e.slideNext=function(){e.slides.slider.unlockSwipes(),e.slides.slider.slideNext(),e.slides.slider.lockSwipes(),e.isLastSlide=e.slides.slider.activeIndex===e.slides.slider.slides.length-1},e.showAccountPubkey=function(){e.formData.pubkey||(e.formData.computing=!0,i.scryptKeypair(e.formData.username,e.formData.password).then((function(n){e.formData.pubkey=i.util.encode_base58(n.signPk),e.formData.computing=!1})).catch((function(n){e.formData.computing=!1,console.error(">>>>>>>",n),a.alert.error("ERROR.CRYPTO_UNKNOWN_ERROR")})))},e.formDataChanged=function(){e.formData.computing=!1,e.formData.pubkey=null},e.doNext=function(n){if(!n)switch(e.slides.slider.activeIndex){case 0:n="saltForm";break;case 1:n="passwordForm";break;case 2:n="profileForm"}if(n){if(e[n].$submitted=!0,!e[n].$valid)return;"passwordForm"===n||"pseudoForm"===n?(e.slideNext(),e.showAccountPubkey()):e.slideNext()}},e.doNewAccount=function(n){return n?(a.loading.show(),l.setDefaultProfile({title:e.formData.title,description:e.formData.description}),e.formData.email&&l.setDefaultSubscription({type:"email",content:{email:e.formData.email}}),o.data.wallet=o.data.wallet||{},o.data.wallet.alertIfUnusedWallet=!1,s.login(e.formData.username,e.formData.password).catch(a.onError("ERROR.CRYPTO_UNKNOWN_ERROR")).then(e.closeModal).then((function(){return t.go("app.view_wallet")}))):a.alert.confirm("MARKET.JOIN.CONFIRMATION_WALLET_ACCOUNT").then((function(n){n&&e.doNewAccount(!0)}))},e.showHelpModal=function(n){return n||(n=1==e.slides.slider.activeIndex?"join-salt":2==e.slides.slider.activeIndex?"join-password":void 0),c.showHelp({anchor:n})}}]),pe.$inject=["$scope","$controller","$q","csConfig","csWallet","mkWallet"],ue.$inject=["$scope","$controller"],angular.module("cesium.market.login.controllers",["cesium.services"]).controller("MarketEventLoginModalCtrl",pe).controller("MarketLoginModalCtrl",ue),me.$inject=["$scope","$state","$filter","$q","$location","$translate","$controller","$timeout","UIUtils","ModalUtils","csConfig","csSettings","BMA","esProfile","esHttp","mkCategory","mkRecord","mkSettings"],Ee.$inject=["$scope","$rootScope","$controller","$focus","$timeout","$ionicPopover","$translate","$q","mkCategory","mkRecord","csSettings","esShape"],angular.module("cesium.market.search.controllers",["cesium.market.record.services","cesium.es.services","cesium.map.services","cesium.es.common.controllers"]).config(["$stateProvider",function(e){var n=["q","category","shape","location","reload","type","hash","closed","lat","lon","last","old","dist"].join("&");e.state("app.market_lookup",{url:"/market?"+n,views:{menuContent:{templateUrl:"plugins/market/templates/search/lookup.html",controller:"MkLookupCtrl"}},data:{large:"app.market_lookup_lg",silentLocationChange:!0}}).state("app.market_lookup_lg",{url:"/market/lg?"+n,views:{menuContent:{templateUrl:"plugins/market/templates/search/lookup_lg.html",controller:"MkLookupCtrl"}},data:{silentLocationChange:!0}})}]).controller("MkLookupAbstractCtrl",me).controller("MkLookupCtrl",Ee),ge.$inject=["$scope","$q","$ionicScrollDelegate","$controller","$location","$ionicModal","$interval","csConfig","csSettings","ModalUtils","mkRecord"],fe.$inject=["$scope","$http","$interval","$ionicSlideBoxDelegate","$timeout","UIUtils","parameters"],angular.module("cesium.market.gallery.controllers",["cesium.market.record.services","cesium.es.services","cesium.es.common.controllers"]).config(["$stateProvider",function(e){var n=["q","category","shape","location","reload","type","hash","closed","lat","lon","last","old","dist"].join("&");e.state("app.market_gallery",{cache:!0,url:"/gallery/market?"+n,views:{menuContent:{templateUrl:"plugins/market/templates/gallery/view_gallery.html",controller:"MkViewGalleryCtrl"}}})}]).controller("MkViewGalleryCtrl",ge).controller("MkGallerySlideModalCtrl",fe),he.$inject=["$scope","$rootScope","$anchorScroll","$ionicPopover","$state","$ionicHistory","$q","$controller","$timeout","$filter","$translate","UIUtils","ModalUtils","csCrypto","csConfig","csSettings","csCurrency","csWallet","esModals","esProfile","esHttp","mkRecord","mkTx"],_e.$inject=["$scope","$rootScope","$q","$state","$ionicPopover","$timeout","mkRecord","$ionicHistory","$focus","$controller","UIUtils","ModalUtils","BMA","csConfig","esHttp","csSettings","csCurrency","mkSettings"],Te.$inject=["$scope","parameters","csSettings","mkTx"],angular.module("cesium.market.record.controllers",["cesium.market.record.services","cesium.es.services","cesium.es.common.controllers"]).config(["$stateProvider",function(e){e.state("app.market_view_record",{url:"/market/view/:id/:title?refresh",views:{menuContent:{templateUrl:"plugins/market/templates/record/view_record.html",controller:"MkRecordViewCtrl"}}}).state("app.market_view_record_anchor",{url:"/market/view/:id/:title/:anchor?refresh",views:{menuContent:{templateUrl:"plugins/market/templates/record/view_record.html",controller:"MkRecordViewCtrl"}}}).state("app.market_add_record",{cache:!1,url:"/market/add/:type",views:{menuContent:{templateUrl:"plugins/market/templates/record/edit_record.html",controller:"MkRecordEditCtrl"}}}).state("app.market_edit_record",{cache:!1,url:"/market/edit/:id/:title",views:{menuContent:{templateUrl:"plugins/market/templates/record/edit_record.html",controller:"MkRecordEditCtrl"}}})}]).controller("MkRecordViewCtrl",he).controller("MkRecordEditCtrl",_e).controller("MkRecordPaymentModalCtrl",Te),be.$inject=["$scope","$controller","UIUtils"],ve.$inject=["$scope","$controller","UIUtils","csWallet","mkRecord"],angular.module("cesium.market.wallet.controllers",["cesium.es.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){t.plugins&&t.plugins.es&&n.extendState("app.view_wallet",{points:{general:{templateUrl:"plugins/market/templates/wallet/view_wallet_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.market_wallet_records",{url:"/records/wallet",views:{menuContent:{templateUrl:"plugins/market/templates/wallet/view_wallet_records.html",controller:"MkWalletRecordsCtrl"}}}).state("app.market_favorites",{cache:!1,url:"/favorites",views:{menuContent:{templateUrl:"plugins/market/templates/wallet/view_wallet_favorites.html",controller:"MkWalletFavoritesCtrl"}}})}]).controller("MkWalletRecordsCtrl",be).controller("MkWalletFavoritesCtrl",ve),Oe.$inject=["$scope","$translate","UIUtils","csConfig","mkCategory","csSettings"],Re.$inject=["$scope","$controller","$state"],Ie.$inject=["$scope","$controller","$ionicPopup","$translate","$q","UIUtils","csConfig","csSettings","mkCategory"],angular.module("cesium.market.category.controllers",["cesium.market.record.services","cesium.market.category.services","cesium.services"]).config(["$stateProvider",function(e){e.state("app.market_categories",{url:"/market/categories",views:{menuContent:{templateUrl:"plugins/market/templates/category/view_categories.html",controller:"MkViewCategoriesCtrl"}},data:{large:"app.market_categories_lg"}}).state("app.market_categories_lg",{url:"/market/categories/lg",views:{menuContent:{templateUrl:"plugins/market/templates/category/view_categories_lg.html",controller:"MkViewCategoriesCtrl"}}}).state("app.market_categories_edit",{url:"/market/categories/edit",views:{menuContent:{templateUrl:"plugins/market/templates/category/edit_categories.html",controller:"MkEditCategoriesCtrl"}}})}]).controller("MkListCategoriesCtrl",Oe).controller("MkViewCategoriesCtrl",Re).controller("MkEditCategoriesCtrl",Ie),Ne.$inject=["$scope","$controller","UIUtils"],angular.module("cesium.market.wot.controllers",["cesium.es.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){t.plugins&&t.plugins.es&&n.extendStates(["app.user_identity","app.user_identity_name"],{points:{general:{templateUrl:"plugins/market/templates/wot/view_identity_extend.html",controller:"ESExtensionCtrl"},"after-general":{templateUrl:"plugins/market/templates/wot/view_identity_extend.html",controller:"ESExtensionCtrl"}}}),e.state("app.market_identity_records",{url:"/market/records/:pubkey",views:{menuContent:{templateUrl:"plugins/market/templates/wot/view_identity_records.html",controller:"MkIdentityRecordsCtrl"}}})}]).controller("MkIdentityRecordsCtrl",Ne),Se.$inject=["$scope","$controller","$timeout","$state","$filter"],angular.module("cesium.market.document.controllers",["cesium.es.services"]).controller("MkLastDocumentsCtrl",Se),angular.module("cesium.graph.plugin",["cesium.graph.services","cesium.graph.common.controllers","cesium.graph.docstats.controllers","cesium.graph.synchro.controllers","cesium.graph.network.controllers"]),angular.module("cesium.graph.services",["cesium.graph.color.services","cesium.graph.data.services"]),angular.module("cesium.graph.data.services",["cesium.es.http.services"]).factory("gpData",["$rootScope","$q","$timeout","esHttp",function(e,n,t,a){var i={node:{},wot:{},blockchain:{},docstat:{},synchro:{execution:{}},raw:{block:{search:a.post("/:currency/block/_search")},blockstat:{search:a.post("/:currency/blockstat/_search")},movement:{search:a.post("/:currency/movement/_search")},user:{event:a.post("/user/event/_search?pretty")},docstat:{search:a.post("/document/stats/_search")},synchro:{search:a.post("/:currency/synchro/_search")}},regex:{}};function o(e){return(e=e||{}).maxRangeSize=e.maxRangeSize||30,e.defaultTotalRangeCount=e.defaultTotalRangeCount||2*e.maxRangeSize,e.rangeDuration=e.rangeDuration||"day",e.endTime=e.endTime||moment().utc().add(1,e.rangeDuration).unix(),e.startTime=e.startTime||moment.unix(e.endTime).utc().subtract(e.defaultTotalRangeCount,e.rangeDuration).unix(),e.firstBlockTime&&e.startTime<e.firstBlockTime&&(e.startTime=e.firstBlockTime),e}return i.docstat.get=function(e){e=o(e);for(var t=[],a=moment.unix(e.startTime).utc().startOf(e.rangeDuration),s=moment.unix(e.endTime).utc().startOf(e.rangeDuration),r=[],l=function(e){var n=e.aggregations;return(n.range&&n.range.buckets||[]).reduce((function(e,n){var t={from:n.from,to:n.to};return _.forEach(n.index&&n.index.buckets||[],(function(e){var n=e.key;_.forEach(e.type&&e.type.buckets||[],(function(e){var a=n+"_"+e.key;t[a]=e.max.value,d[a]||(d[a]=!0)}))})),e.concat(t)}),[])};a.isBefore(s);)if(r.push({from:a.unix(),to:a.add(1,e.rangeDuration).unix()}),r.length===e.maxRangeSize||!a.isBefore(s)){var c={size:0,aggs:{range:{range:{field:"time",ranges:r},aggs:{index:{terms:{field:"index",size:0},aggs:{type:{terms:{field:"type",size:0},aggs:{max:{max:{field:"count"}}}}}}}}}};r=[];var d={},u={request_cache:!angular.isDefined(e.cache)||e.cache};10===t.length?(console.error("Too many parallel jobs!"),a=moment.unix(e.endTime).utc()):t.push(i.raw.docstat.search(c,u).then(l))}return n.all(t).then((function(e){return e=e.reduce((function(e,n){return n&&n.length?e.concat(n):e}),[]),e=_.sortBy(e,"from"),_.keys(d).reduce((function(n,t){return n[t]=_.pluck(e,t),n}),{times:_.pluck(e,"from")})}))},i.synchro.execution.get=function(e){e=o(e);for(var t=[],a=moment.unix(e.startTime).utc().startOf(e.rangeDuration),s=moment.unix(e.endTime).utc().startOf(e.rangeDuration),r=[],l=function(e){var n=e.aggregations;return(n.range&&n.range.buckets||[]).reduce((function(e,n){var t={from:n.from,to:n.to,inserts:n.result.inserts.value,updates:n.result.inserts.value,deletes:n.result.deletes.value,duration:n.duration.value};return _.forEach(n.api&&n.api.buckets||[],(function(e){
|
||
t[e.key]=e.peer_count&&e.peer_count.value||0,d[e.key]||(d[e.key]=!0)})),e.concat(t)}),[])};a.isBefore(s);)if(r.push({from:a.unix(),to:a.add(1,e.rangeDuration).unix()}),r.length===e.maxRangeSize||!a.isBefore(s)){var c={size:0,aggs:{range:{range:{field:"time",ranges:r},aggs:{api:{terms:{field:"api",size:0},aggs:{peer_count:{cardinality:{field:"peer"}}}},duration:{sum:{field:"executionTime"}},result:{nested:{path:"result"},aggs:{inserts:{sum:{field:"result.inserts"}},updates:{sum:{field:"result.updates"}},deletes:{sum:{field:"result.deletes"}}}}}}}};r=[];var d={};10===t.length?(console.error("Too many parallel jobs!"),a=moment.unix(e.endTime).utc()):t.push(i.raw.synchro.search(c,{currency:e.currency}).then(l))}return n.all(t).then((function(e){e=e.reduce((function(e,n){return n&&n.length?e.concat(n):e}),[]),e=_.sortBy(e,"from");var n={times:_.pluck(e,"from"),inserts:_.pluck(e,"inserts"),updates:_.pluck(e,"updates"),deletes:_.pluck(e,"deletes"),duration:_.pluck(e,"duration")};return _.keys(d).forEach((function(t){n[t]=_.pluck(e,t)})),n}))},i}]),angular.module("cesium.graph.color.services",[]).factory("gpColor",(function(){var e={css2Rgb:{white:[255,255,255],assertive:[239,71,58],calm:[17,193,243],positive:[56,126,245],balanced:[51,205,95],energized:[255,201,0],royal:[136,106,234],gray:[150,150,150],stable:[248,248,248]}},n={scale:{}};return n.scale.custom=function(e,n,t,a){function i(e){switch(e){case 0:return 0;case 1:return-1;case 2:return 0;case 3:return 1}}n=n>0&&n||.55;for(var o=Math.round(e/2.5),s=t&&3==t.length?angular.copy(t):[255,0,0],r=a&&3==a.length?angular.copy(a):[0,2,3],l=t?[Math.round(255/o),Math.round(255/o),Math.round(255/o)]:[Math.round((s[0]-50)/o),Math.round((255-s[1])/o),Math.round((255-s[2])/o)],c=[i(r[0]),i(r[1]),i(r[2])],d=[0,0,0],u=[],p=0;p<e;p++){for(var m=0;m<3;m++)s[m]+=c[m]*l[m],d[m]++,((s[m]<=0||s[m]>=255)&&0!==c[m]||0===c[m]&&d[m]==o)&&(s[m]<=0?s[m]=0:s[m]>=255&&(s[m]=255),r[m]=(r[m]+1)%4,c[m]=i(r[m]),d[m]=0);u.push("rgba("+s[0]+","+s[1]+","+s[2]+","+n+")")}return u},n.scale.default=function(){return n.scale.custom(25)},n.scale.fix=function(e,t){return Array.apply(null,Array(e||25)).map(String.prototype.valueOf,t||n.rgba.calm(.5))},n.rgba=_.mapObject(e.css2Rgb,(function(e){var n="rgba("+e.join(",")+",";return function(t){return!t||t<0?"rgb("+e.join(",")+")":n+t+")"}})),n.rgba.translucent=function(){return"rgb(0,0,0,0)"},n.constants=e,n})),Ae.$inject=["$scope","$filter","$ionicPopover","$ionicHistory","$state","csSettings","csCurrency","UIUtils"],angular.module("cesium.graph.common.controllers",["cesium.services"]).controller("GpCurrencyAbstractCtrl",Ae),De.$inject=["$scope","$state","$controller","$q","$translate","gpColor","gpData","$filter"],angular.module("cesium.graph.docstats.controllers",["chart.js","cesium.graph.services","cesium.graph.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){e.state("app.doc_stats_lg",{url:"/data/stats?stepUnit&t&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/docstats/view_stats.html",controller:"GpDocStatsCtrl"}}}),t.plugins&&t.plugins.es}]).controller("GpDocStatsCtrl",De),Ce.$inject=["$scope","$controller","$q","$translate","gpColor","gpData","$filter"],angular.module("cesium.graph.synchro.controllers",["chart.js","cesium.graph.services","cesium.graph.common.controllers"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){e.state("app.doc_synchro_lg",{url:"/data/synchro?stepUnit&t&hide&scale",views:{menuContent:{templateUrl:"plugins/graph/templates/synchro/view_stats.html",controller:"GpSynchroCtrl"}}}),t.plugins&&t.plugins.es}]).controller("GpSynchroCtrl",Ce),Le.$inject=["$scope","PluginService","esSettings"],Pe.$inject=["$scope","$timeout","PluginService","esSettings","csCurrency","gpData"],angular.module("cesium.graph.network.controllers",["chart.js","cesium.graph.services"]).config(["$stateProvider","PluginServiceProvider","csConfig",function(e,n,t){t.plugins&&t.plugins.es&&n.extendState("app.es_network",{points:{buttons:{templateUrl:"plugins/graph/templates/network/view_es_network_extend.html",controller:"GpNetworkViewExtendCtrl"}}}).extendState("app.view_es_peer",{points:{general:{templateUrl:"plugins/graph/templates/network/view_es_peer_extend.html",controller:"ESExtensionCtrl"}}})}]).controller("GpNetworkViewExtendCtrl",Le).controller("GpPeerViewExtendCtrl",Pe),angular.module("cesium.map.plugin",["ui-leaflet","cesium.map.services","cesium.map.shape.controllers","cesium.map.home.controllers","cesium.map.user.controllers"]).config((function(){L.AwesomeMarkers.Icon.prototype.options.prefix="ion"})),angular.module("cesium.map.services",["cesium.map.utils.services","cesium.map.shape.services"]),angular.module("cesium.map.utils.services",["cesium.services","ui-leaflet"]).factory("MapUtils",["$timeout","$q","$translate","leafletData","csConfig","csSettings","esGeo","UIUtils","leafletHelpers",function(e,n,t,a,i,o,s,r,l){var c=i.plugins&&i.plugins.es&&i.plugins.es.googleApiKey;function d(e,n){return l.isSameCenterOnMap(e,n)}return constants={locations:{FRANCE:{lat:46.5588603,lng:4.229736328124999,zoom:6}},LOCALIZE_ZOOM:14},constants.DEFAULT_CENTER=o.data&&o.data.plugins&&o.data.plugins.map&&o.data.plugins.map.center||constants.locations.FRANCE,{map:function(e){var n;return(e=angular.merge({center:angular.copy(constants.DEFAULT_CENTER),defaults:{scrollWheelZoom:!0},layers:{baselayers:{osm:{name:"OpenStreetMap",type:"xyz",url:"http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",layerOptions:{subdomains:["a","b","c"],attribution:'© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',continuousWorld:!0}},cycle:{name:"Google map",type:"xyz",url:"http://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}&key="+c,layerOptions:{subdomains:["mt0","mt1","mt2","mt3"],attribution:'© <a href="http://google.com/copyright">Google</a>',continuousWorld:!0}}}},controls:{custom:[]}},e||{})).layers.overlays&&(n=_.keys(e.layers.overlays).reduce((function(n,t){return n.concat(e.layers.overlays[t].name)}),[]),t(n).then((function(n){_.keys(e.layers.overlays||{}).forEach((function(t){e.layers.overlays[t].name=n[e.layers.overlays[t].name]}))}))),e},center:{get:function(e){var n;if(e&&(e.lat&&((n={}).lat=parseFloat(e.lat)),(e.lng||e.lon)&&((n=n||{}).lng=parseFloat(e.lng||e.lon)),e.zoom&&((n=n||{}).zoom=parseFloat(e.zoom)),n))return l.isValidCenter(n)||(n=angular.merge({},constants.DEFAULT_CENTER,n)),n},isSame:d,isDefault:function(e){var n=constants.DEFAULT_CENTER;return!(!e.lat||!e.lng||n.lat.toFixed(4)!==e.lat.toFixed(4)||n.lng.toFixed(4)!==e.lng.toFixed(4)||n.zoom!==e.zoom)}},updateCenter:function(t,a){return d(a,t)?n.when():e((function(){t.invalidateSize(),t._resetView(a,a.zoom,!0)}),300)},control:{search:function(e){(e=e||{}).initial=!!angular.isDefined(e.initial)&&e.initial,e.marker=!!angular.isDefined(e.marker)&&e.marker,e.propertyName=angular.isDefined(e.propertyName)?e.propertyName:"title",e.position=angular.isDefined(e.position)?e.position:"topleft",e.zoom=angular.isDefined(e.zoom)?e.zoom:constants.LOCALIZE_ZOOM,e.markerLocation=!angular.isDefined(e.markerLocation)||e.markerLocation;var n=t(["MAP.COMMON.SEARCH_DOTS","COMMON.SEARCH_NO_RESULT"]);return{addTo:function(t){n.then((function(n){L.control.search(angular.merge(e,{textPlaceholder:n["MAP.COMMON.SEARCH_DOTS"],textErr:n["COMMON.SEARCH_NO_RESULT"]})).addTo(t)}))}}},localizeMe:function(){return L.easyButton("icon ion-android-locate",(function(e,n){return s.point.current().then((function(e){n.invalidateSize(),n._resetView({lat:e.lat,lng:e.lon},constants.LOCALIZE_ZOOM,!0)})).catch(r.onError("MAP.ERROR.LOCALIZE_ME_FAILED"))}))}},constants:constants}}]),angular.module("cesium.map.shape.services",["cesium.services","cesium.map.utils.services","cesium.graph.color.services"]).factory("esShape",["$rootScope","$q","csPlatform","csCache","esHttp","gpColor",function(e,n,t,a,i,o){var s={shapesById:null},r={commons:["type","geometry","properties"]},l=d3.geoMercator,c={attributes:{geoViewBox:"gchange:geoViewBox",geoScale:"gchange:geoScale",geoTranslate:"gchange:geoTranslate",viewBox:"viewBox"},style:{defaults:{fill:"#1a237e",stroke:"lightgrey"},active:{fill:o.rgba.balanced()}},projection:{degreePrecision:1e-5},positions:["topleft","bottomleft","main","topright","bottomright"]},d={postSearch:i.post("/shape/record/_search"),get:i.get("/shape/record/:id"),getCommons:i.get("/shape/record/:id?_source="+r.commons.join(",")),add:i.record.post("/shape/record"),update:i.record.post("/shape/record/:id/_update"),remove:i.record.remove("shape","record")},u={error:{SELF_INTERSECTION:new RegExp("Self-intersection at or near point \\(([0-9.-]+), ([0-9.-]+),"),HOLE_LIES_OUTSIDE:new RegExp("Hole lies outside shell at or near point \\(([0-9.-]+), ([0-9.-]+),"),HOLE_NOT_WITHIN_POLYGON:new RegExp("Hole is not within polygon")}};function p(e){var n=e._source;return n.id=e._id,n}function m(e){var n=[];e&&e.country&&n.push({nested:{path:"properties",query:{bool:{filter:{term:{"properties.country":e.country}}}}}});var t={size:1e3,_source:"properties.id"};return n.length&&(t.query=t.query||{bool:{}},t.query.bool.filter=n),d.postSearch(t).then((function(e){return e&&e.hits&&e.hits.total?_.pluck(e.hits.hits,"_id"):[]}))}function E(e,n){if(!e)throw new Error("Missing geoJson argument");(n=n||{}).onclick=n.onclick||function(){console.debug("TODO: handle click on a SVG element")},n.selector&&!0!==n.append&&d3.selectAll(n.selector+" svg").remove();var t=n.selector||"body",a=d3.select(t);if(n.selector&&a.empty())throw new Error("Cannot found element '{0}'".format(t));var i=n.width||a.node().getBoundingClientRect().width,o=n.height||i,s=l().translate([0,0]).scale(1),r=d3.geoPath().projection(s),d=a.append("svg").attr("preserveAspectRatio","xMinYMin meet").attr("viewBox",[0,0,i,o].join(" ")).attr("width",i).attr("height",o);n.class&&d.attr("class",n.class);var u=r.bounds(e),p=u[0][0],m=u[0][1],E=u[1][0],g=u[1][1],f=E-p,h=g-m,_=.95/Math.max(f/i,h/o),T=[(i-_*(E+p))/2,(o-_*(g+m))/2];return s.scale(_).translate(T),d.selectAll("path").data(e.features).enter().append("path").attr("d",r).on("mouseover",(function(e){d3.select(this).style("fill",c.style.active.fill).style("cursor","pointer")})).on("mouseout",(function(e){d3.select(this).style("fill",c.style.defaults.fill)})).on("click",(function(e){n.onclick(e,this)})).style("fill",c.style.defaults.fill).style("stroke",c.style.defaults.stroke).append("svg:title").text((function(e){return e.properties&&e.properties.title})),d}function g(e){if(e){var n=e.attr(":"+c.attributes.geoViewBox)||e.attr(":"+c.attributes.geoViewBox.toLowerCase());if(!n){var t="svg"!==e.node().tagName&&d3.select(e.node().parentNode);if(!t||t.empty())return;return g(t)}var a=n.split(" ");if(4!==a.length)throw new Error('Invalid geoViewBox value. Expected: "left-lng top-lat right-lng bottom-lat"');return{leftLng:parseFloat(a[0]),topLat:parseFloat(a[1]),rightLng:parseFloat(a[2]),bottomLat:parseFloat(a[3])}}}function f(e){if(e){var n=e.attr(c.attributes.viewBox)||e.attr(c.attributes.viewBox.toLowerCase());if(!n){var t=e.attr("width"),a=e.attr("height");if(t&&a)return{minX:0,minY:0,width:parseFloat(t),height:parseFloat(a)}}if(!n){var i="svg"!==e.node().tagName&&d3.select(e.node().parentNode);if(!i||i.empty())return;return f(i)}var o=n.split(" ");if(4!==o.length)throw new Error('Invalid geoViewBox value. Expected: "minx-x min-y width height"');return{minX:parseFloat(o[0]),minY:parseFloat(o[1]),width:parseFloat(o[2]),height:parseFloat(o[3])}}}function h(e){if(e){var n=e.attr(":"+c.attributes.geoScale)||e.attr(":"+c.attributes.geoScale.toLowerCase());if(!n){var t="svg"!==e.node().tagName&&d3.select(e.node().parentNode);if(!t||t.empty())return;return h(t)}return parseFloat(n)}}function T(e,n){if(!e||"string"!=typeof e)throw new Error("Missing required 'svgText' argument");var t=(n=n||{}).selector||"body",a=d3.select(t);if(n.selector&&a.empty())throw new Error("Cannot found element: '{0}'".format(t));var i=a.html(e).select("svg");if(i.empty())throw new Error("Invalid value of 'svgText' argument: no <svg> tag found");if(n.class&&i.classed(n.class,!0),n.width&&(i.attr("width",n.width),i.attr("height",n.height||n.width)),!i.attr("width")||!i.attr("height")){var o=f(i);i.attr("width",o&&o.width||n.width||800).attr("height",o&&o.height||n.height||800)}return i}function b(e,n){if((n=n||{}).scale=n.scale||h(e),n.translate=n.translate||function(e){if(e){var n=e.attr(":"+c.attributes.geoTranslate)||e.attr(":"+c.attributes.geoTranslate.toLowerCase());if(!n){var t="svg"!==e.node().tagName&&d3.select(e.node().parentNode);if(!t||t.empty())return;return h(t)}var a=n.split(" ");if(2!==a.length)throw new Error('Invalid geoTranslate value. Expected: "x y"');return[parseFloat(a[0]),parseFloat(a[1])]}}(e),n.scale&&n.translate)return console.debug("[shape] Find project {scale: {0}, translate: {1}}".format(n.scale,n.translate)),n;var t=n.viewBox||f(e),a=n.geoViewBox||g(e);if(!a||!t)throw new Error("Cannot compute projection. Missing options scale and translate, or <svg> viewBox and/or geoViewBox");console.debug("[shape-service] Computing projection...",t,a);var i=[a.leftLng,a.topLat],o=[a.rightLng,a.bottomLat],s=[t.minX,t.minY],r=[t.minX+t.width,t.minY+t.height],d=a.rightLng-a.leftLng,u=(a.topLat,a.bottomLat,l()),p=0,m=0,E=1e3,_=100,T=100,b=100,v=c.projection.degreePrecision,O=Date.now(),R=function(){if(Date.now()-O>=2e3)throw"TIMEOUT"},I=0;try{for(var N,S;;){++I%20==0&&R(),u.translate([p,m]).scale(E);var A,D,C=u.invert(s),L=u.invert(r),P=L[0]-C[0],y=(C[1],L[1],P-d),k=C[0]-i[0],M=L[0]-o[0],w=Math.abs(k)>Math.abs(M)?k:M,U=C[1]-i[1],x=L[1]-o[1],F=Math.abs(U)>Math.abs(x)?U:x;if(Math.abs(y)>=v&&(D=y<0?-1:1,N===(A="scale")&&D!==S&&(_/=2),_>=v))E+=D*_,N=A,S=D,console.debug("Bad width. New scale={0} (delta: {1}}".format(E,_));else if(Math.abs(w)>=v&&(D=w<0?-1:1,N===(A="x")&&D!==S&&(T/=2),T>=v))p+=D*T,N=A,S=D,console.debug("Bad X. New={0} (delta: {1}}".format(p,T));else{if(!(Math.abs(F)>=v&&(D=F<0?1:-1,N===(A="y")&&D!==S&&(b/=2),b>=v))){console.debug("Projection resolved in {0}ms => {translate: [{1}, {2}], scale: {3}}".format(Date.now()-O,p,m,E));break}m+=D*b,N=A,S=D,console.debug("Bad Y. New={0} (delta: {1}}".format(m,b))}}}catch(e){if("TIMEOUT"!==e)throw e;console.error("[shape-service] Stopping projection computation (timeout)")}return{translate:[p,m],scale:E}}function v(e,t){if(!e)throw new Error("Require 'shape' argument");if(!(t=t||e.properties&&e.properties.id))throw new Error("Invalid GeoJSon feature : missing required attribute 'properties.id'");return console.info("[shape] Saving GeoJson feature {{0}} locally...".format(t)),s.shapesById=s.shapesById||a.get("esShape-",a.constants.LONG),s.shapesById.put(t,e),n.when(t)}function O(e,n){switch(n=!angular.isDefined(n)||n,e&&e.type||null){case"FeatureCollection":return e.features=e.features.map((t=O,a=n,function(e){return t(e,a)})),e;case"Feature":return e.geometry=O(e.geometry,n),e;case"Polygon":case"MultiPolygon":return function(e,n){return"Polygon"===e.type?e.coordinates=R(e.coordinates,n):"MultiPolygon"===e.type&&(e.coordinates=_(e.coordinates).map((function(e){return R(e,n)}))),e}(e,n);default:return e}var t,a}function R(e,n){n=!!n,e[0]=I(e[0],!n);for(var t=1;t<e.length;t++)e[t]=I(e[t],n);return e}function I(e,n){return N(e)===n?e:e.reverse()}function N(e){return function(e){var n=0;if(e.length>2){for(var t,a,i=0;i<e.length-1;i++)t=e[i],n+=S((a=e[i+1])[0]-t[0])*(2+Math.sin(S(t[1]))+Math.sin(S(a[1])));n=6378137*n*6378137/2}return n}(e)>=0}function S(e){return e*Math.PI/180}function A(e){switch(e&&e.type||null){case"FeatureCollection":return e.features=e.features.map(A),e;case"Feature":return e.geometry=A(e.geometry),e;case"Polygon":case"MultiPolygon":return"Polygon"===(n=e).type?n.coordinates=[n.coordinates[0]]:"MultiPolygon"===n.type&&(n.coordinates=_(n.coordinates).map((function(e){return[e[0]]}))),n;default:return e}var n}function D(){console.debug("[shape] Cleaning cache..."),a.clear("esShape-")}return t.ready().then((function(){i.api.node.on.stop(e,D,this)})),{get:function(e,t){if(!e)throw new Error("Missing 'id' argument");if((!t||!1!==t.cache)&&s.shapesById){var a=s.shapesById.get(e);if(a)return n.when(a)}return d.getCommons({id:e}).then((function(n){var t=p(n);return v(e,t),t})).catch((function(e){throw console.error("Unable to load shape by id",e),e}))},save:function(e,t){if(t=t||{},!e)throw new Error("Missing 'geoJson' argument");t&&!1===t.strictMode||(e=O(e,!1)),t&&!1===t.removeHole||(e=A(e));var a=t.country||e.properties&&e.properties.country;if(!a)throw new Error("Missing 'options.country' argument");a=a.toLowerCase();var i="function"==typeof t.updateProgression?t.updateProgression:null,o=Date.now();console.debug("[shape-service] Saving shape {country: {0}}...".format(a));var s,r,l=[],c=e.features.length;return n.all([m(),m({country:a})]).then((function(t){return s=t[0],r=t[1],e.features.reduce((function(e,n,t){n.properties=n.properties||{},n.properties.country=a;var o,p=n.properties.id;if(!angular.isUndefined(p)&&s.includes(p)&&p.toLowerCase().startsWith(a))r.splice(r.indexOf(n.properties.id),1),o=function(){return i&&i(p,t,c),console.debug("[shape-service] - Update {id: {0}}".format(n.properties.id)),d.update(n,{id:n.properties.id})};else{for(var m=t;!n.properties.id||s.includes(p);m++)p=a+"-"+m;n.properties.id=p,s.push(p),o=function(){return console.debug("[shape-service] - Add {id: {0}}".format(p)),i&&i(n,t,c),d.add(n)}}return e.then(o).catch((function(e){e=function(e,n){if(console.error("Error while updating {id: {0}}: {1}".format(n,e&&e.message||e)),!e.message)return e;var t=u.error.SELF_INTERSECTION.exec(e.message);return t?{type:"error",message:"MAP.SHAPE.EDIT.ERROR.SELF_INTERSECTION",messageParams:{id:n},lon:parseFloat(t[1]),lat:parseFloat(t[2])}:(t=u.error.HOLE_LIES_OUTSIDE.exec(e.message))?{type:"error",message:"MAP.SHAPE.EDIT.ERROR.HOLE_LIES_OUTSIDE",messageParams:{id:n},lon:parseFloat(t[1]),lat:parseFloat(t[2])}:(t=u.error.HOLE_NOT_WITHIN_POLYGON.exec(e.message))?{type:"error",message:"MAP.SHAPE.EDIT.ERROR.HOLE_NOT_WITHIN_POLYGON",messageParams:{id:n}}:e}(e,n.properties.id),l.push(e&&e.message?e:"Error while updating {id: {0}}: {1}".format(n.properties.id,e))}))}),n.when())})).then((function(){if(r.length)return r.reduce((function(e,n,t){return console.debug("[shape-service] - Delete {id: {0}}".format(n)),d.remove(n).catch((function(e){l.push("Error while deleting {id: {0}}: {1}".format(n,e&&e.message||e))}))}),n.when())})).then((function(){if(l.length)throw console.error(" - "+l.join("\n -")),{message:"MAP.SHAPE.EDIT.ERROR.SAVE_FAILED",errors:l};console.debug("[shape-service] Shape saved in {0}ms".format(Date.now()-o))}))},getAllIds:m,getAllCountries:function(){return d.postSearch({size:0,aggs:{countries:{nested:{path:"properties"},aggs:{names:{terms:{field:"properties.country",size:0}}}}}}).then((function(e){return e&&e.hits&&e.hits.total?e.aggregations.countries.names.buckets.reduce((function(e,n){return e.concat({id:n.key,docCount:n.doc_count})}),[]):[]}))},geoJson:{search:function(e){if(!e)throw new Error("Missing 'options' argument");console.debug("[map] [shape] Loading shape from options: ",e);var n=[],t=[];e.country&&t.push({nested:{path:"properties",query:{bool:{filter:{term:{"properties.country":e.country}}}}}});var a={};return n.length&&(a.query={bool:{}},a.query.bool.should=n,a.query.bool.minimum_should_match=1),t.length&&(a.query=a.query||{bool:{}},a.query.bool.filter=t),a.from=a.from||0,a.size=a.size||100,a.size<100&&(a.size=100),a._source=a._source||r.commons,d.postSearch(a).then((function(e){if(e&&e.hits&&e.hits.total)return{type:"FeatureCollection",features:(e.hits.hits||[]).map(p)}}))}},cache:{put:v,clear:D},svg:{create:E,remove:function(e){if(!e&&!e.selector)throw new Error("Missing 'options.selector' argument");d3.select(e.selector+" svg").remove()},createMosaic:function(e,n){if(!e)throw new Error("Missing 'geoJson' argument");if(!e.features)throw new Error("Missing 'geoJson.features' argument");var t=(n=n||{}).selector||"body",a=d3.select(t).classed("shape-container",!0);if(n.compacted?a.classed("compacted",!0):n.compacted=a.classed("compacted"),n.selector&&a.empty())throw new Error("Cannot found element: '{0}'".format(t));var i=n.width||a.node().getBoundingClientRect().width,o=n.height||i,s=_.groupBy(e.features,(function(e){return e.properties&&e.properties.position||"main"}));a.selectAll("*").remove(),_(c.positions).each((function(r){var l=s[r];if(l){var c,d=t+" ."+r;if(a.append("div").classed(r,!0),"main"===r)c=n.compacted?i:.8*i,E({type:e.type,features:l},angular.merge({},n,{selector:d,append:!1,width:c,height:Math.min(c,o)}));else{l=_.sortBy(l,(function(e){return e.properties&&e.properties.order||999})),c=.1*i;var u=angular.merge({},n,{selector:d,append:!0,width:c,height:Math.min(c,o/12)});_.each(l,(function(n){E({type:e.type,features:[n]},u)}))}}}))},findGeoViewBox:g,createFromText:T,projectionData:b,toGeoJson:function(e,n){if(!e)throw new Error("Missing required 'svgElement' argument");(n=n||{}).attributes=n.attributes||["id","name","title"],n.scale=n.scale||1,n.precision=n.precision>0?n.precision:null;var t=n.selector||"body",a=d3.select(t);if(n.selector&&a.empty())throw new Error("Cannot found element: '{0}'".format(t));if((e="string"==typeof e?T(e,n):e||a.select("svg")).empty())throw new Error("Cannot found element <svg> element");var i=f(e);if(!i)throw new Error("Bad SVG format: missing attribute '{0}'".format(c.attributes.viewBox));var o=n.geoViewBox||g(e);if(!o)throw new Error("Bad SVG format: missing attribute '{0}'".format(c.attributes.geoViewBox));var s,r=b(e,angular.merge({},n,{viewBox:i,geoViewBox:o}));if(r)s=l().translate(r.translate||[0,0]).scale(r.scale||1).invert;else{var d=d3.scaleLinear().range([o.leftLng,o.rightLng]).domain([i.minX,i.width]),u=d3.scaleLinear().range([o.topLat,o.bottomLat]).domain([i.minY,i.height]);s=function(e){return[d(e[0])*n.scale,u(e[1])*n.scale]}}var p=[];return e.selectAll("path").each((function(){var e=d3.select(this),t=function(e,n,t){if(!e||!n)throw new Error("Missing 'element' or 'projection' argument");"function"!=typeof e.node&&(e=d3.select(e));var a=e.node().tagName;if("svg"===a)throw new Error("Invalid 'svgElement': must be child of <svg> tag, but not the <svg> tag itself.");if("rect"===a){var i=e.x.baseVal.value,o=e.y.baseVal.value,s=e.height.baseVal.value,r=e.width.baseVal.value;return{type:"Polygon",coordinates:[[n([i,o]),n([i,o+s]),n([i+r,o+s]),n([i+r,o]),n([i,o])]]}}if("polyline"===a)throw new Error("polyline not implemented yet");if("path"===a){var l=e.attr("d");if(!l)return[];var d,u=(l=l.trim().replace(/([0-9])-([0-9])/g,"$1,$2").replace(/([0-9])([a-zA-Z])/g,"$1 $2").replace(/([a-zA-Z])([-0-9])/g,"$1 $2")).split(" "),p=/^[a-zA-Z]/,m=[],E=[],g=0;_(u||[]).forEach((function(e,n){if(p.test(e)){switch(d=e.substr(0,1)){case"z":case"Z":E.length&&(E.length>1&&(E.push(E[0]),E.length>=4?m.push(E):console.debug("[shape-service] An invalid polygon has been ignore",E)),d=void 0,E=[],g=!1)}e=e.substr(1)}if(g>0)g--;else if(e&&e.trim().length>0){var t=e.split(",");if(t.length>2)return;t=_(t).map(parseFloat);var a,i=E.length,o=i&&E[i-1];if(!o&&m.length){var s=m[m.length-1];o=s.length&&s[s.length-1]}switch(d){case"M":2===t.length&&(a=t),d="L";break;case"m":2===t.length&&(a=o?[t[0]+o[0],t[1]+o[1]]:t),d="l";break;case"L":2===t.length&&(a=t);break;case"l":2===t.length&&(a=o?[t[0]+o[0],t[1]+o[1]]:t);break;case"H":1===t.length&&(a=o?[t[0],o[1]]:[t[0],0]);break;case"h":1===t.length&&(a=o?[t[0]+o[0],o[1]]:[t[0],0]);break;case"V":1===t.length&&(a=o?[o[0],t[0]]:[0,t[0]]);break;case"v":1===t.length&&(a=o?[o[0],t[0]+o[1]]:[0,t[0]]);break;case"C":console.warn("[svg] SVG curve action. Skipping"),d="L",g=1;break;case"c":console.warn("[svg] SVG curve action. Skipping"),d="l",g=1}a?E.push(a):console.warn("[svg] Invalid {0} data: "+e)}})),E.length>=4&&(console.warn("[svg] Invalid polygon found (not closed). Will force last point."),m.push(E));var f,h=[],T=[];return _(m).each((function(e,a){var i=N(e);0===T.length&&(f=i);var o=i!==f;console.debug("At index {0} {clockwise: {1}, isHole: {2}}".format(a,i,o));var s=function(e){var a=[],i=c.projection.degreePrecision,o=0;return _(e).each((function(e){if(2!==e.length)throw new Error("Invalid point: "+e.join(","));var s,r,l=n(e);t&&(l=[Math.round(l[0]/i)*i,Math.round(l[1]/i)*i]),a.length&&(s=l,r=a[a.length-1],s[0]===r[0]&&s[1]===r[1])?o++:a.push(l)})),o>0&&console.debug("[shape-service] Removed {0} duplicated points".format(o)),a}(e);!o&&T.length&&(h.push(T),T=[]),s.length>=4&&T.push(s)})),T.length&&h.push(T),1===h.length?{type:"Polygon",coordinates:h[0]}:{type:"MultiPolygon",coordinates:h}}}(e,s,n.precision),a={};_(n.attributes||[]).forEach((function(n){var t=e.attr(n);t&&(a[n]=t)})),p.push({type:"Feature",properties:a,geometry:t})})),{type:"FeatureCollection",features:p}}},constants:c}}]),ye.$inject=["$scope","$translate","$timeout","$q","$document","UIUtils","csConfig","csSettings","esShape"],ke.$inject=["$scope","$rootScope","$state","$controller","$timeout","$q","leafletData","$translate","FileSaver","UIUtils","MapUtils","csWallet","esShape"],angular.module("cesium.map.shape.controllers",["cesium.services","cesium.map.shape.services"]).config(["$stateProvider",function(e){e.state("app.map_shape_country_edit",{url:"/map/country/edit",views:{menuContent:{templateUrl:"plugins/map/templates/shape/edit_shape.html",controller:"MapCountryEditCtrl"}}})}]).controller("MapShapeViewCtrl",ye).controller("MapCountryEditCtrl",ke),Me.$inject=["$scope","$rootScope","$controller","$state","csPlatform","UIUtils","esShape","csSettings"],angular.module("cesium.map.home.controllers",["ngResource","cesium.es.services","cesium.map.shape.controllers"]).config(["PluginServiceProvider",function(e){e.extendState("app.home",{points:{"footer-end":{templateUrl:"plugins/map/templates/shape/view_shape.html",controller:"MapHomeCtrl"}}})}]).controller("MapHomeCtrl",Me),angular.module("cesium.map.user.controllers",["cesium.services","cesium.map.services"]).config(["PluginServiceProvider","csConfig",function(e,n){n.plugins&&n.plugins.es&&e.extendState("app.user_edit_profile",{points:{"after-position":{templateUrl:"plugins/map/templates/user/edit_profile_extend.html",controller:"MapEditProfileViewCtrl"}}})}]).controller("MapEditProfileViewCtrl",["$scope","$timeout","$q","MapUtils","$translate",function(e,n,t,a,i){var o=[];e.mapId="map-user-profile-"+e.$id,e.map=a.map({markers:{},center:{zoom:13},defaults:{tileLayerOptions:{attribution:'© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'}}}),e.loading=!0,e.enter=function(t,a){return e.formData&&e.formData.title?(e.loading=!0,e.load()):n(e.enter,500)},e.$on("$csExtension.enter",e.enter),e.$on("$ionicParentView.enter",e.enter),e.load=function(){return e.formData.geoPoint&&e.formData.geoPoint.lat&&e.formData.geoPoint.lon?e.map.markers.geoPoint?(e.map.markers.geoPoint.lat=e.formData.geoPoint.lat,void(e.map.markers.geoPoint.lng=e.formData.geoPoint.lon)):i("MAP.PROFILE.MARKER_HELP").then((function(n){e.map.markers.geoPoint={message:n,lat:parseFloat(e.formData.geoPoint.lat),lng:parseFloat(e.formData.geoPoint.lon),draggable:!0,focus:!0},angular.extend(e.map.center,{lat:e.map.markers.geoPoint.lat,lng:e.map.markers.geoPoint.lng});var t=e.$watch("map.markers.geoPoint",(function(){e.loading||e.map.markers.geoPoint&&e.map.markers.geoPoint.lat&&e.map.markers.geoPoint.lng&&(e.formData.geoPoint=e.formData.geoPoint||{},e.formData.geoPoint.lat=e.map.markers.geoPoint.lat,e.formData.geoPoint.lon=e.map.markers.geoPoint.lng)}),!0);o.push(t),e.ionItemClass||(e.ionItemClass="done in"),e.loading=!1})):(_.forEach(o,(function(e){e()})),o=[],delete e.map.markers.geoPoint,e.loading=!1,t.when())},e.$watch("formData.geoPoint",(function(){e.loading||e.load()}),!0)}]),angular.module("gchange",["ionic","ionic-material","ngMessages","pascalprecht.translate","ngApi","angular-cache","angular.screenmatch","angular.bind.notifier","angular-fullscreen-toggle","ImageCropper","ngFileSaver","ngIdle","cesium.plugins","cesium.filters","cesium.config","cesium.platform","cesium.controllers","cesium.templates","cesium.translations","cesium.components","cesium.directives"]).config(["$urlRouterProvider",function(e){e.deferIntercept()}]).run(["$rootScope","$translate","$state","$window","ionicReady","$urlRouter","Device","UIUtils","$ionicConfig","PluginService","csPlatform",function(e,n,t,a,i,o,s,r,l,c,d){d.disableChangeState(),e.$on("$stateChangeStart",(function(n,a,i,o){if(!n.defaultPrevented&&a.data&&!e.tour&&!n.currentScope.tour)return a.data.large&&!r.screen.isSmall()?(n.preventDefault(),void t.go(a.data.large,i)):void 0})),e.$on("$locationChangeSuccess",(function(e,n,a){t.current.data&&!0===t.current.data.silentLocationChange&&a&&a.split("?")[0]===n.split("?")[0]&&e.preventDefault()})),o.listen(),c.start(),i().then((function(){ionic.Platform.isIOS()&&window.StatusBar&&StatusBar.styleLightContent()}))}]),window.ionic.Platform.ready((function(){angular.bootstrap(document,["gchange"])})),angular.module("cesium.components",[]).component("csAvatar",{bindings:{avatar:"<",icon:"@"},template:'<i ng-if="!$ctrl.avatar" class="item-image icon {{$ctrl.icon}}"></i><i ng-if="$ctrl.avatar" class="item-image avatar" style="background-image: url({{::$ctrl.avatar.src}})"></i>'}).component("csBadgeCertification",{bindings:{requirements:"=",parameters:"<",csId:"@"},templateUrl:"templates/common/badge_certification_count.html"}).component("csBadgeGivenCertification",{bindings:{identity:"=",parameters:"<",csId:"@"},templateUrl:"templates/common/badge_given_certification_count.html"}).component("csSortIcon",{bindings:{asc:"=",sort:"=",toggle:"<"},template:'<i class="ion-chevron-up" ng-class="{gray: !$ctrl.asc || $ctrl.sort != $ctrl.toggle}" style="position: relative;left : 5px; top:-5px; font-size: 9px;"></i><i class="ion-chevron-down" ng-class="{gray : $ctrl.asc || $ctrl.sort != $ctrl.toggle}" style="position: relative; left: -2.6px; top: 3px; font-size: 9px;"></i>'}).component("csRemovableSelectionItem",{transclude:!0,controller:function(){this.$onInit=function(){alert("$onInit called: ",this)},this.remove=function(){alert("remove called: ",this)}},template:'<div > <ng-transclude></ng-transclude> <i class="icon ion-close" ng-click="$ctrl.remove();"></i></div>'}),angular.module("cesium.directives",[]).directive("compareTo",(function(){return{require:"?ngModel",link:function(e,n,t,a){a&&t.compareTo&&(a.$validators.compareTo=function(n){return n==e.$eval(t.compareTo)},e.$watch(t.compareTo,(function(){a.$validate()})))}}})).directive("differentTo",(function(){return{require:"?ngModel",link:function(e,n,t,a){a&&t.differentTo&&(a.$validators.differentTo=function(n){return n!=e.$eval(t.differentTo)},e.$watch(t.differentTo,(function(){a.$validate()})))}}})).directive("numberFloat",(function(){var e=new RegExp("^[0-9]+([.,][0-9]+)?$");return{require:"?ngModel",link:function(n,t,a,i){i&&(i.$validators.numberFloat=function(n){return i.$isEmpty(n)||e.test(n)})}}})).directive("numberInt",(function(){var e=new RegExp("^[0-9]+$");return{require:"ngModel",link:function(n,t,a,i){i&&(i.$validators.numberInt=function(n){return i.$isEmpty(n)||e.test(n)})}}})).directive("email",(function(){var e=new RegExp("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$");return{require:"ngModel",link:function(n,t,a,i){i&&(i.$validators.email=function(n){return i.$isEmpty(n)||e.test(n)})}}})).directive("requiredIf",(function(){return{require:"?ngModel",link:function(e,n,t,a){a&&t.requiredIf&&(a.$validators.required=function(n){return!e.$eval(t.requiredIf)||!a.$isEmpty(n)},e.$watch(t.requiredIf,(function(){a.$validate()})))}}})).directive("geoPoint",(function(){return{require:"?ngModel",link:function(e,n,t,a){a&&(a.$validators.geoPoint=function(e){return a.$isEmpty(e)||angular.isDefined(e.lat)&&angular.isDefined(e.lon)||angular.isUndefined(e.lat)&&angular.isUndefined(e.lon)})}}})).directive("copyOnClick",["$window","Device","UIUtils",function(e,n,t){return{restrict:"A",link:function(e,a,i){var o=function(a){var o=i.copyOnClick;if(null!=o)if(n.clipboard.enable)n.clipboard.copy(o).then((function(){t.toast.show("INFO.COPY_TO_CLIPBOARD_DONE")})).catch(t.onError("ERROR.COPY_CLIPBOARD"));else{var s=o&&o.indexOf("\n")>=0?o.split("\n").length:1;t.popover.show(a,{scope:e,templateUrl:"templates/common/popover_copy.html",bindings:{value:i.copyOnClick,rows:s,copied:!1},autoselect:".popover-copy "+(s<=1?"input":"textarea"),afterShow:document.execCommand?function(e){try{document.execCommand("copy"),t.toast.show("INFO.COPY_TO_CLIPBOARD_DONE",1e3)}catch(e){console.error("[copy-on-click] Failed to copy using document.execCommand('copy')",e)}}:void 0})}};a.bind("click",o),a.bind("hold",o)}}}]).directive("selectOnClick",["$window",function(e){return{restrict:"A",link:function(n,t,a){t.bind("click",(function(){e.getSelection&&!e.getSelection().toString()&&this.value&&this.setSelectionRange(0,this.value.length)}))}}}]).directive("activeLink",["$location",function(e){return{restrict:"A",link:function(n,t,a,i){var o,s=a.activeLink;a.activeLinkPathPrefix?(o=a.activeLinkPathPrefix.substring(1),n.location=e,n.$watch("location.path()",(function(e){e&&0===e.indexOf(o)?t.addClass(s):t.removeClass(s)}))):a.href&&(o=a.href.substring(1),n.location=e,n.$watch("location.path()",(function(e){e&&e==o?t.addClass(s):t.removeClass(s)})))}}}]).directive("input",["$timeout",function(e){return{restrict:"E",scope:{returnClose:"=",onReturn:"&",onFocus:"&",onBlur:"&"},link:function(n,t,a){t.bind("focus",(function(t){n.onFocus&&e((function(){n.onFocus()}))})),t.bind("blur",(function(t){n.onBlur&&e((function(){n.onBlur()}))})),t.bind("keydown",(function(a){13==a.which&&(n.returnClose&&t[0].blur(),n.onReturn&&e((function(){n.onReturn()})))}))}}}]).directive("trustAsHtml",["$sce","$compile","$parse",function(e,n,t){return{restrict:"A",compile:function(a,i){var o=t(i.trustAsHtml),s=t(i.trustAsHtml,(function(e){return(e||"").toString()}));return n.$$addBindingClass(a),function(t,a,i){n.$$addBindingInfo(a,i.trustAsHtml),t.$watch(s,(function(){a.html(e.getTrustedHtml(e.trustAsHtml(o(t)))||""),n(a.contents())(t)}))}}}}]).directive("modalClose",["$ionicHistory","$timeout",function(e,n){return{restrict:"AC",link:function(t,a){a.bind("click",(function(){t.closeModal&&(e.nextViewOptions({historyRoot:!0,disableAnimate:!0,expire:300}),n((function(){e.nextViewOptions({historyRoot:!1,disableAnimate:!1})}),300),t.closeModal())}))}}}]).directive("csExtensionPoint",["$state","$compile","$controller","$templateCache","PluginService",function(e,n,t,a,i){return{restrict:"E",compile:function(e,n){if(angular.isDefined(n.name)){var t=i.extensions.points.getActivesByName(n.name);t.length>0&&(e.html(""),_.forEach(t,(function(n){e.append(function(e){var n=e.templateUrl?a.get(e.templateUrl):e.template;return n?(e.controller&&(n='<ng-controller ng-controller="'+e.controller+'">'+n+"</div>"),n):(console.error("[plugin] Could not found template for extension :"+(e.templateUrl?e.templateUrl:e.template)),"")}(n))})))}return{pre:function(e,n,t){i.extensions.points.current.set(t.name)},post:function(){i.extensions.points.current.set()}}},scope:{content:"="}}}]).directive("onReadFile",["$parse",function(e){return{restrict:"A",scope:!1,link:function(n,t,a){var i=e(a.onReadFile);t.on("change",(function(e){var t=new FileReader,a={name:this.files[0].name,size:this.files[0].size,type:this.files[0].type};t.onload=function(e){n.$applyAsync((function(){i(n,{file:{fileContent:e.target.result,fileData:a}})}))},t.readAsText((e.srcElement||e.target).files[0])}))}}}]).directive("dropZone",["$parse",function(e){return{restrict:"A",scope:!1,link:function(n,t,a){var i=e(a.dropZone);t.bind("dragover",(function(e){e.stopPropagation(),e.preventDefault()})),t.bind("dragenter",(function(e){e.stopPropagation(),e.preventDefault()})),t.bind("dragleave",(function(e){e.stopPropagation(),e.preventDefault()})),t.bind("drop",(function(e){e.stopPropagation(),e.preventDefault();var t=e.dataTransfer.files[0],a={name:t.name,size:t.size,type:t.type},o=new FileReader;o.onload=function(e){n.$apply((function(){i(n,{file:{file:t,fileContent:e.target.result,fileData:a}})}))},o.readAsText(e.dataTransfer.files[0])}))}}}]).directive("fileSelect",["$parse",function(e){"use strict";return{restrict:"A",scope:!1,template:'<input type="file" style="display: none;" /><ng-transclude></ng-transclude>',transclude:!0,link:function(n,t,a){var i=e(a.fileSelect),o=t.children("input[file]");a.accept&&(o[0].accept=a.accept),o.on("change",(function(e){var t=new FileReader,a=this.files[0],s={name:a.name,size:a.size,type:a.type};t.onload=function(e){n.$applyAsync((function(){i(n,{file:{file:a,fileContent:e.target.result,fileData:s}}),o[0].value=""}))},t.readAsText((e.srcElement||e.target).files[0])})),t.on("click",(function(){o[0].click()}))}}}]),angular.module("cesium.filters",["cesium.config","cesium.platform","pascalprecht.translate","cesium.translations"]).service("filterTranslations",["$rootScope","csPlatform","csSettings","$translate",function(e,n,t,a){var i,o=!1,s=this;function r(){return console.debug("[filter] Loading translations for locale [{0}]".format(a.use())),a(["COMMON.DATE_PATTERN","COMMON.DATE_SHORT_PATTERN","COMMON.UD"]).then((function(e){s.DATE_PATTERN=e["COMMON.DATE_PATTERN"],"COMMON.DATE_PATTERN"===s.DATE_PATTERN&&(s.DATE_PATTERN="YYYY-MM-DD HH:mm"),s.DATE_SHORT_PATTERN=e["COMMON.DATE_SHORT_PATTERN"],"COMMON.DATE_SHORT_PATTERN"===s.DATE_SHORT_PATTERN&&(s.DATE_SHORT_PATTERN="YYYY-MM-DD"),s.DATE_MONTH_YEAR_PATTERN=e["COMMON.DATE_MONTH_YEAR_PATTERN"],"COMMON.DATE_MONTH_YEAR_PATTERN"===s.DATE_MONTH_YEAR_PATTERN&&(s.DATE_MONTH_YEAR_PATTERN="MMM YY"),s.UD=e["COMMON.UD"],"COMMON.UD"===s.UD&&(s.UD="UD")}))}return s.ready=function(){return o?$q.when(data):i||s.start()},s.start=function(){return i=n.ready().then(r).then((function(){o=!0,t.api.locale.on.changed(e,r,this)}))},s.start(),s}]).filter("formatInteger",(function(){return function(e){return e?e<1e7?numeral(e).format("0,0"):numeral(e).format("0,0.000 a"):"0"}})).filter("formatAmount",["csConfig","csSettings","csCurrency","$filter",function(e,n,t,a){var i=1/Math.pow(10,e.decimalCount||2),o="0,0.0"+Array(e.decimalCount||2).join("0"),s=a("currencySymbol");return function(e,a){if(void 0!==e)return(a&&angular.isDefined(a.useRelative)?a.useRelative:n.data.useRelative)?function(e,n){var a=n&&n.currentUD?n.currentUD:t.data.currentUD;if(a){var r=e/a;return r=Math.abs(r)<i&&0!==e?"~ 0":numeral(r).format(o),n&&n.currency?r+" "+s(n.currency,!0):r}console.warn("formatAmount: currentUD not defined")}(e,a):function(e,n){var t=numeral(e/100).format(e>-1e9&&e<1e9?"0,0.00":"0,0.000 a");return n&&n.currency?t+" "+s(n.currency,!1):t}(e,a)}}]).filter("formatAmountNoHtml",["csConfig","csSettings","csCurrency","$filter",function(e,n,t,a){var i=1/Math.pow(10,e.decimalCount||2),o="0,0.0"+Array(e.decimalCount||2).join("0"),s=a("currencySymbolNoHtml");return function(e,a){if(void 0!==e)return(a&&angular.isDefined(a.useRelative)?a.useRelative:n.data.useRelative)?function(e,n){var a=n&&n.currentUD?n.currentUD:t.data.currentUD;if(a){var r=e/a;return r=Math.abs(r)<i&&0!==e?"~ 0":numeral(r).format(o),n&&n.currency?r+" "+s(n.currency,!0):r}console.warn("formatAmount: currentUD not defined")}(e,a):function(e,n){var t=numeral(e/100).format(e>-1e9&&e<1e9?"0,0.00":"0,0.000 a");return n&&n.currency?t+" "+s(n.currency,!1):t}(e,a)}}]).filter("currencySymbol",["filterTranslations","$filter","csSettings",function(e,n,t){return function(a,i){return a?(angular.isDefined(i)?i:t.data.useRelative)?e.UD+"<sub>"+n("abbreviate")(a)+"</sub>":n("abbreviate")(a):""}}]).filter("currencySymbolNoHtml",["filterTranslations","$filter","csSettings",function(e,n,t){return function(a,i){return a?(angular.isDefined(i)?i:t.data.useRelative)?e.UD+" "+n("abbreviate")(a):n("abbreviate")(a):""}}]).filter("formatDecimal",["csConfig","csCurrency",function(e,n){var t=1/Math.pow(10,e.decimalCount||2),a="0,0.0"+Array(e.decimalCount||2).join("0");return function(e){return void 0===e?"0":e===1/0||e===-1/0?(console.warn("formatDecimal: division by zero ? (is currentUD defined ?) = "+n.data.currentUD),"error"):Math.abs(e)<t?"~ 0":numeral(e).format(a)}}]).filter("formatNumeral",(function(){return function(e,n){return void 0===e?"0":Math.abs(e)<1e-4?"~ 0":numeral(e).format(n)}})).filter("formatDate",["filterTranslations",function(e){return function(n){return n?moment.unix(parseInt(n)).local().format(e.DATE_PATTERN||"YYYY-MM-DD HH:mm"):""}}]).filter("formatDateShort",["filterTranslations",function(e){return function(n){return n?moment.unix(parseInt(n)).local().format(e.DATE_SHORT_PATTERN||"YYYY-MM-DD"):""}}]).filter("formatDateMonth",["filterTranslations",function(e){return function(n){return n?moment.unix(parseInt(n)).local().format(e.DATE_MONTH_YEAR_PATTERN||"MMM YY"):""}}]).filter("formatDateForFile",["filterTranslations",function(e){return function(n){return n?moment.unix(parseInt(n)).local().format(e.DATE_FILE_PATTERN||"YYYY-MM-DD"):""}}]).filter("formatTime",(function(){return function(e){return e?moment.unix(parseInt(e)).local().format("HH:mm"):""}})).filter("formatFromNow",(function(){return function(e){return e?moment.unix(parseInt(e)).fromNow():""}})).filter("formatDurationTo",(function(){return function(e){return e?moment.unix(moment().utc().unix()+parseInt(e)).fromNow():""}})).filter("formatDuration",(function(){return function(e){return e?moment(0).from(moment.unix(parseInt(e)),!0):""}})).filter("formatDurationMs",(function(){return function(e){return e?e<1e3?e+"ms":e/1e3+"s":""}})).filter("formatPeriod",(function(){return function(e){return e?moment(0).from(moment.unix(parseInt(e)),!0).split(" ").slice(-1)[0]:null}})).filter("formatFromNowShort",(function(){return function(e){return e?moment.unix(parseInt(e)).fromNow(!0):""}})).filter("capitalize",(function(){return function(e){return e?(e=e.toLowerCase()).substring(0,1).toUpperCase()+e.substring(1):""}})).filter("abbreviate",(function(){var e={};return function(n){var t=n||"";if(e[t])return e[t];if(t.length>3){for(var a="",i=["-","_"," "],o=0;o<t.length;o++){var s=t[o];0===o?a="g"===s||"G"===s?"Ğ":s:o>0&&-1!=i.indexOf(t[o-1])&&(a+=s)}t=a.toUpperCase()}else"G"===(t=t.toUpperCase()).charAt(0)&&(t="Ğ"+(t.length>1?t.substr(1):""));return e[n]=t,t}})).filter("upper",(function(){return function(e){return e?e.toUpperCase():""}})).filter("formatPubkey",(function(){return function(e){return e?e.substr(0,8):""}})).filter("formatHash",(function(){return function(e){return e?e.substr(0,4)+e.substr(e.length-4):""}})).filter("formatCategory",(function(){return function(e){return e&&e.length>28?e.substr(0,25)+"...":e}})).filter("formatSlug",(function(){return function(e){return e?encodeURIComponent(e.toLowerCase().replace(/<[^>]+>/g,"").replace(/[^\w ]+/g,"").replace(/ +/g,"-")):""}})).filter("formatEncodeURI",(function(){return function(e){return e?encodeURIComponent(e):""}})).filter("truncText",(function(){return function(e,n){return n=n||500,!e||e.length<=n?e:e.substr(0,n)+"..."}})).filter("truncUrl",(function(){return function(e,n){n=n||25;var t=e&&(e.startsWith("http://")?7:e.startsWith("https://")?8:0)||0;return t=e.startsWith("www.",t)?t+4:t,!e||e.length-t<=n?e.substr(t):e.substr(t,n)+"..."}})).filter("trustAsHtml",["$sce",function(e){return function(n){return e.trustAsHtml(n)}}]).filter("noHtml",(function(){return function(e){return e?e.trim().replace(/<[^>]+>/g,""):""}})),angular.module("cesium.platform",["cesium.config","cesium.services"]).config(["$translateProvider","csConfig",function(e,n){e.uniformLanguageTag("bcp47").determinePreferredLanguage().useSanitizeValueStrategy(null).fallbackLanguage([n.fallbackLanguage?n.fallbackLanguage:"en"]).useLoaderCache(!0)}]).config(["$httpProvider","csConfig",function(e,n){e.defaults.timeout=n.timeout?n.timeout:3e5,e.defaults.useXDomain=!0,delete e.defaults.headers.common["X-Requested-With"]}]).config(["$compileProvider","csConfig",function(e,n){e.debugInfoEnabled(!!n.debug)}]).config(["$animateProvider",function(e){e.classNameFilter(/\banimate-/)}]).config(["CacheFactoryProvider","csConfig",function(e,n){angular.extend(e.defaults,{maxAge:n.cacheTimeMs||3e5})}]).config(["screenmatchConfigProvider",function(e){e.config.rules="bootstrap"}]).config(["$ionicConfigProvider",function(e){var n=ionic.Platform.isIOS();e.scrolling.jsScrolling(n),e.views.maxCache(5)}]).config(["IdleProvider","csConfig",function(e,n){e.idle(n.logoutIdle||600),e.timeout(n.logoutTimeout||15)}]).factory("$exceptionHandler",["$log",function(e){return function(n,t){t?e.error(n,t):e.error(n)}}]).factory("csPlatform",["ionicReady","$rootScope","$q","$state","$translate","$timeout","UIUtils","BMA","Device","csHttp","csConfig","csCache","csSettings","csCurrency","csWallet",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E){var g,f,h,T,b=0,v=!1;function O(){if(!T){var e=n.$on("$stateChangeStart",(function(e,n,t,i){e.defaultPrevented||"app.home"===n.name||"app.settings"===n.name||(e.preventDefault(),f?f.then((function(){a.go(n.name,t)})):s.loading.hide())}));T=e}}function R(){T&&T(),T=null}function I(e){if(e)return!0;g=g||p.data.node;var n=p.data.fallbackNodes&&b<p.data.fallbackNodes.length&&p.data.fallbackNodes[b++];if(!n)throw"ERROR.CHECK_NETWORK_CONNECTION";var t=n.host+(n.port||80==n.port||443==n.port?"":":"+n.port);return r.node.same(n.host,n.port)?(console.debug("[platform] Skipping fallback node [{0}]: same as actual node".format(t)),I()):c.get(n.host,n.port,"/node/summary",443==n.port||r.node.forceUseSsl)().catch((function(e){console.error("[platform] Could not reach fallback node [{0}]: skipping".format(t))})).then((function(e){if(!e)return I();var a={old:r.server,new:t};return a.old===a.new&&(r.port!=n.port?a.new+=":"+n.port:0!=r.useSsl||!n.useSsl&&443!=n.port||(a.new+=" (SSL)")),i("CONFIRM.USE_FALLBACK_NODE",a).then((function(e){return s.alert.confirm(e)})).then((function(e){if(e)return p.data.node=n,p.data.node.temporary=!0,c.cache.clear(),r.copy(n).then(I)}))}))}function N(){return console.debug("[platform] restarting csPlatform"),A().then((function(){return o(S,200)}))}function S(){return O(),f=e().then(t.all([l.ready(),p.ready()])).then((function(){return r.ready().then(I)})).then(m.ready).then(E.ready).then((function(){R(),function(){h=[r.api.node.on.restart(n,N,this)]}(),f=null,v=!0})).catch((function(e){throw f=null,v=!1,a.current.name!==n.errorState&&a.go(n.errorState,{error:"peer"}),e}))}function A(){return v?(_.forEach(h,(function(e){e()})),h=[],E.stop(),m.stop(),r.stop(),o((function(){R(),v=!1,f=null}),500)):t.when()}return{disableChangeState:O,isStarted:function(){return v},ready:function(){return v?t.when():f||S()},restart:N,start:S,stop:A,version:{latest:function(){var e=p.data.latestReleaseUrl&&c.uri.parse(p.data.latestReleaseUrl);return e?c.getWithCache(e.host,"https:"===e.protocol?443:e.port,"/"+e.pathname,void 0,u.constants.LONG)().then((function(e){if(e&&e.name&&e.tag_name&&e.html_url)return{version:e.name,url:e.html_url,isNewer:c.version.compare(d.version,e.name)<0}})).catch((function(e){console.error("[platform] Failed to get Cesium latest version",e)})):t.when()}}}}]).run(["$rootScope","$state","$window","$urlRouter","ionicReady","$ionicPlatform","$ionicHistory","Device","UIUtils","$ionicConfig","PluginService","csPlatform","csWallet","csSettings","csConfig","csCurrency",function(e,n,t,a,i,o,s,r,l,c,d,u,p,m,E,g){e.config=E,e.settings=m.data,e.currency=g.data,e.walletData=p.data,e.device=r,e.errorState="app.home",e.smallscreen=l.screen.isSmall();var f=t.location.href.indexOf("#");e.rootPath=-1!==f?t.location.href.substr(0,f):t.location.href,console.debug("[app] Root path is ["+e.rootPath+"]"),!0!==E.httpsMode&&"true"!==E.httpsMode&&"force"!==E.httpsMode||"https:"===t.location.protocol||e.$on("$stateChangeStart",(function(a,i,o,s){var r="https"+e.rootPath.substr(4)+n.href(i,o);E.httpsModeDebug?console.debug("[app] [httpsMode] --- Should redirect to: "+r):t.location.href=r})),i().then((function(){return r.keyboard.enable&&(r.keyboard.hideKeyboardAccessoryBar(!0),ionic.Platform.isIOS()&&r.keyboard.disableScroll(!0)),"a"!==ionic.Platform.grade.toLowerCase()&&(console.info("[app] Disabling UI effects, because plateform's grade is ["+ionic.Platform.grade+"]"),l.setEffects(!1)),window.StatusBar&&console.debug("[app] Status bar plugin enable"),u.version.latest().then((function(n){n&&n.isNewer?(console.info("[app] New release detected [{0}]".format(n.version)),e.newRelease=n):console.info("[app] Current version [{0}] is the latest release".format(E.version))})),o.registerBackButtonAction((function(e){return s.backView()?s.goBack():(e.preventDefault(),l.alert.confirm("CONFIRM.EXIT_APP").then((function(e){e&&ionic.Platform.exitApp()})))}),100),u.ready()}))}]),"function"!=typeof String.prototype.startsWith&&(console.debug("Adding String.prototype.startsWith() -> was missing on this platform"),String.prototype.startsWith=function(e,n){return 0===this.indexOf(e,n)}),"function"!=typeof String.prototype.trim){console.debug("Adding String.prototype.trim() -> was missing on this platform");var we=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;String.prototype.trim=function(){return this.replace(we,"")}}Math&&"function"!=typeof Math.trunc&&(console.debug("Adding Math.trunc() -> was missing on this platform"),Math.trunc=function(e){return(e-.5).toFixed()}),"function"!=typeof String.prototype.format&&(console.debug("Adding String.prototype.format() -> was missing on this platform"),String.prototype.format=function(){var e=arguments;return this.replace(/{(\d+)}/g,(function(n,t){return void 0!==e[t]?e[t]:n}))});
|
||
//# sourceMappingURL=../maps/dist_js/gchange.js.map
|