astrXbian/www/FULLJS/gchange-web/maps/dist_js/gchange.js.map

1 line
2.6 MiB
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"sources":["dist/dist_js/app/entities/block.js","dist/dist_js/app/controllers/app-controllers.js","dist/dist_js/app/controllers/home-controllers.js","dist/dist_js/app/controllers/join-controllers.js","dist/dist_js/app/controllers/login-controllers.js","dist/dist_js/app/controllers/help-controllers.js","dist/dist_js/app/controllers/wallet-controllers.js","dist/dist_js/app/services/settings-services.js","dist/dist_js/app/controllers/wot-controllers.js","dist/dist_js/app/controllers/settings-controllers.js","dist/dist_js/plugins/es/js/entities/peer.js","dist/dist_js/plugins/es/js/entities/notification.js","dist/dist_js/plugins/es/js/entities/comment.js","dist/dist_js/plugins/es/js/controllers/common-controllers.js","dist/dist_js/plugins/es/js/controllers/like-controllers.js","dist/dist_js/plugins/es/js/controllers/app-controllers.js","dist/dist_js/plugins/es/js/controllers/settings-controllers.js","dist/dist_js/plugins/es/js/controllers/wallet-controllers.js","dist/dist_js/plugins/es/js/controllers/wot-controllers.js","dist/dist_js/plugins/es/js/controllers/profile-controllers.js","dist/dist_js/plugins/es/js/controllers/message-controllers.js","dist/dist_js/plugins/es/js/controllers/notification-controllers.js","dist/dist_js/plugins/es/js/controllers/subscription-controllers.js","dist/dist_js/plugins/es/js/controllers/document-controllers.js","dist/dist_js/plugins/es/js/controllers/network-controllers.js","dist/dist_js/plugins/es/js/controllers/registry-controllers.js","dist/dist_js/plugins/market/js/controllers/app-controllers.js","dist/dist_js/plugins/market/js/controllers/home-controllers.js","dist/dist_js/plugins/market/js/controllers/login-controllers.js","dist/dist_js/plugins/market/js/controllers/search-controllers.js","dist/dist_js/plugins/market/js/controllers/gallery-controllers.js","dist/dist_js/plugins/market/js/controllers/record-controllers.js","dist/dist_js/plugins/market/js/controllers/wallet-controllers.js","dist/dist_js/plugins/market/js/controllers/category-controllers.js","dist/dist_js/plugins/market/js/controllers/wot-controllers.js","dist/dist_js/plugins/market/js/controllers/document-controllers.js","dist/dist_js/plugins/graph/js/controllers/common-controllers.js","dist/dist_js/plugins/graph/js/controllers/docstats-controllers.js","dist/dist_js/plugins/graph/js/controllers/synchro-controllers.js","dist/dist_js/plugins/graph/js/controllers/network-controllers.js","dist/dist_js/plugins/map/js/controllers/shape-controllers.js","dist/dist_js/plugins/map/js/controllers/home-controllers.js","dist/dist_js/app/platform.js","dist/dist_js/app/services/crypto-services.js","dist/dist_js/app/services/utils-services.js","dist/dist_js/app/services/cache-services.js","dist/dist_js/app/services/modal-services.js","dist/dist_js/app/services/http-services.js","dist/dist_js/app/services/storage-services.js","dist/dist_js/app/services/device-services.js","dist/dist_js/app/services/currency-services.js","dist/dist_js/app/services/bma-services.js","dist/dist_js/app/services/wot-services.js","dist/dist_js/app/services/tx-services.js","dist/dist_js/app/services/wallet-services.js","dist/dist_js/app/services/plugin-services.js","dist/dist_js/app/services.js","dist/dist_js/app/controllers.js","dist/dist_js/app/templates.js","dist/dist_js/app/translations.js","dist/dist_js/app/plugins.js","dist/dist_js/plugins/translations.js","dist/dist_js/plugins/templates.js","dist/dist_js/plugins/es/js/plugin.js","dist/dist_js/plugins/es/js/services.js","dist/dist_js/plugins/es/js/services/comment-services.js","dist/dist_js/plugins/es/js/services/http-services.js","dist/dist_js/plugins/es/js/services/settings-services.js","dist/dist_js/plugins/es/js/services/social-services.js","dist/dist_js/plugins/es/js/services/crypto-services.js","dist/dist_js/plugins/es/js/services/profile-services.js","dist/dist_js/plugins/es/js/services/notification-services.js","dist/dist_js/plugins/es/js/services/message-services.js","dist/dist_js/plugins/es/js/services/modal-services.js","dist/dist_js/plugins/es/js/services/wallet-services.js","dist/dist_js/plugins/es/js/services/geo-services.js","dist/dist_js/plugins/es/js/services/subscription-services.js","dist/dist_js/plugins/es/js/services/document-services.js","dist/dist_js/plugins/es/js/services/network-services.js","dist/dist_js/plugins/es/js/services/like-services.js","dist/dist_js/plugins/es/js/services/registry-services.js","dist/dist_js/plugins/market/js/plugin.js","dist/dist_js/plugins/market/js/services/modal-services.js","dist/dist_js/plugins/market/js/services/category-services.js","dist/dist_js/plugins/market/js/services/record-services.js","dist/dist_js/plugins/market/js/services/tx-services.js","dist/dist_js/plugins/market/js/services/wallet-services.js","dist/dist_js/plugins/market/js/services/settings-services.js","dist/dist_js/plugins/market/js/services/converse-services.js","dist/dist_js/plugins/market/js/controllers/join-controllers.js","dist/dist_js/plugins/graph/js/plugin.js","dist/dist_js/plugins/graph/js/services.js","dist/dist_js/plugins/graph/js/services/data-services.js","dist/dist_js/plugins/graph/js/services/color-services.js","dist/dist_js/plugins/map/js/plugin.js","dist/dist_js/plugins/map/js/services.js","dist/dist_js/plugins/map/js/services/utils-services.js","dist/dist_js/plugins/map/js/services/shape-services.js","dist/dist_js/plugins/map/js/controllers/user-controllers.js","dist/dist_js/app/app.js","dist/dist_js/app/components.js","dist/dist_js/app/directives.js","dist/dist_js/app/filters.js"],"names":["Block","json","attributes","that","this","length","_","forEach","key","identitiesCount","identities","joinersCount","joiners","activesCount","actives","leaversCount","leavers","revokedCount","revoked","excludedCount","excluded","certificationsCount","certifications","transactionsCount","transactions","empty","isEmpty","PluginExtensionPointController","$scope","PluginService","extensionPoint","extensions","points","current","get","AppController","$rootScope","$state","$ionicSideMenuDelegate","$q","$timeout","$ionicHistory","$controller","$window","csPlatform","UIUtils","BMA","csWallet","Device","Modals","csSettings","csConfig","csHttp","walletData","data","search","login","isLogin","motion","default","fullscreen","screen","isEnabled","showHome","nextViewOptions","historyRoot","go","then","loading","hide","createHelptipScope","isTour","ctrlName","tour","settings","helptip","enable","isSmall","helptipScope","$new","startHelpTour","event","skipClearCache","defaultPrevented","clearHistory","clearCache","$destroy","catch","err","disableHelpTour","preventDefault","stopPropagation","store","loadWalletData","options","loadData","loadWallet","isStarted","loaded","when","showLoginModal","minData","ready","loginAndGo","state","closeProfilePopover","httpsMode","location","protocol","href","hashIndex","indexOf","rootPath","substr","httpsModeDebug","console","debug","templateUrl","controller","showLogin","formData","rememberMe","useLocalStorage","username","password","onError","logout","force","profilePopover","askConfirm","alert","confirm","show","isOpenLeft","toggleLeft","isUserPubkey","pubkey","api","on","deferred","resolve","showTransferModal","parameters","showAboutModal","showAbout","showJoinModal","showJoin","showSettings","showHelpModal","showHelp","showProfilePopover","popover","scope","afterShow","ink","selector","isShown","showPeerInfoPopover","openLink","$event","uri","startsWith","name","regexp","USER_ID","test","copy","open","handleUri","reject","info","fromHomeState","parse","res","message","angular","merge","action","params","amount","undefined","reload","warn","q","backView","removeBackView","error","registerProtocolHandlers","each","format","navigator","registerProtocolHandler","showFab","id","timeout","toggleOn","hideFab","toggleOff","doMotion","askFullscreen","isWeb","cancelText","okText","toggleFullscreen","toggleAll","HomeController","$http","$translate","$location","csCache","csCurrency","locales","bgImage","kind","Math","random","day","moment","month","imageCount","service","spring","summer","autumn","winter","imageIndex","floor","getRandomImage","enter","e","ionic","Platform","isIOS","window","StatusBar","overlaysWebView","stateParams","node","cleanLocationHref","loadFeeds","$on","feedUrl","getFeedUrl","maxContentLength","feed","now","Date","responseType","cache","constants","LONG","success","items","reduce","item","title","content_text","content_html","date_published","time","utc","unix","content","replace","endIndex","max","lastIndexOf","truncated","author","concat","status","doQuickFix","changeLanguage","langKey","use","hideLocalesPopover","locale","findWhere","showLocalesPopover","localesPopover","disableAnimate","disableBack","stateName","inherit","notify","JoinController","JoinModalController","CryptoUtils","mkWallet","pseudo","slides","slider","loop","effect","speed","isLastSlide","looking","showUsername","showPassword","smallscreen","userIdPattern","regex","slidePrev","unlockSwipes","lockSwipes","slideNext","activeIndex","showAccountPubkey","computing","scryptKeypair","keypair","util","encode_base58","signPk","formDataChanged","doNext","formName","$submitted","$valid","doNewAccount","closeModal","wallet","alertIfUnusedWallet","setDefaultProfile","helpAnchor","anchor","LoginModalController","showSalt","showLoginSalt","showPubkeyButton","autoComputePubkey","grade","toLowerCase","doLogin","form","showPubkey","$watch","salt","pwd","showAccountSecurityModal","showAccountSecurity","HelpController","$anchorScroll","HelpModalController","HelpTipController","continue","executeStep","partName","steps","index","isDefined","step","Error","promise","next","isUndefined","showHelpTip","bindings","value","hasNext","autoremove","backdropClickToClose","startCurrencyTour","cancelled","currency","startNetworkTour","network","startWotTour","wot","startWotCertTour","wotCerts","startWalletNoLoginTour","startWalletTour","startWalletCertTour","walletCerts","startTxTour","tx","startHeaderTour","startSettingsTour","finishTour","startIndex","contentParams","icon","position","isOpen","useRelative","glyph","is","showNetworkTabIfNeed","tabs","document","querySelectorAll","element","triggerHandler","retry","installDocUrl","getElementById","currentUD","isMember","skipAll","_getProfilBtnElement","elements","find","el","offsetWidth","style","all","HelpTourController","WalletController","$ionicPopup","$ionicPopover","esHttp","qrcodeId","$id","toggleQRCode","likeData","views","likes","follows","abuses","stars","refresh","load","updateView","$broadcast","addListeners","setRegisterForm","registerForm","onWalletLogout","hideQRCode","removeListeners","listeners","$watchCollection","newEvents","oldEvents","equals","remove","doUpdate","silent","refreshData","hideActionsPopover","showQRCode","text","querySelector","loadQrCode","svg","html","showActionsPopover","actionsPopover","fromTemplateUrl","showSharePopover","url","getUrl","share","titleKey","titleValues","postMessage","showSecurityModal","WotLookupController","$focus","esDocument","esProfile","type","results","_source","entered","wotSearchTextId","enableFilter","allowMultiple","selection","showResultLabel","doSearch","hash","initPhase","doGetNewcomers","resetWotSearch","updateLocationHref","trim","match","doSearchText","offset","size","from","searchText","idties","PUBKEY","doDisplayResult","skipLocationUpdate","sort","creationTime","hasMore","showMore","loadingMore","doGetPending","ok","select","identity","toggleCheck","checked","addToSelection","removeSelection","toggleSelect","selected","copyIdty","push","identityInSelection","splice","existIdtyInResult","scanQrCode","barcode","scan","result","obj","identityInRes","WotLookupModalController","extend","cancel","WotIdentityAbstractController","csWot","hasSelf","withCache","removeActionParamInLocationHref","WotIdentityViewController","fadeSlideInRight","like","kinds","onLoadSuccess","doAction","SettingsController","popupData","nodePopup","bma","setPopupForm","popupForm","defaultSettings","reset","pendingSaving","restart","changeNode","port","host","useSsl","showNodePopup","newNode","temporary","nodeBMA","instance","isAlive","alive","showNodeList","forceUseSsl","_popupStack","responseDeferred","close","showNetworkLookup","ssl","peer","getBMA","dns","hasValid4","ipv4","ipv6","join","$setPristine","translations","buttons","onTap","server","parts","split","save","saving","cleanupHelpTip","apply","onDataChanged","oldValue","newValue","getServer","EsPeer","Object","keys","endpoints","EsNotification","markAsReadCallback","pubkeys","level","messagePrefixes","user","page","market","_formatHash","input","read","read_signature","reference","code","markAsRead","avatarIcon","medianTime","Comment","issuer","reply_to","replyCount","parent","replies","onRemoveListeners","otherComment","avatarStyle","setReplies","copyFromJson","addOnRemoveListener","listener","cleanAllListeners","removeAllReplies","addReplies","cm1","cm2","reply","containsReply","addReply","removeReply","replyId","findIndex","ESPicturesEditController","selectNewPicture","inputSelector","openPicturePopup","fileInput","click","camera","getPicture","imageData","pictures","src","isnew","onFileChanged","file","image","resizeFile","removePicture","favoritePicture","rotatePicture","rotateSrc","dataURL","ESCategoryModalController","allCategories","categories","afterLoad","cat","ESCommentsController","$filter","defaultCommentSize","comments","animate","comment","scrollToAnchor","loadAvatarAllParent","cmt","total","changes","start","stop","elemList","getElementsByName","i","onKeypress","charCode","ctrlKey","auth","focusNewComment","stateUrl","absolute","number","date","postUrl","autoselect","edit","newComment","forceIfSmall","removeParentLink","toggleExpandedReplies","expandedReplies","toggleExpandedParent","expandedParent","ESSocialsEditController","SocialUtils","socialData","reorder","addSocialNetwork","socials","social","startVelocity","editSocialNetwork","reorderSocialNetwork","fromIndex","toIndex","filterFn","recipient","valid","ESSocialsViewController","openSocial","ESAvatarModalController","$sce","initCrop","imageCropStep","imgSrc","resultBlob","fileReader","FileReader","readAsDataURL","onload","$applyAsync","getTrustedHtml","doCrop","doPrevious","clear","ESPositionEditController","esGeo","ModalUtils","defaultCountry","plugins","es","loadingCurrentPosition","showCheckbox","required","formPosition","searchModalOpened","tryToLocalize","getAddressToSearch","point","searchByAddress","updateGeoPoint","openSearchLocationModal","forceFallback","onCityChanged","geoPoint","lat","lon","onUseGeopointChanged","dirty","onGeopointChanged","address","city","parseFloat","cityParts","postcode","country","fallbackText","focusFirstInput","ESLookupPositionController","loadingPosition","geoDistanceLabels","distance","labelKey","labelParams","geoDistances","searchPosition","exact","shortName","ESSearchPositionItemController","locations","selectLocationIndex","onKeydown","keyCode","hideDropdown","onEnter","onArrowUpOrDown","showDropdown","selectLocation","velocity","onLocationChanged","requestId","license","exactMatch","showDistancePopover","selectDistance","geoDistance","ESSearchPositionModalController","firstSearch","dividerText","ESLikesController","esLike","abuseData","abuseLevels","label","staring","KINDS","loadLikes","initLikes","filter","substring","map","count","contains","canEdit","markAsView","$parent","toggleLike","reportAbuse","wasHit","timer","add","toUpperCase","dislikes","toggle","delta","setAbuseForm","abuseForm","showAbuseCommentPopover","subTitle","cssClass","toast","delete","addStar","starsPopover","levelAvg","levelSum","wasHitId","successFunction","ucode","newHitId","removeStar","showStarPopover","ESExtensionController","esSettings","ESJoinController","ESMenuExtendController","isEnable","showRegistryLookupView","showNotificationsPopover","showMessagesPopover","showInvitationsPopover","changed","ESProfilePopoverExtendController","showEditUserProfile","defer","ESPluginSettingsController","esModals","hasWindowNotification","keepEnableState","wasEnable","isFallbackNode","isFallback","changeEsNode","newEsNode","endpoint","GCHANGE_API","esEps","getEndpoints","ep","esEp","parseEndPoint","onFormChanged","notifications","emitHtml5","Notification","permission","requestPermission","ESWalletViewController","showNewPageModal","showNewPage","ESWalletLikesController","ESWotIdentityViewController","showNewMessageModal","profile","showMessageCompose","destPub","destUid","uid","sent","ESViewEditProfileController","description","avatar","existing","socialReorder","pubkeyPattern","nextParams","fromState","confirmSave","saved","confirmGo","raw","fromAttachment","source","setForm","background-image","onFormDataChanged","hasWaitDebounce","$invalid","updateWallet","parseAsHtml","showSuccessToast","doFinishSave","uniq","update","resizeSrc","imageSrc","toAttachment","saveAndClose","submitAndSaveAndClose","showAvatarModal","rotateAvatar","rotating","removeProfile","ESMessageListController","esMessage","messages","setType","markAllAsRead","msg","deleteAll","removeAll","showReplyModal","prefix","isReply","onMessageDelete","onNewOutboxMessage","summary","onNewInboxMessage","notification","new","onUnauth","unauth","ESMessageComposeController","ESMessageComposeModalController","isResponse","doSend","forceNoContent","send","showWotLookupModal","showWotLookup","ESMessageViewController","canDelete","setTimeout","recipientField","goBack","PopoverMessageController","limit","onNewMessageNotification","closePopover","resetData","NotificationsController","esNotification","codes","excludes","EXCLUDED_CODES","resetUnreadCount","ionListClass","unreadCount","lastNotification","readTime","notificationReadTime","onNewNotification","nextIndex","n","PopoverNotificationsController","ViewSubscriptionsController","esSubscription","emailFrequencies","children","record","groups","groupBy","extendAll","addSubscription","showCategoryModal","showEmailModal","notImplemented","addToUI","subscriptions","editSubscription","oldRecord","removeFromUI","deleteSubscription","category","ModalEmailSubscriptionsController","frequencies","frequency","peering","self","doSubmit","email","subscriptionForm","endpointFilter","ES_SUBSCRIPTION_API","ESDocumentLookupController","asc","searchTextId","ionItemClass","defaultSizeLimit","helptipPrefix","compactMode","last","expertMode","computeOptions","hits","took","doSearchLast","doc","selectDocument","toggleCompactMode","toggleSort","startListenChanges","wsChanges","websocket","change","fromHit","_operation","onDeleteDocument","onNewDocument","updated","ESLastDocumentsController","inheritedComputeOptions","side","getTimeFunction","ESNetworkLookupController","esNetwork","networkStarted","isHttps","online","enableLocationHref","same","expert","leave","member","mirror","refreshing","peers","memberPeersCount","isBusy","loadPeers","toggleOnline","toggleSearchEndpoint","selectPeer","isSsl","isTor","tor","context","clickEvent","showEndpointsPopover","path","showWs2pPopover","privateAccessMessage","valueKey","private","ws2pid","powPrefix","ESNetworkLookupModalController","ESNetworkLookupPopoverController","ESPeerInfoPopoverController","blockchain","block","powMin","version","duniter","software","latest","latestRelease","compare","isPreRelease","hasNewRelease","newBlock","ESPeerViewController","isReachable","viewData","enableBack","isDefaultNode","useTor","serverParts","lightInstance","docCount","p","hasEndpoint","blockNumber","getDns","keyID","sortBy","score","hasMainConsensusBlock","openRawPeering","openRawCurrentBlock","ESRegistryLookupController","esRegistry","lastRecords","advanced","isNaN","sortAttribute","sortDirection","help","geoUnit","unit","finishEntered","d","defaultSearch","registry","isDataLoaded","instant","updateSettings","immediate","oldLocation","geoShape","odlDistance","oldCompactMode","onGeoPointChanged","resolveLocationPosition","doGetLastRecords","hidePopovers","matches","filters","term","tags","parseTags","multi_match","query","fields","boost","nested","bool","category.name","terms","category.id","locationCity","or","and","not","exists","field","match_phrase","geo_distance","request","highlight","should","minimum_should_match","queryId","doRequest","isSameRequestFn","formatSlug","urlTitle","removeText","removeType","removeCategory","removeLocation","onToggleAdvanced","toggleAdvanced","showRecordTypeModal","isDefaultPrevented","showFiltersPopover","filtersPopover","hideFiltersPopover","ESWalletPagesController","ESRegistryRecordViewController","fadeSlideIn","args","secondTry","picture","hit","pic","pages","ESRegistryRecordEditController","avatarClass","needCategory","picturesCount","_content","_content_type","currentView","stateId","fileChanged","target","files","MarketMenuExtendController","MarketHomeFooterController","onCategoryClick","MarketHomeButtonsController","mkModals","init","inheritedDoRequest","openSearch","locationName","locationShortName","geoPoints","dist","showNewRecordModal","MarketLoginModalController","MarketEventLoginModalController","EMAIL_REGEX","usernamePattern","onWalletLogin","adminPubkeys","defaultAdminPubkeys","isEmail","RegExp","MkLookupAbstractController","mkCategory","mkRecord","mkSettings","showClosed","showOld","withOld","withStock","fees","doRefresh","currencies","toggleAdType","tag","shape","properties","old","closed","createSearchRequest","fillAvatars","showRecord","showSortPopover","direction","toggleShowClosed","toggleShowOld","MkLookupController","esShape","showAdvanced","jobs","parseInt","categoryName","catParts","finishEnter","isAdvanced","onGeoDistanceChanged","showCategories","showActionPopover","actionsPopoverUrl","MkViewGalleryController","$ionicScrollDelegate","$ionicModal","$interval","activeCategoryIndex","activePictureIndex","slideDuration","slideDurationLabels","3000","5000","10000","15000","20000","slideDurations","adTypeLabels","offer","need","crowdfunding","adTypes","openSlideShowModal","stats","fetchNextPictures","catIndex","picIndex","pause","closedByUser","activeSlide","started","lastSlideCallback","nextCategory","nextPicIndex","forceNextCategory","pluck","isLoadedCategory","MkGallerySlideModalController","$ionicSlideBoxDelegate","zoomMin","shown","startTimer","interval","nextSlide","showDescription","stopTimer","slideChanged","updateSlideStatus","slide","$getByHandle","getScrollPosition","zoom","enableSlide","stopAndCloseModal","MkRecordViewController","csCrypto","mkTx","onWalletChange","updateButtons","maxCommentSize","moreAdMotion","smallpictures","updatePaymentData","fetchPictures","convertPrice","feesCurrency","loadIssuerStars","loadMoreLikeThis","loadPictures","moreLikeThis","canSold","stock","canReopen","refreshConvertedPrice","sold","setStock","reopen","price","hashtags","slice","defaultHastags","postImage","postHashtags","computePrefix","showPayment","paymentData","pkChecksum","pubkeyWithChecksum","compute","uris","canPay","showPaymentModal","showIssuers","MkRecordEditController","recordType","warningMessage","ripple","focus","onFreePriceChanged","freePrice","showUnitPopover","delay","thumbnailSrc","thumbnail","isNew","offState","toState","toParams","fromParams","openCurrencyLookup","filtered","MkRecordPaymentModalController","helpSiteUrl","userForumUrl","openHelpSite","links","MarketWalletRecordsController","MkWalletFavoritesController","ids","parentDoSearch","MkListCategoriesController","withStats","nbsp","asTree","totalCount","onOptionsChange","onLocaleChange","MkViewCategoriesController","MkEditCategoriesController","reorderRoot","reorderChildren","defaultLocale","fixLocale","defaultLanguage","idPattern","ID","confirmed","saveAll","getName","useItalicIfMissing","localizedNames","reorderRootCategory","rootCategory","reorderChildrenCategory","childCategory","editRootCategory","root","showEditPopup","addRootCategory","editChildCategory","child","addChildCategory","removeRootCategory","removeChildCategory","rootCat","onChangeLocale","setEditForm","editForm","$setValidity","checkIdNotUsed","updatedCategory","MkIdentityRecordsController","MkLastDocumentsController","inheritedSelectDocument","GpCurrencyAbstractController","_truncDate","startOf","rangeDuration","timePct","firstBlockTime","scale","beginAtZero","height","width","maintainAspectRatio","times","t","stepUnit","currencyAge","setScale","updateHiddenDataset","updateLocation","setSize","toggleScale","scales","yAxes","yAxe","ticks","min","callback","log10","setRangeDuration","startTime","endTime","rangeDurationSec","datasetOverride","hidden","yAxisID","dataset","display","onLegendClick","legendItem","datasetIndex","ci","chart","meta","getDatasetMeta","datasets","config","union","difference","goPreviousRange","loadingRange","goNextRange","timeWindow","onRangeChanged","updateRange","updateTimePct","ceil","GpDocStatsController","gpColor","gpData","displayRightAxis","hiddenDatasets","chartIdPrefix","charts","series","color","rgba","royal","pointHoverBackgroundColor","clickState","gray","calm","formatInteger","defaultChartOptions","responsive","legend","onClick","xAxes","stacked","gridLines","drawOnChartArea","tooltips","enabled","mode","callbacks","tooltipItems","yLabel","serie","docstat","datePatterns","hour","labelPattern","labels","local","usedYAxisIDs","endsWith","values","previousValue","fill","borderWidth","pointRadius","pointHitRadius","pointHoverRadius","borderColor","backgroundColor","pointBackgroundColor","pointBorderColor","pointHoverBorderColor","white","onChartClick","_chart","canvas","_datasetIndex","_index","to","GpSynchroController","assertive","synchro","execution","GpNetworkViewExtendController","GpPeerViewExtendController","blockCount","MapShapeViewController","$document","shapeId","countriesMap","fr","be","gb","us","countries","loadAllCountries","getDefaultCountry","geoJson","getAllCountries","localCountry","c","createMosaic","onclick","onCountryChange","localeId","MapCountryEditController","leafletData","FileSaver","MapUtils","errors","configData","geoViewBox","leftLng","rightLng","topLat","bottomLat","translateX","translateY","removeHole","applyRound","degreePrecision","projection","strictMode","showConfig","elementData","order","iso2Pattern","positions","positionPattern","showLeaflet","mapId","markers","center","defaults","tileLayerOptions","attribution","geojson","fillColor","fillOpacity","stroke","opacity","weight","resetForms","resetForm","resetConfigForm","resetElementForm","svgText","markAsDirty","setCountryForm","countryForm","setConfigForm","configForm","setElementForm","elementForm","fileContent","fileData","updateFromSvgFile","updateFromGeoJson","showConfigForm","createFromText","findGeoViewBox","customProjection","proj","projectionData","translate","applySvgConfig","JSON","d3","selectAll","features","feature","getNormalizeProperties","onPathClick","class","convertOptions","precision","toGeoJson","$apply","deleteElement","parentNode","confirmEditElement","stringify","f","cancelEditElement","template","updateProgression","nom","findSvgElementFromPath","bounds","searchOnPath","geoShapes","geometry","download","Blob","filename","saveAs","centerMap","lng","MapHomeController","put","module","factory","Api","localStorage","flag","fallbackLocale","fallbackLanguage","localeParts","similarLocale","l","String","prototype","call","previousData","startPromise","fixedLocale","STORAGE_KEY","KEEP_AUTH_IDLE_SESSION","fixedSettings","cacheTimeMs","timeWarningExpireMembership","timeWarningExpire","minVersion","newIssueUrl","latestReleaseUrl","mastodonAuthor","useLocalStorageEncryption","persistCache","walletHistoryTimeSecond","walletHistorySliceSecond","walletHistoryAutoRefresh","keepAuthIdle","showUDHistory","decimalCount","uiEffects","blockValidityWindow","wotLookup","wallets","header","allRules","allWotRules","emitChangedEvent","raise","getObject","previousSettings","savedData","setObject","raisePromise","applyData","newData","localeChanged","oldBmaNode","newBmaNode","restore","storedData","numeral","language","registerEvent","getByPath","defaultValue","jsonFeed","ionicReady","CryptoAbstractService","isLoaded","array_to_string","buf","bb","Uint8Array","readAsText","crypto_sign_BYTES","crypto_secretbox_NONCEBYTES","crypto_box_MACBYTES","SEED_LENGTH","SCRYPT_PARAMS","SIMPLE","N","r","memory","DEFAULT","async_load_base58","on_ready","Base58","async_load_scrypt","scrypt_module_factory","async_load_nacl_js","nacl_factory","instantiate","async_load_base64","Base64","async_load_sha256","sha256","seed_from_signSk","signSk","seed","crypto","msCrypto","Crypto","FullJSServiceFactory","scrypt","nacl","base58","base64","check","function_name","check_injectBytes","what","thing","expected_length","leftPadding","check_length","bs","MALLOC","nacl_raw","HEAPU8","set","injectBytes","nbytes","_malloc","FREE","pointer","_free","Target","decode_utf8","s","unescape","encodeURIComponent","b","charCodeAt","encode_utf8","a","encode","decode_base58","decode","decode_base64","encode_base64","hash_sha256","to_hex","crypto_hash_sha256","random_nonce","getRandomValues","nonce","crypto_box_random_nonce","msg_int8","crypto_scrypt","seedLength","box_keypair_from_sign","signKeyPair","boxSk","boxPk","ska","_crypto_sign_secretkeybytes","skb","_crypto_box_secretkeybytes","_crypto_sign_ed25519_sk_to_curve25519","crypto_box_keypair_from_raw_sk","extractBytes","box_pk_from_sign","pka","_crypto_sign_publickeybytes","pkb","_crypto_box_publickeybytes","_crypto_sign_ed25519_pk_to_curve25519","box_sk_from_sign","box","recipientPk","senderSk","messageBin","ciphertextBin","crypto_box","box_open","cypherText","senderPk","recipientSk","crypto_box_open","scryptParams","signKeypair","crypto_sign_seed_keypair","boxKeypair","crypto_box_seed_keypair","seedKeypair","scryptSignPk","verify","signature","sig","pub","sm","crypto_sign_open","sign","m","sk","signedMsg","crypto_sign","naclOptions","scryptOptions","requested_total_memory","loadedLib","checkAllLibLoaded","lib","fromSignKeypair","skFromSignSk","pkFromSignPk","pack","subarray","serviceImpl","regexpContent","xor","buffer","concat_Uint8Array","buffer1","buffer2","tmp","byteLength","WIF","DATA_LENGTH","EWIF","SALT_LENGTH","DERIVED_HALF_LENGTH","REGEXP","SECKEY","FILE","TYPE_LINE","VERSION","PUB","SEC","DATA","errorCodes","BAD_PASSWORD","BAD_CHECKSUM","parseKeyFileContent","withSecret","defaultType","typeMatch","exec","parseWIF_or_EWIF","data_base58","data_int8","wif_base58","wif_int8","wif_int8_no_checksum","checksum","expectedChecksum","parseWIF_v1","parseEWIF_v1","ewif_base58","ewif_int8","ewif_int8_no_checksum","encryptedhalf1","encryptedhalf2","scrypt_seed","derivedhalf1","derivedhalf2","aesEcb","aesjs","ModeOfOperation","ecb","decryptedhalf1","decrypt","decryptedhalf2","expectedSalt","getBoxKeypair","signPk_int8","keyfile","reader","parseData","parseKeyFileData","generateContent","generateKeyFileContent","fi","seed_fi","wif_v1_from_keypair","seed1_xor_derivedhalf1_1","seed2_xor_derivedhalf1_2","encrypt","ewif_v1_from_keypair","getKeypair","recipientFieldName","cypherFieldNames","boxRecipientPk","fieldName","cypherTexts","cypherFieldName","records","issuerFieldName","issuerBoxPks","issuerBoxPk","$ionicPlatform","readyPromise","$ionicLoading","$ionicConfig","ionicMaterialInk","ionicMaterialMotion","Fullscreen","screenmatch","exports","loadingTextCache","bind","alertError","subtitle","alertInfo","hideLoading","showLoading","translation","isSmallScreen","active","imageOnLoadResize","ctx","maxWidth","maxHeight","createElement","getContext","xoffset","trunc","yoffset","drawImage","dataurl","toDataURL","showPopover","popovers","_show","isResolved","getSelection","toString","setSelectionRange","autofocus","$emit","_cleanup","removeClass","afterHidden","motionDelegate","delegate","motionTimeout","defaultSelector","createQRCodeObj","typeNumber","errorCorrectionLevel","mb","qrcode","stringToBytes","stringToBytesFuncs","qr","addData","make","classList","blinds","panInLeft","pushDown","slideUp","fadeIn","cancelType","okType","_getLoader","loader","duration","noBackdrop","fullMsg","displayEffect","setEffects","transition","nothing","createSvgTag","img","createImgTag","fab","fabs","getElementsByClassName","rows","shareOnMastodon","postAuthor","getAttribute","getElementsByTagName","innerHTML","mastodon_url","showMastodonSharePopover","showHelptip","preAction","postAction","retryTimeout","selectElementText","childNodes","range","createRange","selectNodeContents","removeAllRanges","addRange","selectedText","angle","PI","rotate","imageOnLoadRotate","CacheFactory","VERY_LONG","MEDIUM","SHORT","storageMode","getSettingsStorageMode","cacheNames","getCacheOptions","deleteOnExpire","onExpire","cacheFlushInterval","onSettingsChanged","newStorageMode","cacheName","setOptions","maxAge","counter","createCache","cachePrefix","clearAll","$injector","DefaultModalController","resolved","openModal","modal","propName","getParameters","hideDelay","fragments","animation","locals","ctrlEval","isControllerAs","controllerName","ctrlInstance","showTransfer","sockets","allCachePrefixes","POSITIVE_INTEGER","VERSION_PART_REGEXP","processError","prepare","pkeys","queryParams","newUri","pkey","parseUri","hostname","parser","searchParams","pathname","searchParam","pathSegments","compareVersionNumbers","v1","v2","v1parts","v2parts","validateParts","isNumber","NaN","forcedTimeout","headers","getWithCache","autoRefresh","done","post","Content-Type","ws","getWsUrl","_waitOpen","readyState","waitDuration","waitRetryDelay","round","_open","WebSocket","onerror","onmessage","onopen","openTime","onclose","closeEvent","socket","closing","_close","onListener","_remove","isClosed","closeAllWs","sock","isDesktop","nw","Shell","openExternal","openOptions","openTarget","win","moveTo","isCompatible","actualVersion","storage","sessionStorage","$log","standard","secure","removeItem","cordova","barcodeScanner","clipboard","$cordovaClipboard","sourceType","PictureSourceType","PHOTOLIBRARY","CAMERA","quality","destinationType","DestinationType","DATA_URL","encodingType","EncodingType","PNG","targetWidth","targetHeight","$cordovaCamera","keyboard","Keyboard","handleOpenURL","intent","lastIntent","digit","bindModel","modelScope","modelPath","getModelValue","setModelValue","paths","property","decimal","decimalSeparator","leftButton","rightButton","userAgent","isOSX","process","App","isMobile","launchmyapp","InAppBrowser","WELL_KNOWN_CURRENCIES","g1","medianTimeOffset","membersCount","avgGenTime","medianTimeBlocks","currencyName","BLOCK_NOT_FOUND","ud","blocks","_safeLoadCurrentUD","blockIndex","ud0","lastBlockWithUD","base","dividend","unitbase","pow","getData","getDataField","onBlock","cleanData","currentBlock","receivedAt","currentBlockField","getCurrent","NO_CURRENT_BLOCK","ROOT_BLOCK_HASH","lastValid","useCache","SIG","OUTPUT_OBJ","REGEX_ENDPOINT_PARAMS","BMAS","WS2P","BMATOR","WS2PTOR","CURRENCY","PUBKEY_WITH_CHECKSUM","COMMENT","INVALID_COMMENT_CHARS","URI_WITH_AT","URI_WITH_PATH","BMA_ENDPOINT","BMAS_ENDPOINT","WS2P_ENDPOINT","BMATOR_ENDPOINT","WS2PTOR_ENDPOINT","PROTOCOL_VERSION","LIMIT_REQUEST_COUNT","LIMIT_REQUEST_DELAY","postByPath","wsByPath","closeWs","cleanCache","cacheTime","cacheKey","getRequestFn","_startPromise","execCount","HTTP_LIMITATION","postRequest","REVOCATION_ALREADY_REGISTERED","IDENTITY_SANDBOX_FULL","NO_MATCHING_IDENTITY","UID_ALREADY_USED","NO_MATCHING_MEMBER","NO_IDTY_MATCHING_PUB_OR_UID","WRONG_SIGNATURE_MEMBERSHIP","MEMBERSHIP_ALREADY_SEND","SOURCE_ALREADY_CONSUMED","TX_INPUTS_OUTPUTS_NOT_EQUAL","TX_OUTPUT_SUM_NOT_EQUALS_PREV_DELTAS","TX_ALREADY_PROCESSED","URI","TX_OUTPUT_SIG","TX_OUTPUT_FUNCTION","TX_OUTPUT_OBJ_OPERATOR_AND","TX_OUTPUT_OBJ_OPERATOR_OR","TX_OUTPUT_OBJ","TX_OUTPUT_OBJ_OPERATOR","TX_OUTPUT_OBJ_PARENTHESIS","TX_OUTPUT_FUNCTIONS","OUTPUT_FUNCTION","host2","port2","ws2p","heads","lookup","certifiedBy","certifiersOf","pending","requirements","requirementsWithCache","certify","revoke","blocksSlice","membership","newcomers","hardship","difficulties","sources","history","sending","pendings","timesWithCache","parseUnlockCondition","unlockCondition","treeItem","treeItemId","childrenContent","childrenMatches","convertedOutput","treeItems","functions","unlockFunctions","unlockTree","output","epPrefix","useBma","useWs2p","otherNode","wasStarted","uids","memberUidsByPubkey","getByUid","blockNumbers","getHttpRecursive","peersByLeaves","leaves","httpGetRequest","paramName","paramValues","paramValue","requestParams","getHttpWithRetryIfLimitation","lastUd","pathCount","duniterLatestReleaseUrl","getLatestRelease","html_url","tag_name","identityCache","_addUniqueIds","idtyKeys","idty","_sortAndSliceIdentities","loadIdentityByLookup","blockUid","timestamp","revocationNumber","revoked_on","sigDate","hasBadSelfBlock","revocationTime","loadCertifications","getFunction","lookupCertifications","_certId","lookupHasCertTime","lookupCerticationsByCertId","cert","certId","cert_time","written","certTime","expiresIn","sigWindow","sigValidity","wasMember","willExpire","pendingCertifications","pendingCertByBlocks","validBuid","block_hash","writtenCertByPubkey","_sortCertifications","errorCertifications","sigQty","sigStock","getTime","idtyFullKey","received_cert","received_cert_pending","received_cert_error","givenCertifications","given_cert","given_cert_pending","given_cert_error","needCertificationCount","needMembership","certificationCount","willNeedCertificationCount","willExpireCertificationCount","pendingCertificationCount","addEvent","messageParams","pendingRevocation","expired","finishLoadRequirements","safeText","addUniqueId","allowExtension","excludeRevoked","blocUid","revocation_sig","lookupResultCount","getNewcomersRecursive","maxResultSize","joiner","idtyKey","memberDate","getAllRecursive","letters","letter","pubkeyAttributeName","skipAddUid","uidsByPubkey","events","memberships","idtiesByBlock","idtiesByPubkey","ms","blockHash","otherIdtySamePubkey","aidty","_reduceTxAndPush","txArray","processedTxMap","allowPendings","block_number","otherReceiver","outputBase","walletIsIssuer","otherIssuer","issuers","lockedOutputs","outputs","sum","noffset","outputArray","outputAmount","powBase","outputCondition","sigMatches","outputPubkey","identifier","consumed","lockedOutput","txPubkey","blockstampTime","txKey","newTx","isUD","locktime","inputs","loadTx","fromTime","existingPendings","txHistory","udHistory","txPendings","nowInSec","_reduceTx","received","sliceTime","timesNoCache","tx1","tx2","toTime","addSources","sourcesIndexByKey","srcKey","addSource","loadSourcesAndBalance","balance","txErrors","_processPendingTx","consumedSources","inputKey","srcIndex","txs","downloadHistoryFile","currentTime","formatDecimal","formatDate","formatSymbol","csTx","resetKeypair","dataToStore","dataStr","fromJson","loadMinData","loadFullData","finishLoad","cleanEventsByContext","getkeypairSaveId","nbCharSalt","answer","failIfInvalid","loginCheck","isNeverUsed","downloadSaveId","saveId","questions","getSaveIDDocument","saveIdFile","getCryptedId","cypherSalt","cypherPwd","recoverId","recover","cypherNonce","insertAtFirst","cleanByContext","provider","eagerLoadingServices","extensionByStates","registerEagerLoadingService","serviceName","extendState","extension","extendStates","stateNames","$get","currentExtensionPointName","getActivesByName","extensionPointName","includes","parseArrayValues","parseTransactions","array","itemObjProperties","arrayProperty","toHimself","$inject","$stateProvider","$urlRouterProvider","abstract","large","otherwise","menuContent","run","$templateCache","$translateProvider","COMMON","APP_NAME","APP_VERSION","APP_BUILD","MEMBER","BLOCK","BTN_OK","BTN_YES","BTN_NO","BTN_SEND","BTN_SEND_MONEY","BTN_SEND_MONEY_SHORT","BTN_SAVE","BTN_YES_SAVE","BTN_YES_CONTINUE","BTN_SHOW","BTN_SHOW_PUBKEY","BTN_RELATIVE_UNIT","BTN_BACK","BTN_NEXT","BTN_IMPORT","BTN_CANCEL","BTN_CLOSE","BTN_COPY","BTN_LATER","BTN_LOGIN","BTN_LOGOUT","BTN_ADD_ACCOUNT","BTN_SHARE","BTN_EDIT","BTN_DELETE","BTN_ADD","BTN_SEARCH","BTN_REFRESH","BTN_RETRY","BTN_START","BTN_CONTINUE","BTN_CREATE","BTN_UNDERSTOOD","BTN_OPTIONS","BTN_HELP_TOUR","BTN_HELP_TOUR_SCREEN","BTN_DOWNLOAD","BTN_DOWNLOAD_ACCOUNT_STATEMENT","BTN_MODIFY","CHOOSE_FILE","DAYS","NO_ACCOUNT_QUESTION","SEARCH_NO_RESULT","LOADING","LOADING_WAIT","SEARCHING","FROM","TO","COPY","LANGUAGE","UNIVERSAL_DIVIDEND","UD","DATE_PATTERN","DATE_FILE_PATTERN","DATE_SHORT_PATTERN","DATE_MONTH_YEAR_PATTERN","EMPTY_PARENTHESIS","UID","ENABLE","DISABLE","RESULTS_LIST","RESULTS_COUNT","EXECUTION_TIME","SHOW_VALUES","POPOVER_ACTIONS_TITLE","POPOVER_FILTER_TITLE","SHOW_MORE","SHOW_MORE_COUNT","POPOVER_SHARE","TITLE","SHARE_ON_TWITTER","SHARE_ON_FACEBOOK","SHARE_ON_DIASPORA","SHARE_ON_MASTODON","INSTANCE_ADDRESS_HELP","DATE","TYPE","SIZE","VALIDATING","SYSTEM","PICTURE_CHOOSE_TYPE","BTN_PICTURE_GALLERY","BTN_PICTURE_CAMERA","MENU","HOME","WOT","ACCOUNT","WALLETS","TRANSFER","SCAN","SETTINGS","NETWORK","TRANSACTIONS","ABOUT","LICENSE","LATEST_RELEASE","PLEASE_UPDATE","CODE","OFFICIAL_WEB_SITE","DEVELOPERS","FORUM","DEV_WARNING","DEV_WARNING_MESSAGE","DEV_WARNING_MESSAGE_SHORT","REPORT_ISSUE","MESSAGE","MESSAGE_CURRENCY","BTN_CURRENCY","BTN_ABOUT","BTN_HELP","NOT_YOUR_ACCOUNT_QUESTION","BTN_CHANGE_ACCOUNT","CONNECTION_ERROR","SHOW_ALL_FEED","READ_MORE","FEED_SOURCE","DISPLAY_DIVIDER","STORAGE_DIVIDER","NETWORK_SETTINGS","PEER","PEER_SHORT","PEER_CHANGED_TEMPORARY","PERSIST_CACHE","PERSIST_CACHE_HELP","USE_LOCAL_STORAGE","USE_LOCAL_STORAGE_HELP","ENABLE_HELPTIP","ENABLE_UI_EFFECTS","HISTORY_SETTINGS","DISPLAY_UD_HISTORY","AUTHENTICATION_SETTINGS","REMEMBER_ME","REMEMBER_ME_HELP","PLUGINS_SETTINGS","BTN_RESET","EXPERT_MODE","EXPERT_MODE_HELP","POPUP_PEER","HOST","HOST_HELP","USE_SSL","USE_SSL_HELP","BTN_SHOW_LIST","BLOCKCHAIN","HASH","VIEW","HEADER_TITLE","TITLE_CURRENT","COMPUTED_BY","SHOW_RAW","TECHNICAL_DIVIDER","UNIVERSAL_DIVIDEND_HELP","EMPTY","POW_MIN","POW_MIN_HELP","DATA_DIVIDER","IDENTITIES_COUNT","JOINERS_COUNT","ACTIVES_COUNT","ACTIVES_COUNT_HELP","LEAVERS_COUNT","LEAVERS_COUNT_HELP","EXCLUDED_COUNT","EXCLUDED_COUNT_HELP","REVOKED_COUNT","REVOKED_COUNT_HELP","TX_COUNT","CERT_COUNT","TX_TO_HIMSELF","TX_OUTPUT_UNLOCK_CONDITIONS","TX_OUTPUT_OPERATOR","AND","OR","XHX","CSV","CLTV","LOOKUP","NO_BLOCK","LAST_BLOCKS","BTN_COMPACT","TAB_CURRENCY","TAB_WOT","TAB_NETWORK","TAB_BLOCKS","CURRENCY_SHORT_DESCRIPTION","NETWORK_RULES_DIVIDER","CURRENCY_NAME","MEMBERS","MEMBERS_VARIATION","MONEY_DIVIDER","MASS","SHARE","C_ACTUAL","MEDIAN_TIME","MONEY_RULES_DIVIDER","C_RULE","UD_RULE","DT_REEVAL","REEVAL_SYMBOL","DT_REEVAL_VALUE","UD_REEVAL_TIME0","SIG_QTY_RULE","SIG_STOCK","SIG_PERIOD","SIG_WINDOW","SIG_VALIDITY","MS_WINDOW","MS_VALIDITY","STEP_MAX","WOT_RULES_DIVIDER","SENTRIES","SENTRIES_FORMULA","XPERCENT","AVG_GEN_TIME","CURRENT","MATH_CEILING","DISPLAY_ALL_RULES","BTN_SHOW_LICENSE","WOT_DIVIDER","NO_LICENSE_FILE","LOADING_PEERS","NODE_ADDRESS","SOFTWARE","WARN_PRE_RELEASE","WARN_NEW_RELEASE","WS2PID","PRIVATE_ACCESS","POW_PREFIX","ENDPOINTS","ES_USER_API","INFO","ONLY_SSL_PEERS","PEERS","SIGNED_ON_BLOCK","MIRROR","MIRRORS","MIRROR_PEERS","PEER_LIST","MEMBER_PEERS","ALL_PEERS","DIFFICULTY","API","CURRENT_BLOCK","OFFLINE","OFFLINE_PEERS","BTN_SHOW_PEER","OWNER","SHOW_RAW_PEERING","SHOW_RAW_CURRENT_BLOCK","KNOWN_PEERS","GENERAL_DIVIDER","ERROR","LOADING_TOR_NODE_ERROR","LOADING_NODE_ERROR","SEARCH_HELP","SEARCH_INIT_PHASE_WARNING","REGISTERED_SINCE","REGISTERED_SINCE_BLOCK","NO_CERTIFICATION","NO_GIVEN_CERTIFICATION","NOT_MEMBER_PARENTHESIS","IDENTITY_REVOKED_PARENTHESIS","MEMBER_PENDING_REVOCATION_PARENTHESIS","EXPIRE_IN","NOT_WRITTEN_EXPIRE_IN","EXPIRED","PSEUDO","WRITTEN_ON_BLOCK","NOT_MEMBER_ACCOUNT","NOT_MEMBER_ACCOUNT_HELP","BTN_CERTIFY","BTN_YES_CERTIFY","BTN_SELECT_AND_CERTIFY","ACCOUNT_OPERATIONS","POPOVER_SHARE_TITLE","NEWCOMERS","NEWCOMERS_COUNT","PENDING","PENDING_COUNT","REGISTERED","MEMBER_FROM","BTN_NEWCOMERS","BTN_PENDING","NO_PENDING","NO_NEWCOMERS","CONTACTS","MODAL","CERTIFICATIONS","SUMMARY","LIST","PENDING_LIST","RECEIVED","RECEIVED_BY","SENTRY_MEMBER","OPERATIONS","GIVEN_CERTIFICATIONS","SENT","SENT_BY","LOGIN","SCRYPT_FORM_HELP","PUBKEY_FORM_HELP","FILE_FORM_HELP","SCAN_FORM_HELP","SALT","SALT_HELP","SHOW_SALT","PASSWORD","PASSWORD_HELP","PUBKEY_HELP","HAVE_ACCOUNT_QUESTION","CREATE_ACCOUNT","CREATE_FREE_ACCOUNT","FORGOTTEN_ID","ASSOCIATED_PUBKEY","BTN_METHODS","BTN_METHODS_DOTS","METHOD_POPOVER_TITLE","MEMORIZE_AUTH_FILE","SCRYPT_PARAMETERS","AUTO_LOGOUT","BTN_RELOGIN","IDLE_WARNING","METHOD","SCRYPT_DEFAULT","SCRYPT_ADVANCED","SCRYPT","SECURE","HARDEST","EXTREME","USER","HELP","SHOW_MORE_TX","SHOW_ALL_TX","EVENTS","BTN_RECEIVE_MONEY","BTN_SECURITY_DOTS","BTN_SHOW_DETAILS","NEW","INTRO_WARNING_TIME","INTRO_WARNING_SECURITY","INTRO_WARNING_SECURITY_HELP","INTRO_HELP","REGISTRATION_NODE","REGISTRATION_NODE_HELP","SELECT_ACCOUNT_TYPE","MEMBER_ACCOUNT","MEMBER_ACCOUNT_TITLE","MEMBER_ACCOUNT_HELP","WALLET_ACCOUNT","WALLET_ACCOUNT_TITLE","WALLET_ACCOUNT_HELP","SALT_WARNING","PASSWORD_WARNING","PSEUDO_WARNING","PSEUDO_HELP","SALT_CONFIRM","SALT_CONFIRM_HELP","PASSWORD_CONFIRM","PASSWORD_CONFIRM_HELP","SLIDE_6_TITLE","COMPUTING_PUBKEY","LAST_SLIDE_CONGRATULATION","CONFIRMATION_MEMBER_ACCOUNT","CONFIRMATION_WALLET_ACCOUNT","CHECKING_PSEUDO","PSEUDO_AVAILABLE","PSEUDO_NOT_AVAILABLE","INFO_LICENSE","BTN_ACCEPT","BTN_ACCEPT_LICENSE","POPUP_REGISTER","HEADERS","TIME","AMOUNT","SUB_TITLE","AMOUNT_HELP","COMMENT_HELP","BTN_ADD_COMMENT","UNKNOWN_URI_FORMAT","PUBKEY_INVALID_CHECKSUM","POPUP_TITLE","UNKNOWN_ERROR","CRYPTO_UNKNOWN_ERROR","EQUALS_TO_PSEUDO","EQUALS_TO_SALT","FIELD_REQUIRED","FIELD_TOO_SHORT","FIELD_TOO_SHORT_WITH_LENGTH","FIELD_TOO_LONG","FIELD_TOO_LONG_WITH_LENGTH","FIELD_MIN","FIELD_MAX","FIELD_ACCENT","FIELD_NOT_NUMBER","FIELD_NOT_INT","FIELD_NOT_EMAIL","PASSWORD_NOT_CONFIRMED","SALT_NOT_CONFIRMED","SEND_IDENTITY_FAILED","SEND_CERTIFICATION_FAILED","NEED_MEMBER_ACCOUNT_TO_CERTIFY","NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF","NOT_MEMBER_FOR_CERTIFICATION","IDENTITY_TO_CERTIFY_HAS_NO_SELF","LOGIN_FAILED","LOAD_IDENTITY_FAILED","LOAD_REQUIREMENTS_FAILED","SEND_MEMBERSHIP_IN_FAILED","SEND_MEMBERSHIP_OUT_FAILED","REFRESH_WALLET_DATA","GET_CURRENCY_PARAMETER","GET_CURRENCY_FAILED","SEND_TX_FAILED","ALL_SOURCES_USED","NOT_ENOUGH_SOURCES","ACCOUNT_CREATION_FAILED","RESTORE_WALLET_DATA_ERROR","LOAD_WALLET_DATA_ERROR","COPY_CLIPBOARD_FAILED","TAKE_PICTURE_FAILED","SCAN_FAILED","SCAN_UNKNOWN_FORMAT","WOT_LOOKUP_FAILED","LOAD_PEER_DATA_FAILED","NEED_LOGIN_FIRST","AMOUNT_REQUIRED","AMOUNT_NEGATIVE","NOT_ENOUGH_CREDIT","INVALID_NODE_SUMMARY","INVALID_USER_ID","INVALID_COMMENT","INVALID_PUBKEY","INVALID_PUBKEY_CHECKSUM","IDENTITY_REVOKED","IDENTITY_PENDING_REVOCATION","IDENTITY_INVALID_BLOCK_HASH","IDENTITY_EXPIRED","IDENTITY_NOT_FOUND","IDENTITY_TX_FAILED","WOT_PENDING_INVALID_BLOCK_HASH","WALLET_INVALID_BLOCK_HASH","WALLET_IDENTITY_EXPIRED","WALLET_REVOKED","WALLET_HAS_NO_SELF","AUTH_REQUIRED","AUTH_INVALID_PUBKEY","AUTH_INVALID_SCRYPT","AUTH_INVALID_FILE","AUTH_FILE_ERROR","IDENTITY_ALREADY_CERTIFY","IDENTITY_ALREADY_CERTIFY_PENDING","UNABLE_TO_CERTIFY_TITLE","LOAD_NEWCOMERS_FAILED","LOAD_PENDING_FAILED","ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION","ONLY_SELF_CAN_EXECUTE_THIS_ACTION","GET_BLOCK_FAILED","INVALID_BLOCK_HASH","DOWNLOAD_REVOCATION_FAILED","REVOCATION_FAILED","SALT_OR_PASSWORD_NOT_CONFIRMED","RECOVER_ID_FAILED","LOAD_FILE_FAILED","NOT_VALID_REVOCATION_FILE","NOT_VALID_SAVE_ID_FILE","NOT_VALID_KEY_FILE","EXISTING_ACCOUNT","EXISTING_ACCOUNT_REQUEST","GET_LICENSE_FILE_FAILED","CHECK_NETWORK_CONNECTION","CERTIFICATION_DONE","TRANSFER_SENT","COPY_TO_CLIPBOARD_DONE","MEMBERSHIP_OUT_SENT","NOT_NEED_MEMBERSHIP","IDENTITY_WILL_MISSING_CERTIFICATIONS","REVOCATION_SENT","REVOCATION_SENT_WAITING_PROCESS","FEATURES_NOT_IMPLEMENTED","EMPTY_TX_HISTORY","CONFIRM","POPUP_WARNING_TITLE","POPUP_SECURITY_WARNING_TITLE","CERTIFY_RULES_TITLE_UID","CERTIFY_RULES","FULLSCREEN","EXIT_APP","LOGIN_UNUSED_WALLET_TITLE","LOGIN_UNUSED_WALLET","SAVE_BEFORE_LEAVE","SAVE_BEFORE_LEAVE_TITLE","LOGOUT","USE_FALLBACK_NODE","JOIN","SECTION","GLOSSARY","PUBKEY_DEF","UNIVERSAL_DIVIDEND_DEF","SHARE_ON_GOOGLEPLUS","CURRENCIES","AUTO_LOGOUT_HELP","AUTO_LOGOUT_OPTION_HOUR","AUTO_LOGOUT_OPTION_MINUTE","AUTO_LOGOUT_OPTION_MINUTES","AUTO_LOGOUT_OPTION_NEVER","AUTO_LOGOUT_OPTION_SECONDS","AUTH","BTN_AUTH","METHOD_LABEL","BTN_MEMBERSHIP_IN_DOTS","BTN_SEND_IDENTITY_DOTS","BALANCE","LAST_TX","BALANCE_ACCOUNT","NO_TX","TX_FROM_DATE","PENDING_TX","ERROR_TX","ERROR_TX_SENT","PENDING_TX_RECEIVED","WAITING_MEMBERSHIP","WAITING_CERTIFICATIONS","WILL_MISSING_CERTIFICATIONS","WILL_NEED_RENEW_MEMBERSHIP","NEED_RENEW_MEMBERSHIP","CERTIFICATION_COUNT","CERTIFICATION_COUNT_SHORT","BTN_MEMBERSHIP_RENEW","BTN_MEMBERSHIP_RENEW_DOTS","BTN_MEMBERSHIP_OUT_DOTS","LOCKED_OUTPUTS_POPOVER","DESCRIPTION","DESCRIPTION_MANY","LOCKED_AMOUNT","SECURITY","ADD_QUESTION","BTN_CLEAN","DOWNLOAD_REVOKE","DOWNLOAD_REVOKE_HELP","HELP_LEVEL","LEVEL","LOW_LEVEL","MEDIUM_LEVEL","QUESTION_1","QUESTION_2","QUESTION_3","QUESTION_4","QUESTION_5","QUESTION_6","QUESTION_7","QUESTION_8","QUESTION_9","QUESTION_10","QUESTION_11","QUESTION_12","QUESTION_13","QUESTION_14","QUESTION_15","QUESTION_16","QUESTION_17","QUESTION_18","QUESTION_19","RECOVER_ID","REVOCATION_WITH_FILE","REVOCATION_WITH_FILE_HELP","REVOCATION_FILENAME","REVOCATION_WALLET","SAVE_ID","STRONG_LEVEL","RECOVER_ID_HELP","REVOCATION_WALLET_HELP","SAVE_ID_HELP","FILE_NAME","DOWNLOAD_KEYFILE_FAILED","DOWNLOAD","POPUP_REVOKE_MESSAGE","CATEGORY","CATEGORY_SELECT_HELP","CATEGORIES","CATEGORY_SEARCH_HELP","LAST_MODIFICATION_DATE","BTN_LIKE","BTN_FOLLOW","BTN_STOP_FOLLOW","LIKES_TEXT","DISLIKES_TEXT","VIEWS_TEXT","FOLLOWS_TEXT","ABUSES_TEXT","BTN_REPORT_ABUSE_DOTS","BTN_REMOVE_REPORTED_ABUSE","SUBMIT_BY","GEO_DISTANCE_SEARCH","GEO_DISTANCE_OPTION","BTN_PUBLISH","BTN_PICTURE_DELETE","BTN_PICTURE_FAVORISE","BTN_PICTURE_ROTATE","BTN_ADD_PICTURE","NOTIFICATION","HAS_UNREAD","NOTIFICATIONS","MARK_ALL_AS_READ","NO_RESULT","SHOW_ALL","LOAD_NOTIFICATIONS_FAILED","REPORT_ABUSE","REASON_HELP","ASK_DELETE","REGISTRY","USER_PROFILE","MESSAGES","INVITATIONS","ORGANIZATION_ACCOUNT","ORGANIZATION_ACCOUNT_HELP","EVENT","MEMBER_WITHOUT_PROFILE","WS_CONNECTION_FAILED","BTN_SUGGEST_CERTIFICATIONS_DOTS","BTN_ASK_CERTIFICATIONS_DOTS","BTN_ASK_CERTIFICATION","SUGGEST_CERTIFICATIONS_MODAL","ASK_CERTIFICATIONS_MODAL","SEARCH","DIVIDER_PROFILE","DIVIDER_PAGE","DIVIDER_GROUP","SENIORITY","STARS","STAR_HIT_COUNT","BTN_STAR_HELP","BTN_STARS_REMOVE","BTN_REDO_STAR_HELP","COMMENTS","DIVIDER","SHOW_MORE_COMMENTS","COMMENT_HELP_REPLY_TO","REPLY","REPLY_TO","REPLY_TO_LINK","REPLY_TO_DELETED_COMMENT","REPLY_COUNT","DELETED_COMMENT","MODIFIED_ON","MODIFIED_PARENTHESIS","FAILED_SAVE_COMMENT","FAILED_REMOVE_COMMENT","REPLY_TITLE_PREFIX","FORWARD_TITLE_PREFIX","BTN_REPLY","BTN_COMPOSE","BTN_WRITE","NO_MESSAGE_INBOX","NO_MESSAGE_OUTBOX","MESSAGE_RECEIVED","INBOX","OUTBOX","LAST_INBOX","LAST_OUTBOX","BTN_LAST_MESSAGES","POPOVER_ACTIONS","DELETE_ALL","COMPOSE","TITLE_REPLY","OBJECT","OBJECT_HELP","ENCRYPTED_HELP","MESSAGE_HELP","CONTENT_CONFIRMATION","SENDER","RECIPIENT","NO_CONTENT","DELETE","REMOVE","REMOVE_ALL","USER_HAS_NO_PROFILE","MESSAGE_REMOVED","All_MESSAGE_REMOVED","MESSAGE_SENT","SEND_MSG_FAILED","LOAD_MESSAGES_FAILED","LOAD_MESSAGE_FAILED","MESSAGE_NOT_READABLE","USER_NOT_RECIPIENT","NOT_AUTHENTICATED_MESSAGE","REMOVE_MESSAGE_FAILED","MESSAGE_CONTENT_TOO_LONG","MARK_AS_READ_FAILED","REMOVE_All_MESSAGES_FAILED","MARK_ALL_AS_READ_FAILED","RECIPIENT_IS_MANDATORY","LOCATION_DIVIDER","SOCIAL_NETWORKS_DIVIDER","BTN_SHOW_WOT","BTN_SHOW_WOT_HELP","BTN_SHOW_PAGES","BTN_SHOW_PAGES_HELP","BTN_NEW","MY_PAGES","NO_PAGE","BTN_LAST_RECORDS","BTN_ADVANCED_SEARCH","LOCATION_HELP","RESULTS","RESULT_COUNT_LOCATION","RESULT_COUNT","LAST_RECORDS","LAST_RECORD_COUNT_LOCATION","LAST_RECORD_COUNT","POPOVER_FILTERS","LOCATION","MENU_TITLE","REMOVE_CONFIRMATION","SELECT_TYPE","ENUM","SHOP","COMPANY","ASSOCIATION","INSTITUTION","EDIT","TITLE_NEW","RECORD_TYPE","RECORD_TITLE","RECORD_TITLE_HELP","RECORD_DESCRIPTION","RECORD_DESCRIPTION_HELP","RECORD_ADDRESS","RECORD_ADDRESS_HELP","RECORD_CITY","RECORD_CITY_HELP","RECORD_SOCIAL_NETWORKS","RECORD_PUBKEY","RECORD_PUBKEY_HELP","WALLET","REGISTRY_DIVIDER","REGISTRY_HELP","LOAD_CATEGORY_FAILED","LOAD_RECORD_FAILED","LOOKUP_RECORDS_FAILED","REMOVE_RECORD_FAILED","SAVE_RECORD_FAILED","RECORD_NOT_EXISTS","GEO_LOCATION_NOT_FOUND","RECORD_REMOVED","RECORD_SAVED","PROFILE","PROFILE_DIVIDER","PROFILE_DIVIDER_HELP","NO_PROFILE_DEFINED","BTN_REORDER","TITLE_HELP","DESCRIPTION_HELP","SOCIAL_HELP","STAR","MODAL_AVATAR","SELECT_FILE_HELP","BTN_SELECT_FILE","RESIZE_HELP","RESULT_HELP","REMOVE_PROFILE_FAILED","LOAD_PROFILE_FAILED","SAVE_PROFILE_FAILED","INVALID_SOCIAL_NETWORK_FORMAT","IMAGE_RESIZE_FAILED","PROFILE_REMOVED","PROFILE_SAVED","WARNING_PUBLIC_DATA","BTN_GEOLOC_ADDRESS","USE_GEO_POINT","LOADING_LOCATION","ADDRESS","ADDRESS_HELP","CITY","CITY_HELP","DISTANCE","DISTANCE_UNIT","DISTANCE_OPTION","PROFILE_POSITION","ALTERNATIVE_RESULT_DIVIDER","POSITION","CITY_REQUIRED_IF_STREET","REQUIRED_FOR_LOCATION","INVALID_FOR_LOCATION","GEO_LOCATION_FAILED","ADDRESS_LOCATION_FAILED","SUBSCRIPTION","SUBSCRIPTION_DIVIDER","SUBSCRIPTION_DIVIDER_HELP","NO_SUBSCRIPTION","SUBSCRIPTION_COUNT","HELP_TEXT","PROVIDER","EMAIL","DELETE_SUBSCRIPTION","LOAD_SUBSCRIPTIONS_FAILED","ADD_SUBSCRIPTION_FAILED","UPDATE_SUBSCRIPTION_FAILED","DELETE_SUBSCRIPTION_FAILED","MODAL_EMAIL","EMAIL_LABEL","EMAIL_HELP","FREQUENCY_LABEL","FREQUENCY_DAILY","FREQUENCY_WEEKLY","DOCUMENT","BTN_ACTIONS","LAST_DOCUMENTS_DOTS","LAST_DOCUMENTS","SHOW_QUERY","HIDE_QUERY","HEADER_TIME","HEADER_ISSUER","HEADER_RECIPIENT","READ","DOCUMENT_TYPE","DOCUMENT_TITLE","BTN_REMOVE","HAS_REGISTERED","MARKET_RECORD","MARKET_COMMENT","PAGE_RECORD","PAGE_COMMENT","GROUP_RECORD","GROUP_COMMENT","REMOVED","LOAD_DOCUMENTS_FAILED","REMOVE_FAILED","REMOVE_ALL_FAILED","ES_SETTINGS","PLUGIN_NAME","PLUGIN_NAME_HELP","ENABLE_TOGGLE","ENABLE_MESSAGE_TOGGLE","ENABLE_SETTINGS_TOGGLE","PEER_HELP","ENABLE_TX_SENT","ENABLE_TX_RECEIVED","ENABLE_CERT_SENT","ENABLE_CERT_RECEIVED","ASK_ENABLE_TITLE","ASK_ENABLE","ES_WALLET","ES_PEER","NAME","DOCUMENTS","DOCUMENT_COUNT","EMAIL_SUBSCRIPTION_COUNT","NODE_STARTED","NODE_BMA_DOWN","NODE_BMA_UP","MEMBER_JOIN","MEMBER_LEAVE","MEMBER_EXCLUDE","MEMBER_REVOKE","MEMBER_ACTIVE","TX_SENT","TX_SENT_MULTI","TX_RECEIVED","TX_RECEIVED_MULTI","CERT_SENT","CERT_RECEIVED","LIKE_RECEIVED","FOLLOW_RECEIVED","STAR_RECEIVED","MODERATION_RECEIVED","DELETION_RECEIVED","ABUSE_RECEIVED","PAGE","NEW_COMMENT","UPDATE_COMMENT","NEW_REPLY_COMMENT","UPDATE_REPLY_COMMENT","FOLLOW_NEW_COMMENT","FOLLOW_UPDATE_COMMENT","FOLLOW_NEW","FOLLOW_UPDATE","ES_USE_FALLBACK_NODE","ES_CONNECTION_ERROR","ES_MAX_UPLOAD_BODY_SIZE","SUGGEST_CERTIFICATIONS","ASK_CERTIFICATION","ASK_CERTIFICATIONS","INVITATION","BTN_DELETE_ALL","BTN_NEW_INVITATION","SUGGESTION_CERTIFICATION","SUGGESTED_BY","RECIPIENTS","RECIPIENTS_HELP","RECIPIENTS_MODAL_TITLE","RECIPIENTS_MODAL_HELP","SUGGESTION_IDENTITIES","SUGGESTION_IDENTITIES_HELP","SUGGESTION_IDENTITIES_MODAL_TITLE","SUGGESTION_IDENTITIES_MODAL_HELP","DELETE_ALL_CONFIRMATION","SEND_INVITATIONS_TO_CERTIFY","INVITATION_SENT","LOAD_INVITATIONS_FAILED","REMOVE_INVITATION_FAILED","REMOVE_ALL_INVITATIONS_FAILED","SEND_INVITATION_FAILED","BAD_INVITATION_FORMAT","FOLLOW_CLOSE","TITLE_SMALL_DEVICE","BTN_GRAPH","GRAPH","LINEAR_SCALE","LOGARITHMIC_SCALE","BTN_SHOW_STATS","BTN_SHOW_DETAILED_STATS","RANGE_DURATION_DIVIDER","RANGE_DURATION","HOUR","DAY","MONTH","BLOCK_COUNT_LABEL","BLOCK_COUNT","DOC_STATS","MARKET","AD","USER_SETTINGS","MESSAGE_INBOX","MESSAGE_OUTBOX","INVITATION_CERTIFICATION","SOCIAL","OTHER","HISTORY_DELETE","MARKET_DELTA","USER_DELTA","SYNCHRO","COUNT","INSERTS","UPDATES","DELETES","PERFORMANCE","DURATION","MAP","SEARCH_DOTS","BTN_SHOW_ON_MAP","SHAPE","COUNTRY_DOTS","COUNTRY_HELP","CONFIG_FORM_DIVIDER","ERROR_DIVIDER","LEFT_LNG","RIGHT_LNG","TOP_LAT","BOTTOM_LAT","SCALE","TRANSLATE_X","TRANSLATE_Y","AREA_FORM_DIVIDER","POSITION_DOTS","ORDER","BTN_APPLY","CUSTOM_PROJECTION","BTN_TEST_SEARCH","STRICT_MODE","REMOVE_HOLE","APPLY_ROUND","DEGREES_PRECISION","SAVED","INVALID_SVG","INVALID_COUNTRY_CODE","SAVE_FAILED","SELF_INTERSECTION","HOLE_LIES_OUTSIDE","HOLE_NOT_WITHIN_POLYGON","BTN_MAP","BTN_MAP_HELP","LAYER","MARKER_HELP","LOCALIZE_ME_FAILED","BTN_LOCALIZE_ME","BTN_MOVE_DOWN","BTN_MOVE_UP","BTN_MOVE_LEFT","BTN_MOVE_RIGHT","MY_RECORDS","PRICE","BTN_NEW_AD","SOLD","LAST_UPDATE","AROUND_ME","CROWDFUNDING_PROGRESS","FREE_PRICE","WARNING","DEFAULT_TITLE","IDENTITY_RECORDS_TITLE","EVENT_LOGIN","EMAIL_OR_PHONE","EMAIL_OR_PHONE_HELP","INVALID_USERNAME","BTN_SHOW_MARKET_OFFER","LOCATION_LABEL","ALL","UNKNOWN","ROOT_CATEGORIES","POPUP","TITLE_EDIT","CANCEL","CANNOT_SAVE","INVALID_ID_PATTERN","ID_ALREADY_USED","BY","BTN_CATEGORIES","BTN_AROUND_ME","GEO_DISTANCE","BTN_SHOW_CATEGORIES","BTN_OFFERS","BTN_CROWDFUNDING","BTN_FAVORITES","BTN_AUCTION","BTN_NEEDS","SHOW_CLOSED_RECORD","SHOW_OLD_RECORD","RECORD_STOCK","SORT","PREFIX","DATE_ASC","DATE_DESC","PRICE_ASC","PRICE_DESC","GALLERY","BTN_PAUSE","BTN_STOP","SLIDE_DURATION","AD_TYPE","ALL_AD_TYPES","SLIDE_DURATION_OPTION","BTN_SOLD_AD","BTN_SOLD","BTN_REOPEN","BTN_PAYMENT_HELP","RECORD_FEES_PARENTHESIS","SOLD_CONFIRMATION","REOPEN_CONFIRMATION","NEW_MESSAGE_TITLE","MORE_LIKE_THIS","PAYMENT","PAYMENT_WITH_COMMENT","CROWDFUNDING_ISSUERS","SHOW_CROWDFUNDING_ISSUERS","DUNITER_PUBKEY","DUNITER_ACCOUNT","DUNITER_ACCOUNT_HELP","DUNITER_ACCOUNT_NO_PUBKEY_HELP","OFFER","OFFER_SHORT","CROWDFUNDING","CROWDFUNDING_SHORT","NEED","NEED_SHORT","AUCTION","AUCTION_SHORT","LOCAL_SALE","LOCATION_PREFIX","RECORD_LOCATION","RECORD_LOCATION_HELP","RECORD_PRICE","RECORD_PRICE_HELP","RECORD_CURRENCY","RECORD_FEES","RECORD_FEES_HELP","RECORD_STOCK_HELP","START_PRICE_HELP","MAX_PRICE_HELP","PRICE_HELP","NO_GEO_POINT","BTN_RECORDS","DUNITER_ACCOUNT_HELP_ASK_USER","FAILED_STAR_PROFILE","SOFTWARE_HELP","PAYMENT_LINK_HELP","INVALID_LOGIN_CREDENTIALS","FAILED_SAVE_RECORD","FAILED_UPDATE_RECORD","SOLD_RECORD_FAILED","REOPEN_RECORD_FAILED","RECORD_EXCEED_UPLOAD_SIZE","RECORD_SOLD","RECORD_REOPEN","FAVORITES","BTN_BUY","BTN_BUY_DOTS","API_REGEXP","LOCAL_IP_ADDRESS","getEP","copyValues","copyValuesFrom","getRaw","epRegex","epStr","regExp","hasEsEndpoint","getEsEndpoints","getIPv4","getIPv6","getPort","getHost","getURL","isHttp","commons","refreshTreeLinks","addTreeLinks","mapById","incompleteCommentIdByParentIds","_id","loadDataByRecordId","recordId","loadAvatar","createOnDeleteListener","onRemoveListener","entity","stopListenChanges","EsHttp","defaultSettingsNode","ES_USER_API_ENDPOINT","ANY_API_ENDPOINT","MAX_UPLOAD_BODY_SIZE","maxUploadBodySize","IMAGE_SRC","URL","HASH_TAG","USER_TAG","API_ENDPOINT","fallbackNodeIndex","truncUrlFilter","isSameNodeAsSettings","isSameNode","setIsFallbackNode","onSettingsReset","parseTagsFromText","reg","escapeHtmlTags","isTemporary","byteCount","encodeURI","_inheritedOpen","checkNodeAlive","fallbackNode","fallbackNodes","newServer","skipInit","imageField","attachment","_type","_title","_name","sameAsSettings","tagFields","fieldNames","fillRecordTags","str","bodyLength","getRequest","_version","tagState","nameState","newLine","urls","parseUrlsFromText","link","hashTags","userTags","titles","suffix","lines","line","parseMarkdownTitlesFromText","findObjectInTree","attrName","Array","isArray","countHits","subscription","PluginServiceProvider","previousRemoteData","SETTINGS_SAVE_SPEC","askEnable","txSent","txReceived","certSent","certReceived","invitations","enableGoogleApi","googleApiKey","enableMixedSearch","ignoreSettingsChanged","storeSettingsLocally","refreshState","storeSettingsRemotely","filteredData","copyUsingSpec","copySpec","setPluginSaveSpecs","pluginName","saveSpecs","esCrypto","PHONE","facebook","twitter","googleplus","youtube","github","tumblr","snapchat","linkedin","vimeo","instagram","wordpress","diaspora","bitcoin","curve25519","getTypeFromUrl","urlToMatch","slashPathIndex","getFromUrl","reduceArray","createForEncryption","dataToEncrypt","openArray","socialsToDecrypt","packArray","socialsToEncrypt","getProfile","getAll","found","_fillSearchResultsFromHits","datas","dataByPubkey","pubkeyAtributeName","indices","avatarFieldName","divider","memberCount","_fillSearchResultFromHit","mixedSearch","indices_boost","group","onWotSearch","constant_score","must","onWotLoad","getFields","getAvatarAndName","MESSAGE_CODES","INVITATION_CODES","DEFAULT_LOAD_SIZE","createFilterQuery","excludesCodes","must_not","gt","loadUnreadNotificationsCount","missing","postCount","onNewUserEvent","newInvitation","markNotificationAsRead","$$phase","addNewNotification","emitEsNotification","newMessage","htmlToPlaintext","emitHtml5Notification","body","lang","browserNotification","postReadById","onWalletReset","getUserEvent","excludeCodes","userEventWs","postSearch","getChanges","html5","emit","esWallet","postSearchByType","getByTypeAndId","onWalletInit","countUnreadMessages","onNewMessageEvent","doSendMessage","boxPath","searchMessages","decryptMessages","withSummary","fillSummary","onSendError","developers","developer","avatarField","outbox","updateNotificationCountAndReadTime","showNotifications","onRead","showNewInvitation","onWalletFinishLoad","fullKeypair","googleSearchPositionByString","google","apiKey","display_name","address_components","long_name","osm","searchByIP","hasConfigApiKey","geolocation","getCurrentPosition","coords","latitude","longitude","addressdetails","village","town","road","suburb","hamlet","place_id","osmErr","street","googleErr","ip","lat1","lon1","lat2","lon2","radlat1","radlat2","theta","radtheta","sin","cos","acos","$sanitize","onWalletLoad","issuerContent","recipientContent","contentStr","encryptedRecord","movement","_initOptions","stats.medianTime","nested_path","_readSearchHits","issuerField","recipients","queryString","documents","isHttpsMode","pod","knownBlocks","mainBlock","searchingPeersOnNetwork","buid","newPeers","flushNewPeersAndSort","sortPeers","addOrRefreshPeerFromJson","list","createPeerEntities","hasUpdates","existingPeer","existingMainBuid","existingOnline","refreshPeer","refreshedPeer","endpointsAsString","applyPeerFilter","currentNumber","difficulty","emailSubscription","updateMainBuid","newPeersAdded","computeScoreAlphaValue","nbChars","buids","pct","hasConsensusBlock","consensusBlockDelta","sortScore","mainBlockChanged","$q_started","hasPeers","getPeers","getTrustedPeers","getKnownBlocks","getMainBlockUid","mainBuid","getSearch","addLike","getLikeIds","existingLikeIds","likeId","aggs","level_sum","issuerHitIndex","aggregations","nav-buttons-right","menu-discover","menu-user","profile-popover-user","header-buttons","hero","after-general","general","buttons-top-fab","silentLocationChange","preferHttp","esComment","getCategories","readRecordFromHit","getCommons","geoDistanceObj","geoDistanceUnit","fecthPictures","showEventLogin","readFromHit","fallbackLocalId","filteredCategories","getFilteredCategories","cachedResult","isExclude","addCategory","updateCategory","asCategoriesTree","catByParent","roots","withChildren","getCategoriesStats","by_id","minTime","gte","request_cache","buckets","countById","bucket","doc_count","saveAllCategories","cats","idsToDelete","existingCategories","existingCat","without","savePromise","caches","likeMoreThis","childrenIds","types","lowerText","withPictures","getMinAdTime","coordinates","geo_polygon","cachedRes","fetchSize","walletPubkey","oldHits","more_like_this","min_term_freq","max_query_terms","filterAndFetchHits","missingSize","more","COMMENTS_PREFIX","postSearchByCurrency","getRecordPrefix","fillRecordTx","withAvg","withIssuers","avg","fn","onRecordSearch","onRecordLoad","fillTx","uriParams","defaultProfile","defaultSubscription","favorites","onWalletLoginCheck","encryptedSocials","copiedProfile","registerNewProfile","registerNewSubscription","setDefaultSubscription","cesiumApi","baseUrl","maxAdAge","converse","jid","bosh_service_url","auto_join_rooms","readyDeferred","defaultCurrency","_initCurrencies","getMaxAdAge","initialized","xmpp","nickname","initialize","_converse","waitUntil","allow_muc_invitations","auto_login","allow_logout","authentication","auto_away","auto_join_on_invite","auto_reconnect","minimized","blacklisted_plugins","whitelisted_plugins","allow_registration","show_send_button","muc_show_join_leave","notification_icon","i18n","room","nick","menu-main","footer-start","emailPattern","blockstat","_initRangeOptions","maxRangeSize","defaultTotalRangeCount","subtract","ranges","processSearchResult","agg","isBefore","inserts","updates","deletes","peer_count","apis","cardinality","css2Rgb","positive","balanced","energized","stable","custom","startColor","startState","_state2side","defaultStateSize","states","sides","stateCounters","j","fix","valueOf","mapObject","rgbArray","translucent","L","AwesomeMarkers","Icon","leafletHelpers","isSameCenter","isSameCenterOnMap","FRANCE","LOCALIZE_ZOOM","DEFAULT_CENTER","overlaysNames","scrollWheelZoom","layers","baselayers","layerOptions","subdomains","continuousWorld","cycle","controls","overlays","isValidCenter","isSame","isDefault","centerModel","mapCenter","toFixed","updateCenter","invalidateSize","_resetView","control","initial","marker","propertyName","markerLocation","translatePromise","addTo","textPlaceholder","textErr","localizeMe","easyButton","btn","shapesById","d3Projection","geoMercator","geoScale","geoTranslate","viewBox","getAllShapeIds","properties.country","createSvg","append","container","getBoundingClientRect","geoPath","attr","left","top","right","bottom","dx","dy","findSvgGeoViewBox","svgElement","tagName","findSvgViewBox","minX","minY","findSvgGeoScale","createSvgFromText","classed","computeSvgProjectionData","findSvgGeoTranslate","geoTopLeft","geoBottomRight","svgTopLeft","svgBottomRight","geoWidth","currentX","currentY","currentScale","scaleFixAbsolute","xFixAbsolute","yFixAbsolute","expectedPrecision","checkTimeout","previousFix","previousFixSign","fixSign","testTopLeft","invert","testBottomRight","testWidth","errorWidth","errorTopX","errorBottomX","errorX","abs","errorLeftY","errorRightY","errorY","putShapeInCache","toStrictGeoJson","outer","correctRings","correct","wind","clockwise","reverse","area","p1","p2","rad","ringArea","removeGeoJsonHoles","progressFn","existingIds","idsToRemove","featureCount","executeFn","parseError","getAllIds","names","create","compacted","featuresByPosition","svgWidth","svgSelector","svgOptions","projData","mapX","scaleLinear","domain","mapY","coord","ele","x","baseVal","y","pathDataStr","pathData","actionRegexp","lineRings","currentLineRing","ignoreCount","pathitem","currentPoint","prevLength","prevPoint","previousPolygon","firstIsClockwise","polygons","currentPolygon","cw","isHole","mappedCoords","duplicateCount","projectedPoint","toMappedCoords","svgElementToGeometry","footer-end","after-position","helpText","draggable","deferIntercept","$urlRouter","disableChangeState","currentScope","newUrl","oldUrl","listen","styleLightContent","bootstrap","component","csId","transclude","$onInit","directive","require","ngModel","compareTo","$validators","modelValue","$eval","$validate","differentTo","NUMBER_REGEXP","numberFloat","$isEmpty","INT_REGEXP","attrs","numberInt","EMAIL_REGEXP","requiredIf","restrict","showCopyPopover","copyOnClick","copied","execCommand","clazz","activeLink","activeLinkPathPrefix","newPath","addClass","returnClose","onReturn","onFocus","onBlur","which","blur","$compile","$parse","compile","tElement","tAttrs","ngBindHtmlGetter","trustAsHtml","ngBindHtmlWatch","$$addBindingClass","$$addBindingInfo","contents","$element","expire","tAttributes","extensionPoints","getTemplate","pre","iElement","iAttrs","onReadFile","onChangeEvent","onLoadEvent","srcElement","elem","dropZone","dataTransfer","fileSelect","accept","minValue","currencySymbol","formatRelative","formatQuantitative","filterTranslations","Infinity","pattern","fromNow","_cache","sepChars","charAt","uniformLanguageTag","determinePreferredLanguage","useSanitizeValueStrategy","useLoaderCache","$httpProvider","useXDomain","common","$compileProvider","debugInfoEnabled","$animateProvider","classNameFilter","CacheFactoryProvider","screenmatchConfigProvider","rules","$ionicConfigProvider","enableJsScrolling","scrolling","jsScrolling","maxCache","IdleProvider","idle","logoutIdle","logoutTimeout","exception","cause","removeChangeStateListener","enableChangeState","checkBmaNodeAlive","messageParam","errorState","isNewer","device","hideKeyboardAccessoryBar","disableScroll","release","newRelease","registerBackButtonAction","exitApp","rtrim","arguments"],"mappings":"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","file":"../../dist_js/gchange.js","sourcesContent":["/**\n * Created by blavenie on 01/02/17.\n */\nfunction Block(json, attributes) {\n \"use strict\";\n\n var that = this;\n\n // Copy default fields\n if (!attributes || !attributes.length) {\n [\"currency\", \"issuer\", \"medianTime\", \"number\", \"version\", \"powMin\", \"dividend\", \"membersCount\", \"hash\", \"identities\", \"joiners\", \"actives\", \"leavers\", \"revoked\", \"excluded\", \"certifications\", \"transactions\"]\n .forEach(function (key) {\n that[key] = json[key];\n });\n }\n // or just given\n else {\n _.forEach(attributes, function (key) {\n that[key] = json[key];\n });\n\n }\n\n that.identitiesCount = that.identities ? that.identities.length : 0;\n that.joinersCount = that.joiners ? that.joiners.length : 0;\n that.activesCount = that.actives ? that.actives.length : 0;\n that.leaversCount = that.leavers ? that.leavers.length : 0;\n that.revokedCount = that.revoked ? that.revoked.length : 0;\n that.excludedCount = that.excluded ? that.excluded.length : 0;\n that.certificationsCount = that.certifications ? that.certifications.length : 0;\n that.transactionsCount = that.transactions ? that.transactions.length : 0;\n\n that.empty = that.isEmpty();\n}\n\nBlock.prototype.isEmpty = function(){\n \"use strict\";\n return !this.transactionsCount &&\n !this.certificationsCount &&\n !this.joinersCount &&\n !this.dividend &&\n !this.activesCount &&\n !this.identitiesCount &&\n !this.leaversCount &&\n !this.excludedCount &&\n !this.revokedCount;\n};\n\nBlock.prototype.parseData = function() {\n this.identities = this.parseArrayValues(this.identities, ['pubkey', 'signature', 'buid', 'uid']);\n this.joiners = this.parseArrayValues(this.joiners, ['pubkey', 'signature', 'mBuid', 'iBuid', 'uid']);\n this.actives = this.parseArrayValues(this.actives, ['pubkey', 'signature', 'mBuid', 'iBuid', 'uid']);\n this.leavers = this.parseArrayValues(this.leavers, ['pubkey', 'signature', 'mBuid', 'iBuid', 'uid']);\n this.revoked = this.parseArrayValues(this.revoked, ['pubkey', 'signature']);\n this.excluded = this.parseArrayValues(this.excluded, ['pubkey']);\n\n // certifications\n this.certifications = this.parseArrayValues(this.certifications, ['from', 'to', 'block', 'signature']);\n //this.certifications = _.groupBy(this.certifications, 'to');\n\n // TX\n this.transactions = this.parseTransactions(this.transactions);\n\n delete this.raw; // not need\n};\n\nBlock.prototype.cleanData = function() {\n delete this.identities;\n delete this.joiners;\n delete this.actives;\n delete this.leavers;\n delete this.revoked;\n delete this.excluded;\n delete this.certifications;\n delete this.transactions;\n\n delete this.raw; // not need\n};\n\nBlock.prototype.parseArrayValues = function(array, itemObjProperties){\n if (!array || !array.length) return [];\n return array.reduce(function(res, raw) {\n var parts = raw.split(':');\n if (parts.length != itemObjProperties.length) {\n console.debug('[block] Bad format for \\'{0}\\': [{1}]. Expected {1} parts. Skipping'.format(arrayProperty, raw, itemObjProperties.length));\n return res;\n }\n var obj = {};\n for (var i=0; i<itemObjProperties.length; i++) {\n obj[itemObjProperties[i]] = parts[i];\n }\n return res.concat(obj);\n }, []);\n};\n\nfunction exact(regexpContent) {\n return new RegExp(\"^\" + regexpContent + \"$\");\n}\n\nBlock.prototype.regexp = {\n TX_OUTPUT_SIG: exact(\"SIG\\\\(([0-9a-zA-Z]{43,44})\\\\)\")\n};\n\nBlock.prototype.parseTransactions = function(transactions) {\n if (!transactions || !transactions.length) return [];\n return transactions.reduce(function (res, tx) {\n var obj = {\n issuers: tx.issuers,\n time: tx.time\n };\n\n obj.outputs = tx.outputs.reduce(function(res, output) {\n var parts = output.split(':');\n if (parts.length != 3) {\n console.debug('[block] Bad format a \\'transactions\\': [{0}]. Expected 3 parts. Skipping'.format(output));\n return res;\n }\n\n var amount = parts[0];\n var unitbase = parts[1];\n var unlockCondition = parts[2];\n\n var matches = Block.prototype.regexp.TX_OUTPUT_SIG.exec(parts[2]);\n\n // Simple expression SIG(x)\n if (matches) {\n var pubkey = matches[1];\n if (!tx.issuers || tx.issuers.indexOf(pubkey) != -1) return res;\n return res.concat({\n amount: unitbase <= 0 ? amount : amount * Math.pow(10, unitbase),\n unitbase: unitbase,\n pubkey: pubkey\n });\n }\n\n // Parse complex unlock condition\n else {\n //console.debug('[block] [TX] Detecting unlock condition: {0}.'.format(output));\n return res.concat({\n amount: unitbase <= 0 ? amount : amount * Math.pow(10, unitbase),\n unitbase: unitbase,\n unlockCondition: unlockCondition\n });\n }\n }, []);\n\n // Special cas for TX to himself\n if (!obj.error && !obj.outputs.length) {\n obj.toHimself = true;\n }\n\n return res.concat(obj);\n }, []);\n};\n","\nAppController.$inject = ['$scope', '$rootScope', '$state', '$ionicSideMenuDelegate', '$q', '$timeout', '$ionicHistory', '$controller', '$window', 'csPlatform', 'UIUtils', 'BMA', 'csWallet', 'Device', 'Modals', 'csSettings', 'csConfig', 'csHttp'];\nPluginExtensionPointController.$inject = ['$scope', 'PluginService'];angular.module('cesium.app.controllers', ['cesium.platform', 'cesium.services'])\n\n .config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app', {\n url: \"/app\",\n abstract: true,\n templateUrl: \"templates/menu.html\",\n controller: 'AppCtrl',\n data: {\n large: false\n }\n })\n ;\n\n // if none of the above states are matched, use this as the fallback\n $urlRouterProvider.otherwise('/app/home');\n\n }])\n\n .controller('AppCtrl', AppController)\n\n .controller('PluginExtensionPointCtrl', PluginExtensionPointController)\n\n;\n\n/**\n * Useful controller that could be reuse in plugin, using $scope.extensionPoint for condition rendered in templates\n */\nfunction PluginExtensionPointController($scope, PluginService) {\n 'ngInject';\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n}\n\n/**\n * Abstract controller (inherited by other controllers)\n */\nfunction AppController($scope, $rootScope, $state, $ionicSideMenuDelegate, $q, $timeout,\n $ionicHistory, $controller, $window, csPlatform,\n UIUtils, BMA, csWallet, Device, Modals, csSettings, csConfig, csHttp\n ) {\n 'ngInject';\n\n $scope.walletData = csWallet.data;\n $scope.search = {};\n $scope.login = csWallet.isLogin();\n $scope.motion = UIUtils.motion.default;\n $scope.fullscreen = UIUtils.screen.fullscreen.isEnabled();\n\n $scope.showHome = function() {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n return $state.go('app.home')\n .then(UIUtils.loading.hide);\n };\n\n ////////////////////////////////////////\n // Show Help tour\n ////////////////////////////////////////\n\n $scope.createHelptipScope = function(isTour, ctrlName) {\n if (!isTour && ($rootScope.tour || !$rootScope.settings.helptip.enable || UIUtils.screen.isSmall())) {\n return; // avoid other helptip to be launched (e.g. csWallet)\n }\n ctrlName = ctrlName || 'HelpTipCtrl';\n // Create a new scope for the tour controller\n var helptipScope = $scope.$new();\n $controller(ctrlName, { '$scope': helptipScope});\n return helptipScope;\n };\n\n $scope.startHelpTour = function(event, skipClearCache) {\n if (event && event.defaultPrevented) return false; // Event stopped;\n\n $rootScope.tour = true; // to avoid other helptip to be launched (e.g. csWallet)\n\n // Clear cache history\n if (!skipClearCache) {\n $ionicHistory.clearHistory();\n return $ionicHistory.clearCache()\n .then(function() {\n $scope.startHelpTour(null, true/*continue*/);\n });\n }\n\n var helptipScope = $scope.createHelptipScope(true/*is tour*/);\n return helptipScope.startHelpTour()\n .then(function() {\n helptipScope.$destroy();\n delete $rootScope.tour;\n })\n .catch(function(err){\n delete $rootScope.tour;\n });\n };\n\n $scope.disableHelpTour = function(event) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (csSettings.data.helptip && csSettings.data.helptip.enable) {\n $rootScope.settings.helptip.enable = false;\n csSettings.store();\n }\n\n };\n\n ////////////////////////////////////////\n // Login & wallet\n ////////////////////////////////////////\n\n $scope.isLogin = function() {\n return $scope.login;\n };\n\n // Load wallet data (after login)\n $scope.loadWalletData = function(options) {\n\n //console.warn(\"[app-controller] DEPRECATED - Please use csWallet.load() instead of $scope.loadWalletData()\", new Error());\n\n options = options || {};\n\n return csWallet.loadData(options)\n\n .then(function(walletData) {\n // cancel login\n if (!walletData) throw 'CANCELLED';\n return walletData;\n });\n };\n\n // Login and load wallet\n $scope.loadWallet = function(options) {\n\n\n // Make sure the platform is ready\n if (!csPlatform.isStarted()) {\n return csPlatform.ready().then(function(){\n return $scope.loadWallet(options);\n });\n }\n\n options = options || {};\n\n // If need login\n if (!csWallet.isLogin()) {\n return $scope.showLoginModal(options)\n .then(function (walletData) {\n if (walletData) {\n // Force full load, even if min data asked\n // Because user can wait when just filled login (by modal)\n if (options && options.minData) options.minData = false;\n return csWallet.loadData(options);\n }\n })\n .then(function (walletData) {\n if (walletData) return walletData;\n // failed to login\n throw 'CANCELLED';\n });\n }\n else if (!csWallet.data.loaded) {\n return csWallet.loadData(options);\n }\n else {\n return $q.when(csWallet.data);\n }\n };\n\n // Login and go to a state (or wallet if not)\n $scope.loginAndGo = function(state, options) {\n $scope.closeProfilePopover();\n\n state = state || 'app.view_wallet';\n\n if (!csWallet.isLogin()) {\n\n // Make sure to protect login modal, if HTTPS enable - fix #340\n if (csConfig.httpsMode && $window.location && $window.location.protocol !== 'https:') {\n var href = $window.location.href;\n var hashIndex = href.indexOf('#');\n var rootPath = (hashIndex !== -1) ? href.substr(0, hashIndex) : href;\n rootPath = 'https' + rootPath.substr(4);\n href = rootPath + $state.href(state);\n if (csConfig.httpsModeDebug) {\n // Debug mode: just log, then continue\n console.debug('[httpsMode] --- Should redirect to: ' + href);\n }\n else {\n $window.location.href = href;\n return;\n }\n }\n\n return $scope.showLoginModal()\n .then(function(walletData){\n if (walletData) {\n return $state.go(state, options)\n .then(UIUtils.loading.hide);\n }\n });\n }\n else {\n return $state.go(state, options);\n }\n };\n\n // Show login modal\n $scope.showLoginModal = function(options) {\n options = options || {};\n options.templateUrl = options.templateUrl ||\n (csConfig.login && csConfig.login.templateUrl);\n options.controller = options.controller ||\n (csConfig.login && csConfig.login.controller);\n\n return Modals.showLogin(options)\n .then(function(formData){\n if (!formData) return;\n var rememberMeChanged = (csSettings.data.rememberMe !== formData.rememberMe);\n if (rememberMeChanged) {\n csSettings.data.rememberMe = formData.rememberMe;\n csSettings.data.useLocalStorage = csSettings.data.rememberMe ? true : csSettings.data.useLocalStorage;\n csSettings.store();\n }\n return csWallet.login(formData.username, formData.password);\n })\n .then(function(walletData){\n if (walletData) {\n $rootScope.walletData = walletData;\n }\n return walletData;\n })\n .catch(function(err) {\n if (err === \"RETRY\") {\n UIUtils.loading.hide();\n return $scope.showLoginModal(options); // loop\n }\n else {\n UIUtils.onError('ERROR.CRYPTO_UNKNOWN_ERROR')(err);\n }\n });\n };\n\n // Logout\n $scope.logout = function(options) {\n options = options || {};\n if (!options.force && $scope.profilePopover) {\n // Make the popover if really closed, to avoid UI refresh on popover buttons\n return $scope.profilePopover.hide()\n .then(function(){\n options.force = true;\n return $scope.logout(options);\n });\n }\n if (options.askConfirm) {\n return UIUtils.alert.confirm('CONFIRM.LOGOUT')\n .then(function(confirm) {\n if (confirm) {\n options.askConfirm=false;\n return $scope.logout(options);\n }\n });\n }\n\n UIUtils.loading.show();\n return csWallet.logout()\n .then(function() {\n // Close left menu if open\n if ($ionicSideMenuDelegate.isOpenLeft()) {\n $ionicSideMenuDelegate.toggleLeft();\n }\n $ionicHistory.clearHistory();\n\n return $ionicHistory.clearCache()\n .then(function() {\n return $scope.showHome();\n });\n })\n .catch(UIUtils.onError());\n };\n\n // If connected and same pubkey\n $scope.isUserPubkey = function(pubkey) {\n return csWallet.isUserPubkey(pubkey);\n };\n\n // add listener on wallet event\n csWallet.api.data.on.login($scope, function(data, deferred) {\n $scope.login = true;\n return deferred ? deferred.resolve() : $q.when();\n });\n csWallet.api.data.on.logout($scope, function() {\n $scope.login = false;\n });\n\n ////////////////////////////////////////\n // Useful modals\n ////////////////////////////////////////\n\n // Open transfer modal\n $scope.showTransferModal = function(parameters) {\n // NOT NEED\n };\n\n $scope.showAboutModal = function() {\n return Modals.showAbout();\n };\n\n $scope.showJoinModal = function() {\n $scope.closeProfilePopover();\n return Modals.showJoin();\n };\n\n $scope.showSettings = function() {\n $scope.closeProfilePopover();\n return $state.go('app.settings');\n };\n\n $scope.showHelpModal = function(parameters) {\n return Modals.showHelp(parameters);\n };\n\n ////////////////////////////////////////\n // Useful popovers\n ////////////////////////////////////////\n\n $scope.showProfilePopover = function(event) {\n return UIUtils.popover.show(event, {\n templateUrl :'templates/common/popover_profile.html',\n scope: $scope,\n afterShow: function(popover) {\n $scope.profilePopover = popover;\n $timeout(function() {\n UIUtils.ink({selector: '#profile-popover .ink, #profile-popover .ink-dark'});\n }, 100);\n }\n });\n };\n\n $scope.closeProfilePopover = function() {\n if ($scope.profilePopover && $scope.profilePopover.isShown()) {\n $timeout(function(){$scope.profilePopover.hide();});\n }\n };\n\n // Change peer info\n $scope.showPeerInfoPopover = function(event) {\n return UIUtils.popover.show(event, {\n templateUrl: 'templates/network/popover_peer_info.html',\n scope: $scope.$new(true)\n });\n };\n\n ////////////////////////////////////////\n // Link management\n ////////////////////////////////////////\n\n $rootScope.openLink = function($event, uri, options) {\n $event.stopPropagation();\n $event.preventDefault();\n\n // Read URL like '@UID' (Used by home page, in feed's author url)\n if (uri && uri.startsWith('@')) {\n var name = uri.substr(1);\n if (BMA.regexp.USER_ID.test(name)) {\n $state.go('app.user_identity_name', {name: name});\n return false;\n }\n }\n\n options = options || {};\n\n // If unable to open, just copy value\n options.onError = function() {\n return UIUtils.popover.copy($event, uri);\n };\n\n csHttp.uri.open(uri, options);\n\n return false;\n };\n\n // Publish to root scope\n //=$scope.openLink;\n\n /**\n * Parse an external URI (see g1lien), and open the expected state\n * @param uri\n * @param reject optional function, to avoid error to be displayed\n * @returns {*}\n */\n $scope.handleUri = function(uri, reject) {\n if (!uri) return $q.when(); // Skip\n\n console.info('[app] Trying to parse as uri: ', uri);\n var fromHomeState = $state.current && $state.current.name === 'app.home';\n\n // Parse the URI\n return BMA.uri.parse(uri)\n .then(function(res) {\n if (!res) throw {message: 'ERROR.UNKNOWN_URI_FORMAT'}; // Continue\n\n if (res.name) {\n return $state.go('app.user_identity_name',\n angular.merge({\n name: res.name,\n action: res.params && res.params.amount ? 'transfer' : undefined\n }, res.params),\n {reload: true});\n }\n // Default: wot lookup\n else {\n console.warn('[app] TODO implement state redirection from URI result: ', res, uri);\n return $state.go('app.user_lookup',\n {q: uri},\n {reload: true});\n }\n })\n\n // After state change\n .then(function() {\n if (fromHomeState) {\n // Wait 500ms, then remove /app/home?uri from the history\n // to make sure the back button will work fine\n return $timeout(function () {\n if ($ionicHistory.backView()) $ionicHistory.removeBackView();\n }, 500);\n }\n })\n\n .catch(function(err) {\n if (reject) {\n reject(err);\n return;\n }\n console.error(\"[home] Error while handle uri {\" + uri + \"': \", err);\n return UIUtils.onError(uri)(err);\n });\n };\n\n $scope.registerProtocolHandlers = function() {\n var protocols = ['web+gchange'];\n\n _.each(protocols, function(protocol) {\n console.debug(\"[app] Registering protocol '{0}'...\".format(protocol));\n try {\n navigator.registerProtocolHandler(protocol, \"#/app/home?uri=%s\", \"Cesium\");\n }\n catch(err) {\n console.error(\"[app] Error while registering protocol '{0}'\".format(protocol), err);\n }\n });\n };\n\n ////////////////////////////////////////\n // Layout Methods\n ////////////////////////////////////////\n $scope.showFab = function(id, timeout) {\n UIUtils.motion.toggleOn({selector: '#'+id + '.button-fab'}, timeout);\n };\n\n $scope.hideFab = function(id, timeout) {\n UIUtils.motion.toggleOff({selector: '#'+id + '.button-fab'}, timeout);\n };\n\n // Could be override by subclass\n $scope.doMotion = function(options) {\n return $scope.motion.show(options);\n };\n\n\n ////////////////////////////////////////\n // Fullscreen mode\n ////////////////////////////////////////\n\n $scope.askFullscreen = function() {\n var skip = $scope.fullscreen || !UIUtils.screen.isSmall() || !Device.isWeb();\n if (skip) return;\n\n return UIUtils.alert.confirm('CONFIRM.FULLSCREEN', undefined, {\n cancelText: 'COMMON.BTN_NO',\n okText: 'COMMON.BTN_YES'\n })\n .then(function(confirm) {\n if (!confirm) return;\n $scope.toggleFullscreen();\n });\n };\n\n $scope.toggleFullscreen = function() {\n $scope.fullscreen = !UIUtils.screen.fullscreen.isEnabled();\n UIUtils.screen.fullscreen.toggleAll();\n };\n\n // removeIf(device)\n ////////////////////////////////////////\n // NOT-Device only methods (web or desktop)\n // (code removed when build for device - eg. Android, iOS)\n ////////////////////////////////////////\n\n // Ask switching fullscreen\n $scope.askFullscreen();\n\n // Register protocol handlers\n $scope.registerProtocolHandlers();\n\n ////////////////////////////////////////\n // End of NOT-device only methods\n ////////////////////////////////////////\n // endRemoveIf(device)\n}\n","\nHomeController.$inject = ['$scope', '$state', '$timeout', '$ionicHistory', '$http', '$translate', '$q', '$location', 'UIUtils', 'csConfig', 'csCache', 'csPlatform', 'csCurrency', 'csSettings'];angular.module('cesium.home.controllers', ['cesium.platform', 'cesium.services'])\n\n .config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {\n 'ngInject';\n\n $stateProvider\n .state('app.home', {\n url: \"/home?error&uri\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/home/home.html\",\n controller: 'HomeCtrl'\n }\n }\n });\n\n // if none of the above states are matched, use this as the fallback\n $urlRouterProvider.otherwise('/app/home');\n\n }])\n\n .controller('HomeCtrl', HomeController)\n;\n\nfunction HomeController($scope, $state, $timeout, $ionicHistory, $http, $translate, $q, $location,\n UIUtils, csConfig, csCache, csPlatform, csCurrency, csSettings) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.locales = angular.copy(csSettings.locales);\n\n function getRandomImage() {\n var imageCountByKind = {\n 'service': 12,\n 'spring': 7,\n 'summer': 11,\n 'autumn': 7,\n 'winter': 5\n };\n\n var kind;\n // Or landscape\n\n if (Math.random() < 0.5) {\n kind = 'service';\n }\n else {\n var day = moment().format('D');\n var month = moment().format('M');\n if ((month < 3) || (month == 3 && day < 21) || (month == 12 && day >= 21)) {\n kind = 'winter';\n }\n else if ((month == 3 && day >= 21) || (month < 6) || (month == 6 && day < 21)) {\n kind = 'spring';\n }\n else if ((month == 6 && day >= 21) || (month < 9) || (month == 9 && day < 21)) {\n kind = 'summer';\n }\n else {\n kind = 'autumn';\n }\n }\n var imageCount = imageCountByKind[kind];\n var imageIndex = Math.floor(Math.random()*imageCount)+1;\n return './img/bg/{0}-{1}.jpg'.format(kind, imageIndex);\n }\n $scope.bgImage = getRandomImage();\n\n $scope.enter = function(e, state) {\n if (ionic.Platform.isIOS()) {\n if(window.StatusBar) {\n // needed to fix Xcode 9 / iOS 11 issue with blank space at bottom of webview\n // https://github.com/meteor/meteor/issues/9041\n StatusBar.overlaysWebView(false);\n StatusBar.overlaysWebView(true);\n }\n }\n\n if (state && state.stateParams && state.stateParams.uri) {\n\n return $scope.handleUri(state.stateParams.uri)\n .then(function() {\n $scope.loading = false;\n });\n }\n else if (state && state.stateParams && state.stateParams.error) { // Error query parameter\n $scope.error = state.stateParams.error;\n $scope.node = csCurrency.data.node;\n $scope.loading = false;\n $scope.cleanLocationHref(state);\n }\n else {\n // Wait platform to be ready\n csPlatform.ready()\n .then(function() {\n $scope.loading = false;\n $scope.loadFeeds();\n })\n .catch(function(err) {\n $scope.node = csCurrency.data.node;\n $scope.loading = false;\n $scope.error = err;\n });\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.reload = function() {\n $scope.loading = true;\n delete $scope.error;\n\n $timeout($scope.enter, 200);\n };\n\n $scope.loadFeeds = function() {\n var feedUrl = csSettings.getFeedUrl();\n if (!feedUrl || typeof feedUrl !== 'string') return; // Skip\n\n var maxContentLength = (csConfig.feed && csConfig.feed.maxContentLength) || 650;\n\n var now = Date.now();\n console.debug(\"[home] Loading feeds from {0}...\".format(feedUrl));\n\n $http.get(feedUrl, {\n timeout: csSettings.data.timeout,\n responseType: 'json',\n cache: csCache.get(null, csCache.constants.LONG)\n })\n .success(function(feed) {\n console.debug('[home] Feeds loaded in {0}ms'.format(Date.now()-now));\n if (!feed || !feed.items || !feed.items.length) return; // skip if empty\n\n feed.items = feed.items.reduce(function(res, item) {\n if (!item || (!item.title && !item.content_text && !item.content_html)) return res; // Skip\n\n // Convert UTC time\n if (item.date_published) {\n item.time = moment.utc(item.date_published).unix();\n }\n // Convert content to HTML\n if (item.content_html) {\n item.content = item.content_html;\n }\n else {\n item.content = (item.content_text||'').replace(/\\n/g, '<br/>');\n }\n\n // Trunc content, if need\n if (maxContentLength !== -1 && item.content && item.content.length > maxContentLength) {\n var endIndex = Math.max(item.content.lastIndexOf(\" \", maxContentLength), item.content.lastIndexOf(\"<\", maxContentLength));\n item.content = item.content.substr(0, endIndex) + ' (...)';\n item.truncated = true;\n }\n\n // If author is missing, copy the main author\n item.author = item.author || feed.author;\n\n return res.concat(item);\n }, []);\n\n $scope.feed = feed;\n })\n .error(function(data, status) {\n console.error('[home] Failed to load feeds.');\n $scope.feed = null;\n });\n };\n\n /**\n * Catch click for quick fix\n * @param action\n */\n $scope.doQuickFix = function(action) {\n if (action === 'settings') {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go('app.settings');\n }\n };\n\n $scope.changeLanguage = function(langKey) {\n $translate.use(langKey);\n $scope.hideLocalesPopover();\n csSettings.data.locale = _.findWhere($scope.locales, {id: langKey});\n csSettings.store();\n $scope.loadFeeds();\n };\n\n /* -- show/hide locales popup -- */\n\n $scope.showLocalesPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/common/popover_locales.html',\n scope: $scope,\n afterShow: function(popover) {\n $scope.localesPopover = popover;\n }\n });\n };\n\n $scope.hideLocalesPopover = function() {\n if ($scope.localesPopover) {\n $scope.localesPopover.hide();\n $scope.localesPopover = null;\n }\n };\n\n // remove '?uri&error' from the location URI, and inside history\n $scope.cleanLocationHref = function(state) {\n if (state && state.stateParams) {\n var stateParams = angular.copy(state.stateParams);\n delete stateParams.uri;\n delete stateParams.error;\n\n $location.search(stateParams).replace();\n\n // Update location href\n $ionicHistory.nextViewOptions({\n disableAnimate: true,\n disableBack: false,\n historyRoot: false\n });\n return $state.go(state.stateName, stateParams, {\n reload: false,\n inherit: true,\n notify: false\n });\n }\n };\n\n // For DEV ONLY\n /*$timeout(function() {\n $scope.loginAndGo();\n }, 500);*/\n}\n","\nJoinController.$inject = ['$timeout', 'Modals'];\nJoinModalController.$inject = ['$scope', '$state', 'UIUtils', 'CryptoUtils', 'csSettings', 'Modals', 'csWallet', 'mkWallet', 'BMA'];\nangular.module('cesium.join.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n .state('app.join', {\n url: \"/join\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/home/home.html\",\n controller: 'JoinCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('JoinCtrl', JoinController)\n\n .controller('JoinModalCtrl', JoinModalController)\n\n;\n\n\n\nfunction JoinController($timeout, Modals) {\n 'ngInject';\n\n // Open join modal\n $timeout(function() {\n Modals.showJoin();\n }, 100);\n\n}\n\n\nfunction JoinModalController($scope, $state, UIUtils, CryptoUtils, csSettings, Modals, csWallet, mkWallet, BMA) {\n 'ngInject';\n\n $scope.formData = {\n pseudo: ''\n };\n $scope.slides = {\n slider: null,\n options: {\n loop: false,\n effect: 'slide',\n speed: 500\n }\n };\n $scope.isLastSlide = false;\n $scope.search = {\n looking: true\n };\n $scope.showUsername = false;\n $scope.showPassword = false;\n $scope.smallscreen = UIUtils.screen.isSmall();\n $scope.userIdPattern = BMA.constants.regex.USER_ID;\n\n $scope.slidePrev = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slidePrev();\n $scope.slides.slider.lockSwipes();\n $scope.isLastSlide = false;\n };\n\n $scope.slideNext = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slideNext();\n $scope.slides.slider.lockSwipes();\n $scope.isLastSlide = $scope.slides.slider.activeIndex === 4;\n };\n\n\n $scope.showAccountPubkey = function() {\n $scope.formData.computing=true;\n CryptoUtils.scryptKeypair($scope.formData.username, $scope.formData.password)\n .then(function(keypair) {\n $scope.formData.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n $scope.formData.computing=false;\n })\n .catch(function(err) {\n $scope.formData.computing=false;\n console.error('>>>>>>>' , err);\n UIUtils.alert.error('ERROR.CRYPTO_UNKNOWN_ERROR');\n });\n };\n\n $scope.formDataChanged = function() {\n $scope.formData.computing=false;\n $scope.formData.pubkey=null;\n };\n\n $scope.doNext = function(formName) {\n console.debug(\"[join] form \" + formName + \" OK. index=\" + $scope.slides.slider.activeIndex);\n if (!formName) {\n formName = ($scope.slides.slider.activeIndex === 1 ? 'passwordForm' : ($scope.slides.slider.activeIndex === 2 ? 'pseudoForm' : formName));\n }\n if (formName) {\n $scope[formName].$submitted=true;\n if(!$scope[formName].$valid) {\n return;\n }\n if (formName === 'passwordForm') {\n $scope.slideNext();\n $scope.showAccountPubkey();\n }\n else {\n $scope.slideNext();\n if (formName === 'pseudoForm') {\n $scope.showAccountPubkey();\n }\n }\n }\n };\n\n $scope.doNewAccount = function(confirm) {\n\n if (!confirm) {\n return UIUtils.alert.confirm('ACCOUNT.NEW.CONFIRMATION_WALLET_ACCOUNT')\n .then(function(confirm) {\n if (confirm) {\n $scope.doNewAccount(true);\n }\n });\n }\n\n UIUtils.loading.show();\n\n csWallet.login($scope.formData.username, $scope.formData.password)\n .then(function(data) {\n $scope.closeModal();\n csSettings.data.wallet = csSettings.data.wallet || {};\n csSettings.data.wallet.alertIfUnusedWallet = false; // do not alert if empty\n // Fill a default profile\n mkWallet.setDefaultProfile({\n title: $scope.formData.pseudo\n });\n // Redirect to wallet\n $state.go('app.view_wallet');\n })\n .catch(function(err) {\n UIUtils.loading.hide();\n console.error('>>>>>>>' , err);\n UIUtils.alert.error('ERROR.CRYPTO_UNKNOWN_ERROR');\n });\n };\n\n $scope.showHelpModal = function(helpAnchor) {\n if (!helpAnchor) {\n helpAnchor = $scope.slides.slider.activeIndex == 1 ?\n 'join-salt' : ( $scope.slides.slider.activeIndex == 2 ?\n 'join-password' : 'join-pseudo');\n }\n Modals.showHelp({anchor: helpAnchor});\n };\n\n // TODO: remove auto add account when done\n /*$timeout(function() {\n $scope.formData.username=\"azertypoi\";\n $scope.formData.confirmUsername=$scope.formData.username;\n $scope.formData.password=\"azertypoi\";\n $scope.formData.confirmPassword=$scope.formData.password;\n $scope.formData.pseudo=\"azertypoi\";\n $scope.doNext();\n $scope.doNext();\n //$scope.form = {$valid:true};\n }, 2000);*/\n}\n","\nLoginModalController.$inject = ['$scope', '$timeout', 'CryptoUtils', 'UIUtils', 'Modals', 'csSettings', 'Device'];\nangular.module('cesium.login.controllers', ['cesium.services'])\n\n .controller('LoginModalCtrl', LoginModalController)\n;\n\nfunction LoginModalController($scope, $timeout, CryptoUtils, UIUtils, Modals, csSettings, Device) {\n 'ngInject';\n\n $scope.computing = false;\n $scope.pubkey = null;\n $scope.formData = {\n rememberMe: csSettings.data.rememberMe\n };\n $scope.showSalt = csSettings.data.showLoginSalt;\n $scope.showPubkeyButton = false;\n $scope.autoComputePubkey = false;\n\n Device.ready().then(function() {\n $scope.autoComputePubkey = ionic.Platform.grade.toLowerCase()==='a' &&\n !UIUtils.screen.isSmall();\n });\n\n // Login form submit\n $scope.doLogin = function() {\n if(!$scope.form.$valid) {\n return;\n }\n UIUtils.loading.show();\n\n $scope.closeModal($scope.formData);\n };\n\n $scope.formDataChanged = function() {\n $scope.computing=false;\n $scope.pubkey = null;\n if ($scope.autoComputePubkey && $scope.formData.username && $scope.formData.password) {\n $scope.showPubkey();\n }\n else {\n $scope.showPubkeyButton = $scope.formData.username && $scope.formData.password;\n }\n };\n $scope.$watch('formData.username', $scope.formDataChanged, true);\n $scope.$watch('formData.password', $scope.formDataChanged, true);\n\n $scope.showPubkey = function() {\n $scope.computing=true;\n $scope.showPubkeyButton = false;\n $scope.pubkey = '';\n $timeout(function() {\n var salt = $scope.formData.username;\n var pwd = $scope.formData.password;\n CryptoUtils.scryptKeypair(salt, pwd).then(\n function (keypair) {\n // form has changed: retry\n if (salt !== $scope.formData.username || pwd !== $scope.formData.password) {\n $scope.showPubkey();\n }\n else {\n $scope.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n $scope.computing = false;\n }\n }\n )\n .catch(function (err) {\n $scope.pubkey = '';\n $scope.computing = false;\n UIUtils.loading.hide();\n console.error('>>>>>>>', err);\n UIUtils.alert.error('ERROR.CRYPTO_UNKNOWN_ERROR');\n });\n }, 500);\n };\n\n $scope.showJoinModal = function() {\n $scope.closeModal();\n $timeout(function() {\n Modals.showJoin();\n }, 300);\n };\n\n $scope.showAccountSecurityModal = function() {\n $scope.closeModal();\n $timeout(function() {\n Modals.showAccountSecurity();\n }, 300);\n };\n\n\n /*\n // TODO : for DEV only\n $timeout(function() {\n $scope.formData = {\n username: 'abc',\n password: 'def',\n };\n //$scope.form = {$valid:true};\n }, 900);*/\n}\n\n","\nHelpController.$inject = ['$scope', '$state', '$timeout', '$anchorScroll', 'csSettings'];\nHelpModalController.$inject = ['$scope', '$timeout', '$anchorScroll', 'csSettings', 'parameters'];\nHelpTipController.$inject = ['$scope', '$rootScope', '$state', '$window', '$ionicSideMenuDelegate', '$timeout', '$q', '$anchorScroll', 'UIUtils', 'csConfig', 'csSettings', 'csCurrency', 'Device', 'csWallet'];\nHelpTourController.$inject = ['$scope'];\nangular.module('cesium.help.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n\n .state('app.help_tour', {\n url: \"/tour\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/home/home.html\",\n controller: 'HelpTourCtrl'\n }\n }\n })\n\n .state('app.help', {\n url: \"/help?anchor\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/help/view_help.html\",\n controller: 'HelpCtrl'\n }\n }\n })\n\n .state('app.help_anchor', {\n url: \"/help/:anchor\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/help/view_help.html\",\n controller: 'HelpCtrl'\n }\n }\n })\n\n ;\n\n\n }])\n\n .controller('HelpCtrl', HelpController)\n\n .controller('HelpModalCtrl', HelpModalController)\n\n .controller('HelpTipCtrl', HelpTipController)\n\n .controller('HelpTourCtrl', HelpTourController)\n\n\n;\n\n\nfunction HelpController($scope, $state, $timeout, $anchorScroll, csSettings) {\n 'ngInject';\n\n $scope.$on('$ionicView.enter', function(e) {\n $scope.locale = csSettings.data.locale.id;\n if ($state.stateParams && $state.stateParams.anchor) {\n $timeout(function () {\n $anchorScroll($state.stateParams.anchor);\n }, 100);\n }\n });\n}\n\nfunction HelpModalController($scope, $timeout, $anchorScroll, csSettings, parameters) {\n 'ngInject';\n\n $scope.locale = csSettings.data.locale.id;\n\n if (parameters && parameters.anchor) {\n $timeout(function() {\n $anchorScroll(parameters.anchor);\n }, 100);\n }\n}\n\n\n/* ----------------------------\n* Help Tip\n* ---------------------------- */\nfunction HelpTipController($scope, $rootScope, $state, $window, $ionicSideMenuDelegate, $timeout, $q, $anchorScroll,\n UIUtils, csConfig, csSettings, csCurrency, Device, csWallet) {\n\n $scope.tour = false; // Is a tour or a helptip ?\n $scope.continue = true;\n\n $scope.executeStep = function(partName, steps, index) {\n index = angular.isDefined(index) ? index : 0;\n\n if (index >= steps.length) {\n return $q.when(true); // end\n }\n\n var step = steps[index];\n if (typeof step !== 'function') {\n throw new Error('[helptip] Invalid step at index {0} of \\'{1}\\' tour: step must be a function'.format(index, partName));\n }\n var promise = step();\n if (typeof promise === 'boolean') {\n promise = $q.when(promise);\n }\n return promise\n .then(function(next) {\n if (angular.isUndefined(next)) {\n $scope.continue = false;\n return index; // keep same index (no button press: popover just closed)\n }\n if (!next || index === steps.length - 1) {\n return next ? -1 : index+1; // last step OK, so mark has finished\n }\n return $scope.executeStep(partName, steps, index+1);\n })\n .catch(function(err) {\n if (err && err.message == 'transition prevented') {\n console.error('ERROR: in help tour [{0}], in step [{1}] -> use large if exists, to prevent [transition prevented] error'.format(partName, index));\n }\n else {\n console.error('ERROR: in help tour [{0}], in step [{1}] : {2}'.format(partName, index, err));\n }\n $scope.continue = false;\n return index;\n });\n };\n\n $scope.showHelpTip = function(id, options) {\n options = options || {};\n options.bindings = options.bindings || {};\n options.bindings.value =options.bindings.value || '';\n options.bindings.hasNext = angular.isDefined(options.bindings.hasNext) ? options.bindings.hasNext : true;\n options.timeout = options.timeout || (Device.enable ? 900 : 500);\n options.autoremove = true; // avoid memory leak\n options.bindings.tour = $scope.tour;\n options.backdropClickToClose = !$scope.tour;\n return UIUtils.popover.helptip(id, options);\n };\n\n $scope.showHelpModal = function(helpAnchor) {\n Modals.showHelp({anchor: helpAnchor});\n };\n\n $scope.startHelpTour = function() {\n $scope.tour = true;\n $scope.continue = true;\n\n // Currency tour\n return $scope.startCurrencyTour(0, true)\n .then(function(endIndex){\n if (!endIndex || $scope.cancelled) return false;\n csSettings.data.helptip.currency=endIndex;\n csSettings.store();\n return $scope.continue;\n })\n\n // Network tour\n .then(function(next){\n if (!next) return false;\n return $scope.startNetworkTour(0, true)\n .then(function(endIndex){\n if (!endIndex || $scope.cancelled) return false;\n csSettings.data.helptip.network=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Wot tour\n .then(function(next){\n if (!next) return false;\n return $scope.startWotTour(0, true)\n .then(function(endIndex){\n if (!endIndex || $scope.cancelled) return false;\n csSettings.data.helptip.wot=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Identity certifications tour\n .then(function(next){\n if (!next) return false;\n return $scope.startWotCertTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.wotCerts=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Wallet tour (if NOT login)\n .then(function(next){\n if (!next) return false;\n return $scope.startWalletNoLoginTour(0, true);\n })\n\n // Wallet tour (if login)\n .then(function(next){\n if (!next) return false;\n if (!csWallet.isLogin()) return true; // not login: continue\n return $scope.startWalletTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.wallet=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Wallet certifications tour\n .then(function(next){\n if (!next) return false;\n if (!csWallet.isLogin()) return true; // not login: continue\n return $scope.startWalletCertTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.walletCerts=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // TX tour (if login)\n .then(function(next){\n if (!next) return false;\n if (!csWallet.isLogin()) return true; // not login: continue\n return $scope.startTxTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.tx=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Header tour\n .then(function(next){\n if (!next) return false;\n return $scope.startHeaderTour(0, true);\n })\n\n // Settings tour\n .then(function(next){\n if (!next) return false;\n return $scope.startSettingsTour(0, true);\n })\n\n // Finish tour\n .then(function(next){\n if (!next) return false;\n return $scope.finishTour();\n });\n };\n\n /**\n * Features tour on currency\n * @returns {*}\n */\n $scope.startCurrencyTour = function(startIndex, hasNext) {\n\n var showWotTabIfNeed = function() {\n if ($state.is('app.currency.tab_parameters')) {\n $state.go('app.currency.tab_wot');\n }\n };\n\n var contentParams;\n\n var steps = [\n\n function(){\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-currency', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_CURRENCY',\n icon: {\n position: 'left'\n }\n }\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n return $state.go(UIUtils.screen.isSmall() ? 'app.currency' : 'app.currency_view_lg')\n .then(function () {\n return $scope.showHelpTip('helptip-currency-mass-member', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_MASS',\n icon: {\n position: 'center'\n }\n }\n });\n });\n },\n\n function () {\n if (!csSettings.data.useRelative) return true; //skip but continue\n return $scope.showHelpTip('helptip-currency-mass-member-unit', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_UNIT_RELATIVE',\n contentParams: contentParams,\n icon: {\n position: UIUtils.screen.isSmall() ? 'right' : 'center'\n }\n }\n });\n },\n\n function () {\n if (!csSettings.data.useRelative) return true; //skip but continue\n return $scope.showHelpTip('helptip-currency-change-unit', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_CHANGE_UNIT',\n contentParams: contentParams,\n icon: {\n position: UIUtils.screen.isSmall() ? 'right' : 'center'\n }\n }\n });\n },\n\n function () {\n if (csSettings.data.useRelative) return true; //skip but continue\n return $scope.showHelpTip('helptip-currency-change-unit', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_CHANGE_UNIT_TO_RELATIVE',\n contentParams: contentParams,\n icon: {\n position: UIUtils.screen.isSmall() ? 'right' : 'center'\n }\n }\n });\n },\n\n function () {\n if (UIUtils.screen.isSmall()) {\n $anchorScroll('helptip-currency-rules-anchor');\n }\n return $scope.showHelpTip('helptip-currency-rules', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_RULES',\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n }\n });\n },\n\n function () {\n showWotTabIfNeed();\n return $scope.showHelpTip('helptip-currency-newcomers', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_WOT',\n icon: {\n position: 'center'\n }\n },\n timeout: 1200 // need for Firefox\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.default().then(function(currency) {\n contentParams = currency.parameters;\n // Launch steps\n return $scope.executeStep('currency', steps, startIndex);\n });\n };\n\n /**\n * Features tour on network\n * @returns {*}\n */\n $scope.startNetworkTour = function(startIndex, hasNext) {\n\n var showNetworkTabIfNeed = function() {\n if ($state.is('app.currency')) {\n // Select the second tabs\n $timeout(function () {\n var tabs = $window.document.querySelectorAll('ion-tabs .tabs a');\n if (tabs && tabs.length == 3) {\n angular.element(tabs[2]).triggerHandler('click');\n }\n }, 100);\n }\n };\n\n var contentParams;\n\n var steps = [\n\n function(){\n if (UIUtils.screen.isSmall()) return true; // skip but continue\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-network', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_NETWORK',\n icon: {\n position: 'left'\n }\n }\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n return $state.go(UIUtils.screen.isSmall() ? 'app.currency.tab_network' : 'app.network')\n .then(function () {\n showNetworkTabIfNeed();\n return $scope.showHelpTip('helptip-network-peers', {\n bindings: {\n content: 'HELP.TIP.NETWORK_BLOCKCHAIN',\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n },\n timeout: 1200 // need for Firefox\n });\n });\n },\n\n function() {\n showNetworkTabIfNeed();\n return $scope.showHelpTip('helptip-network-peer-0', {\n bindings: {\n content: 'HELP.TIP.NETWORK_PEERS',\n icon: {\n position: UIUtils.screen.isSmall() ? undefined : 'center'\n }\n },\n timeout: 1000,\n retry: 20\n });\n },\n\n\n function() {\n showNetworkTabIfNeed();\n return $scope.showHelpTip('helptip-network-peer-0-block', {\n bindings: {\n content: 'HELP.TIP.NETWORK_PEERS_BLOCK_NUMBER',\n icon: {\n position: UIUtils.screen.isSmall() ? undefined : 'center'\n }\n }\n });\n },\n\n function() {\n showNetworkTabIfNeed();\n var locale = csSettings.data.locale.id;\n return $scope.showHelpTip('helptip-network-peers', {\n bindings: {\n content: 'HELP.TIP.NETWORK_PEERS_PARTICIPATE',\n contentParams: {\n installDocUrl: (csConfig.helptip && csConfig.helptip.installDocUrl) ?\n (csConfig.helptip.installDocUrl[locale] ? csConfig.helptip.installDocUrl[locale] : csConfig.helptip.installDocUrl) :\n 'http://duniter.org'\n },\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.default().then(function(currency) {\n contentParams = currency.parameters;\n // Launch steps\n return $scope.executeStep('network', steps, startIndex);\n });\n };\n\n /**\n * Features tour on WOT registry\n * @returns {*}\n */\n $scope.startWotTour = function(startIndex, hasNext) {\n\n var contentParams;\n\n var steps = [\n function() {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-wot', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_WOT',\n icon: {\n position: 'left'\n }\n },\n onError: 'continue'\n });\n },\n\n function() {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n return $state.go('app.user_lookup')\n .then(function(){\n return $scope.showHelpTip('helptip-wot-search-text', {\n bindings: {\n content: UIUtils.screen.isSmall() ? 'HELP.TIP.WOT_SEARCH_TEXT_XS' : 'HELP.TIP.WOT_SEARCH_TEXT',\n icon: {\n position: 'center'\n }\n }\n });\n });\n },\n\n function() {\n return $scope.showHelpTip('helptip-wot-search-result-0', {\n bindings: {\n content: 'HELP.TIP.WOT_SEARCH_RESULT',\n icon: {\n position: 'center'\n }\n },\n timeout: 700,\n retry: 15\n });\n },\n\n function() {\n var element = $window.document.getElementById('helptip-wot-search-result-0');\n if (!element) return true;\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n });\n return $scope.showHelpTip('helptip-wot-view-certifications', {\n bindings: {\n content: 'HELP.TIP.WOT_VIEW_CERTIFICATIONS'\n },\n timeout: 2500\n });\n },\n\n function() {\n return $scope.showHelpTip('helptip-wot-view-certifications', {\n bindings: {\n content: 'HELP.TIP.WOT_VIEW_CERTIFICATIONS_COUNT',\n contentParams: contentParams,\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n }\n });\n },\n\n function() {\n return $scope.showHelpTip('helptip-wot-view-certifications-count', {\n bindings: {\n content: 'HELP.TIP.WOT_VIEW_CERTIFICATIONS_CLICK',\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.default().then(function(currency) {\n contentParams = currency.parameters;\n contentParams.currentUD = $rootScope.walletData.currentUD;\n // Launch steps\n return $scope.executeStep('wot', steps, startIndex);\n });\n };\n\n /**\n * Features tour on wot certifications\n * @returns {*}\n */\n $scope.startWotCertTour = function(startIndex, hasNext) {\n var steps = [\n\n function() {\n // If on identity: click on certifications\n if ($state.is('app.user_identity')) {\n var element = $window.document.getElementById('helptip-wot-view-certifications');\n if (!element) return true;\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n });\n }\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'fab-certify': 'helptip-certs-certify', {\n bindings: {\n content: 'HELP.TIP.WOT_VIEW_CERTIFY',\n icon: {\n position: UIUtils.screen.isSmall() ? 'bottom-right' : 'center'\n }\n },\n timeout: UIUtils.screen.isSmall() ? 2000 : 1000,\n retry: 10\n });\n },\n\n function() {\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'fab-certify': 'helptip-certs-certify', {\n bindings: {\n content: 'HELP.TIP.CERTIFY_RULES',\n icon: {\n position: 'center',\n glyph: 'ion-alert-circled'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n return $scope.executeStep('certs', steps, startIndex);\n };\n\n /**\n * Features tour on wallet (if not login)\n * @returns {*}\n */\n $scope.startWalletNoLoginTour = function(startIndex, hasNext) {\n if (csWallet.isLogin()) return $q.when(true); // skip if login\n\n var steps = [\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-account', {\n bindings: {\n content: $rootScope.walletData.isMember ? 'HELP.TIP.MENU_BTN_ACCOUNT_MEMBER' : 'HELP.TIP.MENU_BTN_ACCOUNT',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n return $scope.executeStep('wallet-no-login', steps, startIndex);\n };\n\n /**\n * Features tour on wallet screens\n * @returns {*}\n */\n $scope.startWalletTour = function(startIndex, hasNext) {\n if (!csWallet.isLogin()) return $q.when(true); // skip if not login\n\n var contentParams;\n\n var steps = [\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-account', {\n bindings: {\n content: $rootScope.walletData.isMember ? 'HELP.TIP.MENU_BTN_ACCOUNT_MEMBER' : 'HELP.TIP.MENU_BTN_ACCOUNT',\n icon: {\n position: 'left'\n }\n }\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n\n // Go to wallet\n return $state.go('app.view_wallet')\n .then(function () {\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'helptip-wallet-options-xs' : 'helptip-wallet-options', {\n bindings: {\n content: 'HELP.TIP.WALLET_OPTIONS',\n icon: {\n position: UIUtils.screen.isSmall() ? 'right' : 'center'\n }\n }\n });\n });\n },\n\n // Wallet pubkey\n function () {\n $anchorScroll('helptip-wallet-pubkey');\n return $scope.showHelpTip('helptip-wallet-pubkey', {\n bindings: {\n content: 'HELP.TIP.WALLET_PUBKEY',\n icon: {\n position: 'bottom-center'\n }\n },\n timeout: UIUtils.screen.isSmall() ? 2000 : 500,\n retry: 10\n });\n },\n\n function () {\n $anchorScroll('helptip-wallet-certifications');\n return $scope.showHelpTip('helptip-wallet-certifications', {\n bindings: {\n content: UIUtils.screen.isSmall() ? 'HELP.TIP.WALLET_RECEIVED_CERTIFICATIONS': 'HELP.TIP.WALLET_CERTIFICATIONS',\n icon: {\n position: 'center'\n }\n },\n timeout: 500,\n onError: 'continue',\n hasNext: hasNext\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.default()\n .then(function(currency) {\n contentParams = currency.parameters;\n contentParams.currentUD = $rootScope.walletData.currentUD;\n // Launch steps\n return $scope.executeStep('wallet', steps, startIndex);\n });\n };\n\n /**\n * Features tour on wallet certifications\n * @returns {*}\n */\n $scope.startWalletCertTour = function(startIndex, hasNext) {\n if (!csWallet.isLogin()) return $q.when(true);\n\n var contentParams;\n var skipAll = false;\n\n var steps = [\n\n function() {\n // If on wallet : click on certifications\n if ($state.is('app.view_wallet')) {\n var element = $window.document.getElementById('helptip-wallet-certifications');\n if (!element) {\n skipAll = true;\n return true;\n }\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n });\n }\n if (!UIUtils.screen.isSmall()) return true; // skip this helptip if not in tabs mode\n return $scope.showHelpTip('helptip-received-certs', {\n bindings: {\n content: 'HELP.TIP.WALLET_RECEIVED_CERTS'\n }\n });\n },\n\n function() {\n if (skipAll || !UIUtils.screen.isSmall()) return true;\n return $state.go('app.view_wallet') // go back to wallet (small device only)\n .then(function() {\n return $scope.showHelpTip('helptip-wallet-given-certifications', {\n bindings: {\n content: 'HELP.TIP.WALLET_GIVEN_CERTIFICATIONS',\n icon: {\n position: 'center'\n }\n },\n timeout: 500\n });\n });\n },\n\n function() {\n if (skipAll) return true;\n\n // Click on given cert link (small device only)\n if ($state.is('app.view_wallet')) {\n var element = $window.document.getElementById('helptip-wallet-given-certifications');\n if (!element) {\n skipAll = true;\n return true;\n }\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n }, 500);\n }\n return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'fab-select-certify': 'helptip-certs-select-certify', {\n bindings: {\n content: 'HELP.TIP.WALLET_CERTIFY',\n icon: {\n position: UIUtils.screen.isSmall() ? 'bottom-right' : 'center'\n }\n },\n timeout: UIUtils.screen.isSmall() ? 2000 : 500,\n retry: 10\n });\n },\n\n function() {\n if ($scope.tour || skipAll) return hasNext; // skip Rules if features tour (already display)\n return $scope.showHelpTip('helptip-certs-stock', {\n bindings: {\n content: 'HELP.TIP.CERTIFY_RULES',\n icon: {\n position: 'center',\n glyph: 'ion-alert-circled'\n },\n hasNext: hasNext\n }\n });\n }\n\n /* FIXME : how to select the left tab ?\n ,function() {\n return $scope.showHelpTip('helptip-certs-stock', {\n bindings: {\n content: 'HELP.TIP.WALLET_CERT_STOCK',\n contentParams: contentParams,\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n }\n });\n }*/\n ];\n\n return csCurrency.default().then(function(currency) {\n contentParams = currency.parameters;\n return $scope.executeStep('certs', steps, startIndex);\n });\n };\n\n /**\n * Features tour on TX screen\n * @returns {*}\n */\n $scope.startTxTour = function(startIndex, hasNext) {\n if (!csWallet.isLogin()) return $q.when(true); // skip if not login\n\n var contentParams;\n\n var steps = [\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-tx', {\n bindings: {\n content: $rootScope.walletData.isMember ? 'HELP.TIP.MENU_BTN_TX_MEMBER' : 'HELP.TIP.MENU_BTN_TX',\n icon: {\n position: 'left'\n }\n }\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n\n // Go to wallet\n return $state.go('app.view_wallet_tx')\n .then(function () {\n return $scope.showHelpTip('helptip-wallet-balance', {\n bindings: {\n content: csSettings.data.useRelative ? 'HELP.TIP.WALLET_BALANCE_RELATIVE' : 'HELP.TIP.WALLET_BALANCE',\n contentParams: contentParams,\n icon: {\n position: 'center'\n }\n },\n retry: 20 // 10 * 500 = 5s max\n });\n });\n },\n\n function () {\n return $scope.showHelpTip('helptip-wallet-balance', {\n bindings: {\n content: 'HELP.TIP.WALLET_BALANCE_CHANGE_UNIT',\n contentParams: contentParams,\n icon: {\n position: 'center',\n glyph: 'ion-information-circled'\n }\n }\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.default()\n .then(function(currency) {\n contentParams = currency.parameters;\n contentParams.currentUD = $rootScope.walletData.currentUD;\n // Launch steps\n return $scope.executeStep('tx', steps, startIndex);\n });\n };\n\n /**\n * header tour\n * @returns {*}\n */\n $scope.startHeaderTour = function(startIndex, hasNext) {\n if (UIUtils.screen.isSmall()) return $q.when(true);\n\n function _getProfilBtnElement() {\n var elements = $window.document.querySelectorAll('#helptip-header-bar-btn-profile');\n if (!elements || !elements.length) return null;\n return _.find(elements, function(el) {return el.offsetWidth > 0;});\n }\n\n var steps = [\n function () {\n\n if (UIUtils.screen.isSmall()) return true; // skip for small screen\n var element = _getProfilBtnElement();\n if (!element) return true;\n return $scope.showHelpTip(element, {\n bindings: {\n content: 'HELP.TIP.HEADER_BAR_BTN_PROFILE',\n icon: {\n position: 'right'\n }\n }\n });\n },\n\n function () {\n // small screens\n if (UIUtils.screen.isSmall()) {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-settings', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_SETTINGS',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n },\n timeout: 1000\n });\n }\n // wide screens\n else {\n var element = _getProfilBtnElement();\n if (!element) return true;\n $timeout(function() {\n angular.element(element).triggerHandler('click');\n });\n return $scope.showHelpTip('helptip-popover-profile-btn-settings', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_SETTINGS',\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n },\n timeout: 1000\n })\n .then(function(res) {\n // close profile popover\n $scope.closeProfilePopover();\n return res;\n });\n }\n }\n ];\n\n return $scope.executeStep('header', steps, startIndex);\n };\n\n /**\n * Settings tour\n * @returns {*}\n */\n $scope.startSettingsTour = function(startIndex, hasNext) {\n var contentParams;\n var steps = [\n\n function () {\n if (!UIUtils.screen.isSmall()) return true;\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-settings', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_SETTINGS',\n icon: {\n position: 'left'\n }\n },\n timeout: 1000\n });\n },\n\n function () {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n\n // Go to settings\n return $state.go('app.settings')\n .then(function () {\n return $scope.showHelpTip('helptip-settings-btn-unit-relative', {\n bindings: {\n content: 'HELP.TIP.SETTINGS_CHANGE_UNIT',\n contentParams: contentParams,\n icon: {\n position: 'right',\n style: 'margin-right: 60px'\n },\n hasNext: hasNext\n },\n timeout: 1000\n });\n });\n }\n ];\n\n return csCurrency.default()\n .then(function(currency) {\n contentParams = currency.parameters;\n return $scope.executeStep('settings', steps, startIndex);\n });\n };\n\n\n /**\n * Finish the features tour (last step)\n * @returns {*}\n */\n $scope.finishTour = function() {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n\n // If login: redirect to wallet\n if (csWallet.isLogin()) {\n return $state.go('app.view_wallet')\n .then(function(){\n return $scope.showHelpTip('helptip-wallet-certifications', {\n bindings: {\n content: 'HELP.TIP.END_LOGIN',\n hasNext: false\n }\n });\n });\n }\n\n // If not login: redirect to home\n else {\n var contentParams;\n return $q.all([\n $scope.showHome(),\n\n csCurrency.default()\n .then(function(parameters) {\n contentParams = parameters;\n })\n ])\n .then(function(){\n return $scope.showHelpTip('helptip-home-logo', {\n bindings: {\n content: 'HELP.TIP.END_NOT_LOGIN',\n contentParams: contentParams,\n hasNext: false\n }\n });\n });\n }\n };\n}\n\n/* ----------------------------\n * Help tour (auto start from home page)\n * ---------------------------- */\nfunction HelpTourController($scope) {\n\n $scope.$on('$ionicView.enter', function(e, state) {\n $scope.startHelpTour();\n });\n\n}\n","\nWalletController.$inject = ['$scope', '$q', '$ionicPopup', '$timeout', '$state', 'UIUtils', 'csWallet', '$ionicPopover', 'Modals', 'csSettings', 'esHttp'];angular.module('cesium.wallet.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n $stateProvider\n\n\n .state('app.view_wallet', {\n url: \"/wallet\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wallet/view_wallet.html\",\n controller: 'WalletCtrl'\n }\n }\n })\n ;\n }])\n\n\n .controller('WalletCtrl', WalletController)\n\n;\n\nfunction WalletController($scope, $q, $ionicPopup, $timeout, $state,\n UIUtils, csWallet, $ionicPopover, Modals, csSettings,\n esHttp) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.settings = csSettings.data;\n $scope.qrcodeId = 'qrcode-wallet-' + $scope.$id;\n $scope.toggleQRCode = false;\n $scope.likeData = {\n views: {},\n likes: {},\n follows: {},\n abuses: {},\n stars: {}\n };\n\n $scope.enter = function(e, state) {\n $scope.loading = $scope.loading || (state.stateParams && state.stateParams.refresh);\n\n if ($scope.loading) { // load once\n\n // Remove consumed query params\n $scope.cleanLocationHref(state);\n\n return $scope.load();\n }\n else {\n // update view (to refresh avatar + plugin data, such as profile, subscriptions...)\n UIUtils.loading.hide(10);\n $timeout($scope.updateView, 300);\n }\n $scope.$broadcast('$recordView.enter', state);\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function() {\n return $scope.loadWallet()\n .then(function(walletData) {\n $scope.formData = walletData;\n $scope.loading=false; // very important, to avoid TX to be display before wallet.currentUd is loaded\n $scope.updateView();\n $scope.addListeners();\n\n //$scope.showQRCode();\n UIUtils.loading.hide(10); // loading could have be open (e.g. new account)\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n $scope.showHome();\n return;\n }\n UIUtils.onError('ERROR.LOAD_WALLET_DATA_ERROR')(err);\n });\n };\n\n $scope.updateView = function() {\n $scope.motion.show({selector: '#wallet .item'});\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n };\n\n\n $scope.setRegisterForm = function(registerForm) {\n $scope.registerForm = registerForm;\n };\n\n // Clean controller data when logout\n $scope.onWalletLogout = function() {\n // clean QRcode\n $scope.hideQRCode();\n $scope.removeListeners();\n delete $scope.formData;\n $scope.loading = true;\n };\n\n $scope.addListeners = function() {\n $scope.listeners = [\n // Reset the view on logout\n csWallet.api.data.on.logout($scope, $scope.onWalletLogout),\n\n // Listen new events (can appears from security wizard also)\n $scope.$watchCollection('formData.events', function(newEvents, oldEvents) {\n if (!oldEvents || $scope.loading || angular.equals(newEvents, oldEvents)) return;\n $scope.updateView();\n })\n ];\n };\n\n $scope.removeListeners = function() {\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n };\n\n // Updating wallet data\n $scope.doUpdate = function(silent) {\n console.debug('[wallet] Updating wallet...');\n return (silent ?\n csWallet.refreshData() :\n UIUtils.loading.show()\n .then(csWallet.refreshData)\n .then(UIUtils.loading.hide)\n )\n .then($scope.updateView)\n .catch(UIUtils.onError('ERROR.REFRESH_WALLET_DATA'));\n };\n\n\n\n /**\n * Catch click for quick fix\n * @param event\n */\n $scope.doQuickFix = function(event) {\n console.log(\"TODO doQuickFix:\", event);\n };\n\n /* -- popup / UI -- */\n\n $scope.startWalletTour = function() {\n $scope.hideActionsPopover();\n return $scope.showHelpTip(0, true);\n };\n\n $scope.showHelpTip = function(index, isTour) {\n index = angular.isDefined(index) ? index : csSettings.data.helptip.wallet;\n isTour = angular.isDefined(isTour) ? isTour : false;\n if (index < 0) return;\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope(isTour);\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n helptipScope.tour = isTour;\n\n return helptipScope.startWalletTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n if (!isTour) {\n csSettings.data.helptip.wallet = endIndex;\n csSettings.store();\n }\n });\n };\n\n $scope.showQRCode = function(id, text, timeout) {\n if (!$scope.qrcodeId) return;\n // Get the DIV element\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId + ' .content'));\n if (!element) {\n console.error(\"[wallet-controller] Cannot found div #{0} for the QRCode. Skipping.\".format($scope.qrcodeId));\n return;\n }\n\n return csWallet.loadQrCode()\n .then(function(svg) {\n element.html(svg);\n UIUtils.motion.toggleOn({selector: '#'+$scope.qrcodeId}, timeout || 1100);\n });\n };\n\n $scope.hideQRCode = function() {\n if (!$scope.qrcodeId) return;\n var element = angular.element(document.querySelector('#' + $scope.qrcodeId));\n if (element) {\n UIUtils.motion.toggleOff({selector: '#'+$scope.qrcodeId});\n }\n };\n\n $scope.showActionsPopover = function(event) {\n if (!$scope.actionsPopover) {\n $ionicPopover.fromTemplateUrl('templates/wallet/popover_actions.html', {\n scope: $scope\n }).then(function(popover) {\n $scope.actionsPopover = popover;\n //Cleanup the popover when we're done with it!\n $scope.$on('$destroy', function() {\n $scope.actionsPopover.remove();\n });\n $scope.actionsPopover.show(event);\n });\n }\n else {\n $scope.actionsPopover.show(event);\n }\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n $scope.showSharePopover = function(event) {\n $scope.hideActionsPopover();\n\n var title = $scope.formData.name || $scope.formData.pubkey;\n\n // Use pod share URL - see issue #69\n var url = esHttp.getUrl('/user/profile/' + $scope.formData.pubkey + '/_share');\n\n // Override default position, is small screen - fix #25\n if (UIUtils.screen.isSmall()) {\n event = angular.element(document.querySelector('#wallet-share-anchor')) || event;\n }\n\n UIUtils.popover.share(event, {\n bindings: {\n url: url,\n titleKey: 'WOT.VIEW.POPOVER_SHARE_TITLE',\n titleValues: {title: title},\n postMessage: title\n }\n });\n };\n\n $scope.showSecurityModal = function(){\n $scope.hideActionsPopover();\n Modals.showAccountSecurity();\n };\n\n // remove '?refresh' from the location URI\n $scope.cleanLocationHref = function(state) {\n if (state && state.stateParams && state.stateParams.refresh) {\n $timeout(function() {\n var stateParams = angular.copy(state.stateParams);\n delete stateParams.refresh;\n $location.search(stateParams).replace();\n }, 300);\n }\n };\n}\n","\nangular.module('cesium.settings.services', ['ngApi', 'cesium.config'])\n\n.factory('csSettings', ['$rootScope', '$q', '$window', 'Api', 'localStorage', '$translate', 'csConfig', function($rootScope, $q, $window, Api, localStorage, $translate, csConfig) {\n 'ngInject';\n\n // Define app locales\n var locales = [\n {id:'en', label:'English', flag: 'us', country: 'us'},\n {id:'en-GB', label:'English (UK)', flag: 'gb', country: 'gb'},\n {id:'eo-EO', label:'Esperanto', flag: 'eo'},\n {id:'fr-FR', label:'Français', flag: 'fr', country: 'fr'},\n {id:'fr-BE', label:'Français (BE)', flag: 'be', country: 'be'},\n {id:'es-ES', label:'Spanish', flag: 'es', country: 'es'}\n ];\n var fallbackLocale = csConfig.fallbackLanguage ? fixLocale(csConfig.fallbackLanguage) : 'en';\n\n // Convert browser locale to app locale (fix #140)\n function fixLocale (locale) {\n if (!locale) return fallbackLocale;\n\n // exists in app locales: use it\n if (_.findWhere(locales, {id: locale})) return locale;\n\n // not exists: reiterate with the root (e.g. 'fr-XX' -> 'fr')\n var localeParts = locale.split('-');\n if (localeParts.length > 1) {\n return fixLocale(localeParts[0]);\n }\n\n // If another locale exists with the same root: use it\n var similarLocale = _.find(locales, function(l) {\n return String.prototype.startsWith.call(l.id, locale);\n });\n if (similarLocale) return similarLocale.id;\n\n return fallbackLocale;\n }\n\n // Convert browser locale to app locale (fix #140)\n function fixLocaleWithLog (locale) {\n var fixedLocale = fixLocale(locale);\n if (locale !== fixedLocale) {\n console.debug('[settings] Fix locale [{0}] -> [{1}]'.format(locale, fixedLocale));\n }\n return fixedLocale;\n }\n\n var\n constants = {\n STORAGE_KEY: 'GCHANGE_SETTINGS',\n KEEP_AUTH_IDLE_SESSION: 9999\n },\n // Settings that user cannot change himself (only config can override this values)\n fixedSettings = {\n timeout : 4000,\n cacheTimeMs: 60000, /*1 min*/\n timeWarningExpireMembership: 2592000 * 2 /*=2 mois*/,\n timeWarningExpire: 2592000 * 3 /*=3 mois*/,\n minVersion: '1.7.0', // min duniter version\n newIssueUrl: \"https://github.com/duniter-gchange/gchange-client/issues/new?labels=bug\",\n //userForumUrl: \"https://forum.gchange.fr\",\n userForumUrl: \"https://forum.monnaie-libre.fr\",\n latestReleaseUrl: \"https://api.github.com/repos/duniter-gchange/gchange-client/releases/latest\",\n httpsMode: false,\n share: {\n mastodonAuthor: \"@gchange@framapiaf.org\",\n defaultHastags: \"#gchange\"\n }\n },\n defaultSettings = angular.merge({\n useRelative: false,\n useLocalStorage: !!$window.localStorage, // override to false if no device\n useLocalStorageEncryption: false,\n persistCache: false, // disable by default (waiting resolution of issue #885)\n walletHistoryTimeSecond: 30 * 24 * 60 * 60 /*30 days*/,\n walletHistorySliceSecond: 5 * 24 * 60 * 60 /*download using 5 days slice*/,\n walletHistoryAutoRefresh: true, // override to false if device\n rememberMe: true,\n keepAuthIdle: 10 * 60,\n showUDHistory: true,\n showLoginSalt: false,\n expertMode: false,\n decimalCount: 2,\n uiEffects: true,\n blockValidityWindow: 6,\n helptip: {\n enable: false,\n installDocUrl: \"https://github.com/duniter-gchange/gchange-client/blob/master/README.md\",\n currency: 0,\n network: 0,\n wotLookup: 0,\n wot: 0,\n wotCerts: 0,\n wallet: 0,\n walletCerts: 0,\n wallets: 0,\n header: 0,\n settings: 0\n },\n currency: {\n allRules: false,\n allWotRules: false\n },\n wallet: {\n showPubkey: true,\n alertIfUnusedWallet: true,\n notificationReadTime: 0\n },\n locale: {\n id: fixLocaleWithLog(csConfig.defaultLanguage || $translate.use()) // use config locale if set, or browser default\n }\n },\n fixedSettings,\n csConfig),\n\n data = {},\n previousData,\n started = false,\n startPromise,\n api = new Api(this, \"csSettings\");\n\n var\n reset = function() {\n _.keys(data).forEach(function(key){\n delete data[key];\n });\n\n applyData(defaultSettings);\n\n return api.data.raisePromise.reset(data)\n .then(store);\n },\n\n getByPath = function(path, defaultValue) {\n var obj = data;\n _.each(path.split('.'), function(key) {\n obj = obj[key];\n if (angular.isUndefined(obj)) {\n obj = defaultValue;\n return; // stop\n }\n });\n\n return obj;\n },\n\n emitChangedEvent = function() {\n var hasChanged = angular.isUndefined(previousData) || !angular.equals(previousData, data);\n if (hasChanged) {\n previousData = angular.copy(data);\n return api.data.raise.changed(data);\n }\n },\n\n store = function() {\n if (!started) {\n console.debug('[setting] Waiting start finished...');\n return (startPromise || start()).then(store);\n }\n\n var promise;\n if (data.useLocalStorage) {\n // When node is temporary (fallback node): keep previous node address - issue #476\n if (data.node.temporary === true) {\n promise = localStorage.getObject(constants.STORAGE_KEY)\n .then(function(previousSettings) {\n var savedData = angular.copy(data);\n savedData.node = previousSettings && previousSettings.node || {};\n delete savedData.temporary; // never store temporary flag\n return localStorage.setObject(constants.STORAGE_KEY, savedData);\n });\n }\n else {\n promise = localStorage.setObject(constants.STORAGE_KEY, data);\n }\n }\n else {\n promise = localStorage.setObject(constants.STORAGE_KEY, null);\n }\n\n return promise\n .then(function() {\n if (data.useLocalStorage) {\n console.debug('[setting] Saved locally');\n }\n\n // Emit event on store\n return api.data.raisePromise.store(data);\n })\n\n // Emit event on store\n .then(emitChangedEvent);\n },\n\n /**\n * Apply new settings (can be partial)\n * @param newData\n */\n applyData = function(newData) {\n if (!newData) return; // skip empty\n\n var localeChanged = false;\n if (newData.locale && newData.locale.id) {\n // Fix previously stored locale (could use bad format)\n var localeId = fixLocale(newData.locale.id);\n newData.locale = _.findWhere(locales, {id: localeId});\n localeChanged = !data.locale || newData.locale.id !== data.locale.id || newData.locale.id !== $translate.use();\n }\n\n // Force some fixed settings, before merging\n _.keys(fixedSettings).forEach(function(key) {\n newData[key] = defaultSettings[key]; // This will apply fixed value (override by config.js file)\n });\n\n // Apply new settings\n angular.merge(data, newData);\n\n // Delete temporary properties, if false\n if (newData && newData.node && !newData.node.temporary || !data.node.temporary) delete data.node.temporary;\n\n // Gchange workaround: Replace OLD default duniter node, by gchange pod\n if ((data.plugins && data.plugins.es.host && data.plugins.es.port) &&\n (!data.node || (data.node.host !== data.plugins.es.host))) {\n var oldBmaNode = data.node.host;\n var newBmaNode = data.plugins.es.host;\n console.warn(\"[settings] Replacing duniter node {{0}} with gchange pod {{1}}\".format(oldBmaNode, newBmaNode));\n data.node = {\n host: newBmaNode,\n port: data.plugins.es.port,\n useSsl: data.plugins.es.useSsl\n };\n }\n\n // Apply the new locale (only if need)\n // will produce an event cached by onLocaleChange();\n if (localeChanged) {\n $translate.use(data.locale.id);\n }\n\n },\n\n restore = function() {\n var now = Date.now();\n\n return localStorage.getObject(constants.STORAGE_KEY)\n .then(function(storedData) {\n // No settings stored\n if (!storedData) {\n console.debug(\"[settings] No settings in local storage. Using defaults.\");\n applyData(defaultSettings);\n emitChangedEvent();\n return;\n }\n\n // Apply stored data\n applyData(storedData);\n\n console.debug('[settings] Loaded from local storage in '+(Date.now()-now)+'ms');\n emitChangedEvent();\n });\n },\n\n getFeedUrl = function() {\n var locale = data.locale && data.locale.id || csConfig.defaultLanguage || 'en';\n return (csConfig.feed && csConfig.feed.jsonFeed) ?\n (csConfig.feed.jsonFeed[locale] ? csConfig.feed.jsonFeed[locale] : defaultSettings.feed.jsonFeed[csConfig.defaultLanguage || 'en'] || csConfig.feed) : undefined;\n },\n\n // Detect locale successful changes, then apply to vendor libs\n onLocaleChange = function() {\n var locale = $translate.use();\n console.debug('[settings] Locale ['+locale+']');\n\n // config moment lib\n try {\n moment.locale(locale.toLowerCase());\n }\n catch(err) {\n try {\n moment.locale(locale.substr(0,2));\n }\n catch(err) {\n moment.locale('en-gb');\n console.warn('[settings] Unknown local for moment lib. Using default [en]');\n }\n }\n\n // config numeral lib\n try {\n numeral.language(locale.toLowerCase());\n }\n catch(err) {\n try {\n numeral.language(locale.substring(0, 2));\n }\n catch(err) {\n numeral.language('en-gb');\n console.warn('[settings] Unknown local for numeral lib. Using default [en]');\n }\n }\n\n // Emit event\n api.locale.raise.changed(locale);\n },\n\n isStarted = function() {\n return started;\n },\n\n ready = function() {\n if (started) return $q.when();\n return startPromise || start();\n },\n\n start = function() {\n console.debug('[settings] Starting...');\n\n startPromise = localStorage.ready()\n\n // Restore\n .then(restore)\n\n // Emit ready event\n .then(function() {\n console.debug('[settings] Started');\n started = true;\n startPromise = null;\n // Emit event (used by plugins)\n api.data.raise.ready(data);\n });\n\n return startPromise;\n };\n\n $rootScope.$on('$translateChangeSuccess', onLocaleChange);\n\n api.registerEvent('data', 'reset');\n api.registerEvent('data', 'changed');\n api.registerEvent('data', 'store');\n api.registerEvent('data', 'ready');\n api.registerEvent('locale', 'changed');\n\n // Apply default settings. This is required on some browser (web or mobile - see #361)\n applyData(defaultSettings);\n\n // Default action\n //start();\n\n return {\n isStarted: isStarted,\n ready: ready,\n start: start,\n data: data,\n apply: applyData,\n getByPath: getByPath,\n reset: reset,\n store: store,\n restore: restore,\n getFeedUrl: getFeedUrl,\n defaultSettings: defaultSettings,\n // api extension\n api: api,\n locales: locales,\n constants: constants,\n fixLocale: fixLocale\n };\n}]);\n","\nWotLookupController.$inject = ['$scope', '$state', '$timeout', '$focus', '$ionicPopover', '$ionicHistory', 'UIUtils', 'csConfig', 'csCurrency', 'csSettings', 'Device', 'BMA', 'csWallet', 'esDocument', 'esProfile'];\nWotLookupModalController.$inject = ['$scope', '$controller', '$focus', 'parameters'];\nWotIdentityAbstractController.$inject = ['$scope', '$rootScope', '$state', '$ionicHistory', 'UIUtils', 'Modals', 'esHttp', 'csCurrency', 'csWot', 'csWallet'];\nWotIdentityViewController.$inject = ['$scope', '$rootScope', '$controller', '$timeout', 'UIUtils', 'csWallet'];angular.module('cesium.wot.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n $stateProvider\n\n // NEW URI (v1.3)\n .state('app.user_lookup', {\n url: \"/user?q&type&hash\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/lookup.html\",\n controller: 'WotLookupCtrl'\n }\n }\n })\n\n .state('app.user_identity', {\n url: \"/user/:pubkey/:name?action\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_identity.html\",\n controller: 'WotIdentityViewCtrl'\n }\n }\n })\n\n .state('app.user_identity_name', {\n url: \"/lookup/:name?action\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/wot/view_identity.html\",\n controller: 'WotIdentityViewCtrl'\n }\n }\n });\n }])\n\n .controller('WotLookupCtrl', WotLookupController)\n\n .controller('WotLookupModalCtrl', WotLookupModalController)\n\n .controller('WotIdentityAbstractCtrl', WotIdentityAbstractController)\n\n .controller('WotIdentityViewCtrl', WotIdentityViewController)\n\n\n;\n\nfunction WotLookupController($scope, $state, $timeout, $focus, $ionicPopover, $ionicHistory,\n UIUtils, csConfig, csCurrency, csSettings, Device, BMA, csWallet, esDocument, esProfile) {\n 'ngInject';\n\n var defaultSearchLimit = 10;\n\n $scope.search = {\n text: '',\n loading: true,\n type: null,\n results: []\n };\n $scope._source = [\"issuer\", \"title\", \"city\", \"time\", \"avatar._content_type\"];\n $scope.entered = false;\n $scope.wotSearchTextId = 'wotSearchText';\n $scope.enableFilter = true;\n $scope.allowMultiple = false;\n $scope.selection = [];\n $scope.showResultLabel = true;\n $scope.parameters = {}; // override in the modal controller\n\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n if (state.stateParams && state.stateParams.q) { // Query parameter\n $scope.search.text = state.stateParams.q;\n $timeout(function() {\n $scope.doSearch();\n }, 100);\n }\n else if (state.stateParams && state.stateParams.hash) { // hash tag parameter\n $scope.search.text = '#' + state.stateParams.hash;\n $timeout(function() {\n $scope.doSearch();\n }, 100);\n }\n else {\n $timeout(function() {\n // get new comers\n if (state.stateParams.type === 'newcomers' || (!csConfig.initPhase && !state.stateParams.type)) {\n $scope.doGetNewcomers(0, undefined, true/*skipLocationUpdate*/);\n }\n\n }, 100);\n }\n // removeIf(device)\n // Focus on search text (only if NOT device, to avoid keyboard opening)\n $focus($scope.wotSearchTextId);\n // endRemoveIf(device)\n\n $scope.entered = true;\n\n $timeout(UIUtils.ink, 100);\n\n $scope.showHelpTip();\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.resetWotSearch = function() {\n $scope.search = {\n text: null,\n loading: false,\n type: 'newcomers',\n results: []\n };\n };\n\n $scope.updateLocationHref = function() {\n // removeIf(device)\n var stateParams = {\n q: undefined,\n hash: undefined,\n type: undefined\n };\n\n if ($scope.search.type === 'text') {\n var text = $scope.search.text.trim();\n if (text.match(/^#[\\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+$/)) {\n stateParams.hash = text.substr(1);\n }\n else {\n stateParams.q = text;\n }\n }\n else {\n stateParams.type = $scope.search.type;\n }\n\n // Update location href\n $ionicHistory.nextViewOptions({\n disableAnimate: true,\n disableBack: true,\n historyRoot: true\n });\n $state.go('app.user_lookup', stateParams,\n {\n reload: false,\n inherit: true,\n notify: false\n });\n // endRemoveIf(device)\n };\n\n $scope.doSearchText = function() {\n\n $scope.doSearch();\n $scope.updateLocationHref();\n\n };\n\n $scope.doSearch = function(offset, size) {\n var text = $scope.search.text.trim();\n if ((UIUtils.screen.isSmall() && text.length < 3) || !text.length) {\n $scope.search.results = [];\n $scope.search.type = 'none';\n return $q.when();\n }\n $scope.search.loading = true;\n var options = {\n from: offset || 0,\n size: size || defaultSearchLimit,\n _source: $scope._source\n };\n $scope.search.type = 'text';\n return esProfile.searchText(text, options)\n .then(function(idties){\n if ($scope.search.type !== 'text') return; // could have change\n if ($scope.search.text.trim() !== text) return; // search text has changed before received response\n\n if ((!idties || !idties.length) && BMA.regexp.PUBKEY.test(text)) {\n $scope.doDisplayResult([{pubkey: text}]);\n }\n else {\n $scope.doDisplayResult(idties, offset, size);\n }\n })\n .catch(UIUtils.onError('ERROR.WOT_LOOKUP_FAILED'));\n };\n\n $scope.doGetNewcomers = function(offset, size, skipLocationUpdate) {\n offset = offset || 0;\n size = size || defaultSearchLimit;\n if (size < defaultSearchLimit) size = defaultSearchLimit;\n\n $scope.hideActionsPopover();\n $scope.search.loading = (offset === 0);\n $scope.search.type = 'newcomers';\n\n // Update location href\n if (!offset && !skipLocationUpdate) {\n $scope.updateLocationHref();\n }\n\n var options = {\n index: 'user',\n type: 'profile',\n from: offset,\n size: size,\n sort: {creationTime: 'desc'}\n };\n\n return esProfile.search(options)\n .then(function(idties){\n if ($scope.search.type !== 'newcomers') return false; // could have change\n $scope.doDisplayResult(idties, offset, size);\n return true;\n })\n .catch(function(err) {\n $scope.search.loading = false;\n $scope.search.results = (offset > 0) ? $scope.search.results : [];\n $scope.search.hasMore = false;\n UIUtils.onError('ERROR.LOAD_NEWCOMERS_FAILED')(err);\n });\n };\n\n $scope.showMore = function() {\n var offset = $scope.search.results ? $scope.search.results.length : 0;\n\n $scope.search.loadingMore = true;\n var searchFunction = ($scope.search.type === 'newcomers') ?\n $scope.doGetNewcomers :\n $scope.doGetPending;\n\n return searchFunction(offset)\n .then(function(ok) {\n if (ok) {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n }\n })\n .catch(function(err) {\n console.error(err);\n $scope.search.loadingMore = false;\n $scope.search.hasMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.select = function(identity) {\n // identity = self -> open the user wallet\n if (csWallet.isUserPubkey(identity.pubkey)) {\n $state.go('app.view_wallet');\n }\n // Open identity view\n else {\n $state.go('app.user_identity', {\n pubkey: identity.pubkey,\n name: identity.name\n });\n }\n };\n\n $scope.next = function() {\n // This method should be override by sub controller (e.g. modal controller)\n console.log('Selected identities:', $scope.selection);\n };\n\n $scope.toggleCheck = function(index, e) {\n var identity = $scope.search.results[index];\n if (identity.checked) {\n $scope.addToSelection(identity);\n }\n else {\n $scope.removeSelection(identity, e);\n }\n };\n\n $scope.toggleSelect = function(identity){\n identity.selected = !identity.selected;\n };\n\n $scope.addToSelection = function(identity) {\n\n var copyIdty = angular.copy(identity);\n if (copyIdty.name) {\n copyIdty.name = copyIdty.name.replace('<em>', '').replace('</em>', ''); // remove highlight\n }\n\n $scope.selection.push(copyIdty);\n };\n\n $scope.removeSelection = function(identity, e) {\n\n // Remove from selection array\n var identityInSelection = _.findWhere($scope.selection, {id: identity.id});\n if (identityInSelection) {\n $scope.selection.splice($scope.selection.indexOf(identityInSelection), 1);\n }\n\n // Uncheck in result array, if exists\n if (!$scope.search.loading) {\n var existIdtyInResult = _.findWhere($scope.search.results, {id: identity.id});\n if (existIdtyInResult && existIdtyInResult.checked) {\n existIdtyInResult.checked = false;\n }\n }\n //e.preventDefault();\n };\n\n $scope.scanQrCode = function(){\n if (!Device.barcode.enable) {\n return;\n }\n Device.barcode.scan()\n .then(function(result) {\n if (!result) {\n return;\n }\n BMA.uri.parse(result)\n .then(function(obj){\n if (obj.pubkey) {\n $scope.search.text = obj.pubkey;\n }\n else if (result.name) {\n $scope.search.text = obj.name;\n }\n else {\n $scope.search.text = result;\n }\n $scope.doSearch();\n });\n })\n .catch(UIUtils.onError('ERROR.SCAN_FAILED'));\n };\n\n // Show help tip (show only not already shown)\n $scope.showHelpTip = function() {\n if (!$scope.isLogin()) return;\n var index = angular.isDefined(index) ? index : csSettings.data.helptip.wot;\n if (index < 0) return;\n if (index === 0) index = 1; // skip first step\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope();\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n return helptipScope.startWotTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n csSettings.data.helptip.wot = endIndex;\n csSettings.store();\n });\n };\n\n $scope.doDisplayResult = function(res, offset, size) {\n res = res || {};\n\n // pre-check result if already in selection\n if ($scope.allowMultiple && res.length && $scope.selection.length) {\n _.forEach($scope.selection, function(identity) {\n var identityInRes = _.findWhere(res, {id: identity.id});\n if (identityInRes) {\n identityInRes.checked = true;\n }\n });\n }\n\n if (!offset) {\n $scope.search.results = res || [];\n }\n else {\n $scope.search.results = $scope.search.results.concat(res);\n }\n $scope.search.loading = false;\n $scope.search.hasMore = res.length && $scope.search.results.length >= (offset + size);\n\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n if (!$scope.search.results.length) return;\n\n // Motion\n if (res.length > 0 && $scope.motion) {\n $scope.motion.show({selector: '.lookupForm .list .item', ink: true});\n }\n };\n\n /* -- show/hide popup -- */\n\n $scope.showActionsPopover = function(event) {\n if (!$scope.actionsPopover) {\n $ionicPopover.fromTemplateUrl('templates/wot/lookup_popover_actions.html', {\n scope: $scope\n }).then(function(popover) {\n $scope.actionsPopover = popover;\n //Cleanup the popover when we're done with it!\n $scope.$on('$destroy', function() {\n $scope.actionsPopover.remove();\n });\n $scope.actionsPopover.show(event);\n });\n }\n else {\n $scope.actionsPopover.show(event);\n }\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n };\n\n}\n\nfunction WotLookupModalController($scope, $controller, $focus, parameters){\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WotLookupCtrl', {$scope: $scope}));\n\n parameters = parameters || {};\n $scope.search.loading = false;\n $scope.enableFilter = angular.isDefined(parameters.enableFilter) ? parameters.enableFilter : false;\n $scope.allowMultiple = angular.isDefined(parameters.allowMultiple) ? parameters.allowMultiple : false;\n $scope.parameters = parameters;\n $scope.showResultLabel = false;\n\n $scope.wotSearchTextId = 'wotSearchTextModal';\n\n if ($scope.allowMultiple && parameters.selection) {\n $scope.selection = parameters.selection;\n }\n\n $scope.cancel = function(){\n $scope.closeModal();\n };\n\n $scope.select = function(identity){\n $scope.closeModal({\n pubkey: identity.pubkey,\n name: identity.name && identity.name.replace(/<\\/?em>/ig, '')\n });\n };\n\n $scope.next = function() {\n $scope.closeModal($scope.selection);\n };\n\n $scope.updateLocationHref = function() {\n // Do NOT change location href\n };\n\n $scope.showHelpTip = function() {\n // silent\n };\n\n // removeIf(device)\n // Focus on search text (only if NOT device, to avoid keyboard opening)\n $focus($scope.wotSearchTextId);\n // endRemoveIf(device)\n}\n\n/**\n * Abtract controller that load identity, that expose some useful methods in $scope, like 'certify()'\n * @param $scope\n * @param $state\n * @param $timeout\n * @param UIUtils\n * @param Modals\n * @param csConfig\n * @param csWot\n * @param csWallet\n * @constructor\n */\nfunction WotIdentityAbstractController($scope, $rootScope, $state, $ionicHistory,\n UIUtils, Modals, esHttp, csCurrency, csWot, csWallet) {\n 'ngInject';\n\n $scope.formData = {\n hasSelf: true\n };\n $scope.loading = true;\n\n $scope.load = function(pubkey, withCache, name) {\n return csWot.load(pubkey, withCache, name)\n .then(function(identity){\n if (!identity) return UIUtils.onError('ERROR.IDENTITY_NOT_FOUND')().then($scope.showHome);\n $scope.formData = identity;\n $scope.loading = false;\n $scope.updateView();\n\n UIUtils.loading.hide(10); // loading could have be open (e.g. new account)\n })\n .catch(function(err) {\n $scope.loading = false;\n UIUtils.onError('ERROR.LOAD_IDENTITY_FAILED')(err);\n });\n };\n\n $scope.refresh = function() {\n if ($scope.loading || !$scope.formData.pubkey) return; // Skip\n return $scope.load($scope.formData.pubkey, false);\n };\n\n $scope.updateView = function() {\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n };\n\n $scope.removeActionParamInLocationHref = function(state) {\n if (!state || !state.stateParams || !state.stateParams.action) return;\n\n var stateParams = angular.copy(state.stateParams);\n\n // Reset action param\n stateParams.action = null;\n\n // Update location href\n $ionicHistory.nextViewOptions({\n disableAnimate: true,\n disableBack: false,\n historyRoot: false\n });\n $state.go(state.stateName, stateParams,\n {\n reload: false,\n inherit: true,\n notify: false\n });\n };\n\n /* -- open screens -- */\n\n $scope.showSharePopover = function(event) {\n var title = $scope.formData.name || $scope.formData.name || $scope.formData.pubkey;\n // Use pod share URL - see issue #69\n var url = esHttp.getUrl('/user/profile/' + $scope.formData.pubkey + '/_share');\n\n // Override default position, is small screen - fix #25\n if (UIUtils.screen.isSmall()) {\n event = angular.element(document.querySelector('#wot-share-anchor-'+$scope.formData.pubkey)) || event;\n }\n UIUtils.popover.share(event, {\n bindings: {\n url: url,\n titleKey: 'WOT.VIEW.POPOVER_SHARE_TITLE',\n titleValues: {title: title},\n postMessage: title\n }\n });\n };\n}\n\n/**\n * Identity view controller - should extend WotIdentityAbstractCtrl\n */\nfunction WotIdentityViewController($scope, $rootScope, $controller, $timeout, UIUtils, csWallet) {\n 'ngInject';\n // Initialize the super class and extend it.\n angular.extend(this, $controller('WotIdentityAbstractCtrl', {$scope: $scope}));\n\n $scope.motion = UIUtils.motion.fadeSlideInRight;\n\n // Init likes here, to be able to use in extension\n $scope.options = $scope.options || {};\n $scope.options.like = {\n kinds: ['VIEW', 'LIKE', 'ABUSE', 'FOLLOW', 'STAR'],\n index: 'user',\n type: 'profile'\n };\n $scope.likeData = {\n views: {},\n likes: {},\n follows: {},\n abuses: {},\n stars: {}\n };\n\n $scope.enter = function(e, state) {\n\n var onLoadSuccess = function() {\n if (state.stateParams && state.stateParams.action) {\n $timeout(function() {\n $scope.doAction(state.stateParams.action.trim());\n }, 100);\n\n $scope.removeActionParamInLocationHref(state);\n\n $scope.likeData.id = $scope.formData.pubkey;\n }\n };\n\n if (state.stateParams &&\n state.stateParams.pubkey &&\n state.stateParams.pubkey.trim().length > 0) {\n if ($scope.loading) { // load once\n return $scope.load(state.stateParams.pubkey.trim(), true /*withCache*/, state.stateParams.name)\n .then(onLoadSuccess);\n }\n }\n\n else if (state.stateParams &&\n state.stateParams.name &&\n state.stateParams.name.trim().length > 0) {\n if ($scope.loading) { // load once\n return $scope.load(null, true /*withCache*/, state.stateParams.name)\n .then(onLoadSuccess);\n }\n }\n\n // Load from wallet pubkey\n else if (csWallet.isLogin()){\n\n if ($scope.loading) {\n return $scope.load(csWallet.data.pubkey, true /*withCache*/, csWallet.data.name)\n .then(onLoadSuccess);\n }\n }\n\n // Redirect to home\n else {\n $scope.showHome();\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.updateView = function() {\n console.debug('[identity] Updating view');\n $scope.motion.show({selector: '.view-identity .list .item'});\n\n $scope.$broadcast('$csExtension.motion');\n $scope.$broadcast('$$rebind::rebind'); // force rebind\n };\n}\n","\nSettingsController.$inject = ['$scope', '$q', '$window', '$ionicHistory', '$ionicPopup', '$timeout', '$translate', 'UIUtils', 'Modals', 'BMA', 'csHttp', 'csConfig', 'csSettings', 'csPlatform'];\nangular.module('cesium.settings.controllers', ['cesium.services'])\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.settings', {\n url: \"/settings\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/settings/settings.html\",\n controller: 'SettingsCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('SettingsCtrl', SettingsController)\n;\n\nfunction SettingsController($scope, $q, $window, $ionicHistory, $ionicPopup, $timeout, $translate,\n UIUtils, Modals, BMA, csHttp, csConfig, csSettings, csPlatform) {\n 'ngInject';\n\n $scope.formData = angular.copy(csSettings.data);\n $scope.popupData = {}; // need for the node popup\n $scope.loading = true;\n $scope.nodePopup = {};\n $scope.bma = BMA;\n\n\n $scope.$on('$ionicView.enter', function() {\n csSettings.ready().then($scope.load);\n });\n\n $scope.setPopupForm = function(popupForm) {\n $scope.popupForm = popupForm;\n };\n\n $scope.load = function() {\n $scope.loading = true; // to avoid the call of csWallet.store()\n\n // Fill locales\n $scope.locales = angular.copy(csSettings.locales);\n\n // Apply settings\n angular.merge($scope.formData, csSettings.data);\n\n // Make sure to use full locale object (id+name)\n $scope.formData.locale = (csSettings.data.locale && csSettings.data.locale.id && _.findWhere($scope.locales, {id: csSettings.data.locale.id})) ||\n _.findWhere($scope.locales, {id: csSettings.defaultSettings.locale.id});\n\n\n return $timeout(function() {\n $scope.loading = false;\n // Set Ink\n UIUtils.ink({selector: '.item'});\n $scope.showHelpTip();\n }, 100);\n };\n\n $scope.reset = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n $scope.pendingSaving = true;\n csSettings.reset()\n .then(csPlatform.restart)\n .then(function() {\n // reload\n $scope.load();\n $scope.pendingSaving = false;\n });\n };\n\n $scope.changeLanguage = function(langKey) {\n $translate.use(langKey);\n };\n\n // Change node\n $scope.changeNode= function(node) {\n var port = !!$scope.formData.node.port && $scope.formData.node.port != 80 && $scope.formData.node.port != 443 ? $scope.formData.node.port : undefined;\n node = node || {\n host: $scope.formData.node.host,\n port: port,\n useSsl: angular.isDefined($scope.formData.node.useSsl) ?\n $scope.formData.node.useSsl :\n ($scope.formData.node.port == 443)\n };\n $scope.showNodePopup(node)\n .then(function(newNode) {\n if (newNode.host === $scope.formData.node.host &&\n newNode.port === $scope.formData.node.port &&\n newNode.useSsl === $scope.formData.node.useSsl && !$scope.formData.node.temporary) {\n return; // same node = nothing to do\n }\n UIUtils.loading.show();\n\n var nodeBMA = BMA.instance(newNode.host, newNode.port, newNode.useSsl, true /*cache*/);\n nodeBMA.isAlive()\n .then(function(alive) {\n if (!alive) {\n UIUtils.loading.hide();\n return UIUtils.alert.error('ERROR.INVALID_NODE_SUMMARY')\n .then(function(){\n $scope.changeNode(newNode); // loop\n });\n }\n UIUtils.loading.hide();\n angular.merge($scope.formData.node, newNode);\n delete $scope.formData.node.temporary;\n BMA.copy(nodeBMA);\n $scope.bma = BMA;\n\n // Restart platform (or start if not already started)\n csPlatform.restart();\n\n // Reset history cache\n return $ionicHistory.clearCache();\n });\n });\n };\n\n $scope.showNodeList = function() {\n // Check if need a filter on SSL node\n var forceUseSsl = (csConfig.httpsMode === 'true' || csConfig.httpsMode === true || csConfig.httpsMode === 'force') ||\n ($window.location && $window.location.protocol === 'https:') ? true : false;\n\n $ionicPopup._popupStack[0].responseDeferred.promise.close();\n return Modals.showNetworkLookup({\n enableFilter: true, // enable filter button\n bma: true, // only BMA node\n ssl: forceUseSsl ? true : undefined\n })\n .then(function (peer) {\n if (peer) {\n var bma = peer.getBMA();\n return {\n host: (bma.dns ? bma.dns :\n (peer.hasValid4(bma) ? bma.ipv4 : bma.ipv6)),\n port: bma.port || 80,\n useSsl: bma.useSsl || bma.port == 443\n };\n }\n })\n .then(function(newNode) {\n $scope.changeNode(newNode);\n });\n };\n\n // Show node popup\n $scope.showNodePopup = function(node) {\n return $q(function(resolve, reject) {\n $scope.popupData.newNode = node.port ? [node.host, node.port].join(':') : node.host;\n $scope.popupData.useSsl = node.useSsl;\n if (!!$scope.popupForm) {\n $scope.popupForm.$setPristine();\n }\n $translate(['SETTINGS.POPUP_PEER.TITLE', 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n // Choose UID popup\n $ionicPopup.show({\n templateUrl: 'templates/settings/popup_node.html',\n title: translations['SETTINGS.POPUP_PEER.TITLE'],\n scope: $scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n {\n text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: function(e) {\n $scope.popupForm.$submitted=true;\n if(!$scope.popupForm.$valid || !$scope.popupForm.newNode) {\n //don't allow the user to close unless he enters a node\n e.preventDefault();\n } else {\n return {\n server: $scope.popupData.newNode,\n useSsl: $scope.popupData.useSsl\n };\n }\n }\n }\n ]\n })\n .then(function(res) {\n if (!res) { // user cancel\n UIUtils.loading.hide();\n return;\n }\n var parts = res.server.split(':');\n parts[1] = parts[1] ? parts[1] : (res.useSsl ? 443 : 80);\n resolve({\n host: parts[0],\n port: parts[1],\n useSsl: res.useSsl\n });\n });\n });\n });\n };\n\n $scope.save = function() {\n if ($scope.loading || $scope.pendingSaving) return $q.when();\n if ($scope.saving) {\n $scope.pendingSaving = true;\n // Retry later\n return $timeout(function() {\n $scope.pendingSaving = false;\n return $scope.save();\n }, 500);\n }\n $scope.saving = true;\n\n // Async - to avoid UI lock\n return $timeout(function() {\n // Make sure to format helptip\n $scope.cleanupHelpTip();\n\n // Applying\n csSettings.apply($scope.formData);\n\n // Store\n return csSettings.store();\n\n }, 100)\n .then(function() {\n //return $timeout(function() {\n $scope.saving = false;\n //}, 100);\n });\n };\n\n $scope.onDataChanged = function(oldValue, newValue, scope) {\n if ($scope.loading || $scope.pendingSaving) return $q.when();\n if ($scope.saving) {\n $scope.pendingSaving = true;\n // Retry later\n return $timeout(function() {\n $scope.pendingSaving = false;\n return $scope.onDataChanged(oldValue, newValue, scope);\n }, 500);\n }\n\n // Changes from the current scope: save changes\n if ((scope === $scope) && !angular.equals(oldValue, newValue)) {\n $scope.save();\n }\n };\n $scope.$watch('formData', $scope.onDataChanged, true);\n\n\n $scope.getServer = function() {\n if (!$scope.formData.node || !$scope.formData.node.host) return '';\n return csHttp.getServer($scope.formData.node.host, $scope.formData.node.port);\n };\n\n $scope.cleanupHelpTip = function() {\n var helptipChanged = $scope.formData.helptip.enable !== csSettings.data.helptip.enable;\n if (helptipChanged) {\n var enable = $scope.formData.helptip.enable;\n // Apply default values\n $scope.formData.helptip = angular.merge({}, csSettings.defaultSettings.helptip);\n // Then restore the enable flag\n $scope.formData.helptip.enable = enable;\n }\n };\n\n /* -- modals & popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'templates/settings/popover_actions.html',\n scope: $scope,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n $scope.startSettingsTour = function() {\n $scope.hideActionsPopover();\n\n return $scope.showHelpTip(0, true);\n };\n\n // Show help tip (show only not already shown)\n $scope.showHelpTip = function(index, tour) {\n if (!$scope.isLogin() && !tour) return;\n index = angular.isDefined(index) ? index : csSettings.data.helptip.settings;\n if (index < 0) return;\n if (index === 0) index = 1; // skip first step\n\n // Create a new scope for the tour controller\n var helptipScope = $scope.createHelptipScope(tour);\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\n return helptipScope.startSettingsTour(index, false)\n .then(function(endIndex) {\n helptipScope.$destroy();\n csSettings.data.helptip.settings = endIndex;\n csSettings.store();\n });\n };\n}\n","\n\nfunction EsPeer(json) {\n\n var that = this;\n\n Object.keys(json).forEach(function (key) {\n that[key] = json[key];\n });\n\n that.endpoints = that.endpoints || [];\n}\n\n\nEsPeer.prototype.regexp = {\n API_REGEXP: /^([A-Z_]+)(?:[ ]+([a-z_][a-z0-9-_.ğĞ]*))?(?:[ ]+([0-9.]+))?(?:[ ]+([0-9a-f:]+))?(?:[ ]+([0-9]+))(?:\\/[^\\/]+)?$/,\n LOCAL_IP_ADDRESS: /^127[.]0[.]0.|192[.]168[.]|10[.]0[.]0[.]|172[.]16[.]/\n};\n\nEsPeer.prototype.keyID = function () {\n var ep = this.ep || this.getEP();\n if (ep.useBma) {\n return [this.pubkey || \"Unknown\", ep.dns, ep.ipv4, ep.ipv6, ep.port, ep.useSsl, ep.path].join('-');\n }\n return [this.pubkey || \"Unknown\", ep.ws2pid, ep.path].join('-');\n};\n\nEsPeer.prototype.copyValues = function(to) {\n var obj = this;\n [\"version\", \"currency\", \"pub\", \"endpoints\", \"hash\", \"status\", \"block\", \"signature\"].forEach(function (key) {\n to[key] = obj[key];\n });\n};\n\nEsPeer.prototype.copyValuesFrom = function(from) {\n var obj = this;\n [\"version\", \"currency\", \"pub\", \"endpoints\", \"block\", \"signature\"].forEach(function (key) {\n obj[key] = from[key];\n });\n};\n\nEsPeer.prototype.json = function() {\n var obj = this;\n var json = {};\n [\"version\", \"currency\", \"endpoints\", \"status\", \"block\", \"signature\"].forEach(function (key) {\n json[key] = obj[key];\n });\n json.raw = this.raw && this.getRaw();\n json.pubkey = this.pubkey;\n return json;\n};\n\nEsPeer.prototype.getEP = function() {\n if (this.ep) return this.ep;\n var ep = null;\n var epRegex = this.regexp.API_REGEXP;\n this.endpoints.forEach(function(epStr){\n var matches = !ep && epRegex.exec(epStr);\n if (matches) {\n ep = {\n \"api\": matches[1] || '',\n \"dns\": matches[2] || '',\n \"ipv4\": matches[3] || '',\n \"ipv6\": matches[4] || '',\n \"port\": matches[5] || 80,\n \"path\": matches[6] || '',\n \"useSsl\": matches[5] == 443\n };\n }\n });\n return ep || {};\n};\n\nEsPeer.prototype.getEndpoints = function(regexp) {\n if (!regexp) return this.endpoints;\n if (typeof regexp === 'string') regexp = new RegExp('^' + regexp);\n return this.endpoints.reduce(function(res, ep){\n return ep.match(regexp) ? res.concat(ep) : res;\n }, []);\n};\n\nEsPeer.prototype.hasEndpoint = function(endpoint){\n var regExp = this.regexp[endpoint] || new RegExp('^' + endpoint);\n var endpoints = this.getEndpoints(regExp);\n return endpoints && endpoints.length > 0;\n};\n\nEsPeer.prototype.hasEsEndpoint = function() {\n var endpoints = this.getEsEndpoints();\n return endpoints && endpoints.length > 0;\n};\n\nEsPeer.prototype.getEsEndpoints = function() {\n return this.getEndpoints(/^(GCHANGE_API|GCHANGE_SUBSCRIPTION_API)/);\n};\n\nEsPeer.prototype.getDns = function() {\n var ep = this.ep || this.getEP();\n return ep.dns ? ep.dns : null;\n};\n\nEsPeer.prototype.getIPv4 = function() {\n var ep = this.ep || this.getEP();\n return ep.ipv4 ? ep.ipv4 : null;\n};\n\nEsPeer.prototype.getIPv6 = function() {\n var ep = this.ep || this.getEP();\n return ep.ipv6 ? ep.ipv6 : null;\n};\n\nEsPeer.prototype.getPort = function() {\n var ep = this.ep || this.getEP();\n return ep.port ? ep.port : null;\n};\n\nEsPeer.prototype.getHost = function() {\n var ep = this.ep || this.getEP();\n return ((ep.port == 443 || ep.useSsl) && ep.dns) ? ep.dns :\n (this.hasValid4(ep) ? ep.ipv4 :\n (ep.dns ? ep.dns :\n (ep.ipv6 ? '[' + ep.ipv6 + ']' :'')));\n};\n\nEsPeer.prototype.getURL = function() {\n var ep = this.ep || this.getEP();\n var host = this.getHost();\n var protocol = (ep.port == 443 || ep.useSsl) ? 'https' : 'http';\n return protocol + '://' + host + (ep.port ? (':' + ep.port) : '');\n};\n\nEsPeer.prototype.getServer = function() {\n var ep = this.ep || this.getEP();\n var host = this.getHost();\n return host + (host && ep.port ? (':' + ep.port) : '');\n};\n\nEsPeer.prototype.hasValid4 = function(ep) {\n return ep.ipv4 &&\n /* exclude private address - see https://fr.wikipedia.org/wiki/Adresse_IP */\n !ep.ipv4.match(this.regexp.LOCAL_IP_ADDRESS) ?\n true : false;\n};\n\nEsPeer.prototype.isReachable = function () {\n return !!this.getServer();\n};\n\nEsPeer.prototype.isSsl = function() {\n var ep = this.ep || this.getEP();\n return ep.useSsl;\n};\n\nEsPeer.prototype.isTor = function() {\n var ep = this.ep || this.getEP();\n return ep.useTor;\n};\n\nEsPeer.prototype.isHttp = function() {\n var ep = this.ep || this.getEP();\n return !bma.useTor;\n};\n\n","\n\n\nfunction EsNotification(json, markAsReadCallback) {\n\n var messagePrefixes = {\n 'user': 'EVENT.USER.',\n 'page': 'EVENT.PAGE.',\n // gchange market record\n 'market': 'EVENT.MARKET.'\n };\n\n var that = this;\n\n // Avoid undefined errors\n json = json || {};\n\n that.id = json.id || ('' + Date.now()); // Keep id if exists, otherwise create it from timestamp\n that.type = json.type && json.type.toLowerCase();\n that.time = json.time;\n that.hash = json.hash;\n that.read = json.read_signature ? true : false;\n\n that.message = json.reference && messagePrefixes[json.reference.index] ?\n messagePrefixes[json.reference.index] + json.code :\n 'EVENT.' + json.code;\n that.params = json.params;\n\n if (markAsReadCallback && (typeof markAsReadCallback === \"function\") ) {\n that.markAsReadCallback = markAsReadCallback;\n }\n\n function _formatHash(input) {\n return input ? input.substr(0,4) + input.substr(input.length-4) : '';\n }\n\n that.markAsRead = function() {\n if (that.markAsReadCallback) {\n that.markAsReadCallback(that);\n }\n };\n\n var pubkeys, level;\n\n json.code = json.code || '';\n\n // Membership\n if (json.code.startsWith('MEMBER_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-information-circled positive';\n that.state = 'app.view_wallet';\n that.medianTime = that.time;\n }\n\n // TX\n else if (json.code.startsWith('TX_')) {\n that.avatarIcon = 'ion-card';\n that.icon = (json.code === 'TX_SENT') ? 'ion-paper-airplane dark' : 'ion-archive balanced';\n that.medianTime = that.time;\n pubkeys = json.params.length > 0 ? json.params[0] : null;\n if (pubkeys && pubkeys.indexOf(',') == -1) {\n that.pubkey = pubkeys;\n }\n that.state = 'app.view_wallet_tx';\n that.stateParams = {refresh: true};\n }\n\n // Certifications\n else if (json.code.startsWith('CERT_')) {\n that.avatarIcon = (json.code === 'CERT_RECEIVED') ? 'ion-ribbon-b' : 'ion-ribbon-a';\n that.icon = (json.code === 'CERT_RECEIVED') ? 'ion-ribbon-b balanced' : 'ion-ribbon-a gray';\n that.pubkey = json.params.length > 0 ? json.params[0] : null;\n that.medianTime = that.time;\n that.state = 'app.wallet_cert';\n that.stateParams = {\n type: (json.code === 'CERT_RECEIVED') ? 'received' : 'given'\n };\n }\n\n // Message\n else if (json.code.startsWith('MESSAGE_')) {\n that.avatarIcon = 'ion-email';\n that.icon = 'ion-email dark';\n pubkeys = json.params.length > 0 ? json.params[0] : null;\n if (pubkeys && pubkeys.indexOf(',') === -1) {\n that.pubkey = pubkeys;\n }\n that.id = json.reference.id; // Do not care about notification ID, because notification screen use message _id\n }\n\n // user profile record\n else if (json.reference && json.reference.index === 'user' && json.reference.type === 'profile') {\n that.pubkey = json.params.length > 0 ? json.params[0] : null;\n that.state = 'app.user_identity';\n that.stateParams = {\n pubkey: that.pubkey,\n name: json.params && json.params[3],\n };\n if (json.code.startsWith('LIKE_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-ios-heart positive';\n }\n else if (json.code.startsWith('STAR_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-star gray';\n }\n else if (json.code.startsWith('FOLLOW_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-ios-people gray';\n }\n else if (json.code.startsWith('ABUSE_')) {\n that.avatarIcon = 'ion-person';\n that.icon = 'ion-android-warning assertive';\n }\n if (json.code.startsWith('MODERATION_')) {\n that.state = 'app.user_identity';\n that.stateParams = {\n pubkey: json.reference.id,\n name: json.params && json.params[3],\n };\n that.avatarIcon = 'ion-alert-circled';\n that.icon = 'ion-alert-circled energized';\n // If deletion has been asked, change the message\n level = json.params && json.params[4] || 0;\n if (json.code === 'MODERATION_RECEIVED' && level == 5) {\n that.message = 'EVENT.USER.DELETION_RECEIVED';\n that.icon = 'ion-trash-a assertive';\n }\n }\n else {\n that.icon = 'ion-person dark';\n that.state = 'app.view_wallet';\n }\n }\n\n // page record\n else if (json.reference && json.reference.index === 'page') {\n that.pubkey = json.params.length > 0 ? json.params[0] : null;\n that.avatarIcon = 'ion-social-buffer';\n if (json.reference.anchor) {\n that.icon = 'ion-ios-chatbubble-outline dark';\n that.state = 'app.view_page_anchor';\n that.stateParams = {\n id: json.reference.id,\n title: json.params[1],\n anchor: _formatHash(json.reference.anchor)\n };\n }\n else {\n that.icon = 'ion-social-buffer dark';\n that.state = 'app.view_page';\n that.stateParams = {\n id: json.reference.id,\n title: json.params[1]\n };\n }\n\n if (json.code.startsWith('LIKE_')) {\n that.icon = 'ion-ios-heart positive';\n that.state = 'app.user_identity';\n that.stateParams = {\n pubkey: that.pubkey,\n name: json.params && json.params[3],\n };\n }\n else if (json.code.startsWith('FOLLOW_')) {\n that.avatarIcon = 'ion-person';\n that.state = 'app.user_identity';\n that.stateParams = {\n pubkey: that.pubkey,\n name: json.params && json.params[3],\n };\n }\n else if (json.code.startsWith('ABUSE_')) {\n that.icon = 'ion-alert-circled energized';\n that.state = 'app.user_identity';\n that.stateParams = {\n pubkey: that.pubkey,\n name: json.params && json.params[3],\n };\n }\n else if (json.code.startsWith('MODERATION_')) {\n that.avatarIcon = 'ion-alert-circled';\n that.icon = 'ion-alert-circled energized';\n\n // If deletion has been asked, change the message\n level = json.params && json.params[4] || 0;\n if (json.code === 'MODERATION_RECEIVED' && level == 5) {\n that.message = 'EVENT.PAGE.DELETION_RECEIVED';\n that.icon = 'ion-trash-a assertive';\n }\n }\n }\n\n\n // market record\n else if (json.reference && json.reference.index === 'market') {\n that.avatarIcon = 'ion-speakerphone';\n that.pubkey = json.params.length > 0 ? json.params[0] : null;\n if (json.reference.anchor) {\n that.icon = 'ion-ios-chatbubble-outline dark';\n that.state = 'app.market_view_record_anchor';\n that.stateParams = {\n id: json.reference.id,\n title: json.params[2],\n anchor: _formatHash(json.reference.anchor)\n };\n }\n else {\n that.icon = 'ion-speakerphone dark';\n that.state = 'app.market_view_record';\n that.stateParams = {\n id: json.reference.id,\n title: json.params[2]};\n }\n\n if (json.code.startsWith('LIKE_')) {\n that.icon = 'ion-ios-heart positive';\n }\n else if (json.code.startsWith('FOLLOW_')) {\n that.avatarIcon = 'ion-person';\n }\n else if (json.code.startsWith('ABUSE_')) {\n that.icon = 'ion-alert-circled energized';\n }\n else if (json.code.startsWith('MODERATION_')) {\n that.avatarIcon = 'ion-alert-circled';\n that.icon = 'ion-alert-circled energized';\n\n // If deletion has been asked, change the message\n if (json.code === 'MODERATION_RECEIVED' && level == 5) {\n that.message = 'EVENT.MARKET.DELETION_RECEIVED';\n that.icon = 'ion-trash-a assertive';\n }\n }\n\n }\n\n // info message\n else if (json.type === 'INFO') {\n that.avatarIcon = 'ion-information';\n that.icon = 'ion-information-circled positive';\n }\n // warn message\n else if (json.type === 'WARN') {\n that.avatarIcon = 'ion-alert-circled';\n that.icon = 'ion-alert-circled energized';\n }\n // error message\n else if (json.type === 'ERROR') {\n that.avatarIcon = 'ion-close';\n that.icon = 'ion-close-circled assertive';\n }\n\n return that;\n}\n","\nfunction Comment(id, json) {\n\n var that = this;\n\n that.id = id;\n that.message = null; // set in copyFromJson()\n that.html = null; // set in copyFromJson()\n that.issuer = null; // set in copyFromJson()\n that.time = null; // set in copyFromJson()\n that.creationTime = null; // set in copyFromJson()\n that.reply_to = null; // set in copyFromJson()\n\n that.replyCount = 0;\n that.parent = null;\n that.replies = [];\n that.onRemoveListeners = [];\n\n that.copy = function(otherComment) {\n // Mandatory fields\n that.message = otherComment.message;\n that.html = otherComment.html;\n that.issuer = otherComment.issuer;\n that.time = otherComment.time;\n that.creationTime = otherComment.creationTime || that.time; // fill using time, for backward compatibility\n\n // Optional fields\n that.id = otherComment.id || that.id;\n that.reply_to = otherComment.reply_to || that.reply_to;\n that.name = otherComment.name || that.name;\n that.avatarStyle = otherComment.avatarStyle || that.avatarStyle;\n if (otherComment.parent) {\n that.parent = otherComment.parent;\n }\n if (otherComment.replies) that.setReplies(otherComment.replies);\n };\n\n that.copyFromJson = function(json) {\n that.message = json.message;\n that.issuer = json.issuer;\n that.time = json.time;\n that.creationTime = json.creationTime || that.time;\n that.reply_to = json.reply_to;\n };\n\n that.addOnRemoveListener = function(listener) {\n if (listener && (typeof listener === \"function\") ) {\n that.onRemoveListeners.push(listener);\n }\n };\n\n that.cleanAllListeners = function() {\n that.onRemoveListeners = [];\n };\n\n that.setReplies = function(replies) {\n that.removeAllReplies();\n that.addReplies(replies);\n };\n\n that.addReplies = function(replies) {\n if (!replies || !replies.length) return;\n replies = replies.sort(function(cm1, cm2) {\n return (cm1.time - cm2.time);\n });\n _.forEach(replies, function(reply) {\n reply.parent = that;\n that.replies.push(reply);\n });\n that.replyCount += replies.length;\n };\n\n that.containsReply = function(reply) {\n return that.replies.indexOf(reply) != -1;\n };\n\n that.addReply = function(reply) {\n that.replyCount += 1;\n that.replies.push(reply);\n that.replies = that.replies.sort(function(cm1, cm2) {\n return (cm1.time - cm2.time);\n });\n reply.parent = that;\n };\n\n that.removeAllReplies = function() {\n if (that.replyCount) {\n var replies = that.replies.splice(0, that.replies.length);\n that.replyCount = 0;\n _.forEach(replies, function (reply) {\n reply.remove();\n });\n }\n };\n\n that.removeReply = function(replyId) {\n var index = _.findIndex(that.replies, {id: replyId});\n if (index != -1) {\n that.replyCount--;\n var reply = that.replies.splice(index, 1)[0];\n delete reply.parent;\n }\n };\n\n that.remove = function() {\n if (that.parent) {\n that.parent.removeReply(that.id);\n delete that.parent;\n }\n //that.removeAllReplies();\n if (that.onRemoveListeners.length) {\n _.forEach(that.onRemoveListeners, function(listener) {\n listener(that);\n });\n that.issuer = null;\n that.message = null;\n that.cleanAllListeners();\n }\n };\n\n // Init from json\n if (json && typeof json === \"object\") {\n that.copyFromJson(json);\n }\n}\n","\nESPicturesEditController.$inject = ['$scope', 'UIUtils', '$q', 'Device'];\nESSocialsEditController.$inject = ['$scope', '$focus', '$filter', 'UIUtils', 'SocialUtils'];\nESSocialsViewController.$inject = ['$scope'];\nESCommentsController.$inject = ['$scope', '$filter', '$state', '$focus', '$timeout', '$anchorScroll', 'UIUtils'];\nESCategoryModalController.$inject = ['$scope', 'UIUtils', '$timeout', 'parameters'];\nESAvatarModalController.$inject = ['$scope', '$sce'];\nESPositionEditController.$inject = ['$scope', 'csConfig', 'esGeo', 'ModalUtils'];\nESLookupPositionController.$inject = ['$scope', '$q', 'csConfig', 'esGeo', 'ModalUtils'];\nESSearchPositionItemController.$inject = ['$scope', '$timeout', 'UIUtils', 'ModalUtils', 'csConfig', 'esGeo'];\nESSearchPositionModalController.$inject = ['$scope', '$q', '$translate', 'esGeo', 'parameters'];angular.module('cesium.es.common.controllers', ['ngResource', 'cesium.es.services'])\n\n .controller('ESPicturesEditCtrl', ESPicturesEditController)\n\n .controller('ESPicturesEditCtrl', ESPicturesEditController)\n\n .controller('ESSocialsEditCtrl', ESSocialsEditController)\n\n .controller('ESSocialsViewCtrl', ESSocialsViewController)\n\n .controller('ESCommentsCtrl', ESCommentsController)\n\n .controller('ESCategoryModalCtrl', ESCategoryModalController)\n\n .controller('ESAvatarModalCtrl', ESAvatarModalController)\n\n .controller('ESPositionEditCtrl', ESPositionEditController)\n\n .controller('ESLookupPositionCtrl', ESLookupPositionController)\n\n .controller('ESSearchPositionItemCtrl', ESSearchPositionItemController)\n\n .controller('ESSearchPositionModalCtrl', ESSearchPositionModalController)\n;\n\n\nfunction ESPicturesEditController($scope, UIUtils, $q, Device) {\n 'ngInject';\n\n $scope.selectNewPicture = function(inputSelector) {\n if (Device.enable){\n $scope.openPicturePopup();\n }\n else {\n var fileInput = angular.element(document.querySelector(inputSelector||'#pictureFile'));\n if (fileInput && fileInput.length > 0) {\n fileInput[0].click();\n }\n }\n };\n\n $scope.openPicturePopup = function() {\n Device.camera.getPicture()\n .then(function(imageData) {\n $scope.pictures.push({\n src: \"data:image/png;base64,\" + imageData,\n isnew: true // use to prevent visibility hidden (if animation)\n });\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n };\n\n $scope.onFileChanged = function(event) {\n if (!event || !event.file) return;\n UIUtils.loading.show();\n var file = event.file;\n return UIUtils.image.resizeFile(file)\n .then(function(imageData) {\n $scope.pictures.push({\n src: imageData,\n isnew: true // use to prevent visibility hidden (if animation)\n });\n UIUtils.loading.hide(100);\n })\n .catch(function(err) {\n console.error(err);\n UIUtils.loading.hide();\n });\n };\n\n $scope.removePicture = function(index){\n $scope.pictures.splice(index, 1);\n };\n\n $scope.favoritePicture = function(index){\n if (index > 0) {\n var item = $scope.pictures[index];\n $scope.pictures.splice(index, 1);\n $scope.pictures.splice(0, 0, item);\n }\n };\n\n $scope.rotatePicture = function(index){\n var item = $scope.pictures[index];\n UIUtils.image.rotateSrc(item.src)\n .then(function(dataURL){\n item.src = dataURL;\n });\n };\n}\n\n\nfunction ESCategoryModalController($scope, UIUtils, $timeout, parameters) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.allCategories = [];\n $scope.categories = [];\n this.searchText = '';\n\n // modal title\n this.title = parameters && parameters.title;\n\n $scope.afterLoad = function(result) {\n $scope.categories = result;\n $scope.allCategories = result;\n $scope.loading = false;\n $timeout(function() {\n UIUtils.ink();\n }, 10);\n };\n\n this.doSearch = function() {\n var searchText = this.searchText.toLowerCase().trim();\n if (searchText.length > 1) {\n $scope.loading = true;\n $scope.categories = $scope.allCategories.reduce(function(result, cat) {\n if (cat.parent && cat.name.toLowerCase().search(searchText) != -1) {\n return result.concat(cat);\n }\n return result;\n }, []);\n\n $scope.loading = false;\n }\n else {\n $scope.categories = $scope.allCategories;\n }\n };\n\n // load categories\n if (parameters && parameters.categories) {\n $scope.afterLoad(parameters.categories);\n }\n else if (parameters && parameters.load) {\n parameters.load()\n .then(function(res){\n $scope.afterLoad(res);\n });\n }\n\n}\n\n\n\nfunction ESCommentsController($scope, $filter, $state, $focus, $timeout, $anchorScroll, UIUtils) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.defaultCommentSize = 5;\n $scope.formData = {};\n $scope.comments = {};\n\n $scope.$on('$recordView.enter', function(e, state) {\n // First enter\n if ($scope.loading) {\n $scope.anchor = state && state.stateParams.anchor;\n }\n // second call (when using cached view)\n else if ($scope.id) {\n $scope.load($scope.id, {animate: false});\n }\n });\n\n $scope.$on('$recordView.load', function(event, id, service) {\n $scope.id = id || $scope.id;\n $scope.service = service.comment || $scope.service;\n if (!$scope.service) {\n console.error(\"[ES] [comment] Missing service in the emitted event '$recordView.load' !\");\n return; // Skip\n }\n console.debug(\"[ES] [comment] Will use {\" + $scope.service.index + \"} service\");\n if ($scope.id) {\n $scope.load($scope.id)\n .then(function() {\n if (!$scope.anchor) return;\n // Scroll to anchor\n return $timeout($scope.scrollToAnchor, 500);\n });\n }\n });\n\n $scope.load = function(id, options) {\n options = options || {};\n options.from = options.from || 0;\n // If anchor has been defined, load all comments\n options.size = options.size || ($scope.anchor && -1/*all*/);\n options.size = options.size || $scope.defaultCommentSize;\n options.animate = angular.isDefined(options.animate) ? options.animate : true;\n options.loadAvatarAllParent = angular.isDefined(options.loadAvatarAllParent) ? options.loadAvatarAllParent : true;\n $scope.loading = true;\n return $scope.service.load(id, options)\n .then(function(data) {\n if (!options.animate && data.result.length) {\n _.forEach(data.result, function(cmt) {\n cmt.isnew = true;\n });\n }\n $scope.comments = data;\n $scope.comments.hasMore = (data.total > data.result.length);\n $scope.loading = false;\n $scope.service.changes.start(id, data, $scope);\n\n // Set Motion\n $scope.motion.show({\n selector: '.comments .item',\n ink: false\n });\n });\n };\n\n $scope.$on('$recordView.beforeLeave', function(){\n if ($scope.comments) {\n if (!$scope.service) {\n console.error('[comment] Comment controller has no service ! Unable to listen changes...');\n return;\n }\n $scope.service.changes.stop($scope.comments);\n }\n });\n\n $scope.scrollToAnchor = function() {\n if (!$scope.anchor) return;\n var elemList = document.getElementsByName($scope.anchor);\n // Waiting for the element\n if (!elemList || !elemList.length) {\n return $timeout($scope.scrollToAnchor, 500);\n }\n // If many, remove all anchor except the last one\n for (var i = 0; i<elemList.length-1; i++) {\n angular.element(elemList[i]).remove();\n }\n // Scroll to the anchor\n $anchorScroll($scope.anchor);\n // Remove the anchor. This will the CSS class 'positive-100-bg' on the comment\n $timeout(function () {\n $scope.anchor = null;\n }, 1500);\n };\n\n $scope.showMore = function(){\n var from = 0;\n var size = -1;\n $scope.load($scope.id, {from: from, size: size, loadAvatarAllParent: false})\n .then(function() {\n // Set Motion\n $scope.motion.show({\n selector: '.card-avatar'\n });\n });\n };\n\n $scope.onKeypress = function(event) {\n // If Ctrl + Enter: submit\n if (event && event.charCode == 10 && event.ctrlKey) {\n $scope.save();\n event.preventDefault();\n }\n };\n\n $scope.save = function() {\n if (!$scope.formData.message || !$scope.formData.message.length) return;\n\n $scope.loadWallet({minData: true, auth: true})\n .then(function() {\n UIUtils.loading.hide();\n var comment = $scope.formData;\n $scope.formData = {};\n $scope.focusNewComment();\n return $scope.service.save($scope.id, $scope.comments, comment);\n })\n .then(function() {\n $scope.comments.total++;\n })\n .catch(UIUtils.onError('COMMENTS.ERROR.FAILED_SAVE_COMMENT'));\n };\n\n $scope.share = function(event, comment) {\n var params = angular.copy($state.params);\n var stateUrl;\n if (params.anchor) {\n params.anchor= $filter('formatHash')(comment.id);\n stateUrl = $state.href($state.current.name, params, {absolute: true});\n }\n else {\n stateUrl = $state.href($state.current.name, params, {absolute: true}) + '/' + $filter('formatHash')(comment.id);\n }\n var index = _.findIndex($scope.comments.result, {id: comment.id});\n var url = stateUrl + '?u=' + (comment.name||$filter('formatPubkey')(comment.issuer));\n UIUtils.popover.show(event, {\n templateUrl: 'templates/common/popover_share.html',\n scope: $scope,\n bindings: {\n titleKey: 'COMMENTS.POPOVER_SHARE_TITLE',\n titleValues: {number: index ? index + 1 : 1},\n date: comment.creationTime,\n value: url,\n postUrl: stateUrl,\n postMessage: comment.message\n },\n autoselect: '.popover-share input'\n });\n };\n\n $scope.edit = function(comment) {\n var newComment = new Comment();\n newComment.copy(comment);\n $scope.formData = newComment;\n };\n\n $scope.remove = function(comment) {\n if (!comment) {return;}\n comment.remove();\n $scope.comments.total--;\n };\n\n $scope.reply = function(parent) {\n if (!parent || !parent.id) {return;}\n\n $scope.formData = {\n parent: parent\n };\n\n $scope.focusNewComment(true);\n };\n\n $scope.cancel = function() {\n $scope.formData = {};\n $scope.focusNewComment();\n };\n\n $scope.focusNewComment = function(forceIfSmall) {\n if (!UIUtils.screen.isSmall()) {\n $focus('comment-form-textarea');\n }\n else {\n if (forceIfSmall) $focus('comment-form-input');\n }\n };\n\n $scope.removeParentLink = function() {\n delete $scope.formData.parent;\n delete $scope.formData.reply_to;\n $scope.focusNewComment();\n };\n\n $scope.toggleExpandedReplies = function(comment, index) {\n comment.expandedReplies = comment.expandedReplies || {};\n comment.expandedReplies[index] = !comment.expandedReplies[index];\n };\n\n $scope.toggleExpandedParent = function(comment, index) {\n comment.expandedParent = comment.expandedParent || {};\n comment.expandedParent[index] = !comment.expandedParent[index];\n };\n}\n\nfunction ESSocialsEditController($scope, $focus, $filter, UIUtils, SocialUtils) {\n 'ngInject';\n\n $scope.socialData = {\n url: null,\n reorder: false\n };\n\n $scope.addSocialNetwork = function() {\n if (!$scope.socialData.url || $scope.socialData.url.trim().length === 0) {\n return;\n }\n\n $scope.formData.socials = $scope.formData.socials || [];\n var url = $scope.socialData.url.trim();\n\n var exists = _.findWhere($scope.formData.socials, {url: url});\n if (exists) { // duplicate entry\n $scope.socialData.url = '';\n return;\n }\n\n var social = SocialUtils.get(url);\n if (!social) {\n UIUtils.alert.error('PROFILE.ERROR.INVALID_SOCIAL_NETWORK_FORMAT');\n $focus('socialUrl');\n return; // stop here\n }\n $scope.formData.socials.push(social);\n $scope.socialData.url = '';\n\n // Set Motion\n $scope.motion.show({\n selector: '#social-' + $filter('formatSlug')(social.url),\n startVelocity: 10000\n });\n };\n\n $scope.editSocialNetwork = function(index) {\n var social = $scope.formData.socials[index];\n $scope.formData.socials.splice(index, 1);\n $scope.socialData.url = social.url;\n $focus('socialUrl');\n };\n\n $scope.reorderSocialNetwork = function(social, fromIndex, toIndex) {\n if (!social || fromIndex === toIndex) return; // no changes\n $scope.formData.socials.splice(fromIndex, 1);\n $scope.formData.socials.splice(toIndex, 0, social);\n };\n\n $scope.filterFn = function(social) {\n return !social.recipient || social.valid;\n };\n}\n\nfunction ESSocialsViewController($scope) {\n 'ngInject';\n\n $scope.openSocial = function(event, social) {\n event.stopPropagation();\n return $scope.openLink(event, social.url, {\n type: social.type\n });\n };\n\n $scope.filterFn = function(social) {\n return !social.recipient || social.valid;\n };\n\n}\n\n\n\nfunction ESAvatarModalController($scope, $sce) {\n\n $scope.formData = {\n initCrop: false,\n imageCropStep: 0,\n imgSrc: undefined,\n result: undefined,\n resultBlob: undefined\n };\n\n $scope.onFileChanged = function(event) {\n if (!event || !event.file) return; // Skip\n\n var fileReader = new FileReader();\n fileReader.readAsDataURL(event.file);\n\n fileReader.onload = function(e) {\n var res = this.result;\n $scope.$applyAsync(function() {\n $scope.formData.imgSrc = $sce.getTrustedHtml(res);\n });\n };\n };\n\n $scope.doNext = function() {\n if ($scope.formData.imageCropStep === 2) {\n $scope.doCrop();\n }\n else if ($scope.formData.imageCropStep === 3) {\n $scope.closeModal($scope.formData.result);\n }\n };\n\n $scope.doPrevious = function() {\n $scope.formData.imageCropStep -= 1;\n // Reset the image\n if ($scope.formData.imageCropStep === 1) {\n $scope.formData.imgSrc = undefined;\n }\n };\n\n $scope.doCrop = function() {\n $scope.formData.initCrop = true;\n };\n\n $scope.clear = function() {\n $scope.formData = {\n initCrop: false,\n imageCropStep: 1,\n imgSrc: undefined,\n result: undefined,\n resultBlob: undefined\n };\n };\n\n}\n\n\nfunction ESPositionEditController($scope, csConfig, esGeo, ModalUtils) {\n 'ngInject';\n\n // The default country used for address localisation\n var defaultCountry = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.defaultCountry;\n\n var loadingCurrentPosition = false;\n $scope.options = $scope.options || {};\n $scope.options.position = $scope.options.position || {\n showCheckbox: true,\n required: false\n };\n $scope.formPosition = {\n loading: false,\n enable: angular.isDefined($scope.options.position.required) ? $scope.options.position.required : false\n };\n $scope.searchModalOpened = false;\n\n $scope.tryToLocalize = function() {\n if ($scope.formPosition.loading || loadingCurrentPosition) return;\n\n var searchText = $scope.getAddressToSearch();\n\n // No address, so try to localize by device\n if (!searchText) {\n loadingCurrentPosition = true;\n return esGeo.point.current()\n .then($scope.updateGeoPoint)\n .then(function() {\n loadingCurrentPosition = false;\n })\n .catch(function(err) {\n console.error(err); // Silent\n loadingCurrentPosition = false;\n });\n }\n\n $scope.formPosition.loading = true;\n return esGeo.point.searchByAddress(searchText)\n .then(function(res) {\n if (res && res.length === 1) {\n return $scope.updateGeoPoint(res[0]);\n }\n return $scope.openSearchLocationModal({\n text: searchText,\n results: res||[],\n forceFallback: !res || !res.length // force fallback search first\n });\n })\n .then(function() {\n $scope.formPosition.loading = false;\n })\n .catch(function(err) {\n console.error(err); // Silent\n $scope.formPosition.loading = false;\n });\n };\n\n $scope.onCityChanged = function() {\n if ($scope.loading) return;\n if ($scope.formPosition.enable) {\n if ($scope.formData.geoPoint) {\n // Invalidate the position\n $scope.formData.geoPoint.lat = undefined;\n $scope.formData.geoPoint.lon = undefined;\n }\n return $scope.tryToLocalize();\n }\n };\n\n $scope.onUseGeopointChanged = function() {\n if ($scope.loading) return;\n if (!$scope.formPosition.enable) {\n if ($scope.formData.geoPoint) {\n $scope.formData.geoPoint.lat = undefined;\n $scope.formData.geoPoint.lon = undefined;\n $scope.dirty = true;\n }\n }\n else {\n $scope.tryToLocalize();\n }\n };\n\n $scope.onGeopointChanged = function() {\n if ($scope.loading) {\n $scope.formPosition.enable = $scope.formData.geoPoint && !!$scope.formData.geoPoint.lat && !!$scope.formData.geoPoint.lon;\n }\n };\n $scope.$watch('formData.geoPoint', $scope.onGeopointChanged);\n\n $scope.getAddressToSearch = function() {\n return $scope.formData.address && $scope.formData.city ?\n [$scope.formData.address.trim(), $scope.formData.city.trim()].join(', ') :\n $scope.formData.city || $scope.formData.address || $scope.formData.location ;\n };\n\n $scope.updateGeoPoint = function(res) {\n // user cancel\n if (!res || !res.lat || !res.lon) {\n // nothing to do\n return;\n }\n\n $scope.dirty = true;\n $scope.formData.geoPoint = $scope.formData.geoPoint || {};\n $scope.formData.geoPoint.lat = parseFloat(res.lat);\n $scope.formData.geoPoint.lon = parseFloat(res.lon);\n\n if (res.address && res.address.city) {\n var cityParts = [res.address.city];\n if (res.address.postcode) {\n cityParts.push(res.address.postcode);\n }\n if (res.address.country !== defaultCountry) {\n cityParts.push(res.address.country);\n }\n $scope.formData.city = cityParts.join(', ');\n }\n };\n\n /* -- modal -- */\n\n $scope.openSearchLocationModal = function(options) {\n\n if ($scope.searchModalOpened) return; // Skip\n\n $scope.searchModalOpened = true;\n options = options || {};\n\n var parameters = {\n text: options.text || $scope.getAddressToSearch(),\n results: options.results,\n fallbackText: options.fallbackText || $scope.formData.city,\n forceFallback: angular.isDefined(options.forceFallback) ? options.forceFallback : undefined\n };\n\n return ModalUtils.show(\n 'plugins/es/templates/common/modal_location.html',\n 'ESSearchPositionModalCtrl',\n parameters,\n {\n focusFirstInput: true\n }\n )\n .then(function(res) {\n $scope.searchModalOpened = false;\n $scope.updateGeoPoint(res);\n })\n .catch(function(err) {\n console.error(err);\n $scope.searchModalOpened = false;\n });\n };\n}\n\n\nfunction ESLookupPositionController($scope, $q, csConfig, esGeo, ModalUtils) {\n 'ngInject';\n\n // The default country used for address localisation\n var defaultCountry = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.defaultCountry;\n var loadingPosition = false;\n\n $scope.geoDistanceLabels = [5,10,20,50,100,250,500].reduce(function(res, distance){\n res[distance] = {\n labelKey: 'LOCATION.DISTANCE_OPTION',\n labelParams: {value: distance}\n };\n return res;\n }, {});\n $scope.geoDistances = _.keys($scope.geoDistanceLabels);\n\n $scope.searchPosition = function(searchText) {\n if (loadingPosition) return $q.when();\n\n loadingPosition = true;\n\n // No address, so try to localize by device\n var promise = !searchText ?\n esGeo.point.current() :\n esGeo.point.searchByAddress(searchText)\n .then(function(res) {\n if (res && res.length === 1) {\n res[0].exact = true;\n return res[0];\n }\n return $scope.openSearchLocationModal({\n text: searchText,\n results: res||[],\n forceFallback: !res || !res.length // force fallback search first\n })\n .then(function(res) {\n // Compute point name\n if (res && res.address && res.address.city) {\n var cityParts = [res.address.city];\n if (res.address.postcode) {\n cityParts.push(res.address.postcode);\n }\n if (res.address.country !== defaultCountry) {\n cityParts.push(res.address.country);\n }\n res.shortName = cityParts.join(', ');\n }\n return res;\n });\n });\n\n promise\n .then(function(res) {\n\n loadingPosition = false;\n\n // user cancel\n if (!res || !res.lat || !res.lon) return;\n\n return {\n lat: parseFloat(res.lat),\n lon: parseFloat(res.lon),\n name: res.shortName,\n exact: res.exact\n };\n\n })\n .catch(function(err) {\n console.error(err); // Silent\n loadingPosition = false;\n });\n\n return promise;\n };\n\n\n /* -- modal -- */\n\n $scope.openSearchLocationModal = function(options) {\n\n options = options || {};\n\n var parameters = {\n text: options.text || $scope.getAddressToSearch(),\n results: options.results,\n fallbackText: options.fallbackText || $scope.search.location,\n forceFallback: angular.isDefined(options.forceFallback) ? options.forceFallback : undefined\n };\n\n return ModalUtils.show(\n 'plugins/es/templates/common/modal_location.html',\n 'ESSearchPositionModalCtrl',\n parameters,\n {\n focusFirstInput: true\n //,scope: $scope\n }\n );\n };\n}\n\nfunction ESSearchPositionItemController($scope, $timeout, UIUtils, ModalUtils, csConfig, esGeo) {\n 'ngInject';\n\n // The default country used for address localisation\n var defaultCountry = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.defaultCountry;\n\n var loadingPosition = false;\n var minLength = 3;\n $scope.locations = undefined;\n $scope.selectLocationIndex = -1;\n\n $scope.onKeydown = function(e) {\n\n switch(e.keyCode)\n {\n case 27://Esc\n $scope.hideDropdown();\n break;\n case 13://Enter\n if($scope.locations && $scope.locations.length)\n $scope.onEnter();\n break;\n case 38://Up\n $scope.onArrowUpOrDown(-1);\n e.preventDefault();\n break;\n case 40://Down\n $scope.onArrowUpOrDown(1);\n e.preventDefault();\n break;\n case 8://Backspace\n case 45://Insert\n case 46://Delete\n break;\n case 37://Left\n case 39://Right\n case 16://Shift\n case 17://Ctrl\n case 35://End\n case 36://Home\n break;\n default://All keys\n $scope.showDropdown();\n }\n };\n\n $scope.onEnter = function() {\n if ($scope.selectLocationIndex > -1) {\n $scope.selectLocation($scope.locations[$scope.selectLocationIndex]);\n }\n else {\n $scope.selectLocation($scope.locations[0]);\n }\n };\n\n $scope.onArrowUpOrDown = function(velocity) {\n if (!$scope.locations) return;\n\n $scope.selectLocationIndex+=velocity;\n if ($scope.selectLocationIndex >= $scope.locations.length) {\n $scope.selectLocationIndex = 0;\n }\n if ($scope.selectLocationIndex < 0) {\n $scope.selectLocationIndex = $scope.locations.length-1;\n }\n\n _.forEach($scope.locations||[], function(item, index) {\n item.selected = (index === $scope.selectLocationIndex);\n });\n\n // TODO: scroll to item ?\n };\n\n $scope.onLocationChanged = function() {\n if (loadingPosition || $scope.search.loading) return;\n $scope.search.geoPoint = undefined; // reset geo point\n\n $scope.showDropdown();\n };\n\n $scope.showDropdown = function() {\n var text = $scope.search.location && $scope.search.location.trim();\n if (!text || text.length < minLength) {\n return $scope.hideDropdown(true/*force, if still loading*/);\n }\n\n // Compute a request id, to apply response only if current request\n var requestId = ($scope.requestId && $scope.requestId + 1) || 1;\n $scope.requestId = requestId;\n\n loadingPosition = true;\n\n // Execute the given query\n return esGeo.point.searchByAddress(text)\n .then(function(res) {\n if ($scope.requestId !== requestId) return; // Skip apply if not same request:\n\n loadingPosition = false;\n $scope.locations = res||[];\n $scope.license = res && res.length && res[0].license;\n })\n .catch(function(err) {\n $scope.hideDropdown();\n throw err;\n });\n };\n\n $scope.hideDropdown = function(force) {\n // force, even if still loading\n if (force) {\n $scope.locations = undefined;\n $scope.selectLocationIndex = -1;\n $scope.license = undefined;\n loadingPosition = false;\n return;\n }\n\n return $timeout(function() {\n if (loadingPosition) return;\n $scope.locations = undefined;\n $scope.license = undefined;\n loadingPosition = false;\n }, 500);\n };\n\n $scope.selectLocation = function(res, exactMatch) {\n loadingPosition = true; // avoid event\n if (res) {\n // Update position\n $scope.search.geoPoint = $scope.search.geoPoint || {};\n $scope.search.geoPoint.lat = parseFloat(res.lat);\n $scope.search.geoPoint.lon = parseFloat(res.lon);\n\n if (exactMatch) {\n $scope.search.geoPoint.exact = true;\n }\n else {\n // Update location name\n if (res && res.address && res.address.city) {\n var cityParts = [res.address.city];\n if (res.address.postcode) {\n cityParts.push(res.address.postcode);\n }\n if (res.address.country !== defaultCountry) {\n cityParts.push(res.address.country);\n }\n $scope.search.location = cityParts.join(', ');\n }\n }\n }\n\n $scope.hideDropdown(true);\n };\n\n /* -- modal -- */\n\n $scope.openSearchLocationModal = function(options) {\n\n options = options || {\n text: $scope.search.location\n };\n\n var parameters = {\n text: options.text || $scope.search.location\n };\n\n return ModalUtils.show(\n 'plugins/es/templates/common/modal_location.html',\n 'ESSearchPositionModalCtrl',\n parameters,\n {\n focusFirstInput: true\n })\n .then($scope.selectLocation);\n };\n\n /* -- popover -- */\n\n $scope.showDistancePopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/common/popover_distances.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.selectDistance = function(value) {\n $scope.search.geoDistance = value;\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n };\n\n}\n\nfunction ESSearchPositionModalController($scope, $q, $translate, esGeo, parameters) {\n 'ngInject';\n\n $scope.search = {\n text: parameters.text || '',\n fallbackText: parameters.fallbackText || undefined,\n forceFallback: angular.isDefined(parameters.forceFallback) ? parameters.forceFallback : false,\n loading: false,\n results: parameters.results || undefined\n };\n\n $scope.$on('modal.shown', function() {\n // Load search\n $scope.doSearch(true/*first search*/);\n });\n\n $scope.doSearch = function(firstSearch) {\n\n var text = $scope.search.text && $scope.search.text.trim();\n if (!text) {\n return $q.when(); // nothing to search\n }\n\n $scope.search.loading = true;\n\n // Compute alternative query text\n var fallbackText = firstSearch && $scope.search.fallbackText && $scope.search.fallbackText.trim();\n fallbackText = fallbackText && fallbackText !== text ? fallbackText : undefined;\n\n // Execute the given query\n return ((firstSearch && $scope.search.forceFallback && $scope.search.results) ?\n $q.when($scope.search.results) :\n esGeo.point.searchByAddress(text)\n )\n .then(function(res) {\n if (res && res.length || !fallbackText) return res;\n\n // Fallback search\n return $q.all([\n $translate('LOCATION.MODAL.ALTERNATIVE_RESULT_DIVIDER', {address: fallbackText}),\n esGeo.point.searchByAddress(fallbackText)\n ])\n .then(function (res) {\n var dividerText = res[0];\n res = res[1];\n if (!res || !res.length) return res;\n\n return [{name: dividerText}].concat(res);\n });\n })\n .then(function(res) {\n $scope.search.loading = false;\n $scope.search.results = res||[];\n\n $scope.license = res && res.length && res[0].license;\n })\n .catch(function(err) {\n $scope.search.loading = false;\n $scope.search.results = [];\n $scope.license = undefined;\n throw err;\n })\n ;\n };\n\n}\n","\nESLikesController.$inject = ['$scope', '$q', '$timeout', '$translate', '$ionicPopup', 'UIUtils', 'csWallet', 'esHttp', 'esLike'];angular.module('cesium.es.like.controllers', ['ngResource', 'cesium.es.services'])\n\n .controller('ESLikesCtrl', ESLikesController)\n;\n\nfunction ESLikesController($scope, $q, $timeout, $translate, $ionicPopup, UIUtils,\n csWallet, esHttp, esLike) {\n 'ngInject';\n\n $scope.entered = false;\n $scope.abuseData = {};\n $scope.abuseLevels = [\n {value: 1, label: 'LOW'},\n {value: 2, label: 'LOW'}\n ];\n $scope.staring = false;\n $scope.options = $scope.options || {};\n $scope.options.like = $scope.options.like || {\n kinds: esLike.constants.KINDS,\n index: undefined,\n type: undefined,\n id: undefined\n };\n\n $scope.$on('$recordView.enter', function(e, state) {\n // First enter\n if (!$scope.entered) {\n $scope.entered = false;\n // Nothing to do: main controller will trigger '$recordView.load' event\n }\n // second call (e.g. if cache)\n else if ($scope.likeData.id) {\n $scope.loadLikes($scope.likeData.id);\n }\n });\n\n $scope.$on('$recordView.load', function(event, id) {\n $scope.likeData.id = id || $scope.likeData.id;\n if ($scope.likeData.id) {\n $scope.loadLikes($scope.likeData.id);\n }\n });\n\n // Init Like service\n $scope.initLikes = function() {\n if (!$scope.likeData) {\n throw Error(\"Missing 'likeData' in scope. Cannot load likes counter\");\n }\n if (!$scope.options.like.service) {\n if (!$scope.options.like.index || !$scope.options.like.type) {\n throw Error(\"Missing 'options.like.index' or 'options.like.type' in scope. Cannot load likes counter\");\n }\n $scope.options.like.service = esLike.instance($scope.options.like.index, $scope.options.like.type);\n }\n if (!$scope.options.like.kinds) {\n // Get scope's kinds (e.g. defined in the parent scope)\n $scope.options.like.kinds = _.filter(esLike.constants.KINDS, function (kind) {\n var key = kind.toLowerCase() + 's';\n return angular.isDefined($scope.likeData[key]);\n });\n }\n };\n\n $scope.loadLikes = function(id) {\n if ($scope.likeData.loading) return;// Skip\n\n id = id || $scope.likeData.id;\n $scope.initLikes();\n\n var kinds = $scope.options.like.kinds || [];\n if (!kinds.length) return; // skip\n\n $scope.likeData.loading = true;\n var now = Date.now();\n console.debug(\"[ES] Loading counter of {0}... ({1})\".format(id.substring(0,8), kinds));\n\n return $q.all(_.map(kinds, function(kind) {\n var key = kind.toLowerCase() + 's';\n return $scope.options.like.service.count(id, {issuer: csWallet.isLogin() ? csWallet.data.pubkey : undefined, kind: kind})\n .then(function (res) {\n // Store result to scope\n if ($scope.likeData[key]) {\n angular.merge($scope.likeData[key], res);\n }\n });\n }))\n .then(function () {\n $scope.likeData.id = id;\n console.debug(\"[ES] Loading counter of {0} [OK] in {1}ms\".format(id.substring(0,8), Date.now()-now));\n\n if (_.contains(kinds, 'VIEW') && !$scope.canEdit) {\n $scope.markAsView();\n }\n\n // Publish to parent scope (to be able to use it in action popover's buttons)\n if ($scope.$parent) {\n console.debug(\"[ES] [likes] Adding data and functions to parent scope\");\n $scope.$parent.toggleLike = $scope.toggleLike;\n $scope.$parent.reportAbuse = $scope.reportAbuse;\n }\n\n $scope.likeData.loading = false;\n })\n .catch(function (err) {\n console.error(err && err.message || err);\n $scope.likeData.loading = false;\n });\n };\n\n $scope.markAsView = function() {\n if (!$scope.likeData || !$scope.likeData.views || $scope.likeData.views.wasHit) return; // Already view\n var canEdit = $scope.canEdit || $scope.formData && csWallet.isUserPubkey($scope.formData.issuer);\n if (canEdit) return; // User is the record's issuer: skip\n\n var timer = $timeout(function() {\n if (csWallet.isLogin()) {\n $scope.options.like.service.add($scope.likeData.id, {kind: 'view'}).then(function() {\n $scope.likeData.views.total = ($scope.likeData.views.total||0) + 1;\n });\n }\n timer = null;\n }, 3000);\n\n $scope.$on(\"$destroy\", function() {\n if (timer) $timeout.cancel(timer);\n });\n };\n\n $scope.toggleLike = function(event, options) {\n $scope.initLikes();\n if (!$scope.likeData.id) throw Error(\"Missing 'likeData.id' in scope. Cannot apply toggle\");\n\n options = options || {};\n options.kind = options.kind && options.kind.toUpperCase() || 'LIKE';\n var key = options.kind.toLowerCase() + 's';\n\n $scope.likeData[key] = $scope.likeData[key] || {};\n\n // Avoid too many call\n if ($scope.likeData[key].loading === true || $scope.likeData.loading) {\n event.preventDefault();\n return $q.reject();\n }\n\n // Like/dislike should be inversed\n if (options.kind === 'LIKE' && $scope.dislikes && $scope.dislikes.wasHit) {\n return $scope.toggleLike(event, {kind: 'dislike'})\n .then(function() {\n $scope.toggleLike(event, options);\n });\n }\n else if (options.kind === 'DISLIKE' && $scope.likes && $scope.likes.wasHit) {\n return $scope.toggleLike(event, {kind: 'LIKE'})\n .then(function() {\n $scope.toggleLike(event, options);\n });\n }\n\n $scope.likeData[key].loading = true;\n\n // Make sure user is log in\n return (csWallet.isLogin() ? $q.when() : $scope.loadWallet({minData: true}))\n .then(function() {\n // Apply like\n return $scope.options.like.service.toggle($scope.likeData.id, options);\n })\n .then(function(delta) {\n UIUtils.loading.hide();\n if (delta !== 0) {\n $scope.likeData[key].total = ($scope.likeData[key].total || 0) + delta;\n $scope.likeData[key].wasHit = delta > 0;\n }\n $timeout(function() {\n $scope.likeData[key].loading = false;\n }, 1000);\n })\n .catch(function(err) {\n console.error(err);\n $scope.likeData[key].loading = false;\n UIUtils.loading.hide();\n event.preventDefault();\n });\n };\n\n $scope.setAbuseForm = function(form) {\n $scope.abuseForm = form;\n };\n\n $scope.showAbuseCommentPopover = function(event) {\n return $translate(['COMMON.REPORT_ABUSE.TITLE', 'COMMON.REPORT_ABUSE.SUB_TITLE','COMMON.BTN_SEND', 'COMMON.BTN_CANCEL'])\n .then(function(translations) {\n\n UIUtils.loading.hide();\n\n return $ionicPopup.show({\n templateUrl: 'plugins/es/templates/common/popup_report_abuse.html',\n title: translations['COMMON.REPORT_ABUSE.TITLE'],\n subTitle: translations['COMMON.REPORT_ABUSE.SUB_TITLE'],\n cssClass: 'popup-report-abuse',\n scope: $scope,\n buttons: [\n {\n text: translations['COMMON.BTN_CANCEL'],\n type: 'button-stable button-clear gray'\n },\n {\n text: translations['COMMON.BTN_SEND'],\n type: 'button button-positive ink',\n onTap: function(e) {\n $scope.abuseForm.$submitted=true;\n if(!$scope.abuseForm.$valid || !$scope.abuseData.comment) {\n //don't allow the user to close unless he enters a reason\n e.preventDefault();\n } else {\n return $scope.abuseData;\n }\n }\n }\n ]\n });\n })\n .then(function(res) {\n $scope.abuseData = {};\n if (!res || !res.comment) { // user cancel\n UIUtils.loading.hide();\n return undefined;\n }\n return res;\n });\n };\n\n\n $scope.reportAbuse = function(event, options) {\n if ($scope.likeData && $scope.likeData.abuses && $scope.likeData.abuses.wasHit) return; // Abuse already reported\n\n options = options || {};\n\n if (!options.comment) {\n return (csWallet.isLogin() ? $q.when() : $scope.loadWallet({minData: true}))\n // Ask a comment\n .then(function() {\n return $scope.showAbuseCommentPopover(event);\n })\n // Loop, with options.comment filled\n .then(function(res) {\n if (!res || !res.comment) return; // Empty comment: skip\n options.comment = res.comment;\n options.level = res.level || (res.delete && 5) || undefined;\n return $scope.reportAbuse(event, options); // Loop, with the comment\n });\n }\n\n // Send abuse report\n options.kind = 'ABUSE';\n return $scope.toggleLike(event, options)\n .then(function() {\n UIUtils.toast.show('COMMON.REPORT_ABUSE.CONFIRM.SENT');\n });\n };\n\n\n $scope.addStar = function(level) {\n if ($scope.starsPopover) {\n return $scope.starsPopover.hide()\n .then(function() {\n $scope.starsPopover = null;\n $scope.addStar(level); // Loop\n });\n }\n if ($scope.likeData.loading || !$scope.likeData.stars || $scope.likeData.stars.loading) return; // Avoid multiple call\n\n if (!csWallet.isLogin()) {\n return $scope.loadWallet({minData: true})\n .then(function(walletData) {\n if (!walletData) return; // skip\n UIUtils.loading.show();\n // Reload the counter, to known if user already has\n return $scope.options.like.service.count($scope.likeData.id, {issuer: walletData.pubkey, kind: 'STAR'})\n .then(function(stars) {\n angular.merge($scope.stars, stars);\n $scope.addStar(level); // Loop\n });\n })\n .catch(function(err) {\n if (err === 'CANCELLED') return; // User cancelled\n // Refresh current like\n });\n }\n\n $scope.likeData.stars.loading = true;\n var stars = angular.merge(\n {total: 0, levelAvg: 0, levelSum: 0, level: 0, wasHit: false, wasHitId: undefined},\n $scope.likeData.stars);\n\n var successFunction = function() {\n stars.wasHit = true;\n stars.level = level;\n // Compute AVG (round to near 0.5)\n stars.levelAvg = Math.floor((stars.levelSum / stars.total + 0.5) * 10) / 10 - 0.5;\n // Update the star level\n angular.merge($scope.likeData.stars, stars);\n UIUtils.loading.hide();\n };\n\n // Already hit: remove previous star, before inserted a new one\n if (stars.wasHitId) {\n console.debug(\"[ES] Deleting previous star level... \" + stars.wasHitId);\n return $scope.options.like.service.remove(stars.wasHitId)\n .catch(function(err) {\n // Not found, so continue\n if (err && err.ucode === 404) return;\n else throw err;\n })\n .then(function() {\n console.debug(\"[ES] Deleting previous star level [OK]\");\n stars.levelSum = stars.levelSum - stars.level + level;\n successFunction();\n // Add the star (after a delay, to make sure deletion has been executed)\n return $timeout(function() {\n console.debug(\"[ES] Sending new star level...\");\n return $scope.options.like.service.add($scope.likeData.id, {kind: 'star', level: level || 1});\n }, 2000);\n })\n .then(function(newHitId) {\n stars.wasHitId = newHitId;\n console.debug(\"[ES] Star level successfully sent... \" + newHitId);\n UIUtils.loading.hide();\n return $timeout(function() {\n $scope.likeData.stars.loading = false;\n }, 1000);\n })\n .catch(function(err) {\n console.error(err && err.message || err);\n $scope.likeData.stars.loading = false;\n UIUtils.onError('MARKET.WOT.ERROR.FAILED_STAR_PROFILE')(err);\n // Reload, to force refresh state\n $scope.loadLikes();\n });\n }\n\n return $scope.options.like.service.add($scope.likeData.id, {kind: 'star', level: level || 1})\n .then(function(newHitId) {\n stars.levelSum += level;\n stars.wasHitId = newHitId;\n stars.total += 1;\n successFunction();\n console.debug(\"[ES] Star level successfully sent... \" + newHitId);\n $scope.likeData.stars.loading = false;\n UIUtils.loading.hide();\n })\n .catch(function(err) {\n console.error(err && err.message || err);\n $scope.likeData.stars.loading = false;\n UIUtils.onError('MARKET.WOT.ERROR.FAILED_STAR_PROFILE')(err);\n });\n };\n\n $scope.removeStar = function(event) {\n if ($scope.starsPopover) $scope.starsPopover.hide();\n if ($scope.likeData.loading) return; // Skip\n $scope.likeData.stars.level = undefined;\n $scope.toggleLike(event, {kind: 'star'})\n .then(function() {\n return $timeout(function() {\n $scope.loadLikes(); // refresh\n }, 1000);\n });\n\n };\n\n $scope.showStarPopover = function(event) {\n $scope.initLikes();\n if ($scope.likeData.stars.loading) return; // Avoid multiple call\n\n if (angular.isUndefined($scope.likeData.stars.level)) {\n $scope.likeData.stars.level = 0;\n }\n\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/common/popover_star.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.starsPopover = popover;\n }\n });\n };\n\n csWallet.api.data.on.reset($scope, function() {\n _.forEach($scope.options.like.kinds||[], function(kind) {\n var key = kind.toLowerCase() + 's';\n if ($scope.likeData[key]) {\n $scope.likeData[key].wasHit = false;\n $scope.likeData[key].wasHitId = undefined;\n $scope.likeData[key].level = undefined;\n }\n });\n $scope.$broadcast('$$rebind::like'); // notify binder\n }, this);\n\n}\n","\nESExtensionController.$inject = ['$scope', 'esSettings', 'PluginService'];\nESJoinController.$inject = ['$scope', 'esSettings', 'PluginService'];\nESMenuExtendController.$inject = ['$scope', '$state', 'PluginService', 'esSettings', 'UIUtils'];\nESProfilePopoverExtendController.$inject = ['$scope', '$state', 'csSettings', 'csWallet'];angular.module('cesium.es.app.controllers', ['ngResource', 'cesium.es.services'])\n\n // Configure menu items\n .config(['PluginServiceProvider', function(PluginServiceProvider) {\n 'ngInject';\n\n // Menu extension points\n PluginServiceProvider.extendState('app', {\n points: {\n 'nav-buttons-right': {\n templateUrl: \"plugins/es/templates/menu_extend.html\",\n controller: \"ESMenuExtendCtrl\"\n },\n 'menu-discover': {\n templateUrl: \"plugins/es/templates/menu_extend.html\",\n controller: \"ESMenuExtendCtrl\"\n },\n 'menu-user': {\n templateUrl: \"plugins/es/templates/menu_extend.html\",\n controller: \"ESMenuExtendCtrl\"\n },\n 'profile-popover-user': {\n templateUrl: \"plugins/es/templates/common/popover_profile_extend.html\",\n controller: \"ESProfilePopoverExtendCtrl\"\n }\n }\n });\n\n // Notification on home page\n PluginServiceProvider.extendState('app.home', {\n points: {\n 'header-buttons': {\n templateUrl: \"plugins/es/templates/home/home_extend.html\",\n controller: \"ESExtensionCtrl\"\n }\n }\n });\n }])\n\n .controller('ESExtensionCtrl', ESExtensionController)\n\n .controller('ESJoinCtrl', ESJoinController)\n\n .controller('ESMenuExtendCtrl', ESMenuExtendController)\n\n .controller('ESProfilePopoverExtendCtrl', ESProfilePopoverExtendController)\n\n;\n\n/**\n * Generic controller, that enable/disable depending on esSettings enable/disable\n */\nfunction ESExtensionController($scope, esSettings, PluginService) {\n 'ngInject';\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n\n $scope.enable = true; // Always enable, on gchange\n}\n\n/**\n * Control new account wizard extend view\n */\nfunction ESJoinController($scope, esSettings, PluginService) {\n 'ngInject';\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n $scope.enable = true; // Always enable, on gchange\n}\n\n/**\n * Control menu extension\n */\nfunction ESMenuExtendController($scope, $state, PluginService, esSettings, UIUtils) {\n 'ngInject';\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n $scope.enable = esSettings.isEnable();\n\n $scope.showRegistryLookupView = function() {\n $state.go(UIUtils.screen.isSmall() ? 'app.registry_lookup': 'app.registry_lookup_lg');\n };\n\n $scope.showNotificationsPopover = function(event) {\n return UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/notification/popover_notification.html',\n scope: $scope,\n autoremove: false // reuse popover\n });\n };\n\n $scope.showMessagesPopover = function(event) {\n return UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/message/popover_message.html',\n scope: $scope,\n autoremove: false // reuse popover\n });\n };\n\n $scope.showInvitationsPopover = function(event) {\n return UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/invitation/popover_invitation.html',\n scope: $scope,\n autoremove: false // reuse popover\n });\n };\n\n esSettings.api.state.on.changed($scope, function(enable) {\n $scope.enable = enable;\n });\n}\n\n/**\n * Control profile popover extension\n */\nfunction ESProfilePopoverExtendController($scope, $state, csSettings, csWallet) {\n 'ngInject';\n\n $scope.updateView = function() {\n $scope.enable = csWallet.isLogin() && (\n (csSettings.data.plugins && csSettings.data.plugins.es) ?\n csSettings.data.plugins.es.enable :\n !!csSettings.data.plugins.host);\n };\n\n $scope.showEditUserProfile = function() {\n $scope.closeProfilePopover();\n $state.go('app.user_edit_profile');\n };\n\n csSettings.api.data.on.changed($scope, $scope.updateView);\n csSettings.api.data.on.ready($scope, $scope.updateView);\n csWallet.api.data.on.login($scope, function(data, deferred){\n deferred = deferred || $q.defer();\n $scope.updateView();\n deferred.resolve();\n return deferred.promise;\n });\n csWallet.api.data.on.logout($scope, $scope.updateView);\n $scope.updateView();\n\n}\n","\nESPluginSettingsController.$inject = ['$scope', '$window', '$q', '$translate', '$ionicPopup', 'UIUtils', 'Modals', 'csHttp', 'csConfig', 'csSettings', 'esHttp', 'esSettings', 'esModals'];angular.module('cesium.es.settings.controllers', ['cesium.es.services'])\n\n // Configure menu items\n .config(['PluginServiceProvider', '$stateProvider', 'csConfig', function(PluginServiceProvider, $stateProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Extend settings via extension points\n PluginServiceProvider.extendState('app.settings', {\n points: {\n 'plugins': {\n templateUrl: \"plugins/es/templates/settings/settings_extend.html\",\n controller: \"ESExtensionCtrl\"\n }\n }\n });\n\n $stateProvider\n .state('app.es_settings', {\n url: \"/settings/es\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/settings/plugin_settings.html\",\n controller: 'ESPluginSettingsCtrl'\n }\n }\n });\n }\n }])\n .controller('ESPluginSettingsCtrl', ESPluginSettingsController)\n\n;\n\n\n/*\n * Settings extend controller\n */\nfunction ESPluginSettingsController ($scope, $window, $q, $translate, $ionicPopup,\n UIUtils, Modals, csHttp, csConfig, csSettings, esHttp, esSettings, esModals) {\n 'ngInject';\n\n $scope.hasWindowNotification = !!(\"Notification\" in window);\n $scope.formData = {};\n $scope.popupData = {}; // need for the node popup\n $scope.loading = true;\n\n $scope.enter= function(e, state) {\n $scope.load();\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function(keepEnableState) {\n $scope.loading = true;\n\n var wasEnable = $scope.formData.enable;\n $scope.formData = csSettings.data.plugins && csSettings.data.plugins.es ?\n angular.copy(csSettings.data.plugins.es) : {\n enable: false,\n host: undefined,\n port: undefined\n };\n if (keepEnableState && wasEnable) {\n $scope.formData.enable = wasEnable;\n }\n\n $scope.isFallbackNode = $scope.formData.enable && esHttp.node.isFallback();\n $scope.server = $scope.getServer(esHttp);\n\n $scope.loading = false;\n };\n\n esSettings.api.state.on.changed($scope, function(enable) {\n $scope.load(true);\n });\n\n $scope.setPopupForm = function(popupForm) {\n $scope.popupForm = popupForm;\n };\n\n // Change ESnode\n $scope.changeEsNode= function(node) {\n node = node || {\n host: $scope.formData.host,\n port: $scope.formData.port && $scope.formData.port != 80 && $scope.formData.port != 443 ? $scope.formData.port : undefined,\n useSsl: angular.isDefined($scope.formData.useSsl) ?\n $scope.formData.useSsl :\n ($scope.formData.port == 443)\n };\n\n $scope.showNodePopup(node)\n .then(function(newNode) {\n if (newNode.host == $scope.formData.host &&\n newNode.port == $scope.formData.port &&\n newNode.useSsl == $scope.formData.useSsl) {\n UIUtils.loading.hide();\n return; // same node = nothing to do\n }\n UIUtils.loading.show();\n\n var newEsNode = esHttp.instance(newNode.host, newNode.port, newNode.useSsl);\n return newEsNode.isAlive() // ping the node\n .then(function(alive) {\n if (!alive) {\n UIUtils.loading.hide();\n return UIUtils.alert.error('ERROR.INVALID_NODE_SUMMARY')\n .then(function(){\n $scope.changeEsNode(newNode); // loop\n });\n }\n\n $scope.formData.host = newEsNode.host;\n $scope.formData.port = newEsNode.port;\n $scope.formData.useSsl = newEsNode.useSsl;\n\n return esHttp.copy(newEsNode);\n })\n .then(function() {\n $scope.server = $scope.getServer(esHttp);\n $scope.isFallbackNode = false;\n UIUtils.loading.hide();\n });\n });\n };\n\n // Show node popup\n $scope.showNodePopup = function(node) {\n\n return $q(function(resolve, reject) {\n var parts = [node.host];\n if (node.port && node.port != 80) {\n parts.push(node.port);\n }\n $scope.popupData.newNode = parts.join(':');\n $scope.popupData.useSsl = angular.isDefined(node.useSsl) ? node.useSsl : (node.port == 443);\n if (!!$scope.popupForm) {\n $scope.popupForm.$setPristine();\n }\n $translate(['ES_SETTINGS.POPUP_PEER.TITLE', 'ES_SETTINGS.POPUP_PEER.HELP', 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n // Choose UID popup\n $ionicPopup.show({\n templateUrl: 'templates/settings/popup_node.html',\n title: translations['ES_SETTINGS.POPUP_PEER.TITLE'],\n subTitle: translations['ES_SETTINGS.POPUP_PEER.HELP'],\n scope: $scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n {\n text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: function(e) {\n $scope.popupForm.$submitted=true;\n if(!$scope.popupForm.$valid || !$scope.popupForm.newNode) {\n //don't allow the user to close unless he enters a node\n e.preventDefault();\n } else {\n return {\n server: $scope.popupData.newNode,\n useSsl: $scope.popupData.useSsl\n };\n }\n }\n }\n ]\n })\n .then(function(res) {\n if (!res) { // user cancel\n UIUtils.loading.hide();\n return;\n }\n var parts = res.server.split(':');\n parts[1] = parts[1] ? parts[1] : (res.useSsl ? 443 : 80);\n resolve({\n host: parts[0],\n port: parts[1],\n useSsl: res.useSsl\n });\n });\n });\n });\n };\n\n $scope.showNodeList = function() {\n // Check if need a filter on SSL node\n var forceUseSsl = (csConfig.httpsMode === 'true' || csConfig.httpsMode === true || csConfig.httpsMode === 'force') ||\n ($window.location && $window.location.protocol === 'https:') ? true : false;\n\n $ionicPopup._popupStack[0].responseDeferred.promise.close();\n return esModals.showNetworkLookup({\n enableFilter: true,\n endpoint: esHttp.constants.GCHANGE_API,\n ssl: forceUseSsl ? true: undefined\n })\n .then(function (peer) {\n if (!peer) return;\n var esEps = peer.getEndpoints().reduce(function(res, ep){\n var esEp = esHttp.node.parseEndPoint(ep);\n return esEp ? res.concat(esEp) : res;\n }, []);\n if (!esEps.length) return;\n var ep = esEps[0];\n return {\n host: (ep.dns ? ep.dns :\n (peer.hasValid4(ep) ? ep.ipv4 : ep.ipv6)),\n port: ep.port || 80,\n useSsl: ep.useSsl || ep.port == 443\n };\n })\n .then(function(newEsNode) {\n $scope.changeEsNode(newEsNode); // get back to node popup\n });\n };\n\n $scope.onFormChanged = function() {\n if ($scope.loading) return;\n\n $scope.formData.notifications = $scope.formData.notifications || {};\n if ($scope.hasWindowNotification &&\n $scope.formData.notifications.emitHtml5 !== (window.Notification.permission === \"granted\")){\n window.Notification.requestPermission(function (permission) {\n // If the user accepts, let's create a notification\n $scope.formData.notifications.emitHtml5 = (permission === \"granted\"); // revert to false if permission not granted\n $scope.onFormChanged(); // Loop\n });\n return;\n }\n\n $scope.loading = true;\n csSettings.data.plugins = csSettings.data.plugins || {};\n csSettings.data.plugins.es = csSettings.data.plugins.es ?\n angular.merge(csSettings.data.plugins.es, $scope.formData) :\n $scope.formData;\n\n // Fix old settings (unused)\n delete csSettings.data.plugins.es.newNode;\n\n csSettings.store()\n .then(function() {\n $scope.loading = false;\n });\n };\n $scope.$watch('formData', $scope.onFormChanged, true);\n\n $scope.getServer = function(node) {\n node = node || $scope.formData;\n if (!node.host) return undefined;\n return csHttp.getServer(node.host, node.port);\n };\n}\n","\nESWalletViewController.$inject = ['$scope', '$controller', '$state', 'csWallet', 'esModals'];\nESWalletLikesController.$inject = ['$scope', '$controller', 'UIUtils', 'esHttp', 'esProfile'];angular.module('cesium.es.wallet.controllers', ['cesium.es.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider.extendState('app.view_wallet', {\n points: {\n 'hero': {\n templateUrl: \"plugins/es/templates/wallet/view_wallet_extend.html\",\n controller: 'ESWalletLikesCtrl'\n },\n 'after-general': {\n templateUrl: \"plugins/es/templates/wallet/view_wallet_extend.html\",\n controller: 'ESWalletViewCtrl'\n }\n }\n });\n }\n\n }])\n\n .controller('ESWalletViewCtrl', ESWalletViewController)\n\n .controller('ESWalletLikesCtrl', ESWalletLikesController)\n\n;\n\nfunction ESWalletViewController($scope, $controller, $state, csWallet, esModals) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));\n\n /* -- modals -- */\n\n $scope.showNewPageModal = function(event) {\n return esModals.showNewPage(event);\n };\n}\n\n\nfunction ESWalletLikesController($scope, $controller, UIUtils, esHttp, esProfile) {\n 'ngInject';\n\n $scope.options = $scope.options || {};\n $scope.options.like = $scope.options.like || {\n index: 'user',\n type: 'profile',\n service: esProfile.like\n };\n $scope.canEdit = true; // Avoid to change like counter itself\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLikesCtrl', {$scope: $scope}));\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));\n\n // Load likes, when profile loaded\n $scope.$watch('formData.pubkey', function(pubkey) {\n if (pubkey) {\n $scope.loadLikes(pubkey);\n }\n });\n}\n","\nESWotIdentityViewController.$inject = ['$scope', '$controller', '$ionicPopover', 'UIUtils', 'csWallet', 'esHttp', 'esProfile', 'esLike', 'esModals'];angular.module('cesium.es.wot.controllers', ['cesium.es.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider\n\n .extendStates(['app.user_identity', 'app.user_identity_name'], {\n points: {\n 'hero': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'general': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'after-general': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'buttons': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n 'buttons-top-fab': {\n templateUrl: \"plugins/es/templates/wot/view_identity_extend.html\",\n controller: 'ESWotIdentityViewCtrl'\n },\n }\n })\n ;\n }\n\n }])\n\n .controller('ESWotIdentityViewCtrl', ESWotIdentityViewController)\n\n\n;\n\nfunction ESWotIdentityViewController($scope, $controller, $ionicPopover, UIUtils, csWallet,\n esHttp, esProfile, esLike, esModals) {\n 'ngInject';\n\n $scope.options = $scope.options || {};\n $scope.options.like = $scope.options.like || {\n kinds: esLike.constants.KINDS,\n index: 'user',\n type: 'profile',\n service: esProfile.like\n };\n $scope.smallscreen = angular.isDefined($scope.smallscreen) ? $scope.smallscreen : UIUtils.screen.isSmall();\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLikesCtrl', {$scope: $scope}));\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));\n\n /* -- modals -- */\n\n $scope.showNewMessageModal = function(confirm) {\n return $scope.loadWallet({minData: true})\n\n .then(function() {\n UIUtils.loading.hide();\n\n // Ask confirmation, if user has no Cesium+ profil\n if (!confirm && !$scope.formData.profile) {\n return UIUtils.alert.confirm('MESSAGE.CONFIRM.USER_HAS_NO_PROFILE')\n .then(function (confirm) {\n // Recursive call (with confirm flag)\n if (confirm) return true;\n });\n }\n return true;\n })\n // Open modal\n .then(function(confirm) {\n if (!confirm) return false;\n\n return esModals.showMessageCompose({\n destPub: $scope.formData.pubkey,\n destUid: $scope.formData.name||$scope.formData.uid\n })\n .then(function(sent) {\n if (sent) UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT');\n });\n });\n\n };\n\n /* -- likes -- */\n\n // Load likes, when profile loaded\n $scope.$watch('formData.pubkey', function(pubkey) {\n if (pubkey) {\n $scope.loadLikes(pubkey);\n }\n });\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function (event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/wot/view_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function () {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n return true;\n };\n\n if ($scope.extensionPoint === 'buttons-top-fab') {\n // Show fab button, when parent execute motions\n $scope.$on('$csExtension.motion', function(event) {\n var canCompose = !!$scope.formData.profile;\n if (canCompose) {\n $scope.showFab('fab-compose-' + $scope.formData.pubkey);\n }\n });\n }\n\n // TODO : for DEV only\n /*$timeout(function() {\n if ($scope.extensionPoint != 'buttons') return;\n $scope.showSuggestCertificationModal();\n }, 1000);*/\n}\n","\nESViewEditProfileController.$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'])\n\n .config(['$stateProvider', function($stateProvider) {\n\n $stateProvider.state('app.user_edit_profile', {\n url: \"/wallet/profile/edit\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/user/edit_profile.html\",\n controller: 'ESViewEditProfileCtrl'\n }\n },\n cache: false,\n data: {\n auth: true\n }\n });\n\n }])\n\n .controller('ESViewEditProfileCtrl', ESViewEditProfileController)\n\n\n;\n\nfunction ESViewEditProfileController($scope, $rootScope, $q, $timeout, $state, $focus, $translate, $controller, $ionicHistory,\n UIUtils, BMA, esHttp, esProfile, ModalUtils, Device) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n // Not need, because already call inside the template\n //angular.extend(this, $controller('ESPositionEditCtrl', {$scope: $scope}));\n\n $scope.formData = {\n title: null,\n description: null,\n socials: [],\n geoPoint: {}\n };\n $scope.loading = true;\n $scope.dirty = false;\n $scope.walletData = null;\n $scope.avatar = null;\n $scope.existing = false;\n $scope.socialData = {\n url: null\n };\n $scope.socialReorder = true;\n\n $scope.pubkeyPattern = BMA.regexp.PUBKEY;\n\n $scope.enter = function(e, state) {\n $scope.loadWallet()\n .then($scope.load)\n .catch(function(err){\n if (err === 'CANCELLED') {\n UIUtils.loading.hide(10);\n $scope.cancel();\n return;\n }\n UIUtils.onError('PROFILE.ERROR.LOAD_PROFILE_FAILED')(err);\n });\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n if (!$scope.dirty || $scope.saving || event.defaultPrevented) return;\n\n // stop the change state action\n event.preventDefault();\n\n if (!$scope.loading) {\n $scope.loading = true;\n return UIUtils.alert.confirm('CONFIRM.SAVE_BEFORE_LEAVE',\n 'CONFIRM.SAVE_BEFORE_LEAVE_TITLE', {\n cancelText: 'COMMON.BTN_NO',\n okText: 'COMMON.BTN_YES_SAVE'\n })\n .then(function(confirmSave) {\n $scope.loading = false;\n if (confirmSave) {\n $scope.form.$submitted=true;\n return $scope.save(false/*silent*/, true/*haswait debounce*/)\n .then(function(saved){\n if (saved) {\n $scope.dirty = false;\n }\n return saved; // change state only if not error\n });\n }\n else {\n $scope.dirty = false;\n return true; // ok, change state\n }\n })\n .then(function(confirmGo) {\n if (confirmGo) {\n // continue to the order state\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go(next.name, nextParams);\n }\n })\n .catch(function(err) {\n // Silent\n });\n }\n });\n\n $scope.load = function(walletData) {\n $scope.loading = true; // to avoid the call of doSave()\n return esProfile.get(walletData.pubkey, {\n raw: true\n })\n .then(function(profile) {\n if (profile) {\n $scope.avatar = esHttp.image.fromAttachment(profile.source.avatar);\n $scope.existing = true;\n $scope.updateView(walletData, profile.source);\n }\n else {\n $scope.avatar = undefined;\n $scope.existing = false;\n $scope.updateView(walletData, {});\n }\n\n UIUtils.loading.hide();\n\n // Update loading - done with a delay, to avoid trigger onFormDataChanged()\n return $timeout(function() {\n $scope.loading = false;\n }, 1000);\n })\n .then(function() {\n // removeIf(device)\n $focus('profile-name');\n // endRemoveIf(device)\n })\n .catch(UIUtils.onError('PROFILE.ERROR.LOAD_PROFILE_FAILED'));\n };\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n $scope.updateView = function(wallet, profile) {\n $scope.walletData = wallet;\n $scope.formData = profile;\n if (profile.avatar) {\n $scope.avatarStyle={'background-image':'url(\"'+$scope.avatar.src+'\")'};\n }\n $scope.formData.geoPoint = $scope.formData.geoPoint || {};\n\n $scope.motion.show();\n };\n\n $scope.onFormDataChanged = function() {\n if ($scope.loading) return;\n $scope.dirty = true;\n };\n $scope.$watch('formData', $scope.onFormDataChanged, true);\n\n $scope.save = function(silent, hasWaitDebounce) {\n if($scope.form.$invalid || !$rootScope.walletData || ($scope.saving && !hasWaitDebounce)) {\n return $q.reject();\n }\n\n if (!hasWaitDebounce) {\n console.debug('[ES] [profile] Waiting debounce end, before saving...');\n $scope.saving = true;\n return $timeout(function() {\n return $scope.save(silent, true);\n }, 650);\n }\n\n console.debug('[ES] [profile] Saving user profile...');\n\n var onError = function(message) {\n return function(err) {\n $scope.saving = false;\n UIUtils.onError(message)(err);\n };\n };\n\n var updateWallet = function(formData) {\n if (formData) {\n $scope.walletData.name = formData.title;\n if ($scope.avatar) {\n $scope.walletData.avatar = $scope.avatar;\n }\n else {\n delete $scope.walletData.avatar;\n }\n\n $scope.walletData.profile = angular.copy(formData);\n $scope.walletData.profile.description = esHttp.util.parseAsHtml(formData.description);\n }\n };\n\n var showSuccessToast = function() {\n if (!silent) {\n return $translate('PROFILE.INFO.PROFILE_SAVED')\n .then(function(message){\n UIUtils.toast.show(message);\n });\n }\n };\n\n var doFinishSave = function(formData) {\n // Social url must be unique in socials links - Fix #306:\n if (formData.socials && formData.socials.length) {\n formData.socials = _.uniq(formData.socials, false, function(social) {\n return social.url;\n });\n }\n\n // Workaround for old data\n if (formData.position) {\n formData.position = null;\n }\n\n // Make sure to convert lat/lon to float\n if (formData.geoPoint && formData.geoPoint.lat && formData.geoPoint.lon) {\n formData.geoPoint.lat = parseFloat(formData.geoPoint.lat);\n formData.geoPoint.lon = parseFloat(formData.geoPoint.lon);\n }\n else{\n formData.geoPoint = null; // force to null, need by ES update request\n }\n\n if (!$scope.existing) {\n return esProfile.add(formData)\n .then(function() {\n console.info(\"[ES] [profile] Successfully created.\");\n $scope.existing = true;\n $scope.saving = false;\n $scope.dirty = false;\n updateWallet(formData);\n showSuccessToast();\n return true;\n })\n .catch(onError('PROFILE.ERROR.SAVE_PROFILE_FAILED'));\n }\n else {\n return esProfile.update(formData, {id: $rootScope.walletData.pubkey})\n .then(function() {\n console.info(\"[ES] Profile successfully updated.\");\n $scope.saving = false;\n $scope.dirty = false;\n updateWallet(formData);\n showSuccessToast();\n return true;\n })\n .catch(onError('PROFILE.ERROR.SAVE_PROFILE_FAILED'));\n }\n }; // end of doFinishSave\n\n if ($scope.avatar && $scope.avatar.src) {\n return UIUtils.image.resizeSrc($scope.avatar.src, true) // resize to thumbnail\n .then(function(imageSrc) {\n $scope.formData.avatar = esHttp.image.toAttachment({src: imageSrc});\n return doFinishSave($scope.formData);\n });\n }\n else {\n delete $scope.formData.avatar;\n return doFinishSave($scope.formData);\n }\n };\n\n $scope.saveAndClose = function() {\n return $scope.save()\n .then(function(saved) {\n if (saved) $scope.close();\n });\n };\n\n $scope.submitAndSaveAndClose = function() {\n $scope.form.$submitted=true;\n $scope.saveAndClose();\n };\n\n $scope.cancel = function() {\n $scope.dirty = false; // force not saved\n return $state.go('app.view_wallet');\n };\n\n $scope.close = function() {\n return $state.go('app.view_wallet', {refresh: true});\n };\n\n $scope.showAvatarModal = function() {\n if (Device.camera.enable) {\n return Device.camera.getPicture()\n .then(function(imageData) {\n if (!imageData) return;\n $scope.avatar = {src: \"data:image/png;base64,\" + imageData};\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n }\n else {\n return ModalUtils.show('plugins/es/templates/common/modal_edit_avatar.html','ESAvatarModalCtrl',\n {})\n .then(function(imageData) {\n if (!imageData) return;\n $scope.avatar = {src: imageData};\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n });\n }\n };\n\n $scope.rotateAvatar = function(){\n if (!$scope.avatar || !$scope.avatar.src || $scope.rotating) return;\n\n $scope.rotating = true;\n\n return UIUtils.image.rotateSrc($scope.avatar.src)\n .then(function(imageData){\n $scope.avatar.src = imageData;\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n $scope.rotating = false;\n })\n .catch(function(err) {\n console.error(err);\n $scope.rotating = false;\n });\n };\n\n $scope.removeProfile = function(){\n // Hide popover if need\n $scope.hideActionsPopover();\n\n return $scope.existing && $scope.loadWallet({minData: true})\n .then(function(walletData) {\n\n UIUtils.loading.hide();\n UIUtils.alert.confirm('PROFILE.CONFIRM.DELETE', undefined, {okText: 'COMMON.BTN_DELETE'})\n .then(function(confirm) {\n if (confirm){\n\n console.debug('[ES] [profile] Deleting user profile...');\n return esProfile.remove(walletData.pubkey)\n .then(function () {\n walletData.name=null; // keep local name, on children wallets\n walletData.profile = null;\n walletData.avatar = null;\n console.debug('[ES] [profile] Successfully deleted');\n $scope.dirty = false;\n return $scope.close();\n })\n .then(function() {\n return $timeout(function() {\n UIUtils.toast.show('PROFILE.INFO.PROFILE_REMOVED');\n }, 750);\n })\n .catch(UIUtils.onError('PROFILE.ERROR.REMOVE_PROFILE_FAILED'));\n }\n });\n });\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/user/edit_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n}\n\n\n","\nESMessageListController.$inject = ['$scope', '$state', '$translate', '$ionicHistory', '$ionicPopover', '$timeout', 'esModals', 'UIUtils', 'csWallet', 'esMessage'];\nESMessageComposeController.$inject = ['$scope', '$controller', 'UIUtils'];\nESMessageComposeModalController.$inject = ['$scope', 'Modals', 'UIUtils', 'csWallet', 'esHttp', 'esMessage', 'parameters'];\nESMessageViewController.$inject = ['$scope', '$state', '$timeout', '$translate', '$ionicHistory', '$ionicPopover', 'UIUtils', 'esModals', 'esMessage'];\nPopoverMessageController.$inject = ['$scope', 'UIUtils', '$state', '$timeout', 'csWallet', 'esHttp', 'esMessage', 'esModals'];angular.module('cesium.es.message.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.user_message', {\n url: \"/message?type\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/list.html\",\n controller: 'ESMessageListCtrl'\n }\n }\n })\n\n .state('app.user_new_message', {\n cache: false,\n url: \"/message/new?pubkey&name&title&content\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/compose.html\",\n controller: 'ESMessageComposeCtrl'\n }\n }\n })\n\n .state('app.user_view_message', {\n cache: false,\n url: \"/message/view/:type/:id\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/message/view_message.html\",\n controller: 'ESMessageViewCtrl'\n }\n }\n })\n\n ;\n }])\n\n .controller('ESMessageListCtrl', ESMessageListController)\n\n .controller('ESMessageComposeCtrl', ESMessageComposeController)\n\n .controller('ESMessageComposeModalCtrl', ESMessageComposeModalController)\n\n .controller('ESMessageViewCtrl', ESMessageViewController)\n\n .controller('PopoverMessageCtrl', PopoverMessageController)\n\n;\n\nfunction ESMessageListController($scope, $state, $translate, $ionicHistory, $ionicPopover, $timeout,\n esModals, UIUtils, csWallet, esMessage) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.messages = [];\n\n $scope.$on('$ionicView.enter', function(e, state) {\n\n $scope.loadWallet({minData: true})\n .then(function() {\n if (!$scope.entered) {\n $scope.entered = true;\n $scope.type = state.stateParams && state.stateParams.type || 'inbox';\n $scope.load();\n }\n\n $scope.showFab('fab-add-message-record');\n })\n .catch(function(err) {\n if ('CANCELLED' === err) {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go('app.home');\n }\n });\n });\n\n $scope.refresh = function(silent) {\n return $scope.load(undefined, undefined, silent);\n };\n\n $scope.load = function(size, offset, silent) {\n var options = {};\n options.from = offset || 0;\n options.size = size || 20;\n options.type = $scope.type;\n\n $scope.loading = !silent;\n return esMessage.load(options)\n .then(function(messages) {\n $scope.messages = messages;\n\n UIUtils.loading.hide();\n $scope.loading = false;\n\n if (messages.length > 0) {\n $scope.motion.show({selector: '.view-messages .list .item'});\n }\n })\n .catch(function(err) {\n UIUtils.onError('MESSAGE.ERROR.LOAD_MESSAGES_FAILED')(err);\n $scope.messages = [];\n $scope.loading = false;\n });\n };\n\n $scope.setType = function(type) {\n $scope.type = type;\n $scope.load();\n };\n\n $scope.markAllAsRead = function() {\n $scope.hideActionsPopover();\n if (!$scope.messages || !$scope.messages.length) return;\n\n UIUtils.alert.confirm('MESSAGE.CONFIRM.MARK_ALL_AS_READ')\n .then(function(confirm) {\n if (confirm) {\n esMessage.markAllAsRead()\n .then(function () {\n _.forEach($scope.messages, function(msg){\n msg.read = true;\n });\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.MARK_ALL_AS_READ_FAILED'));\n }\n });\n };\n\n $scope.delete = function(index) {\n var message = $scope.messages[index];\n if (!message) return;\n\n UIUtils.alert.confirm('MESSAGE.CONFIRM.REMOVE')\n .then(function(confirm) {\n if (confirm) {\n esMessage.remove(message.id, $scope.type)\n .then(function () {\n $scope.messages.splice(index,1); // remove from messages array\n UIUtils.toast.show('MESSAGE.INFO.MESSAGE_REMOVED');\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_MESSAGE_FAILED'));\n }\n });\n };\n\n $scope.deleteAll = function() {\n $scope.hideActionsPopover();\n if (!$scope.messages || !$scope.messages.length) return;\n\n UIUtils.alert.confirm('MESSAGE.CONFIRM.REMOVE_ALL')\n .then(function(confirm) {\n if (confirm) {\n esMessage.removeAll($scope.type)\n .then(function () {\n $scope.messages.splice(0,$scope.messages.length); // reset array\n UIUtils.toast.show('MESSAGE.INFO.All_MESSAGE_REMOVED');\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_All_MESSAGES_FAILED'));\n }\n });\n };\n\n /* -- Modals -- */\n\n $scope.showNewMessageModal = function(parameters) {\n return $scope.loadWallet({minData: true})\n .then(function() {\n UIUtils.loading.hide();\n return esModals.showMessageCompose(parameters)\n .then(function(id) {\n if (id) UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT');\n });\n });\n };\n\n $scope.showReplyModal = function(index) {\n var message = $scope.messages[index];\n if (!message) return;\n\n $translate('MESSAGE.REPLY_TITLE_PREFIX')\n .then(function (prefix) {\n var content = message.content ? message.content.replace(/^/g, ' > ') : null;\n content = content ? content.replace(/\\n/g, '\\n > ') : null;\n content = content ? content +'\\n' : null;\n return esModals.showMessageCompose({\n destPub: message.issuer,\n destUid: message.name,\n title: prefix + message.title,\n content: content,\n isReply: true\n });\n })\n .then(function(sent) {\n if (sent) UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT');\n });\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n if (!$scope.actionsPopover) {\n $ionicPopover.fromTemplateUrl('plugins/es/templates/message/lookup_popover_actions.html', {\n scope: $scope\n }).then(function(popover) {\n $scope.actionsPopover = popover;\n //Cleanup the popover when we're done with it!\n $scope.$on('$destroy', function() {\n $scope.actionsPopover.remove();\n });\n $scope.actionsPopover.show(event);\n });\n }\n else {\n $scope.actionsPopover.show(event);\n }\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n };\n\n /* -- watch events (delete, received, sent) -- */\n\n // Message deletion\n $scope.onMessageDelete = function(id) {\n var index = _.findIndex($scope.messages, function(msg) {\n return msg.id == id;\n });\n if (index) {\n $scope.messages.splice(index,1); // remove from messages array\n }\n };\n esMessage.api.data.on.delete($scope, $scope.onMessageDelete);\n\n // Watch user sent message\n $scope.onNewOutboxMessage = function(id) {\n if ($scope.type != 'outbox') return;\n // Add message sent to list\n $scope.loading = true;\n return $timeout(function() {\n // Load the message sent\n return esMessage.get(id, {type: $scope.type, summary: true});\n }, 500 /*waiting ES propagation*/)\n .then(function(msg) {\n $scope.messages.splice(0,0,msg);\n $scope.loading = false;\n $scope.motion.show({selector: '.view-messages .list .item'});\n })\n .catch(function() {\n $scope.loading = false;\n });\n };\n esMessage.api.data.on.sent($scope, $scope.onNewOutboxMessage);\n\n // Watch received message\n $scope.onNewInboxMessage = function(notification) {\n if ($scope.type != 'inbox' || !$scope.entered) return;\n // Add message sent to list\n $scope.loading = true;\n // Load the the message\n return esMessage.get(notification.id, {type: $scope.type, summary: true})\n .then(function(msg) {\n $scope.messages.splice(0,0,msg);\n $scope.loading = false;\n $scope.motion.show({selector: '.view-messages .list .item'});\n })\n .catch(function() {\n $scope.loading = false;\n });\n };\n esMessage.api.data.on.new($scope, $scope.onNewInboxMessage);\n\n // Watch unauth\n $scope.onUnauth = function() {\n // Reset all data\n $scope.messages = undefined;\n $scope.loading = false;\n $scope.entered = false;\n };\n csWallet.api.data.on.unauth($scope, $scope.onUnauth);\n\n // for DEV only\n /*$timeout(function() {\n $scope.showNewMessageModal();\n }, 900);\n */\n}\n\n\nfunction ESMessageComposeController($scope, $controller, UIUtils) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESMessageComposeModalCtrl', {$scope: $scope, parameters: {}}));\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if (state.stateParams) {\n if (state.stateParams.pubkey) {\n $scope.formData.destPub = state.stateParams.pubkey;\n if (state.stateParams.name) {\n $scope.destUid = state.stateParams.name;\n $scope.destPub = '';\n }\n else {\n $scope.destUid = '';\n $scope.destPub = $scope.formData.destPub;\n }\n }\n\n if (state.stateParams.title) {\n $scope.formData.title = state.stateParams.title;\n }\n\n if (state.stateParams.content) {\n $scope.formData.content = state.stateParams.content;\n }\n }\n\n $scope.loadWallet({minData: true})\n .then(function() {\n UIUtils.loading.hide();\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n $scope.showHome();\n }\n });\n });\n\n $scope.cancel = function() {\n $scope.showHome();\n };\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n $scope.closeModal = function() {\n $scope.showHome();\n };\n\n}\n\nfunction ESMessageComposeModalController($scope, Modals, UIUtils, csWallet, esHttp, esMessage, parameters) {\n 'ngInject';\n\n $scope.formData = {\n title: parameters ? parameters.title : null,\n content: parameters ? parameters.content : null,\n destPub: parameters ? parameters.destPub : null\n };\n $scope.destUid = parameters ? parameters.destUid : null;\n $scope.destPub = (parameters && !parameters.destUid) ? parameters.destPub : null;\n $scope.isResponse = parameters ? parameters.isResponse : false;\n\n $scope.doSend = function(forceNoContent) {\n $scope.form.$submitted=true;\n if(!$scope.form.$valid /*|| !$scope.formData.destPub*/) {\n return;\n }\n\n // Ask user confirmation if no content\n if (!forceNoContent && (!$scope.formData.content || !$scope.formData.content.trim().length)) {\n return UIUtils.alert.confirm('MESSAGE.COMPOSE.CONTENT_CONFIRMATION')\n .then(function(confirm) {\n if (confirm) {\n $scope.doSend(true);\n }\n });\n }\n\n UIUtils.loading.show();\n var data = {\n issuer: csWallet.data.pubkey,\n recipient: $scope.formData.destPub,\n title: $scope.formData.title,\n content: $scope.formData.content,\n time: esHttp.date.now()\n };\n\n esMessage.send(data)\n .then(function(id) {\n $scope.id=id;\n UIUtils.loading.hide();\n $scope.closeModal(id);\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.SEND_MSG_FAILED'));\n };\n\n /* -- Modals -- */\n\n $scope.showWotLookupModal = function() {\n Modals.showWotLookup()\n .then(function(result){\n if (result) {\n if (result.name) {\n $scope.destUid = result.name;\n $scope.destPub = '';\n }\n else {\n $scope.destUid = '';\n $scope.destPub = result.pubkey;\n }\n $scope.formData.destPub = result.pubkey;\n // TODO focus on title field\n //$focus('');\n }\n });\n };\n\n $scope.cancel = function() {\n $scope.closeModal();\n };\n\n\n // TODO : for DEV only\n /*$timeout(function() {\n $scope.formData.destPub = 'G2CBgZBPLe6FSFUgpx2Jf1Aqsgta6iib3vmDRA1yLiqU';\n $scope.formData.title = 'test';\n $scope.formData.content = 'test';\n $scope.destPub = $scope.formData.destPub;\n\n $timeout(function() {\n //$scope.doSend();\n }, 800);\n }, 100);\n */\n}\n\n\nfunction ESMessageViewController($scope, $state, $timeout, $translate, $ionicHistory, $ionicPopover,\n UIUtils, esModals, esMessage) {\n 'ngInject';\n\n $scope.formData = {};\n $scope.id = null;\n $scope.loading = true;\n\n $scope.$on('$ionicView.enter', function (e, state) {\n if (state.stateParams && state.stateParams.id) { // Load by id\n if ($scope.loading) { // prevent reload if same id\n $scope.type = state.stateParams.type || 'inbox';\n\n $scope.load(state.stateParams.id, $scope.type)\n .then(function(message) {\n $scope.loading = false;\n UIUtils.loading.hide();\n if (!message) return;\n\n $scope.id = message.id;\n $scope.formData = message;\n $scope.canDelete = true;\n $scope.motion.show({selector: '.view-message .list .item'});\n // Mark as read\n if (!message.read) {\n $timeout(function() {\n // Message has NOT changed\n if ($scope.id === message.id) {\n esMessage.markAsRead(message, $scope.type)\n .then(function() {\n console.debug(\"[message] marked as read\");\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.MARK_AS_READ_FAILED'));\n }\n }, 2000); // 2s\n }\n });\n }\n\n $scope.showFab('fab-view-message-reply');\n }\n else {\n $state.go('app.user_message');\n }\n });\n\n $scope.load = function(id, type) {\n type = type || 'inbox';\n\n return $scope.loadWallet({minData: true})\n .then(function() {\n return esMessage.get(id, {type: type});\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.LOAD_MESSAGE_FAILED'))\n .then(function(message) {\n if (!message.valid) {\n return UIUtils.alert.error(!$scope.isUserPubkey(message.recipient) ? 'MESSAGE.ERROR.USER_NOT_RECIPIENT' : 'MESSAGE.ERROR.NOT_AUTHENTICATED_MESSAGE',\n 'MESSAGE.ERROR.MESSAGE_NOT_READABLE')\n .then(function () {\n $state.go('app.user_message', {type: type});\n });\n }\n return message;\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n $scope.delete = function() {\n $scope.hideActionsPopover();\n\n // Add a timeout because alert with cause popover to not close completely, and application can freeze (on mobile)\n // Fix issue #\n setTimeout(function(){\n return UIUtils.alert.confirm('MESSAGE.CONFIRM.REMOVE')\n .then(function(confirm) {\n if (!confirm) return; // Skip\n return esMessage.remove($scope.id, $scope.type)\n .then(function () {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go('app.user_message', {type: $scope.type});\n UIUtils.toast.show('MESSAGE.INFO.MESSAGE_REMOVED');\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_MESSAGE_FAILED'));\n });\n }, 100);\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n if (!$scope.actionsPopover) {\n $ionicPopover.fromTemplateUrl('plugins/es/templates/message/view_popover_actions.html', {\n scope: $scope\n }).then(function(popover) {\n $scope.actionsPopover = popover;\n //Cleanup the popover when we're done with it!\n $scope.$on('$destroy', function() {\n $scope.actionsPopover.remove();\n });\n $scope.actionsPopover.show(event);\n });\n }\n else {\n $scope.actionsPopover.show(event);\n }\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n };\n\n /* -- Modals -- */\n\n $scope.showReplyModal = function() {\n var recipientField = ($scope.type === 'inbox') ? 'issuer' : 'recipient';\n $translate('MESSAGE.REPLY_TITLE_PREFIX')\n .then(function (prefix) {\n var content = $scope.formData.content ? $scope.formData.content.replace(/^/g, ' > ') : null;\n content = content ? content.replace(/\\n/g, '\\n > ') : null;\n content = content ? content +'\\n' : null;\n return esModals.showMessageCompose({\n destPub: $scope.formData[recipientField],\n destUid: $scope.formData.name,\n title: prefix + $scope.formData.title,\n content: content,\n isReply: true\n });\n })\n .then(function(sent) {\n if (sent) {\n UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT')\n .then(function() {\n $ionicHistory.goBack();\n });\n }\n })\n ;\n };\n}\n\nfunction PopoverMessageController($scope, UIUtils, $state, $timeout, csWallet, esHttp, esMessage, esModals) {\n 'ngInject';\n\n var defaultSearchLimit = 40;\n\n $scope.search = {\n loading : true,\n results: null,\n hasMore : false,\n loadingMore : false,\n limit: defaultSearchLimit\n };\n\n $scope.$on('popover.shown', function() {\n if ($scope.search.loading) {\n $scope.load();\n }\n });\n\n $scope.load = function(from, size) {\n var options = {};\n options.from = from || 0;\n options.size = size || defaultSearchLimit;\n return esMessage.notifications.load(options)\n .then(function(notifications) {\n if (!from) {\n $scope.search.results = notifications;\n }\n else {\n $scope.search.results = $scope.search.results.concat(notifications);\n }\n $scope.search.loading = false;\n $scope.search.hasMore = ($scope.search.results && $scope.search.results.length >= $scope.search.limit);\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.search.loading = false;\n if (!from) {\n $scope.search.results = [];\n }\n $scope.search.hasMore = false;\n UIUtils.onError('MESSAGE.ERROR.LOAD_NOTIFICATIONS_FAILED')(err);\n });\n };\n\n $scope.updateView = function() {\n if ($scope.motion && $scope.search.results && $scope.search.results.length) {\n $scope.motion.show({selector: '.popover-notification .item'});\n }\n };\n\n $scope.showMore = function() {\n $scope.search.limit = $scope.search.limit || defaultSearchLimit;\n $scope.search.limit = $scope.search.limit * 2;\n if ($scope.search.limit < defaultSearchLimit) {\n $scope.search.limit = defaultSearchLimit;\n }\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.search.limit)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n // Listen notifications changes\n $scope.onNewMessageNotification = function(notification) {\n if ($scope.search.loading || $scope.search.loadingMore) return;\n $scope.search.results.splice(0,0,notification);\n $scope.updateView();\n };\n\n $scope.select = function(notification) {\n if (!notification.read) notification.read = true;\n $state.go('app.user_view_message', {id: notification.id, type: 'inbox'});\n $scope.closePopover(notification);\n };\n\n $scope.resetData = function() {\n if ($scope.search.loading) return;\n console.debug(\"[ES] [messages] Resetting data (settings or account may have changed)\");\n $scope.search.hasMore = false;\n $scope.search.results = [];\n $scope.search.loading = true;\n delete $scope.search.limit;\n };\n\n\n /* -- Modals -- */\n\n $scope.showNewMessageModal = function(parameters) {\n $scope.closePopover();\n $timeout(function() {\n esModals.showMessageCompose(parameters)\n .then(function(id) {\n if (id) UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT');\n });\n }, 500); // Timeout need, to avoid freeze\n };\n\n /* -- listeners -- */\n\n csWallet.api.data.on.logout($scope, $scope.resetData);\n esHttp.api.node.on.stop($scope, $scope.resetData);\n esHttp.api.node.on.start($scope, $scope.load);\n esMessage.api.data.on.new($scope, $scope.onNewMessageNotification);\n\n}\n","\nNotificationsController.$inject = ['$scope', '$rootScope', '$ionicPopover', '$state', '$timeout', 'UIUtils', 'esHttp', 'csSettings', 'csWallet', 'esNotification'];\nPopoverNotificationsController.$inject = ['$scope', '$timeout', '$controller', 'UIUtils', '$state'];\nangular.module('cesium.es.notification.controllers', ['cesium.es.services'])\n\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.view_notifications', {\n url: \"/notifications\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/notification/view_notifications.html\",\n controller: 'NotificationsCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('NotificationsCtrl', NotificationsController)\n\n .controller('PopoverNotificationsCtrl', PopoverNotificationsController)\n\n;\n\nfunction NotificationsController($scope, $rootScope, $ionicPopover, $state, $timeout, UIUtils, esHttp, csSettings, csWallet, esNotification) {\n 'ngInject';\n\n var defaultSearchLimit = 40;\n\n $scope.search = {\n loading : true,\n results: null,\n hasMore : false,\n loadingMore : false,\n limit: defaultSearchLimit,\n options: {\n codes: {\n excludes: esNotification.constants.EXCLUDED_CODES\n }\n }\n };\n\n $scope.$on('$ionicView.enter', function() {\n if ($scope.search.loading) {\n $scope.load();\n\n // Reset unread counter\n $timeout(function() {\n $scope.resetUnreadCount();\n }, 1000);\n }\n });\n\n $scope.load = function(from, size) {\n var options = angular.copy($scope.search.options);\n options.from = options.from || from || 0;\n options.size = options.size || size || defaultSearchLimit;\n $scope.search.loading = true;\n return esNotification.load(csWallet.data.pubkey, options)\n .then(function(res) {\n if (!from) {\n $scope.search.results = res || [];\n }\n else if (res){\n $scope.search.results = $scope.search.results.concat(res);\n }\n $scope.search.loading = false;\n $scope.search.hasMore = $scope.search.results.length >= $scope.search.limit;\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.search.loading = false;\n if (!from) {\n $scope.search.results = [];\n }\n $scope.search.hasMore = false;\n UIUtils.onError('COMMON.NOTIFICATIONS.LOAD_NOTIFICATIONS_FAILED')(err);\n });\n };\n\n $scope.updateView = function() {\n if ($scope.motion && $scope.motion.ionListClass && $scope.search.results.length) {\n $scope.motion.show({selector: '.view-notification .item'});\n }\n };\n\n $scope.markAllAsRead = function() {\n $scope.hideActionsPopover();\n\n if (!$scope.search.results.length) return;\n\n UIUtils.loading.show()\n .then(function() {\n $rootScope.walletData.notifications.unreadCount = 0;\n var lastNotification = $scope.search.results[0];\n $rootScope.walletData.notifications.readTime = lastNotification ? lastNotification.time : 0;\n _.forEach($scope.search.results, function (item) {\n if (item.markAsRead && typeof item.markAsRead == 'function') item.markAsRead();\n });\n\n return UIUtils.loading.hide();\n });\n };\n\n $scope.resetUnreadCount = function() {\n if (!csWallet.data.notifications.unreadCount || !$scope.search.results || !$scope.search.results.length) return;\n csWallet.data.notifications.unreadCount = 0;\n var lastNotification = $scope.search.results[0];\n var readTime = lastNotification.time ? lastNotification.time : 0;\n if (readTime && (!csSettings.data.wallet || csSettings.data.wallet.notificationReadTime != readTime)) {\n csSettings.data.wallet = csSettings.data.wallet || {};\n csSettings.data.wallet.notificationReadTime = readTime;\n csSettings.store();\n }\n };\n\n $scope.select = function(item) {\n if (item.markAsRead && typeof item.markAsRead == 'function') item.markAsRead();\n if (item.state) {\n $state.go(item.state, item.stateParams);\n }\n };\n\n $scope.showMore = function() {\n $scope.search.limit = $scope.search.limit || defaultSearchLimit;\n $scope.search.limit += defaultSearchLimit;\n if ($scope.search.limit < defaultSearchLimit) {\n $scope.search.limit = defaultSearchLimit;\n }\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.search.limit)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n // Listen notifications changes\n $scope.onNewNotification = function(notification) {\n if ($scope.search.loading || $scope.search.loadingMore) return;\n\n // Retrieve insertion index\n var nextIndex = _.findIndex($scope.search.results, function(n) {\n return notification.time > n.time;\n });\n if (nextIndex < 0) nextIndex = 0;\n\n // Update the array\n $scope.search.results.splice(nextIndex,0,notification);\n $scope.updateView();\n };\n\n $scope.resetData = function() {\n if ($scope.search.loading) return;\n console.debug(\"[ES] [notifications] Resetting data (settings or account may have changed)\");\n $scope.search.hasMore = false;\n $scope.search.results = [];\n $scope.search.loading = true;\n delete $scope.search.limit;\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n if (!$scope.actionsPopover) {\n $ionicPopover.fromTemplateUrl('plugins/es/templates/notification/popover_actions.html', {\n scope: $scope\n }).then(function(popover) {\n $scope.actionsPopover = popover;\n //Cleanup the popover when we're done with it!\n $scope.$on('$destroy', function() {\n $scope.actionsPopover.remove();\n });\n $scope.actionsPopover.show(event);\n });\n }\n else {\n $scope.actionsPopover.show(event);\n }\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n };\n\n /* -- listeners -- */\n\n csWallet.api.data.on.logout($scope, $scope.resetData);\n esHttp.api.node.on.stop($scope, $scope.resetData);\n esHttp.api.node.on.start($scope, $scope.load);\n esNotification.api.data.on.new($scope, $scope.onNewNotification);\n}\n\nfunction PopoverNotificationsController($scope, $timeout, $controller, UIUtils, $state) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('NotificationsCtrl', {$scope: $scope}));\n\n // Disable list motion\n $scope.motion = null;\n\n $scope.$on('popover.shown', function() {\n if ($scope.search.loading) {\n $scope.load();\n }\n });\n\n $scope.updateView = function() {\n if (!$scope.search.results.length) return;\n\n // Set Ink\n $timeout(function() {\n UIUtils.ink({selector: '.popover-notification .item.ink'});\n }, 100);\n };\n\n $scope.$on('popover.hidden', $scope.resetUnreadCount);\n\n $scope.select = function(notification) {\n if (!notification) return; // no selection\n if (notification.markAsRead && typeof notification.markAsRead == 'function') notification.markAsRead();\n if (notification.state) {\n $state.go(notification.state, notification.stateParams);\n }\n $scope.closePopover(notification);\n };\n}\n","\nViewSubscriptionsController.$inject = ['$scope', '$q', '$ionicHistory', 'csWot', 'csWallet', 'UIUtils', 'ModalUtils', 'esSubscription'];\nModalEmailSubscriptionsController.$inject = ['$scope', 'Modals', 'csSettings', 'esHttp', 'csWot', 'esModals', 'parameters'];angular.module('cesium.es.subscription.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n\n $stateProvider\n .state('app.edit_subscriptions', {\n cache: false,\n url: \"/wallet/subscriptions\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/subscription/edit_subscriptions.html\",\n controller: 'ViewSubscriptionsCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n\n .state('app.edit_subscriptions_by_id', {\n cache: false,\n url: \"/wallets/:id/subscriptions\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/subscription/edit_subscriptions.html\",\n controller: 'ViewSubscriptionsCtrl'\n }\n },\n data: {\n login: true,\n minData: true\n }\n });\n\n }])\n\n .controller('ViewSubscriptionsCtrl', ViewSubscriptionsController)\n\n .controller('ModalEmailSubscriptionsCtrl', ModalEmailSubscriptionsController)\n\n;\n\nfunction ViewSubscriptionsController($scope, $q, $ionicHistory, csWot, csWallet, UIUtils, ModalUtils, esSubscription) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.popupData = {}; // need for the node popup\n $scope.search = {\n results: [],\n loading: true\n };\n $scope.emailFrequencies = [\n {id: \"daily\", label: \"daily\"},\n {id: \"weekly\", label: \"weekly\"}\n ];\n\n var wallet;\n\n $scope.enter = function(e, state) {\n\n // First load\n if ($scope.loading) {\n\n wallet = (state.stateParams && state.stateParams.id) ? csWallet.children.get(state.stateParams.id) : csWallet;\n if (!wallet) {\n UIUtils.alert.error('ERROR.UNKNOWN_WALLET_ID');\n return $scope.showHome();\n }\n\n $scope.loadWallet({\n wallet: wallet,\n auth: true,\n minData: true\n })\n .then(function() {\n UIUtils.loading.hide();\n return $scope.load();\n })\n .then(function() {\n $scope.showFab('fab-add-subscription-record');\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n UIUtils.loading.hide(10);\n $scope.loading=true; // reset for force reload next time\n $ionicHistory.goBack();\n return;\n }\n UIUtils.onError('SUBSCRIPTION.ERROR.LOAD_SUBSCRIPTIONS_FAILED')(err);\n });\n }\n\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function() {\n $scope.loading = true; // to avoid the call of doSave()\n return esSubscription.record.load(wallet.data.pubkey, wallet.data.keypair)\n .then(function(results) {\n // Group by type\n var groups = _.groupBy((results || []), function (record) {\n return [record.type, record.recipient].join('|');\n });\n return _.keys(groups).reduce(function (res, key) {\n var parts = key.split('|');\n return res.concat({\n type: parts[0],\n recipient: parts[1],\n items: groups[key]\n });\n }, []);\n })\n .then(function(results) {\n return csWot.extendAll(results, 'recipient');\n })\n // Display result\n .then($scope.updateView)\n .catch(function(err){\n UIUtils.loading.hide(10);\n if (err && err.ucode == 404) {\n $scope.updateView([]);\n $scope.existing = false;\n }\n else {\n UIUtils.onError('PROFILE.ERROR.LOAD_PROFILE_FAILED')(err);\n }\n });\n };\n\n $scope.updateView = function(results) {\n if (results) {\n $scope.search.results = results;\n }\n\n if ($scope.search.results && $scope.search.results.length) {\n $scope.motion.show();\n }\n $scope.search.loading = false;\n };\n\n $scope.addSubscription = function() {\n var type;\n $scope.showCategoryModal()\n .then(function(cat) {\n if (!cat) return;\n type = cat.id;\n // get subscription parameters\n if (type === 'email') {\n return $scope.showEmailModal();\n }\n else {\n UIUtils.alert.notImplemented();\n }\n })\n .then(function(record) {\n if (!record) return;\n UIUtils.loading.show();\n esSubscription.record.add(record, wallet)\n .then($scope.addToUI)\n .then(function() {\n wallet.data.subscriptions = wallet.data.subscriptions || {count: 0};\n wallet.data.subscriptions.count++;\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(UIUtils.onError('SUBSCRIPTION.ERROR.ADD_SUBSCRIPTION_FAILED'));\n });\n };\n\n $scope.editSubscription = function(record) {\n\n // get subscription parameters\n var promise;\n var oldRecord = angular.copy(record);\n if (record.type === 'email') {\n promise = $scope.showEmailModal(record);\n }\n if (!promise) return;\n return promise\n .then(function(res) {\n if (!res) return;\n UIUtils.loading.show();\n record.id = oldRecord.id;\n return esSubscription.record.update(record, wallet)\n .then(function() {\n // If recipient change, update in results\n if (oldRecord.type !== record.type ||\n oldRecord.recipient !== record.recipient) {\n $scope.removeFromUI(oldRecord);\n return $scope.addToUI(record);\n }\n })\n .then(function() {\n UIUtils.loading.hide();\n $scope.updateView();\n })\n .catch(UIUtils.onError('SUBSCRIPTION.ERROR.UPDATE_SUBSCRIPTION_FAILED'));\n });\n };\n\n $scope.deleteSubscription = function(record, confirm) {\n if (!record || !record.id) return;\n\n if (!confirm) {\n return UIUtils.alert.confirm('SUBSCRIPTION.CONFIRM.DELETE_SUBSCRIPTION')\n .then(function(confirm) {\n if (confirm) return $scope.deleteSubscription(record, confirm);\n });\n }\n\n UIUtils.loading.show();\n esSubscription.record.remove(record.id, {wallet: wallet})\n .then(function() {\n wallet.data.subscriptions = wallet.data.subscriptions || {count: 1};\n wallet.data.subscriptions.count--;\n $scope.removeFromUI(record);\n UIUtils.loading.hide();\n })\n .catch(UIUtils.onError('SUBSCRIPTION.ERROR.DELETE_SUBSCRIPTION_FAILED'));\n };\n\n $scope.removeFromUI = function(record) {\n var subscriptions = _.findWhere($scope.search.results, {type: record.type, recipient: record.recipient});\n var index = _.findIndex(subscriptions.items, record);\n if (index >= 0) {\n subscriptions.items.splice(index, 1);\n }\n if (!subscriptions.items.length) {\n index = _.findIndex($scope.search.results, subscriptions);\n $scope.search.results.splice(index, 1);\n }\n };\n\n $scope.addToUI = function(record) {\n $scope.search.results = $scope.search.results || [];\n var subscriptions = _.findWhere($scope.search.results,\n {type: record.type, recipient: record.recipient});\n\n if (!subscriptions) {\n subscriptions = {type: record.type, recipient: record.recipient, items: []};\n return csWot.extendAll([subscriptions], 'recipient')\n .then(function(){\n subscriptions.items.push(record);\n $scope.search.results.push(subscriptions);\n return record;\n });\n }\n\n subscriptions.items.push(record);\n return $q.when(record);\n };\n\n /* -- modals -- */\n\n $scope.showCategoryModal = function() {\n // load categories\n return esSubscription.category.all()\n .then(function(categories){\n return ModalUtils.show('plugins/es/templates/common/modal_category.html', 'ESCategoryModalCtrl as ctrl',\n {categories : categories},\n {focusFirstInput: true}\n );\n })\n .then(function(cat){\n if (cat && cat.parent) {\n return cat;\n }\n });\n };\n\n $scope.showEmailModal = function(parameters) {\n return ModalUtils.show('plugins/es/templates/subscription/modal_email.html','ModalEmailSubscriptionsCtrl',\n parameters, {focusFirstInput: true});\n };\n}\n\n\nfunction ModalEmailSubscriptionsController($scope, Modals, csSettings, esHttp, csWot, esModals, parameters) {\n 'ngInject';\n\n $scope.frequencies = [\n {id: \"daily\", label: \"daily\"},\n {id: \"weekly\", label: \"weekly\"}\n ];\n $scope.formData = parameters || {};\n $scope.formData.content = $scope.formData.content || {};\n $scope.formData.content.frequency = $scope.formData.content.frequency || $scope.frequencies[0].id; // set to first value\n $scope.recipient = {};\n\n $scope.$on('modal.shown', function() {\n // Load recipient (avatar, name...)\n if ($scope.formData.recipient) {\n $scope.recipient = {pubkey: $scope.formData.recipient};\n return csWot.extendAll([$scope.recipient]);\n }\n else {\n return esHttp.network.peering.self()\n .then(function(res){\n if (!res) return;\n $scope.formData.recipient = res.pubkey;\n $scope.recipient = {pubkey: $scope.formData.recipient};\n return csWot.extendAll([$scope.recipient]);\n });\n }\n });\n\n // Submit\n $scope.doSubmit = function() {\n $scope.form.$submitted = true;\n if (!$scope.form.$valid || !$scope.formData.content.email || !$scope.formData.content.frequency) return;\n\n var record = {\n type: 'email',\n recipient: $scope.formData.recipient,\n content: {\n email: $scope.formData.content.email,\n locale: csSettings.data.locale.id,\n frequency: $scope.formData.content.frequency\n }\n };\n $scope.closeModal(record);\n };\n\n $scope.cancel = function() {\n $scope.closeModal();\n };\n\n if (!!$scope.subscriptionForm) {\n $scope.subscriptionForm.$setPristine();\n }\n\n $scope.showNetworkLookup = function() {\n return esModals.showNetworkLookup({\n enableFilter: true,\n endpointFilter: esHttp.constants.ES_SUBSCRIPTION_API\n })\n .then(function (peer) {\n if (peer) {\n $scope.recipient = peer;\n $scope.formData.recipient = peer.pubkey;\n }\n });\n\n };\n}\n","\nESDocumentLookupController.$inject = ['$scope', '$ionicPopover', '$location', '$timeout', 'csSettings', 'csWallet', 'UIUtils', 'esHttp', 'esDocument'];\nESLastDocumentsController.$inject = ['$scope', '$controller', '$timeout', '$state'];angular.module('cesium.es.document.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.document_search', {\n url: \"/data/search/:index/:type?q\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/document/lookup.html\",\n controller: 'ESDocumentLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n ;\n }])\n\n .controller('ESDocumentLookupCtrl', ESDocumentLookupController)\n\n .controller('ESLastDocumentsCtrl', ESLastDocumentsController)\n;\n\nfunction ESDocumentLookupController($scope, $ionicPopover, $location, $timeout,\n csSettings, csWallet, UIUtils, esHttp, esDocument) {\n 'ngInject';\n\n $scope.search = $scope.search || {\n loading: true,\n hasMore: false,\n text: undefined,\n index: 'invitation',\n type: 'certification',\n results: [],\n sort: 'time',\n asc: false,\n loadingMore: false\n };\n $scope.entered = false;\n $scope.searchTextId = 'documentSearchText';\n $scope.ionItemClass = 'item-border-large';\n $scope.defaultSizeLimit = $scope.defaultSizeLimit || (UIUtils.screen.isSmall() ? 50 : 100);\n $scope.helptipPrefix = 'helptip-document';\n $scope.compactMode = angular.isDefined($scope.compactMode) ? $scope.compactMode : true;\n $scope._source = $scope._source || [\"issuer\", \"hash\", \"time\", \"creationTime\", \"title\", \"message\"];\n\n /**\n * Enter into the view\n * @param e\n * @param state\n */\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n $scope.entered = true;\n $scope.search.index = state.stateParams && state.stateParams.index || $scope.search.index;\n $scope.search.type = state.stateParams && state.stateParams.type || $scope.search.type;\n $scope.search.text = state.stateParams && state.stateParams.q || $scope.search.text;\n $scope.search.last = !$scope.search.text;\n $scope.load();\n }\n $scope.expertMode = angular.isDefined($scope.expertMode) ? $scope.expertMode : !UIUtils.screen.isSmall() && csSettings.data.expertMode;\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.computeOptions = function(offset, size) {\n var options = {\n index: $scope.search.index,\n type: $scope.search.type,\n from: offset || 0,\n size: size || $scope.defaultSizeLimit\n };\n\n // add sort\n if ($scope.search.sort) {\n options.sort = {};\n options.sort[$scope.search.sort] = (!$scope.search.asc ? \"desc\" : \"asc\");\n }\n else { // default sort\n options.sort = {time:'desc'};\n }\n\n // Included fields\n options._source = options._source || $scope._source;\n\n return options;\n };\n\n $scope.load = function(offset, size, silent) {\n if ($scope.search.error) return;\n\n var options = $scope.computeOptions(offset, size);\n\n $scope.search.loading = !silent;\n\n var searchFn = $scope.search.last ?\n esDocument.search(options) :\n esDocument.searchText($scope.search.text||'', options);\n return searchFn\n .then(function(res) {\n if (!offset) {\n $scope.search.results = res.hits;\n $scope.search.took = res.took;\n }\n else {\n $scope.search.results = $scope.search.results.concat(res.hits);\n }\n $scope.search.total = res.total;\n\n UIUtils.loading.hide();\n $scope.search.loading = false;\n $scope.search.hasMore = res.hits && res.hits.length > 0 && res.total > $scope.search.results.length;\n\n $scope.updateView();\n })\n .catch(function(err) {\n $scope.search.results = [];\n $scope.search.loading = false;\n $scope.search.error = true;\n $scope.search.hasMore = false;\n UIUtils.onError('DOCUMENT.ERROR.LOAD_DOCUMENTS_FAILED')(err)\n .then(function() {\n $scope.search.error = false;\n });\n });\n };\n\n $scope.updateView = function() {\n if ($scope.motion && $scope.search.results && $scope.search.results.length) {\n $scope.motion.show({selector: '.list .item.item-document'});\n }\n $scope.$broadcast('$$rebind::rebind'); // notify binder\n };\n\n $scope.doSearchText = function() {\n $scope.search.last = $scope.search.text ? false : true;\n return $scope.load()\n .then(function() {\n // Update location href\n $location.search({q: $scope.search.text}).replace();\n });\n };\n\n $scope.doSearchLast = function() {\n $scope.search.last = true;\n $scope.search.text = undefined;\n return $scope.load();\n };\n\n $scope.removeAll = function() {\n $scope.hideActionsPopover();\n if (!$scope.search.results || !$scope.search.results.length) return;\n\n return UIUtils.alert.confirm('DOCUMENT.CONFIRM.REMOVE_ALL')\n .then(function(confirm) {\n if (!confirm) return;\n UIUtils.loading.show();\n return esDocument.removeAll($scope.search.results)\n .then(function() {\n $scope.search.loading = false;\n return $timeout(function() {\n UIUtils.toast.show('DOCUMENT.INFO.REMOVED'); // toast\n return $scope.load();\n }, 1000 /*waiting propagation*/);\n })\n .catch(UIUtils.onError('DOCUMENT.ERROR.REMOVE_ALL_FAILED'));\n });\n };\n\n $scope.remove = function($event, index) {\n var doc = $scope.search.results[index];\n if (!doc || $event.defaultPrevented) return;\n $event.stopPropagation();\n\n UIUtils.alert.confirm('DOCUMENT.CONFIRM.REMOVE')\n .then(function(confirm) {\n if (!confirm) return;\n return esDocument.remove(doc)\n .then(function () {\n $scope.search.results.splice(index,1); // remove from messages array\n $scope.$broadcast('$$rebind::rebind'); // notify binder\n UIUtils.toast.show('DOCUMENT.INFO.REMOVED'); // toast\n })\n .catch(UIUtils.onError('MESSAGE.ERROR.REMOVE_FAILED'));\n });\n };\n\n $scope.selectDocument = function(event, doc) {\n console.debug(\"Selected document: \", doc, esHttp);\n\n var url = esHttp.getUrl('/{0}/{1}/_search?pretty&q=_id:{2}'.format(doc.index, doc.type, doc.id));\n return $scope.openLink(event, url);\n };\n\n $scope.toggleCompactMode = function() {\n $scope.compactMode = !$scope.compactMode;\n $scope.updateView();\n\n // Workaround to re-initialized the <ion-infinite-loop>\n if (!$scope.search.hasMore && $scope.search.results.length && $scope.search.type == 'last') {\n $timeout(function() {\n $scope.search.hasMore = true;\n }, 500);\n }\n };\n\n $scope.toggleSort = function(sort){\n if ($scope.search.sort === sort && !$scope.search.asc) {\n $scope.search.asc = undefined;\n $scope.search.sort = undefined;\n }\n else {\n $scope.search.asc = ($scope.search.sort === sort) ? !$scope.search.asc : true;\n $scope.search.sort = sort;\n }\n $scope.load();\n };\n\n $scope.showMore = function() {\n if ($scope.search.loading) return;\n $scope.search.loadingMore = true;\n $scope.load(\n $scope.search.results.length, // from\n $scope.defaultSizeLimit,\n true/*silent*/)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.startListenChanges = function() {\n var now = Date.now();\n var source = $scope.search.index + '/' + $scope.search.type;\n var wsChanges = esHttp.websocket.changes(source);\n return wsChanges.open()\n .then(function(){\n console.debug(\"[ES] [document] Websocket opened in {0} ms\".format(Date.now()- now));\n wsChanges.on(function(change) {\n if (!$scope.search.last || !change) return; // ignore\n esDocument.fromHit(change)\n .then(function(doc) {\n if (change._operation === 'DELETE') {\n $scope.onDeleteDocument(doc);\n }\n else {\n $scope.onNewDocument(doc);\n }\n });\n });\n });\n };\n\n $scope.onNewDocument = function(document) {\n if (!$scope.search.last || $scope.search.loading) return; // skip\n console.debug(\"[ES] [document] Detected new document: \", document);\n var index = _.findIndex($scope.search.results, {id: document.id, index: document.index, type: document.type});\n if (index < 0) {\n $scope.search.total++;\n $scope.search.results.splice(0, 0, document);\n }\n else {\n document.updated = true;\n $timeout(function() {\n document.updated = false;\n }, 2000);\n $scope.search.results.splice(index, 1, document);\n }\n $scope.updateView();\n };\n\n $scope.onDeleteDocument = function(document) {\n if (!$scope.search.last || $scope.search.loading) return; // skip\n $timeout(function() {\n var index = _.findIndex($scope.search.results, {id: document.id, index: document.index, type: document.type});\n if (index < 0) return; // skip if not found\n console.debug(\"[ES] [document] Detected document deletion: \", document);\n $scope.search.results.splice(index, 1);\n $scope.search.total--;\n $scope.updateView();\n }, 750);\n };\n\n /* -- Modals -- */\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/es/templates/document/lookup_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n /* -- watch events -- */\n\n $scope.resetData = function() {\n if ($scope.search.loading) return;\n console.debug(\"[ES] [document] Resetting data (settings or account may have changed)\");\n // Reset all data\n $scope.search.results = [];\n $scope.search.loading = false;\n $scope.search.total = undefined;\n $scope.search.loadingMore = false;\n $scope.entered = false;\n delete $scope.search.limit;\n };\n\n csWallet.api.data.on.logout($scope, $scope.resetData);\n\n // for DEV only\n /*$timeout(function() {\n // launch default action fo DEV\n }, 900);\n */\n}\n\n\nfunction ESLastDocumentsController($scope, $controller, $timeout, $state) {\n 'ngInject';\n\n $scope.search = {\n loading: true,\n hasMore: true,\n text: undefined,\n index: 'user,page,group', type: 'profile,record,comment',\n results: undefined,\n sort: 'time',\n asc: false\n };\n $scope.expertMode = false;\n $scope.defaultSizeLimit = 20;\n $scope._source = [\"issuer\", \"hash\", \"time\", \"creationTime\", \"title\", \"avatar._content_type\", \"city\", \"message\", \"record\"];\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESDocumentLookupCtrl', {$scope: $scope}));\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n $scope.selectDocument = function(event, doc) {\n if (!doc || !event || event.defaultPrevented) return;\n event.stopPropagation();\n var anchor;\n if (doc.index === \"user\" && doc.type === \"profile\") {\n $state.go('app.user_identity', {pubkey: doc.pubkey, name: doc.name});\n }\n else if (doc.index === \"page\" && doc.type === \"record\") {\n $state.go('app.view_page', {title: doc.title, id: doc.id});\n }\n else if (doc.index === \"page\" && doc.type === \"comment\") {\n anchor = $filter('formatHash')(doc.id);\n $state.go('app.view_page_anchor', {title: doc.title, id: doc.record, anchor: anchor});\n }\n else if (doc.index === \"group\" && doc.type === \"record\") {\n $state.go('app.view_group', {title: doc.title, id: doc.id});\n }\n else if (doc.index === \"group\" && doc.type === \"comment\") {\n anchor = $filter('formatHash')(doc.id);\n $state.go('app.view_group_anchor', {title: doc.title, id: doc.record, anchor: anchor});\n }\n else {\n console.warn(\"Click on this kind of document not implement yet!\", doc);\n }\n };\n\n // Override parent function computeOptions\n var inheritedComputeOptions = $scope.computeOptions;\n $scope.computeOptions = function(offset, size){\n // Cal inherited function\n var options = inheritedComputeOptions(offset, size);\n\n if (!options.sort || options.sort.time) {\n var side = options.sort && options.sort.time || side;\n options.sort = [\n //{'creationTime': side},\n {'time': side}\n ];\n }\n\n options._source = options._source || $scope._source;\n options.getTimeFunction = function(doc) {\n doc.time = doc.creationTime || doc.time;\n return doc.time;\n };\n return options;\n };\n\n // Listen for changes\n $timeout(function() {\n $scope.startListenChanges();\n }, 1000);\n}\n","\nESNetworkLookupController.$inject = ['$scope', '$state', '$location', '$ionicPopover', '$window', '$translate', 'esHttp', 'UIUtils', 'csConfig', 'csSettings', 'csCurrency', 'esNetwork', 'csWot'];\nESNetworkLookupModalController.$inject = ['$scope', '$controller', 'parameters'];\nESPeerViewController.$inject = ['$scope', '$q', '$window', '$state', 'UIUtils', 'csWot', 'esHttp', 'csHttp', 'csSettings'];\nESNetworkLookupPopoverController.$inject = ['$scope', '$controller'];\nESPeerInfoPopoverController.$inject = ['$scope', '$q', 'csSettings', 'csCurrency', 'csHttp', 'esHttp'];\nangular.module('cesium.es.network.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.es_network', {\n url: \"/network/data?online&expert\",\n cache: false, // fix #766\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/network/view_es_network.html\",\n controller: 'ESNetworkLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n\n .state('app.view_es_peer', {\n url: \"/network/data/peer/:server?ssl&tor\",\n cache: false,\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/network/view_es_peer.html\",\n controller: 'ESPeerViewCtrl'\n }\n },\n data: {\n preferHttp: true // avoid HTTPS if config has httpsMode=clever\n }\n });\n }])\n\n .controller('ESNetworkLookupCtrl', ESNetworkLookupController)\n\n .controller('ESNetworkLookupModalCtrl', ESNetworkLookupModalController)\n\n .controller('ESPeerViewCtrl', ESPeerViewController)\n\n .controller('ESNetworkLookupPopoverCtrl', ESNetworkLookupPopoverController)\n\n .controller('ESPeerInfoPopoverCtrl', ESPeerInfoPopoverController)\n\n;\n\nfunction ESNetworkLookupController($scope, $state, $location, $ionicPopover, $window, $translate,\n esHttp, UIUtils, csConfig, csSettings, csCurrency, esNetwork, csWot) {\n 'ngInject';\n\n $scope.networkStarted = false;\n $scope.ionItemClass = '';\n $scope.expertMode = csSettings.data.expertMode && !UIUtils.screen.isSmall();\n $scope.isHttps = ($window.location.protocol === 'https:');\n $scope.search = {\n text: '',\n loading: true,\n online: true,\n results: [],\n endpointFilter: esHttp.constants.GCHANGE_API,\n sort : undefined,\n asc: true\n };\n $scope.listeners = [];\n $scope.helptipPrefix = 'helptip-network';\n $scope.enableLocationHref = true; // can be overrided by sub-controller (e.g. popup)\n\n $scope.removeListeners = function() {\n if ($scope.listeners.length) {\n console.debug(\"[ES] [network] Closing listeners\");\n _.forEach($scope.listeners, function(remove){\n remove();\n });\n $scope.listeners = [];\n }\n };\n\n /**\n * Enter in view\n */\n $scope.enter = function(e, state) {\n if ($scope.networkStarted) return;\n $scope.networkStarted = true;\n $scope.search.loading = true;\n csCurrency.get()\n .then(function (currency) {\n if (currency) {\n $scope.node = !esHttp.node.same(currency.node.host, currency.node.port) ?\n esHttp.instance(currency.node.host, currency.node.port) : esHttp;\n if (state && state.stateParams) {\n if (state.stateParams.online == 'true') {\n $scope.search.online = true;\n }\n if (state.stateParams.expert) {\n $scope.expertMode = (state.stateParams.expert == 'true');\n }\n }\n $scope.load();\n }\n })\n .catch(function(err) {\n UIUtils.onError('ERROR.GET_CURRENCY_FAILED')(err);\n $scope.networkStarted = false;\n });\n };\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n /**\n * Leave the view\n */\n $scope.leave = function() {\n if (!$scope.networkStarted) return;\n $scope.removeListeners();\n esNetwork.close();\n $scope.networkStarted = false;\n $scope.search.loading = true;\n };\n $scope.$on('$ionicView.beforeLeave', $scope.leave);\n $scope.$on('$ionicParentView.beforeLeave', $scope.leave);\n $scope.$on('$destroy', $scope.leave);\n\n\n $scope.computeOptions = function() {\n var options = {\n filter: {\n member: (!$scope.search.type || $scope.search.type === 'member'),\n mirror: (!$scope.search.type || $scope.search.type === 'mirror'),\n endpointFilter : (angular.isDefined($scope.search.endpointFilter) ? $scope.search.endpointFilter : null),\n online: $scope.search.online && true\n },\n sort: {\n type : $scope.search.sort,\n asc : $scope.search.asc\n },\n expertMode: $scope.expertMode,\n // larger timeout when on expert mode\n timeout: csConfig.timeout && ($scope.expertMode ? (csConfig.timeout / 10) : (csConfig.timeout / 100))\n };\n return options;\n };\n\n $scope.load = function() {\n\n if ($scope.search.loading){\n esNetwork.start($scope.node, $scope.computeOptions());\n\n // Catch event on new peers\n $scope.refreshing = false;\n $scope.listeners.push(\n esNetwork.api.data.on.changed($scope, function(data){\n if (!$scope.refreshing) {\n $scope.refreshing = true;\n csWot.extendAll(data.peers)\n .then(function() {\n // Avoid to refresh if view has been leaving\n if ($scope.networkStarted) {\n $scope.updateView(data);\n }\n $scope.refreshing = false;\n });\n }\n }));\n }\n };\n\n $scope.updateView = function(data) {\n console.debug(\"[peers] Updating UI\");\n $scope.search.results = data.peers;\n $scope.search.memberPeersCount = data.memberPeersCount;\n // Always tru if network not started (e.g. after leave+renter the view)\n $scope.search.loading = !$scope.networkStarted || esNetwork.isBusy();\n if ($scope.motion && $scope.search.results && $scope.search.results.length > 0) {\n $scope.motion.show({selector: '.item-peer'});\n }\n if (!$scope.loading) {\n $scope.$broadcast('$$rebind::' + 'rebind'); // force data binding\n }\n };\n\n $scope.refresh = function() {\n // Network\n $scope.search.loading = true;\n return esNetwork.loadPeers();\n };\n\n $scope.sort = function() {\n $scope.search.loading = true;\n $scope.refreshing = true;\n esNetwork.sort($scope.computeOptions());\n $scope.updateView(esNetwork.data);\n };\n\n $scope.toggleOnline = function(online){\n $scope.hideActionsPopover();\n $scope.search.online = (online !== false);\n esNetwork.close();\n $scope.search.loading = true;\n $scope.load();\n\n // Update location href\n if ($scope.enableLocationHref) {\n $location.search({online: $scope.search.online}).replace();\n }\n };\n\n $scope.toggleSearchEndpoint = function(endpoint){\n $scope.hideActionsPopover();\n if ($scope.search.endpointFilter === endpoint || endpoint === null) {\n $scope.search.endpointFilter = null;\n }\n else {\n $scope.search.endpointFilter = endpoint;\n }\n $scope.sort();\n };\n\n $scope.toggleSort = function(sort){\n if ($scope.search.sort === sort && !$scope.search.asc) {\n $scope.search.asc = undefined;\n $scope.search.sort = undefined;\n }\n else {\n $scope.search.asc = ($scope.search.sort === sort) ? !$scope.search.asc : true;\n $scope.search.sort = sort;\n }\n $scope.sort();\n };\n\n $scope.selectPeer = function(peer) {\n // Skip offline\n if (!peer.online ) return;\n\n var stateParams = {server: peer.getServer()};\n if (peer.isSsl()) {\n stateParams.ssl = true;\n }\n if (peer.isTor()) {\n stateParams.tor = true;\n }\n $state.go('app.view_es_peer', stateParams);\n };\n\n $scope.$on('csView.action.refresh', function(event, context) {\n if (context === 'peers') {\n $scope.refresh();\n }\n });\n\n $scope.$on('csView.action.showActionsPopover', function(event, clickEvent) {\n $scope.showActionsPopover(clickEvent);\n });\n\n /* -- popover -- */\n\n $scope.showActionsPopover = function(event) {\n if (!$scope.actionsPopover) {\n $ionicPopover.fromTemplateUrl('templates/network/lookup_popover_actions.html', {\n scope: $scope\n }).then(function(popover) {\n $scope.actionsPopover = popover;\n //Cleanup the popover when we're done with it!\n $scope.$on('$destroy', function() {\n $scope.actionsPopover.remove();\n });\n $scope.actionsPopover.show(event);\n });\n }\n else {\n $scope.actionsPopover.show(event);\n }\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n };\n\n $scope.showEndpointsPopover = function($event, peer, endpointFilter) {\n var endpoints = peer.getEndpoints(endpointFilter);\n endpoints = (endpoints||[]).reduce(function(res, ep) {\n var bma = esHttp.node.parseEndPoint(ep);\n return res.concat({\n label: 'NETWORK.VIEW.NODE_ADDRESS',\n value: peer.getServer() + (bma.path||'')\n });\n }, []);\n if (!endpoints.length) return;\n\n UIUtils.popover.show($event, {\n templateUrl: 'templates/network/popover_endpoints.html',\n bindings: {\n titleKey: 'NETWORK.VIEW.ENDPOINTS.' + endpointFilter,\n items: endpoints\n }\n });\n $event.stopPropagation();\n };\n\n $scope.showWs2pPopover = function($event, peer) {\n $event.stopPropagation();\n\n return $translate('NETWORK.VIEW.PRIVATE_ACCESS')\n .then(function(privateAccessMessage) {\n UIUtils.popover.show($event, {\n templateUrl: 'templates/network/popover_endpoints.html',\n bindings: {\n titleKey: 'NETWORK.VIEW.ENDPOINTS.WS2P',\n valueKey: 'NETWORK.VIEW.NODE_ADDRESS',\n items: [\n {\n label: 'NETWORK.VIEW.NODE_ADDRESS',\n value: !peer.bma.private ? (peer.getServer() + (peer.bma.path||'')) : privateAccessMessage\n },\n {\n label: 'NETWORK.VIEW.WS2PID',\n value: peer.bma.ws2pid\n },\n {\n label: 'NETWORK.VIEW.POW_PREFIX',\n value: peer.powPrefix\n }]\n }\n });\n });\n };\n}\n\n\nfunction ESNetworkLookupModalController($scope, $controller, parameters) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESNetworkLookupCtrl', {$scope: $scope}));\n\n // Read parameters\n parameters = parameters || {};\n $scope.enableFilter = angular.isDefined(parameters.enableFilter) ? parameters.enableFilter : true;\n $scope.search.type = angular.isDefined(parameters.type) ? parameters.type : $scope.search.type;\n $scope.search.endpointFilter = angular.isDefined(parameters.endpointFilter) ? parameters.endpointFilter : $scope.search.endpointFilter;\n $scope.expertMode = angular.isDefined(parameters.expertMode) ? parameters.expertMode : $scope.expertMode;\n $scope.ionItemClass = parameters.ionItemClass || 'item-border-large';\n $scope.enableLocationHref = false;\n $scope.helptipPrefix = '';\n\n $scope.selectPeer = function(peer) {\n $scope.closeModal(peer);\n };\n\n $scope.$on('modal.hidden', function(){\n $scope.leave();\n });\n\n // Disable this unsed method - called by load()\n $scope.showHelpTip = function() {};\n\n // Enter the modal\n $scope.enter();\n}\n\n\nfunction ESNetworkLookupPopoverController($scope, $controller) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('NetworkLookupCtrl', {$scope: $scope}));\n\n // Read parameters\n var parameters = parameters || {};\n $scope.enableFilter = angular.isDefined(parameters.enableFilter) ? parameters.enableFilter : true;\n $scope.search.type = angular.isDefined(parameters.type) ? parameters.type : $scope.search.type;\n $scope.search.endpointFilter = angular.isDefined(parameters.endpointFilter) ? parameters.endpointFilter : $scope.search.endpointFilter;\n $scope.expertMode = angular.isDefined(parameters.expertMode) ? parameters.expertMode : $scope.expertMode;\n $scope.ionItemClass = parameters.ionItemClass || 'item-border-large';\n $scope.helptipPrefix = '';\n\n $scope.selectPeer = function(peer) {\n $scope.closePopover(peer);\n };\n\n $scope.$on('popover.hidden', function(){\n $scope.leave();\n });\n\n // Disable this unsed method - called by load()\n $scope.showHelpTip = function() {};\n\n // Enter the popover\n $scope.enter();\n}\n\nfunction ESPeerInfoPopoverController($scope, $q, csSettings, csCurrency, csHttp, esHttp) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.formData = {};\n\n $scope.load = function() {\n\n $scope.loading = true;\n $scope.formData = {};\n\n return $q.all([\n // get current block\n csCurrency.blockchain.current()\n .then(function(block) {\n $scope.formData.number = block.number;\n $scope.formData.medianTime = block.medianTime;\n $scope.formData.powMin = block.powMin;\n $scope.formData.useSsl = esHttp.useSsl;\n })\n .catch(function() {\n delete $scope.formData.number;\n delete $scope.formData.medianTime;\n delete $scope.formData.powMin;\n delete $scope.formData.useSsl;\n // continue\n }),\n\n // Get node current version\n esHttp.node.summary()\n .then(function(res){\n $scope.formData.version = res && res.duniter && res.duniter.version;\n $scope.formData.software = res && res.duniter && res.duniter.software;\n })\n .catch(function() {\n delete $scope.formData.version;\n delete $scope.formData.software;\n // continue\n }),\n\n // Get duniter latest version\n esHttp.version.latest()\n .then(function(latestRelease){\n $scope.formData.latestRelease = latestRelease;\n })\n .catch(function() {\n delete $scope.formData.latestRelease;\n // continue\n })\n ])\n .then(function() {\n // Compare, to check if newer\n if ($scope.formData.latestRelease && $scope.formData.software == 'duniter') {\n var compare = csHttp.version.compare($scope.formData.version, $scope.formData.latestRelease.version);\n $scope.formData.isPreRelease = compare > 0;\n $scope.formData.hasNewRelease = compare < 0;\n }\n else {\n $scope.formData.isPreRelease = false;\n $scope.formData.hasNewRelease = false;\n }\n $scope.loading = false;\n $scope.$broadcast('$$rebind::' + 'rebind'); // force data binding\n });\n };\n\n // Update UI on new block\n csCurrency.api.data.on.newBlock($scope, function(block) {\n if ($scope.loading) return;\n console.debug(\"[peer info] Received new block. Reload content\");\n $scope.load();\n });\n\n // Update UI on settings changed\n csSettings.api.data.on.changed($scope, function(data) {\n if ($scope.loading) return;\n console.debug(\"[peer info] Peer settings changed. Reload content\");\n $scope.load();\n });\n\n // Load data when enter\n $scope.load();\n}\n\nfunction ESPeerViewController($scope, $q, $window, $state, UIUtils, csWot, esHttp, csHttp, csSettings) {\n 'ngInject';\n\n $scope.node = {};\n $scope.loading = true;\n $scope.isHttps = ($window.location.protocol === 'https:');\n $scope.isReachable = true;\n $scope.options = {\n document: {\n index : csSettings.data.plugins.es && csSettings.data.plugins.es.document && csSettings.data.plugins.es.document.index || 'user',\n type: csSettings.data.plugins.es && csSettings.data.plugins.es.document && csSettings.data.plugins.es.document.type || 'profile'\n }\n };\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.$on('$ionicView.enter', function(e, state) {\n var isDefaultNode = !state.stateParams || !state.stateParams.server;\n var server = state.stateParams && state.stateParams.server || esHttp.server;\n var useSsl = state.stateParams && state.stateParams.ssl == \"true\" || (isDefaultNode ? esHttp.useSsl : false);\n var useTor = state.stateParams.tor == \"true\" || (isDefaultNode ? esHttp.useTor : false);\n\n return $scope.load(server, useSsl, useTor)\n .then(function() {\n return $scope.$broadcast('$csExtension.enter', e, state);\n })\n .then(function(){\n $scope.loading = false;\n });\n });\n\n $scope.load = function(server, useSsl, useTor) {\n var node = {\n server: server,\n host: server,\n useSsl: useSsl,\n useTor: useTor\n };\n var serverParts = server.split(':');\n if (serverParts.length == 2) {\n node.host = serverParts[0];\n node.port = serverParts[1];\n }\n node.url = csHttp.getUrl(node.host, node.port, undefined/*path*/, node.useSsl);\n\n angular.merge($scope.node,\n useTor ?\n // For TOR, use a web2tor to access the endpoint\n esHttp.lightInstance(node.host + \".to\", 443, 443, true/*ssl*/, 60000 /*long timeout*/) :\n esHttp.lightInstance(node.host, node.port, node.useSsl),\n node);\n\n $scope.isReachable = !$scope.isHttps || useSsl;\n if (!$scope.isReachable) {\n // Get node from the default node\n return esHttp.network.peers()\n .then(function(res) {\n // find the current peer\n var peers = (res && res.peers || []).reduce(function(res, json) {\n var peer = new EsPeer(json);\n if (!peer.hasEndpoint('GCHANGE_API')) return res;\n var ep = esHttp.node.parseEndPoint(peer.getEndpoints('GCHANGE_API')[0]);\n if((ep.dns == node.host || ep.ipv4 == node.host || ep.ipv6 == node.host) && (\n ep.port == node.port)) {\n peer.ep = ep;\n return res.concat(peer);\n }\n return res;\n }, []);\n var peer = peers.length && peers[0];\n\n // Current node found\n if (peer) {\n $scope.node.pubkey = peer.pubkey;\n $scope.node.currency = peer.currency;\n return csWot.extend($scope.node);\n }\n else {\n console.warn('Could not get peer from /network/peers');\n }\n });\n }\n\n return $q.all([\n\n // Get node peer info\n $scope.node.network.peering.self()\n .then(function(json) {\n $scope.node.pubkey = json.pubkey;\n $scope.node.currency = json.currency;\n }),\n\n // Get node doc count\n $scope.node.record.count($scope.options.document.index, $scope.options.document.type)\n .then(function(count) {\n $scope.node.docCount = count;\n }),\n\n // Get known peers\n $scope.node.network.peers()\n .then(function(json) {\n var peers = json.peers.reduce(function (res, p) {\n var peer = new EsPeer(p);\n if (!peer.hasEndpoint('GCHANGE_API')) return res;\n peer.online = p.status === 'UP';\n peer.blockNumber = peer.block.replace(/-.+$/, '');\n peer.ep = esHttp.node.parseEndPoint(peer.getEndpoints('GCHANGE_API')[0]);\n peer.dns = peer.getDns();\n peer.id = peer.keyID();\n peer.server = peer.getServer();\n return res.concat(peer);\n }, []);\n\n // Extend (add avatar, name, etc.)\n return csWot.extendAll([$scope.node].concat(peers))\n .then(function() {\n // Final sort\n $scope.peers = _.sortBy(peers, function(p) {\n var score = 1;\n score += 10000 * (p.online ? 1 : 0);\n score += 1000 * (p.hasMainConsensusBlock ? 1 : 0);\n score += 100 * (p.name ? 1 : 0);\n return -score;\n });\n $scope.motion.show({selector: '.item-peer'});\n });\n }),\n\n // Get current block\n $scope.node.blockchain.current()\n .then(function(json) {\n $scope.current = json;\n })\n ])\n .catch(UIUtils.onError(useTor ? \"PEER.VIEW.ERROR.LOADING_TOR_NODE_ERROR\" : \"PEER.VIEW.ERROR.LOADING_NODE_ERROR\"));\n };\n\n $scope.selectPeer = function(peer) {\n // Skip offline\n if (!peer.online ) return;\n\n var stateParams = {server: peer.getServer()};\n if (peer.isSsl()) {\n stateParams.ssl = true;\n }\n if (peer.isTor()) {\n stateParams.tor = true;\n }\n $state.go('app.view_es_peer', stateParams);\n };\n\n /* -- manage link to raw document -- */\n\n $scope.openRawPeering = function(event) {\n return $scope.openLink(event, $scope.node.url + '/network/peering?pretty');\n };\n\n $scope.openRawCurrentBlock = function(event) {\n return $scope.openLink(event, $scope.node.url + '/network/peering?pretty');\n };\n}\n","\nESRegistryLookupController.$inject = ['$scope', '$focus', '$timeout', '$filter', '$controller', '$location', '$translate', '$ionicPopover', 'Device', 'UIUtils', 'ModalUtils', 'BMA', 'csSettings', 'csWallet', 'esModals', 'esRegistry', 'esHttp'];\nESWalletPagesController.$inject = ['$scope', '$controller', '$timeout', 'UIUtils', 'csWallet'];\nESRegistryRecordViewController.$inject = ['$scope', '$rootScope', '$state', '$q', '$timeout', '$ionicPopover', '$ionicHistory', '$translate', '$anchorScroll', 'csConfig', 'csWallet', 'esRegistry', 'UIUtils', 'esHttp'];\nESRegistryRecordEditController.$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'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.registry_lookup', {\n url: \"/page?q&type&hash&category&location&issuer&reload&lat&lon&d&last\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/lookup.html\",\n controller: 'ESRegistryLookupCtrl'\n }\n },\n data: {\n large: 'app.registry_lookup_lg',\n silentLocationChange: true\n }\n })\n\n .state('app.registry_lookup_lg', {\n url: \"/page/lg?q&type&hash&category&location&issuer&reload&lat&lon&d&last\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/lookup_lg.html\",\n controller: 'ESRegistryLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n })\n\n .state('app.wallet_pages', {\n url: \"/wallet/pages?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/view_wallet_pages.html\",\n controller: 'ESWalletPagesCtrl'\n }\n },\n data: {\n login: true,\n minData: true\n }\n })\n\n .state('app.view_page', {\n url: \"/page/view/:id/:title?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/view_record.html\",\n controller: 'ESRegistryRecordViewCtrl'\n }\n }\n })\n\n .state('app.view_page_anchor', {\n url: \"/page/view/:id/:title/:anchor\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/view_record.html\",\n controller: 'ESRegistryRecordViewCtrl'\n }\n }\n })\n\n .state('app.registry_add_record', {\n cache: false,\n url: \"/page/add/:type\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/edit_record.html\",\n controller: 'ESRegistryRecordEditCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n\n .state('app.registry_edit_record', {\n cache: false,\n url: \"/page/edit/:id/:title\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/es/templates/registry/edit_record.html\",\n controller: 'ESRegistryRecordEditCtrl'\n }\n },\n data: {\n auth: true,\n minData: true\n }\n })\n ;\n }])\n\n .controller('ESRegistryLookupCtrl', ESRegistryLookupController)\n\n .controller('ESWalletPagesCtrl', ESWalletPagesController)\n\n .controller('ESRegistryRecordViewCtrl', ESRegistryRecordViewController)\n\n .controller('ESRegistryRecordEditCtrl', ESRegistryRecordEditController)\n\n;\n\nfunction ESRegistryLookupController($scope, $focus, $timeout, $filter, $controller, $location, $translate, $ionicPopover,\n Device, UIUtils, ModalUtils, BMA, csSettings, csWallet, esModals, esRegistry, esHttp) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLookupPositionCtrl', {$scope: $scope}));\n\n var defaultSearchLimit = 10;\n\n $scope.search = {\n text: '',\n results: [],\n loading: true,\n lastRecords: true,\n type: null,\n category: null,\n location: null,\n advanced: null,\n issuer: null,\n geoDistance: !isNaN(csSettings.data.plugins.es.geoDistance) ? csSettings.data.plugins.es.geoDistance : 20,\n sortAttribute: null,\n sortDirection: 'desc',\n compactMode: csSettings.data.plugins.market && csSettings.data.plugins.market.compactMode\n };\n $scope.searchTextId = 'registrySearchText';\n $scope.enableFilter = true;\n $scope.smallscreen = angular.isDefined($scope.smallscreen) ? $scope.smallscreen : UIUtils.screen.isSmall();\n\n $scope.options = angular.merge($scope.options||{}, {\n location: {\n show: true,\n help: 'REGISTRY.SEARCH.LOCATION_HELP'\n },\n description: {\n show: !$scope.search.compactMode\n }\n });\n\n $scope.enter = function(e, state) {\n if (!$scope.entered || !$scope.search.results || $scope.search.results.length === 0) {\n\n // Resolve distance unit\n if (!$scope.geoUnit) {\n return $translate('LOCATION.DISTANCE_UNIT')\n .then(function(unit) {\n $scope.geoUnit = unit;\n return $scope.enter(e, state); // Loop\n });\n }\n\n var finishEntered = function() {\n // removeIf(device)\n // Focus on search text (only if NOT device, to avoid keyboard opening)\n if ($scope.searchTextId) {\n $focus($scope.searchTextId);\n }\n // endRemoveIf(device)\n\n $scope.entered = true;\n\n $scope.doSearch();\n };\n\n // Search by text\n if (state.stateParams && state.stateParams.q && (typeof state.stateParams.q == 'string')) {\n $scope.search.text=state.stateParams.q;\n }\n\n if (state.stateParams && state.stateParams.hash) { // hash tag parameter\n $scope.search.text = '#' + state.stateParams.hash;\n }\n\n // Search on location\n if (state.stateParams && state.stateParams.location) {\n $scope.search.location = state.stateParams.location;\n if (state.stateParams.lat && state.stateParams.lon) {\n $scope.search.geoPoint = {\n lat: parseFloat(state.stateParams.lat),\n lon: parseFloat(state.stateParams.lon)\n };\n }\n if (state.stateParams.d) {\n $scope.search.geoDistance = state.stateParams.d;\n }\n }\n else {\n var defaultSearch = csSettings.data.plugins.es.registry && csSettings.data.plugins.es.registry.defaultSearch;\n // Apply defaults from settings\n if (defaultSearch) {\n if (defaultSearch.location){\n angular.merge($scope.search, csSettings.data.plugins.es.registry.defaultSearch);\n }\n else {\n defaultSearch = undefined; // invalid\n }\n }\n // First time calling this view: apply profile location (if loaded)\n if (!defaultSearch && csWallet.isLogin() && csWallet.data.profile) {\n if (!csWallet.isDataLoaded()) {\n UIUtils.loading.show();\n return csWallet.loadData()\n .then(function() {\n UIUtils.loading.hide();\n return $scope.enter(e,state); // loop\n });\n }\n $scope.search.geoPoint = csWallet.data.profile.geoPoint;\n $scope.search.location = csWallet.data.profile.city||(csWallet.data.profile.geoPoint ? $translate.instant('LOCATION.PROFILE_POSITION') : undefined);\n }\n }\n\n // Search on type\n if (state.stateParams && (state.stateParams.type || state.stateParams.last)) {\n if (state.stateParams.last || state.stateParams.type === 'last') {\n $scope.search.lastRecords = true;\n $scope.search.type = undefined;\n }\n else {\n $scope.search.type = state.stateParams.type;\n }\n }\n else {\n $scope.search.lastRecords = false;\n }\n\n // Search on issuer\n if (state.stateParams && state.stateParams.issuer) {\n $scope.search.issuer = state.stateParams.issuer;\n }\n\n // Search on category\n if (state.stateParams && state.stateParams.category) {\n esRegistry.category.get({id: state.stateParams.category})\n .then(function(cat) {\n $scope.search.category = cat;\n finishEntered();\n })\n .catch(UIUtils.onError(\"REGISTRY.ERROR.LOAD_CATEGORY_FAILED\"));\n }\n else {\n finishEntered();\n }\n }\n $scope.showFab('fab-add-registry-record');\n\n };\n $scope.$on('$ionicView.enter', function(e, state) {\n // WARN: do not set by reference\n // because it can be overrided by sub controller\n return $scope.enter(e, state);\n });\n\n // Store some search options as settings defaults\n $scope.updateSettings = function(immediate) {\n var dirty = false;\n\n csSettings.data.plugins.market = csSettings.data.plugins.market || {};\n csSettings.data.plugins.market.defaultSearch = csSettings.data.plugins.market.defaultSearch || {};\n\n // Check if location changed\n var location = $scope.search.location && $scope.search.location.trim();\n var oldLocation = csSettings.data.plugins.market.defaultSearch.location;\n if (!oldLocation || (oldLocation !== location)) {\n csSettings.data.plugins.market.defaultSearch = angular.merge(csSettings.data.plugins.market.defaultSearch, {\n location: location,\n geoPoint: location && $scope.search.geoPoint ? angular.copy($scope.search.geoPoint) : undefined,\n geoShape: location && $scope.search.geoShape ? angular.copy($scope.search.geoShape) : undefined\n });\n dirty = true;\n }\n\n // Check if distance changed\n var odlDistance = csSettings.data.plugins.es.geoDistance;\n if (!odlDistance || odlDistance !== $scope.search.geoDistance) {\n csSettings.data.plugins.es.geoDistance = $scope.search.geoDistance;\n dirty = true;\n }\n\n var oldCompactMode = csSettings.data.plugins.market.compactMode;\n if (oldCompactMode === undefined || oldCompactMode != $scope.search.compactMode) {\n csSettings.data.plugins.market.compactMode = $scope.search.compactMode;\n dirty = true;\n }\n\n // execute with a delay, for better UI perf\n if (dirty) {\n console.debug(\"[market] [search] Storing search location to local settings...\");\n if (immediate) {\n return csSettings.store();\n }\n else return $timeout(csSettings.store, 100);\n }\n };\n\n // Store some search options as settings defaults\n $scope.leave = function() {\n var dirty = false;\n\n csSettings.data.plugins.es.registry = csSettings.data.plugins.es.registry || {};\n csSettings.data.plugins.es.registry.defaultSearch = csSettings.data.plugins.es.registry.defaultSearch || {};\n\n // Check if location changed\n var location = $scope.search.location && $scope.search.location.trim();\n var oldLocation = csSettings.data.plugins.es.registry.defaultSearch.location;\n if (!oldLocation || (oldLocation !== location)) {\n csSettings.data.plugins.es.registry.defaultSearch = {\n location: location,\n geoPoint: location && $scope.search.geoPoint ? angular.copy($scope.search.geoPoint) : undefined\n };\n dirty = true;\n }\n\n // Check if distance changed\n var odlDistance = csSettings.data.plugins.es.geoDistance;\n if (!odlDistance || odlDistance !== $scope.search.geoDistance) {\n csSettings.data.plugins.es.geoDistance = $scope.search.geoDistance;\n dirty = true;\n }\n\n // execute with a delay, for better UI perf\n if (dirty) {\n $timeout(function() {\n csSettings.store();\n });\n }\n };\n $scope.$on('$ionicView.leave', function() {\n // WARN: do not set by reference\n // because it can be overrided by sub controller\n return $scope.leave();\n });\n\n $scope.onGeoPointChanged = function() {\n if ($scope.search.loading) return;\n\n if ($scope.search.geoPoint && $scope.search.geoPoint.lat && $scope.search.geoPoint.lon && !$scope.search.geoPoint.exact) {\n $scope.doSearch();\n $scope.updateLocationHref();\n }\n };\n $scope.$watch('search.geoPoint', $scope.onGeoPointChanged, true);\n\n $scope.resolveLocationPosition = function() {\n if ($scope.search.loadingPosition) return;\n\n $scope.search.loadingPosition = true;\n return $scope.searchPosition($scope.search.location)\n .then(function(res) {\n if (!res) {\n $scope.search.loading = false;\n $scope.search.results = undefined;\n $scope.search.total = 0;\n $scope.search.loadingPosition = false;\n $scope.search.geoPoint = undefined;\n throw 'CANCELLED';\n }\n $scope.search.geoPoint = res;\n if (res.shortName && !res.exact) {\n $scope.search.location = res.shortName;\n }\n $scope.search.loadingPosition = false;\n });\n };\n\n $scope.doGetLastRecords = function(from) {\n $scope.hidePopovers();\n\n $scope.search.text = undefined;\n return $scope.doSearch(from);\n };\n\n $scope.doSearchText = function() {\n $scope.doSearch();\n\n };\n\n $scope.doSearch = function(from) {\n $scope.search.loading = !from;\n\n // Resolve location position\n if ($scope.search.location && $scope.search.location.length >= 3 && !$scope.search.geoPoint) {\n return $scope.resolveLocationPosition()\n .then(function() {\n return $scope.doSearch(from); // Loop\n });\n }\n\n var text = $scope.search.text && $scope.search.text.trim() || '';\n $scope.search.lastRecords = !text || !text.length;\n var matches = [];\n var filters = [];\n if (text && text.length) {\n // pubkey : use a special 'term', because of 'non indexed' field\n if (BMA.regexp.PUBKEY.test(text /*case sensitive*/)) {\n filters.push({term : { pubkey: text}});\n }\n else {\n text = text.toLowerCase();\n var tags = text ? esHttp.util.parseTags(text) : undefined;\n var matchFields = [\"title\", \"description\", \"city\", \"address\"];\n matches.push({multi_match : { query: text,\n fields: matchFields,\n type: \"phrase_prefix\"\n }});\n matches.push({match : { title: {query: text, boost: 2}}});\n matches.push({prefix: {title: text}});\n matches.push({match : { description: text}});\n matches.push({\n nested: {\n path: \"category\",\n query: {\n bool: {\n filter: {\n match: { \"category.name\": text}\n }\n }\n }\n }\n });\n if (tags && tags.length) {\n filters.push({terms: {tags: tags}});\n }\n }\n }\n // issuer: use only on filter\n else if ($scope.search.issuer) {\n filters.push({term : { issuer: $scope.search.issuer}});\n }\n if ($scope.search.type) {\n filters.push({term: { type: $scope.search.type}});\n }\n if ($scope.search.category) {\n filters.push({\n nested: {\n path: \"category\",\n query: {\n bool: {\n filter: {\n term: { \"category.id\": $scope.search.category.id}\n }\n }\n }\n }\n });\n }\n\n var location = $scope.search.location && $scope.search.location.trim().toLowerCase();\n if ($scope.search.geoPoint && $scope.search.geoPoint.lat && $scope.search.geoPoint.lon) {\n\n // match location OR geo distance\n if (location && location.length) {\n var locationCity = location.split(',')[0];\n filters.push({\n or : [\n // No position defined\n {\n and: [\n {not: {exists: { field : \"geoPoint\" }}},\n {match_phrase: { city: locationCity }}\n ]\n },\n // Has position\n {geo_distance: {\n distance: $scope.search.geoDistance + $scope.geoUnit,\n geoPoint: {\n lat: $scope.search.geoPoint.lat,\n lon: $scope.search.geoPoint.lon\n }\n }}\n ]\n });\n }\n\n else {\n filters.push(\n {geo_distance: {\n distance: $scope.search.geoDistance + $scope.geoUnit,\n geoPoint: {\n lat: $scope.search.geoPoint.lat,\n lon: $scope.search.geoPoint.lon\n }\n }});\n }\n }\n\n var request = {\n highlight: {fields : {title : {}, description: {}, tags: {}}},\n from: from\n };\n if (matches.length > 0) {\n request.query = request.query || {bool: {}};\n request.query.bool.should = matches;\n // Exclude result with score=0\n request.query.bool.minimum_should_match = 1;\n }\n if (filters.length > 0) {\n request.query = request.query || {bool: {}};\n request.query.bool.filter = filters;\n }\n if ($scope.search.lastRecords) {\n request.sort = {creationTime : \"desc\"};\n }\n\n var queryId = ($scope.queryId && $scope.queryId + 1) || 0;\n $scope.queryId = queryId;\n var isSameRequest = function() {\n return $scope.queryId == queryId;\n };\n\n // Update href location\n $scope.updateLocationHref();\n\n // Execute the request\n return $scope.doRequest(request, isSameRequest);\n };\n\n $scope.doRequest = function(options, isSameRequestFn) {\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || defaultSearchLimit;\n if (options.size < defaultSearchLimit) options.size = defaultSearchLimit;\n $scope.search.loading = (options.from === 0);\n\n return esRegistry.record.search(options)\n .then(function(res) {\n if (isSameRequestFn && !isSameRequestFn()) return; // Skip apply if not same request:\n\n if (!res || !res.hits || !res.hits.length) {\n $scope.search.results = (options.from > 0) ? $scope.search.results : [];\n $scope.search.total = (options.from > 0) ? $scope.search.total : 0;\n $scope.search.loading = false;\n $scope.search.hasMore = false;\n return;\n }\n var formatSlug = $filter('formatSlug');\n _.forEach(res.hits, function(record) {\n // Compute title for url\n record.urlTitle = formatSlug(record.title);\n });\n\n // Replace results, or append if 'show more' clicked\n if (!options.from) {\n $scope.search.results = res.hits;\n $scope.search.total = res.total;\n }\n else {\n $scope.search.results = $scope.search.results.concat(res.hits);\n }\n $scope.search.hasMore = $scope.search.results.length < res.total;\n $scope.search.loading = false;\n\n $scope.motion.show({selector: '.list .item', ink: true});\n })\n .catch(function(err) {\n $scope.search.loading = false;\n $scope.search.results = (options.from > 0) ? $scope.search.results : [];\n $scope.search.total = (options.from > 0) ? $scope.search.total : 0;\n $scope.search.hasMore = false;\n UIUtils.onError('REGISTRY.ERROR.LOOKUP_RECORDS_FAILED')(err);\n });\n };\n\n $scope.showMore= function() {\n var from = $scope.search.results ? $scope.search.results.length : 0;\n\n $scope.search.loadingMore = true;\n\n var searchFunction = ($scope.search.lastRecords) ?\n $scope.doGetLastRecords :\n $scope.doSearch;\n\n return searchFunction(from)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n })\n .catch(function(err) {\n console.error(err);\n $scope.search.loadingMore = false;\n $scope.search.hasMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.removeText = function() {\n $scope.search.text = null;\n $scope.doSearch();\n $scope.updateLocationHref();\n };\n\n $scope.removeType = function() {\n $scope.search.type = null;\n $scope.doSearch();\n $scope.updateLocationHref();\n };\n\n $scope.removeCategory = function() {\n $scope.search.category = null;\n $scope.category = null;\n $scope.doSearch();\n $scope.updateLocationHref();\n };\n\n $scope.removeLocation = function() {\n $scope.search.location = null;\n $scope.search.geoPoint = null;\n $scope.doSearch();\n $scope.updateLocationHref();\n };\n\n // Update location href\n $scope.updateLocationHref = function(from) {\n // removeIf(device)\n // Skip when \"show more\"\n if (from) return;\n\n $timeout(function() {\n var text = $scope.search.text && $scope.search.text.trim();\n var location = $scope.search.location && $scope.search.location.trim();\n var stateParams = {\n location: location && location.length ? location : undefined,\n category: $scope.search.category ? $scope.search.category.id : undefined,\n last: $scope.search.lastRecords ? true : undefined,\n type: $scope.search.type ? $scope.search.type : undefined,\n lat: $scope.search.geoPoint && $scope.search.geoPoint.lat || undefined,\n lon: $scope.search.geoPoint && $scope.search.geoPoint.lon || undefined,\n d: $scope.search.geoPoint && $scope.search.geoDistance || undefined\n };\n if (text && text.match(/^#\\w+$/)) {\n stateParams.hash = text.substr(1);\n }\n else if (text && text.length){\n stateParams.q = text;\n }\n\n $location.search(stateParams).replace();\n });\n // endRemoveIf(device)\n };\n\n\n $scope.onToggleAdvanced = function() {\n if ($scope.search.entered && !$scope.search.lastRecords) {\n $scope.doSearch();\n $scope.updateLocationHref();\n }\n };\n $scope.$watch('search.advanced', $scope.onToggleAdvanced, true);\n\n $scope.toggleAdvanced = function() {\n $scope.search.advanced = !$scope.search.advanced;\n $timeout($scope.hidePopovers, 200);\n };\n\n $scope.toggleCompactMode = function() {\n $scope.search.compactMode = !$scope.search.compactMode;\n\n // Show description only if NOT compact mode\n $scope.options.description.show = !$scope.search.compactMode;\n\n $scope.updateSettings();\n };\n\n /* -- modals -- */\n\n $scope.showRecordTypeModal = function(event) {\n $scope.hidePopovers();\n\n $timeout(function() {\n if (event.isDefaultPrevented()) return;\n\n ModalUtils.show('plugins/es/templates/registry/modal_record_type.html')\n .then(function(type){\n if (type) {\n $scope.search.type = type;\n $scope.doSearch();\n $scope.updateLocationHref();\n }\n });\n }, 350); // use timeout to allow event to be prevented in removeType()\n };\n\n $scope.showCategoryModal = function(event) {\n $timeout(function() {\n if (event.isDefaultPrevented()) return;\n\n // load categories\n esRegistry.category.all()\n .then(function (categories) {\n // open modal\n return ModalUtils.show('plugins/es/templates/common/modal_category.html', 'ESCategoryModalCtrl as ctrl',\n {categories: categories}, {focusFirstInput: true});\n })\n .then(function (cat) {\n if (cat && cat.parent) {\n $scope.search.category = cat;\n $scope.doSearch();\n $scope.updateLocationHref();\n }\n });\n }, 350); // use timeout to allow event to be prevented in removeCategory()\n };\n\n $scope.showNewPageModal = function() {\n $scope.hidePopovers();\n\n return $scope.loadWallet()\n .then(function(walletData) {\n UIUtils.loading.hide();\n\n if (walletData) {\n return esModals.showNewPage();\n }\n });\n };\n\n /* -- popovers -- */\n\n $scope.showActionsPopover = function(event) {\n if (!$scope.actionsPopover) {\n $ionicPopover.fromTemplateUrl('plugins/es/templates/registry/lookup_popover_actions.html', {\n scope: $scope\n }).then(function(popover) {\n $scope.actionsPopover = popover;\n //Cleanup the popover when we're done with it!\n $scope.$on('$destroy', function() {\n $scope.actionsPopover.remove();\n });\n $scope.actionsPopover.show(event);\n });\n }\n else {\n $scope.actionsPopover.show(event);\n }\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n };\n\n $scope.showFiltersPopover = function(event) {\n if (!$scope.filtersPopover) {\n $ionicPopover.fromTemplateUrl('plugins/es/templates/registry/lookup_popover_filters.html', {\n scope: $scope\n }).then(function(popover) {\n $scope.filtersPopover = popover;\n //Cleanup the popover when we're done with it!\n $scope.$on('$destroy', function() {\n $scope.filtersPopover.remove();\n });\n $scope.filtersPopover.show(event);\n });\n }\n else {\n $scope.filtersPopover.show(event);\n }\n };\n\n $scope.hideFiltersPopover = function() {\n if ($scope.filtersPopover) {\n $scope.filtersPopover.hide();\n }\n };\n\n $scope.hidePopovers = function() {\n $scope.hideActionsPopover();\n $scope.hideFiltersPopover();\n };\n\n\n // TODO: remove auto add account when done\n /* $timeout(function() {\n $scope.search.text='lavenier';\n $scope.doSearch();\n }, 400);\n */\n}\n\n\nfunction ESWalletPagesController($scope, $controller, $timeout, UIUtils, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESRegistryLookupCtrl', {$scope: $scope}));\n\n $scope.searchTextId = undefined; // avoid focus\n\n // Override the default enter\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n return $scope.loadWallet({minData: true})\n .then(function(walletData) {\n UIUtils.loading.hide();\n $scope.search.issuer = walletData.pubkey;\n $scope.search.advanced = true;\n $timeout($scope.doSearch, 100);\n $scope.showFab('fab-wallet-add-registry-record');\n });\n }\n else {\n // Asking refresh\n if (state.stateParams && state.stateParams.refresh) {\n return $timeout($scope.doSearch, 2000 /*waiting for propagation, if deletion*/);\n }\n }\n };\n\n $scope.doUpdate = function() {\n if (!csWallet.isLogin()) return;\n $scope.search.issuer = csWallet.data.pubkey;\n $scope.search.advanced = true;\n return $scope.doSearch();\n };\n\n}\n\n\nfunction ESRegistryRecordViewController($scope, $rootScope, $state, $q, $timeout, $ionicPopover, $ionicHistory, $translate,\n $anchorScroll, csConfig, csWallet, esRegistry, UIUtils, esHttp) {\n 'ngInject';\n\n $scope.formData = {};\n $scope.id = null;\n $scope.category = {};\n $scope.pictures = [];\n $scope.canEdit = false;\n $scope.loading = true;\n $scope.motion = UIUtils.motion.fadeSlideIn;\n\n $scope.$on('$ionicView.beforeEnter', function (event, viewData) {\n // Enable back button (workaround need for navigation outside tabs - https://stackoverflow.com/a/35064602)\n viewData.enableBack = UIUtils.screen.isSmall() ? true : viewData.enableBack;\n });\n\n $scope.$on('$ionicView.enter', function(e, state) {\n if (state.stateParams && state.stateParams.id) { // Load by id\n if ($scope.loading || state.stateParams.refresh) { // prevent reload if same id (if not forced)\n $scope.load(state.stateParams.id, state.stateParams.anchor);\n }\n $scope.$broadcast('$recordView.enter', state);\n }\n else {\n $state.go('app.registry_lookup');\n }\n });\n\n $scope.$on('$ionicView.beforeLeave', function(event, args){\n $scope.$broadcast('$recordView.beforeLeave', args);\n });\n\n $scope.load = function(id, anchor) {\n id = id || $scope.id;\n $scope.loading = true;\n\n return $q.all([\n esRegistry.record.load(id)\n .then(function (data) {\n $scope.id= data.id;\n $scope.formData = data.record;\n //console.debug('Loading record', $scope.formData);\n $scope.canEdit = csWallet.isUserPubkey($scope.formData.issuer);\n $scope.issuer = data.issuer;\n // avatar\n $scope.avatar = $scope.formData.avatar;\n $scope.avatarStyle= $scope.formData.avatar && {'background-image':'url(\"'+$scope.avatar.src+'\")'};\n\n UIUtils.loading.hide();\n $scope.loading = false;\n // Set Motion (only direct children, to exclude .lazy-load children)\n $scope.motion.show({selector: '.list > .item, .list > ng-if > .item'});\n })\n .catch(function(err) {\n // Retry (ES could have error)\n if (!$scope.secondTry) {\n $scope.secondTry = true;\n $q(function() {\n $scope.load(id);\n }, 100);\n }\n else {\n $scope.loading = false;\n if (err && err.ucode === 404) {\n UIUtils.toast.show('REGISTRY.ERROR.RECORD_NOT_EXISTS');\n $state.go('app.registry_lookup');\n }\n else {\n UIUtils.onError('REGISTRY.ERROR.LOAD_RECORD_FAILED')(err);\n }\n }\n }),\n\n // Load pictures\n esRegistry.record.picture.all({id: id})\n .then(function(hit) {\n\n $scope.pictures = hit._source.pictures && hit._source.pictures.reduce(function(res, pic) {\n return res.concat(esHttp.image.fromAttachment(pic.file));\n }, []);\n\n // Set Motion\n if ($scope.pictures.length > 0) {\n $scope.motion.show({\n selector: '.lazy-load .item.card-gallery',\n startVelocity: 3000\n });\n }\n })\n .catch(function() {\n $scope.pictures = [];\n }),\n\n // Load other data (from child controller)\n $timeout(function() {\n return $scope.$broadcast('$recordView.load', id, esRegistry.record);\n })\n ])\n .then(function() {\n // Display items in technical parts\n $scope.motion.show({\n selector: '.lazy-load .item',\n startVelocity: 3000\n });\n\n // scroll (if comment anchor)\n if (anchor) $timeout(function() {\n $anchorScroll(anchor);\n }, 1000);\n });\n };\n\n // Edit click\n $scope.edit = function() {\n UIUtils.loading.show();\n $state.go('app.registry_edit_record', {id: $scope.id});\n };\n\n $scope.delete = function() {\n $scope.hideActionsPopover();\n\n // translate\n var translations;\n $translate(['REGISTRY.VIEW.REMOVE_CONFIRMATION', 'REGISTRY.INFO.RECORD_REMOVED'])\n .then(function(res) {\n translations = res;\n return UIUtils.alert.confirm(res['REGISTRY.VIEW.REMOVE_CONFIRMATION']);\n })\n .then(function(confirm) {\n if (confirm) {\n esRegistry.record.remove($scope.id)\n .then(function () {\n if (csWallet.data.pages && csWallet.data.pages.count) {\n csWallet.data.pages.count--;\n }\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go('app.wallet_pages', {refresh: true});\n UIUtils.toast.show(translations['REGISTRY.INFO.RECORD_REMOVED']);\n })\n .catch(UIUtils.onError('REGISTRY.ERROR.REMOVE_RECORD_FAILED'));\n }\n });\n };\n\n /* -- modals & popover -- */\n\n $scope.showActionsPopover = function(event) {\n if (!$scope.actionsPopover) {\n $ionicPopover.fromTemplateUrl('plugins/es/templates/registry/view_popover_actions.html', {\n scope: $scope\n }).then(function(popover) {\n $scope.actionsPopover = popover;\n //Cleanup the popover when we're done with it!\n $scope.$on('$destroy', function() {\n $scope.actionsPopover.remove();\n });\n $scope.actionsPopover.show(event);\n });\n }\n else {\n $scope.actionsPopover.show(event);\n }\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n };\n\n $scope.showSharePopover = function(event) {\n $scope.hideActionsPopover();\n var title = $scope.formData.title;\n // Use pod share URL - see issue #69\n var url = esHttp.getUrl('/page/record/' + $scope.id + '/_share');\n // Override default position, is small screen - fix #545\n if (UIUtils.screen.isSmall()) {\n event = angular.element(document.querySelector('#registry-share-anchor-'+$scope.id)) || event;\n }\n UIUtils.popover.share(event, {\n bindings: {\n url: url,\n titleKey: 'REGISTRY.VIEW.POPOVER_SHARE_TITLE',\n titleValues: {title: title},\n time: $scope.formData.time,\n postMessage: title\n }\n });\n };\n\n}\n\nfunction ESRegistryRecordEditController($scope, $timeout, $state, $q, $ionicHistory, $focus, $translate, $controller,\n Device, UIUtils, ModalUtils, csWallet, esHttp, esRegistry) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESPositionEditCtrl', {$scope: $scope}));\n\n $scope.formData = {\n title: null,\n description: null,\n socials: [],\n geoPoint: null\n };\n\n $scope.loading = true;\n $scope.dirty = false;\n $scope.walletData = null;\n $scope.id = null;\n $scope.avatar = null;\n $scope.pictures = [];\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n $scope.$on('$ionicView.enter', function(e, state) {\n $scope.loadWallet({minData: true})\n .then(function(walletData) {\n $scope.walletData = walletData;\n if (state.stateParams && state.stateParams.id) { // Load by id\n $scope.load(state.stateParams.id);\n }\n else {\n if (state.stateParams && state.stateParams.type) {\n $scope.updateView({\n record: {\n type: state.stateParams.type\n }\n });\n }\n }\n // removeIf(device)\n $focus('registry-record-title');\n // endRemoveIf(device)\n });\n });\n\n $scope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n if (!$scope.dirty || $scope.saving || event.defaultPrevented) return;\n\n // stop the change state action\n event.preventDefault();\n\n if (!$scope.loading) {\n $scope.loading = true;\n return UIUtils.alert.confirm('CONFIRM.SAVE_BEFORE_LEAVE',\n 'CONFIRM.SAVE_BEFORE_LEAVE_TITLE', {\n cancelText: 'COMMON.BTN_NO',\n okText: 'COMMON.BTN_YES_SAVE'\n })\n .then(function(confirmSave) {\n $scope.loading = false;\n if (confirmSave) {\n $scope.form.$submitted=true;\n return $scope.save(false/*silent*/, true/*haswait debounce*/)\n .then(function(saved){\n if (saved) {\n $scope.dirty = false;\n }\n return saved; // change state only if not error\n });\n }\n else {\n $scope.dirty = false;\n return true; // ok, change state\n }\n })\n .then(function(confirmGo) {\n if (confirmGo) {\n // continue to the order state\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go(next.name, nextParams);\n }\n })\n .catch(function(err) {\n // Silent\n });\n }\n });\n\n $scope.load = function(id) {\n $scope.loading = true;\n esRegistry.record.load(id, {\n raw: true\n })\n .then(function (data) {\n if (data && data.record) {\n $scope.updateView(data);\n }\n else {\n $scope.updateView({record: {}});\n }\n })\n .catch(function(err) {\n UIUtils.loading.hide(10);\n $scope.loading = false;\n UIUtils.onError('REGISTRY.ERROR.LOAD_RECORD_FAILED')(err);\n });\n };\n\n $scope.updateView = function(data) {\n $scope.formData = data.record || {};\n $scope.id= data.id;\n\n // avatar\n $scope.avatar = $scope.formData.avatar;\n if ($scope.avatar) {\n $scope.avatarStyle = $scope.avatar && {'background-image':'url(\"'+$scope.avatar.src+'\")'};\n $scope.avatarClass = {};\n }\n else {\n $scope.avatarStyle = undefined;\n $scope.avatarClass = {};\n $scope.avatarClass['cion-page-' + $scope.formData.type] = !$scope.avatar;\n }\n\n // pictures\n $scope.pictures = data.record && data.record.pictures || [];\n delete data.record.pictures; // remove, as already stored in $scope.pictures\n\n $scope.motion.show({\n selector: '.animate-ripple .item, .card-gallery',\n startVelocity: 3000\n });\n UIUtils.loading.hide();\n\n // Update loading - done with a delay, to avoid trigger onFormDataChanged()\n $timeout(function() {\n $scope.loading = false;\n }, 1000);\n };\n\n $scope.onFormDataChanged = function() {\n if ($scope.loading) return;\n $scope.dirty = true;\n };\n $scope.$watch('formData', $scope.onFormDataChanged, true);\n\n\n\n $scope.needCategory = function() {\n return $scope.formData.type && ($scope.formData.type=='company' || $scope.formData.type=='shop');\n };\n\n $scope.save = function(silent, hasWaitDebounce) {\n $scope.form.$submitted=true;\n if($scope.saving || // avoid multiple save\n !$scope.form.$valid ||\n (($scope.formData.type === 'shop' || $scope.formData.type === 'company') && (!$scope.formData.category || !$scope.formData.category.id))) {\n return $q.reject();\n }\n\n if (!hasWaitDebounce) {\n console.debug('[ES] [page] Waiting debounce end, before saving...');\n return $timeout(function() {\n return $scope.save(silent, true);\n }, 650);\n }\n\n $scope.saving = true;\n console.debug('[ES] [page] Saving record...');\n\n var showSuccessToast = function() {\n if (!silent) {\n return $translate('REGISTRY.INFO.RECORD_SAVED')\n .then(function(message){\n UIUtils.toast.show(message);\n });\n }\n };\n\n var promise = $q.when();\n return promise\n .then(function(){\n var json = $scope.formData;\n if (!$scope.needCategory()) {\n delete json.category;\n }\n json.time = esHttp.date.now();\n\n // geo point\n if (json.geoPoint && json.geoPoint.lat && json.geoPoint.lon) {\n json.geoPoint.lat = parseFloat(json.geoPoint.lat);\n json.geoPoint.lon = parseFloat(json.geoPoint.lon);\n }\n else{\n json.geoPoint = null;\n }\n\n // Social url must be unique in socials links - Fix #306:\n if (json.socials && json.socials.length) {\n json.socials = _.uniq(json.socials, false, function(social) {\n return social.url;\n });\n }\n\n // Pictures\n json.picturesCount = $scope.pictures.length;\n if (json.picturesCount > 0) {\n json.pictures = $scope.pictures.reduce(function (res, pic) {\n return res.concat({file: esHttp.image.toAttachment(pic)});\n }, []);\n }\n else {\n json.pictures = [];\n }\n\n // Avatar\n if ($scope.avatar && $scope.avatar.src) {\n return UIUtils.image.resizeSrc($scope.avatar.src, true) // resize to avatar\n .then(function(imageSrc) {\n json.avatar = esHttp.image.toAttachment({src: imageSrc});\n return json;\n });\n }\n else {\n // Workaround to allow content deletion, because of a bug in the ES attachment-mapper:\n // get error (in ES node) : MapperParsingException[No content is provided.] - AttachmentMapper.parse(AttachmentMapper.java:471\n json.avatar = {\n _content: '',\n _content_type: ''\n };\n return json;\n }\n })\n .then(function(json){\n // Create\n if (!$scope.id) {\n return esRegistry.record.add(json);\n }\n // Update\n return esRegistry.record.update(json, {id: $scope.id});\n })\n\n .then(function(id) {\n console.info(\"[ES] [page] Record successfully saved.\");\n if (!$scope.id && csWallet.data.pages && csWallet.data.pages.count) {\n csWallet.data.pages.count++;\n }\n $scope.id = $scope.id || id;\n $scope.saving = false;\n $scope.dirty = false;\n\n showSuccessToast();\n\n $ionicHistory.clearCache($ionicHistory.currentView().stateId); // clear current view\n $ionicHistory.nextViewOptions({historyRoot: true});\n return $state.go('app.view_page', {id: $scope.id, refresh: true});\n })\n\n .catch(function(err) {\n $scope.saving = false;\n UIUtils.onError('REGISTRY.ERROR.SAVE_RECORD_FAILED')(err);\n });\n };\n\n $scope.openPicturePopup = function() {\n Device.camera.getPicture()\n .then(function(imageData) {\n if (imageData) {\n $scope.pictures.push({src: \"data:image/png;base64,\" + imageData});\n }\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n };\n\n $scope.rotateAvatar = function(){\n if (!$scope.avatar || !$scope.avatar.src || $scope.rotating) return;\n\n $scope.rotating = true;\n\n return UIUtils.image.rotateSrc($scope.avatar.src)\n .then(function(imageData){\n $scope.avatar.src = imageData;\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n $scope.rotating = false;\n })\n .catch(function(err) {\n console.error(err);\n $scope.rotating = false;\n });\n };\n\n $scope.fileChanged = function(event) {\n UIUtils.loading.show();\n return $q(function(resolve, reject) {\n var file = event.target.files[0];\n UIUtils.image.resizeFile(file)\n .then(function(imageData) {\n $scope.pictures.push({src: imageData});\n UIUtils.loading.hide();\n resolve();\n });\n });\n };\n\n $scope.removePicture = function(index){\n $scope.pictures.splice(index, 1);\n };\n\n $scope.favoritePicture = function(index){\n if (index > 0) {\n var item = $scope.pictures[index];\n $scope.pictures.splice(index, 1);\n $scope.pictures.splice(0, 0, item);\n }\n };\n\n $scope.cancel = function() {\n $ionicHistory.goBack();\n };\n\n /* -- modals -- */\n $scope.showAvatarModal = function() {\n if (Device.camera.enable) {\n return Device.camera.getPicture()\n .then(function(imageData) {\n if (!imageData) return;\n $scope.avatar = {src: \"data:image/png;base64,\" + imageData};\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n $scope.avatarClass = {};\n })\n .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));\n }\n else {\n return ModalUtils.show('plugins/es/templates/common/modal_edit_avatar.html','ESAvatarModalCtrl',\n {})\n .then(function(imageData) {\n if (!imageData) return;\n $scope.avatar = {src: imageData};\n $scope.avatarStyle={'background-image':'url(\"'+imageData+'\")'};\n $scope.dirty = true;\n $scope.avatarClass = {};\n });\n }\n };\n\n $scope.showRecordTypeModal = function() {\n ModalUtils.show('plugins/es/templates/registry/modal_record_type.html')\n .then(function(type){\n if (type) {\n $scope.formData.type = type;\n if (!$scope.avatar) {\n $scope.avatarClass['cion-page-' + type] = true;\n }\n }\n });\n };\n\n $scope.showCategoryModal = function(parameters) {\n // load categories\n esRegistry.category.all()\n .then(function(categories){\n // open modal\n return ModalUtils.show('plugins/es/templates/common/modal_category.html', 'ESCategoryModalCtrl as ctrl',\n {categories: categories}, {focusFirstInput: true});\n })\n .then(function(cat){\n if (cat && cat.parent) {\n $scope.formData.category = cat;\n }\n });\n };\n}\n","\nMarketMenuExtendController.$inject = ['$scope', 'PluginService'];angular.module('cesium.market.app.controllers', ['ngResource',\n 'cesium.es.services', 'cesium.market.modal.services'])\n\n // Configure menu items\n .config(['PluginServiceProvider', function(PluginServiceProvider) {\n 'ngInject';\n\n // Menu extension points\n PluginServiceProvider.extendState('app', {\n points: {\n 'menu-main': {\n templateUrl: \"plugins/market/templates/menu_extend.html\",\n controller: \"MarketMenuExtendCtrl\"\n },\n 'menu-user': {\n templateUrl: \"plugins/market/templates/menu_extend.html\",\n controller: \"MarketMenuExtendCtrl\"\n },\n 'menu-discover': {\n templateUrl: \"plugins/market/templates/menu_extend.html\",\n controller: \"MarketMenuExtendCtrl\"\n },\n\n /* TODO update counter when changes\n 'nav-buttons-right': {\n templateUrl: \"plugins/market/templates/menu_extend.html\",\n controller: \"MarketMenuExtendCtrl\"\n }*/\n }\n });\n }])\n\n .controller('MarketMenuExtendCtrl', MarketMenuExtendController)\n\n;\n\n\n/**\n * Control menu extension\n */\nfunction MarketMenuExtendController($scope, PluginService) {\n 'ngInject';\n\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n}\n","\nMarketHomeButtonsController.$inject = ['$scope', '$rootScope', '$state', '$controller', '$focus', '$timeout', '$translate', '$q', 'ModalUtils', 'UIUtils', 'csConfig', 'csSettings', 'mkModals'];\nMarketHomeFooterController.$inject = ['$scope', '$controller', 'UIUtils', 'csPlatform', '$state'];angular.module('cesium.market.home.controllers', ['ngResource',\n 'cesium.es.services', 'cesium.market.modal.services'])\n\n // Configure menu items\n .config(['PluginServiceProvider', function(PluginServiceProvider) {\n 'ngInject';\n\n // Home extension points\n PluginServiceProvider.extendState('app.home', {\n points: {\n 'buttons': {\n templateUrl: \"plugins/market/templates/home/home_buttons.html\",\n controller: \"MarketHomeButtonsCtrl\"\n },\n 'footer-start': {\n templateUrl: \"plugins/market/templates/category/list_categories_lg.html\",\n controller: \"MarketHomeFooterCtrl\"\n }\n }\n });\n }])\n\n\n .controller('MarketHomeButtonsCtrl', MarketHomeButtonsController)\n\n .controller('MarketHomeFooterCtrl', MarketHomeFooterController)\n;\n\n/**\n * Footer controller\n */\nfunction MarketHomeFooterController($scope, $controller, UIUtils, csPlatform, $state) {\n 'ngInject';\n\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n $scope.start = function() {\n // Start loading categories, if NOT small screen\n if (!$scope.smallscreen) {\n // Initialize the super class and extend it.\n angular.extend(this, $controller('MkListCategoriesCtrl', {$scope: $scope}));\n\n $scope.onCategoryClick = function(cat) {\n return $state.go('app.market_lookup', {category: cat && cat.id, location: undefined});\n };\n\n $scope.load();\n }\n else {\n $scope.loading = false;\n }\n };\n //$scope.$on('$ionicParentView.enter', $scope.enter);\n\n // Run start\n csPlatform.ready().then($scope.start);\n\n}\n\n/**\n * Control home extension\n */\nfunction MarketHomeButtonsController($scope, $rootScope, $state, $controller, $focus, $timeout, $translate, $q,\n ModalUtils, UIUtils, csConfig, csSettings, mkModals) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('MkLookupCtrl', {$scope: $scope}));\n $scope.smallscreen = angular.isDefined($scope.smallscreen) ? $scope.smallscreen : UIUtils.screen.isSmall();\n\n // Screen options\n $scope.options = $scope.options || angular.merge({\n type: {\n show: true\n },\n location: {\n show: true,\n prefix : undefined\n }\n }, csConfig.plugins && csConfig.plugins.market && csConfig.plugins.market.record || {});\n\n $scope.enter = function(e, state) {\n if (!csSettings.isStarted()) {\n return csSettings.ready().then(function() {\n return $scope.enter(e, state);\n });\n }\n\n // Load existing search\n var defaultSearch = csSettings.data.plugins.market.defaultSearch;\n if (defaultSearch) {\n console.info(\"[market] [search] Restoring last search from settings\", defaultSearch);\n angular.merge($scope.search, defaultSearch);\n }\n\n if (!$scope.entered) {\n console.debug(\"[market] [home] Init home buttons\");\n\n return $scope.init()\n .then(function() {\n $scope.entered = true;\n $scope.search.loading = false;\n\n $scope.doGetLastRecords();\n });\n }\n };\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n // Override inherited doRequest()\n var inheritedDoRequest = $scope.doRequest;\n $scope.doRequest = function(request, options) {\n // Skip search on small screen\n if ($scope.smallscreen) return $q.when();\n\n request = request || {};\n\n // Override size with size=0, to get only the total\n request.size = 0;\n return inheritedDoRequest(request, options)\n .then(function() {\n // Update total\n $scope.$broadcast('$$rebind::total');\n });\n };\n\n $scope.openSearch = function(locationName) {\n var stateParams = {};\n\n // Search text\n var searchText = ($scope.search.text || '').trim();\n if (searchText.length) stateParams.q = searchText;\n\n // Resolve location position\n if (!$scope.search.geoPoint && !$scope.search.geoShape) {\n return $scope.searchPosition($scope.search.location)\n .then(function(res) {\n if (res) {\n $scope.search.geoPoint = res;\n // No location = Around me\n if (!$scope.search.location) {\n $scope.search.geoPoint.exact= true;\n return $translate(\"MARKET.COMMON.AROUND_ME\")\n .then(function(locationName) {\n return $scope.openSearch(locationName); // Loop\n });\n }\n return $scope.openSearch(); // Loop\n }\n })\n .catch(function(err) {\n console.error(err);\n return $state.go('app.market_lookup', stateParams);\n });\n }\n\n var locationShortName = locationName || $scope.search.location && $scope.search.location.split(', ')[0];\n if (locationShortName && $scope.search.geoPoint) {\n $rootScope.geoPoints = $rootScope.geoPoints || {};\n $rootScope.geoPoints[locationShortName] = $scope.search.geoPoint;\n stateParams = angular.merge(stateParams, {\n lat: $scope.search.geoPoint && $scope.search.geoPoint.lat,\n lon: $scope.search.geoPoint && $scope.search.geoPoint.lon,\n location: locationShortName,\n dist: $scope.search.geoDistance\n });\n }\n else {\n $scope.search.geoPoint = undefined;\n }\n\n // Update settings (saved as default search)\n $scope.updateSettings();\n\n // Redirect to search page\n return $state.go('app.market_lookup', stateParams);\n };\n\n $scope.showNewRecordModal = function() {\n return $scope.loadWallet({minData: true})\n .then(function() {\n return UIUtils.loading.hide();\n }).then(function() {\n if (!$scope.options.type.show && $scope.options.type.default) {\n return $scope.options.type.default;\n }\n return ModalUtils.show('plugins/market/templates/record/modal_record_type.html');\n })\n .then(function(type){\n if (type) {\n $state.go('app.market_add_record', {type: type});\n }\n });\n };\n\n $scope.updateLocationHref = function(stateParams) {\n // Do not change location href\n };\n\n // Override default join and help modal (in the parent scope)\n $scope.$parent.showJoinModal = mkModals.showJoin;\n $scope.$parent.showLoginModal = mkModals.showLogin;\n $scope.$parent.showHelpModal = mkModals.showHelp;\n\n}\n\n","\nMarketEventLoginModalController.$inject = ['$scope', '$controller', '$q', 'csConfig', 'csWallet', 'mkWallet'];\nMarketLoginModalController.$inject = ['$scope', '$controller'];\nangular.module('cesium.market.login.controllers', ['cesium.services'])\n\n .controller('MarketEventLoginModalCtrl', MarketEventLoginModalController)\n\n .controller('MarketLoginModalCtrl', MarketLoginModalController)\n;\n\n\n\nfunction MarketLoginModalController($scope, $controller) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('LoginModalCtrl', {$scope: $scope}));\n\n}\n\n// use this for local sale event\nfunction MarketEventLoginModalController($scope, $controller, $q, csConfig, csWallet, mkWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('LoginModalCtrl', {$scope: $scope}));\n\n var EMAIL_REGEX = '^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$';\n var PHONE_NUMBER_REGEX = '^[0-9]{9,10}$';\n $scope.usernamePattern = EMAIL_REGEX + '|' + PHONE_NUMBER_REGEX;\n\n $scope.onWalletLogin = function(data, deferred) {\n deferred = deferred || $q.defer();\n // Give the username to mkUser service,\n // to store it inside the user profile\n\n var adminPubkeys = csConfig.plugins && csConfig.plugins.market && csConfig.plugins.market.defaultAdminPubkeys;\n if (adminPubkeys && adminPubkeys.length) {\n console.error(\"[market] [login] Storing username into user profile socials\");\n\n var isEmail = new RegExp(EMAIL_REGEX).test($scope.formData.username);\n\n // Add username into socials (with encryption - only admin pubkeys we be able to read it)\n var social = {\n url: $scope.formData.username,\n type: isEmail ? 'email' : 'phone'\n };\n\n // Add social for the user itself\n var socials = [angular.merge({recipient: data.pubkey}, social)];\n\n // Add social for admins\n socials = (adminPubkeys||[]).reduce(function(res, pubkey) {\n return res.concat(angular.merge({recipient: pubkey}, social)) ;\n }, socials);\n\n // Fill a default profile\n mkWallet.setDefaultProfile({\n socials: socials\n });\n }\n deferred.resolve(data);\n return deferred.promise;\n };\n csWallet.api.data.on.login($scope, $scope.onWalletLogin, this);\n\n}\n","\nMkLookupAbstractController.$inject = ['$scope', '$state', '$filter', '$q', '$location', '$translate', '$controller', '$timeout', 'UIUtils', 'ModalUtils', 'csConfig', 'csSettings', 'BMA', 'esProfile', 'esHttp', 'mkCategory', 'mkRecord', 'mkSettings'];\nMkLookupController.$inject = ['$scope', '$rootScope', '$controller', '$focus', '$timeout', '$ionicPopover', '$translate', '$q', 'mkCategory', 'mkRecord', 'csSettings', 'esShape'];\nangular.module('cesium.market.search.controllers', ['cesium.market.record.services', 'cesium.es.services', 'cesium.map.services', 'cesium.es.common.controllers'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n var queryParams = ['q', 'category', 'shape', 'location', 'reload', 'type', 'hash', 'closed', 'lat', 'lon', 'last', 'old', 'dist']\n .join('&');\n\n $stateProvider\n\n .state('app.market_lookup', {\n url: \"/market?\" + queryParams,\n views: {\n 'menuContent': {\n templateUrl: \"plugins/market/templates/search/lookup.html\",\n controller: 'MkLookupCtrl'\n }\n },\n data: {\n large: 'app.market_lookup_lg',\n silentLocationChange: true\n }\n })\n\n .state('app.market_lookup_lg', {\n url: \"/market/lg?\" + queryParams,\n views: {\n 'menuContent': {\n templateUrl: \"plugins/market/templates/search/lookup_lg.html\",\n controller: 'MkLookupCtrl'\n }\n },\n data: {\n silentLocationChange: true\n }\n });\n }])\n\n .controller('MkLookupAbstractCtrl', MkLookupAbstractController)\n\n .controller('MkLookupCtrl', MkLookupController)\n\n;\n\nfunction MkLookupAbstractController($scope, $state, $filter, $q, $location, $translate, $controller, $timeout,\n UIUtils, ModalUtils, csConfig, csSettings, BMA, esProfile, esHttp,\n mkCategory, mkRecord, mkSettings) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLookupPositionCtrl', {$scope: $scope}));\n\n var defaultSearchLimit = 10;\n\n $scope.search = {\n text: '',\n type: null,\n lastRecords: true,\n results: [],\n loading: true,\n category: null,\n location: null,\n geoPoint: null,\n geoShape: null,\n options: null,\n loadingMore: false,\n showClosed: false,\n showOld: false,\n // 50km by default\n geoDistance: !isNaN(csSettings.data.plugins.es.geoDistance) ? csSettings.data.plugins.es.geoDistance : 50,\n sortAttribute: null,\n sortDirection: 'desc',\n compactMode: csSettings.data.plugins.market && csSettings.data.plugins.market.compactMode\n };\n\n // Screen options\n $scope.options = $scope.options || angular.merge({\n type: {\n show: true\n },\n category: {\n show: true,\n withOld: false,\n withStock: true\n },\n description: {\n show: !$scope.search.compactMode\n },\n location: {\n show: true,\n prefix : undefined\n },\n fees: {\n show: true\n },\n filter: {\n lastRecords: true\n }\n }, csConfig.plugins && csConfig.plugins.market && csConfig.plugins.market.record || {});\n\n $scope.$watch('search.showOld+search.showClosed', function() {\n if (!$scope.search.loading && $scope.entered) $scope.doRefresh(); // Refresh results\n }, true);\n\n $scope.init = function() {\n return $q.all([\n // Init currency\n mkSettings.currencies()\n .then(function(currencies) {\n $scope.currencies = currencies;\n }),\n // Resolve distance unit\n $translate('LOCATION.DISTANCE_UNIT')\n .then(function(unit) {\n $scope.geoUnit = unit !== 'LOCATION.DISTANCE_UNIT' ? unit : 'km';\n })\n ])\n .then(function() {\n $timeout(function() {\n // Set Ink\n UIUtils.ink({selector: '.item'});\n //$scope.showHelpTip();\n\n // Hide if loading (e.g. when close a ad)\n UIUtils.loading.hide(10);\n }, 200);\n });\n };\n\n $scope.toggleAdType = function(type) {\n if (type === $scope.search.type) {\n $scope.search.type = undefined;\n }\n else {\n $scope.search.type = type;\n }\n $scope.doSearch();\n };\n\n $scope.doSearch = function(from, options) {\n from = from || 0;\n options = options || {withCache: true};\n $scope.search.loading = !from;\n if (!$scope.search.advanced) {\n $scope.search.advanced = false;\n }\n $scope.search.sortAttribute = $scope.search.sortAttribute || 'creationTime';\n $scope.search.sortDirection = $scope.search.sortDirection || ($scope.search.sortAttribute === 'creationTime' ? 'desc' : 'asc');\n\n // When a location has been set, but NOT position found: resolve position\n if ($scope.search.location && !$scope.search.geoPoint && !$scope.search.geoShape) {\n return $scope.searchPosition($scope.search.location)\n .then(function(res) {\n if (!res) {\n $scope.search.loading = false;\n return UIUtils.alert.error('MARKET.ERROR.GEO_LOCATION_NOT_FOUND');\n }\n //console.debug('[market] search by location results:', res);\n $scope.search.geoPoint = res;\n $scope.search.location = res.name && res.name.split(',')[0] || $scope.search.location;\n return $scope.doSearch(from, options); // Loop\n });\n }\n\n var text = $scope.search.text && $scope.search.text.trim();\n $scope.search.lastRecords = !text || text.length === 0;\n\n // Update location href\n if (!from) {\n var tags = text ? esHttp.util.parseTags(text) : undefined;\n var hash = tags && tags.join(' ');\n _.forEach(tags||[], function(tag) {\n text = text.replace('#' + tag, '').trim();\n });\n\n $scope.updateLocationHref({\n q: text || undefined,\n hash: hash,\n last: $scope.search.lastRecords ? true : undefined,\n category: $scope.search.category && $scope.search.category.id || undefined,\n type: $scope.search.type,\n // Location\n location: $scope.search.location && $scope.search.location.trim() || undefined,\n lat: $scope.search.geoPoint && $scope.search.geoPoint.lat,\n lon: $scope.search.geoPoint && $scope.search.geoPoint.lon,\n dist: $scope.search.geoPoint && $scope.search.geoPoint.lat && $scope.search.geoDistance || undefined,\n shape: $scope.search.geoShape && ($scope.search.geoShape.id || $scope.search.geoShape.properties && $scope.search.geoShape.properties.id),\n // Advanced options\n old: $scope.search.showOld ? true : undefined,\n closed: $scope.search.showClosed ? true : undefined\n });\n }\n\n\n var request = mkRecord.record.createSearchRequest(angular.merge({}, $scope.search, {\n from: from,\n geoDistance: $scope.search.geoDistance + $scope.geoUnit\n }));\n\n return $scope.doRequest(request, options);\n };\n\n $scope.updateLocationHref = function(stateParams) {\n console.debug(\"[market] [search] Update location href\");\n $location.search(stateParams).replace();\n };\n\n $scope.doGetLastRecords = function() {\n $scope.hideActionsPopover();\n\n // Clean text\n $scope.text=undefined;\n\n return $scope.doSearch();\n };\n\n $scope.doRefresh = function(options) {\n return $scope.doSearch(0/*from*/, options);\n };\n\n $scope.refresh = function() {\n return $scope.doRefresh({withCache: false});\n };\n\n $scope.showMore = function() {\n var from = $scope.search.results ? $scope.search.results.length : 0;\n\n $scope.search.loadingMore = true;\n\n return $scope.doSearch(from)\n .then(function() {\n $scope.search.loadingMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n })\n .catch(function(err) {\n console.error(err);\n $scope.search.loadingMore = false;\n $scope.search.hasMore = false;\n $scope.$broadcast('scroll.infiniteScrollComplete');\n });\n };\n\n $scope.doRequest = function(request, options) {\n request = request || {};\n request.from = request.from || 0;\n request.size = isNaN(request.size) ? defaultSearchLimit : request.size;\n //if (request.size < defaultSearchLimit) request.size = defaultSearchLimit;\n $scope.search.loading = (request.from === 0);\n\n return mkRecord.record.search(request, options)\n .then(function(res) {\n\n if (!res || !res.hits || !res.hits.length) {\n $scope.search.results = (request.from > 0) ? $scope.search.results : [];\n $scope.search.total = (request.from > 0) ? $scope.search.total : (res.total || 0);\n $scope.search.hasMore = false;\n return;\n }\n\n // Filter on type (workaround if filter on term 'type' not working)\n var formatSlug = $filter('formatSlug');\n _.forEach(res.hits, function(record) {\n // Compute title for url\n record.urlTitle = formatSlug(record.title);\n });\n\n // Load avatar and name\n return esProfile.fillAvatars(res.hits, 'issuer')\n .then(function(hits) {\n // Replace results, or concat if offset\n if (!request.from) {\n $scope.search.results = hits;\n $scope.search.total = res.total;\n }\n else {\n $scope.search.results = $scope.search.results.concat(hits);\n }\n $scope.search.hasMore = $scope.search.results.length < $scope.search.total;\n });\n })\n .then(function() {\n\n $scope.search.loading = false;\n\n // motion\n if ($scope.search.results.length > 0 && $scope.motion) {\n $scope.motion.show();\n }\n })\n .catch(function(err) {\n $scope.search.loading = false;\n $scope.search.results = (request.from > 0) ? $scope.search.results : [];\n $scope.search.total = (request.from > 0) ? $scope.search.total : 0;\n $scope.search.hasMore = false;\n UIUtils.onError('MARKET.ERROR.LOOKUP_RECORDS_FAILED')(err);\n });\n };\n\n /* -- modals -- */\n\n $scope.showCategoryModal = function() {\n // load categories\n return mkCategory.all()\n .then(function(categories){\n return ModalUtils.show('plugins/es/templates/common/modal_category.html', 'ESCategoryModalCtrl as ctrl',\n {categories : categories},\n {focusFirstInput: true}\n );\n })\n .then(function(cat){\n if (cat && cat.parent) {\n $scope.search.category = cat;\n $scope.doSearch();\n }\n });\n };\n\n $scope.showNewRecordModal = function() {\n return $scope.loadWallet({minData: true})\n .then(function() {\n return UIUtils.loading.hide();\n }).then(function() {\n if (!$scope.options.type.show && $scope.options.type.default) {\n return $scope.options.type.default;\n }\n return ModalUtils.show('plugins/market/templates/record/modal_record_type.html');\n })\n .then(function(type){\n if (type) {\n $state.go('app.market_add_record', {type: type});\n }\n });\n };\n\n $scope.showRecord = function(event, index) {\n if (event.defaultPrevented) return;\n var item = $scope.search.results[index];\n if (item) {\n $state.go('app.market_view_record', {\n id: item.id,\n title: item.title\n });\n }\n };\n\n $scope.showActionsPopover = function (event, url) {\n return UIUtils.popover.show(event, {\n templateUrl: url = url || 'plugins/market/templates/search/lookup_actions_popover.html',\n scope: $scope,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function () {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n };\n\n $scope.showSortPopover = function (event) {\n $scope.showActionsPopover(event, 'plugins/market/templates/search/lookup_sort_popover.html');\n };\n\n $scope.toggleSort = function (sort, direction){\n $scope.hideActionsPopover();\n direction = direction === 'desc' ? 'desc' : 'asc';\n if (this.search.sortAttribute !== sort || this.search.sortDirection !== direction) {\n this.search.sortAttribute = sort;\n this.search.sortDirection = direction;\n $scope.doSearch();\n }\n };\n\n $scope.toggleShowClosed = function() {\n $scope.hideActionsPopover();\n $scope.search.showClosed = !$scope.search.showClosed;\n };\n\n $scope.toggleShowOld = function() {\n $scope.hideActionsPopover();\n $scope.search.showOld = !$scope.search.showOld;\n };\n\n $scope.toggleCompactMode = function() {\n $scope.search.compactMode = !$scope.search.compactMode;\n\n // Show description only if NOT compact mode\n $scope.options.description.show = !$scope.search.compactMode;\n };\n}\n\n\nfunction MkLookupController($scope, $rootScope, $controller, $focus, $timeout, $ionicPopover, $translate, $q,\n mkCategory, mkRecord, csSettings, esShape) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('MkLookupAbstractCtrl', {$scope: $scope}));\n\n // Override defaults\n $scope.search.sortAttribute = 'creationTime';\n $scope.search.sortDirection = 'desc';\n\n $scope.enter = function(e, state) {\n if (!$scope.entered || !$scope.search.results || $scope.search.results.length === 0) {\n var showAdvanced = false;\n var jobs = [];\n\n // Restore compact mode, from settings\n $scope.search.compactMode = csSettings.data.plugins.market.compactMode;\n $scope.options.description.show = !$scope.search.compactMode;\n\n if (state.stateParams) {\n // Search by text\n if (state.stateParams.q) { // Query parameter\n $scope.search.text = state.stateParams.q;\n $scope.search.lastRecords = false;\n }\n else if (state.stateParams.last){\n $scope.search.lastRecords = true;\n }\n\n // Search on type\n if (state.stateParams.type) {\n $scope.search.type = state.stateParams.type;\n }\n\n // Search on location\n var location = state.stateParams.location && state.stateParams.location.trim();\n\n // Geo point\n if (state.stateParams.lat && state.stateParams.lon) {\n $scope.search.geoPoint = {\n lat: parseFloat(state.stateParams.lat),\n lon: parseFloat(state.stateParams.lon)\n };\n $scope.search.location = location;\n }\n else if (state.stateParams.shape) {\n // Resolve shape\n jobs.push(esShape.get(state.stateParams.shape)\n .then(function(shape) {\n // Store in scope\n $scope.search.geoShape = shape;\n $scope.search.location = location;\n }));\n }\n else {\n // Apply defaults from settings\n var defaultSearch = csSettings.data.plugins.market && csSettings.data.plugins.market.defaultSearch;\n if (defaultSearch) {\n console.info(\"[market] [search] Restoring last search from settings\", defaultSearch);\n angular.merge($scope.search, defaultSearch);\n }\n }\n\n // Geo distance\n if (state.stateParams.dist) {\n $scope.search.geoDistance = parseInt(state.stateParams.dist);\n }\n // Search on hash tag\n if (state.stateParams.hash) {\n $scope.search.lastRecords = false;\n if ($scope.search.text) {\n $scope.search.text = '#' + state.stateParams.hash + ' ' + $scope.search.text;\n }\n else {\n $scope.search.text = '#' + state.stateParams.hash;\n }\n }\n\n // Show closed ads\n if (angular.isDefined(state.stateParams.closed)) {\n $scope.search.showClosed = true;\n showAdvanced = true;\n }\n\n // Show old ads\n if (angular.isDefined(state.stateParams.old)) {\n $scope.search.showOld = true;\n showAdvanced = true;\n }\n }\n\n // Search on category\n var category = state.stateParams && (state.stateParams.category || state.stateParams.cat);\n if (category) {\n var categoryName;\n var catParts = category.split(':');\n if (catParts.length > 1) {\n category = catParts[0];\n categoryName = catParts[1];\n }\n\n // Resolve the category\n jobs.push(mkCategory.get({id: category})\n .catch(function(err){\n // category is not in the pod: log and continue\n console.error(err && err.message || err);\n return {\n id: category,\n name: categoryName || category\n };\n })\n .then(function (cat) {\n $scope.search.category = cat;\n })\n );\n }\n // Wait all jobs are finished, before calling init() and finishEnter()\n return (jobs.length ? $q.all(jobs) : $q.when())\n .then($scope.init)\n .then(function() {\n return $scope.finishEnter(showAdvanced);\n });\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.finishEnter = function(isAdvanced) {\n $scope.search.advanced = isAdvanced ? true : $scope.search.advanced; // keep null if first call\n $scope.doSearch()\n .then(function() {\n $scope.showFab('fab-add-market-record');\n });\n // removeIf(device)\n // Focus on search text (only if NOT device, to avoid keyboard opening)\n $focus('marketSearchText');\n\n // endRemoveIf(device)\n $scope.entered = true;\n };\n\n // Store some search options as settings defaults\n $scope.updateSettings = function(immediate) {\n var dirty = false;\n\n csSettings.data.plugins.market = csSettings.data.plugins.market || {};\n csSettings.data.plugins.market.defaultSearch = csSettings.data.plugins.market.defaultSearch || {};\n\n // Check if location, or distance changed\n var location = $scope.search.location && $scope.search.location.trim();\n var oldLocation = csSettings.data.plugins.market.defaultSearch.location;\n var odlDistance = csSettings.data.plugins.market.defaultSearch.geoDistance;\n if (!oldLocation || (oldLocation !== location) || !odlDistance || (odlDistance !== $scope.search.geoDistance)) {\n csSettings.data.plugins.market.defaultSearch = angular.merge(csSettings.data.plugins.market.defaultSearch, {\n location: location,\n geoPoint: location && $scope.search.geoPoint ? angular.copy($scope.search.geoPoint) : undefined,\n geoShape: location && $scope.search.geoShape ? angular.copy($scope.search.geoShape) : undefined,\n geoDistance: location && $scope.search.geoPoint ? $scope.search.geoDistance : undefined\n });\n // Copy geoDistance to ES (for page registry)\n csSettings.data.plugins.es.geoDistance = $scope.search.geoDistance;\n dirty = true;\n }\n\n var oldCompactMode = csSettings.data.plugins.market.compactMode;\n if (oldCompactMode === undefined || oldCompactMode != $scope.search.compactMode) {\n csSettings.data.plugins.market.compactMode = $scope.search.compactMode;\n dirty = true;\n }\n\n // execute with a delay, for better UI perf\n if (dirty) {\n console.debug(\"[market] [search] Storing search location to local settings...\");\n if (immediate) {\n return csSettings.store();\n }\n else return $timeout(csSettings.store, 100);\n }\n };\n\n // Store some search options as settings defaults\n $scope.leave = function() {\n return $scope.updateSettings(true/*immediate*/);\n };\n $scope.$on('$ionicView.beforeLeave', function() {\n // WARN: do not set by reference\n // because it can be overrided by sub controller\n return $scope.leave();\n });\n\n /* -- manage events -- */\n\n $scope.onGeoPointChanged = function() {\n if ($scope.search.loading) return;\n\n if ($scope.search.geoPoint && $scope.search.geoPoint.lat && $scope.search.geoPoint.lon && !$scope.search.geoPoint.exact) {\n $scope.doSearch();\n }\n };\n $scope.$watch('search.geoPoint', $scope.onGeoPointChanged, true);\n\n $scope.onLocationChanged = function() {\n if ($scope.search.loading) return;\n\n if (!$scope.search.location) {\n $scope.removeLocation();\n }\n };\n $scope.$watch('search.location', $scope.onLocationChanged, true);\n\n $scope.onGeoDistanceChanged = function() {\n if ($scope.search.loading || !$scope.entered || !$scope.search.location) return;\n $scope.doRefresh(); // Refresh results\n };\n $scope.$watch('search.geoDistance', $scope.onGeoDistanceChanged, true);\n\n $scope.onCategoryClick = function(cat) {\n if (!cat) return; // Skip\n $scope.search.category = cat;\n $scope.options.category.show = true;\n $scope.search.showCategories=false; // hide categories\n $scope.doSearch();\n };\n\n $scope.removeText = function() {\n $scope.search.text = null;\n $scope.doSearch();\n };\n\n $scope.removeCategory = function() {\n $scope.search.category = null;\n $scope.category = null;\n $scope.doSearch();\n };\n\n $scope.removeLocation = function() {\n $scope.search.location = null;\n $scope.search.geoPoint = null;\n $scope.search.geoShape = null;\n $scope.updateSettings();\n $scope.doSearch();\n };\n\n /* -- modals & popover -- */\n\n $scope.showActionPopover = function (event, url) {\n url = url || 'plugins/market/templates/search/lookup_actions_popover.html';\n if ($scope.actionsPopoverUrl && $scope.actionsPopoverUrl !== url){\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n $scope.actionsPopoverUrl = url;\n if (!$scope.actionsPopover) {\n $ionicPopover.fromTemplateUrl(url, {\n scope: $scope\n }).then(function (popover) {\n $scope.actionsPopover = popover;\n //Cleanup the popover when we're done with it!\n $scope.$on('$destroy', function () {\n $scope.actionsPopover.remove();\n });\n $scope.actionsPopover.show(event);\n });\n }\n else {\n $scope.actionsPopover.show(event);\n }\n };\n\n $scope.hideActionsPopover = function () {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n }\n };\n\n $scope.showSortPopover = function (event) {\n $scope.showActionsPopover(event, 'plugins/market/templates/search/lookup_sort_popover.html');\n };\n\n $scope.toggleSort = function (sort, direction){\n $scope.hideActionsPopover();\n direction = direction === 'desc' ? 'desc' : 'asc';\n if (this.search.sortAttribute !== sort || this.search.sortDirection !== direction) {\n this.search.sortAttribute = sort;\n this.search.sortDirection = direction;\n $scope.doSearch();\n }\n };\n\n $scope.toggleCompactMode = function() {\n $scope.search.compactMode = !$scope.search.compactMode;\n\n // Show description only if NOT compact mode\n $scope.options.description.show = !$scope.search.compactMode;\n\n $scope.updateSettings();\n };\n}\n","\nMkViewGalleryController.$inject = ['$scope', '$q', '$ionicScrollDelegate', '$controller', '$location', '$ionicModal', '$interval', 'csConfig', 'csSettings', 'ModalUtils', 'mkRecord'];\nMkGallerySlideModalController.$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'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n var queryParams = ['q', 'category', 'shape', 'location', 'reload', 'type', 'hash', 'closed', 'lat', 'lon', 'last', 'old', 'dist']\n .join('&');\n\n $stateProvider\n\n .state('app.market_gallery', {\n cache: true,\n url: \"/gallery/market?\" + queryParams,\n views: {\n 'menuContent': {\n templateUrl: \"plugins/market/templates/gallery/view_gallery.html\",\n controller: 'MkViewGalleryCtrl'\n }\n }\n });\n }])\n\n .controller('MkViewGalleryCtrl', MkViewGalleryController)\n\n .controller('MkGallerySlideModalCtrl', MkGallerySlideModalController)\n\n;\n\nfunction MkViewGalleryController($scope, $q, $ionicScrollDelegate, $controller, $location, $ionicModal, $interval,\n csConfig, csSettings, ModalUtils, mkRecord) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLookupPositionCtrl', {$scope: $scope}));\n\n $scope.entered = false;\n $scope.categories = [];\n $scope.activeCategoryIndex = undefined;\n $scope.activePictureIndex = undefined;\n\n\n $scope.options = $scope.options || angular.merge({\n location: {\n show: true,\n prefix: '' // e.g. 'stand\n },\n category: {\n filter: undefined\n },\n slideDuration: 10000, // 10 sec\n }, csConfig.plugins && csConfig.plugins.market && csConfig.plugins.market.record || {});\n\n $scope.search = $scope.search || angular.merge({\n loading: false,\n text: null,\n location: null,\n geoPoint: null,\n geoShape: null,\n showClosed: false,\n showOld: false,\n geoDistance: csSettings.data.plugins.market && csSettings.data.plugins.market,\n from: 0,\n hasMore: true\n }, $scope.search);\n\n // Force default\n $scope.search.size = 10;\n $scope.search.type = 'all';\n\n $scope.slideDurationLabels = {\n 3000: {\n labelKey: 'MARKET.GALLERY.SLIDE_DURATION_OPTION',\n labelParams: {value: 3}\n },\n 5000: {\n labelKey: 'MARKET.GALLERY.SLIDE_DURATION_OPTION',\n labelParams: {value: 5}\n },\n 10000: {\n labelKey: 'MARKET.GALLERY.SLIDE_DURATION_OPTION',\n labelParams: {value: 10}\n },\n 15000: {\n labelKey: 'MARKET.GALLERY.SLIDE_DURATION_OPTION',\n labelParams: {value: 15}\n },\n 20000: {\n labelKey: 'MARKET.GALLERY.SLIDE_DURATION_OPTION',\n labelParams: {value: 20}\n }\n };\n $scope.slideDurations = _.keys($scope.slideDurationLabels);\n\n $scope.adTypeLabels = {\n all: 'MARKET.GALLERY.ALL_AD_TYPES',\n offer: 'MARKET.TYPE.OFFER_SHORT',\n need: 'MARKET.TYPE.NEED_SHORT',\n crowdfunding: 'MARKET.TYPE.CROWDFUNDING_SHORT',\n };\n $scope.adTypes = _.keys($scope.adTypeLabels);\n\n // When view enter: load data\n $scope.enter = function(e, state) {\n\n // Apply defaults from settings\n var defaultSearch = csSettings.data.plugins.market && csSettings.data.plugins.market.defaultSearch;\n if (defaultSearch && !defaultSearch.geoShape/*not supported yet*/) {\n console.info(\"[market] [gallery] Restoring last search from settings\", defaultSearch);\n angular.merge($scope.search, defaultSearch);\n }\n\n if (!$scope.entered) {\n\n if (state && state.stateParams && state.stateParams.q) {\n $scope.search.text = state.stateParams.q.trim();\n }\n\n $scope.entered = true;\n }\n\n };\n $scope.$on('$ionicView.enter',$scope.enter);\n\n\n $scope.start = function(options) {\n\n // Already started: restore\n if ($scope.activeCategoryIndex !== undefined) {\n return $scope.openSlideShowModal($scope.activeCategoryIndex, $scope.activePictureIndex);\n }\n\n $scope.stop();\n\n options = options || {};\n options.filter = options.filter || ($scope.options && $scope.options.category && $scope.options.category.filter);\n options.withStock = (!$scope.options || !$scope.options.showClosed);\n options.withOld = $scope.options && $scope.options.showOld;\n options.text = $scope.search && $scope.search.text;\n\n $scope.search.loading = true;\n\n var stateParams = {\n //location: null\n q: options.text\n };\n\n // Update location href\n $location.search(stateParams).replace();\n\n return mkRecord.category.stats(options)\n .then(function(res) {\n // Exclude empty categories\n $scope.categories = _.filter(res, function(cat) {\n return cat.count > 0 && cat.children && cat.children.length;\n });\n\n // Find a the first category with pictures\n return $scope.fetchNextPictures();\n })\n .then(function(res) {\n var category = res && res[0];\n if (category) {\n var catIndex = _.findIndex($scope.categories, function(cat) {\n return cat.id === category.id;\n });\n return $scope.openSlideShowModal(catIndex, 0);\n }\n })\n .catch(function(err) {\n if (err === 'END') {\n console.info(\"All pictures displayed\");\n }\n else {\n console.error(err);\n }\n $scope.search.loading = false;\n })\n .then(function() {\n $scope.search.loading = false;\n });\n };\n\n\n $scope.stop = function() {\n delete $scope.activeCategoryIndex;\n delete $scope.categories;\n delete $scope.activeCategoryIndex;\n $scope.search.loading = false;\n };\n\n $scope.removeLocation = function() {\n $scope.search.location = null;\n $scope.search.geoPoint = null;\n $scope.search.geoShape = null;\n };\n\n $scope.openSlideShowModal = function(catIndex, picIndex, pause) {\n $scope.activeCategoryIndex = catIndex || 0;\n $scope.activePictureIndex = picIndex || 0;\n\n var category = $scope.categories[catIndex];\n console.info(\"Opening slide show on category \" + category.id + \" on picture \" + $scope.activePictureIndex);\n\n var closedByUser = true;\n return ModalUtils.show('plugins/market/templates/gallery/modal_slideshow.html', 'MkGallerySlideModalCtrl', {\n category: category,\n activeSlide: picIndex,\n slideDuration: $scope.options.slideDuration,\n started: pause !== true,\n lastSlideCallback: function() {\n return $scope.fetchNextPictures()\n .then(function(res) {\n var nextCategory = res && res[0];\n var nextPicIndex = res && res[1] || 0;\n if (nextCategory) {\n closedByUser = false; // Remember that modal has been closed dynamically\n $scope.openSlideShowModal($scope.activeCategoryIndex, nextPicIndex, false);\n }\n });\n }\n }).then(function(picIndex) {\n if (closedByUser && picIndex !== undefined) {\n console.info(\"User closed, on picture index: \" + picIndex);\n $scope.activePictureIndex = picIndex;\n }\n });\n };\n\n /* -- Load category's pictures -- */\n\n $scope.fetchNextPictures = function(forceNextCategory) {\n if (!$scope.categories || !$scope.categories.length) return $q.when(); // Skip - no categories\n\n $scope.search.size = $scope.search.size || 0;\n\n if ($scope.activeCategoryIndex >= $scope.categories.length -1) {\n $scope.activeCategoryIndex = undefined; // Loop\n }\n\n // First category\n if ($scope.activeCategoryIndex === undefined) {\n $scope.activeCategoryIndex = 0;\n $scope.search.from = 0;\n }\n // Next category\n else if (forceNextCategory || $scope.search.hasMore === false) {\n $scope.activeCategoryIndex++;\n $scope.search.from = 0;\n }\n else {\n $scope.search.from += $scope.search.size;\n }\n\n // Get the category\n var category = $scope.categories[$scope.activeCategoryIndex];\n var now = Date.now();\n console.info(\"Loading pictures for category : \" + category.id + \"...\");\n\n var request = {\n categories: _.pluck(category.children, 'id'),\n text: $scope.search.text,\n type: $scope.search.type === 'all' ? undefined : $scope.search.type,\n withStock: !$scope.search.showClosed,\n withOld: !$scope.search.showOld,\n from: $scope.search.from,\n size: $scope.search.size,\n location: $scope.search.location,\n geoPoint: $scope.search.geoPoint,\n geoShape: $scope.search.geoShape\n };\n $scope.search.loading = (request.from === 0);\n\n // Load category's pictures\n return mkRecord.record.pictures(request)\n .then(function(res) {\n\n var hits = res && res.hits || [];\n\n // user has cancelled (e.g. using stop() )\n if (!$scope.categories) return;\n\n // No pictures found: loop to next category\n if (!hits.length) {\n console.info('No pictures found in category ' + category.id + '. Skipping');\n category.pictures = [];\n $scope.search.total = (request.from > 0) ? $scope.search.total : (res.total || 0);\n $scope.search.hasMore = false;\n return $scope.fetchNextPictures(true);\n }\n\n // Replace results, or concat if offset\n if (!request.from) {\n category.pictures = hits;\n $scope.search.total = res.total;\n }\n else {\n category.pictures = category.pictures.concat(hits);\n }\n $scope.search.hasMore = category.pictures.length < $scope.search.total;\n\n console.info('[market] [category] ' + category.pictures.length + '/'+ $scope.search.total +' pictures fetched in ' + (Date.now() - now) + 'ms');\n\n // Return the active category, and the new index\n return [category, request.from];\n });\n };\n\n $scope.isLoadedCategory = function(cat) {\n return cat.pictures && cat.pictures.length>0;\n };\n\n}\n\nfunction MkGallerySlideModalController($scope, $http, $interval, $ionicSlideBoxDelegate, $timeout, UIUtils, parameters) {\n 'ngInject';\n\n $scope.zoomMin = 1;\n $scope.activeSlide = parameters && parameters.activeSlide || 0;\n $scope.category = parameters && parameters.category || {};\n $scope.lastSlideCallback = parameters && parameters.lastSlideCallback || undefined;\n $scope.started = parameters && parameters.started !== false;\n $scope.motion = UIUtils.motion.fadeSlideInRight;\n\n $scope.options = {\n slideDuration: parameters && parameters.slideDuration || 5000\n };\n\n $scope.shown = function() {\n if ($scope.started) {\n $scope.startTimer();\n }\n };\n $scope.$on('modal.shown', $scope.shown);\n\n $scope.startTimer = function() {\n\n if ($scope.interval) {\n $interval.cancel($scope.interval);\n }\n\n console.debug('[market] [gallery] Start slideshow (' + $scope.options.slideDuration + 'ms)');\n $scope.interval = $interval(function() {\n $scope.nextSlide();\n }, $scope.options.slideDuration);\n\n $scope.showDescription();\n };\n\n $scope.stopTimer = function() {\n if ($scope.interval) {\n console.debug('[market] [gallery] Stop slideshow');\n $interval.cancel($scope.interval);\n delete $scope.interval;\n }\n };\n\n $scope.slideChanged = function(index) {\n $scope.activeSlide = index;\n $scope.showDescription();\n };\n\n $scope.nextSlide = function() {\n\n // If end of category pictures\n if (!$scope.category || !$scope.category.pictures || !$scope.category.pictures.length || $scope.activeSlide === $scope.category.pictures.length-1) {\n if (typeof $scope.lastSlideCallback === 'function') {\n $scope.loading = true;\n $scope.stopTimer();\n // Wait the callback to be ended, before close\n return $scope.lastSlideCallback()\n .then(function() {\n // Close (with a delay to wait new modal to be open)\n return $timeout($scope.closeModal, 500);\n });\n }\n else {\n $scope.closeModal();\n $scope.showDescription();\n }\n }\n else {\n $scope.activeSlide++;\n console.debug('[market] [gallery] Slide index=' + $scope.activeSlide);\n $scope.showDescription();\n }\n };\n\n $scope.showDescription = function() {\n var record = $scope.category.pictures[$scope.activeSlide];\n if (record && record.description && !record.showDescription) {\n $timeout(function() {\n record.showDescription = true;\n }, 500);\n }\n };\n\n $scope.updateSlideStatus = function(slide) {\n var zoomFactor = $ionicScrollDelegate.$getByHandle('scroll' + slide).getScrollPosition().zoom;\n if (zoomFactor === $scope.zoomMin) {\n $ionicSlideBoxDelegate.enableSlide(true);\n } else {\n $ionicSlideBoxDelegate.enableSlide(false);\n }\n };\n\n $scope.stopAndCloseModal = function() {\n $scope.stopTimer();\n $scope.closeModal($scope.activeSlide);\n };\n}\n","\nMkRecordViewController.$inject = ['$scope', '$rootScope', '$anchorScroll', '$ionicPopover', '$state', '$ionicHistory', '$q', '$controller', '$timeout', '$filter', '$translate', 'UIUtils', 'ModalUtils', 'csCrypto', 'csConfig', 'csSettings', 'csCurrency', 'csWallet', 'esModals', 'esProfile', 'esHttp', 'mkRecord', 'mkTx'];\nMkRecordEditController.$inject = ['$scope', '$rootScope', '$q', '$state', '$ionicPopover', '$timeout', 'mkRecord', '$ionicHistory', '$focus', '$controller', 'UIUtils', 'ModalUtils', 'BMA', 'csConfig', 'esHttp', 'csSettings', 'csCurrency', 'mkSettings'];\nMkRecordPaymentModalController.$inject = ['$scope', 'parameters', 'csSettings', 'mkTx'];angular.module('cesium.market.record.controllers', ['cesium.market.record.services', 'cesium.es.services', 'cesium.es.common.controllers'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.market_view_record', {\n url: \"/market/view/:id/:title?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/market/templates/record/view_record.html\",\n controller: 'MkRecordViewCtrl'\n }\n }\n })\n\n .state('app.market_view_record_anchor', {\n url: \"/market/view/:id/:title/:anchor?refresh\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/market/templates/record/view_record.html\",\n controller: 'MkRecordViewCtrl'\n }\n }\n })\n\n .state('app.market_add_record', {\n cache: false,\n url: \"/market/add/:type\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/market/templates/record/edit_record.html\",\n controller: 'MkRecordEditCtrl'\n }\n }\n })\n\n .state('app.market_edit_record', {\n cache: false,\n url: \"/market/edit/:id/:title\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/market/templates/record/edit_record.html\",\n controller: 'MkRecordEditCtrl'\n }\n }\n });\n }])\n\n .controller('MkRecordViewCtrl', MkRecordViewController)\n\n .controller('MkRecordEditCtrl', MkRecordEditController)\n\n .controller('MkRecordPaymentModalCtrl', MkRecordPaymentModalController)\n\n;\n\n\nfunction MkRecordViewController($scope, $rootScope, $anchorScroll, $ionicPopover, $state, $ionicHistory, $q, $controller,\n $timeout, $filter, $translate, UIUtils, ModalUtils,\n csCrypto, csConfig, csSettings, csCurrency, csWallet,\n esModals, esProfile, esHttp,\n mkRecord, mkTx) {\n 'ngInject';\n\n\n $scope.formData = {};\n $scope.id = null;\n $scope.category = {};\n $scope.pictures = [];\n $scope.canEdit = false;\n $scope.maxCommentSize = 10;\n $scope.loading = true;\n $scope.motion = UIUtils.motion.fadeSlideInRight;\n $scope.smallscreen = UIUtils.screen.isSmall();\n $scope.moreAdMotion = UIUtils.motion.default;\n $scope.smallpictures = false;\n\n // Screen options\n $scope.options = $scope.options || angular.merge({\n type: {\n show: true\n },\n category: {\n show: true\n },\n location: {\n show: true,\n prefix : undefined\n },\n like: {\n kinds: ['VIEW', 'LIKE', 'FOLLOW', 'ABUSE'],\n index: 'market',\n type: 'record',\n service: mkRecord.record.like\n }\n }, csConfig.plugins && csConfig.plugins.market && csConfig.plugins.market.record || {});\n\n $scope.likeData = {\n views: {},\n likes: {},\n follows: {},\n abuses: {}\n };\n $scope.search = {\n type: null,\n results: [],\n total: 0,\n loading: true\n };\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLikesCtrl', {$scope: $scope}));\n\n $scope.enter = function (e, state) {\n if (state.stateParams && state.stateParams.id) { // Load by id\n if ($scope.loading || state.stateParams.refresh) {\n $scope.load(state.stateParams.id);\n }\n else {\n // prevent reload if same id (and if not forced)\n UIUtils.loading.hide();\n $scope.updateButtons();\n $scope.updatePaymentData();\n }\n\n // Notify child controllers\n $scope.$broadcast('$recordView.enter', state);\n }\n else {\n $state.go('app.market_lookup');\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.$on('$ionicView.beforeLeave', function (event, args) {\n $scope.$broadcast('$recordView.beforeLeave', args);\n });\n\n $scope.refresh = function () {\n if ($scope.loading || !$scope.formData.id) return $q.when(); // Skip\n return $scope.load($scope.formData.id);\n };\n\n $scope.load = function (id) {\n id = id || $scope.formData.id;\n $scope.loading = true;\n $scope.formData = {};\n var promise = mkRecord.record.load(id, {\n fetchPictures: false,// lazy load for pictures\n convertPrice: true, // convert to user unit\n html: true // convert into HTML (title, description: tags, <br/> ...)\n })\n .then(function (data) {\n $scope.formData = data.record;\n $scope.formData.feesCurrency = data.record.feesCurrency || data.record.currency;\n delete $scope.formData.useRelative;\n $scope.id = data.id;\n $scope.issuer = data.issuer;\n\n // Load issuer stars\n $scope.loadIssuerStars($scope.issuer.issuer);\n\n // Load more ads (if not mobile)\n if (!$scope.smallscreen) {\n $scope.loadMoreLikeThis(data);\n }\n $scope.loading = false;\n\n $scope.updateView();\n UIUtils.loading.hide(10);\n })\n .catch(function (err) {\n if (!$scope.secondTry) {\n $scope.secondTry = true;\n $timeout(function () {\n $scope.load(id); // loop once\n }, 100);\n }\n else {\n $scope.loading = false;\n UIUtils.loading.hide();\n if (err && err.ucode === 404) {\n UIUtils.toast.show('MARKET.ERROR.RECORD_NOT_EXISTS');\n $state.go('app.market_lookup');\n }\n else {\n UIUtils.onError('MARKET.ERROR.LOAD_RECORD_FAILED')(err);\n }\n }\n });\n\n // Continue loading other data\n $timeout(function () {\n\n // Load pictures\n $scope.loadPictures(id);\n\n // Load other data (e.g. comments - see child controller)\n $scope.$broadcast('$recordView.load', id, mkRecord.record);\n\n\n });\n\n return promise;\n };\n\n\n $scope.loadPictures = function(id) {\n id = id || $scope.id;\n return mkRecord.record.picture.all({id: id})\n .then(function (hit) {\n if (hit._source.pictures) {\n $scope.pictures = hit._source.pictures.reduce(function (res, pic) {\n return res.concat(esHttp.image.fromAttachment(pic.file));\n }, []);\n\n if ($scope.pictures.length) {\n // Set Motion\n $scope.motion.show({\n selector: '.lazy-load .item.card-gallery',\n ink: false\n });\n }\n }\n })\n .catch(function () {\n $scope.pictures = [];\n });\n };\n\n $scope.loadMoreLikeThis = function(data) {\n // Load more like this\n return mkRecord.record.moreLikeThis(data.id, {\n category: data.record.category.id,\n type: data.record.type,\n city: data.record.city\n })\n .then(function(res) {\n if (!res || !res.total) return; // skip\n $scope.search.results = res.hits;\n $scope.search.total = res.total;\n $scope.search.loading = false;\n\n $scope.motion.show({\n selector: '.list.list-more-record .item',\n ink: true\n });\n\n });\n };\n\n // Load issuer stars\n $scope.loadIssuerStars = function(pubkey) {\n if (this.canEdit || csWallet.isLogin() && csWallet.isUserPubkey(pubkey)) return; // Skip\n\n esProfile.like.count(pubkey, {kind: 'star', issuer: csWallet.isLogin() ? csWallet.data.pubkey : undefined})\n .then(function(stars) {\n $scope.issuer.stars = stars;\n });\n };\n\n $scope.updateView = function() {\n $scope.updateButtons();\n $scope.updatePaymentData();\n\n // Set Motion (only direct children, to exclude .lazy-load children)\n $scope.motion.show({\n selector: '.list > .item',\n ink: true\n });\n\n if (!$scope.canEdit) {\n $scope.showFab('fab-like-market-record-' + $scope.id);\n }\n };\n\n $scope.updateButtons = function() {\n $scope.canEdit = $scope.formData && csWallet.isUserPubkey($scope.formData.issuer);\n $scope.canSold = $scope.canEdit && $scope.formData.stock > 0;\n $scope.canReopen = $scope.canEdit && $scope.formData.stock === 0;\n if ($scope.canReopen) {\n $scope.canEdit = false;\n }\n\n };\n\n $scope.markAsView = function() {\n if (!$scope.likeData || !$scope.likeData.views || $scope.likeData.views.wasHit) return; // Already view\n var canEdit = $scope.canEdit || csWallet.isUserPubkey($scope.formData.issuer);\n if (canEdit) return; // User is the record's issuer: skip\n\n var timer = $timeout(function() {\n if (csWallet.isLogin()) {\n $scope.options.like.service.add($scope.id, {kind: 'view'}).then(function() {\n $scope.likeData.views.total = ($scope.likeData.views.total||0) + 1;\n });\n }\n timer = null;\n }, 3000);\n\n $scope.$on(\"$destroy\", function() {\n if (timer) $timeout.cancel(timer);\n });\n };\n\n\n $scope.refreshConvertedPrice = function () {\n $scope.loading = true; // force reloading if settings changed (e.g. unit price)\n };\n $scope.$watch('$root.settings.useRelative', $scope.refreshConvertedPrice, true);\n\n $scope.edit = function () {\n $state.go('app.market_edit_record', {id: $scope.id, title: $filter('formatSlug')($scope.formData.title)});\n $scope.loading = true;\n };\n\n $scope.delete = function () {\n $scope.hideActionsPopover();\n\n UIUtils.alert.confirm('MARKET.VIEW.REMOVE_CONFIRMATION')\n .then(function (confirm) {\n if (confirm) {\n mkRecord.record.remove($scope.id)\n .then(function () {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go('app.market_lookup');\n UIUtils.toast.show('MARKET.INFO.RECORD_REMOVED');\n })\n .catch(UIUtils.onError('MARKET.ERROR.REMOVE_RECORD_FAILED'));\n }\n });\n };\n\n $scope.sold = function () {\n $scope.hideActionsPopover();\n\n UIUtils.alert.confirm('MARKET.VIEW.SOLD_CONFIRMATION')\n .then(function (confirm) {\n if (confirm) {\n UIUtils.loading.show();\n return mkRecord.record.setStock($scope.id, 0)\n .then(function () {\n // Update some fields (if view still in cache)\n $scope.canSold = false;\n $scope.canReopen = true;\n $scope.canEdit = false;\n })\n .catch(UIUtils.onError('MARKET.ERROR.SOLD_RECORD_FAILED'))\n .then(function() {\n $ionicHistory.nextViewOptions({\n disableBack: true,\n disableAnimate: false,\n historyRoot: true\n });\n $timeout(function(){\n UIUtils.toast.show('MARKET.INFO.RECORD_SOLD');\n }, 500);\n $state.go('app.market_lookup');\n });\n }\n });\n };\n\n $scope.reopen = function () {\n $scope.hideActionsPopover();\n\n UIUtils.alert.confirm('MARKET.VIEW.REOPEN_CONFIRMATION')\n .then(function (confirm) {\n if (confirm) {\n return UIUtils.loading.show()\n .then(function() {\n return mkRecord.record.setStock($scope.id, 1)\n .then(function () {\n // Update some fields (if view still in cache)\n $scope.canSold = true;\n $scope.canReopen = false;\n $scope.canEdit = true;\n return UIUtils.loading.hide();\n })\n .then(function() {\n UIUtils.toast.show('MARKET.INFO.RECORD_REOPEN');\n })\n .catch(UIUtils.onError('MARKET.ERROR.REOPEN_RECORD_FAILED'));\n });\n }\n });\n };\n\n /* -- modals & popover -- */\n\n $scope.showActionsPopover = function (event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/market/templates/record/view_popover_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function () {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n return true;\n };\n\n $scope.showSharePopover = function(event) {\n $scope.hideActionsPopover();\n if ($scope.loading || !$scope.formData.title) return; // Skip if not loaded\n\n var title = $scope.formData.title;\n\n // Add price to title\n if ($scope.formData.price && $scope.formData.currency) {\n title += \" | {0} {1}\".format($scope.formData.price / 100, $filter('abbreviate')($scope.formData.currency));\n }\n\n // Use pod share URL - see issue #69\n var url = esHttp.getUrl('/market/record/' + $scope.id + '/_share');\n\n // Compute hashtags\n var hashtags = ($scope.formData.tags && $scope.formData.tags.slice() || []).join(' #');\n hashtags = hashtags.length ? ('#' + hashtags + ' ') : '';\n if (csSettings.data.share.defaultHastags) {\n hashtags += csSettings.data.share.defaultHastags;\n }\n\n // Override default position, is small screen - fix #25\n if (UIUtils.screen.isSmall()) {\n event = angular.element(document.querySelector('#record-share-anchor-' + $scope.id)) || event;\n }\n\n UIUtils.popover.share(event, {\n\n bindings: {\n url: url,\n titleKey: 'MARKET.VIEW.POPOVER_SHARE_TITLE',\n titleValues: {title: title},\n time: $scope.formData.time,\n postMessage: title,\n postImage: $scope.pictures.length > 0 ? $scope.pictures[0] : null,\n postHashtags: hashtags\n }\n });\n };\n\n $scope.showNewMessageModal = function() {\n return $q.all([\n $translate('MARKET.VIEW.NEW_MESSAGE_TITLE', $scope.formData),\n $scope.loadWallet({minData: true})\n ])\n .then(function(res) {\n var title = res[0];\n UIUtils.loading.hide();\n return esModals.showMessageCompose({\n title: title,\n destPub: $scope.issuer.pubkey,\n destUid: $scope.issuer.name\n });\n })\n .then(function(send) {\n if (send) UIUtils.toast.show('MESSAGE.INFO.MESSAGE_SENT');\n });\n };\n\n $scope.showRecord = function(event, index) {\n if (event.defaultPrevented) return;\n var item = $scope.search.results[index];\n if (item) {\n $state.go('app.market_view_record', {\n id: item.id,\n title: item.title\n });\n }\n };\n\n\n $scope.updatePaymentData = function() {\n var record = $scope.formData;\n var canPay = record && record.stock > 0;\n if (!canPay) {\n $scope.canPay = false;\n return;\n }\n\n // Compute TX amount\n var amount = record.price;\n var comment;\n var pubkey = record.pubkey || $scope.issuer.pubkey;\n\n // crowdfunding\n if (record.type === 'crowdfunding') {\n amount = undefined;\n comment = mkTx.record.computePrefix(record);\n // If present, use the record pubkey\n pubkey = record.pubkey || pubkey;\n }\n\n // Auction\n else if (record.type === 'auction') {\n //amount = $scope.formData.tx.max\n comment = mkTx.record.computePrefix(record);\n }\n\n if (!pubkey) {\n console.warn('[market] [record] No pubkey found in the issuer profile or in the Ad');\n $scope.showPayment = false;\n $scope.paymentData = null;\n return;\n }\n var pkChecksum = csCrypto.util.pkChecksum(pubkey);\n\n $scope.paymentData = {\n pubkey: pubkey,\n pubkeyWithChecksum: pubkey + ':' + pkChecksum,\n amount: amount,\n comment: comment,\n currency: record.currency,\n };\n\n // Compute URI\n mkTx.uri.compute($scope.paymentData)\n .then(function(uris) {\n $scope.paymentData.uris = uris;\n });\n\n $scope.showPayment = true;\n };\n\n $scope.showPaymentModal = function() {\n if (!$scope.showPayment || !$scope.paymentData) return;\n return ModalUtils.show('plugins/market/templates/record/modal_payment.html', 'MkRecordPaymentModalCtrl',\n $scope.paymentData);\n };\n\n $scope.showIssuers = function(event) {\n var comment = $scope.paymentData.comment;\n if (!comment) return; // Skip\n return $scope.openLink(event, 'https://demo.cesium.app/#/app/data/search/g1/movement?q=comment:\\\"'+comment+'\\\"');\n };\n\n /* -- context aware-- */\n\n // When wallet login/logout -> update buttons\n function onWalletChange(data, deferred) {\n deferred = deferred || $q.defer();\n $scope.updateButtons();\n $scope.loadLikes();\n deferred.resolve();\n return deferred.promise;\n }\n csWallet.api.data.on.login($scope, onWalletChange, this);\n csWallet.api.data.on.logout($scope, onWalletChange, this);\n}\n\nfunction MkRecordEditController($scope, $rootScope, $q, $state, $ionicPopover, $timeout, mkRecord, $ionicHistory, $focus, $controller,\n UIUtils, ModalUtils, BMA, csConfig, esHttp, csSettings, csCurrency, mkSettings) {\n 'ngInject';\n\n // Screen options\n $scope.options = $scope.options || angular.merge({\n recordType: {\n show: true,\n canEdit: true\n },\n category: {\n show: true,\n filter: undefined\n },\n description: {\n show: true\n },\n location: {\n show: true,\n required: true\n },\n position: {\n showCheckbox: true,\n required: true,\n warningMessage: 'MARKET.EDIT.WARNING.NO_GEO_POINT'\n },\n unit: {\n canEdit: true\n },\n login: {\n type: \"full\"\n }\n }, csConfig.plugins && csConfig.plugins.market && csConfig.plugins.market.record || {});\n\n\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESPositionEditCtrl', {$scope: $scope}));\n\n $scope.formData = {\n type: null,\n price: null,\n category: {},\n geoPoint: null,\n useRelative: csSettings.data.useRelative,\n pubkey: null\n };\n $scope.id = null;\n $scope.pictures = [];\n $scope.loading = true;\n\n //console.debug(\"[market] Screen options: \", $scope.options);\n\n $scope.pubkeyPattern = BMA.regexp.PUBKEY;\n $scope.motion = UIUtils.motion.ripple;\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n $scope.enter = function(e, state) {\n\n return $q.all([\n mkSettings.currencies(),\n // Load wallet\n $scope.loadWallet({\n minData: true\n })\n ])\n .then(function(res) {\n $scope.currencies = res[0];\n var walletData = res[1];\n\n if (state.stateParams && state.stateParams.id) { // Load by id\n return $scope.load(state.stateParams.id);\n }\n else {\n // New record\n if (state.stateParams && state.stateParams.type) {\n $scope.formData.type = state.stateParams.type;\n }\n $scope.formData.type = $scope.formData.type || ($scope.options.type && $scope.options.type.default) || 'offer'; // default: offer\n $scope.formData.currency = $scope.currencies && $scope.currencies[0]; // use the first one, if any\n\n // Use profile\n if (walletData.profile) {\n // Set the pubkey, using the profile pubkey (if any)\n if ($scope.formData.type === 'crowdfunding' && walletData.profile.pubkey) {\n $scope.formData.pubkey = walletData.profile.pubkey;\n }\n\n // Fill city and address\n if (walletData.profile.city) {\n $scope.formData.address = walletData.profile.address;\n $scope.formData.city = walletData.profile.city;\n if (walletData.profile.geoPoint && walletData.profile.geoPoint.lat && walletData.profile.geoPoint.lon) {\n $scope.formData.geoPoint = walletData.profile.geoPoint;\n }\n }\n }\n }\n })\n .then(function() {\n\n $scope.loading = false;\n UIUtils.loading.hide();\n $scope.motion.show();\n\n // Focus on title\n if ($scope.options.focus && !UIUtils.screen.isSmall()) {\n $focus('market-record-title');\n }\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n $scope.motion.hide();\n $scope.showHome();\n }\n else {\n console.error(err);\n }\n });\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.onFreePriceChanged = function() {\n if ($scope.formData.freePrice) {\n // Clean price\n $scope.formData.price = null;\n }\n };\n\n /* -- popover -- */\n\n $scope.showUnitPopover = function($event) {\n UIUtils.popover.show($event, {\n templateUrl: 'templates/wallet/popover_unit.html',\n scope: $scope,\n autoremove: true\n })\n .then(function(useRelative) {\n $scope.formData.useRelative = useRelative;\n });\n };\n\n $scope.cancel = function() {\n $scope.closeModal();\n };\n\n $scope.load = function(id) {\n\n UIUtils.loading.show();\n\n return mkRecord.record.load(id, {\n fetchPictures: true,\n convertPrice: false // keep original price\n })\n .then(function(data) {\n angular.merge($scope.formData, data.record);\n $scope.formData.useRelative = (data.record.unit === 'UD');\n if (!$scope.formData.useRelative) {\n // add 2 decimals in quantitative mode\n $scope.formData.price = $scope.formData.price ? $scope.formData.price / 100 : undefined;\n $scope.formData.fees = $scope.formData.fees ? $scope.formData.fees / 100 : undefined;\n }\n // Set default currency (need by HELP texts)\n if (!$scope.formData.currency) {\n $scope.formData.currency = $scope.currency;\n }\n\n // Convert old record format\n if (!$scope.formData.city && $scope.formData.location) {\n $scope.formData.city = $scope.formData.location;\n }\n if ($scope.formData.location) {\n $scope.formData.location = null;\n }\n\n $scope.id = data.id;\n $scope.pictures = data.record.pictures || [];\n delete $scope.formData.pictures; // duplicated with $scope.pictures\n $scope.dirty = false;\n\n $scope.motion.show({\n selector: '.animate-ripple .item, .card-gallery'\n });\n UIUtils.loading.hide();\n\n // Update loading - done with a delay, to avoid trigger onFormDataChanged()\n $timeout(function() {\n $scope.loading = false;\n }, 1000);\n\n })\n .catch(UIUtils.onError('MARKET.ERROR.LOAD_RECORD_FAILED'));\n };\n\n $scope.save = function(silent, hasWaitDebounce) {\n $scope.form.$submitted=true;\n if($scope.saving || // avoid multiple save\n !$scope.form.$valid || !$scope.formData.category.id) {\n return $q.reject();\n }\n\n if (!hasWaitDebounce) {\n console.debug('[ES] [market] Waiting debounce end, before saving...');\n return $timeout(function() {\n return $scope.save(silent, true);\n }, 650);\n }\n\n $scope.saving = true;\n console.debug('[ES] [market] Saving record...');\n\n return UIUtils.loading.show({delay: 0})\n // Preparing json (pictures + resizing thumbnail)\n .then(function() {\n var json = angular.copy($scope.formData);\n delete json.useRelative;\n\n var unit = $scope.formData.useRelative ? 'UD' : 'unit';\n\n // prepare price\n if (angular.isDefined(json.price) && json.price != null) { // warn: could be =0\n if (typeof json.price == \"string\") {\n json.price = parseFloat(json.price.replace(new RegExp('[.,]'), '.')); // fix #124\n }\n json.unit = unit;\n if (unit === 'unit') {\n json.price = json.price * 100;\n }\n if (!json.currency) {\n json.currency = $scope.currency;\n }\n }\n else {\n // do not use 'undefined', but 'null' - fix #26\n json.unit = null;\n json.price = null;\n // for now, allow set the currency, to make sure search request get Ad without price\n if (!json.currency) {\n json.currency = $scope.currency;\n }\n }\n\n // prepare fees\n if (json.fees) {\n if (typeof json.fees == \"string\") {\n json.fees = parseFloat(json.fees.replace(new RegExp('[.,]'), '.')); // fix #124\n }\n if (unit === 'unit') {\n json.fees = json.fees * 100;\n }\n if (!json.feesCurrency) {\n json.feesCurrency = json.currency || $scope.currency;\n }\n json.unit = json.unit || unit; // force unit to be set\n }\n else {\n // do not use 'undefined', but 'null' - fix #26\n json.fees = null;\n json.feesCurrency = null;\n }\n\n json.time = esHttp.date.now();\n\n // geo point\n if (json.geoPoint && json.geoPoint.lat && json.geoPoint.lon) {\n json.geoPoint.lat = parseFloat(json.geoPoint.lat);\n json.geoPoint.lon = parseFloat(json.geoPoint.lon);\n }\n else{\n json.geoPoint = null;\n }\n\n // Location is deprecated: force to null\n if (angular.isDefined(json.location)) {\n json.location = null;\n }\n\n json.picturesCount = $scope.pictures.length;\n if (json.picturesCount) {\n\n // Resize thumbnail\n return UIUtils.image.resizeSrc($scope.pictures[0].src, true)\n .then(function(thumbnailSrc) {\n // First image = the thumbnail\n json.thumbnail = esHttp.image.toAttachment({src: thumbnailSrc});\n // Then = all pictures\n json.pictures = $scope.pictures.reduce(function(res, picture) {\n return res.concat({\n file: esHttp.image.toAttachment({src: picture.src})\n });\n }, []);\n\n return json;\n });\n }\n else {\n if ($scope.formData.thumbnail) {\n // Workaround to allow content deletion, because of a bug in the ES attachment-mapper:\n // get error (in ES node) : MapperParsingException[No content is provided.] - AttachmentMapper.parse(AttachmentMapper.java:471\n json.thumbnail = {\n _content: '',\n _content_type: ''\n };\n }\n json.pictures = [];\n return json;\n }\n })\n\n // Send data (create or update)\n .then(function(json) {\n if (!$scope.id) {\n json.creationTime = esHttp.date.now();\n\n // By default: stock always > 1 when created\n json.stock = angular.isDefined(json.stock) ? json.stock : 1;\n\n return mkRecord.record.add(json);\n }\n else {\n return mkRecord.record.update(json, {id: $scope.id});\n }\n })\n\n // Redirect to record view\n .then(function(id) {\n var isNew = !$scope.id;\n $scope.id = $scope.id || id;\n $scope.saving = false;\n $scope.dirty = false;\n\n // Has back history: go back then reload the view record page\n if (!!$ionicHistory.backView()) {\n var offState = $rootScope.$on('$stateChangeSuccess',\n function(event, toState, toParams, fromState, fromParams){\n event.preventDefault();\n $state.go('app.market_view_record', {id: $scope.id}, {location: \"replace\", reload: true});\n offState(); // remove added listener\n });\n $ionicHistory.goBack(isNew ? -1 : -2);\n }\n // No back view: can occur when reloading the edit page\n else {\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go('app.market_view_record', {id: $scope.id});\n }\n })\n\n .catch(function(err) {\n $scope.saving = false;\n\n // Replace with a specific message\n if (err && err.message === 'ES_HTTP.ERROR.MAX_UPLOAD_BODY_SIZE') {\n err.message = 'MARKET.ERROR.RECORD_EXCEED_UPLOAD_SIZE';\n }\n\n UIUtils.onError('MARKET.ERROR.FAILED_SAVE_RECORD')(err);\n });\n };\n\n $scope.openCurrencyLookup = function() {\n alert('Not implemented yet. Please submit an issue if occur again.');\n };\n\n $scope.cancel = function() {\n $scope.dirty = false; // force not saved\n $ionicHistory.goBack();\n };\n\n $scope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n if (!$scope.dirty || $scope.saving || event.defaultPrevented) return;\n\n // stop the change state action\n event.preventDefault();\n\n if ($scope.loading) return;\n\n return UIUtils.alert.confirm('CONFIRM.SAVE_BEFORE_LEAVE',\n 'CONFIRM.SAVE_BEFORE_LEAVE_TITLE', {\n cancelText: 'COMMON.BTN_NO',\n okText: 'COMMON.BTN_YES_SAVE'\n })\n .then(function(confirmSave) {\n if (confirmSave) {\n return $scope.save();\n }\n })\n .then(function() {\n $scope.dirty = false;\n $ionicHistory.nextViewOptions({\n historyRoot: true\n });\n $state.go(next.name, nextParams);\n UIUtils.loading.hide();\n });\n });\n\n $scope.onFormDataChanged = function() {\n if ($scope.loading) return;\n $scope.dirty = true;\n };\n $scope.$watch('formData', $scope.onFormDataChanged, true);\n\n /* -- modals -- */\n\n $scope.showRecordTypeModal = function() {\n ModalUtils.show('plugins/market/templates/record/modal_record_type.html')\n .then(function(type){\n if (type) {\n $scope.formData.type = type;\n }\n });\n };\n\n $scope.showCategoryModal = function() {\n // load categories\n var getCategories;\n if ($scope.options && $scope.options.category && $scope.options.category.filter) {\n getCategories = mkRecord.category.filtered({filter: $scope.options.category.filter});\n }\n else {\n getCategories = mkRecord.category.all();\n }\n\n getCategories\n .then(function(categories){\n return ModalUtils.show('plugins/es/templates/common/modal_category.html', 'ESCategoryModalCtrl as ctrl',\n {categories : categories},\n {focusFirstInput: true}\n );\n })\n .then(function(cat){\n if (cat && cat.parent) {\n $scope.formData.category = cat;\n }\n });\n };\n}\n\nfunction MkRecordPaymentModalController($scope, parameters, csSettings, mkTx) {\n\n $scope.loading = true;\n $scope.formData = {\n helpSiteUrl: csSettings.data.userForumUrl\n };\n\n $scope.openHelpSite = function(event) {\n return $scope.openLink(event, csSettings.data.userForumUrl || 'https://forum.monnaie-libre.fr');\n };\n\n $scope.load = function() {\n\n console.debug(\"[market] Display payment info\", parameters);\n\n angular.merge($scope.formData, parameters);\n\n return mkTx.uri.compute(parameters)\n .then(function(links) {\n $scope.links = links;\n $scope.loading = false;\n });\n\n };\n\n $scope.load();\n}\n","\nMarketWalletRecordsController.$inject = ['$scope', '$controller', 'UIUtils'];\nMkWalletFavoritesController.$inject = ['$scope', '$controller', 'UIUtils', 'csWallet', 'mkRecord'];angular.module('cesium.market.wallet.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider.extendState('app.view_wallet', {\n points: {\n 'general': {\n templateUrl: \"plugins/market/templates/wallet/view_wallet_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n ;\n }\n\n $stateProvider\n\n .state('app.market_wallet_records', {\n url: \"/records/wallet\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/market/templates/wallet/view_wallet_records.html\",\n controller: 'MkWalletRecordsCtrl'\n }\n }\n })\n\n .state('app.market_favorites', {\n cache: false,\n url: \"/favorites\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/market/templates/wallet/view_wallet_favorites.html\",\n controller: 'MkWalletFavoritesCtrl'\n }\n }\n });\n }])\n\n\n .controller('MkWalletRecordsCtrl', MarketWalletRecordsController)\n\n .controller('MkWalletFavoritesCtrl', MkWalletFavoritesController)\n;\n\n\nfunction MarketWalletRecordsController($scope, $controller, UIUtils) {\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('MkLookupAbstractCtrl', {$scope: $scope}));\n\n // Override defaults\n $scope.search.showClosed = false;\n $scope.search.showOld = false;\n $scope.options.filter.lastRecords = false; // Cannot click on actions popover\n\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n return $scope.loadWallet()\n .then(function(walletData) {\n $scope.search.text = walletData.pubkey;\n $scope.search.lastRecords=false;\n $scope.search.sortAttribute=\"creationTime\";\n $scope.search.sortDirection=\"desc\";\n\n if (!$scope.entered || !$scope.search.results || $scope.search.results.length === 0) {\n return $scope.init()\n .then($scope.doSearch)\n .then(function() {\n $scope.entered = true;\n $scope.showFab('fab-wallet-add-market-record');\n });\n }\n\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n return $scope.showHome();\n }\n console.error(err);\n $scope.entered = false;\n });\n }\n else {\n if (!$scope.search.results || $scope.search.results.length === 0) {\n return $scope.doSearch();\n }\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n}\n\n\nfunction MkWalletFavoritesController($scope, $controller, UIUtils, csWallet, mkRecord) {\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('MkLookupAbstractCtrl', {$scope: $scope}));\n\n // Override defaults\n $scope.search.showClosed = false;\n $scope.search.showOld = false;\n $scope.options.filter.lastRecords = false; // Cannot click on actions popover\n\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n return $scope.loadWallet({minData: true})\n .then(function(walletData) {\n return mkRecord.record.like.load({\n issuer: walletData.pubkey,\n kinds: ['LIKE', 'FOLLOW']\n });\n })\n .then(function(res) {\n\n $scope.search.ids = res && res.hits;\n $scope.search.sortAttribute=\"creationTime\";\n $scope.search.sortDirection=\"desc\";\n\n console.debug(\"[market] [favorites] Loading favorites...\", $scope.search.ids);\n\n if (!$scope.entered || !$scope.search.results || $scope.search.results.length === 0) {\n return $scope.init()\n .then(function() {\n\n return $scope.doSearch();\n })\n .then(function() {\n // TODO sort by like date ?\n\n $scope.entered = true;\n $scope.showFab('fab-wallet-add-market-record');\n });\n }\n\n })\n .catch(function(err){\n if (err === 'CANCELLED') {\n return $scope.showHome();\n }\n console.error(err);\n $scope.entered = false;\n });\n }\n else {\n if (!$scope.search.results || $scope.search.results.length === 0) {\n return $scope.doSearch();\n }\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n var parentDoSearch = $scope.doSearch;\n $scope.doSearch = function(from, options){\n return mkRecord.record.like.load({\n issuer: csWallet.data.pubkey,\n kinds: ['LIKE', 'FOLLOW'],\n from: from,\n _source: ['id', 'time']\n })\n .then(function(res) {\n $scope.search.ids = res && _.pluck(res.hits, 'id');\n console.debug('Found like ids:', $scope.search.ids);\n return parentDoSearch(from, options);\n });\n };\n}\n","\nMkListCategoriesController.$inject = ['$scope', '$translate', 'UIUtils', 'csConfig', 'mkCategory', 'csSettings'];\nMkViewCategoriesController.$inject = ['$scope', '$controller', '$state'];\nMkEditCategoriesController.$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'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.market_categories', {\n url: \"/market/categories\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/market/templates/category/view_categories.html\",\n controller: 'MkViewCategoriesCtrl'\n }\n },\n data: {\n large: 'app.market_categories_lg'\n }\n })\n\n .state('app.market_categories_lg', {\n url: \"/market/categories/lg\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/market/templates/category/view_categories_lg.html\",\n controller: 'MkViewCategoriesCtrl'\n }\n }\n })\n\n .state('app.market_categories_edit', {\n url: \"/market/categories/edit\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/market/templates/category/edit_categories.html\",\n controller: 'MkEditCategoriesCtrl'\n }\n }\n });\n\n }])\n\n .controller('MkListCategoriesCtrl', MkListCategoriesController)\n\n .controller('MkViewCategoriesCtrl', MkViewCategoriesController)\n\n .controller('MkEditCategoriesCtrl', MkEditCategoriesController)\n;\n\nfunction MkListCategoriesController($scope, $translate, UIUtils, csConfig, mkCategory, csSettings) {\n 'ngInject';\n\n $scope.locale = undefined;\n $scope.loading = true;\n $scope.motion = UIUtils.motion.ripple;\n $scope.listeners = undefined;\n\n // Screen options\n $scope.options = $scope.options || angular.merge({\n category: {\n filter: undefined,\n withCache: false,\n withStats: true,\n withOld: false,\n withStock: true,\n nbsp: true\n },\n showClosed: false,\n showOld: false\n }, csConfig.plugins && csConfig.plugins.market && csConfig.plugins.market.record || {});\n\n $scope.load = function(options) {\n options = options || {};\n options.filter = options.filter || ($scope.options && $scope.options.category && $scope.options.category.filter);\n options.withStats = angular.isDefined($scope.options && $scope.options.category && $scope.options.category.withStats) ? $scope.options.category.withStats : true;\n options.withStock = angular.isDefined(options.withStock) ? options.withStock : (!$scope.options || !$scope.options.showClosed);\n options.withOld = angular.isDefined(options.withOld) ? options.withOld : (!$scope.options || $scope.options.showOld);\n options.silent = angular.isDefined(options.silent) ? options.silent : true;\n options.locale = angular.isDefined(options.locale) ? options.locale : $translate.use();\n options.nbsp = angular.isDefined(options.nbsp) ? options.nbsp : ($scope.options && $scope.options.category && $scope.options.category.nbsp);\n\n if (!options.silent) $scope.loading = true;\n\n // Remember locale\n $scope.locale = options.locale;\n angular.merge($scope.options.category, options);\n\n console.debug('[market] [categories] Loading...', options);\n\n var categoriesPromise = options.withStats ?\n mkCategory.stats(options) :\n mkCategory.filtered(options).then(mkCategory.asTree);\n\n return categoriesPromise\n .then(function(res) {\n res = res || [];\n if (options.nbsp) {\n res = _.map(res, function(cat) {\n cat.name = cat.name && cat.name.split(' ').join('&nbsp;');\n return cat;\n });\n }\n $scope.categories = res;\n $scope.totalCount = $scope.categories.reduce(function(res, cat) {\n return res + cat.count;\n }, 0);\n $scope.loading = false;\n if ($scope.motion.show && !options.silent) $scope.motion.show();\n\n // Add listeners, if need\n if (!$scope.listeners) {\n $scope.addListeners();\n }\n });\n };\n\n $scope.onOptionsChange = function() {\n if ($scope.loading || !$scope.locale) return; // Skip if not loaded\n\n var changed = (($scope.options.category.withStock || false) === $scope.options.showClosed) ||\n (($scope.options.category.withOld || false) !== $scope.options.showOld);\n\n // Reload data\n if (changed) {\n $scope.load();\n }\n };\n\n\n // Watch locale change, reload categories\n $scope.onLocaleChange = function(locale) {\n if (!$scope.locale || $scope.locale === locale) return; // Skip\n console.debug('[market] [categories] Need reload for locale {{0]]...'.format(locale));\n $scope.load({locale: locale, silent: true});\n };\n\n $scope.addListeners = function() {\n $scope.listeners = [\n $scope.$watch('options.showClosed', $scope.onOptionsChange, true),\n $scope.$watch('options.showOld', $scope.onOptionsChange, true),\n csSettings.api.locale.on.changed($scope, $scope.onLocaleChange, this)\n ];\n };\n\n}\n\nfunction MkViewCategoriesController($scope, $controller, $state) {\n 'ngInject';\n\n $scope.entered = false;\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('MkListCategoriesCtrl', {$scope: $scope}));\n\n // When view enter: load data\n $scope.enter = function(e, state) {\n\n // Load data\n return $scope.load({silent: true})\n .then(function() {\n\n $scope.loading = false;\n if (!$scope.entered) {\n $scope.motion.show();\n }\n $scope.entered = true;\n });\n };\n $scope.$on('$ionicView.enter',$scope.enter);\n\n $scope.onCategoryClick = function(cat) {\n return $state.go('app.market_lookup', {category: cat && cat.id, location: ''});\n };\n}\n\nfunction MkEditCategoriesController($scope, $controller, $ionicPopup, $translate, $q, UIUtils, csConfig, csSettings, mkCategory) {\n 'ngInject';\n\n $scope.entered = false;\n $scope.reorderRoot = false;\n $scope.reorderChildren = false;\n $scope.dirty = false;\n $scope.locales = angular.merge({}, csSettings.locales); // Copy locales\n $scope.defaultLocale = csSettings.fixLocale(csConfig.defaultLanguage) || 'en';\n $scope.idPattern = mkCategory.regexp.ID;\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('MkListCategoriesCtrl', {$scope: $scope}));\n\n // Override default options\n $scope.options.category.withStats = false;\n $scope.options.category.withCache = false; // Disable\n\n // When view enter: load data\n $scope.enter = function(e, state) {\n\n // Load data\n return $scope.load({silent: true, withStats: false, withCache: false})\n .then(function() {\n $scope.loading = false;\n if (!$scope.entered) {\n $scope.motion.show({selector: '.list .item'});\n }\n $scope.entered = true;\n });\n };\n $scope.$on('$ionicView.enter',$scope.enter);\n\n $scope.cancel = function(confirmed) {\n\n // Ask confirmation\n if ($scope.dirty && !confirmed) {\n return UIUtils.alert.confirm('MARKET.CATEGORY.EDIT.CONFIRM.CANCEL')\n .then(function (confirm) {\n if (!confirm) return; // user cancelled\n return $scope.cancel(true);\n });\n }\n\n $scope.loading = true;\n return $scope.load();\n };\n\n $scope.save = function() {\n if (!$scope.dirty || $scope.saving) return; // Skip\n\n console.debug('[market] [category] Saving categories...');\n $scope.saving = true;\n\n return mkCategory.saveAll($scope.categories)\n .then(function() {\n $scope.saving = false;\n $scope.dirty = false;\n UIUtils.toast.show('MARKET.CATEGORY.EDIT.INFO.SAVED'); // toast\n })\n .catch(function(err) {\n $scope.saving = false;\n console.error(err && err.message || err);\n return UIUtils.onError('MARKET.CATEGORY.EDIT.ERROR.CANNOT_SAVE')(err);\n });\n\n };\n\n $scope.getName = function(cat, useItalicIfMissing) {\n if (!cat) throw new Error('Missing category');\n var name = cat.localizedNames && cat.localizedNames[$scope.locale];\n if (!name) {\n if (useItalicIfMissing && $scope.defaultLocale !== $scope.locale) {\n var defaultName = cat.localizedNames && $scope.defaultLocale && cat.localizedNames[$scope.defaultLocale] || cat.name;\n return '<span class=\"text-italic\">' + defaultName + '</span>';\n }\n return cat.name || '';\n }\n return name || '';\n };\n\n $scope.reorderRootCategory = function(rootCategory, fromIndex, toIndex) {\n if (!rootCategory || fromIndex === toIndex) return; // no changes\n $scope.categories.splice(fromIndex, 1);\n $scope.categories.splice(toIndex, 0, rootCategory);\n $scope.dirty = true;\n };\n\n $scope.reorderChildrenCategory = function(rootCategory, childCategory, fromIndex, toIndex) {\n if (!rootCategory || !childCategory || fromIndex === toIndex) return; // no changes\n rootCategory.children = rootCategory.children || [];\n rootCategory.children.splice(fromIndex, 1);\n rootCategory.children.splice(toIndex, 0, childCategory);\n $scope.dirty = true;\n };\n\n $scope.editRootCategory = function(index) {\n var root = $scope.categories[index];\n return $scope.showEditPopup(root)\n .then(function(res) {\n if (!res) return; // User cancelled\n\n // Copy result to source category\n angular.merge(root, res);\n $scope.dirty = true;\n });\n };\n\n $scope.addRootCategory = function() {\n return $scope.showEditPopup()\n .then(function(res) {\n if (!res) return; // User cancelled\n $scope.categories.push(res);\n $scope.dirty = true;\n });\n };\n\n $scope.editChildCategory = function(rootCategory, index) {\n var child = rootCategory.children[index];\n return $scope.showEditPopup(child, rootCategory)\n .then(function(res) {\n if (!res) return; // User cancelled\n // Copy result to source category\n angular.merge(child, res);\n $scope.dirty = true;\n });\n };\n\n $scope.addChildCategory = function(rootCategory) {\n return $scope.showEditPopup()\n .then(function(res) {\n if (!res) return; // User cancelled\n rootCategory.children = rootCategory.children || [];\n rootCategory.children.push(res);\n $scope.dirty = true;\n });\n };\n\n $scope.removeRootCategory = function(index) {\n $scope.categories.splice(index, 1);\n $scope.dirty = true;\n };\n\n $scope.removeChildCategory = function(rootCat, index) {\n var child = rootCat.children[index];\n rootCat.children = rootCat.children || [];\n rootCat.children.splice(index, 1);\n rootCat.count -= child.count || 0;\n $scope.dirty = true;\n };\n\n $scope.onChangeLocale = function(locale) {\n console.debug('[market] [category] Changing categories locale to: ' + locale.label);\n $scope.locale = locale.id;\n };\n\n /* -- popups -- */\n\n $scope.setEditForm = function(editForm) {\n $scope.editForm = editForm;\n };\n\n $scope.showEditPopup = function(category, parent) {\n $scope.formData = {\n id: category && category.id,\n name: category && $scope.getName(category),\n parent: parent && parent.id,\n localizedNames: category && angular.merge({}, category.localizedNames) || {}\n };\n var isNew = !category;\n var titleKey = isNew ? 'MARKET.CATEGORY.EDIT.POPUP.TITLE_NEW' : 'MARKET.CATEGORY.EDIT.POPUP.TITLE_EDIT';\n\n return $q(function(resolve, reject) {\n $translate([titleKey, 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n\n // Choose UID popup\n $ionicPopup.show({\n templateUrl: 'plugins/market/templates/category/popup_edit_category.html',\n title: translations[titleKey],\n scope: $scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n {\n text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: function(e) {\n $scope.editForm.$submitted=true;\n\n // Check ID is unique\n if (isNew) $scope.editForm.id.$setValidity('duplicate', $scope.checkIdNotUsed($scope.formData.id));\n\n if(!$scope.editForm.$valid || !$scope.formData.id || !$scope.formData.name) {\n //don't allow the user to close unless he enters a name\n e.preventDefault();\n } else {\n return $scope.formData;\n }\n }\n }\n ]\n })\n .then(function(updatedCategory) {\n if (!updatedCategory) { // user cancel\n delete $scope.formData;\n UIUtils.loading.hide();\n return;\n }\n\n // Copy name into to map\n updatedCategory.localizedNames[$scope.locale] = updatedCategory.name;\n\n // Restore the original name, for backward compatibility\n if (category && category.name) {\n updatedCategory.name = category.name;\n }\n else {\n delete updatedCategory.name;\n }\n\n resolve(updatedCategory);\n })\n .catch(reject);\n });\n });\n };\n\n $scope.checkIdNotUsed = function(id) {\n return _.findIndex($scope.categories || [], function(cat) {\n return cat.id === id;\n }) === -1;\n };\n}\n","\nMkIdentityRecordsController.$inject = ['$scope', '$controller', 'UIUtils'];angular.module('cesium.market.wot.controllers', ['cesium.es.services'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n PluginServiceProvider.extendStates(['app.user_identity', 'app.user_identity_name'], {\n points: {\n 'general': {\n templateUrl: \"plugins/market/templates/wot/view_identity_extend.html\",\n controller: 'ESExtensionCtrl'\n },\n 'after-general': {\n templateUrl: \"plugins/market/templates/wot/view_identity_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n ;\n }\n\n $stateProvider\n\n .state('app.market_identity_records', {\n url: \"/market/records/:pubkey\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/market/templates/wot/view_identity_records.html\",\n controller: 'MkIdentityRecordsCtrl'\n }\n }\n });\n }])\n\n .controller('MkIdentityRecordsCtrl', MkIdentityRecordsController)\n\n;\n\n\nfunction MkIdentityRecordsController($scope, $controller, UIUtils) {\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('MkLookupAbstractCtrl', {$scope: $scope}));\n\n // Override defaults\n $scope.options.filter.lastRecords = false; // Cannot click on actions popover\n\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n $scope.enter = function(e, state) {\n if (!$scope.entered) {\n $scope.pubkey = state && state.stateParams && state.stateParams.pubkey;\n if (!$scope.pubkey) return $scope.showHome();\n\n $scope.search.text = $scope.pubkey;\n $scope.search.lastRecords = false;\n\n return $scope.init()\n .then($scope.doSearch)\n .then(function() {\n $scope.entered = true;\n })\n .catch(function(err) {\n console.error(err);\n $scope.entered = true;\n });\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n\n}\n","\nMkLastDocumentsController.$inject = ['$scope', '$controller', '$timeout', '$state', '$filter'];angular.module('cesium.market.document.controllers', ['cesium.es.services'])\n\n .controller('MkLastDocumentsCtrl', MkLastDocumentsController)\n;\n\n\nfunction MkLastDocumentsController($scope, $controller, $timeout, $state, $filter) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('ESLastDocumentsCtrl', {$scope: $scope}));\n\n $scope.search.index = 'user,page,group,market';\n $scope.search.type = 'profile,record,comment';\n $scope._source = [\"issuer\", \"hash\", \"time\", \"creationTime\", \"title\", \"price\", \"unit\", \"currency\", \"picturesCount\", \"thumbnail._content_type\", \"city\", \"message\", \"record\"];\n\n $scope.inheritedSelectDocument = $scope.selectDocument;\n $scope.selectDocument = function(event, doc) {\n // Call super function\n if (doc.index !== \"market\") {\n $scope.inheritedSelectDocument(event, doc);\n return;\n }\n\n // Manage click on a market document\n if (!doc || !event || event.defaultPrevented) return;\n event.stopPropagation();\n\n if (doc.index === \"market\" && doc.type === \"record\") {\n $state.go('app.market_view_record', {id: doc.id, title: doc.title});\n }\n else if (doc.index === \"market\" && doc.type === \"comment\") {\n var anchor = $filter('formatHash')(doc.id);\n $state.go('app.market_view_record_anchor', {id: doc.record, anchor: anchor});\n }\n };\n}\n","\nGpCurrencyAbstractController.$inject = ['$scope', '$filter', '$ionicPopover', '$ionicHistory', '$state', 'csSettings', 'csCurrency', 'UIUtils'];\nangular.module('cesium.graph.common.controllers', ['cesium.services'])\n\n .controller('GpCurrencyAbstractCtrl', GpCurrencyAbstractController)\n;\n\nfunction GpCurrencyAbstractController($scope, $filter, $ionicPopover, $ionicHistory, $state, csSettings, csCurrency, UIUtils) {\n 'ngInject';\n\n $scope.loading = true;\n $scope.formData = $scope.formData || {\n useRelative: csSettings.data.useRelative,\n timePct: 100,\n rangeDuration: 'day',\n firstBlockTime: 0,\n scale: 'linear',\n hide: [],\n beginAtZero: true\n };\n $scope.formData.useRelative = false; /*angular.isDefined($scope.formData.useRelative) ?\n $scope.formData.useRelative : csSettings.data.useRelative;*/\n $scope.scale = 'linear';\n $scope.height = undefined;\n $scope.width = undefined;\n $scope.maintainAspectRatio = true;\n $scope.times = [];\n\n function _truncDate(time) {\n return moment.unix(time).utc().startOf($scope.formData.rangeDuration).unix();\n }\n\n $scope.enter = function (e, state) {\n if ($scope.loading) {\n\n if (state && state.stateParams) {\n // remember state, to be able to refresh location\n $scope.stateName = state && state.stateName;\n $scope.stateParams = angular.copy(state && state.stateParams||{});\n\n if (!$scope.formData.currency && state && state.stateParams && state.stateParams.currency) { // Currency parameter\n $scope.formData.currency = state.stateParams.currency;\n }\n if (state.stateParams.t) {\n $scope.formData.timePct = state.stateParams.t;\n }\n else if (state.stateParams.timePct) {\n $scope.formData.timePct = state.stateParams.timePct;\n }\n if (state.stateParams.stepUnit) {\n $scope.formData.rangeDuration = state.stateParams.stepUnit;\n }\n if (state.stateParams.scale) {\n $scope.formData.scale = state.stateParams.scale;\n }\n // Allow to hide some dataset\n if (state.stateParams.hide) {\n $scope.formData.hide = state.stateParams.hide.split(',').reduce(function(res, index){\n return res.concat(parseInt(index));\n }, []);\n }\n }\n\n // Should be override by subclasses\n $scope.init(e, state);\n\n // Make sure there is currency, or load it not\n if (!$scope.formData.currency) {\n return csCurrency.get()\n .then(function (currency) {\n $scope.formData.currency = currency ? currency.name : null;\n $scope.formData.firstBlockTime = currency ? _truncDate(currency.firstBlockTime) : 0;\n if (!$scope.formData.firstBlockTime){\n console.warn('[graph] currency.firstBlockTime not loaded ! Should have been loaded by currrency service!');\n }\n $scope.formData.currencyAge = _truncDate(moment().utc().unix()) - $scope.formData.firstBlockTime;\n\n return $scope.enter(e, state);\n });\n }\n\n $scope.load() // Should be override by subclasses\n .then(function () {\n // Update scale\n $scope.setScale($scope.formData.scale);\n // Hide some dataset by index (read from state params)\n $scope.updateHiddenDataset();\n\n $scope.loading = false;\n });\n }\n };\n $scope.$on('$csExtension.enter', $scope.enter);\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n $scope.updateLocation = function() {\n if (!$scope.stateName) return;\n\n $ionicHistory.nextViewOptions({\n disableAnimate: true,\n disableBack: true,\n historyRoot: true\n });\n\n $scope.stateParams = $scope.stateParams || {};\n $scope.stateParams.t = ($scope.formData.timePct >= 0 && $scope.formData.timePct < 100) ? $scope.formData.timePct : undefined;\n $scope.stateParams.stepUnit = $scope.formData.rangeDuration != 'day' ? $scope.formData.rangeDuration : undefined;\n $scope.stateParams.hide = $scope.formData.hide && $scope.formData.hide.length ? $scope.formData.hide.join(',') : undefined;\n $scope.stateParams.scale = $scope.formData.scale != 'linear' ?$scope.formData.scale : undefined;\n\n $state.go($scope.stateName, $scope.stateParams, {\n reload: false,\n inherit: true,\n notify: false}\n );\n };\n\n // Allow to fixe size, form a template (e.g. in a 'ng-init' tag)\n $scope.setSize = function(height, width, maintainAspectRatio) {\n $scope.height = height;\n $scope.width = width;\n $scope.maintainAspectRatio = angular.isDefined(maintainAspectRatio) ? maintainAspectRatio : $scope.maintainAspectRatio;\n };\n\n // When parent view execute a refresh action\n $scope.$on('csView.action.refresh', function(event, context) {\n if (!context || context == 'currency') {\n return $scope.load();\n }\n });\n\n $scope.init = function(e, state) {\n // Should be override by subclasses\n };\n\n $scope.load = function() {\n // Should be override by subclasses\n };\n\n $scope.toggleScale = function() {\n $scope.setScale($scope.formData.scale === 'linear' ? 'logarithmic' : 'linear');\n $scope.updateLocation();\n };\n\n $scope.setScale = function(scale) {\n $scope.hideActionsPopover();\n $scope.formData.scale = scale;\n\n if (!$scope.options || !$scope.options.scales || !$scope.options.scales.yAxes) return;\n\n var format = $filter('formatInteger');\n\n _.forEach($scope.options.scales.yAxes, function(yAxe, index) {\n yAxe.type = scale;\n yAxe.ticks = yAxe.ticks || {};\n if (scale == 'linear') {\n yAxe.ticks.beginAtZero = angular.isDefined($scope.formData.beginAtZero) ? $scope.formData.beginAtZero : true;\n delete yAxe.ticks.min;\n yAxe.ticks.callback = function(value) {\n return format(value);\n };\n }\n else {\n //yAxe.ticks.min = 0;\n delete yAxe.ticks.beginAtZero;\n delete yAxe.ticks.callback;\n yAxe.ticks.callback = function(value, index) {\n if (!value) return;\n if (Math.log10(value)%1 === 0 || Math.log10(value/3)%1 === 0) {\n return format(value);\n }\n return '';\n };\n }\n });\n };\n\n $scope.setRangeDuration = function(rangeDuration) {\n $scope.hideActionsPopover();\n if ($scope.formData && rangeDuration == $scope.formData.rangeDuration) return;\n\n $scope.formData.rangeDuration = rangeDuration;\n\n // Restore default values\n delete $scope.formData.startTime;\n delete $scope.formData.endTime;\n delete $scope.formData.rangeDurationSec;\n //$scope.formData.timePct = 100;\n\n // Reload data\n $scope.load();\n // Update location\n $scope.updateLocation();\n };\n\n $scope.updateHiddenDataset = function(datasetOverride) {\n datasetOverride = datasetOverride || $scope.datasetOverride || {};\n\n _.forEach($scope.formData.hide||[], function(index) {\n if (!datasetOverride[index]) return; // skip invalid index\n\n // Hide the dataset (stroke the legend)\n datasetOverride[index].hidden = true;\n\n // If this dataset has an yAxis, hide it (if not used elsewhere)\n var yAxisID = datasetOverride[index].yAxisID;\n var yAxe = yAxisID && $scope.options && $scope.options.scales && _.findWhere($scope.options.scales.yAxes||[], {id: yAxisID});\n if (yAxisID && yAxe) {\n var yAxisDatasetCount = _.filter(datasetOverride, function(dataset) {\n return dataset.yAxisID === yAxisID;\n }).length;\n if (yAxisDatasetCount == 1) {\n yAxe.display = false;\n }\n }\n\n });\n };\n\n $scope.onLegendClick = function(e, legendItem) {\n var index = legendItem.datasetIndex;\n var ci = this.chart;\n var meta = ci.getDatasetMeta(index);\n\n // Hide/show the dataset\n meta.hidden = meta.hidden === null? !ci.data.datasets[index].hidden : null;\n\n // Update yAxis display (if used by only ONE dataset)\n if (ci.config && ci.config.data && ci.config.data.datasets) {\n var yAxisDatasetCount = _.filter(ci.config.data.datasets, function(dataset) {\n return dataset.yAxisID && dataset.yAxisID === meta.yAxisID;\n }).length;\n if (yAxisDatasetCount === 1) {\n ci.scales[meta.yAxisID].options.display = (meta.hidden !== true);\n }\n }\n\n // We hid a dataset ... rerender the chart\n ci.update();\n\n // Update window location\n $scope.formData.hide = $scope.formData.hide||[];\n $scope.formData.hide = meta.hidden ?\n _.union($scope.formData.hide, [index]) :\n _.difference($scope.formData.hide, [index]);\n $scope.updateLocation();\n };\n\n $scope.goPreviousRange = function() {\n if ($scope.loadingRange) return;\n $scope.loadingRange = true;\n\n $scope.formData.startTime -= $scope.times.length * $scope.formData.rangeDurationSec;\n if ($scope.formData.startTime < $scope.formData.firstBlockTime) {\n $scope.formData.startTime = $scope.formData.firstBlockTime;\n }\n $scope.formData.endTime = $scope.formData.startTime + $scope.times.length * $scope.formData.rangeDurationSec;\n\n // Reload data\n $scope.load().then(function(){\n // Update location\n $scope.updateLocation();\n\n $scope.loadingRange = false;\n });\n };\n\n $scope.goNextRange = function() {\n if ($scope.loadingRange) return;\n $scope.loadingRange = true;\n $scope.formData.startTime += $scope.times.length * $scope.formData.rangeDurationSec;\n if ($scope.formData.startTime > $scope.formData.firstBlockTime + $scope.formData.currencyAge - $scope.formData.timeWindow) {\n $scope.formData.startTime = $scope.formData.firstBlockTime + $scope.formData.currencyAge - $scope.formData.timeWindow;\n }\n $scope.formData.endTime = $scope.formData.startTime + $scope.times.length * $scope.formData.rangeDurationSec;\n\n // Reload data\n $scope.load().then(function(){\n // Update location\n $scope.updateLocation();\n\n $scope.loadingRange = false;\n });\n };\n\n $scope.onRangeChanged = function() {\n if ($scope.loadingRange) return;\n $scope.loadingRange = true;\n\n $scope.formData.startTime = $scope.formData.firstBlockTime + (parseFloat($scope.formData.timePct) / 100) * ($scope.formData.currencyAge - $scope.formData.timeWindow) ;\n $scope.formData.endTime = $scope.formData.startTime + $scope.times.length * $scope.formData.rangeDurationSec;\n\n // Reload data\n $scope.load().then(function(){\n // Update location\n $scope.updateLocation();\n\n $scope.loadingRange = false;\n });\n };\n\n $scope.updateRange = function(startTime, endTime, updateTimePct) {\n updateTimePct = angular.isDefined(updateTimePct) ? updateTimePct : true;\n\n $scope.formData.startTime = startTime;\n $scope.formData.endTime = endTime;\n $scope.formData.timeWindow = $scope.formData.timeWindow || $scope.formData.endTime - $scope.formData.startTime;\n $scope.formData.rangeDurationSec = $scope.formData.rangeDurationSec || $scope.formData.timeWindow / ($scope.times.length-1);\n\n if (updateTimePct) {\n $scope.formData.timePct = Math.ceil(($scope.formData.startTime - $scope.formData.firstBlockTime) * 100 /\n ($scope.formData.currencyAge - $scope.formData.timeWindow));\n }\n };\n\n /* -- Popover -- */\n\n $scope.showActionsPopover = function(event) {\n UIUtils.popover.show(event, {\n templateUrl: 'plugins/graph/templates/common/popover_range_actions.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.actionsPopover = popover;\n }\n });\n };\n\n $scope.hideActionsPopover = function() {\n if ($scope.actionsPopover) {\n $scope.actionsPopover.hide();\n $scope.actionsPopover = null;\n }\n };\n\n}\n","\nGpDocStatsController.$inject = ['$scope', '$state', '$controller', '$q', '$translate', 'gpColor', 'gpData', '$filter'];\nangular.module('cesium.graph.docstats.controllers', ['chart.js', 'cesium.graph.services', 'cesium.graph.common.controllers'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n $stateProvider\n .state('app.doc_stats_lg', {\n url: \"/data/stats?stepUnit&t&hide&scale\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/docstats/view_stats.html\",\n controller: 'GpDocStatsCtrl'\n }\n }\n });\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // TODO: add buttons to link with doc stats\n }\n }])\n\n\n .controller('GpDocStatsCtrl', GpDocStatsController)\n;\n\nfunction GpDocStatsController($scope, $state, $controller, $q, $translate, gpColor, gpData, $filter) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.formData.rangeDuration = 'month';\n\n $scope.displayRightAxis = true;\n $scope.hiddenDatasets = [];\n\n $scope.chartIdPrefix = 'docstats-chart-';\n $scope.charts = [\n\n // Market Ads (offer, need)\n {\n id: 'market',\n title: 'GRAPH.DOC_STATS.MARKET.TITLE',\n series: [\n {\n key: 'market_record',\n label: 'GRAPH.DOC_STATS.MARKET.AD',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal(),\n clickState: {\n name: 'app.document_search',\n params: {index:'market', type: 'record'}\n }\n },\n {\n key: 'market_comment',\n label: 'GRAPH.DOC_STATS.MARKET.COMMENT',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray(),\n clickState: {\n name: 'app.document_search',\n params: {index:'market', type: 'comment'}\n }\n }\n ]\n },\n\n // Market delta\n {\n id: 'user_delta',\n title: 'GRAPH.DOC_STATS.MARKET_DELTA.TITLE',\n series: [\n {\n key: 'market_record_delta',\n label: 'GRAPH.DOC_STATS.MARKET_DELTA.AD',\n type: 'line',\n yAxisID: 'y-axis-delta',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal()\n },\n {\n key: 'market_comment_delta',\n label: 'GRAPH.DOC_STATS.MARKET_DELTA.COMMENT',\n type: 'line',\n yAxisID: 'y-axis-delta',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray()\n }\n ]\n },\n\n // User count\n {\n id: 'user',\n title: 'GRAPH.DOC_STATS.USER.TITLE',\n series: [\n {\n key: 'user_profile',\n label: 'GRAPH.DOC_STATS.USER.USER_PROFILE',\n color: gpColor.rgba.royal(0.7),\n pointHoverBackgroundColor: gpColor.rgba.royal(),\n clickState: {\n name: 'app.document_search',\n params: {index:'user', type: 'profile'}\n }\n },\n {\n key: 'user_settings',\n label: 'GRAPH.DOC_STATS.USER.USER_SETTINGS',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray(),\n clickState: {\n name: 'app.document_search',\n params: {index:'user', type: 'settings'}\n }\n }\n ]\n },\n\n // User delta\n {\n id: 'user_delta',\n title: 'GRAPH.DOC_STATS.USER_DELTA.TITLE',\n series: [\n {\n key: 'user_profile_delta',\n label: 'GRAPH.DOC_STATS.USER_DELTA.USER_PROFILE',\n type: 'line',\n yAxisID: 'y-axis-delta',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal()\n },\n {\n key: 'user_settings_delta',\n label: 'GRAPH.DOC_STATS.USER_DELTA.USER_SETTINGS',\n type: 'line',\n yAxisID: 'y-axis-delta',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray()\n }\n ]\n },\n\n // Message & Co.\n {\n id: 'message',\n title: 'GRAPH.DOC_STATS.MESSAGE.TITLE',\n series: [\n {\n key: 'message_inbox',\n label: 'GRAPH.DOC_STATS.MESSAGE.MESSAGE_INBOX',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal(),\n clickState: {\n name: 'app.document_search',\n params: {index:'message', type: 'inbox'}\n }\n },\n {\n key: 'message_outbox',\n label: 'GRAPH.DOC_STATS.MESSAGE.MESSAGE_OUTBOX',\n color: gpColor.rgba.calm(),\n pointHoverBackgroundColor: gpColor.rgba.calm(),\n clickState: {\n name: 'app.document_search',\n params: {index:'message', type: 'outbox'}\n }\n }\n ]\n },\n\n // Social Page & group\n {\n id: 'social',\n title: 'GRAPH.DOC_STATS.SOCIAL.TITLE',\n series: [\n {\n key: 'page_record',\n label: 'GRAPH.DOC_STATS.SOCIAL.PAGE_RECORD',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal(),\n clickState: {\n name: 'app.document_search',\n params: {index:'page', type: 'record'}\n }\n },\n {\n key: 'group_record',\n label: 'GRAPH.DOC_STATS.SOCIAL.GROUP_RECORD',\n color: gpColor.rgba.calm(),\n pointHoverBackgroundColor: gpColor.rgba.calm(),\n clickState: {\n name: 'app.document_search',\n params: {index:'group', type: 'record'}\n }\n },\n {\n key: 'page_comment',\n label: 'GRAPH.DOC_STATS.SOCIAL.PAGE_COMMENT',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray(),\n clickState: {\n name: 'app.document_search',\n params: {index:'page', type: 'comment'}\n }\n }\n ]\n },\n\n // Subscriptions (email, ...)\n {\n id: 'subscription',\n title: 'GRAPH.DOC_STATS.SUBSCRIPTION.TITLE',\n series: [\n {\n key: 'subscription_record',\n label: 'GRAPH.DOC_STATS.SUBSCRIPTION.EMAIL',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal(),\n clickState: {\n name: 'app.document_search',\n params: {index:'subscription', type: 'record'}\n }\n }\n ]\n },\n\n // Other: deletion, doc, etc.\n {\n id: 'other',\n title: 'GRAPH.DOC_STATS.OTHER.TITLE',\n series: [\n {\n key: 'history_delete',\n label: 'GRAPH.DOC_STATS.OTHER.HISTORY_DELETE',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray(),\n clickState: {\n name: 'app.document_search',\n params: {index:'history', type: 'delete'}\n }\n }\n ]\n }\n ];\n\n var formatInteger = $filter('formatInteger');\n\n $scope.defaultChartOptions = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true\n },\n legend: {\n display: true,\n onClick: $scope.onLegendClick\n },\n scales: {\n xAxes: [{\n stacked: true\n }],\n yAxes: [\n {\n id: 'y-axis',\n stacked: true\n },\n {\n id: 'y-axis-delta',\n stacked: false\n },\n {\n id: 'y-axis-delta-right',\n stacked: false,\n display: $scope.displayRightAxis,\n position: 'right',\n gridLines: {\n drawOnChartArea: false\n }\n }\n ]\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + formatInteger(tooltipItems.yLabel);\n }\n }\n }\n };\n\n $scope.init = function(e, state) {\n if (state && state.stateParams) {\n // Manage URL parameters\n }\n };\n\n $scope.load = function(updateTimePct) {\n\n return $q.all([\n // Get i18n keys (chart title, series labels, date patterns)\n $translate($scope.charts.reduce(function(res, chart) {\n return res.concat(chart.series.reduce(function(res, serie) {\n return res.concat(serie.label);\n }, [chart.title]));\n }, [\n 'COMMON.DATE_PATTERN',\n 'COMMON.DATE_SHORT_PATTERN',\n 'COMMON.DATE_MONTH_YEAR_PATTERN'\n ])),\n\n // get Data\n gpData.docstat.get($scope.formData)\n ])\n .then(function(result) {\n var translations = result[0];\n var datePatterns = {\n hour: translations['COMMON.DATE_PATTERN'],\n day: translations['COMMON.DATE_SHORT_PATTERN'],\n month: translations['COMMON.DATE_MONTH_YEAR_PATTERN']\n };\n\n result = result[1];\n if (!result || !result.times) return; // no data\n $scope.times = result.times;\n\n //console.debug(result);\n\n // Labels\n var labelPattern = datePatterns[$scope.formData.rangeDuration];\n $scope.labels = _.map(result.times, function(time) {\n return moment.unix(time).local().format(labelPattern);\n });\n\n // Update range options with received values\n $scope.updateRange(result.times[0], result.times[result.times.length-1], updateTimePct);\n\n $scope.setScale($scope.scale);\n\n // For each chart\n _.forEach($scope.charts, function(chart){\n\n // Prepare chart data\n var usedYAxisIDs = {};\n chart.data = _.map(chart.series, function(serie) {\n usedYAxisIDs[serie.yAxisID||'y-axis'] = true;\n // If 'delta' serie, then compute delta from the source serie\n if (serie.key.endsWith('_delta')) {\n var key = serie.key.substring(0, serie.key.length - '_delta'.length);\n return getDeltaFromValueArray(result[key]) || [];\n }\n return result[serie.key]||[];\n });\n\n // Options (with title)\n chart.options = angular.copy($scope.defaultChartOptions);\n chart.options.title.text = translations[chart.title];\n\n // Remove unused yAxis\n chart.options.scales.yAxes = chart.options.scales.yAxes.reduce(function(res, yAxe){\n return usedYAxisIDs[yAxe.id] ? res.concat(yAxe) : res;\n }, []);\n\n // Series datasets\n chart.datasetOverride = _.map(chart.series, function(serie) {\n return {\n yAxisID: serie.yAxisID || 'y-axis',\n type: serie.type || 'line',\n label: translations[serie.label],\n fill: serie.type !== 'line',\n borderWidth: 2,\n pointRadius: serie.type !== 'line' ? 0 : 2,\n pointHitRadius: 4,\n pointHoverRadius: 3,\n borderColor: serie.color,\n backgroundColor: serie.color,\n pointBackgroundColor: serie.color,\n pointBorderColor: serie.color,\n pointHoverBackgroundColor: serie.pointHoverBackgroundColor||serie.color,\n pointHoverBorderColor: serie.pointHoverBorderColor||gpColor.rgba.white()\n };\n });\n });\n });\n\n };\n\n $scope.onChartClick = function(data, e, item) {\n if (!item) return;\n var chart = _.find($scope.charts , function(chart) {\n return ($scope.chartIdPrefix + chart.id) == item._chart.canvas.id;\n });\n\n var serie = chart.series[item._datasetIndex];\n\n if (serie && serie.clickState && serie.clickState.name) {\n var stateParams = serie.clickState.params ? angular.copy(serie.clickState.params) : {};\n\n // Compute query\n var from = $scope.times[item._index];\n var to = moment.unix(from).utc().add(1, $scope.formData.rangeDuration).unix();\n stateParams.q = 'time:>={0} AND time:<{1}'.format(from, to);\n\n return $state.go(serie.clickState.name, stateParams);\n }\n else {\n console.debug('Click on item index={0}'.format(item._index));\n }\n };\n\n function getDeltaFromValueArray(values) {\n if (!values) return undefined;\n var previousValue;\n return _.map(values, function(value) {\n var newValue = (value !== undefined && previousValue !== undefined) ? (value - (previousValue || value)) : undefined;\n previousValue = value;\n return newValue;\n });\n }\n\n}\n","\nGpSynchroController.$inject = ['$scope', '$controller', '$q', '$translate', 'gpColor', 'gpData', '$filter'];\nangular.module('cesium.graph.synchro.controllers', ['chart.js', 'cesium.graph.services', 'cesium.graph.common.controllers'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n $stateProvider\n .state('app.doc_synchro_lg', {\n url: \"/data/synchro?stepUnit&t&hide&scale\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/graph/templates/synchro/view_stats.html\",\n controller: \"GpSynchroCtrl\"\n }\n }\n });\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // TODO: add buttons to link with doc stats\n }\n }])\n\n\n .controller('GpSynchroCtrl', GpSynchroController)\n;\n\nfunction GpSynchroController($scope, $controller, $q, $translate, gpColor, gpData, $filter) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('GpCurrencyAbstractCtrl', {$scope: $scope}));\n\n $scope.formData.rangeDuration = 'month';\n $scope.hiddenDatasets = [];\n\n $scope.charts = [\n\n // Execution: number of doc\n {\n id: 'count',\n title: 'GRAPH.SYNCHRO.COUNT.TITLE',\n series: [\n {\n key: 'inserts',\n type: 'bar',\n label: 'GRAPH.SYNCHRO.COUNT.INSERTS',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal()\n },\n {\n key: 'updates',\n type: 'bar',\n label: 'GRAPH.SYNCHRO.COUNT.UPDATES',\n color: gpColor.rgba.calm(),\n pointHoverBackgroundColor: gpColor.rgba.calm()\n },\n {\n key: 'deletes',\n type: 'bar',\n label: 'GRAPH.SYNCHRO.COUNT.DELETES',\n color: gpColor.rgba.assertive(0.5),\n pointHoverBackgroundColor: gpColor.rgba.assertive()\n }\n ]\n },\n\n // Execution: number of peers\n {\n id: 'peer',\n title: 'GRAPH.SYNCHRO.PEER.TITLE',\n series: [\n {\n key: 'ES_USER_API',\n label: 'GRAPH.SYNCHRO.PEER.ES_USER_API',\n color: gpColor.rgba.royal(),\n pointHoverBackgroundColor: gpColor.rgba.royal()\n },\n {\n key: 'ES_SUBSCRIPTION_API',\n label: 'GRAPH.SYNCHRO.PEER.ES_SUBSCRIPTION_API',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray()\n }\n ]\n },\n\n // Execution: number of peers\n {\n id: 'performance',\n title: 'GRAPH.SYNCHRO.PERFORMANCE.TITLE',\n series: [\n {\n key: 'duration',\n type: 'bar',\n label: 'GRAPH.SYNCHRO.PERFORMANCE.DURATION',\n color: gpColor.rgba.gray(0.5),\n pointHoverBackgroundColor: gpColor.rgba.gray()\n }\n ]\n }\n ];\n\n var formatInteger = $filter('formatInteger');\n\n $scope.defaultChartOptions = {\n responsive: true,\n maintainAspectRatio: $scope.maintainAspectRatio,\n title: {\n display: true\n },\n legend: {\n display: true,\n onClick: $scope.onLegendClick\n },\n scales: {\n xAxes: [{\n stacked: true\n }],\n yAxes: [\n {\n stacked: true,\n id: 'y-axis'\n }\n ]\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n callbacks: {\n label: function(tooltipItems, data) {\n return data.datasets[tooltipItems.datasetIndex].label +\n ': ' + formatInteger(tooltipItems.yLabel);\n }\n }\n }\n };\n\n $scope.init = function(e, state) {\n if (state && state.stateParams) {\n // Manage URL parameters\n }\n };\n\n $scope.load = function(updateTimePct) {\n\n return $q.all([\n // Get i18n keys (chart title, series labels, date patterns)\n $translate($scope.charts.reduce(function(res, chart) {\n return res.concat(chart.series.reduce(function(res, serie) {\n return res.concat(serie.label);\n }, [chart.title]));\n }, [\n 'COMMON.DATE_PATTERN',\n 'COMMON.DATE_SHORT_PATTERN',\n 'COMMON.DATE_MONTH_YEAR_PATTERN'\n ])),\n\n // get Data\n gpData.synchro.execution.get($scope.formData)\n ])\n .then(function(result) {\n var translations = result[0];\n var datePatterns = {\n hour: translations['COMMON.DATE_PATTERN'],\n day: translations['COMMON.DATE_SHORT_PATTERN'],\n month: translations['COMMON.DATE_MONTH_YEAR_PATTERN']\n };\n\n result = result[1];\n if (!result || !result.times) return; // no data\n $scope.times = result.times;\n\n // Labels\n var labelPattern = datePatterns[$scope.formData.rangeDuration];\n $scope.labels = result.times.reduce(function(res, time) {\n return res.concat(moment.unix(time).local().format(labelPattern));\n }, []);\n\n // Update range options with received values\n $scope.updateRange(result.times[0], result.times[result.times.length-1], updateTimePct);\n\n $scope.setScale($scope.scale);\n\n // For each chart\n _.forEach($scope.charts, function(chart){\n\n // Data\n chart.data = [];\n _.forEach(chart.series, function(serie){\n chart.data.push(result[serie.key]||[]);\n });\n\n // Options (with title)\n chart.options = angular.copy($scope.defaultChartOptions);\n chart.options.title.text = translations[chart.title];\n\n // Series datasets\n chart.datasetOverride = chart.series.reduce(function(res, serie) {\n return res.concat({\n yAxisID: 'y-axis',\n type: serie.type || 'line',\n label: translations[serie.label],\n fill: true,\n borderWidth: 2,\n pointRadius: 0,\n pointHitRadius: 4,\n pointHoverRadius: 3,\n borderColor: serie.color,\n backgroundColor: serie.color,\n pointBackgroundColor: serie.color,\n pointBorderColor: serie.color,\n pointHoverBackgroundColor: serie.pointHoverBackgroundColor||serie.color,\n pointHoverBorderColor: serie.pointHoverBorderColor||gpColor.rgba.white()\n });\n }, []);\n });\n });\n };\n}\n","\nGpNetworkViewExtendController.$inject = ['$scope', 'PluginService', 'esSettings'];\nGpPeerViewExtendController.$inject = ['$scope', '$timeout', 'PluginService', 'esSettings', 'csCurrency', 'gpData'];\nangular.module('cesium.graph.network.controllers', ['chart.js', 'cesium.graph.services'])\n\n .config(['$stateProvider', 'PluginServiceProvider', 'csConfig', function($stateProvider, PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n .extendState('app.es_network', {\n points: {\n 'buttons': {\n templateUrl: \"plugins/graph/templates/network/view_es_network_extend.html\",\n controller: 'GpNetworkViewExtendCtrl'\n }\n }\n })\n\n .extendState('app.view_es_peer', {\n points: {\n 'general': {\n templateUrl: \"plugins/graph/templates/network/view_es_peer_extend.html\",\n controller: 'ESExtensionCtrl'\n }\n }\n })\n ;\n\n }\n }])\n\n .controller('GpNetworkViewExtendCtrl', GpNetworkViewExtendController)\n\n .controller('GpPeerViewExtendCtrl', GpPeerViewExtendController)\n\n;\n\n\nfunction GpNetworkViewExtendController($scope, PluginService, esSettings) {\n 'ngInject';\n\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n $scope.enable = esSettings.isEnable();\n\n esSettings.api.state.on.changed($scope, function(enable) {\n $scope.enable = enable;\n });\n}\n\nfunction GpPeerViewExtendController($scope, $timeout, PluginService, esSettings, csCurrency, gpData) {\n 'ngInject';\n\n $scope.extensionPoint = PluginService.extensions.points.current.get();\n $scope.enable = esSettings.isEnable();\n $scope.loading = true;\n $scope.node = $scope.node || {};\n\n esSettings.api.state.on.changed($scope, function(enable) {\n $scope.enable = enable;\n });\n\n /**\n * Enter into the view\n * @param e\n * @param state\n */\n $scope.enter = function(e, state) {\n\n if (!$scope.node.currency && state && state.stateParams && state.stateParams.currency) { // Currency parameter\n $scope.node.currency = state.stateParams.currency;\n }\n\n // Make sure there is currency, or load if not\n if (!$scope.node.currency) {\n return csCurrency.get()\n .then(function(currency) {\n $scope.node.currency = currency ? currency.name : null;\n return $scope.enter(e, state);\n });\n }\n\n // Make sure there is pubkey, or wait for parent load to be finished\n if (!$scope.node.pubkey) {\n return $timeout(function () {\n return $scope.enter(e, state);\n }, 500);\n }\n\n // load\n return $scope.load();\n };\n $scope.$on('$csExtension.enter', $scope.enter);\n\n $scope.load = function() {\n if (!$scope.node.currency && !$scope.node.pubkey) return;\n console.info(\"[Graph] [peer] Loading blocks count for [{0}]\".format($scope.node.pubkey.substr(0, 8)));\n\n return gpData.node.blockCount($scope.node.currency, $scope.node.pubkey)\n .then(function(count) {\n $scope.blockCount = count;\n $scope.loading = false;\n });\n };\n}\n","\nMapShapeViewController.$inject = ['$scope', '$translate', '$timeout', '$q', '$document', 'UIUtils', 'csConfig', 'csSettings', 'esShape'];\nMapCountryEditController.$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'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n\n .state('app.map_shape_country_edit', {\n url: \"/map/country/edit\",\n views: {\n 'menuContent': {\n templateUrl: \"plugins/map/templates/shape/edit_shape.html\",\n controller: 'MapCountryEditCtrl'\n }\n }\n });\n }])\n\n .controller('MapShapeViewCtrl', MapShapeViewController)\n\n .controller('MapCountryEditCtrl', MapCountryEditController);\n\n\nfunction MapShapeViewController($scope, $translate, $timeout, $q, $document,\n UIUtils, csConfig, csSettings, esShape) {\n 'ngInject';\n\n\n $scope.loading = true;\n $scope.shapeId = 'shape-' + $scope.$id;\n $scope.formData = {\n country: null\n };\n $scope.countriesMap = {\n fr: 'France',\n be: 'Belgium',\n es: 'Spain',\n gb: 'United Kingdom',\n us: 'USA'\n };\n $scope.countries = null;\n\n $scope.load = function(options) {\n options = options || {};\n\n // Make sure to load countries\n if (!$scope.countries) {\n return $scope.loadAllCountries()\n .then(function(countries) {\n // Stop here, if no countries\n if (!countries || !countries.length) {\n $scope.loading = false;\n return;\n }\n return $scope.load(options); // Loop\n });\n }\n\n var country = $scope.getDefaultCountry(options);\n $scope.formData.country = country;\n\n var now;\n if (!options || options.silent !== true) {\n $scope.loading = true;\n now = Date.now();\n }\n console.debug('[shape] Loading shape for country {{0}}...'.format(country));\n\n return esShape.geoJson.search({country: country})\n .then(function(data) {\n // Display data\n $scope.updateView(data);\n\n // Add listeners\n $scope.addListeners();\n\n if (now) {\n console.debug('[shape] Shape loaded in {0}ms'.format(Date.now() - now));\n }\n $scope.loading = false;\n })\n .catch(function(err) {\n console.error(\"Cannot load shape for country '{0}'\".format(country), err);\n $scope.loading = false;\n });\n };\n\n $scope.loadAllCountries = function() {\n return esShape.getAllCountries()\n .then(function (countries) {\n // Replace countries\n $scope.countries = _(countries || []).pluck('id');\n return $scope.countries;\n })\n .catch(function(err) {\n console.error('[shape] Error child loading countries: ' + (err && err.message || err), err);\n });\n };\n\n $scope.getDefaultCountry = function(options) {\n var defaultCountry = options && options.country;\n\n // Try to get from locale\n if (!defaultCountry) {\n var locale = csSettings.data.locale || {id: $translate.use()};\n var localCountry = locale && locale.country || locale.id.split('-')[1];\n\n defaultCountry = localCountry && _.find($scope.countries, function (c) {\n return c.toUpperCase() === localCountry.toUpperCase();\n });\n }\n if (!defaultCountry && csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.defaultCountry) {\n defaultCountry = _.find($scope.countries, function (c) {\n var title = $scope.countriesMap[c];\n return title && title.toUpperCase() === csConfig.plugins.es.defaultCountry.toUpperCase() ? c : false;\n }) || 'fr'; // Default country\n }\n\n defaultCountry = defaultCountry || 'fr';\n\n return defaultCountry;\n };\n\n $scope.updateView = function(geoJson) {\n if (!geoJson) {\n esShape.svg.remove({selector: '#' + $scope.shapeId});\n }\n else {\n esShape.svg.createMosaic(geoJson, {\n selector: '#' + $scope.shapeId,\n onclick: $scope.onClick\n });\n }\n };\n\n $scope.onCountryChange = function(country) {\n if (!country) return; // Skip\n console.debug('[shape] Select country map:', country);\n return $scope.load({country: country});\n };\n\n // Watch locale change, to reload categories\n $scope.onLocaleChange = function(localeId) {\n console.debug('[market] [map] Reloading map, because locale changed to ' + localeId);\n var locale = _.findWhere(csSettings.locales, {id: localeId}) || {id : $translate.use()};\n var country = locale && (locale.country || locale.id.split('-')[1]);\n return $scope.onCountryChange(country);\n };\n\n $scope.addListeners = function() {\n if ($scope.listeners) return; // skip\n\n $scope.listeners = [\n csSettings.api.locale.on.changed($scope, $scope.onLocaleChange, this)\n ];\n };\n\n $scope.onClick = function(event, element) {\n if (event && event.defaultPrevented) return;\n console.warn('[shape] No handler for SVG element click', element);\n };\n}\n\n\n\nfunction MapCountryEditController($scope, $rootScope, $state, $controller, $timeout, $q, leafletData, $translate,\n FileSaver, UIUtils, MapUtils, csWallet, esShape) {\n 'ngInject';\n\n $scope.entered = false;\n $scope.saving = false;\n $scope.formData = {\n country: null,\n errors: null\n };\n $scope.configData = {\n geoViewBox: {\n leftLng: null,\n rightLng: null,\n topLat: null,\n bottomLat: null,\n },\n scale: 1,\n translateX: 0,\n translateY: 0,\n\n removeHole: true,\n applyRound: true,\n degreePrecision: esShape.constants.projection.degreePrecision,\n strictMode: false\n };\n $scope.showConfig = false;\n $scope.elementData = {\n country: null,\n id: null,\n title: null,\n position: 'main',\n order: undefined\n };\n $scope.dirty = false;\n $scope.countries = [];\n $scope.iso2Pattern = /^[a-z][a-z]$/;\n $scope.positions = esShape.constants.positions;\n $scope.positionPattern = new RegExp('^(' + esShape.constants.positions.join('|') + ')$');\n $scope.showLeaflet = false;\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('MapShapeViewCtrl', {$scope: $scope}));\n\n $scope.mapId = 'map-' + $scope.$id;\n $scope.map = MapUtils.map({\n markers: {},\n center: {\n zoom: 4\n },\n defaults: {\n tileLayerOptions: {\n attribution: '© <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a>'\n }\n },\n geojson: {\n data: null,\n style: {\n fillColor: esShape.constants.style.defaults.fill,\n fillOpacity: 0.7,\n color: esShape.constants.style.defaults.stroke,\n opacity: 1,\n weight: 1\n }\n }\n });\n\n $scope.enter = function (e, state) {\n if (!$scope.entered) {\n $scope.entered = true;\n\n $scope.load();\n }\n };\n $scope.$on('$ionicView.enter', $scope.enter);\n\n $scope.load = function(options) {\n options = options || {};\n\n // Reset the form\n $scope.dirty = false;\n\n if (!options.silent){\n $scope.loading = true;\n UIUtils.loading.show();\n }\n return $q.all([\n // Load shape\n options.country ? esShape.geoJson.search({country: options.country}) : $q.when(),\n // Load countries\n $scope.loadAllCountries()\n ])\n .then(function(res) {\n var geoJson = res[0] || null;\n return $scope.updateView(geoJson, options);\n })\n .then(function() {\n $scope.loading = false;\n UIUtils.loading.hide();\n })\n .catch(function(err) {\n console.error(err);\n UIUtils.alert.error(err && err.message || err);\n $scope.loading = false;\n });\n };\n\n $scope.resetForms = function(data) {\n $scope.resetForm(data);\n $scope.resetConfigForm(data);\n $scope.resetElementForm(data);\n };\n\n $scope.resetForm = function(data) {\n $scope.formData.country = (data && data.country) || null;\n $scope.formData.errors = (data && data.errors) || null;\n };\n\n $scope.resetConfigForm = function(data) {\n angular.merge($scope.configData, {\n geoViewBox: {\n leftLng: (data && data.geoViewBox && data.geoViewBox.leftLng) || -180,\n rightLng: (data && data.geoViewBox && data.geoViewBox.rightLng) || 180,\n topLat: (data && data.geoViewBox && data.geoViewBox.topLat) || 90,\n bottomLat: (data && data.geoViewBox && data.geoViewBox.bottomLat) || -90\n },\n scale: (data && data.scale) || 1,\n translateX: (data && data.translateX) || 0,\n translateY: (data && data.translateY) || 0,\n svgText: (data && data.svgText) || null,\n removeHole: true,\n applyRound: true,\n degreePrecision: esShape.constants.projection.degreePrecision,\n strictMode: false\n });\n };\n\n $scope.resetElementForm = function(data) {\n var position = (data && data.position) || 'main';\n angular.merge($scope.elementData, {\n id: data && data.id || null,\n title: data && data.title || null,\n country: (data && data.country) || ($scope.formData && $scope.formData.country),\n position: position,\n order: (position !== 'main' && data.order) || undefined\n });\n $scope.elementData.element = data && data.element || null;\n };\n\n $scope.markAsDirty = function() {\n if ($scope.loading || $scope.saving) return; // Skip\n $scope.dirty = true;\n };\n $scope.$watch('formData.country', $scope.markAsDirty, true);\n\n $scope.setCountryForm = function(form) {\n $scope.countryForm = form;\n };\n $scope.setConfigForm = function(form) {\n $scope.configForm = form;\n };\n $scope.setElementForm = function(form) {\n $scope.elementForm = form;\n };\n\n $scope.onFileChanged = function(event) {\n if (!event || !event.file || !event.fileContent) return; // Skip\n\n $scope.loading = true;\n try {\n var geoJson;\n // Add SVG file\n if (event.file.type.startsWith('image/svg')) {\n console.debug('[map] [shape] Loading SVG file {0}'.format(event.fileData && event.fileData.name));\n $scope.updateFromSvgFile(event.fileContent);\n }\n\n // Geo json file\n else {\n console.debug('[map] [shape] Loading GeoJson file {0}'.format(event.fileData && event.fileData.name));\n $scope.updateFromGeoJson(event.fileContent);\n }\n }\n catch(err) {\n console.error(err);\n UIUtils.onError('MAP.SHAPE.EDIT.ERROR.INVALID_SVG')(err);\n\n $scope.resetForms();\n $scope.dirty = false;\n $scope.showConfigForm = false;\n }\n finally {\n $scope.loading = false;\n }\n };\n\n $scope.updateFromSvgFile = function(svgText) {\n\n\n UIUtils.loading.show();\n try {\n // Create a SVG element, to be able to read bounds\n var svg = esShape.svg.createFromText(svgText, {\n selector: '#' + $scope.shapeId,\n //class: 'ng-hide'\n });\n\n // Create config\n var config = {\n geoViewBox: esShape.svg.findGeoViewBox(svg),\n customProjection: true,\n scale: 1,\n translateX: 0,\n translateY: 0,\n svgText: svgText\n };\n if (config.geoViewBox) {\n var proj = esShape.svg.projectionData(svg, {\n geoViewBox: config.geoViewBox\n });\n if (proj) {\n config.customProjection = false;\n config.scale = proj.scale;\n config.translateX = proj.translate[0];\n config.translateY = proj.translate[1];\n }\n }\n\n $scope.resetConfigForm(config);\n\n $scope.showConfig = true;\n $scope.applySvgConfig(svg, angular.merge(config,\n {customProjection: true})); // Force to use computed projection\n svg.remove();\n }\n finally {\n UIUtils.loading.hide();\n }\n };\n\n $scope.updateFromGeoJson = function(geoJson) {\n geoJson = typeof geoJson === 'string' ? JSON.parse(geoJson) : geoJson;\n $scope.showConfigForm = false;\n $scope.resetForms();\n $scope.markAsDirty();\n\n $scope.updateView(geoJson);\n };\n\n $scope.updateView = function(geoJson, options) {\n var selector = '#' + $scope.shapeId;\n if (!geoJson) {\n esShape.svg.remove({selector: selector});\n }\n else {\n _($scope.positions).each(function(position) {\n d3.selectAll([selector, '.' + position, 'svg'].join(' ')).remove();\n });\n\n // Normalize each features properties\n _(geoJson.features||[]).each(function(feature) {\n feature.properties = $scope.getNormalizeProperties(feature.properties||{}, options);\n });\n\n esShape.svg.createMosaic(geoJson, {\n selector: selector,\n onclick: $scope.onPathClick\n });\n }\n\n $scope.resetElementForm({country: options && options.country});\n $scope.map.geojson.data = geoJson;\n return $q.when();\n };\n\n $scope.applySvgConfig = function(svg, config) {\n\n config = config || $scope.configData;\n //if ($scope.loading) return; // Skip\n\n if ($scope.configForm) {\n $scope.configForm.$submitted = true;\n if(!$scope.configForm.$valid) return;\n }\n\n console.debug('[map] [shape] Apply config: ', config);\n\n // Converting SVG into geojson, using the config\n svg = svg || esShape.svg.createFromText(config.svgText, {\n selector: '#' + $scope.shapeId,\n class: 'ng-hide'\n });\n\n var convertOptions = {\n selector: '#' + $scope.shapeId,\n geoViewBox: config.geoViewBox,\n precision: $scope.configData.applyRound && $scope.configData.degreePrecision,\n strictMode: $scope.configData.strictMode,\n removeHole: $scope.configData.removeHole\n };\n if (config.customProjection) {\n convertOptions.scale = config.scale || 1;\n convertOptions.translate = [config.translateX||0, config.translateY||0];\n }\n\n var geoJson = esShape.svg.toGeoJson(svg, convertOptions);\n\n $scope.updateView(geoJson);\n };\n\n $scope.onPathClick = function(event, element) {\n\n console.debug('[map] [shape] Start edit element:', element);\n var path = d3.select(element);\n\n var geoJson = path.data()[0] || {};\n\n var properties = $scope.getNormalizeProperties(geoJson.properties || {});\n $scope.resetElementForm(properties);\n $scope.elementData.element = element;\n\n $scope.$apply();\n };\n\n $scope.deleteElement = function() {\n if (!$scope.elementData.element) return;\n\n var svg = d3.select($scope.elementData.element.parentNode);\n var path = d3.select($scope.elementData.element);\n\n path.remove();\n\n // Update the leaflet map\n var geoJson = {\n type: 'FeatureCollection',\n features: svg.selectAll('path').data()\n };\n\n $scope.resetElementForm();\n $scope.markAsDirty();\n\n return $scope.updateView(geoJson);\n\n };\n\n $scope.confirmEditElement = function() {\n if (!$scope.elementData.element) return;\n $scope.elementForm.$submitted = true;\n if(!$scope.elementForm.$valid) return;\n\n var path = d3.select($scope.elementData.element);\n var geojson = $scope.map.geojson.data;\n\n // Retrieve the source features\n var feature = path.data()[0] || {};\n if (!feature) throw new Error('No data found in the selected <path> element');\n\n // Get the source feature, not the copy\n var key = JSON.stringify(feature);\n feature = _.find(geojson.features, function(f) {\n return f.type === feature.type &&\n JSON.stringify(f) === key;\n });\n if (!feature) throw new Error('Feature not found in the source content');\n\n // Update the feature\n feature.properties = feature.properties || {};\n delete $scope.elementData.element;\n angular.merge(feature.properties, $scope.elementData);\n\n $scope.resetElementForm();\n $scope.markAsDirty();\n\n // Update the view, to apply changes\n $scope.updateView(geojson);\n };\n\n $scope.cancelEditElement = function() {\n $scope.resetElementForm();\n };\n\n $scope.cancel = function() {\n $scope.resetForms();\n $scope.map.geojson.data = null;\n $scope.showConfig = false;\n\n d3.select('#' + $scope.shapeId + ' *').remove();\n };\n\n $scope.save = function() {\n var geoJson = $scope.map.geojson.data;\n if (!geoJson || !$scope.dirty) return; // Nothing to save\n\n // Reset errors\n $scope.formData.errors = null;\n\n $scope.countryForm.$submitted=true;\n if($scope.saving || // avoid multiple save\n !$scope.countryForm.$valid || !$scope.formData.country) {\n return $q.reject();\n }\n\n if (!csWallet.isLogin()) {\n return $scope.loadWallet().then($scope.save);\n }\n\n $scope.saving = true;\n var country = $scope.formData.country || 'fr';\n\n return UIUtils.loading.show({template: 'Saving...'})\n .then(function() {\n return esShape.save(geoJson, {\n country: country,\n removeHole: $scope.configData.removeHole,\n precision: $scope.configData.applyRound && $scope.configData.degreePrecision || null,\n strictMode: $scope.configData.strictMode,\n updateProgression: function(feature, index, total) {\n var title = feature.properties && (feature.properties.title || feature.properties.id) || (''+ index);\n UIUtils.loading.show({template: 'Saving... ({1}/{2})<br/><b>{0}</b>'.format(title, index+1, total)});\n }\n });\n })\n .then(function() {\n $scope.saving = false;\n\n // Wait 2s (for pod propagation), then reload\n return $timeout(function() {\n return $scope.load({country: country});\n }, 2000);\n })\n .then(function() {\n return UIUtils.toast.show(\"MAP.SHAPE.EDIT.INFO.SAVED\");\n })\n .catch(function(err) {\n UIUtils.onError(\"MAP.SHAPE.EDIT.ERROR.SAVE_FAILED\")(err);\n if (err && err.errors) {\n $scope.formData.errors = err && err.errors || null;\n }\n else if (err.message) {\n $scope.formData.errors = [err];\n }\n })\n .then(function() {\n $scope.saving = false;\n });\n };\n\n $scope.getNormalizeProperties = function(properties, defaults) {\n return {\n id: (properties && properties.id) || (defaults && defaults.id) || (properties && properties.code),\n title: properties && (properties.title || properties.name || properties.label || properties.nom),\n country: properties && properties.country || (defaults && defaults.country),\n position: properties && properties.position,\n order: properties && properties.order || undefined,\n };\n };\n\n $scope.findSvgElementFromPath = function(element) {\n var path = d3.select(element);\n\n console.log(path);\n console.log(path.bounds());\n };\n\n $scope.searchOnPath = function() {\n if (!$scope.elementData.element) return;\n\n // Update the leaflet map\n var features = d3.select($scope.elementData.element).data();\n\n if (!features || !features.length) return; // Skip\n\n var feature = features[0];\n var properties = $scope.getNormalizeProperties(feature.properties);\n var location = properties.name;\n\n $rootScope.geoShapes = $rootScope.geoShapes || {};\n $rootScope.geoShapes[location] = feature.geometry;\n $state.go('app.market_lookup', {location: location});\n };\n\n $scope.download = function() {\n if ($scope.loading || $scope.saving || !$scope.map.geojson.data) return;\n\n var content = JSON.stringify($scope.map.geojson.data);\n var file = new Blob([content], {type: 'application/geo+json; charset=utf-8'});\n var filename = ($scope.formData.country || 'export') + '.geojson';\n\n FileSaver.saveAs(file, filename);\n };\n\n $scope.centerMap = function(center) {\n console.debug('[map] [shape] Center map to:', center);\n\n // Rename longitude\n center.lng = angular.isDefined(center.lon) ? center.lon : center.lng;\n center.zoom = center.zoom || $scope.map.center.zoom || 10;\n\n // If re apply center again, increase zoom\n if (center.lat === $scope.map.center.lat &&\n center.lng === $scope.map.center.lng &&\n center.zoom === $scope.map.center.zoom) {\n center.zoom += 2;\n }\n\n angular.merge($scope.map.center, center);\n };\n\n // -- for DEV only --\n /*$scope.formData.errors = [\n {message: 'MAP.SHAPE.EDIT.ERROR.SELF_INTERSECTION', messageParams: {id: 'US-MI'}, lat: 5, lon: 5}\n ];*/\n\n\n}\n","\nMapHomeController.$inject = ['$scope', '$rootScope', '$controller', '$state', 'csPlatform', 'UIUtils', 'esShape', 'csSettings'];angular.module('cesium.map.home.controllers', ['ngResource', 'cesium.es.services', 'cesium.map.shape.controllers'])\n\n // Configure menu items\n .config(['PluginServiceProvider', function(PluginServiceProvider) {\n 'ngInject';\n\n // Home extension points\n PluginServiceProvider.extendState('app.home', {\n points: {\n 'footer-end': {\n templateUrl: \"plugins/map/templates/shape/view_shape.html\",\n controller: \"MapHomeCtrl\"\n }\n }\n });\n }])\n\n .controller('MapHomeCtrl', MapHomeController)\n\n;\n\nfunction MapHomeController($scope, $rootScope, $controller, $state, csPlatform, UIUtils, esShape, csSettings) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('MapShapeViewCtrl', {$scope: $scope}));\n\n $scope.onClick = function(event, element) {\n if (event && event.defaultPrevented) return;\n\n console.debug('[map] [home] Handling click on a SVG element...');\n\n // Update the leaflet map\n var features = d3.select(element).data();\n\n if (!features || !features.length) {\n console.error('[map] [home] Invalid SVG element: no geoJson data found.');\n return;\n }\n\n var feature = features[0];\n var properties = feature.properties;\n var location = properties.title && properties.title.trim();\n\n if (!location || !location.length) {\n console.error(\"[map] [home] Invalid GeoJson data. Missing or empty attribute 'properties.title'.\");\n return;\n }\n\n // Store shape into root scope, to be able to read it again later (see MarketSearchController)\n return esShape.cache.put(feature)\n .then(function(id) {\n\n // Redirect to market search\n return $state.go('app.market_lookup', {\n shape: id,\n location: location });\n })\n // Add location shape to settings\n .then(function() {\n csSettings.data.plugins.market = csSettings.data.plugins.market || {};\n csSettings.data.plugins.defaultSearch = angular.merge(csSettings.data.plugins.defaultSearch || {}, {\n location: location,\n geoShape: feature,\n geoPoint: undefined,\n geoDistance: undefined\n });\n });\n };\n\n $scope.start = function() {\n\n console.debug('[home] [shape] Starting');\n\n // Start loading the map, if NOT small device\n $scope.load();\n };\n\n // Run start\n csPlatform.ready().then($scope.start);\n\n}\n\n\n","\n\nangular.module('cesium.platform', ['cesium.config', 'cesium.services'])\n\n // Translation i18n\n .config(['$translateProvider', 'csConfig', function ($translateProvider, csConfig) {\n 'ngInject';\n\n $translateProvider\n .uniformLanguageTag('bcp47')\n .determinePreferredLanguage()\n // Cela fait bugger les placeholder (pb d'affichage des accents en FR)\n //.useSanitizeValueStrategy('sanitize')\n .useSanitizeValueStrategy(null)\n .fallbackLanguage([csConfig.fallbackLanguage ? csConfig.fallbackLanguage : 'en'])\n .useLoaderCache(true);\n }])\n\n .config(['$httpProvider', 'csConfig', function($httpProvider, csConfig) {\n 'ngInject';\n\n // Set default timeout\n $httpProvider.defaults.timeout = !!csConfig.timeout ? csConfig.timeout : 300000 /* default timeout */;\n\n //Enable cross domain calls\n $httpProvider.defaults.useXDomain = true;\n\n //Remove the header used to identify ajax call that would prevent CORS from working\n delete $httpProvider.defaults.headers.common['X-Requested-With'];\n\n }])\n\n\n .config(['$compileProvider', 'csConfig', function($compileProvider, csConfig) {\n 'ngInject';\n\n $compileProvider.debugInfoEnabled(!!csConfig.debug);\n }])\n\n .config(['$animateProvider', function($animateProvider) {\n 'ngInject';\n\n $animateProvider.classNameFilter( /\\banimate-/ );\n }])\n\n // Configure cache (used by HTTP requests) default max age\n .config(['CacheFactoryProvider', 'csConfig', function (CacheFactoryProvider, csConfig) {\n 'ngInject';\n angular.extend(CacheFactoryProvider.defaults, { maxAge: csConfig.cacheTimeMs || 60 * 5000 /*5min*/});\n }])\n\n // Configure screen size detection\n .config(['screenmatchConfigProvider', function(screenmatchConfigProvider) {\n 'ngInject';\n\n screenmatchConfigProvider.config.rules = 'bootstrap';\n }])\n\n .config(['$ionicConfigProvider', function($ionicConfigProvider) {\n 'ngInject';\n\n // JS scrolling need for iOs (see http://blog.ionic.io/native-scrolling-in-ionic-a-tale-in-rhyme/)\n var enableJsScrolling = ionic.Platform.isIOS();\n $ionicConfigProvider.scrolling.jsScrolling(enableJsScrolling);\n\n // Configure the view cache\n $ionicConfigProvider.views.maxCache(5);\n }])\n\n .config(['IdleProvider', 'csConfig', function(IdleProvider, csConfig) {\n 'ngInject';\n\n IdleProvider.idle(csConfig.logoutIdle||10*60/*10min*/);\n IdleProvider.timeout(csConfig.logoutTimeout||15); // display warning during 15s\n }])\n\n .factory('$exceptionHandler', ['$log', function($log) {\n 'ngInject';\n\n return function(exception, cause) {\n if (cause) $log.error(exception, cause);\n else $log.error(exception);\n };\n }])\n\n\n .factory('csPlatform', ['ionicReady', '$rootScope', '$q', '$state', '$translate', '$timeout', 'UIUtils', 'BMA', 'Device', 'csHttp', 'csConfig', 'csCache', 'csSettings', 'csCurrency', 'csWallet', function (ionicReady, $rootScope, $q, $state, $translate, $timeout, UIUtils,\n BMA, Device, csHttp, csConfig, csCache, csSettings, csCurrency, csWallet) {\n\n 'ngInject';\n var\n fallbackNodeIndex = 0,\n defaultSettingsNode,\n started = false,\n startPromise,\n listeners,\n removeChangeStateListener;\n\n function disableChangeState() {\n if (removeChangeStateListener) return; // make sure to call this once\n\n var remove = $rootScope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n if (!event.defaultPrevented && next.name !== 'app.home' && next.name !== 'app.settings') {\n event.preventDefault();\n if (startPromise) {\n startPromise.then(function() {\n $state.go(next.name, nextParams);\n });\n }\n else {\n UIUtils.loading.hide();\n }\n }\n });\n\n // store remove listener function\n removeChangeStateListener = remove;\n }\n\n function enableChangeState() {\n if (removeChangeStateListener) removeChangeStateListener();\n removeChangeStateListener = null;\n }\n\n // Alert user if node not reached - fix issue #\n function checkBmaNodeAlive(alive) {\n if (alive) return true;\n\n // Remember the default node\n defaultSettingsNode = defaultSettingsNode || csSettings.data.node;\n\n var fallbackNode = csSettings.data.fallbackNodes && fallbackNodeIndex < csSettings.data.fallbackNodes.length && csSettings.data.fallbackNodes[fallbackNodeIndex++];\n if (!fallbackNode) {\n throw 'ERROR.CHECK_NETWORK_CONNECTION';\n }\n var newServer = fallbackNode.host + ((!fallbackNode.port && fallbackNode.port != 80 && fallbackNode.port != 443) ? (':' + fallbackNode.port) : '');\n\n // Skip is same as actual node\n if (BMA.node.same(fallbackNode.host, fallbackNode.port)) {\n console.debug('[platform] Skipping fallback node [{0}]: same as actual node'.format(newServer));\n return checkBmaNodeAlive(); // loop (= go to next node)\n }\n\n // Try to get summary\n return csHttp.get(fallbackNode.host, fallbackNode.port, '/node/summary', fallbackNode.port==443 || BMA.node.forceUseSsl)()\n .catch(function(err) {\n console.error('[platform] Could not reach fallback node [{0}]: skipping'.format(newServer));\n // silent, but return no result (will loop to the next fallback node)\n })\n .then(function(res) {\n if (!res) return checkBmaNodeAlive(); // Loop\n\n // Force to show port/ssl, if this is the only difference\n var messageParam = {old: BMA.server, new: newServer};\n if (messageParam.old === messageParam.new) {\n if (BMA.port != fallbackNode.port) {\n messageParam.new += ':' + fallbackNode.port;\n }\n else if (BMA.useSsl == false && (fallbackNode.useSsl || fallbackNode.port==443)) {\n messageParam.new += ' (SSL)';\n }\n }\n\n return $translate('CONFIRM.USE_FALLBACK_NODE', messageParam)\n .then(function(msg) {\n return UIUtils.alert.confirm(msg);\n })\n .then(function (confirm) {\n if (!confirm) return;\n\n // Only change BMA node in settings\n csSettings.data.node = fallbackNode;\n\n // Add a marker, for UI\n csSettings.data.node.temporary = true;\n\n csHttp.cache.clear();\n\n // loop\n return BMA.copy(fallbackNode)\n .then(checkBmaNodeAlive);\n });\n });\n }\n\n function isStarted() {\n return started;\n }\n\n function getLatestRelease() {\n var latestRelease = csSettings.data.latestReleaseUrl && csHttp.uri.parse(csSettings.data.latestReleaseUrl);\n if (latestRelease) {\n return csHttp.getWithCache(latestRelease.host, latestRelease.protocol === 'https:' ? 443 : latestRelease.port, \"/\" + latestRelease.pathname, undefined, csCache.constants.LONG)()\n .then(function (json) {\n if (json && json.name && json.tag_name && json.html_url) {\n return {\n version: json.name,\n url: json.html_url,\n isNewer: (csHttp.version.compare(csConfig.version, json.name) < 0)\n };\n }\n })\n .catch(function(err) {\n // silent (just log it)\n console.error('[platform] Failed to get Cesium latest version', err);\n })\n ;\n }\n return $q.when();\n }\n\n function addListeners() {\n listeners = [\n // Listen if node changed\n BMA.api.node.on.restart($rootScope, restart, this)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function ready() {\n if (started) return $q.when();\n return startPromise || start();\n }\n\n function restart() {\n console.debug('[platform] restarting csPlatform');\n return stop()\n .then(function () {\n return $timeout(start, 200);\n });\n }\n\n function start() {\n\n // Avoid change state\n disableChangeState();\n\n // We use 'ionicReady()' instead of '$ionicPlatform.ready()', because this one is callable many times\n startPromise = ionicReady()\n\n .then($q.all([\n // Load device\n Device.ready(),\n\n // Start settings\n csSettings.ready()\n ]))\n\n // Load BMA\n .then(function(){\n return BMA.ready().then(checkBmaNodeAlive);\n })\n\n // Load currency\n .then(csCurrency.ready)\n\n // Trying to restore wallet\n .then(csWallet.ready)\n\n .then(function(){\n enableChangeState();\n addListeners();\n startPromise = null;\n started = true;\n })\n .catch(function(err) {\n startPromise = null;\n started = false;\n if($state.current.name !== $rootScope.errorState) {\n $state.go($rootScope.errorState, {error: 'peer'});\n }\n throw err;\n });\n\n return startPromise;\n }\n\n function stop() {\n if (!started) return $q.when();\n removeListeners();\n\n csWallet.stop();\n csCurrency.stop();\n BMA.stop();\n\n return $timeout(function() {\n enableChangeState();\n started = false;\n startPromise = null;\n }, 500);\n }\n\n return {\n disableChangeState: disableChangeState,\n isStarted: isStarted,\n ready: ready,\n restart: restart,\n start: start,\n stop: stop,\n version: {\n latest: getLatestRelease\n }\n };\n }])\n\n .run(['$rootScope', '$state', '$window', '$urlRouter', 'ionicReady', '$ionicPlatform', '$ionicHistory', 'Device', 'UIUtils', '$ionicConfig', 'PluginService', 'csPlatform', 'csWallet', 'csSettings', 'csConfig', 'csCurrency', function($rootScope, $state, $window, $urlRouter, ionicReady, $ionicPlatform, $ionicHistory,\n Device, UIUtils, $ionicConfig, PluginService, csPlatform, csWallet, csSettings, csConfig, csCurrency) {\n 'ngInject';\n\n // Allow access to service data, from HTML templates\n $rootScope.config = csConfig;\n $rootScope.settings = csSettings.data;\n $rootScope.currency = csCurrency.data;\n $rootScope.walletData = csWallet.data;\n $rootScope.device = Device;\n $rootScope.errorState = 'app.home';\n $rootScope.smallscreen = UIUtils.screen.isSmall();\n\n // Compute the root path\n var hashIndex = $window.location.href.indexOf('#');\n $rootScope.rootPath = (hashIndex !== -1) ? $window.location.href.substr(0, hashIndex) : $window.location.href;\n console.debug('[app] Root path is [' + $rootScope.rootPath + ']');\n\n // removeIf(device)\n // -- Automatic redirection to HTTPS\n if ((csConfig.httpsMode === true || csConfig.httpsMode === 'true' ||csConfig.httpsMode === 'force') &&\n $window.location.protocol !== 'https:') {\n $rootScope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n var path = 'https' + $rootScope.rootPath.substr(4) + $state.href(next, nextParams);\n if (csConfig.httpsModeDebug) {\n console.debug('[app] [httpsMode] --- Should redirect to: ' + path);\n // continue\n }\n else {\n $window.location.href = path;\n }\n });\n }\n // endRemoveIf(device)\n\n // We use 'ionicReady()' instead of '$ionicPlatform.ready()', because this one is callable many times\n ionicReady().then(function() {\n\n // Keyboard\n if (Device.keyboard.enable) {\n // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard\n // for form inputs)\n Device.keyboard.hideKeyboardAccessoryBar(true);\n\n // iOS: do not push header up when opening keyboard\n // (see http://ionicframework.com/docs/api/page/keyboard/)\n if (ionic.Platform.isIOS()) {\n Device.keyboard.disableScroll(true);\n }\n }\n\n // Ionic Platform Grade is not A, disabling views transitions\n if (ionic.Platform.grade.toLowerCase() !== 'a') {\n console.info('[app] Disabling UI effects, because plateform\\'s grade is [' + ionic.Platform.grade + ']');\n UIUtils.setEffects(false);\n }\n\n // Status bar style\n if (window.StatusBar) {\n console.debug(\"[app] Status bar plugin enable\");\n }\n\n // Get latest release\n csPlatform.version.latest()\n .then(function(release) {\n if (release && release.isNewer) {\n console.info('[app] New release detected [{0}]'.format(release.version));\n $rootScope.newRelease = release;\n }\n else {\n console.info('[app] Current version [{0}] is the latest release'.format(csConfig.version));\n }\n });\n\n // Prevent BACK button to exit without confirmation\n $ionicPlatform.registerBackButtonAction(function(event) {\n if ($ionicHistory.backView()) {\n return $ionicHistory.goBack();\n }\n event.preventDefault();\n return UIUtils.alert.confirm('CONFIRM.EXIT_APP')\n .then(function (confirm) {\n if (!confirm) return; // user cancelled\n ionic.Platform.exitApp();\n });\n }, 100);\n\n // Make sure platform is started\n return csPlatform.ready();\n });\n }])\n;\n\n// Workaround to add \"\".startsWith() if not present\nif (typeof String.prototype.startsWith !== 'function') {\n console.debug(\"Adding String.prototype.startsWith() -> was missing on this platform\");\n String.prototype.startsWith = function(prefix, position) {\n return this.indexOf(prefix, position) === 0;\n };\n}\n\n// Workaround to add \"\".startsWith() if not present\nif (typeof String.prototype.trim !== 'function') {\n console.debug(\"Adding String.prototype.trim() -> was missing on this platform\");\n // Make sure we trim BOM and NBSP\n var rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n String.prototype.trim = function() {\n return this.replace(rtrim, '');\n };\n}\n\n// Workaround to add Math.trunc() if not present - fix #144\nif (Math && typeof Math.trunc !== 'function') {\n console.debug(\"Adding Math.trunc() -> was missing on this platform\");\n Math.trunc = function(number) {\n return (number - 0.5).toFixed();\n };\n}\n\n// Workaround to add \"\".format() if not present\nif (typeof String.prototype.format !== 'function') {\n console.debug(\"Adding String.prototype.format() -> was missing on this platform\");\n String.prototype.format = function() {\n var args = arguments;\n return this.replace(/{(\\d+)}/g, function(match, number) {\n return typeof args[number] != 'undefined' ? args[number] : match;\n });\n };\n}\n","//var Base58, Base64, scrypt_module_factory = null, nacl_factory = null;\n\nangular.module('cesium.crypto.services', ['cesium.utils.services'])\n\n .factory('CryptoUtils', ['$q', '$timeout', 'ionicReady', function($q, $timeout, ionicReady) {\n 'ngInject';\n\n /**\n * CryptoAbstract, abstract class with useful methods\n * @type {number}\n */\n function CryptoAbstractService() {\n this.loaded = false;\n var that = this;\n\n this.copy = function(source) {\n _.forEach(_.keys(source), function(key) {\n that[key] = source[key];\n });\n };\n\n this.isLoaded = function() {\n return this.loaded;\n };\n\n this.util = this.util || {};\n\n /**\n * Converts an array buffer to a string\n *\n * @private\n * @param {ArrayBuffer} buf The buffer to convert\n * @param {Function} callback The function to call when conversion is complete\n */\n this.util.array_to_string = function(buf, callback) {\n var bb = new Blob([new Uint8Array(buf)]);\n var f = new FileReader();\n f.onload = function(e) {\n callback(e.target.result);\n };\n f.readAsText(bb);\n };\n }\n\n CryptoAbstractService.prototype.constants = {\n crypto_sign_BYTES: 64,\n crypto_secretbox_NONCEBYTES: 24,\n crypto_box_MACBYTES: 16,\n SEED_LENGTH: 32, // Length of the key\n SCRYPT_PARAMS:{\n SIMPLE: {\n N: 2048,\n r: 8,\n p: 1,\n memory: -1 // default\n },\n DEFAULT: {\n N: 4096,\n r: 16,\n p: 1,\n memory: -1 // default\n },\n }\n };\n\n CryptoAbstractService.prototype.async_load_base58 = function(on_ready) {\n var that = this;\n if (Base58 !== null){return on_ready(Base58);}\n else {$timeout(function(){that.async_load_base58(on_ready);}, 100);}\n };\n\n CryptoAbstractService.prototype.async_load_scrypt = function(on_ready, options) {\n var that = this;\n if (scrypt_module_factory !== null){scrypt_module_factory(on_ready, options);}\n else {$timeout(function(){that.async_load_scrypt(on_ready, options);}, 100);}\n };\n\n CryptoAbstractService.prototype.async_load_nacl_js = function(on_ready, options) {\n var that = this;\n if (nacl_factory !== null) {nacl_factory.instantiate(on_ready, options);}\n else {$timeout(function(){that.async_load_nacl_js(on_ready, options);}, 100);}\n };\n\n CryptoAbstractService.prototype.async_load_base64 = function(on_ready) {\n var that = this;\n if (Base64 !== null) {on_ready(Base64);}\n else {$timeout(function(){that.async_load_base64(on_ready);}, 100);}\n };\n\n CryptoAbstractService.prototype.async_load_sha256 = function(on_ready) {\n var that = this;\n if (sha256 !== null){return on_ready(sha256);}\n else {$timeout(function(){that.async_load_sha256(on_ready);}, 100);}\n };\n\n CryptoAbstractService.prototype.seed_from_signSk = function(signSk) {\n var seed = new Uint8Array(that.constants.SEED_LENGTH);\n for (var i = 0; i < seed.length; i++) seed[i] = signSk[i];\n return seed;\n };\n\n CryptoAbstractService.prototype.seed_from_signSk = function(signSk) {\n var seed = new Uint8Array(that.constants.SEED_LENGTH);\n for (var i = 0; i < seed.length; i++) seed[i] = signSk[i];\n return seed;\n };\n\n // Web crypto API - see https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API\n var crypto = window.crypto || window.msCrypto || window.Crypto;\n if (crypto && crypto.getRandomValues) {\n CryptoAbstractService.prototype.crypto = crypto;\n CryptoAbstractService.prototype.util = {};\n CryptoAbstractService.prototype.util.random_nonce = function() {\n var nonce = new Uint8Array(crypto_secretbox_NONCEBYTES);\n this.crypto.getRandomValues(nonce);\n return $q.when(nonce);\n };\n }\n\n function FullJSServiceFactory() {\n this.id = 'FullJS';\n\n // libraries handlers\n this.scrypt = null;\n this.nacl = null;\n this.base58 = null;\n this.base64 = null;\n var that = this;\n\n this.util = this.util || {};\n this.util.decode_utf8 = function (s) {\n var i, d = unescape(encodeURIComponent(s)), b = new Uint8Array(d.length);\n for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i);\n return b;\n };\n this.util.encode_utf8 = function (s) {\n return that.nacl.encode_utf8(s);\n };\n this.util.encode_base58 = function (a) { // TODO : move to abstract factory\n return that.base58.encode(a);\n };\n this.util.decode_base58 = function (a) { // TODO : move to abstract factory\n var i;\n var d = that.base58.decode(a);\n var b = new Uint8Array(d.length);\n for (i = 0; i < d.length; i++) b[i] = d[i];\n return b;\n };\n this.util.decode_base64 = function (a) {\n return that.base64.decode(a);\n };\n this.util.encode_base64 = function (b) {\n return that.base64.encode(b);\n };\n\n this.util.hash_sha256 = function (message) {\n return $q(function (resolve) {\n var msg = that.util.decode_utf8(message);\n var hash = that.nacl.to_hex(that.nacl.crypto_hash_sha256(msg));\n resolve(hash.toUpperCase());\n });\n };\n this.util.random_nonce = function () {\n if (that.crypto && that.crypto.getRandomValues) {\n var nonce = new Uint8Array(that.constants.crypto_secretbox_NONCEBYTES);\n that.crypto.getRandomValues(nonce);\n return $q.when(nonce);\n }\n else {\n return $q.when(that.nacl.crypto_box_random_nonce());\n }\n };\n this.util.crypto_hash_sha256 = function(msg_int8) {\n return that.nacl.crypto_hash_sha256(msg_int8);\n };\n this.util.crypto_scrypt = function(password, salt, N, r, p, seedLength) {\n\n return $q(function(resolve, reject) {\n try {\n var seed = that.scrypt.crypto_scrypt(\n password,\n salt,\n N,\n r,\n p,\n seedLength);\n resolve(seed);\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n /**\n * Compute the box key pair, from a sign key pair\n */\n this.box_keypair_from_sign = function (signKeyPair) {\n if (signKeyPair.boxSk && signKeyPair.boxPk) return $q.when(signKeyPair);\n return $q(function (resolve, reject) {\n try {\n // TODO: waiting for a new version of js-nacl, with missing functions expose\n //resolve(that.nacl.crypto_box_keypair_from_sign_sk(signKeyPair.signPk);\n\n resolve(crypto_box_keypair_from_sign_sk(signKeyPair.signSk));\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n /**\n * Compute the box public key, from a sign public key\n */\n this.box_pk_from_sign = function (signPk) {\n return $q(function(resolve, reject) {\n try {\n // TODO: waiting for a new version of js-nacl, with missing functions expose\n //resolve(that.nacl.crypto_box_pk_from_sign_pk(signPk));\n\n resolve(crypto_box_pk_from_sign_pk(signPk));\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n this.box_sk_from_sign = function (signSk) {\n return $q(function(resolve, reject) {\n try {\n // TODO: waiting for a new version of js-nacl, with missing functions expose\n //resolve(that.nacl.crypto_box_sk_from_sign_sk(signSk));\n resolve(crypto_box_sk_from_sign_sk(signSk));\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n /**\n * Encrypt a message, from a key pair\n */\n this.box = function(message, nonce, recipientPk, senderSk) {\n return $q(function (resolve, reject) {\n if (!message) {\n resolve(message);\n return;\n }\n var messageBin = that.nacl.encode_utf8(message);\n if (typeof recipientPk === \"string\") {\n recipientPk = that.util.decode_base58(recipientPk);\n }\n\n try {\n var ciphertextBin = that.nacl.crypto_box(messageBin, nonce, recipientPk, senderSk);\n var ciphertext = that.util.encode_base64(ciphertextBin);\n resolve(ciphertext);\n }\n catch (err) {\n reject(err);\n }\n });\n };\n\n /**\n * Decrypt a message, from a key pair\n */\n this.box_open = function (cypherText, nonce, senderPk, recipientSk) {\n return $q(function (resolve, reject) {\n if (!cypherText) {\n resolve(cypherText);\n return;\n }\n\n var ciphertextBin = that.util.decode_base64(cypherText);\n if (typeof senderPk === \"string\") {\n senderPk = that.util.decode_base58(senderPk);\n }\n\n try {\n var message = that.nacl.crypto_box_open(ciphertextBin, nonce, senderPk, recipientSk);\n resolve(that.nacl.decode_utf8(message));\n }\n catch (err) {\n reject(err);\n }\n\n });\n };\n\n /**\n * Create key pairs (sign and box), from salt+password (Scrypt auth)\n */\n this.scryptKeypair = function(salt, password, scryptParams) {\n return that.util.crypto_scrypt(\n that.util.encode_utf8(password),\n that.util.encode_utf8(salt),\n scryptParams && scryptParams.N || that.constants.SCRYPT_PARAMS.DEFAULT.N,\n scryptParams && scryptParams.r || that.constants.SCRYPT_PARAMS.DEFAULT.r,\n scryptParams && scryptParams.p || that.constants.SCRYPT_PARAMS.DEFAULT.p,\n that.constants.SEED_LENGTH)\n .then(function(seed){\n var signKeypair = that.nacl.crypto_sign_seed_keypair(seed);\n var boxKeypair = that.nacl.crypto_box_seed_keypair(seed);\n return {\n signPk: signKeypair.signPk,\n signSk: signKeypair.signSk,\n boxPk: boxKeypair.boxPk,\n boxSk: boxKeypair.boxSk\n };\n });\n };\n\n /**\n * Create key pairs from a seed\n */\n this.seedKeypair = function(seed) {\n return $q(function(resolve, reject) {\n var signKeypair = that.nacl.crypto_sign_seed_keypair(seed);\n var boxKeypair = that.nacl.crypto_box_seed_keypair(seed);\n resolve({\n signPk: signKeypair.signPk,\n signSk: signKeypair.signSk,\n boxPk: boxKeypair.boxPk,\n boxSk: boxKeypair.boxSk\n });\n });\n };\n\n /**\n * Get sign pk from salt+password (scrypt auth)\n */\n this.scryptSignPk = function(salt, password, scryptParams) {\n return $q(function(resolve, reject) {\n try {\n var seed = that.scrypt.crypto_scrypt(\n that.util.encode_utf8(password),\n that.util.encode_utf8(salt),\n scryptParams && scryptParams.N || that.constants.SCRYPT_PARAMS.DEFAULT.N,\n scryptParams && scryptParams.r || that.constants.SCRYPT_PARAMS.DEFAULT.r,\n scryptParams && scryptParams.p || that.constants.SCRYPT_PARAMS.DEFAULT.p,\n that.constants.SEED_LENGTH);\n var signKeypair = that.nacl.crypto_sign_seed_keypair(seed);\n resolve(signKeypair.signPk);\n }\n catch(err) {\n reject(err);\n }\n });\n };\n\n /**\n * Verify a signature of a message, for a pubkey\n */\n this.verify = function (message, signature, pubkey) {\n return $q(function(resolve, reject) {\n var msg = that.util.decode_utf8(message);\n var sig = that.util.decode_base64(signature);\n var pub = that.util.decode_base58(pubkey);\n var sm = new Uint8Array(that.constants.crypto_sign_BYTES + msg.length);\n var i;\n for (i = 0; i < that.constants.crypto_sign_BYTES; i++) sm[i] = sig[i];\n for (i = 0; i < msg.length; i++) sm[i+that.constants.crypto_sign_BYTES] = msg[i];\n\n // Call to verification lib...\n var verified = that.nacl.crypto_sign_open(sm, pub) !== null;\n resolve(verified);\n });\n };\n\n /**\n * Sign a message, from a key pair\n */\n this.sign = function(message, keypair) {\n return $q(function(resolve, reject) {\n var m = that.util.decode_utf8(message);\n var sk = keypair.signSk;\n var signedMsg = that.nacl.crypto_sign(m, sk);\n var sig = new Uint8Array(that.constants.crypto_sign_BYTES);\n for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];\n var signature = that.base64.encode(sig);\n resolve(signature);\n });\n };\n\n this.load = function() {\n var deferred = $q.defer();\n var naclOptions = {};\n var scryptOptions = {};\n if (ionic.Platform.grade.toLowerCase()!='a') {\n console.info('Reduce NaCl memory to 16mb, because plateform grade is not [a] but [{0}]'.format(ionic.Platform.grade));\n naclOptions.requested_total_memory = 16 * 1048576; // 16 Mo\n }\n var loadedLib = 0;\n var checkAllLibLoaded = function() {\n loadedLib++;\n if (loadedLib === 4) {\n that.loaded = true;\n deferred.resolve();\n }\n };\n this.async_load_nacl_js(function(lib) {\n that.nacl = lib;\n checkAllLibLoaded();\n }, naclOptions);\n this.async_load_scrypt(function(lib) {\n that.scrypt = lib;\n that.scrypt.requested_total_memory = scryptOptions.requested_total_memory;\n checkAllLibLoaded();\n }, scryptOptions);\n this.async_load_base58(function(lib) {\n that.base58 = lib;\n checkAllLibLoaded();\n });\n that.async_load_base64(function(lib) {\n that.base64 = lib;\n checkAllLibLoaded();\n });\n return deferred.promise;\n };\n\n // Shortcuts\n this.util.hash = that.util.hash_sha256;\n this.box = {\n keypair: {\n fromSignKeypair: that.box_keypair_from_sign,\n skFromSignSk: that.box_sk_from_sign,\n pkFromSignPk: that.box_pk_from_sign\n },\n pack: that.box,\n open: that.box_open\n };\n\n /*--\n start WORKAROUND - Publish missing functions (see PR js-nacl: https://github.com/tonyg/js-nacl/pull/54)\n -- */\n\n function crypto_box_keypair_from_sign_sk(sk) {\n var ska = check_injectBytes(\"crypto_box_keypair_from_sign_sk\", \"sk\", sk,\n that.nacl.nacl_raw._crypto_sign_secretkeybytes());\n var skb = new Target(that.nacl.nacl_raw._crypto_box_secretkeybytes());\n check(\"_crypto_sign_ed25519_sk_to_curve25519\",\n that.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(skb.address, ska));\n FREE(ska);\n return that.nacl.crypto_box_keypair_from_raw_sk(skb.extractBytes());\n }\n\n function crypto_box_pk_from_sign_pk(pk) {\n var pka = check_injectBytes(\"crypto_box_pk_from_sign_pk\", \"pk\", pk,\n that.nacl.nacl_raw._crypto_sign_publickeybytes());\n var pkb = new Target(that.nacl.nacl_raw._crypto_box_publickeybytes());\n check(\"_crypto_sign_ed25519_pk_to_curve25519\",\n that.nacl.nacl_raw._crypto_sign_ed25519_pk_to_curve25519(pkb.address, pka));\n FREE(pka);\n return pkb.extractBytes();\n }\n\n function crypto_box_sk_from_sign_sk(sk) {\n var ska = check_injectBytes(\"crypto_box_sk_from_sign_sk\", \"sk\", sk,\n that.nacl.nacl_raw._crypto_sign_secretkeybytes());\n var skb = new Target(that.nacl.nacl_raw._crypto_box_secretkeybytes());\n check(\"_crypto_sign_ed25519_sk_to_curve25519\",\n that.nacl.nacl_raw._crypto_sign_ed25519_sk_to_curve25519(skb.address, ska));\n FREE(ska);\n return skb.extractBytes();\n }\n\n function check_length(function_name, what, thing, expected_length) {\n if (thing.length !== expected_length) {\n throw {message: \"nacl.\" + function_name + \" expected \" +\n expected_length + \"-byte \" + what + \" but got length \" + thing.length};\n }\n }\n\n function check(function_name, result) {\n if (result !== 0) {\n throw {message: \"nacl_raw.\" + function_name + \" signalled an error\"};\n }\n }\n\n function check_injectBytes(function_name, what, thing, expected_length, leftPadding) {\n check_length(function_name, what, thing, expected_length);\n return injectBytes(thing, leftPadding);\n }\n\n function injectBytes(bs, leftPadding) {\n var p = leftPadding || 0;\n var address = MALLOC(bs.length + p);\n that.nacl.nacl_raw.HEAPU8.set(bs, address + p);\n for (var i = address; i < address + p; i++) {\n that.nacl.nacl_raw.HEAPU8[i] = 0;\n }\n return address;\n }\n\n function MALLOC(nbytes) {\n var result = that.nacl.nacl_raw._malloc(nbytes);\n if (result === 0) {\n throw {message: \"malloc() failed\", nbytes: nbytes};\n }\n return result;\n }\n\n function FREE(pointer) {\n that.nacl.nacl_raw._free(pointer);\n }\n\n function free_all(addresses) {\n for (var i = 0; i < addresses.length; i++) {\n FREE(addresses[i]);\n }\n }\n\n function extractBytes(address, length) {\n var result = new Uint8Array(length);\n result.set(that.nacl.nacl_raw.HEAPU8.subarray(address, address + length));\n return result;\n }\n\n function Target(length) {\n this.length = length;\n this.address = MALLOC(length);\n }\n\n Target.prototype.extractBytes = function (offset) {\n var result = extractBytes(this.address + (offset || 0), this.length - (offset || 0));\n FREE(this.address);\n this.address = null;\n return result;\n };\n\n /*--\n end of WORKAROUND\n -- */\n\n }\n FullJSServiceFactory.prototype = new CryptoAbstractService();\n\n\n /* -----------------------------------------------------------------------------------------------------------------\n * Service that use Cordova MiniSodium plugin\n * ----------------------------------------------------------------------------------------------------------------*/\n\n /***\n * Factory for crypto, using Cordova plugin\n */\n function CordovaServiceFactory() {\n\n this.id = 'MiniSodium';\n\n // libraries handlers\n this.nacl = null; // the cordova plugin\n this.base58= null;\n this.sha256= null;\n var that = this;\n\n // functions\n this.util = this.util || {};\n this.util.decode_utf8 = function(s) {\n return that.nacl.to_string(s);\n };\n this.util.encode_utf8 = function(s) {\n return that.nacl.from_string(s);\n };\n this.util.encode_base58 = function(a) {\n return that.base58.encode(a);\n };\n this.util.decode_base58 = function(a) {\n var i;\n var d = that.base58.decode(a);\n var b = new Uint8Array(d.length);\n for (i = 0; i < d.length; i++) b[i] = d[i];\n return b;\n };\n this.util.decode_base64 = function (a) {\n return that.nacl.from_base64(a);\n };\n this.util.encode_base64 = function (b) {\n return that.nacl.to_base64(b);\n };\n this.util.hash_sha256 = function(message) {\n return $q.when(that.sha256(message).toUpperCase());\n };\n this.util.random_nonce = function() {\n var nonce = new Uint8Array(that.constants.crypto_secretbox_NONCEBYTES);\n that.crypto.getRandomValues(nonce);\n return $q.when(nonce);\n };\n this.util.crypto_hash_sha256 = function (message) {\n return that.nacl.from_hex(that.sha256(message));\n };\n\n this.util.crypto_scrypt = function(password, salt, N, r, p, seedLength) {\n var deferred = $q.defer();\n that.nacl.crypto_pwhash_scryptsalsa208sha256_ll(\n password,\n salt,\n N,\n r,\n p,\n seedLength,\n function (err, seed) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(seed);\n }\n );\n return deferred.promise;\n };\n\n /**\n * Create key pairs (sign and box), from salt+password (Scrypt), using cordova\n */\n this.scryptKeypair = function(salt, password, scryptParams) {\n var deferred = $q.defer();\n\n that.nacl.crypto_pwhash_scryptsalsa208sha256_ll(\n that.nacl.from_string(password),\n that.nacl.from_string(salt),\n scryptParams && scryptParams.N || that.constants.SCRYPT_PARAMS.DEFAULT.N,\n scryptParams && scryptParams.r || that.constants.SCRYPT_PARAMS.DEFAULT.r,\n scryptParams && scryptParams.p || that.constants.SCRYPT_PARAMS.DEFAULT.p,\n that.constants.SEED_LENGTH,\n function (err, seed) {\n if (err) { deferred.reject(err); return;}\n\n that.nacl.crypto_sign_seed_keypair(seed, function (err, signKeypair) {\n if (err) { deferred.reject(err); return;}\n var result = {\n signPk: signKeypair.pk,\n signSk: signKeypair.sk\n };\n that.box_keypair_from_sign(result)\n .then(function(boxKeypair) {\n result.boxPk = boxKeypair.pk;\n result.boxSk = boxKeypair.sk;\n deferred.resolve(result);\n })\n .catch(function(err) {\n deferred.reject(err);\n });\n });\n\n }\n );\n\n return deferred.promise;\n };\n\n /**\n * Create key pairs from a seed\n */\n this.seedKeypair = function(seed) {\n var deferred = $q.defer();\n\n that.nacl.crypto_sign_seed_keypair(seed, function (err, signKeypair) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve({\n signPk: signKeypair.pk,\n signSk: signKeypair.sk\n });\n });\n return deferred.promise;\n };\n\n\n /**\n * Get sign PK from salt+password (Scrypt), using cordova\n */\n this.scryptSignPk = function(salt, password, scryptParams) {\n var deferred = $q.defer();\n\n that.nacl.crypto_pwhash_scryptsalsa208sha256_ll(\n that.nacl.from_string(password),\n that.nacl.from_string(salt),\n scryptParams && scryptParams.N || that.constants.SCRYPT_PARAMS.DEFAULT.N,\n scryptParams && scryptParams.r || that.constants.SCRYPT_PARAMS.DEFAULT.r,\n scryptParams && scryptParams.p || that.constants.SCRYPT_PARAMS.DEFAULT.p,\n that.constants.SEED_LENGTH,\n function (err, seed) {\n if (err) { deferred.reject(err); return;}\n\n that.nacl.crypto_sign_seed_keypair(seed, function (err, signKeypair) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(signKeypair.pk);\n });\n\n }\n );\n\n return deferred.promise;\n };\n\n /**\n * Verify a signature of a message, for a pubkey\n */\n this.verify = function (message, signature, pubkey) {\n var deferred = $q.defer();\n that.nacl.crypto_sign_verify_detached(\n that.nacl.from_base64(signature),\n that.nacl.from_string(message),\n that.nacl.from_base64(pubkey),\n function(err, verified) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(verified);\n });\n return deferred.promise;\n };\n\n /**\n * Sign a message, from a key pair\n */\n this.sign = function(message, keypair) {\n var deferred = $q.defer();\n\n that.nacl.crypto_sign(\n that.nacl.from_string(message), // message\n keypair.signSk, // sk\n function(err, signedMsg) {\n if (err) { deferred.reject(err); return;}\n var sig;\n if (signedMsg.length > that.constants.crypto_sign_BYTES) {\n sig = new Uint8Array(that.constants.crypto_sign_BYTES);\n for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];\n }\n else {\n sig = signedMsg;\n }\n var signature = that.nacl.to_base64(sig);\n deferred.resolve(signature);\n });\n\n return deferred.promise;\n };\n\n /**\n * Compute the box key pair, from a sign key pair\n */\n this.box_keypair_from_sign = function(signKeyPair) {\n if (signKeyPair.boxSk && signKeyPair.boxPk) return $q.when(signKeyPair);\n var deferred = $q.defer();\n var result = {};\n that.nacl.crypto_sign_ed25519_pk_to_curve25519(signKeyPair.signPk, function(err, boxPk) {\n if (err) { deferred.reject(err); return;}\n result.boxPk = boxPk;\n if (result.boxSk) deferred.resolve(result);\n });\n that.nacl.crypto_sign_ed25519_sk_to_curve25519(signKeyPair.signSk, function(err, boxSk) {\n if (err) { deferred.reject(err); return;}\n result.boxSk = boxSk;\n if (result.boxPk) deferred.resolve(result);\n });\n\n return deferred.promise;\n };\n\n /**\n * Compute the box public key, from a sign public key\n */\n this.box_pk_from_sign = function(signPk) {\n var deferred = $q.defer();\n that.nacl.crypto_sign_ed25519_pk_to_curve25519(signPk, function(err, boxPk) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(boxPk);\n });\n return deferred.promise;\n };\n\n /**\n * Compute the box secret key, from a sign secret key\n */\n this.box_sk_from_sign = function(signSk) {\n var deferred = $q.defer();\n that.nacl.crypto_sign_ed25519_sk_to_curve25519(signSk, function(err, boxSk) {\n if (err) { deferred.reject(err); return;}\n deferred.resolve(boxSk);\n });\n return deferred.promise;\n };\n\n /**\n * Encrypt a message, from a key pair\n */\n this.box = function(message, nonce, recipientPk, senderSk) {\n if (!message) {\n return $q.reject('No message');\n }\n var deferred = $q.defer();\n\n var messageBin = that.nacl.from_string(message);\n if (typeof recipientPk === \"string\") {\n recipientPk = that.util.decode_base58(recipientPk);\n }\n\n that.nacl.crypto_box_easy(messageBin, nonce, recipientPk, senderSk, function(err, ciphertextBin) {\n if (err) { deferred.reject(err); return;}\n var ciphertext = that.util.encode_base64(ciphertextBin);\n //console.debug('Encrypted message: ' + ciphertext);\n deferred.resolve(ciphertext);\n });\n return deferred.promise;\n };\n\n /**\n * Decrypt a message, from a key pair\n */\n this.box_open = function(cypherText, nonce, senderPk, recipientSk) {\n if (!cypherText) {\n return $q.reject('No cypherText');\n }\n var deferred = $q.defer();\n\n var ciphertextBin = that.nacl.from_base64(cypherText);\n if (typeof senderPk === \"string\") {\n senderPk = that.util.decode_base58(senderPk);\n }\n\n // Avoid crash if content has not the minimal length - Fix #346\n if (ciphertextBin.length < that.constants.crypto_box_MACBYTES) {\n deferred.reject('Invalid cypher content length');\n return;\n }\n\n that.nacl.crypto_box_open_easy(ciphertextBin, nonce, senderPk, recipientSk, function(err, message) {\n if (err) { deferred.reject(err); return;}\n that.util.array_to_string(message, function(result) {\n //console.debug('Decrypted text: ' + result);\n deferred.resolve(result);\n });\n });\n\n return deferred.promise;\n };\n\n this.load = function() {\n var deferred = $q.defer();\n if (!window.plugins || !window.plugins.MiniSodium) {\n deferred.reject(\"Cordova plugin 'MiniSodium' not found. Please load Full JS implementation instead.\");\n }\n else {\n that.nacl = window.plugins.MiniSodium;\n\n var loadedLib = 0;\n var checkAllLibLoaded = function() {\n loadedLib++;\n if (loadedLib == 2) {\n that.loaded = true;\n deferred.resolve();\n }\n };\n that.async_load_base58(function(lib) {\n that.base58 = lib;\n checkAllLibLoaded();\n });\n that.async_load_sha256(function(lib) {\n that.sha256 = lib;\n checkAllLibLoaded();\n });\n }\n\n return deferred.promise;\n };\n\n // Shortcuts\n this.util.hash = that.util.hash_sha256;\n this.box = {\n keypair: {\n fromSignKeypair: that.box_keypair_from_sign,\n skFromSignSk: that.box_sk_from_sign,\n pkFromSignPk: that.box_pk_from_sign\n },\n pack: that.box,\n open: that.box_open\n };\n }\n CordovaServiceFactory.prototype = new CryptoAbstractService();\n\n /* -----------------------------------------------------------------------------------------------------------------\n * Create service instance\n * ----------------------------------------------------------------------------------------------------------------*/\n\n\n var service = new CryptoAbstractService();\n\n var isDevice = true;\n // removeIf(android)\n // removeIf(ios)\n isDevice = false;\n // endRemoveIf(ios)\n // endRemoveIf(android)\n\n //console.debug(\"[crypto] Created CryptotUtils service. device=\" + isDevice);\n\n ionicReady().then(function() {\n console.debug('[crypto] Starting...');\n var now = Date.now();\n\n var serviceImpl;\n\n // Use Cordova plugin implementation, when exists\n if (isDevice && window.plugins && window.plugins.MiniSodium && crypto && crypto.getRandomValues) {\n console.debug('[crypto] Loading \\'MiniSodium\\' implementation...');\n serviceImpl = new CordovaServiceFactory();\n }\n else {\n console.debug('[crypto] Loading \\'FullJS\\' implementation...');\n serviceImpl = new FullJSServiceFactory();\n }\n\n // Load (async lib)\n serviceImpl.load()\n .catch(function(err) {\n console.error(err);\n throw err;\n })\n .then(function() {\n service.copy(serviceImpl);\n console.debug('[crypto] Loaded \\'{0}\\' implementation in {1}ms'.format(service.id, Date.now() - now));\n });\n\n });\n\n return service;\n }])\n\n\n /* -----------------------------\n Crypto advanced service for Cesium\n */\n\n .factory('csCrypto', ['$q', '$rootScope', '$timeout', 'CryptoUtils', 'UIUtils', 'Modals', function($q, $rootScope, $timeout, CryptoUtils, UIUtils, Modals) {\n 'ngInject';\n\n function test(regexpContent) {\n return new RegExp(regexpContent);\n }\n\n function xor(a, b) {\n var length = Math.max(a.length, b.length);\n var buffer = new Uint8Array(length);\n for (var i = 0; i < length; ++i) {\n buffer[i] = a[i] ^ b[i];\n }\n return buffer;\n }\n\n function concat_Uint8Array( buffer1, buffer2 ) {\n var tmp = new Uint8Array( buffer1.byteLength + buffer2.byteLength );\n tmp.set( new Uint8Array( buffer1 ), 0 );\n tmp.set( new Uint8Array( buffer2 ), buffer1.byteLength );\n return tmp;\n }\n\n var constants = {\n WIF: {\n DATA_LENGTH: 35\n },\n EWIF: {\n SALT_LENGTH: 4,\n DERIVED_HALF_LENGTH: 16,\n DATA_LENGTH: 39,\n SCRYPT_PARAMS: {\n N: 16384,\n r: 8,\n p: 8\n }\n },\n REGEXP: {\n PUBKEY: '[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}',\n SECKEY: '[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{86,88}',\n FILE: {\n TYPE_LINE: '^Type: ([a-zA-Z0-9]+)\\n',\n VERSION: 'Version: ([0-9]+)\\n',\n PUB: '[Pp]ub: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44})\\n',\n SEC: '[Ss]ec: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{86,88})(\\n|$)',\n DATA: '[Dd]ata: ([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+)(\\n|$)'\n }\n }\n },\n regexp = {\n FILE: {\n TYPE_LINE: test(constants.REGEXP.FILE.TYPE_LINE),\n VERSION: test(constants.REGEXP.FILE.VERSION),\n PUB: test(constants.REGEXP.FILE.PUB),\n SEC: test(constants.REGEXP.FILE.SEC),\n DATA: test(constants.REGEXP.FILE.DATA)\n }\n },\n errorCodes = {\n BAD_PASSWORD: 3001,\n BAD_CHECKSUM: 3002\n };\n\n /* -- keyfile -- */\n\n function readKeyFile(file, options) {\n\n if (file && file.content) {\n return parseKeyFileContent(file.content, options);\n }\n\n return $q(function(resolve, reject) {\n if (!file) {\n return reject('Argument [file] is missing');\n }\n\n //console.debug('[crypto] [keypair] reading file: ', file);\n var reader = new FileReader();\n reader.onload = function (event) {\n parseKeyFileContent(event.target.result, options)\n .then(resolve)\n .catch(reject);\n };\n reader.readAsText(file, 'utf8');\n });\n }\n\n function parseKeyFileContent(content, options) {\n\n if (!content) return $q.reject('Argument [content] is missing');\n\n options = options || {};\n options.withSecret = angular.isDefined(options.withSecret) ? options.withSecret : false;\n options.defaultType = options.defaultType || 'PubSec';\n\n var matches;\n\n var typeMatch = regexp.FILE.TYPE_LINE.exec(content);\n\n // If no Type field: add default type\n var type = typeMatch && typeMatch[1];\n if (!type && options.defaultType) {\n return parseKeyFileContent('Type: {0}\\n{1}'.format(options.defaultType, content), options);\n }\n\n // Type: PubSec\n if (type === 'PubSec') {\n\n // Read Pub field\n matches = regexp.FILE.PUB.exec(content);\n if (!matches) return $q.reject('Missing [pub] field in file, or invalid public key value');\n var signKeypair = {\n signPk: CryptoUtils.base58.decode(matches[1])\n };\n if (!options.withSecret) return $q.resolve(signKeypair);\n\n // Read Sec field\n matches= regexp.FILE.SEC.exec(content);\n if (!matches) return $q.reject('Missing [sec] field in file, or invalid secret key value');\n signKeypair.signSk = CryptoUtils.base58.decode(matches[1]);\n return $q.resolve(signKeypair);\n }\n\n // Type: WIF or EWIF\n else if (type == 'WIF' || type == 'EWIF') {\n matches = regexp.FILE.DATA.exec(content);\n if (!matches) {\n return $q.reject('Missing [Data] field in file. This is required for WIF or EWIF format');\n }\n\n return parseWIF_or_EWIF(matches[1], {\n type: type,\n password: options.password\n })\n .then(function(signKeypair) {\n return signKeypair && !options.withSecret ? {signPk: signKeypair.signPk} : signKeypair;\n });\n }\n\n // Type: unknown\n if (options.defaultType) {\n return $q.reject('Bad file format: missing Type field');\n }\n else {\n return $q.reject('Bad file format, unknown type [' + type + ']');\n }\n }\n\n\n /**\n *\n * @param data_base58\n * @param options\n * @returns {*}\n */\n function parseWIF_or_EWIF(data_base58, options) {\n options = options || {};\n\n var data_int8 = data_base58 && CryptoUtils.base58.decode(data_base58);\n if (!data_int8 || data_int8.length != constants.EWIF.DATA_LENGTH && data_int8.length != constants.WIF.DATA_LENGTH) {\n return $q.reject('Invalid WIF or EWIF format (invalid bytes count).');\n }\n\n // Detect the type from the first byte\n options.type = options.type || (data_int8[0] == 1 && 'WIF') || (data_int8[0] == 2 && 'EWIF');\n\n // Type: WIF\n if (options.type === 'WIF') {\n return parseWIF_v1(data_base58);\n }\n\n // Type: EWIF\n if (options.type === 'EWIF') {\n\n // If not set, resolve password using the given callback\n if (typeof options.password == \"function\") {\n //console.debug(\"[crypto] [EWIF] Executing 'options.password()' to resolve the password...\");\n options.password = options.password();\n if (!options.password) {\n return $q.reject({message: \"Invalid callback result for 'options.password()': must return a promise or a string.\"});\n }\n }\n\n // If password is a promise, get the result then read data\n if (typeof options.password === \"object\" && options.password.then) {\n return options.password.then(function(password) {\n if (!password) throw 'CANCELLED';\n return parseEWIF_v1(data_base58, password);\n });\n }\n\n // If password is a valid string, read data\n if (typeof options.password == \"string\") {\n return parseEWIF_v1(data_base58, options.password);\n }\n\n return $q.reject({message: 'Invalid EWIF options.password. Waiting a callback function, a promise or a string.'});\n }\n\n // Unknown type\n return $q.reject({message: 'Invalid WIF or EWIF format: unknown first byte identifier.'});\n }\n\n\n function parseWIF_v1(wif_base58) {\n var wif_int8 = CryptoUtils.util.decode_base58(wif_base58);\n\n // Check identifier byte = 0x01\n if (wif_int8[0] != 1) {\n return $q.reject({message: 'Invalid WIF v1 format: expected [0x01] as first byte'});\n }\n\n // Check length\n if (wif_int8.length != constants.WIF.DATA_LENGTH) {\n return $q.reject({message: 'Invalid WIF v1 format: Data must be a '+constants.WIF.DATA_LENGTH+' bytes array, encoded in base 58.'});\n }\n\n var wif_int8_no_checksum = wif_int8.slice(0, -2),\n seed = wif_int8.slice(1, -2),\n checksum = wif_int8.slice(-2);\n\n // Compute expected checksum\n var expectedChecksum = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(wif_int8_no_checksum)).slice(0,2);\n if (CryptoUtils.util.encode_base58(checksum) != CryptoUtils.util.encode_base58(expectedChecksum)) {\n $q.reject({message: 'Invalid WIF format: bad checksum'});\n }\n\n // Generate keypair from seed\n return CryptoUtils.seedKeypair(seed);\n }\n\n function parseEWIF_v1(ewif_base58, password) {\n var ewif_int8 = CryptoUtils.util.decode_base58(ewif_base58);\n\n // Check identifier byte = 0x02\n if (ewif_int8[0] != 2) {\n return $q.reject({message: 'Invalid EWIF v1 format: Expected [0x02] as first byte'});\n }\n\n // Check length\n if (ewif_int8.length != constants.EWIF.DATA_LENGTH) {\n return $q.reject({message: 'Invalid EWIF v1 format: Expected {0} bytes, encoded in base 58.'.format(constants.EWIF.DATA_LENGTH)});\n }\n\n var ewif_int8_no_checksum = ewif_int8.slice(0,-2);\n var checksum = ewif_int8.slice(-2);\n var salt = ewif_int8.slice(1,5);\n var encryptedhalf1 = ewif_int8.slice(5,21);\n var encryptedhalf2 = ewif_int8.slice(21,37);\n\n // Retrieve the scrypt_seed\n return CryptoUtils.util.crypto_scrypt(\n CryptoUtils.util.encode_utf8(password),\n salt,\n constants.EWIF.SCRYPT_PARAMS.N,\n constants.EWIF.SCRYPT_PARAMS.r,\n constants.EWIF.SCRYPT_PARAMS.p,\n 64)\n\n // Compute the final seed\n .then(function(scrypt_seed) {\n\n var derivedhalf1 = scrypt_seed.slice(0, 32);\n var derivedhalf2 = scrypt_seed.slice(32, 64);\n\n //AES\n var aesEcb = new aesjs.ModeOfOperation.ecb(derivedhalf2);\n var decryptedhalf1 = aesEcb.decrypt(encryptedhalf1);\n var decryptedhalf2 = aesEcb.decrypt(encryptedhalf2);\n\n decryptedhalf1 = new Uint8Array(decryptedhalf1);\n decryptedhalf2 = new Uint8Array(decryptedhalf2);\n\n //xor\n var seed1 = xor(decryptedhalf1, derivedhalf1.slice(0, 16));\n var seed2 = xor(decryptedhalf2, derivedhalf1.slice(16, 32));\n var seed = concat_Uint8Array(seed1, seed2);\n\n return seed;\n })\n\n // Get the keypair, from the seed\n .then(CryptoUtils.seedKeypair)\n\n // Do some controls\n .then(function(keypair) {\n\n // Check salt\n var expectedSalt = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(keypair.signPk)).slice(0,4);\n if(CryptoUtils.util.encode_base58(salt) !== CryptoUtils.util.encode_base58(expectedSalt)) {\n throw {ucode: errorCodes.BAD_PASSWORD, message: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD'};\n }\n\n // Check checksum\n var expectedChecksum = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(ewif_int8_no_checksum)).slice(0,2);\n if (CryptoUtils.util.encode_base58(checksum) != CryptoUtils.util.encode_base58(expectedChecksum)) {\n throw {ucode: errorCodes.BAD_CHECKSUM, message: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_CHECKSUM'};\n }\n\n return keypair;\n });\n }\n\n\n function wif_v1_from_keypair(keypair) {\n\n var seed = CryptoUtils.seed_from_signSk(keypair.signSk);\n if (!seed || seed.byteLength !== CryptoUtils.constants.SEED_LENGTH)\n throw \"Bad see format. Expected {0} bytes\".format(CryptoUtils.constants.SEED_LENGTH);\n\n var fi = new Uint8Array(1);\n fi[0] = 0x01;\n var seed_fi = concat_Uint8Array(fi, seed);\n\n // checksum\n var checksum = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(seed_fi)).slice(0,2);\n\n var wif_int8 = concat_Uint8Array(seed_fi, checksum);\n return $q.when(CryptoUtils.util.encode_base58(wif_int8));\n }\n\n function ewif_v1_from_keypair(keypair, password) {\n\n var seed = CryptoUtils.seed_from_signSk(keypair.signSk);\n if (!seed || seed.byteLength !== CryptoUtils.constants.SEED_LENGTH)\n return $q.reject({message: \"Bad see format. Expected {0} bytes\".format(CryptoUtils.constants.SEED_LENGTH)});\n\n // salt\n var salt = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(keypair.signPk)).slice(0,4);\n\n // scrypt_seed\n return CryptoUtils.util.crypto_scrypt(\n CryptoUtils.util.encode_utf8(password),\n salt,\n constants.EWIF.SCRYPT_PARAMS.N,\n constants.EWIF.SCRYPT_PARAMS.r,\n constants.EWIF.SCRYPT_PARAMS.p,\n 64)\n .then(function(scrypt_seed) {\n var derivedhalf1 = scrypt_seed.slice(0,32);\n var derivedhalf2 = scrypt_seed.slice(32,64);\n\n //XOR & AES\n var seed1_xor_derivedhalf1_1 = xor(seed.slice(0,16), derivedhalf1.slice(0,16));\n var seed2_xor_derivedhalf1_2 = xor(seed.slice(16,32), derivedhalf1.slice(16,32));\n\n var aesEcb = new aesjs.ModeOfOperation.ecb(derivedhalf2);\n var encryptedhalf1 = aesEcb.encrypt(seed1_xor_derivedhalf1_1);\n var encryptedhalf2 = aesEcb.encrypt(seed2_xor_derivedhalf1_2);\n\n encryptedhalf1 = new Uint8Array(encryptedhalf1);\n encryptedhalf2 = new Uint8Array(encryptedhalf2);\n\n // concatenate ewif\n var ewif_int8 = new Uint8Array(1);\n ewif_int8[0] = 0x02;\n ewif_int8 = concat_Uint8Array(ewif_int8,salt);\n ewif_int8 = concat_Uint8Array(ewif_int8,encryptedhalf1);\n ewif_int8 = concat_Uint8Array(ewif_int8,encryptedhalf2);\n\n var checksum = CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(ewif_int8)).slice(0,2);\n ewif_int8 = concat_Uint8Array(ewif_int8,checksum);\n\n return CryptoUtils.util.encode_base58(ewif_int8);\n });\n }\n\n function generateKeyFileContent(keypair, options) {\n options = options || {};\n options.type = options.type || \"PubSec\";\n\n switch(options.type) {\n\n // PubSec\n case \"PubSec\" :\n return $q.resolve(\n \"Type: PubSec\\n\" +\n \"Version: 1\\n\" +\n \"pub: \" + CryptoUtils.base58.encode(keypair.signPk) + \"\\n\" +\n \"sec: \" + CryptoUtils.base58.encode(keypair.signSk) + \"\\n\");\n\n // WIF - v1\n case \"WIF\" :\n return wif_v1_from_keypair(keypair)\n .then(function(data) {\n return \"Type: WIF\\n\" +\n \"Version: 1\\n\" +\n \"Data: \" + data + \"\\n\";\n });\n\n // EWIF - v1\n case \"EWIF\" :\n\n if (!options.password) return $q.reject({message: 'Missing EWIF options.password.'});\n\n // If not set, resolve password using the given callback\n if (options.password && typeof options.password == \"function\") {\n console.debug(\"[crypto] [EWIF] Executing 'options.password()' to resolve the password...\");\n options.password = options.password();\n if (!options.password) {\n return $q.reject({message: \"Invalid callback result for 'options.password()': must return a promise or a string.\"});\n }\n }\n\n // If password is a promise, get the result then read data\n if (options.password && typeof options.password == \"object\" && options.password.then) {\n return options.password.then(function(password) {\n if (!password) throw 'CANCELLED';\n // Recursive call, with the string password in options\n return generateKeyFileContent(keypair, angular.merge({}, options, {password: password}));\n });\n }\n\n // If password is a valid string, read data\n if (options.password && typeof options.password == \"string\") {\n return ewif_v1_from_keypair(keypair, options.password)\n .then(function(data) {\n return \"Type: EWIF\\n\" +\n \"Version: 1\\n\" +\n \"Data: \" + data + \"\\n\";\n });\n }\n\n return $q.reject({message: 'Invalid EWIF options.password. Waiting a callback function, a promise or a string.'});\n\n default:\n return $q.reject({message: \"Unknown keyfile format: \" + options.type});\n }\n }\n\n\n\n /* -- usefull methods -- */\n\n function pkChecksum(pubkey) {\n var signPk_int8 = CryptoUtils.util.decode_base58(pubkey);\n return CryptoUtils.util.encode_base58(CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(signPk_int8))).substring(0,3);\n }\n\n /* -- box (pack/unpack a record) -- */\n\n function getBoxKeypair(keypair) {\n if (!keypair) {\n throw new Error('Missing keypair');\n }\n if (keypair.boxPk && keypair.boxSk) {\n return $q.when(keypair);\n }\n\n return $q.all([\n CryptoUtils.box.keypair.skFromSignSk(keypair.signSk),\n CryptoUtils.box.keypair.pkFromSignPk(keypair.signPk)\n ])\n .then(function(res) {\n return {\n boxSk: res[0],\n boxPk: res[1]\n };\n });\n }\n\n function packRecordFields(record, keypair, recipientFieldName, cypherFieldNames, nonce) {\n\n recipientFieldName = recipientFieldName || 'recipient';\n if (!record[recipientFieldName]) {\n return $q.reject({message:'ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY'});\n }\n\n cypherFieldNames = cypherFieldNames || 'content';\n if (typeof cypherFieldNames == 'string') {\n cypherFieldNames = [cypherFieldNames];\n }\n\n // Work on a copy, to keep the original record (as it could be use again - fix #382)\n record = angular.copy(record);\n\n // Get recipient\n var recipientPk = CryptoUtils.util.decode_base58(record[recipientFieldName]);\n\n return $q.all([\n getBoxKeypair(keypair),\n CryptoUtils.box.keypair.pkFromSignPk(recipientPk),\n nonce ? $q.when(nonce) : CryptoUtils.util.random_nonce()\n ])\n .then(function(res) {\n //var senderSk = res[0];\n var boxKeypair = res[0];\n var senderSk = boxKeypair.boxSk;\n var boxRecipientPk = res[1];\n var nonce = res[2];\n\n return $q.all(\n cypherFieldNames.reduce(function(res, fieldName) {\n if (!record[fieldName]) return res; // skip undefined fields\n return res.concat(\n CryptoUtils.box.pack(record[fieldName], nonce, boxRecipientPk, senderSk)\n );\n }, []))\n\n .then(function(cypherTexts){\n // Replace field values with cypher texts\n var i = 0;\n _.forEach(cypherFieldNames, function(cypherFieldName) {\n if (!record[cypherFieldName]) {\n // Force undefined fields to be present in object\n // This is better for ES storage, that always works on lazy update mode\n record[cypherFieldName] = null;\n }\n else {\n record[cypherFieldName] = cypherTexts[i++];\n }\n });\n\n // Set nonce\n record.nonce = CryptoUtils.util.encode_base58(nonce);\n\n return record;\n });\n });\n }\n\n function openRecordFields(records, keypair, issuerFieldName, cypherFieldNames) {\n\n issuerFieldName = issuerFieldName || 'issuer';\n cypherFieldNames = cypherFieldNames || 'content';\n if (typeof cypherFieldNames == 'string') {\n cypherFieldNames = [cypherFieldNames];\n }\n\n var now = Date.now();\n var issuerBoxPks = {}; // a map used as cache\n\n var jobs = [getBoxKeypair(keypair)];\n return $q.all(records.reduce(function(jobs, message) {\n var issuer = message[issuerFieldName];\n if (!issuer) {throw 'Record has no ' + issuerFieldName;}\n if (issuerBoxPks[issuer]) return res;\n return jobs.concat(\n CryptoUtils.box.keypair.pkFromSignPk(CryptoUtils.util.decode_base58(issuer))\n .then(function(issuerBoxPk) {\n issuerBoxPks[issuer] = issuerBoxPk; // fill box pk cache\n }));\n }, jobs))\n .then(function(res){\n var boxKeypair = res[0];\n return $q.all(records.reduce(function(jobs, record) {\n var issuerBoxPk = issuerBoxPks[record[issuerFieldName]];\n var nonce = CryptoUtils.util.decode_base58(record.nonce);\n record.valid = true;\n\n return jobs.concat(\n cypherFieldNames.reduce(function(res, cypherFieldName) {\n if (!record[cypherFieldName]) return res;\n return res.concat(CryptoUtils.box.open(record[cypherFieldName], nonce, issuerBoxPk, boxKeypair.boxSk)\n .then(function(text) {\n record[cypherFieldName] = text;\n })\n .catch(function(err){\n console.error(err);\n console.warn('[ES] [crypto] a record may have invalid cypher ' + cypherFieldName);\n record.valid = false;\n }));\n }, []));\n }, []));\n })\n .then(function() {\n console.debug('[ES] [crypto] All record decrypted in ' + (Date.now() - now) + 'ms');\n return records;\n });\n\n }\n\n function parseKeyFileData(data, options){\n options = options || {};\n options.withSecret = angular.isDefined(options.withSecret) ? options.withSecret : true;\n options.silent = angular.isDefined(options.withSecret) ? options.silent : false;\n options.password = function() {\n return UIUtils.loading.hide(100)\n .then(function() {\n return Modals.showPassword({\n title: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE',\n subTitle: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP',\n error: options.error,\n scope: options.scope\n });\n })\n .then(function(password) {\n // Timeout is need to force popup to be hide\n return $timeout(function() {\n if (password) UIUtils.loading.show();\n return password;\n }, 150);\n });\n };\n\n if (!options.silent) {\n UIUtils.loading.show();\n }\n\n return parseWIF_or_EWIF(data, options)\n .then(function(res){\n return res;\n })\n .catch(function(err) {\n if (err && err === 'CANCELLED') return;\n if (err && err.ucode == errorCodes.BAD_PASSWORD) {\n // recursive call\n return parseKeyFileData(data, {withSecret: options.withSecret, error: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD'});\n }\n console.error(\"[crypto] Unable to parse as WIF or EWIF format: \" + (err && err.message || err));\n throw err; // rethrow\n });\n }\n\n // exports\n return {\n errorCodes: errorCodes,\n constants: constants,\n // copy CryptoUtils\n util: angular.extend({\n pkChecksum: pkChecksum\n }, CryptoUtils.util),\n keyfile: {\n read: readKeyFile,\n parseData: parseKeyFileData,\n generateContent: generateKeyFileContent\n },\n box: {\n getKeypair: getBoxKeypair,\n pack: packRecordFields,\n open: openRecordFields\n }\n };\n }])\n;\n","// var qrcode;\n\nangular.module('cesium.utils.services', ['angular-fullscreen-toggle'])\n\n// Replace the '$ionicPlatform.ready()', to enable multiple calls\n// See http://stealthcode.co/multiple-calls-to-ionicplatform-ready/\n.factory('ionicReady', ['$ionicPlatform', function($ionicPlatform) {\n 'ngInject';\n\n var readyPromise;\n\n return function () {\n if (!readyPromise) {\n readyPromise = $ionicPlatform.ready();\n }\n return readyPromise;\n };\n}])\n\n.factory('UIUtils', ['$ionicLoading', '$ionicPopup', '$ionicConfig', '$ionicHistory', '$translate', '$q', 'ionicMaterialInk', 'ionicMaterialMotion', '$window', '$timeout', 'Fullscreen', 'localStorage', 'csSettings', '$ionicPopover', '$state', '$rootScope', 'screenmatch', function($ionicLoading, $ionicPopup, $ionicConfig, $ionicHistory, $translate, $q,\n ionicMaterialInk, ionicMaterialMotion, $window, $timeout, Fullscreen, localStorage,\n csSettings,\n $ionicPopover, $state, $rootScope, screenmatch) {\n 'ngInject';\n\n\n var\n loadingTextCache=null,\n CONST = {\n MAX_HEIGHT: 480,\n MAX_WIDTH: 640,\n THUMB_MAX_HEIGHT: 200,\n THUMB_MAX_WIDTH: 200\n },\n data = {\n smallscreen: screenmatch.bind('xs, sm', $rootScope)\n },\n exports,\n raw = {}\n ;\n\n function alertError(err, subtitle) {\n if (!err) {\n return $q.when(); // Silent\n }\n\n return $q(function(resolve) {\n $translate([err, 'ERROR.POPUP_TITLE', 'ERROR.UNKNOWN_ERROR', 'COMMON.BTN_OK', subtitle || '_NON_NULL_'])\n .then(function (translations) {\n var message = err.message || translations[err];\n return $ionicPopup.show({\n template: '<p>' + (message || translations['ERROR.UNKNOWN_ERROR']) + '</p>',\n title: translations['ERROR.POPUP_TITLE'],\n subTitle: subtitle && translations[subtitle] || undefined,\n buttons: [\n {\n text: '<b>'+translations['COMMON.BTN_OK']+'</b>',\n type: 'button-assertive',\n onTap: function(e) {\n resolve(e);\n }\n }\n ]\n });\n });\n });\n }\n\n function alertInfo(message, subtitle, options) {\n if (!message) return $q.reject(\"Missing 'message' argument\");\n options = options || {};\n options.cssClass = options.cssClass || 'info';\n options.okText = options.okText || 'COMMON.BTN_OK';\n\n return $q(function(resolve) {\n $translate([message, 'INFO.POPUP_TITLE', options.okText, subtitle || '_NON_NULL_'])\n .then(function (translations) {\n $ionicPopup.show({\n template: '<p>' + translations[message] + '</p>',\n title: translations['INFO.POPUP_TITLE'],\n subTitle: subtitle && translations[subtitle] || undefined,\n cssClass: options.cssClass,\n buttons: [\n {\n text: translations[options.okText],\n type: 'button-positive',\n onTap: function(e) {\n resolve(e);\n }\n }\n ]\n });\n });\n });\n }\n\n function alertNotImplemented() {\n return alertInfo('INFO.FEATURES_NOT_IMPLEMENTED');\n }\n\n function askConfirm(message, title, options) {\n if (!message) return $q.reject(\"Missing 'message' argument\");\n title = title || 'CONFIRM.POPUP_TITLE';\n\n options = options || {};\n options.cssClass = options.cssClass || 'confirm';\n options.cancelText = options.cancelText || 'COMMON.BTN_CANCEL';\n options.okText = options.okText || 'COMMON.BTN_OK';\n\n return $translate([message, title, options.cancelText, options.okText])\n .then(function (translations) {\n return $ionicPopup.confirm({\n template: translations[message],\n cssClass: options.cssClass,\n title: translations[title],\n cancelText: translations[options.cancelText],\n cancelType: options.cancelType,\n okText: translations[options.okText],\n okType: options.okType\n });\n });\n }\n\n function hideLoading(timeout){\n if (timeout) {\n return $timeout(function(){\n return $ionicLoading.hide();\n }, timeout);\n }\n else {\n return $ionicLoading.hide();\n }\n }\n\n function showLoading(options) {\n if (!loadingTextCache) {\n return $translate('COMMON.LOADING')\n .then(function(translation){\n loadingTextCache = translation;\n return showLoading(options);\n });\n }\n options = options || {};\n options.template = options.template||loadingTextCache;\n\n return $ionicLoading.show(options);\n }\n\n function updateLoading(options) {\n return $ionicLoading._getLoader().then(function(loader) {\n if (!loader || !loader.isShown) return;\n // Translate template (if exists)\n if (options && options.template) {\n return $translate(options && options.template)\n .then(function(template) {\n options.template = template;\n return loader;\n });\n }\n })\n .then(function(loader) {\n if (loader && loader.isShown) return showLoading(options);\n });\n }\n\n function showToast(message, duration, position) {\n if (!message) return $q.reject(\"Missing 'message' argument\");\n duration = duration || 'short';\n position = position || 'bottom';\n\n return $translate(message)\n .then(function(message){\n\n // removeIf(device)\n // Use the $ionicLoading toast.\n // First, make sure to convert duration in number\n if (typeof duration == 'string') {\n if (duration === 'short') {\n duration = 2000;\n }\n else {\n duration = 5000;\n }\n }\n return $ionicLoading.show({ template: message, noBackdrop: true, duration: duration });\n // endRemoveIf(device)\n });\n }\n\n function onError(msg, reject/*optional*/) {\n return function(err) {\n var fullMsg = msg;\n var subtitle;\n if (!!err && !!err.message) {\n fullMsg = err.message;\n subtitle = msg;\n }\n else if (!msg){\n fullMsg = err;\n }\n // If reject has been given, use it\n if (!!reject) {\n reject(fullMsg);\n }\n // If just a user cancellation: silent\n else if (fullMsg === 'CANCELLED') {\n return hideLoading(10); // timeout, to avoid bug on transfer (when error on reference)\n }\n\n // Otherwise, log to console and display error\n else {\n hideLoading(10); // timeout, to avoid bug on transfer (when error on reference)\n return alertError(fullMsg, subtitle);\n }\n };\n }\n\n function isSmallScreen() {\n return data.smallscreen.active;\n }\n\n function selectElementText(el) {\n if (el.value || el.type === \"text\" || el.type === \"textarea\") {\n // Source: http://stackoverflow.com/questions/14995884/select-text-on-input-focus\n if ($window.getSelection && !$window.getSelection().toString()) {\n el.setSelectionRange(0, el.value.length);\n }\n }\n else {\n if (el.childNodes && el.childNodes.length > 0) {\n selectElementText(el.childNodes[0]);\n }\n else {\n // See http://www.javascriptkit.com/javatutors/copytoclipboard.shtml\n var range = $window.document.createRange(); // create new range object\n range.selectNodeContents(el); // set range to encompass desired element text\n var selection = $window.getSelection(); // get Selection object from currently user selected text\n selection.removeAllRanges(); // unselect any user selected text (if any)\n selection.addRange(range); // add range to Selection object to select it\n }\n }\n }\n\n function getSelectionText(){\n var selectedText = \"\";\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = $window.getSelection().toString();\n }\n return selectedText;\n }\n\n function imageOnLoadResize(resolve, reject, thumbnail) {\n return function(event) {\n var width = event.target.width,\n height = event.target.height,\n maxWidth = (thumbnail ? CONST.THUMB_MAX_WIDTH : CONST.MAX_WIDTH),\n maxHeight = (thumbnail ? CONST.THUMB_MAX_HEIGHT : CONST.MAX_HEIGHT)\n ;\n\n var canvas = document.createElement(\"canvas\");\n var ctx;\n\n // Thumbnail: resize and crop (to the expected size)\n if (thumbnail) {\n\n // landscape\n if (width > height) {\n width *= maxHeight / height;\n height = maxHeight;\n }\n\n // portrait\n else {\n height *= maxWidth / width;\n width = maxWidth;\n }\n canvas.width = maxWidth;\n canvas.height = maxHeight;\n ctx = canvas.getContext(\"2d\");\n var xoffset = Math.trunc((maxWidth - width) / 2 + 0.5);\n var yoffset = Math.trunc((maxHeight - height) / 2 + 0.5);\n ctx.drawImage(event.target,\n xoffset, // x1\n yoffset, // y1\n maxWidth + -2 * xoffset, // x2\n maxHeight + -2 * yoffset // y2\n );\n }\n\n // Resize, but keep the full image\n else {\n\n // landscape\n if (width > height) {\n if (width > maxWidth) {\n height *= maxWidth / width;\n width = maxWidth;\n }\n }\n\n // portrait\n else {\n if (height > maxHeight) {\n width *= maxHeight / height;\n height = maxHeight;\n }\n }\n\n canvas.width = width;\n canvas.height = height;\n ctx = canvas.getContext(\"2d\");\n\n // Resize the whole image\n ctx.drawImage(event.target, 0, 0, canvas.width, canvas.height);\n }\n\n var dataurl = canvas.toDataURL();\n\n canvas.remove();\n\n resolve(dataurl);\n };\n }\n\n function resizeImageFromFile(file, thumbnail) {\n var img = document.createElement(\"img\");\n return $q(function(resolve, reject) {\n\n if (file) {\n var reader = new FileReader();\n reader.onload = function(event){\n img.onload = imageOnLoadResize(resolve, reject, thumbnail);\n img.src = event.target.result;\n };\n reader.readAsDataURL(file);\n }\n else {\n reject('no file to resize');\n }\n })\n .then(function(dataurl) {\n img.remove();\n return dataurl;\n })\n ;\n }\n\n function resizeImageFromSrc(imageSrc, thumbnail) {\n var img = document.createElement(\"img\");\n return $q(function(resolve, reject) {\n img.onload = imageOnLoadResize(resolve, reject, thumbnail);\n img.src = imageSrc;\n })\n .then(function(data){\n img.remove();\n return data;\n });\n }\n\n function imageOnLoadRotate(resolve, reject) {\n var deg = Math.PI / 180;\n var angle = 90 * deg;\n return function(event) {\n var width = event.target.width;\n var height = event.target.height;\n var maxWidth = CONST.MAX_WIDTH;\n var maxHeight = CONST.MAX_HEIGHT;\n\n if (width > height) {\n if (width > maxWidth) {\n height *= maxWidth / width;\n width = maxWidth;\n }\n } else {\n if (height > maxHeight) {\n width *= maxHeight / height;\n height = maxHeight;\n }\n }\n\n var canvas = document.createElement(\"canvas\");\n canvas.width = height;\n canvas.height = width;\n\n var ctx = canvas.getContext(\"2d\");\n ctx.rotate(angle);\n ctx.drawImage(event.target, 0, (-1) * canvas.width);\n\n var dataurl = canvas.toDataURL();\n\n canvas.remove();\n\n resolve(dataurl);\n };\n }\n\n function rotateFromSrc(imageSrc, angle) {\n var img = document.createElement(\"img\");\n return $q(function(resolve, reject) {\n img.onload = imageOnLoadRotate(resolve, reject, angle);\n img.src = imageSrc;\n })\n .then(function(data){\n img.remove();\n return data;\n });\n }\n\n function showPopover(event, options) {\n\n var deferred = $q.defer();\n\n options = options || {};\n options.templateUrl = options.templateUrl ? options.templateUrl : 'templates/common/popover_copy.html';\n options.scope = options.scope || $rootScope;\n options.scope.popovers = options.scope.popovers || {};\n options.autoselect = options.autoselect || false;\n options.autoremove = angular.isDefined(options.autoremove) ? options.autoremove : true;\n options.backdropClickToClose = angular.isDefined(options.backdropClickToClose) ? options.backdropClickToClose : true;\n options.focusFirstInput = angular.isDefined(options.focusFirstInput) ? options.focusFirstInput : false;\n\n var _show = function(popover) {\n popover = popover || options.scope.popovers[options.templateUrl];\n popover.isResolved=false;\n popover.deferred=deferred;\n popover.options=options;\n // Fill the popover scope\n if (options.bindings) {\n angular.merge(popover.scope, options.bindings);\n }\n $timeout(function() { // This is need for Firefox\n popover.show(event)\n .then(function() {\n var element;\n // Auto select text\n if (options.autoselect) {\n element = document.querySelectorAll(options.autoselect)[0];\n if (element) {\n if ($window.getSelection && !$window.getSelection().toString()) {\n element.setSelectionRange(0, element.value.length);\n element.focus();\n }\n else {\n element.focus();\n }\n }\n }\n else {\n // Auto focus on a element\n if (options.autofocus) {\n element = document.querySelectorAll(options.autofocus)[0];\n if (element) element.focus();\n }\n }\n\n popover.scope.$parent.$emit('popover.shown');\n\n // Callback 'afterShow'\n if (options.afterShow) options.afterShow(popover);\n });\n });\n };\n\n var _cleanup = function(popover) {\n popover = popover || options.scope.popovers[options.templateUrl];\n if (popover) {\n delete options.scope.popovers[options.templateUrl];\n // Remove the popover\n popover.remove()\n // Workaround for issue #244\n // See also https://github.com/driftyco/ionic-v1/issues/71\n // and https://github.com/driftyco/ionic/issues/9069\n .then(function() {\n var bodyEl = angular.element($window.document.querySelectorAll('body')[0]);\n bodyEl.removeClass('popover-open');\n });\n }\n };\n\n var popover = options.scope.popovers[options.templateUrl];\n if (!popover) {\n\n $ionicPopover.fromTemplateUrl(options.templateUrl, {\n scope: options.scope,\n backdropClickToClose: options.backdropClickToClose\n })\n .then(function (popover) {\n popover.isResolved = false;\n\n popover.scope.closePopover = function(result) {\n var autoremove = popover.options && popover.options.autoremove;\n if (popover.options) delete popover.options.autoremove; // remove to avoid to trigger 'popover.hidden'\n popover.hide()\n .then(function() {\n if (autoremove) {\n return _cleanup(popover);\n }\n })\n .then(function() {\n if (popover.deferred) {\n popover.deferred.resolve(result);\n }\n delete popover.deferred;\n delete popover.options;\n });\n };\n\n // Execute action on hidden popover\n popover.scope.$on('popover.hidden', function() {\n if (popover.options && popover.options.afterHidden) {\n popover.options.afterHidden();\n }\n if (popover.options && popover.options.autoremove) {\n _cleanup(popover);\n }\n });\n\n // Cleanup the popover when hidden\n options.scope.$on('$remove', function() {\n if (popover.deferred) {\n popover.deferred.resolve();\n }\n _cleanup();\n });\n\n options.scope.popovers[options.templateUrl] = popover;\n _show(popover);\n });\n }\n else {\n _show(popover);\n }\n\n return deferred.promise;\n }\n\n function showCopyPopover(event, value) {\n var rows = value && value.indexOf('\\n') >= 0 ? value.split('\\n').length : 1;\n return showPopover(event, {\n templateUrl: 'templates/common/popover_copy.html',\n bindings: {\n value: value,\n rows: rows\n },\n autoselect: '.popover-copy ' + (rows <= 1 ? 'input' : 'textarea')\n });\n }\n\n function showMastodonSharePopover(event, options) {\n options = options || {};\n options.templateUrl = 'templates/common/popover_instance_address.html';\n options.autoselect = '.popover-instance-address input';\n options.bindings = options.bindings || {};\n options.bindings.value = options.bindings.value || options.bindings.url ||\n $state.href($state.current, $state.params, {absolute: true});\n options.bindings.postUrl = options.bindings.postUrl || options.bindings.value;\n options.bindings.postMessage = options.bindings.postMessage || '';\n options.bindings.postAuthor = options.bindings.postAuthor || csSettings.data.share.mastodonAuthor;\n options.bindings.postHashtags = options.bindings.postHashtags || csSettings.data.share.defaultHastags;\n options.bindings.titleKey = options.bindings.titleKey || 'COMMON.POPOVER_SHARE.TITLE';\n\n // Prefill the form with the user's previously-specified Mastodon instance, if applicable\n localStorage.get('mastodon_instance')\n .then(function(instance) {\n // If there is no cached instance/domain, then insert a \"https://\" with no domain at the start of the prompt.\n options.bindings.instance = instance || \"https://\";\n // Remove auto select, if instance already set\n if (instance) options.autoselect = undefined;\n\n return showPopover(event, options);\n })\n .then(function(instance) {\n if (!instance) return; // Skip\n // Handle URL formats\n if (!instance.startsWith(\"https://\") && !instance.startsWith(\"http://\")) {\n instance = \"https://\" + instance;\n }\n\n // Get the page title from the og:title meta tag, if it exists.\n var title = document.querySelectorAll('meta[property=\"og:title\"]')[0].getAttribute(\"content\");\n\n // Otherwise, use the <title> tag as the title\n if (!title) title = document.getElementsByTagName(\"title\")[0].innerHTML;\n\n // Handle slash\n if (!instance.endsWith(\"/\") ) instance = instance + \"/\";\n\n // Cache the instance/domain for future requests\n localStorage.put('mastodon_instance', instance);\n\n // Create the Share URL\n // https://someinstance.tld/share?text=URL%20encoded%20text\n var mastodon_url = instance + \"share?text=\" + encodeURIComponent(options.bindings.postMessage +\n \"\\n\\n\" + options.bindings.postUrl +\n \"\\n\\n\" + options.bindings.postHashtags +\n \" \" + (options.bindings.postAuthor || ''));\n\n\n console.debug('[utils] Mastodon share link: ' + mastodon_url);\n\n // Open a new window at the share location\n window.open(mastodon_url, 'mastodon-share','menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=370');return false;\n });\n }\n\n function showSharePopover(event, options) {\n options = options || {};\n options.templateUrl = options.templateUrl ? options.templateUrl : 'templates/common/popover_share.html';\n options.autoselect = options.autoselect || '.popover-share input';\n options.bindings = options.bindings || {};\n options.bindings.value = options.bindings.value || options.bindings.url ||\n $state.href($state.current, $state.params, {absolute: true});\n options.bindings.postUrl = options.bindings.postUrl || options.bindings.value;\n options.bindings.postMessage = options.bindings.postMessage || '';\n options.bindings.titleKey = options.bindings.titleKey || 'COMMON.POPOVER_SHARE.TITLE';\n options.bindings.shareOnMastodon = function() {\n showMastodonSharePopover(event, options);\n };\n\n return showPopover(event, options);\n }\n\n function showHelptip(id, options) {\n var element = (typeof id == 'string') && id ? $window.document.getElementById(id) : id;\n if (!id && !element && options.selector) {\n element = $window.document.querySelector(options.selector);\n }\n\n options = options || {};\n var deferred = options.deferred || $q.defer();\n\n if(element && !options.timeout) {\n if (options.preAction) {\n element[options.preAction]();\n }\n options.templateUrl = options.templateUrl ? options.templateUrl : 'templates/common/popover_helptip.html';\n options.autofocus = options.autofocus || '#helptip-btn-ok';\n options.bindings = options.bindings || {};\n options.bindings.icon = options.bindings.icon || {};\n options.bindings.icon.position = options.bindings.icon.position || false;\n options.bindings.icon.glyph = options.bindings.icon.glyph ||\n (options.bindings.icon.position && options.bindings.icon.position.startsWith('bottom-') ? 'ion-arrow-down-c' :'ion-arrow-up-c');\n options.bindings.icon.class = options.bindings.icon.class || 'calm icon ' + options.bindings.icon.glyph;\n options.bindings.tour = angular.isDefined(options.bindings.tour) ? options.bindings.tour : false;\n showPopover(element, options)\n .then(function(result){\n if (options.postAction) {\n element[options.postAction]();\n }\n deferred.resolve(result);\n })\n .catch(function(err){\n if (options.postAction) {\n element[options.postAction]();\n }\n deferred.reject(err);\n });\n }\n else {\n\n // Do timeout if ask\n if (options.timeout) {\n var timeout = options.timeout;\n options.retryTimeout = options.retryTimeout || timeout;\n delete options.timeout;\n options.deferred = deferred;\n $timeout(function () {\n showHelptip(id, options);\n }, timeout);\n }\n\n // No element: reject\n else if (angular.isDefined(options.retry) && !options.retry) {\n\n if (options.onError === 'continue') {\n $timeout(function () {\n deferred.resolve(true);\n });\n }\n else {\n $timeout(function () {\n deferred.reject(\"[helptip] element now found: \" + id);\n });\n }\n }\n\n // Retry until element appears\n else {\n options.retry = angular.isUndefined(options.retry) ? 2 : (options.retry-1);\n options.deferred = deferred;\n $timeout(function() {\n showHelptip(id, options);\n }, options.timeout || options.retryTimeout || 100);\n }\n }\n\n return deferred.promise;\n }\n\n function showFab(id, timeout) {\n if (!timeout) {\n timeout = 900;\n }\n $timeout(function () {\n // Could not use 'getElementById', because it return only once element,\n // but many fabs can have the same id (many view could be loaded at the same time)\n var fabs = document.getElementsByClassName('button-fab');\n _.forEach(fabs, function(fab){\n if (fab.id == id) {\n fab.classList.toggle('on', true);\n }\n });\n }, timeout);\n }\n\n function hideFab(id, timeout) {\n if (!timeout) {\n timeout = 10;\n }\n $timeout(function () {\n // Could not use 'getElementById', because it return only once element,\n // but many fabs can have the same id (many view could be loaded at the same time)\n var fabs = document.getElementsByClassName('button-fab');\n _.forEach(fabs, function(fab){\n if (fab.id == id) {\n fab.classList.toggle('on', false);\n }\n });\n }, timeout);\n }\n\n function motionDelegate(delegate, ionListClass) {\n var motionTimeout = isSmallScreen() ? 100 : 10;\n var defaultSelector = '.list.{0} .item, .list .{0} .item'.format(ionListClass, ionListClass);\n return {\n ionListClass: ionListClass,\n show: function(options) {\n options = options || {};\n options.selector = options.selector || defaultSelector;\n options.ink = angular.isDefined(options.ink) ? options.ink : true;\n options.startVelocity = options.startVelocity || (isSmallScreen() ? 1100 : 3000);\n return $timeout(function(){\n\n // Display ink effect (no selector need)\n if (options.ink) exports.ink();\n\n // Display the delegated motion effect\n delegate(options);\n }, options.timeout || motionTimeout);\n }\n };\n }\n\n function setEffects(enable) {\n if (exports.motion.enable === enable) return; // same\n console.debug('[UI] [effects] ' + (enable ? 'Enable' : 'Disable'));\n\n exports.motion.enable = enable;\n if (enable) {\n $ionicConfig.views.transition('platform');\n angular.merge(exports.motion, raw.motion);\n }\n else {\n $ionicConfig.views.transition('none');\n var nothing = {\n class: undefined,\n show: function(){}\n };\n angular.merge(exports.motion, {\n enable : false,\n default: nothing,\n fadeSlideIn: nothing,\n fadeSlideInRight: nothing,\n panInLeft: nothing,\n pushDown: nothing,\n ripple: nothing,\n slideUp: nothing,\n fadeIn: nothing,\n toggleOn: toggleOn,\n toggleOff: toggleOff\n });\n $rootScope.motion = nothing;\n }\n $ionicHistory.clearCache();\n }\n\n raw.motion = {\n enable: true,\n default: motionDelegate(ionicMaterialMotion.ripple, 'animate-ripple'),\n blinds: motionDelegate(ionicMaterialMotion.blinds, 'animate-blinds'),\n fadeSlideIn: motionDelegate(ionicMaterialMotion.fadeSlideIn, 'animate-fade-slide-in'),\n fadeSlideInRight: motionDelegate(ionicMaterialMotion.fadeSlideInRight, 'animate-fade-slide-in-right'),\n panInLeft: motionDelegate(ionicMaterialMotion.panInLeft, 'animate-pan-in-left'),\n pushDown: motionDelegate(ionicMaterialMotion.pushDown, 'push-down'),\n ripple: motionDelegate(ionicMaterialMotion.ripple, 'animate-ripple'),\n slideUp: motionDelegate(ionicMaterialMotion.slideUp, 'slide-up'),\n fadeIn: motionDelegate(function(options) {\n toggleOn(options);\n }, 'fade-in'),\n toggleOn: toggleOn,\n toggleOff: toggleOff\n };\n\n function createQRCodeObj(text, typeNumber,\n errorCorrectionLevel, mode, mb) {\n\n mb = mb || 'default'; // default | SJIS | UTF-8\n qrcode.stringToBytes = qrcode.stringToBytesFuncs[mb];\n\n var qr = qrcode(typeNumber || 4, errorCorrectionLevel || 'M');\n qr.addData(text, mode);\n qr.make();\n\n return qr;\n }\n\n /**\n * Create a QRCode as an <svg> tag\n * @param text\n * @param typeNumber\n * @param errorCorrectionLevel\n * @param mode\n * @param mb multibyte ? value: 'default' | 'SJIS' | 'UTF-8'\n * @returns {string}\n */\n function getSvgQRCode(text, typeNumber,\n errorCorrectionLevel, mode, mb) {\n\n var qr = createQRCodeObj(text, typeNumber, errorCorrectionLevel, mode, mb);\n return qr.createSvgTag();\n }\n\n /**\n * Create a QRCode as an <img> tag\n * @param text\n * @param typeNumber\n * @param errorCorrectionLevel\n * @param mode\n * @param mb multibyte ? value: 'default' | 'SJIS' | 'UTF-8'\n * @returns {string}\n */\n function getImgQRCode(text, typeNumber,\n errorCorrectionLevel, mode, mb) {\n\n var qr = createQRCodeObj(text, typeNumber, errorCorrectionLevel, mode, mb);\n return qr.createImgTag();\n }\n\n function toggleOn(options, timeout) {\n // We have a single option, so it may be passed as a string or property\n if (typeof options === 'string') {\n options = {\n selector: options\n };\n }\n\n // Fail early & silently log\n var isInvalidSelector = typeof options.selector === 'undefined' || options.selector === '';\n\n if (isInvalidSelector) {\n console.error('invalid toggleOn selector');\n return false;\n }\n\n $timeout(function () {\n var elements = document.querySelectorAll(options.selector);\n if (elements) _.forEach(elements, function(element){\n element.classList.toggle('on', true);\n });\n }, timeout || 100);\n }\n\n function toggleOff(options, timeout) {\n // We have a single option, so it may be passed as a string or property\n if (typeof options === 'string') {\n options = {\n selector: options\n };\n }\n\n // Fail early & silently log\n var isInvalidSelector = typeof options.selector === 'undefined' || options.selector === '';\n\n if (isInvalidSelector) {\n console.error('invalid toggleOff selector');\n return false;\n }\n\n $timeout(function () {\n var elements = document.querySelectorAll(options.selector);\n if (elements) _.forEach(elements, function(element){\n element.classList.toggle('on', false);\n });\n }, timeout || 900);\n }\n\n exports = {\n alert: {\n error: alertError,\n info: alertInfo,\n confirm: askConfirm,\n notImplemented: alertNotImplemented\n },\n loading: {\n show: showLoading,\n hide: hideLoading,\n update: updateLoading\n },\n toast: {\n show: showToast\n },\n onError: onError,\n screen: {\n isSmall: isSmallScreen,\n fullscreen: Fullscreen\n },\n ink: ionicMaterialInk.displayEffect,\n motion: raw.motion,\n setEffects: setEffects,\n qrcode: {\n svg: getSvgQRCode,\n img: getImgQRCode\n },\n fab: {\n show: showFab,\n hide: hideFab\n },\n popover: {\n show: showPopover,\n copy: showCopyPopover,\n share: showSharePopover,\n helptip: showHelptip\n },\n selection: {\n select: selectElementText,\n get: getSelectionText\n },\n image: {\n resizeFile: resizeImageFromFile,\n resizeSrc: resizeImageFromSrc,\n rotateSrc: rotateFromSrc\n },\n raw: raw\n };\n\n return exports;\n}])\n\n\n// See http://plnkr.co/edit/vJQXtsZiX4EJ6Uvw9xtG?p=preview\n.factory('$focus', ['$timeout', '$window', function($timeout, $window) {\n 'ngInject';\n\n return function(id) {\n // timeout makes sure that it is invoked after any other event has been triggered.\n // e.g. click events that need to run before the focus or\n // inputs elements that are in a disabled state but are enabled when those events\n // are triggered.\n $timeout(function() {\n var element = $window.document.getElementById(id);\n if(element)\n element.focus();\n });\n };\n}])\n\n;\n","angular.module('cesium.cache.services', ['angular-cache'])\n\n.factory('csCache', ['$rootScope', '$http', '$window', 'csSettings', 'CacheFactory', function($rootScope, $http, $window, csSettings, CacheFactory) {\n 'ngInject';\n\n var\n constants = {\n VERY_LONG: 54000000, /*15 days*/\n LONG: 1 * 60 * 60 * 1000 /*1 hour*/,\n MEDIUM: 5 * 60 * 1000 /*5 min*/,\n SHORT: csSettings.defaultSettings.cacheTimeMs // around 1min\n },\n storageMode = getSettingsStorageMode(),\n cacheNames = [],\n listeners = []\n ;\n\n function getSettingsStorageMode(settings) {\n settings = settings || csSettings.data;\n return settings && settings.useLocalStorage && settings.persistCache && $window.localStorage ? 'localStorage' : 'memory';\n }\n\n function getCacheOptions(options) {\n options = options || {};\n options.storageMode = getSettingsStorageMode();\n options.deleteOnExpire = (options.storageMode === 'localStorage' || options.onExpire) ? 'aggressive' : 'passive';\n options.cacheFlushInterval = options.deleteOnExpire === 'passive' ?\n (60 * 60 * 1000) : // If passive mode, remove all items every hour\n null;\n return options;\n }\n\n function getOrCreateCache(prefix, maxAge, onExpire){\n prefix = prefix || '';\n maxAge = maxAge || constants.SHORT;\n var cacheName = prefix + ((maxAge / 1000) + 's');\n\n // If onExpire fn, generate a new cache key\n var cache;\n if (onExpire && typeof onExpire == 'function') {\n var counter = 1;\n while (CacheFactory.get(cacheName + counter)) {\n counter++;\n }\n cacheName = cacheName + counter;\n }\n else {\n cache = CacheFactory.get(cacheName);\n }\n\n // Add to cache names map\n if (!cacheNames[cacheName]) cacheNames[cacheName] = true;\n\n // Already exists: use it\n if (cache) return cache;\n\n // Not exists yet: create a new cache\n var options = getCacheOptions({\n maxAge: maxAge,\n onExpire: onExpire || null\n });\n console.debug(\"[cache] Creating cache {{0}} with {storageMode: {1}}...\".format(cacheName, options.storageMode));\n return CacheFactory.createCache(cacheName, options);\n }\n\n function clearAllCaches() {\n console.debug(\"[cache] Cleaning all caches...\");\n _.forEach(_.keys(cacheNames), function(cacheName) {\n var cache = CacheFactory.get(cacheName);\n if (cache) {\n cache.removeAll();\n }\n });\n }\n\n function clearFromPrefix(cachePrefix) {\n _.forEach(_.keys(cacheNames), function(cacheName) {\n if (cacheName.startsWith(cachePrefix)) {\n var cache = CacheFactory.get(cacheName);\n if (cache) {\n cache.removeAll();\n }\n }\n });\n }\n\n function onSettingsChanged(settings) {\n var newStorageMode = getSettingsStorageMode(settings);\n var hasChanged = (newStorageMode !== storageMode);\n if (hasChanged) {\n storageMode = newStorageMode;\n console.debug(\"[cache] Updating caches with {storageMode: {0}}\".format(storageMode));\n _.forEach(_.keys(cacheNames), function(cacheName) {\n var cache = CacheFactory.get(cacheName);\n if (cache) {\n cache.setOptions(getCacheOptions(), true);\n }\n });\n }\n }\n\n function addListeners() {\n listeners = [\n // Listen for settings changed (e.g. the storage mode)\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this)\n ];\n }\n\n addListeners();\n\n return {\n get: getOrCreateCache,\n clear: clearFromPrefix,\n clearAll: clearAllCaches,\n constants: constants\n };\n}])\n;\n","angular.module('cesium.modal.services', [])\n\n\n// Useful for modal with no controller\n.controller('EmptyModalCtrl', function () {\n 'ngInject';\n\n})\n\n.controller('AboutModalCtrl', ['$scope', 'UIUtils', 'csHttp', function ($scope, UIUtils, csHttp) {\n 'ngInject';\n\n $scope.openLink = function(event, uri, options) {\n options = options || {};\n\n // If unable to open, just copy value\n options.onError = function() {\n return UIUtils.popover.copy(event, uri);\n };\n\n return csHttp.uri.open(uri, options);\n };\n}])\n\n.factory('ModalUtils', ['$ionicModal', '$rootScope', '$q', '$injector', '$controller', '$timeout', function($ionicModal, $rootScope, $q, $injector, $controller, $timeout) {\n 'ngInject';\n\n\n function _evalController(ctrlName) {\n var result = {\n isControllerAs: false,\n controllerName: '',\n propName: ''\n };\n var fragments = (ctrlName || '').trim().split(/\\s+/);\n result.isControllerAs = fragments.length === 3 && (fragments[1] || '').toLowerCase() === 'as';\n if (result.isControllerAs) {\n result.controllerName = fragments[0];\n result.propName = fragments[2];\n } else {\n result.controllerName = ctrlName;\n }\n\n return result;\n }\n\n function DefaultModalController($scope, deferred, parameters) {\n\n $scope.deferred = deferred || $q.defer();\n $scope.resolved = false;\n\n $scope.openModal = function () {\n return $scope.modal.show();\n };\n\n $scope.closeModal = function (result) {\n $scope.resolved = true;\n return $scope.modal.remove()\n .then(function() {\n $scope.deferred.resolve(result);\n return result;\n });\n };\n\n\n // Useful method for modal with forms\n $scope.setForm = function (form, propName) {\n if (propName) {\n $scope[propName] = form;\n }\n else {\n $scope.form = form;\n }\n };\n\n // Useful method for modal to get input parameters\n $scope.getParameters = function () {\n return parameters;\n };\n\n $scope.$on('modal.hidden', function () {\n // If not resolved yet: send result\n // (after animation out)\n if (!$scope.resolved) {\n $scope.resolved = true;\n\n $timeout(function() {\n $scope.deferred.resolve();\n return $scope.modal.remove();\n }, ($scope.modal.hideDelay || 320) + 20);\n }\n });\n }\n\n function show(templateUrl, controller, parameters, options) {\n var deferred = $q.defer();\n\n options = options ? options : {} ;\n options.animation = options.animation || 'slide-in-up';\n\n // If modal has a controller\n if (controller) {\n // If a controller defined, always use a new scope\n options.scope = options.scope ? options.scope.$new() : $rootScope.$new();\n DefaultModalController.call({}, options.scope, deferred, parameters);\n\n // Invoke the controller on this new scope\n var locals = { '$scope': options.scope, 'parameters': parameters };\n var ctrlEval = _evalController(controller);\n var ctrlInstance = $controller(controller, locals);\n if (ctrlEval.isControllerAs) {\n ctrlInstance.openModal = options.scope.openModal;\n ctrlInstance.closeModal = options.scope.closeModal;\n }\n }\n\n $ionicModal.fromTemplateUrl(templateUrl, options)\n .then(function (modal) {\n if (controller) {\n // Set modal into the controller's scope\n modal.scope.$parent.modal = modal;\n }\n else {\n var scope = modal.scope;\n // Define default scope functions\n DefaultModalController.call({}, scope, deferred, parameters);\n // Set modal\n scope.modal = modal;\n }\n\n // Show the modal\n return modal.show();\n },\n function (err) {\n deferred.reject(err);\n });\n\n return deferred.promise;\n }\n\n return {\n show: show\n };\n}])\n\n.factory('Modals', ['ModalUtils', function(ModalUtils) {\n 'ngInject';\n\n\n function showTransfer(parameters) {\n return ModalUtils.show('templates/wallet/modal_transfer.html','TransferModalCtrl',\n parameters, {focusFirstInput: true});\n }\n\n function showLogin(options) {\n var parameters = angular.copy(options||{});\n delete parameters.templateUrl;\n delete parameters.controller;\n return ModalUtils.show(\n options && options.templateUrl || 'templates/login/modal_login.html',\n options && options.controller || 'LoginModalCtrl',\n parameters, {focusFirstInput: true});\n }\n\n function showWotLookup(parameters) {\n return ModalUtils.show('templates/wot/modal_lookup.html','WotLookupModalCtrl',\n parameters || {}, {focusFirstInput: true});\n }\n\n function showNetworkLookup(parameters) {\n return ModalUtils.show('templates/network/modal_network.html', 'NetworkLookupModalCtrl',\n parameters, {focusFirstInput: true});\n }\n\n function showAbout(parameters) {\n return ModalUtils.show('templates/modal_about.html','AboutModalCtrl',\n parameters);\n }\n\n function showAccountSecurity(parameters) {\n return ModalUtils.show('templates/wallet/modal_security.html', 'WalletSecurityModalCtrl',\n parameters);\n }\n\n function showJoin(parameters) {\n return ModalUtils.show('templates/join/modal_join.html','JoinModalCtrl',\n parameters);\n }\n\n function showHelp(parameters) {\n return ModalUtils.show('templates/help/modal_help.html','HelpModalCtrl',\n parameters);\n }\n\n\n return {\n showTransfer: showTransfer,\n showLogin: showLogin,\n showWotLookup: showWotLookup,\n showNetworkLookup: showNetworkLookup,\n showAbout: showAbout,\n showJoin: showJoin,\n showHelp: showHelp,\n showAccountSecurity: showAccountSecurity\n };\n\n}]);\n","angular.module('cesium.http.services', ['cesium.cache.services'])\n\n.factory('csHttp', ['$http', '$q', '$timeout', '$window', 'csSettings', 'csCache', 'Device', function($http, $q, $timeout, $window, csSettings, csCache, Device) {\n 'ngInject';\n\n var timeout = csSettings.data.timeout;\n\n var\n sockets = [],\n defaultCachePrefix = 'csHttp-',\n allCachePrefixes = {},\n regexp = {\n POSITIVE_INTEGER: /^\\d+$/,\n VERSION_PART_REGEXP: /^[0-9]+|alpha[0-9]+|beta[0-9]+|rc[0-9]+|[0-9]+-SNAPSHOT$/\n }\n ;\n\n if (!timeout) {\n timeout=4000; // default\n }\n\n function getServer(host, port) {\n // Remove port if 80 or 443\n return !host ? null : (host + (port && port != 80 && port != 443 ? ':' + port : ''));\n }\n\n function getUrl(host, port, path, useSsl) {\n var protocol = (port == 443 || useSsl) ? 'https' : 'http';\n return protocol + '://' + getServer(host, port) + (path ? path : '');\n }\n\n function getWsUrl(host, port, path, useSsl) {\n var protocol = (port == 443 || useSsl) ? 'wss' : 'ws';\n return protocol + '://' + getServer(host, port) + (path ? path : '');\n }\n\n function processError(reject, data, url, status) {\n if (data && data.message) {\n reject(data);\n }\n else {\n if (status == 403) {\n reject({ucode: 403, message: 'Resource is forbidden' + (url ? ' ('+url+')' : '')});\n }\n else if (status == 404) {\n reject({ucode: 404, message: 'Resource not found' + (url ? ' ('+url+')' : '')});\n }\n else if (data && data.error) {\n reject({status: status, message: data.error});\n }\n else if (url) {\n console.error('[http] Get HTTP error {status: ' + status + '} on [' + url + ']');\n reject('Error while requesting [' + url + ']');\n }\n else {\n reject('Unknown error from node');\n }\n }\n }\n\n function prepare(url, params, config, callback) {\n var pkeys = [], queryParams = {}, newUri = url;\n if (typeof params === 'object') {\n pkeys = _.keys(params);\n }\n\n _.forEach(pkeys, function(pkey){\n var prevURI = newUri;\n newUri = newUri.replace(':' + pkey, params[pkey]);\n if (prevURI === newUri) {\n queryParams[pkey] = params[pkey];\n }\n });\n config.params = queryParams;\n return callback(newUri, config);\n }\n\n function getResource(host, port, path, useSsl, forcedTimeout) {\n // Make sure host is defined - fix #537\n if (!host) {\n return $q.reject('[http] invalid URL from host: ' + host);\n }\n var url = getUrl(host, port, path, useSsl);\n return function(params) {\n return $q(function(resolve, reject) {\n var config = {\n timeout: forcedTimeout || timeout,\n responseType: 'json'\n };\n\n prepare(url, params, config, function(url, config) {\n $http.get(url, config)\n .success(function(data, status, headers, config) {\n resolve(data);\n })\n .error(function(data, status, headers, config) {\n processError(reject, data, url, status);\n });\n });\n });\n };\n }\n\n function getResourceWithCache(host, port, path, useSsl, maxAge, autoRefresh, forcedTimeout, cachePrefix) {\n var url = getUrl(host, port, path, useSsl);\n cachePrefix = cachePrefix || defaultCachePrefix;\n maxAge = maxAge || csCache.constants.LONG;\n allCachePrefixes[cachePrefix] = true;\n\n //console.debug('[http] will cache ['+url+'] ' + maxAge + 'ms' + (autoRefresh ? ' with auto-refresh' : ''));\n\n return function(params) {\n return $q(function(resolve, reject) {\n var config = {\n timeout: forcedTimeout || timeout,\n responseType: 'json'\n };\n if (autoRefresh) { // redo the request if need\n config.cache = csCache.get(cachePrefix, maxAge, function (key, value, done) {\n console.debug('[http] Refreshing cache for {{0}} '.format(key));\n $http.get(key, config)\n .success(function (data) {\n config.cache.put(key, data);\n if (done) done(key, data);\n });\n });\n }\n else {\n config.cache = csCache.get(cachePrefix, maxAge);\n }\n\n prepare(url, params, config, function(url, config) {\n $http.get(url, config)\n .success(function(data) {\n resolve(data);\n })\n .error(function(data, status) {\n processError(reject, data, url, status);\n });\n });\n });\n };\n }\n\n function postResource(host, port, path, useSsl, forcedTimeout) {\n var url = getUrl(host, port, path, useSsl);\n return function(data, params) {\n return $q(function(resolve, reject) {\n var config = {\n timeout: forcedTimeout || timeout,\n headers : {'Content-Type' : 'application/json;charset=UTF-8'}\n };\n\n prepare(url, params, config, function(url, config) {\n $http.post(url, data, config)\n .success(function(data) {\n resolve(data);\n })\n .error(function(data, status) {\n processError(reject, data, url, status);\n });\n });\n });\n };\n }\n\n function ws(host, port, path, useSsl, timeout) {\n if (!path) {\n console.error('calling csHttp.ws without path argument');\n throw 'calling csHttp.ws without path argument';\n }\n var uri = getWsUrl(host, port, path, useSsl);\n timeout = timeout || csSettings.data.timeout;\n\n function _waitOpen(self) {\n if (!self.delegate) {\n throw new Error('Websocket {0} was closed!'.format(uri));\n }\n if (self.delegate.readyState == 1) {\n return $q.when(self.delegate);\n }\n if (self.delegate.readyState == 3) {\n return $q.reject('Unable to connect to websocket ['+self.delegate.url+']');\n }\n\n if (self.waitDuration >= timeout) {\n self.waitRetryDelay = self.waitRetryDelay && Math.min(self.waitRetryDelay + 2000, 30000) || 2000; // add 2 seconds, until 30s)\n console.debug(\"[http] Will retry websocket [{0}] in {1}s...\".format(self.path, Math.round(self.waitRetryDelay/1000)));\n }\n else if (Math.round(self.waitDuration / 1000) % 10 === 0){\n console.debug('[http] Waiting websocket ['+self.path+']...');\n }\n\n return $timeout(function(){\n self.waitDuration += self.waitRetryDelay;\n return _waitOpen(self);\n }, self.waitRetryDelay);\n }\n\n function _open(self, callback, params) {\n if (!self.delegate) {\n self.path = path;\n self.callbacks = [];\n self.waitDuration = 0;\n self.waitRetryDelay = 200;\n\n prepare(uri, params, {}, function(uri) {\n self.delegate = new WebSocket(uri);\n self.delegate.onerror = function(e) {\n self.delegate.readyState=3;\n };\n self.delegate.onmessage = function(e) {\n var obj = JSON.parse(e.data);\n _.forEach(self.callbacks, function(callback) {\n callback(obj);\n });\n };\n self.delegate.onopen = function(e) {\n console.debug('[http] Listening on websocket ['+self.path+']...');\n sockets.push(self);\n self.delegate.openTime = Date.now();\n };\n self.delegate.onclose = function(closeEvent) {\n\n // Remove from sockets arrays\n var index = _.findIndex(sockets, function(socket){return socket.path === self.path;});\n if (index >= 0) {\n sockets.splice(index,1);\n }\n\n // If close event comes from Cesium\n if (self.delegate.closing) {\n self.delegate = null;\n }\n\n // If unexpected close event, reopen the socket (fix #535)\n else {\n if (self.delegate.openTime) {\n console.debug('[http] Unexpected close of websocket [{0}] (open {1} ms ago): re-opening...', path, (Date.now() - self.delegate.openTime));\n\n // Force new connection\n self.delegate = null;\n\n // Loop, but without the already registered callback\n _open(self, null, params);\n }\n else if (closeEvent) {\n console.debug('[http] Unexpected close of websocket [{0}]: error code: '.format(path), closeEvent && closeEvent.code || closeEvent);\n\n // Force new connection\n self.delegate = null;\n\n // Loop, but without the already registered callback\n _open(self, null, params);\n }\n }\n };\n });\n }\n\n if (callback) self.callbacks.push(callback);\n return _waitOpen(self);\n }\n\n function _close(self) {\n if (self.delegate) {\n self.delegate.closing = true;\n console.debug('[http] Closing websocket ['+self.path+']...');\n self.delegate.close();\n self.callbacks = [];\n if (self.onclose) self.onclose();\n }\n }\n\n function _remove(self, callback) {\n self.callbacks = _.reject(self.callbacks, function(item) {\n return item === callback;\n });\n if (!self.callbacks.length) {\n _close(self);\n }\n }\n\n return {\n open: function(params) {\n return _open(this, null, params);\n },\n on: function(callback, params) {\n return _open(this, callback, params);\n },\n onListener: function(callback, params) {\n var self = this;\n _open(self, callback, params);\n return function() {\n _remove(self, callback);\n };\n },\n send: function(data) {\n var self = this;\n return _waitOpen(self)\n .then(function(){\n if (self.delegate) self.delegate.send(data);\n });\n },\n close: function() {\n var self = this;\n _close(self);\n },\n isClosed: function() {\n var self = this;\n return !self.delegate || self.delegate.closing;\n }\n };\n }\n\n function closeAllWs() {\n if (sockets.length > 0) {\n console.debug('[http] Closing all websocket...');\n _.forEach(sockets, function(sock) {\n sock.close();\n });\n sockets = []; // Reset socks list\n }\n }\n\n // See doc : https://gist.github.com/jlong/2428561\n function parseUri(uri) {\n var protocol, hostname;\n\n // G1 URI (see G1lien)\n if (uri.startsWith('june:') || uri.startsWith('web+june:')) {\n protocol = 'june:';\n var path = uri.replace(/^(web\\+june|june):(\\/\\/)?/, '');\n\n // Store hostname here, because parse will apply a lowercase\n hostname = path;\n if (hostname.indexOf('/') !== -1) {\n hostname = hostname.substr(0, path.indexOf('/'));\n }\n if (hostname.indexOf('?') !== -1) {\n hostname = hostname.substr(0, path.indexOf('?'));\n }\n uri = 'http://' + path;\n }\n\n // Use a <a> element to parse\n var parser = document.createElement('a');\n parser.href = uri;\n\n var pathname = parser.pathname;\n if (pathname && pathname.startsWith('/')) {\n pathname = pathname.substring(1);\n }\n\n var searchParams;\n if (parser.search && parser.search.startsWith('?')) {\n searchParams = parser.search.substr(1).split('&')\n .reduce(function(res, searchParam) {\n if (searchParam.indexOf('=') !== -1) {\n var key = searchParam.substr(0, searchParam.indexOf('='));\n var value = searchParam.substr(searchParam.indexOf('=') + 1);\n res[key] = value;\n }\n else {\n res[searchParam] = true; // default value\n }\n return res;\n }, {});\n }\n\n var result = {\n protocol: protocol ? protocol : parser.protocol,\n hostname: hostname ? hostname : parser.hostname,\n host: parser.host,\n port: parser.port,\n username: parser.username,\n password: parser.password,\n pathname: pathname,\n pathSegments: pathname ? pathname.split('/') : [],\n search: parser.search,\n searchParams: searchParams,\n hash: parser.hash\n };\n parser.remove();\n return result;\n }\n\n /**\n * Open a URI (url, email, phone, ...)\n * @param event\n * @param link\n * @param type\n */\n function openUri(uri, options) {\n options = options || {};\n\n if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n var parts = parseUri(uri);\n\n if (!parts.protocol && options.type) {\n parts.protocol = (options.type === 'email') ? 'mailto:' :\n ((options.type === 'phone') ? 'tel:' : '');\n uri = parts.protocol + uri;\n }\n\n // On desktop, open into external tool\n if (parts.protocol === 'mailto:' && Device.isDesktop()) {\n try {\n nw.Shell.openExternal(uri);\n return;\n }\n catch(err) {\n console.error(\"[http] Failed not open 'mailto:' URI into external tool.\");\n }\n }\n\n // Check if device is enable, on special tel: or mailto: protocol\n var validProtocol = (Device.enable && (parts.protocol === 'mailto:' || parts.protocol === 'tel:')) ||\n // Allow G1 link\n (parts.protocol === 'june:' || 'web+june:' );\n if (!validProtocol) {\n if (options.onError && typeof options.onError === 'function') {\n options.onError(uri);\n }\n return;\n }\n }\n\n // Note: If device enable, then target=_system will use InAppBrowser cordova plugin\n var openTarget = (options.target || (Device.enable ? '_system' : '_blank'));\n\n // If desktop, try to open into external browser\n if (openTarget === '_blank' || openTarget === '_system' && Device.isDesktop()) {\n try {\n nw.Shell.openExternal(uri);\n return;\n }\n catch(err) {\n console.error(\"[http] Failed not open URI into external browser.\");\n }\n }\n\n // If desktop, should always open in new window (no tabs)\n var openOptions;\n if (openTarget === '_blank' && Device.isDesktop()) {\n\n if (nw && nw.Shell) {\n nw.Shell.openExternal(uri);\n return false;\n }\n // Override default options\n openOptions= \"location=1,titlebar=1,status=1,menubar=1,toolbar=1,resizable=1,scrollbars=1\";\n // Add width/height\n if ($window.screen && $window.screen.width && $window.screen.height) {\n openOptions += \",width={0},height={1}\".format(Math.trunc($window.screen.width/2), Math.trunc($window.screen.height/2));\n }\n }\n\n var win = $window.open(uri,\n openTarget,\n openOptions);\n\n // Center the opened window\n if (openOptions && $window.screen && $window.screen.width && $window.screen.height) {\n win.moveTo($window.screen.width/2/2, $window.screen.height/2/2);\n win.focus();\n }\n\n }\n\n // Get time in second (UTC)\n function getDateNow() {\n return moment().utc().unix();\n }\n\n function isPositiveInteger(x) {\n // http://stackoverflow.com/a/1019526/11236\n return /^\\d+$/.test(x);\n }\n\n /**\n * Compare two software version numbers (e.g. 1.7.1)\n * Returns:\n *\n * 0 if they're identical\n * negative if v1 < v2\n * positive if v1 > v2\n * Nan if they in the wrong format\n *\n * E.g.:\n *\n * assert(version_number_compare(\"1.7.1\", \"1.6.10\") > 0);\n * assert(version_number_compare(\"1.7.1\", \"1.7.10\") < 0);\n *\n * \"Unit tests\": http://jsfiddle.net/ripper234/Xv9WL/28/\n *\n * Taken from http://stackoverflow.com/a/6832721/11236\n */\n function compareVersionNumbers(v1, v2){\n var v1parts = v1.split('.');\n var v2parts = v2.split('.');\n\n // First, validate both numbers are true version numbers\n function validateParts(parts) {\n for (var i = 0; i < parts.length; i++) {\n var isNumber = regexp.POSITIVE_INTEGER.test(parts[i]);\n // First part MUST be an integer\n if (i === 0 && !isNumber) return false;\n // If not integer, should be 'alpha', 'beta', etc.\n if (!isNumber && !regexp.VERSION_PART_REGEXP.test(parts[i])) return false;\n\n // Convert string to int (need by compare operators)\n if (isNumber) parts[i] = parseInt(parts[i]);\n }\n return true;\n }\n if (!validateParts(v1parts) || !validateParts(v2parts)) {\n return NaN;\n }\n\n for (var i = 0; i < v1parts.length; ++i) {\n if (v2parts.length === i) {\n return 1;\n }\n\n if (v1parts[i] === v2parts[i]) {\n continue;\n }\n if (v1parts[i] > v2parts[i]) {\n return 1;\n }\n return -1;\n }\n\n if (v1parts.length != v2parts.length) {\n return -1;\n }\n\n return 0;\n }\n\n function isVersionCompatible(minVersion, actualVersion) {\n console.debug('[http] Checking actual version [{0}] is compatible with min expected version [{1}]'.format(actualVersion, minVersion));\n return compareVersionNumbers(minVersion, actualVersion) <= 0;\n }\n\n function clearCache(cachePrefix) {\n cachePrefix = cachePrefix || defaultCachePrefix;\n console.debug(\"[http] Cleaning cache {prefix: '{0}'}...\".format(cachePrefix));\n csCache.clear(cachePrefix);\n }\n\n function clearAllCache() {\n console.debug('[http] Cleaning all caches...');\n _.keys(allCachePrefixes).forEach(function(cachePrefix) {\n csCache.clear(cachePrefix);\n });\n }\n\n return {\n get: getResource,\n getWithCache: getResourceWithCache,\n post: postResource,\n ws: ws,\n closeAllWs: closeAllWs,\n getUrl : getUrl,\n getServer: getServer,\n uri: {\n parse: parseUri,\n open: openUri\n },\n date: {\n now: getDateNow\n },\n version: {\n compare: compareVersionNumbers,\n isCompatible: isVersionCompatible\n },\n cache: angular.merge({\n clear: clearCache,\n clearAll: clearAllCache\n }, csCache.constants)\n };\n}])\n;\n","angular.module('cesium.storage.services', [ 'cesium.config'])\n\n\n .factory('sessionStorage', ['$window', '$q', function($window, $q) {\n 'ngInject';\n\n var\n exports = {\n storage: $window.sessionStorage || {}\n };\n\n exports.put = function(key, value) {\n exports.storage[key] = value;\n return $q.when();\n };\n\n exports.get = function(key, defaultValue) {\n return $q.when(exports.storage[key] || defaultValue);\n };\n\n exports.setObject = function(key, value) {\n exports.storage[key] = JSON.stringify(value);\n return $q.when();\n };\n\n exports.getObject = function(key) {\n return $q.when(JSON.parse(exports.storage[key] || 'null'));\n };\n\n return exports;\n }])\n\n .factory('localStorage', ['$window', '$q', '$log', 'sessionStorage', function($window, $q, $log, sessionStorage) {\n 'ngInject';\n\n var\n appName = \"Cesium\",\n started = false,\n startPromise,\n isDevice = true, // default for device (override later)\n exports = {\n standard: {\n storage: null\n },\n secure: {\n storage: null\n }\n };\n\n // removeIf(device)\n // Use this workaround to avoid to wait ionicReady() event\n isDevice = false;\n // endRemoveIf(device)\n\n /* -- Use standard browser implementation -- */\n\n exports.standard.put = function(key, value) {\n if (angular.isDefined(value) && value != null) {\n exports.standard.storage[key] = value;\n }\n else {\n exports.standard.storage.removeItem(key);\n }\n return $q.when();\n };\n\n exports.standard.get = function(key, defaultValue) {\n return $q.when(exports.standard.storage[key] || defaultValue);\n };\n\n exports.standard.setObject = function(key, value) {\n exports.standard.storage[key] = JSON.stringify(value);\n return $q.when();\n };\n\n exports.standard.getObject = function(key) {\n return $q.when(JSON.parse(exports.standard.storage[key] || 'null'));\n };\n\n /* -- Use secure storage (using a cordova plugin) -- */\n\n // Set a value to the secure storage (or remove if value is not defined)\n exports.secure.put = function(key, value) {\n return $q(function(resolve, reject) {\n if (value !== undefined && value !== null) {\n exports.secure.storage.set(\n function (key) {\n resolve();\n },\n function (err) {\n $log.error(err);\n reject(err);\n },\n key, value);\n }\n // Remove\n else {\n exports.secure.storage.remove(\n function () {\n resolve();\n },\n function (err) {\n $log.error(err);\n resolve(); // Error = not found\n },\n key);\n }\n });\n };\n\n // Get a value from the secure storage\n exports.secure.get = function(key, defaultValue) {\n return $q(function(resolve, reject) {\n exports.secure.storage.get(\n function (value) {\n if (!value && defaultValue) {\n resolve(defaultValue);\n }\n else {\n resolve(value);\n }\n },\n function (err) {\n $log.error(err);\n resolve(); // Error = not found\n },\n key);\n });\n };\n\n // Set a object to the secure storage\n exports.secure.setObject = function(key, value) {\n $log.debug(\"[storage] Setting object into secure storage, using key=\" + key);\n return $q(function(resolve, reject){\n exports.secure.storage.set(\n resolve,\n reject,\n key,\n value ? JSON.stringify(value) : undefined);\n });\n };\n\n // Get a object from the secure storage\n exports.secure.getObject = function(key) {\n $log.debug(\"[storage] Getting object from secure storage, using key=\" + key);\n return $q(function(resolve, reject){\n exports.secure.storage.get(\n function(value) {resolve(JSON.parse(value||'null'));},\n function(err) {\n $log.error(err);\n resolve(); // Error = not found\n },\n key);\n });\n };\n\n function initStandardStorage() {\n // use local browser storage\n if ($window.localStorage) {\n console.debug('[storage] Starting {local} storage...');\n exports.standard.storage = $window.localStorage;\n // Set standard storage as default\n _.forEach(_.keys(exports.standard), function(key) {\n exports[key] = exports.standard[key];\n });\n }\n\n // Fallback to session storage (locaStorage could have been disabled on some browser)\n else {\n console.debug('[storage] Starting {session} storage...');\n // Set standard storage as default\n _.forEach(_.keys(sessionStorage), function(key) {\n exports[key] = sessionStorage[key];\n });\n }\n return $q.when();\n }\n\n function initSecureStorage() {\n console.debug('[storage] Starting {secure} storage...');\n // Set secure storage as default\n _.forEach(_.keys(exports.secure), function(key) {\n exports[key] = exports.secure[key];\n });\n\n var deferred = $q.defer();\n\n // No secure storage plugin: fall back to standard storage\n if (!cordova.plugins || !cordova.plugins.SecureStorage) {\n initStandardStorage();\n deferred.resolve();\n }\n else {\n\n exports.secure.storage = new cordova.plugins.SecureStorage(\n function () {\n deferred.resolve();\n },\n function (err) {\n console.error('[storage] Could not use secure storage. Will use standard.', err);\n initStandardStorage();\n deferred.resolve();\n },\n appName);\n }\n return deferred.promise;\n }\n\n exports.isStarted = function() {\n return started;\n };\n\n exports.ready = function() {\n if (started) return $q.when();\n return startPromise || start();\n };\n\n function start() {\n if (startPromise) return startPromise;\n\n var now = Date.now();\n\n // Use Cordova secure storage plugin\n if (isDevice) {\n startPromise = initSecureStorage();\n }\n\n // Use default browser local storage\n else {\n startPromise = initStandardStorage();\n }\n\n return startPromise\n .then(function() {\n console.debug('[storage] Started in ' + (Date.now() - now) + 'ms');\n started = true;\n startPromise = null;\n });\n }\n\n // default action\n start();\n\n return exports;\n }])\n\n\n;\n","\nangular.module('cesium.device.services', ['cesium.utils.services', 'cesium.settings.services'])\n\n .factory('Device', ['$rootScope', '$translate', '$ionicPopup', '$q', 'Api', 'ionicReady', function($rootScope, $translate, $ionicPopup, $q, Api,\n ionicReady) {\n 'ngInject';\n\n var\n CONST = {\n MAX_HEIGHT: 400,\n MAX_WIDTH: 400\n },\n that = this,\n api = new Api(this, \"Device\"),\n exports = {\n // workaround to quickly no is device or not (even before the ready() event)\n enable: true\n },\n cache = {},\n started = false,\n startPromise;\n\n // removeIf(device)\n // workaround to quickly no is device or not (even before the ready() event)\n exports.enable = false;\n // endRemoveIf(device)\n\n function getPicture(options) {\n if (!exports.camera.enable) {\n return $q.reject(\"Camera not enable. Please call 'ionicReady()' once before use (e.g in app.js).\");\n }\n\n // Options is the sourceType by default\n if (options && (typeof options === \"string\")) {\n options = {\n sourceType: options\n };\n }\n options = options || {};\n\n // Make sure a source type has been given (if not, ask user)\n if (angular.isUndefined(options.sourceType)) {\n return $translate(['SYSTEM.PICTURE_CHOOSE_TYPE', 'SYSTEM.BTN_PICTURE_GALLERY', 'SYSTEM.BTN_PICTURE_CAMERA'])\n .then(function(translations){\n return $ionicPopup.show({\n title: translations['SYSTEM.PICTURE_CHOOSE_TYPE'],\n buttons: [\n {\n text: translations['SYSTEM.BTN_PICTURE_GALLERY'],\n type: 'button',\n onTap: function(e) {\n return navigator.camera.PictureSourceType.PHOTOLIBRARY;\n }\n },\n {\n text: translations['SYSTEM.BTN_PICTURE_CAMERA'],\n type: 'button button-positive',\n onTap: function(e) {\n return navigator.camera.PictureSourceType.CAMERA;\n }\n }\n ]\n })\n .then(function(sourceType){\n console.info('[camera] User select sourceType:' + sourceType);\n options.sourceType = sourceType;\n return exports.camera.getPicture(options);\n });\n });\n }\n\n options.quality = options.quality || 50;\n options.destinationType = options.destinationType || navigator.camera.DestinationType.DATA_URL;\n options.encodingType = options.encodingType || navigator.camera.EncodingType.PNG;\n options.targetWidth = options.targetWidth || CONST.MAX_WIDTH;\n options.targetHeight = options.targetHeight || CONST.MAX_HEIGHT;\n return $cordovaCamera.getPicture(options);\n }\n\n function scan(n) {\n if (!exports.enable) {\n return $q.reject(\"Barcode scanner not enable. Please call 'ionicReady()' once before use (e.g in app.js).\");\n }\n var deferred = $q.defer();\n cordova.plugins.barcodeScanner.scan(\n function(result) {\n if (!result.cancelled) {\n console.debug('[device] barcode scanner scan: ' + result.text);\n deferred.resolve(result.text); // make sure to convert into String\n }\n else {\n console.debug('[device] barcode scanner scan: CANCELLED');\n deferred.resolve();\n }\n },\n function(err) {\n console.error('[device] Error while using barcode scanner: ' + err);\n deferred.reject(err);\n },\n n);\n return deferred.promise;\n }\n\n function copy(text, callback) {\n if (!exports.enable) {\n return $q.reject('Device disabled');\n }\n var deferred = $q.defer();\n $cordovaClipboard\n .copy(text)\n .then(function () {\n // success\n if (callback) {\n callback();\n }\n deferred.resolve();\n }, function () {\n // error\n deferred.reject({message: 'ERROR.COPY_CLIPBOARD'});\n });\n return deferred.promise;\n }\n\n exports.clipboard = {copy: copy};\n exports.camera = {\n getPicture : getPicture,\n scan: function(n){\n console.warn('Deprecated use of Device.camera.scan(). Use Device.barcode.scan() instead');\n return scan(n);\n }\n };\n exports.barcode = {\n enable : false,\n scan: scan\n };\n exports.keyboard = {\n enable: false,\n close: function() {\n if (!exports.keyboard.enable) return;\n cordova.plugins.Keyboard.close();\n }\n };\n\n function getLastIntent() {\n var deferred = $q.defer();\n window.plugins.launchmyapp.getLastIntent(\n deferred.resolve,\n deferred.reject);\n return deferred.promise;\n }\n\n // WARN: Need by cordova-plugin-customurlscheme\n window.handleOpenURL = function(intent) {\n if (intent) {\n console.info('[device] Received new intent: ', intent);\n cache.lastIntent = intent; // Remember, for last()\n api.intent.raise.new(intent);\n }\n };\n\n exports.intent = {\n enable: false,\n last: function() {\n return $q.when(cache.lastIntent);\n },\n clear: function() {\n cache.lastIntent = undefined;\n }\n };\n\n // Numerical keyboard - fix #30\n exports.keyboard.digit = {\n settings: {\n bindModel: function(modelScope, modelPath, settings) {\n settings = settings || {};\n modelScope = modelScope || $rootScope;\n var getModelValue = function() {\n return (modelPath||'').split('.').reduce(function(res, path) {\n return res ? res[path] : undefined;\n }, modelScope);\n };\n var setModelValue = function(value) {\n var paths = (modelPath||'').split('.');\n var property = paths.length && paths[paths.length-1];\n paths.reduce(function(res, path) {\n if (path == property) {\n res[property] = value;\n return;\n }\n return res[path];\n }, modelScope);\n };\n\n settings.animation = settings.animation || 'pop';\n settings.action = settings.action || function(number) {\n setModelValue((getModelValue() ||'') + number);\n };\n if (settings.decimal) {\n settings.decimalSeparator = settings.decimalSeparator || '.';\n settings.leftButton = {\n html: '<span>.</span>',\n action: function () {\n var text = getModelValue() || '';\n // only one '.' allowed\n if (text.indexOf(settings.decimalSeparator) >= 0) return;\n // Auto add zero when started with '.'\n if (!text.trim().length) {\n text = '0';\n }\n setModelValue(text + settings.decimalSeparator);\n }\n };\n }\n settings.rightButton = settings.rightButton || {\n html: '<i class=\"icon ion-backspace-outline\"></i>',\n action: function() {\n var text = getModelValue();\n if (text && text.length) {\n text = text.slice(0, -1);\n setModelValue(text);\n }\n }\n };\n return settings;\n }\n }\n };\n\n exports.isIOS = function() {\n return !!navigator.userAgent.match(/iPhone | iPad | iPod/i) || ionic.Platform.isIOS();\n };\n\n exports.isOSX = function() {\n return !!navigator.userAgent.match(/Macintosh/i) || ionic.Platform.is(\"osx\");\n };\n\n exports.isDesktop = function() {\n if (!angular.isDefined(cache.isDesktop)) {\n try {\n // Should have NodeJs and NW\n cache.isDesktop = !exports.enable && !!process && !!nw && !!nw.App;\n } catch (err) {\n cache.isDesktop = false;\n }\n }\n return cache.isDesktop;\n };\n\n exports.isWeb = function() {\n return !exports.enable && !exports.isDesktop();\n };\n\n exports.isMobile = function() {\n return exports.enable;\n };\n\n exports.ready = function() {\n if (started) return $q.when();\n return startPromise || exports.start();\n };\n\n exports.start = function() {\n\n startPromise = ionicReady()\n .then(function(){\n\n exports.enable = window.cordova && cordova && cordova.plugins;\n\n if (exports.enable){\n exports.camera.enable = !!navigator.camera;\n exports.keyboard.enable = cordova && cordova.plugins && !!cordova.plugins.Keyboard;\n exports.barcode.enable = cordova && cordova.plugins && !!cordova.plugins.barcodeScanner && !exports.isOSX();\n exports.clipboard.enable = cordova && cordova.plugins && !!cordova.plugins.clipboard;\n exports.intent.enable = window && !!window.plugins.launchmyapp;\n\n if (exports.keyboard.enable) {\n angular.extend(exports.keyboard, cordova.plugins.Keyboard);\n }\n\n console.debug('[device] Ionic platform ready, with {camera: {0}, barcode: {1}, keyboard: {2}, clipboard: {3}, intent: {4}}'\n .format(exports.camera.enable, exports.barcode.enable, exports.keyboard.enable, exports.clipboard.enable, exports.intent.enable));\n\n if (cordova.InAppBrowser) {\n console.debug('[device] Enabling InAppBrowser');\n window.open = cordova.InAppBrowser.open;\n }\n }\n else {\n console.debug('[device] Ionic platform ready - no device detected.');\n }\n\n started = true;\n startPromise = null;\n });\n\n return startPromise;\n };\n\n api.registerEvent('intent', 'new');\n\n // Export the event api (see ngApi)\n exports.api = api;\n\n return exports;\n }])\n\n ;\n","\nangular.module('cesium.currency.services', ['ngApi', 'cesium.bma.services'])\n\n.factory('csCurrency', ['$rootScope', '$q', '$timeout', 'BMA', 'Api', 'csSettings', function($rootScope, $q, $timeout, BMA, Api, csSettings) {\n 'ngInject';\n\n function factory(id, BMA) {\n var\n constants = {\n // Avoid to many call on well known currencies\n WELL_KNOWN_CURRENCIES: {\n g1: {\n firstBlockTime: 1488987127,\n medianTimeOffset: 3600\n }\n }\n },\n\n data = {},\n started = false,\n startPromise,\n listeners,\n api = new Api(this, \"csCurrency-\" + id);\n\n function powBase(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n }\n\n function resetData() {\n data.name = null;\n data.parameters = null;\n data.firstBlockTime = null;\n data.membersCount = null;\n data.cache = {};\n data.node = BMA;\n data.currentUD = null;\n data.medianTimeOffset = 0;\n started = false;\n startPromise = undefined;\n api.data.raise.reset(data);\n }\n\n function loadData() {\n\n // Load currency from default node\n return $q.all([\n\n // get parameters\n loadParameters()\n .then(function(parameters) {\n // load first block info\n return loadFirstBlock(parameters.currency);\n }),\n\n // get current UD\n loadCurrentUD(),\n\n // call extensions\n api.data.raisePromise.load(data)\n ])\n .catch(function(err) {\n resetData();\n throw err;\n });\n }\n\n function loadParameters() {\n return BMA.blockchain.parameters()\n .then(function(res){\n data.name = res.currency;\n data.parameters = res;\n data.medianTimeOffset = res.avgGenTime * res.medianTimeBlocks / 2;\n return res;\n });\n }\n\n function loadFirstBlock(currencyName) {\n // Well known currencies\n if (constants.WELL_KNOWN_CURRENCIES[currencyName]){\n angular.merge(data, constants.WELL_KNOWN_CURRENCIES[currencyName]);\n return $q.when();\n }\n\n return BMA.blockchain.block({block:0})\n .then(function(json) {\n // Need by graph plugin\n data.firstBlockTime = json.medianTime;\n })\n .catch(function(err) {\n // Special case, when currency not started yet\n if (err && err.ucode === BMA.errorCodes.BLOCK_NOT_FOUND) {\n data.firstBlockTime = 0;\n data.initPhase = true;\n console.warn('[currency] Blockchain not launched: Enable init phase mode');\n return;\n }\n throw err;\n });\n }\n\n function loadCurrentUD() {\n return BMA.blockchain.stats.ud()\n .then(function(res) {\n // Special case for currency init\n if (!res.result.blocks.length) {\n data.currentUD = data.parameters ? data.parameters.ud0 : -1;\n return data.currentUD ;\n }\n return _safeLoadCurrentUD(res, res.result.blocks.length - 1);\n })\n .catch(function(err) {\n data.currentUD = null;\n throw err;\n });\n }\n\n /**\n * Load the last UD, with a workaround if last block with UD is not found in the node\n * @param res\n * @param blockIndex\n * @returns {*}\n * @private\n */\n function _safeLoadCurrentUD(res, blockIndex) {\n // Special case for currency init\n if (!res.result.blocks.length || blockIndex < 0) {\n data.currentUD = data.parameters ? data.parameters.ud0 : -1;\n return data.currentUD ;\n }\n else {\n var lastBlockWithUD = res.result.blocks[blockIndex];\n return BMA.blockchain.block({ block: lastBlockWithUD })\n .then(function(block){\n data.currentUD = powBase(block.dividend, block.unitbase);\n return data.currentUD;\n })\n .catch(function(err) {\n console.error(\"[currency] Unable to load last block with UD, with number {0}\".format(lastBlockWithUD));\n if (blockIndex > 0) {\n console.error(\"[currency] Retrying to load UD from a previous block...\");\n return _safeLoadCurrentUD(res, blockIndex-1);\n }\n data.currentUD = null;\n throw err;\n });\n }\n }\n\n function getData() {\n\n if (started) { // load only once\n return $q.when(data);\n }\n\n // Previous load not finished: return the existing promise - fix #452\n return startPromise || start();\n }\n\n function getDataField(field) {\n return function() {\n if (started) { // load only once\n return $q.when(data[field]);\n }\n\n // Previous load not finished: return the existing promise - fix #452\n return startPromise || start() // load only once\n .then(function(){\n return data[field];\n });\n };\n }\n\n function onBlock(json) {\n var block = new Block(json);\n block.cleanData(); // Remove unused content (arrays...) and keep items count\n\n console.debug('[currency] Received new block [' + block.number + '-' + block.hash + ']');\n\n data.currentBlock = block;\n data.currentBlock.receivedAt = moment().utc().unix();\n\n data.medianTime = block.medianTime;\n data.membersCount = block.membersCount;\n\n // Update UD\n if (block.dividend) {\n data.currentUD = block.dividend;\n }\n\n // Dispatch to extensions\n api.data.raise.newBlock(block);\n }\n\n function addListeners() {\n listeners = [\n // Listen if node changed\n BMA.api.node.on.restart($rootScope, restart, this),\n // open web socket on block\n BMA.websocket.block().onListener(onBlock)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function ready() {\n if (started) return $q.when(data);\n return startPromise || start();\n }\n\n function stop() {\n console.debug('[currency] Stopping...');\n removeListeners();\n resetData();\n }\n\n function restart() {\n stop();\n return $timeout(start, 200);\n }\n\n function start() {\n console.debug('[currency] Starting...');\n var now = Date.now();\n\n startPromise = BMA.ready()\n\n // Load data\n .then(loadData)\n\n // Emit ready event\n .then(function() {\n addListeners();\n\n console.debug('[currency] Started in ' + (Date.now() - now) + 'ms');\n\n started = true;\n startPromise = null;\n\n // Emit event (used by plugins)\n api.data.raise.ready(data);\n })\n .then(function(){\n return data;\n });\n\n return startPromise;\n }\n\n var currentBlockField = getDataField('currentBlock');\n\n function getCurrent(cache) {\n // Get field (and make sure service is started)\n return currentBlockField()\n\n .then(function(currentBlock) {\n\n var now = moment().utc().unix();\n\n if (cache) {\n if (currentBlock && (now - currentBlock.receivedAt) < 60/*1min*/) {\n //console.debug('[currency] Use current block #'+ currentBlock.number +' from cache (age='+ (now - currentBlock.receivedAt) + 's)');\n return currentBlock;\n }\n\n if (!currentBlock) {\n // Should never occur, if websocket /ws/block works !\n console.warn('[currency] No current block in cache: get it from network. Websocket [/ws/block] may not be started ?');\n }\n }\n\n return BMA.blockchain.current()\n .catch(function(err){\n // Special case for currency init (root block not exists): use fixed values\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) {\n return {number: 0, hash: BMA.constants.ROOT_BLOCK_HASH, medianTime: moment().utc().unix()};\n }\n throw err;\n })\n .then(function(current) {\n data.currentBlock = current;\n data.currentBlock.receivedAt = now;\n return current;\n });\n });\n }\n\n function getLastValidBlock() {\n if (csSettings.data.blockValidityWindow <= 0) {\n return getCurrent(true);\n }\n\n return getCurrent(true)\n .then(function(current) {\n var number = current.number - csSettings.data.blockValidityWindow;\n return (number > 0) ? BMA.blockchain.block({block: number}) : current;\n });\n }\n\n // Get time in second (UTC - medianTimeOffset)\n function getDateNow() {\n return moment().utc().unix() - (data.medianTimeOffset || constants.WELL_KNOWN_CURRENCIES.g1.medianTimeOffset);\n }\n\n // TODO register new block event, to get new UD value\n\n // Register extension points\n api.registerEvent('data', 'ready');\n api.registerEvent('data', 'load');\n api.registerEvent('data', 'reset');\n api.registerEvent('data', 'newBlock');\n\n // init data\n resetData();\n\n // Default action\n //start();\n\n return {\n ready: ready,\n start: start,\n stop: stop,\n data: data,\n get: getData,\n name: getDataField('name'),\n parameters: getDataField('parameters'),\n currentUD: getDataField('currentUD'),\n medianTimeOffset: getDataField('medianTimeOffset'),\n blockchain: {\n current: getCurrent,\n lastValid: getLastValidBlock\n },\n date: {\n now: getDateNow\n },\n // api extension\n api: api,\n // deprecated methods\n default: function() {\n console.warn('[currency] \\'csCurrency.default()\\' has been DEPRECATED - Please use \\'csCurrency.get()\\' instead.');\n return getData();\n }\n };\n }\n\n var service = factory('default', BMA);\n service.instance = factory;\n return service;\n}]);\n","//var Base58, Base64, scrypt_module_factory = null, nacl_factory = null;\n\nangular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.settings.services'])\n\n.factory('BMA', ['$q', '$window', '$rootScope', '$timeout', 'Api', 'Device', 'csConfig', 'csSettings', 'csHttp', function($q, $window, $rootScope, $timeout, Api, Device, csConfig, csSettings, csHttp) {\n 'ngInject';\n\n function BMA(host, port, useSsl, useCache) {\n\n var pubkey = \"[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}\";\n var\n // TX output conditions\n SIG = \"SIG\\\\(([0-9a-zA-Z]{43,44})\\\\)\",\n XHX = 'XHX\\\\(([A-F0-9]{1,64})\\\\)',\n CSV = 'CSV\\\\(([0-9]{1,8})\\\\)',\n CLTV = 'CLTV\\\\(([0-9]{1,10})\\\\)',\n OUTPUT_FUNCTION = SIG+'|'+XHX+'|'+CSV+'|'+CLTV,\n OUTPUT_OPERATOR = '(&&)|(\\\\|\\\\|)',\n OUTPUT_FUNCTIONS = OUTPUT_FUNCTION+'([ ]*' + OUTPUT_OPERATOR + '[ ]*' + OUTPUT_FUNCTION +')*',\n OUTPUT_OBJ = 'OBJ\\\\(([0-9]+)\\\\)',\n OUTPUT_OBJ_OPERATOR = OUTPUT_OBJ + '[ ]*' + OUTPUT_OPERATOR + '[ ]*' + OUTPUT_OBJ,\n REGEX_ENDPOINT_PARAMS = \"( ([a-z_][a-z0-9-_.ğĞ]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))( (.+))?\",\n api = {\n BMA: 'BASIC_MERKLED_API',\n BMAS: 'BMAS',\n WS2P: 'WS2P',\n BMATOR: 'BMATOR',\n WS2PTOR: 'WS2PTOR'\n },\n regexp = {\n USER_ID: \"[0-9a-zA-Z-_]+\",\n CURRENCY: \"[0-9a-zA-Z-_]+\",\n PUBKEY: pubkey,\n PUBKEY_WITH_CHECKSUM: \"(\" + pubkey +\"):([123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{3})\",\n COMMENT: \"[ a-zA-Z0-9-_:/;*\\\\[\\\\]()?!^\\\\+=@&~#{}|\\\\\\\\<>%.]*\",\n INVALID_COMMENT_CHARS: \"[^ a-zA-Z0-9-_:/;*\\\\[\\\\]()?!^\\\\+=@&~#{}|\\\\\\\\<>%.]*\",\n // duniter://[uid]:[pubkey]@[host]:[port]\n URI_WITH_AT: \"duniter://(?:([A-Za-z0-9_-]+):)?(\"+pubkey+\"@([a-zA-Z0-9-.]+.[ a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+)\",\n URI_WITH_PATH: \"duniter://([a-zA-Z0-9-.]+.[a-zA-Z0-9-_:.]+)/(\"+pubkey+\")(?:/([A-Za-z0-9_-]+))?\",\n BMA_ENDPOINT: api.BMA + REGEX_ENDPOINT_PARAMS,\n BMAS_ENDPOINT: api.BMAS + REGEX_ENDPOINT_PARAMS,\n WS2P_ENDPOINT: api.WS2P + \" ([a-f0-9]{8})\"+ REGEX_ENDPOINT_PARAMS,\n BMATOR_ENDPOINT: api.BMATOR + \" ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?\",\n WS2PTOR_ENDPOINT: api.WS2PTOR + \" ([a-f0-9]{8}) ([a-z0-9-_.]*|[0-9.]+|[0-9a-f:]+.onion)(?: ([0-9]+))?(?: (.+))?\"\n },\n errorCodes = {\n REVOCATION_ALREADY_REGISTERED: 1002,\n HTTP_LIMITATION: 1006,\n IDENTITY_SANDBOX_FULL: 1007,\n NO_MATCHING_IDENTITY: 2001,\n UID_ALREADY_USED: 2003,\n NO_MATCHING_MEMBER: 2004,\n NO_IDTY_MATCHING_PUB_OR_UID: 2021,\n WRONG_SIGNATURE_MEMBERSHIP: 2006,\n MEMBERSHIP_ALREADY_SEND: 2007,\n NO_CURRENT_BLOCK: 2010,\n BLOCK_NOT_FOUND: 2011,\n SOURCE_ALREADY_CONSUMED: 2015,\n TX_INPUTS_OUTPUTS_NOT_EQUAL: 2024,\n TX_OUTPUT_SUM_NOT_EQUALS_PREV_DELTAS: 2025,\n TX_ALREADY_PROCESSED: 2030\n },\n constants = {\n PROTOCOL_VERSION: 10,\n ROOT_BLOCK_HASH: 'E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855',\n LIMIT_REQUEST_COUNT: 5, // simultaneous async request to a Duniter node\n LIMIT_REQUEST_DELAY: 1000, // time (in second) to wait between to call of a rest request\n regexp: regexp,\n api: api\n },\n listeners,\n that = this;\n\n that.api = new Api(this, 'BMA-' + that.server);\n that.started = false;\n that.init = init;\n\n // Allow to force SSL connection with port different from 443\n that.forceUseSsl = (csConfig.httpsMode === 'true' || csConfig.httpsMode === true || csConfig.httpsMode === 'force') ||\n ($window.location && $window.location.protocol === 'https:') ? true : false;\n if (that.forceUseSsl) {\n console.debug('[BMA] Enable SSL (forced by config or detected in URL)');\n }\n\n if (host) {\n init(host, port, useSsl, useCache);\n }\n that.useCache = useCache; // need here because used in get() function\n\n function init(host, port, useSsl, useCache) {\n if (that.started) that.stop();\n that.alive = false;\n that.cache = _emptyCache();\n\n // Use settings as default, if exists\n if (csSettings.data && csSettings.data.node) {\n host = host || csSettings.data.node.host;\n port = port || csSettings.data.node.port;\n\n useSsl = angular.isDefined(useSsl) ? useSsl : (port == 443 || csSettings.data.node.useSsl || that.forceUseSsl);\n useCache = angular.isDefined(useCache) ? useCache : true;\n }\n\n if (!host) {\n return; // could not init yet\n }\n that.host = host;\n that.port = port || 80;\n that.useSsl = angular.isDefined(useSsl) ? useSsl : (that.port == 443 || that.forceUseSsl);\n that.useCache = angular.isDefined(useCache) ? useCache : false;\n that.server = csHttp.getServer(host, port);\n that.url = csHttp.getUrl(host, port, ''/*path*/, useSsl);\n }\n\n function exact(regexpContent) {\n return new RegExp(\"^\" + regexpContent + \"$\");\n }\n\n function test(regexpContent) {\n return new RegExp(regexpContent);\n }\n\n function _emptyCache() {\n return {\n getByPath: {},\n postByPath: {},\n wsByPath: {}\n };\n }\n\n function closeWs() {\n if (!that.cache) return;\n\n console.warn('[BMA] Closing all websockets...');\n _.keys(that.cache.wsByPath||{}).forEach(function(key) {\n var sock = that.cache.wsByPath[key];\n sock.close();\n });\n that.cache.wsByPath = {};\n }\n\n that.cleanCache = function() {\n console.debug('[BMA] Cleaning requests cache...');\n closeWs();\n that.cache = _emptyCache();\n };\n\n get = function (path, cacheTime) {\n\n cacheTime = that.useCache && cacheTime;\n var cacheKey = path + (cacheTime ? ('#'+cacheTime) : '');\n\n var getRequestFn = function(params) {\n\n if (!that.started) {\n if (!that._startPromise) {\n console.warn('[BMA] Trying to get [{0}] before start(). Waiting...'.format(path));\n }\n return that.ready().then(function() {\n return getRequestFn(params);\n });\n }\n\n var request = that.cache.getByPath[cacheKey];\n if (!request) {\n if (cacheTime) {\n request = csHttp.getWithCache(that.host, that.port, path, that.useSsl, cacheTime);\n }\n else {\n request = csHttp.get(that.host, that.port, path, that.useSsl);\n }\n that.cache.getByPath[cacheKey] = request;\n }\n var execCount = 1;\n return request(params)\n .catch(function(err){\n // If node return too many requests error\n if (err && err.ucode == exports.errorCodes.HTTP_LIMITATION) {\n // If max number of retry not reach\n if (execCount <= exports.constants.LIMIT_REQUEST_COUNT) {\n if (execCount === 1) {\n console.warn(\"[BMA] Too many HTTP requests: Will wait then retry...\");\n // Update the loading message (if exists)\n UIUtils.loading.update({template: \"COMMON.LOADING_WAIT\"});\n }\n // Wait 1s then retry\n return $timeout(function() {\n execCount++;\n return request(params);\n }, exports.constants.LIMIT_REQUEST_DELAY);\n }\n }\n throw err;\n });\n };\n\n return getRequestFn;\n };\n\n post = function(path) {\n var postRequest = function(obj, params) {\n if (!that.started) {\n if (!that._startPromise) {\n console.error('[BMA] Trying to post [{0}] before start()...'.format(path));\n }\n return that.ready().then(function() {\n return postRequest(obj, params);\n });\n }\n\n var request = that.cache.postByPath[path];\n if (!request) {\n request = csHttp.post(that.host, that.port, path, that.useSsl);\n that.cache.postByPath[path] = request;\n }\n return request(obj, params);\n };\n\n return postRequest;\n };\n\n ws = function(path) {\n return function() {\n var sock = that.cache.wsByPath[path];\n if (!sock || sock.isClosed()) {\n sock = csHttp.ws(that.host, that.port, path, that.useSsl);\n\n // When close, remove from cache\n sock.onclose = function() {\n delete that.cache.wsByPath[path];\n };\n\n that.cache.wsByPath[path] = sock;\n }\n return sock;\n };\n };\n\n that.isAlive = function() {\n return csHttp.get(that.host, that.port, '/node/summary', that.useSsl)()\n .then(function(json) {\n var software = json && json.duniter && json.duniter.software;\n var isCompatible = true;\n\n // Check duniter min version\n if (software === 'duniter' && json.duniter.version && csSettings.data.minVersion && true) {\n isCompatible = csHttp.version.isCompatible(csSettings.data.minVersion, json.duniter.version);\n }\n // gchange-pod\n else if (software === 'gchange-pod' && json.duniter.version && csSettings.data.plugins.es.minVersion && true) {\n isCompatible = csHttp.version.isCompatible(csSettings.data.plugins.es.minVersion, json.duniter.version);\n }\n // TODO: check version of other software (DURS, Juniter, etc.)\n else {\n console.debug('[BMA] Unknown node software [{0} v{1}]: could not check compatibility.'.format(software || '?', json.duniter.version || '?'));\n }\n if (!isCompatible) {\n console.error('[BMA] Incompatible node [{0} v{1}]: expected at least v{2}'.format(software, json.duniter.version, csSettings.data.minVersion));\n }\n return isCompatible;\n })\n .catch(function() {\n return false;\n });\n };\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n listeners = [\n // Listen if node changed\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this)\n ];\n }\n\n function onSettingsChanged(settings) {\n\n var server = csHttp.getUrl(settings.node.host, settings.node.port, ''/*path*/, settings.node.useSsl);\n var hasChanged = (server != that.url);\n if (hasChanged) {\n init(settings.node.host, settings.node.port, settings.node.useSsl, that.useCache);\n that.restart();\n }\n }\n\n that.isStarted = function() {\n return that.started;\n };\n\n that.ready = function() {\n if (that.started) return $q.when(true);\n return that._startPromise || that.start();\n };\n\n that.start = function() {\n if (that._startPromise) return that._startPromise;\n if (that.started) return $q.when(that.alive);\n\n if (!that.host) {\n return csSettings.ready()\n .then(function() {\n that.init();\n\n // Always enable cache\n that.useCache = true;\n\n return that.start(); // recursive call\n });\n }\n\n if (that.useSsl) {\n console.debug('[BMA] Starting [{0}] (SSL on)...'.format(that.server));\n }\n else {\n console.debug('[BMA] Starting [{0}]...'.format(that.server));\n }\n\n var now = Date.now();\n\n that._startPromise = $q.all([\n csSettings.ready,\n that.isAlive()\n ])\n .then(function(res) {\n that.alive = res[1];\n if (!that.alive) {\n console.error('[BMA] Could not start [{0}]: node unreachable'.format(that.server));\n that.started = true;\n delete that._startPromise;\n return false;\n }\n\n // Add listeners\n if (!listeners || listeners.length === 0) {\n addListeners();\n }\n console.debug('[BMA] Started in '+(Date.now()-now)+'ms');\n\n that.api.node.raise.start();\n that.started = true;\n delete that._startPromise;\n return true;\n });\n return that._startPromise;\n };\n\n that.stop = function() {\n console.debug('[BMA] Stopping...');\n removeListeners();\n csHttp.cache.clear();\n that.cleanCache();\n that.alive = false;\n that.started = false;\n delete that._startPromise;\n that.api.node.raise.stop();\n };\n\n that.restart = function() {\n that.stop();\n return $timeout(that.start, 200)\n .then(function(alive) {\n if (alive) {\n that.api.node.raise.restart();\n }\n return alive;\n });\n };\n\n that.api.registerEvent('node', 'start');\n that.api.registerEvent('node', 'stop');\n that.api.registerEvent('node', 'restart');\n\n var exports = {\n errorCodes: errorCodes,\n constants: constants,\n regexp: {\n USER_ID: exact(regexp.USER_ID),\n COMMENT: exact(regexp.COMMENT),\n PUBKEY: exact(regexp.PUBKEY),\n PUBKEY_WITH_CHECKSUM: exact(regexp.PUBKEY_WITH_CHECKSUM),\n CURRENCY: exact(regexp.CURRENCY),\n URI: exact(regexp.URI),\n BMA_ENDPOINT: exact(regexp.BMA_ENDPOINT),\n BMAS_ENDPOINT: exact(regexp.BMAS_ENDPOINT),\n WS2P_ENDPOINT: exact(regexp.WS2P_ENDPOINT),\n BMATOR_ENDPOINT: exact(regexp.BMATOR_ENDPOINT),\n WS2PTOR_ENDPOINT: exact(regexp.WS2PTOR_ENDPOINT),\n // TX output conditions\n TX_OUTPUT_SIG: exact(SIG),\n TX_OUTPUT_FUNCTION: test(OUTPUT_FUNCTION),\n TX_OUTPUT_OBJ_OPERATOR_AND: test(OUTPUT_OBJ + '([ ]*&&[ ]*(' + OUTPUT_OBJ + '))+'),\n TX_OUTPUT_OBJ_OPERATOR_OR: test(OUTPUT_OBJ + '([ ]*\\\\|\\\\|[ ]*(' + OUTPUT_OBJ + '))+'),\n TX_OUTPUT_OBJ: test(OUTPUT_OBJ),\n TX_OUTPUT_OBJ_OPERATOR: test(OUTPUT_OBJ_OPERATOR),\n TX_OUTPUT_OBJ_PARENTHESIS: test('\\\\(('+OUTPUT_OBJ+')\\\\)'),\n TX_OUTPUT_FUNCTIONS: test(OUTPUT_FUNCTIONS)\n },\n node: {\n summary: get('/node/summary', csHttp.cache.LONG),\n same: function(host2, port2) {\n return host2 === that.host && ((!that.port && !port2) || (that.port == port2||80)) && (that.useSsl == (port2 && port2 === 443));\n },\n forceUseSsl: that.forceUseSsl\n },\n network: {\n peering: {\n self: get('/network/peering'),\n peers: get('/network/peering/peers')\n },\n peers: get('/network/peers'),\n ws2p: {\n info: get('/network/ws2p/info'),\n heads: get('/network/ws2p/heads')\n }\n },\n wot: {\n lookup: get('/wot/lookup/:search', csHttp.cache.MEDIUM),\n certifiedBy: get('/wot/certified-by/:pubkey'),\n certifiersOf: get('/wot/certifiers-of/:pubkey'),\n member: {\n all: get('/wot/members', csHttp.cache.LONG),\n pending: get('/wot/pending', csHttp.cache.SHORT)\n },\n requirements: function(params, withCache) {\n // No cache by default\n if (withCache !== true) return exports.raw.wot.requirements(params);\n return exports.raw.wot.requirementsWithCache(params);\n },\n add: post('/wot/add'),\n certify: post('/wot/certify'),\n revoke: post('/wot/revoke')\n },\n blockchain: {\n parameters: get('/blockchain/parameters', csHttp.cache.VERY_LONG),\n block: get('/blockchain/block/:block', csHttp.cache.SHORT),\n blocksSlice: get('/blockchain/blocks/:count/:from'),\n current: get('/blockchain/current', csHttp.cache.SHORT),\n membership: post('/blockchain/membership'),\n stats: {\n ud: get('/blockchain/with/ud', csHttp.cache.MEDIUM),\n tx: get('/blockchain/with/tx'),\n newcomers: get('/blockchain/with/newcomers', csHttp.cache.MEDIUM),\n hardship: get('/blockchain/hardship/:pubkey'),\n difficulties: get('/blockchain/difficulties')\n }\n },\n tx: {\n sources: get('/tx/sources/:pubkey', csHttp.cache.SHORT),\n process: post('/tx/process'),\n history: {\n all: function(params) {\n return exports.raw.tx.history.all(params)\n .then(function(res) {\n res.history = res.history || {};\n // Clean sending and pendings, because already returned by tx/history/:pubkey/pending\n res.history.sending = [];\n res.history.pendings = [];\n return res;\n });\n },\n times: function(params, withCache) {\n // No cache by default\n return ((withCache !== true) ? exports.raw.tx.history.times(params) : exports.raw.tx.history.timesWithCache(params))\n .then(function(res) {\n res.history = res.history || {};\n // Clean sending and pendings, because already returned by tx/history/:pubkey/pending\n res.history.sending = [];\n res.history.pendings = [];\n return res;\n });\n },\n blocks: get('/tx/history/:pubkey/blocks/:from/:to', csHttp.cache.LONG),\n pending: get('/tx/history/:pubkey/pending')\n }\n },\n ud: {\n history: get('/ud/history/:pubkey')\n },\n uri: {},\n version: {},\n raw: {\n wot: {\n requirementsWithCache: get('/wot/requirements/:pubkey', csHttp.cache.LONG),\n requirements: get('/wot/requirements/:pubkey')\n },\n tx: {\n history: {\n timesWithCache: get('/tx/history/:pubkey/times/:from/:to', csHttp.cache.LONG),\n times: get('/tx/history/:pubkey/times/:from/:to'),\n all: get('/tx/history/:pubkey')\n }\n },\n }\n };\n\n exports.tx.parseUnlockCondition = function(unlockCondition) {\n\n //console.debug('[BMA] Parsing unlock condition: {0}.'.format(unlockCondition));\n var convertedOutput = unlockCondition;\n var treeItems = [];\n var treeItem;\n var treeItemId;\n var childrenContent;\n var childrenMatches;\n var functions = {};\n\n // Parse functions, then replace with an 'OBJ()' generic function, used to build a object tree\n var matches = exports.regexp.TX_OUTPUT_FUNCTION.exec(convertedOutput);\n while(matches) {\n treeItem = {};\n treeItemId = 'OBJ(' + treeItems.length + ')';\n treeItem.type = convertedOutput.substr(matches.index, matches[0].indexOf('('));\n treeItem.value = matches[1] || matches[2] || matches[3] || matches[4]; // get value from regexp OUTPUT_FUNCTION\n treeItems.push(treeItem);\n\n functions[treeItem.type] = functions[treeItem.type]++ || 1;\n\n convertedOutput = convertedOutput.replace(matches[0], treeItemId);\n matches = exports.regexp.TX_OUTPUT_FUNCTION.exec(convertedOutput);\n }\n\n var loop = true;\n while(loop) {\n // Parse AND operators\n matches = exports.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(convertedOutput);\n loop = !!matches;\n while (matches) {\n treeItem = {};\n treeItemId = 'OBJ(' + treeItems.length + ')';\n treeItem.type = 'AND';\n treeItem.children = [];\n treeItems.push(treeItem);\n\n childrenContent = matches[0];\n childrenMatches = exports.regexp.TX_OUTPUT_OBJ.exec(childrenContent);\n while(childrenMatches) {\n\n treeItem.children.push(treeItems[childrenMatches[1]]);\n childrenContent = childrenContent.replace(childrenMatches[0], '');\n childrenMatches = exports.regexp.TX_OUTPUT_OBJ.exec(childrenContent);\n }\n\n convertedOutput = convertedOutput.replace(matches[0], treeItemId);\n matches = exports.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(childrenContent);\n }\n\n // Parse OR operators\n\n matches = exports.regexp.TX_OUTPUT_OBJ_OPERATOR_OR.exec(convertedOutput);\n loop = loop || !!matches;\n while (matches) {\n treeItem = {};\n treeItemId = 'OBJ(' + treeItems.length + ')';\n treeItem.type = 'OR';\n treeItem.children = [];\n treeItems.push(treeItem);\n\n childrenContent = matches[0];\n childrenMatches = exports.regexp.TX_OUTPUT_OBJ.exec(childrenContent);\n while(childrenMatches) {\n treeItem.children.push(treeItems[childrenMatches[1]]);\n childrenContent = childrenContent.replace(childrenMatches[0], '');\n childrenMatches = exports.regexp.TX_OUTPUT_OBJ.exec(childrenContent);\n }\n\n convertedOutput = convertedOutput.replace(matches[0], treeItemId);\n matches = exports.regexp.TX_OUTPUT_OBJ_OPERATOR_AND.exec(convertedOutput);\n }\n\n // Remove parenthesis\n matches = exports.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(convertedOutput);\n loop = loop || !!matches;\n while (matches) {\n convertedOutput = convertedOutput.replace(matches[0], matches[1]);\n matches = exports.regexp.TX_OUTPUT_OBJ_PARENTHESIS.exec(convertedOutput);\n }\n }\n\n functions = _.keys(functions);\n if (functions.length === 0) {\n console.error('[BMA] Unparseable unlock condition: ', output);\n return;\n }\n console.debug('[BMA] Unlock conditions successfully parsed:', treeItem);\n return {\n unlockFunctions: functions,\n unlockTree: treeItem\n };\n };\n\n exports.node.parseEndPoint = function(endpoint, epPrefix) {\n // Try BMA\n var matches = exports.regexp.BMA_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": matches[8] && matches[8] == 443,\n \"path\": matches[10],\n \"useBma\": true\n };\n }\n // Try BMAS\n matches = exports.regexp.BMAS_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": true,\n \"path\": matches[10],\n \"useBma\": true\n };\n }\n // Try BMATOR\n matches = exports.regexp.BMATOR_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"dns\": matches[1] || '',\n \"port\": matches[2] || 80,\n \"useSsl\": false,\n \"useTor\": true,\n \"useBma\": true\n };\n }\n // Try WS2P\n matches = exports.regexp.WS2P_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"ws2pid\": matches[1] || '',\n \"dns\": matches[3] || '',\n \"ipv4\": matches[5] || '',\n \"ipv6\": matches[7] || '',\n \"port\": matches[9] || 80,\n \"useSsl\": matches[9] && matches[9] == 443,\n \"path\": matches[11] || '',\n \"useWs2p\": true\n };\n }\n // Try WS2PTOR\n matches = exports.regexp.WS2PTOR_ENDPOINT.exec(endpoint);\n if (matches) {\n return {\n \"ws2pid\": matches[1] || '',\n \"dns\": matches[2] || '',\n \"port\": matches[3] || 80,\n \"path\": matches[4] || '',\n \"useSsl\": false,\n \"useTor\": true,\n \"useWs2p\": true\n };\n }\n\n // Use generic match\n if (epPrefix) {\n matches = exact(epPrefix + REGEX_ENDPOINT_PARAMS).exec(endpoint);\n if (matches) {\n return {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": matches[8] && matches[8] == 443,\n \"path\": matches[10],\n \"useBma\": false\n };\n }\n }\n\n };\n\n exports.copy = function(otherNode) {\n var wasStarted = that.started;\n\n var server = csHttp.getUrl(otherNode.host, otherNode.port, ''/*path*/, otherNode.useSsl);\n var hasChanged = (server !== that.url);\n if (hasChanged) {\n that.init(otherNode.host, otherNode.port, otherNode.useSsl, that.useCache/*keep original value*/);\n // Restart (only if was already started)\n return wasStarted ? that.restart() : $q.when();\n }\n };\n\n exports.wot.member.uids = function() {\n return exports.wot.member.all()\n .then(function(res){\n return res.results.reduce(function(res, member){\n res[member.pubkey] = member.uid;\n return res;\n }, {});\n });\n };\n\n exports.wot.member.get = function(pubkey) {\n return exports.wot.member.uids()\n .then(function(memberUidsByPubkey){\n var uid = memberUidsByPubkey[pubkey];\n return {\n pubkey: pubkey,\n uid: (uid ? uid : null)\n };\n });\n };\n\n exports.wot.member.getByUid = function(uid) {\n return exports.wot.member.all()\n .then(function(res){\n return _.findWhere(res.results, {uid: uid});\n });\n };\n\n /**\n * Return all expected blocks\n * @param blockNumbers a rray of block number\n */\n exports.blockchain.blocks = function(blockNumbers){\n return exports.raw.getHttpRecursive(exports.blockchain.block, 'block', blockNumbers);\n };\n\n /**\n * Return all expected blocks\n * @param blockNumbers a rray of block number\n */\n exports.network.peering.peersByLeaves = function(leaves){\n return exports.raw.getHttpRecursive(exports.network.peering.peers, 'leaf', leaves, 0, 10);\n };\n\n exports.raw.getHttpRecursive = function(httpGetRequest, paramName, paramValues, offset, size) {\n offset = angular.isDefined(offset) ? offset : 0;\n size = size || exports.constants.LIMIT_REQUEST_COUNT;\n return $q(function(resolve, reject) {\n var result = [];\n var jobs = [];\n _.each(paramValues.slice(offset, offset+size), function(paramValue) {\n var requestParams = {};\n requestParams[paramName] = paramValue;\n jobs.push(\n httpGetRequest(requestParams)\n .then(function(res){\n if (!res) return;\n result.push(res);\n })\n );\n });\n\n $q.all(jobs)\n .then(function() {\n if (offset < paramValues.length - 1) {\n $timeout(function() {\n exports.raw.getHttpRecursive(httpGetRequest, paramName, paramValues, offset+size, size)\n .then(function(res) {\n if (!res || !res.length) {\n resolve(result);\n return;\n }\n\n resolve(result.concat(res));\n })\n .catch(function(err) {\n reject(err);\n });\n }, exports.constants.LIMIT_REQUEST_DELAY);\n }\n else {\n resolve(result);\n }\n })\n .catch(function(err){\n if (err && err.ucode === exports.errorCodes.HTTP_LIMITATION) {\n resolve(result);\n }\n else {\n reject(err);\n }\n });\n });\n };\n\n exports.raw.getHttpWithRetryIfLimitation = function(exec) {\n return exec()\n .catch(function(err){\n // When too many request, retry in 3s\n if (err && err.ucode == exports.errorCodes.HTTP_LIMITATION) {\n return $timeout(function() {\n // retry\n return exports.raw.getHttpWithRetryIfLimitation(exec);\n }, exports.constants.LIMIT_REQUEST_DELAY);\n }\n });\n };\n\n exports.blockchain.lastUd = function() {\n return exports.blockchain.stats.ud()\n .then(function(res) {\n if (!res.result.blocks || !res.result.blocks.length) {\n return null;\n }\n var lastBlockWithUD = res.result.blocks[res.result.blocks.length - 1];\n return exports.blockchain.block({block: lastBlockWithUD})\n .then(function(block){\n return (block.unitbase > 0) ? block.dividend * Math.pow(10, block.unitbase) : block.dividend;\n });\n });\n };\n\n exports.uri.parse = function(uri) {\n return $q(function(resolve, reject) {\n var pubkey;\n\n // If pubkey: not need to parse\n if (exact(regexp.PUBKEY).test(uri)) {\n resolve({\n pubkey: uri\n });\n }\n // If pubkey+checksum\n else if (exact(regexp.PUBKEY_WITH_CHECKSUM).test(uri)) {\n console.debug(\"[BMA.parse] Detecting a pubkey with checksum: \" + uri);\n var matches = exports.regexp.PUBKEY_WITH_CHECKSUM.exec(uri);\n pubkey = matches[1];\n var checksum = matches[2];\n console.debug(\"[BMA.parse] Detecting a pubkey {\"+pubkey+\"} with checksum {\" + checksum + \"}\");\n var expectedChecksum = csCrypto.util.pkChecksum(pubkey);\n console.debug(\"[BMA.parse] Expecting checksum for pubkey is {\" + expectedChecksum + \"}\");\n if (checksum != expectedChecksum) {\n reject( {message: 'ERROR.PUBKEY_INVALID_CHECKSUM'});\n }\n else {\n resolve({\n pubkey: pubkey\n });\n }\n }\n else if(uri.startsWith('duniter://')) {\n var parser = csHttp.uri.parse(uri),\n uid,\n currency = parser.host.indexOf('.') === -1 ? parser.host : null,\n host = parser.host.indexOf('.') !== -1 ? parser.host : null;\n if (parser.username) {\n if (parser.password) {\n uid = parser.username;\n pubkey = parser.password;\n }\n else {\n pubkey = parser.username;\n }\n }\n if (parser.pathname) {\n var paths = parser.pathname.split('/');\n var pathCount = !paths ? 0 : paths.length;\n var index = 0;\n if (!currency && pathCount > index) {\n currency = paths[index++];\n }\n if (!pubkey && pathCount > index) {\n pubkey = paths[index++];\n }\n if (!uid && pathCount > index) {\n uid = paths[index++];\n }\n if (pathCount > index) {\n reject( {message: 'Bad Duniter URI format. Invalid path (incomplete or redundant): '+ parser.pathname}); return;\n }\n }\n\n if (!currency){\n if (host) {\n csHttp.get(host + '/blockchain/parameters')()\n .then(function(parameters){\n resolve({\n uid: uid,\n pubkey: pubkey,\n host: host,\n currency: parameters.currency\n });\n })\n .catch(function(err) {\n console.error(err);\n reject({message: 'Could not get node parameter. Currency could not be retrieve'});\n });\n }\n else {\n reject({message: 'Bad Duniter URI format. Missing currency name (or node address).'}); return;\n }\n }\n else {\n if (!host) {\n resolve({\n uid: uid,\n pubkey: pubkey,\n currency: currency\n });\n }\n\n // Check if currency are the same (between node and uri)\n return csHttp.get(host + '/blockchain/parameters')()\n .then(function(parameters){\n if (parameters.currency !== currency) {\n reject( {message: \"Node's currency [\"+parameters.currency+\"] does not matched URI's currency [\"+currency+\"].\"}); return;\n }\n resolve({\n uid: uid,\n pubkey: pubkey,\n host: host,\n currency: currency\n });\n })\n .catch(function(err) {\n console.error(err);\n reject({message: 'Could not get node parameter. Currency could not be retrieve'});\n });\n }\n }\n else {\n console.debug(\"[BMA.parse] Could not parse URI: \" + uri);\n reject({message: 'ERROR.UNKNOWN_URI_FORMAT'});\n }\n })\n\n // Check values against regex\n .then(function(result) {\n if (!result) return;\n if (result.pubkey && !(exact(regexp.PUBKEY).test(result.pubkey))) {\n throw {message: \"Invalid pubkey format [\" + result.pubkey + \"]\"};\n }\n if (result.uid && !(exact(regexp.USER_ID).test(result.uid))) {\n throw {message: \"Invalid uid format [\" + result.uid + \"]\"};\n }\n if (result.currency && !(exact(regexp.CURRENCY).test(result.currency))) {\n throw {message: \"Invalid currency format [\"+result.currency+\"]\"};\n }\n return result;\n });\n };\n\n // Define get latest release (or fake function is no URL defined)\n var duniterLatestReleaseUrl = csSettings.data.duniterLatestReleaseUrl && csHttp.uri.parse(csSettings.data.duniterLatestReleaseUrl);\n exports.raw.getLatestRelease = duniterLatestReleaseUrl ?\n csHttp.getWithCache(duniterLatestReleaseUrl.host,\n duniterLatestReleaseUrl.port,\n \"/\" + duniterLatestReleaseUrl.pathname,\n /*useSsl*/ (+(duniterLatestReleaseUrl.port) === 443 || duniterLatestReleaseUrl.protocol === 'https:' || that.forceUseSsl),\n csHttp.cache.LONG\n ) :\n // No URL define: use a fake function\n function() {\n return $q.when();\n };\n\n exports.version.latest = function() {\n return exports.raw.getLatestRelease()\n .then(function (json) {\n if (!json) return;\n if (json.name && json.html_url) {\n return {\n version: json.name,\n url: json.html_url\n };\n }\n if (json.tag_name && json.html_url) {\n return {\n version: json.tag_name.substring(1),\n url: json.html_url\n };\n }\n })\n .catch(function(err) {\n // silent (just log it)\n console.error('[BMA] Failed to get Duniter latest version', err);\n });\n };\n\n exports.websocket = {\n block: ws('/ws/block'),\n peer: ws('/ws/peer'),\n close : closeWs\n };\n\n angular.merge(that, exports);\n }\n\n var service = new BMA(undefined, undefined, undefined, true);\n\n service.instance = function(host, port, useSsl, useCache) {\n return new BMA(host, port, useSsl, useCache);\n };\n\n service.lightInstance = function(host, port, useSsl, timeout) {\n port = port || 80;\n useSsl = angular.isDefined(useSsl) ? useSsl : (port == 443);\n return {\n host: host,\n port: port,\n useSsl: useSsl,\n url: csHttp.getUrl(host, port, ''/*path*/, useSsl),\n node: {\n summary: csHttp.getWithCache(host, port, '/node/summary', useSsl, csHttp.cache.LONG, false, timeout)\n },\n network: {\n peering: {\n self: csHttp.get(host, port, '/network/peering', useSsl, timeout)\n },\n peers: csHttp.get(host, port, '/network/peers', useSsl, timeout)\n },\n blockchain: {\n current: csHttp.get(host, port, '/blockchain/current', useSsl, timeout),\n stats: {\n hardship: csHttp.get(host, port, '/blockchain/hardship/:pubkey', useSsl, timeout)\n }\n }\n };\n };\n\n // default action\n //service.start();\n\n return service;\n}])\n\n;\n","\nangular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.crypto.services', 'cesium.utils.services',\n 'cesium.settings.services'])\n\n.factory('csWot', ['$q', '$timeout', 'BMA', 'Api', 'CacheFactory', 'csConfig', 'csCurrency', 'csSettings', 'csCache', function($q, $timeout, BMA, Api, CacheFactory, csConfig, csCurrency, csSettings, csCache) {\n 'ngInject';\n\n function factory(id) {\n\n var\n api = new Api(this, \"csWot-\" + id),\n identityCache = csCache.get('csWot-idty-', csCache.constants.SHORT),\n\n // Add id, and remove duplicated id\n _addUniqueIds = function(idties) {\n var idtyKeys = {};\n return idties.reduce(function(res, idty) {\n idty.id = idty.id || idty.uid + '-' + idty.pubkey;\n if (!idtyKeys[idty.id]) {\n idtyKeys[idty.id] = true;\n return res.concat(idty);\n }\n return res;\n }, []);\n },\n\n _sortAndSliceIdentities = function(idties, offset, size) {\n offset = offset || 0;\n\n // Add unique ids\n idties = _addUniqueIds(idties);\n\n // Sort by block and\n idties = _.sortBy(idties, function(idty){\n var score = 1;\n score += (1000000 * (idty.block));\n score += (10 * (900 - idty.uid.toLowerCase().charCodeAt(0)));\n return -score;\n });\n if (angular.isDefined(size) && idties.length > size) {\n idties = idties.slice(offset, offset+size); // limit if more than expected size\n }\n\n\n return idties;\n },\n\n _sortCertifications = function(certifications) {\n certifications = _.sortBy(certifications, function(cert){\n var score = 1;\n score += (1000000000000 * (cert.expiresIn ? cert.expiresIn : 0));\n score += (10000000 * (cert.isMember ? 1 : 0));\n score += (10 * (cert.block ? cert.block : 0));\n return -score;\n });\n return certifications;\n },\n\n loadRequirements = function(pubkey, uid) {\n if (!pubkey) return $q.when({});\n // Get requirements\n return BMA.wot.requirements({pubkey: pubkey})\n .then(function(res){\n if (!res.identities || !res.identities.length) return;\n\n // Sort to select the best identity\n if (res.identities.length > 1) {\n // Select the best identity, by sorting using this order\n // - same wallet uid\n // - is member\n // - has a pending membership\n // - is not expired (in sandbox)\n // - is not outdistanced\n // - if has certifications\n // max(count(certification)\n // else\n // max(membershipPendingExpiresIn) = must recent membership\n res.identities = _.sortBy(res.identities, function(idty) {\n var score = 0;\n score += (10000000000 * ((uid && idty.uid === uid) ? 1 : 0));\n score += (1000000000 * (idty.membershipExpiresIn > 0 ? 1 : 0));\n score += (100000000 * (idty.membershipPendingExpiresIn > 0 ? 1 : 0));\n score += (10000000 * (!idty.expired ? 1 : 0));\n score += (1000000 * (!idty.outdistanced ? 1 : 0));\n var certCount = !idty.expired && idty.certifications ? idty.certifications.length : 0;\n score += (1 * (certCount ? certCount : 0));\n score += (1 * (!certCount && idty.membershipPendingExpiresIn > 0 ? idty.membershipPendingExpiresIn/1000 : 0));\n return -score;\n });\n console.debug('Found {0} identities. Will selected the best one'.format(res.identities.length));\n }\n var requirements = res.identities[0];\n // Add useful custom fields\n requirements.hasSelf = true;\n requirements.needMembership = (requirements.membershipExpiresIn <= 0 &&\n requirements.membershipPendingExpiresIn <= 0 );\n requirements.needRenew = (!requirements.needMembership &&\n requirements.membershipExpiresIn <= csSettings.data.timeWarningExpire &&\n requirements.membershipPendingExpiresIn <= 0 );\n requirements.canMembershipOut = (requirements.membershipExpiresIn > 0);\n requirements.pendingMembership = (requirements.membershipExpiresIn <= 0 && requirements.membershipPendingExpiresIn > 0);\n requirements.isMember = (requirements.membershipExpiresIn > 0);\n // Force certification count to 0, is not a member yet - fix #269\n requirements.certificationCount = (requirements.isMember && requirements.certifications) ? requirements.certifications.length : 0;\n requirements.willExpireCertificationCount = requirements.certifications ? requirements.certifications.reduce(function(count, cert){\n if (cert.expiresIn <= csSettings.data.timeWarningExpire) {\n cert.willExpire = true;\n return count + 1;\n }\n return count;\n }, 0) : 0;\n requirements.pendingRevocation = !requirements.revoked && !!requirements.revocation_sig;\n\n return requirements;\n })\n .catch(function(err) {\n // If not a member: continue\n if (!!err &&\n (err.ucode == BMA.errorCodes.NO_MATCHING_MEMBER ||\n err.ucode == BMA.errorCodes.NO_IDTY_MATCHING_PUB_OR_UID)) {\n return {\n hasSelf: false,\n needMembership: true,\n canMembershipOut: false,\n needRenew: false,\n pendingMembership: false,\n needCertifications: false,\n needCertificationCount: 0,\n willNeedCertificationCount: 0\n };\n }\n throw err;\n });\n },\n\n loadIdentityByLookup = function(pubkey, uid) {\n return BMA.wot.lookup({ search: pubkey||uid })\n .then(function(res) {\n if (!res || !res.results || !res.results.length) {\n return {\n uid: null,\n pubkey: pubkey,\n hasSelf: false\n };\n }\n var identities = res.results.reduce(function(idties, res) {\n return idties.concat(res.uids.reduce(function(uids, idty) {\n var blockUid = idty.meta.timestamp.split('-', 2);\n return uids.concat({\n uid: idty.uid,\n pubkey: res.pubkey,\n timestamp: idty.meta.timestamp,\n number: parseInt(blockUid[0]),\n hash: blockUid[1],\n revoked: idty.revoked,\n revocationNumber: idty.revoked_on,\n sig: idty.self\n });\n }, []));\n }, []);\n\n // Sort identities if need\n if (identities.length) {\n // Select the best identity, by sorting using this order\n // - same given uid\n // - not revoked\n // - max(block_number)\n identities = _.sortBy(identities, function(idty) {\n var score = 0;\n score += (10000000000 * ((uid && idty.uid === uid) ? 1 : 0));\n score += (1000000000 * (!idty.revoked ? 1 : 0));\n score += (1 * (idty.number ? idty.number : 0));\n return -score;\n });\n }\n var identity = identities[0];\n\n // Retrieve time (self and revocation)\n var blocks = [identity.number];\n if (identity.revocationNumber) {\n blocks.push(identity.revocationNumber);\n }\n return BMA.blockchain.blocks(blocks)\n .then(function(blocks){\n identity.sigDate = blocks[0].medianTime;\n\n // Check if self has been done on a valid block\n if (identity.number !== 0 && identity.hash !== blocks[0].hash) {\n identity.hasBadSelfBlock = true;\n }\n\n // Set revocation time\n if (identity.revocationNumber) {\n identity.revocationTime = blocks[1].medianTime;\n }\n\n return identity;\n })\n .catch(function(err){\n // Special case for currency init (root block not exists): use now\n if (err && err.ucode == BMA.errorCodes.BLOCK_NOT_FOUND && identity.number === 0) {\n identity.sigDate = csCurrency.date.now();\n return identity;\n }\n else {\n throw err;\n }\n });\n })\n .catch(function(err) {\n if (!!err && err.ucode == BMA.errorCodes.NO_MATCHING_IDENTITY) { // Identity not found (if no self)\n var identity = {\n uid: null,\n pubkey: pubkey,\n hasSelf: false\n };\n return identity;\n }\n else {\n throw err;\n }\n });\n },\n\n loadCertifications = function(getFunction, pubkey, lookupCertifications, parameters, medianTime, certifiersOf) {\n\n function _certId(pubkey, block) {\n return pubkey + '-' + block;\n }\n\n // TODO : remove this later (when all node will use duniter v0.50+)\n var lookupHasCertTime = true; // Will be set ti FALSE before Duniter v0.50\n var lookupCerticationsByCertId = lookupCertifications ? lookupCertifications.reduce(function(res, cert){\n var certId = _certId(cert.pubkey, cert.cert_time ? cert.cert_time.block : cert.sigDate);\n if (!cert.cert_time) lookupHasCertTime = false;\n res[certId] = cert;\n return res;\n }, {}) : {};\n\n var isMember = true;\n\n return getFunction({ pubkey: pubkey })\n .then(function(res) {\n return res.certifications.reduce(function (res, cert) {\n // Rappel :\n // cert.sigDate = blockstamp de l'identité\n // cert.cert_time.block : block au moment de la certification\n // cert.written.number : block où la certification est écrite\n\n var pending = !cert.written;\n var certTime = cert.cert_time ? cert.cert_time.medianTime : null;\n var expiresIn = (!certTime) ? 0 : (pending ?\n (certTime + parameters.sigWindow - medianTime) :\n (certTime + parameters.sigValidity - medianTime));\n expiresIn = (expiresIn < 0) ? 0 : expiresIn;\n // Remove from lookup certs\n var certId = _certId(cert.pubkey, lookupHasCertTime && cert.cert_time ? cert.cert_time.block : cert.sigDate);\n delete lookupCerticationsByCertId[certId];\n\n // Add to result list\n return res.concat({\n pubkey: cert.pubkey,\n uid: cert.uid,\n time: certTime,\n isMember: cert.isMember,\n wasMember: cert.wasMember,\n expiresIn: expiresIn,\n willExpire: (expiresIn && expiresIn <= csSettings.data.timeWarningExpire),\n pending: pending,\n block: (cert.written !== null) ? cert.written.number :\n (cert.cert_time ? cert.cert_time.block : null),\n valid: (expiresIn > 0)\n });\n }, []);\n })\n .catch(function(err) {\n if (!!err && err.ucode == BMA.errorCodes.NO_MATCHING_MEMBER) { // member not found\n isMember = false;\n return []; // continue (append pendings cert if exists in lookup)\n }\n else {\n throw err;\n }\n })\n\n // Add pending certs (found in lookup - see loadIdentityByLookup())\n .then(function(certifications) {\n var pendingCertifications = _.values(lookupCerticationsByCertId);\n if (!pendingCertifications.length) return certifications; // No more pending continue\n\n // Special case for initPhase - issue #\n if (csCurrency.data.initPhase) {\n return pendingCertifications.reduce(function(res, cert) {\n return res.concat({\n pubkey: cert.pubkey,\n uid: cert.uid,\n isMember: cert.isMember,\n wasMember: cert.wasMember,\n time: null,\n expiresIn: parameters.sigWindow,\n willExpire: false,\n pending: true,\n block: 0,\n valid: true\n });\n }, certifications);\n }\n\n var pendingCertByBlocks = pendingCertifications.reduce(function(res, cert){\n var block = lookupHasCertTime && cert.cert_time ? cert.cert_time.block :\n (cert.sigDate ? cert.sigDate.split('-')[0] : null);\n if (angular.isDefined(block)) {\n if (!res[block]) {\n res[block] = [cert];\n }\n else {\n res[block].push(cert);\n }\n }\n return res;\n }, {});\n\n // Set time to pending cert, from blocks\n return BMA.blockchain.blocks(_.keys(pendingCertByBlocks)).then(function(blocks){\n certifications = blocks.reduce(function(res, block){\n return res.concat(pendingCertByBlocks[block.number].reduce(function(res, cert) {\n var certTime = block.medianTime;\n var expiresIn = Math.max(0, certTime + parameters.sigWindow - medianTime);\n var validBuid = (!cert.cert_time || !cert.cert_time.block_hash || cert.cert_time.block_hash == block.hash);\n if (!validBuid) {\n console.debug(\"[wot] Invalid cert {0}: block hash changed\".format(cert.pubkey.substring(0,8)));\n }\n var valid = (expiresIn > 0) && (!certifiersOf || cert.isMember) && validBuid;\n return res.concat({\n pubkey: cert.pubkey,\n uid: cert.uid,\n isMember: cert.isMember,\n wasMember: cert.wasMember,\n time: certTime,\n expiresIn: expiresIn,\n willExpire: (expiresIn && expiresIn <= csSettings.data.timeWarningExpire),\n pending: true,\n block: lookupHasCertTime && cert.cert_time ? cert.cert_time.block :\n (cert.sigDate ? cert.sigDate.split('-')[0] : null),\n valid: valid\n });\n }, []));\n }, certifications);\n return certifications;\n });\n })\n\n // Sort and return result\n .then(function(certifications) {\n\n // Remove pending cert duplicated with a written & valid cert\n var writtenCertByPubkey = certifications.reduce(function(res, cert) {\n if (!cert.pending && cert.valid && cert.expiresIn >= parameters.sigWindow) {\n res[cert.pubkey] = true;\n }\n return res;\n }, {});\n\n // Final sort\n certifications = _sortCertifications(certifications);\n\n // Split into valid/pending/error\n var pendingCertifications = [];\n var errorCertifications = [];\n var validCertifications = certifications.reduce(function(res, cert) {\n if (cert.pending) {\n if (cert.valid && !writtenCertByPubkey[cert.pubkey]) {\n pendingCertifications.push(cert);\n }\n else if (!cert.valid && !writtenCertByPubkey[cert.pubkey]){\n errorCertifications.push(cert);\n }\n return res;\n }\n return res.concat(cert);\n }, []);\n\n return {\n valid: validCertifications,\n pending: pendingCertifications,\n error: errorCertifications\n };\n })\n ;\n },\n\n finishLoadRequirements = function(data) {\n data.requirements.needCertificationCount = (!data.requirements.needMembership && (data.requirements.certificationCount < data.sigQty)) ?\n (data.sigQty - data.requirements.certificationCount) : 0;\n data.requirements.willNeedCertificationCount = (!data.requirements.needMembership && !data.requirements.needCertificationCount &&\n (data.requirements.certificationCount - data.requirements.willExpireCertificationCount) < data.sigQty) ?\n (data.sigQty - data.requirements.certificationCount + data.requirements.willExpireCertificationCount) : 0;\n data.requirements.pendingCertificationCount = data.received_cert_pending ? data.received_cert_pending.length : 0;\n\n // Use /wot/lookup.revoked when requirements not filled\n data.requirements.revoked = angular.isDefined(data.requirements.revoked) ? data.requirements.revoked : data.revoked;\n\n // Add events\n if (data.requirements.revoked) {\n delete data.hasBadSelfBlock;\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_REVOKED', messageParams: {revocationTime: data.revocationTime}});\n console.debug(\"[wot] Identity [{0}] has been revoked\".format(data.uid));\n }\n else if (data.requirements.pendingRevocation) {\n addEvent(data, {type:'error', message: 'ERROR.IDENTITY_PENDING_REVOCATION'});\n console.debug(\"[wot] Identity [{0}] has pending revocation\".format(data.uid));\n }\n else if (data.hasBadSelfBlock) {\n delete data.hasBadSelfBlock;\n if (!data.isMember) {\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_INVALID_BLOCK_HASH'});\n console.debug(\"[wot] Invalid membership for {0}: block hash changed\".format(data.uid));\n }\n }\n else if (data.requirements.expired) {\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_EXPIRED'});\n console.debug(\"[wot] Identity {0} expired (in sandbox)\".format(data.uid));\n }\n else if (data.requirements.willNeedCertificationCount > 0) {\n addEvent(data, {type: 'error', message: 'INFO.IDENTITY_WILL_MISSING_CERTIFICATIONS', messageParams: data.requirements});\n console.debug(\"[wot] Identity {0} will need {1} certification(s)\".format(data.uid, data.requirements.willNeedCertificationCount));\n }\n },\n\n loadData = function(pubkey, withCache, uid, force) {\n\n var data;\n\n if (!pubkey && uid && !force) {\n return BMA.wot.member.getByUid(uid)\n .then(function(member) {\n if (member) return loadData(member.pubkey, withCache, member.uid); // recursive call\n //throw {message: 'NOT_A_MEMBER'};\n return loadData(pubkey, withCache, uid, true/*force*/);\n });\n }\n\n // Check cached data\n if (pubkey) {\n data = withCache ? identityCache.get(pubkey) : null;\n if (data && (!uid || data.uid == uid)) {\n console.debug(\"[wot] Identity \" + pubkey.substring(0, 8) + \" found in cache\");\n return $q.when(data);\n }\n console.debug(\"[wot] Loading identity \" + pubkey.substring(0, 8) + \"...\");\n data = {pubkey: pubkey};\n }\n else {\n console.debug(\"[wot] Loading identity from uid \" + uid);\n data = {};\n }\n\n var now = Date.now();\n\n var parameters;\n var medianTime;\n\n return $q.all([\n // Get parameters\n csCurrency.parameters()\n .then(function(res) {\n parameters = res;\n data.sigQty = parameters.sigQty;\n data.sigStock = parameters.sigStock;\n }),\n // Get current time\n csCurrency.blockchain.current()\n .then(function(current) {\n medianTime = current.medianTime;\n })\n .catch(function(err){\n // Special case for currency init (root block not exists): use now\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) {\n medianTime = Math.trunc(new Date().getTime()/1000);\n }\n else {\n throw err;\n }\n }),\n\n // Get requirements\n $q.when()\n .then(function () {\n data.requirements = {};\n data.isMember = false;\n }),\n // loadRequirements(pubkey, uid)\n // .then(function (requirements) {\n // data.requirements = requirements;\n // data.isMember = requirements.isMember;\n // }),\n\n // Get identity using lookup\n loadIdentityByLookup(pubkey, uid)\n .then(function (identity) {\n angular.merge(data, identity);\n })\n ])\n .then(function() {\n if (!data.requirements.uid) {\n return;\n }\n\n var idtyFullKey = data.requirements.uid + '-' + data.requirements.meta.timestamp;\n\n return $q.all([\n // Get received certifications\n loadCertifications(BMA.wot.certifiersOf, data.pubkey, data.lookup ? data.lookup.certifications[idtyFullKey] : null, parameters, medianTime, true /*certifiersOf*/)\n .then(function (res) {\n data.received_cert = res.valid;\n data.received_cert_pending = res.pending;\n data.received_cert_error = res.error;\n }),\n\n // Get given certifications\n loadCertifications(BMA.wot.certifiedBy, data.pubkey, data.lookup ? data.lookup.givenCertifications : null, parameters, medianTime, false/*certifiersOf*/)\n .then(function (res) {\n data.given_cert = res.valid;\n data.given_cert_pending = res.pending;\n data.given_cert_error = res.error;\n })\n ]);\n })\n .then(function() {\n // Add compute some additional requirements (that required all data like certifications)\n finishLoadRequirements(data);\n\n // API extension\n return api.data.raisePromise.load(data)\n .catch(function(err) {\n console.debug('Error while loading identity data, on extension point.');\n console.error(err);\n });\n })\n .then(function() {\n if (!data.pubkey) return undefined; // not found\n delete data.lookup; // not need anymore\n identityCache.put(data.pubkey, data); // add to cache\n console.debug('[wot] Identity '+ data.pubkey.substring(0, 8) +' loaded in '+ (Date.now()-now) +'ms');\n return data;\n });\n },\n\n search = function(text, options) {\n if (!text || text.trim() !== text) {\n return $q.when(undefined);\n }\n\n // Remove first special characters (to avoid request error)\n var safeText = text.replace(/(^|\\s)#\\w+/g, ''); // remove tags\n safeText = safeText.replace(/[^a-zA-Z0-9_-\\s]+/g, '');\n safeText = safeText.replace(/\\s+/g, ' ').trim();\n\n options = options || {};\n options.addUniqueId = angular.isDefined(options.addUniqueId) ? options.addUniqueId : true;\n options.allowExtension = angular.isDefined(options.allowExtension) ? options.allowExtension : true;\n options.excludeRevoked = angular.isDefined(options.excludeRevoked) ? options.excludeRevoked : false;\n\n var promise;\n if (!safeText) {\n promise = $q.when([]);\n }\n else {\n promise = $q.all(\n safeText.split(' ').reduce(function(res, text) {\n console.debug('[wot] Will search on: \\'' + text + '\\'');\n return res.concat(BMA.wot.lookup({ search: text }));\n }, [])\n ).then(function(res){\n return res.reduce(function(idties, res) {\n return idties.concat(res.results.reduce(function(idties, res) {\n return idties.concat(res.uids.reduce(function(uids, idty) {\n var blocUid = idty.meta.timestamp.split('-', 2);\n var revoked = !idty.revoked && idty.revocation_sig;\n if (!options.excludeRevoked || !revoked) {\n return uids.concat({\n uid: idty.uid,\n pubkey: res.pubkey,\n number: blocUid[0],\n hash: blocUid[1],\n revoked: revoked\n });\n }\n return uids;\n }, []));\n }, []));\n }, []);\n })\n .catch(function(err) {\n if (err && err.ucode == BMA.errorCodes.NO_MATCHING_IDENTITY) {\n return [];\n }\n else {\n throw err;\n }\n });\n }\n\n return promise\n .then(function(idties) {\n if (!options.allowExtension) {\n // Add unique id (if enable)\n return options.addUniqueId ? _addUniqueIds(idties) : idties;\n }\n var lookupResultCount = idties.length;\n // call extension point\n return api.data.raisePromise.search(text, idties, 'pubkey')\n .then(function() {\n\n // Make sure to add uid to new results - fix #488\n if (idties.length > lookupResultCount) {\n var idtiesWithoutUid = _.filter(idties, function(idty) {\n return !idty.uid && idty.pubkey;\n });\n if (idtiesWithoutUid.length) {\n return BMA.wot.member.uids()\n .then(function(uids) {\n _.forEach(idties, function(idty) {\n if (!idty.uid && idty.pubkey) {\n idty.uid = uids[idty.pubkey];\n }\n });\n });\n }\n }\n })\n .then(function() {\n // Add unique id (if enable)\n return options.addUniqueId ? _addUniqueIds(idties) : idties;\n });\n });\n },\n\n getNewcomers = function(offset, size) {\n offset = offset || 0;\n size = size || 20;\n return BMA.blockchain.stats.newcomers()\n .then(function(res) {\n if (!res.result.blocks || !res.result.blocks.length) {\n return null;\n }\n var blocks = _.sortBy(res.result.blocks, function (n) {\n return -n;\n });\n return getNewcomersRecursive(blocks, 0, 5, offset+size);\n })\n .then(function(idties){\n if (!idties || !idties.length) {\n return null;\n }\n idties = _sortAndSliceIdentities(idties, offset, size);\n\n // Extension point\n return extendAll(idties, 'pubkey', true/*skipAddUid*/);\n });\n },\n\n\n getNewcomersRecursive = function(blocks, offset, size, maxResultSize) {\n return $q(function(resolve, reject) {\n var result = [];\n var jobs = [];\n _.each(blocks.slice(offset, offset+size), function(number) {\n jobs.push(\n BMA.blockchain.block({block: number})\n .then(function(block){\n if (!block || !block.joiners) return;\n _.each(block.joiners, function(joiner){\n var parts = joiner.split(':');\n var idtyKey = parts[parts.length-1]/*uid*/ + '-' + parts[0]/*pubkey*/;\n result.push({\n id: idtyKey,\n uid: parts[parts.length-1],\n pubkey:parts[0],\n memberDate: block.medianTime,\n block: block.number\n });\n });\n })\n );\n });\n\n $q.all(jobs)\n .then(function() {\n if (result.length < maxResultSize && offset < blocks.length - 1) {\n $timeout(function() {\n getNewcomersRecursive(blocks, offset+size, size, maxResultSize - result.length)\n .then(function(res) {\n resolve(result.concat(res));\n })\n .catch(function(err) {\n reject(err);\n });\n }, 1000);\n }\n else {\n resolve(result);\n }\n })\n .catch(function(err){\n if (err && err.ucode === BMA.errorCodes.HTTP_LIMITATION) {\n resolve(result);\n }\n else {\n reject(err);\n }\n });\n });\n },\n\n getPending = function(offset, size) {\n offset = offset || 0;\n size = size || 20;\n return $q.all([\n BMA.wot.member.uids(),\n BMA.wot.member.pending()\n .then(function(res) {\n return (res.memberships && res.memberships.length) ? res.memberships : undefined;\n })\n ])\n .then(function(res) {\n var uids = res[0];\n var memberships = res[1];\n if (!memberships) return;\n\n var idtiesByBlock = {};\n var idtiesByPubkey = {};\n _.forEach(memberships, function(ms){\n if (ms.membership == 'IN' && !uids[ms.pubkey]) {\n var idty = {\n uid: ms.uid,\n pubkey: ms.pubkey,\n block: ms.blockNumber,\n blockHash: ms.blockHash\n };\n var otherIdtySamePubkey = idtiesByPubkey[ms.pubkey];\n if (otherIdtySamePubkey && idty.block > otherIdtySamePubkey.block) {\n return; // skip\n }\n idtiesByPubkey[idty.pubkey] = idty;\n if (!idtiesByBlock[idty.block]) {\n idtiesByBlock[idty.block] = [idty];\n }\n else {\n idtiesByBlock[idty.block].push(idty);\n }\n\n // Remove previous idty from map\n if (otherIdtySamePubkey) {\n idtiesByBlock[otherIdtySamePubkey.block] = idtiesByBlock[otherIdtySamePubkey.block].reduce(function(res, aidty){\n if (aidty.pubkey == otherIdtySamePubkey.pubkey) return res; // if match idty to remove, to NOT add\n return (res||[]).concat(aidty);\n }, null);\n if (idtiesByBlock[otherIdtySamePubkey.block] === null) {\n delete idtiesByBlock[otherIdtySamePubkey.block];\n }\n }\n }\n });\n var idties = _sortAndSliceIdentities(_.values(idtiesByPubkey), offset, size);\n var blocks = idties.reduce(function(res, aidty) {\n return res.concat(aidty.block);\n }, []);\n\n return $q.all([\n // Get time from blocks\n BMA.blockchain.blocks(_.uniq(blocks))\n .then(function(blocks) {\n\n _.forEach(blocks, function(block){\n _.forEach(idtiesByBlock[block.number], function(idty) {\n idty.sigDate = block.medianTime;\n if (block.number !== 0 && idty.blockHash !== block.hash) {\n addEvent(idty, {type:'error', message: 'ERROR.WOT_PENDING_INVALID_BLOCK_HASH'});\n console.debug(\"Invalid membership for uid={0}: block hash changed\".format(idty.uid));\n }\n });\n });\n }),\n\n // Extension point\n extendAll(idties, 'pubkey', true/*skipAddUid*/)\n ])\n .then(function() {\n return idties;\n });\n });\n },\n\n getAll = function() {\n var letters = ['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'];\n return getAllRecursive(letters, 0, BMA.constants.LIMIT_REQUEST_COUNT)\n .then(function(idties) {\n return extendAll(idties, 'pubkey', true/*skipAddUid*/)\n .then(function() {\n return _addUniqueIds(idties);\n });\n });\n },\n\n getAllRecursive = function(letters, offset, size) {\n return $q(function(resolve, reject) {\n var result = [];\n var pubkeys = {};\n var jobs = [];\n _.each(letters.slice(offset, offset+size), function(letter) {\n jobs.push(\n search(letter, {\n addUniqueId: false, // will be done in parent method\n allowExtension: false // extension point will be called in parent method\n })\n .then(function(idties){\n if (!idties || !idties.length) return;\n result = idties.reduce(function(res, idty) {\n if (!pubkeys[idty.pubkey]) {\n pubkeys[idty.pubkey] = true;\n return res.concat(idty);\n }\n return res;\n }, result);\n })\n );\n });\n\n $q.all(jobs)\n .then(function() {\n if (offset < letters.length - 1) {\n $timeout(function() {\n getAllRecursive(letters, offset+size, size)\n .then(function(idties) {\n if (!idties || !idties.length) {\n resolve(result);\n return;\n }\n resolve(idties.reduce(function(res, idty) {\n if (!pubkeys[idty.pubkey]) {\n pubkeys[idty.pubkey] = true;\n return res.concat(idty);\n }\n return res;\n }, result));\n })\n .catch(function(err) {\n reject(err);\n });\n }, BMA.constants.LIMIT_REQUEST_DELAY);\n }\n else {\n resolve(result);\n }\n })\n .catch(function(err){\n if (err && err.ucode === BMA.errorCodes.HTTP_LIMITATION) {\n resolve(result);\n }\n else {\n reject(err);\n }\n });\n });\n },\n\n extend = function(idty, pubkeyAttributeName, skipAddUid) {\n return extendAll([idty], pubkeyAttributeName, skipAddUid)\n .then(function(res) {\n return res[0];\n });\n },\n\n extendAll = function(idties, pubkeyAttributeName, skipAddUid) {\n\n pubkeyAttributeName = pubkeyAttributeName || 'pubkey';\n\n var jobs = [];\n if (!skipAddUid) jobs.push(BMA.wot.member.uids());\n\n jobs.push(api.data.raisePromise.search(null, idties, pubkeyAttributeName)\n .catch(function(err) {\n console.debug('Error while search identities, on extension point.');\n console.error(err);\n }));\n\n return $q.all(jobs)\n .then(function(res) {\n if (!skipAddUid) {\n var uidsByPubkey = res[0];\n // Set uid (on every data)\n _.forEach(idties, function(data) {\n if (!data.uid && data[pubkeyAttributeName]) {\n data.uid = uidsByPubkey[data[pubkeyAttributeName]];\n // Remove name if redundant with uid\n if (data.uid && data.uid == data.name) {\n delete data.name;\n }\n }\n });\n }\n\n return idties;\n });\n },\n\n addEvent = function(data, event) {\n event = event || {};\n event.type = event.type || 'info';\n event.message = event.message || '';\n event.messageParams = event.messageParams || {};\n data.events = data.events || [];\n data.events.push(event);\n }\n ;\n\n // Register extension points\n api.registerEvent('data', 'load');\n api.registerEvent('data', 'search');\n\n return {\n id: id,\n load: loadData,\n search: search,\n newcomers: getNewcomers,\n pending: getPending,\n all: getAll,\n extend: extend,\n extendAll: extendAll,\n // api extension\n api: api\n };\n }\n\n var service = factory('default', BMA);\n\n service.instance = factory;\n return service;\n}]);\n","\nangular.module('cesium.tx.services', ['ngApi', 'cesium.bma.services',\n 'cesium.settings.services', 'cesium.wot.services' ])\n\n.factory('csTx', ['$q', '$timeout', '$filter', '$translate', 'UIUtils', 'BMA', 'Api', 'csConfig', 'csSettings', 'csWot', 'FileSaver', function($q, $timeout, $filter, $translate, UIUtils, BMA, Api, csConfig, csSettings, csWot, FileSaver) {\n 'ngInject';\n\n function factory(id, BMA) {\n\n var\n api = new Api(this, \"csTx-\" + id),\n\n _reduceTxAndPush = function(pubkey, txArray, result, processedTxMap, allowPendings) {\n if (!txArray || txArray.length === 0) {\n return;\n }\n\n _.forEach(txArray, function(tx) {\n if (tx.block_number || allowPendings) {\n var walletIsIssuer = false;\n var otherIssuer = tx.issuers.reduce(function(issuer, res) {\n walletIsIssuer = (res === pubkey) ? true : walletIsIssuer;\n return issuer + ((res !== pubkey) ? ', ' + res : '');\n }, '');\n if (otherIssuer.length > 0) {\n otherIssuer = otherIssuer.substring(2);\n }\n var otherReceiver;\n var outputBase;\n var sources = [];\n var lockedOutputs;\n var amount = tx.outputs.reduce(function(sum, output, noffset) {\n var outputArray = output.split(':',3);\n outputBase = parseInt(outputArray[1]);\n var outputAmount = powBase(parseInt(outputArray[0]), outputBase);\n var outputCondition = outputArray[2];\n var sigMatches = BMA.regexp.TX_OUTPUT_SIG.exec(outputCondition);\n\n // Simple unlock condition\n if (sigMatches) {\n var outputPubkey = sigMatches[1];\n if (outputPubkey == pubkey) { // output is for the wallet\n if (!walletIsIssuer) {\n return sum + outputAmount;\n }\n // If pending: use output as new sources\n else if (tx.block_number === null) {\n sources.push({\n amount: parseInt(outputArray[0]),\n base: outputBase,\n type: 'T',\n identifier: tx.hash,\n noffset: noffset,\n consumed: false\n });\n }\n }\n else { // output is for someone else\n if (outputPubkey !== '' && outputPubkey != otherIssuer) {\n otherReceiver = outputPubkey;\n }\n if (walletIsIssuer) {\n return sum - outputAmount;\n }\n }\n }\n\n // Complex unlock condition, on the issuer pubkey\n else if (outputCondition.indexOf('SIG('+pubkey+')') != -1) {\n var lockedOutput = BMA.tx.parseUnlockCondition(outputCondition);\n if (lockedOutput) {\n // Add a source\n // FIXME: should be uncomment when filtering source on transfer()\n /*sources.push(angular.merge({\n amount: parseInt(outputArray[0]),\n base: outputBase,\n type: 'T',\n identifier: tx.hash,\n noffset: noffset,\n consumed: false\n }, lockedOutput));\n */\n lockedOutput.amount = outputAmount;\n lockedOutputs = lockedOutputs || [];\n lockedOutputs.push(lockedOutput);\n console.debug('[tx] has locked output:', lockedOutput);\n\n return sum + outputAmount;\n }\n }\n return sum;\n }, 0);\n\n var txPubkey = amount > 0 ? otherIssuer : otherReceiver;\n var time = tx.time || tx.blockstampTime;\n\n // Avoid duplicated tx, or tx to him self\n var txKey = amount + ':' + tx.hash + ':' + time;\n if (!processedTxMap[txKey] && amount !== 0) {\n processedTxMap[txKey] = true;\n var newTx = {\n time: time,\n amount: amount,\n pubkey: txPubkey,\n comment: tx.comment,\n isUD: false,\n hash: tx.hash,\n locktime: tx.locktime,\n block_number: tx.block_number\n };\n // If pending: store sources and inputs for a later use - see method processTransactionsAndSources()\n if (walletIsIssuer && tx.block_number === null) {\n newTx.inputs = tx.inputs;\n newTx.sources = sources;\n }\n if (lockedOutputs) {\n newTx.lockedOutputs = lockedOutputs;\n }\n result.push(newTx);\n }\n }\n });\n },\n\n loadTx = function(pubkey, fromTime, existingPendings) {\n return $q(function(resolve, reject) {\n var txHistory = [];\n var udHistory = [];\n var txPendings = [];\n\n var nowInSec = Math.trunc(new Date().getTime() / 1000); // TODO test to replace using moment().utc().unix()\n fromTime = fromTime || (nowInSec - csSettings.data.walletHistoryTimeSecond);\n var processedTxMap = {};\n var tx = {\n pendings: []\n };\n\n var _reduceTx = function(res){\n _reduceTxAndPush(pubkey, res.history.sent, txHistory, processedTxMap);\n _reduceTxAndPush(pubkey, res.history.received, txHistory, processedTxMap);\n _reduceTxAndPush(pubkey, res.history.sending, txHistory, processedTxMap);\n _reduceTxAndPush(pubkey, res.history.pending, txPendings, processedTxMap, true /*allow pendings*/);\n };\n\n var jobs = [\n // get pendings history\n BMA.tx.history.pending({pubkey: pubkey})\n .then(_reduceTx)\n ];\n\n // get TX history since\n if (fromTime !== -1) {\n var sliceTime = csSettings.data.walletHistorySliceSecond;\n for(var i = fromTime - (fromTime % sliceTime); i - sliceTime < nowInSec; i += sliceTime) {\n jobs.push(BMA.tx.history.times({pubkey: pubkey, from: i, to: i+sliceTime-1})\n .then(_reduceTx)\n );\n }\n\n jobs.push(BMA.tx.history.timesNoCache({pubkey: pubkey, from: nowInSec - (nowInSec % sliceTime), to: nowInSec+999999999})\n .then(_reduceTx));\n }\n\n // get all TX\n else {\n jobs.push(BMA.tx.history.all({pubkey: pubkey})\n .then(_reduceTx)\n );\n }\n\n // get UD history\n // FIXME issue#232\n /*\n if (csSettings.data.showUDHistory) {\n jobs.push(\n BMA.ud.history({pubkey: pubkey})\n .then(function(res){\n udHistory = !res.history || !res.history.history ? [] :\n res.history.history.reduce(function(res, ud){\n if (ud.time < fromTime) return res; // skip to old UD\n var amount = powBase(ud.amount, ud.base);\n return res.concat({\n time: ud.time,\n amount: amount,\n isUD: true,\n block_number: ud.block_number\n });\n }, []);\n }));\n }\n */\n\n // Execute jobs\n $q.all(jobs)\n .then(function(){\n // sort by time desc\n tx.history = txHistory.concat(udHistory).sort(function(tx1, tx2) {\n return (tx2.time - tx1.time);\n });\n tx.pendings = txPendings;\n\n tx.fromTime = fromTime;\n tx.toTime = tx.history.length ? tx.history[0].time /*=max(tx.time)*/: fromTime;\n\n\n resolve(tx);\n })\n .catch(function(err) {\n tx.history = [];\n tx.pendings = [];\n tx.errors = [];\n delete tx.fromTime;\n delete tx.toTime;\n reject(err);\n });\n });\n },\n\n powBase = function(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n },\n\n addSource = function(src, sources, sourcesIndexByKey) {\n var srcKey = src.type+':'+src.identifier+':'+src.noffset;\n if (angular.isUndefined(sourcesIndexByKey[srcKey])) {\n sources.push(src);\n sourcesIndexByKey[srcKey] = sources.length - 1;\n }\n },\n\n addSources = function(result, sources) {\n _(sources).forEach(function(src) {\n addSource(src, result.sources, result.sourcesIndexByKey);\n });\n },\n\n loadSourcesAndBalance = function(pubkey) {\n return BMA.tx.sources({pubkey: pubkey})\n .then(function(res){\n var result = {\n sources: [],\n sourcesIndexByKey: [],\n balance: 0\n };\n if (res.sources && res.sources.length) {\n _.forEach(res.sources, function(src) {\n src.consumed = false;\n result.balance += powBase(src.amount, src.base);\n });\n addSources(result, res.sources);\n }\n return result;\n });\n },\n\n loadData = function(pubkey, fromTime) {\n var now = new Date().getTime();\n\n var data = {};\n return $q.all([\n // Load Sources\n loadSourcesAndBalance(pubkey),\n\n // Load Tx\n loadTx(pubkey, fromTime)\n ])\n\n .then(function(res) {\n angular.merge(data, res[0]);\n data.tx = res[1];\n\n var txPendings = [];\n var txErrors = [];\n var balance = data.balance;\n\n function _processPendingTx(tx) {\n var consumedSources = [];\n var valid = true;\n if (tx.amount > 0) { // do not check sources from received TX\n valid = false;\n // TODO get sources from the issuer ?\n }\n else {\n _.forEach(tx.inputs, function(input) {\n var inputKey = input.split(':').slice(2).join(':');\n var srcIndex = data.sourcesIndexByKey[inputKey];\n if (angular.isDefined(srcIndex)) {\n consumedSources.push(data.sources[srcIndex]);\n }\n else {\n valid = false;\n return false; // break\n }\n });\n if (tx.sources) { // add source output\n addSources(data, tx.sources);\n }\n delete tx.sources;\n delete tx.inputs;\n }\n if (valid) {\n balance += tx.amount; // update balance\n txPendings.push(tx);\n _.forEach(consumedSources, function(src) {\n src.consumed=true;\n });\n }\n else {\n txErrors.push(tx);\n }\n }\n\n var txs = data.tx.pendings;\n var retry = true;\n while(txs && txs.length > 0) {\n // process TX pendings\n _.forEach(txs, _processPendingTx);\n\n // Retry once (TX could be chained and processed in a wrong order)\n if (txErrors.length > 0 && txPendings.length > 0 && retry) {\n txs = txErrors;\n txErrors = [];\n retry = false;\n }\n else {\n txs = null;\n }\n }\n\n data.tx.pendings = txPendings;\n data.tx.errors = txErrors;\n data.balance = balance;\n\n // Will add uid (+ plugin will add name, avatar, etc. if enable)\n return csWot.extendAll((data.tx.history || []).concat(data.tx.pendings||[]), 'pubkey');\n })\n .then(function() {\n console.debug('[tx] TX and sources loaded in '+ (new Date().getTime()-now) +'ms');\n return data;\n });\n };\n\n // Download TX history file\n downloadHistoryFile = function(pubkey, options) {\n\n options = options || {};\n options.fromTime = options.fromTime || -1;\n\n console.debug(\"[tx] Exporting TX history for pubkey [{0}]\".format(pubkey.substr(0,8)));\n\n return $q.all([\n $translate(['ACCOUNT.HEADERS.TIME',\n 'COMMON.UID',\n 'COMMON.PUBKEY',\n 'ACCOUNT.HEADERS.AMOUNT',\n 'ACCOUNT.HEADERS.COMMENT']),\n //TODO : Utiliser plutôt csCurency pour avoir le bloc courant\n BMA.blockchain.current(),\n loadData(pubkey, options.fromTime)\n ])\n .then(function(result){\n\n var translations = result[0];\n\n var currentBlock = result[1];\n var currentTime = (currentBlock && currentBlock.medianTime) || moment().utc().unix();\n var currency = currentBlock && currentBlock.currency;\n\n result = result[2];\n\n // no TX\n if (!result || !result.tx || !result.tx.history) {\n return UIUtils.toast.show('INFO.EMPTY_TX_HISTORY');\n }\n\n return $translate('ACCOUNT.FILE_NAME', {currency: currency, pubkey: pubkey, currentTime : currentTime})\n .then(function(result){\n\n var formatDecimal = $filter('formatDecimal');\n var formatPubkey = $filter('formatPubkey');\n var formatDate = $filter('formatDate');\n var formatDateForFile = $filter('formatDateForFile');\n var formatSymbol = $filter('currencySymbolNoHtml');\n\n var headers = [\n translations['ACCOUNT.HEADERS.TIME'],\n translations['COMMON.UID'],\n translations['COMMON.PUBKEY'],\n translations['ACCOUNT.HEADERS.AMOUNT'] + ' (' + formatSymbol(currency) + ')',\n translations['ACCOUNT.HEADERS.COMMENT']\n ];\n var content = result.tx.history.reduce(function(res, tx){\n return res.concat([\n formatDate(tx.time),\n tx.uid,\n tx.pubkey,\n formatDecimal(tx.amount/100),\n '\"' + tx.comment + '\"'\n ].join(';') + '\\n');\n }, [headers.join(';') + '\\n']);\n\n var file = new Blob(content, {type: 'text/plain; charset=utf-8'});\n\n FileSaver.saveAs(file, result);\n });\n });\n };\n\n\n return {\n id: id,\n load: loadData,\n downloadHistoryFile: downloadHistoryFile,\n // api extension\n api: api\n };\n }\n\n var service = factory('default', BMA);\n\n service.instance = factory;\n return service;\n}]);\n","\nangular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.services', 'cesium.crypto.services', 'cesium.utils.services',\n 'cesium.settings.services'])\n\n\n.factory('csWallet', ['$q', '$rootScope', '$timeout', '$translate', '$filter', 'Api', 'localStorage', 'CryptoUtils', 'BMA', 'csConfig', 'csSettings', 'FileSaver', 'Blob', 'csWot', 'csTx', 'csCurrency', function($q, $rootScope, $timeout, $translate, $filter, Api, localStorage,\n CryptoUtils, BMA, csConfig, csSettings, FileSaver, Blob, csWot, csTx, csCurrency) {\n 'ngInject';\n\n function factory(id, BMA) {\n\n var\n constants = {\n OLD_STORAGE_KEY: 'CESIUM_DATA',\n STORAGE_KEY: 'GCHANGE_DATA'\n },\n data = {},\n listeners,\n started,\n startPromise,\n api = new Api(this, 'csWallet-' + id),\n\n resetData = function(init) {\n data.loaded = false;\n data.pubkey = null;\n data.qrcode = null;\n\n data.uid = null;\n data.isNew = null;\n data.events = [];\n\n resetKeypair();\n\n started = false;\n startPromise = undefined;\n\n if (init) {\n api.data.raise.init(data);\n }\n else {\n if (!csSettings.data.useLocalStorage) {\n csSettings.reset();\n }\n api.data.raise.reset(data);\n }\n },\n\n resetKeypair = function(){\n data.keypair = {\n signSk: null,\n signPk: null\n };\n },\n\n login = function(salt, password) {\n if (!salt || !password) throw Error('Missing required arguments');\n return CryptoUtils.scryptKeypair(salt, password)\n .then(function(keypair) {\n // Copy result to properties\n data.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n\n // FOR DEV ONLY - on crosschain\n // console.error('TODO REMOVE this code - dev only'); data.pubkey = '36j6pCNzKDPo92m7UXJLFpgDbcLFAZBgThD2TCwTwGrd';\n\n data.keypair = keypair;\n\n // Call login check (can stop the login process)\n return api.data.raisePromise.loginCheck(data)\n // reset data then stop process\n .catch(function(err) {\n resetData();\n throw err;\n })\n // Call extend api (cannot stop login process)\n .then(function() {\n return api.data.raisePromise.login(data);\n });\n })\n\n // store if need\n .then(function() {\n if (csSettings.data.useLocalStorage) {\n store();\n }\n return data;\n });\n },\n\n logout = function() {\n return $q(function(resolve, reject) {\n\n resetData(); // will reset keypair\n store(); // store (if local storage enable)\n\n // Send logout event\n api.data.raise.logout();\n\n // Send unauth event (compat with new Cesium auth)\n api.data.raise.unauth();\n\n resolve();\n });\n },\n\n isLogin = function() {\n return !!data.pubkey;\n },\n\n getKeypair = function(options) {\n if (!started) {\n return (startPromise || start())\n .then(function () {\n return getKeypair(options); // loop\n });\n }\n\n if (isLogin()) {\n return $q.when(data.keypair);\n }\n return $q.reject('Not auth');\n },\n\n isDataLoaded = function(options) {\n if (options && options.minData) return data.loaded;\n return data.loaded; // && data.sources; -- Gchange not use sources\n },\n\n isNeverUsed = function() {\n if (!data.loaded) return undefined; // undefined if not full loaded\n return !data.pubkey || !(\n // Check extended data (name, profile, avatar)\n data.name ||\n data.profile ||\n data.avatar\n );\n },\n\n isNew = function() {return !!data.isNew;},\n\n // If connected and same pubkey\n isUserPubkey = function(pubkey) {\n return isLogin() && data.pubkey === pubkey;\n },\n\n store = function() {\n if (csSettings.data.useLocalStorage) {\n\n if (isLogin() && csSettings.data.rememberMe) {\n\n var dataToStore = {\n keypair: data.keypair,\n pubkey: data.pubkey,\n version: csConfig.version\n };\n\n localStorage.setObject(constants.STORAGE_KEY, dataToStore);\n }\n else {\n localStorage.setObject(constants.STORAGE_KEY, null);\n }\n }\n else {\n localStorage.setObject(constants.STORAGE_KEY, null);\n }\n\n // Remove old storage key\n localStorage.setObject(constants.OLD_STORAGE_KEY, null);\n },\n\n restore = function() {\n return localStorage.get(constants.STORAGE_KEY)\n .then(function(dataStr) {\n // If found: continue\n if (dataStr) return dataStr;\n\n // If not found, then read the old storage key\n try {\n return localStorage.get(constants.OLD_STORAGE_KEY)\n .catch(function() {\n console.debug('No settings stored in ' + constants.OLD_STORAGE_KEY + ' key. Continue');\n return; // Continue if not found\n });\n }\n catch(err) {\n console.debug('No settings stored in ' + constants.OLD_STORAGE_KEY + ' key. Continue');\n return; // Continue if error\n }\n })\n .then(function(dataStr) {\n if (!dataStr) return;\n return fromJson(dataStr, false)\n .then(function(storedData){\n if (storedData && storedData.keypair && storedData.pubkey) {\n data.keypair = storedData.keypair;\n data.pubkey = storedData.pubkey;\n data.loaded = false;\n\n // Call extend api\n return api.data.raisePromise.login(data);\n }\n })\n .then(function(){\n return data;\n });\n });\n },\n\n getData = function() {\n return data;\n },\n\n loadQrCode = function(){\n if (!data.pubkey || data.qrcode) return $q.when(data.qrcode);\n console.debug(\"[wallet] Creating SVG QRCode...\");\n return $timeout(function() {\n data.qrcode = UIUtils.qrcode.svg(data.pubkey);\n return data.qrcode;\n });\n },\n\n loadData = function(options) {\n\n if (options && options.minData) {\n return loadMinData(options);\n }\n\n if (options || data.loaded) {\n return refreshData(options);\n }\n\n return loadFullData();\n },\n\n loadFullData = function() {\n data.loaded = false;\n\n return $q.all([\n\n // API extension\n api.data.raisePromise.load(data, null)\n .catch(function(err) {\n console.error('Error while loading wallet data, on extension point. Try to continue');\n console.error(err);\n })\n ])\n .then(function() {\n return api.data.raisePromise.finishLoad(data)\n .catch(function(err) {\n console.error('Error while finishing wallet data load, on extension point. Try to continue');\n console.error(err);\n });\n })\n .then(function() {\n data.loaded = true;\n return data;\n })\n .catch(function(err) {\n data.loaded = false;\n throw err;\n });\n },\n\n loadMinData = function(options) {\n options = options || {};\n return refreshData(options);\n },\n\n refreshData = function(options) {\n options = options || {\n api: true\n };\n\n // Force some load (parameters & requirements) if not already loaded\n var jobs = [];\n\n // Reset events\n cleanEventsByContext('requirements');\n\n // API extension (force if no other jobs)\n if (!jobs.length || options.api) jobs.push(api.data.raisePromise.load(data, options));\n\n return $q.all(jobs)\n .then(function(){\n return api.data.raisePromise.finishLoad(data);\n })\n .then(function(){\n return data;\n })\n .catch(function(err) {\n console.error(\"Failed to execute refreshData() jobs:\", err);\n });\n },\n\n addEvent = function(event, insertAtFirst) {\n event = event || {};\n event.type = event.type || 'info';\n event.message = event.message || '';\n event.messageParams = event.messageParams || {};\n event.context = event.context || 'undefined';\n if (event.message.trim().length) {\n if (!insertAtFirst) {\n data.events.push(event);\n }\n else {\n data.events.splice(0, 0, event);\n }\n }\n else {\n console.debug('Event without message. Skipping this event');\n }\n },\n\n getkeypairSaveId = function(record) {\n var nbCharSalt = Math.round(record.answer.length / 2);\n var salt = record.answer.substr(0, nbCharSalt);\n var pwd = record.answer.substr(nbCharSalt);\n return CryptoUtils.scryptKeypair(salt, pwd)\n .then(function (keypair) {\n record.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n record.keypair = keypair;\n return record;\n });\n },\n\n getCryptedId = function(record){\n return getkeypairSaveId(record)\n .then(function() {\n return CryptoUtils.util.random_nonce();\n })\n .then(function(nonce) {\n record.nonce = nonce;\n return CryptoUtils.box.pack(record.salt, record.nonce, record.keypair.boxPk, record.keypair.boxSk);\n })\n .then(function (cypherSalt) {\n record.salt = cypherSalt;\n return CryptoUtils.box.pack(record.pwd, record.nonce, record.keypair.boxPk, record.keypair.boxSk);\n })\n .then(function (cypherPwd) {\n record.pwd = cypherPwd;\n record.nonce = CryptoUtils.util.encode_base58(record.nonce);\n return record;\n });\n },\n\n recoverId = function(recover) {\n var nonce = CryptoUtils.util.decode_base58(recover.cypherNonce);\n return getkeypairSaveId(recover)\n .then(function (recover) {\n return CryptoUtils.box.open(recover.cypherSalt, nonce, recover.keypair.boxPk, recover.keypair.boxSk);\n })\n .then(function (salt) {\n recover.salt = salt;\n return CryptoUtils.box.open(recover.cypherPwd, nonce, recover.keypair.boxPk, recover.keypair.boxSk);\n })\n .then(function (pwd) {\n recover.pwd = pwd;\n return recover;\n })\n .catch(function(err){\n console.warn('Incorrect answers - Unable to recover passwords');\n });\n },\n\n getSaveIDDocument = function(record) {\n var saveId = 'Version: 10 \\n' +\n 'Type: SaveID\\n' +\n 'Questions: ' + '\\n' + record.questions +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'Crypted-Nonce: '+ record.nonce + '\\n'+\n 'Crypted-Pubkey: '+ record.pubkey +'\\n' +\n 'Crypted-Salt: '+ record.salt + '\\n' +\n 'Crypted-Pwd: '+ record.pwd + '\\n';\n\n // Sign SaveId document\n return CryptoUtils.sign(saveId, data.keypair)\n\n .then(function(signature) {\n saveId += signature + '\\n';\n console.debug('Has generate an SaveID document:\\n----\\n' + saveId + '----');\n return saveId;\n });\n\n },\n\n downloadSaveId = function(record){\n return getSaveIDDocument(record)\n .then(function(saveId) {\n var saveIdFile = new Blob([saveId], {type: 'text/plain; charset=utf-8'});\n FileSaver.saveAs(saveIdFile, 'saveID.txt');\n });\n\n },\n\n cleanEventsByContext = function(context){\n data.events = data.events.reduce(function(res, event) {\n if (event.context && event.context == context) return res;\n return res.concat(event);\n },[]);\n },\n\n /**\n * De-serialize from JSON string\n */\n fromJson = function(json, failIfInvalid) {\n failIfInvalid = angular.isUndefined(failIfInvalid) ? true : failIfInvalid;\n return $q(function(resolve, reject) {\n var obj = JSON.parse(json || '{}');\n // FIXME #379\n /*if (obj && obj.pubkey) {\n resolve({\n pubkey: obj.pubkey\n });\n }\n else */\n if (obj && obj.keypair && obj.keypair.signPk && obj.keypair.signSk) {\n var keypair = {};\n var i;\n\n // sign Pk : Convert to Uint8Array type\n var signPk = new Uint8Array(32);\n for (i = 0; i < 32; i++) signPk[i] = obj.keypair.signPk[i];\n keypair.signPk = signPk;\n\n var signSk = new Uint8Array(64);\n for (i = 0; i < 64; i++) signSk[i] = obj.keypair.signSk[i];\n keypair.signSk = signSk;\n\n // box Pk : Convert to Uint8Array type\n if (obj.version && obj.keypair.boxPk) {\n var boxPk = new Uint8Array(32);\n for (i = 0; i < 32; i++) boxPk[i] = obj.keypair.boxPk[i];\n keypair.boxPk = boxPk;\n }\n\n if (obj.version && obj.keypair.boxSk) {\n var boxSk = new Uint8Array(32);\n for (i = 0; i < 64; i++) boxSk[i] = obj.keypair.boxSk[i];\n keypair.boxSk = boxSk;\n }\n\n resolve({\n pubkey: obj.pubkey,\n keypair: keypair,\n tx: obj.tx\n });\n }\n else if (failIfInvalid) {\n reject('Not a valid Wallet.data object');\n }\n else {\n resolve();\n }\n });\n }\n ;\n\n function addListeners() {\n listeners = [\n // Listen if settings changed\n csSettings.api.data.on.changed($rootScope, store, this),\n // Listen if node changed\n BMA.api.node.on.restart($rootScope, restart, this)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function ready() {\n if (started) return $q.when();\n return startPromise || start();\n }\n\n function stop() {\n console.debug('[wallet] Stopping...');\n removeListeners();\n resetData();\n }\n\n function restart() {\n stop();\n return $timeout(start, 200);\n }\n\n function start() {\n console.debug('[wallet] Starting...');\n var now = new Date().getTime();\n\n startPromise = $q.all([\n csSettings.ready(),\n csCurrency.ready(),\n BMA.ready()\n ])\n\n // Restore\n .then(restore)\n\n // Load data (if a wallet restored)\n .then(function(data) {\n if (data && data.pubkey) {\n return loadData({minData: true});\n }\n })\n\n // Emit ready event\n .then(function() {\n addListeners();\n\n console.debug('[wallet] Started in ' + (new Date().getTime() - now) + 'ms');\n\n started = true;\n startPromise = null;\n\n // Emit event (used by plugins)\n api.data.raise.ready(data);\n })\n .then(function(){\n return data;\n });\n\n return startPromise;\n }\n\n // Register extension points\n api.registerEvent('data', 'ready');\n api.registerEvent('data', 'init');\n api.registerEvent('data', 'loginCheck'); // allow to stop the login process\n api.registerEvent('data', 'login'); // executed after login check (cannot stop the login process)\n api.registerEvent('data', 'load');\n api.registerEvent('data', 'finishLoad');\n api.registerEvent('data', 'logout');\n api.registerEvent('data', 'unauth');\n api.registerEvent('data', 'reset');\n\n api.registerEvent('error', 'send');\n\n api.registerEvent('action', 'certify');\n\n // init data\n resetData(true);\n\n return {\n id: id,\n data: data,\n ready: ready,\n start: start,\n stop: stop,\n // auth\n login: login,\n logout: logout,\n isLogin: isLogin,\n getKeypair: getKeypair,\n isDataLoaded: isDataLoaded,\n isNeverUsed: isNeverUsed,\n isNew: function() {return !!data.isNew;},\n isUserPubkey: isUserPubkey,\n getData: getData,\n loadQrCode: loadQrCode,\n loadData: loadData,\n refreshData: refreshData,\n downloadSaveId: downloadSaveId,\n getCryptedId: getCryptedId,\n recoverId: recoverId,\n events: {\n add: addEvent,\n cleanByContext: cleanEventsByContext\n },\n api: api\n };\n }\n\n var service = factory('default', BMA);\n service.instance = factory;\n\n return service;\n}]);\n","\n\nangular.module('cesium.plugin.services', [])\n\n.provider('PluginService', function PluginServiceProvider() {\n 'ngInject';\n\n var eagerLoadingServices = [];\n\n var extensionByStates = {};\n\n this.registerEagerLoadingService = function(serviceName) {\n eagerLoadingServices.push(serviceName);\n return this;\n };\n\n this.extendState = function(stateName, extension) {\n if (angular.isDefined(stateName) && angular.isDefined(extension)) {\n if (!extensionByStates[stateName]) {\n extensionByStates[stateName] = [];\n }\n extensionByStates[stateName].push(extension);\n }\n return this;\n };\n\n this.extendStates = function(stateNames, extension) {\n var that = this;\n stateNames.forEach(function(stateName) {\n that.extendState(stateName, extension);\n });\n return this;\n };\n\n this.$get = ['$injector', '$state', function($injector, $state) {\n\n var currentExtensionPointName;\n\n function start() {\n if (eagerLoadingServices.length>0) {\n _.forEach(eagerLoadingServices, function(name) {\n $injector.get(name);\n });\n }\n }\n\n function getActiveExtensionPointsByName(extensionPointName) {\n var extensions = _.keys(extensionByStates).reduce(function(res, stateName){\n return $state.includes(stateName) ? res.concat(extensionByStates[stateName]) : res;\n }, []);\n return extensions.reduce(function(res, extension){\n return extension.points && extension.points[extensionPointName] ? res.concat(extension.points[extensionPointName]) : res;\n }, []);\n }\n\n function setCurrentExtensionPointName(extensionPointName) {\n currentExtensionPointName = extensionPointName;\n }\n\n function getCurrentExtensionPointName() {\n return currentExtensionPointName;\n }\n\n return {\n start: start,\n extensions: {\n points: {\n getActivesByName: getActiveExtensionPointsByName,\n current: {\n get: getCurrentExtensionPointName,\n set: setCurrentExtensionPointName\n }\n }\n }\n };\n }];\n})\n;\n","angular.module('cesium.services', [\n 'cesium.config',\n 'cesium.settings.services',\n 'cesium.http.services',\n 'cesium.bma.services',\n 'cesium.crypto.services',\n 'cesium.utils.services',\n 'cesium.modal.services',\n 'cesium.storage.services',\n 'cesium.device.services',\n 'cesium.currency.services',\n 'cesium.wallet.services',\n 'cesium.tx.services',\n 'cesium.wot.services',\n 'cesium.plugin.services'\n ])\n;\n","\nangular.module('cesium.controllers', [\n 'cesium.app.controllers',\n 'cesium.home.controllers',\n 'cesium.join.controllers',\n 'cesium.login.controllers',\n 'cesium.help.controllers',\n 'cesium.settings.controllers',\n 'cesium.wallet.controllers',\n 'cesium.wot.controllers'\n ])\n;\n","angular.module('cesium.templates', []).run(['$templateCache', function($templateCache) {$templateCache.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>');\n$templateCache.put('templates/common/popover_copy.html','<ion-popover-view class=\"popover-copy\" style=\"height: {{(!rows || rows &lt;= 1) ? 50 : rows*22}}px\"><ion-content scroll=\"false\"><div class=\"list\"><div class=\"item item-input\"><input type=\"text\" ng-if=\"!rows || rows &lt;= 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>');\n$templateCache.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>&nbsp;</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>');\n$templateCache.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>');\n$templateCache.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>');\n$templateCache.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>');\n$templateCache.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}}&amp;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}}&amp;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}}&amp;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>');\n$templateCache.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>');\n$templateCache.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>');\n$templateCache.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>');\n$templateCache.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>');\n$templateCache.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}\">&nbsp;</div><div class=\"col text-center main-column\"><div class=\"logo\"></div><p class=\"hidden-xs\">&nbsp;</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}\">&nbsp;</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>&nbsp;{{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>');\n$templateCache.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>');\n$templateCache.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>');\n$templateCache.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>&nbsp;{{$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>');\n$templateCache.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>&nbsp;<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>');\n$templateCache.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>');\n$templateCache.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>');\n$templateCache.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>');\n$templateCache.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>');\n$templateCache.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>');\n$templateCache.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>&nbsp;&nbsp;<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\">&nbsp;</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\">&nbsp;</div></div></ion-content></ion-view>');\n$templateCache.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}}&nbsp;</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>');\n$templateCache.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)\">&nbsp;&nbsp;</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>&nbsp; &nbsp; <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>');\n$templateCache.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>');\n$templateCache.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>');\n$templateCache.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>');\n$templateCache.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\">&nbsp;</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;\">&nbsp;</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\">&nbsp;</div></div></div></ion-content></ion-view>');\n$templateCache.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\">&nbsp;</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\">&nbsp;</div></div></ion-content></ion-view>');}]);","angular.module(\"cesium.translations\", []).config([\"$translateProvider\", function($translateProvider) {\n$translateProvider.translations(\"en-GB\", {\n \"COMMON\": {\n \"APP_NAME\": \"ğ<b>change</b>\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"build {{build}}\",\n \"PUBKEY\": \"Public key\",\n \"MEMBER\": \"Member\",\n \"BLOCK\" : \"Block\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Yes\",\n \"BTN_NO\": \"No\",\n \"BTN_SEND\": \"Send\",\n \"BTN_SEND_MONEY\": \"Transfer money\",\n \"BTN_SEND_MONEY_SHORT\": \"Transfer\",\n \"BTN_SAVE\": \"Save\",\n \"BTN_YES_SAVE\": \"Yes, Save\",\n \"BTN_YES_CONTINUE\": \"Yes, Continue\",\n \"BTN_SHOW\": \"Show\",\n \"BTN_SHOW_PUBKEY\": \"Show key\",\n \"BTN_RELATIVE_UNIT\": \"Display amounts in UD?\",\n \"BTN_BACK\": \"Back\",\n \"BTN_NEXT\": \"Next\",\n \"BTN_IMPORT\": \"Import\",\n \"BTN_CANCEL\": \"Cancel\",\n \"BTN_CLOSE\": \"Close\",\n \"BTN_COPY\": \"Copy\",\n \"BTN_LATER\": \"Later\",\n \"BTN_LOGIN\": \"Sign In\",\n \"BTN_LOGOUT\": \"Logout\",\n \"BTN_ADD_ACCOUNT\": \"New Account\",\n \"BTN_SHARE\": \"Share\",\n \"BTN_EDIT\": \"Edit\",\n \"BTN_DELETE\": \"Delete\",\n \"BTN_ADD\": \"Add\",\n \"BTN_SEARCH\": \"Search\",\n \"BTN_REFRESH\": \"Refresh\",\n \"BTN_RETRY\": \"Retry\",\n \"BTN_START\": \"Start\",\n \"BTN_CONTINUE\": \"Continue\",\n \"BTN_CREATE\": \"Create\",\n \"BTN_UNDERSTOOD\": \"I understand\",\n \"BTN_OPTIONS\": \"Options\",\n \"BTN_HELP_TOUR\": \"Features tour\",\n \"BTN_HELP_TOUR_SCREEN\": \"Discover this screen\",\n \"BTN_DOWNLOAD\": \"Download\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Download account statement\",\n \"BTN_MODIFY\": \"Modify\",\n \"CHOOSE_FILE\": \"Drag your file<br/>or click to select\",\n \"DAYS\": \"days\",\n \"NO_ACCOUNT_QUESTION\": \"Not a member yet? Register now!\",\n \"SEARCH_NO_RESULT\": \"No result found\",\n \"LOADING\": \"Loading...\",\n \"LOADING_WAIT\": \"Loading...<br/><small>(Waiting for node availability)</small>\",\n \"SEARCHING\": \"Searching...\",\n \"FROM\": \"From\",\n \"TO\": \"To\",\n \"COPY\": \"Copy\",\n \"LANGUAGE\": \"Language\",\n \"UNIVERSAL_DIVIDEND\": \"Universal dividend\",\n \"UD\": \"UD\",\n \"DATE_PATTERN\": \"DD/MM/YYYY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(empty)\",\n \"UID\": \"Pseudonym\",\n \"ENABLE\": \"Enabled\",\n \"DISABLE\": \"Disabled\",\n \"RESULTS_LIST\": \"Results:\",\n \"RESULTS_COUNT\": \"{{count}} results\",\n \"EXECUTION_TIME\": \"executed in {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Display values openly?\",\n \"POPOVER_ACTIONS_TITLE\": \"Options\",\n \"POPOVER_FILTER_TITLE\": \"Filters\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit at {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Share\",\n \"SHARE_ON_TWITTER\": \"Share on Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Share on Facebook\",\n \"SHARE_ON_DIASPORA\": \"Share on Diaspora*\",\n \"SHARE_ON_MASTODON\": \"Share on Mastodon\",\n \"INSTANCE_ADDRESS_HELP\": \"Enter an intance address (ex: https://framapiaf.org):\"\n },\n \"FILE\": {\n \"DATE\" : \"Date:\",\n \"TYPE\" : \"Type:\",\n \"SIZE\": \"Size:\",\n \"VALIDATING\": \"Validating...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Choose source:\",\n \"BTN_PICTURE_GALLERY\": \"Gallery\",\n \"BTN_PICTURE_CAMERA\": \"<b>Camera</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Home\",\n \"WOT\": \"Registry\",\n \"CURRENCY\": \"Currency\",\n \"ACCOUNT\": \"My Account\",\n \"WALLETS\": \"My wallets\",\n \"TRANSFER\": \"Transfer\",\n \"SCAN\": \"Scan\",\n \"SETTINGS\": \"Settings\",\n \"NETWORK\": \"Network\",\n \"TRANSACTIONS\": \"My transactions\"\n },\n \"ABOUT\": {\n \"TITLE\": \"About\",\n \"LICENSE\": \"<b>Free/libre software</b> (License GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"There is a <b>newer version</ b> of {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Please update {{'COMMON.APP_NAME' | translate}} (latest version: <b>v{{version}}</b>)\",\n \"CODE\": \"Source code:\",\n \"OFFICIAL_WEB_SITE\": \"Official web site:\",\n \"DEVELOPERS\": \"Developers:\",\n \"FORUM\": \"Forum:\",\n \"DEV_WARNING\": \"Warning\",\n \"DEV_WARNING_MESSAGE\": \"This application is still in active development.<br/>Please report any issue to us!\",\n \"DEV_WARNING_MESSAGE_SHORT\": \"This App is still unstable (still under development).\",\n \"REPORT_ISSUE\": \"Report an issue\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"MESSAGE\": \"Welcome to the {{'COMMON.APP_NAME'|translate}} Application!\",\n \"MESSAGE_CURRENCY\": \"Make exchanges in the libre currency {{currency|abbreviate}}!\",\n \"BTN_CURRENCY\": \"Explore currency\",\n \"BTN_ABOUT\": \"about\",\n \"BTN_HELP\": \"Help\",\n \"REPORT_ISSUE\": \"Report an issue\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"You do not own the account <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b>?\",\n \"BTN_CHANGE_ACCOUNT\": \"Disconnect this account\",\n \"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>.\",\n \"SHOW_ALL_FEED\": \"Show all\",\n \"READ_MORE\": \"Read more\",\n \"FEED_SOURCE\": \"Source\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Settings\",\n \"DISPLAY_DIVIDER\": \"Display\",\n \"STORAGE_DIVIDER\": \"Storage\",\n \"NETWORK_SETTINGS\": \"Network\",\n \"PEER\": \"Duniter peer address\",\n \"PEER_SHORT\": \"Peer address\",\n \"PEER_CHANGED_TEMPORARY\": \"Address used temporarily\",\n \"PERSIST_CACHE\": \"Keep navigation data (experimental)\",\n \"PERSIST_CACHE_HELP\": \"Allows faster navigation, locally retaining the data received, for use from one session to another.\",\n \"USE_LOCAL_STORAGE\": \"Enable local storage\",\n \"USE_LOCAL_STORAGE_HELP\": \"Allows you to save your settings\",\n \"ENABLE_HELPTIP\": \"Enable contextual help tips\",\n \"ENABLE_UI_EFFECTS\": \"Enable visual effects\",\n \"HISTORY_SETTINGS\": \"Account operations\",\n \"DISPLAY_UD_HISTORY\": \"Display produced dividends?\",\n \"AUTHENTICATION_SETTINGS\": \"Authentication\",\n \"REMEMBER_ME\": \"Remember me ?\",\n \"REMEMBER_ME_HELP\": \"Allows to remain identified from one session to another, keeping the public key locally.\",\n \"PLUGINS_SETTINGS\": \"Extensions\",\n \"BTN_RESET\": \"Restore default values\",\n \"EXPERT_MODE\": \"Enable expert mode\",\n \"EXPERT_MODE_HELP\": \"Allow to see more details\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Duniter peer\",\n \"HOST\" : \"Address\",\n \"HOST_HELP\": \"Address: server:port\",\n \"USE_SSL\" : \"Secured?\",\n \"USE_SSL_HELP\" : \"(SSL Encryption)\",\n \"BTN_SHOW_LIST\" : \"Peer's list\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Block #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Current block\",\n \"TITLE\": \"Block #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Computed by\",\n \"SHOW_RAW\": \"Show raw data\",\n \"TECHNICAL_DIVIDER\": \"Technical informations\",\n \"VERSION\": \"Format version\",\n \"HASH\": \"Computed hash\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Money co-produced by each of the {{membersCount}} members\",\n \"EMPTY\": \"Aucune donnée dans ce bloc\",\n \"POW_MIN\": \"Minimal difficulty\",\n \"POW_MIN_HELP\": \"Difficulty imposed in calculating hash\",\n \"DATA_DIVIDER\": \"Data\",\n \"IDENTITIES_COUNT\": \"New identities\",\n \"JOINERS_COUNT\": \"Joiners\",\n \"ACTIVES_COUNT\": \"Renewals\",\n \"ACTIVES_COUNT_HELP\": \"Members having renewed their membership\",\n \"LEAVERS_COUNT\": \"Leavers\",\n \"LEAVERS_COUNT_HELP\": \"Members that now refused certification\",\n \"EXCLUDED_COUNT\": \"Excluded members\",\n \"EXCLUDED_COUNT_HELP\": \"Old members, excluded because missing membreship renewal or certifications\",\n \"REVOKED_COUNT\": \"Revoked identities\",\n \"REVOKED_COUNT_HELP\": \"These accounts may no longer be member\",\n \"TX_COUNT\": \"Transactions\",\n \"CERT_COUNT\": \"Certifications\",\n \"TX_TO_HIMSELF\": \"Change\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Unlock conditions\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"and\",\n \"OR\": \"or\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Sign</b> of the public key\",\n \"XHX\": \"<b>Password</b>, including SHA256 =\",\n \"CSV\": \"Blocked during\",\n \"CLTV\": \"Bloqué until\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blocks\",\n \"NO_BLOCK\": \"No bloc\",\n \"LAST_BLOCKS\": \"Last blocks:\",\n \"BTN_COMPACT\": \"Compact\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Currency\",\n \"TAB_CURRENCY\": \"Currency\",\n \"TAB_WOT\": \"Web of trust\",\n \"TAB_NETWORK\": \"Network\",\n \"TAB_BLOCKS\": \"Blocks\",\n \"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}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Network rules\",\n \"CURRENCY_NAME\": \"Currency name\",\n \"MEMBERS\": \"Members count\",\n \"MEMBERS_VARIATION\": \"Variation since {{duration|formatDuration}} (since last UD)\",\n \"MONEY_DIVIDER\": \"Money\",\n \"MASS\": \"Monetary mass\",\n \"SHARE\": \"Money share\",\n \"UD\": \"Universal Dividend\",\n \"C_ACTUAL\": \"Current growth\",\n \"MEDIAN_TIME\": \"Current blockchain time\",\n \"POW_MIN\": \"Common difficulty\",\n \"MONEY_RULES_DIVIDER\": \"Rules of currency\",\n \"C_RULE\": \"Theoretical growth target\",\n \"UD_RULE\": \"Universal dividend (formula)\",\n \"DT_REEVAL\": \"Period between two re-evaluation of the UD\",\n \"REEVAL_SYMBOL\": \"reeval\",\n \"DT_REEVAL_VALUE\": \"Every <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Date of first reevaluation of the UD\",\n \"SIG_QTY_RULE\": \"Required number of certifications to become a member\",\n \"SIG_STOCK\": \"Maximum number of certifications sent by a member\",\n \"SIG_PERIOD\": \"Minimum delay between 2 certifications sent by one and the same issuer.\",\n \"SIG_WINDOW\": \"Maximum delay before a certification will be treated\",\n \"SIG_VALIDITY\": \"Lifetime of a certification that has been treated\",\n \"MS_WINDOW\": \"Maximum delay before a pending membership will be treated\",\n \"MS_VALIDITY\": \"Lifetime of a membership that has been treated\",\n \"STEP_MAX\": \"Maximum distance between a newcomer and each referring members.\",\n \"WOT_RULES_DIVIDER\": \"Rules for web of trust\",\n \"SENTRIES\": \"Required number of certifications (given <b>and</b> received) to become a referring member\",\n \"SENTRIES_FORMULA\": \"Required number of certifications to become a referring member (formula)\",\n \"XPERCENT\":\"Minimum percent of referring member to reach to match the distance rule\",\n \"AVG_GEN_TIME\": \"The average time between 2 blocks\",\n \"CURRENT\": \"current\",\n \"MATH_CEILING\": \"CEILING\",\n \"DISPLAY_ALL_RULES\": \"Display all rules?\",\n \"BTN_SHOW_LICENSE\": \"Show license\",\n \"WOT_DIVIDER\": \"Web of trust\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Currency license\",\n \"BTN_DOWNLOAD\": \"Download file\",\n \"NO_LICENSE_FILE\": \"License file not found.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Blockchain time\",\n \"LOADING_PEERS\": \"Loading peers...\",\n \"NODE_ADDRESS\": \"Address:\",\n \"SOFTWARE\": \"Software:\",\n \"WARN_PRE_RELEASE\": \"Pre-release (latest stable: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Version <b>{{version}}</b> available\",\n \"WS2PID\": \"Identifier:\",\n \"PRIVATE_ACCESS\": \"Private access\",\n \"POW_PREFIX\": \"Proof of work prefix:\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Secure endpoint (SSL)\",\n \"BMATOR\": \"TOR endpoint\",\n \"WS2P\": \"WS2P endpoint\",\n \"ES_USER_API\": \"Cesium+ data node\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"Non-SSL nodes have a degraded display because Cesium works in HTTPS mode.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Peers\",\n \"SIGNED_ON_BLOCK\": \"Signed on block\",\n \"MIRROR\": \"mirror\",\n \"MIRRORS\": \"Mirrors\",\n \"MIRROR_PEERS\": \"Mirror peers\",\n \"PEER_LIST\" : \"Peer's list\",\n \"MEMBERS\" : \"Members\",\n \"MEMBER_PEERS\" : \"Member peers\",\n \"ALL_PEERS\" : \"All peers\",\n \"DIFFICULTY\" : \"Difficulty\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Block #\",\n \"POPOVER_FILTER_TITLE\": \"Filter\",\n \"OFFLINE\": \"Offline\",\n \"OFFLINE_PEERS\": \"Offline peers\",\n \"BTN_SHOW_PEER\": \"Show peer\",\n \"VIEW\": {\n \"TITLE\": \"Peer\",\n \"OWNER\": \"Owned by \",\n \"SHOW_RAW_PEERING\": \"See peering document\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"See current block (raw format)\",\n \"LAST_BLOCKS\": \"Last blocks\",\n \"KNOWN_PEERS\": \"Known peers :\",\n \"GENERAL_DIVIDER\": \"General information\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Could not get peer data, using the TOR network.\",\n \"LOADING_NODE_ERROR\": \"Could not get peer data\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Search (name, hashtag)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"During the pre-registration phase, the search for pending registrations <b>may be long</b>. Please wait ...\",\n \"REGISTERED_SINCE\": \"Registered on\",\n \"REGISTERED_SINCE_BLOCK\": \"Registered since block #\",\n \"NO_CERTIFICATION\": \"No validated certification\",\n \"NO_GIVEN_CERTIFICATION\": \"No given certification\",\n \"NOT_MEMBER_PARENTHESIS\": \"(non-member)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identity revoked)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(being revoked)\",\n \"EXPIRE_IN\": \"Expires\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Deadline<br/>treatment\",\n \"EXPIRED\": \"Expired\",\n \"PSEUDO\": \"Pseudonym\",\n \"SIGNED_ON_BLOCK\": \"Emitted on block #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Written on block #{{block}}\",\n \"GENERAL_DIVIDER\": \"General information\",\n \"NOT_MEMBER_ACCOUNT\": \"Non-member account\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"This is a simple wallet, with no pending membership application.\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"BTN_CERTIFY\": \"Certify\",\n \"BTN_YES_CERTIFY\": \"Yes, certify\",\n \"BTN_SELECT_AND_CERTIFY\": \"New certification\",\n \"ACCOUNT_OPERATIONS\": \"Account operations\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identity {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Registry\",\n \"NEWCOMERS\": \"New members:\",\n \"NEWCOMERS_COUNT\": \"{{count}} members\",\n \"PENDING\": \"Pending registrations:\",\n \"PENDING_COUNT\": \"{{count}} pending registrations\",\n \"REGISTERED\": \"Registered {{time | formatFromNow}}\",\n \"MEMBER_FROM\": \"Member since {{time|formatFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Latest members\",\n \"BTN_PENDING\": \"Pending registrations\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit to {{limit}})\",\n \"NO_PENDING\": \"No pending registrations.\",\n \"NO_NEWCOMERS\": \"No members.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contacts\"\n },\n \"MODAL\": {\n \"TITLE\": \"Search\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications\",\n \"SUMMARY\": \"Received certifications\",\n \"LIST\": \"Details of received certifications\",\n \"PENDING_LIST\": \"Pending certifications\",\n \"RECEIVED\": \"Received certifications\",\n \"RECEIVED_BY\": \"Certifications received by {{uid}}\",\n \"ERROR\": \"Received certifications in error\",\n \"SENTRY_MEMBER\": \"Referring member\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Operations\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications sent\",\n \"SUMMARY\": \"Sent certifications\",\n \"LIST\": \"Details of sent certifications\",\n \"PENDING_LIST\": \"Pending certifications\",\n \"SENT\": \"Sent certifications\",\n \"SENT_BY\": \"Certifications sent by {{uid}}\",\n \"ERROR\": \"Sent certifications with error\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Login\",\n \"SCRYPT_FORM_HELP\": \"Please enter your credentials. <br> Remember to check the public key for your account.\",\n \"PUBKEY_FORM_HELP\": \"Please enter a public account key:\",\n \"FILE_FORM_HELP\": \"Choose the keychain file to use:\",\n \"SCAN_FORM_HELP\": \"Scan the QR code of a wallet.\",\n \"SALT\": \"Identifier\",\n \"SALT_HELP\": \"Identifier\",\n \"SHOW_SALT\": \"Display identifier?\",\n \"PASSWORD\": \"Password\",\n \"PASSWORD_HELP\": \"Password\",\n \"PUBKEY_HELP\": \"Example: « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »\",\n \"NO_ACCOUNT_QUESTION\": \"Don't have an account yet?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Already have an account ?\",\n \"CREATE_ACCOUNT\": \"Create an account\",\n \"CREATE_FREE_ACCOUNT\": \"Create a free account\",\n \"FORGOTTEN_ID\": \"Forgot password?\",\n \"ASSOCIATED_PUBKEY\": \"Public key :\",\n \"BTN_METHODS\": \"Other methods\",\n \"BTN_METHODS_DOTS\": \"Change method...\",\n \"METHOD_POPOVER_TITLE\": \"Methods\",\n \"MEMORIZE_AUTH_FILE\": \"Memorize this keychain during the navigation session\",\n \"SCRYPT_PARAMETERS\": \"Paramètres (Scrypt) :\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Information\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> You were <b>logout</ b> automatically, due to prolonged inactivity.\",\n \"BTN_RELOGIN\": \"Sign In\",\n \"IDLE_WARNING\": \"You will be logout... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Secret and password\",\n \"SCRYPT_ADVANCED\": \"Advanced salt\",\n \"FILE\": \"Keychain file\",\n \"PUBKEY\": \"Public key only\",\n \"SCAN\": \"Scan a QR code\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Light salt\",\n \"DEFAULT\": \"Standard salt\",\n \"SECURE\": \"Secure salt\",\n \"HARDEST\": \"Hardest salt\",\n \"EXTREME\": \"Extreme salt\",\n \"USER\": \"Personal value\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"DATE\" : \"Date:\",\n \"TYPE\" : \"Type:\",\n \"SIZE\": \"Size:\",\n \"VALIDATING\": \"Validating...\",\n \"HELP\": \"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF).\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"My Account\",\n \"SHOW_MORE_TX\": \"Show more\",\n \"SHOW_ALL_TX\": \"Show all\",\n \"EVENTS\": \"Events\",\n \"BTN_RECEIVE_MONEY\": \"Receive\",\n \"BTN_SECURITY_DOTS\": \"Sign-in and security...\",\n \"BTN_SHOW_DETAILS\": \"Display technical data\",\n \"NEW\": {\n \"TITLE\": \"Registration\",\n \"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.).\",\n \"INTRO_WARNING_SECURITY\": \"Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Up-to-date anti-virus, firewall enabled, session protected by password or pin code...\",\n \"INTRO_HELP\": \"Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.\",\n \"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.\",\n \"REGISTRATION_NODE_HELP\": \"If you do not trust this peer, please change <a ng-click=\\\"doQuickFix('settings')\\\">in the settings</a> of Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Choose the type of account to create:\",\n \"MEMBER_ACCOUNT\": \"Member account\",\n \"MEMBER_ACCOUNT_TITLE\": \"Create a member account\",\n \"MEMBER_ACCOUNT_HELP\": \"If you are not yet registered as an individual (one account possible per individual).\",\n \"WALLET_ACCOUNT\": \"Simple wallet\",\n \"WALLET_ACCOUNT_TITLE\": \"Create a wallet\",\n \"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.\",\n \"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!\",\n \"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!\",\n \"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>\",\n \"PSEUDO\": \"Pseudonym\",\n \"PSEUDO_HELP\": \"joe123\",\n \"SALT_CONFIRM\": \"Confirm\",\n \"SALT_CONFIRM_HELP\": \"Confirm the identifier\",\n \"PASSWORD_CONFIRM\": \"Confirm\",\n \"PASSWORD_CONFIRM_HELP\": \"Confirm the password\",\n \"SLIDE_6_TITLE\": \"Confirmation:\",\n \"COMPUTING_PUBKEY\": \"Computing...\",\n \"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>.\",\n \"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?\",\n \"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?\",\n \"CHECKING_PSEUDO\": \"Checking...\",\n \"PSEUDO_AVAILABLE\": \"This pseudonym is available\",\n \"PSEUDO_NOT_AVAILABLE\": \"This pseudonym is not available\",\n \"INFO_LICENSE\": \"To be able to adhere to the currency, we ask you to kindly read and accept this license.\",\n \"BTN_ACCEPT\": \"I accept\",\n \"BTN_ACCEPT_LICENSE\": \"I accept the license\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Enter a pseudonym\",\n \"HELP\": \"A pseudonym is needed to let other members find you.\"\n },\n \"HEADERS\": {\n \"TIME\": \"Date\",\n \"AMOUNT\": \"Amount\",\n \"COMMENT\": \"Comment\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Transfer\",\n \"SUB_TITLE\": \"Transfer money\",\n \"FROM\": \"From\",\n \"TO\": \"To\",\n \"AMOUNT\": \"Amount\",\n \"AMOUNT_HELP\": \"Amount\",\n \"COMMENT\": \"Comment\",\n \"COMMENT_HELP\": \"Comment (optional)\",\n \"BTN_SEND\": \"Send\",\n \"BTN_ADD_COMMENT\": \"Add comment?\",\n \"MODAL\": {\n \"TITLE\": \"Transfer\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"Unknown URI format\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Invalid public key (bad checksum).\",\n \"POPUP_TITLE\": \"Error\",\n \"UNKNOWN_ERROR\": \"Unknown error\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Your browser is not compatible with cryptographic features.\",\n \"EQUALS_TO_PSEUDO\": \"Must be different from pseudonym\",\n \"EQUALS_TO_SALT\": \"Must be different from secret identifier\",\n \"FIELD_REQUIRED\": \"This field is required.\",\n \"FIELD_TOO_SHORT\": \"Value is too short (min {{minLength]] characters).\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"This field value is too short.\",\n \"FIELD_TOO_LONG\": \"Value is exceeding max length.\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Value is too long (max {{maxLength}} characters).\",\n \"FIELD_MIN\": \"Minimum value: {{min}}\",\n \"FIELD_MAX\": \"Maximal value: {{max}}\",\n \"FIELD_ACCENT\": \"Commas and accent characters not allowed\",\n \"FIELD_NOT_NUMBER\": \"Value is not a number\",\n \"FIELD_NOT_INT\": \"Value is not an integer\",\n \"FIELD_NOT_EMAIL\": \"Email adress not valid\",\n \"PASSWORD_NOT_CONFIRMED\": \"Must match previous password.\",\n \"SALT_NOT_CONFIRMED\": \"Must match previous identifier.\",\n \"SEND_IDENTITY_FAILED\": \"Error while trying to register.\",\n \"SEND_CERTIFICATION_FAILED\": \"Could not certify identity.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"You could not send certification, because your account is <b>not a member account</b>.\",\n \"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.\",\n \"NOT_MEMBER_FOR_CERTIFICATION\": \"Your account is not a member account yet.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"This account could not be certified. No registration found, or need to renew.\",\n \"LOGIN_FAILED\": \"Error while sign in.\",\n \"LOAD_IDENTITY_FAILED\": \"Could not load identity.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Could not load identity requirements.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Error while sending registration as member.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Error while sending membership revocation.\",\n \"REFRESH_WALLET_DATA\": \"Could not refresh wallet.\",\n \"GET_CURRENCY_PARAMETER\": \"Could not get currency parameters.\",\n \"GET_CURRENCY_FAILED\": \"Could not load currency. Please retry later.\",\n \"SEND_TX_FAILED\": \"Could not send transaction.\",\n \"ALL_SOURCES_USED\": \"Please wait the next block computation (All transaction sources has been used).\",\n \"NOT_ENOUGH_SOURCES\": \"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Error while creating your member account.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Error while reloading settings from local storage\",\n \"LOAD_WALLET_DATA_ERROR\": \"Error while loading wallet data.\",\n \"COPY_CLIPBOARD_FAILED\": \"Could not copy to clipboard\",\n \"TAKE_PICTURE_FAILED\": \"Could not get picture.\",\n \"SCAN_FAILED\": \"Could not scan QR code.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Code not recognized.\",\n \"WOT_LOOKUP_FAILED\": \"Search failed.\",\n \"LOAD_PEER_DATA_FAILED\": \"Duniter peer not accessible. Please retry later.\",\n \"NEED_LOGIN_FIRST\": \"Please sign in first.\",\n \"AMOUNT_REQUIRED\": \"Amount is required.\",\n \"AMOUNT_NEGATIVE\": \"Negative amount not allowed.\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit.\",\n \"INVALID_NODE_SUMMARY\": \"Unreachable peer or invalid address\",\n \"INVALID_USER_ID\": \"Field 'pseudonym' must not contains spaces or special characters.\",\n \"INVALID_COMMENT\": \"Field 'reference' has a bad format.\",\n \"INVALID_PUBKEY\": \"Public key has a bad format.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Invalid checksum.\",\n \"IDENTITY_REVOKED\": \"This identity <b>has been revoked {{revocationTime|formatFromNow}}</b> ({{revocationTime|formatDate}}). It can no longer become a member.\",\n \"IDENTITY_PENDING_REVOCATION\": \"The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.\",\n \"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.\",\n \"IDENTITY_EXPIRED\": \"This identity has expired: this person must re-apply <b>before</b> being certified.\",\n \"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>).\",\n \"IDENTITY_NOT_FOUND\": \"Identity not found\",\n \"IDENTITY_TX_FAILED\": \"Error while getting identity's transactions\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Membership not valid.\",\n \"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.\",\n \"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.\",\n \"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.\",\n \"WALLET_HAS_NO_SELF\": \"Your identity must first have been published, and not expired.\",\n \"AUTH_REQUIRED\": \"Authentication required.\",\n \"AUTH_INVALID_PUBKEY\": \"The public key does not match the connected account.\",\n \"AUTH_INVALID_SCRYPT\": \"Invalid username or password.\",\n \"AUTH_INVALID_FILE\": \"Invalid keychain file.\",\n \"AUTH_FILE_ERROR\": \"Failed to open keychain file\",\n \"IDENTITY_ALREADY_CERTIFY\": \"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Unable to certify\",\n \"LOAD_NEWCOMERS_FAILED\": \"Unable to load new members.\",\n \"LOAD_PENDING_FAILED\": \"Unable to load pending registrations.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"You must <b>be a member</b> in order to perform this action.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"You must have <b>published your identity</b> in order to perform this action.\",\n \"GET_BLOCK_FAILED\": \"Error while getting block\",\n \"INVALID_BLOCK_HASH\": \"Block not found (incorrect hash)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Error while downloading revocation file.\",\n \"REVOCATION_FAILED\": \"Error while trying to revoke the identity.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Wrong identifier or password \",\n \"RECOVER_ID_FAILED\": \"Could not recover password\",\n \"LOAD_FILE_FAILED\" : \"Unable to load file\",\n \"NOT_VALID_REVOCATION_FILE\": \"Invalid revocation file (wrong file format)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Invalid credentials backup file (wrong file format)\",\n \"NOT_VALID_KEY_FILE\": \"Invalid keychain file (unrecognized format)\",\n \"EXISTING_ACCOUNT\": \"Your identifiers correspond to an already existing account, whose <a ng-click=\\\"showHelpModal('pubkey')\\\">public key</a> is:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Please modify your credentials so that they correspond to an unused account.\",\n \"GET_LICENSE_FILE_FAILED\": \"Unable to get license file\",\n \"CHECK_NETWORK_CONNECTION\": \"No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Information\",\n \"CERTIFICATION_DONE\": \"Identity successfully signed\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit\",\n \"TRANSFER_SENT\": \"Transfer request successfully sent\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copy succeeded\",\n \"MEMBERSHIP_OUT_SENT\": \"Membership revocation sent\",\n \"NOT_NEED_MEMBERSHIP\": \"Already a member.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"This identity will soon lack certification (at least {{willNeedCertificationCount}}).\",\n \"REVOCATION_SENT\": \"Revocation sent successfully\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"Revocation <b>has been sent successfully</b>. It is awaiting processing.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)\",\n \"EMPTY_TX_HISTORY\": \"No operations to export\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Confirmation</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Warning</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Security warning</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certify {{uid}}\",\n \"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?\",\n \"FULLSCREEN\": \"View the application in full screen?\",\n \"EXIT_APP\": \"Close the application ?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Typing error?\",\n \"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/>.\",\n \"SAVE_BEFORE_LEAVE\": \"Do you want to <b>save your changes</b> before leaving the page?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Changes not saved\",\n \"LOGOUT\": \"Are you sure you want to logout?\",\n \"USE_FALLBACK_NODE\": \"Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?\"\n },\n \"HELP\": {\n \"TITLE\": \"Online help\",\n \"JOIN\": {\n \"SECTION\": \"Join\",\n \"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.\",\n \"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.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glossary\",\n \"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.\",\n \"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.\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"en\", {\n \"COMMON\": {\n \"APP_NAME\": \"ğ<b>change</b>\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"build {{build}}\",\n \"PUBKEY\": \"Public key\",\n \"MEMBER\": \"Member\",\n \"BLOCK\" : \"Block\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Yes\",\n \"BTN_NO\": \"No\",\n \"BTN_SEND\": \"Send\",\n \"BTN_SEND_MONEY\": \"Transfer money\",\n \"BTN_SEND_MONEY_SHORT\": \"Transfer\",\n \"BTN_SAVE\": \"Save\",\n \"BTN_YES_SAVE\": \"Yes, Save\",\n \"BTN_YES_CONTINUE\": \"Yes, Continue\",\n \"BTN_SHOW\": \"Show\",\n \"BTN_SHOW_PUBKEY\": \"Show key\",\n \"BTN_RELATIVE_UNIT\": \"Display amounts in UD?\",\n \"BTN_BACK\": \"Back\",\n \"BTN_NEXT\": \"Next\",\n \"BTN_IMPORT\": \"Import\",\n \"BTN_CANCEL\": \"Cancel\",\n \"BTN_CLOSE\": \"Close\",\n \"BTN_COPY\": \"Copy\",\n \"BTN_LATER\": \"Later\",\n \"BTN_LOGIN\": \"Sign In\",\n \"BTN_LOGOUT\": \"Logout\",\n \"BTN_ADD_ACCOUNT\": \"New Account\",\n \"BTN_SHARE\": \"Share\",\n \"BTN_EDIT\": \"Edit\",\n \"BTN_DELETE\": \"Delete\",\n \"BTN_ADD\": \"Add\",\n \"BTN_SEARCH\": \"Search\",\n \"BTN_REFRESH\": \"Refresh\",\n \"BTN_RETRY\": \"Retry\",\n \"BTN_START\": \"Start\",\n \"BTN_CONTINUE\": \"Continue\",\n \"BTN_CREATE\": \"Create\",\n \"BTN_UNDERSTOOD\": \"I understand\",\n \"BTN_OPTIONS\": \"Options\",\n \"BTN_HELP_TOUR\": \"Features tour\",\n \"BTN_HELP_TOUR_SCREEN\": \"Discover this screen\",\n \"BTN_DOWNLOAD\": \"Download\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Download account statement\",\n \"BTN_MODIFY\": \"Modify\",\n \"CHOOSE_FILE\": \"Drag your file<br/>or click to select\",\n \"DAYS\": \"days\",\n \"NO_ACCOUNT_QUESTION\": \"Not a member yet? Register now!\",\n \"SEARCH_NO_RESULT\": \"No result found\",\n \"LOADING\": \"Loading...\",\n \"LOADING_WAIT\": \"Loading...<br/><small>(Waiting for node availability)</small>\",\n \"SEARCHING\": \"Searching...\",\n \"FROM\": \"From\",\n \"TO\": \"To\",\n \"COPY\": \"Copy\",\n \"LANGUAGE\": \"Language\",\n \"UNIVERSAL_DIVIDEND\": \"Universal dividend\",\n \"UD\": \"UD\",\n \"DATE_PATTERN\": \"MM/DD/YYYY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"MM/DD/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(empty)\",\n \"UID\": \"Pseudonym\",\n \"ENABLE\": \"Enabled\",\n \"DISABLE\": \"Disabled\",\n \"RESULTS_LIST\": \"Results:\",\n \"RESULTS_COUNT\": \"{{count}} results\",\n \"EXECUTION_TIME\": \"executed in {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Display values openly?\",\n \"POPOVER_ACTIONS_TITLE\": \"Options\",\n \"POPOVER_FILTER_TITLE\": \"Filters\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit at {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Share\",\n \"SHARE_ON_TWITTER\": \"Share on Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Share on Facebook\",\n \"SHARE_ON_DIASPORA\": \"Share on Diaspora*\",\n \"SHARE_ON_MASTODON\": \"Share on Mastodon\",\n \"INSTANCE_ADDRESS_HELP\": \"Enter an intance address (ex: https://framapiaf.org):\"\n },\n \"FILE\": {\n \"DATE\" : \"Date:\",\n \"TYPE\" : \"Type:\",\n \"SIZE\": \"Size:\",\n \"VALIDATING\": \"Validating...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Choose source:\",\n \"BTN_PICTURE_GALLERY\": \"Gallery\",\n \"BTN_PICTURE_CAMERA\": \"<b>Camera</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Home\",\n \"WOT\": \"Registry\",\n \"CURRENCY\": \"Currency\",\n \"ACCOUNT\": \"My Account\",\n \"WALLETS\": \"My wallets\",\n \"TRANSFER\": \"Transfer\",\n \"SCAN\": \"Scan\",\n \"SETTINGS\": \"Settings\",\n \"NETWORK\": \"Network\",\n \"TRANSACTIONS\": \"My transactions\"\n },\n \"ABOUT\": {\n \"TITLE\": \"About\",\n \"LICENSE\": \"<b>Free/libre software</b> (License GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"There is a <b>newer version</ b> of {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Please update {{'COMMON.APP_NAME' | translate}} (latest version: <b>v{{version}}</b>)\",\n \"CODE\": \"Source code:\",\n \"OFFICIAL_WEB_SITE\": \"Official web site:\",\n \"DEVELOPERS\": \"Developers:\",\n \"FORUM\": \"Forum:\",\n \"DEV_WARNING\": \"Warning\",\n \"DEV_WARNING_MESSAGE\": \"This application is still in active development.<br/>Please report any issue to us!\",\n \"DEV_WARNING_MESSAGE_SHORT\": \"This App is still unstable (still under development).\",\n \"REPORT_ISSUE\": \"Report an issue\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"MESSAGE\": \"Welcome to the {{'COMMON.APP_NAME'|translate}} Application!\",\n \"MESSAGE_CURRENCY\": \"Make exchanges in the libre currency {{currency|abbreviate}}!\",\n \"BTN_CURRENCY\": \"Explore currency\",\n \"BTN_ABOUT\": \"about\",\n \"BTN_HELP\": \"Help\",\n \"REPORT_ISSUE\": \"Report an issue\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"You do not own the account <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b>?\",\n \"BTN_CHANGE_ACCOUNT\": \"Disconnect this account\",\n \"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>.\",\n \"SHOW_ALL_FEED\": \"Show all\",\n \"READ_MORE\": \"Read more\",\n \"FEED_SOURCE\": \"Source\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Settings\",\n \"DISPLAY_DIVIDER\": \"Display\",\n \"STORAGE_DIVIDER\": \"Storage\",\n \"NETWORK_SETTINGS\": \"Network\",\n \"PEER\": \"Duniter peer address\",\n \"PEER_SHORT\": \"Peer address\",\n \"PEER_CHANGED_TEMPORARY\": \"Address used temporarily\",\n \"PERSIST_CACHE\": \"Keep navigation data (experimental)\",\n \"PERSIST_CACHE_HELP\": \"Allows faster navigation, locally retaining the data received, for use from one session to another.\",\n \"USE_LOCAL_STORAGE\": \"Enable local storage\",\n \"USE_LOCAL_STORAGE_HELP\": \"Allows you to save your settings\",\n \"ENABLE_HELPTIP\": \"Enable contextual help tips\",\n \"ENABLE_UI_EFFECTS\": \"Enable visual effects\",\n \"HISTORY_SETTINGS\": \"Account operations\",\n \"DISPLAY_UD_HISTORY\": \"Display produced dividends?\",\n \"AUTHENTICATION_SETTINGS\": \"Authentication\",\n \"REMEMBER_ME\": \"Remember me ?\",\n \"REMEMBER_ME_HELP\": \"Allows to remain identified from one session to another, keeping the public key locally.\",\n \"PLUGINS_SETTINGS\": \"Extensions\",\n \"BTN_RESET\": \"Restore default values\",\n \"EXPERT_MODE\": \"Enable expert mode\",\n \"EXPERT_MODE_HELP\": \"Allow to see more details\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Duniter peer\",\n \"HOST\" : \"Address\",\n \"HOST_HELP\": \"Address: server:port\",\n \"USE_SSL\" : \"Secured?\",\n \"USE_SSL_HELP\" : \"(SSL Encryption)\",\n \"BTN_SHOW_LIST\" : \"Peer's list\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Block #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Current block\",\n \"TITLE\": \"Block #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Computed by\",\n \"SHOW_RAW\": \"Show raw data\",\n \"TECHNICAL_DIVIDER\": \"Technical informations\",\n \"VERSION\": \"Format version\",\n \"HASH\": \"Computed hash\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Money co-produced by each of the {{membersCount}} members\",\n \"EMPTY\": \"Aucune donnée dans ce bloc\",\n \"POW_MIN\": \"Minimal difficulty\",\n \"POW_MIN_HELP\": \"Difficulty imposed in calculating hash\",\n \"DATA_DIVIDER\": \"Data\",\n \"IDENTITIES_COUNT\": \"New identities\",\n \"JOINERS_COUNT\": \"Joiners\",\n \"ACTIVES_COUNT\": \"Renewals\",\n \"ACTIVES_COUNT_HELP\": \"Members having renewed their membership\",\n \"LEAVERS_COUNT\": \"Leavers\",\n \"LEAVERS_COUNT_HELP\": \"Members that now refused certification\",\n \"EXCLUDED_COUNT\": \"Excluded members\",\n \"EXCLUDED_COUNT_HELP\": \"Old members, excluded because missing membreship renewal or certifications\",\n \"REVOKED_COUNT\": \"Revoked identities\",\n \"REVOKED_COUNT_HELP\": \"These accounts may no longer be member\",\n \"TX_COUNT\": \"Transactions\",\n \"CERT_COUNT\": \"Certifications\",\n \"TX_TO_HIMSELF\": \"Change\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Unlock conditions\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"and\",\n \"OR\": \"or\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Sign</b> of the public key\",\n \"XHX\": \"<b>Password</b>, including SHA256 =\",\n \"CSV\": \"Blocked during\",\n \"CLTV\": \"Bloqué until\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blocks\",\n \"NO_BLOCK\": \"No bloc\",\n \"LAST_BLOCKS\": \"Last blocks:\",\n \"BTN_COMPACT\": \"Compact\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Currency\",\n \"TAB_CURRENCY\": \"Currency\",\n \"TAB_WOT\": \"Web of trust\",\n \"TAB_NETWORK\": \"Network\",\n \"TAB_BLOCKS\": \"Blocks\",\n \"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}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Network rules\",\n \"CURRENCY_NAME\": \"Currency name\",\n \"MEMBERS\": \"Members count\",\n \"MEMBERS_VARIATION\": \"Variation since {{duration|formatDuration}} (since last UD)\",\n \"MONEY_DIVIDER\": \"Money\",\n \"MASS\": \"Monetary mass\",\n \"SHARE\": \"Money share\",\n \"UD\": \"Universal Dividend\",\n \"C_ACTUAL\": \"Current growth\",\n \"MEDIAN_TIME\": \"Current blockchain time\",\n \"POW_MIN\": \"Common difficulty\",\n \"MONEY_RULES_DIVIDER\": \"Rules of currency\",\n \"C_RULE\": \"Theoretical growth target\",\n \"UD_RULE\": \"Universal dividend (formula)\",\n \"DT_REEVAL\": \"Period between two re-evaluation of the UD\",\n \"REEVAL_SYMBOL\": \"reeval\",\n \"DT_REEVAL_VALUE\": \"Every <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Date of first reevaluation of the UD\",\n \"SIG_QTY_RULE\": \"Required number of certifications to become a member\",\n \"SIG_STOCK\": \"Maximum number of certifications sent by a member\",\n \"SIG_PERIOD\": \"Minimum delay between 2 certifications sent by one and the same issuer.\",\n \"SIG_WINDOW\": \"Maximum delay before a certification will be treated\",\n \"SIG_VALIDITY\": \"Lifetime of a certification that has been treated\",\n \"MS_WINDOW\": \"Maximum delay before a pending membership will be treated\",\n \"MS_VALIDITY\": \"Lifetime of a membership that has been treated\",\n \"STEP_MAX\": \"Maximum distance between a newcomer and each referring members.\",\n \"WOT_RULES_DIVIDER\": \"Rules for web of trust\",\n \"SENTRIES\": \"Required number of certifications (given <b>and</b> received) to become a referring member\",\n \"SENTRIES_FORMULA\": \"Required number of certifications to become a referring member (formula)\",\n \"XPERCENT\":\"Minimum percent of referring member to reach to match the distance rule\",\n \"AVG_GEN_TIME\": \"The average time between 2 blocks\",\n \"CURRENT\": \"current\",\n \"MATH_CEILING\": \"CEILING\",\n \"DISPLAY_ALL_RULES\": \"Display all rules?\",\n \"BTN_SHOW_LICENSE\": \"Show license\",\n \"WOT_DIVIDER\": \"Web of trust\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Currency license\",\n \"BTN_DOWNLOAD\": \"Download file\",\n \"NO_LICENSE_FILE\": \"License file not found.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Blockchain time\",\n \"LOADING_PEERS\": \"Loading peers...\",\n \"NODE_ADDRESS\": \"Address:\",\n \"SOFTWARE\": \"Software:\",\n \"WARN_PRE_RELEASE\": \"Pre-release (latest stable: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Version <b>{{version}}</b> available\",\n \"WS2PID\": \"Identifier:\",\n \"PRIVATE_ACCESS\": \"Private access\",\n \"POW_PREFIX\": \"Proof of work prefix:\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Secure endpoint (SSL)\",\n \"BMATOR\": \"TOR endpoint\",\n \"WS2P\": \"WS2P endpoint\",\n \"ES_USER_API\": \"Cesium+ data node\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"Non-SSL nodes have a degraded display because Cesium works in HTTPS mode.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Peers\",\n \"SIGNED_ON_BLOCK\": \"Signed on block\",\n \"MIRROR\": \"mirror\",\n \"MIRRORS\": \"Mirrors\",\n \"MIRROR_PEERS\": \"Mirror peers\",\n \"PEER_LIST\" : \"Peer's list\",\n \"MEMBERS\" : \"Members\",\n \"MEMBER_PEERS\" : \"Member peers\",\n \"ALL_PEERS\" : \"All peers\",\n \"DIFFICULTY\" : \"Difficulty\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Block #\",\n \"POPOVER_FILTER_TITLE\": \"Filter\",\n \"OFFLINE\": \"Offline\",\n \"OFFLINE_PEERS\": \"Offline peers\",\n \"BTN_SHOW_PEER\": \"Show peer\",\n \"VIEW\": {\n \"TITLE\": \"Peer\",\n \"OWNER\": \"Owned by \",\n \"SHOW_RAW_PEERING\": \"See peering document\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"See current block (raw format)\",\n \"LAST_BLOCKS\": \"Last blocks\",\n \"KNOWN_PEERS\": \"Known peers :\",\n \"GENERAL_DIVIDER\": \"General information\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Could not get peer data, using the TOR network.\",\n \"LOADING_NODE_ERROR\": \"Could not get peer data\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Search (name, hashtag)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"During the pre-registration phase, the search for pending registrations <b>may be long</b>. Please wait ...\",\n \"REGISTERED_SINCE\": \"Registered on\",\n \"REGISTERED_SINCE_BLOCK\": \"Registered since block #\",\n \"NO_CERTIFICATION\": \"No validated certification\",\n \"NO_GIVEN_CERTIFICATION\": \"No given certification\",\n \"NOT_MEMBER_PARENTHESIS\": \"(non-member)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identity revoked)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(being revoked)\",\n \"EXPIRE_IN\": \"Expires\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Deadline<br/>treatment\",\n \"EXPIRED\": \"Expired\",\n \"PSEUDO\": \"Pseudonym\",\n \"SIGNED_ON_BLOCK\": \"Emitted on block #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Written on block #{{block}}\",\n \"GENERAL_DIVIDER\": \"General information\",\n \"NOT_MEMBER_ACCOUNT\": \"Non-member account\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"This is a simple wallet, with no pending membership application.\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"BTN_CERTIFY\": \"Certify\",\n \"BTN_YES_CERTIFY\": \"Yes, certify\",\n \"BTN_SELECT_AND_CERTIFY\": \"New certification\",\n \"ACCOUNT_OPERATIONS\": \"Account operations\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identity {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Registry\",\n \"NEWCOMERS\": \"New members:\",\n \"NEWCOMERS_COUNT\": \"{{count}} members\",\n \"PENDING\": \"Pending registrations:\",\n \"PENDING_COUNT\": \"{{count}} pending registrations\",\n \"REGISTERED\": \"Registered {{time | formatFromNow}}\",\n \"MEMBER_FROM\": \"Member since {{time|formatFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Latest members\",\n \"BTN_PENDING\": \"Pending registrations\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit to {{limit}})\",\n \"NO_PENDING\": \"No pending registrations.\",\n \"NO_NEWCOMERS\": \"No members.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contacts\"\n },\n \"MODAL\": {\n \"TITLE\": \"Search\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications\",\n \"SUMMARY\": \"Received certifications\",\n \"LIST\": \"Details of received certifications\",\n \"PENDING_LIST\": \"Pending certifications\",\n \"RECEIVED\": \"Received certifications\",\n \"RECEIVED_BY\": \"Certifications received by {{uid}}\",\n \"ERROR\": \"Received certifications in error\",\n \"SENTRY_MEMBER\": \"Referring member\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Operations\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications sent\",\n \"SUMMARY\": \"Sent certifications\",\n \"LIST\": \"Details of sent certifications\",\n \"PENDING_LIST\": \"Pending certifications\",\n \"SENT\": \"Sent certifications\",\n \"SENT_BY\": \"Certifications sent by {{uid}}\",\n \"ERROR\": \"Sent certifications with error\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Login\",\n \"SCRYPT_FORM_HELP\": \"Please enter your credentials. <br> Remember to check the public key for your account.\",\n \"PUBKEY_FORM_HELP\": \"Please enter a public account key:\",\n \"FILE_FORM_HELP\": \"Choose the keychain file to use:\",\n \"SCAN_FORM_HELP\": \"Scan the QR code of a wallet.\",\n \"SALT\": \"Identifier\",\n \"SALT_HELP\": \"Identifier\",\n \"SHOW_SALT\": \"Display identifier?\",\n \"PASSWORD\": \"Password\",\n \"PASSWORD_HELP\": \"Password\",\n \"PUBKEY_HELP\": \"Example: « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »\",\n \"NO_ACCOUNT_QUESTION\": \"Don't have an account yet?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Already have an account ?\",\n \"CREATE_ACCOUNT\": \"Create an account\",\n \"CREATE_FREE_ACCOUNT\": \"Create a free account\",\n \"FORGOTTEN_ID\": \"Forgot password?\",\n \"ASSOCIATED_PUBKEY\": \"Public key :\",\n \"BTN_METHODS\": \"Other methods\",\n \"BTN_METHODS_DOTS\": \"Change method...\",\n \"METHOD_POPOVER_TITLE\": \"Methods\",\n \"MEMORIZE_AUTH_FILE\": \"Memorize this keychain during the navigation session\",\n \"SCRYPT_PARAMETERS\": \"Paramètres (Scrypt) :\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Information\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> You were <b>logout</ b> automatically, due to prolonged inactivity.\",\n \"BTN_RELOGIN\": \"Sign In\",\n \"IDLE_WARNING\": \"You will be logout... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Secret and password\",\n \"SCRYPT_ADVANCED\": \"Advanced salt\",\n \"FILE\": \"Keychain file\",\n \"PUBKEY\": \"Public key only\",\n \"SCAN\": \"Scan a QR code\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Light salt\",\n \"DEFAULT\": \"Standard salt\",\n \"SECURE\": \"Secure salt\",\n \"HARDEST\": \"Hardest salt\",\n \"EXTREME\": \"Extreme salt\",\n \"USER\": \"Personal value\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"DATE\" : \"Date:\",\n \"TYPE\" : \"Type:\",\n \"SIZE\": \"Size:\",\n \"VALIDATING\": \"Validating...\",\n \"HELP\": \"Expected file format: <b>.dunikey</b> (type PubSec). Other formats are under development (EWIF, WIF).\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"My Account\",\n \"SHOW_MORE_TX\": \"Show more\",\n \"SHOW_ALL_TX\": \"Show all\",\n \"EVENTS\": \"Events\",\n \"BTN_RECEIVE_MONEY\": \"Receive\",\n \"BTN_SECURITY_DOTS\": \"Sign-in and security...\",\n \"BTN_SHOW_DETAILS\": \"Display technical data\",\n \"NEW\": {\n \"TITLE\": \"Registration\",\n \"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.).\",\n \"INTRO_WARNING_SECURITY\": \"Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Up-to-date anti-virus, firewall enabled, session protected by password or pin code...\",\n \"INTRO_HELP\": \"Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.\",\n \"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.\",\n \"REGISTRATION_NODE_HELP\": \"If you do not trust this peer, please change <a ng-click=\\\"doQuickFix('settings')\\\">in the settings</a> of Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Choose the type of account to create:\",\n \"MEMBER_ACCOUNT\": \"Member account\",\n \"MEMBER_ACCOUNT_TITLE\": \"Create a member account\",\n \"MEMBER_ACCOUNT_HELP\": \"If you are not yet registered as an individual (one account possible per individual).\",\n \"WALLET_ACCOUNT\": \"Simple wallet\",\n \"WALLET_ACCOUNT_TITLE\": \"Create a wallet\",\n \"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.\",\n \"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!\",\n \"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!\",\n \"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>\",\n \"PSEUDO\": \"Pseudonym\",\n \"PSEUDO_HELP\": \"joe123\",\n \"SALT_CONFIRM\": \"Confirm\",\n \"SALT_CONFIRM_HELP\": \"Confirm the identifier\",\n \"PASSWORD_CONFIRM\": \"Confirm\",\n \"PASSWORD_CONFIRM_HELP\": \"Confirm the password\",\n \"SLIDE_6_TITLE\": \"Confirmation:\",\n \"COMPUTING_PUBKEY\": \"Computing...\",\n \"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>.\",\n \"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?\",\n \"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?\",\n \"CHECKING_PSEUDO\": \"Checking...\",\n \"PSEUDO_AVAILABLE\": \"This pseudonym is available\",\n \"PSEUDO_NOT_AVAILABLE\": \"This pseudonym is not available\",\n \"INFO_LICENSE\": \"To be able to adhere to the currency, we ask you to kindly read and accept this license.\",\n \"BTN_ACCEPT\": \"I accept\",\n \"BTN_ACCEPT_LICENSE\": \"I accept the license\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Enter a pseudonym\",\n \"HELP\": \"A pseudonym is needed to let other members find you.\"\n },\n \"HEADERS\": {\n \"TIME\": \"Date\",\n \"AMOUNT\": \"Amount\",\n \"COMMENT\": \"Comment\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Transfer\",\n \"SUB_TITLE\": \"Transfer money\",\n \"FROM\": \"From\",\n \"TO\": \"To\",\n \"AMOUNT\": \"Amount\",\n \"AMOUNT_HELP\": \"Amount\",\n \"COMMENT\": \"Comment\",\n \"COMMENT_HELP\": \"Comment (optional)\",\n \"BTN_SEND\": \"Send\",\n \"BTN_ADD_COMMENT\": \"Add comment?\",\n \"MODAL\": {\n \"TITLE\": \"Transfer\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"Unknown URI format\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Invalid public key (bad checksum).\",\n \"POPUP_TITLE\": \"Error\",\n \"UNKNOWN_ERROR\": \"Unknown error\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Your browser is not compatible with cryptographic features.\",\n \"EQUALS_TO_PSEUDO\": \"Must be different from pseudonym\",\n \"EQUALS_TO_SALT\": \"Must be different from secret identifier\",\n \"FIELD_REQUIRED\": \"This field is required.\",\n \"FIELD_TOO_SHORT\": \"Value is too short (min {{minLength]] characters).\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"This field value is too short.\",\n \"FIELD_TOO_LONG\": \"Value is exceeding max length.\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Value is too long (max {{maxLength}} characters).\",\n \"FIELD_MIN\": \"Minimum value: {{min}}\",\n \"FIELD_MAX\": \"Maximal value: {{max}}\",\n \"FIELD_ACCENT\": \"Commas and accent characters not allowed\",\n \"FIELD_NOT_NUMBER\": \"Value is not a number\",\n \"FIELD_NOT_INT\": \"Value is not an integer\",\n \"FIELD_NOT_EMAIL\": \"Email adress not valid\",\n \"PASSWORD_NOT_CONFIRMED\": \"Must match previous password.\",\n \"SALT_NOT_CONFIRMED\": \"Must match previous identifier.\",\n \"SEND_IDENTITY_FAILED\": \"Error while trying to register.\",\n \"SEND_CERTIFICATION_FAILED\": \"Could not certify identity.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"You could not send certification, because your account is <b>not a member account</b>.\",\n \"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.\",\n \"NOT_MEMBER_FOR_CERTIFICATION\": \"Your account is not a member account yet.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"This account could not be certified. No registration found, or need to renew.\",\n \"LOGIN_FAILED\": \"Error while sign in.\",\n \"LOAD_IDENTITY_FAILED\": \"Could not load identity.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Could not load identity requirements.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Error while sending registration as member.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Error while sending membership revocation.\",\n \"REFRESH_WALLET_DATA\": \"Could not refresh wallet.\",\n \"GET_CURRENCY_PARAMETER\": \"Could not get currency parameters.\",\n \"GET_CURRENCY_FAILED\": \"Could not load currency. Please retry later.\",\n \"SEND_TX_FAILED\": \"Could not send transaction.\",\n \"ALL_SOURCES_USED\": \"Please wait the next block computation (All transaction sources has been used).\",\n \"NOT_ENOUGH_SOURCES\": \"Not enough changes to send this amount in one time.<br/>Maximum amount: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Error while creating your member account.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Error while reloading settings from local storage\",\n \"LOAD_WALLET_DATA_ERROR\": \"Error while loading wallet data.\",\n \"COPY_CLIPBOARD_FAILED\": \"Could not copy to clipboard\",\n \"TAKE_PICTURE_FAILED\": \"Could not get picture.\",\n \"SCAN_FAILED\": \"Could not scan QR code.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Code not recognized.\",\n \"WOT_LOOKUP_FAILED\": \"Search failed.\",\n \"LOAD_PEER_DATA_FAILED\": \"Duniter peer not accessible. Please retry later.\",\n \"NEED_LOGIN_FIRST\": \"Please sign in first.\",\n \"AMOUNT_REQUIRED\": \"Amount is required.\",\n \"AMOUNT_NEGATIVE\": \"Negative amount not allowed.\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit.\",\n \"INVALID_NODE_SUMMARY\": \"Unreachable peer or invalid address\",\n \"INVALID_USER_ID\": \"Field 'pseudonym' must not contains spaces or special characters.\",\n \"INVALID_COMMENT\": \"Field 'reference' has a bad format.\",\n \"INVALID_PUBKEY\": \"Public key has a bad format.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Invalid checksum.\",\n \"IDENTITY_REVOKED\": \"This identity <b>has been revoked {{revocationTime|formatFromNow}}</b> ({{revocationTime|formatDate}}). It can no longer become a member.\",\n \"IDENTITY_PENDING_REVOCATION\": \"The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.\",\n \"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.\",\n \"IDENTITY_EXPIRED\": \"This identity has expired: this person must re-apply <b>before</b> being certified.\",\n \"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>).\",\n \"IDENTITY_NOT_FOUND\": \"Identity not found\",\n \"IDENTITY_TX_FAILED\": \"Error while getting identity's transactions\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Membership not valid.\",\n \"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.\",\n \"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.\",\n \"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.\",\n \"WALLET_HAS_NO_SELF\": \"Your identity must first have been published, and not expired.\",\n \"AUTH_REQUIRED\": \"Authentication required.\",\n \"AUTH_INVALID_PUBKEY\": \"The public key does not match the connected account.\",\n \"AUTH_INVALID_SCRYPT\": \"Invalid username or password.\",\n \"AUTH_INVALID_FILE\": \"Invalid keychain file.\",\n \"AUTH_FILE_ERROR\": \"Failed to open keychain file\",\n \"IDENTITY_ALREADY_CERTIFY\": \"You have <b>already certified</b> that identity.<br/><br/>Your certificate is still valid (expires {{expiresIn|formatDuration}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"You have <b>already certified</b> that identity.<br/><br/>Your certification is still pending (Deadline for treatment {{expiresIn|formatDuration}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Unable to certify\",\n \"LOAD_NEWCOMERS_FAILED\": \"Unable to load new members.\",\n \"LOAD_PENDING_FAILED\": \"Unable to load pending registrations.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"You must <b>be a member</b> in order to perform this action.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"You must have <b>published your identity</b> in order to perform this action.\",\n \"GET_BLOCK_FAILED\": \"Error while getting block\",\n \"INVALID_BLOCK_HASH\": \"Block not found (incorrect hash)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Error while downloading revocation file.\",\n \"REVOCATION_FAILED\": \"Error while trying to revoke the identity.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Wrong identifier or password \",\n \"RECOVER_ID_FAILED\": \"Could not recover password\",\n \"LOAD_FILE_FAILED\" : \"Unable to load file\",\n \"NOT_VALID_REVOCATION_FILE\": \"Invalid revocation file (wrong file format)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Invalid credentials backup file (wrong file format)\",\n \"NOT_VALID_KEY_FILE\": \"Invalid keychain file (unrecognized format)\",\n \"EXISTING_ACCOUNT\": \"Your identifiers correspond to an already existing account, whose <a ng-click=\\\"showHelpModal('pubkey')\\\">public key</a> is:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Please modify your credentials so that they correspond to an unused account.\",\n \"GET_LICENSE_FILE_FAILED\": \"Unable to get license file\",\n \"CHECK_NETWORK_CONNECTION\": \"No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Information\",\n \"CERTIFICATION_DONE\": \"Identity successfully signed\",\n \"NOT_ENOUGH_CREDIT\": \"Not enough credit\",\n \"TRANSFER_SENT\": \"Transfer request successfully sent\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copy succeeded\",\n \"MEMBERSHIP_OUT_SENT\": \"Membership revocation sent\",\n \"NOT_NEED_MEMBERSHIP\": \"Already a member.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"This identity will soon lack certification (at least {{willNeedCertificationCount}}).\",\n \"REVOCATION_SENT\": \"Revocation sent successfully\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"Revocation <b>has been sent successfully</b>. It is awaiting processing.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)\",\n \"EMPTY_TX_HISTORY\": \"No operations to export\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Confirmation</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Warning</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Security warning</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certify {{uid}}\",\n \"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?\",\n \"FULLSCREEN\": \"View the application in full screen?\",\n \"EXIT_APP\": \"Close the application ?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Typing error?\",\n \"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/>.\",\n \"SAVE_BEFORE_LEAVE\": \"Do you want to <b>save your changes</b> before leaving the page?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Changes not saved\",\n \"LOGOUT\": \"Are you sure you want to logout?\",\n \"USE_FALLBACK_NODE\": \"Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?\"\n },\n \"HELP\": {\n \"TITLE\": \"Online help\",\n \"JOIN\": {\n \"SECTION\": \"Join\",\n \"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.\",\n \"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.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glossary\",\n \"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.\",\n \"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.\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"eo-EO\", {\n \"COMMON\": {\n \"APP_NAME\": \"ğ<b>change</b>\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"dato: {{build}}\",\n \"PUBKEY\": \"Publika ŝlosilo\",\n \"MEMBER\": \"Membro\",\n \"BLOCK\" : \"Bloko\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Jes\",\n \"BTN_NO\": \"Ne\",\n \"BTN_SEND\": \"Sendi\",\n \"BTN_SEND_MONEY\": \"Fari elspezon\",\n \"BTN_SEND_MONEY_SHORT\": \"Elspezo\",\n \"BTN_SAVE\": \"Konservi\",\n \"BTN_YES_SAVE\": \"Jes, Konservi\",\n \"BTN_YES_CONTINUE\": \"Jes, Daŭrigi\",\n \"BTN_SHOW\": \"Vidi\",\n \"BTN_SHOW_PUBKEY\": \"Afiŝi la publikan ŝlosilon\",\n \"BTN_RELATIVE_UNIT\": \"Afiŝi la sumojn en UD?\",\n \"BTN_BACK\": \"Reiro\",\n \"BTN_NEXT\": \"Sekva\",\n \"BTN_IMPORT\": \"Enporti\",\n \"BTN_CANCEL\": \"Nuligi\",\n \"BTN_CLOSE\": \"Fermi\",\n \"BTN_COPY\": \"Kopii\",\n \"BTN_LATER\": \"Poste\",\n \"BTN_LOGIN\": \"Konektiĝi\",\n \"BTN_LOGOUT\": \"Malkonektiĝo\",\n \"BTN_ADD_ACCOUNT\": \"Nova konto\",\n \"BTN_SHARE\": \"Diskonigi\",\n \"BTN_EDIT\": \"Modifi\",\n \"BTN_DELETE\": \"Forigi\",\n \"BTN_ADD\": \"Aldoni\",\n \"BTN_SEARCH\": \"Traserĉi\",\n \"BTN_REFRESH\": \"Aktualigi\",\n \"BTN_RETRY\": \"Rekomenci\",\n \"BTN_START\": \"Komenci\",\n \"BTN_CONTINUE\": \"Daŭrigi\",\n \"BTN_CREATE\": \"Krei\",\n \"BTN_UNDERSTOOD\": \"Mi komprenis\",\n \"BTN_OPTIONS\": \"Kromeblecoj\",\n \"BTN_HELP_TOUR\": \"Gvidata vizito\",\n \"BTN_HELP_TOUR_SCREEN\": \"Malkovri tiun ĉi paĝon\",\n \"BTN_DOWNLOAD\": \"Elŝuti\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Elŝuti la konto-tabelon\",\n \"BTN_MODIFY\": \"Modifi\",\n \"CHOOSE_FILE\": \"Almetu vian dosieron <br/>aŭ klaku por selekti ĝin\",\n \"DAYS\": \"tagoj\",\n \"NO_ACCOUNT_QUESTION\": \"Ankoraŭ sen konto? Kreu ĝin senpage!\",\n \"SEARCH_NO_RESULT\": \"Neniu rezulto trovita\",\n \"LOADING\": \"Bonvolu pacienci...\",\n \"LOADING_WAIT\": \"Bonvolu pacienci...<br/><small>(ğchange petadas la reton)</small>\",\n \"SEARCHING\": \"Serĉanta...\",\n \"FROM\": \"De\",\n \"TO\": \"Al\",\n \"COPY\": \"Kopii\",\n \"LANGUAGE\": \"Lingvo\",\n \"UNIVERSAL_DIVIDEND\": \"Universala dividendo\",\n \"UD\": \"UD\",\n \"DATE_PATTERN\": \"DD/MM/YY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(malplena)\",\n \"UID\": \"Pseŭdonimo\",\n \"ENABLE\": \"Aktiva\",\n \"DISABLE\": \"Malaktiva\",\n \"RESULTS_LIST\": \"Rezultoj\",\n \"RESULTS_COUNT\": \"{{count}} rezultoj\",\n \"EXECUTION_TIME\": \"plenumita en {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Afiŝi la signojn klare?\",\n \"POPOVER_ACTIONS_TITLE\": \"Kromeblecoj\",\n \"POPOVER_FILTER_TITLE\": \"Filtriloj\",\n \"SHOW_MORE\": \"Afiŝi pli\",\n \"SHOW_MORE_COUNT\": \"(nuna limo je {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Diskonigi\",\n \"SHARE_ON_TWITTER\": \"Diskonigi ĉe Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Diskonigi ĉe Facebook\",\n \"SHARE_ON_DIASPORA\": \"Diskonigi ĉe Diaspora*\",\n \"SHARE_ON_MASTODON\": \"Diskonigi ĉe Mastodon\",\n \"INSTANCE_ADDRESS_HELP\": \"Tajpi la retligon (ekzemple: https://framapiaf.org):\"\n },\n \"FILE\": {\n \"DATE\": \"Dato:\",\n \"TYPE\": \"Tipo:\",\n \"SIZE\": \"Amplekso:\",\n \"VALIDATING\": \"Validiĝanta...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Elekti la fonton:\",\n \"BTN_PICTURE_GALLERY\": \"Bildaro\",\n \"BTN_PICTURE_CAMERA\": \"<b>Kamerao</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Hejmpaĝo\",\n \"WOT\": \"Kontaro\",\n \"CURRENCY\": \"Mono\",\n \"ACCOUNT\": \"Mia konto\",\n \"WALLETS\": \"Miaj monujoj\",\n \"TRANSFER\": \"Elspezo\",\n \"SCAN\": \"Skani\",\n \"SETTINGS\": \"Parametroj\",\n \"NETWORK\": \"Reto\",\n \"TRANSACTIONS\": \"Miaj spezoj\"\n },\n \"ABOUT\": {\n \"TITLE\": \"Prie\",\n \"LICENSE\": \"Programo <b>libera</b> (licenco GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"Ekzistas <b>pli freŝdata versio</b> de {{'COMMON.APP_NAME'|translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Bonvolu ĝisdatigi {{'COMMON.APP_NAME'|translate}} (lasta versio: <b>v{{version}}</b>)\",\n \"CODE\": \"Fonto-kodo:\",\n \"OFFICIAL_WEB_SITE\": \"Oficiala retejo:\",\n \"DEVELOPERS\": \"Programita de:\",\n \"FORUM\": \"Forumo:\",\n \"DEV_WARNING\": \"Averto\",\n \"DEV_WARNING_MESSAGE\": \"Tiu ĉi programo daŭre estas programiĝanta.<br/>Ne hezitu sciigi al ni la renkontitajn fuŝaĵojn!\",\n \"DEV_WARNING_MESSAGE_SHORT\": \"Tiu ĉi programo daŭre estas programiĝanta.\",\n \"REPORT_ISSUE\": \"Sciigi problemon\"\n },\n \"HOME\": {\n \"TITLE\": \"ğ<b>change</b>\",\n \"MESSAGE\": \"Bonvenon ĉe ğ<b>change</b>!\",\n \"MESSAGE_CURRENCY\": \"Interŝanĝi <b>tra la mondo</b> per {{currency|abbreviate}} fariĝas... tre simple!\",\n \"BTN_CURRENCY\": \"Esplori la monon {{name|abbreviate}}\",\n \"BTN_ABOUT\": \"Prie\",\n \"BTN_HELP\": \"Ret-helpo\",\n \"REPORT_ISSUE\": \"fuŝaĵo\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"Vi ne posedas la konton<br/><b>{{name|| (pubkey|formatPubkey) }}</b> ?\",\n \"BTN_CHANGE_ACCOUNT\": \"Malkonektu tiun ĉi konton\",\n \"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>.\",\n \"SHOW_ALL_FEED\": \"Vidi ĉion\",\n \"READ_MORE\": \"Legi la sekvon\",\n \"FEED_SOURCE\": \"Fonto\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Parametroj\",\n \"DISPLAY_DIVIDER\": \"Afiŝado\",\n \"STORAGE_DIVIDER\": \"Stokado\",\n \"NETWORK_SETTINGS\": \"Reto\",\n \"PEER\": \"Adreso de la nodo Duniter\",\n \"PEER_SHORT\": \"Adreso de la nodo\",\n \"PEER_CHANGED_TEMPORARY\": \"Adreso provizore uzata\",\n \"PERSIST_CACHE\": \"Konservi la datenojn pri retumado (provaĵo)\",\n \"PERSIST_CACHE_HELP\": \"Ebligas pli rapidan retumadon, loke konservante la ricevitajn datenojn, por uzi ilin de seanco al alia.\",\n \"USE_LOCAL_STORAGE\": \"Aktivigi lokan stokadon\",\n \"USE_LOCAL_STORAGE_HELP\": \"Ebligas konservi viajn parametrojn\",\n \"ENABLE_HELPTIP\": \"Aktivigi la rilatigajn help-vezikojn\",\n \"ENABLE_UI_EFFECTS\": \"Aktivigi la vid-efikojn\",\n \"HISTORY_SETTINGS\": \"Miaj spezoj\",\n \"DISPLAY_UD_HISTORY\": \"Afiŝi la produktitajn dividendojn?\",\n \"AUTHENTICATION_SETTINGS\": \"Aŭtentigado\",\n \"REMEMBER_ME\": \"Memori min?\",\n \"REMEMBER_ME_HELP\": \"Ebligas resti ĉiam konektita.\",\n \"PLUGINS_SETTINGS\": \"Krom-programoj\",\n \"BTN_RESET\": \"Restarigi la originajn valorojn\",\n \"EXPERT_MODE\": \"Aktivigi la spertan moduson\",\n \"EXPERT_MODE_HELP\": \"Ebligas pli detalan afiŝadon\",\n \"POPUP_PEER\": {\n \"TITLE\": \"Nodo Duniter\",\n \"HOST\": \"Adreso\",\n \"HOST_HELP\": \"Adreso : servilo:konektujo\",\n \"USE_SSL\": \"Sekurigita?\",\n \"USE_SSL_HELP\": \"(SSL-ĉifrado)\",\n \"BTN_SHOW_LIST\": \"Listo de la nodoj\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Haketo: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Bloko #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Nuna bloko\",\n \"TITLE\": \"Bloko #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Kalkulita de la nodo de\",\n \"SHOW_RAW\": \"Vidi la kompletan dosieron\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"VERSION\": \"Versio de la daten-strukturo\",\n \"HASH\": \"Kalkulita haketo\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Mono kunproduktita de ĉiu el la {{membersCount}} membroj\",\n \"EMPTY\": \"Neniu dateno en tiu ĉi bloko\",\n \"POW_MIN\": \"Minimuma malfacileco\",\n \"POW_MIN_HELP\": \"Malfacileco trudita por la haket-kalkulo\",\n \"DATA_DIVIDER\": \"Darenoj\",\n \"IDENTITIES_COUNT\": \"Novaj identecoj\",\n \"JOINERS_COUNT\": \"Novaj membroj\",\n \"ACTIVES_COUNT\": \"Revalidigoj\",\n \"ACTIVES_COUNT_HELP\": \"Membroj revalidigintaj sian membrecon\",\n \"LEAVERS_COUNT\": \"Membroj elirintaj\",\n \"LEAVERS_COUNT_HELP\": \"Membroj ne plu dezirantaj atestaĵon\",\n \"EXCLUDED_COUNT\": \"Membroj eksigitaj\",\n \"EXCLUDED_COUNT_HELP\": \"Malnovaj membroj eksigitaj pro nerevalidiĝo aŭ manko de atestaĵoj\",\n \"REVOKED_COUNT\": \"Nuligitaj identecoj\",\n \"REVOKED_COUNT_HELP\": \"Tiuj kontoj ne plu povos esti membroj\",\n \"TX_COUNT\": \"Spezoj\",\n \"CERT_COUNT\": \"Atestaĵoj\",\n \"TX_TO_HIMSELF\": \"Operacio pri monŝanĝo\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Kondiĉoj por malblokado\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"kaj\",\n \"OR\": \"aŭ\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Subskribo</b> de \",\n \"XHX\": \"<b>Pasvorto</b>, el kiu SHA256 =\",\n \"CSV\": \"Blokita dum\",\n \"CLTV\": \"Blokita ĝis\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blokoj\",\n \"NO_BLOCK\": \"Neniu bloko\",\n \"LAST_BLOCKS\": \"Lastaj blokoj:\",\n \"BTN_COMPACT\": \"Densigi\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Mono\",\n \"TAB_CURRENCY\": \"Mono\",\n \"TAB_WOT\": \"Reto de fido\",\n \"TAB_NETWORK\": \"Reto\",\n \"TAB_BLOCKS\": \"Blokoj\",\n \"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.\",\n \"NETWORK_RULES_DIVIDER\": \"Reguloj de la reto\",\n \"CURRENCY_NAME\": \"Nomo de la mono\",\n \"MEMBERS\": \"Nombro de membroj\",\n \"MEMBERS_VARIATION\": \"Variado post la lasta UD\",\n \"MONEY_DIVIDER\": \"Mono\",\n \"MASS\": \"Mona maso\",\n \"SHARE\": \"Maso por membro\",\n \"UD\": \"Universala dividendo\",\n \"C_ACTUAL\": \"Nuna kreskado\",\n \"MEDIAN_TIME\": \"Horo de la blokĉeno\",\n \"POW_MIN\": \"Minimuma nivelo pri malfacileco de kalkulo\",\n \"MONEY_RULES_DIVIDER\": \"Reguloj de la mono\",\n \"C_RULE\": \"Teoria kreskado celata\",\n \"UD_RULE\": \"Kalkulo de la universala dividendo\",\n \"DT_REEVAL\": \"Periodo de revalorigo de la UD\",\n \"REEVAL_SYMBOL\": \"reval\",\n \"DT_REEVAL_VALUE\": \"Ĉiuj <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Dato de la unua revalorigo\",\n \"SIG_QTY_RULE\": \"Nombro de necesaj atestaĵoj por fariĝi membro\",\n \"SIG_STOCK\": \"Maksimuma nombro da senditaj atestaĵoj por membro\",\n \"SIG_PERIOD\": \"Minimuma daŭro de atendado inter 2 sinsekvaj atestaĵoj senditaj de sama persono\",\n \"SIG_WINDOW\": \"Limdaŭro por akcepti atestaĵon\",\n \"SIG_VALIDITY\": \"Vivdaŭro de atestaĵo, kiu estis akceptita\",\n \"MS_WINDOW\": \"Limdaŭro por akcepti aliĝ-peton kiel membron\",\n \"MS_VALIDITY\": \"Vivdaŭro de aliĝo, kiu estis akceptita\",\n \"STEP_MAX\": \"Maksimuma distanco, per la atestaĵoj, inter nova eniranto kaj la referencaj membroj\",\n \"WOT_RULES_DIVIDER\": \"Reguloj de la reto de fido\",\n \"SENTRIES\": \"Nombro de atestaĵoj (senditaj <b>kaj</b> ricevitaj) por fariĝi referenca membro\",\n \"SENTRIES_FORMULA\": \"Nombro de atestaĵoj (senditaj <b>kaj</b> ricevitaj) por fariĝi referenca membro (formulo)\",\n \"XPERCENT\":\"Minimuma procento da referencaj membroj atingenda por konformiĝi al la regulo pri distanco\",\n \"AVG_GEN_TIME\": \"Meza daŭro inter du blokoj\",\n \"CURRENT\": \"nuna\",\n \"MATH_CEILING\": \"PLAFONO\",\n \"DISPLAY_ALL_RULES\": \"Afiŝi ĉiujn regulojn?\",\n \"BTN_SHOW_LICENSE\": \"Vidi la licencon\",\n \"WOT_DIVIDER\": \"Reto de fido\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Licenco de la mono\",\n \"BTN_DOWNLOAD\": \"Elŝuti la dosieron\",\n \"NO_LICENSE_FILE\": \"Dosiero pri licenco ne trovita.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Horo de la blokĉeno\",\n \"LOADING_PEERS\": \"Nodoj ŝarĝiĝantaj...\",\n \"NODE_ADDRESS\": \"Adreso:\",\n \"SOFTWARE\": \"Programo\",\n \"WARN_PRE_RELEASE\": \"Antaŭ-versio (lasta stabila versio: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Versio <b>{{version}}</b> disponebla\",\n \"WS2PID\": \"Identigilo:\",\n \"PRIVATE_ACCESS\": \"Privata aliro\",\n \"POW_PREFIX\": \"Prefikso pri labor-pruvo:\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Sekurigita interfaco (SSL)\",\n \"BMATOR\": \"Reta interfaco TOR\",\n \"WS2P\": \"Interfaco WS2P\",\n \"ES_USER_API\": \"Nodo de datenoj Cesium+\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"La nodoj ne-SSL estas mis-afiŝitaj, ĉar Cesium funkcias laŭ moduso HTTPS.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Nodoj\",\n \"SIGNED_ON_BLOCK\": \"Skribita en la bloko\",\n \"MIRROR\": \"spegulo\",\n \"MIRRORS\": \"Speguloj\",\n \"MIRROR_PEERS\": \"Spegul-nodoj\",\n \"PEER_LIST\" : \"Listo de la nodoj\",\n \"MEMBERS\" : \"Membroj\",\n \"MEMBER_PEERS\" : \"Membro-nodoj\",\n \"ALL_PEERS\" : \"Ĉiuj nodoj\",\n \"DIFFICULTY\" : \"Malfacileco\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Bloko #\",\n \"POPOVER_FILTER_TITLE\": \"Filtrilo\",\n \"OFFLINE\": \"Nekonektita\",\n \"OFFLINE_PEERS\": \"Nekonektitaj nodoj\",\n \"BTN_SHOW_PEER\": \"Vidi la nodon\",\n \"VIEW\": {\n \"TITLE\": \"Nodo\",\n \"OWNER\": \"Apartenas al\",\n \"SHOW_RAW_PEERING\": \"Vidi la samrangan dokumenton\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"Vidi la lastan blokon (kompleta strukturo)\",\n \"LAST_BLOCKS\": \"Lastaj blokoj konataj\",\n \"KNOWN_PEERS\": \"Konataj nodoj:\",\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Neeblas ricevi la informojn de la nodo. La limdaŭro de atendado estas transpasita.\",\n \"LOADING_NODE_ERROR\": \"Neeblas ricevi la informojn de la nodo\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Traserĉado (familia nomo, persona nomo, markvorto)\",\n \"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...\",\n \"REGISTERED_SINCE\": \"Enskribita la\",\n \"REGISTERED_SINCE_BLOCK\": \"Enskribita en la bloko #\",\n \"NO_CERTIFICATION\": \"Neniu atestaĵo validigita\",\n \"NO_GIVEN_CERTIFICATION\": \"Neniu atestaĵo sendita\",\n \"NOT_MEMBER_PARENTHESIS\": \"(ne membro)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identeco nuligita)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(nuliĝanta)\",\n \"EXPIRE_IN\": \"Finiĝo\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Limdato<br/>de traktado\",\n \"EXPIRED\": \"Finiĝinta\",\n \"PSEUDO\": \"Pseŭdonimo\",\n \"SIGNED_ON_BLOCK\": \"Sendita en la bloko #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Enskribita en la bloko #{{block}}\",\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"NOT_MEMBER_ACCOUNT\": \"Simpla konto (ne membro)\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"Temas pri simpla monujo, sen aliĝ-peto atendanta.\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"BTN_CERTIFY\": \"Atesti\",\n \"BTN_YES_CERTIFY\": \"Jes, atesti\",\n \"BTN_SELECT_AND_CERTIFY\": \"Nova atestaĵo\",\n \"ACCOUNT_OPERATIONS\": \"Spezoj en la konto\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identeco {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Kontaro\",\n \"NEWCOMERS\": \"Novaj membroj:\",\n \"NEWCOMERS_COUNT\": \"{{count}} membroj\",\n \"PENDING\": \"Atendantaj enskribiĝoj\",\n \"PENDING_COUNT\": \"{{count}} atendantaj enskribiĝoj\",\n \"REGISTERED\": \"Enskribita {{time | formatFromNow}}\",\n \"MEMBER_FROM\": \"Membro depost {{time|formatFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Novaj membroj\",\n \"BTN_PENDING\": \"Atendantaj enskribiĝoj\",\n \"SHOW_MORE\": \"Afiŝi pli\",\n \"SHOW_MORE_COUNT\": \"(nuna limo je {{limit}})\",\n \"NO_PENDING\": \"Neniu enskribiĝo atendanta.\",\n \"NO_NEWCOMERS\": \"Neniu membro.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Kontaktoj\"\n },\n \"MODAL\": {\n \"TITLE\": \"Traserĉado\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Atestaĵoj\",\n \"SUMMARY\": \"Ricevitaj atestaĵoj\",\n \"LIST\": \"Detalo pri la ricevitaj atestaĵoj\",\n \"PENDING_LIST\": \"Atestaĵoj atendantaj traktadon\",\n \"RECEIVED\": \"Ricevitaj atestaĵoj\",\n \"RECEIVED_BY\": \"Atestaĵoj ricevitaj de {{uid}}\",\n \"ERROR\": \"Atestaĵoj erare ricevitaj\",\n \"SENTRY_MEMBER\": \"Referenca membro\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Spezoj\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Senditaj atestaĵoj\",\n \"SUMMARY\": \"Senditaj atestaĵoj\",\n \"LIST\": \"Detalo pri la senditaj atestaĵoj\",\n \"PENDING_LIST\": \"Atestaĵoj atendantaj traktadon\",\n \"SENT\": \"Senditaj atestaĵoj\",\n \"SENT_BY\": \"Atestaĵoj senditaj de {{uid}}\",\n \"ERROR\": \"Atestaĵoj erare senditaj\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Konektiĝo\",\n \"SCRYPT_FORM_HELP\": \"Bonvolu tajpi viajn identigilojn.<br>Pensu kontroli, ke la publika ŝlosilo estas tiu de via konto.\",\n \"PUBKEY_FORM_HELP\": \"Bonvolu tajpi publikan ŝlosilon de konto:\",\n \"FILE_FORM_HELP\": \"Elektu la ŝlosilaro-dosieron uzotan:\",\n \"SCAN_FORM_HELP\": \"Skani la QR-kodon de monujo.\",\n \"SALT\": \"Identigilo\",\n \"SALT_HELP\": \"Identigilo\",\n \"SHOW_SALT\": \"Afiŝi la identigilon?\",\n \"PASSWORD\": \"Pasvorto\",\n \"PASSWORD_HELP\": \"Pasvorto\",\n \"PUBKEY_HELP\": \"Ekzemple: « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »\",\n \"NO_ACCOUNT_QUESTION\": \"Vi ankoraŭ ne havas konton?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Vi jam havas konton?\",\n \"CREATE_ACCOUNT\": \"Krei konton...\",\n \"CREATE_FREE_ACCOUNT\": \"Krei konton senpage\",\n \"FORGOTTEN_ID\": \"Pasvorto forgesita?\",\n \"ASSOCIATED_PUBKEY\": \"Publika ŝlosilo de la ŝlosilaro:\",\n \"BTN_METHODS\": \"Aliaj metodoj\",\n \"BTN_METHODS_DOTS\": \"Ŝanĝi metodon...\",\n \"METHOD_POPOVER_TITLE\": \"Metodoj\",\n \"MEMORIZE_AUTH_FILE\": \"Memorigi tiun ŝlosilaron por la daŭro de la sesio de retumado\",\n \"SCRYPT_PARAMETERS\": \"Parametroj (Skripto):\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Informo\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> Vi estis <b>malkonektita</b> aŭtomate, pro tro longa senaktiveco.\",\n \"BTN_RELOGIN\": \"Rekonektiĝi\",\n \"IDLE_WARNING\": \"Vi estos malkonektita... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Identigilo kaj pasvorto\",\n \"SCRYPT_ADVANCED\": \"Sperta salumado\",\n \"FILE\": \"Dosiero pri ŝlosilaro\",\n \"PUBKEY\": \"Publika ŝlosilo aŭ pseŭdonimo\",\n \"SCAN\": \"Skani QR-kodon\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Malpeza salumado\",\n \"DEFAULT\": \"Kutima salumado\",\n \"SECURE\": \"Sekura salumado\",\n \"HARDEST\": \"Plej sekura salumado\",\n \"EXTREME\": \"Ekstrema salumado\",\n \"USER\": \"Personigita salumado\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"DATE\": \"Dato:\",\n \"TYPE\": \"Tipo:\",\n \"SIZE\": \"Amplekso:\",\n \"VALIDATING\": \"Validigo...\",\n \"HELP\": \"Atendita strukturo de dosiero: <b>.yml</b> aŭ <b>.dunikey</b> (tipo PubSec, WIF aŭ EWIF).\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Mia konto\",\n \"SHOW_MORE_TX\": \"Afiŝi pli\",\n \"SHOW_ALL_TX\": \"Afiŝi ĉion\",\n \"EVENTS\": \"Okazaĵoj\",\n \"BTN_RECEIVE_MONEY\": \"Enkasigi\",\n \"BTN_SECURITY_DOTS\": \"Konto kaj sekureco...\",\n \"BTN_SHOW_DETAILS\": \"Afiŝi la teknikajn informojn\",\n \"NEW\": {\n \"TITLE\": \"Enskribiĝo\",\n \"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.).\",\n \"INTRO_WARNING_SECURITY\": \"Kontrolu ke la aparatoj, kiujn vi nun uzas (komputilo, tabuleto, telefono), <b>estas sekurigitaj kaj fidindaj</b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Senvirusigilo ĝisdata, fajroŝirmilo aktivigita, sesio protektita per pasvorto aŭ PIN-kodo, ktp.\",\n \"INTRO_HELP\": \"Alklaku <b>{{'COMMON.BTN_START'|translate}}</b> por ekigi la kreadon de konto. Vi estos gvidata paŝon post paŝo.\",\n \"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.\",\n \"REGISTRATION_NODE_HELP\": \"Se vi ne fidas tiun nodon, bonvolu ŝanĝi ĝin <a ng-click=\\\"doQuickFix('settings')\\\">en la parametroj</a> de Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Elektu la tipon de konto kreota:\",\n \"MEMBER_ACCOUNT\": \"Membro-konto\",\n \"MEMBER_ACCOUNT_TITLE\": \"Kreado de membro-konto\",\n \"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.\",\n \"WALLET_ACCOUNT\": \"Simpla monujo\",\n \"WALLET_ACCOUNT_TITLE\": \"Kreado de monujo\",\n \"WALLET_ACCOUNT_HELP\": \"Por ĉiuj aliaj kazoj, ekzemple se vi bezonas plian konton.<br/>Neniu universala dividendo estos kreita per tia konto.\",\n \"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!\",\n \"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!\",\n \"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>\",\n \"PSEUDO\": \"Pseŭdonimo\",\n \"PSEUDO_HELP\": \"Pseŭdonimo\",\n \"SALT_CONFIRM\": \"Konfirmo\",\n \"SALT_CONFIRM_HELP\": \"Konfirmo de la sekreta identigilo\",\n \"PASSWORD_CONFIRM\": \"Konfirmo\",\n \"PASSWORD_CONFIRM_HELP\": \"Konfirmo de la pasvorto\",\n \"SLIDE_6_TITLE\": \"Konfirmo:\",\n \"COMPUTING_PUBKEY\": \"Kalkulanta...\",\n \"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.\",\n \"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?\",\n \"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?\",\n \"CHECKING_PSEUDO\": \"Kontrolo...\",\n \"PSEUDO_AVAILABLE\": \"Pseŭdonimo disponebla\",\n \"PSEUDO_NOT_AVAILABLE\": \"Pseŭdonimo ne disponebla\",\n \"INFO_LICENSE\": \"Antaŭ ol krei membro-konton, <b>bonvolu legi kaj akcepti la licencon</b> pri uzado de la mono:\",\n \"BTN_ACCEPT\": \"Mi akceptas\",\n \"BTN_ACCEPT_LICENSE\": \"Mi akceptas la licencon\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Elektu pseŭdonimon\",\n \"HELP\": \"Pseŭdonimo estas deviga por fariĝi membro.\"\n },\n \"HEADERS\": {\n \"TIME\": \"Dato\",\n \"AMOUNT\": \"Sumo\",\n \"COMMENT\": \"Komento\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Elspezo\",\n \"SUB_TITLE\": \"Fari elspezon\",\n \"FROM\": \"De\",\n \"TO\": \"Al\",\n \"AMOUNT\": \"Sumo\",\n \"AMOUNT_HELP\": \"Sumo\",\n \"COMMENT\": \"Komento\",\n \"COMMENT_HELP\": \"Komento\",\n \"BTN_SEND\": \"Sendi\",\n \"BTN_ADD_COMMENT\": \"Aldoni komenton?\",\n \"MODAL\": {\n \"TITLE\": \"Elspezo\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"URI-formato nekonata\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Publika ŝlosilo nevalida (bad checksum).\",\n \"POPUP_TITLE\": \"Eraro\",\n \"UNKNOWN_ERROR\": \"Eraro nekonata\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Via retumilo ŝajnas ne kongrua kun la kriptografiaj funkcioj.\",\n \"EQUALS_TO_PSEUDO\": \"Devas esti malsama ol la pseŭdonimo\",\n \"EQUALS_TO_SALT\": \"Devas esti malsama ol la sekreta identigilo\",\n \"FIELD_REQUIRED\": \"Deviga kampo\",\n \"FIELD_TOO_SHORT\": \"Signaro tro mallonga\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Signaro tro mallonga ({{minLength}} signoj minimume)\",\n \"FIELD_TOO_LONG\": \"Signaro tro longa\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Signaro tro longa ({{maxLength}} signoj maksimume)\",\n \"FIELD_MIN\": \"Minimuma longeco: {{min}}\",\n \"FIELD_MAX\": \"Maksimuma longeco: {{max}}\",\n \"FIELD_ACCENT\": \"Diakritaj literoj kaj komoj ne permesataj\",\n \"FIELD_NOT_NUMBER\": \"Nombra valoro atendata\",\n \"FIELD_NOT_INT\": \"Entjera nombro atendata\",\n \"FIELD_NOT_EMAIL\": \"Retadreso nevalida\",\n \"PASSWORD_NOT_CONFIRMED\": \"Ne kongruas kun la pasvorto\",\n \"SALT_NOT_CONFIRMED\": \"Ne kongruas kun la sekreta identigilo\",\n \"SEND_IDENTITY_FAILED\": \"Aliĝo malsukcesa\",\n \"SEND_CERTIFICATION_FAILED\": \"Atestado malsukcesa\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"Vi ne povas efektivigi atestadon, ĉar via konto <b>ne estas membro</b>.\",\n \"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.\",\n \"NOT_MEMBER_FOR_CERTIFICATION\": \"Via konto ankoraŭ ne estas membro.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"Konto ne atestebla. Neniu aliĝo-peto estis farita, aŭ la aliĝo ne estis revalidigita.\",\n \"LOGIN_FAILED\": \"Eraro dum konektiĝo.\",\n \"LOAD_IDENTITY_FAILED\": \"Eraro por ŝarĝi la identecon.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Eraro por ŝarĝi la antaŭ-necesaĵoj de la identeco.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Malsukceso pri la provado eniri la komunumon.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Malsukceso pri la ĉesigo de la aliĝo.\",\n \"REFRESH_WALLET_DATA\": \"Malsukceso pri la ĝisdatigo de la monujo.\",\n \"GET_CURRENCY_PARAMETER\": \"Malsukceso por ricevi la regulojn de la mono.\",\n \"GET_CURRENCY_FAILED\": \"Ne eblis ŝarĝi la monon. Bonvolu reprovi pli poste.\",\n \"SEND_TX_FAILED\": \"Elspezado malsukcesa.\",\n \"ALL_SOURCES_USED\": \"Bonvolu atendi la kalkulon de la venonta bloko (ĉiuj viaj monfontoj estis uzitaj).\",\n \"NOT_ENOUGH_SOURCES\": \"Ne sufiĉe da mono por sendi tiun ĉi sumon per ununura spezo.<br/>Maksimuma sumo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Malsukceso por krei la membro-konton.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Malsukceso por reŝarĝi la parametrojn de la loka stokaĵo\",\n \"LOAD_WALLET_DATA_ERROR\": \"Malsukceso por ŝarĝi la datenojn de la monujo.\",\n \"COPY_CLIPBOARD_FAILED\": \"Ne eblis kopii la valoron.\",\n \"TAKE_PICTURE_FAILED\": \"Malsukceso por ricevi la foton.\",\n \"SCAN_FAILED\": \"Malsukceso por skani la QR-kodon.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Kodo nerekonata.\",\n \"WOT_LOOKUP_FAILED\": \"Serĉado malsukcesa.\",\n \"LOAD_PEER_DATA_FAILED\": \"Ne eblis legi la nodon Duniter. Bonvolu reprovi poste.\",\n \"NEED_LOGIN_FIRST\": \"Bonvolu unue konektiĝi.\",\n \"AMOUNT_REQUIRED\": \"La monsumo estas deviga.\",\n \"AMOUNT_NEGATIVE\": \"Negativa sumo nepermesata.\",\n \"NOT_ENOUGH_CREDIT\": \"Saldo nesufiĉa.\",\n \"INVALID_NODE_SUMMARY\": \"Nodo neatingebla aŭ adreso nevalida.\",\n \"INVALID_USER_ID\": \"La pseŭdonimo devas enteni nek spacon nek signon specialan aŭ kun supersigno.\",\n \"INVALID_COMMENT\": \"La kampo 'referenco' ne devas enteni literojn kun supersigno.\",\n \"INVALID_PUBKEY\": \"La publika ŝlosilo ne havas la atenditan strukturon.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Kontrolsumo nevalida.\",\n \"IDENTITY_REVOKED\": \"Tiu ĉi identeco <b>estis nuligita</b>. Ĝi ne plu povas fariĝi membro.\",\n \"IDENTITY_PENDING_REVOCATION\": \"La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon. La atestado estas do malaktivigita.\",\n \"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.\",\n \"IDENTITY_EXPIRED\": \"La publikigo de tiu ĉi identeco finiĝis: tiu persono devas fari novan aliĝo-peton <b>antaŭ ol</b> esti atestita.\",\n \"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>).\",\n \"IDENTITY_NOT_FOUND\": \"Identeco ne trovita.\",\n \"IDENTITY_TX_FAILED\": \"Malsukceso por ŝarĝi la spezojn.\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Aliĝo ne valida.\",\n \"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.\",\n \"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.\",\n \"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.\",\n \"WALLET_HAS_NO_SELF\": \"Via identeco devas unue esti publikigita, kaj ne esti finiĝinta.\",\n \"AUTH_REQUIRED\": \"Aŭtentigado necesa.\",\n \"AUTH_INVALID_PUBKEY\": \"La publika ŝlosilo ne rilatas al la konektita konto.\",\n \"AUTH_INVALID_SCRYPT\": \"Identigilo aŭ pasvorto nevalida.\",\n \"AUTH_INVALID_FILE\": \"Dosiero pri ŝlosilaro nevalida.\",\n \"AUTH_FILE_ERROR\": \"Malsukceso por malfermi la dosieron pri ŝlosilaro.\",\n \"IDENTITY_ALREADY_CERTIFY\": \"Vi <b>jam atestis</b> tiun identecon.<br/><br/>Tiu atestado daŭre validas (finiĝo {{expiresIn|formatDurationTo}}).\",\n \"IDENTITY_ALREADY_CERTIFY_PENDING\": \"Vi <b>jam atestis</b> tiun identecon.<br/><br/>Tiu atestado atendas traktadon (limdato de traktado {{expiresIn|formatDurationTo}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Atestado neebla\",\n \"LOAD_NEWCOMERS_FAILED\": \"Malsukceso por ŝarĝi la novajn membrojn.\",\n \"LOAD_PENDING_FAILED\": \"Malsukceso por ŝarĝi la atendantajn aliĝojn.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Vi devas <b>esti membro</b> por rajti efektivigi tiun ĉi agon.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"Via identeco devas <b>jam esti publikigita</b>, por ke vi rajtu efektivigi tiun ĉi agon.\",\n \"GET_BLOCK_FAILED\": \"Malsukceso por ricevi la blokon.\",\n \"INVALID_BLOCK_HASH\": \"Bloko ne trovita (haketo malsama)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Malsukceso por elŝuti la dosieron pri nuligo.\",\n \"REVOCATION_FAILED\": \"Malsukceso pri nuligo.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Sekreta identigilo aŭ pasvorto malĝusta.\",\n \"RECOVER_ID_FAILED\": \"Malsukceso por ricevi la identigilojn\",\n \"LOAD_FILE_FAILED\" : \"Malsukceso por ŝarĝi la dosieron\",\n \"NOT_VALID_REVOCATION_FILE\": \"Dosiero pri nuligo ne valida (malĝusta strukturo de dosiero)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Dosiero pri konservado ne valida (malĝusta strukturo de dosiero)\",\n \"NOT_VALID_KEY_FILE\": \"Dosiero pri ŝlosilaro ne valida (strukturo ne rekonata)\",\n \"EXISTING_ACCOUNT\": \"Viaj identigiloj rilatas al jam ekzistanta konto, kies <a ng-click=\\\"showHelpModal('pubkey')\\\">publika ŝlosilo</a> estas:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Bonvolu modifi viajn identigilojn, por ke ili rilatu al ne uzata konto.\",\n \"GET_LICENSE_FILE_FAILED\": \"La ricevo de la dosiero pri licenco ne eblis.\",\n \"CHECK_NETWORK_CONNECTION\": \"Neniu nodo ŝajnas atingebla.<br/><br/>Bonvolu <b>kontroli vian retkonekton</b>.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Informo\",\n \"CERTIFICATION_DONE\": \"Atestaĵo sendita\",\n \"NOT_ENOUGH_CREDIT\": \"Saldo nesufiĉa\",\n \"TRANSFER_SENT\": \"Elspezo sendita\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Kopiita en la loka memoro\",\n \"MEMBERSHIP_OUT_SENT\": \"Eksiĝo sendita\",\n \"NOT_NEED_MEMBERSHIP\": \"Vi jam estas membro.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"Al tiu ĉi identeco baldaŭ mankos atestaĵoj (almenaŭ {{willNeedCertificationCount}}).\",\n \"REVOCATION_SENT\": \"Nuligo sendita\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon.\",\n \"FEATURES_NOT_IMPLEMENTED\": \"Tiu ĉi funkciaro ankoraŭ estas programiĝanta.<br/>Kial ne <b>kontribui al Cesium</b>, por ekhavi ĝin pli rapide? ;)\",\n \"EMPTY_TX_HISTORY\": \"Neniu spezo elportota\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Konfirmo</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Averto</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Averto pri sekureco</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Atesti {{uid}}\",\n \"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?\",\n \"FULLSCREEN\": \"Afiŝi la programon plen-ekrane?\",\n \"EXIT_APP\": \"Fermi la programon?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Tajperaro?\",\n \"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>.\",\n \"SAVE_BEFORE_LEAVE\": \"Ĉu vi volas <b>konservi viajn modifojn</b> antaŭ ol eliri el la paĝo?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Modifoj ne registritaj\",\n \"LOGOUT\": \"Ĉu vi certas, ke vi volas malkonektiĝi?\",\n \"USE_FALLBACK_NODE\": \"Nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la nodon <b>{{new}}</b> ?\"\n },\n \"HELP\": {\n \"TITLE\": \"Ret-helpo\",\n \"JOIN\": {\n \"SECTION\": \"Enskribiĝo\",\n \"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.\",\n \"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.\"\n\t},\n \"GLOSSARY\": {\n \"SECTION\": \"Glosaro\",\n \"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.\",\n \"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.\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"es-ES\", {\n \"COMMON\": {\n \"APP_NAME\": \"ğ<b>change</b>\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"fecha: {{build}}\",\n \"PUBKEY\": \"Llave pública\",\n \"MEMBER\": \"Miembro\",\n \"BLOCK\": \"Bloque\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Sí\",\n \"BTN_NO\": \"No\",\n \"BTN_SEND\": \"Enviar\",\n \"BTN_SEND_MONEY\": \"Hacer un pago\",\n \"BTN_SEND_MONEY_SHORT\": \"Pago\",\n \"BTN_SAVE\": \"Guardar\",\n \"BTN_YES_SAVE\": \"Sí, guardar\",\n \"BTN_YES_CONTINUE\": \"Sí, continuar\",\n \"BTN_SHOW\": \"Ver\",\n \"BTN_SHOW_PUBKEY\": \"Ver la llave\",\n \"BTN_RELATIVE_UNIT\": \"Mostrar importes en DU\",\n \"BTN_BACK\": \"Anterior\",\n \"BTN_NEXT\": \"Siguiente\",\n \"BTN_IMPORT\": \"Importar\",\n \"BTN_CANCEL\": \"Cancelar\",\n \"BTN_CLOSE\": \"Cerrar\",\n \"BTN_LATER\": \"Más tarde\",\n \"BTN_LOGIN\": \"Conectarse\",\n \"BTN_LOGOUT\": \"Desconexión\",\n \"BTN_ADD_ACCOUNT\": \"Nueva cuenta\",\n \"BTN_SHARE\": \"Compartir\",\n \"BTN_EDIT\": \"Modificar\",\n \"BTN_DELETE\": \"Suprimir\",\n \"BTN_ADD\": \"Añadir\",\n \"BTN_SEARCH\": \"Buscar\",\n \"BTN_REFRESH\": \"Actualizar\",\n \"BTN_RETRY\": \"Empezar de nuevo\",\n \"BTN_START\": \"Empezar\",\n \"BTN_CONTINUE\": \"Continuar\",\n \"BTN_COPY\": \"Copiar\",\n \"BTN_CREATE\": \"Crear\",\n \"BTN_UNDERSTOOD\": \"Entendido\",\n \"BTN_OPTIONS\": \"Opciones\",\n \"BTN_HELP_TOUR\": \"Visita guiada\",\n \"BTN_HELP_TOUR_SCREEN\": \"Explicar esta pantalla\",\n \"BTN_DOWNLOAD\": \"Descargar\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Descargar historial de cuenta\",\n \"BTN_MODIFY\": \"Modificar\",\n \"CHOOSE_FILE\": \"Arrastre el archivo<br/>o haga clic para seleccionarlo\",\n \"DAYS\": \"Días\",\n \"NO_ACCOUNT_QUESTION\": \"¿Todavía no es miembro? ¡Crear una cuenta!\",\n \"SEARCH_NO_RESULT\": \"Ningún resultado encontrado\",\n \"LOADING\": \"Espere por favor…\",\n \"LOADING_WAIT\": \"Espere por favor…<br/><small>(Esperando disponibilidad de nodo)</small>\",\n \"SEARCHING\": \"Búsqueda en proceso…\",\n \"FILE\": {\n \"DATE\": \"Fecha:\",\n \"SIZE\": \"Tamaño:\",\n \"TYPE\": \"Tipo:\",\n \"VALIDATING\": \"Validando...\"\n },\n \"FROM\": \"De\",\n \"TO\": \"A\",\n \"COPY\": \"Copiar\",\n \"LANGUAGE\": \"Idioma\",\n \"UNIVERSAL_DIVIDEND\": \"Dividendo universal\",\n \"UD\": \"DU\",\n \"DATE_PATTERN\": \"DD/MM/YYYY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(vacío)\",\n \"UID\": \"Seudónimo\",\n \"ENABLE\": \"Activado\",\n \"DISABLE\": \"Desactivado\",\n \"RESULTS_LIST\": \"Resultados:\",\n \"RESULTS_COUNT\": \"{{count}} resultados\",\n \"EXECUTION_TIME\": \"ejecutado en {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"¿Publicar los valores no codificados?\",\n \"POPOVER_ACTIONS_TITLE\": \"Opciones\",\n \"POPOVER_FILTER_TITLE\": \"Filtros\",\n \"SHOW_MORE\": \"Mostrar más\",\n \"SHOW_MORE_COUNT\": \"(límite actual {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Compartir\",\n \"INSTANCE_ADDRESS_HELP\": \"Introduce la dirección de la instancia (ej: https://red.confederac.io/):\",\n \"SHARE_ON_MASTODON\": \"Compartir en Mastodon\",\n \"SHARE_ON_TWITTER\": \"Compartir en Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Compartir en Facebook\",\n \"SHARE_ON_DIASPORA\": \"Compartir en Diaspora*\",\n \"SHARE_ON_GOOGLEPLUS\": \"Compartir en Google+\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Elegir la fuente:\",\n \"BTN_PICTURE_GALLERY\": \"Galería\",\n \"BTN_PICTURE_CAMERA\": \"<b>Cámara</b>\"\n },\n \"MENU\": {\n \"CURRENCIES\": \"Monedas\",\n \"SCAN\": \"Escanear\",\n \"TRANSFER\": \"Transferir\",\n \"HOME\": \"Inicio\",\n \"WOT\": \"Directorio\",\n \"CURRENCY\": \"Moneda\",\n \"ACCOUNT\": \"Mi cuenta\",\n \"SETTINGS\": \"Ajustes\",\n \"NETWORK\": \"Red\",\n \"TRANSACTIONS\": \"Mis transacciones\",\n \"WALLETS\": \"Mis monederos\"\n\n },\n \"ABOUT\": {\n \"LATEST_RELEASE\": \"Hay una <b>versión nueva</b> de {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)\",\n \"OFFICIAL_WEB_SITE\": \"Sitio Web Oficial:\",\n \"PLEASE_UPDATE\": \"Por favor actualice {{'COMMON.APP_NAME' | translate}} (última versión: <b>v{{version}}</b>)\",\n \"DEV_WARNING\": \"Advertencia\",\n \"DEV_WARNING_MESSAGE\": \"Esta aplicación todavía se encuentra en desarrollo.<br/>¡No dude en reportarnos las anomalías encontradas!\",\n \"DEV_WARNING_MESSAGE_SHORT\": \"Esta app todavía está en desarrollo.\",\n \"TITLE\": \"Acerca de\",\n \"LICENSE\": \"Software <b>libre</b> (licencia GNU AGPLv3).\",\n \"CODE\": \"Código fuente:\",\n \"DEVELOPERS\": \"Desarrollado por:\",\n \"FORUM\": \"Foro:\",\n \"REPORT_ISSUE\": \"Reportar un problema\"\n },\n \"HOME\": {\n \"FEED_SOURCE\": \"Fuente\",\n \"READ_MORE\": \"Leer más\",\n \"SHOW_ALL_FEED\": \"Ver todo\",\n \"TITLE\": \"ğ<b>change</b>\",\n \"MESSAGE\": \"¿ ğ<b>change</b> ?\",\n \"BTN_CURRENCY\": \"Explorar la moneda\",\n \"MESSAGE_CURRENCY\": \"¡Intercambiar en {{currency|abbreviate}} ahora es… muy sencillo!\",\n \"BTN_ABOUT\": \"Acerca de\",\n \"BTN_HELP\": \"Ayuda en línea\",\n \"REPORT_ISSUE\": \"anomalía\",\n \"NOT_YOUR_ACCOUNT_QUESTION\": \"¿No es suya la cuenta <b><i class=\\\"ion-key\\\"></i> {{pubkey|formatPubkey}}</b>?\",\n \"BTN_CHANGE_ACCOUNT\": \"Desconectar esta cuenta\",\n \"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>.\"\n },\n \"SETTINGS\": {\n \"AUTO_LOGOUT\": \"Desconexión automática\",\n \"AUTO_LOGOUT_HELP\": \"Periodo de inactividad antes de la desconexión\",\n \"AUTO_LOGOUT_OPTION_HOUR\": \"Despúes de {{value}} hora\",\n \"AUTO_LOGOUT_OPTION_MINUTE\": \"Despúes de {{value}} minuto\",\n \"AUTO_LOGOUT_OPTION_MINUTES\": \"Despúes de {{value}} minuto\",\n \"AUTO_LOGOUT_OPTION_NEVER\": \"Nunca\",\n \"AUTO_LOGOUT_OPTION_SECONDS\": \"Despúes de {{value}} segundos\",\n \"TITLE\": \"Ajustes\",\n \"DISPLAY_DIVIDER\": \"Visualización\",\n \"STORAGE_DIVIDER\": \"Almacenamiento\",\n \"NETWORK_SETTINGS\": \"Red\",\n \"PEER\": \"Dirección del nodo Duniter\",\n \"PEER_CHANGED_TEMPORARY\": \"Dirección utilizada temporalmente\",\n \"PEER_SHORT\": \"Nodo Duniter\",\n \"PERSIST_CACHE\": \"Conservar los datos de navegación (experimental)\",\n \"PERSIST_CACHE_HELP\": \"Permite una navegación más rápida, conservando localmente los datos recibidos, para usar de una sesión a otra.\",\n \"USE_LOCAL_STORAGE\": \"Activar el almacenamiento local\",\n \"USE_LOCAL_STORAGE_HELP\": \"Permitir conservar sus ajustes\",\n \"ENABLE_HELPTIP\": \"Activar la ayuda contextual\",\n \"ENABLE_UI_EFFECTS\": \"Activar los efectos visuales\",\n \"HISTORY_SETTINGS\": \"Transacciones de la cuenta\",\n \"DISPLAY_UD_HISTORY\": \"Mostrar los DU creados\",\n \"AUTHENTICATION_SETTINGS\": \"Autenticación\",\n \"REMEMBER_ME\": \"Recordarme\",\n \"REMEMBER_ME_HELP\": \"Permite mantenerse siempre conectado (no recomendado), conservando localmente la llave pública.\",\n \"PLUGINS_SETTINGS\": \"Extensiones\",\n \"BTN_RESET\": \"Restaurar los valores por defecto\",\n \"EXPERT_MODE\": \"Modo experto\",\n \"EXPERT_MODE_HELP\": \"Permite una visualización más detallada\",\n \"POPUP_PEER\": {\n \"TITLE\": \"Nodo Duniter\",\n \"HOST\": \"Dirección\",\n \"HOST_HELP\": \"Dirección: servidor:puerto\",\n \"USE_SSL\": \"Conexión segura\",\n \"USE_SSL_HELP\": \"(Cifrado SSL)\",\n \"BTN_SHOW_LIST\": \"Lista de nodos\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash: {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Bloque #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Bloque actual\",\n \"TITLE\": \"Bloque #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Calculado por el nodo de\",\n \"SHOW_RAW\": \"Ver el fichero en bruto\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"VERSION\": \"Versión del formato\",\n \"HASH\": \"Hash calculado\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Moneda co-producida por cada uno de los {{membersCount}} miembros\",\n \"EMPTY\": \"Ningún dato en este bloque\",\n \"POW_MIN\": \"Dificultad mínima\",\n \"POW_MIN_HELP\": \"Dificultad impuesta por el cálculo del hash\",\n \"DATA_DIVIDER\": \"Datos\",\n \"IDENTITIES_COUNT\": \"Nuevas identidades\",\n \"JOINERS_COUNT\": \"Nuevos miembros\",\n \"ACTIVES_COUNT\": \"Renovaciones\",\n \"ACTIVES_COUNT_HELP\": \"Miembros que han renovado sus adhesiones\",\n \"LEAVERS_COUNT\": \"Miembros salientes\",\n \"LEAVERS_COUNT_HELP\": \"Miembros salientes que ya no quieren estar certificados\",\n \"EXCLUDED_COUNT\": \"Miembros excluidos\",\n \"EXCLUDED_COUNT_HELP\": \"Antiguos miembros excluidos por no renovación o falta de certificaciones\",\n \"REVOKED_COUNT\": \"Identidades revocadas\",\n \"REVOKED_COUNT_HELP\": \"Estas cuentas no podrán ser miembros\",\n \"TX_COUNT\": \"Transacciones\",\n \"CERT_COUNT\": \"Certificaciones\",\n \"TX_TO_HIMSELF\": \"Operación de cambio\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Condiciones de desbloqueo\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"y\",\n \"OR\": \"o\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Firma</b> de \",\n \"XHX\": \"<b>Contraseña</b>, cuyo SHA256 =\",\n \"CSV\": \"Bloqueado durante\",\n \"CLTV\": \"Bloqueado hasta\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Bloques\",\n \"NO_BLOCK\": \"Ningún bloque\",\n \"LAST_BLOCKS\": \"Últimos bloques:\",\n \"BTN_COMPACT\": \"Compactar\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Moneda\",\n \"TAB_CURRENCY\": \"Moneda\",\n \"TAB_WOT\": \"Red de confianza\",\n \"TAB_NETWORK\": \"Red\",\n \"TAB_BLOCKS\": \"Bloques\",\n \"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}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Reglas de la red\",\n \"CURRENCY_NAME\": \"Nombre de la moneda\",\n \"MEMBERS\": \"Cantidad de miembros\",\n \"MEMBERS_VARIATION\": \"Variación desde último DU\",\n \"MONEY_DIVIDER\": \"Moneda\",\n \"MASS\": \"Masa monetaria\",\n \"SHARE\": \"Masa media por miembro\",\n \"UD\": \"Dividendo Universal\",\n \"C_ACTUAL\": \"Crecimiento actual\",\n \"MEDIAN_TIME\": \"Hora de la cadena de bloques\",\n \"POW_MIN\": \"Nivel mínimo de dificultad de cálculo\",\n \"MONEY_RULES_DIVIDER\": \"Reglas de la moneda\",\n \"C_RULE\": \"Crecimiento teórico objetivo\",\n \"UD_RULE\": \"Cálculo del dividendo universal\",\n \"DT_REEVAL\": \"Periodo de revalorización del DU\",\n \"REEVAL_SYMBOL\": \"reval\",\n \"DT_REEVAL_VALUE\": \"Todos los <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Fecha de la primera revalorización\",\n \"SIG_QTY_RULE\": \"Certificaciones requeridas para ser miembro\",\n \"SIG_STOCK\": \"Máximo de certificaciones emitibles por miembros\",\n \"SIG_PERIOD\": \"Espera mínima entre 2 certificaciones sucesivas emitidas por la misma persona\",\n \"SIG_WINDOW\": \"Límite para tener en cuenta una certificación\",\n \"SIG_VALIDITY\": \"Duración de una certificación que ya ha sido aceptada\",\n \"MS_WINDOW\": \"Límite para aprobar una solicitud de membresía\",\n \"STEP_MAX\": \"Distancia máxima entre una nueva candidatura y cada miembro referente\",\n \"WOT_RULES_DIVIDER\": \"Reglas de la red de confianza\",\n \"SENTRIES\": \"Certificaciones necesarias para ser miembro referente\",\n \"SENTRIES_FORMULA\": \"Fórmula de las certificaciones necesarias para ser miembro referente\",\n \"XPERCENT\":\"Porcentaje mínimo necesario de miembros referentes respentando la regla de distancia máxima\",\n \"AVG_GEN_TIME\": \"Tiempo medio entre dos bloques\",\n \"MS_VALIDITY\": \"Duración de una candidatura que ya ha sido aceptada\",\n\n \"CURRENT\": \"actual\",\n \"MATH_CEILING\": \"TECHO\",\n \"DISPLAY_ALL_RULES\": \"¿Ver todas las reglas?\",\n \"BTN_SHOW_LICENSE\": \"Ver la licencia\",\n \"WOT_DIVIDER\": \"Red de confianza\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Licencia de la moneda\",\n \"BTN_DOWNLOAD\": \"Descargar el fichero\",\n \"NO_LICENSE_FILE\": \"Fichero de licencia no encontrado.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Hora de la cadena de bloques\",\n \"LOADING_PEERS\": \"Cargando nodos…\",\n \"NODE_ADDRESS\": \"Dirección:\",\n \"SOFTWARE\": \"Software:\",\n \"WARN_PRE_RELEASE\": \"Prelanzamiento (última versión estable: <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Versión <b>{{version}}</b> disponible\",\n \"WS2PID\": \"ID:\",\n \"PRIVATE_ACCESS\": \"Acceso privado\",\n \"POW_PREFIX\": \"Prefijo de la prueba de trabajo:\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Interfaz segura (SSL)\",\n \"BMATOR\": \"Interfaz red TOR\",\n \"WS2P\": \"Interfaz WS2P\",\n \"ES_USER_API\": \"Nodo de datos Cesium+\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"La visualización de los nodos sin SSL aparece degradada porque Cesium funciona en modo HTTPS.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Nodos\",\n \"SIGNED_ON_BLOCK\": \"Firmado sobre el bloque\",\n \"MIRROR\": \"espejo\",\n \"MIRROR_PEERS\": \"Nodos espejo\",\n \"MIRRORS\": \"Espejo\",\n \"PEER_LIST\": \"Lista de nodos\",\n \"MEMBERS\": \"Miembro\",\n \"MEMBER_PEERS\": \"Nodos miembro\",\n \"ALL_PEERS\": \"Todos los nodos\",\n \"DIFFICULTY\": \"Dificultad\",\n \"API\": \"API\",\n \"CURRENT_BLOCK\": \"Bloque #\",\n \"POPOVER_FILTER_TITLE\": \"Filtro\",\n \"OFFLINE\": \"Fuera de línea\",\n \"OFFLINE_PEERS\": \"Nodos fuera de línea\",\n \"BTN_SHOW_PEER\": \"Ver nodo\",\n \"VIEW\": {\n \"TITLE\": \"Nodo\",\n \"OWNER\": \"Propiedad de\",\n \"SHOW_RAW_PEERING\": \"Ver la ficha del nodo\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"Ver el bloque actual (en formato crudo)\",\n \"LAST_BLOCKS\": \"Bloques recientes\",\n \"KNOWN_PEERS\": \"Nodos conocidos:\",\n \"GENERAL_DIVIDER\": \"Información general\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"No se pudo obtener la información del nodo usando la red TOR.\",\n \"LOADING_NODE_ERROR\": \"No se pudo obtener la información del nodo\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Buscar (apellido, primer nombre, hashtag)\",\n \"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…\",\n \"REGISTERED_SINCE\": \"Se registró en\",\n \"REGISTERED_SINCE_BLOCK\": \"Se registró en el bloque #\",\n \"NO_CERTIFICATION\": \"Ninguna certificación validada\",\n \"NO_GIVEN_CERTIFICATION\": \"Ninguna certificación emitida\",\n \"NOT_MEMBER_PARENTHESIS\": \"(no miembro)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identidad revocada)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(revocación en proceso)\",\n \"EXPIRE_IN\": \"Expira\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Fecha límite<br/>de procesamiento\",\n \"EXPIRED\": \"Expirado\",\n \"PSEUDO\": \"Seudónimo\",\n \"SIGNED_ON_BLOCK\": \"Emitida en el bloque #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Escrita en el bloque #{{block}}\",\n \"GENERAL_DIVIDER\": \"Informaciones generales\",\n \"NOT_MEMBER_ACCOUNT\": \"Cuenta no miembro\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"Se trata de un monedero simple, sin solicitud de membresía en espera\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"BTN_CERTIFY\": \"Certificar\",\n \"BTN_YES_CERTIFY\": \"Sí, certificar\",\n \"BTN_SELECT_AND_CERTIFY\": \"Nueva certificación\",\n \"ACCOUNT_OPERATIONS\": \"Transacciones de la cuenta\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identidad {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Directorio\",\n \"NEWCOMERS\": \"Nuevos miembros:\",\n \"NEWCOMERS_COUNT\": \"{{count}} miembros\",\n \"PENDING\": \"Inscripciones en espera:\",\n \"PENDING_COUNT\": \"{{count}} inscripciones en espera\",\n \"REGISTERED\": \"Se inscribió {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Miembro desde {{memberDate|medianFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Miembros recientes\",\n \"BTN_PENDING\": \"Candidaturas en espera\",\n \"SHOW_MORE\": \"Mostrar más\",\n \"SHOW_MORE_COUNT\": \"(mostrar solo {{limit}})\",\n \"NO_PENDING\": \"Ninguna candidatura en espera.\",\n \"NO_NEWCOMERS\": \"Sin miembros.\"\n },\n \"MODAL\": {\n \"TITLE\": \"Buscar\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certificaciones\",\n \"SUMMARY\": \"Certificaciones recibidas\",\n \"LIST\": \"Detalle de las certificaciones recibidas\",\n \"PENDING_LIST\": \"Certificaciones en espera de tratamiento\",\n \"RECEIVED\": \"Certificaciones recibidas\",\n \"RECEIVED_BY\": \"Certificaciones recibidas por {{uid}}\",\n \"ERROR\": \"Certificaciones recibidas por error\",\n \"SENTRY_MEMBER\": \"Miembro referente\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contactos\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Transacciones\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certificaciones emitidas\",\n \"SUMMARY\": \"Certificaciones emitidas\",\n \"LIST\": \"Detalle de las certificaciones emitidas\",\n \"PENDING_LIST\": \"Certificaciones en espera a ser procesadas\",\n \"SENT\": \"Certificaciones emitidas\",\n \"SENT_BY\": \"Certificaciones emitidas por {{uid}}\",\n \"ERROR\": \"Certificaciones emitidas por error\"\n }\n },\n \"LOGIN\": {\n \"FILE\": {\n \"HELP\": \"Formato de archivo esperado: <b>.dunikey</b> (tipo PubSec). Otros formatos en desarrollo todavía (EWIF, WIF).\",\n \"DATE\" : \"Fecha:\",\n \"TYPE\" : \"Tipo:\",\n \"SIZE\": \"Tamaño:\",\n \"VALIDATING\": \"Validando…\"\n },\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Conexión\",\n \"SCRYPT_FORM_HELP\": \"Ingrese sus credenciales.<br>Recuerde comprobar que la llave pública pertenece a su cuenta.\",\n \"PUBKEY_FORM_HELP\": \"Por favor ingrese una llave pública de cuenta:\",\n \"FILE_FORM_HELP\": \"Elija el archivo de llavero a usar:\",\n \"SALT\": \"Identificador\",\n \"SALT_HELP\": \"Identificador\",\n \"SHOW_SALT\": \"Mostrar el identificador\",\n \"PASSWORD\": \"Contraseña\",\n \"PASSWORD_HELP\": \"Contraseña\",\n \"PUBKEY_HELP\": \"llave pública\",\n \"NO_ACCOUNT_QUESTION\": \"¿Aún no tiene cuenta? \",\n \"HAVE_ACCOUNT_QUESTION\": \"¿Ya tiene cuenta?\",\n \"CREATE_ACCOUNT\": \"Crear una cuenta\",\n \"CREATE_FREE_ACCOUNT\": \"Crear una cuenta gratis\",\n \"FORGOTTEN_ID\": \"¿Olvidó su contraseña?\",\n \"ASSOCIATED_PUBKEY\": \"Llave pública del llavero:\",\n \"BTN_METHODS\": \"Otros métodos\",\n \"BTN_METHODS_DOTS\": \"Otras vías…\",\n \"METHOD_POPOVER_TITLE\": \"Métodos\",\n \"SCAN_FORM_HELP\": \"Escanee el código QR de un monedero.\",\n \"MEMORIZE_AUTH_FILE\": \"Memorizar las llaves durante la sesión de navegación\",\n \"SCRYPT_PARAMETERS\": \"Ajustes (Scrypt):\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Información\",\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.\",\n \"BTN_RELOGIN\": \"Volver a conectarme\",\n \"IDLE_WARNING\": \"Será desconectado en… {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Estándar (por defecto)\",\n \"SCRYPT_ADVANCED\": \"Aleatoriedad avanzada\",\n \"FILE\": \"Archivo de llaves\",\n \"PUBKEY\": \"Llave pública o seudónimo\",\n \"SCAN\": \"Escanear un código QR\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Ligero\",\n \"DEFAULT\": \"Predeterminado\",\n \"SECURE\": \"Seguro\",\n \"HARDEST\": \"El más seguro\",\n \"EXTREME\": \"Extremo\",\n \"USER\": \"Personalizado\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \"<i class=\\\"icon ion-locked\\\"></i> Autenticación\",\n \"BTN_AUTH\": \"Autenticar\",\n \"ERROR\": {\n \"FILE\": \"Archivo llavero\",\n \"SCRYPT_ADVANCED\": \"Aleatoriedad avanzada\",\n \"SCRYPT_DEFAULT\": \"Estándar (por defecto)\"\n },\n \"METHOD_LABEL\": \"Método de autenticación\", \n \"SCRYPT_FORM_HELP\": \"Autentíquese :\"\n },\n \"ACCOUNT\": {\n \"BTN_MEMBERSHIP_IN_DOTS\": \"Registrarse como miembro…\",\n \"BTN_SEND_IDENTITY_DOTS\": \"Publicar su identidad…\",\n \"TITLE\": \"Mi cuenta\",\n \"BALANCE\": \"Saldo\",\n \"LAST_TX\": \"Últimas transacciones validadas\",\n \"BALANCE_ACCOUNT\": \"Saldo de la cuenta\",\n \"NO_TX\": \"Ninguna transacción\",\n \"SHOW_MORE_TX\": \"Mostrar más\",\n \"SHOW_ALL_TX\": \"Mostrar todo\",\n \"TX_FROM_DATE\": \"(mostrar solo {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Transacciones pendientes\",\n \"ERROR_TX\": \"Transacciones no ejecutadas\",\n \"ERROR_TX_SENT\": \"Transacciones ejecutadas fallidas\",\n \"PENDING_TX_RECEIVED\": \"Tansacciones en espera de recepción\",\n \"EVENTS\": \"Eventos\",\n \"WAITING_MEMBERSHIP\": \"Solicitud de membresía emitida. En espera de aceptación.\",\n \"WAITING_CERTIFICATIONS\": \"Debe obtener {{needCertificationCount}} certificación(es) para ser miembro.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"Pronto le van a <b>faltar certificaciones</b> (al menos {{willNeedCertificationCount}} son necesarias)\",\n \"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.\",\n \"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>.\",\n \"CERTIFICATION_COUNT\": \"Certificaciones recibidas\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certificaciones\",\n \"SIG_STOCK\": \"Certificaciones emitidas\",\n \"BTN_RECEIVE_MONEY\": \"Recibir\",\n \"BTN_MEMBERSHIP_RENEW\": \"Renovar la membresía\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Renovar la membresía…\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Cancelar la membresía…\",\n \"BTN_SECURITY_DOTS\": \"Cuenta y seguridad…\",\n \"BTN_SHOW_DETAILS\": \"Publicar la información técnica\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Importe bloqueado\",\n \"DESCRIPTION\": \"Aquí están las condiciones para desbloquear este importe:\",\n \"DESCRIPTION_MANY\": \"Esta transacción esta compuesta de varias partes, cuyas condiciones de desbloqueo son:\",\n \"LOCKED_AMOUNT\": \"Condiciones del importe:\"\n },\n \"NEW\": {\n \"TITLE\": \"Registrarse\",\n \"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.)\",\n \"INTRO_WARNING_SECURITY\": \"Asegúrese de que el dispositivo actual (ordenador, tablet, teléfono) <b>es seguro y de confianza</b>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Antivirus, cortafuegos, sesión protegida por contraseña o número PIN, etc.\",\n \"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.\",\n \"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.\",\n \"REGISTRATION_NODE_HELP\": \"Si no confía en este nodo, <a ng-click=\\\"doQuickFix('settings')\\\">cambie los ajustes</a> de Cesium.\",\n \"SELECT_ACCOUNT_TYPE\": \"Elegir el tipo de cuenta a crear:\",\n \"MEMBER_ACCOUNT\": \"Cuenta miembro\",\n \"MEMBER_ACCOUNT_TITLE\": \"Crear una cuenta miembro\",\n \"MEMBER_ACCOUNT_HELP\": \"Si todavía no tiene membresía (solamente una cuenta miembro posible por persona).\",\n \"WALLET_ACCOUNT\": \"Simple monedero\",\n \"WALLET_ACCOUNT_TITLE\": \"Crear una cuenta simple\",\n \"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.\",\n \"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!\",\n \"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!\",\n \"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>\",\n \"PSEUDO\": \"Seudónimo\",\n \"PSEUDO_HELP\": \"Seudónimo\",\n \"SALT_CONFIRM\": \"Confirmación\",\n \"SALT_CONFIRM_HELP\": \"Confirmación del identificador\",\n \"PASSWORD_CONFIRM\": \"Confirmación\",\n \"PASSWORD_CONFIRM_HELP\": \"Confirmación de la contraseña\",\n \"SLIDE_6_TITLE\": \"Confirmación:\",\n \"COMPUTING_PUBKEY\": \"Cálculo en proceso…\",\n \"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.\",\n \"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?\",\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?\",\n \"CHECKING_PSEUDO\": \"Verificando…\",\n \"PSEUDO_AVAILABLE\": \"Este nombre está disponible\",\n \"PSEUDO_NOT_AVAILABLE\": \"Este nombre de usuario no está disponible\",\n \"INFO_LICENSE\": \"Para unirse a la moneda, le pedimos leer y aceptar esta licencia.\",\n \"BTN_ACCEPT\": \"Acepto\",\n \"BTN_ACCEPT_LICENSE\": \"Acepto la licencia\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Elija un seudónimo\",\n \"HELP\": \"Un seudónimo es obligatorio para ser miembro.\"\n },\n \"SECURITY\": {\n \"ADD_QUESTION\": \"Añadir pregunta personalizada\",\n \"BTN_CLEAN\": \"Limpiar\",\n \"BTN_RESET\": \"Reiniciar\",\n \"DOWNLOAD_REVOKE\": \"Guardar un archivo de revocación\",\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.\",\n \"HELP_LEVEL\": \"Elija <strong> al menos {{nb}} preguntas:</strong>\",\n \"LEVEL\": \"Nivel de seguridad\",\n \"LOW_LEVEL\": \"Bajo <span class=\\\"hidden-xs\\\">(2 preguntas min.)</span>\",\n \"MEDIUM_LEVEL\": \"Medio <span class=\\\"hidden-xs\\\">(4 preguntas min.)</span>\",\n \"QUESTION_1\": \"¿Cómo se llamaba su mejor amigo de la adolescencia?\",\n \"QUESTION_2\": \"¿Cómo se llamaba su primer animal de compañía?\",\n \"QUESTION_3\": \"¿Cuál es el primer plato que aprendió a cocinar?\",\n \"QUESTION_4\": \"¿Cuál es la primera película que vió en un cine?\",\n \"QUESTION_5\": \"¿Cuál era el destino del primer avión que cogió?\",\n \"QUESTION_6\": \"¿Cómo se llamaba su docente favorito en la escuela primaria?\",\n \"QUESTION_7\": \"¿Cuál sería para usted el mejor oficio?\",\n \"QUESTION_8\": \"¿Cuál es su libro infantil preferido?\",\n \"QUESTION_9\": \"¿Cuál fue el modelo de su primer vehículo?\",\n \"QUESTION_10\": \"¿Cuál fue su sobrenombre durante su infancia?\",\n \"QUESTION_11\": \"¿Cuál fue su personaje o actor/actriz preferido/a cuando era estudiante?\",\n \"QUESTION_12\": \"¿Cuál fue su cantante o grupo preferido cuando era estudiante?\",\n \"QUESTION_13\": \"¿En qué ciudad sus padres se encontraron?\",\n \"QUESTION_14\": \"¿Cómo se llamaba su primer jefe/a?\",\n \"QUESTION_15\": \"¿Cómo se llama la calle donde creció?\",\n \"QUESTION_16\": \"¿Cómo se llama la primera playa donde se bañó?\",\n \"QUESTION_17\": \"¿Cuál es el primer álbum que compró?\",\n \"QUESTION_18\": \"¿Cuál es el nombre de su equipo deportivo preferido?\",\n \"QUESTION_19\": \"¿Cuál fue el oficio de su abuelo?\",\n \"RECOVER_ID\": \"Recuperar sus credenciales\",\n \"REVOCATION_WITH_FILE\": \"Revocar una identidad a partir de un fichero\",\n \"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.\",\n \"REVOCATION_FILENAME\": \"revocacion-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt\",\n \"REVOCATION_WALLET\": \"Revocar esta identidad\",\n \"SAVE_ID\": \"Guardar mis credenciales\",\n \"STRONG_LEVEL\": \"Alto <span class=\\\"hidden-xs \\\">(6 preguntas min.)</span>\",\n \"TITLE\": \"Cuenta y seguridad\",\n \"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.\",\n \"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.\",\n \"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.\"\n },\n \"FILE_NAME\": \"{{currency}}_HistorialDeCuenta_{{pubkey|formatPubkey}}_{{currentTime|formatDateForFile}}.csv\",\n \"HEADERS\": {\n \"TIME\": \"Fecha\",\n \"AMOUNT\": \"Cantidad\",\n \"COMMENT\": \"Comentario\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Transferencia\",\n \"SUB_TITLE\": \"Hacer una transferencia\",\n \"FROM\": \"De\",\n \"TO\": \"A\",\n \"AMOUNT\": \"Importe\",\n \"AMOUNT_HELP\": \"Importe\",\n \"COMMENT\": \"Comentario\",\n \"COMMENT_HELP\": \"Comentario\",\n \"BTN_SEND\": \"Enviar\",\n \"BTN_ADD_COMMENT\": \"Añadir un comentario\",\n \"MODAL\": {\n \"TITLE\": \"Transferencia\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"Formato URI desconocido\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Llave pública no válida (suma de comprobación incorrecta).\",\n \"POPUP_TITLE\": \"Error\",\n \"UNKNOWN_ERROR\": \"Error desconocido\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Su navegador parece incompatible con las funcionalidades de cryptografía.\",\n \"DOWNLOAD_KEYFILE_FAILED\": \"Error al generar el archivo de llaves.\",\n \"EQUALS_TO_PSEUDO\": \"Debe ser diferente del seudónimo.\",\n \"EQUALS_TO_SALT\": \"Debe ser diferente del identificador.\",\n \"FIELD_REQUIRED\": \"Campo obligatorio.\",\n \"FIELD_TOO_SHORT\": \"Valor demasiado corta.\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Valor demasiado corta ({{minLength}} carácteres mín)\",\n \"FIELD_TOO_LONG\": \"Valor demasiado largo\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Valor demasiado largo, ({{maxLength}} carácteres máx)\",\n \"FIELD_MIN\": \"Valor mínimo: {{min}}\",\n \"FIELD_MAX\": \"Valor máximo: {{max}}\",\n \"FIELD_ACCENT\": \"Caracteres acentuados y comas no autorizados\",\n \"FIELD_NOT_NUMBER\": \"Valor numérico esperado\",\n \"FIELD_NOT_INT\": \"Valor entero esperado\",\n \"FIELD_NOT_EMAIL\": \"Correo electrónico no válido\",\n \"PASSWORD_NOT_CONFIRMED\": \"No coincide con la contraseña anterior.\",\n \"SALT_NOT_CONFIRMED\": \"No corresponde al identificador anterior.\",\n \"SEND_IDENTITY_FAILED\": \"Error de la inscripción.\",\n \"SEND_CERTIFICATION_FAILED\": \"Error de la certificación.\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"No se puede certificar, porque su cuenta no <b>es miembro</b>.\",\n \"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.\",\n \"IDENTITY_TO_CERTIFY_HAS_NO_SELF\": \"Esta cuenta no se pudo certificar. No se ha solicitado la membresía, o se necesita renovarla.\",\n \"LOGIN_FAILED\": \"Error durante la autentificación.\",\n \"LOAD_IDENTITY_FAILED\": \"Error de carga de la identidad.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Error de carga de las condiciones de la identidad.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Error en el intento de entrada en la comunidad.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Error en la interrupción de adhesión.\",\n \"REFRESH_WALLET_DATA\": \"Error en la actualización del monedero.\",\n \"GET_CURRENCY_PARAMETER\": \"Error en la recuperación de las reglas de moneda.\",\n \"GET_CURRENCY_FAILED\": \"Carga de la moneda imposible. Por favor, intente más tarde.\",\n \"SEND_TX_FAILED\": \"Error en la transferencia.\",\n \"ALL_SOURCES_USED\": \"Por favor, espera el cálculo del bloque siguiente (Todas sus fuentes de moneda fueron utilizada).\",\n \"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>.\",\n \"NOT_MEMBER_FOR_CERTIFICATION\": \"Su cuenta no es todavía de tipo miembro.\",\n \"ACCOUNT_CREATION_FAILED\": \"Error en la creación de la cuenta miembro.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Error en la recarga de los ajustes desde el almacenamiento local\",\n \"LOAD_WALLET_DATA_ERROR\": \"Error en la carga de los datos del monedero.\",\n \"COPY_CLIPBOARD_FAILED\": \"Copia de la valor imposible.\",\n \"TAKE_PICTURE_FAILED\": \"Error en la recuperación de la foto.\",\n \"SCAN_FAILED\": \"Error en el escán del Codigo QR\",\n \"SCAN_UNKNOWN_FORMAT\": \"Codigo no reconocido.\",\n \"WOT_LOOKUP_FAILED\": \"Error en la búsqueda\",\n \"LOAD_PEER_DATA_FAILED\": \"Lectura del nodo Duniter imposible. Por favor, intente más tarde.\",\n \"NEED_LOGIN_FIRST\": \"Por favor, conéctese en primer lugar.\",\n \"AMOUNT_REQUIRED\": \"El importe es obligatorio.\",\n \"AMOUNT_NEGATIVE\": \"Importe negativo no autorizado.\",\n \"NOT_ENOUGH_CREDIT\": \"Crédito insuficiente.\",\n \"INVALID_NODE_SUMMARY\": \"Nodo ilocalizable o dirección inválida.\",\n \"INVALID_USER_ID\": \"El seudónimo no debe contener ni espacios ni caracteres especiales o acentuado.\",\n \"INVALID_COMMENT\": \"El campo 'referencia no debe contener carácteres acentuados.\",\n \"INVALID_PUBKEY\": \"La llave pública no tiene el formato esperado.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Suma de comprobación inválida.\",\n \"IDENTITY_REVOKED\": \"Esta identidad <b>fue revocada</b>. No puede volver a convertirla en miembro.\",\n \"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.\",\n \"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.\",\n \"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.\",\n \"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>).\",\n \"IDENTITY_NOT_FOUND\": \"Identidad no encontrada\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Adhesión no validada.\",\n \"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.\",\n \"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.\",\n \"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.\",\n \"WALLET_HAS_NO_SELF\": \"Su identidad debe en primer lugar haber estado publicado, y no estar caducada.\",\n \"AUTH_REQUIRED\": \"Autenticación requerida.\",\n \"AUTH_INVALID_PUBKEY\": \"La llave pública no se corresponde con la cuenta conectada\",\n \"AUTH_INVALID_SCRYPT\": \"De usuario o contraseña no válidos.\",\n \"AUTH_INVALID_FILE\": \"archivo de llave no válido.\",\n \"AUTH_FILE_ERROR\": \"No se pudo abrir el archivo de llave\",\n \"IDENTITY_ALREADY_CERTIFY\": \"Ya <b>ha certificado</b> esta identidad.<br/><br/>Esta certificación todavía es valida (expiration {{expiresIn|formatDurationTo}}).\",\n \"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}}).\",\n \"IDENTITY_TX_FAILED\": \"Error al obtener las transacciones de la identidad\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Certificación imposible\",\n \"LOAD_NEWCOMERS_FAILED\": \"No se pudo cargar las nuevas membresías.\",\n \"LOAD_PENDING_FAILED\": \"No se pudo cargar las inscripciones pendientes.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Debe <b>ser miembro</b> para poder realizar esta acción.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"Debe haber <b>publicado su identidad</b> para poder realizar esta acción.\",\n \"GET_BLOCK_FAILED\": \"Error en la recuperación del bloque\",\n \"INVALID_BLOCK_HASH\": \"Bloque no encontrado (hash diferente)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Debe seleccionar un fichero de texto\",\n \"REVOCATION_FAILED\": \"Error en la revocación.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"identificador o contraseña incorrectos\",\n \"RECOVER_ID_FAILED\": \"Error en la recuperación de las credenciales\",\n \"LOAD_FILE_FAILED\": \"Error en la carga del archivo\",\n \"NOT_VALID_REVOCATION_FILE\": \"Archivo de revocación no válido (formato de archivo erróneo)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Archivo no válido (formato de archivo erróneo)\",\n \"NOT_VALID_KEY_FILE\": \"Archivo no válido (formato de archivo erróneo)\",\n \"EXISTING_ACCOUNT\": \"Sus credenciales corresponden a una cuenta existente, la <a ng-click=\\\"showHelpModal('pubkey')\\\">llave pública</a> es:\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Por favor, cambie sus credenciales para que coincida con una cuenta sin usar.\",\n \"GET_LICENSE_FILE_FAILED\": \"Error al obtener el archivo de licencia\",\n \"CHECK_NETWORK_CONNECTION\": \"No se puede conectar a ningún nodo.<br/><br/><b>Compruebe la conexión a Internet</b>.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Información\",\n \"CERTIFICATION_DONE\": \"Certificación enviada\",\n \"NOT_ENOUGH_CREDIT\": \"Crédito insuficiente\",\n \"TRANSFER_SENT\": \"Transferencia enviada\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copia realizada\",\n \"MEMBERSHIP_OUT_SENT\": \"Anulación enviada\",\n \"NOT_NEED_MEMBERSHIP\": \"Ya es miembro.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"Esta identidad pronto va a necesitar certificaciones (al menos {{willNeedCertificationCount}}).\",\n \"REVOCATION_SENT\": \"Revocación enviada\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"La <b>revocación de esta identidad</b> fue solicitada y está en espera de ser procesada.\",\n \"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? ;)\",\n \"EMPTY_TX_HISTORY\": \"Ninguna operación a exportar\"\n },\n \"CONFIRM\": {\n \"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?\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certificar {{uid}}\",\n \"EXIT_APP\": \"¿ Cerrar la aplicación ?\",\n \"FULLSCREEN\": \"¿ Mostrar la aplicación en pantalla completa ?\",\n \"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>\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"¿Error de introducción de datos?\",\n \"LOGOUT\": \"¿Desea desconectarse?\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Advertencia de seguridad</b>\",\n \"POPUP_TITLE\": \"<b>Confirmación</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Advertencia</b>\",\n \"SAVE_BEFORE_LEAVE\": \"¿Desea <b>guardar sus cambios</b> antes de abandonar la página?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Cambios no registrados\",\n \"USE_FALLBACK_NODE\": \"Nodo <b>{{old}}</b> inalcanzable o dirección inválida.<br/><br/>¿Desea utilizar temporalmente el nodo <b>{{new}}</b>?\"\n},\n \"DOWNLOAD\": {\n \"POPUP_TITLE\": \"<b>Revocación del archivo</b>\",\n \"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>\"\n },\n \"HELP\": {\n \"TITLE\": \"Ayuda en línea\",\n \"JOIN\": {\n \"SECTION\": \"Inscripción\",\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.\",\n \"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.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glosario\",\n \"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.\",\n \"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.\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"fr-FR\", {\n \"COMMON\": {\n \"APP_NAME\": \"ğ<b>change</b>\",\n \"APP_VERSION\": \"v{{version}}\",\n \"APP_BUILD\": \"date : {{build}}\",\n \"PUBKEY\": \"Clé publique\",\n \"MEMBER\": \"Membre\",\n \"BLOCK\" : \"Bloc\",\n \"BTN_OK\": \"OK\",\n \"BTN_YES\": \"Oui\",\n \"BTN_NO\": \"Non\",\n \"BTN_SEND\": \"Envoyer\",\n \"BTN_SEND_MONEY\": \"Faire un virement\",\n \"BTN_SEND_MONEY_SHORT\": \"Virement\",\n \"BTN_SAVE\": \"Enregistrer\",\n \"BTN_YES_SAVE\": \"Oui, Enregistrer\",\n \"BTN_YES_CONTINUE\": \"Oui, Continuer\",\n \"BTN_SHOW\": \"Voir\",\n \"BTN_SHOW_PUBKEY\": \"Afficher la clé publique\",\n \"BTN_RELATIVE_UNIT\": \"Afficher les montants en DU ?\",\n \"BTN_BACK\": \"Retour\",\n \"BTN_NEXT\": \"Suivant\",\n \"BTN_IMPORT\": \"Importer\",\n \"BTN_CANCEL\": \"Annuler\",\n \"BTN_CLOSE\": \"Fermer\",\n \"BTN_COPY\": \"Copier\",\n \"BTN_LATER\": \"Plus tard\",\n \"BTN_LOGIN\": \"Se connecter\",\n \"BTN_LOGOUT\": \"Déconnexion\",\n \"BTN_ADD_ACCOUNT\": \"Nouveau compte\",\n \"BTN_SHARE\": \"Partager\",\n \"BTN_EDIT\": \"Modifier\",\n \"BTN_DELETE\": \"Supprimer\",\n \"BTN_ADD\": \"Ajouter\",\n \"BTN_SEARCH\": \"Rechercher\",\n \"BTN_REFRESH\": \"Actualiser\",\n \"BTN_RETRY\": \"Recommencer\",\n \"BTN_START\": \"Commencer\",\n \"BTN_CONTINUE\": \"Continuer\",\n \"BTN_CREATE\": \"Créer\",\n \"BTN_UNDERSTOOD\": \"J'ai compris\",\n \"BTN_OPTIONS\": \"Options\",\n \"BTN_HELP_TOUR\": \"Visite guidée\",\n \"BTN_HELP_TOUR_SCREEN\": \"Découvrir cet écran\",\n \"BTN_DOWNLOAD\": \"Télécharger\",\n \"BTN_DOWNLOAD_ACCOUNT_STATEMENT\": \"Télécharger le relevé du compte\",\n \"BTN_MODIFY\": \"Modifier\",\n \"CHOOSE_FILE\": \"Déposez votre fichier <br/>ou cliquez pour le sélectionner\",\n \"DAYS\": \"jours\",\n \"NO_ACCOUNT_QUESTION\": \"Pas encore de compte ? Créez-en un gratuitement !\",\n \"SEARCH_NO_RESULT\": \"Aucun résultat trouvé\",\n \"LOADING\": \"Veuillez patienter...\",\n \"LOADING_WAIT\": \"Veuillez patienter...<br/><small>(ğchange interroge le réseau)</small>\",\n \"SEARCHING\": \"Recherche en cours...\",\n \"FROM\": \"De\",\n \"TO\": \"À\",\n \"COPY\": \"Copier\",\n \"LANGUAGE\": \"Langue\",\n \"UNIVERSAL_DIVIDEND\": \"Dividende universel\",\n \"UD\": \"DU\",\n \"DATE_PATTERN\": \"DD/MM/YY HH:mm\",\n \"DATE_FILE_PATTERN\": \"YYYY-MM-DD\",\n \"DATE_SHORT_PATTERN\": \"DD/MM/YY\",\n \"DATE_MONTH_YEAR_PATTERN\": \"MM/YYYY\",\n \"EMPTY_PARENTHESIS\": \"(vide)\",\n \"UID\": \"Pseudonyme\",\n \"ENABLE\": \"Activé\",\n \"DISABLE\": \"Désactivé\",\n \"RESULTS_LIST\": \"Résultats\",\n \"RESULTS_COUNT\": \"{{count}} résultats\",\n \"EXECUTION_TIME\": \"exécuté en {{duration|formatDurationMs}}\",\n \"SHOW_VALUES\": \"Afficher les valeurs en clair ?\",\n \"POPOVER_ACTIONS_TITLE\": \"Options\",\n \"POPOVER_FILTER_TITLE\": \"Filtres\",\n \"SHOW_MORE\": \"Afficher plus\",\n \"SHOW_MORE_COUNT\": \"(limite actuelle à {{limit}})\",\n \"POPOVER_SHARE\": {\n \"TITLE\": \"Partager\",\n \"SHARE_ON_TWITTER\": \"Partager sur Twitter\",\n \"SHARE_ON_FACEBOOK\": \"Partager sur Facebook\",\n \"SHARE_ON_DIASPORA\": \"Partager sur Diaspora*\",\n \"SHARE_ON_MASTODON\": \"Partager sur Mastodon\",\n \"INSTANCE_ADDRESS_HELP\": \"Entrer l'adresse de l'instance (ex: https://framapiaf.org) :\"\n },\n \"FILE\": {\n \"DATE\": \"Date :\",\n \"TYPE\": \"Type :\",\n \"SIZE\": \"Taille :\",\n \"VALIDATING\": \"Validation en cours...\"\n }\n },\n \"SYSTEM\": {\n \"PICTURE_CHOOSE_TYPE\": \"Choisir la source :\",\n \"BTN_PICTURE_GALLERY\": \"Galerie\",\n \"BTN_PICTURE_CAMERA\": \"<b>Caméra</b>\"\n },\n \"MENU\": {\n \"HOME\": \"Accueil\",\n \"WOT\": \"Annuaire\",\n \"CURRENCY\": \"Monnaie\",\n \"ACCOUNT\": \"Mon compte\",\n \"WALLETS\": \"Mes portefeuilles\",\n \"TRANSFER\": \"Virement\",\n \"SCAN\": \"Scanner\",\n \"SETTINGS\": \"Paramètres\",\n \"NETWORK\": \"Réseau\",\n \"TRANSACTIONS\": \"Mes opérations\"\n },\n \"ABOUT\": {\n \"TITLE\": \"À propos\",\n \"LICENSE\": \"Application <b>libre</b> (Licence GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"Il existe une <b>version plus récente</b> de {{'COMMON.APP_NAME'|translate}} (<b>v{{version}}</b>)\",\n \"PLEASE_UPDATE\": \"Veuillez mettre à jour {{'COMMON.APP_NAME'|translate}} (dernière version : <b>v{{version}}</b>)\",\n \"CODE\": \"Code source :\",\n \"OFFICIAL_WEB_SITE\": \"Site web officiel :\",\n \"DEVELOPERS\": \"Développé par :\",\n \"FORUM\": \"Forum :\",\n \"DEV_WARNING\": \"Avertissement\",\n \"DEV_WARNING_MESSAGE\": \"Cette application est toujours en développement.<br/>N'hésitez pas à nous remonter les anomalies rencontrées !\",\n \"DEV_WARNING_MESSAGE_SHORT\": \"Cette application est toujours en développement.\",\n \"REPORT_ISSUE\": \"Remonter un problème\"\n },\n \"HOME\": {\n \"TITLE\": \"ğ<b>change</b>\",\n \"MESSAGE\": \"ğ<b>change</b> ?\",\n \"MESSAGE_CURRENCY\": \"Un logiciel pour <b>garder le contrôle</b> de vos petites annonces en {{currency|abbreviate}}\",\n \"BTN_CURRENCY\": \"Explorer la monnaie {{name|abbreviate}}\",\n \"BTN_ABOUT\": \"à propos\",\n \"BTN_HELP\": \"Aide en ligne\",\n \"REPORT_ISSUE\": \"anomalie\",\n \"NOT_YOUR_ACCOUNT_QUESTION\" : \"Vous n'êtes pas propriétaire du compte<br/><b>{{name|| (pubkey|formatPubkey) }}</b> ?\",\n \"BTN_CHANGE_ACCOUNT\": \"Déconnecter ce compte\",\n \"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>.\",\n \"SHOW_ALL_FEED\": \"Voir tout\",\n \"READ_MORE\": \"Lire la suite\",\n \"FEED_SOURCE\": \"Source\"\n },\n \"SETTINGS\": {\n \"TITLE\": \"Paramètres\",\n \"DISPLAY_DIVIDER\": \"Affichage\",\n \"STORAGE_DIVIDER\": \"Stockage\",\n \"NETWORK_SETTINGS\": \"Réseau\",\n \"PEER\": \"Adresse du nœud Duniter\",\n \"PEER_SHORT\": \"Adresse du nœud\",\n \"PEER_CHANGED_TEMPORARY\": \"Adresse utilisée temporairement\",\n \"PERSIST_CACHE\": \"Conserver les données de navigation (expérimental)\",\n \"PERSIST_CACHE_HELP\": \"Permet une navigation plus rapide, en conservant localement les données reçues, pour les utiliser d'une session à l'autre.\",\n \"USE_LOCAL_STORAGE\": \"Activer le stockage local\",\n \"USE_LOCAL_STORAGE_HELP\": \"Permet de sauvegarder vos paramètres\",\n \"ENABLE_HELPTIP\": \"Activer les bulles d'aide contextuelles\",\n \"ENABLE_UI_EFFECTS\": \"Activer les effets visuels\",\n \"HISTORY_SETTINGS\": \"Mes opérations\",\n \"DISPLAY_UD_HISTORY\": \"Afficher les dividendes produits ?\",\n \"AUTHENTICATION_SETTINGS\": \"Authentification\",\n \"REMEMBER_ME\": \"Se souvenir de moi ?\",\n \"REMEMBER_ME_HELP\": \"Permet de rester toujours connecté.\",\n \"PLUGINS_SETTINGS\": \"Extensions\",\n \"BTN_RESET\": \"Restaurer les valeurs par défaut\",\n \"EXPERT_MODE\": \"Activer le mode expert\",\n \"EXPERT_MODE_HELP\": \"Permet un affichage plus détaillé\",\n \"POPUP_PEER\": {\n \"TITLE\": \"Nœud Duniter\",\n \"HOST\": \"Adresse\",\n \"HOST_HELP\": \"Adresse : serveur:port\",\n \"USE_SSL\": \"Sécurisé ?\",\n \"USE_SSL_HELP\": \"(Chiffrement SSL)\",\n \"BTN_SHOW_LIST\": \"Liste des noeuds\"\n }\n },\n \"BLOCKCHAIN\": {\n \"HASH\": \"Hash : {{hash}}\",\n \"VIEW\": {\n \"HEADER_TITLE\": \"Bloc #{{number}}-{{hash|formatHash}}\",\n \"TITLE_CURRENT\": \"Bloc courant\",\n \"TITLE\": \"Bloc #{{number|formatInteger}}\",\n \"COMPUTED_BY\": \"Calculé par le noeud de\",\n \"SHOW_RAW\": \"Voir le fichier brut\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"VERSION\": \"Version du format\",\n \"HASH\": \"Hash calculé\",\n \"UNIVERSAL_DIVIDEND_HELP\": \"Monnaie co-produite par chacun des {{membersCount}} membres\",\n \"EMPTY\": \"Aucune donnée dans ce bloc\",\n \"POW_MIN\": \"Difficulté minimale\",\n \"POW_MIN_HELP\": \"Difficulté imposée pour le calcul du hash\",\n \"DATA_DIVIDER\": \"Données\",\n \"IDENTITIES_COUNT\": \"Nouvelles identités\",\n \"JOINERS_COUNT\": \"Nouveaux membres\",\n \"ACTIVES_COUNT\": \"Renouvellements\",\n \"ACTIVES_COUNT_HELP\": \"Membres ayant renouvelé leur adhésion\",\n \"LEAVERS_COUNT\": \"Membres sortants\",\n \"LEAVERS_COUNT_HELP\": \"Membres ne souhaitant plus de certification\",\n \"EXCLUDED_COUNT\": \"Membres exclus\",\n \"EXCLUDED_COUNT_HELP\": \"Anciens membres exclus par non renouvellement ou manque de certifications\",\n \"REVOKED_COUNT\": \"Identités révoquées\",\n \"REVOKED_COUNT_HELP\": \"Ces comptes ne pourront plus être membres\",\n \"TX_COUNT\": \"Transactions\",\n \"CERT_COUNT\": \"Certifications\",\n \"TX_TO_HIMSELF\": \"Opération de change\",\n \"TX_OUTPUT_UNLOCK_CONDITIONS\": \"Conditions de déblocage\",\n \"TX_OUTPUT_OPERATOR\": {\n \"AND\": \"et\",\n \"OR\": \"ou\"\n },\n \"TX_OUTPUT_FUNCTION\": {\n \"SIG\": \"<b>Signature</b> de \",\n \"XHX\": \"<b>Mot de passe</b>, dont SHA256 =\",\n \"CSV\": \"Bloqué pendant\",\n \"CLTV\": \"Bloqué jusqu'à\"\n }\n },\n \"LOOKUP\": {\n \"TITLE\": \"Blocs\",\n \"NO_BLOCK\": \"Aucun bloc\",\n \"LAST_BLOCKS\": \"Derniers blocs :\",\n \"BTN_COMPACT\": \"Compacter\"\n }\n },\n \"CURRENCY\": {\n \"VIEW\": {\n \"TITLE\": \"Monnaie\",\n \"TAB_CURRENCY\": \"Monnaie\",\n \"TAB_WOT\": \"Toile de confiance\",\n \"TAB_NETWORK\": \"Réseau\",\n \"TAB_BLOCKS\": \"Blocs\",\n \"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}}.\",\n \"NETWORK_RULES_DIVIDER\": \"Règles du réseau\",\n \"CURRENCY_NAME\": \"Nom de la monnaie\",\n \"MEMBERS\": \"Nombre de membres\",\n \"MEMBERS_VARIATION\": \"Variation depuis le dernier DU\",\n \"MONEY_DIVIDER\": \"Monnaie\",\n \"MASS\": \"Masse monétaire\",\n \"SHARE\": \"Masse par membre\",\n \"UD\": \"Dividende universel\",\n \"C_ACTUAL\": \"Croissance actuelle\",\n \"MEDIAN_TIME\": \"Heure de la blockchain\",\n \"POW_MIN\": \"Niveau minimal de difficulté de calcul\",\n \"MONEY_RULES_DIVIDER\": \"Règles de la monnaie\",\n \"C_RULE\": \"Croissance théorique cible\",\n \"UD_RULE\": \"Calcul du dividende universel\",\n \"DT_REEVAL\": \"Période de revalorisation du DU\",\n \"REEVAL_SYMBOL\": \"reval\",\n \"DT_REEVAL_VALUE\": \"Tous les <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})\",\n \"UD_REEVAL_TIME0\": \"Date de la 1ère revalorisation\",\n \"SIG_QTY_RULE\": \"Nombre de certifications requises pour devenir membre\",\n \"SIG_STOCK\": \"Nombre maximal de certifications émises par membre\",\n \"SIG_PERIOD\": \"Délai minimal d'attente entre 2 certifications successives émises par une même personne\",\n \"SIG_WINDOW\": \"Délai limite de prise en compte d'une certification\",\n \"SIG_VALIDITY\": \"Durée de vie d'une certification qui a été prise en compte\",\n \"MS_WINDOW\": \"Délai limite de prise en compte d'une demande d'adhésion comme membre\",\n \"MS_VALIDITY\": \"Durée de vie d'une adhésion qui a été prise en compte\",\n \"STEP_MAX\": \"Distance maximale, par les certifications, entre un nouvel entrant et les membres référents\",\n \"WOT_RULES_DIVIDER\": \"Règles de la toile de confiance\",\n \"SENTRIES\": \"Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent\",\n \"SENTRIES_FORMULA\": \"Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent (formule)\",\n \"XPERCENT\":\"Pourcentage minimum de membres référents à atteindre pour respecter la règle de distance\",\n \"AVG_GEN_TIME\": \"Temps moyen entre deux blocs\",\n \"CURRENT\": \"actuel\",\n \"MATH_CEILING\": \"PLAFOND\",\n \"DISPLAY_ALL_RULES\": \"Afficher toutes les règles ?\",\n \"BTN_SHOW_LICENSE\": \"Voir la licence\",\n \"WOT_DIVIDER\": \"Toile de confiance\"\n },\n \"LICENSE\": {\n \"TITLE\": \"Licence de la monnaie\",\n \"BTN_DOWNLOAD\": \"Télécharger le fichier\",\n \"NO_LICENSE_FILE\": \"Fichier de licence non trouvé.\"\n }\n },\n \"NETWORK\": {\n \"VIEW\": {\n \"MEDIAN_TIME\": \"Heure de la blockchain\",\n \"LOADING_PEERS\": \"Chargement des noeuds...\",\n \"NODE_ADDRESS\": \"Adresse :\",\n \"SOFTWARE\": \"Logiciel\",\n \"WARN_PRE_RELEASE\": \"Pré-version (dernière version stable : <b>{{version}}</b>)\",\n \"WARN_NEW_RELEASE\": \"Version <b>{{version}}</b> disponible\",\n \"WS2PID\": \"Identifiant :\",\n \"PRIVATE_ACCESS\": \"Accès privé\",\n \"POW_PREFIX\": \"Préfixe de preuve de travail :\",\n \"ENDPOINTS\": {\n \"BMAS\": \"Interface sécurisée (SSL)\",\n \"BMATOR\": \"Interface réseau TOR\",\n \"WS2P\": \"Interface WS2P\",\n \"ES_USER_API\": \"Noeud de données Cesium+\"\n }\n },\n \"INFO\": {\n \"ONLY_SSL_PEERS\": \"Les noeuds non SSL ont un affichage dégradé, car Cesium fonctionne en mode HTTPS.\"\n }\n },\n \"PEER\": {\n \"PEERS\": \"Nœuds\",\n \"SIGNED_ON_BLOCK\": \"Signé sur le bloc\",\n \"MIRROR\": \"miroir\",\n \"MIRRORS\": \"Miroirs\",\n \"MIRROR_PEERS\": \"Nœuds miroirs\",\n \"PEER_LIST\" : \"Liste des nœuds\",\n \"MEMBERS\" : \"Membres\",\n \"MEMBER_PEERS\" : \"Nœuds membres\",\n \"ALL_PEERS\" : \"Tous les nœuds\",\n \"DIFFICULTY\" : \"Difficulté\",\n \"API\" : \"API\",\n \"CURRENT_BLOCK\" : \"Bloc #\",\n \"POPOVER_FILTER_TITLE\": \"Filtre\",\n \"OFFLINE\": \"Hors ligne\",\n \"OFFLINE_PEERS\": \"Nœuds hors ligne\",\n \"BTN_SHOW_PEER\": \"Voir le nœud\",\n \"VIEW\": {\n \"TITLE\": \"Nœud\",\n \"OWNER\": \"Appartient à\",\n \"SHOW_RAW_PEERING\": \"Voir la fiche de pair\",\n \"SHOW_RAW_CURRENT_BLOCK\": \"Voir le dernier bloc (format brut)\",\n \"LAST_BLOCKS\": \"Derniers blocs connus\",\n \"KNOWN_PEERS\": \"Nœuds connus :\",\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"ERROR\": {\n \"LOADING_TOR_NODE_ERROR\": \"Récupération des informations du noeud impossible. Le délai d'attente est dépassé.\",\n \"LOADING_NODE_ERROR\": \"Récupération des informations du noeud impossible\"\n }\n }\n },\n \"WOT\": {\n \"SEARCH_HELP\": \"Recherche (nom, prénom, hashtag)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"Durant la phase de pré-inscription, la recherche des inscriptions en attente <b>peut être longue</b>. Merci de patienter...\",\n \"REGISTERED_SINCE\": \"Inscrit le\",\n \"REGISTERED_SINCE_BLOCK\": \"Inscrit au bloc #\",\n \"NO_CERTIFICATION\": \"Aucune certification validée\",\n \"NO_GIVEN_CERTIFICATION\": \"Aucune certification émise\",\n \"NOT_MEMBER_PARENTHESIS\": \"(non membre)\",\n \"IDENTITY_REVOKED_PARENTHESIS\": \"(identité révoquée)\",\n \"MEMBER_PENDING_REVOCATION_PARENTHESIS\": \"(en cours de révocation)\",\n \"EXPIRE_IN\": \"Expiration\",\n \"NOT_WRITTEN_EXPIRE_IN\": \"Date limite<br/>de traitement\",\n \"EXPIRED\": \"Expiré\",\n \"PSEUDO\": \"Pseudonyme\",\n \"SIGNED_ON_BLOCK\": \"Emise au bloc #{{block}}\",\n \"WRITTEN_ON_BLOCK\": \"Ecrite au bloc #{{block}}\",\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"NOT_MEMBER_ACCOUNT\": \"Compte simple (non membre)\",\n \"NOT_MEMBER_ACCOUNT_HELP\": \"Il s'agit d'un simple portefeuille, sans demande d'adhésion en attente.\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"BTN_CERTIFY\": \"Certifier\",\n \"BTN_YES_CERTIFY\": \"Oui, certifier\",\n \"BTN_SELECT_AND_CERTIFY\": \"Nouvelle certification\",\n \"ACCOUNT_OPERATIONS\": \"Opérations sur le compte\",\n \"VIEW\": {\n \"POPOVER_SHARE_TITLE\": \"Identité {{title}}\"\n },\n \"LOOKUP\": {\n \"TITLE\": \"Annuaire\",\n \"NEWCOMERS\": \"Nouveaux membres :\",\n \"NEWCOMERS_COUNT\": \"{{count}} membres\",\n \"PENDING\": \"Inscriptions en attente :\",\n \"PENDING_COUNT\": \"{{count}} inscriptions en attente\",\n \"REGISTERED\": \"Inscrit {{time | formatFromNow}}\",\n \"MEMBER_FROM\": \"Membre depuis {{time|formatFromNowShort}}\",\n \"BTN_NEWCOMERS\": \"Nouveaux membres\",\n \"BTN_PENDING\": \"Inscriptions en attente\",\n \"SHOW_MORE\": \"Afficher plus\",\n \"SHOW_MORE_COUNT\": \"(limite actuelle à {{limit}})\",\n \"NO_PENDING\": \"Aucune inscription en attente.\",\n \"NO_NEWCOMERS\": \"Aucun membre.\"\n },\n \"CONTACTS\": {\n \"TITLE\": \"Contacts\"\n },\n \"MODAL\": {\n \"TITLE\": \"Recherche\"\n },\n \"CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications\",\n \"SUMMARY\": \"Certifications reçues\",\n \"LIST\": \"Détail des certifications reçues\",\n \"PENDING_LIST\": \"Certifications en attente de traitement\",\n \"RECEIVED\": \"Certifications reçues\",\n \"RECEIVED_BY\": \"Certifications reçues par {{uid}}\",\n \"ERROR\": \"Certifications reçues en erreur\",\n \"SENTRY_MEMBER\": \"Membre référent\"\n },\n \"OPERATIONS\": {\n \"TITLE\": \"{{uid}} - Opérations\"\n },\n \"GIVEN_CERTIFICATIONS\": {\n \"TITLE\": \"{{uid}} - Certifications émises\",\n \"SUMMARY\": \"Certifications émises\",\n \"LIST\": \"Détail des certifications émises\",\n \"PENDING_LIST\": \"Certifications en attente de traitement\",\n \"SENT\": \"Certifications émises\",\n \"SENT_BY\": \"Certifications émises par {{uid}}\",\n \"ERROR\": \"Certifications émises en erreur\"\n }\n },\n \"LOGIN\": {\n \"TITLE\": \"<i class=\\\"icon ion-log-in\\\"></i> Connexion\",\n \"SCRYPT_FORM_HELP\": \"Veuillez saisir vos identifiants.<br>Pensez à vérifier que la clé publique est celle de votre compte.\",\n \"PUBKEY_FORM_HELP\": \"Veuillez saisir une clé publique de compte :\",\n \"FILE_FORM_HELP\": \"Choisissez le fichier de trousseau à utiliser :\",\n \"SCAN_FORM_HELP\": \"Scanner le QR code d'un portefeuille.\",\n \"SALT\": \"Identifiant\",\n \"SALT_HELP\": \"Identifiant\",\n \"SHOW_SALT\": \"Afficher l'identifiant ?\",\n \"PASSWORD\": \"Mot de passe\",\n \"PASSWORD_HELP\": \"Mot de passe\",\n \"PUBKEY_HELP\": \"Exemple : « AbsxSY4qoZRzyV2irfep1V9xw1EMNyKJw2TkuVD4N1mv »\",\n \"NO_ACCOUNT_QUESTION\": \"Vous n'avez pas encore de compte ?\",\n \"HAVE_ACCOUNT_QUESTION\": \"Vous avez déjà un compte ?\",\n \"CREATE_ACCOUNT\": \"Créer un compte...\",\n \"CREATE_FREE_ACCOUNT\": \"Créer un compte gratuitement\",\n \"FORGOTTEN_ID\": \"Mot de passe oublié ?\",\n \"ASSOCIATED_PUBKEY\": \"Clé publique du trousseau :\",\n \"BTN_METHODS\": \"Autres méthodes\",\n \"BTN_METHODS_DOTS\": \"Changer de méthode...\",\n \"METHOD_POPOVER_TITLE\": \"Méthodes\",\n \"MEMORIZE_AUTH_FILE\": \"Mémoriser ce trousseau le temps de la session de navigation\",\n \"SCRYPT_PARAMETERS\": \"Paramètres (Scrypt) :\",\n \"AUTO_LOGOUT\": {\n \"TITLE\": \"Information\",\n \"MESSAGE\": \"<i class=\\\"ion-android-time\\\"></i> Vous avez été <b>déconnecté</b> automatiquement, suite à une inactivité prolongée.\",\n \"BTN_RELOGIN\": \"Me reconnecter\",\n \"IDLE_WARNING\": \"Vous allez être déconnecté... {{countdown}}\"\n },\n \"METHOD\": {\n \"SCRYPT_DEFAULT\": \"Identifiant et mot de passe\",\n \"SCRYPT_ADVANCED\": \"Salage avancé\",\n \"FILE\": \"Fichier de trousseau\",\n \"PUBKEY\": \"Clé publique ou pseudonyme\",\n \"SCAN\": \"Scanner un QR code\"\n },\n \"SCRYPT\": {\n \"SIMPLE\": \"Salage léger\",\n \"DEFAULT\": \"Salage standard\",\n \"SECURE\": \"Salage sûr\",\n \"HARDEST\": \"Salage le plus sûr\",\n \"EXTREME\": \"Salage extrême\",\n \"USER\": \"Salage personnalisé\",\n \"N\": \"N (Loop):\",\n \"r\": \"r (RAM):\",\n \"p\": \"p (CPU):\"\n },\n \"FILE\": {\n \"DATE\" : \"Date:\",\n \"TYPE\" : \"Type:\",\n \"SIZE\": \"Taille:\",\n \"VALIDATING\": \"Validation...\",\n \"HELP\": \"Format de fichier attendu : <b>.yml</b> ou <b>.dunikey</b> (type PubSec, WIF ou EWIF).\"\n }\n },\n \"ACCOUNT\": {\n \"TITLE\": \"Mon compte\",\n \"SHOW_MORE_TX\": \"Afficher plus\",\n \"SHOW_ALL_TX\": \"Afficher tout\",\n \"EVENTS\": \"Evénements\",\n \"BTN_RECEIVE_MONEY\": \"Encaisser\",\n \"BTN_SECURITY_DOTS\": \"Compte et sécurité...\",\n \"BTN_SHOW_DETAILS\": \"Afficher les infos techniques\",\n \"NEW\": {\n \"TITLE\": \"Inscription\",\n \"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.).\",\n \"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>.\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Anti-virus à jour, pare-feu activé, session protégée par mot de passe ou code pin, etc.\",\n \"INTRO_HELP\": \"Cliquez sur <b>{{'COMMON.BTN_START'|translate}}</b> pour débuter la création de compte. Vous serez guidé étape par étape.\",\n \"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.\",\n \"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.\",\n \"SELECT_ACCOUNT_TYPE\": \"Choisissez le type de compte à créer :\",\n \"MEMBER_ACCOUNT\": \"Compte membre\",\n \"MEMBER_ACCOUNT_TITLE\": \"Création d'un compte membre\",\n \"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}}.\",\n \"WALLET_ACCOUNT\": \"Simple portefeuille\",\n \"WALLET_ACCOUNT_TITLE\": \"Création d'un portefeuille\",\n \"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.\",\n \"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 !\",\n \"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 !\",\n \"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>\",\n \"PSEUDO\": \"Pseudonyme\",\n \"PSEUDO_HELP\": \"Pseudonyme\",\n \"SALT_CONFIRM\": \"Confirmation\",\n \"SALT_CONFIRM_HELP\": \"Confirmation de l'identifiant\",\n \"PASSWORD_CONFIRM\": \"Confirmation\",\n \"PASSWORD_CONFIRM_HELP\": \"Confirmation du mot de passe\",\n \"SLIDE_6_TITLE\": \"Confirmation :\",\n \"COMPUTING_PUBKEY\": \"Calcul en cours...\",\n \"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.\",\n \"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 ?\",\n \"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 ?\",\n \"CHECKING_PSEUDO\": \"Vérification...\",\n \"PSEUDO_AVAILABLE\": \"Pseudonyme disponible\",\n \"PSEUDO_NOT_AVAILABLE\": \"Pseudonyme non disponible\",\n \"INFO_LICENSE\": \"Avant de créer un compte membre, <b>veuillez lire et accepter la licence</b> d'usage de la monnaie :\",\n \"BTN_ACCEPT\": \"J'accepte\",\n \"BTN_ACCEPT_LICENSE\": \"J'accepte la licence\"\n },\n \"POPUP_REGISTER\": {\n \"TITLE\": \"Choisissez un pseudonyme\",\n \"HELP\": \"Un pseudonyme est obligatoire pour devenir membre.\"\n },\n \"HEADERS\": {\n \"TIME\": \"Date\",\n \"AMOUNT\": \"Montant\",\n \"COMMENT\": \"Commentaire\"\n }\n },\n \"TRANSFER\": {\n \"TITLE\": \"Virement\",\n \"SUB_TITLE\": \"Faire un virement\",\n \"FROM\": \"De\",\n \"TO\": \"À\",\n \"AMOUNT\": \"Montant\",\n \"AMOUNT_HELP\": \"Montant\",\n \"COMMENT\": \"Commentaire\",\n \"COMMENT_HELP\": \"Commentaire\",\n \"BTN_SEND\": \"Envoyer\",\n \"BTN_ADD_COMMENT\": \"Saisir un commentaire ?\",\n \"MODAL\": {\n \"TITLE\": \"Virement\"\n }\n },\n \"ERROR\": {\n \"UNKNOWN_URI_FORMAT\": \"Format d'URI inconnu\",\n \"PUBKEY_INVALID_CHECKSUM\": \"Clé publique invalide (bad checksum).\",\n \"POPUP_TITLE\": \"Erreur\",\n \"UNKNOWN_ERROR\": \"Erreur inconnue\",\n \"CRYPTO_UNKNOWN_ERROR\": \"Votre navigateur ne semble pas compatible avec les fonctionnalités de cryptographie.\",\n \"EQUALS_TO_PSEUDO\": \"Doit être différent du pseudonyme\",\n \"EQUALS_TO_SALT\": \"Doit être différent de l'identifiant secret\",\n \"FIELD_REQUIRED\": \"Champ obligatoire\",\n \"FIELD_TOO_SHORT\": \"Valeur trop courte\",\n \"FIELD_TOO_SHORT_WITH_LENGTH\": \"Valeur trop courte ({{minLength}} caractères min)\",\n \"FIELD_TOO_LONG\": \"Valeur trop longue\",\n \"FIELD_TOO_LONG_WITH_LENGTH\": \"Valeur trop longue ({{maxLength}} caractères max)\",\n \"FIELD_MIN\": \"Valeur minimale : {{min}}\",\n \"FIELD_MAX\": \"Valeur maximale : {{max}}\",\n \"FIELD_ACCENT\": \"Caractères accentués et virgules non autorisés\",\n \"FIELD_NOT_NUMBER\": \"Valeur numérique attendue\",\n \"FIELD_NOT_INT\": \"Valeur entière attendue\",\n \"FIELD_NOT_EMAIL\": \"Adresse email non valide\",\n \"PASSWORD_NOT_CONFIRMED\": \"Ne correspond pas au mot de passe\",\n \"SALT_NOT_CONFIRMED\": \"Ne correspond pas à l'identifiant\",\n \"SEND_IDENTITY_FAILED\": \"Échec de l'inscription\",\n \"SEND_CERTIFICATION_FAILED\": \"Échec de la certification\",\n \"NEED_MEMBER_ACCOUNT_TO_CERTIFY\": \"Vous ne pouvez pas effectuer de certification, car votre compte n'est <b>pas membre</b>.\",\n \"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.\",\n \"NOT_MEMBER_FOR_CERTIFICATION\": \"Votre compte n'est pas encore membre.\",\n \"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.\",\n \"LOGIN_FAILED\": \"Erreur lors de la connexion.\",\n \"LOAD_IDENTITY_FAILED\": \"Erreur de chargement de l'identité.\",\n \"LOAD_REQUIREMENTS_FAILED\": \"Erreur de chargement des prérequis de l'identité.\",\n \"SEND_MEMBERSHIP_IN_FAILED\": \"Échec de la tentative d'entrée dans la communauté.\",\n \"SEND_MEMBERSHIP_OUT_FAILED\": \"Échec de l'arrêt de l'adhésion.\",\n \"REFRESH_WALLET_DATA\": \"Échec du rafraîchissement du portefeuille.\",\n \"GET_CURRENCY_PARAMETER\": \"Échec de la récupération des règles de la monnaie.\",\n \"GET_CURRENCY_FAILED\": \"Chargement de la monnaie impossible. Veuillez réessayer plus tard.\",\n \"SEND_TX_FAILED\": \"Échec du virement.\",\n \"ALL_SOURCES_USED\": \"Veuillez attendre le calcul du prochain bloc (toutes vos sources de monnaie ont été utilisées).\",\n \"NOT_ENOUGH_SOURCES\": \"Pas assez de change pour envoyer ce montant en une seule transaction.<br/>Montant maximum : {{amount}} {{unit}}<sub>{{subUnit}}</sub>.\",\n \"ACCOUNT_CREATION_FAILED\": \"Échec de la création du compte membre.\",\n \"RESTORE_WALLET_DATA_ERROR\": \"Échec du rechargement des paramètres depuis le stockage local\",\n \"LOAD_WALLET_DATA_ERROR\": \"Échec du chargement des données du portefeuille.\",\n \"COPY_CLIPBOARD_FAILED\": \"Copie de la valeur impossible.\",\n \"TAKE_PICTURE_FAILED\": \"Échec de la récupération de la photo.\",\n \"SCAN_FAILED\": \"Échec du scan de QR-code.\",\n \"SCAN_UNKNOWN_FORMAT\": \"Code non reconnu.\",\n \"WOT_LOOKUP_FAILED\": \"Échec de la recherche.\",\n \"LOAD_PEER_DATA_FAILED\": \"Lecture du nœud Duniter impossible. Veuillez réessayer ultérieurement.\",\n \"NEED_LOGIN_FIRST\": \"Veuillez d'abord vous connecter.\",\n \"AMOUNT_REQUIRED\": \"Le montant est obligatoire.\",\n \"AMOUNT_NEGATIVE\": \"Montant négatif non autorisé.\",\n \"NOT_ENOUGH_CREDIT\": \"Crédit insuffisant.\",\n \"INVALID_NODE_SUMMARY\": \"Nœud injoignable ou adresse invalide.\",\n \"INVALID_USER_ID\": \"Le pseudonyme ne doit contenir ni espace ni caractère spécial ou accentué.\",\n \"INVALID_COMMENT\": \"Le champ 'référence' ne doit pas contenir de caractères accentués.\",\n \"INVALID_PUBKEY\": \"La clé publique n'a pas le format attendu.\",\n \"INVALID_PUBKEY_CHECKSUM\": \"Somme de contrôle invalide.\",\n \"IDENTITY_REVOKED\": \"Cette identité <b>a été révoquée {{revocationTime|formatFromNow}}</b> ({{revocationTime|formatDate}}). Elle ne peut plus devenir membre.\",\n \"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.\",\n \"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.\",\n \"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.\",\n \"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>).\",\n \"IDENTITY_NOT_FOUND\": \"Identité non trouvée.\",\n \"IDENTITY_TX_FAILED\": \"Échec du chargement des opérations.\",\n \"WOT_PENDING_INVALID_BLOCK_HASH\": \"Adhésion non valide.\",\n \"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.\",\n \"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.\",\n \"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.\",\n \"WALLET_HAS_NO_SELF\": \"Votre identité doit d'abord avoir été publiée, et ne pas être expirée.\",\n \"AUTH_REQUIRED\": \"Authentification requise.\",\n \"AUTH_INVALID_PUBKEY\": \"La clé publique ne correspond pas au compte connecté.\",\n \"AUTH_INVALID_SCRYPT\": \"Identifiant ou mot de passe invalide.\",\n \"AUTH_INVALID_FILE\": \"Fichier de trousseau invalide.\",\n \"AUTH_FILE_ERROR\": \"Échec de l'ouverture du fichier de trousseau\",\n \"IDENTITY_ALREADY_CERTIFY\": \"Vous avez <b>déjà certifié</b> cette identité.<br/><br/>Cette certification est encore valide (expiration {{expiresIn|formatDurationTo}}).\",\n \"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}}).\",\n \"UNABLE_TO_CERTIFY_TITLE\": \"Certification impossible\",\n \"LOAD_NEWCOMERS_FAILED\": \"Échec du chargement des nouveaux membres.\",\n \"LOAD_PENDING_FAILED\": \"Échec du chargement des inscriptions en attente.\",\n \"ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION\": \"Vous devez <b>être membre</b> pour pouvoir effectuer cette action.\",\n \"ONLY_SELF_CAN_EXECUTE_THIS_ACTION\": \"Vous devez avoir <b>publié votre identité</b> pour pouvoir effectuer cette action.\",\n \"GET_BLOCK_FAILED\": \"Échec de la récupération du bloc\",\n \"INVALID_BLOCK_HASH\": \"Bloc non trouvé (hash différent)\",\n \"DOWNLOAD_REVOCATION_FAILED\": \"Échec du téléchargement du fichier de révocation.\",\n \"REVOCATION_FAILED\": \"Échec de la révocation.\",\n \"SALT_OR_PASSWORD_NOT_CONFIRMED\": \"Identifiant ou mot de passe incorrect\",\n \"RECOVER_ID_FAILED\": \"Échec de la récupération des identifiants\",\n \"LOAD_FILE_FAILED\" : \"Échec du chargement du fichier\",\n \"NOT_VALID_REVOCATION_FILE\": \"Fichier de révocation non valide (mauvais format de fichier)\",\n \"NOT_VALID_SAVE_ID_FILE\": \"Fichier de récupération non valide (mauvais format de fichier)\",\n \"NOT_VALID_KEY_FILE\": \"Fichier de trousseau non valide (format non reconnu)\",\n \"EXISTING_ACCOUNT\": \"Vos identifiants correspondent à un compte déjà existant, dont la <a ng-click=\\\"showHelpModal('pubkey')\\\">clef publique</a> est :\",\n \"EXISTING_ACCOUNT_REQUEST\": \"Veuillez modifier vos identifiants afin qu'ils correspondent à un compte non utilisé.\",\n \"GET_LICENSE_FILE_FAILED\": \"Récupération du fichier de licence impossible\",\n \"CHECK_NETWORK_CONNECTION\": \"Aucun nœud ne semble accessible.<br/><br/>Veuillez <b>vérifier votre connexion Internet</b>.\"\n },\n \"INFO\": {\n \"POPUP_TITLE\": \"Information\",\n \"CERTIFICATION_DONE\": \"Certification envoyée\",\n \"NOT_ENOUGH_CREDIT\": \"Crédit insuffisant\",\n \"TRANSFER_SENT\": \"Virement envoyé\",\n \"COPY_TO_CLIPBOARD_DONE\": \"Copié dans le presse-papier\",\n \"MEMBERSHIP_OUT_SENT\": \"Résiliation envoyée\",\n \"NOT_NEED_MEMBERSHIP\": \"Vous êtes déjà membre.\",\n \"IDENTITY_WILL_MISSING_CERTIFICATIONS\": \"Cette identité va bientôt manquer de certifications (au moins {{willNeedCertificationCount}}).\",\n \"REVOCATION_SENT\": \"Révocation envoyée\",\n \"REVOCATION_SENT_WAITING_PROCESS\": \"La <b>révocation de cette identité</b> a été demandée et est en attente de traitement.\",\n \"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 ? ;)\",\n \"EMPTY_TX_HISTORY\": \"Aucune opération à exporter\"\n },\n \"CONFIRM\": {\n \"POPUP_TITLE\": \"<b>Confirmation</b>\",\n \"POPUP_WARNING_TITLE\": \"<b>Avertissement</b>\",\n \"POPUP_SECURITY_WARNING_TITLE\": \"<i class=\\\"icon ion-alert-circled\\\"></i> <b>Avertissement de sécurité</b>\",\n \"CERTIFY_RULES_TITLE_UID\": \"Certifier {{uid}}\",\n \"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é ?\",\n \"FULLSCREEN\": \"Afficher l'application en plein écran ?\",\n \"EXIT_APP\": \"Fermer l'application ?\",\n \"LOGIN_UNUSED_WALLET_TITLE\": \"Erreur de saisie ?\",\n \"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>.\",\n \"SAVE_BEFORE_LEAVE\": \"Voulez-vous <b>sauvegarder vos modifications</b> avant de quitter la page ?\",\n \"SAVE_BEFORE_LEAVE_TITLE\": \"Modifications non enregistrées\",\n \"LOGOUT\": \"Êtes-vous de vouloir vous déconnecter ?\",\n \"USE_FALLBACK_NODE\": \"Nœud <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud <b>{{new}}</b> ?\"\n },\n \"HELP\": {\n \"TITLE\": \"Aide en ligne\",\n \"JOIN\": {\n \"SECTION\": \"Inscription\",\n \"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.\",\n \"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.\"\n },\n \"GLOSSARY\": {\n \"SECTION\": \"Glossaire\",\n \"PUBKEY_DEF\": \"Une clé publique identifie un compte. Elle est calculée grâce à l'identifiant et au mot de passe.\",\n \"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.\"\n }\n }\n}\n);\n}]);\n","\nangular.module('cesium.plugins', [\n 'cesium.plugins.translations',\n 'cesium.plugins.templates',\n // ES plugin\n 'cesium.es.plugin',\n // Market plugin\n 'cesium.market.plugin',\n // Map plugin\n 'cesium.map.plugin',\n // Graph plugin\n 'cesium.graph.plugin'\n ])\n;\n","angular.module(\"cesium.plugins.translations\", []).config([\"$translateProvider\", function($translateProvider) {\n$translateProvider.translations(\"en-GB\", {\n \"COMMON\": {\n \"CATEGORY\": \"Category\",\n \"CATEGORY_SELECT_HELP\": \"Select\",\n \"CATEGORIES\": \"Categories\",\n \"CATEGORY_SEARCH_HELP\": \"Search\",\n \"COMMENT_HELP\": \"Comments\",\n \"LAST_MODIFICATION_DATE\": \"Updated on \",\n \"BTN_LIKE\": \"I like\",\n \"BTN_FOLLOW\": \"Follow\",\n \"BTN_STOP_FOLLOW\": \"Stop following\",\n \"LIKES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} liked this page\",\n \"DISLIKES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} disliked this page\",\n \"VIEWS_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} viewed this page\",\n \"FOLLOWS_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} follows this page\",\n \"ABUSES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Report a problem or an abuse...\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Cancel my problem report\",\n \"SUBMIT_BY\": \"Submitted by\",\n \"GEO_DISTANCE_SEARCH\": \"Search distance\",\n \"GEO_DISTANCE_OPTION\": \"{{value}} km\",\n \"BTN_PUBLISH\": \"Publish\",\n \"BTN_PICTURE_DELETE\": \"Delete\",\n \"BTN_PICTURE_FAVORISE\": \"Default\",\n \"BTN_PICTURE_ROTATE\": \"Rotate\",\n \"BTN_ADD_PICTURE\": \"Add picture\",\n \"NOTIFICATION\": {\n \"TITLE\": \"New notification | {{'COMMON.APP_NAME'|translate}}\",\n \"HAS_UNREAD\": \"You have {{count}} unread notification{{count>0?'s':''}}\"\n },\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notifications\",\n \"MARK_ALL_AS_READ\": \"Mark all as read\",\n \"NO_RESULT\": \"No notification\",\n \"SHOW_ALL\": \"Show all\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Could not load notifications\"\n },\n \"REPORT_ABUSE\": {\n \"TITLE\": \"Report a problem\",\n \"SUB_TITLE\": \"Please explain briefly the problem:\",\n \"REASON_HELP\": \"I explain the problem...\",\n \"ASK_DELETE\": \"Request removal?\",\n \"CONFIRM\": {\n \"SENT\": \"Request sent. Thank you!\"\n }\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Pages\",\n \"USER_PROFILE\": \"My Profile\",\n \"MESSAGES\": \"Messages\",\n \"NOTIFICATIONS\": \"Notifications\",\n \"INVITATIONS\": \"Invitations\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Account for an organization\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"If you represent a company, association, etc.<br/>No universal dividend will be created by this account.\"\n },\n \"EVENT\": {\n \"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.\"\n },\n \"ERROR\": {\n \"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.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Suggest identities to certify...\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Ask members to certify me...\",\n \"BTN_ASK_CERTIFICATION\": \"Ask a certification\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Suggest certifications\",\n \"HELP\": \"Select your suggestions\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Ask certifications\",\n \"HELP\": \"Select recipients\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Profile\",\n \"DIVIDER_PAGE\": \"Pages\",\n \"DIVIDER_GROUP\": \"Groups\"\n },\n \"VIEW\": {\n \"SENIORITY\": \"Seniority on {{'COMMON.APP_NAME'|translate}}\",\n \"STARS\": \"Trust level\",\n \"STAR_HIT_COUNT\": \"{{total}} rate{{total>1 ? 's' : ''}}\",\n \"BTN_STAR_HELP\": \"Rate this profile\",\n \"BTN_STARS_REMOVE\": \"Remove my note\",\n \"BTN_REDO_STAR_HELP\": \"Update your rate for this profile\",\n \"BTN_FOLLOW\": \"Follow the activity of this profile\",\n \"BTN_STOP_FOLLOW\": \"Stop following this profile\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Comments\",\n \"SHOW_MORE_COMMENTS\": \"Show previous comments\",\n \"COMMENT_HELP\": \"Your comment, question...\",\n \"COMMENT_HELP_REPLY_TO\": \"Your answer...\",\n \"BTN_SEND\": \"Send\",\n \"POPOVER_SHARE_TITLE\": \"Message #{{number}}\",\n \"REPLY\": \"Reply\",\n \"REPLY_TO\": \"Respond to:\",\n \"REPLY_TO_LINK\": \"In response to \",\n \"REPLY_TO_DELETED_COMMENT\": \"In response to a deleted comment\",\n \"REPLY_COUNT\": \"{{replyCount}} responses\",\n \"DELETED_COMMENT\": \"Comment deleted\",\n \"MODIFIED_ON\": \"modified on {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modified then)\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Saving comment failed\",\n \"FAILED_REMOVE_COMMENT\": \"Deleting comment failed\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Re: \",\n \"FORWARD_TITLE_PREFIX\": \"Fw: \",\n \"BTN_REPLY\": \"Reply\",\n \"BTN_COMPOSE\": \"New message\",\n \"BTN_WRITE\": \"Write\",\n \"NO_MESSAGE_INBOX\": \"No message received\",\n \"NO_MESSAGE_OUTBOX\": \"No message sent\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Messages\",\n \"MESSAGE_RECEIVED\": \"You <b>received a message</b><br/>from\"\n },\n \"LIST\": {\n \"INBOX\": \"Inbox\",\n \"OUTBOX\": \"Outbox\",\n \"LAST_INBOX\": \"New messages\",\n \"LAST_OUTBOX\": \"Sent messages\",\n \"BTN_LAST_MESSAGES\": \"Recent messages\",\n \"TITLE\": \"Private messages\",\n \"SEARCH_HELP\": \"Search in messages\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Options\",\n \"DELETE_ALL\": \"Delete all messages\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"New message\",\n \"TITLE_REPLY\": \"Reply\",\n \"SUB_TITLE\": \"New message\",\n \"TO\": \"To\",\n \"OBJECT\": \"Object\",\n \"OBJECT_HELP\": \"Object\",\n \"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.\",\n \"MESSAGE\": \"Message\",\n \"MESSAGE_HELP\": \"Message content\",\n \"CONTENT_CONFIRMATION\": \"No message content.<br/><br/>Are your sure you want to send this message?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Message\",\n \"SENDER\": \"Sent by\",\n \"RECIPIENT\": \"Sent to\",\n \"NO_CONTENT\": \"Empty message\",\n \"DELETE\": \"Delete the message\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Are you sure you want to <b>delete this message</b>?<br/><br/> This operation is irreversible.\",\n \"REMOVE_ALL\": \"Are you sure you want to <b>delete all messages</b>?<br/><br/> This operation is irreversible.\",\n \"MARK_ALL_AS_READ\": \"Are you sure you want to <b>mark all message as read</b>?\",\n \"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>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Message successfully deleted\",\n \"All_MESSAGE_REMOVED\": \"Messages successfully deleted\",\n \"MESSAGE_SENT\": \"Message sent\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Error while sending message.\",\n \"LOAD_MESSAGES_FAILED\": \"Error while loading messages.\",\n \"LOAD_MESSAGE_FAILED\": \"Error while loading message.\",\n \"MESSAGE_NOT_READABLE\": \"Unable to read message.\",\n \"USER_NOT_RECIPIENT\": \"You are not the recipient of this message: unable to read it.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"The authenticity of the message is not certain or its content is corrupted.\",\n \"REMOVE_MESSAGE_FAILED\": \"Error while deleting message\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Value too long ({{maxLength}} characters max).\",\n \"MARK_AS_READ_FAILED\": \"Unable to mark the message as 'read'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Error while loading messages notifications.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Error while removing all messages.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Error while marking messages as read.\",\n \"RECIPIENT_IS_MANDATORY\": \"Recipient is mandatory.\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Main activity\",\n \"GENERAL_DIVIDER\": \"Basic information\",\n \"LOCATION_DIVIDER\": \"Address\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Social networks, web sites\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"BTN_SHOW_WOT\": \"People\",\n \"BTN_SHOW_WOT_HELP\": \"Search for people\",\n \"BTN_SHOW_PAGES\": \"Pages\",\n \"BTN_SHOW_PAGES_HELP\": \"Search for pages\",\n \"BTN_NEW\": \"New page\",\n \"MY_PAGES\": \"My pages\",\n \"NO_PAGE\": \"No page\",\n \"SEARCH\": {\n \"TITLE\": \"Pages\",\n \"SEARCH_HELP\": \"What, Who: hairdresser, Lili's restaurant, ...\",\n \"BTN_ADD\": \"New\",\n \"BTN_LAST_RECORDS\": \"Recent pages\",\n \"BTN_ADVANCED_SEARCH\": \"Advanced search\",\n \"BTN_OPTIONS\": \"Advanced search\",\n \"TYPE\": \"Kind of organization\",\n \"LOCATION_HELP\": \"Where: City, Country\",\n \"RESULTS\": \"Results\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} result{{count>0?'s':''}}, near {{location}}\",\n \"RESULT_COUNT\": \"{{count}} result{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Recent pages\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} recent page{{count>0?'s':''}}, near {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} recent page{{count>0?'s':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Advanced options?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Registry\",\n \"CATEGORY\": \"Main activity:\",\n \"LOCATION\": \"Address:\",\n \"MENU_TITLE\": \"Options\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Are you sure you want to delete this reference?<br/><br/>This is irreversible.\"\n },\n \"TYPE\": {\n \"TITLE\": \"New page\",\n \"SELECT_TYPE\": \"Kind of organization:\",\n \"ENUM\": {\n \"SHOP\": \"Local shops\",\n \"COMPANY\": \"Company\",\n \"ASSOCIATION\": \"Association\",\n \"INSTITUTION\": \"Institution\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Edit\",\n \"TITLE_NEW\": \"New page\",\n \"RECORD_TYPE\":\"Kind of organization\",\n \"RECORD_TITLE\": \"Name\",\n \"RECORD_TITLE_HELP\": \"Name\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Describe activity\",\n \"RECORD_ADDRESS\": \"Street\",\n \"RECORD_ADDRESS_HELP\": \"Street, building...\",\n \"RECORD_CITY\": \"City\",\n \"RECORD_CITY_HELP\": \"City, Country\",\n \"RECORD_SOCIAL_NETWORKS\": \"Social networks and web site\",\n \"RECORD_PUBKEY\": \"Public key\",\n \"RECORD_PUBKEY_HELP\": \"Public key to receive payments\"\n },\n \"WALLET\": {\n \"REGISTRY_DIVIDER\": \"Pages\",\n \"REGISTRY_HELP\": \"Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Loading main activities failed\",\n \"LOAD_RECORD_FAILED\": \"Loading failed\",\n \"LOOKUP_RECORDS_FAILED\": \"Error while loading records.\",\n \"REMOVE_RECORD_FAILED\": \"Deleting failed\",\n \"SAVE_RECORD_FAILED\": \"Saving failed\",\n \"RECORD_NOT_EXISTS\": \"Record not found\",\n \"GEO_LOCATION_NOT_FOUND\": \"City or zip code not found\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Page successfully deleted\",\n \"RECORD_SAVED\": \"Page successfully saved\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"ğchange profile\",\n \"PROFILE_DIVIDER_HELP\": \"It is related data, stored in the ğchange network.\",\n \"NO_PROFILE_DEFINED\": \"No ğchange profile\",\n \"BTN_ADD\": \"Create my profile\",\n \"BTN_EDIT\": \"Edit my profile\",\n \"BTN_DELETE\": \"Delete my profile\",\n \"BTN_REORDER\": \"Reorder\",\n \"UID\": \"Pseudonym\",\n \"TITLE\": \"Lastname, FirstName\",\n \"TITLE_HELP\": \"Name\",\n \"DESCRIPTION\": \"About me\",\n \"DESCRIPTION_HELP\": \"About me...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"General data\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Social networks and web site\",\n \"STAR\": \"Trust level\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Avatar\",\n \"SELECT_FILE_HELP\": \"<b>Choose an image file</b>, by clicking on the button below:\",\n \"BTN_SELECT_FILE\": \"Choose an image\",\n \"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.\",\n \"RESULT_HELP\": \"<b>Here is the result</b> as seen on your profile:\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"Are you sure you want to <b>delete your Cesium+ profile ?</b><br/><br/>This operation is irreversible.\"\n },\n \"ERROR\": {\n \"REMOVE_PROFILE_FAILED\": \"Deleting profile failed\",\n \"LOAD_PROFILE_FAILED\": \"Could not load user profile.\",\n \"SAVE_PROFILE_FAILED\": \"Saving profile failed\",\n \"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>\",\n \"IMAGE_RESIZE_FAILED\": \"Error while resizing picture\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Profile deleted\",\n \"PROFILE_SAVED\": \"Profile saved\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"Please note that the information published here <b>is public</b>: visible including by <b>not logged in people</b>.\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Find my address on the map\",\n \"USE_GEO_POINT\": \"Verify address (recommended)?\",\n \"LOADING_LOCATION\": \"Searching address...\",\n \"LOCATION_DIVIDER\": \"Localisation\",\n \"ADDRESS\": \"Address\",\n \"ADDRESS_HELP\": \"Address (optional)\",\n \"CITY\": \"City\",\n \"CITY_HELP\": \"City, Country\",\n \"DISTANCE\": \"Maximum distance around the city\",\n \"DISTANCE_UNIT\": \"mi\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"City, Country\",\n \"PROFILE_POSITION\": \"Profile position\",\n \"MODAL\": {\n \"TITLE\": \"Search address\",\n \"SEARCH_HELP\": \"City, Country\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Alternative results for <b>{{address}}</b>:\",\n \"POSITION\": \"lat/lon : {{lat}} / {{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Required if a street has been filled\",\n \"REQUIRED_FOR_LOCATION\": \"Required field to appear on the map\",\n \"INVALID_FOR_LOCATION\": \"Unknown address\",\n \"GEO_LOCATION_FAILED\": \"Unable to retrieve your current position. Please use the search button.\",\n \"ADDRESS_LOCATION_FAILED\": \"Unable to retrieve the address position\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Online services\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"Online services offer optional additional services, delegated to a third party.\",\n \"BTN_ADD\": \"Add a service\",\n \"BTN_EDIT\": \"Manage my services\",\n \"NO_SUBSCRIPTION\": \"No service defined\",\n \"SUBSCRIPTION_COUNT\": \"Services / Subscription\",\n \"EDIT\": {\n \"TITLE\": \"Online services\",\n \"HELP_TEXT\": \"Manage your subscriptions and other online services here\",\n \"PROVIDER\": \"Provider:\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Receive email notifications\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Are you sur you want to <b>delete this subscription</b>?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Error while loading online services\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Error while adding subscription\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Error during subscription update\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Error while deleting subscription\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Notification by email\",\n \"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.\",\n \"EMAIL_LABEL\" : \"Your email:\",\n \"EMAIL_HELP\": \"john@domain.com\",\n \"FREQUENCY_LABEL\": \"Frequency of notifications:\",\n \"FREQUENCY_DAILY\": \"Daily\",\n \"FREQUENCY_WEEKLY\": \"Weekly\",\n \"PROVIDER\": \"Service Provider:\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash: \",\n \"LOOKUP\": {\n \"TITLE\": \"Document search\",\n \"BTN_ACTIONS\": \"Actions\",\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS_DOTS\": \"Last documents :\",\n \"LAST_DOCUMENTS\": \"Last documents\",\n \"SHOW_QUERY\": \"Show query\",\n \"HIDE_QUERY\": \"Hide query\",\n \"HEADER_TIME\": \"Time/Hour\",\n \"HEADER_ISSUER\": \"Issuer\",\n \"HEADER_RECIPIENT\": \"Recipient\",\n \"READ\": \"Read\",\n \"DOCUMENT_TYPE\": \"Type\",\n \"DOCUMENT_TITLE\": \"Title\",\n \"BTN_REMOVE\": \"Delete this document\",\n \"BTN_COMPACT\": \"Compact\",\n \"HAS_REGISTERED\": \"create or edit his profile\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Actions\",\n \"REMOVE_ALL\": \"Delete these documents...\"\n },\n \"TYPE\": {\n \"USER_PROFILE\": \"Profile\",\n \"MARKET_RECORD\": \"Ad\",\n \"MARKET_COMMENT\": \"Comment on a ad\",\n \"PAGE_RECORD\": \"Page\",\n \"PAGE_COMMENT\": \"Comment on a page\",\n \"GROUP_RECORD\": \"Group\",\n \"GROUP_COMMENT\": \"Comment on a group\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Deleted document\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Are you sure you want to <b>delete this document</b>?\",\n \"REMOVE_ALL\": \"Are you sure you want to <b>delete these documents</b>?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Error searching documents\",\n \"REMOVE_FAILED\": \"Error deleting the document\",\n \"REMOVE_ALL_FAILED\": \"Error deleting documents\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"User profiles, notifications, private messages\",\n \"ENABLE_TOGGLE\": \"Enable extension?\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Enable messages?\",\n \"ENABLE_SETTINGS_TOGGLE\": \"Enable remote storage for settings?\",\n \"PEER\": \"Data peer address\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Data peer\",\n \"HELP\" : \"Set the address of the peer to use:\",\n \"PEER_HELP\": \"server.domain.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notifications\",\n \"HELP_TEXT\": \"Enable the types of notifications you want to receive:\",\n \"ENABLE_TX_SENT\": \"Notify the validation of <b>sent payments</b>?\",\n \"ENABLE_TX_RECEIVED\": \"Notify the validation of <b>received payments</b>?\",\n \"ENABLE_CERT_SENT\": \"Notify the validation of <b>sent certifications</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Notify the validation of <b>received certifications</b>?\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"New features\",\n \"ASK_ENABLE\": \"Some new features are available: <ul><li>&nbsp;&nbsp;<b><i class=\\\"icon ion-person\\\"></i> user profiles</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li>&nbsp;&nbsp;<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?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"A recipient is required for encryption.\"\n }\n },\n \"ES_PEER\": {\n \"NAME\": \"Name\",\n \"DOCUMENTS\": \"Documents\",\n \"SOFTWARE\": \"Software\",\n \"DOCUMENT_COUNT\": \"Number of documents\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} subscribers to email notification\"\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Your node ES API <b>{{params[0]}}</b> is UP\",\n \"NODE_BMA_DOWN\": \"Node <b>{{params[0]}}:{{params[1]}}</b> (used by your ES API) is <b>unreachable</b>.\",\n \"NODE_BMA_UP\": \"Node <b>{{params[0]}}:{{params[1]}}</b> is reachable again.\",\n \"MEMBER_JOIN\": \"You are now a <b>member</b> of currency <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"You are <b>not a member anymore</b> of currency <b>{{params[0]}}</b>!\",\n \"MEMBER_EXCLUDE\": \"You are <b>not more member</b> of the currency <b>{{params[0]}}</b>, for lack of renewal or lack of certifications.\",\n \"MEMBER_REVOKE\": \"Your account has been revoked. It will no longer be a member of the currency <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"Your membership to <b>{{params[0]}}</b> has been <b>renewed successfully</b>.\",\n \"TX_SENT\": \"Your payment to <span class=\\\"positive\\\" ><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> was executed.\",\n \"TX_SENT_MULTI\": \"Your payment to <b>{{params[1]}}</b> was executed.\",\n \"TX_RECEIVED\": \"You received a payment from <span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"You received a payment from <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Your <b>certification</b> to <span class=\\\"positive\\\" ><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> was executed.\",\n \"CERT_RECEIVED\": \"You have <b>received a certification</b> from <span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> like your profile\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> follows your activity\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> rated you ({{params[3]}} <i class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has requested moderation on your profile\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has modified his comment on your referencing: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has replied to your comment on the referencing: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has commented on the page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has modified his comment on the page: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> added a page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> updated the page: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>\"\n }\n },\n \"CONFIRM\": {\n \"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?\"\n },\n \"ERROR\": {\n \"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>.\",\n \"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.\"\n }\n}\n);\n\n$translateProvider.translations(\"en\", {\n \"COMMON\": {\n \"CATEGORY\": \"Category\",\n \"CATEGORY_SELECT_HELP\": \"Select\",\n \"CATEGORIES\": \"Categories\",\n \"CATEGORY_SEARCH_HELP\": \"Search\",\n \"COMMENT_HELP\": \"Comments\",\n \"LAST_MODIFICATION_DATE\": \"Updated on \",\n \"BTN_LIKE\": \"I like\",\n \"BTN_FOLLOW\": \"Follow\",\n \"BTN_STOP_FOLLOW\": \"Stop following\",\n \"LIKES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} liked this page\",\n \"DISLIKES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} disliked this page\",\n \"VIEWS_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} viewed this page\",\n \"FOLLOWS_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} follows this page\",\n \"ABUSES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Report a problem or an abuse...\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Cancel my problem report\",\n \"SUBMIT_BY\": \"Submitted by\",\n \"GEO_DISTANCE_SEARCH\": \"Search distance\",\n \"GEO_DISTANCE_OPTION\": \"{{value}} km\",\n \"BTN_PUBLISH\": \"Publish\",\n \"BTN_PICTURE_DELETE\": \"Delete\",\n \"BTN_PICTURE_FAVORISE\": \"Default\",\n \"BTN_PICTURE_ROTATE\": \"Rotate\",\n \"BTN_ADD_PICTURE\": \"Add picture\",\n \"NOTIFICATION\": {\n \"TITLE\": \"New notification | {{'COMMON.APP_NAME'|translate}}\",\n \"HAS_UNREAD\": \"You have {{count}} unread notification{{count>0?'s':''}}\"\n },\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notifications\",\n \"MARK_ALL_AS_READ\": \"Mark all as read\",\n \"NO_RESULT\": \"No notification\",\n \"SHOW_ALL\": \"Show all\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Could not load notifications\"\n },\n \"REPORT_ABUSE\": {\n \"TITLE\": \"Report a problem\",\n \"SUB_TITLE\": \"Please explain briefly the problem:\",\n \"REASON_HELP\": \"I explain the problem...\",\n \"ASK_DELETE\": \"Request removal?\",\n \"CONFIRM\": {\n \"SENT\": \"Request sent. Thank you!\"\n }\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Pages\",\n \"USER_PROFILE\": \"My Profile\",\n \"MESSAGES\": \"Messages\",\n \"NOTIFICATIONS\": \"Notifications\",\n \"INVITATIONS\": \"Invitations\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Account for an organization\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"If you represent a company, association, etc.<br/>No universal dividend will be created by this account.\"\n },\n \"EVENT\": {\n \"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.\"\n },\n \"ERROR\": {\n \"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.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Suggest identities to certify...\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Ask members to certify me...\",\n \"BTN_ASK_CERTIFICATION\": \"Ask a certification\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Suggest certifications\",\n \"HELP\": \"Select your suggestions\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Ask certifications\",\n \"HELP\": \"Select recipients\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Profile\",\n \"DIVIDER_PAGE\": \"Pages\",\n \"DIVIDER_GROUP\": \"Groups\"\n },\n \"VIEW\": {\n \"SENIORITY\": \"Seniority on {{'COMMON.APP_NAME'|translate}}\",\n \"STARS\": \"Trust level\",\n \"STAR_HIT_COUNT\": \"{{total}} rate{{total>1 ? 's' : ''}}\",\n \"BTN_STAR_HELP\": \"Rate this profile\",\n \"BTN_STARS_REMOVE\": \"Remove my note\",\n \"BTN_REDO_STAR_HELP\": \"Update your rate for this profile\",\n \"BTN_FOLLOW\": \"Follow the activity of this profile\",\n \"BTN_STOP_FOLLOW\": \"Stop following this profile\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Comments\",\n \"SHOW_MORE_COMMENTS\": \"Show previous comments\",\n \"COMMENT_HELP\": \"Your comment, question...\",\n \"COMMENT_HELP_REPLY_TO\": \"Your answer...\",\n \"BTN_SEND\": \"Send\",\n \"POPOVER_SHARE_TITLE\": \"Message #{{number}}\",\n \"REPLY\": \"Reply\",\n \"REPLY_TO\": \"Respond to:\",\n \"REPLY_TO_LINK\": \"In response to \",\n \"REPLY_TO_DELETED_COMMENT\": \"In response to a deleted comment\",\n \"REPLY_COUNT\": \"{{replyCount}} responses\",\n \"DELETED_COMMENT\": \"Comment deleted\",\n \"MODIFIED_ON\": \"modified on {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modified then)\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Saving comment failed\",\n \"FAILED_REMOVE_COMMENT\": \"Deleting comment failed\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Re: \",\n \"FORWARD_TITLE_PREFIX\": \"Fw: \",\n \"BTN_REPLY\": \"Reply\",\n \"BTN_COMPOSE\": \"New message\",\n \"BTN_WRITE\": \"Write\",\n \"NO_MESSAGE_INBOX\": \"No message received\",\n \"NO_MESSAGE_OUTBOX\": \"No message sent\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Messages\",\n \"MESSAGE_RECEIVED\": \"You <b>received a message</b><br/>from\"\n },\n \"LIST\": {\n \"INBOX\": \"Inbox\",\n \"OUTBOX\": \"Outbox\",\n \"LAST_INBOX\": \"New messages\",\n \"LAST_OUTBOX\": \"Sent messages\",\n \"BTN_LAST_MESSAGES\": \"Recent messages\",\n \"TITLE\": \"Private messages\",\n \"SEARCH_HELP\": \"Search in messages\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Options\",\n \"DELETE_ALL\": \"Delete all messages\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"New message\",\n \"TITLE_REPLY\": \"Reply\",\n \"SUB_TITLE\": \"New message\",\n \"TO\": \"To\",\n \"OBJECT\": \"Object\",\n \"OBJECT_HELP\": \"Object\",\n \"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.\",\n \"MESSAGE\": \"Message\",\n \"MESSAGE_HELP\": \"Message content\",\n \"CONTENT_CONFIRMATION\": \"No message content.<br/><br/>Are your sure you want to send this message?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Message\",\n \"SENDER\": \"Sent by\",\n \"RECIPIENT\": \"Sent to\",\n \"NO_CONTENT\": \"Empty message\",\n \"DELETE\": \"Delete the message\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Are you sure you want to <b>delete this message</b>?<br/><br/> This operation is irreversible.\",\n \"REMOVE_ALL\": \"Are you sure you want to <b>delete all messages</b>?<br/><br/> This operation is irreversible.\",\n \"MARK_ALL_AS_READ\": \"Are you sure you want to <b>mark all message as read</b>?\",\n \"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>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Message successfully deleted\",\n \"All_MESSAGE_REMOVED\": \"Messages successfully deleted\",\n \"MESSAGE_SENT\": \"Message sent\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Error while sending message.\",\n \"LOAD_MESSAGES_FAILED\": \"Error while loading messages.\",\n \"LOAD_MESSAGE_FAILED\": \"Error while loading message.\",\n \"MESSAGE_NOT_READABLE\": \"Unable to read message.\",\n \"USER_NOT_RECIPIENT\": \"You are not the recipient of this message: unable to read it.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"The authenticity of the message is not certain or its content is corrupted.\",\n \"REMOVE_MESSAGE_FAILED\": \"Error while deleting message\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Value too long ({{maxLength}} characters max).\",\n \"MARK_AS_READ_FAILED\": \"Unable to mark the message as 'read'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Error while loading messages notifications.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Error while removing all messages.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Error while marking messages as read.\",\n \"RECIPIENT_IS_MANDATORY\": \"Recipient is mandatory.\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Main activity\",\n \"GENERAL_DIVIDER\": \"Basic information\",\n \"LOCATION_DIVIDER\": \"Address\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Social networks, web sites\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"BTN_SHOW_WOT\": \"People\",\n \"BTN_SHOW_WOT_HELP\": \"Search for people\",\n \"BTN_SHOW_PAGES\": \"Pages\",\n \"BTN_SHOW_PAGES_HELP\": \"Search for pages\",\n \"BTN_NEW\": \"New page\",\n \"MY_PAGES\": \"My pages\",\n \"NO_PAGE\": \"No page\",\n \"SEARCH\": {\n \"TITLE\": \"Pages\",\n \"SEARCH_HELP\": \"What, Who: hairdresser, Lili's restaurant, ...\",\n \"BTN_ADD\": \"New\",\n \"BTN_LAST_RECORDS\": \"Recent pages\",\n \"BTN_ADVANCED_SEARCH\": \"Advanced search\",\n \"BTN_OPTIONS\": \"Advanced search\",\n \"TYPE\": \"Kind of organization\",\n \"LOCATION_HELP\": \"Where: City, Country\",\n \"RESULTS\": \"Results\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} result{{count>0?'s':''}}, near {{location}}\",\n \"RESULT_COUNT\": \"{{count}} result{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Recent pages\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} recent page{{count>0?'s':''}}, near {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} recent page{{count>0?'s':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Advanced options?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Registry\",\n \"CATEGORY\": \"Main activity:\",\n \"LOCATION\": \"Address:\",\n \"MENU_TITLE\": \"Options\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Are you sure you want to delete this reference?<br/><br/>This is irreversible.\"\n },\n \"TYPE\": {\n \"TITLE\": \"New page\",\n \"SELECT_TYPE\": \"Kind of organization:\",\n \"ENUM\": {\n \"SHOP\": \"Local shops\",\n \"COMPANY\": \"Company\",\n \"ASSOCIATION\": \"Association\",\n \"INSTITUTION\": \"Institution\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Edit\",\n \"TITLE_NEW\": \"New page\",\n \"RECORD_TYPE\":\"Kind of organization\",\n \"RECORD_TITLE\": \"Name\",\n \"RECORD_TITLE_HELP\": \"Name\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Describe activity\",\n \"RECORD_ADDRESS\": \"Street\",\n \"RECORD_ADDRESS_HELP\": \"Street, building...\",\n \"RECORD_CITY\": \"City\",\n \"RECORD_CITY_HELP\": \"City, Country\",\n \"RECORD_SOCIAL_NETWORKS\": \"Social networks and web site\",\n \"RECORD_PUBKEY\": \"Public key\",\n \"RECORD_PUBKEY_HELP\": \"Public key to receive payments\"\n },\n \"WALLET\": {\n \"REGISTRY_DIVIDER\": \"Pages\",\n \"REGISTRY_HELP\": \"Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Loading main activities failed\",\n \"LOAD_RECORD_FAILED\": \"Loading failed\",\n \"LOOKUP_RECORDS_FAILED\": \"Error while loading records.\",\n \"REMOVE_RECORD_FAILED\": \"Deleting failed\",\n \"SAVE_RECORD_FAILED\": \"Saving failed\",\n \"RECORD_NOT_EXISTS\": \"Record not found\",\n \"GEO_LOCATION_NOT_FOUND\": \"City or zip code not found\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Page successfully deleted\",\n \"RECORD_SAVED\": \"Page successfully saved\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"ğchange profile\",\n \"PROFILE_DIVIDER_HELP\": \"It is related data, stored in the ğchange network.\",\n \"NO_PROFILE_DEFINED\": \"No ğchange profile\",\n \"BTN_ADD\": \"Create my profile\",\n \"BTN_EDIT\": \"Edit my profile\",\n \"BTN_DELETE\": \"Delete my profile\",\n \"BTN_REORDER\": \"Reorder\",\n \"UID\": \"Pseudonym\",\n \"TITLE\": \"Lastname, FirstName\",\n \"TITLE_HELP\": \"Name\",\n \"DESCRIPTION\": \"About me\",\n \"DESCRIPTION_HELP\": \"About me...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"General data\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Social networks and web site\",\n \"STAR\": \"Trust level\",\n \"TECHNICAL_DIVIDER\": \"Technical data\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Avatar\",\n \"SELECT_FILE_HELP\": \"<b>Choose an image file</b>, by clicking on the button below:\",\n \"BTN_SELECT_FILE\": \"Choose an image\",\n \"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.\",\n \"RESULT_HELP\": \"<b>Here is the result</b> as seen on your profile:\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"Are you sure you want to <b>delete your Cesium+ profile ?</b><br/><br/>This operation is irreversible.\"\n },\n \"ERROR\": {\n \"REMOVE_PROFILE_FAILED\": \"Deleting profile failed\",\n \"LOAD_PROFILE_FAILED\": \"Could not load user profile.\",\n \"SAVE_PROFILE_FAILED\": \"Saving profile failed\",\n \"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>\",\n \"IMAGE_RESIZE_FAILED\": \"Error while resizing picture\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Profile deleted\",\n \"PROFILE_SAVED\": \"Profile saved\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"Please note that the information published here <b>is public</b>: visible including by <b>not logged in people</b>.\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Find my address on the map\",\n \"USE_GEO_POINT\": \"Verify address (recommended)?\",\n \"LOADING_LOCATION\": \"Searching address...\",\n \"LOCATION_DIVIDER\": \"Localisation\",\n \"ADDRESS\": \"Address\",\n \"ADDRESS_HELP\": \"Address (optional)\",\n \"CITY\": \"City\",\n \"CITY_HELP\": \"City, Country\",\n \"DISTANCE\": \"Maximum distance around the city\",\n \"DISTANCE_UNIT\": \"mi\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"City, Country\",\n \"PROFILE_POSITION\": \"Profile position\",\n \"MODAL\": {\n \"TITLE\": \"Search address\",\n \"SEARCH_HELP\": \"City, Country\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Alternative results for <b>{{address}}</b>:\",\n \"POSITION\": \"lat/lon : {{lat}} / {{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Required if a street has been filled\",\n \"REQUIRED_FOR_LOCATION\": \"Required field to appear on the map\",\n \"INVALID_FOR_LOCATION\": \"Unknown address\",\n \"GEO_LOCATION_FAILED\": \"Unable to retrieve your current position. Please use the search button.\",\n \"ADDRESS_LOCATION_FAILED\": \"Unable to retrieve the address position\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Online services\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"Online services offer optional additional services, delegated to a third party.\",\n \"BTN_ADD\": \"Add a service\",\n \"BTN_EDIT\": \"Manage my services\",\n \"NO_SUBSCRIPTION\": \"No service defined\",\n \"SUBSCRIPTION_COUNT\": \"Services / Subscription\",\n \"EDIT\": {\n \"TITLE\": \"Online services\",\n \"HELP_TEXT\": \"Manage your subscriptions and other online services here\",\n \"PROVIDER\": \"Provider:\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Receive email notifications\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Are you sur you want to <b>delete this subscription</b>?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Error while loading online services\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Error while adding subscription\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Error during subscription update\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Error while deleting subscription\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Notification by email\",\n \"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.\",\n \"EMAIL_LABEL\" : \"Your email:\",\n \"EMAIL_HELP\": \"john@domain.com\",\n \"FREQUENCY_LABEL\": \"Frequency of notifications:\",\n \"FREQUENCY_DAILY\": \"Daily\",\n \"FREQUENCY_WEEKLY\": \"Weekly\",\n \"PROVIDER\": \"Service Provider:\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash: \",\n \"LOOKUP\": {\n \"TITLE\": \"Document search\",\n \"BTN_ACTIONS\": \"Actions\",\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS_DOTS\": \"Last documents :\",\n \"LAST_DOCUMENTS\": \"Last documents\",\n \"SHOW_QUERY\": \"Show query\",\n \"HIDE_QUERY\": \"Hide query\",\n \"HEADER_TIME\": \"Time/Hour\",\n \"HEADER_ISSUER\": \"Issuer\",\n \"HEADER_RECIPIENT\": \"Recipient\",\n \"READ\": \"Read\",\n \"DOCUMENT_TYPE\": \"Type\",\n \"DOCUMENT_TITLE\": \"Title\",\n \"BTN_REMOVE\": \"Delete this document\",\n \"BTN_COMPACT\": \"Compact\",\n \"HAS_REGISTERED\": \"create or edit his profile\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Actions\",\n \"REMOVE_ALL\": \"Delete these documents...\"\n },\n \"TYPE\": {\n \"USER_PROFILE\": \"Profile\",\n \"MARKET_RECORD\": \"Ad\",\n \"MARKET_COMMENT\": \"Comment on a ad\",\n \"PAGE_RECORD\": \"Page\",\n \"PAGE_COMMENT\": \"Comment on a page\",\n \"GROUP_RECORD\": \"Group\",\n \"GROUP_COMMENT\": \"Comment on a group\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Deleted document\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Are you sure you want to <b>delete this document</b>?\",\n \"REMOVE_ALL\": \"Are you sure you want to <b>delete these documents</b>?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Error searching documents\",\n \"REMOVE_FAILED\": \"Error deleting the document\",\n \"REMOVE_ALL_FAILED\": \"Error deleting documents\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"User profiles, notifications, private messages\",\n \"ENABLE_TOGGLE\": \"Enable extension?\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Enable messages?\",\n \"ENABLE_SETTINGS_TOGGLE\": \"Enable remote storage for settings?\",\n \"PEER\": \"Data peer address\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Data peer\",\n \"HELP\" : \"Set the address of the peer to use:\",\n \"PEER_HELP\": \"server.domain.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notifications\",\n \"HELP_TEXT\": \"Enable the types of notifications you want to receive:\",\n \"ENABLE_TX_SENT\": \"Notify the validation of <b>sent payments</b>?\",\n \"ENABLE_TX_RECEIVED\": \"Notify the validation of <b>received payments</b>?\",\n \"ENABLE_CERT_SENT\": \"Notify the validation of <b>sent certifications</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Notify the validation of <b>received certifications</b>?\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"New features\",\n \"ASK_ENABLE\": \"Some new features are available: <ul><li>&nbsp;&nbsp;<b><i class=\\\"icon ion-person\\\"></i> user profiles</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li>&nbsp;&nbsp;<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?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"A recipient is required for encryption.\"\n }\n },\n \"ES_PEER\": {\n \"NAME\": \"Name\",\n \"DOCUMENTS\": \"Documents\",\n \"SOFTWARE\": \"Software\",\n \"DOCUMENT_COUNT\": \"Number of documents\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} subscribers to email notification\"\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Your node ES API <b>{{params[0]}}</b> is UP\",\n \"NODE_BMA_DOWN\": \"Node <b>{{params[0]}}:{{params[1]}}</b> (used by your ES API) is <b>unreachable</b>.\",\n \"NODE_BMA_UP\": \"Node <b>{{params[0]}}:{{params[1]}}</b> is reachable again.\",\n \"MEMBER_JOIN\": \"You are now a <b>member</b> of currency <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"You are <b>not a member anymore</b> of currency <b>{{params[0]}}</b>!\",\n \"MEMBER_EXCLUDE\": \"You are <b>not more member</b> of the currency <b>{{params[0]}}</b>, for lack of renewal or lack of certifications.\",\n \"MEMBER_REVOKE\": \"Your account has been revoked. It will no longer be a member of the currency <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"Your membership to <b>{{params[0]}}</b> has been <b>renewed successfully</b>.\",\n \"TX_SENT\": \"Your payment to <span class=\\\"positive\\\" ><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> was executed.\",\n \"TX_SENT_MULTI\": \"Your payment to <b>{{params[1]}}</b> was executed.\",\n \"TX_RECEIVED\": \"You received a payment from <span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"You received a payment from <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Your <b>certification</b> to <span class=\\\"positive\\\" ><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> was executed.\",\n \"CERT_RECEIVED\": \"You have <b>received a certification</b> from <span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> like your profile\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> follows your activity\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> rated you ({{params[3]}} <i class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has requested moderation on your profile\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has commented on your referencing: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has modified his comment on your referencing: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has replied to your comment on the referencing: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has modified his answer to your comment, on the referencing: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has commented on the page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has modified his comment on the page: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> added a page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> updated the page: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>\"\n }\n },\n \"CONFIRM\": {\n \"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?\"\n },\n \"ERROR\": {\n \"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>.\",\n \"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.\"\n }\n}\n);\n\n$translateProvider.translations(\"eo-EO\", {\n \"COMMON\": {\n \"CATEGORY\": \"Kategorio\",\n \"CATEGORY_SELECT_HELP\": \"Elekti\",\n \"CATEGORIES\": \"Kategorioj\",\n \"CATEGORY_SEARCH_HELP\": \"Serĉado\",\n \"COMMENT_HELP\": \"Komento\",\n \"LAST_MODIFICATION_DATE\": \"Ĝisdatigita la\",\n \"BTN_LIKE\": \"Mi ŝatas\",\n \"BTN_FOLLOW\": \"Sekvi\",\n \"BTN_STOP_FOLLOW\": \"Ne plu sekvi\",\n \"LIKES_TEXT\": \"{{total}} persono{{total > 1 ? 'j' : ''}} ŝatis tiun ĉi paĝon\",\n \"DISLIKES_TEXT\": \"{{total}} persono{{total > 1 ? 'j' : ''}} ne ŝatis tiun ĉi paĝon\",\n \"VIEWS_TEXT\": \"{{total}} persono{{total > 1 ? 'j' : ''}} konsultis tiun ĉi paĝon\",\n \"FOLLOWS_TEXT\": \"{{total}} persono{{total > 1 ? 'j' : ''}} sekvas tiun ĉi paĝon\",\n \"ABUSES_TEXT\": \"{{total}} persono{{total > 1 ? 'j' : ''}} atentigis pri problemo\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Atentigi pri problemo aŭ misuzo...\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Nuligi mian atentigon\",\n \"SUBMIT_BY\": \"Submetita de\",\n \"GEO_DISTANCE_SEARCH\": \"Distanco por serĉado\",\n \"GEO_DISTANCE_OPTION\": \"{{value}} km\",\n \"BTN_PUBLISH\": \"Publikigi\",\n \"BTN_PICTURE_DELETE\": \"Forigi\",\n \"BTN_PICTURE_FAVORISE\": \"Precipa\",\n \"BTN_PICTURE_ROTATE\": \"Turni\",\n \"BTN_ADD_PICTURE\": \"Aldoni foton\",\n \"NOTIFICATION\": {\n \"TITLE\": \"Nova avizo | {{'COMMON.APP_NAME'|translate}}\",\n \"HAS_UNREAD\": \"Vi havas {{count}} avizo{{count>0?'j':''}}n ne legita{{count>0?'j':''}}n\"\n },\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Avizoj\",\n \"MARK_ALL_AS_READ\": \"Ĉion marki legita\",\n \"NO_RESULT\": \"Neniu avizo\",\n \"SHOW_ALL\": \"Vidi ĉion\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Malsukceso por ŝarĝi la avizojn\"\n },\n \"REPORT_ABUSE\": {\n \"TITLE\": \"Atentigi pri problemo\",\n \"SUB_TITLE\": \"Bonvolu klarigi rapide la problemon:\",\n \"REASON_HELP\": \"Mi klarigas la problemon...\",\n \"ASK_DELETE\": \"Peti la forigon?\",\n \"CONFIRM\": {\n \"SENT\": \"Atentigo sendita. Dankon!\"\n }\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Paĝoj\",\n \"USER_PROFILE\": \"Mia profilo\",\n \"MESSAGES\": \"Mesaĝoj\",\n \"NOTIFICATIONS\": \"Avizoj\",\n \"INVITATIONS\": \"Invitoj\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Konto por organizaĵo\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Se vi reprezentas entreprenon, asocion, ktp.<br/>Neniu universala dividendo estos kreita per tiu ĉi konto.\"\n },\n \"EVENT\": {\n \"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.\"\n },\n \"ERROR\": {\n \"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+.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Sugesti identecojn atestotajn...\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Peti membrojn atesti min...\",\n \"BTN_ASK_CERTIFICATION\": \"Peti atestaĵon\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Sugesti atestadojn\",\n \"HELP\": \"Selekti viajn sugestojn\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Peti atestaĵojn\",\n \"HELP\": \"Selekti la ricevontojn\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Kontoj\",\n \"DIVIDER_PAGE\": \"Paĝoj\",\n \"DIVIDER_GROUP\": \"Grupoj\"\n },\n \"VIEW\": {\n \"SENIORITY\": \"Delongeco ĉe {{'COMMON.APP_NAME'|translate}}\",\n \"STARS\": \"Fido-nivelo\",\n \"STAR_HIT_COUNT\": \"{{total}} noto{{total>1 ? 'j' : ''}}\",\n \"BTN_STAR_HELP\": \"Noti tiun ĉi profilon\",\n \"BTN_STARS_REMOVE\": \"Forigi mian noton\",\n \"BTN_REDO_STAR_HELP\": \"Aktualigi vian noton\",\n \"BTN_FOLLOW\": \"Sekvi la agojn de tiu ĉi profilo\",\n \"BTN_STOP_FOLLOW\": \"Ne plu sekvi tiun ĉi profilon\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Komentoj\",\n \"SHOW_MORE_COMMENTS\": \"Afiŝi la antaŭajn komentojn\",\n \"COMMENT_HELP\": \"Via komento, demando, ktp.\",\n \"COMMENT_HELP_REPLY_TO\": \"Via respondo...\",\n \"BTN_SEND\": \"Sendi\",\n \"POPOVER_SHARE_TITLE\": \"Mesaĝo #{{number}}\",\n \"REPLY\": \"Respondi\",\n \"REPLY_TO\": \"Respondo al:\",\n \"REPLY_TO_LINK\": \"Responde al \",\n \"REPLY_TO_DELETED_COMMENT\": \"Responde al forigita komento\",\n \"REPLY_COUNT\": \"{{replyCount}} respondoj\",\n \"DELETED_COMMENT\": \"Komento forigita\",\n \"MODIFIED_ON\": \"modifita la {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modifita poste)\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Eraro dum la konservo de la komento\",\n \"FAILED_REMOVE_COMMENT\": \"Eraro dum la forigo de la komento\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Resp: \",\n \"FORWARD_TITLE_PREFIX\": \"Tr: \",\n \"BTN_REPLY\": \"Respondi\",\n \"BTN_COMPOSE\": \"Nova mesaĝo\",\n \"BTN_WRITE\": \"Skribi\",\n \"NO_MESSAGE_INBOX\": \"Neniu mesaĝo ricevita\",\n \"NO_MESSAGE_OUTBOX\": \"Neniu mesaĝo sendita\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Mesaĝoj\",\n \"MESSAGE_RECEIVED\": \"Vi <b>ricevis mesaĝon</b><br/>de\"\n },\n \"LIST\": {\n \"INBOX\": \"Ricevujo\",\n \"OUTBOX\": \"Senditaj mesaĝoj\",\n \"LAST_INBOX\": \"Novaj mesaĝoj\",\n \"LAST_OUTBOX\": \"Senditaj mesaĝoj\",\n \"BTN_LAST_MESSAGES\": \"Freŝdataj mesaĝoj\",\n \"TITLE\": \"Mesaĝoj\",\n \"SEARCH_HELP\": \"Serĉado en la mesaĝoj\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Kromaĵoj\",\n \"DELETE_ALL\": \"Forigi ĉiujn mesaĝojn\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nova mesaĝo\",\n \"TITLE_REPLY\": \"Respondi\",\n \"SUB_TITLE\": \"Nova mesaĝo\",\n \"TO\": \"Al\",\n \"OBJECT\": \"Temo\",\n \"OBJECT_HELP\": \"Temo\",\n \"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.\",\n \"MESSAGE\": \"Mesaĝo\",\n \"MESSAGE_HELP\": \"Enhavo de la mesaĝo\",\n \"CONTENT_CONFIRMATION\": \"La enhavo de la mesaĝo estas malplena.<br/><br/>Ĉu vi volas tamen sendi la mesaĝon?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mesaĝo\",\n \"SENDER\": \"Sendita de\",\n \"RECIPIENT\": \"Sendita al\",\n \"NO_CONTENT\": \"Mesaĝo malplena\",\n \"DELETE\": \"Forigi la mesaĝon\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi mesaĝon</b>?<br/><br/>Tiu ago estas neinversigebla.\",\n \"REMOVE_ALL\" : \"Ĉu vi certas, ke vi volas <b>forigi ĉiujn mesaĝojn</b>?<br/><br/>Tiu ago estas neinversigebla.\",\n \"MARK_ALL_AS_READ\": \"Ĉu vi certas, ke vi volas <b>marki ĉiujn mesaĝojn legitaj</b>?\",\n \"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>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Mesaĝo forigita\",\n \"All_MESSAGE_REMOVED\": \"Ĉiuj mesaĝoj estis forigitaj\",\n \"MESSAGE_SENT\": \"Mesaĝo sendita\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Eraro dum la sendo de la mesaĝo.\",\n \"LOAD_MESSAGES_FAILED\": \"Eraro dum la ricevo de la mesaĝoj.\",\n \"LOAD_MESSAGE_FAILED\": \"Eraro dum la ricevo de la mesaĝo.\",\n \"MESSAGE_NOT_READABLE\": \"Legado de la mesaĝo neebla.\",\n \"USER_NOT_RECIPIENT\": \"Vi ne estas la adresato de tiu ĉi mesaĝo: malĉifrado neebla.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"La aŭtenteco de la mesaĝo estas dubinda aŭ ties enhavo estas difektita.\",\n \"REMOVE_MESSAGE_FAILED\": \"Malsukceso por forigi la mesaĝon\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Signaro tro longa ({{maxLength}} signoj maksimume).\",\n \"MARK_AS_READ_FAILED\": \"Neeblas marki la mesaĝon 'legita'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Eraro dum la ricevo de la mesaĝo-avizoj.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Eraro dum la forigo de ĉiuj mesaĝoj.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Eraro por marki la mesaĝojn legitaj.\",\n \"RECIPIENT_IS_MANDATORY\": \"La adresato estas deviga.\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Ĉefa agado\",\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"LOCATION_DIVIDER\": \"Adreso\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociaj retoj kaj retejo\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"BTN_SHOW_WOT\": \"Personoj\",\n \"BTN_SHOW_WOT_HELP\": \"Traserĉi personojn\",\n \"BTN_SHOW_PAGES\": \"Paĝoj\",\n \"BTN_SHOW_PAGES_HELP\": \"Traserĉi paĝojn\",\n \"BTN_NEW\": \"Krei paĝon\",\n \"MY_PAGES\": \"Miaj paĝoj\",\n \"NO_PAGE\": \"Neniu paĝo\",\n \"SEARCH\": {\n \"TITLE\": \"Paĝoj\",\n \"SEARCH_HELP\": \"Kio, Kiu: restoracio, Ĉe Marcelo, ...\",\n \"BTN_ADD\": \"Nova\",\n \"BTN_LAST_RECORDS\": \"Freŝdataj paĝoj\",\n \"BTN_ADVANCED_SEARCH\": \"Sperta serĉado\",\n \"BTN_OPTIONS\": \"Sperta serĉado\",\n \"TYPE\": \"Tipo de paĝo\",\n \"LOCATION_HELP\": \"Kie: Poŝto-kodo, Urbo\",\n \"RESULTS\": \"Rezultoj\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} rezulto{{count>0?'j':''}}, proksime de {{location}}\",\n \"RESULT_COUNT\": \"{{count}} rezulto{{count>0?'j':''}}\",\n \"LAST_RECORDS\": \"Freŝdataj paĝoj\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}, proksime de {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} paĝo{{count>0?'j':''}} freŝdata{{count>0?'j':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Spertaj kromaĵoj?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Adresaro\",\n \"CATEGORY\": \"Ĉefa agado:\",\n \"LOCATION\": \"Adreso:\",\n \"MENU_TITLE\": \"Kromaĵoj\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Ĉu vi certas, ke vi volas forigi tiun ĉi paĝon?<br/><br/>Tiu ago estas neinversigebla.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Tipoj\",\n \"SELECT_TYPE\": \"Tipo de paĝo:\",\n \"ENUM\": {\n \"SHOP\": \"Loka komerco\",\n \"COMPANY\": \"Entrepreno\",\n \"ASSOCIATION\": \"Asocio\",\n \"INSTITUTION\": \"Institucio\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Redaktado\",\n \"TITLE_NEW\": \"Nova paĝo\",\n \"RECORD_TYPE\":\"Tipo de paĝo\",\n \"RECORD_TITLE\": \"Nomo\",\n \"RECORD_TITLE_HELP\": \"Nomo\",\n \"RECORD_DESCRIPTION\": \"Priskribo\",\n \"RECORD_DESCRIPTION_HELP\": \"Priskribo de la agado\",\n \"RECORD_ADDRESS\": \"Strato\",\n \"RECORD_ADDRESS_HELP\": \"Strato, konstruaĵo...\",\n \"RECORD_CITY\": \"Urbo\",\n \"RECORD_CITY_HELP\": \"Urbo\",\n \"RECORD_SOCIAL_NETWORKS\": \"Sociaj retoj kaj retejo\",\n \"RECORD_PUBKEY\": \"Publika ŝlosilo\",\n \"RECORD_PUBKEY_HELP\": \"Publika ŝlosilo por ricevi la pagojn\"\n },\n \"WALLET\": {\n \"REGISTRY_DIVIDER\": \"Paĝoj\",\n \"REGISTRY_HELP\": \"La paĝoj referencigas agadojn akceptantajn la monon aŭ favorigantajn ĝin: komercoj, entreprenoj, asocioj, institucioj.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Eraro dum la ŝarĝo de la listo de la agadoj\",\n \"LOAD_RECORD_FAILED\": \"Eraro dum la ŝarĝo de la paĝo\",\n \"LOOKUP_RECORDS_FAILED\": \"Eraro dum la serĉado\",\n \"REMOVE_RECORD_FAILED\": \"Eraro dum la forigo de la paĝo\",\n \"SAVE_RECORD_FAILED\": \"Eraro dum la konservado\",\n \"RECORD_NOT_EXISTS\": \"Paĝo neekzistanta\",\n \"GEO_LOCATION_NOT_FOUND\": \"Urbo aŭ poŝto-kodo ne trovita\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Paĝo forigita\",\n \"RECORD_SAVED\": \"Paĝo konservita\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Profilo ğchange\",\n \"PROFILE_DIVIDER_HELP\": \"Temas pri kromaj datenoj, stokitaj ĉe la reto ğchange.\",\n \"NO_PROFILE_DEFINED\": \"Neniu profilo tajpita\",\n \"BTN_ADD\": \"Tajpi mian profilon\",\n \"BTN_EDIT\": \"Redakti mian profilon\",\n \"BTN_DELETE\": \"Forigi mian profilon\",\n \"BTN_REORDER\": \"Reordigi\",\n \"UID\": \"Pseŭdonimo\",\n \"TITLE\": \"Familia nomo, Persona nomo\",\n \"TITLE_HELP\": \"Familia nomo, Persona nomo\",\n \"DESCRIPTION\": \"Pri mi\",\n \"DESCRIPTION_HELP\": \"Pri mi...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Ĝeneralaj informoj\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociaj retoj, retejoj\",\n \"STAR\": \"Fido-nivelo\",\n \"TECHNICAL_DIVIDER\": \"Teknikaj informoj\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Profil-foto\",\n \"SELECT_FILE_HELP\": \"Bonvolu <b>elekti bildo-dosieron</b>, alklakante la ĉi-suban butonon:\",\n \"BTN_SELECT_FILE\": \"Elekti foton\",\n \"RESIZE_HELP\": \"<b>Rekadri la bildon</b>, laŭbezone. Pluigi klakon sur la bildo ebligas movi ĝin. Alklaku la zonon malsupre maldekstre por zomi.\",\n \"RESULT_HELP\": \"<b>Jen la rezulto</b> tiel videbla ĉe via profilo:\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"Ĉu vi certas, ke vi volas <b>forigi vian profilon ğchange?</b><br/><br/>Tiu ago estas neinversigebla.\"\n },\n \"ERROR\": {\n \"REMOVE_PROFILE_FAILED\": \"Malsukceso por forigi la profilon\",\n \"LOAD_PROFILE_FAILED\": \"Malsukceso por ŝarĝi la profilon de la uzanto\",\n \"SAVE_PROFILE_FAILED\": \"Eraro dum la konservado\",\n \"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>\",\n \"IMAGE_RESIZE_FAILED\": \"Eraro dum la reformatigo de la bildo\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Profilo forigita\",\n \"PROFILE_SAVED\": \"Profilo konservita\"\n },\n \"HELP\": {\n \"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}}\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Trovi mian adreson surmape\",\n \"USE_GEO_POINT\": \"Kontroli la adreson (konsilinda)?\",\n \"LOADING_LOCATION\": \"Serĉado de la adreso...\",\n \"LOCATION_DIVIDER\": \"Adreso\",\n \"ADDRESS\": \"Strato\",\n \"ADDRESS_HELP\": \"Strato, adres-aldonaĵo...\",\n \"CITY\": \"Urbo\",\n \"CITY_HELP\": \"Poŝto-kodo, Urbo, Lando\",\n \"DISTANCE\": \"Maksimuma distanco ĉirkaŭ la urbo\",\n \"DISTANCE_UNIT\": \"km\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"Poŝto-kodo, Urbo\",\n \"PROFILE_POSITION\": \"Loko de la profilo\",\n \"MODAL\": {\n \"TITLE\": \"Serĉado de la adreso\",\n \"SEARCH_HELP\": \"Urbo, Poŝto-kodo, Lando\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Alternativaj rezultoj por <b>{{address}}</b>:\",\n \"POSITION\": \"Lat/Lon: {{lat}}/{{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Deviga kampo (ĉar strato estas tajpita)\",\n \"REQUIRED_FOR_LOCATION\": \"Deviga kampo por aperi sur la mapo\",\n \"INVALID_FOR_LOCATION\": \"Adreso nekonata\",\n \"GEO_LOCATION_FAILED\": \"Neeblas ricevi vian lokiĝon. Bonvolu uzi la serĉo-butonon.\",\n \"ADDRESS_LOCATION_FAILED\": \"Neeblas ricevi la lokon per la adreso\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Retaj servoj\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"La retaj servoj proponas pliajn nedevigajn servojn, delegitajn al aliulo.\",\n \"BTN_ADD\": \"Aldoni servon\",\n \"BTN_EDIT\": \"Mastrumi miajn servojn\",\n \"NO_SUBSCRIPTION\": \"Neniu servo uzata\",\n \"SUBSCRIPTION_COUNT\": \"Servoj / Abonoj\",\n \"EDIT\": {\n \"TITLE\": \"Retaj servoj\",\n \"HELP_TEXT\": \"Mastrumu ĉi tie viajn abonojn kaj aliajn retajn servojn\",\n \"PROVIDER\": \"Provizanto:\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Ricevi la avizojn per retmesaĝo\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Ĉu vi certas, ke vi volas <b>forigi tiun abonon</b>?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Eraro dum la ŝarĝo de la retaj servoj\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Malsukceso por sendi la abonon\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Malsukceso por ĝisdatigi la abonon\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Eraro dum la forigo de la abono\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Avizo per retmesaĝo\",\n \"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.\",\n \"EMAIL_LABEL\" : \"Via retadreso:\",\n \"EMAIL_HELP\": \"johano.stelaro@esperanto.org\",\n \"FREQUENCY_LABEL\": \"Periodo de la avizoj:\",\n \"FREQUENCY_DAILY\": \"Ĉiutaga\",\n \"FREQUENCY_WEEKLY\": \"Ĉiusemajna\",\n \"PROVIDER\": \"Servo-provizanto:\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Haketo: \",\n \"LOOKUP\": {\n \"TITLE\": \"Serĉado de dokumentoj\",\n \"BTN_ACTIONS\": \"Agoj\",\n \"SEARCH_HELP\": \"Sendanto:AAA*, tempo:1508406169\",\n \"LAST_DOCUMENTS_DOTS\": \"Lastaj dokumentoj:\",\n \"LAST_DOCUMENTS\": \"Lastaj dokumentoj\",\n \"SHOW_QUERY\": \"Vidi la informpeton\",\n \"HIDE_QUERY\": \"Kaŝi la informpeton\",\n \"HEADER_TIME\": \"Dato/Horo\",\n \"HEADER_ISSUER\": \"Sendanto\",\n \"HEADER_RECIPIENT\": \"Ricevonto\",\n \"READ\": \"Legita\",\n \"DOCUMENT_TYPE\": \"Tipo\",\n \"DOCUMENT_TITLE\": \"Titolo\",\n \"BTN_REMOVE\": \"Forigi tiun ĉi dokumenton\",\n \"BTN_COMPACT\": \"Densigi\",\n \"HAS_REGISTERED\": \"kreis aŭ modifis sian profilon\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Agoj\",\n \"REMOVE_ALL\": \"Forigi tiujn ĉi dokumentojn...\"\n },\n \"TYPE\": {\n \"USER_PROFILE\": \"Profilo\",\n \"MARKET_RECORD\": \"Anonco\",\n \"MARKET_COMMENT\": \"Komento ĉe anonco\",\n \"PAGE_RECORD\": \"Paĝo\",\n \"PAGE_COMMENT\": \"Komento ĉe paĝo\",\n \"GROUP_RECORD\": \"Grupo\",\n \"GROUP_COMMENT\": \"Komento ĉe grupo\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Dokumento forigita\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Ĉu vi certas, ke vi volas <b>forigi tiun ĉi dokumenton</b>?\",\n \"REMOVE_ALL\": \"Ĉu vi certas, ke vi volas <b>forigi tiujn ĉi dokumentojn</b>?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Eraro dum la serĉado de dokumentoj\",\n \"REMOVE_FAILED\": \"Eraro dum la forigo de la dokumento\",\n \"REMOVE_ALL_FAILED\": \"Eraro dum la forigo de la dokumentoj\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Spertaj parametroj\",\n \"PLUGIN_NAME_HELP\": \"Filtrado de avizoj, ktp.\",\n \"ENABLE_TOGGLE\": \"Aktivigi la krom-programon?\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Aktivigi la privatajn mesaĝojn?\",\n \"ENABLE_SETTINGS_TOGGLE\": \"Aktivigi la foran stokadon de la parametroj?\",\n \"PEER\": \"Adreso de la daten-nodo\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Daten-nodo\",\n \"HELP\" : \"Tajpu la adreson de la nodo, kiun vi volas uzi:\",\n \"PEER_HELP\": \"servo.domajno.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Avizoj\",\n \"HELP_TEXT\": \"Aktivigu la avizo-tipojn, kiujn vi deziras ricevi:\",\n \"ENABLE_TX_SENT\": \"Avizi pri la <b>senditaj pagoj</b>?\",\n \"ENABLE_TX_RECEIVED\": \"Avizi pri la <b>ricevitaj pagoj</b>?\",\n \"ENABLE_CERT_SENT\": \"Avizi pri la <b>senditaj atestaĵoj</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Avizi pri <b>la ricevitaj atestaĵoj</b>?\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Kromaj funkcioj\",\n \"ASK_ENABLE\": \"La krom-programo Cesium+ estas <b>malaktivigita</b> ĉe viaj parametroj, kio senaktivigas la funkciojn: <ul><li>&nbsp;&nbsp;<b><i class=\\\"icon ion-person\\\"></i> Profiloj Cesium+</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-android-notifications\\\"></i> Avizoj</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-email\\\"></i> Privataj mesaĝoj</b>.<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-location\\\"></i> Mapoj, ktp.</b>.</ul><br/><b>Ĉu vi deziras reaktivigi</b> la krom-programon?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"Adresito estas deviga por la ĉifrado.\"\n }\n },\n \"ES_PEER\": {\n \"NAME\": \"Nomo\",\n \"DOCUMENTS\": \"Dokumentoj\",\n \"SOFTWARE\": \"Programo\",\n \"DOCUMENT_COUNT\": \"Nombro de dokumentoj\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} abonantoj pri avizoj per retmesaĝoj\"\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Via nodo ES API <b>{{params[0]}}</b> ekis\",\n \"NODE_BMA_DOWN\": \"La nodo <b>{{params[0]}}:{{params[1]}}</b> (uzata de via nodo ES API) estas <b>neatingebla</b>.\",\n \"NODE_BMA_UP\": \"La nodo <b>{{params[0]}}:{{params[1]}}</b> estas denove alirebla.\",\n \"MEMBER_JOIN\": \"Vi estas nun <b>membro</b> de la mono <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"Vi <b>ne plu estas membro</b> de la mono <b>{{params[0]}}</b>!\",\n \"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.\",\n \"MEMBER_REVOKE\": \"La nuligo de via konto efektiviĝis. Ĝi ne plu povos esti membro-konto de la mono <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"La revalidiĝo de via aliĝo al la mono <b>{{params[0]}}</b> estis <b>ricevita</b>.\",\n \"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>&thinsp;{{name||uid||params[1]}}</span> efektiviĝis.\",\n \"TX_SENT_MULTI\": \"Via <b>pago</b> al <b>{{params[1]}}</b> efektiviĝis.\",\n \"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>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Vi <b>ricevis pagon</b> de <b>{{params[1]}}</b>.\",\n \"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>&thinsp;{{name||uid||params[1]}}</span> efektiviĝis.\",\n \"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>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> ŝatas vian profilon\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> sekvas viajn agojn\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> notis vin ({{params[3]}} <b class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> atentigis pri profilo foriginda: <b>{{params[2]}}</b>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> atentigis pri via profilo\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> komentis vian paĝon: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> modifis sian komenton ĉe via paĝo: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> respondis al via komento ĉe la paĝo: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> modifis sian respondon al via komento ĉe la paĝo: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> komentis la paĝon: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> modifis sian komenton ĉe la paĝo: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> aldonis la paĝon: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> modifis la paĝon: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> atentigis pri via paĝo: <b>{{params[2]}}</b>\"\n }\n },\n \"CONFIRM\": {\n \"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> ?\"\n },\n \"ERROR\": {\n \"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>.\",\n \"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.\"\n }\n}\n);\n\n$translateProvider.translations(\"es-ES\", {\n \"COMMON\": {\n \"ABUSES_TEXT\": \"{{total}} {{total > 1 ? 'people' : 'person'}} reported a problem on this page\",\n \"BTN_FOLLOW\": \"Seguir\",\n \"BTN_LIKE\": \"Me gusta\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Cancelar mi reporte o problema\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Reportar un problema o abuso...\",\n \"BTN_STOP_FOLLOW\": \"Dejar de seguir\",\n \"COMMENT_HELP\": \"Comentarios\",\n \"DISLIKES_TEXT\": \"A {{total}} {{total > 1 ? 'personas no les' : 'persona no le'}} gusta esta página\",\n \"LIKES_TEXT\": \"A {{total}} {{total > 1 ? 'personas les' : 'persona le'}} gusta esta página\",\n \"FOLLOWS_TEXT\": \"{{total}} {{total > 1 ? 'personas siguen' : 'persona sigue'}} esta página\",\n \"VIEWS_TEXT\": \"{{total}} 'personas vieron' : 'persona vió'}} esta página\",\n \"GEO_DISTANCE_OPTION\": \"{{value}} km\",\n \"GEO_DISTANCE_SEARCH\": \"Buscar por proximidad\",\n \"NOTIFICATION\": {\n \"HAS_UNREAD\": \"Tiene {{count}} notificaci{{count>0?'ón':'ones'}} no leída{{count>0?'s':''}}\",\n \"TITLE\": \"Nueva notificación | {{'COMMON.APP_NAME'|translate}}\"\n },\n \"REPORT_ABUSE\": {\n \"ASK_DELETE\": \"¿Solicitar eliminación?\",\n \"CONFIRM\": {\n \"SENT\": \"Solicitud enviada. ¡Gracias!\"\n },\n \"REASON_HELP\": \"Yo explico el problema...\",\n \"SUB_TITLE\": \"Por favor explique brevemente el problema:\",\n \"TITLE\": \"Reportar un problema\"\n },\n\n \"CATEGORY\": \"Categoría\",\n \"CATEGORIES\": \"Categorías\",\n \"CATEGORY_SEARCH_HELP\": \"Búsqueda\",\n \"CATEGORY_SELECT_HELP\": \"Seleccionar\",\n \"LAST_MODIFICATION_DATE\": \"Actualización el\",\n \"SUBMIT_BY\": \"Sometido por\",\n \"BTN_PUBLISH\": \"Publicar\",\n \"BTN_PICTURE_DELETE\": \"Suprimir\",\n \"BTN_PICTURE_FAVORISE\": \"Principal\",\n \"BTN_PICTURE_ROTATE\": \"Girar\",\n \"BTN_ADD_PICTURE\": \"Añadir una foto\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notificaciones\",\n \"MARK_ALL_AS_READ\": \"Marcar todo como leído\",\n \"NO_RESULT\": \"Ningúna notificación\",\n \"SHOW_ALL\": \"Ver todo\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Fracaso en la carga de las notificaciones\"\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Páginas\",\n \"USER_PROFILE\": \"Mi perfil\",\n \"MESSAGES\": \"Mensajes\",\n \"NOTIFICATIONS\": \"Notificaciones\",\n \"INVITATIONS\": \"Invitaciones\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Cuenta para una organización\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Si representa una empresa, una asociación, etc.<br/>Ningún dividendo universal será creído por esta cuenta.\"\n },\n \"EVENT\": {\n \"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.\"\n },\n \"ERROR\": {\n \"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.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Sugerir identidades a certificar…\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Pedir a miembros que le certifiquen…\",\n \"BTN_ASK_CERTIFICATION\": \"Pedir una certificación\",\n \"VIEW\": {\n \"BTN_FOLLOW\": \"Seguir la actividad de este perfil\",\n \"BTN_REDO_STAR_HELP\": \"Actualizar su puntuación\",\n \"BTN_STAR_HELP\": \"Puntuar este perfil\",\n \"BTN_STARS_REMOVE\": \"Suprimir mi puntuación\",\n \"BTN_STOP_FOLLOW\": \"Dejar de seguir este perfil\",\n \"SENIORITY\": \"Antigüedad en {{'COMMON.APP_NAME'|translate}}\",\n \"STAR_HIT_COUNT\": \"{{total}} puntuaci{{total>1 ? 'ones' : 'ón'}}\",\n \"STARS\": \"Nivel de confianza\"\n },\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Sugerir certificaciones\",\n \"HELP\": \"Selectionar sus sugerencias\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Solicitar certificaciones\",\n \"HELP\": \"Selectionar los destinatarios\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Cuentas\",\n \"DIVIDER_PAGE\": \"Páginas\",\n \"DIVIDER_GROUP\": \"Grupos\"\n },\n \"CONFIRM\": {\n \"SUGGEST_CERTIFICATIONS\": \"¿Desea <b>enviar estas sugerencias de certificatión</b> ?\",\n \"ASK_CERTIFICATION\": \"¿Desea <b>enviar una solicitud de certificación</b> ?\",\n \"ASK_CERTIFICATIONS\": \"¿Desea <b>enviar una solicitud de certificación</b> a estas personas ?\"\n }\n },\n \"INVITATION\": {\n \"TITLE\": \"Invitaciones\",\n \"NO_RESULT\": \"Ningúna invitación en espera\",\n \"BTN_DELETE_ALL\": \"Suprimir todas las invitaciones\",\n \"BTN_DELETE\": \"Suprimir la invitación\",\n \"BTN_NEW_INVITATION\": \"Nueva invitación\",\n \"ASK_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> solicita su certificación\",\n \"SUGGESTION_CERTIFICATION\": \"<a href=\\\"#/app/wot/{{::pubkey}}/{{::uid}}\\\">{{::name||uid}}</a> él es sugerido por certificación\",\n \"SUGGESTED_BY\": \"Sugerencia mandada por <a class=\\\"positive\\\" href=\\\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\\\">{{::issuer.name||issuer.uid}}</a>\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Invitaciones\"\n },\n \"LIST\": {\n \"TITLE\": \"Invitaciones\"\n },\n \"NEW\": {\n \"TITLE\": \"Nueva invitación\",\n \"RECIPIENTS\": \"A\",\n \"RECIPIENTS_HELP\": \"Destinatarios de la invitación\",\n \"RECIPIENTS_MODAL_TITLE\": \"Destinatarios\",\n \"RECIPIENTS_MODAL_HELP\": \"Por favor, elige los destinatarios :\",\n \"SUGGESTION_IDENTITIES\": \"Sugerencia de certificación\",\n \"SUGGESTION_IDENTITIES_HELP\": \"Certificaciones a sugerir\",\n \"SUGGESTION_IDENTITIES_MODAL_TITLE\": \"Sugerencias\",\n \"SUGGESTION_IDENTITIES_MODAL_HELP\": \"Por favor, elige sus sugerencias :\"\n },\n \"CONFIRM\": {\n \"DELETE_ALL_CONFIRMATION\": \"La supresión de las invitaciones es una <b>operación ireversible</b>.<br/><br/>¿ Desea continuar ?\",\n \"SEND_INVITATIONS_TO_CERTIFY\": \"¿ Desea <b>mandar esta invitación a certificar</b> ?\"\n },\n \"INFO\": {\n \"INVITATION_SENT\": \"Invitación mandada\"\n },\n \"ERROR\": {\n \"LOAD_INVITATIONS_FAILED\": \"Fracaso en la carga de las invitaciones\",\n \"REMOVE_INVITATION_FAILED\": \"Fracaso durante la supresión de la invitación\",\n \"REMOVE_ALL_INVITATIONS_FAILED\": \"Fracaso durante la supresión de las invitaciones\",\n \"SEND_INVITATION_FAILED\": \"Fracaso durante el envío de la invitación\",\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>\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Comentarios\",\n \"SHOW_MORE_COMMENTS\": \"Visualizar los comentarios anteriores\",\n \"COMMENT_HELP\": \"Su comentario, preguntas, etc.\",\n \"COMMENT_HELP_REPLY_TO\": \"Su repuesta…\",\n \"MODIFIED_ON\": \"modificado el {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modificado entonces)\",\n \"BTN_SEND\": \"Mandar\",\n \"POPOVER_SHARE_TITLE\": \"Mensaje #{{number}}\",\n \"REPLY\": \"Responder\",\n \"REPLY_TO\": \"Repuesta a :\",\n \"REPLY_TO_LINK\": \"En repuesta a \",\n \"REPLY_TO_DELETED_COMMENT\": \"En repuesta a un comentario suprimido\",\n \"REPLY_COUNT\": \"{{replyCount}} repuestas\",\n \"DELETED_COMMENT\": \"Comentario suprimido\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Fracaso durante el respaldo del comentario\",\n \"FAILED_REMOVE_COMMENT\": \"Fracaso durante la supresión del comentario\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Rep: \",\n \"FORWARD_TITLE_PREFIX\": \"Tr: \",\n \"BTN_REPLY\": \"Responder\",\n \"BTN_COMPOSE\": \"Nuevo mensaje\",\n \"BTN_WRITE\": \"Escribir\",\n \"NO_MESSAGE_INBOX\": \"Ningun mensaje recibido\",\n \"NO_MESSAGE_OUTBOX\": \"Ningun mensaje mandado\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Mensajes\",\n \"MESSAGE_RECEIVED\": \"Ha <b>recibido un mensaje</b><br/>de\"\n },\n \"LIST\": {\n \"INBOX\": \"Bandeja de entrada\",\n \"OUTBOX\": \"Mensajes enviados\",\n \"LAST_INBOX\": \"Nuevos mensajes\",\n \"LAST_OUTBOX\": \"Mensajes enviados\",\n \"BTN_LAST_MESSAGES\": \"Mensajes recientes\",\n \"TITLE\": \"Mensajes\",\n \"SEARCH_HELP\": \"Buscar en mensajes\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Opciones\",\n \"DELETE_ALL\": \"Suprimir todos los mensajes\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nuevo mensaje\",\n \"TITLE_REPLY\": \"Responder\",\n \"SUB_TITLE\": \"Nuevo mensaje\",\n \"TO\": \"A\",\n \"OBJECT\": \"Objeto\",\n \"OBJECT_HELP\": \"Objeto\",\n \"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.\",\n \"MESSAGE\": \"Mensaje\",\n \"MESSAGE_HELP\": \"Contenido del mensaje\",\n \"CONTENT_CONFIRMATION\": \"El contenido del mensaje está vacío.<br/><br/>Sin embargo, ¿ quiere mandar el mensaje ?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mensaje\",\n \"SENDER\": \"Enviado por\",\n \"RECIPIENT\": \"Enviado a\",\n \"NO_CONTENT\": \"Mensaje vacío\",\n \"DELETE\": \"Eliminar el mensaje\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"¿Desea <b>suprimir este mensaje</b> ?<br/><br/>Esta operación es ireversible.\",\n \"REMOVE_ALL\" : \"¿Desea <b>suprimir todos los mensajes</b> ?<br/><br/>Esta operación es ireversible.\",\n \"MARK_ALL_AS_READ\": \"¿Desea <b>marcar todos los mensajes como leído</b> ?\",\n \"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 ?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Mensaje suprimido\",\n \"All_MESSAGE_REMOVED\": \"Todos los mensajes fueron suprimido\",\n \"MESSAGE_SENT\": \"Mensaje mandado\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Fracaso durante el envío del mensaje.\",\n \"LOAD_MESSAGES_FAILED\": \"Fracaso durante la recuperación de los mensajes.\",\n \"LOAD_MESSAGE_FAILED\": \"Fracaso durante la recuperación del mensaje.\",\n \"MESSAGE_NOT_READABLE\": \"Lectura del mensaje imposible.\",\n \"USER_NOT_RECIPIENT\": \"No esta el destinatario de este mensaje : deciframiento imposible.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"La autenticidad del mensaje es dudosa o su contenido es corrupto.\",\n \"REMOVE_MESSAGE_FAILED\": \"Fracaso en la supresión del mensaje\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Valor demasiado largo ({{maxLength}} carácteres max).\",\n \"MARK_AS_READ_FAILED\": \"Imposible marcar el mensaje como 'leído'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Fracaso durante la recuperación de las notificaciones de mensajes.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Fracaso durante la supresión de todos los mensajes.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Fracaso durante el marcaje de los mensajes como leído.\",\n \"RECIPIENT_IS_MANDATORY\": \"El destinatario es obligatorio.\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Actividad principal\",\n \"GENERAL_DIVIDER\": \"Informaciones generales\",\n \"LOCATION_DIVIDER\": \"Dirección\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Redes sociales y sitio web\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"BTN_SHOW_WOT\": \"Personas\",\n \"BTN_SHOW_WOT_HELP\": \"Buscar personas\",\n \"BTN_SHOW_PAGES\": \"Páginas\",\n \"BTN_SHOW_PAGES_HELP\": \"Búsqueda de páginas\",\n \"BTN_NEW\": \"Crear una página\",\n \"MY_PAGES\": \"Mis páginas\",\n \"NO_PAGE\": \"Sin páginas\",\n \"SEARCH\": {\n \"TITLE\": \"Páginas\",\n \"SEARCH_HELP\": \"Qué, Quién, ej: peluquería, restaurante Sol.\",\n \"BTN_ADD\": \"Nuevo\",\n \"BTN_LAST_RECORDS\": \"Páginas recientes\",\n \"BTN_ADVANCED_SEARCH\": \"búsqueda avanzada\",\n \"BTN_OPTIONS\": \"Búsqueda avanzada\",\n \"TYPE\": \"Tipo de página\",\n \"LOCATION_HELP\": \"Ciudad\",\n \"RESULTS\": \"Resultados\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} Resultado{{count>0?'s':''}}, cerca de {{location}}\",\n \"RESULT_COUNT\": \"{{count}} resultado{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Páginas recientes\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}, cerca de {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Opciones avanzadas?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Anuario\",\n \"CATEGORY\": \"Actividad principal :\",\n \"LOCATION\": \"Dirección :\",\n \"MENU_TITLE\": \"Opciones\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"¿Desea suprimir esta página ?<br/><br/>Esta operación es ireversible.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nueva página\",\n \"SELECT_TYPE\": \"Tipo de página :\",\n \"ENUM\": {\n \"SHOP\": \"Comercio local\",\n \"COMPANY\": \"Empresa\",\n \"ASSOCIATION\": \"Asociación\",\n \"INSTITUTION\": \"Institución\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Edición\",\n \"TITLE_NEW\": \"Nueva página\",\n \"RECORD_TYPE\":\"Tipo de página\",\n \"RECORD_TITLE\": \"Nombre\",\n \"RECORD_TITLE_HELP\": \"Nombre\",\n \"RECORD_DESCRIPTION\": \"Descripción\",\n \"RECORD_DESCRIPTION_HELP\": \"Descripción de la actividad\",\n \"RECORD_ADDRESS\": \"Calle\",\n \"RECORD_ADDRESS_HELP\": \"Calle, edificio…\",\n \"RECORD_CITY\": \"Ciudad\",\n \"RECORD_CITY_HELP\": \"Ciudad\",\n \"RECORD_SOCIAL_NETWORKS\": \"Redes sociales y sitio web\",\n \"RECORD_PUBKEY\": \"Llave pública\",\n \"RECORD_PUBKEY_HELP\": \"Llave pública para recibir pagos\"\n },\n \"WALLET\": {\n \"REGISTRY_DIVIDER\": \"Páginas\",\n \"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>.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Fracaso en la carga de la lista de actividades\",\n \"LOAD_RECORD_FAILED\": \"Fracaso durante la carga de la página\",\n \"LOOKUP_RECORDS_FAILED\": \"Fracaso durante la ejecución de la búsqueda.\",\n \"REMOVE_RECORD_FAILED\": \"Fracaso en la supresión de la página\",\n \"SAVE_RECORD_FAILED\": \"Fracaso durante el respaldo\",\n \"RECORD_NOT_EXISTS\": \"Página inexistente\",\n \"GEO_LOCATION_NOT_FOUND\": \"Ciudad o código postal no encontrado\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Página suprimida\",\n \"RECORD_SAVED\": \"Página guardada\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Perfil Cesium+\",\n \"PROFILE_DIVIDER_HELP\": \"Estos son datos auxiliares, almacenados fuera de la red monetaria\",\n \"NO_PROFILE_DEFINED\": \"Ningún perfil Cesium+\",\n \"BTN_ADD\": \"Ingresar mi perfil\",\n \"BTN_EDIT\": \"Editar mi perfil\",\n \"BTN_DELETE\": \"Eliminar mi perfil\",\n \"BTN_REORDER\": \"Reordenar\",\n \"UID\": \"Seudónimo\",\n \"TITLE\": \"Nombre, Apellidos\",\n \"TITLE_HELP\": \"Nombre, Apellidos\",\n \"DESCRIPTION\": \"Sobre mí\",\n \"DESCRIPTION_HELP\": \"Escriba algo sobre usted…\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Informaciones generales\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Redes sociales, sitios web\",\n \"TECHNICAL_DIVIDER\": \"Informaciones técnicas\",\n \"STAR\": \"Nivel de confianza\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Foto de perfil\",\n \"SELECT_FILE_HELP\": \"Por favor, <b>elija una imagen</b>, haciendo clic sobre el cuadro de abajo:\",\n \"BTN_SELECT_FILE\": \"Eligir una imagen\",\n \"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.\",\n \"RESULT_HELP\": \"<b>Aquí está el resultado</b> tal como se verá sobre su perfil :\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"¿Desea <b>eliminar su perfil Cesium+?</b><br/><br/>Esta operación es irreversible.\"\n },\n \"ERROR\": {\n \"REMOVE_PROFILE_FAILED\": \"Error de eliminación de perfil\",\n \"LOAD_PROFILE_FAILED\": \"Fracaso en la carga del perfil usuario.\",\n \"SAVE_PROFILE_FAILED\": \"Fracaso durante el respaldo\",\n \"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>\",\n \"IMAGE_RESIZE_FAILED\": \"Falló el redimensionado de la imagen\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Perfil eliminado\",\n \"PROFILE_SAVED\": \"Perfil guardado\"\n },\n \"HELP\": {\n \"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}}\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Actualizar desde la dirección\",\n \"USE_GEO_POINT\": \"Comprobar la dirección (recomendado)\",\n \"LOADING_LOCATION\": \"Encontrar la dirección…\",\n \"LOCATION_DIVIDER\": \"Dirección\",\n \"ADDRESS\": \"Calle\",\n \"ADDRESS_HELP\": \"Calle, número, etc…\",\n \"CITY\": \"Ciudad\",\n \"CITY_HELP\": \"Ciudad, País\",\n \"DISTANCE\": \"Distancia máxima alrededor de la ciudad\",\n \"DISTANCE_UNIT\": \"km\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"Ciudad, País\",\n \"PROFILE_POSITION\": \"Posición del perfil\",\n \"MODAL\": {\n \"TITLE\": \"Búsqueda de dirección\",\n \"SEARCH_HELP\": \"Ciudad, País\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Resultados alternativos para <b>{{address}}</b> :\",\n \"POSITION\": \"Latitud/Longitud : {{lat}} / {{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Requerido si una calle ha sido llenada\",\n \"REQUIRED_FOR_LOCATION\": \"Campo obligatorio para aparecer en el mapa\",\n \"INVALID_FOR_LOCATION\": \"Dirección desconocida\",\n \"GEO_LOCATION_FAILED\": \"No se puede recuperar su ubicación Por favor usa el botón de búsqueda.\",\n \"ADDRESS_LOCATION_FAILED\": \"No se puede recuperar la posición de la dirección.\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Servicios en línea\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"Los servicios en línea ofrecen servicios adicionales, proporcionados por un tercero.\",\n \"BTN_ADD\": \"Agregar un servicio\",\n \"BTN_EDIT\": \"Administrar mis servicios\",\n \"NO_SUBSCRIPTION\": \"Ningún servicio definido\",\n \"SUBSCRIPTION_COUNT\": \"Servicios / Suscripción\",\n \"EDIT\": {\n \"TITLE\": \"Servicios en línea\",\n \"HELP_TEXT\": \"Gestione sus suscripciones y otros servicios en línea aquí\",\n \"PROVIDER\": \"Proveedor:\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Recibir notificaciones por correo electrónico\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"¿ Deseas <b>eliminar</b> esta suscripción ?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Error al cargar servicios en línea\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Error al agregar suscripción\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Error durante la actualización de la suscripción\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Error al eliminar la suscripción\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\" : \"Notificación por correo electrónico\",\n \"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.\",\n \"EMAIL_LABEL\" : \"Su correo electrónico :\",\n \"EMAIL_HELP\": \"maria@dominio.com\",\n \"FREQUENCY_LABEL\": \"Frecuencia de las notificaciones :\",\n \"FREQUENCY_DAILY\": \"Diaria\",\n \"FREQUENCY_WEEKLY\": \"Semanal\",\n \"PROVIDER\": \"Proveedor de servicio:\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash: \",\n \"LOOKUP\": {\n \"TITLE\": \"Búsqueda de documentos\",\n \"BTN_ACTIONS\": \"Acciones\",\n \"BTN_COMPACT\": \"Compactar\",\n \"DOCUMENT_TITLE\": \"Título\",\n \"DOCUMENT_TYPE\": \"Tipo\",\n \"HAS_REGISTERED\": \"ha creado o modificado su perfil\",\n\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS\": \"Últimos documentos\",\n \"LAST_DOCUMENTS_DOTS\": \"Últimos documentos :\",\n \"SHOW_QUERY\": \"Ver la búsqueda\",\n \"HIDE_QUERY\": \"Esconder la búsqueda\",\n \"HEADER_TIME\": \"Fecha/Hora\",\n \"HEADER_ISSUER\": \"Emisor\",\n \"HEADER_RECIPIENT\": \"Destinatario\",\n \"READ\": \"Leído\",\n \"BTN_REMOVE\": \"Sumprimer este documento\",\n \"TYPE\": {\n \"GROUP_COMMENT\": \"Comentario en un grupo\",\n \"GROUP_RECORD\": \"Grupo\",\n \"MARKET_COMMENT\": \"Comentario en un anuncio\",\n \"MARKET_RECORD\": \"Anuncio\",\n \"PAGE_COMMENT\": \"Comentario en una página\",\n \"PAGE_RECORD\": \"Página\",\n \"USER_PROFILE\": \"Perfil\"\n },\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Acciones\",\n \"REMOVE_ALL\": \"Suprimir estos documentos...\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Documento suprimido\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"¿ Desea <b>suprimir este documento</b> ?\",\n \"REMOVE_ALL\": \"¿ Desea <b>suprimer estos documentos</b> ?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Error al buscar documentos\",\n \"REMOVE_FAILED\": \"Error al suprimir el documento\",\n \"REMOVE_ALL_FAILED\": \"Error al suprimir los documentos\"\n }\n },\n \"ES_PEER\": {\n \"DOCUMENT_COUNT\": \"Número de documentos\",\n \"DOCUMENTS\": \"Documentos\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} suscritas/os a notificaciones por correo\",\n \"NAME\": \"Nombre\",\n \"SOFTWARE\": \"Software\"\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"PLUGIN_NAME_HELP\": \"Perfiles, notificaciones, mensajes privados\",\n \"ENABLE_TOGGLE\": \"Activar la extensión\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Activar los mensajes privados\",\n \"ENABLE_SETTINGS_TOGGLE\": \"Activar el almacenamiento a distancia de los ajustes\",\n \"PEER\": \"Dirección del nodo de datos\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Nodo de datos\",\n \"HELP\" : \"Ingrese la dirección del nodo que quiere utilizar:\",\n \"PEER_HELP\": \"servidor.dominio.com:puerto\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notificaciones\",\n \"HELP_TEXT\": \"Active los tipos de notificaciones que desea recibir:\",\n \"ENABLE_TX_SENT\": \"Notificar la validación de los <b>pagos emitidos</b>\",\n \"ENABLE_TX_RECEIVED\": \"Notificar la validación de los <b>pagos recibidos</b>\",\n \"ENABLE_CERT_SENT\": \"Notificar la validación de las <b>certificaciones emitidas</b>\",\n \"ENABLE_CERT_RECEIVED\": \"Notificar la validación de las <b>certificaciones recibidas</b>\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Otras funcionalidades\",\n \"ASK_ENABLE\": \"La extensión de Cesium+ está deshabilitada en sus ajutes, desactivando ciertas funcionalidades: <ul><li>&nbsp;&nbsp;<b><i class=\\\"icon ion-person\\\"></i> Perfiles de usuario/a</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-android-notifications\\\"></i> Notificaciones</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-email\\\"></i> Mensajes privados</b>.</ul><br/><br/>¿<b>Desea re-activar</b> la extensión?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"Un destinatario es obligatorio para el cifrado.\"\n }\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Su nodo ES API <b>{{params[0]}}</b> ha comenzado\",\n \"NODE_BMA_DOWN\": \"El nodo <b>{{params[0]}}:{{params[1]}}</b> (utilizado por su nodo ES API) <b>no es localizable</b>.\",\n \"NODE_BMA_UP\": \"El nodo <b>{{params[0]}}:{{params[1]}}</b> es de nuevo accesible.\",\n \"MEMBER_JOIN\": \"Ahora es <b>miembro</b> de la moneda <b>{{params[0]}}</b> !\",\n \"MEMBER_LEAVE\": \"No es <b>miembro</b> de la moneda <b>{{params[0]}}</b>!\",\n \"MEMBER_EXCLUDE\": \"Usted ya no es miembro de la moneda <b>{{params[0]}}</b>, por falta de renovación o certificaciones.\",\n \"MEMBER_REVOKE\": \"Su membresía ha sido revocada. Ya no es miembro de la moneda <b>{{params[0]}}</b>.\",\n \"MEMBER_ACTIVE\": \"Su membresía a <b>{{params[0]}}</b> ha sido <b>renovada con éxito</b>.\",\n \"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>&thinsp;{{name||uid||params[1]}}</span> fue efectuado.\",\n \"TX_SENT_MULTI\": \"Su <b>pago</b> a <b>{{params[1]}}</b> fue efectuado.\",\n \"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>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Ha <b>recibido un pago</b> de <b>{{params[1]}}</b>.\",\n \"PAGE\": {\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha reportardo su anuncio : <b>{{params[2]}}</b>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha reportado un anuncio para moderar : <b>{{params[2]}}</b>\",\n \"FOLLOW_CLOSE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha cerrado el anuncio : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha añadido el anuncio : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha comentado el anuncio : <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> sigue su anuncio : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha modificado el anuncio : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha modificado su comentario en el anuncio : <b>{{params[2]}}</b>\",\n \"LIKE_RECEIVED\": \"A <span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> le ha gustado su anuncio : <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha comentado su anuncio : <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha modificado su comentario sobre su anuncio : <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha contestado a su comentario sobre el anuncio : <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha modificado la repuesta a su comentario sobre el anuncio : <b>{{params[2]}}</b>\"\n },\n \"USER\": {\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> ha reportado su perfil\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> ha reportado un perfil a eliminar: <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> sigue su actividad\",\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> le gusta su perfil\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> os ha puntuado ({{params[3]}} <b class=\\\"ion-star\\\">)\"\n },\n \"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>&thinsp;{{name||uid||params[1]}}</span> fue efectuada.\",\n \"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>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"REGISTRY\": {\n \"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>&thinsp;{{name||uid||params[1]}}</span> ha comentado su referencia : <b>{{params[2]}}</b>\",\n \"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>&thinsp;{{name||uid||params[1]}}</span> ha modificado su comentario sobre su referencia : <b>{{params[2]}}</b>\",\n \"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>&thinsp;{{name||uid||params[1]}}</span> ha contestado a su comentario sobre la referencia : <b>{{params[2]}}</b>\",\n \"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>&thinsp;{{name||uid||params[1]}}</span> ha modificado la repuesta a su comentario sobre la referencia : <b>{{params[2]}}</b>\"\n }\n },\n \"CONFIRM\": {\n \"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>?\"\n },\n \"ERROR\": {\n \"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>.\",\n \"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.\"\n }\n}\n);\n\n$translateProvider.translations(\"fr-FR\", {\n \"COMMON\": {\n \"CATEGORY\": \"Catégorie\",\n \"CATEGORY_SELECT_HELP\": \"Sélectionner\",\n \"CATEGORIES\": \"Catégories\",\n \"CATEGORY_SEARCH_HELP\": \"Recherche\",\n \"COMMENT_HELP\": \"Commentaire\",\n \"LAST_MODIFICATION_DATE\": \"Mise à jour le\",\n \"BTN_LIKE\": \"J'aime\",\n \"BTN_FOLLOW\": \"Suivre\",\n \"BTN_STOP_FOLLOW\": \"Ne plus suivre\",\n \"LIKES_TEXT\": \"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} aimé cette page\",\n \"DISLIKES_TEXT\": \"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'n\\\\'ont' : 'n\\\\'a'}} pas aimé cette page\",\n \"VIEWS_TEXT\": \"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} consulté cette page\",\n \"FOLLOWS_TEXT\": \"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'suivent' : 'suit'}} cette page\",\n \"ABUSES_TEXT\": \"{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} signalé un problème\",\n \"BTN_REPORT_ABUSE_DOTS\": \"Signaler un problème ou un abus...\",\n \"BTN_REMOVE_REPORTED_ABUSE\": \"Annuler mon signalement\",\n \"SUBMIT_BY\": \"Soumis par\",\n \"GEO_DISTANCE_SEARCH\": \"Distance de recherche\",\n \"GEO_DISTANCE_OPTION\": \"{{value}} km\",\n \"BTN_PUBLISH\": \"Publier\",\n \"BTN_PICTURE_DELETE\": \"Supprimer\",\n \"BTN_PICTURE_FAVORISE\": \"Principale\",\n \"BTN_PICTURE_ROTATE\": \"Tourner\",\n \"BTN_ADD_PICTURE\": \"Ajouter une photo\",\n \"NOTIFICATION\": {\n \"TITLE\": \"Nouvelle notification | {{'COMMON.APP_NAME'|translate}}\",\n \"HAS_UNREAD\": \"Vous avez {{count}} notification{{count>0?'s':''}} non lue{{count>0?'s':''}}\"\n },\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notifications\",\n \"MARK_ALL_AS_READ\": \"Tout marquer comme lu\",\n \"NO_RESULT\": \"Aucune notification\",\n \"SHOW_ALL\": \"Voir tout\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Erreur de chargement des notifications\"\n },\n \"REPORT_ABUSE\": {\n \"TITLE\": \"Signaler un problème\",\n \"SUB_TITLE\": \"Merci d'expliquer succintement le problème :\",\n \"REASON_HELP\": \"J'explique le problème...\",\n \"ASK_DELETE\": \"Demander la suppression ?\",\n \"CONFIRM\": {\n \"SENT\": \"Signalement envoyé. Merci !\"\n }\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Pages\",\n \"USER_PROFILE\": \"Mon profil\",\n \"MESSAGES\": \"Messages\",\n \"NOTIFICATIONS\": \"Notifications\",\n \"INVITATIONS\": \"Invitations\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Compte pour une organisation\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Si vous représentez une entreprise, une association, etc.<br/>Aucun dividende universel ne sera créé par ce compte.\"\n },\n \"EVENT\": {\n \"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é.\"\n },\n \"ERROR\": {\n \"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.\"\n }\n },\n \"WOT\": {\n \"BTN_SUGGEST_CERTIFICATIONS_DOTS\": \"Suggérer des identités à certifier...\",\n \"BTN_ASK_CERTIFICATIONS_DOTS\": \"Demander à des membres de me certifier...\",\n \"BTN_ASK_CERTIFICATION\": \"Demander une certification\",\n \"SUGGEST_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Suggérer des certifications\",\n \"HELP\": \"Sélectionner vos suggestions\"\n },\n \"ASK_CERTIFICATIONS_MODAL\": {\n \"TITLE\": \"Demander des certifications\",\n \"HELP\": \"Sélectionner les destinataires\"\n },\n \"SEARCH\": {\n \"DIVIDER_PROFILE\": \"Comptes\",\n \"DIVIDER_PAGE\": \"Pages\",\n \"DIVIDER_GROUP\": \"Groupes\"\n },\n \"VIEW\": {\n \"SENIORITY\": \"Ancienneté sur {{'COMMON.APP_NAME'|translate}}\",\n \"STARS\": \"Niveau de confiance\",\n \"STAR_HIT_COUNT\": \"{{total}} note{{total>1 ? 's' : ''}}\",\n \"BTN_STAR_HELP\": \"Noter ce profil\",\n \"BTN_STARS_REMOVE\": \"Supprimer ma note\",\n \"BTN_REDO_STAR_HELP\": \"Actualiser votre note\",\n \"BTN_FOLLOW\": \"Suivre l'activité de ce profil\",\n \"BTN_STOP_FOLLOW\": \"Ne plus suivre ce profil\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Commentaires\",\n \"SHOW_MORE_COMMENTS\": \"Afficher les commentaires précédents\",\n \"COMMENT_HELP\": \"Votre commentaire, question, etc.\",\n \"COMMENT_HELP_REPLY_TO\": \"Votre réponse...\",\n \"BTN_SEND\": \"Envoyer\",\n \"POPOVER_SHARE_TITLE\": \"Message #{{number}}\",\n \"REPLY\": \"Répondre\",\n \"REPLY_TO\": \"Réponse à :\",\n \"REPLY_TO_LINK\": \"En réponse à \",\n \"REPLY_TO_DELETED_COMMENT\": \"En réponse à un commentaire supprimé\",\n \"REPLY_COUNT\": \"{{replyCount}} réponses\",\n \"DELETED_COMMENT\": \"Commentaire supprimé\",\n \"MODIFIED_ON\": \"modifié le {{time|formatDate}}\",\n \"MODIFIED_PARENTHESIS\": \"(modifié ensuite)\",\n \"ERROR\": {\n \"FAILED_SAVE_COMMENT\": \"Erreur lors de la sauvegarde du commentaire\",\n \"FAILED_REMOVE_COMMENT\": \"Erreur lors de la suppression du commentaire\"\n }\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Rep: \",\n \"FORWARD_TITLE_PREFIX\": \"Tr: \",\n \"BTN_REPLY\": \"Répondre\",\n \"BTN_COMPOSE\": \"Nouveau message\",\n \"BTN_WRITE\": \"Ecrire\",\n \"NO_MESSAGE_INBOX\": \"Aucun message reçu\",\n \"NO_MESSAGE_OUTBOX\": \"Aucun message envoyé\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Messages\",\n \"MESSAGE_RECEIVED\": \"Vous avez <b>reçu un message</b><br/>de\"\n },\n \"LIST\": {\n \"INBOX\": \"Boîte de réception\",\n \"OUTBOX\": \"Messages envoyés\",\n \"LAST_INBOX\": \"Nouveaux messages\",\n \"LAST_OUTBOX\": \"Messages envoyés\",\n \"BTN_LAST_MESSAGES\": \"Messages récents\",\n \"TITLE\": \"Messages\",\n \"SEARCH_HELP\": \"Recherche dans les messages\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Options\",\n \"DELETE_ALL\": \"Supprimer tous les messages\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nouveau message\",\n \"TITLE_REPLY\": \"Répondre\",\n \"SUB_TITLE\": \"Nouveau message\",\n \"TO\": \"A\",\n \"OBJECT\": \"Objet\",\n \"OBJECT_HELP\": \"Objet\",\n \"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.\",\n \"MESSAGE\": \"Message\",\n \"MESSAGE_HELP\": \"Contenu du message\",\n \"CONTENT_CONFIRMATION\": \"Le contenu du message est vide.<br/><br/>Voulez-vous néanmoins envoyer le message ?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Message\",\n \"SENDER\": \"Envoyé par\",\n \"RECIPIENT\": \"Envoyé à\",\n \"NO_CONTENT\": \"Message vide\",\n \"DELETE\": \"Supprimer le message\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Êtes-vous sûr de vouloir <b>supprimer ce message</b> ?<br/><br/>Cette opération est irréversible.\",\n \"REMOVE_ALL\" : \"Êtes-vous sûr de vouloir <b>supprimer tous les messages</b> ?<br/><br/>Cette opération est irréversible.\",\n \"MARK_ALL_AS_READ\": \"Êtes-vous sûr de vouloir <b>marquer tous les messages comme lu</b> ?\",\n \"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 ?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Message supprimé\",\n \"All_MESSAGE_REMOVED\": \"Tous les messages ont été supprimés\",\n \"MESSAGE_SENT\": \"Message envoyé\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Erreur lors de l'envoi du message.\",\n \"LOAD_MESSAGES_FAILED\": \"Erreur lors de la récupération des messages.\",\n \"LOAD_MESSAGE_FAILED\": \"Erreur lors de la récupération du message.\",\n \"MESSAGE_NOT_READABLE\": \"Lecture du message impossible.\",\n \"USER_NOT_RECIPIENT\": \"Vous n'êtes pas le destinataire de ce message : déchiffrement impossible.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"L'authenticité du message est douteuse ou son contenu est corrompu.\",\n \"REMOVE_MESSAGE_FAILED\": \"Erreur de suppression du message\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Valeur trop longue ({{maxLength}} caractères max).\",\n \"MARK_AS_READ_FAILED\": \"Impossible de marquer le message comme 'lu'.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Erreur lors de la récupération des notifications de messages.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Erreur lors de la suppression de tous les messages.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Erreur lors du marquage des messages comme lu.\",\n \"RECIPIENT_IS_MANDATORY\": \"Le destinataire est obligatoire.\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Activité principale\",\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"LOCATION_DIVIDER\": \"Adresse\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Réseaux sociaux et site web\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"BTN_SHOW_WOT\": \"Personnes\",\n \"BTN_SHOW_WOT_HELP\": \"Rechercher des personnes\",\n \"BTN_SHOW_PAGES\": \"Pages\",\n \"BTN_SHOW_PAGES_HELP\": \"Rechercher des pages\",\n \"BTN_NEW\": \"Créer une page\",\n \"MY_PAGES\": \"Mes pages\",\n \"NO_PAGE\": \"Aucune page\",\n \"SEARCH\": {\n \"TITLE\": \"Pages\",\n \"SEARCH_HELP\": \"Quoi, Qui : restaurant, Chez Marcel, ...\",\n \"BTN_ADD\": \"Nouveau\",\n \"BTN_LAST_RECORDS\": \"Pages récentes\",\n \"BTN_ADVANCED_SEARCH\": \"Recherche avancée\",\n \"BTN_OPTIONS\": \"Recherche avancée\",\n \"TYPE\": \"Type de page\",\n \"LOCATION_HELP\": \"Où : Code postal, Ville\",\n \"RESULTS\": \"Résultats\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} résultat{{count>0?'s':''}}, près de {{location}}\",\n \"RESULT_COUNT\": \"{{count}} résultat{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Pages récentes\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}, près de {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} page{{count>0?'s':''}} récente{{count>0?'s':''}}\",\n \"POPOVER_FILTERS\": {\n \"BTN_ADVANCED_SEARCH\": \"Options avancées ?\"\n }\n },\n \"VIEW\": {\n \"TITLE\": \"Annuaire\",\n \"CATEGORY\": \"Activité principale :\",\n \"LOCATION\": \"Adresse :\",\n \"MENU_TITLE\": \"Options\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Êtes-vous sûr de vouloir supprimer cette page ?<br/><br/>Cette opération est irréversible.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Types\",\n \"SELECT_TYPE\": \"Type de page :\",\n \"ENUM\": {\n \"SHOP\": \"Commerce local\",\n \"COMPANY\": \"Entreprise\",\n \"ASSOCIATION\": \"Association\",\n \"INSTITUTION\": \"Institution\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Edition\",\n \"TITLE_NEW\": \"Nouvelle page\",\n \"RECORD_TYPE\":\"Type de page\",\n \"RECORD_TITLE\": \"Nom\",\n \"RECORD_TITLE_HELP\": \"Nom\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Description de l'activité\",\n \"RECORD_ADDRESS\": \"Rue\",\n \"RECORD_ADDRESS_HELP\": \"Rue, bâtiment...\",\n \"RECORD_CITY\": \"Ville\",\n \"RECORD_CITY_HELP\": \"Ville\",\n \"RECORD_SOCIAL_NETWORKS\": \"Réseaux sociaux et site web\",\n \"RECORD_PUBKEY\": \"Clé publique\",\n \"RECORD_PUBKEY_HELP\": \"Clé publique de réception des paiements\"\n },\n \"WALLET\": {\n \"REGISTRY_DIVIDER\": \"Pages\",\n \"REGISTRY_HELP\": \"Les pages référencent des activités acceptant la monnaie ou la favorisant : commerces, entreprises, associations, institutions.\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Erreur de chargement de la liste des activités\",\n \"LOAD_RECORD_FAILED\": \"Erreur lors du chargement de la page\",\n \"LOOKUP_RECORDS_FAILED\": \"Erreur lors de l'exécution de la recherche\",\n \"REMOVE_RECORD_FAILED\": \"Erreur lors de la suppression de la page\",\n \"SAVE_RECORD_FAILED\": \"Erreur lors de la sauvegarde\",\n \"RECORD_NOT_EXISTS\": \"Page inexistante\",\n \"GEO_LOCATION_NOT_FOUND\": \"Ville ou code postal non trouvé\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Page supprimée\",\n \"RECORD_SAVED\": \"Page sauvegardée\"\n }\n },\n \"PROFILE\": {\n \"PROFILE_DIVIDER\": \"Profil ğchange\",\n \"PROFILE_DIVIDER_HELP\": \"Il s'agit de données annexes, stockées sur le réseau ğchange.\",\n \"NO_PROFILE_DEFINED\": \"Aucun profil saisi\",\n \"BTN_ADD\": \"Saisir mon profil\",\n \"BTN_EDIT\": \"Editer mon profil\",\n \"BTN_DELETE\": \"Supprimer mon profil\",\n \"BTN_REORDER\": \"Réordonner\",\n \"UID\": \"Pseudonyme\",\n \"TITLE\": \"Nom, Prénom\",\n \"TITLE_HELP\": \"Nom, Prénom\",\n \"DESCRIPTION\": \"A propos de moi\",\n \"DESCRIPTION_HELP\": \"A propos de moi...\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Informations générales\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Réseaux sociaux, sites web\",\n \"STAR\": \"Niveau de confiance\",\n \"TECHNICAL_DIVIDER\": \"Informations techniques\",\n \"MODAL_AVATAR\": {\n \"TITLE\": \"Photo de profil\",\n \"SELECT_FILE_HELP\": \"Veuillez <b>choisir un fichier image</b>, en cliquant sur le bouton ci-dessous :\",\n \"BTN_SELECT_FILE\": \"Choisir une photo\",\n \"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.\",\n \"RESULT_HELP\": \"<b>Voici le résultat</b> tel que visible sur votre profil :\"\n },\n \"CONFIRM\": {\n \"DELETE\": \"Êtes-vous sûr de vouloir <b>supprimer votre profil ğchange ?</b><br/><br/>Cette opération est irréversible.\"\n },\n \"ERROR\": {\n \"REMOVE_PROFILE_FAILED\": \"Erreur de suppression du profil\",\n \"LOAD_PROFILE_FAILED\": \"Erreur de chargement du profil utilisateur\",\n \"SAVE_PROFILE_FAILED\": \"Erreur lors de la sauvegarde\",\n \"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>\",\n \"IMAGE_RESIZE_FAILED\": \"Erreur lors du redimensionnement de l'image\"\n },\n \"INFO\": {\n \"PROFILE_REMOVED\": \"Profil supprimé\",\n \"PROFILE_SAVED\": \"Profil sauvegardé\"\n },\n \"HELP\": {\n \"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>.\"\n }\n },\n \"LOCATION\": {\n \"BTN_GEOLOC_ADDRESS\": \"Trouver mon adresse sur la carte\",\n \"USE_GEO_POINT\": \"Vérifier l'adresse (recommandé) ?\",\n \"LOADING_LOCATION\": \"Recherche de l'adresse...\",\n \"LOCATION_DIVIDER\": \"Adresse\",\n \"ADDRESS\": \"Rue\",\n \"ADDRESS_HELP\": \"Rue, complément d'adresse...\",\n \"CITY\": \"Ville\",\n \"CITY_HELP\": \"Code postal, Ville, Pays\",\n \"DISTANCE\": \"Distance maximale autour de la ville\",\n \"DISTANCE_UNIT\": \"km\",\n \"DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SEARCH_HELP\": \"Code postal, Ville\",\n \"PROFILE_POSITION\": \"Position du profil\",\n \"MODAL\": {\n \"TITLE\": \"Recherche de l'adresse\",\n \"SEARCH_HELP\": \"Ville, Code postal, Pays\",\n \"ALTERNATIVE_RESULT_DIVIDER\": \"Résultats alternatifs pour <b>{{address}}</b> :\",\n \"POSITION\": \"Lat/Lon : {{lat}}/{{lon}}\"\n },\n \"ERROR\": {\n \"CITY_REQUIRED_IF_STREET\": \"Champ obligatoire (car une rue est saisie)\",\n \"REQUIRED_FOR_LOCATION\": \"Champ obligatoire pour apparaître sur la carte\",\n \"INVALID_FOR_LOCATION\": \"Adresse inconnue\",\n \"GEO_LOCATION_FAILED\": \"Impossible de récupérer votre position. Veuillez utiliser le bouton de recherche.\",\n \"ADDRESS_LOCATION_FAILED\": \"Impossible de récupérer la position à partir de l'adresse\"\n }\n },\n \"SUBSCRIPTION\": {\n \"SUBSCRIPTION_DIVIDER\": \"Services en ligne\",\n \"SUBSCRIPTION_DIVIDER_HELP\": \"Les services en ligne offrent des services supplémentaires optionnels, délégués à un tiers.\",\n \"BTN_ADD\": \"Ajouter un service\",\n \"BTN_EDIT\": \"Gérer mes services\",\n \"NO_SUBSCRIPTION\": \"Aucun service utilisé\",\n \"SUBSCRIPTION_COUNT\": \"Services / Abonnements\",\n \"EDIT\": {\n \"TITLE\": \"Services en ligne\",\n \"HELP_TEXT\": \"Gérez ici vos abonnements et autres services en ligne\",\n \"PROVIDER\": \"Prestataire :\"\n },\n \"TYPE\": {\n \"ENUM\": {\n \"EMAIL\": \"Recevoir les notifications par email\"\n }\n },\n \"CONFIRM\": {\n \"DELETE_SUBSCRIPTION\": \"Êtes-vous sûr de vouloir <b>supprimer cet abonnement</b> ?\"\n },\n \"ERROR\": {\n \"LOAD_SUBSCRIPTIONS_FAILED\": \"Erreur lors du chargement des services en ligne\",\n \"ADD_SUBSCRIPTION_FAILED\": \"Erreur de l'envoi de l'abonnement\",\n \"UPDATE_SUBSCRIPTION_FAILED\": \"Erreur de la mise à jour de l'abonnement\",\n \"DELETE_SUBSCRIPTION_FAILED\": \"Erreur lors de la suppression de l'abonnement\"\n },\n \"MODAL_EMAIL\": {\n \"TITLE\": \"Notification par email\",\n \"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.\",\n \"EMAIL_LABEL\": \"Votre email :\",\n \"EMAIL_HELP\": \"jean.dupond@domaine.com\",\n \"FREQUENCY_LABEL\": \"Fréquence des notifications :\",\n \"FREQUENCY_DAILY\": \"Journalier\",\n \"FREQUENCY_WEEKLY\": \"Hebdomadaire\",\n \"PROVIDER\": \"Prestataire du service :\"\n }\n },\n \"DOCUMENT\": {\n \"HASH\": \"Hash : \",\n \"LOOKUP\": {\n \"TITLE\": \"Recherche de documents\",\n \"BTN_ACTIONS\": \"Actions\",\n \"SEARCH_HELP\": \"issuer:AAA*, time:1508406169\",\n \"LAST_DOCUMENTS_DOTS\": \"Derniers documents :\",\n \"LAST_DOCUMENTS\": \"Derniers documents\",\n \"SHOW_QUERY\": \"Voir la requête\",\n \"HIDE_QUERY\": \"Masquer la requête\",\n \"HEADER_TIME\": \"Date/Heure\",\n \"HEADER_ISSUER\": \"Emetteur\",\n \"HEADER_RECIPIENT\": \"Destinataire\",\n \"READ\": \"Lu\",\n \"DOCUMENT_TYPE\": \"Type\",\n \"DOCUMENT_TITLE\": \"Titre\",\n \"BTN_REMOVE\": \"Supprimer ce document\",\n \"BTN_COMPACT\": \"Compacter\",\n \"HAS_REGISTERED\": \"a créé ou modifié son profil\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Actions\",\n \"REMOVE_ALL\": \"Supprimer ces documents...\"\n },\n \"TYPE\": {\n \"USER_PROFILE\": \"Profil\",\n \"MARKET_RECORD\": \"Annonce\",\n \"MARKET_COMMENT\": \"Commentaire sur une annonce\",\n \"PAGE_RECORD\": \"Page\",\n \"PAGE_COMMENT\": \"Commentaire sur une page\",\n \"GROUP_RECORD\": \"Groupe\",\n \"GROUP_COMMENT\": \"Commentaire sur un groupe\"\n }\n },\n \"INFO\": {\n \"REMOVED\": \"Document supprimé\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Êtes-vous sûr de vouloir <b>supprimer ce document</b> ?\",\n \"REMOVE_ALL\": \"Êtes-vous sûr de vouloir <b>supprimer ces documents</b> ?\"\n },\n \"ERROR\": {\n \"LOAD_DOCUMENTS_FAILED\": \"Erreur lors de la recherche de documents\",\n \"REMOVE_FAILED\": \"Erreur lors de la suppression du document\",\n \"REMOVE_ALL_FAILED\": \"Erreur lors de la suppression des documents\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Paramètres avancés\",\n \"PLUGIN_NAME_HELP\": \"Filtrage des notifications, etc.\",\n \"ENABLE_TOGGLE\": \"Activer l'extension ?\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Activer les messages privés ?\",\n \"ENABLE_SETTINGS_TOGGLE\": \"Activer le stockage distant des paramètres ?\",\n \"PEER\": \"Adresse du nœud de données\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Nœud de données\",\n \"HELP\" : \"Saisissez l'adresse du nœud que vous voulez utiliser :\",\n \"PEER_HELP\": \"serveur.domaine.com:port\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notifications\",\n \"HELP_TEXT\": \"Activez les types de notifications que vous souhaitez recevoir :\",\n \"ENABLE_TX_SENT\": \"Notifier les <b>paiements émis</b> ?\",\n \"ENABLE_TX_RECEIVED\": \"Notifier les <b>paiements reçus</b> ?\",\n \"ENABLE_CERT_SENT\": \"Notifier les <b>certifications émises</b> ?\",\n \"ENABLE_CERT_RECEIVED\": \"Notifier les <b>certifications reçues</b> ?\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Fonctionnalités optionnelles\",\n \"ASK_ENABLE\": \"L'extension Cesium+ est <b>désactivée</b> dans vos paramètres, rendant inactives les fonctionnalités : <ul><li>&nbsp;&nbsp;<b><i class=\\\"icon ion-person\\\"></i> Profils Cesium+</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-email\\\"></i> Messages privés</b>.<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-location\\\"></i> Cartes, etc.</b>.</ul><br/><b>Souhaitez-vous ré-activer</b> l'extension ?\"\n }\n },\n \"ES_WALLET\": {\n \"ERROR\": {\n \"RECIPIENT_IS_MANDATORY\": \"Un destinataire est obligatoire pour le chiffrement.\"\n }\n },\n \"ES_PEER\": {\n \"NAME\": \"Nom\",\n \"DOCUMENTS\": \"Documents\",\n \"SOFTWARE\": \"Logiciel\",\n \"DOCUMENT_COUNT\": \"Nombre de documents\",\n \"EMAIL_SUBSCRIPTION_COUNT\": \"{{emailSubscription}} abonnés aux notifications par email\"\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Votre noeud ES API <b>{{params[0]}}</b> est démarré\",\n \"NODE_BMA_DOWN\": \"Le noeud <b>{{params[0]}}:{{params[1]}}</b> (utilisé par votre noeud ES API) est <b>injoignable</b>.\",\n \"NODE_BMA_UP\": \"Le noeud <b>{{params[0]}}:{{params[1]}}</b> est à nouveau accessible.\",\n \"MEMBER_JOIN\": \"Vous êtes maintenant <b>membre</b> de la monnaie <b>{{params[0]}}</b> !\",\n \"MEMBER_LEAVE\": \"Vous n'êtes <b>plus membre</b> de la monnaie <b>{{params[0]}}</b> !\",\n \"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.\",\n \"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>.\",\n \"MEMBER_ACTIVE\": \"Votre renouvellement d'adhésion à la monnaie <b>{{params[0]}}</b> a été <b>pris en compte</b>.\",\n \"TX_SENT\": \"Votre <b>paiement</b> à <span class=\\\"positive\\\" ><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> a été effectué.\",\n \"TX_SENT_MULTI\": \"Votre <b>paiement</b> à <b>{{params[1]}}</b> a été effectué.\",\n \"TX_RECEIVED\": \"Vous avez <b>reçu un paiement</b> de <span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Vous avez <b>reçu un paiement</b> de <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Votre <b>certification</b> à <span class=\\\"positive\\\" ><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> a été effectuée.\",\n \"CERT_RECEIVED\": \"Vous avez <b>reçu une certification</b> de <span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> aime votre profil\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> suit votre activité\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> vous a noté ({{params[3]}} <b class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> a signalé un profil à supprimer : <b>{{params[2]}}</b>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[2]}}</span> a signalé votre profil\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a commenté votre page : <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a modifié son commentaire sur votre page : <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a répondu à votre commentaire sur la page : <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a modifié sa réponse à votre commentaire sur la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a commenté la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a modifié son commentaire sur la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a ajouté la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a modifié la page : <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a signalé votre page : <b>{{params[2]}}</b>\"\n }\n },\n \"CONFIRM\": {\n \"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> ?\"\n },\n \"ERROR\": {\n \"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>.\",\n \"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.\"\n }\n}\n);\n\n$translateProvider.translations(\"nl-NL\", {\n \"COMMON\": {\n \"CATEGORY\": \"Categorie\",\n \"CATEGORIES\": \"Categorieën\",\n \"CATEGORY_SEARCH_HELP\": \"Zoeken\",\n \"LAST_MODIFICATION_DATE\": \"Vernieuws op \",\n \"SUBMIT_BY\": \"Ingediend door\",\n \"BTN_PUBLISH\": \"Publiceren\",\n \"BTN_PICTURE_DELETE\": \"Wissen\",\n \"BTN_PICTURE_FAVORISE\": \"Default\",\n \"BTN_ADD_PICTURE\": \"Afbeelding toevoegen\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Notificaties\",\n \"MARK_ALL_AS_READ\": \"Markeer alles als gelezen\",\n \"NO_RESULT\": \"Geen berichten\",\n \"SHOW_ALL\": \"Toon alles\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Kan berichten niet laden\"\n }\n },\n \"MENU\": {\n \"REGISTRY\": \"Ondernemingen\",\n \"USER_PROFILE\": \"Mijn profiel\",\n \"MESSAGES\": \"Berichten\"\n },\n \"ACCOUNT\": {\n \"NEW\": {\n \"ORGANIZATION_ACCOUNT\": \"Ondernemingsrekening\",\n \"ORGANIZATION_ACCOUNT_HELP\": \"Als je een onderneming, vereniging etc. vertegenwoordigd.<br/>Deze rekening zal geen dividend créeren.\"\n },\n \"EVENT\": {\n \"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.\"\n }\n },\n \"COMMENTS\": {\n \"DIVIDER\": \"Commentaren\",\n \"SHOW_MORE_COMMENTS\": \"Toon eerder commentaren\",\n \"COMMENT_HELP\": \"Jouw commentaar, vraag...\",\n \"COMMENT_HELP_REPLY_TO\": \"Jouw antwoord...\",\n \"BTN_SEND\": \"Verzenden\",\n \"POPOVER_SHARE_TITLE\": \"Bericht #{{number}}\",\n \"REPLY\": \"Antwoord\",\n \"REPLY_TO\": \"Antwoorden op:\",\n \"REPLY_TO_LINK\": \"In antwoord op \",\n \"REPLY_TO_DELETED_COMMENT\": \"In antwoord op een gewist bericht\",\n \"REPLY_COUNT\": \"{{replyCount}} antwoorden\",\n \"DELETED_COMMENT\": \"Bericht gewist\"\n },\n \"MESSAGE\": {\n \"REPLY_TITLE_PREFIX\": \"Re: \",\n \"FORWARD_TITLE_PREFIX\": \"Fw: \",\n \"BTN_REPLY\": \"Antwoord\",\n \"BTN_COMPOSE\": \"Nieuw bericht\",\n \"BTN_WRITE\": \"Schrijven\",\n \"NO_MESSAGE_INBOX\": \"Geen bericht ontvangen\",\n \"NO_MESSAGE_OUTBOX\": \"Geen bericht verzonden\",\n \"NOTIFICATIONS\": {\n \"TITLE\": \"Berichten\",\n \"MESSAGE_RECEIVED\": \"Je hebt een <b>bericht ontvangen</b><br/>van\"\n },\n \"LIST\": {\n \"INBOX\": \"Inbox\",\n \"OUTBOX\": \"Verzonden\",\n \"TITLE\": \"Privé\",\n \"POPOVER_ACTIONS\": {\n \"TITLE\": \"Opties\",\n \"DELETE_ALL\": \"Alle berichten wissen\"\n }\n },\n \"COMPOSE\": {\n \"TITLE\": \"Nieuw bericht\",\n \"TITLE_REPLY\": \"Antwoord\",\n \"SUB_TITLE\": \"Nieuw bericht\",\n \"TO\": \"Aan\",\n \"OBJECT\": \"Onderwerp\",\n \"OBJECT_HELP\": \"Onderwerp\",\n \"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.\",\n \"MESSAGE\": \"Bericht\",\n \"MESSAGE_HELP\": \"Berichtinhoud\",\n \"CONTENT_CONFIRMATION\": \"Geen berichtinhoud.<br/><br/>Weet je zeker dat je dit bericht wil verzenden?\"\n },\n \"VIEW\": {\n \"TITLE\": \"Bericht\",\n \"SENDER\": \"Verzonden door\",\n \"RECIPIENT\": \"Verzonden aan\",\n \"NO_CONTENT\": \"Leeg bericht\"\n },\n \"CONFIRM\": {\n \"REMOVE\": \"Weet je zeker dat je <b>dit bericht wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.\",\n \"REMOVE_ALL\": \"Weet je zeker dat je <b>alle berichten wil wissen</b>?<br/><br/>Dit kan niet ongedaan gemaakt worden.\",\n \"MARK_ALL_AS_READ\": \"Weet je zeker dat je <b>alle berichten als gelezen wil markeren</b>?\"\n },\n \"INFO\": {\n \"MESSAGE_REMOVED\": \"Bericht succesvol gewist\",\n \"All_MESSAGE_REMOVED\": \"Berichten succesvol gewist\",\n \"MESSAGE_SENT\": \"Bericht verzonden\"\n },\n \"ERROR\": {\n \"SEND_MSG_FAILED\": \"Fout tijdens verzending.\",\n \"LOAD_MESSAGES_FAILED\": \"Kan berichten niet laden.\",\n \"LOAD_MESSAGE_FAILED\": \"Kan bericht niet laden.\",\n \"MESSAGE_NOT_READABLE\": \"Kan bericht niet lezen.\",\n \"USER_NOT_RECIPIENT\": \"Je bent niet de geadresseerde van dit bericht: het kan niet gelezen worden.\",\n \"NOT_AUTHENTICATED_MESSAGE\": \"De authenticiteit van het bericht is onduidelijk of de inhoud is gecorrumpeerd.\",\n \"REMOVE_MESSAGE_FAILED\": \"Kan bericht niet wissen.\",\n \"MESSAGE_CONTENT_TOO_LONG\": \"Waarde te land (max {{maxLength}} characters).\",\n \"MARK_AS_READ_FAILED\": \"Kan bericht niet als gelezen markeren.\",\n \"LOAD_NOTIFICATIONS_FAILED\": \"Kan niet alle berichtnotificaties laden.\",\n \"REMOVE_All_MESSAGES_FAILED\": \"Kan niet alle berichten wissen.\",\n \"MARK_ALL_AS_READ_FAILED\": \"Kan berichten niet als gelezen markeren.\"\n }\n },\n \"REGISTRY\": {\n \"CATEGORY\": \"Hoofdactiviteit\",\n \"GENERAL_DIVIDER\": \"Basisinformatie\",\n \"LOCATION_DIVIDER\": \"Adres\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociale media en website\",\n \"TECHNICAL_DIVIDER\": \"Technische informatie\",\n \"BTN_NEW\": \"Toevoegen\",\n \"SEARCH\": {\n \"TITLE\": \"Bedrijfsregister\",\n \"TITLE_SMALL_DEVICE\": \"Bedrijfsregister\",\n \"SEARCH_HELP\": \"Wie, Wat: kapper, Lili's restaurant, ...\",\n \"BTN_ADD\": \"Nieuw\",\n \"BTN_OPTIONS\": \"Geavanceerd zoeken\",\n \"TYPE\": \"Soort organisatie\",\n \"LOCATION\": \"Locatie\",\n \"LOCATION_HELP\": \"Plaats\",\n \"LAST_RECORDS\": \"Nieuwste referenties:\",\n \"RESULTS\": \"Resultaten:\"\n },\n \"VIEW\": {\n \"TITLE\": \"Register\",\n \"CATEGORY\": \"Hoofdactiviteit:\",\n \"LOCATION\": \"Adres:\",\n \"MENU_TITLE\": \"Opties\",\n \"POPOVER_SHARE_TITLE\": \"{{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Weet je zeker dat je deze referentie wil verwijderen?<br/><br/>Dit kan niet ongedaan worden gemaakt.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nieuwe referentie\",\n \"SELECT_TYPE\": \"Soort organizatie:\",\n \"ENUM\": {\n \"SHOP\": \"Locale winkel\",\n \"COMPANY\": \"Onderneming\",\n \"ASSOCIATION\": \"Stichting\",\n \"INSTITUTION\": \"Instituut\"\n }\n },\n \"EDIT\": {\n \"TITLE\": \"Bewerk\",\n \"TITLE_NEW\": \"Nieuwe referentie\",\n \"RECORD_TYPE\":\"Soort organizatie\",\n \"RECORD_TITLE\": \"Naam\",\n \"RECORD_TITLE_HELP\": \"Naam\",\n \"RECORD_DESCRIPTION\": \"Beschrijving\",\n \"RECORD_DESCRIPTION_HELP\": \"Omschrijf activiteit\",\n \"RECORD_ADDRESS\": \"Adres\",\n \"RECORD_ADDRESS_HELP\": \"Adres: straat, gebouw...\",\n \"RECORD_CITY\": \"Plaats\",\n \"RECORD_CITY_HELP\": \"Plaats\",\n \"RECORD_SOCIAL_NETWORKS\": \"Sociale media en website\",\n \"RECORD_PUBKEY\": \"Publieke sleutel\",\n \"RECORD_PUBKEY_HELP\": \"Publieke sleutel om betalingen te ontvangen\"\n },\n \"ERROR\": {\n \"LOAD_CATEGORY_FAILED\": \"Laden hoofdactiveiten mislukt\",\n \"LOAD_RECORD_FAILED\": \"Laden datasheet mislukt\",\n \"LOOKUP_RECORDS_FAILED\": \"Opzoeken datasheets is mislukt.\",\n \"REMOVE_RECORD_FAILED\": \"Verwijderen datasheet mislukt\",\n \"SAVE_RECORD_FAILED\": \"Opslaan datasheet mislukt\",\n \"RECORD_NOT_EXISTS\": \"Datasheet niet gevonden\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Datasheet succesvol verwijderd\"\n }\n },\n \"PROFILE\": {\n \"UID\": \"Pseudoniem\",\n \"TITLE\": \"Naam\",\n \"TITLE_HELP\": \"Naam\",\n \"DESCRIPTION\": \"Over mij\",\n \"DESCRIPTION_HELP\": \"Over mij...\",\n \"ADDRESS\": \"Adres\",\n \"ADDRESS_HELP\": \"Adres (optioneel)\",\n \"CITY\": \"Plaats\",\n \"CITY_HELP\": \"Plaats (optioneel)\",\n \"SOCIAL_HELP\": \"http://...\",\n \"GENERAL_DIVIDER\": \"Algemene informatie\",\n \"LOCATION_DIVIDER\": \"Localisatie\",\n \"SOCIAL_NETWORKS_DIVIDER\": \"Sociale media en website\",\n \"TECHNICAL_DIVIDER\": \"Technische informatie\",\n \"ERROR\": {\n \"LOAD_PROFILE_FAILED\": \"Kon gebruikersprofiel niet laden.\",\n \"SAVE_PROFILE_FAILED\": \"Opslaan profiel mislukt\",\n \"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>\",\n \"IMAGE_RESIZE_FAILED\": \"Fout tijdens afbeelding schalen\"\n },\n \"INFO\": {\n \"PROFILE_SAVED\": \"Profiel opgeslagen\"\n },\n \"HELP\": {\n \"WARNING_PUBLIC_DATA\": \"Let op, de informatie die hier is vastgelegd <b>is publiek</b>: zichtbaar ook voor <b>niet ingelogde gebruikers</b>.\"\n }\n },\n \"ES_SETTINGS\": {\n \"PLUGIN_NAME\": \"Cesium+\",\n \"ENABLE_TOGGLE\": \"Uitbreiding inschakelen?\",\n \"ENABLE_MESSAGE_TOGGLE\": \"Berichten inschakelen?\",\n \"ENABLE_SETTINGS_TOGGLE\": \"Globale opslag voor instellingen inschakelen?\",\n \"PEER\": \"Adres dataknooppunt\",\n \"POPUP_PEER\": {\n \"TITLE\" : \"Dataknoop\",\n \"HELP\" : \"Stel het te gebruiken adres in:\",\n \"PEER_HELP\": \"server.domein.com:poort\"\n },\n \"NOTIFICATIONS\": {\n \"DIVIDER\": \"Notificaties\",\n \"HELP_TEXT\": \"Schakel het type notificatie dat je wil ontvangen in:\",\n \"ENABLE_TX_SENT\": \"Bericht bij validatie van <b>verzonden betalingen</b>?\",\n \"ENABLE_TX_RECEIVED\": \"Bericht bij validatie van <b>ontvangen betalingen</b>?\",\n \"ENABLE_CERT_SENT\": \"Bericht bij validatie van <b>verzonden certificaties</b>?\",\n \"ENABLE_CERT_RECEIVED\": \"Bericht bij validatie van <b>ontvangen certificaties</b>?\"\n },\n \"CONFIRM\": {\n \"ASK_ENABLE_TITLE\": \"Nieuwe functies\",\n \"ASK_ENABLE\": \"Er zijn nieuwe functies beschikbaar: <ul><li>&nbsp;&nbsp;<b><i class=\\\"icon ion-person\\\"></i> Profile Cesium+</b>;<li>&nbsp;&nbsp;<b><i class=\\\"icon ion-android-notifcaitions\\\"></i> Notifications</b>;<li>&nbsp;&nbsp;<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>?\"\n }\n },\n \"EVENT\": {\n \"NODE_STARTED\": \"Je knoop ES API <b>{{params[0]}}</b> is UP\",\n \"NODE_BMA_DOWN\": \"Knooppunt <b>{{params[0]}}:{{params[1]}}</b> (gebruikt door je ES API) is <b>onbereikbaar</b>.\",\n \"NODE_BMA_UP\": \"Knooppunt <b>{{p0}}:{{params[1]}}</b> is weer onbereikbaar.\",\n \"MEMBER_JOIN\": \"Je bent nu <b>lid</b> van valuta <b>{{params[0]}}</b>!\",\n \"MEMBER_LEAVE\": \"Je bent <b>geen lid meer</b> van valuta <b>{{params[0]}}</b>!\",\n \"MEMBER_ACTIVE\": \"Je lidmaatschap bij <b>{{params[0]}}</b> is met <b>succes verlengd</b>.\",\n \"TX_SENT\": \"Je <b>betaling</b> aan <span class=\\\"positive\\\" ><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> is uitgevoerd.\",\n \"TX_SENT_MULTI\": \"Je <b>betaling</b> aan <b>{{params[1]}}</b> is uitgevoerd.\",\n \"TX_RECEIVED\": \"Je hebt een <b>betaling ontvangen</b> van <span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"TX_RECEIVED_MULTI\": \"Je hebt een <b>betaling ontvangen</b> van <b>{{params[1]}}</b>.\",\n \"CERT_SENT\": \"Je <b>certificatie</b> van <span class=\\\"positive\\\" ><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> is uitgevoerd.\",\n \"CERT_RECEIVED\": \"Je hebt een <b>certificatie ontvangen</b> van <span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span>.\",\n \"REGISTRY\": {\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft gereageerd op jouw referentie: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/aar reactie op jouw referentie bewerkt: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> hheeft gereageerd op jouw commentaar op referentie: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/haar reactie op jouw commentaar bewerkt, op referentie: <b>{{params[2]}}</b>\"\n }\n },\n \"ERROR\": {\n\n }\n}\n);\n\n$translateProvider.translations(\"en-GB\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistics\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Linear scale\",\n \"LOGARITHMIC_SCALE\" : \"Logarithmic scale\",\n \"BTN_SHOW_STATS\": \"See statistics\",\n \"BTN_SHOW_DETAILED_STATS\": \"Detailed statistics\",\n \"RANGE_DURATION_DIVIDER\": \"Step unit:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Group by <b>hour</b>\",\n \"DAY\": \"Group by <b>day</b>\",\n \"MONTH\": \"Group by <b>month</b>\"\n }\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Computed blocks count\",\n \"BLOCK_COUNT\": \"{{count}} blocks\",\n \"NO_BLOCK\": \"No block\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Data storage statistics\",\n \"MARKET\": {\n \"TITLE\": \"Number of Ads\",\n \"AD\": \"Ads\",\n \"COMMENT\": \"Comments\"\n },\n \"USER\": {\n \"TITLE\": \"Number of documents linked to an account\",\n \"USER_PROFILE\": \"User profiles\",\n \"USER_SETTINGS\": \"Saved settings\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Number of documents related to the communication\",\n \"MESSAGE_INBOX\": \"Messages in inbox\",\n \"MESSAGE_OUTBOX\": \"Messages in outbox\",\n \"INVITATION_CERTIFICATION\": \"Invitations to certify\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Number of page or group\",\n \"PAGE_COMMENT\": \"Comments\",\n \"PAGE_RECORD\": \"Pages\",\n \"GROUP_RECORD\": \"Groups\"\n },\n \"SUBSCRIPTION\": {\n \"TITLE\": \"Number of online subscriptions\",\n \"EMAIL\": \"Email notifications\"\n },\n \"OTHER\": {\n \"TITLE\": \"Other documents\",\n \"HISTORY_DELETE\": \"Deletion of documents\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"en\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistics\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Linear scale\",\n \"LOGARITHMIC_SCALE\" : \"Logarithmic scale\",\n \"BTN_SHOW_STATS\": \"See statistics\",\n \"BTN_SHOW_DETAILED_STATS\": \"Detailed statistics\",\n \"RANGE_DURATION_DIVIDER\": \"Step unit:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Group by <b>hour</b>\",\n \"DAY\": \"Group by <b>day</b>\",\n \"MONTH\": \"Group by <b>month</b>\"\n }\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Computed blocks count\",\n \"BLOCK_COUNT\": \"{{count}} blocks\",\n \"NO_BLOCK\": \"No block\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Data storage statistics\",\n \"MARKET\": {\n \"TITLE\": \"Number of Ads\",\n \"AD\": \"Ads\",\n \"COMMENT\": \"Comments\"\n },\n \"USER\": {\n \"TITLE\": \"Number of documents linked to an account\",\n \"USER_PROFILE\": \"User profiles\",\n \"USER_SETTINGS\": \"Saved settings\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Number of documents related to the communication\",\n \"MESSAGE_INBOX\": \"Messages in inbox\",\n \"MESSAGE_OUTBOX\": \"Messages in outbox\",\n \"INVITATION_CERTIFICATION\": \"Invitations to certify\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Number of page or group\",\n \"PAGE_COMMENT\": \"Comments\",\n \"PAGE_RECORD\": \"Pages\",\n \"GROUP_RECORD\": \"Groups\"\n },\n \"SUBSCRIPTION\": {\n \"TITLE\": \"Number of online subscriptions\",\n \"EMAIL\": \"Email notifications\"\n },\n \"OTHER\": {\n \"TITLE\": \"Other documents\",\n \"HISTORY_DELETE\": \"Deletion of documents\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"eo-EO\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistikoj\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Lineara skalo\",\n \"LOGARITHMIC_SCALE\" : \"Logaritma skalo\",\n \"BTN_SHOW_STATS\": \"Vidi la statistikojn\",\n \"BTN_SHOW_DETAILED_STATS\": \"Detalaj statistikoj\",\n \"RANGE_DURATION_DIVIDER\": \"Tempo-unuo:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Horo\",\n \"DAY\": \"Tago\",\n \"MONTH\": \"Monato\"\n }\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Nombro de blokoj kalkulitaj\",\n \"BLOCK_COUNT\": \"{{count}} blokoj\",\n \"NO_BLOCK\": \"Neniu bloko\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Statistikoj pri stokado\",\n \"MARKET\": {\n \"TITLE\": \"Nombro de anoncoj\",\n \"AD\": \"Anoncoj\",\n \"COMMENT\": \"Komentoj\"\n },\n \"MARKET_DELTA\": {\n \"TITLE\": \"Variado de la nombro de anoncoj\",\n \"AD\": \"Anoncoj\",\n \"COMMENT\": \"Komentoj\"\n },\n \"USER\": {\n \"TITLE\": \"Nombro de dokumentoj ligitaj al konto\",\n \"USER_PROFILE\": \"Uzanto-profiloj\",\n \"USER_SETTINGS\": \"Parametroj konservitaj\"\n },\n \"USER_DELTA\": {\n \"TITLE\": \"Variado de la nombro de dokumentoj ligitaj al konto\",\n \"USER_PROFILE\": \"Uzanto-profiloj\",\n \"USER_SETTINGS\": \"Parametroj konservitaj\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Nombro de dokumentoj ligitaj al komunikado\",\n \"MESSAGE_INBOX\": \"Mesaĝoj en ricevujo\",\n \"MESSAGE_OUTBOX\": \"Senditaj mesaĝoj konservitaj\",\n \"INVITATION_CERTIFICATION\": \"Invitoj atestotaj\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Nombro de paĝoj aŭ grupoj\",\n \"PAGE_COMMENT\": \"Komentoj\",\n \"PAGE_RECORD\": \"Paĝoj\",\n \"GROUP_RECORD\": \"Grupoj\"\n },\n \"SUBSCRIPTION\": {\n \"TITLE\": \"Nombro de abonoj\",\n \"EMAIL\": \"Avizoj per retmesaĝoj\"\n },\n \"OTHER\": {\n \"TITLE\": \"Aliaj dokumentoj\",\n \"HISTORY_DELETE\": \"Forigoj de dokumentoj\"\n }\n },\n \"SYNCHRO\": {\n \"TITLE\": \"Statistikoj pri sinkronigoj\",\n \"COUNT\": {\n \"TITLE\": \"Kvanto sinkronigita\",\n \"INSERTS\": \"Enmetoj\",\n \"UPDATES\": \"Ĝisdatigoj\",\n \"DELETES\": \"Forigoj\"\n },\n \"PEER\": {\n \"TITLE\": \"Nodoj informpetitaj\",\n \"ES_USER_API\": \"Nodoj pri datenoj de uzantoj\",\n \"ES_SUBSCRIPTION_API\": \"Nodoj pri retaj servoj\"\n },\n \"PERFORMANCE\": {\n \"TITLE\": \"Efikecoj pri efektiviĝo\",\n \"DURATION\": \"Tempo por efektiviĝo (ms)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"es-ES\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Estadística\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Escala lineal\",\n \"LOGARITHMIC_SCALE\" : \"Escala logarítmica\",\n \"BTN_SHOW_STATS\": \"Ver estadísticas\",\n \"BTN_SHOW_DETAILED_STATS\": \"Estadísticas detalladas\",\n \"RANGE_DURATION_DIVIDER\": \"Unidad de tiempo:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Agrupar por <b>horas</b>\",\n \"DAY\": \"Agrupar por <b>días</b>\",\n \"MONTH\": \"Agrupar por <b>meses</b>\"\n }\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Número de bloques calculados\",\n \"BLOCK_COUNT\": \"{{count}} bloques\",\n \"NO_BLOCK\": \"Ningún bloque\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"fr-FR\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistiques\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Echelle linéaire\",\n \"LOGARITHMIC_SCALE\" : \"Echelle logarithmique\",\n \"BTN_SHOW_STATS\": \"Voir les statistiques\",\n \"BTN_SHOW_DETAILED_STATS\": \"Statistiques détaillées\",\n \"RANGE_DURATION_DIVIDER\": \"Unité de temps :\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Heure\",\n \"DAY\": \"Jour\",\n \"MONTH\": \"Mois\"\n }\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Nombre de blocs calculés\",\n \"BLOCK_COUNT\": \"{{count}} blocs\",\n \"NO_BLOCK\": \"Aucun bloc\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Statistiques de stockage\",\n \"MARKET\": {\n \"TITLE\": \"Nombre d'annonces\",\n \"AD\": \"Annonces\",\n \"COMMENT\": \"Commentaires\"\n },\n \"MARKET_DELTA\": {\n \"TITLE\": \"Variation du nombre d'annonces\",\n \"AD\": \"Annonces\",\n \"COMMENT\": \"Commentaires\"\n },\n \"USER\": {\n \"TITLE\": \"Nombre de documents liés à un compte\",\n \"USER_PROFILE\": \"Profils utilisateur\",\n \"USER_SETTINGS\": \"Paramètres sauvegardés\"\n },\n \"USER_DELTA\": {\n \"TITLE\": \"Variation du nombre de documents liés à un compte\",\n \"USER_PROFILE\": \"Profils utilisateur\",\n \"USER_SETTINGS\": \"Paramètres sauvegardés\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Nombre de documents liés à la communication\",\n \"MESSAGE_INBOX\": \"Messages en boîte de réception\",\n \"MESSAGE_OUTBOX\": \"Messages envoyés sauvegardés\",\n \"INVITATION_CERTIFICATION\": \"Invitations à certifier\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Nombre de pages ou groupes\",\n \"PAGE_COMMENT\": \"Commentaires\",\n \"PAGE_RECORD\": \"Pages\",\n \"GROUP_RECORD\": \"Groupes\"\n },\n \"SUBSCRIPTION\": {\n \"TITLE\": \"Nombre d'abonnements\",\n \"EMAIL\": \"Notifications emails\"\n },\n \"OTHER\": {\n \"TITLE\": \"Autres documents\",\n \"HISTORY_DELETE\": \"Suppressions de documents\"\n }\n },\n \"SYNCHRO\": {\n \"TITLE\": \"Statistiques de synchronisations\",\n \"COUNT\": {\n \"TITLE\": \"Volume synchronisé\",\n \"INSERTS\": \"Insertions\",\n \"UPDATES\": \"Mises à jour\",\n \"DELETES\": \"Suppressions\"\n },\n \"PEER\": {\n \"TITLE\": \"Noeuds requêtés\",\n \"ES_USER_API\": \"Noeuds données utilisateurs\",\n \"ES_SUBSCRIPTION_API\": \"Noeuds services en ligne\"\n },\n \"PERFORMANCE\": {\n \"TITLE\": \"Performances d'exécution\",\n \"DURATION\": \"Temps d'exécution (ms)\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"it-IT\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistiche\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Scala lineare\",\n \"LOGARITHMIC_SCALE\" : \"Scala logaritmica\",\n \"BTN_SHOW_STATS\": \"Vedere le statistiche\",\n \"BTN_SHOW_DETAILED_STATS\": \"Statistiche dettagliate\",\n \"RANGE_DURATION_DIVIDER\": \"Unità di tempo :\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Ora\",\n \"DAY\": \"Giorno\",\n \"MONTH\": \"Mese\"\n }\n },\n \"PEER\": {\n \"VIEW\": {\n \"BLOCK_COUNT_LABEL\": \"Numero di blocchi calcolati\",\n \"BLOCK_COUNT\": \"{{count}} blocchi\",\n \"NO_BLOCK\": \"Nessun blocco\"\n }\n },\n \"DOC_STATS\": {\n \"TITLE\": \"Statistiche di stoccaggio\",\n \"USER\": {\n \"TITLE\": \"Numero di documenti legati ad un conto\",\n \"USER_PROFILE\": \"Profili dell'utente\",\n \"USER_SETTINGS\": \"Impostazioni salvate\"\n },\n \"MESSAGE\": {\n \"TITLE\": \"Numero di documenti legati alla conversazione\",\n \"MESSAGE_INBOX\": \"Messaggi in arrivo\",\n \"MESSAGE_OUTBOX\": \"Messaggi inviati salvati\",\n \"INVITATION_CERTIFICATION\": \"Invitazioni da certificare\"\n },\n \"SOCIAL\": {\n \"TITLE\": \"Numero di pagine o gruppi\",\n \"PAGE_COMMENT\": \"Commenti\",\n \"PAGE_RECORD\": \"Pagine\",\n \"GROUP_RECORD\": \"Gruppi\"\n },\n \"OTHER\": {\n \"TITLE\": \"Altri documenti\",\n \"HISTORY_DELETE\": \"Cronologia eliminazione documenti\"\n }\n },\n \"SYNCHRO\": {\n \"TITLE\": \"Statistiche di sincronizzazioni\",\n \"COUNT\": {\n \"TITLE\": \"Volume sincronizzato\",\n \"INSERTS\": \"Inserimenti\",\n \"UPDATES\": \"Aggiornamenti\",\n \"DELETES\": \"Eliminazioni\"\n },\n \"PEER\": {\n \"TITLE\": \"Nodi interrogati\",\n \"ES_USER_API\": \"Nodi dati utenti\",\n \"ES_SUBSCRIPTION_API\": \"Noeuds servizi online\"\n },\n \"PERFORMANCE\": {\n \"TITLE\": \"Prestazioni (performance) di esecuzione\",\n \"DURATION\": \"Tempo di esecuzione (ms)\"\n }\n }\n }\n }\n);\n\n$translateProvider.translations(\"nl-NL\", {\n \"NETWORK\": {\n \"VIEW\": {\n \"BTN_GRAPH\": \"Statistieken\"\n }\n },\n \"GRAPH\": {\n \"COMMON\": {\n \"LINEAR_SCALE\" : \"Lineaire schaal\",\n \"LOGARITHMIC_SCALE\" : \"Logaritmische schaal\",\n \"BTN_SHOW_STATS\": \"Zie statistieken\",\n \"BTN_SHOW_DETAILED_STATS\": \"Gedetailleerde statistieken\",\n \"RANGE_DURATION_DIVIDER\": \"Stap eenheid:\",\n \"RANGE_DURATION\": {\n \"HOUR\": \"Groep per <b>uur</b>\",\n \"DAY\": \"Groep per <b>dag</b>\",\n \"MONTH\": \"Groep per <b>maand</b>\"\n }\n }\n }\n}\n);\n\n$translateProvider.translations(\"en-GB\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Search...\",\n \"BTN_SHOW_ON_MAP\": \"SHow on map\",\n \"CHOOSE_FILE\": \"Drop a file (svg, geojson)<br/>or click to select\"\n },\n \"SHAPE\": {\n \"EDIT\": {\n \"TITLE\": \"Country map\",\n \"COUNTRY_DOTS\": \"Country:\",\n \"COUNTRY_HELP\": \"Country code (ISO2)\",\n \"CONFIG_FORM_DIVIDER\": \"Configuration :\",\n \"ERROR_DIVIDER\": \"Detected errors :\",\n \"LEFT_LNG\": \"West\",\n \"RIGHT_LNG\": \"East\",\n \"TOP_LAT\": \"North\",\n \"BOTTOM_LAT\": \"South\",\n \"SCALE\": \"Scale\",\n \"TRANSLATE_X\": \"Translate X\",\n \"TRANSLATE_Y\": \"Translate Y\",\n \"AREA_FORM_DIVIDER\": \"Area edit:\",\n \"ID\": \"Unique identifier\",\n \"NAME\": \"Label\",\n \"POSITION_DOTS\": \"Position:\",\n \"ORDER\": \"Sort order\",\n \"BTN_APPLY\": \"Apply\",\n \"BTN_DELETE\": \"Delete the area\",\n \"CUSTOM_PROJECTION\": \"Manually set projection settings\",\n \"BTN_TEST_SEARCH\": \"Test a search on this area\",\n \"STRICT_MODE\": \"Compatible with OCG (hand right rule)\",\n \"REMOVE_HOLE\": \"Remove holes inside polygons\",\n \"APPLY_ROUND\": \"Round to precision:\",\n \"DEGREES_PRECISION\": \"Precision (decimal degrees)\",\n \"INFO\": {\n \"SAVED\": \"The map has been saved\"\n },\n \"ERROR\": {\n \"INVALID_SVG\": \"Bad SVG format.\",\n \"INVALID_COUNTRY_CODE\": \"Country code (need ISO2, in lower case)\",\n \"SAVE_FAILED\": \"Error while saving map\",\n \"SELF_INTERSECTION\": \"Self-intersection in polygon <b>{{id}}</b>\",\n \"HOLE_LIES_OUTSIDE\": \"Hole lies outside shell <b>{{id}}</b>\",\n \"HOLE_NOT_WITHIN_POLYGON\": \"Invalid hole (not within polygon) <b>{{id}}</b>\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Map\",\n \"BTN_MAP_HELP\": \"Open map\"\n },\n \"VIEW\": {\n \"TITLE\": \"Members map\",\n \"LAYER\": {\n \"MEMBER\": \"Members\",\n \"PENDING\": \"Pending registrations\",\n \"WALLET\": \"Simple wallets\"\n }\n }\n },\n \"PROFILE\": {\n \"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.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Unable to retrieve your current position\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"en\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Search...\",\n \"BTN_SHOW_ON_MAP\": \"SHow on map\",\n \"CHOOSE_FILE\": \"Drop a file (svg, geojson)<br/>or click to select\"\n },\n \"SHAPE\": {\n \"EDIT\": {\n \"TITLE\": \"Country map\",\n \"COUNTRY_DOTS\": \"Country:\",\n \"COUNTRY_HELP\": \"Country code (ISO2)\",\n \"CONFIG_FORM_DIVIDER\": \"Configuration :\",\n \"ERROR_DIVIDER\": \"Detected errors :\",\n \"LEFT_LNG\": \"West\",\n \"RIGHT_LNG\": \"East\",\n \"TOP_LAT\": \"North\",\n \"BOTTOM_LAT\": \"South\",\n \"SCALE\": \"Scale\",\n \"TRANSLATE_X\": \"Translate X\",\n \"TRANSLATE_Y\": \"Translate Y\",\n \"AREA_FORM_DIVIDER\": \"Area edit:\",\n \"ID\": \"Unique identifier\",\n \"NAME\": \"Label\",\n \"POSITION_DOTS\": \"Position:\",\n \"ORDER\": \"Sort order\",\n \"BTN_APPLY\": \"Apply\",\n \"BTN_DELETE\": \"Delete the area\",\n \"CUSTOM_PROJECTION\": \"Manually set projection settings\",\n \"BTN_TEST_SEARCH\": \"Test a search on this area\",\n \"STRICT_MODE\": \"Compatible with OCG (hand right rule)\",\n \"REMOVE_HOLE\": \"Remove holes inside polygons\",\n \"APPLY_ROUND\": \"Round to precision:\",\n \"DEGREES_PRECISION\": \"Precision (decimal degrees)\",\n \"INFO\": {\n \"SAVED\": \"The map has been saved\"\n },\n \"ERROR\": {\n \"INVALID_SVG\": \"Bad SVG format.\",\n \"INVALID_COUNTRY_CODE\": \"Country code (need ISO2, in lower case)\",\n \"SAVE_FAILED\": \"Error while saving map\",\n \"SELF_INTERSECTION\": \"Self-intersection in polygon <b>{{id}}</b>\",\n \"HOLE_LIES_OUTSIDE\": \"Hole lies outside shell <b>{{id}}</b>\",\n \"HOLE_NOT_WITHIN_POLYGON\": \"Invalid hole (not within polygon) <b>{{id}}</b>\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Map\",\n \"BTN_MAP_HELP\": \"Open map\"\n },\n \"VIEW\": {\n \"TITLE\": \"Members map\",\n \"LAYER\": {\n \"MEMBER\": \"Members\",\n \"PENDING\": \"Pending registrations\",\n \"WALLET\": \"Simple wallets\"\n }\n }\n },\n \"PROFILE\": {\n \"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.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Unable to retrieve your current position\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"eo-EO\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Traserĉi...\",\n \"BTN_SHOW_ON_MAP\": \"Vidi surmape\",\n \"BTN_LOCALIZE_ME\": \"Lokalizi min\",\n \"BTN_MOVE_DOWN\": \"Movi malsupren\",\n \"BTN_MOVE_UP\": \"Movi supren\",\n \"BTN_MOVE_LEFT\": \"Movi maldekstren\",\n \"BTN_MOVE_RIGHT\": \"Movi dekstren\",\n \"CHOOSE_FILE\": \"Ŝovmetu vian dosieron (svg, geojson)<br/>aŭ klaku por elekti ĝin\"\n },\n \"SHAPE\": {\n \"EDIT\": {\n \"TITLE\": \"Landaj mapoj\",\n \"COUNTRY_DOTS\": \"Lando:\",\n \"COUNTRY_HELP\": \"Lando-kodo (ISO2)\",\n \"CONFIG_FORM_DIVIDER\": \"Agordo:\",\n \"ERROR_DIVIDER\": \"Eraroj eltrovitaj:\",\n \"LEFT_LNG\": \"Okcidento\",\n \"RIGHT_LNG\": \"Oriento\",\n \"TOP_LAT\": \"Nordo\",\n \"BOTTOM_LAT\": \"Sudo\",\n \"SCALE\": \"Skalo\",\n \"TRANSLATE_X\": \"X-delokiĝo\",\n \"TRANSLATE_Y\": \"Y-delokiĝo\",\n \"AREA_FORM_DIVIDER\": \"Eldono de la zono:\",\n \"ID\": \"Unika identigilo\",\n \"NAME\": \"Nomo\",\n \"POSITION_DOTS\": \"Pozicio:\",\n \"ORDER\": \"Ordigo-senco\",\n \"BTN_APPLY\": \"Apliki\",\n \"BTN_DELETE\": \"Forigi la zonon\",\n \"CUSTOM_PROJECTION\": \"Mana tajpado de la projekci-parametroj\",\n \"BTN_TEST_SEARCH\": \"Testi serĉadon sur tiu ĉi zono\",\n \"STRICT_MODE\": \"OCG-kongrueco (regulo de dekstra mano)\",\n \"REMOVE_HOLE\": \"Forigi la truojn interne de la poligonoj\",\n \"APPLY_ROUND\": \"Rondigi ĝis la precizeco:\",\n \"DEGREES_PRECISION\": \"Precizeco (decimalaj gradoj)\",\n \"INFO\": {\n \"SAVED\": \"La mapo estis bone konservita\"\n },\n \"ERROR\": {\n \"INVALID_SVG\": \"SVG-Formato neĝusta\",\n \"INVALID_COUNTRY_CODE\": \"Lando-kodo neĝusta (ISO2 atendata, minuskle)\",\n \"SAVE_FAILED\": \"Eraro dum la konservado de la mapo\",\n \"SELF_INTERSECTION\": \"Mem-interkruciĝo en la poligono <b>{{id}}</b>\",\n \"HOLE_LIES_OUTSIDE\": \"La truo troviĝas ekter la poligono <b>{{id}}</b>\",\n \"HOLE_NOT_WITHIN_POLYGON\": \"Truo nevalida (ne en poligono) <b>{{id}}</b>\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Mapo\",\n \"BTN_MAP_HELP\": \"Malfermi la mapon pri membroj\"\n },\n \"VIEW\": {\n \"TITLE\": \"Mapo pri membroj\",\n \"LAYER\": {\n \"MEMBER\": \"Membroj\",\n \"PENDING\": \"Aliĝoj atendantaj\",\n \"WALLET\": \"Simplaj monujoj\"\n }\n }\n },\n \"PROFILE\": {\n \"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.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Neeblas ricevi vian nunan lokon\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"fr-FR\", {\n \"MAP\": {\n \"COMMON\": {\n \"SEARCH_DOTS\": \"Rechercher...\",\n \"BTN_SHOW_ON_MAP\": \"Voir sur la carte\",\n \"BTN_LOCALIZE_ME\": \"Me localiser\",\n \"BTN_MOVE_DOWN\": \"Déplacer vers le bas\",\n \"BTN_MOVE_UP\": \"Déplacer vers le haut\",\n \"BTN_MOVE_LEFT\": \"Déplacer vers la gauche\",\n \"BTN_MOVE_RIGHT\": \"Déplacer vers la droite\",\n \"CHOOSE_FILE\": \"Déposez votre fichier (svg, geojson)<br/>ou cliquez pour le sélectionner\"\n },\n \"SHAPE\": {\n \"EDIT\": {\n \"TITLE\": \"Cartes des pays\",\n \"COUNTRY_DOTS\": \"Pays :\",\n \"COUNTRY_HELP\": \"Code pays (ISO2)\",\n \"CONFIG_FORM_DIVIDER\": \"Configuration :\",\n \"ERROR_DIVIDER\": \"Erreurs dectectées :\",\n \"LEFT_LNG\": \"Ouest\",\n \"RIGHT_LNG\": \"Est\",\n \"TOP_LAT\": \"Nord\",\n \"BOTTOM_LAT\": \"Sud\",\n \"SCALE\": \"Echelle\",\n \"TRANSLATE_X\": \"Décalage X\",\n \"TRANSLATE_Y\": \"Décalage Y\",\n \"AREA_FORM_DIVIDER\": \"Edition de la zone :\",\n \"ID\": \"Identifiant unique\",\n \"NAME\": \"Libellé\",\n \"POSITION_DOTS\": \"Position :\",\n \"ORDER\": \"Ordre de tri\",\n \"BTN_APPLY\": \"Appliquer\",\n \"BTN_DELETE\": \"Supprimer la zone\",\n \"CUSTOM_PROJECTION\": \"Saisie manuelle des paramètres de projection\",\n \"BTN_TEST_SEARCH\": \"Tester une recherche sur cette zone\",\n \"STRICT_MODE\": \"Compatibilité OCG (right-hand rule)\",\n \"REMOVE_HOLE\": \"Supprimer les trous intérieurs aux polygones\",\n \"APPLY_ROUND\": \"Arrondir à la précision :\",\n \"DEGREES_PRECISION\": \"Précision (degrés décimaux)\",\n \"INFO\": {\n \"SAVED\": \"La carte a bien été sauvegardée\"\n },\n \"ERROR\": {\n \"INVALID_SVG\": \"Format SVG incorrect\",\n \"INVALID_COUNTRY_CODE\": \"Code pays incorrect (ISO2 attendu, en minuscule)\",\n \"SAVE_FAILED\": \"Erreur lors de la sauvegarde de la carte\",\n \"SELF_INTERSECTION\": \"Auto-intersection dans le polygone <b>{{id}}</b>\",\n \"HOLE_LIES_OUTSIDE\": \"Le trou se trouve à l'extérieur du polygone <b>{{id}}</b>\",\n \"HOLE_NOT_WITHIN_POLYGON\": \"Trou invalide (pas dans un polygone) <b>{{id}}</b>\"\n }\n }\n },\n \"WOT\": {\n \"LOOKUP\": {\n \"BTN_MAP\": \"Carte\",\n \"BTN_MAP_HELP\": \"Ouvrir la carte des membres\"\n },\n \"VIEW\": {\n \"TITLE\": \"Carte des membres\",\n \"LAYER\": {\n \"MEMBER\": \"Membres\",\n \"PENDING\": \"Inscriptions en attente\",\n \"WALLET\": \"Simples portefeuilles\"\n }\n }\n },\n \"PROFILE\": {\n \"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.\"\n },\n \"ERROR\": {\n \"LOCALIZE_ME_FAILED\": \"Impossible de récupérer votre position actuelle\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"en-GB\", {\n \"MENU\": {\n \"MARKET\": \"Ads\",\n \"MY_RECORDS\": \"My ads\"\n },\n \"MARKET\": {\n \"COMMON\": {\n \"PRICE\": \"Price\",\n \"BTN_NEW_AD\": \"New ad\",\n \"SOLD\": \"Close ad\",\n \"LAST_UPDATE\": \"Last update\",\n \"AROUND_ME\": \"Around me\",\n \"CROWDFUNDING_PROGRESS\": \"{{pct|formatInteger}}% funded\",\n \"FREE\": \"Free\",\n \"FREE_PRICE\": \"Free price\"\n },\n \"JOIN\": {\n \"PROFILE\": {\n \"WARNING\": \"You now have to complete your user profile.<br/><br/>This is <b>public information</b>, accessible to everyone.\",\n \"TITLE\": \"Lastname, Firstname\",\n \"TITLE_HELP\": \"Lastname, Firstname or pseudonym\",\n \"DESCRIPTION\": \"Abut me\",\n \"DESCRIPTION_HELP\": \"Say something about you...\"\n },\n \"SUBSCRIPTION\": {\n \"EMAIL\": \"Email\",\n \"EMAIL_HELP\": \"Email (optional)\"\n },\n \"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:\",\n \"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?\"\n },\n \"PROFILE\": {\n \"DEFAULT_TITLE\": \"User {{pubkey|formatPubkey}}\",\n \"IDENTITY_RECORDS_TITLE\": \"User ads\"\n },\n \"LOGIN\": {\n \"HELP\": \"Please fill your account credentials:\",\n \"REMEMBER_ME\": \"Remember me?\"\n },\n \"EVENT_LOGIN\": {\n \"TITLE\": \"Contact information\",\n \"HELP\": \"Please indicate a <b>email or phone number</b>, so that we can contact you during the event:\",\n \"EMAIL_OR_PHONE\": \"Email or phone number\",\n \"EMAIL_OR_PHONE_HELP\": \"Email or phone number\",\n \"REMEMBER_ME\": \"Remember me?\",\n \"ERROR\": {\n \"INVALID_USERNAME\": \"Email or phone number invalid\"\n }\n },\n \"HOME\": {\n \"BTN_NEW_AD\": \"Place an ad\",\n \"BTN_SHOW_MARKET_OFFER\": \"Explore Ads\",\n \"LOCATION_LABEL\": \"Find ads near by:\",\n \"LOCATION_HELP\": \"City, Country\",\n \"ERROR\": {\n \"GEO_LOCATION_NOT_FOUND\": \"City or zip code not found\"\n }\n },\n \"CATEGORY\": {\n \"ALL\": \"All categories\",\n \"UNKNOWN\": \"Unlnown category\",\n \"EDIT\": {\n \"TITLE\": \"Categories management\",\n \"ID\": \"Identifier\",\n \"NAME\": \"Name\",\n \"ROOT_CATEGORIES\": \"Root categories\",\n \"BTN_ADD\": \"Add\",\n \"BTN_REORDER\": \"Reorder\",\n \"POPUP\": {\n \"TITLE_EDIT\": \"Edit the category\",\n \"TITLE_NEW\": \"New category\"\n },\n \"CONFIRM\": {\n \"CANCEL\": \"Some changes has not been saved.<br/><br/><b>Are you sure</b> you want to continue this operation?\"\n },\n \"INFO\": {\n \"SAVED\": \"Categories successfully saved\"\n },\n \"ERROR\": {\n \"CANNOT_SAVE\": \"Erreur lors de la sauvegarde des categories\",\n \"INVALID_ID_PATTERN\": \"Format 'catNNN' not respected\",\n \"ID_ALREADY_USED\": \"Identifier already in use\"\n }\n }\n },\n \"SEARCH\": {\n \"TITLE\": \"Market\",\n \"CATEGORY\": \"Category: \",\n \"SEARCH_HELP\": \"Search (car, sweat...)\",\n \"BY\": \"by\",\n \"BTN_ADD\": \"New\",\n \"BTN_CATEGORIES\": \"Categories\",\n \"BTN_OPTIONS\": \"Advanced search\",\n \"BTN_AROUND_ME\": \"Around me\",\n \"GEO_DISTANCE\": \"Maximum distance around the city\",\n \"GEO_DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit to {{limit}})\",\n \"LOCATION\": \"City\",\n \"LOCATION_HELP\": \"City, Country\",\n \"RESULTS\": \"Results\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} result{{count>0?'s':''}}, near {{location}}\",\n \"RESULT_COUNT\": \"{{count}} result{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Recent ads:\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} recent ad{{count>0?'s':''}}, near {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} recent ad{{count>0?'s':''}}\",\n \"BTN_LAST_RECORDS\": \"Recent ads\",\n \"BTN_SHOW_CATEGORIES\": \"Show categories\",\n \"BTN_OFFERS\": \"Offers\",\n \"BTN_CROWDFUNDING\": \"Crowdfunding\",\n \"BTN_FAVORITES\": \"Favorites\",\n \"BTN_AUCTION\": \"Auction\",\n \"BTN_NEEDS\": \"Needs\",\n \"SHOW_CLOSED_RECORD\": \"Display closed ads?\",\n \"SHOW_OLD_RECORD\": \"Display old ads?\",\n \"RECORD_STOCK\": \"Stock:\",\n \"SORT\": {\n \"PREFIX\": \"Sort: \",\n \"DATE\": \"Date\",\n \"PRICE\": \"Price\",\n \"DATE_ASC\": \"Older\",\n \"DATE_DESC\": \"Most recent\",\n \"PRICE_ASC\": \"Increasing prices\",\n \"PRICE_DESC\": \"Descending prices\"\n }\n },\n \"GALLERY\": {\n \"TITLE\": \"Slideshow\",\n \"BTN_START\": \"Start\",\n \"BTN_CONTINUE\": \"Resume\",\n \"BTN_PAUSE\": \"Pause\",\n \"BTN_STOP\": \"Stop\",\n \"SLIDE_DURATION\": \"Display time:\",\n \"AD_TYPE\": \"Ad type:\",\n \"ALL_AD_TYPES\": \"All\",\n \"SLIDE_DURATION_OPTION\": \"{{value}} seconds\"\n },\n \"VIEW\": {\n \"TITLE\": \"Ad\",\n \"BTN_SOLD_AD\": \"Close the ad\",\n \"BTN_SOLD\": \"Close\",\n \"BTN_REOPEN\": \"Reopen the ad\",\n \"BTN_WRITE\": \"Write a message\",\n \"BTN_FOLLOW\": \"Follow this ad\",\n \"BTN_STOP_FOLLOW\": \"Stop following this ad\",\n \"BTN_PAYMENT_HELP\": \"How to make a payment?\",\n \"MENU_TITLE\": \"Options\",\n \"RECORD_FEES_PARENTHESIS\": \"(fees)\",\n \"RECORD_STOCK\": \"Available stock:\",\n \"POPOVER_SHARE_TITLE\": \"Ad {{title}}\",\n \"REMOVE_CONFIRMATION\": \"Are you sure you want to delete this ad?<br/><br/> This is irreversible.\",\n \"SOLD_CONFIRMATION\" : \"<b>Are you sure</b> you want to close this ad?\",\n \"REOPEN_CONFIRMATION\" : \"<b>Are you sure</b> you want to repoen this ad?\",\n \"NEW_MESSAGE_TITLE\": \"About your ad \\\"{{title}}\\\"...\",\n \"MORE_LIKE_THIS\": \"This might interest you:\",\n \"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>\",\n \"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>\",\n \"CROWDFUNDING_ISSUERS\": \"{{issuers.length}} donor{{issuers.length > 1 ? 's' : ''}}\",\n \"SHOW_CROWDFUNDING_ISSUERS\": \"Show donors\"\n },\n \"WALLET\": {\n \"DUNITER_PUBKEY\": \"Public key to receive payments\",\n \"DUNITER_ACCOUNT\": \"Receipt of payments in {{currency|currencySymbol}}\",\n \"DUNITER_ACCOUNT_HELP\": \"The public key (above) indicates the destination of the payments you will receive.\",\n \"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>.\"\n },\n \"TYPE\": {\n \"TITLE\": \"New ad\",\n \"SELECT_TYPE\": \"Kind of ad:\",\n \"OFFER\": \"Offer\",\n \"OFFER_SHORT\": \"Offer\",\n \"CROWDFUNDING\": \"Crowdfunding\",\n \"CROWDFUNDING_SHORT\": \"Crowdfunding\",\n \"NEED\": \"Need\",\n \"NEED_SHORT\": \"Need\",\n \"AUCTION\": \"Auction\",\n \"AUCTION_SHORT\": \"Auction\"\n },\n \"LOCAL_SALE\": {\n \"LOCATION\": \"Stand number\",\n \"LOCATION_HELP\": \"Stand number: 1, 2, ...\",\n \"LOCATION_PREFIX\": \"Stand #\"\n },\n \"EDIT\": {\n \"TITLE\": \"Edit\",\n \"RECORD_TITLE\": \"Title\",\n \"RECORD_TITLE_HELP\": \"Title\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Description\",\n \"RECORD_LOCATION\": \"Address\",\n \"RECORD_LOCATION_HELP\": \"City, Country\",\n \"RECORD_PRICE\": \"Price\",\n \"RECORD_PRICE_HELP\": \"Price (optional)\",\n \"FREE_PRICE\": \"Free price ?\",\n \"RECORD_CURRENCY\": \"Currency\",\n \"RECORD_FEES\": \"Fees\",\n \"RECORD_FEES_HELP\": \"Fees (optional)\",\n \"RECORD_STOCK\": \"Available stock\",\n \"RECORD_STOCK_HELP\": \"Available stock\",\n \"AUCTION\": {\n \"TITLE_NEW\": \"New auction\",\n \"START_PRICE_HELP\": \"Starting price (optional)\"\n },\n \"OFFER\": {\n \"TITLE_NEW\": \"New ad\"\n },\n \"NEED\": {\n \"TITLE_NEW\": \"Nouvelle demande\",\n \"MAX_PRICE_HELP\": \"Prix maximum (optionnel)\"\n },\n \"CROWDFUNDING\": {\n \"TITLE_NEW\": \"New crowdfunding campaign\",\n \"TITLE_HELP\": \"Campaign title\",\n \"DESCRIPTION_HELP\": \"Description: Describe your project here\",\n \"PRICE_HELP\": \"Expected amount\"\n },\n \"WARNING\": {\n \"NO_GEO_POINT\": \"Your ad <b>will not be visible</b> in spatial searches.\"\n }\n },\n \"WOT\": {\n \"VIEW\": {\n \"BTN_RECORDS\": \"Ads\",\n \"DUNITER_PUBKEY\": \"Public key to receive payments\",\n \"DUNITER_ACCOUNT\": \"Receipt of payments in {{currency|currencySymbol}}\",\n \"DUNITER_ACCOUNT_HELP\": \"The public key (above) is the account to be used to pay for this user.\",\n \"DUNITER_ACCOUNT_HELP_ASK_USER\": \"This user has not communicated their account public key. <a ng-click=\\\"showNewMessageModal()\\\">Contact him</a> to get it.\"\n },\n \"ERROR\": {\n \"FAILED_STAR_PROFILE\": \"Error sending your rate. Please try again later.\"\n }\n },\n \"PAYMENT\": {\n \"MODAL\": {\n \"TITLE\": \"Make a payment\",\n \"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>\",\n \"PAYMENT_LINK_HELP\": \"Payment links (bêta) :\"\n }\n },\n \"ERROR\": {\n \"INVALID_LOGIN_CREDENTIALS\": \"Invalid credentials.<br/>Please try again.\",\n \"FAILED_SAVE_RECORD\": \"Saving ad failed\",\n \"FAILED_UPDATE_RECORD\": \"Updating Ad failed\",\n \"LOAD_CATEGORY_FAILED\": \"Loading categories failed\",\n \"LOOKUP_RECORDS_FAILED\": \"Error while loading records.\",\n \"LOAD_RECORD_FAILED\": \"Loading ad failed\",\n \"REMOVE_RECORD_FAILED\": \"Deleting ad failed\",\n \"SOLD_RECORD_FAILED\": \"Error while closing the ad\",\n \"REOPEN_RECORD_FAILED\": \"Error while reopening the ad\",\n \"FAILED_SAVE_COMMENT\": \"Saving comment failed\",\n \"FAILED_REMOVE_COMMENT\": \"Deleting comment failed\",\n \"RECORD_NOT_EXISTS\": \"Ad not found\",\n \"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.\",\n \"GEO_LOCATION_NOT_FOUND\": \"City or zip code not found\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\": \"Ad successfully deleted\",\n \"RECORD_SOLD\" : \"Ad closed\",\n \"RECORD_REOPEN\" : \"Ad reopen\"\n }\n },\n \"EVENT\": {\n \"MARKET\": {\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has commented on your ad: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has modified his/her comment on your ad: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has replied to your comment on the ad: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has modified his/her answer to your comment on the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has commented on the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has modified his/her comment on the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> added the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> updated the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_CLOSE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> sold the ad: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> posted an ad to moderate: <b>{{params[2]}}</b>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span>reported abuse on your ad: <b>{{params[2]}}</b>\",\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> liked your ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> follows your ad: <b>{{params[2]}}</b>\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"en\", {\n \"MENU\": {\n \"MARKET\": \"Ads\",\n \"MY_RECORDS\": \"My ads\"\n },\n \"MARKET\": {\n \"COMMON\": {\n \"PRICE\": \"Price\",\n \"BTN_NEW_AD\": \"New ad\",\n \"SOLD\": \"Close ad\",\n \"LAST_UPDATE\": \"Last update\",\n \"AROUND_ME\": \"Around me\",\n \"CROWDFUNDING_PROGRESS\": \"{{pct|formatInteger}}% funded\",\n \"FREE\": \"Free\",\n \"FREE_PRICE\": \"Free price\"\n },\n \"JOIN\": {\n \"PROFILE\": {\n \"WARNING\": \"You now have to complete your user profile.<br/><br/>This is <b>public information</b>, accessible to everyone.\",\n \"TITLE\": \"Lastname, Firstname\",\n \"TITLE_HELP\": \"Lastname, Firstname or pseudonym\",\n \"DESCRIPTION\": \"Abut me\",\n \"DESCRIPTION_HELP\": \"Say something about you...\"\n },\n \"SUBSCRIPTION\": {\n \"EMAIL\": \"Email\",\n \"EMAIL_HELP\": \"Email (optional)\"\n },\n \"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:\",\n \"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?\"\n },\n \"PROFILE\": {\n \"DEFAULT_TITLE\": \"User {{pubkey|formatPubkey}}\",\n \"IDENTITY_RECORDS_TITLE\": \"User ads\"\n },\n \"LOGIN\": {\n \"HELP\": \"Please fill your account credentials:\",\n \"REMEMBER_ME\": \"Remember me?\"\n },\n \"EVENT_LOGIN\": {\n \"TITLE\": \"Contact information\",\n \"HELP\": \"Please indicate a <b>email or phone number</b>, so that we can contact you during the event:\",\n \"EMAIL_OR_PHONE\": \"Email or phone number\",\n \"EMAIL_OR_PHONE_HELP\": \"Email or phone number\",\n \"REMEMBER_ME\": \"Remember me?\",\n \"ERROR\": {\n \"INVALID_USERNAME\": \"Email or phone number invalid\"\n }\n },\n \"HOME\": {\n \"BTN_NEW_AD\": \"Place an ad\",\n \"BTN_SHOW_MARKET_OFFER\": \"Explore Ads\",\n \"LOCATION_LABEL\": \"Find ads near by:\",\n \"LOCATION_HELP\": \"City, Country\",\n \"ERROR\": {\n \"GEO_LOCATION_NOT_FOUND\": \"City or zip code not found\"\n }\n },\n \"CATEGORY\": {\n \"ALL\": \"All categories\",\n \"UNKNOWN\": \"Unlnown category\",\n \"EDIT\": {\n \"TITLE\": \"Categories management\",\n \"ID\": \"Identifier\",\n \"NAME\": \"Name\",\n \"ROOT_CATEGORIES\": \"Root categories\",\n \"BTN_ADD\": \"Add\",\n \"BTN_REORDER\": \"Reorder\",\n \"POPUP\": {\n \"TITLE_EDIT\": \"Edit the category\",\n \"TITLE_NEW\": \"New category\"\n },\n \"CONFIRM\": {\n \"CANCEL\": \"Some changes has not been saved.<br/><br/><b>Are you sure</b> you want to continue this operation?\"\n },\n \"INFO\": {\n \"SAVED\": \"Categories successfully saved\"\n },\n \"ERROR\": {\n \"CANNOT_SAVE\": \"Erreur lors de la sauvegarde des categories\",\n \"INVALID_ID_PATTERN\": \"Format 'catNNN' not respected\",\n \"ID_ALREADY_USED\": \"Identifier already in use\"\n }\n }\n },\n \"SEARCH\": {\n \"TITLE\": \"Market\",\n \"CATEGORY\": \"Category: \",\n \"SEARCH_HELP\": \"Search (car, sweat...)\",\n \"BY\": \"by\",\n \"BTN_ADD\": \"New\",\n \"BTN_CATEGORIES\": \"Categories\",\n \"BTN_OPTIONS\": \"Advanced search\",\n \"BTN_AROUND_ME\": \"Around me\",\n \"GEO_DISTANCE\": \"Maximum distance around the city\",\n \"GEO_DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SHOW_MORE\": \"Show more\",\n \"SHOW_MORE_COUNT\": \"(current limit to {{limit}})\",\n \"LOCATION\": \"City\",\n \"LOCATION_HELP\": \"City, Country\",\n \"RESULTS\": \"Results\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} result{{count>0?'s':''}}, near {{location}}\",\n \"RESULT_COUNT\": \"{{count}} result{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Recent ads:\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} recent ad{{count>0?'s':''}}, near {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} recent ad{{count>0?'s':''}}\",\n \"BTN_LAST_RECORDS\": \"Recent ads\",\n \"BTN_SHOW_CATEGORIES\": \"Show categories\",\n \"BTN_OFFERS\": \"Offers\",\n \"BTN_CROWDFUNDING\": \"Crowdfunding\",\n \"BTN_FAVORITES\": \"Favorites\",\n \"BTN_AUCTION\": \"Auction\",\n \"BTN_NEEDS\": \"Needs\",\n \"SHOW_CLOSED_RECORD\": \"Display closed ads?\",\n \"SHOW_OLD_RECORD\": \"Display old ads?\",\n \"RECORD_STOCK\": \"Stock:\",\n \"SORT\": {\n \"PREFIX\": \"Sort: \",\n \"DATE\": \"Date\",\n \"PRICE\": \"Price\",\n \"DATE_ASC\": \"Older\",\n \"DATE_DESC\": \"Most recent\",\n \"PRICE_ASC\": \"Increasing prices\",\n \"PRICE_DESC\": \"Descending prices\"\n }\n },\n \"GALLERY\": {\n \"TITLE\": \"Slideshow\",\n \"BTN_START\": \"Start\",\n \"BTN_CONTINUE\": \"Resume\",\n \"BTN_PAUSE\": \"Pause\",\n \"BTN_STOP\": \"Stop\",\n \"SLIDE_DURATION\": \"Display time:\",\n \"AD_TYPE\": \"Ad type:\",\n \"ALL_AD_TYPES\": \"All\",\n \"SLIDE_DURATION_OPTION\": \"{{value}} seconds\"\n },\n \"VIEW\": {\n \"TITLE\": \"Ad\",\n \"BTN_SOLD_AD\": \"Close the ad\",\n \"BTN_SOLD\": \"Close\",\n \"BTN_REOPEN\": \"Reopen the ad\",\n \"BTN_WRITE\": \"Write a message\",\n \"BTN_FOLLOW\": \"Follow this ad\",\n \"BTN_STOP_FOLLOW\": \"Stop following this ad\",\n \"BTN_PAYMENT_HELP\": \"How to make a payment?\",\n \"MENU_TITLE\": \"Options\",\n \"RECORD_FEES_PARENTHESIS\": \"(fees)\",\n \"RECORD_STOCK\": \"Available stock:\",\n \"POPOVER_SHARE_TITLE\": \"Ad {{title}}\",\n \"REMOVE_CONFIRMATION\": \"Are you sure you want to delete this ad?<br/><br/> This is irreversible.\",\n \"SOLD_CONFIRMATION\" : \"<b>Are you sure</b> you want to close this ad?\",\n \"REOPEN_CONFIRMATION\" : \"<b>Are you sure</b> you want to repoen this ad?\",\n \"NEW_MESSAGE_TITLE\": \"About your ad \\\"{{title}}\\\"...\",\n \"MORE_LIKE_THIS\": \"This might interest you:\",\n \"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>\",\n \"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>\",\n \"CROWDFUNDING_ISSUERS\": \"{{issuers.length}} donor{{issuers.length > 1 ? 's' : ''}}\",\n \"SHOW_CROWDFUNDING_ISSUERS\": \"Show donors\"\n },\n \"WALLET\": {\n \"DUNITER_PUBKEY\": \"Public key to receive payments\",\n \"DUNITER_ACCOUNT\": \"Receipt of payments in {{currency|currencySymbol}}\",\n \"DUNITER_ACCOUNT_HELP\": \"The public key (above) indicates the destination of the payments you will receive.\",\n \"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>.\"\n },\n \"TYPE\": {\n \"TITLE\": \"New ad\",\n \"SELECT_TYPE\": \"Kind of ad:\",\n \"OFFER\": \"Offer\",\n \"OFFER_SHORT\": \"Offer\",\n \"CROWDFUNDING\": \"Crowdfunding\",\n \"CROWDFUNDING_SHORT\": \"Crowdfunding\",\n \"NEED\": \"Need\",\n \"NEED_SHORT\": \"Need\",\n \"AUCTION\": \"Auction\",\n \"AUCTION_SHORT\": \"Auction\"\n },\n \"LOCAL_SALE\": {\n \"LOCATION\": \"Stand number\",\n \"LOCATION_HELP\": \"Stand number: 1, 2, ...\",\n \"LOCATION_PREFIX\": \"Stand #\"\n },\n \"EDIT\": {\n \"TITLE\": \"Edit\",\n \"RECORD_TITLE\": \"Title\",\n \"RECORD_TITLE_HELP\": \"Title\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Description\",\n \"RECORD_LOCATION\": \"Address\",\n \"RECORD_LOCATION_HELP\": \"City, Country\",\n \"RECORD_PRICE\": \"Price\",\n \"RECORD_PRICE_HELP\": \"Price (optional)\",\n \"FREE_PRICE\": \"Free price ?\",\n \"RECORD_CURRENCY\": \"Currency\",\n \"RECORD_FEES\": \"Fees\",\n \"RECORD_FEES_HELP\": \"Fees (optional)\",\n \"RECORD_STOCK\": \"Available stock\",\n \"RECORD_STOCK_HELP\": \"Available stock\",\n \"AUCTION\": {\n \"TITLE_NEW\": \"New auction\",\n \"START_PRICE_HELP\": \"Starting price (optional)\"\n },\n \"OFFER\": {\n \"TITLE_NEW\": \"New ad\"\n },\n \"NEED\": {\n \"TITLE_NEW\": \"Nouvelle demande\",\n \"MAX_PRICE_HELP\": \"Prix maximum (optionnel)\"\n },\n \"CROWDFUNDING\": {\n \"TITLE_NEW\": \"New crowdfunding campaign\",\n \"TITLE_HELP\": \"Campaign title\",\n \"DESCRIPTION_HELP\": \"Description: Describe your project here\",\n \"PRICE_HELP\": \"Expected amount\"\n },\n \"WARNING\": {\n \"NO_GEO_POINT\": \"Your ad <b>will not be visible</b> in spatial searches.\"\n }\n },\n \"WOT\": {\n \"VIEW\": {\n \"BTN_RECORDS\": \"Ads\",\n \"DUNITER_PUBKEY\": \"Public key to receive payments\",\n \"DUNITER_ACCOUNT\": \"Receipt of payments in {{currency|currencySymbol}}\",\n \"DUNITER_ACCOUNT_HELP\": \"The public key (above) is the account to be used to pay for this user.\",\n \"DUNITER_ACCOUNT_HELP_ASK_USER\": \"This user has not communicated their account public key. <a ng-click=\\\"showNewMessageModal()\\\">Contact him</a> to get it.\"\n },\n \"ERROR\": {\n \"FAILED_STAR_PROFILE\": \"Error sending your rate. Please try again later.\"\n }\n },\n \"PAYMENT\": {\n \"MODAL\": {\n \"TITLE\": \"Make a payment\",\n \"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>\",\n \"PAYMENT_LINK_HELP\": \"Payment links (bêta) :\"\n }\n },\n \"ERROR\": {\n \"INVALID_LOGIN_CREDENTIALS\": \"Invalid credentials.<br/>Please try again.\",\n \"FAILED_SAVE_RECORD\": \"Saving ad failed\",\n \"FAILED_UPDATE_RECORD\": \"Updating Ad failed\",\n \"LOAD_CATEGORY_FAILED\": \"Loading categories failed\",\n \"LOOKUP_RECORDS_FAILED\": \"Error while loading records.\",\n \"LOAD_RECORD_FAILED\": \"Loading ad failed\",\n \"REMOVE_RECORD_FAILED\": \"Deleting ad failed\",\n \"SOLD_RECORD_FAILED\": \"Error while closing the ad\",\n \"REOPEN_RECORD_FAILED\": \"Error while reopening the ad\",\n \"FAILED_SAVE_COMMENT\": \"Saving comment failed\",\n \"FAILED_REMOVE_COMMENT\": \"Deleting comment failed\",\n \"RECORD_NOT_EXISTS\": \"Ad not found\",\n \"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.\",\n \"GEO_LOCATION_NOT_FOUND\": \"City or zip code not found\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\": \"Ad successfully deleted\",\n \"RECORD_SOLD\" : \"Ad closed\",\n \"RECORD_REOPEN\" : \"Ad reopen\"\n }\n },\n \"EVENT\": {\n \"MARKET\": {\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has commented on your ad: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has modified his/her comment on your ad: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has replied to your comment on the ad: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has modified his/her answer to your comment on the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has commented on the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> has modified his/her comment on the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> added the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> updated the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_CLOSE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> sold the ad: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> posted an ad to moderate: <b>{{params[2]}}</b>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span>reported abuse on your ad: <b>{{params[2]}}</b>\",\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> liked your ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> follows your ad: <b>{{params[2]}}</b>\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"eo-EO\", {\n \"MENU\": {\n \"MARKET\": \"Anoncoj\",\n \"MY_RECORDS\": \"Miaj anoncoj\"\n },\n \"MARKET\": {\n \"COMMON\": {\n \"PRICE\": \"Prezo\",\n \"BTN_NEW_AD\": \"Mi metas anoncon\",\n \"SOLD\": \"Anonco fermita\",\n \"LAST_UPDATE\": \"Lasta ĝisdatigo\",\n \"AROUND_ME\": \"Ĉirkaŭ mi\",\n \"CROWDFUNDING_PROGRESS\": \"Financita ĝis {{pct|formatInteger}} %\",\n \"FREE\": \"Senpaga\",\n \"FREE_PRICE\": \"Prezo libera\"\n },\n \"JOIN\": {\n \"PROFILE\": {\n \"WARNING\": \"Nun restas al vi kompletigi vian uzant-profilon.<br/><br/>Temas pri <b>publikaj informoj</b>, alireblaj de ĉiuj.\",\n \"TITLE\": \"Familia nomo, Persona nomo\",\n \"TITLE_HELP\": \"Familia nomo, Persona nomo aŭ pseŭdonimo\",\n \"DESCRIPTION\": \"Pri mi\",\n \"DESCRIPTION_HELP\": \"Diru ion pri vi...\"\n },\n \"SUBSCRIPTION\": {\n \"EMAIL\": \"Retadreso\",\n \"EMAIL_HELP\": \"Retadreso (nedeviga)\"\n },\n \"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!\",\n \"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?\"\n },\n \"PROFILE\": {\n \"DEFAULT_TITLE\": \"Uzanto {{pubkey|formatPubkey}}\",\n \"IDENTITY_RECORDS_TITLE\": \"Uzanto-anoncoj\"\n },\n \"LOGIN\": {\n \"HELP\": \"Bonvolu tajpi viajn identigilojn por konektiĝi:\",\n \"REMEMBER_ME\": \"Memori min?\"\n },\n \"EVENT_LOGIN\": {\n \"TITLE\": \"Kontakteblecoj\",\n \"HELP\": \"Bonvolu indiki <b>retadreson aŭ poŝtelefon-numeron</b>, tiel ke la organizantoj povu kontakti vin dum la evento:\",\n \"EMAIL_OR_PHONE\": \"Retadreso aŭ telefono\",\n \"EMAIL_OR_PHONE_HELP\": \"Retadreso aŭ telefon-numero\",\n \"REMEMBER_ME\": \"Memori min?\",\n \"ERROR\": {\n \"INVALID_USERNAME\": \"Retadreso aŭ telefon-numero nevalida\"\n }\n },\n \"HOME\": {\n \"BTN_NEW_AD\": \"Meti anoncon\",\n \"BTN_SHOW_MARKET_OFFER\": \"Vidi la anoncojn\",\n \"LOCATION_LABEL\": \"Serĉado de anoncoj laŭ urbo:\",\n \"LOCATION_HELP\": \"Poŝt-kodo, Urbo\",\n \"ERROR\": {\n \"GEO_LOCATION_NOT_FOUND\": \"Urbo aŭ poŝt-kodo ne trovita\"\n }\n },\n \"CATEGORY\": {\n \"ALL\": \"Ĉiuj kategorioj\",\n \"UNKNOWN\": \"Kategorio nekonata\",\n \"EDIT\": {\n \"TITLE\": \"Mastrumado de la kategorioj\",\n \"ID\": \"Identigilo\",\n \"NAME\": \"Nomo\",\n \"ROOT_CATEGORIES\": \"Supraj kategorioj\",\n \"BTN_ADD\": \"Aldoni\",\n \"BTN_REORDER\": \"Reordigi\",\n \"POPUP\": {\n \"TITLE_EDIT\": \"Modifi la kategorion\",\n \"TITLE_NEW\": \"Nova kategorio\"\n },\n \"CONFIRM\": {\n \"CANCEL\": \"Iuj modifoj ne estis registritaj.<br/><br/><b>Ĉu vi certas</b>, ke vi volas daŭrigi tiun ĉi agon?\"\n },\n \"INFO\": {\n \"SAVED\": \"Kategorioj sukcese registritaj\"\n },\n \"ERROR\": {\n \"CANNOT_SAVE\": \"Eraro dum la konservado de la kategorioj\",\n \"INVALID_ID_PATTERN\": \"Nekonforma al la formato 'catNNN'\",\n \"ID_ALREADY_USED\": \"Identigilo jam uzata\"\n }\n }\n },\n \"SEARCH\": {\n \"TITLE\": \"Anoncoj\",\n \"CATEGORY\": \"Kategorio: \",\n \"SEARCH_HELP\": \"Serĉado (biciklo, ŝuoj...)\",\n \"BY\": \"de\",\n \"BTN_ADD\": \"Nova\",\n \"BTN_CATEGORIES\": \"Kategorioj\",\n \"BTN_OPTIONS\": \"Detala serĉado\",\n \"BTN_AROUND_ME\": \"Ĉirkaŭ mi\",\n \"GEO_DISTANCE\": \"Maksimuma distanco ĉirkaŭ la urbo:\",\n \"GEO_DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SHOW_MORE\": \"Afiŝi pli\",\n \"SHOW_MORE_COUNT\": \"(nuna limo je {{limit}})\",\n \"LOCATION\": \"Urbo\",\n \"LOCATION_HELP\": \"Poŝt-kodo, Urbo\",\n \"RESULTS\": \"Rezultoj\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} rezulto{{count>0?'j':''}}, proksime de {{location}}\",\n \"RESULT_COUNT\": \"{{count}} rezulto{{count>0?'j':''}}\",\n \"LAST_RECORDS\": \"Lastaj anoncoj\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} freŝdata{{count>0?'j':''}} anonco{{count>0?'j':''}}, proksime de {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} freŝdata{{count>0?'j':''}} anonco{{count>0?'j':''}}\",\n \"BTN_LAST_RECORDS\": \"Lastaj anoncoj\",\n \"BTN_SHOW_CATEGORIES\": \"Trarigardi la kategoriojn\",\n \"BTN_OFFERS\": \"Proponoj\",\n \"BTN_CROWDFUNDING\": \"Financadoj\",\n \"BTN_FAVORITES\": \"Preferoj\",\n \"BTN_AUCTION\": \"Aŭkcioj\",\n \"BTN_NEEDS\": \"Petoj\",\n \"SHOW_CLOSED_RECORD\": \"Afiŝi la fermitajn anoncojn?\",\n \"SHOW_OLD_RECORD\": \"Afiŝi la malnovajn anoncojn?\",\n \"RECORD_STOCK\": \"Stoko:\",\n \"SORT\": {\n \"PREFIX\": \"Ordigo: \",\n \"DATE\": \"Dato\",\n \"PRICE\": \"Prezo\",\n \"DATE_ASC\": \"Pli malnovaj\",\n \"DATE_DESC\": \"Pli freŝdataj\",\n \"PRICE_ASC\": \"Kreskantaj prezoj\",\n \"PRICE_DESC\": \"Malkreskantaj prezoj\"\n }\n },\n \"GALLERY\": {\n \"TITLE\": \"Bildaro\",\n \"BTN_START\": \"Komenci\",\n \"BTN_CONTINUE\": \"Malpaŭzi\",\n \"BTN_PAUSE\": \"Paŭzi\",\n \"BTN_STOP\": \"Ĉesi\",\n \"SLIDE_DURATION\": \"Afiŝo-daŭro:\",\n \"AD_TYPE\": \"Anonco-tipo:\",\n \"ALL_AD_TYPES\": \"Ĉiuj\",\n \"SLIDE_DURATION_OPTION\": \"{{value}} sekundoj\"\n },\n \"VIEW\": {\n \"TITLE\": \"Anonco\",\n \"BTN_SOLD_AD\": \"Fermi la anoncon\",\n \"BTN_SOLD\": \"Fermi\",\n \"BTN_REOPEN\": \"Reaperigi la anoncon\",\n \"BTN_WRITE\": \"Skribi mesaĝon\",\n \"BTN_FOLLOW\": \"Sekvi tiun ĉi anoncon\",\n \"BTN_STOP_FOLLOW\": \"Ne plu sekvi tiun ĉi anoncon\",\n \"BTN_PAYMENT_HELP\": \"Kiel fari pagon?\",\n \"MENU_TITLE\": \"Kromeblecoj\",\n \"RECORD_FEES_PARENTHESIS\": \"(kostoj)\",\n \"RECORD_STOCK\": \"Stoko disponebla:\",\n \"POPOVER_SHARE_TITLE\": \"Anonco {{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Ĉu vi certas, ke vi volas forigi tiun ĉi anoncon?<br/><br/>Tiu ago estas neinversigebla.\",\n \"SOLD_CONFIRMATION\" : \"<b>Ĉu vi certas</b>, ke vi volas fermi tiun ĉi anoncon?\",\n \"REOPEN_CONFIRMATION\" : \"<b>Ĉu vi certas</b>, ke vi volas reaperigi tiun ĉi anoncon?\",\n \"NEW_MESSAGE_TITLE\": \"Pri la anonco \\\"{{title}}\\\"...\",\n \"MORE_LIKE_THIS\": \"Tio ĉi povus interesi vin:\",\n \"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>\",\n \"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>\",\n \"CROWDFUNDING_ISSUERS\": \"{{issuers.length}} donacinto{{issuers.length > 1 ? 'j': ''}}\",\n \"SHOW_CROWDFUNDING_ISSUERS\": \"Vidi la donacintojn\"\n },\n \"WALLET\": {\n \"DUNITER_PUBKEY\": \"Publika ŝlosilo por ricevi la pagojn\",\n \"DUNITER_ACCOUNT\": \"Ricevo de la pagoj en {{currency|currencySymbol}}\",\n \"DUNITER_ACCOUNT_HELP\": \"La publika ŝlosilo (ĉi-supre) indikas la celkonton de la pagoj, kiujn vi ricevos.\",\n \"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>.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nova anonco\",\n \"SELECT_TYPE\": \"Tipo de anonco:\",\n \"OFFER\": \"Propono, Vendo\",\n \"OFFER_SHORT\": \"Propono\",\n \"CROWDFUNDING\": \"Multpersona financado\",\n \"CROWDFUNDING_SHORT\": \"Financado\",\n \"NEED\": \"Peto, Serĉo\",\n \"NEED_SHORT\": \"Peto\",\n \"AUCTION\": \"Aŭkcia vendado\",\n \"AUCTION_SHORT\": \"Aŭkcio\"\n },\n \"LOCAL_SALE\": {\n \"LOCATION\": \"Numero de budo\",\n \"LOCATION_HELP\": \"Numero de budo: 1, 2, ...\",\n \"LOCATION_PREFIX\": \"Budo n°\"\n },\n \"EDIT\": {\n \"TITLE\": \"Redaktado\",\n \"RECORD_TITLE\": \"Titolo\",\n \"RECORD_TITLE_HELP\": \"Titolo: biciklo, libro...\",\n \"RECORD_DESCRIPTION\": \"Priskribo\",\n \"RECORD_DESCRIPTION_HELP\": \"Priskribo\",\n \"RECORD_LOCATION\": \"Urbo\",\n \"RECORD_LOCATION_HELP\": \"Poŝt-kodo, Urbo\",\n \"RECORD_PRICE\": \"Prezo\",\n \"RECORD_PRICE_HELP\": \"Prezo (nedeviga)\",\n \"FREE_PRICE\": \"Libera prezo?\",\n \"RECORD_CURRENCY\": \"Mono\",\n \"RECORD_FEES\": \"Sendo-kostoj\",\n \"RECORD_FEES_HELP\": \"Kostoj (nedeviga)\",\n \"RECORD_STOCK\": \"Stoko disponebla\",\n \"RECORD_STOCK_HELP\": \"Stoko disponebla\",\n \"AUCTION\": {\n \"TITLE_NEW\": \"Nova aŭkcio\",\n \"START_PRICE_HELP\": \"Komenca prezo (nedeviga)\"\n },\n \"OFFER\": {\n \"TITLE_NEW\": \"Nova anonco\"\n },\n \"NEED\": {\n \"TITLE_NEW\": \"Nova peto\",\n \"MAX_PRICE_HELP\": \"Maksimuma prezo (nedeviga)\"\n },\n \"CROWDFUNDING\": {\n \"TITLE_NEW\": \"Nova financada kampanjo\",\n \"TITLE_HELP\": \"Titolo de la kampanjo\",\n \"DESCRIPTION_HELP\": \"Priskribo: detaligu vian projekton ĉi tie\",\n \"PRICE_HELP\": \"Sumo dezirata\"\n },\n \"WARNING\": {\n \"NO_GEO_POINT\": \"Via anonco <b>ne estos videbla</b> dum la geografiaj serĉadoj.\"\n }\n },\n \"WOT\": {\n \"VIEW\": {\n \"BTN_RECORDS\": \"Anoncoj\",\n \"DUNITER_PUBKEY\": \"Publika ŝlosilo por ricevi la pagojn\",\n \"DUNITER_ACCOUNT\": \"Ricevo de la pagoj en {{currency|currencySymbol}}\",\n \"DUNITER_ACCOUNT_HELP\": \"La publika ŝlosilo (ĉi-supre) rilatas al la konto uzota por pagi tiun ĉi anoncanton.\",\n \"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.\"\n },\n \"ERROR\": {\n \"FAILED_STAR_PROFILE\": \"Eraro dum la sendo de via noto. Bonvolu reprovi pli poste.\"\n }\n },\n \"PAYMENT\": {\n \"MODAL\": {\n \"TITLE\": \"Fari pagon\",\n \"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>\",\n \"PAYMENT_LINK_HELP\": \"Ligoj por pago (provaĵo):\"\n }\n },\n \"ERROR\": {\n \"INVALID_LOGIN_CREDENTIALS\": \"Identigilo aŭ pasvorto nevalida.<br/><br/>Kontrolu, ke ili ja rilatas al konto <b>kreita ĉe ğchange</b>.\",\n \"FAILED_SAVE_RECORD\": \"Eraro dum la registrado de la anonco\",\n \"FAILED_UPDATE_RECORD\": \"Eraro dum la ĝisdatigo de la anonco\",\n \"LOAD_CATEGORY_FAILED\": \"Eraro dum la ekstarigo de la kategorioj\",\n \"LOOKUP_RECORDS_FAILED\": \"Eraro dum la disvolviĝo de la serĉado\",\n \"LOAD_RECORD_FAILED\": \"Eraro dum la ŝarĝado de la anonco\",\n \"REMOVE_RECORD_FAILED\": \"Eraro dum la forigo de la anonco\",\n \"SOLD_RECORD_FAILED\": \"Eraro dum la fermo de la anonco\",\n \"REOPEN_RECORD_FAILED\": \"Eraro dum la reaperigo de la anonco\",\n \"FAILED_SAVE_COMMENT\": \"Eraro dum la konservo de la komento\",\n \"FAILED_REMOVE_COMMENT\": \"Eraro dum la forigo de la komento\",\n \"RECORD_NOT_EXISTS\": \"Anonco neekzistanta\",\n \"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.\",\n \"GEO_LOCATION_NOT_FOUND\": \"Urbo aŭ post-kodo ne trovita\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Anonco forigita\",\n \"RECORD_SOLD\" : \"Anonco fermita\",\n \"RECORD_REOPEN\" : \"Anonco reaperigita\"\n }\n },\n \"EVENT\": {\n \"MARKET\": {\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> komentis vian anoncon: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> modifis sian komenton ĉe via anonco: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> respondis al via komento ĉe la anonco: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> modifis la respondon al via komento ĉe la anonco: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> komentis la anoncon: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> modifis sian komenton ĉe la anonco: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> aldonis la anoncon: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> modifis la anoncon: <b>{{params[2]}}</b>\",\n \"FOLLOW_CLOSE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> fermis la anoncon: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> atentigis pri anonco moderiginda: <b>{{params[2]}}</b>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> atentigis pri via anonco: <b>{{params[2]}}</b>\",\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ŝatis vian anoncon: <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> sekvas vian anoncon: <b>{{params[2]}}</b>\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"es-ES\", {\n\t\"EVENT\": {\n\t\t\"MARKET\": {\n\t\t\t\"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha reportardo su anuncio : <b>{{params[2]}}</b>\",\n\t\t\t\"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha reportado un anuncio para moderar : <b>{{params[2]}}</b>\",\n\t\t\t\"FOLLOW_CLOSE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha cerrado el anuncio : <b>{{params[2]}}</b>\",\n\t\t\t\"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha añadido el anuncio : <b>{{params[2]}}</b>\",\n\t\t\t\"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha comentado el anuncio : <b>{{params[2]}}</b>\",\n\t\t\t\"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> sigue su anuncio : <b>{{params[2]}}</b>\",\n\t\t\t\"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha modificado el anuncio : <b>{{params[2]}}</b>\",\n\t\t\t\"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha modificado su comentario en el anuncio : <b>{{params[2]}}</b>\",\n\t\t\t\"LIKE_RECEIVED\": \"A <span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> le ha gustado su anuncio : <b>{{params[2]}}</b>\",\n\t\t\t\"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n\t\t\t\"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha comentado su anuncio : <b>{{params[2]}}</b>\",\n\t\t\t\"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha modificado su comentario sobre su anuncio : <b>{{params[2]}}</b>\",\n\t\t\t\"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha contestado a su comentario sobre el anuncio : <b>{{params[2]}}</b>\",\n\t\t\t\"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> ha modificado la repuesta a su comentario sobre el anuncio : <b>{{params[2]}}</b>\"\n\t\t}\n\t},\n\t\"MARKET\": {\n \"CATEGORY\": {\n \"ALL\": \"Todas las categorías\",\n \"EDIT\": {\n \"BTN_ADD\": \"Añadir\",\n \"BTN_REORDER\": \"Reordenar\",\n \"CONFIRM\": {\n \"CANCEL\": \"Las modificaciones no han sido guardadas.<br/><br/>¿<b>Desea</b> continuar con esta operación?\"\n },\n \"ERROR\": {\n \"CANNOT_SAVE\": \"Error al guardar las categorías\",\n \"ID_ALREADY_USED\": \"Identificador ya utilizado\",\n \"INVALID_ID_PATTERN\": \"Formato 'catNNN' no respetado\"\n },\n \"ID\": \"Identificador\",\n \"INFO\": {\n \"SAVED\": \"Categorías guardadas con éxito\"\n },\n \"NAME\": \"Edición\",\n \"POPUP\": {\n \"TITLE_EDIT\": \"Modificar la categoría\",\n \"TITLE_NEW\": \"Nueva categoría\"\n },\n \"ROOT_CATEGORIES\": \"Categorias superiores\",\n \"TITLE\": \"Gestión de las categorias\"\n },\n \"UNKNOWN\": \"Categoriá desconocida\"\n },\n \"COMMON\": {\n \"PRICE\": \"Precio\",\n \"BTN_NEW_AD\": \"Poner un anuncio\",\n \"SOLD\": \"Cerrar anuncio\",\n \"LAST_UPDATE\": \"Última actualización\",\n \"AROUND_ME\": \"Alrededor mío\",\n \"CROWDFUNDING_PROGRESS\": \"Financiado al {{pct|formatInteger}} %\",\n \"FREE\": \"Gratuito\",\n \"FREE_PRICE\": \"Precio libre\"\n },\n \"EDIT\": {\n \"TITLE\": \"Edición\",\n \"RECORD_TITLE\": \"Título\",\n \"RECORD_TITLE_HELP\": \"Título\",\n \"RECORD_DESCRIPTION\": \"Descripción\",\n \"RECORD_DESCRIPTION_HELP\": \"Descripción\",\n \"RECORD_LOCATION\": \"Dirección\",\n \"RECORD_LOCATION_HELP\": \"Ciudad, País\",\n \"RECORD_PRICE\": \"Precio\",\n \"RECORD_PRICE_HELP\": \"Precio (opcional)\",\n \"FREE_PRICE\": \"¿Precio libre?\",\n \"RECORD_CURRENCY\": \"Moneda\",\n \"RECORD_FEES\": \"Gastos de envío\",\n \"RECORD_FEES_HELP\": \"Gastos de envío (opcional)\",\n \"RECORD_STOCK\": \"Stock disponible\",\n \"RECORD_STOCK_HELP\": \"Stock disponible\",\n \"AUCTION\": {\n \"TITLE_NEW\": \"Nueva subasta\",\n \"START_PRICE_HELP\": \"Precio inicial (opcional)\"\n },\n \"OFFER\": {\n \"TITLE_NEW\": \"Anuncio nuevo\"\n },\n \"NEED\": {\n \"TITLE_NEW\": \"Nouvelle demande\",\n \"MAX_PRICE_HELP\": \"Precio máximo (opcional)\"\n },\n \"CROWDFUNDING\": {\n \"TITLE_NEW\": \"Nueva campaña de crowdfunding\",\n \"TITLE_HELP\": \"Título de la campaña\",\n \"DESCRIPTION_HELP\": \"Descripción: Describa su proyecto aquí\",\n \"PRICE_HELP\": \"Cantidad necesitada\"\n },\n \"WARNING\": {\n \"NO_GEO_POINT\": \"Su anuncio <b> no será visible </b> en búsquedas espaciales.\"\n }\n },\n \"ERROR\": {\n \"GEO_LOCATION_NOT_FOUND\": \"Localidad o código postal no encontrados\",\n \"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.\",\n \"INVALID_LOGIN_CREDENTIALS\": \"Identificador o contraseña no válidos.<br/>Por favor, inténtelo de nuevo.\",\n \"FAILED_SAVE_RECORD\": \"Hubo un fallo guardando el anuncio\",\n \"FAILED_UPDATE_RECORD\": \"Fallo durante la actualización del anuncio\",\n \"LOAD_CATEGORY_FAILED\": \"Error cargando las categorías\",\n \"LOOKUP_RECORDS_FAILED\": \"Fallo durante la ejecución de la búsqueda.\",\n \"LOAD_RECORD_FAILED\": \"Fallo durante la carga del anuncio.\",\n \"REMOVE_RECORD_FAILED\": \"Error de la supresión del anuncio\",\n \"SOLD_RECORD_FAILED\": \"Error del cierre del anuncio\",\n \"REOPEN_RECORD_FAILED\": \"Error de la reapertura del anuncio\",\n \"FAILED_SAVE_COMMENT\": \"Fallo mientras se guardaba el comentario\",\n \"FAILED_REMOVE_COMMENT\": \"Fallo durante la supresión del comentario\",\n \"RECORD_NOT_EXISTS\": \"Anuncio inexistente\"\n },\n \"EVENT_LOGIN\": {\n \"EMAIL_OR_PHONE\": \"Correo electrónico o teléfono\",\n \"EMAIL_OR_PHONE_HELP\": \"Correo electrónico o teléfono\",\n \"ERROR\": {\n \"INVALID_USERNAME\": \"Correo electrónico o teléfono no válidos\"\n },\n \"HELP\": \"Introduce un <b>correo electrónico o teléfono</b>, para poder contactarle durante el evento:\",\n \"REMEMBER_ME\": \"Recordarme\",\n \"TITLE\": \"Coordenadas\"\n },\n \"GALLERY\": {\n \"TITLE\": \"Galería\",\n \"BTN_START\": \"Comenzar\",\n \"BTN_CONTINUE\": \"Continuar\",\n \"BTN_PAUSE\": \"Pausar\",\n \"BTN_STOP\": \"Detener\",\n \"SLIDE_DURATION\": \"Duración de visionado :\",\n \"SLIDE_DURATION_OPTION\": \"{{value}} segundos\"\n },\n \"HOME\": {\n \"BTN_NEW_AD\": \"Poner un anuncio\",\n \"BTN_SHOW_MARKET_OFFER\": \"Consultar los anuncios\",\n \"LOCATION_LABEL\": \"Buscar anuncios por localidad :\",\n \"LOCATION_HELP\": \"Código postal, Localidad\",\n \"ERROR\": {\n \"GEO_LOCATION_NOT_FOUND\": \"Localidad o código postal no encontrados\"\n }\n },\n \"INFO\": {\n \"RECORD_REMOVED\": \"Anuncio suprimido\",\n \"RECORD_SOLD\": \"Anuncio cerrado\",\n \"RECORD_REOPEN\": \"Anuncio reabierto\"\n },\n \"JOIN\": {\n \"PROFILE\": {\n \"WARNING\": \"Complete su perfil con <b>información pública</b>, accesible por todo el mundo.\",\n \"TITLE\": \"Nombre, Apellidos\",\n \"TITLE_HELP\": \"Nombre, Apellidos\",\n \"DESCRIPTION\": \"Sobre mí\",\n \"DESCRIPTION_HELP\": \"Escriba algo sobre usted…\"\n },\n \"SUBSCRIPTION\": {\n \"EMAIL\": \"Correo electrónico\",\n \"EMAIL_HELP\": \"Correo electrónico (opcional)\"\n },\n \"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.\",\n \"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?\"\n },\n \"LOCAL_SALE\": {\n \"LOCATION\": \"Número de stand\",\n \"LOCATION_HELP\": \"Número de stand : 1, 2, …\",\n \"LOCATION_PREFIX\": \"Stand n°\"\n },\n \"PAYMENT\": {\n \"MODAL\": {\n \"PAYMENT_LINK_HELP\": \"Enlaces de pago (en beta) :\",\n \"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>\",\n \"TITLE\": \"Hacer un pago\"\n }\n },\n \"LOGIN\": {\n \"HELP\": \"Introduzca sus credenciales de conexión :\",\n \"REMEMBER_ME\": \"Recordar mi sesión\"\n },\n \"PROFILE\": {\n \"DEFAULT_TITLE\": \"Usuario/a {{pubkey|formatPubkey}}\"\n },\n \"SEARCH\": {\n \"GEO_DISTANCE\": \"Distancia máxima desde la localidad :\",\n \"GEO_DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} anuncio{{count>0?'s':''}} reciente{{count>0?'s':''}}\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} anuncio{{count>0?'s':''}} recente{{count>0?'s':''}}, cerca de {{location}}\",\n \"RESULT_COUNT\": \"{{count}} resultado{{count>0?'s':''}}\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} resultado{{count>0?'s':''}}, cerca de {{location}}\",\n \"TITLE\": \"Anuncios\",\n \"CATEGORY\": \"Categoría: \",\n \"SEARCH_HELP\": \"Búsqueda (coche, libro...)\",\n \"BY\": \"por\",\n \"BTN_ADD\": \"Nuevo\",\n \"BTN_OPTIONS\": \"Búsqueda avanzada\",\n \"BTN_AROUND_ME\": \"Alrededor mío\",\n \"SHOW_MORE\": \"Mostrar más\",\n \"SHOW_MORE_COUNT\": \"(mostrar sólo {{limit}})\",\n \"LOCATION\": \"localidad\",\n \"LOCATION_HELP\": \"Ciudad\",\n \"LAST_RECORDS\": \"Anuncios recientes:\",\n \"SHOW_OLD_RECORD\": \"Mostrar anuncios viejos\",\n \"RESULTS\": \"Resultados :\",\n \"BTN_CROWDFUNDING\": \"Crowdfunding\",\n \"BTN_FAVORITES\": \"Favoritas\",\n \"BTN_AUCTION\": \"Auction\",\n \"BTN_LAST_RECORDS\": \"Anuncios recientes\",\n \"BTN_SHOW_CATEGORIES\": \"Mostrar categorías\",\n \"BTN_OFFERS\": \"Ofertas\",\n \"BTN_NEEDS\": \"Demandas\",\n \"SHOW_CLOSED_RECORD\": \"Mostrar anuncios cerrados\",\n \"RECORD_STOCK\": \"Stock :\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nuevo anuncio\",\n \"SELECT_TYPE\": \"Tipo de anuncio :\",\n \"OFFER\": \"Oferta, Venta\",\n \"OFFER_SHORT\": \"Oferta\",\n \"CROWDFUNDING\": \"Financiamiento participativo\",\n \"CROWDFUNDING_SHORT\": \"Financiamiento participativo\",\n \"NEED\": \"Demanda, Necesidad\",\n \"NEED_SHORT\": \"Demanda\",\n \"AUCTION\": \"Subasta\",\n \"AUCTION_SHORT\": \"Subasta\"\n },\n \"VIEW\": {\n \"BTN_FOLLOW\": \"Seguir este anuncio\",\n \"BTN_STOP_FOLLOW\": \"Dejar de seguir este anuncio\",\n \"BTN_PAYMENT_HELP\": \"¿ Cómo hacer un pago ?\",\n \"CROWDFUNDING_ISSUERS\": \"{{issuers.length}} contribuidor{{issuers.length > 1 ? 'es' : ''}}\",\n \"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>\",\n \"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>\",\n \"SHOW_CROWDFUNDING_ISSUERS\": \"Ver contribuidores\",\n\n \"MORE_LIKE_THIS\": \"Esto le podría interesar :\",\n \"NEW_MESSAGE_TITLE\": \"Sobre el anuncio \\\"{{title}}\\\"...\",\n \"REOPEN_CONFIRMATION\": \"¿<b>Desea</b> reabrir este anuncio ?\",\n \"SOLD_CONFIRMATION\": \"¿<b>Desea</b> cerrar este anuncio ?\",\n \"TITLE\": \"Anuncio\",\n \"BTN_SOLD_AD\": \"Cerrar anuncio\",\n \"BTN_SOLD\": \"Cerrado\",\n \"BTN_REOPEN\": \"Reabrir anuncio\",\n \"BTN_WRITE\": \"Escribir\",\n \"MENU_TITLE\": \"Opciones\",\n \"RECORD_FEES_PARENTHESIS\": \"(costes)\",\n \"RECORD_STOCK\": \"Stock disponible :\",\n \"POPOVER_SHARE_TITLE\": \"Anuncio {{title}}\",\n \"REMOVE_CONFIRMATION\": \"¿ Desea suprimir este anuncio ?<br/><br/>Esta operación es irreversible.\"\n },\n \"WALLET\": {\n \"DUNITER_PUBKEY\": \"Llave pública de recepción de pagos\",\n \"DUNITER_ACCOUNT\": \"Recepción de pagos en {{currency|currencySymbol}}\",\n \"DUNITER_ACCOUNT_HELP\": \"La llave pública (de arriba) indica el destino de los pagos que recibirá.\",\n \"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>.\"\n },\n \"WOT\": {\n \"ERROR\": {\n \"FAILED_STAR_PROFILE\": \"Error durante el envío de su nota. Inténtelo más tarde.\"\n },\n \"VIEW\": {\n \"BTN_RECORDS\": \"Anuncios\",\n \"DUNITER_ACCOUNT\": \"Recepción de pagos en {{currency|currencySymbol}}\",\n \"DUNITER_ACCOUNT_HELP\": \"La llave pública (de arriba) indica el destino de los pagos que recibirá.\",\n \"DUNITER_ACCOUNT_HELP_ASK_USER\": \"Este usuario no ha comunicado su llave pública. <a ng-click=\\\"showNewMessageModal()\\\">Contáctelo</a> para obtenerla.\",\n \"DUNITER_PUBKEY\": \"Llave pública para recepción de pagos\"\n }\n }\n\t},\n\t\"MENU\": {\n\t\t\"MARKET\": \"Anuncios\",\n\t\t\"MY_RECORDS\": \"Mis anuncios\"\n\t}\n}\n);\n\n$translateProvider.translations(\"fr-FR\", {\n \"MENU\": {\n \"MARKET\": \"Annonces\",\n \"MY_RECORDS\": \"Mes annonces\",\n \"FAVORITES\": \"Favoris\"\n },\n \"MARKET\": {\n \"COMMON\": {\n \"PRICE\": \"Prix\",\n \"BTN_NEW_AD\": \"Je dépose une annonce\",\n \"SOLD\": \"Annonce close\",\n \"LAST_UPDATE\": \"Dernière mise à jour\",\n \"AROUND_ME\": \"Autour de moi\",\n \"CROWDFUNDING_PROGRESS\": \"Financé à {{pct|formatInteger}} %\",\n \"FREE\": \"Gratuit\",\n \"FREE_PRICE\": \"Prix libre\"\n },\n \"JOIN\": {\n \"PROFILE\": {\n \"WARNING\": \"Il vous reste maintenant à compléter votre profil utilisateur.<br/><br/>Il s'agit <b>d'informations publiques</b>, accessibles par tous.\",\n \"TITLE\": \"Nom, Prénom\",\n \"TITLE_HELP\": \"Nom, Prénom ou pseudonyme\",\n \"DESCRIPTION\": \"A propos de moi\",\n \"DESCRIPTION_HELP\": \"Dites quelque chose à propos de vous...\"\n },\n \"SUBSCRIPTION\": {\n \"EMAIL\": \"Email\",\n \"EMAIL_HELP\": \"Email (optionnel)\"\n },\n \"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 !\",\n \"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 ?\"\n },\n \"PROFILE\": {\n \"DEFAULT_TITLE\": \"Utilisateur {{pubkey|formatPubkey}}\",\n \"IDENTITY_RECORDS_TITLE\": \"Annonces utilisateur\"\n },\n \"LOGIN\": {\n \"HELP\": \"Veuillez saisir vos identifiants de connexion :\",\n \"REMEMBER_ME\": \"Se souvenir de moi ?\"\n },\n \"EVENT_LOGIN\": {\n \"TITLE\": \"Coordonnées\",\n \"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 :\",\n \"EMAIL_OR_PHONE\": \"Email ou téléphone\",\n \"EMAIL_OR_PHONE_HELP\": \"Email ou numéro de téléphone\",\n \"REMEMBER_ME\": \"Se souvenir de moi ?\",\n \"ERROR\": {\n \"INVALID_USERNAME\": \"Email ou numéro de téléphone non valide\"\n }\n },\n \"HOME\": {\n \"BTN_NEW_AD\": \"Déposer une annonce\",\n \"BTN_SHOW_MARKET_OFFER\": \"Voir les annonces\",\n \"LOCATION_LABEL\": \"Recherche d'annonces par ville :\",\n \"LOCATION_HELP\": \"Code postal, Ville\",\n \"ERROR\": {\n \"GEO_LOCATION_NOT_FOUND\": \"Ville ou code postal non trouvé\"\n }\n },\n \"CATEGORY\": {\n \"ALL\": \"Toutes les catégories\",\n \"UNKNOWN\": \"Catégorie inconnue\",\n \"EDIT\": {\n \"TITLE\": \"Gestion des catégories\",\n \"ID\": \"Identifiant\",\n \"NAME\": \"Libellé\",\n \"ROOT_CATEGORIES\": \"Catégories parentes\",\n \"BTN_ADD\": \"Ajouter\",\n \"BTN_REORDER\": \"Réordonner\",\n \"POPUP\": {\n \"TITLE_EDIT\": \"Modifier la catégorie\",\n \"TITLE_NEW\": \"Nouvelle catégorie\"\n },\n \"CONFIRM\": {\n \"CANCEL\": \"Des modifications n'ont pas été enregistrées.<br/><br/><b>Êtes-vous sûr</b> de vouloir continuer cette opération ?\"\n },\n \"INFO\": {\n \"SAVED\": \"Catégories enregistrées avec succès\"\n },\n \"ERROR\": {\n \"CANNOT_SAVE\": \"Erreur lors de la sauvegarde des catégories\",\n \"INVALID_ID_PATTERN\": \"Format 'catNNN' non respecté\",\n \"ID_ALREADY_USED\": \"Identifiant déjà utilisé\"\n }\n }\n },\n \"SEARCH\": {\n \"TITLE\": \"Annonces\",\n \"CATEGORY\": \"Catégorie : \",\n \"SEARCH_HELP\": \"Recherche (vélo, rollers...)\",\n \"BY\": \"par\",\n \"BTN_ADD\": \"Nouveau\",\n \"BTN_CATEGORIES\": \"Catégories\",\n \"BTN_OPTIONS\": \"Recherche avancée\",\n \"BTN_AROUND_ME\": \"Autour de moi\",\n \"GEO_DISTANCE\": \"Distance maximale autour de la ville :\",\n \"GEO_DISTANCE_OPTION\": \"{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}\",\n \"SHOW_MORE\": \"Afficher plus\",\n \"SHOW_MORE_COUNT\": \"(limite actuelle à {{limit}})\",\n \"LOCATION\": \"Ville\",\n \"LOCATION_HELP\": \"Code postal, Ville\",\n \"RESULTS\": \"Résultats\",\n \"RESULT_COUNT_LOCATION\": \"{{count}} résultat{{count>0?'s':''}}, près de {{location}}\",\n \"RESULT_COUNT\": \"{{count}} résultat{{count>0?'s':''}}\",\n \"LAST_RECORDS\": \"Dernières annonces\",\n \"LAST_RECORD_COUNT_LOCATION\": \"{{count}} annonce{{count>0?'s':''}} récente{{count>0?'s':''}}, près de {{location}}\",\n \"LAST_RECORD_COUNT\": \"{{count}} annonce{{count>0?'s':''}} récente{{count>0?'s':''}}\",\n \"BTN_LAST_RECORDS\": \"Dernières annonces\",\n \"BTN_SHOW_CATEGORIES\": \"Parcourir les catégories\",\n \"BTN_OFFERS\": \"Offres\",\n \"BTN_CROWDFUNDING\": \"Financements\",\n \"BTN_FAVORITES\": \"Favoris\",\n \"BTN_AUCTION\": \"Enchères\",\n \"BTN_NEEDS\": \"Demandes\",\n \"SHOW_CLOSED_RECORD\": \"Afficher les annonces closes ?\",\n \"SHOW_OLD_RECORD\": \"Afficher les anciennes annonces ?\",\n \"RECORD_STOCK\": \"Stock :\",\n \"SORT\": {\n \"PREFIX\": \"Tri: \",\n \"DATE\": \"Date\",\n \"PRICE\": \"Prix\",\n \"DATE_ASC\": \"Plus anciennes\",\n \"DATE_DESC\": \"Plus récentes\",\n \"PRICE_ASC\": \"Prix croissants\",\n \"PRICE_DESC\": \"Prix décroissants\"\n }\n },\n \"GALLERY\": {\n \"TITLE\": \"Diaporama\",\n \"BTN_START\": \"Démarrer\",\n \"BTN_CONTINUE\": \"Reprendre\",\n \"BTN_PAUSE\": \"Pause\",\n \"BTN_STOP\": \"Arrêter\",\n \"SLIDE_DURATION\": \"Durée d'affichage :\",\n \"AD_TYPE\": \"Type d'annonce :\",\n \"ALL_AD_TYPES\": \"Tous\",\n \"SLIDE_DURATION_OPTION\": \"{{value}} secondes\"\n },\n \"VIEW\": {\n \"TITLE\": \"Annonce\",\n \"BTN_SOLD_AD\": \"Clore l'annonce\",\n \"BTN_SOLD\": \"Clore\",\n \"BTN_REOPEN\": \"Réouvrir l'annonce\",\n \"BTN_WRITE\": \"Ecrire un message\",\n \"BTN_FOLLOW\": \"Suivre cette annonce\",\n \"BTN_STOP_FOLLOW\": \"Ne plus suivre cette annonce\",\n \"BTN_PAYMENT_HELP\": \"Comment faire un paiement ?\",\n \"MENU_TITLE\": \"Options\",\n \"RECORD_FEES_PARENTHESIS\": \"(frais)\",\n \"RECORD_STOCK\": \"Stock disponible :\",\n \"POPOVER_SHARE_TITLE\": \"Annonce {{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Êtes-vous sûr de vouloir supprimer cette annonce ?<br/><br/>Cette opération est irréversible.\",\n \"SOLD_CONFIRMATION\" : \"<b>Êtes-vous sûr</b> de vouloir clore cette annonce ?\",\n \"REOPEN_CONFIRMATION\" : \"<b>Êtes-vous sûr</b> de vouloir réouvrir cette annonce ?\",\n \"NEW_MESSAGE_TITLE\": \"Au sujet de l'annonce \\\"{{title}}\\\"...\",\n \"MORE_LIKE_THIS\": \"Ceci pourrait vous intéresser :\",\n \"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>\",\n \"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>\",\n \"CROWDFUNDING_ISSUERS\": \"{{issuers.length}} donateur{{issuers.length > 1 ? 's' : ''}}\",\n \"SHOW_CROWDFUNDING_ISSUERS\": \"Voir les donateurs\"\n },\n \"WALLET\": {\n \"DUNITER_PUBKEY\": \"Clé publique de réception des paiements\",\n \"DUNITER_ACCOUNT\": \"Réception des paiements en {{currency|currencySymbol}}\",\n \"DUNITER_ACCOUNT_HELP\": \"La clef publique (ci-dessus) indique la destination des paiements que vous recevrez.\",\n \"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>.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nouvelle annonce\",\n \"SELECT_TYPE\": \"Type d'annonce :\",\n \"OFFER\": \"Offre, Vente\",\n \"OFFER_SHORT\": \"Offre\",\n \"CROWDFUNDING\": \"Financement participatif\",\n \"CROWDFUNDING_SHORT\": \"Financement\",\n \"NEED\": \"Demande, Recherche\",\n \"NEED_SHORT\": \"Demande\",\n \"AUCTION\": \"Vente aux enchères\",\n \"AUCTION_SHORT\": \"Enchère\"\n },\n \"LOCAL_SALE\": {\n \"LOCATION\": \"Numéro du stand\",\n \"LOCATION_HELP\": \"Numéro du stand : 1, 2, ...\",\n \"LOCATION_PREFIX\": \"Stand n°\"\n },\n \"EDIT\": {\n \"TITLE\": \"Edition\",\n \"RECORD_TITLE\": \"Titre\",\n \"RECORD_TITLE_HELP\": \"Titre : vélo, livre...\",\n \"RECORD_DESCRIPTION\": \"Description\",\n \"RECORD_DESCRIPTION_HELP\": \"Description\",\n \"RECORD_LOCATION\": \"Ville\",\n \"RECORD_LOCATION_HELP\": \"Code postal, Ville\",\n \"RECORD_PRICE\": \"Prix\",\n \"RECORD_PRICE_HELP\": \"Prix (optionnel)\",\n \"FREE_PRICE\": \"Prix libre ?\",\n \"RECORD_CURRENCY\": \"Monnaie\",\n \"RECORD_FEES\": \"Frais d'envoi\",\n \"RECORD_FEES_HELP\": \"Frais (optionnel)\",\n \"RECORD_STOCK\": \"Stock disponible\",\n \"RECORD_STOCK_HELP\": \"Stock disponible\",\n \"AUCTION\": {\n \"TITLE_NEW\": \"Nouvelle enchère\",\n \"START_PRICE_HELP\": \"Prix de départ (optionnel)\"\n },\n \"OFFER\": {\n \"TITLE_NEW\": \"Nouvelle annonce\"\n },\n \"NEED\": {\n \"TITLE_NEW\": \"Nouvelle demande\",\n \"MAX_PRICE_HELP\": \"Prix maximum (optionnel)\"\n },\n \"CROWDFUNDING\": {\n \"TITLE_NEW\": \"Nouvelle campagne de financement\",\n \"TITLE_HELP\": \"Titre de la campagne\",\n \"DESCRIPTION_HELP\": \"Description : Décrivez votre projet ici\",\n \"PRICE_HELP\": \"Montant recherché\"\n },\n \"WARNING\": {\n \"NO_GEO_POINT\": \"Votre annonce <b>ne sera pas visible</b> dans les recherches spatiales.\"\n }\n },\n \"WOT\": {\n \"VIEW\": {\n \"BTN_RECORDS\": \"Annonces\",\n \"DUNITER_PUBKEY\": \"Clé publique de réception des paiements\",\n \"DUNITER_ACCOUNT\": \"Réception des paiements en {{currency|currencySymbol}}\",\n \"DUNITER_ACCOUNT_HELP\": \"La clef publique (ci-dessus) correspond au compte à utiliser pour payer cet utilisateur.\",\n \"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.\"\n },\n \"ERROR\": {\n \"FAILED_STAR_PROFILE\": \"Erreur lors de l'envoi de votre note. Veuillez réessayer ultérieurement.\"\n }\n },\n \"PAYMENT\": {\n \"MODAL\": {\n \"TITLE\": \"Faire un paiement\",\n \"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>\",\n \"PAYMENT_LINK_HELP\": \"Liens de paiement (bêta) :\"\n }\n },\n \"ERROR\": {\n \"INVALID_LOGIN_CREDENTIALS\": \"Identifiant ou mot de passe invalide.<br/><br/>Vérifiez qu'ils correspondent bien à un compte <b>créé sur ğchange</b>.\",\n \"FAILED_SAVE_RECORD\": \"Erreur lors de l'enregistrement de l'annonce\",\n \"FAILED_UPDATE_RECORD\": \"Erreur lors de la mise à jour de l'annonce\",\n \"LOAD_CATEGORY_FAILED\": \"Erreur d'initialisation des catégories\",\n \"LOOKUP_RECORDS_FAILED\": \"Erreur lors de l'exécution de la recherche\",\n \"LOAD_RECORD_FAILED\": \"Erreur lors du chargement de l'annonce\",\n \"REMOVE_RECORD_FAILED\": \"Erreur de la suppression de l'annonce\",\n \"SOLD_RECORD_FAILED\": \"Erreur lors de la fermeture de l'annonce\",\n \"REOPEN_RECORD_FAILED\": \"Erreur lors de la réouverture de l'annonce\",\n \"FAILED_SAVE_COMMENT\": \"Erreur lors de la sauvegarde du commentaire\",\n \"FAILED_REMOVE_COMMENT\": \"Erreur lors de la suppression du commentaire\",\n \"RECORD_NOT_EXISTS\": \"Annonce inexistante\",\n \"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.\",\n \"GEO_LOCATION_NOT_FOUND\": \"Ville ou code postal non trouvé\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Annonce supprimée\",\n \"RECORD_SOLD\" : \"Annonce close\",\n \"RECORD_REOPEN\" : \"Annonce réouverte\"\n }\n },\n \"EVENT\": {\n \"MARKET\": {\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a commenté votre annonce : <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a modifié son commentaire sur votre annonce : <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a répondu à votre commentaire sur l'annonce : <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a modifié la réponse à votre commentaire sur l'annonce : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a commenté l'annonce : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a modifié son commentaire sur l'annonce : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a ajouté l'annonce : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a modifié l'annonce : <b>{{params[2]}}</b>\",\n \"FOLLOW_CLOSE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a clôturé l'annonce : <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{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>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a signalé une annonce à modérer : <b>{{params[2]}}</b>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a signalé votre annonce : <b>{{params[2]}}</b>\",\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> a aimé votre annonce : <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||params[1]}}</span> suit votre annonce : <b>{{params[2]}}</b>\"\n }\n }\n}\n);\n\n$translateProvider.translations(\"nl-NL\", {\n \"MENU\": {\n \"MARKET\": \"Advertenties\"\n },\n \"MARKET\": {\n \"COMMON\": {\n \"PRICE\": \"Prijs\",\n \"BTN_BUY\": \"Koop\",\n \"BTN_BUY_DOTS\": \"Koop...\",\n \"BTN_NEW_AD\": \"Nieuwe advertentie\",\n \"AROUND_ME\": \"In mijn omgeving\"\n },\n \"SEARCH\": {\n \"TITLE\": \"Markt\",\n \"SEARCH_HELP\": \"Wat, waar: auto, Utrecht, ...\",\n \"BTN_ADD\": \"Nieuw\",\n \"BTN_OPTIONS\": \"Geavanceerd zoeken\",\n \"BTN_AROUND_ME\": \"In mijn omgeving\",\n \"SHOW_MORE\": \"Toon meer\",\n \"SHOW_MORE_COUNT\": \"(huidige limiet op {{limit}})\",\n \"LOCATION\": \"Locatie\",\n \"LOCATION_HELP\": \"Plaats\",\n \"LAST_RECORDS\": \"Nieuwste advertenties:\",\n \"RESULTS\": \"Resultaat:\",\n \"BTN_OFFERS\": \"Aangeboden\",\n \"BTN_NEEDS\": \"Gezocht\"\n },\n \"VIEW\": {\n \"TITLE\": \"Advertentie\",\n \"MENU_TITLE\": \"Opties\",\n \"POPOVER_SHARE_TITLE\": \"Advertentie {{title}}\",\n \"REMOVE_CONFIRMATION\" : \"Weet je zeker dat je deze advertentie wil wissen?<br/><br/>Dit kan niet ongedaan worden gemaakt.\"\n },\n \"TYPE\": {\n \"TITLE\": \"Nieuwe advertentie\",\n \"SELECT_TYPE\": \"Soort advertentie:\",\n \"OFFER\": \"Aanbod\",\n \"NEED\": \"Vraag\"\n },\n \"EDIT\": {\n \"TITLE\": \"Bewerk\",\n \"TITLE_NEW\": \"Nieuwe advertentie\",\n \"RECORD_TITLE\": \"Titel\",\n \"RECORD_TITLE_HELP\": \"Titel\",\n \"RECORD_DESCRIPTION\": \"Beschrijving\",\n \"RECORD_DESCRIPTION_HELP\": \"Beschrijving\",\n \"RECORD_LOCATION\": \"Adres\",\n \"RECORD_LOCATION_HELP\": \"Straat, Plaats\",\n \"RECORD_PRICE\": \"Prijs\",\n \"RECORD_PRICE_HELP\": \"Prijs (optioneel)\",\n \"RECORD_CURRENCY\": \"Valuta\"\n },\n \"ERROR\": {\n \"FAILED_SAVE_RECORD\": \"Advertentie opslaan mislukt\",\n \"FAILED_UPDATE_RECORD\": \"Advertentie aanpassen mislukt\",\n \"LOAD_CATEGORY_FAILED\": \"Categorieên laden mislukt\",\n \"LOOKUP_RECORDS_FAILED\": \"Fout tijdens laden van advertenties.\",\n \"LOAD_RECORD_FAILED\": \"Advertentie laden mislukt\",\n \"REMOVE_RECORD_FAILED\": \"Advertentie wissen mislukt\",\n \"FAILED_SAVE_COMMENT\": \"Commentaar opslaan mislukt\",\n \"FAILED_REMOVE_COMMENT\": \"Commentaar wissen mislukt\",\n \"RECORD_NOT_EXISTS\": \"Advertentie niet gevonden\"\n },\n \"INFO\": {\n \"RECORD_REMOVED\" : \"Advertentie succesvol verwijderd\"\n }\n },\n \"EVENT\": {\n \"MARKET\": {\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft gereageerd op jouw advertentie: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/aar reactie op jouw advertentie bewerkt: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft gereageerd op jouw commentaar op advertentie: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i>&thinsp;{{name||uid||params[1]}}</span> heeft zijn/haar reactie op jouw commentaar bewerkt, op advertentie: <b>{{params[2]}}</b>\"\n }\n }\n}\n);\n}]);\n","angular.module('cesium.plugins.templates', []).run(['$templateCache', function($templateCache) {$templateCache.put('plugins/es/templates/common/dropdown_locations.html','\\n <!-- dropdown -->\\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 <!-- if divider -->\\n <h4 class=\"text-italic\" ng-if=\"::!res.address\" ng-bind-html=\"res.name\"></h4>\\n\\n <!-- if divider -->\\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');\n$templateCache.put('plugins/es/templates/common/edit_pictures.html','<div class=\"gallery\" ng-controller=\"ESPicturesEditCtrl as ctrl\">\\n\\n <!-- Picture list -->\\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 <!-- Add picture button -->\\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');\n$templateCache.put('plugins/es/templates/common/edit_position.html','<div class=\"item item-divider\" translate>LOCATION.LOCATION_DIVIDER</div>\\n\\n<!-- street -->\\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<!-- city -->\\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<!-- Position (lat/lon) -->\\n<div class=\"item row item-text-wrap no-padding\">\\n\\n <div class=\"col no-padding\">\\n\\n <!-- appear on map ? -->\\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 <!-- warning if no position-->\\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 <!-- loading -->\\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');\n$templateCache.put('plugins/es/templates/common/edit_socials.html','<div class=\"list no-padding {{::motion.ionListClass}}\">\\n <!-- divider -->\\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 &gt; 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 &nbsp;<b class=\"ion ion-trash-a\"></b>&nbsp;\\n </a>\\n <a class=\"gray hidden-device\" ng-if=\"!social.recipient && !socialData.reorder\" ng-click=\"editSocialNetwork($index)\">\\n &nbsp;<b class=\"ion ion-edit\"></b>&nbsp;\\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');\n$templateCache.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>&nbsp;\\n <span trust-as-html=\"comment.html\"></span>\\n </div>\\n');\n$templateCache.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 <!-- Parent comment -->\\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 <!-- replies -->\\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');\n$templateCache.put('plugins/es/templates/common/item_location_search.html',' <!-- search text -->\\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 <!-- selected location -->\\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 &nbsp;<i class=\"icon ion-location\"></i>\\n {{search.location.split(\\',\\')[0]}}\\n <i class=\"icon ion-close\" ng-click=\"removeLocation()\">&nbsp;&nbsp;</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 &nbsp;<b class=\"ion-arrow-down-b\" style=\"font-size: 12pt;\"></b>\\n </a>\\n\\n </div>\\n </div>\\n\\n <!-- dropdown -->\\n <ng-include src=\"\\'plugins/es/templates/common/dropdown_locations.html\\'\"></ng-include>\\n\\n');\n$templateCache.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');\n$templateCache.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 <!-- Add picture drop zone -->\\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 <!-- <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> -->\\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 <!-- buttons bar -->\\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');\n$templateCache.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 <!-- search text -->\\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 <!-- if divider -->\\n <h4 class=\"text-italic\" ng-if=\"::!res.address\" ng-bind-html=\"res.name\"></h4>\\n\\n <!-- if divider -->\\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\">\\xA9 </span>\\n <a class=\"positive\" href=\"{{license.url}}\" target=\"_blank\">{{license.name}}</a>\\n </div>\\n </ion-footer-bar>\\n</ion-modal-view>\\n');\n$templateCache.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');\n$templateCache.put('plugins/es/templates/common/popover_profile_extend.html',' <!-- profile -->\\n <button ng-if=\"enable\" class=\"button button-positive button-small ink\" ng-click=\"showEditUserProfile()\">\\n {{\\'PROFILE.BTN_EDIT\\' | translate}}\\n </button>\\n\\n');\n$templateCache.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');\n$templateCache.put('plugins/es/templates/common/popup_report_abuse.html','<form name=\"abuseForm\" ng-submit=\"\">\\n <div class=\"list\" ng-init=\"setAbuseForm(abuseForm)\">\\n\\n <!-- reason -->\\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');\n$templateCache.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 <!-- reply to comment-->\\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 <!-- Edit buttons -->\\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 <!-- reply to comment-->\\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');\n$templateCache.put('plugins/es/templates/common/view_likes.html','\\n<div class=\"likes\">\\n <!-- views -->\\n <span class=\"gray\" ng-if=\"likeData.views\" title=\"{{\\'COMMON.VIEWS_TEXT\\'|translate: likeData.views }}\">\\n {{likeData.views.total ||\\xA00}}\\n <i class=\"icon ion-eye\"></i>\\n <ng-if ng-if=\"likeData.likes||likeData.dislikes\">&nbsp;|&nbsp;</ng-if>\\n </span>\\n\\n <!-- likes / dislikes -->\\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 ||\\xA00}}\\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 ||\\xA00}}\\n <i class=\"icon ion-heart-broken\"></i>\\n </a>\\n </span>\\n </ng-if>\\n\\n <!-- follow-->\\n <span class=\"gray\" ng-if=\"likeData.follows\">&nbsp;|&nbsp;</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 ||\\xA00}}\\n <i class=\"icon ion-android-people\"></i>&nbsp;\\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\">&nbsp;|&nbsp;</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 ||\\xA00}}\\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 ||\\xA00}}\\n <i class=\"icon ion-android-warning\"></i>\\n </span>\\n</div>\\n');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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 <!--<div class=\"col\">-->\\n <!--<a-->\\n <!--ng-if=\":rebind:login && doc.pubkey==walletData.pubkey\"-->\\n <!--ng-click=\"remove($event, $index)\"-->\\n <!--class=\"gray pull-right\"-->\\n <!--title=\"{{\\'DOCUMENT.LOOKUP.BTN_REMOVE\\'|translate}}\">-->\\n <!--<i class=\"ion-trash-a\"></i>-->\\n <!--</a>-->\\n <!--<h3 ng-if=\":rebind:doc.recipient\">-->\\n <!--<a ui-sref=\"app.user_identity({pubkey: doc.recipient.pubkey, name: doc.recipient.name})\">-->\\n <!--<span class=\"gray\">-->\\n <!--<i class=\"ion-key\"></i> {{:rebind:doc.recipient.pubkey|formatPubkey}}-->\\n <!--</span>-->\\n <!--<span class=\"positive\" ng-if=\":rebind:doc.recipient.name\">-->\\n <!--<i class=\"ion-person\"></i> {{:rebind:doc.recipient.name}}-->\\n <!--</span>-->\\n <!--</a>-->\\n <!--</h3>-->\\n <!--<h4 class=\"gray\" ng-if=\":rebind:doc.read_signature\">-->\\n <!--<i class=\"ion-checkmark\"></i>-->\\n <!--<span translate>DOCUMENT.LOOKUP.READ</span>-->\\n <!--</h4>-->\\n\\n <!--</div>-->\\n\\n </div>\\n</ion-item>\\n');\n$templateCache.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<!-- for each doc -->\\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');\n$templateCache.put('plugins/es/templates/document/lookup_form.html','<div class=\"lookupForm\">\\n\\n\\n <div class=\"item no-padding\">\\n\\n <!--<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>-->\\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 &nbsp;\\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>');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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\">&nbsp;</div>\\n\\n <div class=\"col\">\\n <!-- loading -->\\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 <!-- -->\\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}}&nbsp;{{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 <!-- pictures -->\\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 <!-- title -->\\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 <!-- description -->\\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 <!-- social networks -->\\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\">&nbsp;</div>\\n\\n </div>\\n \\n </ion-content>\\n</ion-view>\\n');\n$templateCache.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 <!-- membersCount -->\\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');\n$templateCache.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\">&nbsp;\\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');\n$templateCache.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>&thinsp;<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');\n$templateCache.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 <!-- search text-->\\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 &nbsp;\\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>');\n$templateCache.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');\n$templateCache.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 <!-- open group -->\\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 <!-- managed group -->\\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');\n$templateCache.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>&nbsp;</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\">&nbsp;\\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\">&nbsp;|&nbsp;</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 <!-- Buttons bar-->\\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 <!-- Socials networks -->\\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 <!-- pictures -->\\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 <!-- pubkey -->\\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 <!-- comments -->\\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\">&nbsp;\\n </div>\\n </div>\\n </ion-content>\\n\\n\\n\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/home/home_extend.html','<!-- notifications -->\\n<ng-if ng-if=\":state:extensionPoint=== \\'header-buttons\\'\" class=\"visible-xs visible-sm\">\\n <!-- messages -->\\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 <!-- notifications -->\\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');\n$templateCache.put('plugins/es/templates/join/modal_join_extend.html','<ng-if ng-if=\":state:enable && extensionPoint === \\'select-account-type\\'\">\\n\\n <!-- ornigzation wallet -->\\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<!-- Add a slide -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'last-slide\\'\">\\n\\n <!-- STEP 6: organization type -->\\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');\n$templateCache.put('plugins/es/templates/menu_extend.html','\\n<!-- Main section -->\\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<!-- Toolbar section -->\\n<div ng-if=\":state:enable && extensionPoint === \\'nav-buttons-right\\'\" class=\"hidden-xs hidden-sm\">\\n\\n <!-- messages -->\\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 <!-- notifications -->\\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<!-- User section -->\\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');\n$templateCache.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>&nbsp;{{destUid}}</span>&nbsp;\\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}}&nbsp;&nbsp;\\n </span>\\n <span ng-if=\"$root.walletData.pubkey && $root.walletData.name\">\\n {{$root.walletData.name}}\\n </span>\\n </span>\\n </div>\\n\\n <!-- Object -->\\n <div class=\"item item-input\" ng-class=\"{\\'item-input-error\\': form.$submitted && form.title.$invalid}\">\\n <!--<span class=\"input-label\">{{\\'MESSAGE.COMPOSE.OBJECT\\' | translate}}</span>-->\\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 <!-- Content -->\\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 <!-- Encryption info -->\\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');\n$templateCache.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\">&nbsp;</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\">&nbsp;</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\">&nbsp;</div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.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 <!-- Buttons bar-->\\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 &nbsp; <i class=\"icon ion-android-more-vertical\"></i>&nbsp;\\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 &nbsp;\\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');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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>&thinsp;{{::notification.name}}</span>\\n <span class=\"gray\" ng-if=\"::!notification.name\"><i class=\"ion-key\"></i>&thinsp;{{::notification.issuer|formatPubkey}}</span>\\n </h3>\\n <h4>\\n <i class=\"icon ion-archive balanced\"></i>&thinsp;<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 <!-- show all -->\\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');\n$templateCache.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\">&nbsp;</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 <!-- Buttons bar-->\\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 <!--<button class=\"button button-small button-stable icon ion-reply\"\\n ng-click=\"showForwardModal()\">\\n {{\\'MESSAGE.BTN_FORWARD\\' | translate}}\\n </button>-->\\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 <!-- content -->\\n <ion-item class=\"visible-xs visible-sm\">\\n <h1 class=\"title\" ng-bind-html=\"formData.title\"></h1>\\n </ion-item>\\n\\n <!-- content -->\\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\">&nbsp;</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');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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>&nbsp;\\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');\n$templateCache.put('plugins/es/templates/network/popover_endpoints.html','<ion-popover-view class=\"popover-endpoints popover-light\" style=\"height: {{(titleKey?30:0)+((!items || items.length &lt;= 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');\n$templateCache.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 <!-- settings -->\\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 <!-- show all -->\\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');\n$templateCache.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 <!-- Allow extension here -->\\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 <!-- settings -->\\n <div class=\"pull-left\">\\n <a class=\"positive\" ui-sref=\"app.settings\" ng-click=\"closePopover()\" translate>MENU.SETTINGS</a>\\n </div>\\n\\n <!-- show all -->\\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');\n$templateCache.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 <!-- Allow extension here -->\\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 <!-- Allow extension here -->\\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');\n$templateCache.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\">&nbsp;\\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 <!-- node owner -->\\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 <!-- Allow extension here -->\\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\">&nbsp;\\n </div>\\n </div>\\n\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.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>&thinsp;<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');\n$templateCache.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');\n$templateCache.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 <!-- 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> -->\\n\\n <!-- show all -->\\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');\n$templateCache.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 <!-- Buttons bar-->\\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\">&nbsp;</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\">&nbsp;</div>\\n\\n </div>\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.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\">&nbsp;</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}}&nbsp;{{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 <!-- pictures -->\\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 <!-- title -->\\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 <!-- description -->\\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 <!-- category -->\\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>&nbsp;\\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 <!-- position -->\\n <ng-include src=\"\\'plugins/es/templates/common/edit_position.html\\'\"></ng-include>\\n\\n <!-- social networks -->\\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 <!-- pubkey -->\\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\">&nbsp;</div>\\n\\n </div>\\n \\n </ion-content>\\n</ion-view>\\n');\n$templateCache.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 <!-- title -->\\n <h2 title=\"{{item.title|noHtml}}\" ng-bind-html=\"::item.title\"></h2>\\n\\n <!-- category -->\\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 <!-- creation date -->\\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}}&nbsp;<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');\n$templateCache.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');\n$templateCache.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 <!-- search text -->\\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 <!-- selected type -->\\n <div ng-show=\"search.type\" class=\"button button-small button-text button-stable button-icon-event stable-900-bg\">\\n &nbsp;<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()\">&nbsp;&nbsp;</i>\\n </div>\\n\\n <!-- selected category -->\\n <div ng-show=\"search.category.name\" class=\"button button-small button-text button-stable button-icon-event stable-900-bg\">\\n &nbsp;<i class=\"icon ion-flag\"></i>\\n <span>{{search.category.name|truncText:40}}</span>\\n <i class=\"icon ion-close\" ng-click=\"removeCategory()\">&nbsp;&nbsp;</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 <!-- location -->\\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 <!-- options -->\\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 &nbsp;\\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 &nbsp;\\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"filter-buttons\"></cs-extension-point>\\n\\n &nbsp;\\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');\n$templateCache.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');\n$templateCache.put('plugins/es/templates/registry/lookup_list_lg.html','<div class=\"row no-padding\" ng-class=\"{\\'ng-hide\\': !search.total}\">\\n <!-- left margin (when NOT compact mode) -->\\n <div class=\"col col-15 no-padding hidden-xs hidden-sm\" ng-if=\"!search.compactMode\">&nbsp;</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 <!-- right margin (when NOT compact mode) -->\\n <div class=\"col col-15 no-padding hidden-xs hidden-sm\" ng-if=\"!search.compactMode\">&nbsp;</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');\n$templateCache.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');\n$templateCache.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 <!-- new page -->\\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');\n$templateCache.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 <!-- new page -->\\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 <!-- advanced options -->\\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');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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>&nbsp;</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\">&nbsp;\\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\">&nbsp;|&nbsp;</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 <!-- Buttons bar-->\\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 <!-- Socials networks -->\\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 <!-- pubkey -->\\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 <!-- pictures -->\\n <ng-include src=\"\\'plugins/es/templates/common/view_pictures.html\\'\"></ng-include>\\n\\n <!-- comments -->\\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\">&nbsp;\\n </div>\\n </div>\\n </ion-content>\\n\\n\\n\\n</ion-view>\\n');\n$templateCache.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 <!-- Buttons bar -->\\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');\n$templateCache.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 <!--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-->\\n\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/es/templates/settings/settings_extend.html','\\n<!--<span class=\"item item-divider\" translate>SETTINGS.PLUGINS_SETTINGS</span>-->\\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 <!--<h4 class=\"gray\" translate>ES_SETTINGS.PLUGIN_NAME_HELP</h4>-->\\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n</div>\\n');\n$templateCache.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 <!-- Buttons bar -->\\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\">&nbsp;</div>\\n\\n <div class=\"col list {{::motion.ionListClass}} item-border-large\">\\n\\n <!-- emails -->\\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\">&nbsp;</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');\n$templateCache.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');\n$templateCache.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 <!-- Encryption info -->\\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 <!-- email -->\\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 <!-- Frequency -->\\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 <!-- Recipient (service provider) -->\\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');\n$templateCache.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 <!-- delete profile -->\\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');\n$templateCache.put('plugins/es/templates/user/edit_profile.html','<ion-view left-buttons=\"leftButtons\">\\n <ion-nav-title>\\n <!-- no title-->\\n </ion-nav-title>\\n\\n <ion-nav-buttons side=\"secondary\">\\n <!-- remove button -->\\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 <!-- save button -->\\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\">&nbsp;\\n </div>\\n\\n <div class=\"col\">\\n\\n <!-- Buttons bar-->\\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 &nbsp; <i class=\"icon ion-android-more-vertical\"></i>&nbsp;\\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 <!-- Public info -->\\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 <!-- title -->\\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 <!-- description -->\\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 <!-- position -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_position.html\\'\" ng-controller=\"ESPositionEditCtrl\"></ng-include>\\n </div>\\n\\n <!-- social networks -->\\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 <!-- pubkey -->\\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\">&nbsp;\\n </div>\\n </div>\\n\\n </ion-content>\\n\\n</ion-view>\\n');\n$templateCache.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<!-- name -->\\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<!-- About me -->\\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<!-- Localisation -->\\n<div class=\"item\" ng-if=\"formData.profile.address || formData.profile.city\" copy-on-click=\"{{formData.profile.address ? formData.profile.address + \\'&#10;\\' : \\'\\'}}{{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<!-- Socials networks -->\\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');\n$templateCache.put('plugins/es/templates/wallet/view_wallet_extend.html','<ng-if ng-if=\":state:enable && extensionPoint === \\'hero\\'\">\\n <!-- likes -->\\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 <!-- profile -->\\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 <!-- subscriptions -->\\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 <!-- page -->\\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');\n$templateCache.put('plugins/es/templates/wot/view_identity_extend.html','<!-- Hero -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'hero\\'\">\\n <!-- likes -->\\n <h4 class=\"light\">\\n <small ng-include=\"\\'plugins/es/templates/common/view_likes.html\\'\"></small>\\n </h4>\\n</ng-if>\\n\\n<!-- Top fab buttons -->\\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<!-- Buttons section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'buttons\\'\">\\n\\n <!-- message -->\\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 <!-- Star -->\\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 <!-- options -->\\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<!-- General section -->\\n<ng-if ng-if=\":state:enable && extensionPoint === \\'general\\'\">\\n\\n <!-- star level -->\\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 <!-- Registration date -->\\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<!-- After general section -->\\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');\n$templateCache.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 <!--<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>-->\\n\\n <!-- Follow -->\\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 <!-- report abuse -->\\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');\n$templateCache.put('plugins/graph/templates/account/graph_balance.html','\\n <!-- button bar -->\\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');\n$templateCache.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');\n$templateCache.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\">&nbsp;</div>\\n\\n <div class=\"col text-center\">\\n\\n <!-- [NEW] TX input chart -->\\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\">&nbsp;</div>\\n\\n <div class=\"col text-center\">\\n\\n <!-- [NEW] TX input chart -->\\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\">&nbsp;</div>\\n\\n</div>\\n');\n$templateCache.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 <!-- - - - - Balance - - - - -->\\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');\n$templateCache.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');\n$templateCache.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 <!-- duration divider -->\\n <div class=\"item item-divider\">\\n {{\\'GRAPH.COMMON.RANGE_DURATION_DIVIDER\\'|translate}}\\n </div>\\n\\n <!-- duration: hour -->\\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 <!-- duration: day -->\\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 <!-- duration: month -->\\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');\n$templateCache.put('plugins/graph/templates/docstats/graph.html','\\n <!-- graphs button bar -->\\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');\n$templateCache.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 <!-- Doc stat -->\\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');\n$templateCache.put('plugins/graph/templates/network/view_es_network_extend.html','<!-- Buttons section -->\\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');\n$templateCache.put('plugins/graph/templates/network/view_es_peer_extend.html','<!-- Buttons section -->\\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');\n$templateCache.put('plugins/graph/templates/synchro/graph.html','\\n <!-- graphs button bar -->\\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');\n$templateCache.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');\n$templateCache.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 <!-- country form -->\\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\">&nbsp;\\n </div>\\n <div class=\"col no-margin floating\">\\n\\n <!-- country (select) -->\\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 <!-- country (input) -->\\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 <!-- Add file drop zone -->\\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 <!-- leaflet map -->\\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 <!-- Shape -->\\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 <!-- ******** Config form ******** -->\\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 <!-- top lat -->\\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 <!-- left lng -->\\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 <!-- right lng -->\\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 <!-- bottom lat -->\\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 <!-- Remove hole -->\\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 <!-- Strict mode -->\\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 <!-- Max precision -->\\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 <!-- precision -->\\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 <!-- Auto compute projection -->\\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 <!-- translate-->\\n <div class=\"item row no-margin no-padding\" ng-if=\"showConfig && configData.customProjection\">\\n <div class=\"col col-50\">\\n <!-- translate X -->\\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 <!-- translate Y -->\\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 <!-- scale -->\\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 <!-- config form buttons -->\\n <div class=\"padding-top text-right\">\\n <!-- apply -->\\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 <!-- errors -->\\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 <!-- Edit properties form -->\\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 <!-- ID -->\\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 <!-- element title -->\\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 <!-- element position -->\\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 <!-- order -->\\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 <!-- element form buttons -->\\n <div class=\"padding-top text-right\">\\n <!-- cancel -->\\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 <!-- apply -->\\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 <!-- more actions (delete, test search) -->\\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');\n$templateCache.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 <!-- Shape -->\\n <div id=\"{{::shapeId}}\" class=\"shape-container compacted\"></div>\\n\\n <!-- Country links -->\\n <p ng-if=\"!loading && countries.length &gt; 1\" class=\"padding-top\">\\n <ng-repeat ng-repeat=\"country in countries\">\\n <span ng-if=\"$index\">&nbsp;|&nbsp;</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 <!-- DEV ONLY\\n <br/>\\n <p>\\n <a href=\"\" id=\"demolink\" target=\"_blank\">View on a map, as GeoJSON</a>\\n </p>-->\\n</div>\\n');\n$templateCache.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');\n$templateCache.put('plugins/market/templates/category/card_category_lg.html','\\n <div class=\"item card card-category stable-bg padding-bottom\">\\n <!-- header: parent category -->\\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 <!-- children categories-->\\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\">&nbsp;({{cat.count}})</ng-if></a>\\n </div>\\n </div>\\n');\n$templateCache.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\">&nbsp;</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 <!-- filter: locales and add/reorder buttons -->\\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\">|&nbsp;</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 <!-- List of root categories ONLY, when reorderRoot enable -->\\n <ion-list show-reorder=\"true\" ng-if=\"reorderRoot\">\\n\\n <!-- loop on root categories -->\\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\">&nbsp;({{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 <!-- Categories tree -->\\n <ng-if ng-if=\"!reorderRoot\">\\n\\n <!-- loop on root categories -->\\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\">&nbsp;({{rootCat.count}})</ng-if>\\n <a class=\"gray hidden-device\" ng-click=\"removeRootCategory($index)\">\\n &nbsp;<b class=\"ion ion-trash-a\"></b>&nbsp;\\n </a>\\n <a class=\"gray hidden-device\" ng-click=\"editRootCategory($index)\">\\n &nbsp;<b class=\"ion ion-edit\"></b>&nbsp;\\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 <!-- children categories-->\\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\">&nbsp;({{child.count}})</span>\\n\\n <a class=\"gray hidden-device\" ng-if=\"reorderChildren !== rootCat.id\" ng-click=\"removeChildCategory(rootCat, $index)\">\\n &nbsp;<b class=\"ion ion-trash-a\"></b>&nbsp;\\n </a>\\n <a class=\"gray hidden-device\" ng-if=\"reorderChildren !== rootCat.id\" ng-click=\"editChildCategory(rootCat, $index)\">\\n &nbsp;<b class=\"ion ion-edit\"></b>&nbsp;\\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\">&nbsp;</div>\\n </div>\\n\\n\\n </ion-content>\\n</ion-view>\\n');\n$templateCache.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');\n$templateCache.put('plugins/market/templates/category/popup_edit_category.html','<form name=\"editForm\" ng-submit=\"\">\\n <div class=\"list\" ng-init=\"setEditForm(editForm)\">\\n <!-- id -->\\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 <!-- name -->\\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 <!-- TODO: parent -->\\n </div>\\n</form>\\n');\n$templateCache.put('plugins/market/templates/category/view_categories_lg.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\\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>-->\\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');\n$templateCache.put('plugins/market/templates/category/view_categories.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\\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 <!-- all categories -->\\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 <!-- loop on root categories -->\\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\">&nbsp;({{cat.count}})</ng-if>\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n </a>\\n\\n <!-- children categories-->\\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\">&nbsp;({{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');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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 <!-- start/stop buttons -->\\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>&nbsp;\\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');\n$templateCache.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 <!--<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>-->\\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 <!-- search text -->\\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 <!-- location -->\\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 <!-- Ad type -->\\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 <!-- slide duration -->\\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 <!-- advanced options -->\\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 &nbsp;\\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 &nbsp;\\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');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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');\n$templateCache.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 <!-- search text -->\\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 <!-- location -->\\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');\n$templateCache.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 <!-- STEP: salt -->\\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 <!-- salt -->\\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 <!-- confirm salt -->\\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 <!-- STEP: password-->\\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 <!-- password -->\\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 <!-- confirm password -->\\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 <!-- Show values -->\\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 <!-- STEP 5: profile -->\\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 <!-- title -->\\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 <!-- description -->\\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 <!-- email -->\\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 <!--<cs-extension-point name=\"last-slide\"></cs-extension-point>-->\\n\\n <!-- STEP 6: last slide -->\\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');\n$templateCache.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 <!-- salt (=username, to enable browser login cache) -->\\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 <!-- 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>-->\\n\\n\\n <!-- remember me -->\\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 <!-- 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>-->\\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 <!-- 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>-->\\n\\n <!--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-->\\n </form>\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.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 <!-- salt (=username, to enable browser login cache) -->\\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 <!-- password -->\\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 <!-- remember me -->\\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 <!-- 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>-->\\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 <!-- 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>-->\\n </form>\\n </ion-content>\\n</ion-modal-view>\\n');\n$templateCache.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\">&nbsp;|&nbsp;</span>\\n {{countriesMap[country]}}\\n </a>\\n </p>\\n</div>\\n');\n$templateCache.put('plugins/market/templates/menu_extend.html','\\n<!-- Toolbar section -->\\n<div ng-if=\"::extensionPoint === \\'nav-buttons-right\\'\" class=\"hidden-xs hidden-sm\">\\n\\n <!-- 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> -->\\n</div>\\n\\n<!-- Menu: main section -->\\n<ng-if ng-if=\"::extensionPoint === \\'menu-main\\'\">\\n\\n <!-- view market -->\\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 <!-- view pages -->\\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<!-- Menu: user section -->\\n<ng-if ng-if=\"::extensionPoint === \\'menu-user\\'\">\\n <!-- wallet records -->\\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 <!-- wallet records -->\\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 <!-- view market gallery -->\\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');\n$templateCache.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\">&nbsp;</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}}&nbsp;{{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 <!-- pictures -->\\n <ng-include src=\"::\\'plugins/es/templates/common/edit_pictures.html\\'\"></ng-include>\\n\\n <!-- form content -->\\n <ng-include ng-if=\"formData.type\" src=\"::\\'plugins/market/templates/record/form_record_\\'+formData.type+\\'.html\\'\"></ng-include>\\n\\n <!-- buttons -->\\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\">&nbsp;</div>\\n\\n </div>\\n \\n </ion-content>\\n</ion-view>\\n');\n$templateCache.put('plugins/market/templates/record/form_record_auction.html','\\n<!-- category -->\\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>&nbsp;\\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<!-- title -->\\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<!-- price -->\\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 &nbsp;<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<!-- fees -->\\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<!-- position -->\\n<ng-include src=\"\\'plugins/es/templates/common/edit_position.html\\'\" ng-controller=\"ESPositionEditCtrl\"></ng-include>\\n');\n$templateCache.put('plugins/market/templates/record/form_record_crowdfunding.html','\\n<!-- category -->\\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>&nbsp;\\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<!-- title -->\\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<!-- price -->\\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 &nbsp;<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<!-- pubkey -->\\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<!-- position -->\\n<ng-include src=\"\\'plugins/es/templates/common/edit_position.html\\'\" ng-controller=\"ESPositionEditCtrl\"></ng-include>\\n');\n$templateCache.put('plugins/market/templates/record/form_record_need.html','\\n<!-- category -->\\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>&nbsp;\\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<!-- title -->\\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<!-- max price-->\\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 &nbsp;<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<!-- position -->\\n<ng-include src=\"\\'plugins/es/templates/common/edit_position.html\\'\" ng-controller=\"ESPositionEditCtrl\"></ng-include>\\n\\n\\n\\n');\n$templateCache.put('plugins/market/templates/record/form_record_offer.html','\\n<!-- category -->\\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>&nbsp;\\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<!-- title -->\\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<!-- price -->\\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 &nbsp;<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<!-- fees -->\\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 &nbsp;<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<!-- stock -->\\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<!-- position -->\\n<ng-include src=\"\\'plugins/es/templates/common/edit_position.html\\'\" ng-controller=\"ESPositionEditCtrl\"></ng-include>\\n');\n$templateCache.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 <!--<ng-include src=\"::\\'templates/common/qrcode.html\\'\"></ng-include>\\n <br/>-->\\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');\n$templateCache.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 <!--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>-->\\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');\n$templateCache.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');\n$templateCache.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 <!--<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>-->\\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 <!-- Write to vendor -->\\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 <!-- Follow -->\\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 <!-- report abuse -->\\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<!-- <b class=\"ion-plus icon-secondary\" style=\"font-size: 16px; left: 38px; top: -7px;\"></b>-->\\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');\n$templateCache.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\">&nbsp;</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 <!-- desktop : title and location -->\\n <div class=\"item item-text-wrap hidden-xs hidden-sm\" ng-if=\"!smallscreen\">\\n\\n <!-- title -->\\n <h1 ng-bind-html=\"formData.title\"></h1>\\n\\n <!-- location and category-->\\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\">&nbsp;|&nbsp;</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 <!-- likes -->\\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 <!-- mobile: title and location -->\\n <div class=\"item item-text-wrap\" ng-if=\"smallscreen\">\\n\\n <!-- title -->\\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 <!-- likes -->\\n <h4>\\n <ng-include src=\"\\'plugins/es/templates/common/view_likes.html\\'\"></ng-include>\\n </h4>\\n\\n <!-- fab button-->\\n <div class=\"visible-xs visible-sm\">\\n\\n <!-- like -->\\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 <!-- mobile: price -->\\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 <!-- Buttons bar-->\\n <a id=\"record-share-anchor-{{id}}\"></a>\\n <div class=\"item large-button-bar hidden-xs hidden-sm\">\\n\\n <!-- Share button -->\\n <button class=\"button button-stable button-small-padding icon ion-android-share-alt\" ng-click=\"showSharePopover($event)\">\\n </button>\\n\\n <!-- Message button -->\\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 <!-- Like button -->\\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 <!--<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>-->\\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 <!-- desktop price -->\\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 <!-- Tx progress -->\\n <div ng-if=\"formData.price && formData.tx\">\\n <span ng-class=\"{\\'balanced\\': formData.tx.pct &gt;= 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 <!-- issuers -->\\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 <!-- Fees -->\\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 <!-- stock -->\\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 <!-- Payment details -->\\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 <!-- pay help button -->\\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 <!-- pictures -->\\n <ng-include src=\"\\'plugins/es/templates/common/view_pictures.html\\'\"></ng-include>\\n\\n <!-- comments -->\\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 <!-- issuer card -->\\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 &gt; 3, \\'assertive\\': issuer.stars.levelAvg &lt;= 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 <!-- More similar ads -->\\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');\n$templateCache.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 <!-- title -->\\n <h2 title=\"{{item.title|noHtml}}\" ng-bind-html=\"::item.title\"></h2>\\n\\n <!-- category -->\\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 <!--TODO -->\\n <!--<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>-->\\n <br class=\"hidden-xxs hidden-xs hidden-sm\">\\n\\n <!-- location -->\\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 <!-- creation date -->\\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}}&nbsp;<i class=\"icon ion-camera\"></i></span>\\n\\n <!-- Tx progress -->\\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 <!-- price -->\\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');\n$templateCache.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 &nbsp;\\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 <!-- left margin (when NOT compact mode) -->\\n <div class=\"col col-15 no-padding hidden-xs hidden-sm\" ng-if=\"!search.compactMode\">&nbsp;</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 <!-- right margin (when NOT compact mode) -->\\n <div class=\"col col-15 no-padding hidden-xs hidden-sm\" ng-if=\"!search.compactMode\">&nbsp;</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');\n$templateCache.put('plugins/market/templates/search/list_records.html','<!-- result label -->\\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');\n$templateCache.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 <!-- last record -->\\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 <!-- show closed Ads ? -->\\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 <!-- show old Ads ? -->\\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');\n$templateCache.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 <!-- show categories button -->\\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 <!-- new record button -->\\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 <!-- categories drop down -->\\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 <!-- search text -->\\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 <!-- selected category -->\\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 &nbsp;<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()\">&nbsp;&nbsp;</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 <!-- location -->\\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 <!-- options -->\\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 &nbsp;\\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 <!--<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>-->\\n &nbsp;\\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 <!-- list of records -->\\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');\n$templateCache.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 <!-- Show closed ad ? -->\\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 <!-- Show OLD ad ? -->\\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');\n$templateCache.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 <!-- creation date -->\\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 <!-- price -->\\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');\n$templateCache.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 <!-- 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> -->\\n </label>\\n\\n <!-- location -->\\n <ng-include src=\"\\'plugins/es/templates/common/item_location_search.html\\'\" ng-controller=\"ESSearchPositionItemCtrl\" ng-init=\"\"></ng-include>\\n\\n <!-- options -->\\n <ng-include src=\"::\\'plugins/market/templates/search/lookup_options.html\\'\"></ng-include>\\n </form>\\n\\n \\n\\n <!-- list of records -->\\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');\n$templateCache.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 <!-- star level -->\\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 <!-- market records -->\\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');\n$templateCache.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 <!-- Buttons bar-->\\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 &nbsp;\\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 <!-- list of records -->\\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');\n$templateCache.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 <!-- Buttons bar-->\\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 &nbsp;\\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 <!-- list of records -->\\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');\n$templateCache.put('plugins/market/templates/wot/view_identity_extend.html','\\n<!-- General section -->\\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 <!-- market records -->\\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');\n$templateCache.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 <!-- Buttons bar-->\\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 <!-- list of records -->\\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');}]);","\nangular.module('cesium.es.plugin', [\n // Services\n 'cesium.es.services',\n // Controllers\n 'cesium.es.app.controllers',\n 'cesium.es.common.controllers',\n 'cesium.es.like.controllers',\n 'cesium.es.settings.controllers',\n 'cesium.es.wot.controllers',\n 'cesium.es.wallet.controllers',\n 'cesium.es.profile.controllers',\n 'cesium.es.message.controllers',\n 'cesium.es.notification.controllers',\n 'cesium.es.registry.controllers',\n 'cesium.es.subscription.controllers',\n 'cesium.es.document.controllers',\n 'cesium.es.network.controllers'\n ])\n;\n","\nangular.module('cesium.es.services', [\n // Services\n 'cesium.es.http.services',\n 'cesium.es.comment.services',\n 'cesium.es.social.services',\n 'cesium.es.settings.services',\n 'cesium.es.crypto.services',\n 'cesium.es.profile.services',\n 'cesium.es.notification.services',\n 'cesium.es.message.services',\n 'cesium.es.modal.services',\n 'cesium.es.wallet.services',\n 'cesium.es.subscription.services',\n 'cesium.es.geo.services',\n 'cesium.es.document.services',\n 'cesium.es.registry.services',\n 'cesium.es.network.services',\n 'cesium.es.like.services'\n ])\n;\n","angular.module('cesium.es.comment.services', ['ngResource', 'cesium.services',\n 'cesium.es.http.services', 'cesium.es.profile.services'])\n\n .factory('esComment', ['$rootScope', '$q', 'UIUtils', 'BMA', 'esHttp', 'csWallet', 'csWot', function($rootScope, $q, UIUtils, BMA, esHttp, csWallet, csWot) {\n 'ngInject';\n\n function EsComment(index) {\n\n var\n DEFAULT_SIZE = 20,\n fields = {\n commons: [\"issuer\", \"creationTime\", \"time\", \"message\", \"reply_to\"]\n },\n exports = {\n index: index,\n fields: {\n commons: fields.commons\n },\n raw: {\n search: esHttp.post('/'+index+'/comment/_search'),\n remove: esHttp.record.remove(index, 'comment'),\n wsChanges: esHttp.ws('/ws/_changes'),\n add: new esHttp.record.post('/'+index+'/comment', {creationTime: true}),\n update: new esHttp.record.post('/'+index+'/comment/:id/_update', {creationTime: true})\n }\n };\n\n exports.raw.refreshTreeLinks = function(data) {\n return exports.raw.addTreeLinks(data, true);\n };\n\n exports.raw.addTreeLinks = function(data, refresh) {\n data = data || {};\n data.result = data.result || [];\n data.mapById = data.mapById || {};\n\n var incompleteCommentIdByParentIds = {};\n _.forEach(_.values(data.mapById), function(comment) {\n if (comment.reply_to && !comment.parent) {\n var parent = data.mapById[comment.reply_to];\n if (!parent) {\n parent = new Comment(comment.reply_to);\n incompleteCommentIdByParentIds[parent.id] = comment.id;\n data.mapById[parent.id] = parent;\n }\n if (!refresh || !parent.containsReply(comment)) {\n parent.addReply(comment);\n }\n }\n });\n\n if (!_.size(incompleteCommentIdByParentIds)) {\n var deferred = $q.defer();\n deferred.resolve(data);\n return deferred.promise;\n }\n\n var request = {\n query : {\n terms: {\n _id: _.keys(incompleteCommentIdByParentIds)\n }\n },\n sort : [\n // Need desc, because of size+offset (will be sort in 'asc' order later)\n { \"creationTime\" : {\"order\" : \"desc\"}},\n { \"time\" : {\"order\" : \"desc\"}} // for backward compatibility\n ],\n from: 0,\n size: 1000,\n _source: fields.commons\n };\n\n console.debug(\"[ES] [comment] Getting missing comments in tree\");\n return exports.raw.search(request)\n .then(function(res){\n if (!res.hits.total) {\n console.error(\"[ES] [comment] Comments has invalid [reply_to]: \" + _.values(incompleteCommentIdByParentIds).join(','));\n return data;\n }\n\n _.forEach(res.hits.hits, function(hit) {\n var comment = data.mapById[hit._id];\n comment.copyFromJson(hit._source);\n // Parse URL and hashtags\n comment.html = esHttp.util.parseAsHtml(comment.message);\n delete incompleteCommentIdByParentIds[comment.id];\n });\n\n if (_.size(incompleteCommentIdByParentIds)) {\n console.error(\"Comments has invalid [reply_to]: \" + _.values(incompleteCommentIdByParentIds).join(','));\n }\n\n return exports.raw.addTreeLinks(data); // recursive call\n });\n };\n\n exports.raw.loadDataByRecordId = function(recordId, options) {\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || DEFAULT_SIZE;\n options.loadAvatar = angular.isDefined(options.loadAvatar) ? options.loadAvatar : true;\n options.loadAvatarAllParent = angular.isDefined(options.loadAvatarAllParent) ? (options.loadAvatar && options.loadAvatarAllParent) : false;\n if (options.size < 0) options.size = 1000; // all comments\n\n var request = {\n query : {\n term: { record : recordId}\n },\n sort : [\n // Need desc, because of size+offset (will be sort in 'asc' order later)\n { \"creationTime\" : {\"order\" : \"desc\"}},\n { \"time\" : {\"order\" : \"desc\"}} // for backward compatibility\n ],\n from: options.from,\n size: options.size,\n _source: fields.commons\n };\n\n var data = {\n total: 0,\n mapById: {},\n result: [],\n pendings: {}\n };\n\n // Search comments\n return exports.raw.search(request)\n .then(function(res){\n if (!res.hits.total) return data;\n data.total = res.hits.total;\n data.result = res.hits.hits.reduce(function (result, hit) {\n var comment = new Comment(hit._id, hit._source);\n // Parse URL and hashtags\n comment.html = esHttp.util.parseAsHtml(comment.message);\n // fill map by id\n data.mapById[comment.id] = comment;\n return result.concat(comment);\n }, data.result);\n\n // Add tree (parent/child) link\n return exports.raw.addTreeLinks(data);\n })\n\n // Fill avatars\n .then(function() {\n if (!options.loadAvatar) return;\n if (options.loadAvatarAllParent) {\n return csWot.extendAll(_.values(data.mapById), 'issuer');\n }\n return csWot.extendAll(data.result, 'issuer');\n })\n\n // Sort (creationTime asc)\n .then(function() {\n data.result = data.result.sort(function(cm1, cm2) {\n return (cm1.creationTime - cm2.creationTime);\n });\n return data;\n });\n };\n\n // Add listener to send deletion\n exports.raw.createOnDeleteListener = function(data) {\n return function(comment) {\n var index = _.findIndex(data.result, {id: comment.id});\n if (index === -1) return;\n data.result.splice(index, 1);\n delete data.mapById[comment.id];\n // Send deletion request\n if (csWallet.isUserPubkey(comment.issuer)) {\n exports.raw.remove(comment.id, csWallet.data.keypair)\n .catch(function(err){\n console.error(err);\n throw new Error('MARKET.ERROR.FAILED_REMOVE_COMMENT');\n });\n }\n };\n };\n\n exports.raw.startListenChanges = function(recordId, data, scope) {\n data = data || {};\n data.result = data.result || [];\n data.mapById = data.mapById || {};\n data.pendings = data.pendings || {};\n\n scope = scope||$rootScope;\n\n // Add listener to send deletion\n var onRemoveListener = exports.raw.createOnDeleteListener(data);\n _.forEach(data.result, function(comment) {\n comment.addOnRemoveListener(onRemoveListener);\n });\n\n // Open websocket\n var now = Date.now();\n console.info(\"[ES] [comment] Starting websocket to listen comments on [{0}/record/{1}]\".format(index, recordId.substr(0,8)));\n var wsChanges = esHttp.websocket.changes(index + '/comment');\n return wsChanges.open()\n\n // Listen changes\n .then(function(){\n console.debug(\"[ES] [comment] Websocket opened in {0} ms\".format(Date.now() - now));\n wsChanges.on(function(change) {\n if (!change) return;\n scope.$applyAsync(function() {\n var comment = data.mapById[change._id];\n if (change._operation === 'DELETE') {\n if (comment) comment.remove();\n }\n else if (change._source && change._source.record === recordId) {\n // update\n if (comment) {\n comment.copyFromJson(change._source);\n // Parse URL and hashtags\n comment.html = esHttp.util.parseAsHtml(comment.message);\n exports.raw.refreshTreeLinks(data);\n }\n // create (if not in pending comment)\n else if ((!data.pendings || !data.pendings[change._source.creationTime]) && change._source.issuer != csWallet.data.pubkey) {\n comment = new Comment(change._id, change._source);\n comment.addOnRemoveListener(onRemoveListener);\n comment.isnew = true;\n // Parse URL and hashtags\n comment.html = esHttp.util.parseAsHtml(comment.message);\n // fill map by id\n data.mapById[change._id] = comment;\n exports.raw.refreshTreeLinks(data)\n // fill avatars\n .then(function() {\n return csWot.extend(comment, 'issuer');\n })\n .then(function() {\n data.result.push(comment);\n });\n }\n else {\n console.debug(\"Skip comment received by WS (already in pending)\");\n }\n }\n });\n });\n });\n };\n\n /**\n * Save a comment (add or update)\n * @param recordId\n * @param data\n * @param comment\n * @returns {*}\n */\n exports.raw.save = function(recordId, data, comment) {\n data = data || {};\n data.result = data.result || [];\n data.mapById = data.mapById || {};\n data.pendings = data.pendings || {};\n\n // Preparing JSON to sent\n var id = comment.id;\n var json = {\n creationTime: id ? comment.creationTime || comment.time/*for compat*/ : moment().utc().unix(),\n message: comment.message,\n record: recordId,\n issuer: csWallet.data.pubkey\n };\n if (comment.reply_to || comment.parent) {\n json.reply_to = comment.reply_to || comment.parent.id;\n }\n else {\n json.reply_to = null; // force to null because ES ignore missing field, when updating\n }\n\n // Create or update the entity\n var entity;\n if (!id) {\n entity = new Comment(null, json);\n entity.addOnRemoveListener(exports.raw.createOnDeleteListener(data));\n // copy additional wallet data\n entity.name = csWallet.data.name;\n entity.avatar = csWallet.data.avatar;\n\n entity.isnew = true;\n if (comment.parent) {\n comment.parent.addReply(entity);\n }\n data.result.push(entity);\n }\n else {\n entity = data.mapById[id];\n entity.copy(comment);\n }\n\n // Parse URL and hashtags\n entity.html = esHttp.util.parseAsHtml(entity.message);\n\n // Send add request\n if (!id) {\n data.pendings = data.pendings || {};\n data.pendings[json.creationTime] = json;\n\n return exports.raw.add(json)\n .then(function (id) {\n entity.id = id;\n data.mapById[id] = entity;\n delete data.pendings[json.creationTime];\n return entity;\n });\n }\n // Send update request\n else {\n return exports.raw.update(json, {id: id})\n .then(function () {\n return entity;\n });\n }\n };\n\n exports.raw.stopListenChanges = function(data) {\n console.debug(\"[ES] [comment] Stopping websocket on comments\");\n _.forEach(data.result, function(comment) {\n comment.cleanAllListeners();\n });\n // Close previous\n exports.raw.wsChanges().close();\n };\n\n // Expose functions\n exports.load = exports.raw.loadDataByRecordId;\n exports.save = exports.raw.save;\n exports.changes = {\n start: exports.raw.startListenChanges,\n stop: exports.raw.stopListenChanges\n };\n return exports;\n }\n\n return {\n instance: EsComment\n };\n }])\n;\n","angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.services', 'cesium.config'])\n\n /**\n * Elastic Search Http\n */\n .factory('esHttp', ['$q', '$timeout', '$rootScope', '$state', '$sce', '$translate', '$window', '$filter', 'CryptoUtils', 'UIUtils', 'csHttp', 'csConfig', 'csSettings', 'csCache', 'BMA', 'csWallet', 'csPlatform', 'Api', function($q, $timeout, $rootScope, $state, $sce, $translate, $window, $filter,\n CryptoUtils, UIUtils, csHttp, csConfig, csSettings, csCache, BMA, csWallet, csPlatform, Api) {\n 'ngInject';\n\n // Allow to force SSL connection with port different from 443\n var forceUseSsl = (csConfig.httpsMode === 'true' || csConfig.httpsMode === true || csConfig.httpsMode === 'force') ||\n ($window.location && $window.location.protocol === 'https:') ? true : false;\n if (forceUseSsl) {\n console.debug('[ES] [https] Enable SSL (forced by config or detected in URL)');\n }\n\n function EsHttp(host, port, useSsl, useCache) {\n\n var\n that = this,\n cachePrefix = 'esHttp-',\n constants = {\n ES_USER_API: 'GCHANGE_API',\n ES_SUBSCRIPTION_API: 'GCHANGE_SUBSCRIPTION_API',\n ES_USER_API_ENDPOINT: 'GCHANGE_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))',\n ANY_API_ENDPOINT: '([A-Z_]+)(?:[ ]+([a-z_][a-z0-9-_.ğĞ]*))?(?:[ ]+([0-9.]+))?(?:[ ]+([0-9a-f:]+))?(?:[ ]+([0-9]+))(?:\\\\/[^\\\\/]+)?',\n MAX_UPLOAD_BODY_SIZE: csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.maxUploadBodySize || 2097152 /*=2M*/,\n GCHANGE_API: 'GCHANGE_API',\n like: {\n KINDS: ['VIEW', 'LIKE', 'DISLIKE', 'FOLLOW', 'ABUSE', 'STAR']\n }\n },\n regexp = {\n IMAGE_SRC: exact('data:([A-Za-z//]+);base64,(.+)'),\n URL: match('(www\\\\.|https?:\\/\\/(www\\\\.)?)[-a-zA-Z0-9@:%._\\\\+~#=]{2,256}\\\\.[a-z]{2,6}\\\\b([-a-zA-Z0-9@:%_\\\\+.~#?&//=]*)'),\n HASH_TAG: match('(?:^|[\\t\\n\\r\\s ])#([0-9_-\\\\wḡĞǦğàáâãäåçèéêëìíîïðòóôõöùúûüýÿ]+)'),\n USER_TAG: match('(?:^|[\\t\\n\\r\\s ])@('+BMA.constants.regexp.USER_ID+')'),\n ES_USER_API_ENDPOINT: exact(constants.ES_USER_API_ENDPOINT),\n API_ENDPOINT: exact(constants.ANY_API_ENDPOINT),\n },\n fallbackNodeIndex = 0,\n listeners,\n defaultSettingsNode,\n truncUrlFilter = $filter('truncUrl');\n\n that.data = {\n isFallback: false\n };\n that.cache = _emptyCache();\n that.api = new Api(this, \"esHttp\");\n that.started = false;\n that.init = init;\n\n init(host, port, useSsl, useCache);\n that.useCache = angular.isDefined(useCache) ? useCache : false; // need here because used in get() function\n\n function init(host, port, useSsl, useCache) {\n // Use settings as default\n if (!host && csSettings.data) {\n host = host || (csSettings.data.plugins && csSettings.data.plugins.es ? csSettings.data.plugins.es.host : null);\n port = port || (host ? csSettings.data.plugins.es.port : null);\n useSsl = angular.isDefined(useSsl) ? useSsl : (port == 443 || csSettings.data.plugins.es.useSsl || forceUseSsl);\n }\n\n that.alive = false;\n that.host = host;\n that.port = port || ((useSsl || forceUseSsl) ? 443 : 80);\n that.useSsl = angular.isDefined(useSsl) ? useSsl : (that.port == 443 || forceUseSsl);\n\n that.server = csHttp.getServer(host, port);\n }\n\n function isSameNodeAsSettings(data) {\n data = data || csSettings.data;\n if (!data.plugins || !data.plugins.es) return false;\n\n var host = data.plugins.es.host;\n var useSsl = data.plugins.es.port == 443 || data.plugins.es.useSsl || forceUseSsl;\n var port = data.plugins.es.port || (useSsl ? 443 : 80);\n\n return isSameNode(host, port, useSsl);\n }\n\n function isSameNode(host, port, useSsl) {\n return (that.host === host) &&\n (that.port === port) &&\n (angular.isUndefined(useSsl) || useSsl == that.useSsl);\n }\n\n // Say if the ES node is a fallback node or the configured node\n function isFallbackNode() {\n return that.data.isFallback;\n }\n\n // Set fallback flag (e.g. called by ES settings, when resetting settings)\n function setIsFallbackNode(isFallback) {\n that.data.isFallback = isFallback;\n }\n\n function exact(regexpContent) {\n return new RegExp('^' + regexpContent + '$');\n }\n function match(regexpContent) {\n return new RegExp(regexpContent);\n }\n\n function _emptyCache() {\n return {\n getByPath: {},\n postByPath: {},\n wsByPath: {}\n };\n }\n\n function onSettingsReset(data, deferred) {\n deferred = deferred || $q.defer();\n\n if (that.data.isFallback) {\n // Force a restart\n if (that.started) {\n that.stop();\n }\n }\n\n // Reset to default values\n that.data.isFallback = false;\n defaultSettingsNode = null;\n\n deferred.resolve(data);\n return deferred.promise;\n }\n\n that.cleanCache = function() {\n console.debug('[ES] [http] Cleaning requests cache...');\n _.keys(that.cache.wsByPath).forEach(function(key) {\n var sock = that.cache.wsByPath[key];\n sock.close();\n });\n that.cache = _emptyCache();\n\n csCache.clear(cachePrefix);\n };\n\n that.copy = function(otherNode) {\n if (that.started) that.stop();\n that.init(otherNode.host, otherNode.port, otherNode.useSsl || otherNode.port == 443);\n that.data.isTemporary = false; // reset temporary flag\n return that.start(true /*skipInit*/);\n };\n\n // Get node time (UTC) FIXME: get it from the node\n that.date = { now : csHttp.date.now };\n\n that.byteCount = function (s) {\n s = (typeof s == 'string') ? s : JSON.stringify(s);\n return encodeURI(s).split(/%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./).length - 1;\n };\n\n that.getUrl = function(path) {\n return csHttp.getUrl(that.host, that.port, path, that.useSsl);\n };\n\n that.get = function (path, cacheTime) {\n\n cacheTime = that.useCache && cacheTime;\n var cacheKey = path + (cacheTime ? ('#'+cacheTime) : '');\n\n var getRequestFn = function(params) {\n if (!that.started) {\n if (!that._startPromise) {\n console.warn('[ES] [http] Trying to get [{0}] before start(). Waiting...'.format(path));\n }\n return that.ready().then(function(start) {\n if (!start) return $q.reject('ERROR.ES_CONNECTION_ERROR');\n return getRequestFn(params); // loop\n });\n }\n\n var request = that.cache.getByPath[cacheKey];\n if (!request) {\n if (cacheTime) {\n request = csHttp.getWithCache(that.host, that.port, path, that.useSsl, cacheTime, null, null, cachePrefix);\n }\n else {\n request = csHttp.get(that.host, that.port, path, that.useSsl);\n }\n that.cache.getByPath[cacheKey] = request;\n }\n return request(params);\n };\n\n return getRequestFn;\n };\n\n that.post = function(path) {\n var postRequest = function(obj, params) {\n if (!that.started) {\n if (!that._startPromise) {\n console.error('[ES] [http] Trying to post [{0}] before start()...'.format(path));\n }\n return that.ready().then(function(start) {\n if (!start) return $q.reject('ERROR.ES_CONNECTION_ERROR');\n return postRequest(obj, params); // loop\n });\n }\n\n var request = that.cache.postByPath[path];\n if (!request) {\n request = csHttp.post(that.host, that.port, path, that.useSsl);\n that.cache.postByPath[path] = request;\n }\n return request(obj, params);\n };\n return postRequest;\n };\n\n that.ws = function(path) {\n return function() {\n var sock = that.cache.wsByPath[path];\n if (!sock || sock.isClosed()) {\n sock = csHttp.ws(that.host, that.port, path, that.useSsl);\n\n // When close, remove from cache\n sock.onclose = function() {\n delete that.cache.wsByPath[path];\n };\n\n that.cache.wsByPath[path] = sock;\n }\n return sock;\n };\n };\n\n that.wsChanges = function(source) {\n var wsChanges = that.ws('/ws/_changes')();\n if (!source) return wsChanges;\n\n // If a source is given, send it just after connection open\n var _inheritedOpen = wsChanges.open;\n wsChanges.open = function() {\n return _inheritedOpen.call(wsChanges).then(function(sock) {\n if(sock) {\n sock.send(source);\n }\n else {\n console.warn('Trying to access ws changes, but no sock anymore... already open ?');\n }\n });\n };\n return wsChanges;\n };\n\n that.isAlive = function() {\n return csHttp.get(that.host, that.port, '/node/summary', that.useSsl)()\n .then(function(json) {\n var software = json && json.duniter && json.duniter.software || 'unknown';\n if (software === \"gchange-pod\" || software === \"cesium-plus-pod\") return true;\n console.error(\"[ES] [http] Not a Gchange Pod, but a {0} node. Please check '/summary/node'\".format(software));\n return false;\n })\n .catch(function() {\n return false;\n });\n };\n\n // Alert user if node not reached - fix issue #\n that.checkNodeAlive = function(alive) {\n if (alive) {\n setIsFallbackNode(!isSameNodeAsSettings());\n return true;\n }\n if (angular.isUndefined(alive)) {\n return that.isAlive().then(that.checkNodeAlive);\n }\n\n var settings = csSettings.data.plugins && csSettings.data.plugins.es || {};\n\n // Remember the default node\n defaultSettingsNode = defaultSettingsNode || {\n host: settings.host,\n port: settings.port\n };\n\n var fallbackNode = settings.fallbackNodes && fallbackNodeIndex < settings.fallbackNodes.length && settings.fallbackNodes[fallbackNodeIndex++];\n if (!fallbackNode) {\n $translate('ERROR.ES_CONNECTION_ERROR', {server: that.server})\n .then(UIUtils.alert.info);\n return false; // stop the loop\n }\n var newServer = csHttp.getServer(fallbackNode.host, fallbackNode.port);\n UIUtils.loading.hide();\n return $translate('CONFIRM.ES_USE_FALLBACK_NODE', {old: that.server, new: newServer})\n .then(UIUtils.alert.confirm)\n .then(function (confirm) {\n if (!confirm) return false; // stop the loop\n\n that.cleanCache();\n\n that.init(fallbackNode.host, fallbackNode.port, fallbackNode.useSsl || fallbackNode.port == 443);\n\n // check is alive then loop\n return that.isAlive().then(that.checkNodeAlive);\n });\n };\n\n that.isStarted = function() {\n return that.started;\n };\n\n that.ready = function() {\n if (that.started) return $q.when(true);\n return that._startPromise || that.start();\n };\n\n that.start = function(skipInit) {\n if (that._startPromise) return that._startPromise;\n if (that.started) return $q.when(that.alive);\n\n that._startPromise = csPlatform.ready()\n .then(function() {\n\n if (!skipInit) {\n // Init with defaults settings\n that.init();\n }\n })\n .then(function() {\n console.debug('[ES] [http] Starting on [{0}]{1}...'.format(\n that.server,\n (that.useSsl ? ' (SSL on)' : '')\n ));\n var now = Date.now();\n\n return that.checkNodeAlive()\n .then(function(alive) {\n that.alive = alive;\n if (!alive) {\n console.error('[ES] [http] Could not start [{0}]: node unreachable'.format(that.server));\n that.started = true;\n delete that._startPromise;\n fallbackNodeIndex = 0; // reset the fallback node counter\n return false;\n }\n\n // Add listeners\n addListeners();\n\n console.debug('[ES] [http] Started in '+(Date.now()-now)+'ms');\n that.api.node.raise.start();\n\n\n that.started = true;\n delete that._startPromise;\n fallbackNodeIndex = 0; // reset the fallback node counter\n\n\n return true;\n });\n });\n return that._startPromise;\n };\n\n that.stop = function() {\n console.debug('[ES] [http] Stopping...');\n\n removeListeners();\n\n setIsFallbackNode(false); // will be re-computed during start phase\n delete that._startPromise;\n if (that.alive) {\n that.cleanCache();\n that.alive = false;\n that.started = false;\n that.api.node.raise.stop();\n }\n else {\n that.started = false;\n }\n return $q.when();\n };\n\n that.restart = function() {\n that.stop();\n return $timeout(that.start, 200);\n };\n\n function parseTagsFromText(value, prefix) {\n prefix = prefix || '#';\n var reg = prefix === '@' ? regexp.USER_TAG : regexp.HASH_TAG;\n var matches = value && reg.exec(value);\n var tags = matches && [];\n while(matches) {\n var tag = matches[1];\n if (!_.contains(tags, tag)) {\n tags.push(tag);\n }\n value = value.substr(matches.index + matches[1].length + 1);\n matches = value.length > 0 && reg.exec(value);\n }\n return tags;\n }\n\n function parseUrlsFromText(value) {\n var matches = value && regexp.URL.exec(value);\n var urls = matches && [];\n while(matches) {\n var url = matches[0];\n if (!_.contains(urls, url)) {\n urls.push(url);\n }\n value = value.substr(matches.index + matches[0].length + 1);\n matches = value && regexp.URL.exec(value);\n }\n return urls;\n }\n\n function parseMarkdownTitlesFromText(value, prefix, suffix) {\n prefix = prefix || '##';\n var reg = match('(?:^|[\\\\r\\\\s])('+prefix+'([^#></]+)' + (suffix||'') + ')');\n var matches = value && reg.exec(value);\n var lines = matches && [];\n var res = matches && [];\n while(matches) {\n var line = matches[1];\n if (!_.contains(lines, line)) {\n lines.push(line);\n res.push({\n line: line,\n title: matches[2]\n });\n }\n value = value.substr(matches.index + matches[1].length + 1);\n matches = value.length > 0 && reg.exec(value);\n }\n return res;\n }\n\n\n function escapeHtmlTags(text) {\n if (!text) return text;\n return text.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n\n function parseAsHtml(text, options) {\n\n // Escape HTML tags\n var content = text ? escapeHtmlTags(text.trim()) : undefined;\n\n if (content) {\n options = options || {};\n options.tagState = options.tagState || 'app.user_lookup';\n options.nameState = options.nameState || 'app.user_identity_name';\n if (options.newLine || !angular.isDefined(options.newLine)) {\n content = content.replace(/\\n/g, '<br>\\n');\n }\n\n // Replace URL in description\n var urls = parseUrlsFromText(content);\n _.forEach(urls, function(url){\n // Make sure protocol is defined\n var href = (url.startsWith('http://') || url.startsWith('https://')) ? url : ('http://' + url);\n // Redirect URL to the function 'openLink', to open a new window if need (e.g. desktop app)\n var link = '<a on-tap=\\\"openLink($event, \\'{0}\\')\\\" href=\\\"{1}\\\" target=\"_blank\">{2}</a>'.format(href, href, truncUrlFilter(url));\n content = content.replace(url, link);\n });\n\n // Replace hashtags\n var hashTags = parseTagsFromText(content);\n _.forEach(hashTags, function(tag){\n var link = '<a ui-sref=\\\"{0}({hash: \\'{1}\\'})\\\">#{2}</a>'.format(options.tagState, tag, tag);\n content = content.replace('#'+tag, link);\n });\n\n // Replace user tags\n var userTags = parseTagsFromText(content, '@');\n _.forEach(userTags, function(tag){\n var link = '<a ui-sref=\\\"{0}({name: \\'{1}\\'})\\\">@{2}</a>'.format(options.nameState, tag, tag);\n content = content.replace('@'+tag, link);\n });\n\n // Replace markdown titles\n var titles = parseMarkdownTitlesFromText(content, '#+[ ]*', '<br>');\n _.forEach(titles, function(matches){\n var size = matches.line.lastIndexOf('#', 5)+1;\n content = content.replace(matches.line, '<h{0}>{1}</h{2}>'.format(size, matches.title, size));\n });\n }\n return content;\n }\n\n function fillRecordTags(record, fieldNames) {\n fieldNames = fieldNames || ['title', 'description'];\n\n record.tags = fieldNames.reduce(function(res, fieldName) {\n var value = record[fieldName];\n var tags = value && parseTagsFromText(value);\n return tags ? res.concat(tags) : res;\n }, []);\n }\n\n function findObjectInTree(obj, attrName) {\n if (!obj) return;\n if (obj[attrName]) return obj[attrName];\n if (Array.isArray(obj)) {\n return obj.reduce(function(res, item) {\n return res ? res : findObjectInTree(item, attrName);\n }, false);\n }\n else if (typeof obj == \"object\") {\n return _.reduce(_.keys(obj), function (res, key) {\n return res ? res : findObjectInTree(obj[key], attrName);\n }, false);\n }\n }\n\n function postRecord(path, options) {\n options = options || {};\n var postRequest = that.post(path);\n return function(record, params) {\n if (!csWallet.isLogin()) return $q.reject('Wallet must be login before sending record to ES node');\n if (options.creationTime && !record.creationTime) {\n record.creationTime = moment().utc().unix();\n }\n // Always update the time - fix Cesium #572\n // Make sure time is always > previous (required by ES node)\n var now = moment().utc().unix();\n record.time = (!record.time || record.time < now) ? now : (record.time+1);\n\n var keypair = csWallet.data.keypair;\n var obj = angular.copy(record);\n delete obj.signature;\n delete obj.hash;\n obj.issuer = csWallet.data.pubkey;\n if (!obj.version) {\n obj.version = 2;\n }\n\n // Fill tags\n if (options.tagFields) {\n fillRecordTags(obj, options.tagFields);\n }\n\n var str = JSON.stringify(obj);\n\n return CryptoUtils.util.hash(str)\n .then(function(hash) {\n return CryptoUtils.sign(hash, keypair)\n .then(function(signature) {\n // Prepend hash+signature\n str = '{\"hash\":\"{0}\",\"signature\":\"{1}\",'.format(hash, signature) + str.substring(1);\n // Send data\n return postRequest(str, params)\n .then(function (id){\n\n // Clear cache\n csCache.clear(cachePrefix);\n\n return id;\n })\n .catch(function(err) {\n var bodyLength = that.byteCount(obj);\n if (bodyLength > constants.MAX_UPLOAD_BODY_SIZE) {\n throw {message: 'ERROR.ES_MAX_UPLOAD_BODY_SIZE', length: bodyLength};\n }\n throw err;\n });\n });\n });\n };\n }\n\n function countRecords(index, type, cacheTime) {\n var getRequest = that.get(\"/{0}/{1}/_search?size=0\".format(index, type), cacheTime);\n return function(params) {\n return getRequest(params)\n .then(function(res) {\n return res && res.hits && res.hits.total;\n });\n };\n }\n\n function removeRecord(index, type) {\n return function(id) {\n if (!csWallet.isLogin()) return $q.reject('Wallet must be login before sending record to ES node');\n\n var obj = {\n version: 2,\n index: index,\n type: type,\n id: id,\n issuer: csWallet.data.pubkey,\n time: moment().utc().unix()\n };\n var str = JSON.stringify(obj);\n return CryptoUtils.util.hash(str)\n .then(function(hash) {\n return CryptoUtils.sign(hash, csWallet.data.keypair)\n .then(function(signature) {\n // Prepend hash+signature\n str = '{\"hash\":\"{0}\",\"signature\":\"{1}\",'.format(hash, signature) + str.substring(1);\n // Send data\n return that.post('/history/delete')(str)\n .then(function (id) {\n return id;\n });\n });\n });\n };\n }\n\n that.image = {};\n\n function imageFromAttachment(attachment) {\n if (!attachment || !attachment._content_type || !attachment._content || attachment._content.length === 0) {\n return null;\n }\n var image = {\n src: \"data:\" + attachment._content_type + \";base64,\" + attachment._content\n };\n if (attachment._title) {\n image.title = attachment._title;\n }\n if (attachment._name) {\n image.name = attachment._name;\n }\n return image;\n }\n\n function imageToAttachment(image) {\n if (!image || !image.src) return null;\n var match = regexp.IMAGE_SRC.exec(image.src);\n if (!match) return null;\n var attachment = {\n _content_type: match[1],\n _content: match[2]\n };\n if (image.title) {\n attachment._title = image.title;\n }\n if (image.name) {\n attachment._name = image.name;\n }\n return attachment;\n }\n\n /**\n * This will create a image (src, title, name) using the _content is present, or computing a image URL to the ES node\n * @param host\n * @param port\n * @param hit\n * @param imageField\n * @returns {{}}\n */\n that.image.fromHit = function(hit, imageField) {\n if (!hit || !hit._source) return;\n var attachment = hit._source[imageField];\n if (!attachment || !attachment._content_type || !attachment._content_type.startsWith(\"image/\")) return;\n var image = {};\n // If full content: then use it directly\n if (attachment._content) {\n image.src = \"data:\" + attachment._content_type + \";base64,\" + attachment._content;\n }\n // Compute an url\n else {\n var extension = attachment._content_type.substr(6);\n var path = [hit._index, hit._type, hit._id, '_image', imageField].join('/');\n path = '/' + path + '.' + extension;\n image.src = that.getUrl(path);\n }\n if (attachment._title) {\n image.title = attachment._title;\n }\n if (attachment._name) {\n image.name = attachment._name;\n }\n return image;\n };\n\n function parseEndPoint(endpoint) {\n var matches = regexp.API_ENDPOINT.exec(endpoint);\n if (!matches) return;\n return {\n \"api\": matches[1] || '',\n \"dns\": matches[2] || '',\n \"ipv4\": matches[3] || '',\n \"ipv6\": matches[4] || '',\n \"port\": matches[5] || 80,\n \"path\": matches[6] || '',\n \"useSsl\": matches[5] == 443\n };\n }\n\n function emptyHit() {\n return {\n _id: null,\n _index: null,\n _type: null,\n _version: null,\n _source: {}\n };\n }\n\n function addListeners() {\n // Watch some service events\n listeners = [\n csSettings.api.data.on.reset($rootScope, onSettingsReset, that)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n // Define events\n that.api.registerEvent('node', 'start');\n that.api.registerEvent('node', 'stop');\n\n var exports = {\n getServer: csHttp.getServer,\n node: {\n summary: that.get('/node/summary'),\n parseEndPoint: parseEndPoint,\n same: isSameNode,\n sameAsSettings: isSameNodeAsSettings,\n isFallback: isFallbackNode\n },\n websocket: {\n changes: that.wsChanges,\n block: that.ws('/ws/block'),\n peer: that.ws('/ws/peer')\n },\n wot: {\n member: {\n uids : that.get('/wot/members')\n }\n },\n network: {\n peering: {\n self: that.get('/network/peering')\n },\n peers: that.get('/network/peers')\n },\n record: {\n post: postRecord,\n remove: removeRecord,\n count : countRecords\n },\n image: {\n fromAttachment: imageFromAttachment,\n toAttachment: imageToAttachment\n },\n hit: {\n empty: emptyHit\n },\n util: {\n parseTags: parseTagsFromText,\n parseAsHtml: parseAsHtml,\n escapeHtmlTags: escapeHtmlTags,\n findObjectInTree: findObjectInTree\n },\n cache: csHttp.cache,\n constants: constants\n };\n exports.constants.regexp = regexp;\n angular.merge(that, exports);\n }\n\n\n var service = new EsHttp(undefined, undefined, undefined, true);\n\n service.instance = function(host, port, useSsl, useCache) {\n return new EsHttp(host, port, useSsl, useCache);\n };\n\n service.lightInstance = function(host, port, useSsl, timeout) {\n port = port || 80;\n useSsl = angular.isDefined(useSsl) ? useSsl : (+port === 443);\n\n function countHits(path, params) {\n return csHttp.get(host, port, path)(params)\n .then(function(res) {\n return res && res.hits && res.hits.total;\n });\n }\n\n function countRecords(index, type) {\n return countHits(\"/{0}/{1}/_search?size=0\".format(index, type));\n }\n\n function countSubscriptions(params) {\n var queryString = _.keys(params||{}).reduce(function(res, key) {\n return (res && (res + \" AND \") || \"\") + key + \":\" + params[key];\n }, '');\n return countHits(\"/subscription/record/_search?size=0&q=\" + queryString);\n }\n\n return {\n host: host,\n port: port,\n useSsl: useSsl,\n node: {\n summary: csHttp.getWithCache(host, port, '/node/summary', useSsl, csHttp.cache.LONG, false, timeout)\n },\n network: {\n peering: {\n self: csHttp.get(host, port, '/network/peering', useSsl, timeout)\n },\n peers: csHttp.get(host, port, '/network/peers', useSsl, timeout)\n },\n blockchain: {\n current: csHttp.get(host, port, '/blockchain/current?_source=number,hash,medianTime', useSsl, timeout)\n },\n record: {\n count: countRecords\n },\n subscription: {\n count: countSubscriptions\n }\n };\n };\n\n return service;\n }])\n;\n","angular.module('cesium.es.settings.services', ['cesium.services', 'cesium.es.http.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esSettings');\n }\n\n }])\n\n.factory('esSettings', ['$rootScope', '$q', '$timeout', 'Api', 'esHttp', 'csConfig', 'csSettings', 'CryptoUtils', 'Device', 'UIUtils', 'csWallet', function($rootScope, $q, $timeout, Api, esHttp,\n csConfig, csSettings, CryptoUtils, Device, UIUtils, csWallet) {\n 'ngInject';\n\n var\n SETTINGS_SAVE_SPEC = {\n includes: ['locale', 'useRelative', 'useLocalStorage', 'expertMode', 'logoutIdle'],\n excludes: ['newIssueVersion', 'timeout', 'cacheTimeMs', 'time', 'login', 'build'],\n plugins: {\n es: {\n excludes: ['enable', 'host', 'port', 'useSsl', 'fallbackNodes', 'minVersion', 'document', 'maxUploadBodySize', 'defaultCountry', 'market'],\n notifications: {\n }\n }\n },\n helptip: {\n excludes: ['installDocUrl']\n }\n },\n fixedSettings = {\n plugins: {\n es: {\n minVersion: \"1.2.0\",\n document: {\n index: 'user',\n type: 'profile'\n }\n }\n }\n },\n defaultSettings = angular.merge({\n plugins: {\n es: {\n askEnable: false,\n notifications: {\n readTime: true,\n txSent: true,\n txReceived: true,\n certSent: true,\n certReceived: true\n },\n invitations: {\n readTime: true\n },\n defaultCountry: undefined,\n enableGoogleApi: false,\n googleApiKey: undefined,\n wot: {\n enableMixedSearch: true\n },\n geoDistance: '50km'\n }\n }\n },\n fixedSettings,\n {plugins: {es: csConfig.plugins && csConfig.plugins.es || {}}}\n ),\n that = this,\n api = new Api('esSettings'),\n previousRemoteData,\n listeners,\n ignoreSettingsChanged = false\n ;\n\n that.api = api;\n that.get = esHttp.get('/user/settings/:id');\n that.add = esHttp.record.post('/user/settings');\n that.update = esHttp.record.post('/user/settings/:id/_update');\n\n that.isEnable = function() {\n return csSettings.data.plugins &&\n csSettings.data.plugins.es &&\n csSettings.data.plugins.es.enable &&\n !!csSettings.data.plugins.es.host;\n };\n\n that.setPluginSaveSpecs = function(pluginName, saveSpecs) {\n if (pluginName && saveSpecs) {\n SETTINGS_SAVE_SPEC.plugins[pluginName] = angular.copy(saveSpecs);\n }\n };\n\n function copyUsingSpec(data, copySpec) {\n var result = {};\n\n // Add implicit includes\n if (copySpec.includes) {\n _.forEach(_.keys(copySpec), function(key) {\n if (key !== \"includes\" && key !== \"excludes\") {\n copySpec.includes.push(key);\n }\n });\n }\n\n _.forEach(_.keys(data), function(key) {\n if ((!copySpec.includes || _.contains(copySpec.includes, key)) &&\n (!copySpec.excludes || !_.contains(copySpec.excludes, key))) {\n if (data[key] && (typeof data[key] == 'object') &&\n copySpec[key] && (typeof copySpec[key] == 'object')) {\n result[key] = copyUsingSpec(data[key], copySpec[key]); // Recursive call\n }\n else {\n result[key] = data[key];\n }\n }\n });\n return result;\n }\n\n // Load settings\n function loadSettings(pubkey, keypair) {\n var now = Date.now();\n return $q.all([\n CryptoUtils.box.keypair.fromSignKeypair(keypair),\n that.get({id: pubkey})\n .catch(function(err){\n if (err && err.ucode && err.ucode == 404) {\n return null; // not found\n }\n else {\n throw err;\n }\n })])\n .then(function(res) {\n var boxKeypair = res[0];\n res = res[1];\n if (!res || !res._source) {\n return;\n }\n var record = res._source;\n // Do not apply if same version\n if (record.time === csSettings.data.time) {\n console.debug('[ES] [settings] Loaded user settings in '+ (Date.now()-now) +'ms (no update need)');\n return;\n }\n var nonce = CryptoUtils.util.decode_base58(record.nonce);\n // Decrypt settings content\n return CryptoUtils.box.open(record.content, nonce, boxKeypair.boxPk, boxKeypair.boxSk)\n .then(function(json) {\n var settings = JSON.parse(json || '{}');\n settings.time = record.time;\n console.debug('[ES] [settings] Loaded user settings in '+ (Date.now()-now) +'ms');\n //console.debug(settings);\n\n return settings;\n })\n // if error: skip stored content\n .catch(function(err){\n console.error('[ES] [settings] Could not read stored settings: ' + (err && err.message || 'decryption error'));\n // make sure to remove time, to be able to save it again\n delete csSettings.data.time;\n return null;\n });\n });\n }\n\n function onSettingsReset(data, deferred) {\n deferred = deferred || $q.defer();\n angular.merge(data, defaultSettings);\n deferred.resolve(data);\n return deferred.promise;\n }\n\n function onWalletLogin(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n deferred.resolve();\n return deferred.promise;\n }\n\n // Waiting to load crypto libs\n if (!CryptoUtils.isLoaded()) {\n console.debug('[ES] [settings] Waiting crypto lib loading...');\n return $timeout(function() {\n return onWalletLogin(data, deferred);\n }, 50);\n }\n\n console.debug('[ES] [settings] Loading user settings...');\n\n // Load settings\n loadSettings(data.pubkey, data.keypair)\n .then(function(settings) {\n if (!settings) return; // not found or up to date\n angular.merge(csSettings.data, settings);\n\n // Remember for comparison\n previousRemoteData = settings;\n\n console.debug('[ES] [settings] Successfully load settings from ES');\n return storeSettingsLocally();\n })\n .then(function() {\n deferred.resolve(data);\n })\n .catch(function(err){\n deferred.reject(err);\n });\n\n return deferred.promise;\n }\n\n // Listen for settings changed\n function onSettingsChanged(data) {\n // avoid recursive call, because storeSettingsLocally() could emit event again\n if (ignoreSettingsChanged) return;\n\n var wasEnable = listeners && listeners.length > 0;\n\n refreshState();\n\n var isEnable = that.isEnable();\n if (csWallet.isLogin()) {\n if (!wasEnable && isEnable) {\n\n onWalletLogin(csWallet.data);\n }\n else {\n storeSettingsRemotely(data);\n }\n }\n }\n\n function storeSettingsLocally() {\n if (ignoreSettingsChanged) return $q.when();\n ignoreSettingsChanged = true;\n return csSettings.store()\n .then(function(){\n ignoreSettingsChanged = false;\n })\n .catch(function(err) {\n ignoreSettingsChanged = false;\n throw err;\n });\n }\n\n function storeSettingsRemotely(data) {\n if (!csWallet.isLogin()) return $q.when();\n\n var filteredData = copyUsingSpec(data, SETTINGS_SAVE_SPEC);\n if (previousRemoteData && angular.equals(filteredData, previousRemoteData)) {\n return $q.when();\n }\n\n // Waiting to load crypto libs\n if (!CryptoUtils.isLoaded()) {\n console.debug('[ES] [settings] Waiting crypto lib loading...');\n return $timeout(function() {\n return storeSettingsRemotely();\n }, 50);\n }\n\n var time = esHttp.date.now();\n console.debug('[ES] [settings] Saving user settings... at time ' + time);\n\n return $q.all([\n CryptoUtils.box.keypair.fromSignKeypair(csWallet.data.keypair),\n CryptoUtils.util.random_nonce()\n ])\n .then(function(res) {\n var boxKeypair = res[0];\n var nonce = res[1];\n\n var record = {\n issuer: csWallet.data.pubkey,\n nonce: CryptoUtils.util.encode_base58(nonce),\n time: time\n };\n\n //console.debug(\"Will store settings remotely: \", filteredData);\n\n var json = JSON.stringify(filteredData);\n\n return CryptoUtils.box.pack(json, nonce, boxKeypair.boxPk, boxKeypair.boxSk)\n .then(function(cypherText) {\n record.content = cypherText;\n // create or update\n return !data.time ?\n that.add(record) :\n that.update(record, {id: record.issuer});\n });\n })\n .then(function() {\n // Update settings version, then store (on local store only)\n csSettings.data.time = time;\n previousRemoteData = filteredData;\n console.debug('[ES] [settings] Saved user settings in ' + (esHttp.date.now() - time) + 'ms');\n return storeSettingsLocally();\n })\n .catch(function(err) {\n console.error(err);\n throw err;\n })\n ;\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWallet.login()\n listeners = [\n csSettings.api.data.on.reset($rootScope, onSettingsReset, this),\n csWallet.api.data.on.login($rootScope, onWalletLogin, this)\n ];\n }\n\n function refreshState() {\n var enable = that.isEnable();\n\n // Disable\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [settings] Disable\");\n removeListeners();\n\n // Force ES node to stop\n return esHttp.stop()\n .then(function() {\n // Emit event\n api.state.raise.changed(enable);\n });\n }\n\n // Enable\n else if (enable && (!listeners || listeners.length === 0)) {\n return esHttp.start()\n .then(function(started) {\n if (!started) {\n // TODO : alert user ?\n console.error('[ES] node could not be started !!');\n }\n else {\n console.debug(\"[ES] [settings] Enable\");\n addListeners();\n\n if (csWallet.isLogin()) {\n return onWalletLogin(csWallet.data)\n .then(function() {\n // Emit event\n api.state.raise.changed(enable);\n });\n }\n else {\n // Emit event\n api.state.raise.changed(enable);\n }\n }\n });\n }\n }\n\n api.registerEvent('state', 'changed');\n\n csSettings.ready().then(function() {\n\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this);\n esHttp.api.node.on.stop($rootScope, function() {\n previousRemoteData = null;\n }, this);\n return refreshState();\n });\n\n return that;\n}]);\n","angular.module('cesium.es.social.services', ['cesium.es.crypto.services'])\n\n.factory('SocialUtils', ['$filter', '$q', 'CryptoUtils', 'BMA', 'csWallet', 'esCrypto', function($filter, $q, CryptoUtils, BMA, csWallet, esCrypto) {\n 'ngInject';\n\n function SocialUtils() {\n\n var\n regexp = {\n URI: \"([a-zAZ0-9]+)://[ a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+\",\n 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])?$\",\n PHONE: \"[+]?[0-9. ]{9,15}\",\n socials: {\n facebook: \"https?://((fb.me)|((www.)?facebook.com))\",\n twitter: \"https?://(www.)?twitter.com\",\n googleplus: \"https?://plus.google.com(/u)?\",\n youtube: \"https?://(www.)?youtube.com\",\n github: \"https?://(www.)?github.com\",\n tumblr: \"https?://(www.)?tumblr.com\",\n snapchat: \"https?://(www.)?snapchat.com\",\n linkedin: \"https?://(www.)?linkedin.com\",\n vimeo: \"https?://(www.)?vimeo.com\",\n instagram: \"https?://(www.)?instagram.com\",\n wordpress: \"https?://([a-z]+)?wordpress.com\",\n diaspora: \"https?://(www.)?((diaspora[-a-z]+)|(framasphere)).org\",\n duniter: \"duniter://[a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+\",\n bitcoin: \"bitcoin://[a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+\",\n curve25519: \"curve25519://(\" + BMA.constants.regexp.PUBKEY + \"):([a-zA-Z0-9]+)@([a-zA-Z0-9-_:/;*?!^\\\\+=@&~#|<>%.]+)\"\n }\n }\n ;\n\n function exact(regexpContent) {\n return new RegExp(\"^\" + regexpContent + \"$\");\n }\n\n regexp.URI = exact(regexp.URI);\n regexp.EMAIL = exact(regexp.EMAIL);\n regexp.PHONE = exact(regexp.PHONE);\n _.keys(regexp.socials).forEach(function(key){\n regexp.socials[key] = exact(regexp.socials[key]);\n });\n\n function getTypeFromUrl(url){\n var type;\n if (regexp.URI.test(url)) {\n var protocol = regexp.URI.exec(url)[1];\n var urlToMatch = url;\n if (protocol == 'http' || protocol == 'https') {\n var slashPathIndex = url.indexOf('/', protocol.length + 3);\n if (slashPathIndex > 0) {\n urlToMatch = url.substring(0, slashPathIndex);\n }\n }\n //console.log(\"match URI, try to match: \" + urlToMatch);\n _.keys(regexp.socials).forEach(function(key){\n if (regexp.socials[key].test(urlToMatch)) {\n type = key;\n return false; // stop\n }\n });\n if (!type) {\n type = 'web';\n }\n }\n else if (regexp.EMAIL.test(url)) {\n type = 'email';\n }\n else if (regexp.PHONE.test(url)) {\n type = 'phone';\n }\n if (!type) {\n console.warn(\"[ES] [social] Unable to detect type of social URL: \" + url);\n }\n return type;\n }\n\n function getFromUrl(url) {\n url = url ? url.trim() : url;\n if (url && url.length > 0) {\n if (url.startsWith('www.')) {\n url = 'http://' + url;\n }\n return {\n type: getTypeFromUrl(url),\n url: url\n };\n }\n return;\n }\n\n function reduceArray(socials) {\n if (!socials || !socials.length) return [];\n var map = {};\n socials.forEach(function(social) {\n if (social.type == 'curve25519') {\n delete social.issuer;\n if (social.valid) {\n angular.merge(social, getFromUrl(social.url));\n }\n }\n else {\n // Retrieve object from URL, to get the right type (e.g. if new regexp)\n social = getFromUrl(social.url);\n }\n if (social) {\n var id = $filter('formatSlug')(social.url);\n map[id] = social;\n }\n });\n return _.values(map);\n }\n\n function createSocialForEncryption(recipient, dataToEncrypt) {\n return {\n recipient: recipient,\n type: 'curve25519',\n url: dataToEncrypt\n };\n }\n\n function openArray(socials, issuer, recipient) {\n\n recipient = recipient || csWallet.data.pubkey;\n\n // Waiting to load crypto libs\n if (!CryptoUtils.isLoaded()) {\n console.debug('[socials] Waiting crypto lib loading...');\n return $timeout(function() {\n return openArray(socials, issuer, recipient);\n }, 100);\n }\n\n var socialsToDecrypt = _.filter(socials||[], function(social){\n var matches = social.url && social.type == 'curve25519' && regexp.socials.curve25519.exec(social.url);\n if (!matches) return false;\n social.recipient = matches[1];\n social.nonce = matches[2];\n social.url = matches[3];\n social.issuer = issuer;\n social.valid = (social.recipient === recipient);\n return social.valid;\n });\n if (!socialsToDecrypt.length) return $q.when(reduceArray(socials));\n\n return esCrypto.box.open(socialsToDecrypt, undefined/*=wallet keypair*/, 'issuer', 'url')\n .then(function() {\n // return all socials (encrypted or not)\n return reduceArray(socials);\n });\n }\n\n function packArray(socials) {\n // Waiting to load crypto libs\n if (!CryptoUtils.isLoaded()) {\n console.debug('[socials] Waiting crypto lib loading...');\n return $timeout(function() {\n return packArray(socials);\n }, 100);\n }\n\n var socialsToEncrypt = _.filter(socials||[], function(social){\n return social.type == 'curve25519' && social.url && social.recipient;\n });\n if (!socialsToEncrypt.length) return $q.when(socials);\n\n return CryptoUtils.util.random_nonce()\n .then(function(nonce) {\n return $q.all(socialsToEncrypt.reduce(function(res, social) {\n return res.concat(esCrypto.box.pack(social, undefined/*=wallet keypair*/, 'recipient', 'url', nonce));\n }, []));\n })\n .then(function(res){\n return res.reduce(function(res, social) {\n return res.concat({\n type: 'curve25519',\n url: 'curve25519://{0}:{1}@{2}'.format(social.recipient, social.nonce, social.url)\n });\n }, []);\n });\n }\n\n return {\n get: getFromUrl,\n reduce: reduceArray,\n // Encryption\n createForEncryption: createSocialForEncryption,\n open: openArray,\n pack: packArray\n };\n }\n\n var service = SocialUtils();\n service.instance = SocialUtils;\n\n return service;\n}])\n;\n","angular.module('cesium.es.crypto.services', ['ngResource', 'cesium.services'])\n\n.factory('esCrypto', ['$q', '$rootScope', 'CryptoUtils', function($q, $rootScope, CryptoUtils) {\n 'ngInject';\n\n\n function getBoxKeypair(keypair) {\n if (!keypair) {\n throw new Error('Missing keypair');\n }\n if (keypair.boxPk && keypair.boxSk) {\n return $q.when(keypair);\n }\n\n return $q.all([\n CryptoUtils.box.keypair.skFromSignSk(keypair.signSk),\n CryptoUtils.box.keypair.pkFromSignPk(keypair.signPk)\n ])\n .then(function(res) {\n return {\n boxSk: res[0],\n boxPk: res[1]\n };\n });\n }\n\n function packRecordFields(record, keypair, recipientFieldName, cypherFieldNames, nonce) {\n\n recipientFieldName = recipientFieldName || 'recipient';\n if (!record[recipientFieldName]) {\n return $q.reject({message:'ES_WALLET.ERROR.RECIPIENT_IS_MANDATORY'});\n }\n\n cypherFieldNames = cypherFieldNames || 'content';\n if (typeof cypherFieldNames == 'string') {\n cypherFieldNames = [cypherFieldNames];\n }\n\n // Work on a copy, to keep the original record (as it could be use again - fix #382)\n record = angular.copy(record);\n\n // Get recipient\n var recipientPk = CryptoUtils.util.decode_base58(record[recipientFieldName]);\n\n return $q.all([\n getBoxKeypair(keypair),\n CryptoUtils.box.keypair.pkFromSignPk(recipientPk),\n nonce ? $q.when(nonce) : CryptoUtils.util.random_nonce()\n ])\n .then(function(res) {\n //var senderSk = res[0];\n var boxKeypair = res[0];\n var senderSk = boxKeypair.boxSk;\n var boxRecipientPk = res[1];\n var nonce = res[2];\n\n return $q.all(\n cypherFieldNames.reduce(function(res, fieldName) {\n if (!record[fieldName]) return res; // skip undefined fields\n return res.concat(\n CryptoUtils.box.pack(record[fieldName], nonce, boxRecipientPk, senderSk)\n );\n }, []))\n\n .then(function(cypherTexts){\n // Replace field values with cypher texts\n var i = 0;\n _.forEach(cypherFieldNames, function(cypherFieldName) {\n if (!record[cypherFieldName]) {\n // Force undefined fields to be present in object\n // This is better for ES storage, that always works on lazy update mode\n record[cypherFieldName] = null;\n }\n else {\n record[cypherFieldName] = cypherTexts[i++];\n }\n });\n\n // Set nonce\n record.nonce = CryptoUtils.util.encode_base58(nonce);\n\n return record;\n });\n });\n }\n\n function openRecordFields(records, keypair, issuerFieldName, cypherFieldNames) {\n\n issuerFieldName = issuerFieldName || 'issuer';\n cypherFieldNames = cypherFieldNames || 'content';\n if (typeof cypherFieldNames == 'string') {\n cypherFieldNames = [cypherFieldNames];\n }\n\n var now = new Date().getTime();\n var issuerBoxPks = {}; // a map used as cache\n\n var jobs = [getBoxKeypair(keypair)];\n return $q.all(records.reduce(function(jobs, message) {\n var issuer = message[issuerFieldName];\n if (!issuer) {throw 'Record has no ' + issuerFieldName;}\n if (issuerBoxPks[issuer]) return res;\n return jobs.concat(\n CryptoUtils.box.keypair.pkFromSignPk(CryptoUtils.util.decode_base58(issuer))\n .then(function(issuerBoxPk) {\n issuerBoxPks[issuer] = issuerBoxPk; // fill box pk cache\n }));\n }, jobs))\n .then(function(res){\n var boxKeypair = res[0];\n return $q.all(records.reduce(function(jobs, record) {\n var issuerBoxPk = issuerBoxPks[record[issuerFieldName]];\n var nonce = CryptoUtils.util.decode_base58(record.nonce);\n record.valid = true;\n\n return jobs.concat(\n cypherFieldNames.reduce(function(res, cypherFieldName) {\n if (!record[cypherFieldName]) return res;\n return res.concat(CryptoUtils.box.open(record[cypherFieldName], nonce, issuerBoxPk, boxKeypair.boxSk)\n .then(function(text) {\n record[cypherFieldName] = text;\n })\n .catch(function(err){\n console.error(err);\n console.warn('[ES] [crypto] a record may have invalid cypher ' + cypherFieldName);\n record.valid = false;\n }));\n }, []));\n }, []));\n })\n .then(function() {\n console.debug('[ES] [crypto] All record decrypted in ' + (new Date().getTime() - now) + 'ms');\n return records;\n });\n\n }\n\n // exports\n return {\n box: {\n getKeypair: getBoxKeypair,\n pack: packRecordFields,\n open: openRecordFields\n }\n };\n}])\n;\n","angular.module('cesium.es.profile.services', ['cesium.services', 'cesium.es.http.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esProfile');\n }\n\n }])\n\n.factory('esProfile', ['$rootScope', '$q', 'esHttp', 'SocialUtils', 'csWot', 'csWallet', 'csPlatform', 'esLike', function($rootScope, $q, esHttp, SocialUtils, csWot, csWallet, csPlatform, esLike) {\n 'ngInject';\n\n var\n that = this,\n listeners;\n\n that.raw = {\n getFields: esHttp.get('/user/profile/:id?&_source_exclude=avatar._content&_source=:fields'),\n get: esHttp.get('/user/profile/:id?&_source_exclude=avatar._content'),\n getAll: esHttp.get('/user/profile/:id'),\n search: esHttp.post('/user/profile/_search'),\n mixedSearch: esHttp.post('/user,page/profile,record/_search')\n };\n\n function getAvatarAndName(pubkey) {\n return that.raw.getFields({id: pubkey, fields: 'title,avatar._content_type,pubkey,creationTime,time'})\n .then(function(res) {\n var profile;\n if (res && res._source) {\n // name\n profile = {name: res._source.title, pubkey: res._source.pubkey};\n // avatar\n profile.avatar = esHttp.image.fromHit(res, 'avatar');\n // creationTime\n profile.creationTime = res._source.creationTime;\n profile.time = res._source.time;\n }\n return profile;\n })\n .catch(function(err){\n // no profile defined\n if (err && err.ucode && err.ucode == 404) {\n return null;\n }\n else {\n throw err;\n }\n });\n }\n\n function getProfile(pubkey, options) {\n options = options || {};\n\n var get = options.raw ? that.raw.getAll : that.raw.get;\n return get({id: pubkey})\n .then(function(res) {\n if (!res || !res.found || !res._source) return undefined;\n\n var profile = {\n name: res._source.title,\n source: res._source\n };\n\n // Avoid too long name (workaround for #308)\n if (profile.name && profile.name.length > 30) {\n // now using truncText filter\n // profile.name = profile.name.substr(0, 27) + '...';\n }\n\n // avatar\n profile.avatar = esHttp.image.fromHit(res, 'avatar');\n\n // description\n if (!options.raw) {\n profile.description = esHttp.util.parseAsHtml(profile.source.description);\n }\n\n // Social url must be unique in socials links - Workaround for issue #306:\n if (profile.source.socials && profile.source.socials.length) {\n profile.source.socials = _.uniq(profile.source.socials, false, function (social) {\n return social.url;\n });\n }\n\n if (!csWallet.isLogin()) {\n // Exclude crypted socials\n profile.source.socials = _.filter(profile.source.socials, function(social) {\n return social.type != 'curve25519';\n });\n }\n else {\n // decrypt socials (if login)\n return SocialUtils.open(profile.source.socials, pubkey)\n .then(function(){\n //console.log(profile.source.socials);\n // Exclude invalid decrypted socials\n //profile.source.socials = _.where(profile.source.socials, {valid: true});\n return profile;\n });\n }\n\n return profile;\n })\n .catch(function(err){\n // no profile defined\n if (err && err.ucode && err.ucode == 404) {\n return null;\n }\n else {\n throw err;\n }\n });\n }\n\n function fillAvatars(datas, pubkeyAtributeName) {\n return onWotSearch(null, datas, pubkeyAtributeName);\n }\n\n function _fillSearchResultFromHit(data, hit, avatarFieldName) {\n data.avatar = data.avatar || esHttp.image.fromHit(hit, avatarFieldName||'avatar');\n // name (basic or highlighted)\n data.name = hit._source.title;\n // Avoid too long name (workaround for #308)\n if (data.name && data.name.length > 30) {\n // now using truncText filter\n //data.name = data.name.substr(0, 27) + '...';\n }\n data.description = hit._source.description || data.description;\n data.city = hit._source.city || data.city;\n\n // DO not override existing time, if exists (e.g. in comment record)\n data.profile = data.profile || {};\n data.profile.issuer = hit._id;\n data.profile.creationTime = hit._source.creationTime;\n data.profile.time = hit._source.time;\n\n // Fetch payment pubkey (need by Gchange)\n // but do NOT override if already set in the record (e.g. in crownfunding ad, there is a pubkey attribute: so keep it)\n if (hit._source.pubkey && !data.pubkey) {\n data.pubkey = hit._source.pubkey;\n }\n\n if (hit.highlight) {\n if (hit.highlight.title) {\n data.name = hit.highlight.title[0];\n }\n if (hit.highlight.tags) {\n data.tags = hit.highlight.tags.reduce(function(res, tag){\n return res.concat(tag.replace('<em>', '').replace('</em>', ''));\n },[]);\n }\n }\n }\n\n function _fillSearchResultsFromHits(datas, res, dataByPubkey, pubkeyAtributeName) {\n if (!res || !res.hits || !res.hits.total) return datas;\n var indices = {};\n dataByPubkey = dataByPubkey || {};\n pubkeyAtributeName = pubkeyAtributeName || 'pubkey';\n var values;\n _.forEach(res.hits.hits, function (hit) {\n\n var avatarFieldName = 'avatar';\n // User profile\n if (hit._index === \"user\") {\n values = dataByPubkey && dataByPubkey[hit._id];\n if (!values) {\n var value = {};\n value[pubkeyAtributeName] = hit._id;\n values = [value];\n datas.push(value);\n }\n }\n\n // Page or group\n else if (hit._index !== \"user\") {\n if (!indices[hit._index]) {\n indices[hit._index] = true;\n // add a separator\n datas.push({\n id: 'divider-' + hit._index,\n divider: true,\n index: hit._index\n });\n }\n var item = {\n id: hit._index + '-' + hit._id, // unique id in list\n index: hit._index,\n templateUrl: 'plugins/es/templates/wot/lookup_item_{0}.html'.format(hit._index),\n state: 'app.view_{0}'.format(hit._index),\n stateParams: {id: hit._id, title: hit._source.title},\n creationTime: hit._source.creationTime,\n memberCount: hit._source.memberCount,\n type: hit._source.type\n };\n values = [item];\n datas.push(item);\n avatarFieldName = 'thumbnail';\n }\n\n avatar = esHttp.image.fromHit(hit, avatarFieldName);\n\n _.forEach(values, function (data) {\n data.avatar = avatar;\n _fillSearchResultFromHit(data, hit);\n });\n });\n\n // Add divider on top\n if (_.keys(indices).length) {\n datas.splice(0, 0, {\n id: 'divider-identities',\n divider: true,\n index: 'profile'\n });\n }\n }\n\n function search(options) {\n return searchText(undefined, options);\n }\n\n function searchText(text, options) {\n options = options || {};\n var request = {\n highlight: {fields : {title : {}, tags: {}}},\n from: options.from || 0,\n size: options.size || 100,\n _source: options._source || [\"title\", \"avatar._content_type\", \"time\", \"city\", \"creationTime\", \"time\"]\n };\n\n if (!text) {\n delete request.highlight; // highlight not need\n request.sort = options.sort || {creationTime: 'desc'};\n }\n else {\n request.query = {};\n request.query.bool = {\n should: [\n {match: {title: {\n query: text,\n boost: 2\n }}},\n {prefix: {title: text}}\n ]\n };\n var tags = text ? esHttp.util.parseTags(text) : undefined;\n if (tags) {\n request.query.bool.should.push({terms: {tags: tags}});\n }\n }\n\n if (options.mixedSearch) {\n console.debug(\"[ES] [profile] Mixed search: enable\");\n if (text) {\n request.indices_boost = {\n \"user\" : 100,\n \"page\" : 1,\n \"group\" : 0.01\n };\n }\n request._source = request._source.concat([\"description\", \"membersCount\", \"type\"]);\n }\n\n var search = options.mixedSearch ? that.raw.mixedSearch : that.raw.search;\n return search(request)\n .then(function(res) {\n var result = [];\n _fillSearchResultsFromHits(result, res);\n return result;\n });\n }\n\n function onWotSearch(text, datas, pubkeyAtributeName, deferred) {\n deferred = deferred || $q.defer();\n if (!text && (!datas || !datas.length)) {\n deferred.resolve(datas);\n return deferred.promise;\n }\n\n console.debug(\"[ES] [profile] Searching on user profiles...\");\n\n pubkeyAtributeName = pubkeyAtributeName || 'pubkey';\n text = text ? text.toLowerCase().trim() : text;\n var dataByPubkey;\n var tags = text ? esHttp.util.parseTags(text) : undefined;\n var request = {\n query: {},\n highlight: {fields : {title : {}, tags: {}}},\n from: 0,\n size: 100,\n _source: [\"title\", \"avatar._content_type\", \"pubkey\", \"creationTime\"]\n };\n\n // TODO: uncomment\n //var mixedSearch = text && esSettings.wot.isMixedSearchEnable();\n var mixedSearch = false;\n if (mixedSearch) {\n request._source = request._source.concat([\"description\", \"city\", \"membersCount\", \"type\"]);\n console.debug(\"[ES] [profile] Mixed search: enable\");\n }\n\n if (datas.length > 0) {\n // collect pubkeys and fill values map\n dataByPubkey = {};\n _.forEach(datas, function(data) {\n var pubkey = data[pubkeyAtributeName];\n if (pubkey) {\n var values = dataByPubkey[pubkey];\n if (!values) {\n values = [data];\n dataByPubkey[pubkey] = values;\n }\n else {\n values.push(data);\n }\n }\n });\n var pubkeys = _.keys(dataByPubkey);\n // Make sure all results will be return\n request.size = (pubkeys.length <= request.size) ? request.size : pubkeys.length;\n if (!text) {\n delete request.highlight; // highlight not need\n request.query.constant_score = {\n filter: {\n terms : {_id : pubkeys}\n }\n };\n }\n else {\n request.query.constant_score = {\n filter: {bool: {should: [\n {terms : {_id : pubkeys}},\n {bool: {\n must: [\n {match: {title: {query: text, boost: 2}}},\n {prefix: {title: text}}\n ]}\n }\n ]}}\n };\n\n if (tags) {\n request.query.constant_score.filter.bool.should.push({terms: {tags: tags}});\n }\n }\n }\n else if (text){\n request.query.bool = {\n should: [\n {match: {title: {\n query: text,\n boost: 2\n }}},\n {prefix: {title: text}}\n ]\n };\n if (tags) {\n request.query.bool.should.push({terms: {tags: tags}});\n }\n }\n else {\n // nothing to search: stop here\n deferred.resolve(datas);\n return deferred.promise;\n }\n\n if (text && mixedSearch) {\n request.indices_boost = {\n \"user\" : 100,\n \"page\" : 1,\n \"group\" : 0.01\n };\n }\n\n var search = mixedSearch ? that.raw.mixedSearch : that.raw.search;\n search(request)\n .then(function(res) {\n _fillSearchResultsFromHits(datas, res, dataByPubkey, pubkeyAtributeName);\n deferred.resolve(datas);\n })\n .catch(function(err){\n if (err && err.ucode && err.ucode == 404) {\n deferred.resolve(datas);\n }\n else {\n deferred.reject(err);\n }\n });\n\n return deferred.promise;\n }\n\n function onWotLoad(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey) {\n deferred.resolve();\n return deferred.promise;\n }\n\n // Load full profile\n getProfile(data.pubkey)\n .then(function(profile) {\n if (profile) {\n data.name = profile.name;\n data.avatar = profile.avatar;\n data.profile = profile.source;\n data.profile.description = profile.description;\n }\n deferred.resolve(data);\n })\n .catch(function(err) {\n deferred.reject(data);\n });\n return deferred.promise;\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWot events\n listeners = [\n csWot.api.data.on.load($rootScope, onWotLoad, this),\n csWot.api.data.on.search($rootScope, onWotSearch, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [profile] Disable\");\n removeListeners();\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [profile] Enable\");\n addListeners();\n }\n }\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n return {\n search: search,\n searchText: searchText,\n getAvatarAndName: getAvatarAndName,\n get: getProfile,\n add: esHttp.record.post('/user/profile', {tagFields: ['title', 'description'], creationTime: true}),\n update: esHttp.record.post('/user/profile/:id/_update', {tagFields: ['title', 'description'], creationTime: true}),\n remove: esHttp.record.remove(\"user\",\"profile\"),\n avatar: esHttp.get('/user/profile/:id?_source=avatar'),\n fillAvatars: fillAvatars,\n like: esLike.instance('user', 'profile')\n };\n}])\n;\n","angular.module('cesium.es.notification.services', ['cesium.services', 'cesium.es.http.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esNotification');\n }\n\n }])\n\n.factory('esNotification', ['$rootScope', '$q', '$timeout', '$translate', '$state', 'esHttp', 'csConfig', 'csSettings', 'csWallet', 'csWot', 'UIUtils', 'BMA', 'CryptoUtils', 'csPlatform', 'Api', function($rootScope, $q, $timeout, $translate, $state,\n esHttp, csConfig, csSettings, csWallet, csWot, UIUtils, BMA, CryptoUtils, csPlatform, Api) {\n 'ngInject';\n\n var\n constants = {\n MESSAGE_CODES: ['MESSAGE_RECEIVED'],\n INVITATION_CODES: ['INVITATION_TO_CERTIFY'],\n DEFAULT_LOAD_SIZE: 20\n },\n\n fields = {\n commons: [\"type\", \"code\", \"params\", \"reference\", \"recipient\", \"time\", \"hash\", \"read_signature\"]\n },\n that = this,\n listeners,\n api = new Api(this, 'esNotification')\n ;\n\n constants.EXCLUDED_CODES = constants.MESSAGE_CODES.concat(constants.INVITATION_CODES);\n\n that.raw = {\n postCount: esHttp.post('/user/event/_count'),\n postSearch: esHttp.post('/user/event/_search'),\n postReadById: esHttp.post('/user/event/:id/_read'),\n ws: {\n getUserEvent: esHttp.ws('/ws/event/user/:pubkey/:locale'),\n getChanges: esHttp.ws('/ws/_changes')\n }\n };\n\n // Create the filter query\n function createFilterQuery(pubkey, options) {\n options = options || {};\n options.codes = options.codes || {};\n options.codes.excludes = options.codes.excludes || constants.EXCLUDED_CODES;\n var query = {\n bool: {\n must: [\n {term: {recipient: pubkey}}\n ]\n }\n };\n\n // Includes codes\n if (options.codes && options.codes.includes) {\n query.bool.must.push({terms: { code: options.codes.includes}});\n }\n else {\n // Excludes codes\n var excludesCodes = [];\n if (!csSettings.getByPath('plugins.es.notifications.txSent', false)) {\n excludesCodes.push('TX_SENT');\n }\n if (!csSettings.getByPath('plugins.es.notifications.txReceived', true)) {\n excludesCodes.push('TX_RECEIVED');\n }\n if (!csSettings.getByPath('plugins.es.notifications.certSent', false)) {\n excludesCodes.push('CERT_SENT');\n }\n if (!csSettings.getByPath('plugins.es.notifications.certReceived', true)) {\n excludesCodes.push('CERT_RECEIVED');\n }\n if (options.codes.excludes) {\n _.forEach(options.codes.excludes, function(code) {\n excludesCodes.push(code);\n });\n }\n if (excludesCodes.length) {\n query.bool.must_not = {terms: { code: excludesCodes}};\n }\n }\n\n // Filter on time\n if (options.readTime) {\n query.bool.must.push({range: {time: {gt: options.readTime}}});\n }\n return query;\n }\n\n // Load unread notifications count\n function loadUnreadNotificationsCount(pubkey, options) {\n var request = {\n query: createFilterQuery(pubkey, options)\n };\n // Filter unread only\n request.query.bool.must.push({missing: { field : \"read_signature\" }});\n return that.raw.postCount(request)\n .then(function(res) {\n return res.count;\n });\n }\n\n // Load user notifications\n function loadNotifications(pubkey, options) {\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || constants.DEFAULT_LOAD_SIZE;\n var request = {\n query: createFilterQuery(pubkey, options),\n sort : [\n { \"time\" : {\"order\" : \"desc\"}}\n ],\n from: options.from,\n size: options.size,\n _source: fields.commons\n };\n\n return that.raw.postSearch(request)\n .then(function(res) {\n if (!res.hits || !res.hits.total) return [];\n var notifications = res.hits.hits.reduce(function(res, hit) {\n var item = new EsNotification(hit._source, markNotificationAsRead);\n item.id = hit._id;\n return res.concat(item);\n }, []);\n\n return csWot.extendAll(notifications);\n });\n }\n\n function onNewUserEvent(event) {\n if (!event || !csWallet.isLogin()) return;\n\n // If notification is an invitation\n if (_.contains(constants.INVITATION_CODES, event.code)) {\n api.event.raise.newInvitation(event);\n return;\n }\n\n // If notification is a message\n if (_.contains(constants.MESSAGE_CODES, event.code)) {\n api.event.raise.newMessage(event);\n return;\n }\n\n var notification = new EsNotification(event, markNotificationAsRead);\n notification.id = event.id || notification.id;\n\n // Extend the notification entity\n return csWot.extendAll([notification])\n .then(function() {\n if (!$rootScope.$$phase) {\n $rootScope.$apply(function() {\n addNewNotification(notification);\n });\n }\n else {\n addNewNotification(notification);\n }\n })\n .then(function() {\n return emitEsNotification(notification);\n });\n }\n\n function addNewNotification(notification) {\n csWallet.data.notifications = csWallet.data.notifications || {};\n csWallet.data.notifications.unreadCount++;\n api.data.raise.new(notification);\n return notification;\n }\n\n function htmlToPlaintext(text) {\n return text ? String(text).replace(/<[^>]*>/gm, '').replace(/&[^;]+;/gm, '') : '';\n }\n\n function emitEsNotification(notification, title) {\n\n // If it's okay let's create a notification\n $q.all([\n $translate(title||'COMMON.NOTIFICATION.TITLE'),\n $translate(notification.message, notification)\n ])\n .then(function(res) {\n var title = htmlToPlaintext(res[0]);\n var body = htmlToPlaintext(res[1]);\n var icon = notification.avatar && notification.avatar.src || './img/logo.png';\n emitHtml5Notification(title, {\n body: body,\n icon: icon,\n lang: $translate.use(),\n tag: notification.id,\n onclick: function() {\n $rootScope.$applyAsync(function() {\n if (typeof notification.markAsRead === \"function\") {\n notification.markAsRead();\n }\n if (notification.state) {\n $state.go(notification.state, notification.stateParams);\n }\n });\n }\n });\n });\n }\n\n function emitHtml5Notification(title, options) {\n\n // Let's check if the browser supports notifications\n if (!(\"Notification\" in window)) return;\n\n // Let's check whether notification permissions have already been granted\n if (Notification.permission === \"granted\") {\n\n // If it's okay let's create a notification\n var browserNotification = new Notification(title, options);\n browserNotification.onclick = options.onclick || browserNotification.onclick;\n }\n\n // Otherwise, we need to ask the user for permission\n else if (Notification.permission !== \"denied\") {\n Notification.requestPermission(function (permission) {\n // If the user accepts, let's create a notification\n if (permission === \"granted\") {\n emitHtml5Notification(title, options); // recursive call\n }\n });\n }\n }\n\n // Mark a notification as read\n function markNotificationAsRead(notification) {\n if (notification.read || !notification.id) return; // avoid multi call\n // Should never append (fix in Duniter4j issue #12)\n if (!notification.id) {\n console.error('[ES] [notification] Could not mark as read: no \\'id\\' found!', notification);\n return;\n }\n notification.read = true;\n CryptoUtils.sign(notification.hash, csWallet.data.keypair)\n .then(function(signature){\n return that.raw.postReadById(signature, {id:notification.id});\n })\n .catch(function(err) {\n console.error('[ES] [notification] Error while trying to mark event as read.', err);\n });\n }\n\n function onWalletReset(data) {\n data.notifications = data.notifications || {};\n data.notifications.unreadCount = null;\n // Stop listening notification\n that.raw.ws.getUserEvent().close();\n }\n\n function onWalletLogin(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n deferred.resolve();\n return deferred.promise;\n }\n\n console.debug('[ES] [notification] Loading count...');\n var now = Date.now();\n\n // Load unread notifications count\n loadUnreadNotificationsCount(\n data.pubkey, {\n readTime: csSettings.data.wallet ? csSettings.data.wallet.notificationReadTime : 0,\n excludeCodes: constants.EXCLUDED_CODES\n })\n .then(function(unreadCount) {\n data.notifications = data.notifications || {};\n data.notifications.unreadCount = unreadCount;\n // Emit HTML5 notification\n if (unreadCount > 0) {\n $timeout(function() {\n emitEsNotification({\n message: 'COMMON.NOTIFICATION.HAS_UNREAD',\n count: unreadCount,\n state: 'app.view_notifications'\n }, 'COMMON.APP_NAME');\n }, 500);\n }\n console.debug('[ES] [notification] Loaded count ({0}) in {1}ms'.format(unreadCount, Date.now() - now));\n deferred.resolve(data);\n })\n .catch(function(err){\n deferred.reject(err);\n })\n\n // Listen new events\n .then(function(){\n console.debug('[ES] [notification] Starting listen user event...');\n var userEventWs = that.raw.ws.getUserEvent();\n listeners.push(userEventWs.close);\n return userEventWs.on(onNewUserEvent,\n {pubkey: data.pubkey, locale: csSettings.data.locale.id}\n )\n .catch(function(err) {\n console.error('[ES] [notification] Unable to listen user event', err);\n\n // TODO : send a event to csHttp instead ?\n // And display such connectivity errors in UI\n UIUtils.alert.error('ACCOUNT.ERROR.WS_CONNECTION_FAILED');\n });\n });\n\n return deferred.promise;\n }\n\n function addListeners() {\n // Listen some events\n listeners = [\n csWallet.api.data.on.login($rootScope, onWalletLogin, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [notification] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [notification] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n return onWalletLogin(csWallet.data);\n }\n }\n }\n\n // Register extension points\n api.registerEvent('data', 'new');\n api.registerEvent('event', 'newInvitation');\n api.registerEvent('event', 'newMessage');\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n // Exports\n that.load = loadNotifications;\n that.unreadCount = loadUnreadNotificationsCount;\n that.html5 = {\n emit: emitHtml5Notification\n };\n that.api = api;\n that.websocket = {\n event: that.raw.ws.getUserEvent,\n change: that.raw.ws.getChanges\n };\n that.constants = constants;\n\n return that;\n}])\n;\n","angular.module('cesium.es.message.services', ['ngResource', 'cesium.services', 'cesium.crypto.services', 'cesium.wot.services',\n 'cesium.es.http.services', 'cesium.es.wallet.services', 'cesium.es.notification.services'])\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esMessage');\n }\n\n }])\n\n.factory('esMessage', ['$q', '$rootScope', '$timeout', 'UIUtils', 'Api', 'CryptoUtils', 'csPlatform', 'csConfig', 'csSettings', 'esHttp', 'csWallet', 'esWallet', 'csWot', 'esNotification', function($q, $rootScope, $timeout, UIUtils, Api, CryptoUtils,\n csPlatform, csConfig, csSettings, esHttp, csWallet, esWallet, csWot, esNotification) {\n 'ngInject';\n\n var\n constants = {\n DEFAULT_LOAD_SIZE: 10\n },\n fields = {\n commons: [\"issuer\", \"recipient\", \"title\", \"content\", \"time\", \"nonce\", \"read_signature\"],\n notifications: [\"issuer\", \"time\", \"hash\", \"read_signature\"]\n },\n raw = {\n postSearch: esHttp.post('/message/inbox/_search'),\n postSearchByType: esHttp.post('/message/:type/_search'),\n getByTypeAndId : esHttp.get('/message/:type/:id'),\n postReadById: esHttp.post('/message/inbox/:id/_read')\n },\n listeners,\n api = new Api(this, 'esMessage');\n\n function onWalletInit(data) {\n data.messages = data.messages || {};\n data.messages.unreadCount = null;\n }\n\n function onWalletReset(data) {\n if (data.messages) {\n delete data.messages;\n }\n }\n\n function onWalletLogin(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey) {\n deferred.resolve();\n return deferred.promise;\n }\n\n console.debug('[ES] [message] Loading count...');\n var now = new Date().getTime();\n\n // Count unread messages\n countUnreadMessages(data.pubkey)\n .then(function(unreadCount){\n data.messages = data.messages || {};\n data.messages.unreadCount = unreadCount;\n console.debug('[ES] [message] Loaded count (' + unreadCount + ') in '+(new Date().getTime()-now)+'ms');\n deferred.resolve(data);\n })\n .catch(function(err){\n console.error('Error chile counting message: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n return deferred.promise;\n }\n\n function countUnreadMessages(pubkey) {\n pubkey = pubkey || (csWallet.isLogin() ? csWallet.data.pubkey : pubkey);\n if (!pubkey) {\n throw new Error('no pubkey, and user not connected.');\n }\n\n var request = {\n query: {\n bool: {\n must: [\n {term: {recipient: pubkey}},\n {missing: { field : \"read_signature\" }}\n ]\n }\n }\n };\n\n return esHttp.post('/message/inbox/_count')(request)\n .then(function(res) {\n return res.count;\n });\n }\n\n // Listen message changes\n function onNewMessageEvent(event) {\n console.debug(\"[ES] [message] detected new message (from notification service)\");\n\n var notification = new EsNotification(event);\n notification.issuer = notification.pubkey;\n delete notification.pubkey;\n\n csWot.extend(notification, 'issuer')\n .then(function() {\n\n csWallet.data.messages = csWallet.data.messages || {};\n csWallet.data.messages.unreadCount++;\n\n // Raise event\n api.data.raise.new(notification);\n });\n }\n\n function sendMessage(message) {\n return csWallet.getKeypair()\n .then(function(keypair) {\n return doSendMessage(message, keypair)\n .then(function(res){\n var outbox = (csSettings.data.plugins.es.message &&\n angular.isDefined(csSettings.data.plugins.es.message.outbox)) ?\n csSettings.data.plugins.es.message.outbox : true;\n\n if (!outbox) return res;\n\n // Send to outbox\n return doSendMessage(message, keypair, '/message/outbox', 'issuer')\n .catch(function(err) {\n console.error(\"Failed to store message to outbox: \" + err);\n return res; // the first result\n });\n })\n .then(function(res) {\n // Raise event\n api.data.raise.sent(res);\n\n return res;\n });\n });\n }\n\n function doSendMessage(message, keypair, boxPath, recipientFieldName) {\n boxPath = boxPath || '/message/inbox';\n\n // Encrypt fields\n return esWallet.box.record.pack(message, keypair, recipientFieldName, ['title', 'content'])\n // Send message\n .then(function(message){\n return esHttp.record.post(boxPath)(message);\n });\n }\n\n function loadMessageNotifications(options) {\n if (!csWallet.isLogin()) {\n return $q.when([]); // Should never happen\n }\n options = options || {};\n options.from = options.from || 0;\n options.size = options.size || constants.DEFAULT_LOAD_SIZE;\n var request = {\n sort: {\n \"time\" : \"desc\"\n },\n query: {bool: {filter: {term: {recipient: csWallet.data.pubkey}}}},\n from: options.from,\n size: options.size,\n _source: fields.notifications\n };\n\n return raw.postSearch(request)\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) return [];\n var notifications = res.hits.hits.reduce(function(result, hit) {\n var msg = hit._source;\n msg.id = hit._id;\n msg.read = !!msg.read_signature;\n delete msg.read_signature; // not need anymore\n return result.concat(msg);\n }, []);\n return csWot.extendAll(notifications, 'issuer');\n });\n }\n\n\n function searchMessages(pubkey, options) {\n pubkey = pubkey || csWallet.data.pubkey;\n if (!csWallet.isLogin()) {\n return $q.when([]);\n }\n\n options = options || {};\n options.type = options.type || 'inbox';\n options.from = options.from || 0;\n options.size = options.size || 1000;\n options._source = options._source || fields.commons;\n var request = {\n sort: {\n \"time\" : \"desc\"\n },\n from: options.from,\n size: options.size,\n _source: options._source\n };\n\n if (options.type == 'inbox') {\n request.query = {bool: {filter: {term: {recipient: pubkey}}}};\n }\n else {\n request.query = {bool: {filter: {term: {issuer: pubkey}}}};\n }\n\n return raw.postSearchByType(request, {type: options.type})\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) {\n return [];\n }\n var messages = res.hits.hits.reduce(function(res, hit) {\n var msg = hit._source || {};\n msg.id = hit._id;\n msg.read = (options.type == 'outbox') || !!msg.read_signature;\n delete msg.read_signature; // not need anymore\n return res.concat(msg);\n }, []);\n\n console.debug('[ES] [message] Loading {0} {1} messages'.format(messages.length, options.type));\n\n return messages;\n });\n }\n\n function loadMessages(options) {\n if (!csWallet.isLogin()) {\n return $q.when([]);\n }\n\n options = options || {};\n options.type = options.type || 'inbox';\n options._source = fields.commons;\n options.summary = angular.isDefined(options.summary) ? options.summary : true;\n\n // Get encrypted message (with common fields)\n return searchMessages(csWallet.data.pubkey, options)\n\n // Decrypt content\n .then(function(messages) {\n return decryptMessages(messages, csWallet.data.keypair, options.summary);\n })\n\n // Add avatar\n .then(function(messages){\n var avatarField = (options.type == 'inbox') ? 'issuer' : 'recipient';\n return csWot.extendAll(messages, avatarField);\n })\n\n // Update message count\n .then(function(messages){\n csWallet.data.messages = csWallet.data.messages || {};\n csWallet.data.messages.count = messages.length;\n\n return messages;\n });\n }\n\n function getAndDecrypt(id, options) {\n options = options || {};\n options.type = options.type || 'inbox';\n options.summary = angular.isDefined(options.summary) ? options.summary : false/*summary not need by default*/;\n\n return raw.getByTypeAndId({id: id, type: options.type})\n .then(function(hit) {\n if (!hit.found) return;\n var msg = hit._source;\n msg.id = hit._id;\n msg.read = (options.type == 'outbox') || !!msg.read_signature;\n delete msg.read_signature; // not need anymore\n\n // Decrypt message\n return decryptMessages([msg], csWallet.data.keypair, options.summary)\n\n // Add avatar\n .then(function(){\n var avatarField = (options.type == 'inbox') ? 'issuer' : 'recipient';\n return csWot.extend(msg, avatarField);\n });\n });\n }\n\n function decryptMessages(messages, keypair, withSummary) {\n\n var now = new Date().getTime();\n var issuerBoxPks = {}; // a map used as cache\n\n var jobs = [esWallet.box.getKeypair(keypair)];\n return $q.all(messages.reduce(function(jobs, message) {\n if (issuerBoxPks[message.issuer]) return res;\n return jobs.concat(\n CryptoUtils.box.keypair.pkFromSignPk(CryptoUtils.util.decode_base58(message.issuer))\n .then(function(issuerBoxPk) {\n issuerBoxPks[message.issuer] = issuerBoxPk; // fill box pk cache\n }));\n }, jobs))\n .then(function(res){\n var boxKeypair = res[0];\n return $q.all(messages.reduce(function(jobs, message) {\n var issuerBoxPk = issuerBoxPks[message.issuer];\n var nonce = CryptoUtils.util.decode_base58(message.nonce);\n message.valid = true;\n\n return jobs.concat(\n // title\n CryptoUtils.box.open(message.title, nonce, issuerBoxPk, boxKeypair.boxSk)\n .then(function(title) {\n message.title = title;\n })\n .catch(function(err){\n console.error(err);\n console.warn('[ES] [message] may have invalid cypher title');\n message.valid = false;\n }),\n\n // content\n CryptoUtils.box.open(message.content, nonce, issuerBoxPk, boxKeypair.boxSk)\n .then(function(content) {\n message.content = content;\n if (withSummary) {\n fillSummary(message);\n }\n else if (content){\n message.html = esHttp.util.parseAsHtml(content);\n }\n })\n .catch(function(err){\n console.error(err);\n console.warn('[ES] [message] may have invalid cypher content');\n message.valid = false;\n })\n );\n }, []));\n })\n .then(function() {\n console.debug('[ES] [message] All messages decrypted in ' + (new Date().getTime() - now) + 'ms');\n return messages;\n });\n\n }\n\n // Compute a summary (truncated to 140 characters), from the message content\n function fillSummary(message) {\n if (message.content) {\n message.summary = message.content.replace(/(^|[\\n\\r]+)\\s*>[^\\n\\r]*/g, '').trim();\n if (message.summary.length > 140) {\n message.summary = message.summary.substr(0, 137) + '...';\n }\n }\n }\n\n function removeMessage(id, type) {\n type = type || 'inbox';\n return esHttp.record.remove('message', type)(id)\n .then(function(res) {\n // update message count\n if (type == 'inbox') {\n csWallet.data.messages = csWallet.data.messages || {};\n csWallet.data.messages.count = csWallet.data.messages.count > 0 ? csWallet.data.messages.count-1 : 0;\n }\n // Raise event\n api.data.raise.delete(id);\n\n return res;\n });\n }\n\n function removeAllMessages(type) {\n type = type || 'inbox';\n\n // Get all message id\n return searchMessages(csWallet.data.pubkey, {type: type, from: 0, size: 1000, _source: false})\n .then(function(res) {\n if (!res || !res.length) return;\n\n var ids = _.pluck(res, 'id');\n\n // Remove each messages\n return $q.all(res.reduce(function(res, msg) {\n return res.concat(esHttp.record.remove('message', type)(msg.id));\n }, []))\n .then(function() {\n return ids;\n });\n })\n .then(function(ids) {\n // update message count\n if (type == 'inbox') {\n csWallet.data.messages = csWallet.data.messages || {};\n csWallet.data.messages.count = 0;\n csWallet.data.messages.unreadCount = 0;\n }\n\n // Raise events\n _.forEach(ids, api.data.raise.delete);\n });\n }\n\n // Mark a message as read\n function markMessageAsRead(message, type) {\n type = type || 'inbox';\n if (message.read) {\n var deferred = $q.defer();\n deferred.resolve();\n return deferred.promise;\n }\n message.read = true;\n\n return csWallet.getKeypair()\n\n // Prepare the read_signature to sent\n .then(function(keypair) {\n return CryptoUtils.sign(message.hash, keypair);\n })\n\n // Send read request\n .then(function(signature){\n return raw.postReadById(signature, {id:message.id});\n })\n\n // Update message count\n .then(function() {\n if (type == 'inbox') {\n csWallet.data.messages = csWallet.data.messages || {};\n csWallet.data.messages.unreadCount = csWallet.data.messages.unreadCount ? csWallet.data.messages.unreadCount - 1 : 0;\n }\n });\n }\n\n // Mark all messages as read\n function markAllMessageAsRead() {\n // Get all messages hash\n return searchMessages(csWallet.data.pubkey, {\n type: 'inbox',\n from: 0,\n size: 1000,\n _source: ['hash', 'read_signature']\n })\n\n .then(function(messages) {\n if (!messages || !messages.length) return;\n\n // Keep only unread message\n messages = _.filter(messages, {read: false});\n\n // Remove messages\n return $q.all(messages.reduce(function(res, message) {\n return res.concat(\n // Sign hash\n CryptoUtils.sign(message.hash, csWallet.data.keypair)\n // then send read request\n .then(function(signature){\n return raw.postReadById(signature, {id:message.id});\n }));\n }, []));\n })\n .then(function() {\n // update message count\n csWallet.data.messages = csWallet.data.messages || {};\n csWallet.data.messages.unreadCount = 0;\n });\n }\n\n // Send message to developers - need for issue #524\n function onSendError(message) {\n var developers = csConfig.developers || [{pubkey: '38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE'/*kimamila*/}];\n if(!message || !message.content || !developers || !developers.length) return;\n\n console.info(\"[ES] [message] Sending logs to developers...\");\n message.issuer = csWallet.data.pubkey;\n message.title = message.title || 'Sending log';\n message.time = esHttp.date.now();\n\n csWallet.getKeypair()\n .then(function(keypair) {\n return $q.all(developers.reduce(function(res, developer){\n return !developer.pubkey ? res :\n res.concat(doSendMessage(angular.merge({recipient: developer.pubkey}, message), keypair));\n }, []));\n })\n .then(function(res) {\n console.info(\"[ES] [message] Logs sent to {0} developers\".format(res.length));\n });\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWallet events\n listeners = [\n csWallet.api.data.on.login($rootScope, onWalletLogin, this),\n csWallet.api.data.on.init($rootScope, onWalletInit, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this),\n esNotification.api.event.on.newMessage($rootScope, onNewMessageEvent, this),\n // for issue #524\n csWallet.api.error.on.send($rootScope, onSendError, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [message] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [message] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n onWalletLogin(csWallet.data);\n }\n }\n }\n\n // Register extension points\n api.registerEvent('data', 'new');\n api.registerEvent('data', 'delete');\n api.registerEvent('data', 'sent');\n\n // Default action\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n return {\n api: api,\n search: raw.postSearch,\n notifications: {\n load: loadMessageNotifications\n },\n load: loadMessages,\n get: getAndDecrypt,\n send: sendMessage,\n remove: removeMessage,\n removeAll: removeAllMessages,\n markAsRead: markMessageAsRead,\n markAllAsRead: markAllMessageAsRead,\n fields: {\n commons: fields.commons\n }\n };\n}])\n;\n","angular.module('cesium.es.modal.services', ['cesium.modal.services', 'cesium.es.message.services'])\n\n.factory('esModals', ['$state', 'ModalUtils', 'UIUtils', 'csWallet', function($state, ModalUtils, UIUtils, csWallet) {\n 'ngInject';\n\n function showMessageCompose(parameters) {\n return ModalUtils.show('plugins/es/templates/message/modal_compose.html','ESMessageComposeModalCtrl',\n parameters, {focusFirstInput: true});\n }\n\n function updateNotificationCountAndReadTime() {\n csWallet.data.notifications.unreadCount = 0;\n if (csWallet.data.notifications && csWallet.data.notifications.history.length) {\n var lastNotification = csWallet.data.notifications.history[0];\n var readTime = lastNotification ? lastNotification.time : 0;\n csSettings.data.wallet = csSettings.data.wallet || {};\n if (readTime && csSettings.data.wallet.notificationReadTime != readTime) {\n csSettings.data.wallet.notificationReadTime = readTime;\n csSettings.store();\n }\n }\n }\n\n function showNotificationsPopover(scope, event) {\n return UIUtils.popover.show(event, {\n templateUrl :'plugins/es/templates/common/popover_notification.html',\n scope: scope,\n autoremove: false, // reuse popover\n afterHidden: updateNotificationCountAndReadTime\n })\n .then(function(notification) {\n if (!notification) return; // no selection\n if (notification.onRead && typeof notification.onRead == 'function') notification.onRead();\n if (notification.state) {\n $state.go(notification.state, notification.stateParams);\n }\n });\n }\n\n function showNewInvitation(parameters) {\n return ModalUtils.show('plugins/es/templates/invitation/modal_new_invitation.html', 'ESNewInvitationModalCtrl',\n parameters);\n }\n\n function showNewPage(parameters) {\n // Fix #50 - avoid to login and fake account, when creating a new page\n //return csWallet.login({minData: true})\n return ModalUtils.show('plugins/es/templates/registry/modal_record_type.html', undefined, {\n title: 'REGISTRY.EDIT.TITLE_NEW'\n })\n .then(function(type){\n if (type) {\n $state.go('app.registry_add_record', {type: type});\n }\n });\n }\n\n function showNetworkLookup(parameters) {\n return ModalUtils.show('plugins/es/templates/network/modal_network.html', 'ESNetworkLookupModalCtrl',\n parameters, {focusFirstInput: false});\n }\n\n return {\n showMessageCompose: showMessageCompose,\n showNotifications: showNotificationsPopover,\n showNewInvitation: showNewInvitation,\n showNewPage: showNewPage,\n showNetworkLookup: showNetworkLookup\n };\n\n}]);\n","angular.module('cesium.es.wallet.services', ['ngResource', 'cesium.platform', 'cesium.es.http.services', 'cesium.es.crypto.services'])\n\n.factory('esWallet', ['$q', '$rootScope', '$timeout', 'CryptoUtils', 'csPlatform', 'csWallet', 'esCrypto', 'esProfile', 'esHttp', function($q, $rootScope, $timeout, CryptoUtils, csPlatform, csWallet, esCrypto, esProfile, esHttp) {\n 'ngInject';\n\n var\n listeners,\n that = this;\n\n function onWalletReset(data) {\n data.avatar = null;\n data.profile = null;\n data.name = null;\n csWallet.events.cleanByContext('esWallet');\n if (data.keypair) {\n delete data.keypair.boxSk;\n delete data.keypair.boxPk;\n }\n }\n\n function onWalletLogin(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n deferred.resolve();\n return deferred.promise;\n }\n\n // Waiting to load crypto libs\n if (!CryptoUtils.isLoaded()) {\n console.debug('[ES] [wallet] Waiting crypto lib loading...');\n return $timeout(function() {\n return onWalletLogin(data, deferred);\n }, 50);\n }\n\n console.debug('[ES] [wallet] Loading user avatar+name...');\n var now = Date.now();\n\n esProfile.getAvatarAndName(data.pubkey)\n .then(function(profile) {\n if (profile) {\n data.name = profile.name;\n data.avatarStyle = profile.avatarStyle;\n data.avatar = profile.avatar;\n console.debug('[ES] [wallet] Loaded user avatar+name in '+ (Date.now()-now) +'ms');\n }\n else {\n console.debug('[ES] [wallet] No user avatar+name found');\n }\n deferred.resolve(data);\n })\n .catch(function(err){\n deferred.reject(err);\n });\n\n return deferred.promise;\n }\n\n function onWalletFinishLoad(data, deferred) {\n deferred = deferred || $q.defer();\n\n // Reset events\n csWallet.events.cleanByContext('esWallet');\n\n // If membership pending, but not enough certifications: suggest to fill user profile\n //if (!data.name && data.requirements.pendingMembership && data.requirements.needCertificationCount > 0) {\n // csWallet.events.add({type:'info', message: 'ACCOUNT.EVENT.MEMBER_WITHOUT_PROFILE', context: 'esWallet'});\n //}\n\n console.debug('[ES] [wallet] Loading full user profile...');\n var now = Date.now();\n\n // Load full profile\n esProfile.get(data.pubkey)\n .then(function(profile) {\n if (profile) {\n data.name = profile.name;\n data.avatar = profile.avatar;\n data.profile = profile.source;\n\n // Override HTML description\n data.profile.description = profile.description;\n\n console.debug('[ES] [wallet] Loaded full user profile in '+ (Date.now()-now) +'ms');\n }\n deferred.resolve();\n })\n .catch(deferred.reject);\n\n return deferred.promise;\n }\n\n function getBoxKeypair() {\n if (!csWallet.isLogin()) {\n throw new Error('Unable to get box keypair: user not connected !');\n }\n var keypair = csWallet.data.keypair;\n // box keypair already computed: use it\n if (keypair && keypair.boxPk && keypair.boxSk) {\n return $q.when(keypair);\n }\n\n // Compute box keypair\n return esCrypto.box.getKeypair(keypair)\n .then(function(res) {\n csWallet.data.keypair.boxSk = res.boxSk;\n csWallet.data.keypair.boxPk = res.boxPk;\n console.debug(\"[ES] [wallet] Secret box keypair successfully computed\");\n return csWallet.data.keypair;\n });\n }\n\n function addListeners() {\n // Extend csWallet events\n listeners = [\n csWallet.api.data.on.login($rootScope, onWalletLogin, this),\n csWallet.api.data.on.finishLoad($rootScope, onWalletFinishLoad, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [wallet] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n return onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [wallet] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n return onWalletLogin(csWallet.data);\n }\n }\n }\n\n // Default action\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n // exports\n that.box = {\n getKeypair: getBoxKeypair,\n record: {\n pack: function(record, keypair, recipientFieldName, cypherFieldNames, nonce) {\n return getBoxKeypair()\n .then(function(fullKeypair) {\n return esCrypto.box.pack(record, fullKeypair, recipientFieldName, cypherFieldNames, nonce);\n });\n },\n open: function(records, keypair, issuerFieldName, cypherFieldNames) {\n return getBoxKeypair()\n .then(function(fullKeypair) {\n return esCrypto.box.open(records, fullKeypair, issuerFieldName, cypherFieldNames);\n });\n }\n }\n };\n\n return that;\n}])\n;\n","angular.module('cesium.es.geo.services', ['cesium.services', 'cesium.es.http.services'])\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esGeo');\n }\n\n }])\n\n .factory('esGeo', ['$rootScope', '$q', 'csConfig', 'csSettings', 'csHttp', function($rootScope, $q, csConfig, csSettings, csHttp) {\n 'ngInject';\n\n var\n that = this;\n\n that.raw = {\n osm: {\n search: csHttp.get('nominatim.openstreetmap.org', 443, '/search.php?format=json'),\n license: {\n name: 'OpenStreetMap',\n url: 'https://www.openstreetmap.org/copyright'\n }\n },\n google: {\n apiKey: undefined,\n search: csHttp.get('maps.google.com', 443, '/maps/api/geocode/json')\n },\n searchByIP: csHttp.get('freegeoip.net', 443, '/json/:ip')\n };\n\n function _normalizeAddressString(text) {\n // Remove line break\n var searchText = text.trim().replace(/\\n/g, ',');\n // Remove zip code\n searchText = searchText.replace(/(?:^|[\\t\\n\\r\\s ])([AZ09-]+)(?:$|[\\t\\n\\r\\s ])/g, '');\n // Remove redundant comma\n searchText = searchText.replace(/,[ ,]+/g, ', ');\n return searchText;\n }\n\n function googleSearchPositionByString(address) {\n\n return that.raw.google.search({address: address, key: that.raw.google.apiKey})\n .then(function(res) {\n if (!res || !res.results || !res.results.length) return;\n return res.results.reduce(function(res, hit) {\n return res.concat({\n display_name: hit.address_components && hit.address_components.reduce(function(res, address){\n return address.long_name ? res.concat(address.long_name) : res;\n }, []).join(', '),\n lat: hit.geometry && hit.geometry.location && hit.geometry.location.lat,\n lon: hit.geometry && hit.geometry.location && hit.geometry.location.lng\n });\n }, []);\n });\n }\n\n function _fallbackSearchPositionByString(osmErr, address) {\n\n console.debug('[ES] [geo] Search position failed on [OSM]. Trying [google] service');\n\n return googleSearchPositionByString(address)\n .catch(function(googleErr) {\n console.debug('[ES] [geo] Search position failed on [google] service');\n throw osmErr || googleErr; // throw first OMS error if exists\n });\n }\n\n function searchPositionByAddress(query) {\n\n if (typeof query == 'string') {\n query = {q: query};\n }\n\n // Normalize query string\n if (query.q) {\n query.q = _normalizeAddressString(query.q);\n }\n\n query.addressdetails = 1; // need address field\n\n var now = new Date();\n //console.debug('[ES] [geo] Searching position...', query);\n\n return that.raw.osm.search(query)\n .then(function(res) {\n //console.debug('[ES] [geo] Received {0} results from OSM'.format(res && res.length || 0), res);\n if (!res) return; // no result\n\n // Filter on city/town/village\n res = res.reduce(function(res, hit){\n if (hit.class == 'waterway' || hit.class == 'railway' ||!hit.address) return res;\n hit.address.city = hit.address.city || hit.address.village || hit.address.town || hit.address.postcode;\n hit.address.road = hit.address.road || hit.address.suburb || hit.address.hamlet;\n if (hit.address.postcode && hit.address.city == hit.address.postcode) {\n delete hit.address.postcode;\n }\n if (!hit.address.city) return res;\n return res.concat({\n id: hit.place_id,\n name: hit.display_name,\n address: hit.address,\n lat: hit.lat,\n lon: hit.lon,\n class: hit.class,\n license: that.raw.osm.license\n });\n }, []);\n\n console.debug('[ES] [geo] Found {0} address position(s)'.format(res && res.length || 0, new Date().getTime() - now.getTime()), res);\n\n return res.length ? res : undefined;\n })\n\n // Fallback service\n .catch(function(err) {\n var address = query.q ? query.q : ((query.street ? query.street +', ' : '') + query.city + (query.country ? ', '+ query.country : ''));\n return _fallbackSearchPositionByString(err, address);\n });\n }\n\n function getCurrentPosition() {\n if (!navigator.geolocation) {\n return $q.reject();\n }\n return $q(function(resolve, reject) {\n console.debug(\"[ES] [geo] Getting current GPS position...\");\n\n navigator.geolocation.getCurrentPosition(function(position) {\n if (!position || !position.coords) {\n console.error('[ES] [geo] navigator geolocation > Unknown format:', position);\n reject({message: \"navigator geolocation > Unknown format\"});\n return;\n }\n resolve({\n lat: position.coords.latitude,\n lon: position.coords.longitude\n });\n }, function(error) {\n reject(error);\n },{timeout:5000});\n });\n }\n\n function searchPositionByIP(ip) {\n\n //var now = new Date();\n //console.debug('[ES] [geo] Searching IP position [{0}]...'.format(ip));\n\n return that.raw.searchByIP({ip: ip})\n .then(function(res) {\n //console.debug('[ES] [geo] Found IP {0} position in {0}ms'.format(res ? 1 : 0, new Date().getTime() - now.getTime()));\n return res ? {lat: res.latitude,lng: res.longitude} : undefined;\n });\n }\n\n // Source: http://www.geodatasource.com/developers/javascript\n // Unit: 'M' is statute miles (default), 'Km' is kilometers, 'N' is nautical miles\n function getDistance(lat1, lon1, lat2, lon2, unit) {\n var radlat1 = Math.PI * lat1/180;\n var radlat2 = Math.PI * lat2/180;\n var theta = lon1-lon2;\n var radtheta = Math.PI * theta/180;\n var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);\n dist = Math.acos(dist);\n dist = dist * 180/Math.PI;\n dist = dist * 60 * 1.1515;\n // nautical miles\n if (unit == \"km\") { return dist * 1.609344; }\n // nautical miles\n if (unit == \"N\") return dist * 0.8684;\n // statute miles\n return dist;\n }\n\n that.raw.google.apiKey = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.googleApiKey;\n var hasConfigApiKey = !!that.raw.google.apiKey;\n csSettings.ready()\n .then(function() {\n\n // Listen settings changed\n function onSettingsChanged(data){\n if (!hasConfigApiKey) {\n // If no google api key in config, use in settings\n that.raw.google.apiKey = data.plugins.es.googleApiKey;\n }\n that.raw.google.enable = that.raw.google.apiKey && data.plugins && data.plugins.es && data.plugins.es.enableGoogleApi;\n }\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this);\n\n onSettingsChanged(csSettings.data);\n });\n\n return {\n point: {\n current: getCurrentPosition,\n searchByAddress: searchPositionByAddress,\n searchByIP: searchPositionByIP,\n distance: getDistance\n },\n google: {\n isEnable: function() {\n return that.raw.google.enable && that.raw.google.apiKey;\n },\n searchByAddress: googleSearchPositionByString\n }\n };\n }]);\n","angular.module('cesium.es.subscription.services', ['cesium.platform', 'cesium.es.http.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esSubscription');\n }\n\n }])\n\n.factory('esSubscription', ['$rootScope', '$q', '$timeout', 'esHttp', '$state', '$sce', '$sanitize', 'esSettings', 'CryptoUtils', 'UIUtils', 'csWallet', 'csWot', 'BMA', 'csPlatform', 'esWallet', function($rootScope, $q, $timeout, esHttp, $state, $sce, $sanitize,\n esSettings, CryptoUtils, UIUtils, csWallet, csWot, BMA, csPlatform, esWallet) {\n 'ngInject';\n var\n constants = {\n },\n that = this,\n listeners;\n\n that.raw = {\n getAll: esHttp.get('/subscription/record/_search?_source_excludes=recipientContent&q=issuer::issuer'),\n count: esHttp.get('/subscription/record/_search?size=0&q=issuer::pubkey'),\n add: esHttp.record.post('/subscription/record'),\n update: esHttp.record.post('/subscription/record/:id/_update'),\n category: {\n get: esHttp.get('/subscription/category/:id'),\n all: esHttp.get('/subscription/category/_search?sort=order&from=0&size=1000&_source=name,parent,key')\n }\n };\n\n function onWalletReset(data) {\n data.subscriptions = null;\n }\n\n function onWalletLoad(data, options, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n deferred.resolve();\n return deferred.promise;\n }\n\n console.debug('[ES] [subscription] Loading subscriptions count...');\n\n // Load subscriptions count\n that.raw.count({pubkey: data.pubkey})\n .then(function(res) {\n data.subscriptions = data.subscriptions || {};\n data.subscriptions.count = res && res.hits && res.hits.total;\n console.debug('[ES] [subscription] Loaded count (' + data.subscriptions.count + ')');\n deferred.resolve(data);\n })\n .catch(function(err) {\n console.error('[ES] [subscription] Error while counting subscription: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n\n return deferred.promise;\n }\n\n function loadRecordsByPubkey(issuer, keypair) {\n return that.raw.getAll({issuer: issuer})\n .then(function(res) {\n var records = res && res.hits && res.hits.total &&\n res.hits.hits.reduce(function(res, hit) {\n var record = hit._source;\n record.id = hit._id;\n return res.concat(record);\n }, []) || [];\n\n return esWallet.box.record.open(records, keypair, 'issuer', 'issuerContent')\n .then(function(records) {\n _.forEach(records, function(record) {\n record.content = JSON.parse(record.issuerContent || '{}');\n delete record.issuerContent;\n delete record.recipientContent;\n });\n return records;\n });\n });\n }\n\n function addRecord(record) {\n if (!record || !record.type || !record.content || !record.recipient) {\n return $q.reject(\"Missing arguments 'record' or 'record.type' or 'record.content' or 'record.recipient'\");\n }\n\n var issuer = csWallet.data.pubkey;\n\n var contentStr = JSON.stringify(record.content);\n\n // Get a unique nonce\n return CryptoUtils.util.random_nonce()\n // Encrypt contents\n .then(function(nonce) {\n return $q.all([\n esWallet.box.record.pack({issuer: issuer, issuerContent: contentStr}, csWallet.data.keypair, 'issuer', 'issuerContent', nonce),\n esWallet.box.record.pack({recipient: record.recipient, recipientContent: contentStr}, csWallet.data.keypair, 'recipient', 'recipientContent', nonce)\n ]);\n })\n // Merge encrypted record\n .then(function(res){\n var encryptedRecord = angular.merge(res[0], res[1]);\n encryptedRecord.type = record.type;\n\n // Post subscription\n return that.raw.add(encryptedRecord)\n .then(function(id) {\n record.id = id;\n return record;\n });\n })\n ;\n }\n\n function updateRecord(record) {\n if (!record || !record.content || !record.recipient) {\n return $q.reject(\"Missing arguments 'record' or 'record.content', or 'record.recipient'\");\n }\n\n var issuer = csWallet.data.pubkey;\n var contentStr = JSON.stringify(record.content);\n\n // Get a unique nonce\n return CryptoUtils.util.random_nonce()\n // Encrypt contents\n .then(function(nonce) {\n return $q.all([\n esWallet.box.record.pack({issuer: issuer, issuerContent: contentStr}, csWallet.data.keypair, 'issuer', 'issuerContent', nonce),\n esWallet.box.record.pack({recipient: record.recipient, recipientContent: contentStr}, csWallet.data.keypair, 'recipient', 'recipientContent', nonce)\n ]);\n })\n // Merge encrypted record\n .then(function(res){\n var encryptedRecord = angular.merge(res[0], res[1]);\n encryptedRecord.type = record.type;\n\n // Post subscription\n return that.raw.update(encryptedRecord, {id:record.id})\n .then(function() {\n return record; // return original record\n });\n })\n ;\n }\n\n function getCategories() {\n if (that.raw.categories && that.raw.categories.length) {\n var deferred = $q.defer();\n deferred.resolve(that.raw.categories);\n return deferred.promise;\n }\n\n return that.raw.category.all()\n .then(function(res) {\n if (res.hits.total === 0) {\n that.raw.categories = [];\n }\n else {\n var categories = res.hits.hits.reduce(function(result, hit) {\n var cat = hit._source;\n cat.id = hit._id;\n return result.concat(cat);\n }, []);\n // add as map also\n _.forEach(categories, function(cat) {\n categories[cat.id] = cat;\n });\n that.raw.categories = categories;\n }\n return that.raw.categories;\n });\n }\n\n function getCategory(params) {\n return that.raw.category.get(params)\n .then(function(hit) {\n var res = hit._source;\n res.id = hit._id;\n return res;\n });\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend\n listeners = [\n csWallet.api.data.on.load($rootScope, onWalletLoad, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [subscription] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n return onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [subscription] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n return onWalletLoad(csWallet.data);\n }\n }\n }\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n // Exports\n that.record = {\n load: loadRecordsByPubkey,\n add: addRecord,\n update: updateRecord,\n remove: esHttp.record.remove('subscription', 'record')\n };\n that.category = {\n all: getCategories,\n get: getCategory\n };\n that.constants = constants;\n\n return that;\n}])\n;\n","angular.module('cesium.es.document.services', ['ngResource', 'cesium.platform', 'cesium.es.http.services'])\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esDocument');\n }\n\n }])\n\n .factory('esDocument', ['$q', '$rootScope', '$timeout', 'UIUtils', 'Api', 'CryptoUtils', 'csPlatform', 'csConfig', 'csSettings', 'csWot', 'csWallet', 'esHttp', function($q, $rootScope, $timeout, UIUtils, Api, CryptoUtils,\n csPlatform, csConfig, csSettings, csWot, csWallet, esHttp) {\n 'ngInject';\n\n var\n constants = {\n DEFAULT_LOAD_SIZE: 40\n },\n fields = {\n commons: [\"issuer\", \"pubkey\", \"hash\", \"time\", \"recipient\", \"nonce\", \"read_signature\"],\n peer: [\"*\"],\n movement: [\"*\"]\n },\n raw = {\n search: esHttp.post('/:index/:type/_search'),\n searchText: esHttp.get('/:index/:type/_search?q=:text&_source=:source')\n };\n\n function _initOptions(options) {\n if (!options || !options.index || !options.type) throw new Error('Missing mandatory options [index, type]');\n\n var side = 'desc';\n if (options.type == 'peer') {\n if (!options.sort || options.sort.time) {\n side = options.sort && options.sort.time || side;\n options.sort = {\n 'stats.medianTime': {\n nested_path: 'stats',\n order: side\n }\n };\n }\n options._source = fields.peer;\n options.getTimeFunction = function(doc) {\n doc.time = doc.stats && doc.stats.medianTime;\n return doc.time;\n };\n }\n else if (options.type == 'movement') {\n if (!options.sort || options.sort.time) {\n side = options.sort && options.sort.time || side;\n options.sort = {'medianTime': side};\n }\n options._source = options._source || fields.movement;\n options.getTimeFunction = function(doc) {\n doc.time = doc.medianTime;\n return doc.time;\n };\n }\n\n return options;\n }\n\n function _readSearchHits(res, options) {\n options.issuerField = options.issuerField || 'pubkey';\n\n var hits = (res && res.hits && res.hits.hits || []).reduce(function(res, hit) {\n var doc = hit._source || {};\n doc.index = hit._index;\n doc.type = hit._type;\n doc.id = hit._id;\n doc.pubkey = doc.issuer || options.issuerField && doc[options.issuerField] || doc.pubkey; // need to call csWot.extendAll()\n doc.time = options.getTimeFunction && options.getTimeFunction(doc) || doc.time;\n doc.thumbnail = esHttp.image.fromHit(hit, 'thumbnail');\n return res.concat(doc);\n }, []);\n\n\n var recipients = hits.reduce(function(res, doc) {\n if (doc.recipient) {\n doc.recipient = {\n pubkey: doc.recipient\n };\n return res.concat(doc.recipient);\n }\n return res;\n }, []);\n\n return csWot.extendAll(hits.concat(recipients))\n .then(function() {\n return {\n hits: hits,\n took: res.took,\n total: res && res.hits && res.hits.total || 0\n };\n });\n }\n\n function readSearchHit(hit) {\n var options = _initOptions({\n index: hit._index,\n type: hit._type\n });\n\n return _readSearchHits({\n hits: {\n hits: [hit]\n }\n }, options)\n .then(function(res) {\n return res.hits[0];\n });\n }\n\n function search(options) {\n options = _initOptions(options);\n\n var request = {\n from: options.from || 0,\n size: options.size || constants.DEFAULT_LOAD_SIZE,\n sort: options.sort || {time:'desc'},\n _source: options._source || fields.commons\n };\n if (options.query) {\n request.query = options.query;\n }\n\n return raw.search(request, {\n index: options.index,\n type: options.type\n })\n .then(function(res) {\n return _readSearchHits(res, options);\n });\n }\n\n function searchText(queryString, options) {\n\n options = options || {};\n\n var request = {\n text: queryString,\n index: options.index || 'user',\n type: options.type || 'event',\n from: options.from || 0,\n size: options.size || constants.DEFAULT_LOAD_SIZE,\n sort: options.sort || 'time:desc',\n source: options._source && options._source.join(',') || fields.commons.join(',')\n };\n\n console.debug('[ES] [wallet] [document] [{0}/{1}] Loading documents...'.format(\n options.index,\n options.type\n ));\n var now = Date.now();\n\n return raw.searchText(request)\n .then(function(res) {\n return _readSearchHits(res, options);\n })\n .then(function(res) {\n console.debug('[ES] [document] [{0}/{1}] Loading {2} documents in {3}ms'.format(\n options.index,\n options.type,\n res && res.hits && res.hits.length || 0,\n Date.now() - now\n ));\n return res;\n });\n }\n\n function remove(document, options) {\n if (!document || !document.index || !document.type || !document.id) return $q.reject('Could not remove document: missing mandatory fields');\n\n if (!csWallet.isLogin()) return $q.reject('User not login');\n\n return esHttp.record.remove(document.index, document.type)(document.id, options);\n }\n\n function removeAll(documents, options) {\n if (!documents || !documents.length) return $q.when();\n if (!csWallet.isLogin()) return $q.reject('User not login');\n\n // Remove each doc\n return $q.all(documents.reduce(function (res, doc) {\n return res.concat(esHttp.record.remove(doc.index, doc.type)(doc.id));\n }, []));\n }\n\n return {\n search: search,\n searchText: searchText,\n remove: remove,\n removeAll: removeAll,\n fields: {\n commons: fields.commons\n },\n fromHit: readSearchHit\n };\n }])\n;\n","\nangular.module('cesium.es.network.services', ['ngApi', 'cesium.es.http.services'])\n\n.factory('esNetwork', ['$rootScope', '$q', '$interval', '$timeout', '$window', 'csSettings', 'csConfig', 'esHttp', 'Api', 'BMA', function($rootScope, $q, $interval, $timeout, $window, csSettings, csConfig, esHttp, Api, BMA) {\n 'ngInject';\n\n factory = function(id) {\n\n var\n interval,\n constants = {\n UNKNOWN_BUID: -1\n },\n isHttpsMode = $window.location.protocol === 'https:',\n api = new Api(this, \"csNetwork-\" + id),\n\n data = {\n pod: null,\n listeners: [],\n loading: true,\n peers: [],\n filter: {\n endpointFilter: null,\n online: true,\n ssl: undefined,\n tor: undefined\n },\n sort:{\n type: null,\n asc: true\n },\n expertMode: false,\n knownBlocks: [],\n mainBlock: null,\n searchingPeersOnNetwork: false,\n timeout: csConfig.timeout\n },\n\n // Return the block uid\n buid = function(block) {\n return block && [block.number, block.hash].join('-');\n },\n\n resetData = function() {\n data.pod = null;\n data.listeners = [];\n data.peers.splice(0);\n data.filter = {\n endpointFilter: null,\n online: true\n };\n data.sort = {\n type: null,\n asc: true\n };\n data.expertMode = false;\n data.knownBlocks = [];\n data.mainBlock = null;\n data.loading = true;\n data.searchingPeersOnNetwork = false;\n data.timeout = csConfig.timeout;\n\n data.document = {\n index : csSettings.data.plugins.es && csSettings.data.plugins.es.document && csSettings.data.plugins.es.document.index || 'user',\n type: csSettings.data.plugins.es && csSettings.data.plugins.es.document && csSettings.data.plugins.es.document.type || 'profile'\n };\n },\n\n hasPeers = function() {\n return data.peers && data.peers.length > 0;\n },\n\n getPeers = function() {\n return data.peers;\n },\n\n isBusy = function() {\n return data.loading;\n },\n\n getKnownBlocks = function() {\n return data.knownBlocks;\n },\n\n loadPeers = function() {\n data.peers = [];\n data.searchingPeersOnNetwork = true;\n data.loading = true;\n data.pod = data.pod || esHttp;\n var newPeers = [];\n\n if (interval) {\n $interval.cancel(interval);\n }\n\n interval = $interval(function() {\n // not same job instance\n if (newPeers.length) {\n flushNewPeersAndSort(newPeers);\n }\n else if (data.loading && !data.searchingPeersOnNetwork) {\n data.loading = false;\n $interval.cancel(interval);\n // The peer lookup end, we can make a clean final report\n sortPeers(true/*update main buid*/);\n\n console.debug('[network] Finish: {0} peers found.'.format(data.peers.length));\n }\n }, 1000);\n\n return $q.when()\n .then(function(){\n // online nodes\n if (data.filter.online) {\n return data.pod.network.peers()\n .then(function(res){\n var jobs = [];\n _.forEach(res.peers, function(json) {\n if (json.status == 'UP') {\n jobs.push(addOrRefreshPeerFromJson(json, newPeers));\n }\n });\n\n if (jobs.length) return $q.all(jobs);\n })\n .catch(function(err) {\n // Log and continue\n console.error(err);\n });\n }\n\n // offline nodes\n return data.pod.network.peers()\n .then(function(res){\n var jobs = [];\n _.forEach(res.peers, function(json) {\n if (json.status !== 'UP') {\n jobs.push(addOrRefreshPeerFromJson(json, newPeers));\n }\n });\n if (jobs.length) return $q.all(jobs);\n });\n })\n\n .then(function(){\n data.searchingPeersOnNetwork = false;\n })\n .catch(function(err){\n console.error(err);\n data.searchingPeersOnNetwork = false;\n });\n },\n\n /**\n * Apply filter on a peer. (peer uid should have been filled BEFORE)\n */\n applyPeerFilter = function(peer) {\n // no filter\n if (!data.filter) return true;\n\n // Filter on endpoints\n if (data.filter.endpointFilter &&\n (peer.ep && peer.ep.api && peer.ep.api !== data.filter.endpointFilter || !peer.hasEndpoint(data.filter.endpointFilter))) {\n return false;\n }\n\n // Filter on status\n if (!data.filter.online && peer.status === 'UP') {\n return false;\n }\n\n // Filter on ssl\n if (angular.isDefined(data.filter.ssl) && peer.isSsl() != data.filter.ssl) {\n return false;\n }\n\n // Filter on tor\n if (angular.isDefined(data.filter.tor) && peer.isTor() != data.filter.tor) {\n return false;\n }\n\n return true;\n },\n\n addOrRefreshPeerFromJson = function(json, list) {\n list = list || data.newPeers;\n\n var peers = createPeerEntities(json);\n var hasUpdates = false;\n\n var jobs = peers.reduce(function(jobs, peer) {\n var existingPeer = _.findWhere(data.peers, {id: peer.id});\n var existingMainBuid = existingPeer ? existingPeer.buid : null;\n var existingOnline = existingPeer ? existingPeer.online : false;\n\n return jobs.concat(\n refreshPeer(peer)\n .then(function (refreshedPeer) {\n if (existingPeer) {\n // remove existing peers, when reject or offline\n if (!refreshedPeer || (refreshedPeer.online !== data.filter.online && data.filter.online !== 'all')) {\n console.debug('[network] Peer [{0}] removed (cause: {1})'.format(peer.server, !refreshedPeer ? 'filtered' : (refreshedPeer.online ? 'UP': 'DOWN')));\n data.peers.splice(data.peers.indexOf(existingPeer), 1);\n hasUpdates = true;\n }\n else if (refreshedPeer.buid !== existingMainBuid){\n console.debug('[network] {0} endpoint [{1}] new current block'.format(\n refreshedPeer.ep && (refreshedPeer.ep.useBma ? 'BMA' : 'WS2P') || 'null',\n refreshedPeer.server));\n hasUpdates = true;\n }\n else if (existingOnline !== refreshedPeer.online){\n console.debug('[network] {0} endpoint [{1}] is now {2}'.format(\n refreshedPeer.ep && (refreshedPeer.ep.useBma ? 'BMA' : 'WS2P') || 'null',\n refreshedPeer.server,\n refreshedPeer.online ? 'UP' : 'DOWN'));\n hasUpdates = true;\n }\n else {\n console.debug(\"[network] {0} endpoint [{1}] unchanged\".format(\n refreshedPeer.ep && (refreshedPeer.ep.useBma ? 'BMA' : 'WS2P') || 'null',\n refreshedPeer.server));\n }\n }\n else if (refreshedPeer && (refreshedPeer.online === data.filter.online || data.filter.online === 'all')) {\n console.debug(\"[network] {0} endpoint [{1}] is {2}\".format(\n refreshedPeer.ep && refreshedPeer.ep.api || '',\n refreshedPeer.server,\n refreshedPeer.online ? 'UP' : 'DOWN'\n ));\n list.push(refreshedPeer);\n hasUpdates = true;\n }\n })\n );\n }, []);\n return (jobs.length === 1 ? jobs[0] : $q.all(jobs))\n .then(function() {\n return hasUpdates;\n });\n },\n\n createPeerEntities = function(json, ep) {\n if (!json) return [];\n var peer = new EsPeer(json);\n\n // Read endpoints\n if (!ep) {\n var endpointsAsString = peer.getEndpoints();\n if (!endpointsAsString) return []; // no BMA\n\n var endpoints = endpointsAsString.reduce(function (res, epStr) {\n var ep = esHttp.node.parseEndPoint(epStr);\n return ep ? res.concat(ep) : res;\n }, []);\n\n // recursive call, on each endpoint\n if (endpoints.length > 1) {\n return endpoints.reduce(function (res, ep) {\n return res.concat(createPeerEntities(json, ep));\n }, []);\n }\n else {\n // if only one endpoint: use it and continue\n ep = endpoints[0];\n }\n }\n peer.ep = ep;\n peer.server = peer.getServer();\n peer.dns = peer.getDns();\n peer.blockNumber = peer.block && peer.block.replace(/-.+$/, '');\n peer.id = peer.keyID();\n return [peer];\n },\n\n refreshPeer = function(peer) {\n\n // Apply filter\n if (!applyPeerFilter(peer)) return $q.when();\n\n if (!data.filter.online || (data.filter.online === 'all' && peer.status === 'DOWN') || !peer.getHost() /*fix #537*/) {\n peer.online = false;\n return $q.when(peer);\n }\n\n // App running in SSL: Do not try to access not SSL node,\n if (isHttpsMode && !peer.isSsl()) {\n peer.online = (peer.status === 'UP');\n peer.buid = constants.UNKNOWN_BUID;\n delete peer.version;\n\n return $q.when(peer);\n }\n\n // Do not try to access TOR or WS2P endpoints\n if (peer.ep.useTor) {\n peer.online = (peer.status == 'UP');\n peer.buid = constants.UNKNOWN_BUID;\n delete peer.software;\n delete peer.version;\n return $q.when(peer);\n }\n\n peer.api = peer.api || esHttp.lightInstance(peer.getHost(), peer.getPort(), peer.isSsl(), data.timeout);\n\n // Get current block\n return peer.api.blockchain.current()\n .then(function(block) {\n peer.currentNumber = block.number;\n peer.online = true;\n peer.buid = buid(block);\n peer.medianTime = block.medianTime;\n if (data.knownBlocks.indexOf(peer.buid) === -1) {\n data.knownBlocks.push(peer.buid);\n }\n return peer;\n })\n .catch(function(err) {\n // Special case for currency init (root block not exists): use fixed values\n if (err && err.ucode == BMA.errorCodes.NO_CURRENT_BLOCK) {\n peer.online = true;\n peer.buid = buid({number:0, hash: BMA.constants.ROOT_BLOCK_HASH});\n peer.difficulty = 0;\n return peer;\n }\n if (!peer.secondTry) {\n var ep = peer.ep || peer.getEP();\n if (ep.dns && peer.server.indexOf(ep.dns) == -1) {\n // try again, using DNS instead of IPv4 / IPV6\n peer.secondTry = true;\n peer.api = esHttp.lightInstance(ep.dns, ep.port, ep.useSsl);\n return refreshPeer(peer); // recursive call\n }\n }\n\n peer.online=false;\n peer.currentNumber = null;\n peer.buid = null;\n return peer;\n })\n .then(function(peer) {\n // Exit if offline\n if (!data.filter.online || !peer || !peer.online) return peer;\n\n peer.docCount = {};\n\n return $q.all([\n // Get summary (software and version) - expert mode only\n !data.expertMode ? $q.when() : peer.api.node.summary()\n .then(function(res){\n peer.software = res && res.duniter && res.duniter.software || undefined;\n peer.version = res && res.duniter && res.duniter.version || '?';\n })\n .catch(function() {\n peer.software = undefined;\n peer.version = '?';\n }),\n\n // Count documents\n peer.api.record.count(data.document.index,data.document.type)\n .then(function(count){\n peer.docCount.record = count;\n })\n .catch(function() {\n peer.docCount.record = undefined;\n }),\n\n // Count email subscription\n peer.api.subscription.count({recipient: peer.pubkey, type: 'email'})\n .then(function(res){\n peer.docCount.emailSubscription = res;\n })\n .catch(function() {\n peer.docCount.emailSubscription = undefined; // continue\n })\n ]);\n\n })\n .then(function() {\n // Clean the instance\n delete peer.api;\n return peer;\n });\n },\n\n flushNewPeersAndSort = function(newPeers, updateMainBuid) {\n newPeers = newPeers || data.newPeers;\n if (!newPeers.length) return;\n var ids = _.map(data.peers, function(peer){\n return peer.id;\n });\n var hasUpdates = false;\n var newPeersAdded = 0;\n _.forEach(newPeers.splice(0), function(peer) {\n if (!ids[peer.id]) {\n data.peers.push(peer);\n ids[peer.id] = peer;\n hasUpdates = true;\n newPeersAdded++;\n }\n });\n if (hasUpdates) {\n console.debug('[network] Flushing {0} new peers...'.format(newPeersAdded));\n sortPeers(updateMainBuid);\n }\n },\n\n computeScoreAlphaValue = function(value, nbChars, asc) {\n if (!value) return 0;\n var score = 0;\n value = value.toLowerCase();\n if (nbChars > value.length) {\n nbChars = value.length;\n }\n score += value.charCodeAt(0);\n for (var i=1; i < nbChars; i++) {\n score += Math.pow(0.001, i) * value.charCodeAt(i);\n }\n return asc ? (1000 - score) : score;\n },\n\n sortPeers = function(updateMainBuid) {\n // Construct a map of buid, with peer count and medianTime\n var buids = {};\n _.forEach(data.peers, function(peer){\n if (peer.buid) {\n var buid = buids[peer.buid];\n if (!buid || !buid.medianTime) {\n buid = {\n buid: peer.buid,\n count: 0,\n medianTime: peer.medianTime\n };\n buids[peer.buid] = buid;\n }\n // If not already done, try to fill medianTime (need to compute consensusBlockDelta)\n else if (!buid.medianTime && peer.medianTime) {\n buid.medianTime = peer.medianTime;\n }\n if (buid.buid != constants.UNKNOWN_BUID) {\n buid.count++;\n }\n }\n });\n // Compute pct of use, per buid\n _.forEach(_.values(buids), function(buid) {\n buid.pct = buid.count * 100 / data.peers.length;\n });\n var mainBlock = _.max(buids, function(obj) {\n return obj.count;\n });\n _.forEach(data.peers, function(peer){\n peer.hasMainConsensusBlock = peer.buid == mainBlock.buid;\n peer.hasConsensusBlock = peer.buid && !peer.hasMainConsensusBlock && buids[peer.buid].count > 1;\n if (peer.hasConsensusBlock) {\n peer.consensusBlockDelta = buids[peer.buid].medianTime - mainBlock.medianTime;\n }\n });\n data.peers = _.uniq(data.peers, false, function(peer) {\n return peer.id;\n });\n data.peers = _.sortBy(data.peers, function(peer) {\n var score = 0;\n if (data.sort.type) {\n var sortScore = 0;\n sortScore += (data.sort.type == 'name' ? computeScoreAlphaValue(peer.name, 10, data.sort.asc) : 0);\n sortScore += (data.sort.type == 'software' ? computeScoreAlphaValue(peer.software, 10, data.sort.asc) : 0);\n sortScore += (data.sort.type == 'api') &&\n ((peer.hasEndpoint('GCHANGE_SUBSCRIPTION_API') && (data.sort.asc ? 1 : -1) || 0) +\n (peer.hasEndpoint('GCHANGE_API') && (data.sort.asc ? 0.01 : -0.01) || 0) +\n (peer.isSsl() && (data.sort.asc ? 0.75 : -0.75) || 0)) || 0;\n sortScore += (data.sort.type == 'doc_count' ? (peer.docCount ? (data.sort.asc ? (1000000000 - peer.docCount) : peer.docCount) : 0) : 0);\n score += (10000000000 * sortScore);\n }\n score += (1000000000 * (peer.online ? 1 : 0));\n score += (100000000 * (peer.hasMainConsensusBlock ? 1 : 0));\n score += (1000000 * (peer.hasConsensusBlock ? buids[peer.buid].pct : 0));\n if (data.expertMode) {\n score += (100 * (peer.difficulty ? (10000-peer.difficulty) : 0));\n score += (1 * (peer.uid ? computeScoreAlphaValue(peer.uid, 2, true) : 0));\n }\n else {\n score += (100 * (peer.uid ? computeScoreAlphaValue(peer.uid, 2, true) : 0));\n score += (1 * (!peer.uid ? computeScoreAlphaValue(peer.pubkey, 2, true) : 0));\n }\n return -score;\n });\n\n // Raise event on new main block\n if (updateMainBuid && mainBlock.buid && (!data.mainBlock || data.mainBlock.buid !== mainBlock.buid)) {\n data.mainBlock = mainBlock;\n api.data.raise.mainBlockChanged(mainBlock);\n }\n\n // Raise event when changed\n api.data.raise.changed(data); // raise event\n },\n\n removeListeners = function() {\n _.forEach(data.listeners, function(remove){\n remove();\n });\n data.listeners = [];\n },\n\n addListeners = function() {\n data.listeners = [\n\n // Listen for new block\n data.pod.websocket.block().onListener(function(block) {\n if (!block || data.loading) return;\n var buid = [block.number, block.hash].join('-');\n if (data.knownBlocks.indexOf(buid) === -1) {\n console.debug('[network] Receiving block: ' + buid.substring(0, 20));\n data.knownBlocks.push(buid);\n // If first block: do NOT refresh peers (will be done in start() method)\n var skipRefreshPeers = data.knownBlocks.length === 1;\n if (!skipRefreshPeers) {\n data.loading = true;\n // We wait 2s when a new block is received, just to wait for network propagation\n $timeout(function() {\n console.debug('[network] new block received by WS: will refresh peers');\n loadPeers();\n }, 2000, false /*invokeApply*/);\n }\n }\n }),\n\n // Listen for new peer\n data.pod.websocket.peer().onListener(function(json) {\n if (!json || data.loading) return;\n var newPeers = [];\n addOrRefreshPeerFromJson(json, newPeers)\n .then(function(hasUpdates) {\n if (!hasUpdates) return;\n if (newPeers.length>0) {\n flushNewPeersAndSort(newPeers, true);\n }\n else {\n console.debug('[network] [ws] Peers updated received');\n sortPeers(true);\n }\n });\n })\n ];\n },\n\n sort = function(options) {\n options = options || {};\n data.filter = options.filter ? angular.merge(data.filter, options.filter) : data.filter;\n data.sort = options.sort ? angular.merge(data.sort, options.sort) : data.sort;\n sortPeers(false);\n },\n\n start = function(pod, options) {\n options = options || {};\n return esHttp.ready()\n .then(function() {\n close();\n data.pod = pod || esHttp;\n data.filter = options.filter ? angular.merge(data.filter, options.filter) : data.filter;\n data.sort = options.sort ? angular.merge(data.sort, options.sort) : data.sort;\n data.expertMode = angular.isDefined(options.expertMode) ? options.expertMode : data.expertMode;\n data.timeout = angular.isDefined(options.timeout) ? options.timeout : csConfig.timeout;\n console.info('[network] Starting network from [{0}]'.format(data.pod.server));\n var now = Date.now();\n\n addListeners();\n\n return loadPeers()\n .then(function(peers){\n console.debug('[network] Started in '+(Date.now() - now)+'ms');\n return peers;\n });\n });\n },\n\n close = function() {\n if (data.pod) {\n console.info('[network-service] Stopping...');\n removeListeners();\n }\n resetData();\n },\n\n isStarted = function() {\n return !data.pod;\n },\n\n $q_started = function(callback) {\n if (!isStarted()) { // start first\n return start()\n .then(function() {\n return $q(callback);\n });\n }\n else {\n return $q(callback);\n }\n },\n\n getMainBlockUid = function() {\n return $q_started(function(resolve, reject){\n resolve (data.mainBuid);\n });\n },\n\n // Get peers on the main consensus blocks\n getTrustedPeers = function() {\n return $q_started(function(resolve, reject){\n resolve(data.peers.reduce(function(res, peer){\n return (peer.hasMainConsensusBlock && peer.uid) ? res.concat(peer) : res;\n }, []));\n });\n }\n ;\n\n // Register extension points\n api.registerEvent('data', 'changed');\n api.registerEvent('data', 'mainBlockChanged');\n api.registerEvent('data', 'rollback');\n\n return {\n id: id,\n data: data,\n start: start,\n close: close,\n hasPeers: hasPeers,\n getPeers: getPeers,\n sort: sort,\n getTrustedPeers: getTrustedPeers,\n getKnownBlocks: getKnownBlocks,\n getMainBlockUid: getMainBlockUid,\n loadPeers: loadPeers,\n isBusy: isBusy,\n // api extension\n api: api\n };\n };\n\n var service = factory('default');\n\n service.instance = factory;\n return service;\n}]);\n","angular.module('cesium.es.like.services', ['ngResource', 'ngApi', 'cesium.services', 'cesium.config', 'cesium.es.http.services',])\n\n /**\n * Like service\n */\n .factory('esLike', ['$q', '$timeout', '$rootScope', '$state', '$sce', '$translate', '$window', '$filter', 'CryptoUtils', 'UIUtils', 'csWallet', 'esHttp', function($q, $timeout, $rootScope, $state, $sce, $translate, $window, $filter,\n CryptoUtils, UIUtils, csWallet, esHttp) {\n 'ngInject';\n\n var\n constants = {\n KINDS: ['VIEW', 'LIKE', 'DISLIKE', 'FOLLOW', 'ABUSE', 'STAR']\n };\n\n function EsLike(index, type) {\n var\n raw = {\n postSearch: esHttp.post('/like/record/_search'),\n getSearch: esHttp.get('/like/record/_search?_source=false&q=:q'),\n add: esHttp.record.post('/{0}/{1}/:id/_like'.format(index, type)),\n remove: esHttp.record.remove('like', 'record')\n }\n ;\n\n function addLike(id, options) {\n options = options || {};\n options.kind = options.kind && options.kind.toUpperCase() || 'LIKE';\n if (!csWallet.isLogin()) return $q.reject('Wallet must be login before sending record to ES node');\n var obj = {\n version: 2,\n index: index,\n type: type,\n id: id,\n kind: options.kind\n };\n if (options.comment) obj.comment = options.comment;\n if (angular.isDefined(options.level)) obj.level = options.level;\n\n return raw.add(obj);\n }\n\n function toggleLike(id, options) {\n options = options || {};\n options.kind = options.kind || 'LIKE';\n if (!csWallet.isLogin()) return $q.reject('Wallet must be login before sending record to ES node');\n return getLikeIds(id, {kind: options.kind, issuer: csWallet.data.pubkey})\n .then(function (existingLikeIds) {\n // User already like: so remove it\n if (existingLikeIds && existingLikeIds.length) {\n return $q.all(_.map(existingLikeIds, function (likeId) {\n return raw.remove(likeId);\n }))\n // Return the deletion, as a delta\n .then(function () {\n return -1 * existingLikeIds.length;\n });\n }\n // User not like, so add it\n else {\n return addLike(id, options)\n // Return the insertion, as a delta\n .then(function () {\n return +1;\n });\n }\n });\n }\n\n function getLikeIds(id, options) {\n options = options || {};\n options.kind = options.kind || 'LIKE';\n var queryString = 'index:{0} AND type:{1} AND id:{2}'.format(index, type, id);\n if (options.kind) queryString += ' AND kind:' + options.kind.toUpperCase();\n if (options.issuer) queryString += ' AND issuer:' + options.issuer;\n\n return raw.getSearch({q: queryString})\n .then(function (res) {\n return (res && res.hits && res.hits.hits || []).map(function (hit) {\n return hit._id;\n });\n });\n }\n\n function removeLike(id) {\n if (!id) throw new Error(\"Missing 'id' argument !\");\n return raw.remove(id);\n }\n\n function countLikes(id, options) {\n options = options || {};\n options.kind = options.kind && options.kind.toUpperCase() || 'LIKE';\n // Get level (default to true when kind=star, otherwise false)\n options.level = angular.isDefined(options.level) ? options.level : (options.kind === 'STAR');\n\n var request = {\n query: {\n bool: {\n filter: [\n {term: {index: index}},\n {term: {type: type}},\n {term: {id: id}},\n {term: {kind: options.kind.toUpperCase()}}\n ]\n }\n },\n size: 0\n };\n\n // To known if the user already like, add 'should' on issuer, and limit to 1\n if (options.issuer) {\n request.query.bool.should = {term: {issuer: options.issuer}};\n request.size = 1;\n request._source = [\"issuer\"];\n }\n\n // Computre level AVG and issuer level\n if (options.level) {\n request.aggs = {\n level_sum: {\n sum: {field: \"level\"}\n }\n };\n request._source = request._source || [];\n request._source.push(\"level\");\n }\n return raw.postSearch(request)\n .then(function (res) {\n var hits = res && res.hits;\n\n // Check is issuer is return (because of size=1 and should filter)\n var issuerHitIndex = hits && options.issuer ? _.findIndex(hits.hits, function (hit) {\n return hit._source.issuer === options.issuer;\n }) : -1;\n\n var result = {\n total: hits && hits.total || 0,\n wasHit: issuerHitIndex !== -1 || false,\n wasHitId: issuerHitIndex !== -1 && hits.hits[issuerHitIndex]._id || false\n };\n\n // Set level values (e.g. is kind=star)\n if (options.level) {\n result.level = issuerHitIndex !== -1 ? hits.hits[issuerHitIndex]._source.level : undefined;\n result.levelSum = res.aggregations && res.aggregations.level_sum.value || 0;\n\n // Compute the AVG (rounded at a precision of 0.5)\n result.levelAvg = result.total && (Math.floor((result.levelSum / result.total + 0.5) * 10) / 10 - 0.5) || 0;\n }\n\n return result;\n });\n }\n\n function loadLikes(options) {\n options = options || {};\n\n var filters = [\n {term: {index: index}},\n {term: {type: type}}\n ];\n\n var request = {\n query: {\n bool: {\n filter: filters\n }\n },\n from: options.from || 0,\n size: options.size || 20,\n _source: options._source || ['id', 'kind', 'time', 'level', 'issuer']\n };\n\n if (options.kinds) {\n filters.push({terms: {\n kind: _.map(options.kinds, function(kind) {\n return kind.toUpperCase();\n })\n }});\n }\n else if (options.kind) {\n filters.push({term: {kind: options.kind.toUpperCase()}});\n }\n\n // To known if the user already like, add 'should' on issuer, and limit to 1\n if (options.issuer) {\n filters.push({term: {issuer: options.issuer}});\n }\n\n return raw.postSearch(request)\n .then(function (res) {\n if (!res || !res.hits) return;\n\n return {\n total: res.hits.total || 0,\n hits: _.pluck(res.hits.hits || [], '_source')\n };\n });\n }\n\n return {\n toggle: toggleLike,\n load: loadLikes,\n add: addLike,\n remove: removeLike,\n count: countLikes\n };\n }\n\n return {\n constants: constants,\n instance: EsLike\n };\n }])\n;\n","angular.module('cesium.es.registry.services', ['ngResource', 'cesium.services', 'cesium.es.http.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('esRegistry');\n }\n\n}])\n\n.factory('esRegistry', ['$rootScope', '$q', 'csPlatform', 'csSettings', 'csWallet', 'csWot', 'esHttp', 'esComment', 'esGeo', function($rootScope, $q, csPlatform, csSettings, csWallet, csWot, esHttp, esComment, esGeo) {\n 'ngInject';\n\n var\n fields = {\n commons: [\"title\", \"description\", \"issuer\", \"time\", \"address\", \"city\", \"creationTime\", \"avatar._content_type\",\n \"picturesCount\", \"type\", \"category\", \"socials\", \"pubkey\",\n \"geoPoint\"\n ]\n },\n that = this,\n listeners;\n\n that.raw = {\n count: esHttp.get('/page/record/_search?size=0&q=issuer::pubkey'),\n searchText: esHttp.get('/page/record/_search?q=:search'),\n search: esHttp.post('/page/record/_search'),\n get: esHttp.get('/page/record/:id'),\n getCommons: esHttp.get('/page/record/:id?_source=' + fields.commons.join(',')),\n category: {\n get: esHttp.get('/page/category/:id'),\n all: esHttp.get('/page/category/_search?sort=order&from=0&size=1000&_source=name,parent')\n }\n };\n\n function onWalletReset(data) {\n data.pages = null;\n }\n\n function onWalletLogin(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n deferred.resolve();\n return deferred.promise;\n }\n\n console.debug('[ES] [registry] Loading pages count...');\n\n // Load subscriptions count\n that.raw.count({pubkey: data.pubkey})\n .then(function(res) {\n data.pages = data.pages || {};\n data.pages.count = res && res.hits && res.hits.total;\n console.debug('[ES] [registry] Loaded pages count (' + data.pages.count + ')');\n deferred.resolve(data);\n })\n .catch(function(err) {\n console.error('[ES] [registry] Error while counting page: ' + (err.message ? err.message : err));\n deferred.resolve(data);\n });\n\n return deferred.promise;\n }\n\n function getCategories() {\n if (that.raw.categories && that.raw.categories.length) {\n var deferred = $q.defer();\n deferred.resolve(that.raw.categories);\n return deferred.promise;\n }\n return that.raw.category.all()\n .then(function(res) {\n if (res.hits.total === 0) {\n that.raw.categories = [];\n }\n else {\n var categories = res.hits.hits.reduce(function(result, hit) {\n var cat = hit._source;\n cat.id = hit._id;\n return result.concat(cat);\n }, []);\n // add as map also\n _.forEach(categories, function(cat) {\n categories[cat.id] = cat;\n });\n that.raw.categories = categories;\n }\n return that.raw.categories;\n });\n }\n\n function getCategory(params) {\n return that.raw.category.get(params)\n .then(function(hit) {\n var res = hit._source;\n res.id = hit._id;\n return res;\n });\n }\n\n function readRecordFromHit(hit, categories) {\n if (!hit) return;\n var record = hit._source;\n if (record.category && record.category.id) {\n record.category = categories[record.category.id];\n }\n if (hit.highlight) {\n if (hit.highlight.title) {\n record.title = hit.highlight.title[0];\n }\n if (hit.highlight.description) {\n record.description = hit.highlight.description[0];\n }\n if (hit.highlight.location) {\n record.location = hit.highlight.location[0];\n }\n if (hit.highlight.tags) {\n record.tags = hit.highlight.tags.reduce(function(res, tag){\n return res.concat(tag.replace('<em>', '').replace('</em>', ''));\n },[]);\n }\n }\n\n // avatar\n record.avatar = esHttp.image.fromHit(hit, 'avatar');\n\n // pictures\n if (hit._source.pictures && hit._source.pictures.reduce) {\n record.pictures = hit._source.pictures.reduce(function(res, pic) {\n return res.concat(esHttp.image.fromAttachment(pic.file));\n }, []);\n }\n\n return record;\n }\n\n\n function search(request) {\n request = request || {};\n request.from = request.from || 0;\n request.size = request.size || 20;\n request._source = request._source || fields.commons;\n request.highlight = request.highlight || {\n fields : {\n title : {},\n description : {}\n }\n };\n\n return $q.all([\n // load categories\n getCategories(),\n // Do search\n that.raw.search(request)\n ])\n .then(function(res) {\n var categories = res[0];\n res = res[1];\n\n if (!res || !res.hits || !res.hits.total) {\n return {\n total: 0,\n hits: []\n };\n }\n\n // Get geo_distance filter\n var geoDistanceObj = esHttp.util.findObjectInTree(request.query, 'geo_distance');\n var geoPoint = geoDistanceObj && geoDistanceObj.geoPoint;\n var geoDistanceUnit = geoDistanceObj && geoDistanceObj.distance && geoDistanceObj.distance.replace(new RegExp(\"[0-9 ]+\", \"gm\"), '');\n\n var hits = res.hits.hits.reduce(function(result, hit) {\n var record = readRecordFromHit(hit, categories);\n record.id = hit._id;\n\n // Add distance to point\n if (geoPoint && record.geoPoint && geoDistanceUnit) {\n record.distance = esGeo.point.distance(\n geoPoint.lat, geoPoint.lon,\n record.geoPoint.lat, record.geoPoint.lon,\n geoDistanceUnit\n );\n }\n return result.concat(record);\n }, []);\n\n return {\n total: res.hits.total,\n hits: hits\n };\n });\n }\n\n function loadData(id, options) {\n options = options || {};\n options.raw = angular.isDefined(options.raw) ? options.raw : false;\n options.fecthPictures = angular.isDefined(options.fetchPictures) ? options.fetchPictures : options.raw;\n\n return $q.all([\n\n // load categories\n getCategories(),\n\n // Do get source\n options.fecthPictures ?\n that.raw.get({id: id}) :\n that.raw.getCommons({id: id})\n ])\n .then(function(res) {\n var categories = res[0];\n var hit = res[1];\n var record = readRecordFromHit(hit, categories);\n\n // parse description as Html\n if (!options.raw) {\n record.description = esHttp.util.parseAsHtml(record.description, {\n tagState: 'app.registry_lookup'\n });\n }\n\n // Load issuer (avatar, name, etc.)\n return csWot.extend({pubkey: record.issuer})\n .then(function(issuer) {\n return {\n id: hit._id,\n issuer: issuer,\n record: record\n };\n });\n });\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend\n listeners = [\n csWallet.api.data.on.login($rootScope, onWalletLogin, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[ES] [subscription] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n return onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[ES] [subscription] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n return onWalletLogin(csWallet.data);\n }\n }\n }\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n that.category = {\n all: getCategories,\n get: getCategory\n };\n that.record = {\n search: search,\n load: loadData,\n add: esHttp.record.post('/page/record', {tagFields: ['title', 'description'], creationTime: true}),\n update: esHttp.record.post('/page/record/:id/_update', {tagFields: ['title', 'description']}),\n remove: esHttp.record.remove('page', 'record'),\n fields: {\n commons: fields.commons\n },\n picture: {\n all: esHttp.get('/page/record/:id?_source=pictures')\n },\n comment: esComment.instance('page')\n };\n that.currency = {\n all: esHttp.get('/currency/record/_search?_source=currencyName,peers.host,peers.port'),\n get: esHttp.get('/currency/record/:id/_source')\n };\n return that;\n}])\n;\n","angular.module('cesium.market.services', [\n // removeIf(device)\n 'cesium.market.converse.services',\n // endRemoveIf(device)\n 'cesium.market.modal.services',\n 'cesium.market.record.services',\n 'cesium.market.tx.services',\n 'cesium.market.wallet.services',\n 'cesium.market.settings.services',\n 'cesium.market.category.services'\n]);\n\n\nangular.module('cesium.market.plugin', [\n 'cesium.market.app.controllers',\n 'cesium.market.home.controllers',\n 'cesium.market.join.controllers',\n 'cesium.market.login.controllers',\n 'cesium.market.search.controllers',\n 'cesium.market.gallery.controllers',\n 'cesium.market.record.controllers',\n 'cesium.market.wallet.controllers',\n 'cesium.market.category.controllers',\n 'cesium.market.wot.controllers',\n 'cesium.market.document.controllers',\n\n // Services\n 'cesium.market.services'\n])\n\n.run(['csConfig', 'Modals', 'mkModals', function(csConfig, Modals, mkModals) {\n 'ngInject';\n\n if (csConfig.plugins && csConfig.plugins.market && csConfig.plugins.market.enable) {\n\n console.debug(\"[plugin] [market] Override login and join modals\");\n Modals.showLogin = mkModals.showLogin;\n Modals.showJoin = mkModals.showJoin;\n }\n}]);\n\n","angular.module('cesium.market.modal.services', ['cesium.modal.services'])\n\n.factory('mkModals', ['ModalUtils', function(ModalUtils) {\n 'ngInject';\n\n function showJoinModal(parameters) {\n return ModalUtils.show('plugins/market/templates/join/modal_join.html', 'MkJoinModalCtrl', parameters);\n }\n\n function showHelpModal(parameters) {\n return ModalUtils.show('plugins/market/templates/help/modal_help.html', 'HelpModalCtrl', parameters);\n }\n\n function showLoginModal(parameters) {\n return ModalUtils.show('plugins/market/templates/login/modal_login.html', 'MarketLoginModalCtrl', parameters);\n }\n\n function showEventLoginModal(parameters) {\n return ModalUtils.show('plugins/market/templates/login/modal_event_login.html', 'MarketEventLoginModalCtrl', parameters);\n }\n\n return {\n showHelp: showHelpModal,\n showJoin: showJoinModal,\n showLogin: showLoginModal,\n showEventLogin: showEventLoginModal\n };\n\n}]);\n","angular.module('cesium.market.category.services', ['ngResource', 'cesium.services', 'cesium.es.services', 'cesium.market.settings.services'])\n\n .factory('mkCategory', ['$q', '$translate', 'csSettings', 'BMA', 'csConfig', 'esHttp', 'esComment', 'esGeo', 'csWot', 'csCurrency', 'mkSettings', function ($q, $translate, csSettings, BMA, csConfig, esHttp, esComment, esGeo, csWot, csCurrency, mkSettings) {\n 'ngInject';\n\n var\n filters = {},\n regexp = {\n ID: /^cat[0-9]+$/\n },\n raw = {\n get: esHttp.get('/market/category/:id'),\n all: esHttp.get('/market/category/_search?sort=order&size=1000&_source=name,parent,localizedNames'),\n search: esHttp.post('/market/category/_search'),\n add: esHttp.record.post('/market/category', {creationTime: true}),\n update: esHttp.record.post('/market/category/:id/_update', {creationTime: true}),\n remove: esHttp.record.remove(\"market\",\"category\"),\n record: {\n postSearch: esHttp.post('/market/record/_search'),\n },\n },\n cache = {\n locale: undefined\n };\n\n function readFromHit(hit, options) {\n var cat = hit._source;\n cat.id = hit._id;\n\n // Replace name by the current locale, when possible\n if (cat.localizedNames) {\n cat.name = cat.localizedNames[options.locale] ||\n // Fallback to default locale, or keep existing name\n (options.fallbackLocalId && cat.localizedNames[options.fallbackLocalId]) ||\n cat.name;\n }\n\n return cat;\n }\n\n function getCategories(options) {\n options = options || {};\n options.withCache = angular.isDefined(options.withCache) ? options.withCache : true;\n options.locale = angular.isDefined(options.locale) ? options.locale : $translate.use();\n options.fallbackLocalId = csSettings.fixLocale(csConfig.defaultLanguage) || 'en';\n\n if (options.withCache && cache.categories && cache.categories.length && cache.locale === options.locale) {\n var deferred = $q.defer();\n deferred.resolve(cache.categories);\n return deferred.promise;\n }\n\n\n return raw.all()\n .then(function (res) {\n var categories;\n if (res.hits.total === 0) {\n categories = [];\n } else {\n categories = res.hits.hits.reduce(function (result, hit) {\n var cat = readFromHit(hit, options);\n return result.concat(cat);\n }, []);\n // add as map also\n _.forEach(categories, function (cat) {\n categories[cat.id] = cat;\n });\n }\n // Update the cache\n cache.categories = categories;\n if (cache.locale !== options.locale) {\n cache.locale = options.locale;\n cache.filteredCategories = undefined;\n }\n\n return categories;\n });\n }\n\n function getFilteredCategories(options) {\n options = options || {};\n options.filter = angular.isDefined(options.filter) ? options.filter : undefined;\n options.withCache = angular.isDefined(options.withCache) ? options.withCache : true;\n options.locale = angular.isDefined(options.locale) ? options.locale : $translate.use();\n options.fallbackLocalId = csSettings.fixLocale(csConfig.defaultLanguage) || 'en';\n\n var cachedResult = options.withCache && cache.filteredCategories && cache.filteredCategories[options.filter];\n if (cachedResult && cachedResult.length && cache.locale === options.locale) {\n var deferred = $q.defer();\n deferred.resolve(cachedResult);\n return deferred.promise;\n }\n\n // Prepare filter exclude function\n var excludes = options.filter && filters[options.filter] && filters[options.filter].excludes;\n var isExclude = excludes && function (value) {\n return _.contains(excludes, value);\n };\n\n return raw.all()\n .then(function (res) {\n // no result\n if (res.hits.total === 0) return [];\n\n var categories = res.hits.hits.reduce(function (result, hit) {\n var cat = readFromHit(hit, options);\n return (isExclude &&\n ((cat.parent && isExclude(cat.parent)) || isExclude(cat.id))) ?\n result :\n result.concat(cat);\n }, []);\n\n // add as map also\n _.forEach(categories, function (cat) {\n categories[cat.id] = cat;\n });\n\n // Update cache\n cache.filteredCategories = cache.filteredCategories || {};\n cache.filteredCategories[options.type] = categories;\n if (cache.locale !== options.locale) {\n cache.locale = options.locale;\n cache.categories = undefined;\n }\n\n return categories;\n });\n }\n\n function getCategory(params, options) {\n options = options || {};\n options.withCache = angular.isDefined(options.withCache) ? options.withCache : true;\n options.withChildren = angular.isDefined(options.withChildren) ? options.withChildren : true;\n\n // If children is need, get\n if (options.withChildren || options.withCache) {\n return getCategories(options)\n\n .then(function(categories) {\n var cat = categories[params.id];\n\n // Make sure to fill tree\n if (options.withChildren) asCategoriesTree(categories);\n\n return cat;\n });\n }\n\n return raw.get(params)\n .then(function (hit) {\n var res = readFromHit(hit);\n\n return res;\n });\n }\n\n function getCategoriesStats(options) {\n options = options || {};\n\n // Make sure to have currency\n if (!options.currencies) {\n return mkSettings.currencies()\n .then(function (currencies) {\n options.currencies = currencies;\n return getCategoriesStats(options); // loop\n });\n }\n\n options.asTree = angular.isDefined(options.asTree) ? options.asTree : true;\n\n var request = {\n size: 0,\n aggs: {\n category: {\n nested: {\n path: 'category'\n },\n aggs: {\n by_id: {\n terms: {\n field: 'category.id',\n size: 1000\n }\n }\n }\n }\n }\n };\n\n var filters = [];\n var matches = [];\n if (options.withStock) {\n filters.push({range: {stock: {gt: 0}}});\n }\n if (!options.withOld) {\n var minTime = options.minTime ? options.minTime : Date.now() / 1000 - 24 * 365 * 60 * 60; // last year\n // Round to hour, to be able to use cache\n minTime = Math.floor(minTime / 60 / 60) * 60 * 60;\n filters.push({range: {time: {gte: minTime}}});\n }\n if (options.currencies && options.currencies.length) {\n filters.push({terms: {currency: options.currencies}});\n }\n // Add query to request\n if (matches.length || filters.length) {\n request.query = {bool: {}};\n if (matches.length) {\n request.query.bool.should = matches;\n }\n if (filters.length) {\n request.query.bool.filter = filters;\n }\n }\n var statsRequestParams = {\n request_cache: true // Always enable stats cache\n };\n\n return $q.all([\n getFilteredCategories(options),\n raw.record.postSearch(request, statsRequestParams)\n ]).then(function (res) {\n var categories = res[0];\n res = res[1];\n\n // Add stats\n var buckets = (res.aggregations.category && res.aggregations.category.by_id && res.aggregations.category.by_id.buckets || []);\n var countById = {};\n buckets.forEach(function (bucket) {\n var cat = categories[bucket.key];\n if (cat) {\n countById[bucket.key] = bucket.doc_count;\n if (cat.parent) {\n countById[cat.parent] = (countById[cat.parent] || 0) + bucket.doc_count;\n }\n }\n });\n\n return categories.reduce(function (res, cat) {\n return res.concat(angular.merge({\n count: countById[cat.id] || 0\n }, cat));\n }, []);\n })\n // Convert to root categories\n .then(function (res) {\n return options.asTree ? asCategoriesTree(res) : res;\n })\n // Handle error\n .catch(function (err) {\n console.error(err);\n return undefined;\n });\n }\n\n function addCategory(category) {\n console.debug('[market] [category] Adding category', category);\n return raw.add(category);\n }\n\n function updateCategory(category) {\n console.debug('[market] [category] Updating category', category);\n return raw.update(category, {id: category.id});\n }\n\n function removeCategoryById(id) {\n console.debug('[market] [category] Removing category: ' + id);\n return raw.remove(id);\n }\n\n function asCategoriesTree(categories) {\n var catByParent = _.groupBy(categories, function (cat) {\n return cat.parent || 'roots';\n });\n _.forEach(catByParent.roots, function (parent) {\n parent.children = catByParent[parent.id];\n });\n // group by parent category\n return catByParent.roots;\n }\n\n function saveAllCategories(cats, options) {\n\n options = options || {};\n\n if (!options.parent) {\n var now = Date.now();\n console.debug('[market] [category] Saving all categories...', cats);\n }\n\n // Avoid to reload categories, when processing children categories\n var existingPromise = options.existingCategories ? $q.when(options.existingCategories) :\n getCategories(false/*no cache*/);\n\n var idsToDelete;\n\n // Get all existing (from pod, without cache)\n return existingPromise\n .then(function (existingCategories) {\n // Collect all ids (once), to be able to apply deletion, later\n idsToDelete = options.idsToDelete || _.pluck(existingCategories, 'id');\n\n return $q.all(_.map(cats || [], function (cat) {\n var existingCat = existingCategories[cat.id];\n\n // Remove the id, from the delete list\n idsToDelete = _.without(idsToDelete, cat.id);\n\n var isNew = !existingCat;\n console.debug(\"[market] [category] - {0} {1}\".format(isNew ? 'Add' : 'Update', cat.id));\n\n // Prepare a fresh record, to save\n var record = {\n id: cat.id,\n localizedNames: cat.localizedNames\n };\n if (cat.parent) record.parent = cat.parent;\n if (existingCat && existingCat.name) record.name = cat.name || null;\n\n // Send save request\n var savePromise = isNew ? addCategory(record, {id: cat.id}) : updateCategory(record, {id: cat.id});\n\n // save children (if any), AFTER the current parent\n return (cat.children && cat.children.length) ? savePromise\n .then(function () {\n return saveAllCategories(cat.children, {parent: cat, existingCategories: existingCategories, idsToDelete: idsToDelete});\n }) : savePromise;\n }, []));\n })\n // Delete (if any)\n .then(function () {\n if (!options.parent && idsToDelete.length > 0) {\n console.debug(\"[market] [category] Deleting categories with id:\", idsToDelete);\n return $q.all(_.map(idsToDelete, raw.remove));\n }\n })\n .then(function () {\n if (!options.parent) {\n console.debug(\"[market] [category] Saved in {0}ms\".format(Date.now() - now));\n }\n });\n }\n\n return {\n all: getCategories,\n filtered: getFilteredCategories,\n asTree: asCategoriesTree,\n get: getCategory,\n searchText: esHttp.get('/market/category/_search?q=:search'),\n search: esHttp.post('/market/category/_search'),\n stats: getCategoriesStats,\n add: addCategory,\n update: updateCategory,\n remove: removeCategoryById,\n saveAll: saveAllCategories,\n regexp: regexp\n };\n }])\n;\n","angular.module('cesium.market.record.services', ['ngApi', 'cesium.services', 'cesium.es.services',\n 'cesium.market.settings.services', 'cesium.market.category.services'])\n\n.factory('mkRecord', ['$q', 'csSettings', 'BMA', 'csConfig', 'csWallet', 'csWot', 'csCurrency', 'csCache', 'Api', 'esHttp', 'esProfile', 'esComment', 'esGeo', 'esLike', 'mkSettings', 'mkCategory', function($q, csSettings, BMA, csConfig, csWallet, csWot, csCurrency, csCache, Api,\n esHttp, esProfile, esComment, esGeo, esLike,\n mkSettings, mkCategory ) {\n 'ngInject';\n\n var\n cachePrefix = 'mkRecord',\n caches = {\n likeMoreThis: null // Lazy init\n },\n fields = {\n commons: [\"category\", \"title\", \"description\", \"issuer\", \"time\", \"creationTime\", \"location\", \"address\", \"city\", \"price\",\n \"unit\", \"currency\", \"thumbnail._content_type\", \"picturesCount\", \"type\", \"stock\", \"fees\", \"feesCurrency\",\n \"geoPoint\", \"pubkey\", \"freePrice\"],\n // Same as commons, but without description\n moreLikeThis: [\"category\", \"title\", \"issuer\", \"time\", \"creationTime\", \"location\", \"address\", \"city\", \"price\",\n \"unit\", \"currency\", \"thumbnail._content_type\", \"picturesCount\", \"type\", \"stock\", \"fees\", \"feesCurrency\",\n \"geoPoint\", \"pubkey\", \"freePrice\"]\n },\n CONSTANTS = {\n DEFAULT_SEARCH_SIZE: 20,\n MORE_LIKE_THIS_SIZE: 6,\n MORE_LIKE_THIS_TIMEOUT: 10000 // 5s\n },\n raw = {\n postSearch: esHttp.post('/market/record/_search'),\n searchText: esHttp.get('/market/record/_search?q=:search'),\n get: esHttp.get('/market/record/:id'),\n getCommons: esHttp.get('/market/record/:id?_source=' + fields.commons.join(',')),\n add: esHttp.record.post('/market/record', {tagFields: ['title', 'description'], creationTime: true}),\n update: esHttp.record.post('/market/record/:id/_update', {tagFields: ['title', 'description'], creationTime: true}),\n remove: esHttp.record.remove('market', 'record'),\n\n },\n data = {\n moreLikeThis: {\n current: undefined\n }\n },\n api = new Api(this, \"mkRecord\"),\n filters = {\n localSale: {\n excludes: [\n 'cat2', // Voitures\n 'cat3', // Motos\n 'cat4', // Caravaning\n 'cat5', // Utilitaires\n 'cat7', // Nautisme\n 'cat28', // Animaux\n 'cat71', // Emploi\n 'cat8', // Immobilier\n 'cat66', // Vacances\n 'cat56', // Matériel professionnel\n 'cat31', // Services\n 'cat48' // Vins &amp; Gastronomie\n ]\n }\n };\n\n function readRecordFromHit(hit, categories, currentUD, options) {\n\n options = options || {};\n\n var record = hit._source;\n\n if (record.category && record.category.id) {\n record.category = categories[record.category.id] || record.category;\n }\n\n // Always convert relative price/fees into absolute price\n if (record.price && options.convertPrice && currentUD) {\n if (record.unit==='UD') {\n record.price = record.price * currentUD;\n }\n }\n if (record.fees && options.convertPrice && currentUD && (!record.feesCurrency || record.feesCurrency === record.currency)) {\n if (record.unit==='UD') {\n record.fees = record.fees * currentUD;\n }\n }\n if (options.html && hit.highlight) {\n if (hit.highlight.title) {\n record.title = hit.highlight.title[0];\n }\n if (hit.highlight.tags) {\n record.tags = hit.highlight.tags.reduce(function(res, tag){\n return res.concat(tag.replace('<em>', '').replace('</em>', ''));\n },[]);\n }\n if (hit.highlight.description) {\n record.description = hit.highlight.description[0];\n }\n else {\n record.description = esHttp.util.parseAsHtml(record.description, {\n tagState: 'app.market_lookup'\n });\n }\n if (hit.highlight.location) {\n record.location = hit.highlight.location[0];\n }\n if (hit.highlight.city) {\n record.city = hit.highlight.city[0];\n }\n if (record.category && hit.highlight[\"category.name\"]) {\n record.category.name = hit.highlight[\"category.name\"][0];\n }\n }\n\n else if (options.html) {\n // description\n record.description = esHttp.util.parseAsHtml(record.description, {\n tagState: 'app.market_lookup'\n });\n }\n\n // thumbnail\n record.thumbnail = esHttp.image.fromHit(hit, 'thumbnail');\n\n // pictures\n if (hit._source.pictures && hit._source.pictures.reduce) {\n record.pictures = hit._source.pictures.reduce(function(res, pic) {\n return pic && pic.file ? res.concat(esHttp.image.fromAttachment(pic.file)) : res;\n }, []);\n }\n\n // backward compat (before gchange v0.6)\n if (record.location && !record.city) {\n record.city = record.location;\n }\n\n return record;\n }\n\n\n function search(request, options) {\n\n console.debug(\"[market] [record] Loading Ads from request: \", request);\n\n request = request || {};\n request.from = request.from || 0;\n request.size = isNaN(request.size) ? CONSTANTS.DEFAULT_SEARCH_SIZE : request.size;\n request._source = request._source || fields.commons;\n request.highlight = request.highlight || {\n fields : {\n title : {},\n description : {},\n \"category.name\" : {},\n tags: {}\n }\n };\n\n var requestParams = {\n request_cache: options && options.withCache === true || false\n };\n\n return $q.all([\n // load categories\n mkCategory.all(),\n\n // Get current UD\n csCurrency.currentUD()\n .then(function (currentUD) {\n return currentUD;\n })\n .catch(function(err) {\n console.error(err);\n return 1;\n }),\n\n // Do search\n raw.postSearch(request, requestParams)\n ])\n .then(function(res) {\n var categories = res[0];\n var currentUD = res[1];\n res = res[2];\n\n if (!res || !res.hits || !res.hits.total) {\n return {\n total: 0,\n hits: []\n };\n }\n\n // Get the geoPoint from the 'geo_distance' filter\n var geoDistanceObj = esHttp.util.findObjectInTree(request.query, 'geo_distance');\n var geoPoint = geoDistanceObj && geoDistanceObj.geoPoint;\n var geoDistanceUnit = geoDistanceObj && geoDistanceObj.distance && geoDistanceObj.distance.replace(new RegExp(\"[0-9 ]+\", \"gm\"), '');\n\n var hits = res.hits.hits.reduce(function(result, hit) {\n var record = readRecordFromHit(hit, categories, currentUD, {convertPrice: true, html: true});\n record.id = hit._id;\n\n // Add distance to point\n if (geoPoint && record.geoPoint && geoDistanceUnit) {\n record.distance = esGeo.point.distance(\n geoPoint.lat, geoPoint.lon,\n record.geoPoint.lat, record.geoPoint.lon,\n geoDistanceUnit\n );\n }\n\n return result.concat(record);\n }, []);\n\n // call extension point\n return api.record.raisePromise.search(hits)\n .then(function() {\n\n return {\n total: res.hits.total,\n hits: hits\n };\n });\n })\n .catch(function(err){\n console.error(err);\n throw new Error('MARKET.ERROR.LOOKUP_RECORDS_FAILED');\n });\n }\n\n function loadData(id, options) {\n options = options || {};\n options.fetchPictures = angular.isDefined(options.fetchPictures) ? options.fetchPictures : true;\n options.convertPrice = angular.isDefined(options.convertPrice) ? options.convertPrice : false;\n\n var hit;\n return $q.all([\n // load categories\n mkCategory.all(),\n\n // Get current UD\n csCurrency.currentUD()\n .catch(function(err) {\n console.error('Could not get current UD', err);\n return 1;\n }),\n\n // Do get source\n options.fetchPictures ?\n raw.get({id: id}) :\n raw.getCommons({id: id})\n ])\n .then(function(res) {\n var categories = res[0];\n var currentUD = res[1];\n hit = res[2];\n\n var record = readRecordFromHit(hit, categories, currentUD, options);\n record.id = hit._id;\n\n // Fill currency with default, if need (e.g. fix old data)\n if (!record.currency && record.price) {\n return mkSettings.currencies()\n .then(function (currencies) {\n record.currency = currencies && currencies[0];\n return record;\n });\n }\n return record;\n })\n .then(function (record) {\n\n return $q.all([\n // Load issuer (avatar, name, etc.)\n csWot.extend({issuer: record.issuer}, \"issuer\", true/*skipAddUid*/),\n\n // API extension (e.g. See market TX service)\n api.record.raisePromise.load(record)\n .catch(function(err) {\n console.debug('[market] [record-service] Error while executing extension point on record load.');\n console.error(err);\n })\n ])\n .then(function(res) {\n var issuer = res[0];\n return {\n id: record.id,\n issuer: issuer,\n record: record\n };\n });\n });\n }\n\n function setStockToRecord(id, stock) {\n return raw.get({id: id})\n .then(function(res) {\n if (!res || !res._source) return;\n var record = res._source;\n record.stock = stock||0;\n record.id = id;\n return raw.update(record, {id: id});\n });\n }\n\n function createSearchRequest(options) {\n options = options || {};\n\n var request = {\n from: options.from||0,\n size: options.size||20,\n _source: options._source || fields.commons\n };\n\n var matches = [];\n var filters = [];\n\n if (options.ids) {\n filters.push({terms: {_id: options.ids}});\n }\n\n if (options.category && options.category.id) {\n var childrenIds = options.category.children && _.pluck(options.category.children, 'id');\n if (childrenIds && childrenIds.length) {\n filters.push({\n nested: {\n path: \"category\",\n query: {\n bool: {\n filter: {\n terms: {\"category.id\": childrenIds}\n }\n }\n }\n }\n });\n }\n else {\n filters.push({\n nested: {\n path: \"category\",\n query: {\n bool: {\n filter: {\n term: {\"category.id\": options.category.id}\n }\n }\n }\n }\n });\n }\n }\n else if (typeof options.category === 'number') {\n filters.push({\n nested: {\n path: \"category\",\n query: {\n bool: {\n filter: {\n term: { \"category.id\": options.category}\n }\n }\n }\n }\n });\n }\n if (options.categories && options.categories.length) {\n filters.push({\n nested: {\n path: \"category\",\n query: {\n bool: {\n filter: {\n terms: { \"category.id\": options.categories}\n }\n }\n }\n }\n });\n }\n if (options.type) {\n var types = options.type === 'offer' ?\n ['offer', 'auction'] :\n (options.type === 'need' ? ['need', 'crowdfunding'] : [options.type]);\n filters.push({terms: {type: types}});\n }\n\n\n var text = (options.text || '').trim();\n var tags = text.length > 0 ? esHttp.util.parseTags(text) : undefined;\n if (text.length > 1) {\n\n // pubkey : use a special 'term', because of 'non indexed' field\n if (BMA.regexp.PUBKEY.test(text /*case sensitive*/)) {\n matches = [];\n filters.push({term : { issuer: text}});\n }\n else {\n var lowerText = text.toLowerCase();\n\n var matchFields = [\"title^2\", \"description\"];\n matches.push({multi_match : { query: lowerText,\n fields: matchFields,\n type: \"phrase_prefix\"\n }});\n matches.push({match: {title: {query: lowerText, boost: 2}}});\n matches.push({prefix: {title: lowerText}});\n matches.push({match: {description: lowerText}});\n\n matches.push({\n nested: {\n path: \"category\",\n query: {\n bool: {\n filter: {\n match: { \"category.name\": lowerText}\n }\n }\n }\n }\n });\n }\n }\n if (tags) {\n filters.push({terms: {tags: tags}});\n }\n if (options.withStock !== false && options.showClosed !== true) {\n filters.push({range: {stock: {gt: 0}}});\n }\n if (options.withPictures) {\n filters.push({range: {picturesCount: {gt: 0}}});\n }\n\n if (options.withOld !== true && options.showOld !== true) {\n var minTime = options.minTime ? options.minTime : mkSettings.getMinAdTime();\n // Round to hour, to be able to use cache\n minTime = Math.floor(minTime / 60 / 60 ) * 60 * 60;\n filters.push({range: {time: {gte: minTime}}});\n }\n if (options.currencies && options.currencies.length) {\n filters.push({terms: {currency: options.currencies}});\n }\n\n var location = options.location && options.location.trim();\n var geoDistance = options.geoDistance || '50km';\n if (options.geoPoint && options.geoPoint.lat && options.geoPoint.lon) {\n\n // match location OR geo distance\n if (location && location.length) {\n var locationCity = location.toLowerCase().split(',')[0];\n filters.push({\n or : [\n // No position defined: search on text\n {\n and: [\n {not: {exists: { field : \"geoPoint\" }}},\n {multi_match: {\n query: locationCity,\n fields : [ \"city^3\", \"location\" ]\n }}\n ]\n },\n // Has position: use spatial filter\n {geo_distance: {\n distance: geoDistance,\n geoPoint: {\n lat: options.geoPoint.lat,\n lon: options.geoPoint.lon\n }\n }}\n ]\n });\n }\n\n else {\n filters.push(\n {geo_distance: {\n distance: geoDistance,\n geoPoint: {\n lat: options.geoPoint.lat,\n lon: options.geoPoint.lon\n }\n }});\n }\n }\n else if (options.geoShape && options.geoShape.geometry) {\n var coordinates = options.geoShape.geometry.coordinates;\n var type = options.geoShape.geometry.type;\n if (location && (type === 'Polygon' || type === 'MultiPolygon') && coordinates && coordinates.length) {\n // One polygon\n if (coordinates.length === 1) {\n filters.push(\n {\n geo_polygon: {\n geoPoint: {\n points: coordinates.length === 1 ? coordinates[0] : coordinates\n }\n }\n });\n }\n // Multi polygon\n else {\n filters.push({\n or: coordinates.reduce(function (res, coords) {\n return res.concat(coords.reduce(function(res, points) {\n return res.concat({geo_polygon: {\n geoPoint: {\n points: points\n }\n }});\n }, []));\n }, [])\n });\n }\n }\n }\n\n // Add query to request\n if (matches.length || filters.length) {\n request.query = {bool: {}};\n if (matches.length) {\n request.query.bool.should = matches;\n // Exclude result with score=0\n request.query.bool.minimum_should_match = 1;\n }\n if (filters.length) {\n request.query.bool.filter = filters;\n }\n }\n\n if (options.sortAttribute) {\n request.sort = request.sort || {};\n request.sort[options.sortAttribute] = options.sortDirection === \"asc\" ? \"asc\" : \"desc\";\n }\n\n return request;\n }\n\n function searchPictures(options) {\n options = options || {};\n\n options._source = options._source || [\"category\", \"title\", \"price\", \"unit\", \"currency\", \"city\", \"pictures\", \"stock\", \"unitbase\", \"description\", \"type\", \"issuer\", \"creationTime\" ];\n options.withPictures = true;\n\n // Create the request, from options\n var request = createSearchRequest(options);\n\n // Run the search\n return search(request)\n .then(function(res) {\n // Filter, to keep only record with pictures\n var hits = (res.hits || []).reduce(function (res, record) {\n if (!record.pictures || !record.pictures.length) return res;\n\n // Replace thumbnail with the first picture (full quality)\n angular.merge(record, record.pictures[0]);\n delete record.pictures;\n delete record.thumbnail;\n\n return res.concat(record);\n }, []);\n\n // Fetch user profile (avatar, name, etc.)\n return esProfile.fillAvatars(hits, 'issuer')\n .then(function() {\n return {\n hits: hits,\n total: res.total\n };\n });\n });\n\n }\n\n function searchMoreLikeThis(id, options) {\n options = options || {};\n\n if (options.cache !== false && caches.likeMoreThis) {\n var cachedRes = caches.likeMoreThis.get(id);\n if (cachedRes) return $q.when(cachedRes);\n }\n\n var now = Date.now();\n var expectedSize = options.size || CONSTANTS.MORE_LIKE_THIS_SIZE;\n var fetchSize = expectedSize * 20;\n var minTime = mkSettings.getMinAdTime();\n var walletPubkey = csWallet.isLogin() ? csWallet.data.pubkey : undefined;\n var oldHits = [];\n data.moreLikeThis.current = id; // Remember, to stop parallel jobs\n\n var request = {\n from: options.from||0,\n size: fetchSize,\n _source: options._source || fields.moreLikeThis,\n query: {\n more_like_this : {\n fields : [\"title\", \"category.name\", \"type\", \"city\"],\n like : [\n {\n \"_index\" : \"market\",\n \"_type\" : \"record\",\n \"_id\" : id\n }\n ],\n \"min_term_freq\" : 1,\n \"max_query_terms\" : 12\n }\n }\n };\n\n if (options.type || options.category || options.city) {\n var doc = {};\n if (options.type) doc.type = options.type;\n if (options.category) doc.category = {id: options.category};\n if (options.city) doc.city = options.city;\n request.query.more_like_this.like.push(\n {\n \"_index\" : \"market\",\n \"_type\" : \"record\",\n \"doc\" : doc\n });\n }\n\n\n var filterAndFetchHits = function(res, size) {\n size = size !== undefined ? size : CONSTANTS.MORE_LIKE_THIS_SIZE;\n if (!size || !res || !res.hits || !res.hits.total) {\n return {\n total: 0,\n hits: []\n };\n }\n\n var hits = res.hits.hits.reduce(function(res, hit, index) {\n if (index >= size) return res; // Skip (already has enough ad)\n\n // Exclude if closed\n if (hit._source.stock === 0) return res;\n\n // Exclude wallet issuer\n if (hit._source.issuer === walletPubkey) return res;\n\n // Exclude if too old\n var time = hit._source.time || hit._source.creationTime;\n if (time < minTime) {\n oldHits.push(hit); // Keep it for later used\n return res;\n }\n\n return res.concat(hit);\n }, []);\n\n var missingSize = size - hits.length;\n var fetchMore = missingSize > 0 &&\n (Date.now() - now < CONSTANTS.MORE_LIKE_THIS_TIMEOUT) && // Timeout reach\n (data.moreLikeThis.current === id) // Do not fetch if current id changed\n ;\n if (fetchMore) {\n console.debug(\"[market] [record] Missing 'more like this' Ads (missing {0}. Fetching more...\".format(missingSize));\n request.from += fetchSize;\n if (request.from < res.hits.total) {\n return raw.postSearch(request)\n .then(function (more) {\n return filterAndFetchHits(more, missingSize);\n })\n .then(function (more) {\n return {\n total: res.hits.total,\n hits: hits.concat(more.hits || [])\n };\n });\n }\n else if (oldHits.length > 0){\n if (oldHits.length > missingSize) {\n oldHits.splice(missingSize);\n }\n hits = hits.concat(oldHits);\n }\n }\n\n return {\n total: res.hits.total,\n hits: hits\n };\n };\n\n return $q.all([\n // load categories\n mkCategory.all(),\n\n // Get current UD\n csCurrency.currentUD()\n .catch(function(err) {\n console.error('Could not get current UD', err);\n return 1;\n }),\n\n // Search request\n raw.postSearch(request)\n .then(filterAndFetchHits)\n ])\n .then(function(res) {\n var categories = res[0];\n var currentUD = res[1];\n res = res[2];\n res.hits = _.map(res.hits, function(hit) {\n var record = readRecordFromHit(hit, categories, currentUD, {convertPrice: true, html: true});\n record.id = hit._id;\n return record;\n });\n return csWot.extendAll(res.hits, 'issuer', true /*skipAddUid*/)\n .then(function(_) {\n // Add to cache\n caches.likeMoreThis = caches.likeMoreThis || csCache.get(cachePrefix, csCache.constants.MEDIUM);\n caches.likeMoreThis.put(id, res);\n\n console.debug(\"[market] [record] {0} 'More like this' fetched, in {1}ms\".format(res.hits.length, Date.now()-now));\n return res;\n });\n });\n }\n\n // Register extension points\n api.registerEvent('record', 'load');\n api.registerEvent('record', 'search');\n\n return {\n category: mkCategory,\n record: {\n createSearchRequest: createSearchRequest,\n search: search,\n load: loadData,\n setStock: setStockToRecord,\n pictures: searchPictures,\n add: raw.add,\n update: raw.update,\n remove: raw.remove,\n moreLikeThis: searchMoreLikeThis,\n fields: {\n commons: fields.commons\n },\n picture: {\n all: esHttp.get('/market/record/:id?_source=pictures')\n },\n comment: esComment.instance('market'),\n like: esLike.instance('market', 'record')\n },\n // api extension\n api: api\n };\n}])\n;\n","angular.module('cesium.market.tx.services', ['cesium.services', 'cesium.es.services',\n 'cesium.market.settings.services', 'cesium.market.record.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('mkTx');\n }\n }])\n\n.factory('mkTx', ['$rootScope', '$q', 'csSettings', 'csPlatform', 'CryptoUtils', 'csConfig', 'esHttp', 'mkRecord', function($rootScope, $q, csSettings, csPlatform, CryptoUtils, csConfig, esHttp, mkRecord) {\n 'ngInject';\n\n var\n listeners,\n constants= {\n COMMENTS_PREFIX: \"GCHANGE\"\n },\n raw = {\n postSearchByCurrency: {\n g1: esHttp.post('/g1/movement/_search')\n },\n };\n\n function getRecordPrefix(record) {\n if (!record || !record.id) throw Error('Invalid record: missing record or record.id');\n return [constants.COMMENTS_PREFIX, record.id].join(':').toUpperCase();\n }\n\n function postSearch(currency, request) {\n var fn = raw.postSearchByCurrency[currency];\n if (!fn) {\n fn = esHttp.post('/'+currency+'/movement/_search');\n raw.postSearchByCurrency[currency] = fn;\n }\n return fn(request);\n }\n\n function fillRecordTx(record, options) {\n options = options || {};\n options.withAvg = angular.isDefined(options.withAvg) ? options.withAvg : false;\n options.withIssuers = angular.isDefined(options.withIssuers) ? options.withIssuers : false;\n\n var now = Date.now();\n console.debug(\"[market] [tx] Loading TX stats of record {{0}}...\".format(record.id));\n\n // Compute prefix, if need\n options.prefix = options.prefix || getRecordPrefix(record);\n\n var request = {\n size: 0,\n query: {\n bool: {\n must: {\n match: {\n comment: options.prefix\n }\n }\n }\n },\n aggs: {\n sum: {\n sum : { field : \"amount\" }\n }\n }\n };\n\n // Add filter on recipient pubkey\n if (record.pubkey) {\n request.query.bool.filter = [{term : {recipient: record.pubkey}}];\n }\n\n if (options.withAvg) {\n request.aggs.avg = {\n avg : { field : \"amount\" }\n };\n }\n if (options.withIssuers) {\n request.aggs.issuers = {\n terms : { field : \"issuer\" }\n };\n }\n\n return postSearch(record.currency, request)\n .then(function (res) {\n var sum = res.aggregations && res.aggregations.sum && res.aggregations.sum.value;\n var pct = record.price > 0 ?\n (sum * 100 / record.price)\n : undefined;\n record.tx = {\n sum: sum,\n pct: pct\n };\n if (options.withAvg) {\n record.tx.avg = res.aggregations && res.aggregations.avg && res.aggregations.avg.value;\n }\n if (options.withIssuers) {\n record.tx.issuers = (res.aggregations && res.aggregations.issuers && res.aggregations.issuers.buckets || [])\n .reduce(function(res, bucket) {\n return res.concat(bucket.key);\n }, []);\n }\n console.debug(\"[market] [tx] TX stats loaded in {1}ms\".format(record.id, Date.now() - now), record.tx);\n\n return record;\n });\n }\n\n function onRecordSearch(records, deferred) {\n deferred = deferred || $q.defer();\n\n var jobs = (records||[]).reduce(function(res, record){\n // Crowdfunding\n if (record.type === 'crowdfunding' && record.pubkey) {\n return res.concat(fillRecordTx(record));\n }\n return res;\n }, []);\n\n if (jobs.length) {\n $q.all(jobs)\n .then(deferred.resolve)\n .catch(deferred.reject);\n }\n else {\n // Nothing to process\n deferred.resolve();\n }\n return deferred.promise;\n }\n\n function onRecordLoad(record, deferred) {\n deferred = deferred || $q.defer();\n\n // Crowdfunding\n if (record.type === 'crowdfunding' && record.pubkey) {\n return fillRecordTx(record, {withAvg: true, withIssuers: true})\n .then(deferred.resolve)\n .catch(deferred.reject);\n }\n\n else {\n // Nothing to process\n deferred.resolve();\n }\n return deferred.promise;\n }\n\n function computeTxUris(options) {\n if (!options || !options.pubkey) return $q.reject('Missing options.pubkey');\n options.currency = options.currency || 'g1';\n\n if (options.currency === 'g1') {\n var uri = 'june://' + options.pubkey;\n var uriParams = [];\n if (options.amount) {\n uriParams.push('amount=' + options.amount / 100);\n }\n if (options.comment) {\n uriParams.push('comment=' + options.comment);\n }\n if (uriParams.length) {\n uri += '?' + uriParams.join('&');\n }\n\n // TODO: add g1.duniter.org\n return $q.when([\n uri,\n 'web+' + uri\n ]);\n }\n\n return $q.when([]);\n\n }\n\n function addListeners() {\n // Extend csWot events\n listeners = [\n mkRecord.api.record.on.search($rootScope, onRecordSearch, this),\n mkRecord.api.record.on.load($rootScope, onRecordLoad, this)\n ];\n }\n\n\n // Default actions\n addListeners();\n\n return {\n record: {\n computePrefix: getRecordPrefix,\n fillTx: fillRecordTx\n },\n uri: {\n compute: computeTxUris\n },\n constants : constants\n };\n}])\n;\n","angular.module('cesium.market.wallet.services', ['cesium.es.services'])\n.config(['PluginServiceProvider', function(PluginServiceProvider) {\n 'ngInject';\n\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('mkWallet');\n\n }])\n\n.factory('mkWallet', ['$rootScope', '$q', '$timeout', 'esHttp', '$state', '$sce', '$sanitize', '$translate', 'UIUtils', 'csSettings', 'csWallet', 'csWot', 'BMA', 'Device', 'csPlatform', 'SocialUtils', 'CryptoUtils', 'esWallet', 'esProfile', 'esSubscription', 'mkRecord', function($rootScope, $q, $timeout, esHttp, $state, $sce, $sanitize, $translate,\n UIUtils, csSettings, csWallet, csWot, BMA, Device, csPlatform,\n SocialUtils, CryptoUtils, esWallet, esProfile, esSubscription, mkRecord) {\n 'ngInject';\n var\n defaultProfile,\n defaultSubscription,\n that = this,\n listeners;\n\n function onWalletReset(data) {\n data.profile = undefined;\n data.name = undefined;\n data.favorites = data.favorites || {};\n data.favorites.count = null;\n defaultProfile = undefined;\n defaultSubscription = undefined;\n }\n\n function onWalletLoginCheck(data, deferred) {\n deferred = deferred || $q.defer();\n if (!data || !data.pubkey || !data.keypair) {\n deferred.resolve();\n return deferred.promise;\n }\n\n // Default user name\n if (data.name) {\n deferred.resolve(data);\n return deferred.promise;\n }\n\n var now = Date.now();\n console.debug(\"[market] [wallet] Checking user profile...\");\n\n // Check if profile exists\n esProfile.get(data.pubkey)\n .then(function(profile) {\n // Profile exists: use it !\n if (profile) {\n data.name = profile.name;\n data.avatar = profile.avatar;\n data.profile = profile.source;\n data.profile.description = profile.description;\n return; // Continue\n }\n\n // Invalid credentials (no user profile found)\n // AND no default profile to create a new one\n if (!defaultProfile) {\n UIUtils.alert.error('MARKET.ERROR.INVALID_LOGIN_CREDENTIALS');\n deferred.reject('RETRY');\n return deferred.promise;\n }\n\n // Save the new user profile\n return registerNewProfile(data);\n })\n\n .then(function() {\n return registerNewSubscription(data);\n })\n .then(function() {\n console.info('[market] [wallet] Checked user profile in {0}ms'.format(Date.now() - now));\n deferred.resolve(data);\n })\n .catch(deferred.reject);\n\n return deferred.promise;\n }\n\n function registerNewProfile(data) {\n if (!defaultProfile) return;\n\n var now = Date.now();\n console.debug(\"[market] [wallet] Saving user profile...\");\n\n // Profile not exists, but it exists a default profile (from the join controller)\n data.profile = data.profile || {};\n\n angular.merge(data.profile, defaultProfile);\n\n return esWallet.box.getKeypair()\n .then(function(keypair) {\n return $q.all([\n $translate('MARKET.PROFILE.DEFAULT_TITLE', {pubkey: data.pubkey}),\n // Encrypt socials\n SocialUtils.pack(angular.copy(data.profile.socials||[]), keypair)\n ]);\n })\n .then(function(res) {\n var title = res[0];\n var encryptedSocials = res[1];\n\n data.name = data.profile.title || title;\n data.profile.title = data.name;\n data.profile.issuer = data.pubkey;\n\n // Add encrypted socials into a profile copy, then save it\n var copiedProfile = angular.copy(data.profile);\n copiedProfile.socials = encryptedSocials;\n\n // Save the profile\n return esProfile.add(copiedProfile);\n })\n .then(function() {\n // clean default profile\n defaultProfile = undefined;\n console.info('[market] [wallet] Saving user profile in {0}ms'.format(Date.now() - now));\n })\n .catch(function(err) {\n // clean default profile\n defaultProfile = undefined;\n console.error('[market] [wallet] Error while saving new profile', err);\n throw err;\n });\n }\n\n function registerNewSubscription(data) {\n if (!defaultSubscription) return;\n\n // Find the ES node pubkey (from its peer document)\n return esHttp.network.peering.self()\n .then(function(res) {\n if (!res || !res.pubkey) return; // no pubkey: exit\n\n var record = angular.merge({\n type: 'email',\n recipient: res.pubkey,\n content: {\n locale: csSettings.data.locale.id,\n frequency: 'daily'\n }\n }, defaultSubscription);\n\n if (record.type === 'email' && !record.content.email) {\n console.warn(\"Missing email attribute (subscription content). Cannot subscribe!\");\n return;\n }\n\n return esSubscription.record.add(record, csWallet);\n })\n .then(function() {\n data.subscriptions = data.subscriptions || {count: 0};\n data.subscriptions.count++;\n defaultSubscription = undefined;\n })\n .catch(function(err) {\n defaultSubscription = undefined;\n console.error('[market] [wallet] Error while saving new subscription', err);\n throw err;\n });\n }\n\n function onWalletFinishLoad(data, deferred) {\n deferred = deferred || $q.defer();\n\n var now = Date.now();\n console.debug('[market] [user] Loading favorites...');\n\n mkRecord.record.like.load({\n issuer: data.pubkey,\n kinds: ['LIKE', 'FOLLOW'],\n size: 0\n })\n .then(function(res) {\n data.favorites = data.favorites || {};\n data.favorites.count = res && res.total || 0;\n })\n .then(function() {\n console.info('[market] [wallet] Loaded favorites ({0}) in {1}ms'.format(data.favorites.count, Date.now() - now));\n deferred.resolve(data);\n })\n .catch(deferred.reject);\n\n return deferred.promise;\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWallet and csWot events\n listeners = [\n csWallet.api.data.on.loginCheck($rootScope, onWalletLoginCheck, this),\n csWallet.api.data.on.finishLoad($rootScope, onWalletFinishLoad, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[market] [user] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n return onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[market] [user] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n onWalletReset(csWallet.data);\n return onWalletLoginCheck(csWallet.data)\n .then(onWalletFinishLoad);\n }\n }\n }\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n that.setDefaultProfile = function(profile) {\n defaultProfile = angular.copy(profile);\n };\n\n that.setDefaultSubscription = function(subscription) {\n defaultSubscription = angular.copy(subscription);\n };\n\n return that;\n}])\n;\n","angular.module('cesium.market.settings.services', ['cesium.services', 'cesium.es.http.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('mkSettings');\n }\n\n }])\n\n.factory('mkSettings', ['$rootScope', '$q', '$timeout', '$ionicHistory', 'Api', 'csHttp', 'esHttp', 'csConfig', 'csSettings', 'esSettings', 'csCurrency', function($rootScope, $q, $timeout, $ionicHistory, Api, csHttp, esHttp,\n csConfig, csSettings, esSettings, csCurrency) {\n 'ngInject';\n\n var\n SETTINGS_SAVE_SPEC = {\n includes: ['geoDistance', 'compactMode', 'maxAdAge'],\n excludes: ['enable', 'homeMessage', 'defaultTags', 'defaultAdminPubkeys', 'record', 'defaultSearch'],\n defaultSearch: {},\n cesiumApi: {}\n },\n defaultSettings = angular.merge({\n plugins: {\n market: {\n enable: true,\n compactMode: false,\n cesiumApi: {\n enable: true,\n baseUrl: \"https://g1.duniter.fr/api\"\n },\n defaultSearch: {\n geoDistance: 50\n },\n maxAdAge: 60 * 60 * 24 * 365 // Max age of a Ad (in seconds) (=1 year)\n },\n converse: {\n jid : \"anonymous.duniter.org\",\n bosh_service_url: \"https://chat.duniter.org/http-bind/\",\n auto_join_rooms : [\n \"gchange@muc.duniter.org\"\n ]\n }\n }\n },\n // Market plugin\n {plugins: {market: csConfig.plugins && csConfig.plugins.market || {}}},\n // Converse plugin\n {plugins: {converse: csConfig.plugins && csConfig.plugins.converse || {}}}\n ),\n that = this,\n readyDeferred = $q.defer(),\n listeners,\n ignoreSettingsChanged = false\n ;\n\n // Define settings to save remotely\n esSettings.setPluginSaveSpecs('market', SETTINGS_SAVE_SPEC);\n\n that.raw = {\n currencies: undefined\n };\n\n that.isEnable = function(data) {\n data = data || csSettings.data;\n return data.plugins && data.plugins.es && data.plugins.es.enable &&\n data.plugins.market && data.plugins.market.enable;\n };\n\n that.currencies = function() {\n if (readyDeferred) {\n return readyDeferred.promise.then(function() {\n return that.raw.currencies;\n });\n }\n return $q.when(that.raw.currencies);\n };\n\n /**\n * Max age of a Ad (in seconds)\n * @returns {number|*}\n */\n that.getMaxAdAge = function() {\n return csSettings.data.plugins.market && csSettings.data.plugins.market.maxAdAge ||\n defaultSettings.plugins.market.maxAdAge;\n };\n\n /**\n * Max age of a Ad (in seconds)\n * @returns {number|*}\n */\n that.getMinAdTime = function() {\n return (Date.now() / 1000) - that.getMaxAdAge();\n };\n\n function _initCurrencies(data, deferred) {\n deferred = deferred || $q.defer();\n if (that.enable) {\n that.raw.currencies = data.plugins.market.currencies;\n if (!that.raw.currencies && data.plugins.market.defaultCurrency) {\n that.raw.currencies = [data.plugins.market.defaultCurrency];\n console.debug('[market] [settings] Currencies: ', that.raw.currencies);\n if (deferred) deferred.resolve(that.raw.currencies);\n }\n else {\n return csCurrency.get()\n .then(function(currency) {\n that.raw.currencies = [currency.name];\n console.debug('[market] [settings] Currencies: ', that.raw.currencies);\n if (deferred) deferred.resolve(that.raw.currencies);\n })\n .catch(function(err) {\n if (deferred) {\n deferred.reject(err);\n }\n else {\n throw err;\n }\n });\n }\n\n }\n else {\n that.raw.currencies = [];\n if (deferred) deferred.resolve(that.raw.currencies);\n }\n return deferred.promise;\n }\n\n function onSettingsReset(data, deferred) {\n deferred = deferred || $q.defer();\n data.plugins = data.plugins || {};\n\n // reset plugin settings, then restore defaults\n data.plugins.market = {};\n angular.merge(data, defaultSettings);\n\n deferred.resolve(data);\n return deferred.promise;\n }\n\n // Listen for settings changed\n function onSettingsChanged(data) {\n\n // Workaround (version < 1.2.6) : fix older settings\n var isVersionPrevious_1_2_6 = csHttp.version.compare(data.version, '1.2.6') <= 0;\n if (isVersionPrevious_1_2_6 && data.plugins && data.plugins.market) {\n console.info('[market] [settings] Detected version previous <= 1.2.6 - Fix older settings...');\n delete data.plugins.es.market;\n var geoDistance = data.plugins.market.geoDistance;\n delete data.plugins.market.geoDistance;\n data.plugins.market.defaultSearch = data.plugins.market.defaultSearch || {};\n data.plugins.market.defaultSearch.geoDistance = data.plugins.market.defaultSearch.geoDistance || geoDistance;\n data.plugins.market.maxAdAge = defaultSettings.plugins.market.maxAdAge;\n }\n\n data.plugins.es.document = data.plugins.es.document || {};\n data.plugins.es.document.index = 'user,page,group,market';\n data.plugins.es.document.type = 'profile,record,comment';\n\n // Init currencies\n _initCurrencies(data);\n\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Listening some events\n listeners = [\n csSettings.api.data.on.reset($rootScope, onSettingsReset, this),\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this)\n ];\n }\n\n that.ready = function() {\n if (!readyDeferred) return $q.when();\n return readyDeferred.promise;\n };\n\n esSettings.api.state.on.changed($rootScope, function(enable) {\n enable = enable && that.isEnable();\n if (enable === that.enable) return; // nothing changed\n\n that.enable = enable;\n if (enable) {\n console.debug('[market] [settings] Enable');\n addListeners();\n }\n else {\n console.debug('[market] [settings] Disable');\n removeListeners();\n }\n // Init currencies\n onSettingsChanged(csSettings.data);\n if (readyDeferred) {\n readyDeferred.resolve();\n readyDeferred = null;\n }\n });\n\n return that;\n}]);\n","angular.module('cesium.market.converse.services', ['cesium.es.services'])\n.config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.market;\n if (enable) {\n // Will force to load this service\n PluginServiceProvider.registerEagerLoadingService('mkConverse');\n }\n\n }])\n\n.factory('mkConverse', ['$rootScope', '$q', '$timeout', '$translate', 'esHttp', 'UIUtils', 'csConfig', 'csWallet', 'Device', 'csSettings', function($rootScope, $q, $timeout, $translate, esHttp, UIUtils, csConfig, csWallet, Device, csSettings) {\n 'ngInject';\n var\n defaultProfile,\n that = this,\n listeners,\n initialized = false;\n\n function onWalletReset(data) {\n data.xmpp = null;\n defaultProfile = undefined;\n }\n\n function textToNickname(text) {\n return text ? String(text).replace(/[^a-zA-Z0-9]+/gm, '') : '';\n }\n\n function onWalletLogin(data, deferred) {\n\n if (!data.name) {\n\n // Wait for profile load\n $timeout(function() {\n return onWalletLogin(data); // recursive loop\n }, 1000);\n }\n else {\n\n if (!initialized) {\n initialized = true;\n\n var isEnable = csConfig.plugins && csConfig.plugins.converse && csConfig.plugins.converse.enable;\n if (!isEnable) {\n console.debug(\"[market] [converse] Disabled by config (property 'plugins.converse.enable')\");\n initialized = true;\n }\n else if (UIUtils.screen.isSmall()) {\n console.debug(\"[market] [converse] Disabled on small screen\");\n initialized = true;\n }\n else {\n\n var nickname = data.name ? textToNickname(data.name) : data.pubkey.substring(0, 8);\n var now = new Date().getTime();\n console.debug(\"[market] [converse] Starting Chatroom with username {\" + nickname + \"}...\");\n\n // Register plugin\n converse.plugins.add('gchange-plugin', {\n\n initialize: function () {\n var _converse = this._converse;\n\n $q.all([\n _converse.api.waitUntil('chatBoxesFetched'),\n _converse.api.waitUntil('roomsPanelRendered')\n ]).then(function () {\n console.debug(\"[market] [converse] Chatroom started in \" + (new Date().getTime() - now) + \"ms\");\n });\n }\n });\n\n var options = angular.merge({\n \"allow_muc_invitations\": false,\n \"auto_login\": true,\n \"allow_logout\": true,\n \"authentication\": \"anonymous\",\n \"jid\": \"anonymous.duniter.org\",\n \"auto_away\": 300,\n \"auto_join_on_invite\": true,\n \"auto_reconnect\": true,\n \"minimized\": true,\n \"auto_join_rooms\": [\n \"gchange@muc.duniter.org\"\n ],\n \"blacklisted_plugins\": [\n \"converse-mam\",\n \"converse-otr\",\n \"converse-register\",\n \"converse-vcard\"\n ],\n \"whitelisted_plugins\": [\n \"gchange-plugin\"\n ],\n \"bosh_service_url\": \"https://chat.duniter.org/http-bind/\",\n \"allow_registration\": false,\n \"show_send_button\": false,\n \"muc_show_join_leave\": false,\n \"notification_icon\": \"img/logo.png\",\n \"i18n\": $translate.use()\n }, csSettings.data.plugins && csSettings.data.plugins.converse || {});\n\n options.auto_join_rooms = _.map(options.auto_join_rooms || [], function (room) {\n if (typeof room === \"string\") {\n return {\n jid: room,\n nick: nickname\n };\n }\n room.nick = nickname;\n // Minimized by default\n room.minimized = true;\n return room;\n });\n\n // Run initialization\n converse.initialize(options)\n .catch(console.error);\n }\n }\n\n // Already init\n else {\n // TODO:: close previous dialog and reconnect with the username\n }\n\n }\n\n return deferred ? deferred.resolve() && deferred.promise : $q.when();\n }\n\n function removeListeners() {\n _.forEach(listeners, function(remove){\n remove();\n });\n listeners = [];\n }\n\n function addListeners() {\n // Extend csWallet events\n listeners = [\n csWallet.api.data.on.login($rootScope, onWalletLogin, this),\n csWallet.api.data.on.init($rootScope, onWalletReset, this),\n csWallet.api.data.on.reset($rootScope, onWalletReset, this)\n ];\n }\n\n function refreshState() {\n var enable = esHttp.alive;\n if (!enable && listeners && listeners.length > 0) {\n console.debug(\"[market] [converse] Disable\");\n removeListeners();\n if (csWallet.isLogin()) {\n return onWalletReset(csWallet.data);\n }\n }\n else if (enable && (!listeners || listeners.length === 0)) {\n console.debug(\"[market] [converse] Enable\");\n addListeners();\n if (csWallet.isLogin()) {\n return onWalletLogin(csWallet.data);\n }\n }\n }\n\n // Default actions\n Device.ready().then(function() {\n esHttp.api.node.on.start($rootScope, refreshState, this);\n esHttp.api.node.on.stop($rootScope, refreshState, this);\n return refreshState();\n });\n\n that.setDefaultProfile = function(profile) {\n defaultProfile = angular.copy(profile);\n };\n\n return that;\n}])\n;\n","\nangular.module('cesium.market.join.controllers', ['cesium.services', 'cesium.market.services'])\n\n.controller('MkJoinModalCtrl', ['$scope', '$timeout', '$state', 'UIUtils', 'CryptoUtils', 'csSettings', 'csWallet', 'csCurrency', 'mkWallet', 'mkModals', function ($scope, $timeout, $state, UIUtils, CryptoUtils, csSettings, csWallet, csCurrency, mkWallet, mkModals) {\n'ngInject';\n\n var EMAIL_REGEX = '^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$';\n $scope.emailPattern = EMAIL_REGEX;\n\n $scope.formData = {\n pseudo: '',\n description: undefined,\n email: undefined\n };\n $scope.slides = {\n slider: null,\n options: {\n loop: false,\n effect: 'slide',\n speed: 500\n }\n };\n $scope.isLastSlide = false;\n $scope.showUsername = false;\n $scope.showPassword = false;\n $scope.smallscreen = UIUtils.screen.isSmall();\n\n $scope.enter = function() {\n csCurrency.get().then(function(currency) {\n $scope.currency = currency;\n });\n };\n $scope.$on('modal.shown', $scope.enter);\n\n $scope.slidePrev = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slidePrev();\n $scope.slides.slider.lockSwipes();\n $scope.isLastSlide = false;\n };\n\n $scope.slideNext = function() {\n $scope.slides.slider.unlockSwipes();\n $scope.slides.slider.slideNext();\n $scope.slides.slider.lockSwipes();\n $scope.isLastSlide = $scope.slides.slider.activeIndex === ($scope.slides.slider.slides.length-1);\n };\n\n\n $scope.showAccountPubkey = function() {\n if ($scope.formData.pubkey) return; // not changed\n\n $scope.formData.computing=true;\n CryptoUtils.scryptKeypair($scope.formData.username, $scope.formData.password)\n .then(function(keypair) {\n $scope.formData.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n $scope.formData.computing=false;\n })\n .catch(function(err) {\n $scope.formData.computing=false;\n console.error('>>>>>>>' , err);\n UIUtils.alert.error('ERROR.CRYPTO_UNKNOWN_ERROR');\n });\n };\n\n $scope.formDataChanged = function() {\n $scope.formData.computing=false;\n $scope.formData.pubkey=null;\n };\n\n $scope.doNext = function(formName) {\n if (!formName) {\n switch($scope.slides.slider.activeIndex) {\n case 0:\n formName = 'saltForm';\n break;\n case 1:\n formName = 'passwordForm';\n break;\n case 2:\n formName = 'profileForm';\n break;\n }\n }\n if (formName) {\n $scope[formName].$submitted=true;\n if(!$scope[formName].$valid) {\n return;\n }\n if (formName === 'passwordForm' || formName === 'pseudoForm') {\n $scope.slideNext();\n $scope.showAccountPubkey();\n }\n else {\n $scope.slideNext();\n }\n }\n };\n\n $scope.doNewAccount = function(confirm) {\n\n if (!confirm) {\n return UIUtils.alert.confirm('MARKET.JOIN.CONFIRMATION_WALLET_ACCOUNT')\n .then(function(confirm) {\n if (confirm) {\n $scope.doNewAccount(true);\n }\n });\n }\n\n UIUtils.loading.show();\n\n // Fill a default profile\n mkWallet.setDefaultProfile({\n title: $scope.formData.title,\n description: $scope.formData.description\n });\n\n // Fill the default subscription\n if ($scope.formData.email) {\n mkWallet.setDefaultSubscription({\n type: 'email',\n //recipient: '', TODO: allow to select a email provider\n content: {\n email: $scope.formData.email\n }\n });\n }\n\n // do not alert use if wallet is empty\n csSettings.data.wallet = csSettings.data.wallet || {};\n csSettings.data.wallet.alertIfUnusedWallet = false;\n\n // Apply login (will call profile creation)\n return csWallet.login($scope.formData.username, $scope.formData.password)\n .catch(UIUtils.onError('ERROR.CRYPTO_UNKNOWN_ERROR'))\n // Close the join current\n .then($scope.closeModal)\n // Redirect to wallet\n .then(function() {\n return $state.go('app.view_wallet');\n });\n };\n\n $scope.showHelpModal = function(helpAnchor) {\n if (!helpAnchor) {\n helpAnchor = $scope.slides.slider.activeIndex == 1 ?\n 'join-salt' : ( $scope.slides.slider.activeIndex == 2 ?\n 'join-password' : undefined);\n }\n return mkModals.showHelp({anchor: helpAnchor});\n };\n\n // DEV only: remove auto add account when done\n /*$timeout(function() {\n $scope.formData.username=\"azertypoi\";\n $scope.formData.confirmUsername=$scope.formData.username;\n $scope.formData.password=\"azertypoi\";\n $scope.formData.confirmPassword=$scope.formData.password;\n $scope.formData.pseudo=\"azertypoi\";\n $scope.doNext();\n $scope.doNext();\n //$scope.form = {$valid:true};\n }, 1000);\n */\n}]);\n","\nangular.module('cesium.graph.plugin', [\n // Services\n 'cesium.graph.services',\n // Controllers\n 'cesium.graph.common.controllers',\n 'cesium.graph.docstats.controllers',\n 'cesium.graph.synchro.controllers',\n 'cesium.graph.network.controllers'\n ])\n;\n","\nangular.module('cesium.graph.services', [\n // Services\n 'cesium.graph.color.services',\n 'cesium.graph.data.services'\n ])\n;\n","angular.module('cesium.graph.data.services', ['cesium.es.http.services'])\n\n .factory('gpData', ['$rootScope', '$q', '$timeout', 'esHttp', function($rootScope, $q, $timeout, esHttp) {\n 'ngInject';\n\n var\n exports = {\n node: {},\n wot: {},\n blockchain: {},\n docstat: {},\n synchro: {\n execution: {}\n },\n raw: {\n block: {\n search: esHttp.post('/:currency/block/_search')\n },\n blockstat: {\n search: esHttp.post('/:currency/blockstat/_search')\n },\n movement: {\n search: esHttp.post('/:currency/movement/_search')\n },\n user: {\n event: esHttp.post('/user/event/_search?pretty')\n },\n docstat: {\n search: esHttp.post('/document/stats/_search')\n },\n synchro: {\n search: esHttp.post('/:currency/synchro/_search')\n }\n },\n regex: {\n }\n };\n\n function _powBase(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n }\n\n function _initRangeOptions(options) {\n options = options || {};\n options.maxRangeSize = options.maxRangeSize || 30;\n options.defaultTotalRangeCount = options.defaultTotalRangeCount || options.maxRangeSize*2;\n\n options.rangeDuration = options.rangeDuration || 'day';\n options.endTime = options.endTime || moment().utc().add(1, options.rangeDuration).unix();\n options.startTime = options.startTime ||\n moment.unix(options.endTime).utc().subtract(options.defaultTotalRangeCount, options.rangeDuration).unix();\n // Make to sure startTime is never before the currency starts - fix #483\n if (options.firstBlockTime && options.startTime < options.firstBlockTime) {\n options.startTime = options.firstBlockTime;\n }\n return options;\n }\n\n\n /**\n * Graph: \"statictics on ES documents\"\n * @param currency\n * @returns {*}\n */\n exports.docstat.get = function(options) {\n\n options = _initRangeOptions(options);\n\n var jobs = [];\n\n var from = moment.unix(options.startTime).utc().startOf(options.rangeDuration);\n var to = moment.unix(options.endTime).utc().startOf(options.rangeDuration);\n var ranges = [];\n\n var processSearchResult = function (res) {\n var aggs = res.aggregations;\n return (aggs.range && aggs.range.buckets || []).reduce(function (res, agg) {\n var item = {\n from: agg.from,\n to: agg.to\n };\n _.forEach(agg.index && agg.index.buckets || [], function (agg) {\n var index = agg.key;\n _.forEach(agg.type && agg.type.buckets || [], function (agg) {\n var key = (index + '_' + agg.key);\n item[key] = agg.max.value;\n if (!indices[key]) indices[key] = true;\n });\n });\n return res.concat(item);\n }, []);\n };\n\n while(from.isBefore(to)) {\n\n ranges.push({\n from: from.unix(),\n to: from.add(1, options.rangeDuration).unix()\n });\n\n // Flush if max range count, or just before loop condition end (fix #483)\n var flush = (ranges.length === options.maxRangeSize) || !from.isBefore(to);\n if (flush) {\n var request = {\n size: 0,\n aggs: {\n range: {\n range: {\n field: \"time\",\n ranges: ranges\n },\n aggs: {\n index : {\n terms: {\n field: \"index\",\n size: 0\n },\n aggs: {\n type: {\n terms: {\n field: \"type\",\n size: 0\n },\n aggs: {\n max: {\n max: {\n field : \"count\"\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n };\n\n // prepare next loop\n ranges = [];\n var indices = {};\n var params = {\n request_cache: angular.isDefined(options.cache) ? options.cache : true // enable by default\n };\n\n if (jobs.length === 10) {\n console.error('Too many parallel jobs!');\n from = moment.unix(options.endTime).utc(); // stop while\n }\n else {\n jobs.push(\n exports.raw.docstat.search(request, params)\n .then(processSearchResult)\n );\n }\n }\n } // loop\n\n return $q.all(jobs)\n .then(function(res) {\n res = res.reduce(function(res, hits){\n if (!hits || !hits.length) return res;\n return res.concat(hits);\n }, []);\n\n res = _.sortBy(res, 'from');\n\n return _.keys(indices).reduce(function(series, index) {\n series[index] = _.pluck(res, index);\n return series;\n }, {\n times: _.pluck(res, 'from')\n });\n });\n };\n\n\n /**\n * Graph: \"statictics on ES documents\"\n * @param currency\n * @returns {*}\n */\n exports.synchro.execution.get = function(options) {\n\n options = _initRangeOptions(options);\n\n var jobs = [];\n\n var from = moment.unix(options.startTime).utc().startOf(options.rangeDuration);\n var to = moment.unix(options.endTime).utc().startOf(options.rangeDuration);\n var ranges = [];\n var processSearchResult = function (res) {\n var aggs = res.aggregations;\n\n return (aggs.range && aggs.range.buckets || []).reduce(function (res, agg) {\n var item = {\n from: agg.from,\n to: agg.to,\n inserts: agg.result.inserts.value,\n updates: agg.result.inserts.value,\n deletes: agg.result.deletes.value,\n duration: agg.duration.value\n };\n _.forEach(agg.api && agg.api.buckets || [], function (api) {\n item[api.key] = api.peer_count && api.peer_count.value || 0;\n if (!apis[api.key]) apis[api.key] = true;\n });\n\n return res.concat(item);\n }, []);\n };\n\n while(from.isBefore(to)) {\n\n ranges.push({\n from: from.unix(),\n to: from.add(1, options.rangeDuration).unix()\n });\n\n // Flush if max range count, or just before loop condition end (fix #483)\n var flush = (ranges.length === options.maxRangeSize) || !from.isBefore(to);\n if (flush) {\n var request = {\n size: 0,\n aggs: {\n range: {\n range: {\n field: \"time\",\n ranges: ranges\n },\n aggs: {\n api: {\n terms: {\n field: \"api\",\n size: 0\n },\n aggs: {\n peer_count: {\n cardinality: {\n field: \"peer\"\n }\n }\n }\n },\n duration: {\n sum: {\n field: \"executionTime\"\n }\n },\n result: {\n nested: {\n path: \"result\"\n },\n aggs: {\n inserts : {\n sum: {\n field : \"result.inserts\"\n }\n },\n updates : {\n sum: {\n field : \"result.updates\"\n }\n },\n deletes : {\n sum: {\n field : \"result.deletes\"\n }\n }\n }\n }\n }\n }\n }\n\n };\n\n // prepare next loop\n ranges = [];\n var apis = {};\n\n if (jobs.length === 10) {\n console.error('Too many parallel jobs!');\n from = moment.unix(options.endTime).utc(); // stop while\n }\n else {\n jobs.push(\n exports.raw.synchro.search(request, {currency: options.currency})\n .then(processSearchResult)\n );\n }\n }\n } // loop\n\n return $q.all(jobs)\n .then(function(res) {\n res = res.reduce(function(res, hits){\n if (!hits || !hits.length) return res;\n return res.concat(hits);\n }, []);\n\n res = _.sortBy(res, 'from');\n\n var series = {\n times: _.pluck(res, 'from'),\n inserts: _.pluck(res, 'inserts'),\n updates: _.pluck(res, 'updates'),\n deletes: _.pluck(res, 'deletes'),\n duration: _.pluck(res, 'duration')\n };\n\n _.keys(apis).forEach(function(api) {\n series[api] = _.pluck(res, api);\n });\n\n return series;\n });\n };\n\n return exports;\n }])\n\n\n\n;\n","angular.module('cesium.graph.color.services', [])\n\n .factory('gpColor', function() {\n 'ngInject';\n\n var\n constants = {\n css2Rgb: {\n 'white': [255, 255, 255],\n 'assertive': [239, 71, 58], // ok\n 'calm': [17, 193, 243], // ok\n 'positive': [56, 126, 245], // ok\n 'balanced': [51, 205, 95], // ok\n 'energized': [255, 201, 0], // ok\n 'royal': [136, 106, 234], // ok\n 'gray': [150, 150, 150], // ok\n 'stable': [248, 248, 248] // ok\n }\n },\n exports = {\n scale: {}\n };\n\n\n /**\n * Compute colors scale\n * @param count\n * @param opacity\n * @param startColor\n * @param startState\n * @returns {Array}\n */\n exports.scale.custom = function (count, opacity, startColor, startState) {\n\n function _state2side(state) {\n switch (state) {\n case 0:\n return 0;\n case 1:\n return -1;\n case 2:\n return 0;\n case 3:\n return 1;\n }\n }\n\n // From [0,1]\n opacity = opacity>0 && opacity|| 0.55;\n\n var defaultStateSize = Math.round(count / 2.5/*=4 states max*/);\n\n // Start color [r,v,b]\n var color = startColor && startColor.length == 3 ? angular.copy(startColor) : [255, 0, 0]; // Red\n\n // Colors state: 0=keep, 1=decrease, 2=keep, 3=increase\n var states = startState && startState.length == 3 ? angular.copy(startState) : [0, 2, 3]; // R=keep, V=keep, B=increase\n\n var steps = startColor ? [\n Math.round(255 / defaultStateSize),\n Math.round(255 / defaultStateSize),\n Math.round(255 / defaultStateSize)\n ] : [\n Math.round((color[0] - 50) / defaultStateSize),\n Math.round((255 - color[1]) / defaultStateSize),\n Math.round((255 - color[2]) / defaultStateSize)\n ];\n\n\n // Compute start sides (1=increase, 0=flat, -1=decrease)\n var sides = [\n _state2side(states[0]),\n _state2side(states[1]),\n _state2side(states[2])];\n\n // Use to detect when need to change a 'flat' state (when state = 0 or 2)\n var stateCounters = [0, 0, 0];\n\n var result = [];\n for (var i = 0; i < count; i++) {\n for (var j = 0; j < 3; j++) {\n color[j] += sides[j] * steps[j];\n stateCounters[j]++;\n // color has reach a limit\n if (((color[j] <= 0 || color[j] >= 255) && sides[j] !== 0) ||\n (sides[j] === 0 && stateCounters[j] == defaultStateSize)) {\n // Max sure not overflow limit\n if (color[j] <= 0) {\n color[j] = 0;\n }\n else if (color[j] >= 255) {\n color[j] = 255;\n }\n // Go to the next state, in [0..3]\n states[j] = (states[j] + 1) % 4;\n\n // Update side from this new state\n sides[j] = _state2side(states[j]);\n\n // Reset state counter\n stateCounters[j] = 0;\n }\n }\n\n // Add the color to result\n result.push('rgba(' + color[0] + ',' + color[1] + ',' + color[2] + ',' + opacity + ')');\n\n }\n return result;\n };\n\n exports.scale.default = function () {\n return exports.scale.custom(25);\n };\n\n /**\n * Create a array with the given color\n **/\n exports.scale.fix = function (length, color) {\n return Array.apply(null, Array(length||25))\n .map(String.prototype.valueOf, color||exports.rgba.calm(0.5));\n };\n\n // Create a function to generate a rgba string, from\n exports.rgba = _.mapObject(constants.css2Rgb, function(rgbArray){\n var prefix = 'rgba(' + rgbArray.join(',') + ',';\n return function(opacity){\n if (!opacity || opacity < 0) {\n return 'rgb(' + rgbArray.join(',') + ')';\n }\n return prefix + opacity + ')';\n };\n });\n\n exports.rgba.translucent = function() {\n return 'rgb(0,0,0,0)';\n };\n\n exports.constants = constants;\n\n return exports;\n })\n\n;\n","\nangular.module('cesium.map.plugin', [\n 'ui-leaflet',\n // Services\n 'cesium.map.services',\n // Controllers\n 'cesium.map.shape.controllers',\n 'cesium.map.home.controllers',\n 'cesium.map.user.controllers'\n])\n\n// Configure plugin\n.config(function() {\n 'ngInject';\n\n // Define icon prefix for AwesomeMarker (a Leaflet plugin)\n L.AwesomeMarkers.Icon.prototype.options.prefix = 'ion';\n});\n\n\n","\nangular.module('cesium.map.services', [\n // Services\n 'cesium.map.utils.services',\n 'cesium.map.shape.services'\n ])\n;\n","\nangular.module('cesium.map.utils.services', ['cesium.services', 'ui-leaflet'])\n\n.factory('MapUtils', ['$timeout', '$q', '$translate', 'leafletData', 'csConfig', 'csSettings', 'esGeo', 'UIUtils', 'leafletHelpers', function($timeout, $q, $translate, leafletData, csConfig, csSettings, esGeo, UIUtils, leafletHelpers) {\n 'ngInject';\n\n\n var\n googleApiKey = csConfig.plugins && csConfig.plugins.es && csConfig.plugins.es.googleApiKey;\n constants = {\n locations: {\n FRANCE: {\n lat: 46.5588603, lng: 4.229736328124999, zoom: 6\n }\n },\n LOCALIZE_ZOOM: 14\n };\n constants.DEFAULT_CENTER = csSettings.data && csSettings.data.plugins && csSettings.data.plugins.map && csSettings.data.plugins.map.center || constants.locations.FRANCE;\n\n function initMap(options){\n options = angular.merge({\n center: angular.copy(constants.DEFAULT_CENTER),\n defaults: {\n scrollWheelZoom: true\n },\n layers: {\n baselayers: {\n osm: {\n name: 'OpenStreetMap',\n type: 'xyz',\n url: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n layerOptions: {\n subdomains: [\"a\", \"b\", \"c\"],\n attribution: \"&copy; <a href=\\\"http://www.openstreetmap.org/copyright\\\">OpenStreetMap</a>\",\n continuousWorld: true\n }\n },\n cycle: {\n name: \"Google map\",\n type: \"xyz\",\n url: 'http://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}&key='+googleApiKey,\n layerOptions: {\n subdomains: ['mt0','mt1','mt2','mt3'],\n attribution: \"&copy; <a href=\\\"http://google.com/copyright\\\">Google</a>\",\n continuousWorld: true\n }\n }\n }\n },\n controls: {\n custom: []\n }\n }, options || {});\n\n // Translate overlays name, if any\n var overlaysNames;\n if (options.layers.overlays) {\n overlaysNames = _.keys(options.layers.overlays).reduce(function (res, key) {\n return res.concat(options.layers.overlays[key].name);\n }, []);\n\n $translate(overlaysNames).then(function (translations) {\n // Translate overlay names\n _.keys(options.layers.overlays || {}).forEach(function (key) {\n options.layers.overlays[key].name = translations[options.layers.overlays[key].name];\n });\n });\n }\n\n return options;\n }\n\n function updateMapCenter(map, center) {\n if (isSameCenter(center, map)) return $q.when();\n\n return $timeout(function () {\n map.invalidateSize();\n map._resetView(center, center.zoom, true);\n }, 300);\n }\n\n function getCenter(options) {\n if (!options) return;\n var center;\n if (options.lat) {\n center = {};\n center.lat = parseFloat(options.lat);\n }\n if (options.lng || options.lon) {\n center = center || {};\n center.lng = parseFloat(options.lng || options.lon);\n }\n if (options.zoom) {\n center = center || {};\n center.zoom = parseFloat(options.zoom);\n }\n if (!center) return;\n\n // If missing some properties, complete with defaults\n if (!leafletHelpers.isValidCenter(center)) {\n center = angular.merge({}, constants.DEFAULT_CENTER, center);\n }\n return center;\n }\n\n function isSameCenter(center, map) {\n return leafletHelpers.isSameCenterOnMap(center, map);\n }\n\n function isDefaultCenter(centerModel) {\n var mapCenter = constants.DEFAULT_CENTER;\n if (centerModel.lat && centerModel.lng && mapCenter.lat.toFixed(4) === centerModel.lat.toFixed(4) && mapCenter.lng.toFixed(4) === centerModel.lng.toFixed(4) && mapCenter.zoom === centerModel.zoom) {\n return true;\n }\n return false;\n }\n\n // Create a default serach control, with default options\n function initSearchControl(options) {\n\n options = options || {};\n options.initial = angular.isDefined(options.initial) ? options.initial : false;\n options.marker = angular.isDefined(options.marker) ? options.marker : false;\n options.propertyName = angular.isDefined(options.propertyName) ? options.propertyName : 'title';\n options.position = angular.isDefined(options.position) ? options.position : 'topleft';\n options.zoom = angular.isDefined(options.zoom) ? options.zoom : constants.LOCALIZE_ZOOM;\n options.markerLocation = angular.isDefined(options.markerLocation) ? options.markerLocation : true;\n\n var translatePromise = $translate(['MAP.COMMON.SEARCH_DOTS', 'COMMON.SEARCH_NO_RESULT']);\n\n return {\n // Simulate an addTo function, but wait for end of translations job\n addTo: function (map) {\n translatePromise.then(function (translations) {\n L.control.search(angular.merge(options, {\n textPlaceholder: translations['MAP.COMMON.SEARCH_DOTS'],\n textErr: translations['COMMON.SEARCH_NO_RESULT']\n })).addTo(map);\n });\n }\n };\n }\n\n function initLocalizeMeControl() {\n return L.easyButton('icon ion-android-locate', function(btn, map){\n return esGeo.point.current()\n .then(function(res) {\n map.invalidateSize();\n map._resetView({\n lat: res.lat,\n lng: res.lon\n }, constants.LOCALIZE_ZOOM, true);\n })\n .catch(UIUtils.onError('MAP.ERROR.LOCALIZE_ME_FAILED'));\n });\n }\n\n return {\n map: initMap,\n center: {\n get: getCenter,\n isSame: isSameCenter,\n isDefault: isDefaultCenter\n },\n updateCenter: updateMapCenter,\n control: {\n search: initSearchControl,\n localizeMe: initLocalizeMeControl\n },\n constants: constants\n };\n\n}]);\n","// var d3;\n\nangular.module('cesium.map.shape.services', ['cesium.services', 'cesium.map.utils.services', 'cesium.graph.color.services'])\n\n /**\n * Shape service\n */\n .factory('esShape', ['$rootScope', '$q', 'csPlatform', 'csCache', 'esHttp', 'gpColor', function($rootScope, $q, csPlatform, csCache, esHttp, gpColor) {\n 'ngInject';\n\n var defaultSearchLimit = 100;\n\n var\n cachePrefix = 'esShape-',\n caches = {\n shapesById: null // Lazy init\n },\n fields = {\n commons: ['type', 'geometry', 'properties']\n },\n\n d3Projection = d3.geoMercator,\n constants = {\n attributes: {\n geoViewBox: 'gchange:geoViewBox',\n geoScale: 'gchange:geoScale',\n geoTranslate: 'gchange:geoTranslate',\n viewBox: 'viewBox'\n },\n style: {\n defaults: {\n fill: '#1a237e', //\n stroke: 'lightgrey'\n },\n active: {\n fill: gpColor.rgba.balanced(),\n },\n },\n projection: {\n // Min precision, in degres\n degreePrecision: 0.00001\n },\n // Warn: should be ordered, from let to right\n positions: [\n 'topleft',\n 'bottomleft',\n 'main',\n 'topright',\n 'bottomright'\n ]\n },\n raw = {\n postSearch: esHttp.post('/shape/record/_search'),\n get: esHttp.get('/shape/record/:id'),\n getCommons: esHttp.get('/shape/record/:id?_source=' + fields.commons.join(',')),\n add: esHttp.record.post('/shape/record'),\n update: esHttp.record.post('/shape/record/:id/_update'),\n remove: esHttp.record.remove('shape', 'record')\n },\n regexp = {\n error: {\n SELF_INTERSECTION: new RegExp(\"Self-intersection at or near point \\\\(([0-9.-]+), ([0-9.-]+),\"),\n HOLE_LIES_OUTSIDE: new RegExp(\"Hole lies outside shell at or near point \\\\(([0-9.-]+), ([0-9.-]+),\"),\n HOLE_NOT_WITHIN_POLYGON: new RegExp(\"Hole is not within polygon\")\n }\n };\n\n\n\n function readFromHit(hit) {\n var record = hit._source;\n record.id = hit._id;\n\n return record;\n }\n\n function searchShapes(options) {\n if (!options) throw new Error(\"Missing 'options' argument\");\n\n console.debug(\"[map] [shape] Loading shape from options: \", options);\n\n var matches = [];\n var filters = [];\n\n // Add filter\n if (options.country) {\n\n filters.push({\n nested: {\n path: \"properties\",\n query: {\n bool: {\n filter: {\n term: {\"properties.country\": options.country}\n }\n }\n }\n }\n });\n }\n\n // Create the request\n var request = {};\n if (matches.length) {\n request.query = {bool: {}};\n request.query.bool.should = matches;\n request.query.bool.minimum_should_match = 1;\n }\n if (filters.length) {\n request.query = request.query || {bool: {}};\n request.query.bool.filter = filters;\n }\n request.from = request.from || 0;\n request.size = request.size || defaultSearchLimit;\n if (request.size < defaultSearchLimit) request.size = defaultSearchLimit;\n request._source = request._source || fields.commons;\n\n return raw.postSearch(request)\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) return undefined;\n\n // Read hits\n var features = (res.hits.hits || []).map(readFromHit);\n\n return {\n type: 'FeatureCollection',\n features: features\n };\n });\n }\n\n function getAllShapeIds(options) {\n var filters = [];\n\n // Add country filter\n if (options && options.country) {\n\n filters.push({\n nested: {\n path: \"properties\",\n query: {\n bool: {\n filter: {\n term: {\"properties.country\": options.country}\n }\n }\n }\n }\n });\n }\n\n // Create the request\n var request = {\n size: 1000,\n _source: 'properties.id'\n };\n if (filters.length) {\n request.query = request.query || {bool: {}};\n request.query.bool.filter = filters;\n }\n\n return raw.postSearch(request)\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) return [];\n\n return _.pluck(res.hits.hits, '_id');\n });\n }\n\n function getAllCountries() {\n return raw.postSearch({\n size: 0,\n aggs: {\n countries: {\n nested: {\n path: \"properties\"\n },\n aggs: {\n names: {\n terms: {\n field: \"properties.country\",\n size: 0\n }\n }\n }\n }\n }\n })\n .then(function(res) {\n if (!res || !res.hits || !res.hits.total) return [];\n\n return res.aggregations.countries.names.buckets.reduce(function(res, bucket){\n return res.concat({\n id: bucket.key,\n docCount: bucket.doc_count\n });\n }, []);\n });\n }\n\n function saveShape(geoJson, options) {\n options = options || {};\n if (!geoJson) throw new Error(\"Missing 'geoJson' argument\");\n\n // Make sure the 'right hand rule' is respected\n if (!options || options.strictMode !== false) {\n geoJson = toStrictGeoJson(geoJson, false);\n }\n\n // Remove hole\n if (!options || options.removeHole !== false) {\n geoJson = removeGeoJsonHoles(geoJson);\n }\n\n var country = options.country || geoJson.properties && geoJson.properties.country;\n if (!country) throw new Error(\"Missing 'options.country' argument\");\n country = country.toLowerCase();\n\n var progressFn = typeof options.updateProgression === 'function' ? options.updateProgression : null;\n\n var now = Date.now();\n console.debug('[shape-service] Saving shape {country: {0}}...'.format(country));\n\n var errors = [];\n var existingIds;\n var idsToRemove;\n var featureCount = geoJson.features.length;\n\n // Get existing ids\n return $q.all([\n getAllShapeIds(), // All ids\n getAllShapeIds({country: country}) // Country ids\n ])\n .then(function(ids) {\n existingIds = ids[0];\n idsToRemove = ids[1];\n\n return geoJson.features.reduce(function(promise, feature, index) {\n\n // Normalize features properties\n feature.properties = feature.properties || {};\n feature.properties.country = country;\n\n var id = feature.properties.id;\n var isNew = angular.isUndefined(id) ||\n // if id already somewhere, force isNew = true (will compute another id)\n !existingIds.includes(id) ||\n !id.toLowerCase().startsWith(country);\n\n var executeFn;\n if (isNew) {\n // Generate new id\n for(var i = index; !feature.properties.id || existingIds.includes(id); i++) {\n id = country + '-' + i;\n }\n feature.properties.id = id;\n existingIds.push(id);\n executeFn = function() {\n console.debug(\"[shape-service] - Add {id: {0}}\".format(id));\n // Update progression\n if (progressFn) progressFn(feature, index, featureCount);\n return raw.add(feature);\n };\n }\n\n // Update existing feature\n else {\n idsToRemove.splice(idsToRemove.indexOf(feature.properties.id), 1);\n executeFn = function() {\n // Update progression\n if (progressFn) progressFn(id, index, featureCount);\n console.debug(\"[shape-service] - Update {id: {0}}\".format(feature.properties.id));\n return raw.update(feature, {id: feature.properties.id});\n };\n }\n\n return promise.then(executeFn)\n // If error: trace but continue\n .catch(function(err) {\n err = parseError(err, feature.properties.id);\n errors.push(err && err.message ? err :  'Error while updating {id: {0}}: {1}'.format(feature.properties.id, err));\n });\n\n }, $q.when());\n })\n\n // Delete shapes\n .then(function() {\n if (idsToRemove.length) {\n return idsToRemove.reduce(function(promise, id, index) {\n console.debug(\"[shape-service] - Delete {id: {0}}\".format(id));\n return raw.remove(id)\n // If error: trace but continue\n .catch(function(err) {\n errors.push('Error while deleting {id: {0}}: {1}'.format(id, err && err.message || err));\n });\n }, $q.when());\n }\n })\n\n .then(function() {\n if (errors.length) {\n console.error(\" - \" + errors.join('\\n -'));\n throw {message: \"MAP.SHAPE.EDIT.ERROR.SAVE_FAILED\", errors: errors};\n }\n\n console.debug('[shape-service] Shape saved in {0}ms'.format(Date.now() - now));\n });\n }\n\n function createSvg(geoJson, options) {\n if (!geoJson) throw new Error('Missing geoJson argument');\n options = options || {};\n options.onclick = options.onclick || function() { console.debug(\"TODO: handle click on a SVG element\");};\n\n // Remove existing svg\n if (options.selector && options.append !== true) {\n d3.selectAll(options.selector + ' svg').remove();\n }\n var selector = options.selector || 'body';\n var container = d3.select(selector);\n if (options.selector && container.empty()) throw new Error(\"Cannot found element '{0}'\".format(selector));\n\n // Width and height\n var width = options.width || container.node().getBoundingClientRect().width,\n height = options.height || width;\n\n // Define map projection\n var projection = d3Projection()\n .translate([0, 0])\n .scale(1);\n\n // Define path generator\n var path = d3.geoPath()\n .projection(projection);\n\n // Create SVG element\n var svg = container\n .append(\"svg\")\n // Responsive SVG needs these 2 attributes and no width and height attr.\n .attr(\"preserveAspectRatio\", \"xMinYMin meet\")\n .attr(\"viewBox\", [0, 0, width, height].join(' '))\n\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n if (options.class) {\n svg.attr('class', options.class);\n }\n\n // Calculate bounding box transforms for entire collection\n var bounds = path.bounds( geoJson ),\n left = bounds[0][0],\n top = bounds[0][1],\n right = bounds[1][0],\n bottom = bounds[1][1],\n dx = right - left,\n dy = bottom - top,\n x = (left + right) / 2,\n y = (top + bottom) / 2,\n scale = 0.95 / Math.max(dx / width, dy / height),\n translate = [(width - scale * (right + left)) / 2, (height - scale * (bottom + top)) / 2];\n\n // Update the projection\n projection\n .scale(scale)\n .translate(translate);\n\n //Bind data and create one path per GeoJSON feature\n svg.selectAll(\"path\")\n .data(geoJson.features)\n .enter()\n .append(\"path\")\n .attr(\"d\", path)\n .on(\"mouseover\", function(d) {\n d3.select(this)\n .style(\"fill\", constants.style.active.fill)\n .style(\"cursor\", \"pointer\")\n ;\n })\n .on(\"mouseout\", function(d) {\n d3.select(this).style(\"fill\", constants.style.defaults.fill);\n })\n .on(\"click\", function(event) {\n options.onclick(event, this);\n })\n .style(\"fill\", constants.style.defaults.fill)\n .style(\"stroke\", constants.style.defaults.stroke)\n .append(\"svg:title\").text(function(d){\n return d.properties && d.properties.title;\n });\n\n return svg;\n }\n\n function createSvgMosaic(geoJson, options) {\n if (!geoJson) throw new Error(\"Missing 'geoJson' argument\");\n if (!geoJson.features) throw new Error(\"Missing 'geoJson.features' argument\");\n\n options = options || {};\n\n var selector = options.selector || 'body';\n var container = d3.select(selector)\n .classed('shape-container', true);\n if (options.compacted) {\n container.classed('compacted', true);\n }\n else {\n options.compacted = container.classed('compacted');\n }\n\n\n if (options.selector && container.empty()) throw new Error(\"Cannot found element: '{0}'\".format(selector));\n\n // Width and height\n var width = options.width || container.node().getBoundingClientRect().width,\n height = options.height || width;\n\n // Split features by position\n var featuresByPosition = _.groupBy(geoJson.features, function(feature) {\n return feature.properties && feature.properties.position || 'main';\n });\n\n // Remove existing content\n container.selectAll('*').remove();\n\n _(constants.positions).each(function(position) {\n\n var features = featuresByPosition[position];\n if (!features) return; // No feature at this position: skip\n\n var svgSelector = selector + ' .' + position,\n svgWidth;\n\n container.append('div').classed(position, true);\n\n // Add main features, as a features collection\n if (position === 'main') {\n svgWidth = options.compacted ? width : width * 0.8; // 100% if compacted, otherwise 80%\n createSvg({\n type: geoJson.type,\n features: features\n }, angular.merge({}, options, {\n selector: svgSelector,\n append: false,\n width: svgWidth,\n height: Math.min(svgWidth, height)\n }));\n }\n\n // For secondary position (left or right)\n else {\n // Sort features (using properties.order)\n features = _.sortBy(features, function(f) { return f.properties && f.properties.order || 999; });\n\n // Add a SVG per feature\n svgWidth = width * 0.1; // 10% of global width\n var svgOptions = angular.merge({}, options, {\n selector: svgSelector,\n append: true,\n width: svgWidth,\n height: Math.min(svgWidth, height / 12)\n });\n _.each(features, function(feature) {\n createSvg({\n type: geoJson.type,\n features: [feature]\n }, svgOptions);\n });\n }\n });\n }\n\n function removeSvg(options) {\n if (!options && !options.selector) throw new Error(\"Missing 'options.selector' argument\");\n\n // Remove existing svg\n d3.select(options.selector + ' svg').remove();\n }\n\n function findSvgGeoViewBox(svgElement) {\n if (!svgElement) return undefined;\n\n var geoViewBox = svgElement.attr(':' + constants.attributes.geoViewBox) ||\n // Retry in lowercase\n svgElement.attr(':' + constants.attributes.geoViewBox.toLowerCase());\n\n // Not found: try on parent node\n if (!geoViewBox) {\n var parent = svgElement.node().tagName !== 'svg' && d3.select(svgElement.node().parentNode);\n if (!parent || parent.empty()) return undefined;\n return findSvgGeoViewBox(parent);\n }\n\n var parts = geoViewBox.split(' ');\n if (parts.length !== 4) throw new Error('Invalid geoViewBox value. Expected: \"left-lng top-lat right-lng bottom-lat\"');\n return {\n leftLng: parseFloat(parts[0]),\n topLat: parseFloat(parts[1]),\n rightLng: parseFloat(parts[2]),\n bottomLat: parseFloat(parts[3])\n };\n }\n\n function findSvgViewBox(svgElement) {\n if (!svgElement) return undefined;\n\n var viewBox = svgElement.attr(constants.attributes.viewBox) ||\n // Retry in lowercase\n svgElement.attr(constants.attributes.viewBox.toLowerCase());\n\n // Try with width and height attributes\n if (!viewBox) {\n var width = svgElement.attr('width');\n var height = svgElement.attr('height');\n if (width && height) {\n return {\n minX: 0,\n minY: 0,\n width: parseFloat(width),\n height: parseFloat(height)\n };\n }\n }\n\n // Not found: try on parent node\n if (!viewBox) {\n var parent = svgElement.node().tagName !== 'svg' && d3.select(svgElement.node().parentNode);\n if (!parent || parent.empty()) return undefined;\n return findSvgViewBox(parent); // recursive call\n }\n\n var parts = viewBox.split(' ');\n if (parts.length !== 4) throw new Error('Invalid geoViewBox value. Expected: \"minx-x min-y width height\"');\n return {\n minX: parseFloat(parts[0]),\n minY: parseFloat(parts[1]),\n width: parseFloat(parts[2]),\n height: parseFloat(parts[3])\n };\n }\n\n function findSvgGeoScale(svgElement) {\n if (!svgElement) return undefined;\n\n var scale = svgElement.attr(':' + constants.attributes.geoScale) ||\n // Retry in lowercase\n svgElement.attr(':' + constants.attributes.geoScale.toLowerCase());\n\n // Not found: try on parent node\n if (!scale) {\n var parent = svgElement.node().tagName !== 'svg' && d3.select(svgElement.node().parentNode);\n if (!parent || parent.empty()) return undefined;\n return findSvgGeoScale(parent);\n }\n\n return parseFloat(scale);\n }\n\n function findSvgGeoTranslate(svgElement) {\n if (!svgElement) return undefined;\n\n var translate = svgElement.attr(':' + constants.attributes.geoTranslate) ||\n // Retry in lowercase\n svgElement.attr(':' + constants.attributes.geoTranslate.toLowerCase());\n\n // Not found: try on parent node\n if (!translate) {\n var parent = svgElement.node().tagName !== 'svg' && d3.select(svgElement.node().parentNode);\n if (!parent || parent.empty()) return undefined;\n return findSvgGeoScale(parent);\n }\n\n var parts = translate.split(' ');\n if (parts.length !== 2) throw new Error('Invalid geoTranslate value. Expected: \"x y\"');\n return [\n parseFloat(parts[0]),\n parseFloat(parts[1])\n ];\n }\n\n function svgElementToGeometry(element, projection, precision) {\n if (!element || !projection) throw new Error(\"Missing 'element' or 'projection' argument\");\n if (typeof element.node !== 'function') {\n element = d3.select(element);\n }\n var tagName = element.node().tagName;\n if (tagName === 'svg') {\n throw new Error(\"Invalid 'svgElement': must be child of <svg> tag, but not the <svg> tag itself.\");\n }\n\n // Rectangle\n if (tagName === 'rect') {\n var x = element.x.baseVal.value;\n var y = element.y.baseVal.value;\n var height = element.height.baseVal.value;\n var width = element.width.baseVal.value;\n return {\n type: 'Polygon',\n coordinates: [\n [\n projection([x, y]),\n projection([x, y + height]),\n projection([x + width, y + height]),\n projection([x + width, y]),\n projection([x, y])\n ]\n ]\n };\n }\n\n // Function to apply projection AND remove duplicated points\n\n var toMappedCoords = function(coords) {\n var res = [];\n var degreePrecision = constants.projection.degreePrecision;\n var duplicateCount = 0;\n _(coords).each(function(point) {\n if (point.length !== 2) throw new Error('Invalid point: ' + point.join(','));\n var projectedPoint = projection(point);\n\n // Round to the expected precision\n if (precision) {\n projectedPoint = [\n Math.round(projectedPoint[0] / degreePrecision) * degreePrecision,\n Math.round(projectedPoint[1] / degreePrecision) * degreePrecision\n ];\n }\n\n // Check is not same as previous\n if (!res.length || !isSamePoint(projectedPoint, res[res.length - 1])) {\n // Append to result\n res.push(projectedPoint);\n }\n else {\n duplicateCount++;\n }\n });\n if (duplicateCount > 0) console.debug('[shape-service] Removed {0} duplicated points'.format(duplicateCount));\n return res;\n };\n\n if (tagName === 'polyline') {\n // TODO get data\n throw new Error('polyline not implemented yet');\n }\n\n // Path\n if (tagName === 'path') {\n var pathDataStr = element.attr('d');\n if (!pathDataStr) return [];\n\n // Normalized path (add space, to be able to split)\n pathDataStr = pathDataStr.trim()\n .replace(/([0-9])-([0-9])/g, '$1,$2')\n .replace(/([0-9])([a-zA-Z])/g, '$1 $2')\n .replace(/([a-zA-Z])([-0-9])/g, '$1 $2');\n\n var pathData = pathDataStr.split(' ');\n var actionRegexp = /^[a-zA-Z]/;\n\n var lineRings = [];\n var currentLineRing = [];\n var action;\n var ignoreCount = 0;\n _(pathData || []).forEach(function (pathitem, index) {\n\n // Parse action\n if (actionRegexp.test(pathitem)) {\n action = pathitem.substr(0, 1);\n\n // Process close action first\n switch (action) {\n // Close\n case 'z':\n case 'Z':\n if (currentLineRing.length) {\n if (currentLineRing.length > 1) {\n // Re add the first polygon point\n currentLineRing.push(currentLineRing[0]);\n\n // Check if valid polygon, for ES geo_shape type\n if (currentLineRing.length >= 4) {\n // Add to final result\n lineRings.push(currentLineRing);\n }\n else {\n console.debug('[shape-service] An invalid polygon has been ignore', currentLineRing);\n }\n }\n // Reset the action\n action = undefined;\n // Create a new polygon\n currentLineRing = [];\n ignoreCount = false;\n }\n break;\n default:\n // continue\n }\n // Remove the action, then continue\n pathitem = pathitem.substr(1);\n }\n\n if (ignoreCount > 0) {\n ignoreCount--;\n }\n else if (pathitem && pathitem.trim().length > 0) {\n var parts = pathitem.split(',');\n if (parts.length > 2) return; // skip\n parts = _(parts).map(parseFloat);\n\n var prevLength = currentLineRing.length;\n var prevPoint = prevLength && currentLineRing[prevLength - 1];\n // No previous point in the current polygon: try to get last of the previous polygon\n if (!prevPoint && lineRings.length) {\n var previousPolygon = lineRings[lineRings.length-1];\n prevPoint = previousPolygon.length && previousPolygon[previousPolygon.length-1];\n }\n var currentPoint;\n\n // Process other action (not close)\n switch (action) {\n\n // Move (absolute)\n case 'M':\n if (parts.length === 2) {\n currentPoint = parts;\n }\n action = 'L';\n break;\n\n // Move (relative)\n case 'm':\n if (parts.length === 2) {\n if (!prevPoint) {\n currentPoint = parts;\n } else {\n currentPoint = [parts[0] + prevPoint[0], parts[1] + prevPoint[1]];\n }\n }\n\n action = 'l';\n break;\n\n // Line (absolute)\n case 'L':\n if (parts.length === 2) {\n currentPoint = parts;\n }\n break;\n\n // Line (relative)\n case 'l':\n if (parts.length === 2) {\n if (!prevPoint) {\n currentPoint = parts;\n } else {\n currentPoint = [parts[0] + prevPoint[0], parts[1] + prevPoint[1]];\n }\n }\n break; // skip\n\n // Line horizontal (absolute)\n case 'H':\n if (parts.length === 1) {\n if (!prevPoint) {\n currentPoint = [parts[0], 0];\n } else {\n currentPoint = [parts[0], prevPoint[1]];\n }\n }\n break;\n\n // Line horizontal (relative)\n case 'h':\n if (parts.length === 1) {\n if (!prevPoint) {\n currentPoint = [parts[0], 0];\n } else {\n currentPoint = [parts[0] + prevPoint[0], prevPoint[1]];\n }\n }\n break;\n\n // Line vertical (absolute)\n case 'V':\n if (parts.length === 1) {\n if (!prevPoint) {\n currentPoint = [0, parts[0]];\n } else {\n currentPoint = [prevPoint[0], parts[0]];\n }\n }\n break;\n\n // Line vertical (relative)\n case 'v':\n if (parts.length === 1) {\n if (!prevPoint) {\n currentPoint = [0, parts[0]];\n } else {\n currentPoint = [prevPoint[0], parts[0] + prevPoint[1]];\n }\n }\n break; // skip\n\n // Other case (not managed. e.g. Curve)\n case 'C':\n console.warn(\"[svg] SVG curve action. Skipping\");\n action = 'L'; // Continue in absolute\n ignoreCount = 1; // Ignore next path item\n break;\n case 'c':\n console.warn(\"[svg] SVG curve action. Skipping\");\n action = 'l'; // Continue in relative\n ignoreCount = 1; // Ignore next path item\n break;\n default:\n\n break; // skip\n }\n\n // A new point must be add\n if (currentPoint) {\n currentLineRing.push(currentPoint);\n }\n else {\n console.warn(\"[svg] Invalid {0} data: \" + pathitem);\n //console.warn(\"[svg] Ignoring data in path: {action: {0}, point: {1}}\".format(action, parts));\n }\n }\n });\n\n // make sure polygon is closed\n if (currentLineRing.length >= 4) {\n console.warn(\"[svg] Invalid polygon found (not closed). Will force last point.\");\n // Add to final result\n lineRings.push(currentLineRing);\n }\n\n // Compute polygons, from linerings\n var polygons = [];\n var currentPolygon = [];\n var firstIsClockwise;\n _(lineRings).each(function(coords, index) {\n\n var cw = clockwise(coords);\n if (currentPolygon.length === 0) firstIsClockwise = cw;\n var isHole = cw !== firstIsClockwise;\n console.debug('At index {0} {clockwise: {1}, isHole: {2}}'.format(index, cw, isHole));\n\n var mappedCoords = toMappedCoords(coords);\n\n if (!isHole && currentPolygon.length) {\n polygons.push(currentPolygon);\n currentPolygon = [];\n }\n if (mappedCoords.length >= 4) {\n currentPolygon.push(mappedCoords);\n }\n });\n\n if (currentPolygon.length) {\n polygons.push(currentPolygon);\n }\n\n if (polygons.length === 1) {\n return {\n type: 'Polygon',\n coordinates: polygons[0]\n };\n }\n return {\n type: 'MultiPolygon',\n coordinates: polygons\n };\n\n }\n }\n\n function splitCoords(coords) {\n\n }\n\n function isSamePoint(p1, p2) {\n return (p1[0] === p2[0] && p1[1] === p2[1]);\n }\n\n function createSvgFromText(svgText, options) {\n if (!svgText || typeof svgText !== 'string') throw new Error(\"Missing required 'svgText' argument\");\n\n options = options || {};\n var selector = options.selector || 'body';\n\n var container = d3.select(selector);\n if (options.selector && container.empty()) throw new Error(\"Cannot found element: '{0}'\".format(selector));\n\n var svg = container\n .html(svgText)\n .select('svg');\n\n if (svg.empty()) throw new Error(\"Invalid value of 'svgText' argument: no <svg> tag found\");\n\n // Add CSS class\n if (options.class) {\n svg.classed(options.class, true);\n }\n\n // Set width\n if (options.width) {\n svg.attr('width', options.width);\n svg.attr('height', options.height || options.width);\n }\n\n // Make sure width and height are filled\n if (!svg.attr('width') || !svg.attr('height')) {\n var viewBox = findSvgViewBox(svg);\n svg.attr('width', viewBox && viewBox.width || options.width || 800)\n .attr('height', viewBox && viewBox.height || options.height || 800);\n }\n return svg;\n }\n\n function convertSvgToGeoJson(svg, options) {\n if (!svg) throw new Error(\"Missing required 'svgElement' argument\");\n\n options = options || {};\n options.attributes = options.attributes || ['id', 'name', 'title'];\n options.scale = options.scale || 1;\n options.precision = options.precision > 0 ? options.precision : null;\n\n var selector = options.selector || 'body';\n\n var container = d3.select(selector);\n if (options.selector && container.empty()) throw new Error(\"Cannot found element: '{0}'\".format(selector));\n\n if (typeof svg === 'string') {\n svg = createSvgFromText(svg, options);\n }\n else {\n svg = svg || container.select('svg');\n }\n if (svg.empty()) throw new Error(\"Cannot found element <svg> element\");\n\n var viewBox = findSvgViewBox(svg);\n if (!viewBox) {\n throw new Error(\"Bad SVG format: missing attribute '{0}'\".format(constants.attributes.viewBox));\n }\n\n var geoViewBox = options.geoViewBox || findSvgGeoViewBox(svg);\n if (!geoViewBox) {\n throw new Error(\"Bad SVG format: missing attribute '{0}'\".format(constants.attributes.geoViewBox));\n }\n\n // Geo projection\n var projData = computeSvgProjectionData(svg, angular.merge({}, options, {\n viewBox: viewBox,\n geoViewBox: geoViewBox\n }));\n var projection;\n if (projData) {\n projection = d3Projection()\n .translate(projData.translate || [0,0])\n .scale(projData.scale || 1)\n .invert;\n }\n // Linear projection\n else {\n var mapX = d3.scaleLinear()\n .range([geoViewBox.leftLng, geoViewBox.rightLng])\n .domain([viewBox.minX, viewBox.width])\n ;\n var mapY = d3.scaleLinear()\n .range([geoViewBox.topLat, geoViewBox.bottomLat])\n .domain([viewBox.minY, viewBox.height]);\n\n projection = function(coord) {\n return [\n mapX(coord[0]) * options.scale,\n mapY(coord[1]) * options.scale\n ];\n };\n }\n\n var features = [];\n svg.selectAll('path').each(function() {\n var ele = d3.select(this);\n\n var geometry = svgElementToGeometry(ele, projection, options.precision);\n\n // Copy properties\n var properties = {};\n _(options.attributes||[]).forEach(function (attr) {\n var value = ele.attr(attr);\n if (value) properties[attr] = value;\n });\n\n features.push({\n type: 'Feature',\n properties: properties,\n geometry: geometry\n });\n });\n\n return {\n type: 'FeatureCollection',\n features: features\n };\n }\n\n function computeSvgProjectionData(svg, options) {\n options = options || {};\n\n options.scale = options.scale || findSvgGeoScale(svg);\n options.translate = options.translate || findSvgGeoTranslate(svg);\n if (options.scale && options.translate) {\n console.debug('[shape] Find project {scale: {0}, translate: {1}}'.format(options.scale, options.translate));\n return options;\n }\n\n var viewBox = options.viewBox || findSvgViewBox(svg);\n var geoViewBox = options.geoViewBox || findSvgGeoViewBox(svg);\n if (!geoViewBox || !viewBox) throw new Error('Cannot compute projection. Missing options scale and translate, or <svg> viewBox and/or geoViewBox');\n\n console.debug('[shape-service] Computing projection...', viewBox, geoViewBox);\n\n var\n geoTopLeft = [geoViewBox.leftLng, geoViewBox.topLat],\n geoBottomRight = [geoViewBox.rightLng, geoViewBox.bottomLat],\n svgTopLeft = [viewBox.minX, viewBox.minY],\n svgBottomRight = [viewBox.minX + viewBox.width, viewBox.minY + viewBox.height],\n geoWidth = geoViewBox.rightLng - geoViewBox.leftLng,\n geoHeight = geoViewBox.topLat - geoViewBox.bottomLat\n ;\n\n var projection = d3Projection();\n\n // Start parameters\n var currentX=0,\n currentY=0,\n currentScale=1000,\n scaleFixAbsolute = 100,\n xFixAbsolute = 100,\n yFixAbsolute = 100,\n expectedPrecision = constants.projection.degreePrecision;\n\n //var maxDurationMs = 10000; // 10s\n var timeout = 2000; // 1min\n var now = Date.now();\n var checkTimeout = function() {\n if ((Date.now() - now) >= timeout) throw 'TIMEOUT';\n };\n\n var counter = 0;\n try {\n var previousFix;\n var previousFixSign;\n while (true) {\n\n counter++;\n if (counter % 20 === 0) checkTimeout();\n\n // Prepare projection\n projection\n .translate([currentX, currentY])\n .scale(currentScale);\n\n var testTopLeft = projection.invert(svgTopLeft);\n var testBottomRight = projection.invert(svgBottomRight);\n var testWidth = testBottomRight[0] - testTopLeft[0];\n var testHeight = testTopLeft[1] - testBottomRight[1];\n\n var errorWidth = testWidth - geoWidth;\n var errorHeight = testHeight - geoHeight;\n\n var errorTopX = testTopLeft[0] - geoTopLeft[0];\n var errorBottomX = testBottomRight[0] - geoBottomRight[0];\n var errorX = Math.abs(errorTopX) > Math.abs(errorBottomX) ? errorTopX : errorBottomX;\n\n var errorLeftY = testTopLeft[1] - geoTopLeft[1];\n var errorRightY = testBottomRight[1] - geoBottomRight[1];\n var errorY = Math.abs(errorLeftY) > Math.abs(errorRightY) ? errorLeftY : errorRightY;\n\n var fix, fixSign;\n\n if (Math.abs(errorWidth) >= expectedPrecision) {\n fix = 'scale';\n fixSign = (errorWidth < 0 ? -1 : 1);\n // Same error, but sign changed: reduce the fix delta\n if (previousFix === fix && fixSign !== previousFixSign) {\n scaleFixAbsolute = scaleFixAbsolute / 2;\n }\n if (scaleFixAbsolute >= expectedPrecision) {\n // Need to reduce : increase scale\n currentScale += fixSign * scaleFixAbsolute;\n previousFix = fix;\n previousFixSign = fixSign;\n console.debug('Bad width. New scale={0} (delta: {1}}'.format(currentScale, scaleFixAbsolute));\n continue;\n }\n }\n\n if (Math.abs(errorX) >= expectedPrecision) {\n fix = 'x';\n fixSign = (errorX < 0 ? -1 : 1);\n // Same error, but sign changed: reduce the fix delta\n if (previousFix === fix && fixSign !== previousFixSign) {\n xFixAbsolute = xFixAbsolute / 2;\n }\n if (xFixAbsolute >= expectedPrecision) {\n // Need to reduce : increase scale\n currentX += fixSign * xFixAbsolute;\n previousFix = fix;\n previousFixSign = fixSign;\n console.debug('Bad X. New={0} (delta: {1}}'.format(currentX, xFixAbsolute));\n continue;\n }\n }\n\n if (Math.abs(errorY) >= expectedPrecision) {\n fix = 'y';\n fixSign = (errorY < 0 ? 1 : -1); // inverse, because\n // Same error, but sign changed: reduce the fix delta\n if (previousFix === fix && fixSign !== previousFixSign) {\n yFixAbsolute = yFixAbsolute / 2;\n }\n if (yFixAbsolute >= expectedPrecision) {\n // Need to reduce : increase scale\n currentY += fixSign * yFixAbsolute;\n previousFix = fix;\n previousFixSign = fixSign;\n console.debug('Bad Y. New={0} (delta: {1}}'.format(currentY, yFixAbsolute));\n continue;\n }\n }\n\n // No more error: success !\n console.debug('Projection resolved in {0}ms => {translate: [{1}, {2}], scale: {3}}'.format(Date.now()-now, currentX, currentY, currentScale));\n break;\n }\n } catch(err) {\n if (err === 'TIMEOUT') {\n console.error('[shape-service] Stopping projection computation (timeout)');\n }\n else {\n throw err;\n }\n }\n return {translate: [currentX, currentY], scale: currentScale};\n }\n\n function putShapeInCache(shape, id) {\n if (!shape) throw new Error(\"Require 'shape' argument\");\n\n id = id || (shape.properties && shape.properties.id);\n if (!id) throw new Error(\"Invalid GeoJSon feature : missing required attribute 'properties.id'\");\n\n console.info('[shape] Saving GeoJson feature {{0}} locally...'.format(id));\n\n caches.shapesById = caches.shapesById || csCache.get(cachePrefix, csCache.constants.LONG);\n caches.shapesById.put(id, shape);\n\n return $q.when(id);\n }\n\n function getShapeById(id, options) {\n if (!id) throw new Error(\"Missing 'id' argument\");\n\n if ((!options || options.cache !== false) && caches.shapesById) {\n var shape = caches.shapesById.get(id);\n if (shape) return $q.when(shape);\n }\n\n return raw.getCommons({id: id})\n .then(function(hit) {\n var feature = readFromHit(hit);\n\n // Add to cache\n putShapeInCache(id, feature);\n\n return feature;\n })\n .catch(function(err) {\n console.error(\"Unable to load shape by id\", err);\n throw err;\n });\n }\n\n function toStrictGeoJson(geojson, outer) {\n outer = angular.isDefined(outer) ? outer : true;\n switch ((geojson && geojson.type) || null) {\n case 'FeatureCollection':\n geojson.features = geojson.features.map(curryOuter(toStrictGeoJson, outer));\n return geojson;\n case 'Feature':\n geojson.geometry = toStrictGeoJson(geojson.geometry, outer);\n return geojson;\n case 'Polygon':\n case 'MultiPolygon':\n return correct(geojson, outer);\n default:\n return geojson;\n }\n }\n\n function curryOuter(a, b) {\n return function(_) { return a(_, b); };\n }\n function correct(geometry, outer) {\n if (geometry.type === 'Polygon') {\n geometry.coordinates = correctRings(geometry.coordinates, outer);\n } else if (geometry.type === 'MultiPolygon') {\n geometry.coordinates = _(geometry.coordinates)\n .map(function(coords) {\n return correctRings(coords, outer);\n });\n }\n return geometry;\n }\n\n function correctRings(coords, outer) {\n outer = !!outer;\n coords[0] = wind(coords[0], !outer);\n for (var i = 1; i < coords.length; i++) {\n coords[i] = wind(coords[i], outer);\n }\n return coords;\n }\n\n function wind(coords, outer) {\n return clockwise(coords) === outer ? coords : coords.reverse();\n }\n\n function clockwise(coords) {\n return ringArea(coords) >= 0;\n }\n\n function ringArea(coords) {\n var area = 0;\n\n if (coords.length > 2) {\n var p1, p2;\n for (var i = 0; i < coords.length - 1; i++) {\n p1 = coords[i];\n p2 = coords[i + 1];\n area += rad(p2[0] - p1[0]) * (2 + Math.sin(rad(p1[1])) + Math.sin(rad(p2[1])));\n }\n\n area = area * 6378137 * 6378137 / 2;\n }\n\n return area;\n }\n\n function rad(value) {\n return value * Math.PI / 180;\n }\n\n function removeGeoJsonHoles(geojson) {\n switch ((geojson && geojson.type) || null) {\n case 'FeatureCollection':\n geojson.features = geojson.features.map(removeGeoJsonHoles);\n return geojson;\n case 'Feature':\n geojson.geometry = removeGeoJsonHoles(geojson.geometry);\n return geojson;\n case 'Polygon':\n case 'MultiPolygon':\n return removeGeometryHoles(geojson);\n default:\n return geojson;\n }\n }\n\n function removeGeometryHoles(geometry) {\n if (geometry.type === 'Polygon') {\n geometry.coordinates = [geometry.coordinates[0]];\n } else if (geometry.type === 'MultiPolygon') {\n geometry.coordinates = _(geometry.coordinates)\n .map(function(coords) {\n return [coords[0]];\n });\n }\n return geometry;\n }\n\n function parseError(err, id) {\n console.error('Error while updating {id: {0}}: {1}'.format(id, err && err.message || err));\n if (!err.message) return err;\n\n // Self intersection\n var matches = regexp.error.SELF_INTERSECTION.exec(err.message);\n if (matches) {\n return {\n type: 'error',\n message: 'MAP.SHAPE.EDIT.ERROR.SELF_INTERSECTION',\n messageParams: {id: id},\n lon: parseFloat(matches[1]),\n lat: parseFloat(matches[2])\n };\n }\n // Self intersection\n matches = regexp.error.HOLE_LIES_OUTSIDE.exec(err.message);\n if (matches) {\n return {\n type: 'error',\n message: 'MAP.SHAPE.EDIT.ERROR.HOLE_LIES_OUTSIDE',\n messageParams: {id: id},\n lon: parseFloat(matches[1]),\n lat: parseFloat(matches[2])\n };\n }\n matches = regexp.error.HOLE_NOT_WITHIN_POLYGON.exec(err.message);\n if (matches) {\n return {\n type: 'error',\n message: 'MAP.SHAPE.EDIT.ERROR.HOLE_NOT_WITHIN_POLYGON',\n messageParams: {id: id}\n };\n }\n return err;\n }\n\n function clearCache() {\n console.debug('[shape] Cleaning cache...');\n csCache.clear(cachePrefix);\n }\n\n // Default actions\n csPlatform.ready().then(function() {\n esHttp.api.node.on.stop($rootScope, clearCache, this);\n });\n\n return {\n\n get: getShapeById,\n save: saveShape,\n\n getAllIds: getAllShapeIds,\n getAllCountries: getAllCountries,\n\n geoJson: {\n search: searchShapes, // e.g. search by country\n },\n\n cache: {\n put: putShapeInCache,\n clear: clearCache\n },\n\n svg: {\n create: createSvg,\n remove: removeSvg,\n createMosaic: createSvgMosaic,\n\n findGeoViewBox: findSvgGeoViewBox,\n createFromText: createSvgFromText,\n projectionData: computeSvgProjectionData,\n toGeoJson: convertSvgToGeoJson\n },\n\n constants: constants\n };\n }]);\n\n","\nangular.module('cesium.map.user.controllers', ['cesium.services', 'cesium.map.services'])\n\n .config(['PluginServiceProvider', 'csConfig', function(PluginServiceProvider, csConfig) {\n 'ngInject';\n\n var enable = csConfig.plugins && csConfig.plugins.es;\n if (enable) {\n\n PluginServiceProvider\n\n .extendState('app.user_edit_profile', {\n points: {\n 'after-position': {\n templateUrl: 'plugins/map/templates/user/edit_profile_extend.html',\n controller: 'MapEditProfileViewCtrl'\n }\n }\n });\n }\n }])\n\n // [NEW] Manage events from the page #/app/wot/map\n .controller('MapEditProfileViewCtrl', ['$scope', '$timeout', '$q', 'MapUtils', '$translate', function($scope, $timeout, $q, MapUtils, $translate) {\n 'ngInject';\n\n var listeners = [];\n $scope.mapId = 'map-user-profile-' + $scope.$id;\n $scope.map = MapUtils.map({\n markers: {},\n center: {\n zoom: 13\n },\n defaults: {\n tileLayerOptions: {\n attribution: '© <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a>'\n }\n }\n });\n $scope.loading = true;\n\n $scope.enter = function(e, state) {\n\n // Wait parent controller load the profile\n if (!$scope.formData || !$scope.formData.title) {\n return $timeout($scope.enter, 500);\n }\n\n $scope.loading = true;\n return $scope.load();\n };\n $scope.$on('$csExtension.enter', $scope.enter);\n $scope.$on('$ionicParentView.enter', $scope.enter);\n\n $scope.load = function() {\n\n // no position define: remove existing listener\n if (!$scope.formData.geoPoint || !$scope.formData.geoPoint.lat || !$scope.formData.geoPoint.lon) {\n _.forEach(listeners, function(listener){\n listener(); // unlisten\n });\n listeners = [];\n delete $scope.map.markers.geoPoint;\n $scope.loading = false;\n return $q.when();\n }\n\n // If no marker exists on map: create it\n if (!$scope.map.markers.geoPoint) {\n\n return $translate('MAP.PROFILE.MARKER_HELP')\n .then(function(helpText) {\n\n\n $scope.map.markers.geoPoint = {\n message: helpText,\n lat: parseFloat($scope.formData.geoPoint.lat),\n lng: parseFloat($scope.formData.geoPoint.lon),\n draggable: true,\n focus: true\n };\n angular.extend($scope.map.center, {\n lat: $scope.map.markers.geoPoint.lat,\n lng: $scope.map.markers.geoPoint.lng\n });\n\n // Listening changes\n var listener = $scope.$watch('map.markers.geoPoint', function() {\n if ($scope.loading) return;\n if ($scope.map.markers.geoPoint && $scope.map.markers.geoPoint.lat && $scope.map.markers.geoPoint.lng) {\n $scope.formData.geoPoint = $scope.formData.geoPoint || {};\n $scope.formData.geoPoint.lat = $scope.map.markers.geoPoint.lat;\n $scope.formData.geoPoint.lon = $scope.map.markers.geoPoint.lng;\n }\n }, true);\n listeners.push(listener);\n\n\n // Make sure map appear, if shown later\n if (!$scope.ionItemClass) {\n $scope.ionItemClass = 'done in';\n }\n\n $scope.loading = false;\n });\n }\n\n // Marker exists: update lat/lon\n else {\n $scope.map.markers.geoPoint.lat = $scope.formData.geoPoint.lat;\n $scope.map.markers.geoPoint.lng = $scope.formData.geoPoint.lon;\n }\n };\n\n\n $scope.$watch('formData.geoPoint', function() {\n if ($scope.loading) return;\n $scope.load();\n }, true);\n\n }]);\n","// Ionic Starter App\n\n// angular.module is a global place for creating, registering and retrieving Angular modules\n// 'starter' is the name of this angular module example (also set in a <body> attribute in index.html)\n// the 2nd parameter is an array of 'requires'\n// 'starter.controllers' is found in controllers.js\nangular.module('gchange', ['ionic', 'ionic-material', 'ngMessages', 'pascalprecht.translate',\n 'ngApi', 'angular-cache', 'angular.screenmatch', 'angular.bind.notifier', 'angular-fullscreen-toggle',\n 'ImageCropper', 'ngFileSaver', 'ngIdle',\n 'cesium.plugins',\n 'cesium.filters', 'cesium.config', 'cesium.platform', 'cesium.controllers', 'cesium.templates', 'cesium.translations', 'cesium.components', 'cesium.directives'\n ])\n\n // Override the automatic sync between location URL and state\n // (see watch event $locationChangeSuccess in the run() function bellow)\n .config(['$urlRouterProvider', function ($urlRouterProvider) {\n 'ngInject';\n\n $urlRouterProvider.deferIntercept();\n }])\n\n .run(['$rootScope', '$translate', '$state', '$window', 'ionicReady', '$urlRouter', 'Device', 'UIUtils', '$ionicConfig', 'PluginService', 'csPlatform', function($rootScope, $translate, $state, $window, ionicReady, $urlRouter, Device, UIUtils, $ionicConfig, PluginService,\n csPlatform) {\n 'ngInject';\n\n // Must be done before any other $stateChangeStart listeners\n csPlatform.disableChangeState();\n\n var preventStateChange = false; // usefull to avoid duplicate login, when a first page with auth\n $rootScope.$on('$stateChangeStart', function (event, next, nextParams, fromState) {\n if (event.defaultPrevented) return;\n\n var skip = !next.data || $rootScope.tour || event.currentScope.tour; // disabled for help tour\n if (skip) return;\n\n if (preventStateChange) {\n event.preventDefault();\n return;\n }\n\n // removeIf(android)\n // removeIf(ios)\n // -- Automatic redirection to large state (if define) (keep this code for platforms web and ubuntu build)\n if (next.data.large && !UIUtils.screen.isSmall()) {\n event.preventDefault();\n $state.go(next.data.large, nextParams);\n return;\n }\n // endRemoveIf(ios)\n // endRemoveIf(android)\n\n });\n\n // Prevent $urlRouter's default handler from firing (don't sync ui router)\n $rootScope.$on('$locationChangeSuccess', function(event, newUrl, oldUrl) {\n if ($state.current.data && $state.current.data.silentLocationChange === true) {\n // Skipping propagation, because same URL, and state configured with 'silentLocationChange' options\n var sameUrl = oldUrl && (oldUrl.split('?')[0] === newUrl.split('?')[0]);\n if (sameUrl) event.preventDefault();\n }\n });\n\n // Configures $urlRouter's listener *after* the previous listener\n $urlRouter.listen();\n\n // Start plugins eager services\n PluginService.start();\n \n ionicReady().then(function() {\n if (ionic.Platform.isIOS()) {\n if(window.StatusBar) {\n // fix font color not white on iOS 11+\n StatusBar.styleLightContent();\n }\n }\n });\n }])\n;\n\nwindow.ionic.Platform.ready(function() {\n angular.bootstrap(document, ['gchange']);\n});\n","angular.module('cesium.components', [])\n\n .component('csAvatar', {\n bindings: {\n avatar: '<',\n icon: '@'\n },\n template:\n '<i ng-if=\"!$ctrl.avatar\" class=\"item-image icon {{$ctrl.icon}}\"></i>' +\n '<i ng-if=\"$ctrl.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::$ctrl.avatar.src}})\"></i>'\n })\n\n .component('csBadgeCertification', {\n bindings: {\n requirements: '=',\n parameters: '<',\n csId: '@'\n },\n templateUrl: 'templates/common/badge_certification_count.html'\n })\n\n .component('csBadgeGivenCertification', {\n bindings: {\n identity: '=',\n parameters: '<',\n csId: '@'\n },\n templateUrl: 'templates/common/badge_given_certification_count.html'\n })\n\n .component('csSortIcon', {\n bindings: {\n asc: '=',\n sort: '=',\n toggle: '<'\n },\n template:\n '<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>' +\n '<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>'\n })\n\n .component('csRemovableSelectionItem', {\n transclude: true,\n controller: function(){\n this.$onInit = function(){\n console.log(\"$onInit called: \", this);\n };\n this.remove = function(){\n console.log(\"remove called: \", this);\n };\n },\n template:\n '<div >' +\n ' <ng-transclude></ng-transclude>' +\n ' <i class=\"icon ion-close\" ng-click=\"$ctrl.remove();\"></i>' +\n '</div>'\n })\n\n;\n","angular.module('cesium.directives', [])\n\n // Add new compare-to directive (need for form validation)\n .directive(\"compareTo\", function() {\n return {\n require: \"?ngModel\",\n link: function(scope, element, attributes, ngModel) {\n if (ngModel && attributes.compareTo) {\n ngModel.$validators.compareTo = function(modelValue) {\n return modelValue == scope.$eval(attributes.compareTo);\n };\n\n scope.$watch(attributes.compareTo, function() {\n ngModel.$validate();\n });\n }\n }\n };\n })\n\n // Add new different-to directive (need for form validation)\n .directive(\"differentTo\", function() {\n return {\n require: \"?ngModel\",\n link: function(scope, element, attributes, ngModel) {\n if (ngModel && attributes.differentTo) {\n ngModel.$validators.differentTo = function(modelValue) {\n return modelValue != scope.$eval(attributes.differentTo);\n };\n\n scope.$watch(attributes.differentTo, function() {\n ngModel.$validate();\n });\n }\n }\n };\n })\n\n .directive('numberFloat', function() {\n var NUMBER_REGEXP = new RegExp('^[0-9]+([.,][0-9]+)?$');\n\n return {\n require: '?ngModel',\n link: function(scope, element, attributes, ngModel) {\n if (ngModel) {\n ngModel.$validators.numberFloat = function(value) {\n return ngModel.$isEmpty(value) || NUMBER_REGEXP.test(value);\n };\n }\n }\n };\n })\n\n .directive('numberInt', function() {\n var INT_REGEXP = new RegExp('^[0-9]+$');\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, ngModel) {\n if (ngModel) {\n ngModel.$validators.numberInt = function (value) {\n return ngModel.$isEmpty(value) || INT_REGEXP.test(value);\n };\n }\n }\n };\n })\n\n .directive('email', function() {\n var EMAIL_REGEXP = 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])?$');\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, ngModel) {\n if (ngModel) {\n ngModel.$validators.email = function (value) {\n return ngModel.$isEmpty(value) || EMAIL_REGEXP.test(value);\n };\n }\n }\n };\n })\n\n .directive('requiredIf', function() {\n return {\n require: '?ngModel',\n link: function(scope, element, attributes, ngModel) {\n if (ngModel && attributes.requiredIf) {\n ngModel.$validators.required = function(value) {\n return !(scope.$eval(attributes.requiredIf)) || !ngModel.$isEmpty(value);\n };\n\n scope.$watch(attributes.requiredIf, function() {\n ngModel.$validate();\n });\n }\n }\n };\n })\n\n .directive('geoPoint', function() {\n return {\n require: '?ngModel',\n link: function(scope, element, attributes, ngModel) {\n if (ngModel) {\n ngModel.$validators.geoPoint = function(value) {\n return ngModel.$isEmpty(value) ||\n // twice are defined\n (angular.isDefined(value.lat) && angular.isDefined(value.lon)) ||\n // or twice are NOT defined (=empty object - can be useful to override data in ES node)\n (angular.isUndefined(value.lat) && angular.isUndefined(value.lon));\n };\n }\n }\n };\n })\n\n // Add a copy-on-click directive\n .directive('copyOnClick', ['$window', 'Device', 'UIUtils', function ($window, Device, UIUtils) {\n 'ngInject';\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n var showCopyPopover = function (event) {\n var value = attrs.copyOnClick;\n if (value === undefined || value === null) return; // Skip if no value\n if (Device.clipboard.enable) {\n // copy to clipboard, using cordova\n Device.clipboard.copy(value)\n .then(function(){\n UIUtils.toast.show('INFO.COPY_TO_CLIPBOARD_DONE');\n })\n .catch(UIUtils.onError('ERROR.COPY_CLIPBOARD'));\n }\n else {\n\n var rows = value && value.indexOf('\\n') >= 0 ? value.split('\\n').length : 1;\n UIUtils.popover.show(event, {\n scope: scope,\n templateUrl: 'templates/common/popover_copy.html',\n bindings: {\n value: attrs.copyOnClick,\n rows: rows,\n copied: false\n },\n autoselect: '.popover-copy ' + (rows <= 1 ? 'input' : 'textarea'),\n\n // After popover, try to copy the selection\n afterShow: document.execCommand ? function(popover) {\n try {\n document.execCommand(\"copy\");\n UIUtils.toast.show('INFO.COPY_TO_CLIPBOARD_DONE', 1000);\n } catch (err) {\n console.error(\"[copy-on-click] Failed to copy using document.execCommand('copy')\", err);\n }\n } : undefined\n });\n }\n\n };\n element.bind('click', showCopyPopover);\n element.bind('hold', showCopyPopover);\n }\n };\n }])\n\n // Add a select-on-click directive\n .directive('selectOnClick', ['$window', function ($window) {\n 'ngInject';\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.bind('click', function () {\n if ($window.getSelection && !$window.getSelection().toString() && this.value) {\n this.setSelectionRange(0, this.value.length);\n }\n });\n }\n };\n }])\n\n .directive('activeLink', ['$location', function ($location) {\n 'ngInject';\n return {\n restrict: 'A',\n link: function(scope, element, attrs, controller) {\n var clazz = attrs.activeLink;\n var path;\n if (attrs.activeLinkPathPrefix) {\n path = attrs.activeLinkPathPrefix.substring(1); //hack because path does not return including hashbang\n scope.location = $location;\n scope.$watch('location.path()', function (newPath) {\n if (newPath && newPath.indexOf(path) === 0) {\n element.addClass(clazz);\n } else {\n element.removeClass(clazz);\n }\n });\n }\n else if (attrs.href) {\n path = attrs.href.substring(1); //hack because path does not return including hashbang\n scope.location = $location;\n scope.$watch('location.path()', function (newPath) {\n if (newPath && newPath == path) {\n element.addClass(clazz);\n } else {\n element.removeClass(clazz);\n }\n });\n }\n }\n };\n }])\n\n // All this does is allow the message\n // to be sent when you tap return\n .directive('input', ['$timeout', function($timeout) {\n return {\n restrict: 'E',\n scope: {\n 'returnClose': '=',\n 'onReturn': '&',\n 'onFocus': '&',\n 'onBlur': '&'\n },\n link: function(scope, element, attr) {\n element.bind('focus', function(e) {\n if (scope.onFocus) {\n $timeout(function() {\n scope.onFocus();\n });\n }\n });\n element.bind('blur', function(e) {\n if (scope.onBlur) {\n $timeout(function() {\n scope.onBlur();\n });\n }\n });\n element.bind('keydown', function(e) {\n if (e.which == 13) {\n if (scope.returnClose) element[0].blur();\n if (scope.onReturn) {\n $timeout(function() {\n scope.onReturn();\n });\n }\n }\n });\n }\n };\n }])\n\n .directive('trustAsHtml', ['$sce', '$compile', '$parse', function($sce, $compile, $parse){\n return {\n restrict: 'A',\n compile: function (tElement, tAttrs) {\n var ngBindHtmlGetter = $parse(tAttrs.trustAsHtml);\n var ngBindHtmlWatch = $parse(tAttrs.trustAsHtml, function getStringValue(value) {\n return (value || '').toString();\n });\n $compile.$$addBindingClass(tElement);\n\n return function ngBindHtmlLink(scope, element, attr) {\n $compile.$$addBindingInfo(element, attr.trustAsHtml);\n\n scope.$watch(ngBindHtmlWatch, function ngBindHtmlWatchAction() {\n // we re-evaluate the expr because we want a TrustedValueHolderType\n // for $sce, not a string\n element.html($sce.getTrustedHtml($sce.trustAsHtml(ngBindHtmlGetter(scope))) || '');\n $compile(element.contents())(scope);\n });\n };\n }\n };\n }])\n\n /**\n * Close the current modal\n */\n .directive('modalClose', ['$ionicHistory', '$timeout', function($ionicHistory, $timeout) {\n return {\n restrict: 'AC',\n link: function($scope, $element) {\n $element.bind('click', function() {\n if ($scope.closeModal) {\n $ionicHistory.nextViewOptions({\n historyRoot: true,\n disableAnimate: true,\n expire: 300\n });\n // if no transition in 300ms, reset nextViewOptions\n // the expire should take care of it, but will be cancelled in some\n // cases. This directive is an exception to the rules of history.js\n $timeout( function() {\n $ionicHistory.nextViewOptions({\n historyRoot: false,\n disableAnimate: false\n });\n }, 300);\n $scope.closeModal();\n }\n });\n }\n };\n }])\n\n /**\n * Plugin extension point (see services/plugin-services.js)\n */\n .directive('csExtensionPoint', ['$state', '$compile', '$controller', '$templateCache', 'PluginService', function ($state, $compile, $controller, $templateCache, PluginService) {\n var getTemplate = function(extensionPoint) {\n var template = extensionPoint.templateUrl ? $templateCache.get(extensionPoint.templateUrl) : extensionPoint.template;\n if (!template) {\n console.error('[plugin] Could not found template for extension :' + (extensionPoint.templateUrl ? extensionPoint.templateUrl : extensionPoint.template));\n return '';\n }\n if (extensionPoint.controller) {\n template = '<ng-controller ng-controller=\"'+extensionPoint.controller+'\">' + template + '</div>';\n }\n return template;\n };\n\n var compiler = function(tElement, tAttributes) {\n\n if (angular.isDefined(tAttributes.name)) {\n var extensionPoints = PluginService.extensions.points.getActivesByName(tAttributes.name);\n if (extensionPoints.length > 0) {\n tElement.html(\"\");\n _.forEach(extensionPoints, function(extensionPoint){\n tElement.append(getTemplate(extensionPoint));\n });\n }\n }\n\n return {\n pre: function(scope, iElement, iAttrs){\n PluginService.extensions.points.current.set(iAttrs.name);\n },\n post: function(){\n PluginService.extensions.points.current.set();\n }\n };\n };\n\n\n return {\n restrict: \"E\",\n compile: compiler,\n scope: {\n content:'='\n }\n };\n }])\n\n .directive('onReadFile', ['$parse', function ($parse) {\n return {\n restrict: 'A',\n scope: false,\n link: function(scope, element, attrs) {\n var fn = $parse(attrs.onReadFile);\n\n element.on('change', function(onChangeEvent) {\n var reader = new FileReader();\n var fileData = {\n name: this.files[0].name,\n size: this.files[0].size,\n type: this.files[0].type\n };\n\n reader.onload = function(onLoadEvent) {\n scope.$applyAsync(function() {\n fn(scope, {\n file: {\n fileContent: onLoadEvent.target.result,\n fileData : fileData}\n });\n });\n };\n reader.readAsText((onChangeEvent.srcElement || onChangeEvent.target).files[0]);\n });\n }\n };\n }])\n\n.directive(\"dropZone\", ['$parse', function($parse) {\n return {\n restrict: 'A',\n scope: false,\n link: function(scope, elem, attrs) {\n var fn = $parse(attrs.dropZone);\n elem.bind('dragover', function (e) {\n e.stopPropagation();\n e.preventDefault();\n });\n elem.bind('dragenter', function(e) {\n e.stopPropagation();\n e.preventDefault();\n });\n elem.bind('dragleave', function(e) {\n e.stopPropagation();\n e.preventDefault();\n });\n elem.bind('drop', function(e) {\n e.stopPropagation();\n e.preventDefault();\n var file = e.dataTransfer.files[0];\n var fileData = {\n name: file.name,\n size: file.size,\n type: file.type\n };\n\n var reader = new FileReader();\n reader.onload = function(onLoadEvent) {\n scope.$apply(function () {\n fn(scope, {\n file: {\n file: file,\n fileContent: onLoadEvent.target.result,\n fileData : fileData}\n });\n });\n };\n reader.readAsText(e.dataTransfer.files[0]);\n });\n }\n };\n }])\n\n\n // See http://embed.plnkr.co/2vgnFe/\n .directive('fileSelect', ['$parse', function ($parse) {\n 'use strict';\n\n return {\n restrict: 'A',\n scope: false,\n template: '<input type=\"file\" style=\"display: none;\" />' +\n '<ng-transclude></ng-transclude>',\n transclude: true,\n link: function (scope, element, attrs) {\n var fn = $parse(attrs.fileSelect);\n\n var fileInput = element.children('input[file]');\n\n if (attrs.accept) {\n fileInput[0].accept = attrs.accept;\n }\n\n fileInput.on('change', function (onChangeEvent) {\n var reader = new FileReader();\n var file = this.files[0];\n var fileData = {\n name: file.name,\n size: file.size,\n type: file.type\n };\n\n reader.onload = function(onLoadEvent) {\n scope.$applyAsync(function() {\n fn(scope, {\n file: {\n file: file,\n fileContent: onLoadEvent.target.result,\n fileData : fileData}\n });\n\n // Reset the input file\n fileInput[0].value = '';\n\n });\n };\n reader.readAsText((onChangeEvent.srcElement || onChangeEvent.target).files[0]);\n });\n\n element.on('click', function () {\n fileInput[0].click();\n });\n }\n };\n }])\n;\n","// Cesium filters\nangular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalprecht.translate', 'cesium.translations'\n])\n\n .service('filterTranslations', ['$rootScope', 'csPlatform', 'csSettings', '$translate', function($rootScope, csPlatform, csSettings, $translate) {\n 'ngInject';\n\n var\n started = false,\n startPromise,\n that = this;\n\n // Update some translations, when locale changed\n function onLocaleChange() {\n console.debug('[filter] Loading translations for locale [{0}]'.format($translate.use()));\n return $translate(['COMMON.DATE_PATTERN', 'COMMON.DATE_SHORT_PATTERN', 'COMMON.UD'])\n .then(function(translations) {\n that.DATE_PATTERN = translations['COMMON.DATE_PATTERN'];\n if (that.DATE_PATTERN === 'COMMON.DATE_PATTERN') {\n that.DATE_PATTERN = 'YYYY-MM-DD HH:mm';\n }\n that.DATE_SHORT_PATTERN = translations['COMMON.DATE_SHORT_PATTERN'];\n if (that.DATE_SHORT_PATTERN === 'COMMON.DATE_SHORT_PATTERN') {\n that.DATE_SHORT_PATTERN = 'YYYY-MM-DD';\n }\n that.DATE_MONTH_YEAR_PATTERN = translations['COMMON.DATE_MONTH_YEAR_PATTERN'];\n if (that.DATE_MONTH_YEAR_PATTERN === 'COMMON.DATE_MONTH_YEAR_PATTERN') {\n that.DATE_MONTH_YEAR_PATTERN = 'MMM YY';\n }\n\n that.UD = translations['COMMON.UD'];\n if (that.UD === 'COMMON.UD') {\n that.UD = 'UD';\n }\n });\n }\n\n that.ready = function() {\n if (started) return $q.when(data);\n return startPromise || that.start();\n };\n\n that.start = function() {\n startPromise = csPlatform.ready()\n .then(onLocaleChange)\n .then(function() {\n started = true;\n\n csSettings.api.locale.on.changed($rootScope, onLocaleChange, this);\n });\n return startPromise;\n };\n\n // Default action\n that.start();\n\n return that;\n }])\n\n .filter('formatInteger', function() {\n return function(input) {\n return !input ? '0' : (input < 10000000 ? numeral(input).format('0,0') : numeral(input).format('0,0.000 a'));\n };\n })\n\n .filter('formatAmount', ['csConfig', 'csSettings', 'csCurrency', '$filter', function(csConfig, csSettings, csCurrency, $filter) {\n var minValue = 1 / Math.pow(10, csConfig.decimalCount || 2);\n var format = '0,0.0' + Array(csConfig.decimalCount || 2).join('0');\n var currencySymbol = $filter('currencySymbol');\n\n function formatRelative(input, options) {\n var currentUD = options && options.currentUD ? options.currentUD : csCurrency.data.currentUD;\n if (!currentUD) {\n console.warn(\"formatAmount: currentUD not defined\");\n return;\n }\n var amount = input / currentUD;\n if (Math.abs(amount) < minValue && input !== 0) {\n amount = '~ 0';\n }\n else {\n amount = numeral(amount).format(format);\n }\n if (options && options.currency) {\n return amount + ' ' + currencySymbol(options.currency, true);\n }\n return amount;\n }\n\n function formatQuantitative(input, options) {\n var amount = numeral(input/100).format((input > -1000000000 && input < 1000000000) ? '0,0.00' : '0,0.000 a');\n if (options && options.currency) {\n return amount + ' ' + currencySymbol(options.currency, false);\n }\n return amount;\n }\n\n return function(input, options) {\n if (input === undefined) return;\n return (options && angular.isDefined(options.useRelative) ? options.useRelative : csSettings.data.useRelative) ?\n formatRelative(input, options) :\n formatQuantitative(input, options);\n };\n }])\n\n .filter('formatAmountNoHtml', ['csConfig', 'csSettings', 'csCurrency', '$filter', function(csConfig, csSettings, csCurrency, $filter) {\n var minValue = 1 / Math.pow(10, csConfig.decimalCount || 2);\n var format = '0,0.0' + Array(csConfig.decimalCount || 2).join('0');\n var currencySymbol = $filter('currencySymbolNoHtml');\n\n function formatRelative(input, options) {\n var currentUD = options && options.currentUD ? options.currentUD : csCurrency.data.currentUD;\n if (!currentUD) {\n console.warn(\"formatAmount: currentUD not defined\");\n return;\n }\n var amount = input / currentUD;\n if (Math.abs(amount) < minValue && input !== 0) {\n amount = '~ 0';\n }\n else {\n amount = numeral(amount).format(format);\n }\n if (options && options.currency) {\n return amount + ' ' + currencySymbol(options.currency, true);\n }\n return amount;\n }\n\n function formatQuantitative(input, options) {\n var amount = numeral(input/100).format((input > -1000000000 && input < 1000000000) ? '0,0.00' : '0,0.000 a');\n if (options && options.currency) {\n return amount + ' ' + currencySymbol(options.currency, false);\n }\n return amount;\n }\n\n return function(input, options) {\n if (input === undefined) return;\n return (options && angular.isDefined(options.useRelative) ? options.useRelative : csSettings.data.useRelative) ?\n formatRelative(input, options) :\n formatQuantitative(input, options);\n };\n }])\n\n\n .filter('currencySymbol', ['filterTranslations', '$filter', 'csSettings', function(filterTranslations, $filter, csSettings) {\n return function(input, useRelative) {\n if (!input) return '';\n return (angular.isDefined(useRelative) ? useRelative : csSettings.data.useRelative) ?\n (filterTranslations.UD + '<sub>' + $filter('abbreviate')(input) + '</sub>') :\n $filter('abbreviate')(input);\n };\n }])\n\n .filter('currencySymbolNoHtml', ['filterTranslations', '$filter', 'csSettings', function(filterTranslations, $filter, csSettings) {\n return function(input, useRelative) {\n if (!input) return '';\n return (angular.isDefined(useRelative) ? useRelative : csSettings.data.useRelative) ?\n (filterTranslations.UD + ' ' + $filter('abbreviate')(input)) :\n $filter('abbreviate')(input);\n };\n }])\n\n\n .filter('formatDecimal', ['csConfig', 'csCurrency', function(csConfig, csCurrency) {\n var minValue = 1 / Math.pow(10, csConfig.decimalCount || 2);\n var format = '0,0.0' + Array(csConfig.decimalCount || 2).join('0');\n\n return function(input) {\n if (input === undefined) return '0';\n if (input === Infinity || input === -Infinity) {\n console.warn(\"formatDecimal: division by zero ? (is currentUD defined ?) = \" + csCurrency.data.currentUD);\n return 'error';\n }\n if (Math.abs(input) < minValue) return '~ 0';\n return numeral(input/*-0.00005*/).format(format);\n };\n }])\n\n .filter('formatNumeral', function() {\n return function(input, pattern) {\n if (input === undefined) return '0';\n // for DEBUG only\n //if (isNaN(input)) {\n // return 'NaN';\n //}\n if (Math.abs(input) < 0.0001) return '~ 0';\n return numeral(input).format(pattern);\n };\n })\n\n .filter('formatDate', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm') : '';\n };\n }])\n\n .filter('formatDateShort', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_SHORT_PATTERN || 'YYYY-MM-DD') : '';\n };\n }])\n\n .filter('formatDateMonth', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_MONTH_YEAR_PATTERN || 'MMM YY') : '';\n };\n }])\n\n .filter('formatDateForFile', ['filterTranslations', function(filterTranslations) {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_FILE_PATTERN || 'YYYY-MM-DD') : '';\n };\n }])\n\n .filter('formatTime', function() {\n return function(input) {\n return input ? moment.unix(parseInt(input)).local().format('HH:mm') : '';\n };\n })\n\n .filter('formatFromNow', function() {\n return function(input) {\n return input ? moment.unix(parseInt(input)).fromNow() : '';\n };\n })\n\n\n .filter('formatDurationTo', function() {\n return function(input) {\n return input ? moment.unix(moment().utc().unix() + parseInt(input)).fromNow() : '';\n };\n })\n\n .filter('formatDuration', function() {\n return function(input) {\n return input ? moment(0).from(moment.unix(parseInt(input)), true) : '';\n };\n })\n\n // Display time in ms or seconds (see i18n label 'COMMON.EXECUTION_TIME')\n .filter('formatDurationMs', function() {\n return function(input) {\n return input ? (\n (input < 1000) ?\n (input + 'ms') :\n (input/1000 + 's')\n ) : '';\n };\n })\n\n .filter('formatPeriod', function() {\n return function(input) {\n if (!input) {return null;}\n var duration = moment(0).from(moment.unix(parseInt(input)), true);\n return duration.split(' ').slice(-1)[0]; // keep only last words (e.g. remove \"un\" \"a\"...)\n };\n })\n\n .filter('formatFromNowShort', function() {\n return function(input) {\n return input ? moment.unix(parseInt(input)).fromNow(true) : '';\n };\n })\n\n .filter('capitalize', function() {\n return function(input) {\n if (!input) return '';\n input = input.toLowerCase();\n return input.substring(0,1).toUpperCase()+input.substring(1);\n };\n })\n\n .filter('abbreviate', function() {\n var _cache = {};\n return function(input) {\n var currency = input || '';\n if (_cache[currency]) return _cache[currency];\n if (currency.length > 3) {\n var unit = '', sepChars = ['-', '_', ' '];\n for (var i = 0; i < currency.length; i++) {\n var c = currency[i];\n if (i === 0) {\n unit = (c === 'g' || c === 'G') ? 'Ğ' : c ;\n }\n else if (i > 0 && sepChars.indexOf(currency[i-1]) != -1) {\n unit += c;\n }\n }\n currency = unit.toUpperCase();\n }\n else {\n currency = currency.toUpperCase();\n if (currency.charAt(0) === 'G') {\n currency = 'Ğ' + (currency.length > 1 ? currency.substr(1) : '');\n }\n }\n\n _cache[input] = currency;\n return currency;\n };\n })\n\n .filter('upper', function() {\n return function(input) {\n if (!input) return '';\n return input.toUpperCase();\n };\n })\n\n .filter('formatPubkey', function() {\n return function(input) {\n return input ? input.substr(0,8) : '';\n };\n })\n\n .filter('formatHash', function() {\n return function(input) {\n return input ? input.substr(0,4) + input.substr(input.length-4) : '';\n };\n })\n\n .filter('formatCategory', function() {\n return function(input) {\n return input && input.length > 28 ? input.substr(0,25)+'...' : input;\n };\n })\n\n // Convert to user friendly URL (e.g. \"Like - This\" -> \"like-this\")\n .filter('formatSlug', function() {\n return function(input) {\n return input ? encodeURIComponent(input\n .toLowerCase()\n .replace(/<[^>]+>/g,'') // Remove tag (like HTML tag)\n .replace(/[^\\w ]+/g,'')\n .replace(/ +/g,'-'))\n : '';\n };\n })\n\n // Convert a URI into parameter (e.g. \"http://hos/path\" -> \"http%3A%2F%2Fhost%2Fpath\")\n .filter('formatEncodeURI', function() {\n return function(input) {\n return input ? encodeURIComponent(input): '';\n };\n })\n\n .filter('truncText', function() {\n return function(input, size) {\n size = size || 500;\n return !input || input.length <= size ? input : (input.substr(0, size) + '...');\n };\n })\n\n .filter('truncUrl', function() {\n return function(input, size) {\n size = size || 25;\n var startIndex = input && (input.startsWith('http://') ? 7 : (input.startsWith('https://') ? 8 : 0)) || 0;\n startIndex = input.startsWith('www.', startIndex) ? startIndex + 4 : startIndex;\n return !input || (input.length-startIndex) <= size ? input.substr(startIndex) : (input.substr(startIndex, size) + '...');\n };\n })\n\n .filter('trustAsHtml', ['$sce', function($sce) {\n return function(html) {\n return $sce.trustAsHtml(html);\n };\n }])\n\n /**\n * Remove tag (like HTML tag)\n */\n .filter('noHtml', function() {\n return function(html) {\n return html ? html.trim().replace(/<[^>]+>/g,'') : '';\n };\n })\n\n;\n"]}