{"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= 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, '
');\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('', '').replace('', ''); // 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 -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 \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,
...)\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(' ');\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 '' + defaultName + '';\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: '© OpenStreetMap'\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 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})
{0}'.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: '

' + (message || translations['ERROR.UNKNOWN_ERROR']) + '

',\n title: translations['ERROR.POPUP_TITLE'],\n subTitle: subtitle && translations[subtitle] || undefined,\n buttons: [\n {\n text: ''+translations['COMMON.BTN_OK']+'',\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: '

' + translations[message] + '

',\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 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 <= 1) ? 50 : rows*22}}px\"><ion-content scroll=\"false\"><div class=\"list\"><div class=\"item item-input\"><input type=\"text\" ng-if=\"!rows || rows <= 1\" ng-model=\"value\"> <textarea ng-if=\"rows && rows > 1\" ng-model=\"value\" rows=\"{{rows}}\" cols=\"10\">\\n </textarea></div></div></ion-content></ion-popover-view>');\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> </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}}&title={{postMessage|formatEncodeURI}}\" onclick=\"window.open(this.href, \\'facebook-share\\',\\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\\');return false;\" title=\"{{\\'COMMON.POPOVER_SHARE.SHARE_ON_FACEBOOK\\'|translate}}\"></a> <a class=\"button button-icon positive icon ion-social-twitter\" href=\"https://twitter.com/intent/tweet?url={{postUrl|formatEncodeURI}}&text={{postMessage|formatEncodeURI}}\" onclick=\"window.open(this.href, \\'twitter-share\\',\\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\\');return false;\" title=\"{{\\'COMMON.POPOVER_SHARE.SHARE_ON_TWITTER\\'|translate}}\"></a> <a class=\"button button-icon positive icon ion-social-diaspora\" href=\"https://sharetodiaspora.github.io/?title={{postMessage|formatEncodeURI}}&url={{postUrl|formatEncodeURI}}\" onclick=\"window.open(this.href, \\'diaspora-share\\',\\'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=580,height=296\\');return false;\" title=\"{{\\'COMMON.POPOVER_SHARE.SHARE_ON_DIASPORA\\'|translate}}\"></a> <a class=\"button button-icon positive icon ion-social-mastodon\" ng-click=\"shareOnMastodon()\" title=\"{{\\'COMMON.POPOVER_SHARE.SHARE_ON_MASTODON\\'|translate}}\"></a> <a class=\"button-close\" title=\"{{\\'COMMON.BTN_CLOSE\\'|translate}}\" ng-click=\"closePopover()\"><i class=\"icon ion-close\"></i></a></div></div></ion-content></ion-popover-view>');\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}\"> </div><div class=\"col text-center main-column\"><div class=\"logo\"></div><p class=\"hidden-xs\"> </p><div class=\"main-content center padding light-bg\"><h4><span class=\"hidden-xs\" translate>HOME.MESSAGE</span> <span ng-show=\"!loading\" ng-bind-html=\"\\'HOME.MESSAGE_CURRENCY\\'|translate:{currency: $root.currency.name}\"></span></h4><br class=\"hidden-xs\"><div class=\"center padding\" ng-if=\"loading\"><ion-spinner icon=\"android\"></ion-spinner></div><div class=\"animate-fade-in animate-show-hide ng-hide\" ng-show=\"!loading && error\"><div class=\"card card-item padding\"><p class=\"item-content item-text-wrap\"><span class=\"dark\" trust-as-html=\"\\'HOME.CONNECTION_ERROR\\'|translate:node\"></span></p><button type=\"button\" class=\"button button-positive icon icon-left ion-refresh ink\" ng-click=\"reload()\">{{:locale:\\'COMMON.BTN_REFRESH\\'|translate}}</button></div></div><div class=\"center animate-fade-in animate-show-hide ng-hide\" ng-show=\"!loading && !error\"><cs-extension-point name=\"buttons\"></cs-extension-point><button type=\"button\" class=\"button button-block button-positive button-raised icon ink-dark\" ng-click=\"showJoinModal()\" ng-if=\"!login\" translate>LOGIN.CREATE_FREE_ACCOUNT</button> <button type=\"button\" class=\"button button-block button-positive button-raised icon icon-left ion-person ink-dark\" ui-sref=\"app.view_wallet\" ng-show=\"login\" translate>MENU.ACCOUNT</button><br class=\"visible-xs visible-sm\"><div class=\"text-center no-padding\" ng-show=\"!login\"><br class=\"visible-xs visible-sm\">{{\\'LOGIN.HAVE_ACCOUNT_QUESTION\\'|translate}} <b><a class=\"positive hidden-xs hidden-sm\" ng-click=\"loginAndGo(\\'app.view_wallet\\')\" translate>COMMON.BTN_LOGIN</a></b></div><div class=\"text-center no-padding hidden-xs hidden-sm\" ng-show=\"login\"><span class=\"dark\" ng-bind-html=\"\\'HOME.NOT_YOUR_ACCOUNT_QUESTION\\'|translate:$root.walletData\"></span><br><b><a class=\"assertive\" ng-click=\"logout()\" translate>HOME.BTN_CHANGE_ACCOUNT</a></b></div><button type=\"button\" class=\"button button-block button-stable button-raised ink visible-xs visible-sm\" ui-sref=\"app.view_wallet\" ng-if=\"!login\" translate>COMMON.BTN_LOGIN</button> <button type=\"button\" class=\"button button-block button-assertive button-raised icon icon-left ion-log-out ink-dark visible-xs visible-sm\" ng-click=\"logout()\" ng-if=\"login\" translate>COMMON.BTN_LOGOUT</button></div><br><div class=\"text-center no-padding visible-xs dark\"><br>{{:locale:\\'COMMON.APP_VERSION\\'|translate:{version: config.version} }} | <a href=\"#\" ng-click=\"showAboutModal()\" translate>HOME.BTN_ABOUT</a></div></div></div><div class=\"col col-lg-10 hidden-xs hidden-sm\" ng-class=\"{\\'col-30 no-padding\\': !feed, \\'col-15 no-padding\\': feed}\"> </div><div class=\"col col-30 no-padding\" ng-if=\"feed\"><div class=\"feed padding-horizontal no-padding-xs padding-top\"><h3 class=\"padding-left\"><i class=\"icon ion-speakerphone\"></i> {{feed.title}} <small><a ng-click=\"openLink($event, feed.home_page_url)\" class=\"gray\"><span translate>HOME.SHOW_ALL_FEED</span> <i class=\"icon ion-chevron-right\"></i></a></small></h3><div class=\"animate-show-hide ng-hide\" ng-show=\"feed\"><div ng-repeat=\"item in feed.items\" class=\"card padding no-margin-xs\"><div class=\"header\"><i ng-if=\"item.author.avatar\" class=\"avatar\" style=\"background-image: url({{item.author.avatar}});\"></i> <a ng-class=\"{\\'avatar-left-padding\\': item.author.avatar}\" class=\"author\" ng-click=\"item.author.url && openLink($event, item.author.url)\">{{item.author.name}} </a><a ng-if=\"item.time\" title=\"{{item.time|formatDate}}\" ng-click=\"openLink($event, item.url)\" class=\"item-note\"><small><i class=\"icon ion-clock\"></i> {{item.time|formatFromNow}}</small></a></div><h2 class=\"title feed-title\"><a ng-click=\"openLink($event, item.url)\">{{item.title}}</a></h2><div ng-if=\"item.content\" class=\"content feed-content\" trust-as-html=\"item.content\"></div><h4 class=\"card-footer feed-footer text-right positive-100\"><a ng-click=\"openLink($event, item.url)\"><span ng-if=\"item.truncated\" translate>HOME.READ_MORE</span> <span ng-if=\"!item.truncated\" translate>COMMON.BTN_SHOW</span> <i class=\"icon ion-chevron-right\"></i></a></h4></div></div></div></div></div><div class=\"row responsive-lg footer no-margin no-padding\"><div class=\"col no-padding no-margin\"><cs-extension-point name=\"footer-start\"></cs-extension-point></div><div class=\"col col-33 no-padding no-margin\"><cs-extension-point name=\"footer-end\"></cs-extension-point></div></div></ion-content></ion-view>');\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> {{$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> <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>  <div ng-if=\"formData.requirements.needRenew\"><br><button class=\"button button-raised button-stable ink\" ng-click=\"renewMembership()\"><span class=\"assertive\">{{:locale:\\'ACCOUNT.BTN_MEMBERSHIP_RENEW\\' | translate}}</span></button></div></div><div class=\"visible-xs visible-sm padding text-center\" ng-if=\"!loading\"><button class=\"button button-assertive button-small-padding ink\" ng-click=\"logout({askConfirm: true})\"><i class=\"icon ion-log-out\"></i> {{\\'COMMON.BTN_LOGOUT\\' | translate}}</button></div><div class=\"row no-padding\"><div class=\"col col-20 hidden-xs hidden-sm\"> </div><div class=\"col\"><div class=\"list\" ng-class=\"::motion.ionListClass\" ng-hide=\"loading\"><span class=\"item item-divider\" translate>WOT.GENERAL_DIVIDER</span><cs-extension-point name=\"general\"></cs-extension-point><cs-extension-point name=\"after-general\"></cs-extension-point></div></div><div class=\"col col-20 hidden-xs hidden-sm\"> </div></div></ion-content></ion-view>');\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}} </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)\">  </i></div></div><div class=\"item-input\"><i class=\"icon ion-search placeholder-icon\"></i> <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'WOT.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearch()\"> <input type=\"text\" class=\"hidden-xs hidden-sm\" id=\"{{wotSearchTextId}}\" placeholder=\"{{\\'WOT.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" on-return=\"doSearchText()\"><div class=\"helptip-anchor-center\"><a id=\"helptip-wot-search-text\"></a></div></div></div><div class=\"padding-top padding-xs\" style=\"display: block; height: 60px;\" ng-class=\"::{\\'hidden-xs\\': !showResultLabel}\"><div class=\"pull-left\" ng-if=\"!search.loading && showResultLabel\"><h4 ng-if=\"search.type==\\'newcomers\\'\" translate>WOT.LOOKUP.NEWCOMERS</h4><h4 ng-if=\"search.type==\\'text\\'\" translate>COMMON.RESULTS_LIST</h4></div><div class=\"pull-right hidden-xs hidden-sm\"><a ng-if=\"enableFilter\" class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': search.type==\\'newcomers\\'}\" ng-click=\"doGetNewcomers()\"><i class=\"icon ion-person-stalker\"></i> {{\\'WOT.LOOKUP.BTN_NEWCOMERS\\' | translate}} </a>    <button class=\"button button-small button-stable ink\" ng-click=\"doSearch()\">{{\\'COMMON.BTN_SEARCH\\' | translate}}</button> <button class=\"button button-small button-positive {{parameters.okType}} ink\" ng-if=\"::allowMultiple\" ng-disabled=\"!selection.length\" ng-click=\"next()\">{{parameters.okText||\\'COMMON.BTN_NEXT\\' | translate}}</button></div></div><div class=\"text-center\" ng-if=\"search.loading\"><p class=\"gray\" ng-if=\"::$root.currency.initPhase\" translate>WOT.SEARCH_INIT_PHASE_WARNING</p><ion-spinner icon=\"android\"></ion-spinner></div><ng-if ng-if=\"!search.loading\"><div class=\"assertive padding\" ng-if=\"!search.results.length\"><span ng-if=\"search.type==\\'text\\'\" translate>COMMON.SEARCH_NO_RESULT</span> <span ng-if=\"search.type==\\'newcomers\\'\" translate>WOT.LOOKUP.NO_NEWCOMERS</span></div><div ng-if=\"!allowMultiple\" class=\"list {{::motion.ionListClass}}\"><div ng-repeat=\"identity in search.results\" id=\"helptip-wot-search-result-{{$index}}\" class=\"item item-border-large item-avatar item-icon-right ink\" ng-click=\"::select(identity)\"><ng-include src=\"\\'templates/wot/identity.html\\'\"></ng-include><i class=\"icon ion-ios-arrow-right\"></i></div></div><div ng-if=\"::allowMultiple\" class=\"list {{::motion.ionListClass}}\"><ion-checkbox ng-repeat=\"identity in search.results\" ng-model=\"identity.checked\" class=\"item item-border-large item-avatar ink\" ng-click=\"toggleCheck($index, $event)\"><ng-include src=\"\\'templates/wot/identity.html\\'\"></ng-include></ion-checkbox></div><ion-infinite-scroll ng-if=\"search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"2%\"></ion-infinite-scroll></ng-if></div>');\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\"> </div><div class=\"col\"><div class=\"item item-divider item-tx\">{{\\'ACCOUNT.BALANCE_ACCOUNT\\'|translate}}<div class=\"badge badge-balanced\">{{balance|formatAmount}} <span ng-bind-html=\"$root.currency.name|currencySymbol\"></span></div></div><span class=\"item item-divider\" ng-if=\"!loading\">{{:locale:\\'ACCOUNT.LAST_TX\\'|translate}} <a id=\"helptip-wallet-tx\" style=\"position: relative; bottom: 0; right: 0px;\"> </a></span><div class=\"item item-tx item-icon-left\" ng-repeat=\"tx in history\" ng-include=\"\\'templates/wallet/item_tx.html\\'\"></div><div class=\"item item-text-wrap text-center\" ng-if=\"tx.fromTime > 0\"><p><a ng-click=\"showMoreTx()\">{{:locale:\\'ACCOUNT.SHOW_MORE_TX\\'|translate}}</a> <span class=\"gray\" translate=\"ACCOUNT.TX_FROM_DATE\" translate-values=\"{fromTime: tx.fromTime}\"></span> <span class=\"gray\">|</span> <a ng-click=\"showMoreTx(-1)\" translate>ACCOUNT.SHOW_ALL_TX</a></p></div></div><div class=\"col col-15 hidden-xs hidden-sm\"> </div></div></div></ion-content></ion-view>');\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\"> </div><div class=\"col list\" ng-class=\"::motion.ionListClass\" bind-notifier=\"{ rebind:loading}\"><span class=\"item item-divider\" translate>WOT.GENERAL_DIVIDER</span><div class=\"item item-text-wrap item-icon-left item-wallet-event assertive\" ng-repeat=\"event in :rebind:formData.events | filter: {type: \\'error\\'}\"><i class=\"icon ion-alert-circled\"></i> <span trust-as-html=\"event.message | translate:event.messageParams\"></span></div><cs-extension-point name=\"general\"></cs-extension-point><cs-extension-point name=\"after-general\"></cs-extension-point></div><div class=\"col col-20 hidden-xs hidden-sm\"> </div></div></ion-content></ion-view>');}]);","angular.module(\"cesium.translations\", []).config([\"$translateProvider\", function($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>  <b><i class=\\\"icon ion-person\\\"></i> user profiles</b>;<li>  <b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li>  <b><i class=\\\"icon ion-email\\\"></i> Private messages</b>.</ul><br/>They have been <b>disabled</b> in your settings.<br/><br/><b>Do you want to enable</b> these features?\"\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> {{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> {{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> {{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> {{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> like your profile\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> follows your activity\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> rated you ({{params[3]}} <i class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> asks you for a moderation on the profile: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> reported a profile to be deleted: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{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> {{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> {{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> {{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> {{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> {{name||params[1]}}</span> added a page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> updated the page: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> asks you for a moderation on the page: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> reported a page to be deleted: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>\"\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>  <b><i class=\\\"icon ion-person\\\"></i> user profiles</b>;<li>  <b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li>  <b><i class=\\\"icon ion-email\\\"></i> Private messages</b>.</ul><br/>They have been <b>disabled</b> in your settings.<br/><br/><b>Do you want to enable</b> these features?\"\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> {{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> {{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> {{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> {{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> like your profile\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> follows your activity\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> rated you ({{params[3]}} <i class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> asks you for a moderation on the profile: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> reported a profile to be deleted: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{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> {{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> {{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> {{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> {{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> {{name||params[1]}}</span> added a page: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> updated the page: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> asks you for a moderation on the page: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> reported a page to be deleted: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> has requested moderation on your page: <b>{{params[2]}}</b>\"\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>  <b><i class=\\\"icon ion-person\\\"></i> Profiloj Cesium+</b>;<li>  <b><i class=\\\"icon ion-android-notifications\\\"></i> Avizoj</b>;<li>  <b><i class=\\\"icon ion-email\\\"></i> Privataj mesaĝoj</b>.<li>  <b><i class=\\\"icon ion-location\\\"></i> Mapoj, ktp.</b>.</ul><br/><b>Ĉu vi deziras reaktivigi</b> la krom-programon?\"\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> {{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> {{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> {{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> {{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[2]}}</span> ŝatas vian profilon\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[2]}}</span> sekvas viajn agojn\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[2]}}</span> notis vin ({{params[3]}} <b class=\\\"ion-star\\\">)\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[2]}}</span> petas de vi moderigon pri la profilo: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[2]}}</span> atentigis pri profilo foriginda: <b>{{params[2]}}</b>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[2]}}</span> atentigis pri via profilo\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> komentis vian paĝon: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> modifis sian komenton ĉe via paĝo: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> respondis al via komento ĉe la paĝo: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> modifis sian respondon al via komento ĉe la paĝo: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{name||params[1]}}</span> aldonis la paĝon: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> modifis la paĝon: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> petas de vi moderigon pri la paĝo: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> atentigis pri paĝo foriginda: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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>  <b><i class=\\\"icon ion-person\\\"></i> Perfiles de usuario/a</b>;<li>  <b><i class=\\\"icon ion-android-notifications\\\"></i> Notificaciones</b>;<li>  <b><i class=\\\"icon ion-email\\\"></i> Mensajes privados</b>.</ul><br/><br/>¿<b>Desea re-activar</b> la extensión?\"\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> {{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> {{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> {{name||params[1]}}</span> ha reportardo su anuncio : <b>{{params[2]}}</b>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha reportado un anuncio para moderar : <b>{{params[2]}}</b>\",\n \"FOLLOW_CLOSE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha cerrado el anuncio : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{name||params[1]}}</span> ha comentado el anuncio : <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> sigue su anuncio : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{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> {{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> {{name||params[1]}}</span> ha comentado su anuncio : <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha modificado su comentario sobre su anuncio : <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha contestado a su comentario sobre el anuncio : <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ha modificado la repuesta a su comentario sobre el anuncio : <b>{{params[2]}}</b>\"\n },\n \"USER\": {\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[2]}}</span> ha reportado su perfil\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[2]}}</span> ha reportado un perfil a eliminar: <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[2]}}</span> sigue su actividad\",\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[2]}}</span> le gusta su perfil\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[2]}}</span> os pide una moderación sobre el perfil: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{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> {{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> {{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> {{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> {{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>  <b><i class=\\\"icon ion-person\\\"></i> Profils Cesium+</b>;<li>  <b><i class=\\\"icon ion-android-notifications\\\"></i> Notifications</b>;<li>  <b><i class=\\\"icon ion-email\\\"></i> Messages privés</b>.<li>  <b><i class=\\\"icon ion-location\\\"></i> Cartes, etc.</b>.</ul><br/><b>Souhaitez-vous ré-activer</b> l'extension ?\"\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> {{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> {{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> {{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> {{name||uid||params[1]}}</span>.\",\n \"USER\": {\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[2]}}</span> aime votre profil\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[2]}}</span> suit votre activité\",\n \"STAR_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{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> {{name||params[2]}}</span> a signalé votre profil\"\n },\n \"PAGE\": {\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a commenté votre page : <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a modifié son commentaire sur votre page : <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a répondu à votre commentaire sur la page : <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a modifié sa réponse à votre commentaire sur la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{name||params[1]}}</span> a ajouté la page : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a modifié la page : <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> vous demande une modération sur la page : <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a signalé une page à supprimer : <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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>  <b><i class=\\\"icon ion-person\\\"></i> Profile Cesium+</b>;<li>  <b><i class=\\\"icon ion-android-notifcaitions\\\"></i> Notifications</b>;<li>  <b><i class=\\\"icon ion-email\\\"></i> Privé berichten</b>.</ul><br/>Deze zijn <b>uitgeschakeld</b> in je instellingen.<br/><br/>Wil je deze functies <b>inschakelen</b>?\"\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> {{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> {{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> {{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> {{name||uid||params[1]}}</span>.\",\n \"REGISTRY\": {\n \"NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||uid||params[1]}}</span> heeft gereageerd op jouw referentie: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||uid||params[1]}}</span> heeft zijn/aar reactie op jouw referentie bewerkt: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||uid||params[1]}}</span> hheeft gereageerd op jouw commentaar op referentie: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||uid||params[1]}}</span> heeft zijn/haar reactie op jouw commentaar bewerkt, op referentie: <b>{{params[2]}}</b>\"\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> {{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> {{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> {{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> {{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> {{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> {{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> {{name||params[1]}}</span> added the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> updated the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_CLOSE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> sold the ad: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> asks for moderation on the ad: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{name||params[1]}}</span> liked your ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{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> {{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> {{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> {{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> {{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> {{name||params[1]}}</span> added the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> updated the ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_CLOSE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> sold the ad: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> asks for moderation on the ad: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{name||params[1]}}</span> liked your ad: <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{name||params[1]}}</span> komentis vian anoncon: <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> modifis sian komenton ĉe via anonco: <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> respondis al via komento ĉe la anonco: <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> modifis la respondon al via komento ĉe la anonco: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> komentis la anoncon: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> modifis sian komenton ĉe la anonco: <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> aldonis la anoncon: <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> modifis la anoncon: <b>{{params[2]}}</b>\",\n \"FOLLOW_CLOSE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> fermis la anoncon: <b>{{params[2]}}</b>\",\n \"MODERATION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> petas de vi moderigon ĉe la anonco: <b>{{params[2]}}</b><br/><b class=\\\"dark ion-quote\\\"> </b><span class=\\\"text-italic\\\">{{params[3]}}</span>\",\n \"DELETION_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> atentigis pri anonco moderiginda: <b>{{params[2]}}</b>\",\n \"ABUSE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> atentigis pri via anonco: <b>{{params[2]}}</b>\",\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> ŝatis vian anoncon: <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{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> {{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> {{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> {{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> {{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> {{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> {{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> {{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> {{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> {{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> {{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> {{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> {{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> {{name||params[1]}}</span> a commenté votre annonce : <b>{{params[2]}}</b>\",\n \"UPDATE_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a modifié son commentaire sur votre annonce : <b>{{params[2]}}</b>\",\n \"NEW_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a répondu à votre commentaire sur l'annonce : <b>{{params[2]}}</b>\",\n \"UPDATE_REPLY_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a modifié la réponse à votre commentaire sur l'annonce : <b>{{params[2]}}</b>\",\n \"FOLLOW_NEW_COMMENT\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{name||params[1]}}</span> a ajouté l'annonce : <b>{{params[2]}}</b>\",\n \"FOLLOW_UPDATE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a modifié l'annonce : <b>{{params[2]}}</b>\",\n \"FOLLOW_CLOSE\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{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> {{name||params[1]}}</span> a signalé votre annonce : <b>{{params[2]}}</b>\",\n \"LIKE_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{name||params[1]}}</span> a aimé votre annonce : <b>{{params[2]}}</b>\",\n \"FOLLOW_RECEIVED\": \"<span class=\\\"positive\\\"><i class=\\\"icon ion-person\\\"></i> {{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> {{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> {{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> {{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> {{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 > 1\" ng-click=\"socialData.reorder=!socialData.reorder\">\\n <span translate>PROFILE.BTN_REORDER</span>\\n </a>\\n </div>\\n</div>\\n\\n<ion-list show-reorder=\"socialData.reorder\">\\n\\n <ion-item class=\"item-icon-left item-social-edit done in\" type=\"no-padding item-text-wrap\" ng-if=\"formData.socials && formData.socials.length\" ng-repeat=\"social in formData.socials | filter:filterFn track by social.url\" id=\"social-{{social.url|formatSlug}}\">\\n <i class=\"icon ion-social-{{social.type}}\" ng-class=\"{\\'ion-bookmark\\': social.type === \\'other\\', \\'ion-link\\': social.type === \\'web\\', \\'ion-email\\': social.type === \\'email\\', \\'ion-iphone\\': social.type === \\'phone\\'}\"></i>\\n <p ng-if=\"social.type && social.type != \\'web\\'\">\\n {{social.type}}\\n <i class=\"ion-locked\" ng-if=\"social.recipient\"></i>\\n </p>\\n <h2>\\n <a href=\"{{social.url}}\" ng-if=\"social.type != \\'email\\' && social.type != \\'phone\\'\" target=\"_blank\">{{social.url}}</a>\\n <a href=\"mailto:{{social.url}}\" ng-if=\"social.type == \\'email\\'\">{{social.url}}</a>\\n <a href=\"tel:{{social.url}}\" ng-if=\"social.type == \\'phone\\'\">{{social.url}}</a>\\n <a class=\"gray hidden-device\" ng-if=\"!social.recipient && !socialData.reorder\" ng-click=\"formData.socials.splice($index, 1); dirty = true;\">\\n  <b class=\"ion ion-trash-a\"></b> \\n </a>\\n <a class=\"gray hidden-device\" ng-if=\"!social.recipient && !socialData.reorder\" ng-click=\"editSocialNetwork($index)\">\\n  <b class=\"ion ion-edit\"></b> \\n </a>\\n </h2>\\n <ion-option-button class=\"button-assertive\" ng-if=\"!social.recipient\" ng-click=\"formData.socials.splice($index, 1); dirty = true;\">\\n {{\\'COMMON.BTN_DELETE\\'|translate}}\\n </ion-option-button>\\n <ion-option-button class=\"button-info\" ng-if=\"!social.recipient\" ng-click=\"editSocialNetwork($index)\">\\n {{\\'COMMON.BTN_EDIT\\'|translate}}\\n </ion-option-button>\\n <ion-reorder-button class=\"ion-drag\" on-reorder=\"reorderSocialNetwork(social, $fromIndex, $toIndex)\">\\n </ion-reorder-button>\\n </ion-item>\\n</ion-list>\\n\\n<ion-list class=\"no-padding\">\\n <div class=\"item item-complex item-input-inset\">\\n <label class=\"item-input-wrapper\">\\n <input type=\"text\" style=\"width:100%\" placeholder=\"{{\\'PROFILE.SOCIAL_HELP\\'|translate}}\" id=\"socialUrl\" on-return=\"addSocialNetwork($event);\" ng-model=\"socialData.url\">\\n </label>\\n <button class=\"button button-small hidden-xs\" type=\"button\" ng-click=\"addSocialNetwork($event)\" translate>COMMON.BTN_ADD</button>\\n <button class=\"button button-small button-icon icon ion-android-add visible-xs\" type=\"button\" ng-click=\"addSocialNetwork($event)\">\\n </button>\\n </div>\\n\\n</ion-list>\\n');\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> \\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  <i class=\"icon ion-location\"></i>\\n {{search.location.split(\\',\\')[0]}}\\n <i class=\"icon ion-close\" ng-click=\"removeLocation()\">  </i>\\n </div>\\n\\n </div>\\n\\n <i class=\"icon ion-ios-location placeholder-icon\" ng-if=\"!search.geoPoint && !search.geoShape\"></i>\\n <input type=\"text\" ng-if=\"!search.geoPoint && !search.geoShape\" id=\"searchLocationInput\" autocomplete=\"off\" placeholder=\"{{(options.location.help||\\'LOCATION.SEARCH_HELP\\')|translate}}\" ng-model-options=\"{ debounce: 350 }\" ng-model=\"search.location\" ng-keydown=\"onKeydown($event)\" ng-change=\"onLocationChanged()\" ng-blur=\"hideDropdown()\">\\n\\n <a class=\"button button-clear button-small button-stable gray ink no-padding\" tabindex=\"-1\" ng-click=\"showDistancePopover($event)\">\\n <span>{{\\'COMMON.GEO_DISTANCE_OPTION\\' | translate: {value: search.geoDistance} }}</span>\\n  <b class=\"ion-arrow-down-b\" style=\"font-size: 12pt;\"></b>\\n </a>\\n\\n </div>\\n </div>\\n\\n <!-- 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\"> | </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\"> | </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> \\n </span>\\n <span ng-if=\"!canEdit\" class=\"hidden-xs\" ng-class=\"{\\'assertive\\': likeData.follows.wasHit, \\'positive\\': !likeData.follows.wasHit}\">\\n ({{likeData.follows.wasHit ? \\'COMMON.BTN_STOP_FOLLOW\\': \\'COMMON.BTN_FOLLOW\\' | translate }})\\n </span>\\n </a>\\n <span class=\"gray\" ng-if=\"likeData.abuses.total\"> | </span>\\n <a ng-if=\"likeData.abuses.total && !likeData.abuses.wasHit\" ng-click=\"!canEdit && reportAbuse($event)\" title=\"{{\\'COMMON.ABUSES_TEXT\\'|translate: likeData.abuses }}\">\\n {{likeData.abuses.total ||\\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  \\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\"> </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}} {{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\"> </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\"> \\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> <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  \\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> </h4>\\n </div>\\n <h4 class=\"content light\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </h4>\\n </div>\\n\\n <div class=\"row no-padding-xs\">\\n <div class=\"col col-20 hidden-xs hidden-sm\"> \\n </div>\\n\\n <div class=\"col list item-text-wrap no-padding-xs\" ng-class=\"motion.ionListClass\">\\n\\n <div class=\"item\">\\n <h2 class=\"gray\">\\n <a ng-if=\"formData.city\" ui-sref=\"app.groups({location:formData.city})\">\\n <i class=\"icon ion-location\"></i>\\n <span ng-bind-html=\"formData.city\"></span>\\n </a>\\n <span ng-if=\"formData.city && formData.type\"> | </span>\\n <a ng-if=\"formData.type\" ui-sref=\"app.groups({type:formData.type})\">\\n <i class=\"icon ion-flag\"></i>\\n {{\\'GROUP.TYPE.ENUM.\\'+formData.type|upper|translate}}\\n </a>\\n </h2>\\n <h4>\\n <i class=\"icon ion-clock\" ng-if=\"formData.time\"></i>\\n <span translate>COMMON.SUBMIT_BY</span>\\n <a ng-class=\"{\\'positive\\': issuer.name, \\'gray\\': !issuer.name}\" ui-sref=\"app.user_identity({pubkey:issuer.pubkey, name: issuer.name})\">\\n <ng-if ng-if=\"issuer.name\">\\n <i class=\"icon ion-person\"></i>\\n {{::issuer.name}}\\n </ng-if>\\n <span ng-if=\"!issuer.name\">\\n <i class=\"icon ion-key\"></i>\\n {{issuer.pubkey|formatPubkey}}\\n </span>\\n </a>\\n <span>\\n {{formData.time|formatFromNow}}\\n <h4 class=\"gray hidden-xs\">|\\n {{formData.time | formatDate}}\\n </h4>\\n </span>\\n </h4>\\n </div>\\n\\n <!-- 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\"> \\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> {{destUid}}</span> \\n <i class=\"gray icon ion-ios-arrow-right\"></i>\\n </a>\\n <div class=\"form-errors\" ng-if=\"form.$submitted && !formData.destPub\">\\n <div class=\"form-error\">\\n <span translate=\"ERROR.FIELD_REQUIRED\"></span>\\n </div>\\n </div>\\n\\n <div class=\"item item-text-wrap\">\\n <span class=\"gray\" translate>TRANSFER.FROM</span>\\n <span class=\"badge badge-balanced\">\\n <ion-spinner icon=\"android\" ng-if=\"!$root.walletData.pubkey\"></ion-spinner>\\n <span ng-if=\"$root.walletData.pubkey && !$root.walletData.name\">\\n {{$root.walletData.pubkey| formatPubkey}}  \\n </span>\\n <span ng-if=\"$root.walletData.pubkey && $root.walletData.name\">\\n {{$root.walletData.name}}\\n </span>\\n </span>\\n </div>\\n\\n <!-- 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\"> </div>\\n <div class=\"col\">\\n <h2 class=\"hidden-xs hidden-sm\">\\n {{\\'MESSAGE.COMPOSE.SUB_TITLE\\'|translate}}\\n </h2>\\n <h4 class=\"hidden-xs hidden-sm\"> </h4>\\n <ng-include src=\"\\'plugins/es/templates/message/compose_form.html\\'\"></ng-include>\\n </div>\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n </div>\\n </ion-content>\\n</ion-view>\\n');\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   <i class=\"icon ion-android-more-vertical\"></i> \\n {{\\'COMMON.BTN_OPTIONS\\' | translate}}\\n </button>\\n </div>\\n\\n <div class=\"pull-right hidden-xs hidden-sm\">\\n <a class=\"button button-text button-small ink icon ion-archive\" ng-class=\"{\\'button-text-positive\\': type==\\'inbox\\'}\" ng-click=\"setType(\\'inbox\\')\">\\n {{\\'MESSAGE.LIST.INBOX\\' | translate}}\\n </a>\\n  \\n <a class=\"button button-text button-small ink icon ion-paper-airplane\" ng-class=\"{\\'button-text-positive\\': type==\\'outbox\\'}\" ng-click=\"setType(\\'outbox\\')\" class=\"badge-balanced\">\\n {{\\'MESSAGE.LIST.OUTBOX\\' | translate}}\\n </a>\\n </div>\\n\\n <div class=\"center padding\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n </ion-list>\\n\\n <ion-list class=\"{{::motion.ionListClass}}\" can-swipe=\"$root.device.enable\" ng-hide=\"loading\">\\n\\n <div class=\"padding gray\" ng-if=\"!messages.length\">\\n <span ng-if=\"type==\\'inbox\\'\" translate>MESSAGE.NO_MESSAGE_INBOX</span>\\n <span ng-if=\"type==\\'outbox\\'\" translate>MESSAGE.NO_MESSAGE_OUTBOX</span>\\n </div>\\n\\n <ion-item class=\"item item-border-large item-avatar item-icon-right ink\" ng-repeat=\"msg in messages\" ui-sref=\"app.user_view_message({type:type, id:msg.id})\">\\n\\n <i ng-if=\"::!msg.avatar\" class=\"item-image icon\" ng-class=\"{\\'ion-person\\': msg.name, \\'ion-email\\': !msg.name}\"></i>\\n <i ng-if=\"::msg.avatar\" class=\"item-image avatar\" style=\"background-image: url({{::msg.avatar.src}})\"></i>\\n\\n <h4 class=\"pull-right hidden-xs hidden-sm\">\\n <span class=\"dark\"><i class=\"ion-clock\"></i> {{::msg.time|formatFromNow}}</span>\\n <span class=\"gray\">| {{::msg.time|formatDate}}</span>\\n </h4>\\n <h4 class=\"pull-right visible-xs visible-sm dark\"><i class=\"ion-clock\"></i> {{::msg.time|formatFromNow}}</h4>\\n <h3>\\n <a class=\"positive\" ng-if=\"::msg.name\" ui-sref=\"app.user_identity({pubkey:msg.issuer, name:msg.name})\">\\n <i class=\"ion-person\"></i>\\n {{::msg.name}}\\n </a>\\n <a class=\"gray\" ng-if=\"::!msg.name\" ui-sref=\"app.user_identity({pubkey:msg.issuer})\">\\n <i class=\"ion-key\"></i>\\n {{::msg.issuer|formatPubkey}}\\n </a>\\n </h3>\\n <h2 ng-class=\"{\\'unread\\': !msg.read}\">{{::msg.title}}</h2>\\n <p>{{::msg.summary||msg.content}}</p>\\n <i class=\"icon ion-ios-arrow-right\"></i>\\n <ion-option-button class=\"button-stable\" ng-click=\"showReplyModal($index)\" translate>MESSAGE.BTN_REPLY</ion-option-button>\\n <ion-option-button class=\"button-assertive\" ng-click=\"delete($index)\" translate>COMMON.BTN_DELETE</ion-option-button>\\n\\n </ion-item>\\n </ion-list>\\n </ion-content>\\n\\n <button id=\"fab-add-message-record\" class=\"button button-fab button-fab-bottom-right button-assertive icon ion-compose visible-xs visible-sm spin\" ng-click=\"showNewMessageModal()\">\\n </button>\\n</ion-view>\\n');\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> {{::notification.name}}</span>\\n <span class=\"gray\" ng-if=\"::!notification.name\"><i class=\"ion-key\"></i> {{::notification.issuer|formatPubkey}}</span>\\n </h3>\\n <h4>\\n <i class=\"icon ion-archive balanced\"></i> <span class=\"dark\">{{notification.time|formatFromNow}}</span>\\n <span class=\"gray\">| {{::notification.time|formatDate}}</span>\\n </h4>\\n </ion-item>\\n </ion-list>\\n\\n <ion-infinite-scroll ng-if=\"!search.loading && search.hasMore\" spinner=\"android\" on-infinite=\"showMore()\" distance=\"1%\">\\n </ion-infinite-scroll>\\n </ion-content>\\n\\n <ion-footer-bar class=\"stable-bg block\">\\n\\n <!-- 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\"> </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\"> </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> \\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 <= 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\"> \\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\"> \\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> <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\"> </div>\\n\\n <div class=\"col\">\\n\\n <div class=\"center\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"padding gray\" ng-if=\"!search.loading && !search.results.length\" translate>\\n COMMON.NOTIFICATIONS.NO_RESULT\\n </div>\\n\\n <ng-include src=\"\\'plugins/es/templates/notification/list_notification.html\\'\"></ng-include>\\n\\n\\n </div>\\n\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n\\n </div>\\n\\n </ion-content>\\n\\n</ion-view>\\n');\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\"> </div>\\n\\n <div class=\"col no-padding-xs\">\\n\\n <form name=\"recordForm\" novalidate=\"\" ng-submit=\"save()\">\\n <div class=\"list {{::motion.ionListClass}}\" ng-init=\"setForm(recordForm)\">\\n <div class=\"item\" ng-if=\"id\">\\n <h4 class=\"gray\">\\n <i class=\"icon ion-calendar\"></i>\\n {{\\'COMMON.LAST_MODIFICATION_DATE\\'|translate}} {{formData.time | formatDate}}\\n </h4>\\n <div class=\"badge badge-balanced badge-editable\" ng-click=\"showRecordTypeModal()\">\\n {{\\'REGISTRY.TYPE.ENUM.\\'+formData.type|upper|translate}}\\n </div>\\n </div>\\n\\n <!-- 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> \\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\"> </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}} <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  <i class=\"icon cion-page-{{search.type}}\"></i>\\n <span>{{\\'REGISTRY.TYPE.ENUM.\\'+search.type|uppercase|translate}}</span>\\n <i class=\"icon ion-close\" ng-click=\"removeType()\">  </i>\\n </div>\\n\\n <!-- selected category -->\\n <div ng-show=\"search.category.name\" class=\"button button-small button-text button-stable button-icon-event stable-900-bg\">\\n  <i class=\"icon ion-flag\"></i>\\n <span>{{search.category.name|truncText:40}}</span>\\n <i class=\"icon ion-close\" ng-click=\"removeCategory()\">  </i>\\n </div>\\n </div>\\n\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n <input type=\"text\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'REGISTRY.SEARCH.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 650 }\" ng-change=\"doSearch()\" on-return=\"doSearchText()\" select-on-click>\\n <input type=\"text\" class=\"hidden-xs hidden-sm\" placeholder=\"{{\\'REGISTRY.SEARCH.SEARCH_HELP\\'|translate}}\" id=\"registrySearchText\" ng-model=\"search.text\" on-return=\"doSearchText()\">\\n\\n <button type=\"button\" class=\"button button-icon button-small pull-left button-small-padding ink\" ng-if=\"search.text\" tabindex=\"-1\" ng-click=\"removeText()\">\\n <i class=\"gray ion-close\"></i>\\n </button>\\n </div>\\n </div>\\n\\n </div>\\n\\n <!-- 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  \\n\\n </div>\\n\\n <div class=\"pull-right\">\\n\\n <a ng-if=\"enableFilter\" class=\"button button-text button-small ink\" ng-class=\"{\\'button-text-positive\\': search.lastRecords}\" ng-click=\"doGetLastRecords()\">\\n <i class=\"icon ion-clock\"></i>\\n {{\\'REGISTRY.SEARCH.BTN_LAST_RECORDS\\' | translate}}\\n </a>\\n  \\n\\n <!-- Allow extension here -->\\n <cs-extension-point name=\"filter-buttons\"></cs-extension-point>\\n\\n  \\n\\n <button class=\"button button-small button-stable ink\" ng-click=\"doSearchText()\">\\n {{\\'COMMON.BTN_SEARCH\\' | translate}}\\n </button>\\n </div>\\n</div>\\n\\n<div class=\"padding-xs padding-sm\" style=\"display: block; height: 60px;\">\\n <div class=\"pull-left ng-hide\" ng-show=\"!search.loading\">\\n <ng-if ng-if=\"search.lastRecords\">\\n <h4 translate>REGISTRY.SEARCH.LAST_RECORDS</h4>\\n <small class=\"gray no-padding\" ng-if=\"search.total\">\\n <span ng-if=\"search.geoPoint && search.total\">{{\\'REGISTRY.SEARCH.LAST_RECORD_COUNT_LOCATION\\'|translate:{count: search.total, location: search.location} }}</span>\\n <span ng-if=\"!search.geoPoint && search.total\">{{\\'REGISTRY.SEARCH.LAST_RECORD_COUNT\\'|translate:{count: search.total} }}</span>\\n </small>\\n </ng-if>\\n\\n <ng-if ng-if=\"!search.lastRecords\">\\n <h4 translate>COMMON.RESULTS_LIST</h4>\\n <small class=\"gray no-padding\" ng-if=\"search.total\">\\n <span ng-if=\"search.geoPoint && search.total\">{{\\'REGISTRY.SEARCH.RESULT_COUNT_LOCATION\\'|translate:{count: search.total, location: search.location} }}</span>\\n <span ng-if=\"!search.geoPoint && search.total\">{{\\'REGISTRY.SEARCH.RESULT_COUNT\\'|translate:{count: search.total} }}</span>\\n </small>\\n </ng-if>\\n\\n </div>\\n\\n\\n <div class=\"pull-right ng-hide padding-top\" ng-show=\"!search.loading && search.total\">\\n <a class=\"button button-text button-small hidden-xs hidden-sm ink\" ng-class=\"{\\'button-text-positive\\': search.compactMode}\" ng-click=\"toggleCompactMode()\">\\n <i class=\"icon ion-navicon\"></i>\\n <b class=\"icon-secondary ion-arrow-down-b\" style=\"top: -8px; left: 5px; font-size: 8px;\"></b>\\n <b class=\"icon-secondary ion-arrow-up-b\" style=\"top: 3px; left: 5px; font-size: 8px;\"></b>\\n {{\\'DOCUMENT.LOOKUP.BTN_COMPACT\\' | translate}}\\n </a>\\n </div>\\n</div>\\n\\n<div class=\"center\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n</div>\\n\\n<div class=\"padding assertive\" ng-if=\"!search.loading && !search.results.length\" translate>\\n COMMON.SEARCH_NO_RESULT\\n</div>\\n');\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\"> </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\"> </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> </h4>\\n </div>\\n <h4 class=\"content dark\" ng-if=\"loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </h4>\\n <h4 class=\"content gray hidden-xs hidden-sm\" ng-if=\"formData.city\">\\n <i class=\"icon ion-location\"></i>\\n <span ng-bind-html=\"formData.city\"></span>\\n </h4>\\n </div>\\n\\n <div class=\"row no-padding-xs\">\\n <div class=\"col col-20 hidden-xs hidden-sm\"> \\n </div>\\n\\n <div class=\"col list animate-fade-slide-in item-text-wrap no-padding-xs\">\\n\\n <div class=\"item\">\\n <h2 class=\"gray\">\\n <a ng-if=\"formData.city\" ui-sref=\"app.registry_lookup({location:formData.city})\">\\n <i class=\"icon ion-location\"></i>\\n <span ng-bind-html=\"formData.city\"></span>\\n </a>\\n <span ng-if=\"formData.city && formData.type\"> | </span>\\n <a ng-if=\"formData.type\" ui-sref=\"app.registry_lookup({type:formData.type})\">\\n <i class=\"cion-page-{{formData.type}}\"></i>\\n {{\\'REGISTRY.TYPE.ENUM.\\'+formData.type|upper|translate}}\\n </a>\\n </h2>\\n <h4>\\n <i class=\"icon ion-clock\" ng-if=\"formData.time\"></i>\\n <span translate>COMMON.SUBMIT_BY</span>\\n <a ng-class=\"{\\'positive\\': issuer.name, \\'gray\\': !issuer.name}\" ui-sref=\"app.user_identity({pubkey:issuer.pubkey, name: issuer.name})\">\\n <ng-if ng-if=\"issuer.name\">\\n <i class=\"icon ion-person\"></i>\\n {{::issuer.name}}\\n </ng-if>\\n <span ng-if=\"!issuer.name\">\\n <i class=\"icon ion-key\"></i>\\n {{issuer.pubkey|formatPubkey}}\\n </span>\\n </a>\\n <span>\\n {{formData.time|formatFromNow}}\\n <h4 class=\"gray hidden-xs\">|\\n {{formData.time | formatDate}}\\n </h4>\\n </span>\\n </h4>\\n </div>\\n\\n <!-- 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\"> \\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\"> </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\"> </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\"> \\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   <i class=\"icon ion-android-more-vertical\"></i> \\n {{\\'COMMON.BTN_OPTIONS\\' | translate}}\\n </button>\\n </div>\\n\\n <form name=\"profileForm\" novalidate=\"\" ng-submit=\"saveAndClose()\">\\n\\n <div class=\"list item-text-wrap {{::motion.ionListClass}}\" ng-init=\"setForm(profileForm)\">\\n\\n <!-- 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\"> \\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 + \\' \\' : \\'\\'}}{{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\"> </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\"> </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\"> </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\"> \\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 > 1\" class=\"padding-top\">\\n <ng-repeat ng-repeat=\"country in countries\">\\n <span ng-if=\"$index\"> | </span>\\n <a ng-class=\"{\\'bold\\': country === selectedCountry}\" ng-click=\"onCountryChange(country)\">\\n {{countriesMap[country] || (country|uppercase) }}\\n </a>\\n </ng-repeat>\\n </p>\\n\\n <!-- 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\"> ({{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\"> </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\">| </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\"> ({{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\"> ({{rootCat.count}})</ng-if>\\n <a class=\"gray hidden-device\" ng-click=\"removeRootCategory($index)\">\\n  <b class=\"ion ion-trash-a\"></b> \\n </a>\\n <a class=\"gray hidden-device\" ng-click=\"editRootCategory($index)\">\\n  <b class=\"ion ion-edit\"></b> \\n </a>\\n\\n <div class=\"badge\">\\n <a class=\"button button-text button-small button-small-padding\" ng-click=\"addChildCategory(rootCat)\">\\n <span translate>MARKET.CATEGORY.EDIT.BTN_ADD</span>\\n </a>\\n <a class=\"button button-text button-small button-small-padding\" ng-class=\"{\\'button-text-positive\\': reorderChildren === rootCat.id}\" ng-click=\"reorderChildren=!(reorderChildren === rootCat.id) && rootCat.id\">\\n <span translate>MARKET.CATEGORY.EDIT.BTN_REORDER</span>\\n </a>\\n </div>\\n </div>\\n\\n <ion-list show-reorder=\"reorderChildren === rootCat.id\">\\n\\n\\n <!-- 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\"> ({{child.count}})</span>\\n\\n <a class=\"gray hidden-device\" ng-if=\"reorderChildren !== rootCat.id\" ng-click=\"removeChildCategory(rootCat, $index)\">\\n  <b class=\"ion ion-trash-a\"></b> \\n </a>\\n <a class=\"gray hidden-device\" ng-if=\"reorderChildren !== rootCat.id\" ng-click=\"editChildCategory(rootCat, $index)\">\\n  <b class=\"ion ion-edit\"></b> \\n </a>\\n\\n <ion-reorder-button class=\"ion-drag\" on-reorder=\"reorderChildrenCategory(rootCat, child, $fromIndex, $toIndex)\">\\n </ion-reorder-button>\\n\\n </ion-item>\\n </ion-list>\\n </div>\\n\\n </ng-if>\\n\\n\\n <div class=\"item hidden-xs hidden-sm text-right no-border ng-hide\" ng-show=\"!loading\">\\n <button class=\"button button-clear button-dark ink\" ng-click=\"cancel()\" type=\"button\" translate>COMMON.BTN_CANCEL</button>\\n <button class=\"button button-calm ink\" ng-class=\"{\\'button-assertive\\': dirty}\" ng-click=\"save()\" type=\"button\" translate>COMMON.BTN_SAVE</button>\\n </div>\\n </div>\\n <div class=\"col col-20 hidden-xs hidden-sm\"> </div>\\n </div>\\n\\n\\n </ion-content>\\n</ion-view>\\n');\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\"> ({{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\"> ({{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> \\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  \\n\\n </div>\\n\\n <div class=\"pull-right\">\\n\\n <button type=\"submit\" class=\"button button-small button-raised icon icon-left ion-play ink\" ng-disabled=\"search.loading\" title=\"{{!categories.length ? \\'MARKET.GALLERY.BTN_START\\' : \\'MARKET.GALLERY.BTN_CONTINUE\\' | translate}}\">\\n {{!categories.length ? \\'MARKET.GALLERY.BTN_START\\' : \\'MARKET.GALLERY.BTN_CONTINUE\\' | translate}}\\n </button>\\n  \\n <button type=\"button\" class=\"button button-small button-raised icon icon-left ion-stop ink\" title=\"{{\\'MARKET.GALLERY.BTN_STOP\\' | translate}}\" ng-if=\"search.loading || categories.length\" ng-click=\"stop()\">\\n {{\\'MARKET.GALLERY.BTN_STOP\\' | translate}}\\n </button>\\n </div>\\n </div>\\n </form>\\n\\n <div class=\"center\" ng-if=\"search.loading\">\\n <ion-spinner icon=\"android\"></ion-spinner>\\n </div>\\n\\n <div class=\"list ng-hide\" ng-show=\"!search.loading\">\\n <ng-repeat ng-repeat=\"cat in categories | filter:isLoadedCategory track by cat.id\" ng-init=\"catIndex=$index\">\\n <div class=\"item item-divider\">\\n\\n <span ng-bind-html=\"cat.name\"></span> ({{cat.count}})\\n </div>\\n\\n <a class=\"item item-list-detail\">\\n <ion-scroll direction=\"x\">\\n <img ng-repeat=\"picture in cat.pictures track by picture.id\" ng-src=\"{{::picture.src}}\" title=\"{{::picture.title}}{{::picture.price ? (\\' (\\' + (picture.price | formatAmount:picture) +\\')\\') : \\'\\' }}\" ng-click=\"openSlideShowModal(catIndex, $index, true)\" class=\"image-list-thumb\">\\n </ion-scroll>\\n </a>\\n </ng-repeat>\\n </div>\\n\\n\\n\\n\\n </ion-content>\\n</ion-view>\\n');\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\"> | </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\"> </div>\\n\\n <div class=\"col\">\\n\\n <form name=\"recordForm\" novalidate=\"\" ng-submit=\"save()\">\\n <div class=\"list {{::motion.ionListClass}}\" ng-init=\"setForm(recordForm)\">\\n\\n <div class=\"item hidden-xs item-text-wrap\">\\n <h1 ng-if=\"id\" ng-bind-html=\"formData.title\"></h1>\\n <h1 ng-if=\"!id && formData.type\">{{\\'MARKET.EDIT.\\' + formData.type + \\'.TITLE_NEW\\'|upper|translate}}</h1>\\n\\n </div>\\n <div class=\"item\" ng-if=\"id||options.type.show\">\\n <h4 class=\"gray\" ng-if=\"id\">\\n <i class=\"icon ion-calendar\"></i>\\n {{::\\'COMMON.LAST_MODIFICATION_DATE\\'|translate}} {{formData.time | formatDate}}\\n </h4>\\n <div class=\"badge badge-balanced\" ng-if=\"options.type.show\" ng-class=\"{\\'badge-editable\\': options.type.canEdit}\" ng-click=\"options.type.canEdit ? showRecordTypeModal() : \\'\\'\">\\n <span>{{\\'MARKET.TYPE.\\'+formData.type|upper|translate}}</span>\\n </div>\\n </div>\\n\\n <!-- 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\"> </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> \\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  <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> \\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  <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> \\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  <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> \\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  <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  <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\"> </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\"> | </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 >= 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 > 3, \\'assertive\\': issuer.stars.levelAvg <= 2}\">\\n <b class=\"ion-android-star\" ng-if=\"value <= issuer.stars.levelAvg\"></b>\\n <b class=\"ion-android-star-half\" ng-if=\"value > issuer.stars.levelAvg && value - 0.5 <= issuer.stars.levelAvg\"></b>\\n <b class=\"ion-android-star-outline\" ng-if=\"value > issuer.stars.levelAvg && value - 0.5 > issuer.stars.levelAvg\"></b>\\n </span>\\n <span class=\"gray\">{{issuer.stars.levelAvg}}/5 ({{\\'WOT.VIEW.STAR_HIT_COUNT\\' | translate: issuer.stars }})</span>\\n </h3>\\n <h4 class=\"gray\" ng-if=\"issuer.profile.creationTime || issuer.profile.time\">\\n <i class=\"ion-clock\"></i>\\n {{::\\'WOT.LOOKUP.REGISTERED\\' | translate: {time: issuer.profile.creationTime||issuer.profile.time } }}\\n </h4>\\n </div>\\n </a>\\n\\n <!-- 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}} <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  \\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\"> </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\"> </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  <i class=\"icon ion-flag\"></i>\\n {{\\'MARKET.SEARCH.CATEGORY\\'|translate}}\\n <span ng-bind-html=\"search.category.name\"></span>\\n <i class=\"icon ion-close\" ng-click=\"removeCategory()\">  </i>\\n </div>\\n\\n </div>\\n\\n <i class=\"icon ion-search placeholder-icon\"></i>\\n <input type=\"text\" autocomplete=\"off\" class=\"visible-xs visible-sm\" placeholder=\"{{\\'MARKET.SEARCH.SEARCH_HELP\\'|translate}}\" ng-model=\"search.text\" ng-model-options=\"{ debounce: 950 }\" ng-change=\"doSearch()\">\\n <input type=\"text\" autocomplete=\"off\" class=\"hidden-xs hidden-sm\" placeholder=\"{{\\'MARKET.SEARCH.SEARCH_HELP\\'|translate}}\" id=\"marketSearchText\" ng-model=\"search.text\" on-return=\"doSearch()\">\\n\\n <button type=\"button\" class=\"button button-icon button-small pull-right button-small-padding ink\" ng-if=\"search.text\" tabindex=\"-1\" ng-click=\"removeText()\">\\n <i class=\"gray ion-close\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n\\n <!-- 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  \\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  \\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  \\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  \\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, '<').replace(/>/g, '>');\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-zA−Z0-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 ])([A−Z09-]+)(?:$|[\\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 & 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: \"© <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: \"© <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"]}