{"version":3,"sources":["../dist/dist_js/app/services/desktop-services.js","../dist/dist_js/app/entities/peer.js","../dist/dist_js/app/entities/block.js","../dist/dist_js/app/entities/ws2pmessage.js","../dist/dist_js/app/controllers/login-controllers.js","../dist/dist_js/app/controllers/help-controllers.js","../dist/dist_js/app/platform.js","../dist/dist_js/app/services/settings-services.js","../dist/dist_js/app/services/network-services.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/help-services.js","../dist/dist_js/app/services/plugin-services.js","../dist/dist_js/app/services.js","../dist/dist_js/app/api/api-demo-services.js","../dist/dist_js/app/templates.js","../dist/dist_js/app/translations.js","../dist/dist_js/app/api/app.js","../dist/dist_js/app/directives.js","../dist/dist_js/app/filters.js"],"names":["nw","Peer","json","that","this","Object","keys","forEach","key","endpoints","Block","attributes","length","_","identitiesCount","identities","joinersCount","joiners","activesCount","actives","leaversCount","leavers","revokedCount","revoked","excludedCount","excluded","certificationsCount","certifications","transactionsCount","transactions","empty","isEmpty","id","number","hash","join","Ws2pMessage","message","parts","split","startsWith","Error","pubkey","buid","prefix","matches","regexp","WS2P_PREFIX","exec","privateOptions","private","useTor","mode","substring","publicOptions","public","ws2pid","software","version","powPrefix","LoginController","$scope","$timeout","$controller","csWallet","angular","extend","showLoginModal","loading","isLogin","error","login","$on","LoginModalController","$q","$ionicPopover","$window","CryptoUtils","csCrypto","ionicReady","UIUtils","BMA","Modals","csSettings","Device","parameters","computing","formData","showPubkey","showComputePubkeyButton","autoComputePubkey","pubkeyPattern","format","constants","PUBKEY","PUBKEY_WITH_CHECKSUM","isAuth","auth","okText","title","showMethods","isDefined","showNewAccountLink","expectedPubkey","expectedUid","uid","scryptParamsValues","SCRYPT_PARAMS","reduce","res","concat","label","params","init","then","ionic","Platform","grade","toLowerCase","screen","isSmall","rememberMe","data","keepAuthIdle","keepAuth","KEEP_AUTH_IDLE_SESSION","method","changeMethod","enter","hide","ink","selector","leave","methods","doLogin","skipForm","form","$valid","promise","username","password","scryptPrams","scrypt","show","scryptKeypair","keypair","util","encode_base58","signPk","pubkeyError","undefined","catch","onError","file","valid","readKeyFile","withSecret","trim","showWotLookupModal","pkChecksum","$error","checksum","rememberMeChanged","equals","keepAuthIdleChanged","methodChanged","paramsChanged","useLocalStorage","store","success","silent","closeModal","console","warn","onScryptFormChanged","computePubkey","$watch","salt","pwd","scryptSignPk","err","showJoinModal","showJoin","showAccountSecurityModal","showAccountSecurity","showHelpModal","showHelp","doScan","barcode","scan","when","uri","parse","debug","keyfile","parseData","signSk","base58","encode","hideMethodsPopover","$submitted","find","item","findWhere","changeScrypt","copy","options","showPassword","subTitle","scope","read","ucode","errorCodes","BAD_PASSWORD","onFileChanged","fileData","name","size","content","fileContent","validatingFile","removeKeyFile","searchText","showWotLookup","q","showMethodsPopover","event","defaultPrevented","popover","templateUrl","autoremove","afterShow","methodsPopover","AuthController","setForm","HelpController","$state","$anchorScroll","e","locale","stateParams","anchor","HelpModalController","itemsClass","listClass","HelpTipController","$ionicSideMenuDelegate","csConfig","csCurrency","csHelpConstants","tour","continue","executeStep","partName","steps","index","step","next","isUndefined","showHelpTip","bindings","value","hasNext","timeout","enable","backdropClickToClose","helptip","helpAnchor","startHelpTour","startWalletNoLoginTour","startWalletTour","endIndex","wallet","startWalletCertTour","walletCerts","startTxTour","tx","startWalletsTour","wallets","startHeaderTour","startSettingsTour","startWotLookupTour","cancelled","wotLookup","startWotTour","wot","startWotCertTour","wotCerts","startCurrencyTour","currency","startNetworkTour","network","finishTour","startIndex","contentParams","toggleLeft","icon","position","isOpen","go","useRelative","glyph","is","retry","get","showNetworkTabIfNeed","tabs","document","querySelectorAll","element","triggerHandler","installDocUrl","getElementById","currentUD","hasCertificationsItem","isMember","requirements","pendingMembership","stepCount","skipAll","_getProfilBtnElement","elements","el","offsetWidth","iconStyle","style","closeProfilePopover","all","showHome","HelpTourController","state","module","factory","$rootScope","Api","localStorage","$translate","locales","flag","fallbackLocale","fallbackLanguage","fixLocale","localeParts","similarLocale","l","String","prototype","call","previousData","startPromise","fixedLocale","STORAGE_KEY","fixedSettings","cacheTimeMs","timeWarningExpireMembership","timeWarningExpire","minVersion","newIssueUrl","userForumUrl","latestReleaseUrl","duniterLatestReleaseUrl","httpsMode","defaultSettings","merge","useLocalStorageEncryption","persistCache","walletHistoryTimeSecond","walletHistorySliceSecond","walletHistoryAutoRefresh","showUDHistory","expertMode","decimalCount","uiEffects","blockValidityWindow","header","settings","allRules","allWotRules","alertIfUnusedWallet","defaultLanguage","use","license","en","fr-FR","es-ES","started","api","emitChangedEvent","raise","changed","node","temporary","getObject","previousSettings","savedData","setObject","raisePromise","start","applyData","newData","localeChanged","localeId","restore","now","Date","storedData","ready","moment","substr","numeral","language","registerEvent","isStarted","apply","getByPath","path","defaultValue","obj","each","reset","getLicenseUrl","getFeedUrl","feed","jsonFeed","$interval","csHttp","interval","isHttpsMode","location","protocol","bma","listeners","peers","filter","member","mirror","endpoint","online","ssl","tor","sort","type","asc","compact","groupBy","knownBlocks","mainBlock","minOnlineBlockNumber","uidsByPubkeys","searchingPeersOnNetwork","difficulties","ws2pHeads","block","loadW2spHeads","ws2p","heads","hit","sig","head","HTTP_LIMITATION","loadDifficulties","blockchain","stats","levels","level","loadPeers","newPeers","cancel","flushNewPeersAndSort","sortPeers","initJobs","uids","push","addOrRefreshPeerFromJson","jobs","status","blockNumber","parseInt","ep","hasEndpoint","privateWs2pHeads","values","privateEPCount","hasEndPoint","currentNumber","peer","useWs2p","keyID","difficulty","applyPeerFilter","oldBlock","isBma","isWs2p","isSsl","isTor","list","createPeerEntities","hasUpdates","existingPeer","existingMainBuid","existingOnline","refreshPeer","refreshedPeer","existingIndex","indexOf","server","splice","useBma","endpointsAsString","getEndpoints","epStr","parseEndPoint","getServer","dns","getDns","getHost","ws2pHeadKey","useSsl","lightInstance","getPort","current","medianTime","NO_CURRENT_BLOCK","ROOT_BLOCK_HASH","secondTry","getBMA","port","hardship","summary","duniter","updateMainBuid","ids","map","newPeersAdded","computeScoreAlphaValue","nbChars","score","charCodeAt","i","Math","pow","buids","memberPeersCount","count","previousPeer","pct","max","hasMainConsensusBlock","hasConsensusBlock","consensusBlockDelta","uniq","sortBy","compacted","mainBlockChanged","close","info","websocket","onListener","remove","$q_started","callback","hasPeers","getPeers","getTrustedPeers","resolve","reject","getKnownBlocks","getMainBlockUid","mainBuid","isBusy","isDesktop","CryptoAbstractService","loaded","source","isLoaded","array_to_string","buf","bb","Blob","Uint8Array","f","FileReader","onload","target","result","readAsText","crypto_sign_BYTES","crypto_secretbox_NONCEBYTES","crypto_box_MACBYTES","SEED_LENGTH","SIMPLE","N","r","p","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","seed","crypto","window","msCrypto","Crypto","FullJSServiceFactory","nacl","base64","check","function_name","check_injectBytes","what","thing","expected_length","leftPadding","check_length","bs","address","MALLOC","nacl_raw","HEAPU8","set","injectBytes","nbytes","_malloc","FREE","pointer","_free","Target","decode_utf8","s","d","unescape","encodeURIComponent","b","encode_utf8","a","decode_base58","decode","decode_base64","encode_base64","hash_sha256","msg","to_hex","crypto_hash_sha256","toUpperCase","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","verify","signature","pub","sm","crypto_sign_open","sign","m","sk","signedMsg","crypto_sign","load","deferred","defer","naclOptions","scryptOptions","requested_total_memory","loadedLib","checkAllLibLoaded","lib","fromSignKeypair","skFromSignSk","pkFromSignPk","pack","open","offset","subarray","service","serviceImpl","test","regexpContent","RegExp","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","BAD_CHECKSUM","parseKeyFileContent","defaultType","typeMatch","parseWIF_or_EWIF","data_base58","data_int8","wif_base58","wif_int8","wif_int8_no_checksum","slice","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","reader","parseKeyFileData","generateContent","generateKeyFileContent","fi","seed_fi","wif_v1_from_keypair","seed1_xor_derivedhalf1_1","seed2_xor_derivedhalf1_2","encrypt","ewif_v1_from_keypair","getKeypair","record","recipientFieldName","cypherFieldNames","boxRecipientPk","fieldName","cypherTexts","cypherFieldName","records","issuerFieldName","issuerBoxPks","issuer","issuerBoxPk","text","$ionicPlatform","readyPromise","$ionicLoading","$ionicPopup","$ionicConfig","$ionicHistory","ionicMaterialInk","ionicMaterialMotion","Fullscreen","screenmatch","exports","loadingTextCache","CONST","MAX_HEIGHT","MAX_WIDTH","THUMB_MAX_HEIGHT","THUMB_MAX_WIDTH","smallscreen","bind","raw","alertError","subtitle","translations","template","buttons","onTap","alertInfo","hideLoading","showLoading","translation","isSmallScreen","active","imageOnLoadResize","thumbnail","ctx","width","height","maxWidth","maxHeight","canvas","createElement","getContext","xoffset","trunc","yoffset","drawImage","dataurl","toDataURL","showPopover","popovers","autoselect","focusFirstInput","_show","isResolved","getSelection","toString","setSelectionRange","focus","autofocus","$parent","$emit","_cleanup","removeClass","fromTemplateUrl","closePopover","afterHidden","motionDelegate","delegate","ionListClass","motionTimeout","defaultSelector","startVelocity","createQRCodeObj","typeNumber","errorCorrectionLevel","mb","qrcode","stringToBytes","stringToBytesFuncs","qr","addData","make","toggleOn","classList","toggle","toggleOff","motion","default","ripple","blinds","fadeSlideIn","fadeSlideInRight","panInLeft","pushDown","slideUp","fadeIn","alert","confirm","cssClass","cancelText","cancelType","okType","notImplemented","update","_getLoader","loader","isShown","toast","duration","noBackdrop","fullMsg","fullscreen","displayEffect","setEffects","views","transition","nothing","class","clearCache","svg","createSvgTag","img","createImgTag","fab","fabs","getElementsByClassName","rows","share","url","href","absolute","postUrl","postMessage","titleKey","showHelptip","querySelector","preAction","postAction","retryTimeout","selection","select","selectElementText","childNodes","range","createRange","selectNodeContents","removeAllRanges","addRange","selectedText","image","resizeFile","src","readAsDataURL","resizeSrc","imageSrc","rotateSrc","angle","PI","rotate","imageOnLoadRotate","$http","CacheFactory","VERY_LONG","LONG","MEDIUM","SHORT","storageMode","getSettingsStorageMode","cacheNames","getCacheOptions","deleteOnExpire","onExpire","cacheFlushInterval","onSettingsChanged","newStorageMode","cacheName","cache","setOptions","on","addListeners","maxAge","counter","createCache","clear","cachePrefix","removeAll","clearAll","controller","openLink","$ionicModal","$injector","DefaultModalController","resolved","openModal","modal","hideModal","body","propName","getParameters","hideDelay","ctrlName","fragments","animation","$new","locals","ctrlEval","isControllerAs","controllerName","ctrlInstance","ModalUtils","showJoinMember","showJoinWallet","showTransfer","useDigitKeyboard","showLogin","showNetworkLookup","showAbout","accountType","showLicense","showSelectPubkeyIdentity","showSelectWallet","submit","preventDefault","popup","afterShowSaved","$destroy","csCache","sockets","allCachePrefixes","host","getUrl","processError","prepare","config","pkeys","queryParams","newUri","pkey","replace","parseUri","parser","pathname","hostname","search","compareVersionNumbers","v1","v2","v1parts","v2parts","validateParts","x","NaN","forcedTimeout","responseType","headers","getWithCache","autoRefresh","done","put","post","Content-Type","ws","getWsUrl","_waitOpen","self","readyState","waitDuration","waitRetryDelay","min","round","_open","callbacks","WebSocket","onerror","onmessage","JSON","onopen","openTime","onclose","closeEvent","findIndex","socket","closing","code","_close","_remove","send","isClosed","closeAllWs","sock","Shell","openExternal","openOptions","openTarget","win","moveTo","date","utc","unix","compare","isCompatible","actualVersion","storage","sessionStorage","stringify","$log","appName","isDevice","standard","secure","initStandardStorage","cordova","plugins","SecureStorage","initSecureStorage","removeItem","n","barcodeScanner","clipboard","$cordovaClipboard","camera","getPicture","sourceType","navigator","PictureSourceType","PHOTOLIBRARY","CAMERA","quality","destinationType","DestinationType","DATA_URL","encodingType","EncodingType","PNG","targetWidth","targetHeight","$cordovaCamera","keyboard","Keyboard","digit","bindModel","modelScope","modelPath","getModelValue","setModelValue","paths","property","action","decimal","decimalSeparator","leftButton","html","rightButton","isIOS","userAgent","match","isOSX","process","isWeb","InAppBrowser","WELL_KNOWN_CURRENCIES","g1","firstBlockTime","medianTimeOffset","resetData","membersCount","loadData","avgGenTime","medianTimeBlocks","currencyName","BLOCK_NOT_FOUND","initPhase","ud","blocks","_safeLoadCurrentUD","blockIndex","ud0","lastBlockWithUD","amount","base","dividend","unitbase","getData","getDataField","field","onBlock","cleanData","currentBlock","receivedAt","newBlock","stop","restart","currentBlockField","getCurrent","lastValid","useCache","SIG","OUTPUT_OBJ","REGEX_ENDPOINT_PARAMS","BMAS","WS2P","BMATOR","WS2PTOR","USER_ID","CURRENCY","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","alive","forceUseSsl","exact","closeWs","wsByPath","cacheTime","requestKey","getRequestFn","_startPromise","request","execCount","postRequest","postByPath","isAlive","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","same","node2","port2","peering","lookup","certifiedBy","certifiersOf","pending","requirementsWithCache","add","certify","revoke","blocksSlice","currentWithCache","membership","newcomers","sources","history","sending","pendings","times","timesWithCache","parseUnlockCondition","unlockCondition","treeItem","treeItemId","childrenContent","childrenMatches","convertedOutput","treeItems","functions","loop","children","unlockFunctions","unlockTree","output","epPrefix","ipv4","ipv6","otherNode","wasStarted","results","memberUidsByPubkey","getByUid","blockNumbers","getHttpRecursive","peersByLeaves","leaves","httpGetRequest","paramName","paramValues","paramValue","requestParams","getHttpWithRetryIfLimitation","lastUd","pathCount","getLatestRelease","latest","html_url","tag_name","instance","identityCache","requirementsCache","_addUniqueIds","idties","idtyKeys","idty","_sortAndSliceIdentities","_resetRequirements","meta","hasSelf","needSelf","needMembership","canMembershipOut","needRenew","wasMember","certificationCount","needCertifications","needCertificationCount","willNeedCertificationCount","alternatives","blockUid","sigDate","_fillRequirements","currencyParameters","timestamp","invalid","membershipExpiresIn","membershipPendingExpiresIn","expired","willExpireCertificationCount","cert","expiresIn","willExpire","pendingRevocation","revocation_sig","pendingCertificationCount","pendingCerts","certifiers","union","pluck","sigQty","_fillIdentitiesMeta","identity","time","loadRequirements","inputData","withCache","cacheKey","outdistanced","certCount","loadIdentityByLookup","revoked_on","certPubkeys","certsMap","idtyFullKey","others","certs","certFullKey","cert_time","block_number","block_hash","givenCertifications","signed","loadCertifications","getFunction","lookupCertifications","_certId","lookupHasCertTime","lookupCerticationsByCertId","certId","written","certTime","sigWindow","sigValidity","pendingCertifications","pendingCertByBlocks","validBuid","writtenCertByPubkey","_sortCertifications","errorCertifications","force","dataByLookup","received_cert","received_cert_pending","received_cert_error","given_cert","given_cert_pending","given_cert_error","addEvent","messageParams","revocationTime","addEvents","safeText","addUniqueId","allowExtension","excludeRevoked","blocUid","lookupResultCount","getNewcomersRecursive","maxResultSize","joiner","idtyKey","memberDate","getAllRecursive","letters","pubkeys","letter","extendAll","pubkeyAttributeName","skipAddUid","uidsByPubkey","events","total","hits","memberships","idtiesByBlock","idtiesByPubkey","ms","blockHash","otherIdtySamePubkey","aidty","$filter","FileSaver","csWot","reduceTxAndPush","txArray","processedTxMap","allowPendings","outputBase","lockedOutputs","walletIsIssuer","otherIssuers","issuers","otherRecipients","outputs","sum","noffset","outputArray","conditions","outputAmount","powBase","outputCondition","sigMatches","outputPubkey","identifier","consumed","contains","lockedOutput","txPubkeys","blockstampTime","txKey","newTx","comment","isUD","locktime","inputs","loadTx","fromTime","nowInSec","validating","errors","reduceTxFn","sent","received","sliceTime","from","to","loadUDs","tx1","tx2","firstValidatedTxIndex","toTime","addSources","sourcesIndexByKey","srcKey","addSource","loadSourcesAndBalance","balance","txPendings","txErrors","balanceFromSource","balanceWithPending","_processPendingTx","consumedSources","input","inputKey","srcIndex","txs","allTx","loadSources","downloadHistoryFile","currentTime","filename","formatDecimal","medianDate","formatSymbol","saveAs","Idle","csTx","defaultBMA","CsWallet","loadPromise","enableAuthIdle","localName","isNew","sigStock","encryptedData","resetKeypair","resetTxAndSources","isDefault","hasEncryptedData","needLogin","needAuth","forceAuth","isDataLoaded","authData","loginCheck","restoreData","openEncryptedData","checkAuthIdle","loadOptions","minData","logout","wasAuth","resetStore","unauth","isNeverUsed","avatar","storeData","secureContent","useEncryption","storageKey","notifications","invitations","childrenCount","contentStr","cypherContent","seckey","sessionStorageData","localStorageData","applyRestoredData","oldChildrenCount","oldChildren","removeAllChildrenWallets","child","newChildInstance","addChildWallet","cleanEventsByContext","loadTxAndSources","context","loadSigStock","loadQrCode","refreshData","loadMinData","loadFullData","unused","setSelf","skipData","truncBase","getInputs","filterBase","sourcesAmount","minBase","maxBase","lowerInputs","transfer","destPub","comments","restPub","floor","logs","amountBase","UD","unit","subUnit","rest","isBase","truncBaseOrMinBase","createAndSendTx","pendingTx","unshift","balanceChanged","es","build","firstSlice","secondSlice","outputOffset","newSources","signedTx","transaction","txHash","getIdentityDocument","sideIn","signedMembership","insertAtFirst","getkeypairSaveId","nbCharSalt","answer","getRevocationDocument","identityLines","idtySignature","revocation","setParent","removedChildren","getChildWalletByPubkey","isUserPubkey","walletId","getAllChildrenWallet","getWalletSettings","allSettings","newSettings","useEncryptionChanged","useStorageChanged","removeListeners","getByPubkey","downloadChildrenWalletFile","fileName","fromJson","failIfInvalid","isAuthResult","newEnableAuthIdle","setIdle","watch","unwatch","getIdle","internal","addListener","listener","transferAll","needToLoadRequirements","revokeWithFile","signedCert","downloadSaveId","saveId","questions","getSaveIDDocument","saveIdFile","getCryptedId","recoverId","recover","cypherNonce","cypherSalt","cypherPwd","downloadRevocation","revocationFile","downloadKeyFile","inside","out","cleanByContext","create","childIndex","parentWallet","hasPubkey","downloadFile","constant","startWalletHelpTip","isTour","helptipScope","helpController","createHelptipScope","provider","eagerLoadingServices","extensionByStates","registerEagerLoadingService","serviceName","extendState","stateName","extension","extendStates","stateNames","$get","currentExtensionPointName","extensions","points","getActivesByName","extensionPointName","includes","demoPubkey","BMA_REGEXP","BMAS_REGEXP","WS2P_REGEXP","LOCAL_IP_ADDRESS","regex","copyValues","copyValuesFrom","getRaw","bmaRegex","bmasRegex","regExp","getIPv4","getIPv6","hasValid4","getURL","isReachable","hasBma","parseArrayValues","parseTransactions","array","itemObjProperties","arrayProperty","toHimself","$inject","$stateProvider","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_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","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_GOOGLEPLUS","DATE","TYPE","SIZE","VALIDATING","SYSTEM","PICTURE_CHOOSE_TYPE","BTN_PICTURE_GALLERY","BTN_PICTURE_CAMERA","MENU","HOME","WOT","ACCOUNT","WALLETS","SETTINGS","NETWORK","TRANSACTIONS","ABOUT","LICENSE","LATEST_RELEASE","PLEASE_UPDATE","CODE","OFFICIAL_WEB_SITE","DEVELOPERS","FORUM","PLEASE_REPORT_ISSUE","REPORT_ISSUE","BTN_OPEN_DEV_WINDOW","WELCOME","MESSAGE","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","WALLETS_SETTINGS","USE_WALLETS_ENCRYPTION","USE_WALLETS_ENCRYPTION_HELP","ENABLE_HELPTIP","DISABLE_HELPTIP","ENABLE_UI_EFFECTS","HISTORY_SETTINGS","DISPLAY_UD_HISTORY","TX_HISTORY_AUTO_REFRESH","TX_HISTORY_AUTO_REFRESH_HELP","AUTHENTICATION_SETTINGS","KEEP_AUTH","KEEP_AUTH_SHORT","KEEP_AUTH_HELP","KEEP_AUTH_OPTION","NEVER","SECONDS","MINUTE","MINUTES","HOUR","ALWAYS","KEYRING_FILE","KEYRING_FILE_HELP","REMEMBER_ME","REMEMBER_ME_HELP","PLUGINS_SETTINGS","BTN_RESET","EXPERT_MODE","EXPERT_MODE_HELP","BLOCK_VALIDITY_WINDOW","BLOCK_VALIDITY_WINDOW_SHORT","BLOCK_VALIDITY_WINDOW_HELP","BLOCK_VALIDITY_OPTION","NONE","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","SCAN","SCRYPT","SECURE","HARDEST","EXTREME","USER","HELP","AUTH","BTN_AUTH","GENERAL_HELP","EXPECTED_UID_HELP","EXPECTED_PUBKEY_HELP","BALANCE","LAST_TX","BALANCE_ACCOUNT","NO_TX","SHOW_MORE_TX","SHOW_ALL_TX","TX_FROM_DATE","PENDING_TX","VALIDATING_TX","ERROR_TX","ERROR_TX_SENT","PENDING_TX_RECEIVED","EVENTS","OUT_DISTANCED","WAITING_MEMBERSHIP","WAITING_CERTIFICATIONS","WAITING_CERTIFICATIONS_HELP","WILL_MISSING_CERTIFICATIONS","WILL_NEED_RENEW_MEMBERSHIP","NEED_RENEW_MEMBERSHIP","NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED","NO_WAITING_MEMBERSHIP","CERTIFICATION_COUNT","CERTIFICATION_COUNT_SHORT","BTN_RECEIVE_MONEY","BTN_SELECT_ALTERNATIVES_IDENTITIES","BTN_FIX_MEMBERSHIP","BTN_MEMBERSHIP_RENEW","BTN_MEMBERSHIP_RENEW_DOTS","BTN_MEMBERSHIP_OUT_DOTS","BTN_SECURITY_DOTS","BTN_SHOW_DETAILS","LOCKED_OUTPUTS_POPOVER","DESCRIPTION","DESCRIPTION_MANY","LOCKED_AMOUNT","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","SELECT_IDENTITY_MODAL","SELECT_WALLET_MODAL","WALLET_LIST","BTN_NEW","BTN_IMPORT_FILE_DOTS","NO_WALLET","BTN_RENAME","EXPORT_FILENAME","TOTAL_DOTS","EDIT_POPOVER","NAME_HELP","IMPORT_MODAL","WALLET_COUNT","NO_NEW_WALLET","SECURITY","ADD_QUESTION","BTN_CLEAN","DOWNLOAD_REVOKE","DOWNLOAD_REVOKE_HELP","GENERATE_KEYFILE","GENERATE_KEYFILE_HELP","KEYFILE_FILENAME","MEMBERSHIP_IN","MEMBERSHIP_IN_HELP","SEND_IDENTITY","SEND_IDENTITY_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","RECOVER_ID_HELP","RECOVER_ID_SELECT_FILE","REVOCATION_WITH_FILE","REVOCATION_WITH_FILE_DESCRIPTION","REVOCATION_WITH_FILE_HELP","REVOCATION_WALLET","REVOCATION_WALLET_HELP","REVOCATION_FILENAME","SAVE_ID","SAVE_ID_HELP","STRONG_LEVEL","KEYFILE","PUBSEC_FORMAT","PUBSEC_FORMAT_HELP","WIF_FORMAT","WIF_FORMAT_HELP","EWIF_FORMAT","EWIF_FORMAT_HELP","PASSWORD_POPUP","FILE_NAME","HEADERS","TIME","AMOUNT","TRANSFER","SUB_TITLE","SUB_TITLE_ALL","AMOUNT_HELP","COMMENT_HELP","BTN_ADD_COMMENT","REST","REST_TO","WARN_COMMENT_IS_PUBLIC","UNKNOWN_URI_FORMAT","PUBKEY_INVALID_CHECKSUM","POPUP_TITLE","UNKNOWN_ERROR","CRYPTO_UNKNOWN_ERROR","DOWNLOAD_KEYFILE_FAILED","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","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_REVOKED_WITH_TIME","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_MEMBER_OR_WAS_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","ISSUE_524_TX_FAILED","ADD_SECONDARY_WALLET_FAILED","UPDATE_WALLET_LIST_FAILED","LOAD_WALLET_LIST_FAILED","SAVE_WALLET_LIST_FAILED","COULD_NOT_ADD_MAIN_WALLET","COULD_NOT_ADD_EXISTING_WALLET","UNKNOWN_WALLET_ID","RESTORE_WALLET_LIST_FAILED","INVALID_FILE_FORMAT","SAME_TX_RECIPIENT","CERTIFICATION_DONE","TRANSFER_SENT","COPY_TO_CLIPBOARD_DONE","MEMBERSHIP_OUT_SENT","NOT_NEED_MEMBERSHIP","IDENTITY_WILL_MISSING_CERTIFICATIONS","IDENTITY_NEED_MEMBERSHIP","HAS_ALTERNATIVE_IDENTITIES","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","TRANSFER_ALL","MEMBERSHIP_OUT","MEMBERSHIP_OUT_2","LOGIN_UNUSED_WALLET_TITLE","LOGIN_UNUSED_WALLET","FIX_IDENTITY","FIX_MEMBERSHIP","MEMBERSHIP","RENEW_MEMBERSHIP","REVOKE_IDENTITY","REVOKE_IDENTITY_2","NOT_NEED_RENEW_MEMBERSHIP","SAVE_BEFORE_LEAVE","SAVE_BEFORE_LEAVE_TITLE","LOGOUT","USE_FALLBACK_NODE","ISSUE_524_SEND_LOG","DOWNLOAD","POPUP_REVOKE_MESSAGE","JOIN","SECTION","PUBKEY_DEF","METHOD_DEF","GLOSSARY","MEMBER_DEF","CURRENCY_RULES","CURRENCY_RULES_DEF","BLOCKCHAIN_DEF","UNIVERSAL_DIVIDEND_DEF","WOT_DEF","DISTANCE_RULE","DISTANCE_RULE_DEF","TIP","MENU_BTN_CURRENCY","CURRENCY_WOT","CURRENCY_MASS","CURRENCY_UNIT_RELATIVE","CURRENCY_CHANGE_UNIT","CURRENCY_CHANGE_UNIT_TO_RELATIVE","MENU_BTN_NETWORK","NETWORK_BLOCKCHAIN","NETWORK_PEERS","NETWORK_PEERS_BLOCK_NUMBER","NETWORK_PEERS_PARTICIPATE","MENU_BTN_ACCOUNT","MENU_BTN_ACCOUNT_MEMBER","WALLET_CERTIFICATIONS","WALLET_RECEIVED_CERTIFICATIONS","WALLET_GIVEN_CERTIFICATIONS","WALLET_BALANCE","WALLET_BALANCE_RELATIVE","WALLET_BALANCE_CHANGE_UNIT","WALLET_PUBKEY","WALLET_SEND","WALLET_SEND_NO_MONEY","WALLET_OPTIONS","WALLET_RECEIVED_CERTS","WALLET_CERTIFY","WALLET_CERT_STOCK","MENU_BTN_WALLETS","MENU_BTN_TX","MENU_BTN_WOT","WOT_SEARCH_TEXT_XS","WOT_SEARCH_TEXT","WOT_SEARCH_RESULT","WOT_VIEW_CERTIFICATIONS","WOT_VIEW_CERTIFICATIONS_COUNT","WOT_VIEW_CERTIFICATIONS_CLICK","WOT_VIEW_CERTIFY","MENU_BTN_SETTINGS","HEADER_BAR_BTN_PROFILE","SETTINGS_CHANGE_UNIT","END_LOGIN","END_NOT_LOGIN","LINK_DOC","LINK_DOC_HELP","LINK_STANDARD_APP","LINK_STANDARD_APP_HELP","MESSAGE_SHORT","DOC_HEADER","TITLE_SHORT","AMOUNTS_HELP","NAME","NODE","DEMO","BAD_CREDENTIALS","SUCCESS_REDIRECTING_WITH_NAME","SUCCESS_REDIRECTING","CANCEL_REDIRECTING_WITH_NAME","CANCEL_REDIRECTING","TRANSFER_FAILED","DOC","DESCRIPTION_DIVIDER","URL_DIVIDER","PARAMETERS_DIVIDER","AVAILABLE_PARAMETERS","DEMO_DIVIDER","DEMO_HELP","DEMO_RESULT","DEMO_RESULT_PEER","DEMO_SUCCEED","DEMO_CANCELLED","INTEGRATE_DIVIDER","INTEGRATE_CODE","INTEGRATE_RESULT","INTEGRATE_PARAMETERS","PARAM_PUBKEY","PARAM_PUBKEY_HELP","PARAM_AMOUNT","PARAM_AMOUNT_HELP","PARAM_COMMENT","PARAM_COMMENT_HELP","PARAM_NAME","PARAM_NAME_HELP","PARAM_REDIRECT_URL","PARAM_REDIRECT_URL_HELP","PARAM_CANCEL_URL","PARAM_CANCEL_URL_HELP","PARAM_PREFERRED_NODE","PARAM_PREFERRED_NODE_HELP","EXAMPLES_HELP","EXAMPLE_BUTTON","EXAMPLE_BUTTON_DEFAULT_TEXT","EXAMPLE_BUTTON_DEFAULT_STYLE","EXAMPLE_BUTTON_TEXT_HELP","EXAMPLE_BUTTON_BG_COLOR","EXAMPLE_BUTTON_BG_COLOR_HELP","EXAMPLE_BUTTON_FONT_COLOR","EXAMPLE_BUTTON_FONT_COLOR_HELP","EXAMPLE_BUTTON_TEXT_ICON","EXAMPLE_BUTTON_TEXT_WIDTH","EXAMPLE_BUTTON_TEXT_WIDTH_HELP","EXAMPLE_BUTTON_ICON_NONE","EXAMPLE_BUTTON_ICON_DUNITER","EXAMPLE_BUTTON_ICON_CESIUM","EXAMPLE_BUTTON_ICON_G1_COLOR","EXAMPLE_BUTTON_ICON_G1_BLACK","DEV_WARNING","DEV_WARNING_MESSAGE","DEV_WARNING_MESSAGE_SHORT","CURRENCIES","BTN_REGISTRY","SELECT","MEMBERS_COUNT","ERROR_TX_RECEIVED","BTN_MEMBERSHIP_IN_DOTS","BTN_SEND_IDENTITY_DOTS","BTN_REVOKE","SLIDE_1_TITLE","SLIDE_2_TITLE","LICENCE","$urlRouterProvider","abstract","otherwise","showAboutModal","changeLanguage","langKey","hideLocalesPopover","showLocalesPopover","localesPopover","$sce","transferData","preferred_node","redirect_url","cancel_url","transferButton","showParameters","icons","bgColor","fontColor","transferDemoUrl","rootPath","demo","buttonText","computeTransferButtonHtml","$broadcast","csPlatform","csDemoWallet","normalizeAmount","amountStr","parseFloat","toFixed","amounts","errorState","preferredNode","fallbackNodes","starting","unsubscribe","askTransferConfirm","walletData","onSuccess","txRes","encodeURI","redirectToUrl","onCancel","top","parent","assign","directive","require","link","ngModel","compareTo","$validators","modelValue","$eval","$validate","differentTo","NUMBER_REGEXP","numberFloat","$isEmpty","INT_REGEXP","attrs","numberInt","EMAIL_REGEXP","email","requiredIf","required","geoPoint","lat","lon","restrict","showCopyPopover","copyOnClick","$location","clazz","activeLink","activeLinkPathPrefix","newPath","addClass","returnClose","onReturn","onFocus","onBlur","attr","which","blur","$compile","$parse","compile","tElement","tAttrs","ngBindHtmlGetter","trustAsHtml","ngBindHtmlWatch","$$addBindingClass","$$addBindingInfo","getTrustedHtml","contents","$element","nextViewOptions","historyRoot","disableAnimate","expire","PluginService","tAttributes","extensionPoints","extensionPoint","append","getTemplate","pre","iElement","iAttrs","fn","onReadFile","onChangeEvent","files","onLoadEvent","$applyAsync","srcElement","elem","dropZone","stopPropagation","dataTransfer","$apply","transclude","fileSelect","fileInput","accept","click","attachEvent","addEventListener","onLocaleChange","onCurrencyChange","MEDIAN_TIME_OFFSET","pattern","Array","currencySymbol","patternRelative","minValueRelative","abs","formatRelative","formatQuantitative","minValue","filterTranslations","Infinity","local","fromNow","separator","day","hour","_cache","sepChars","c","charAt","uniformLanguageTag","determinePreferredLanguage","useSanitizeValueStrategy","useLoaderCache","$httpProvider","defaults","useXDomain","common","$compileProvider","debugInfoEnabled","imgSrcSanitizationWhitelist","$animateProvider","classNameFilter","CacheFactoryProvider","recycleFreq","storagePrefix","capacity","screenmatchConfigProvider","rules","$ionicConfigProvider","enableJsScrolling","scrolling","jsScrolling","maxCache","IdleProvider","idle","logoutIdle","logoutTimeout","exception","cause","defaultSettingsNode","removeChangeStateListener","fallbackNodeIndex","disableChangeState","nextParams","fromState","enableChangeState","checkBmaNodeAlive","fallbackNode","newServer","messageParam","old","new","latestRelease","isNewer","$urlRouter","device","hashIndex","httpsModeDebug","hideKeyboardAccessoryBar","disableScroll","StatusBar","release","newRelease","registerBackButtonAction","backView","goBack","exitApp","rtrim","args","arguments"],"mappings":";AAAA,IAAAA,ECEA,SAAAC,EAAAC,GAEA,IAAAC,EAAAC,KAEAC,OAAAC,KAAAJ,GAAAK,SAAA,SAAAC,GACAL,EAAAK,GAAAN,EAAAM,MAGAL,EAAAM,UAAAN,EAAAM,WAAA,GCPA,SAAAC,EAAAR,EAAAS,GACA,aAEA,IAAAR,EAAAC,KAGAO,GAAAA,EAAAC,OAQAC,EAAAN,QAAAI,GAAA,SAAAH,GACAL,EAAAK,GAAAN,EAAAM,MARA,CAAA,WAAA,SAAA,aAAA,SAAA,UAAA,SAAA,WAAA,eAAA,OAAA,aAAA,UAAA,UAAA,UAAA,UAAA,WAAA,iBAAA,eAAA,YACAD,SAAA,SAAAC,GACAL,EAAAK,GAAAN,EAAAM,MAWAL,EAAAW,gBAAAX,EAAAY,WAAAZ,EAAAY,WAAAH,OAAA,EACAT,EAAAa,aAAAb,EAAAc,QAAAd,EAAAc,QAAAL,OAAA,EACAT,EAAAe,aAAAf,EAAAgB,QAAAhB,EAAAgB,QAAAP,OAAA,EACAT,EAAAiB,aAAAjB,EAAAkB,QAAAlB,EAAAkB,QAAAT,OAAA,EACAT,EAAAmB,aAAAnB,EAAAoB,QAAApB,EAAAoB,QAAAX,OAAA,EACAT,EAAAqB,cAAArB,EAAAsB,SAAAtB,EAAAsB,SAAAb,OAAA,EACAT,EAAAuB,oBAAAvB,EAAAwB,eAAAxB,EAAAwB,eAAAf,OAAA,EACAT,EAAAyB,kBAAAzB,EAAA0B,aAAA1B,EAAA0B,aAAAjB,OAAA,EAEAT,EAAA2B,MAAA3B,EAAA4B,UAEA5B,EAAA6B,GAAA,CAAA7B,EAAA8B,OAAA9B,EAAA+B,MAAAC,KAAA,KChCA,SAAAC,EAAAC,GAEA,IAEAC,EAAAD,EAAAE,MAAA,KACA,GAAAD,EAAA1B,OAAA,IAAA0B,EAAA,GAAAE,WAAA,QACA,MAAAC,MAAA,mBAAAJ,GAGA,GAAA,QAAAC,EAAA,GAAA,CACA,GAAAA,EAAA1B,OAAA,EACA,MAAA6B,MAAA,mBAAAJ,GAGA,GAAA,GAAAC,EAAA1B,OAZAR,KAaAsC,OAAAJ,EAAA,GAbAlC,KAcAuC,KAAAL,EAAA,QAIA,GADAA,EAAA,IACA,EAAA,CACA,IAAAM,EAAAN,EAAA,GAGA,GAAAM,EAAAhC,OAAA,EAAA,CACA,IAAAiC,EAAAzC,KAAA0C,OAAAC,YAAAC,KAAAJ,GACA,IAAAC,EACA,MAAAJ,MAAA,mBAAAJ,GAIA,IAAAY,EAAAJ,EAAA,GACA,GAAAI,EAAA,CA9BA7C,KA+BA8C,QAAA,CACAC,OAAAF,EAAAT,WAAA,MAEA,IAAAY,EAAAH,EAAAI,UAAA,GACA,KAAAD,EAnCAhD,KAoCA8C,QAAAE,KAAA,MAEA,KAAAA,EAtCAhD,KAuCA8C,QAAAE,KAAA,QAEA,KAAAA,IAzCAhD,KA0CA8C,QAAAE,KAAA,UAKA,IAAAE,EAAAT,EAAA,GACAS,IAhDAlD,KAiDAmD,OAAA,CACAJ,OAAAG,EAAAd,WAAA,KACAY,KAAA,QAnDAhD,KA+DAsC,OAAAJ,EAAA,GA/DAlC,KAgEAuC,KAAAL,EAAA,GAhEAlC,KAiEAoD,OAAAlB,EAAA,GAjEAlC,KAkEAqD,SAAAnB,EAAA,GAlEAlC,KAmEAsD,QAAApB,EAAA,GAnEAlC,KAoEAuD,UAAArB,EAAA,KCzCA,SAAAsB,EAAAC,EAAAC,EAAAC,EAAAC,GAIAC,QAAAC,OAAA9D,KAAA2D,EAAA,WAAA,CAAAF,OAAAA,KAEAA,EAAAM,eAAA,WACA,OAAAN,EAAAO,QAAAN,EAAAD,EAAAM,eAAA,KAEAH,EAAAK,WAAAR,EAAAS,WAAA,EACAR,EAAAE,EAAAO,MAAA,MAGAV,EAAAW,IAAA,mBAAAX,EAAAM,gBAIA,SAAAM,EAAAZ,EAAAC,EAAAY,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAGAA,EAAAA,GAAA,GAEAxB,EAAAyB,WAAA,EACAzB,EAAAnB,OAAA,KACAmB,EAAA0B,SAAA,GACA1B,EAAA2B,YAAA,EACA3B,EAAA4B,yBAAA,EACA5B,EAAA6B,mBAAA,EACA7B,EAAA8B,cAAA,gBAAAC,OAAAX,EAAAY,UAAA/C,OAAAgD,OAAAb,EAAAY,UAAA/C,OAAAiD,sBAEAlC,EAAAmC,OAAAX,EAAAY,KACApC,EAAAqC,OAAAb,EAAAa,OACArC,EAAAsC,MAAAd,EAAAc,QAAAtC,EAAAmC,OAAA,aAAA,eACAnC,EAAAuC,aAAAnC,QAAAoC,UAAAhB,EAAAe,cAAAf,EAAAe,YACAvC,EAAAyC,oBAAArC,QAAAoC,UAAAhB,EAAAiB,qBAAAjB,EAAAiB,mBACAzC,EAAA0C,eAAAlB,EAAAkB,eACA1C,EAAA2C,YAAAnB,EAAAoB,IAEA5C,EAAA6C,mBAAA7F,EAAAP,KAAAuE,EAAAgB,UAAAc,eACAC,QAAA,SAAAC,EAAArG,GACA,OAAAqG,EAAAC,OAAA,CAAA9E,GAAAxB,EAAAuG,MAAA,gBAAAvG,EAAAwG,OAAAnC,EAAAgB,UAAAc,cAAAnG,OACA,CAAA,CAAAwB,GAAA,OAAA+E,MAAA,oBAAAC,OAAA,MAGAnD,EAAAoD,KAAA,WAEAlC,IAAAmC,MAAA,WAEArD,EAAA6B,kBAAA,MAAAyB,MAAAC,SAAAC,MAAAC,gBACAtC,EAAAuC,OAAAC,aAIA3D,EAAA0B,SAAAkC,WAAAtC,EAAAuC,KAAAD,WAGA5D,EAAA0B,SAAAoC,aAAAxC,EAAAuC,KAAAC,aACA9D,EAAA0B,SAAAqC,SAAA/D,EAAA0B,SAAAoC,cAAAxC,EAAAU,UAAAgC,uBAGA,IAAAC,EAAAzC,EAAAyC,QAAA3C,EAAAuC,KAAAnD,OAAAY,EAAAuC,KAAAnD,MAAAuD,QAAA,iBACAd,EAAA7B,EAAAuC,KAAAnD,OAAAY,EAAAuC,KAAAnD,MAAAyC,QAEAnD,EAAAmC,QAAA,WAAA8B,GAAA,SAAAA,GAAA,YAAAA,KACAA,EAAA,kBAEAjE,EAAAkE,aAAAD,EAAAd,IAIAnD,EAAAmE,MAAA,WACAhD,EAAAZ,QAAA6D,OAEAjD,EAAAkD,IAAA,CAAAC,SAAA,uBAEAtE,EAAAW,IAAA,cAAAX,EAAAmE,OAGAnE,EAAAuE,MAAA,WACAvE,EAAA0B,SAAA,GACA1B,EAAAyB,WAAA,EACAzB,EAAAnB,OAAA,KACAmB,EAAAwE,QAAA,IAEAxE,EAAAW,IAAA,aAAAX,EAAAuE,OAGAvE,EAAAyE,QAAA,SAAAC,GACA,IAAAT,EAAAjE,EAAA0B,SAAAuC,OAEA,GAAAjE,EAAA2E,KAAAC,QAAA,SAAAX,EAAA,CAEA,IACAY,EADAf,EAAA9D,EAAA0B,SAAAoC,aAIA,GAAA,mBAAAG,GAAA,oBAAAA,EAAA,CACA,IAAAjE,EAAA0B,SAAAoD,WAAA9E,EAAA0B,SAAAqD,SAAA,OACA,IAAAC,EAAAhF,EAAA0B,SAAAuD,QAAAjF,EAAA0B,SAAAuD,OAAA9B,OACAhC,EAAAZ,QAAA2E,OACAL,EAAA7D,EAAAmE,cAAAnF,EAAA0B,SAAAoD,SAAA9E,EAAA0B,SAAAqD,SAAAC,GACA3B,MAAA,SAAA+B,GACA,IAAAA,EAAA,OAAAjE,EAAAZ,QAAA6D,KAAA,IACA,IAAAvF,EAAAmC,EAAAqE,KAAAC,cAAAF,EAAAG,QAEA,OAAA/D,EAAAkB,gBAAAlB,EAAAkB,gBAAA7D,GACAmB,EAAAnB,OAAAA,EACAmB,EAAA2B,YAAA,EACA3B,EAAAwF,aAAA,EACArE,EAAAZ,QAAA6D,KAAA,MAGApE,EAAAwF,aAAA,EAEA,CACA3G,OAAAA,EACAuG,QAAAA,EACAjC,OAAAnD,EAAA0B,SAAAuD,QAAA,kBAAAjF,EAAA0B,SAAAuD,OAAA9G,GAAA6G,OAAAS,OAGAC,MAAAvE,EAAAwE,QAAA,oCAIA,GAAA,SAAA1B,EAAA,CACA,IAAAjE,EAAA0B,SAAAkE,OAAA5F,EAAA0B,SAAAkE,KAAAC,QAAA7F,EAAA0B,SAAAkE,KAAA/G,OAAA,OAGAiF,EAAA9D,EAAA0B,SAAAqC,UAAAzC,EAAAU,UAAAgC,wBAAAF,EAEAe,EACA1D,EAAAZ,QAAA2E,OACA7B,MAAA,WACA,OAAArD,EAAA8F,YAAA9F,EAAA0B,SAAAkE,KAAA,CACAG,WAAA/F,EAAAmC,QAAAnC,EAAA0B,SAAAqC,cAGAV,MAAA,SAAA+B,GACA,IAAAA,EAAA,OAAAjE,EAAAZ,QAAA6D,KAAA,IACA,IAAAvF,EAAAmC,EAAAqE,KAAAC,cAAAF,EAAAG,QAGA,OAAA/D,EAAAkB,gBAAAlB,EAAAkB,gBAAA7D,GACAmB,EAAA0B,SAAAkE,KAAAC,OAAA,EACA1E,EAAAZ,QAAA6D,KAAA,MAGApE,EAAAwF,aAAA,EAEA,CACA3G,OAAAA,EACAuG,QAAAA,OAGAM,MAAAvE,EAAAwE,QAAA,+BAIA,GAAA,WAAA1B,EAAA,CACA,IAAApF,EAAAmB,EAAA0B,SAAA7C,QAAAmB,EAAA0B,SAAA7C,OAAAmH,OACApD,EAAA5C,EAAA0B,SAAAkB,KAAA5C,EAAA0B,SAAAkB,IAAAoD,aAAAP,EACA,IAAA5G,EAAA,OACA,IAAAG,EAAAoC,EAAAnC,OAAAgD,OAAA9C,KAAAN,GAEA,GAAAG,EACA6F,EAAA1D,EAAAZ,QAAA2E,OACA7B,MAAA,WACA,MAAA,CACAxE,OAAAA,EACA+D,IAAAA,UAMA,CAGA,KADA5D,EAAAoC,EAAAnC,OAAAiD,qBAAA/C,KAAAN,IAqBA,OAAAmB,EAAAiG,mBAAApH,GAlBAA,EAAAG,EAAA,GACAA,EAAA,IACAiC,EAAAoE,KAAAa,WAAArH,GAEAmB,EAAA2E,KAAA9F,OAAAsH,OAAA,CAAAC,UAAA,GAGAvB,EAAA1D,EAAAZ,QAAA2E,OACA7B,MAAA,WACA,MAAA,CACAxE,OAAAA,EACA+D,IAAAA,YAaA,GAAA,SAAAqB,EAAA,CAEA,IADAjE,EAAA0B,SAAA7C,QAAAmB,EAAAmC,SAAAnC,EAAA0B,SAAA0D,QACA,OAEAP,EAAA1D,EAAAZ,QAAA2E,OACA7B,MAAA,WACA,MAAA,CACAxE,OAAAmB,EAAA0B,SAAA7C,OACAuG,QAAApF,EAAA0B,SAAA0D,YAKA,GAAAP,EAKA,OAAAA,EAAAxB,MAAA,SAAAL,GACA,GAAAA,EAAA,CAGA,IAAAqD,GAAAjG,QAAAkG,OAAAhF,EAAAuC,KAAAD,WAAA5D,EAAA0B,SAAAkC,YACA2C,GAAAnG,QAAAkG,OAAAhF,EAAAuC,KAAAC,aAAAA,GACA0C,GAAApG,QAAAkG,OAAAhF,EAAAuC,KAAAnD,OAAAY,EAAAuC,KAAAnD,MAAAuD,OAAAA,GACAwC,GAAArG,QAAAkG,OAAAhF,EAAAuC,KAAAnD,OAAAY,EAAAuC,KAAAnD,MAAAyC,OAAAH,EAAAG,QAqBA,OApBAkD,GAAAE,GAAAC,GAAAC,KACAnF,EAAAuC,KAAAD,WAAA5D,EAAA0B,SAAAkC,WACAtC,EAAAuC,KAAAC,aAAAA,EACAxC,EAAAuC,KAAA6C,kBAAApF,EAAAuC,KAAAD,YAAAtC,EAAAuC,KAAA6C,gBACApF,EAAAuC,KAAAnD,MAAAY,EAAAuC,KAAAnD,OAAA,GACAY,EAAAuC,KAAAnD,MAAAuD,OAAAA,EACA3C,EAAAuC,KAAAnD,MAAAyC,OAAAH,EAAAG,OACAlD,EAAAqB,EAAAqF,MAAA,MAGAnF,EAAAoF,SACApF,EAAAoF,QAAA5G,EAAA0B,UAIAF,EAAAqF,QACA1F,EAAAZ,QAAA6D,OAIApE,EAAA8G,WAAA9D,OAhCA+D,QAAAC,KAAA,2BAAA/C,KAoCAjE,EAAAiH,oBAAA,WACAjH,EAAAyB,YACAzB,EAAAnB,OAAA,KACAmB,EAAAwF,aAAA,EACAxF,EAAA2B,aAAA3B,EAAA0B,SAAAoD,YAAA9E,EAAA0B,SAAAqD,SACA/E,EAAA6B,mBAAA7B,EAAA2B,YACA3B,EAAAkH,gBACAlH,EAAA4B,yBAAA,GAGA5B,EAAA4B,yBAAA5B,EAAA6B,mBAAA7B,EAAA2B,aAGA3B,EAAAmH,OAAA,wCAAAnH,EAAAiH,qBAAA,GAEAjH,EAAAkH,cAAA,WAIA,OAHAlH,EAAA4B,yBAAA,EACA5B,EAAAyB,WAAA,EACAzB,EAAAnB,OAAA,KACAoB,GAAA,WACA,IAAAmH,EAAApH,EAAA0B,SAAAoD,SACAuC,EAAArH,EAAA0B,SAAAqD,SACAC,EAAAhF,EAAA0B,SAAAuD,QAAAjF,EAAA0B,SAAAuD,OAAA9B,OACA,OAAAnC,EAAAsG,aAAAF,EAAAC,EAAArC,GACA3B,MAAA,SAAAkC,GAGA,GAAA6B,IAAApH,EAAA0B,SAAAoD,UAAAuC,IAAArH,EAAA0B,SAAAqD,SACA,OAAA/E,EAAAkH,gBAGAlH,EAAAnB,OAAAmC,EAAAqE,KAAAC,cAAAC,GACAvF,EAAA0C,gBAAA1C,EAAA0C,gBAAA1C,EAAAnB,SACAmB,EAAAwF,aAAA,GAGAxF,EAAAyB,WAAA,KAGAiE,OAAA,SAAA6B,GACApG,EAAAwE,QAAA,6BAAAxE,CAAAoG,GACAvH,EAAAyB,WAAA,EACAzB,EAAA6B,mBAAA,EACA7B,EAAAiH,2BAEA,MAGAjH,EAAAwH,cAAA,WACAxH,EAAA8G,aACA7G,GAAA,WACAoB,EAAAoG,aACA,MAGAzH,EAAA0H,yBAAA,WACA1H,EAAA8G,aACA7G,GAAA,WACAoB,EAAAsG,wBACA,MAGA3H,EAAA4H,cAAA,SAAApG,GACA,OAAAH,EAAAwG,SAAArG,IAGAxB,EAAA8H,OAAA,WACA,IAAA9H,EAAAyB,UAOA,OALAzB,EAAAyB,WAAA,EACAzB,EAAA0B,SAAA7C,OAAA,KACAmB,EAAA0B,SAAA0D,QAAA,KAGA7D,EAAAwG,QAAAC,OACA3E,MAAA,SAAAQ,GACA,GAAAA,EAGA,OAAA7D,EAAAmC,OAAAtB,EAAAoH,KAAApE,GAGAzC,EAAA8G,IAAAC,MAAAtE,GACAR,MAAA,SAAAL,GACA,IAAAA,IAAAA,EAAAnE,OAAA,KAAA,CAAAL,QAAA,6BAEA,OAAAwE,KAEA0C,OAAA,SAAA6B,GAEA,OADAR,QAAAqB,MAAA,wCAAAb,GAAAA,EAAA/I,SAAA+I,IACA1D,QAGAR,MAAA,SAAAQ,GACA,GAAAA,EAEA,OAAAA,GAAAA,EAAAhF,OAAAgF,EAGA5C,EAAAoH,QAAAC,UAAAzE,EAAA,CAAAgD,QAAA,IACAxD,MAAA,SAAA+B,GACA,IAAAA,IAAAA,EAAAG,SAAAH,EAAAmD,OAAA,KAAA,CAAA/J,QAAA,6BAKA,MAAA,CACAK,OAJAmC,EAAAwH,OAAAC,OAAArD,EAAAG,QAKAH,QAAAA,MAIAM,MAAAvE,EAAAwE,QAAA,iCAEAtC,MAAA,SAAAL,GACAA,GAAAA,EAAAnE,SAEAmB,EAAAwF,YAAAxF,EAAA0C,gBAAA1C,EAAA0C,gBAAAM,EAAAnE,OACAmB,EAAA0B,SAAA7C,OAAAmE,EAAAnE,OACAmB,EAAA0B,SAAA0D,QAAApC,EAAAoC,YAEA/B,MAAA,WACArD,EAAAyB,WAAA,EACAN,EAAAZ,QAAA6D,KAAA,OAEAsB,OAAA,SAAA6B,GACAvH,EAAAyB,WAAA,EACAN,EAAAwE,QAAA,oBAAAxE,CAAAoG,OAIAvH,EAAAkE,aAAA,SAAAD,EAAAd,GAGA,GAFAnD,EAAA0I,qBAEAzE,GAAAA,GAAAjE,EAAA0B,SAAAuC,OAYA,GAVA8C,QAAAqB,MAAA,sBAAAnE,GACAjE,EAAA0B,SAAAuC,OAAAA,EACAjE,EAAA0B,SAAAkB,IAAA,KAEA5C,EAAA2E,aAEA3E,EAAA2E,KAAAgE,WAIA,kBAAA1E,GAAA,mBAAAA,EAAA,CAKA,IAAAgB,EAJAjF,EAAAnB,OAAA,KAKAsE,GACA8B,EAAAjI,EAAA4L,KAAA5I,EAAA6C,oBAAA,SAAAgG,GACA,OAAAA,EAAA1F,QAAA/C,QAAAkG,OAAAuC,EAAA1F,OAAAA,UAGA8B,EAAAjI,EAAA8L,UAAA9I,EAAA6C,mBAAA,CAAA1E,GAAA,UAAA,IACAgF,OAAAA,GAIA8B,EAAAjI,EAAA8L,UAAA9I,EAAA6C,mBAAA,CAAA1E,GAAA,YAEA6B,EAAA+I,aAAA9D,GAEAjF,EAAA6B,kBAAA7B,EAAA6B,mBAAA,kBAAAoC,MAEA,CAAA,GAAA,QAAAA,EACA,OAAAjE,EAAA8H,SAGA9H,EAAA0B,SAAAoD,SAAA,KACA9E,EAAA0B,SAAAqD,SAAA,KACA/E,EAAA0B,SAAA7C,OAAA,KACAmB,EAAAnB,OAAA,KACAmB,EAAAyB,WAAA,IAIAzB,EAAA+I,aAAA,SAAA9D,GAEAjF,EAAA0B,SAAAuD,OAAA7E,QAAA4I,KAAA/D,GAAA,IACAjF,EAAAiH,uBAGAjH,EAAA8F,YAAA,SAAAF,EAAAqD,GAqBA,OApBAA,EAAAA,GAAA,IAEAlE,SAAAkE,EAAAlE,UAAA/E,EAAA0B,SAAAkE,KAAAb,UAAA,WAEA,OADA/E,EAAA0B,SAAAkE,KAAAb,cAAAU,EACApE,EAAA6H,aAAA,CACA5G,MAAA,gDACA6G,SAAA,+CACA1I,MAAAwI,EAAAxI,MACA2I,MAAApJ,IAEAqD,MAAA,SAAA0B,GAIA,OAFA/E,EAAA0B,SAAAkE,KAAAb,SAAAA,EAEA9E,GAAA,WACA,OAAA8E,IACA,SAIA9D,EAAAoH,QAAAgB,KAAArJ,EAAA0B,SAAAkE,KAAAqD,GACAvD,OAAA,SAAA6B,GAKA,GAJAvH,EAAA0B,SAAAkE,KAAAb,cAAAU,EACA,cAAA8B,GACApG,EAAAZ,QAAA6D,KAAA,IAEAmD,GAAAA,EAAA+B,OAAArI,EAAAsI,WAAAC,aAEA,OAAAxJ,EAAA8F,YAAA9F,EAAA0B,SAAAkE,KAAA,CAAAG,WAAAkD,EAAAlD,WAAAtF,MAAA,gDAEA,MAAA8G,MAIAvH,EAAAyJ,cAAA,SAAA7D,GACAA,GAAAA,EAAA8D,UAIA1J,EAAA0B,SAAAkE,KAAA,CACA+D,KAAA/D,EAAA8D,SAAAC,KACAC,KAAAhE,EAAA8D,SAAAE,KACAC,QAAAjE,EAAAkE,aAEA9J,EAAA+J,gBAAA,EACA9J,GAAA,WAIA,OAHA8G,QAAAqB,MAAA,6BAAApI,EAAA0B,SAAAkE,MACA5F,EAAA+J,gBAAA,EAEA/J,EAAA8F,YAAA9F,EAAA0B,SAAAkE,KAAA,CAAAG,YAAA,EAAAhB,SAAA/E,EAAA0B,SAAAkE,KAAAb,WACA1B,MAAA,SAAA+B,GACAA,GAAAA,EAAAG,QAKAvF,EAAA0B,SAAAkE,KAAA/G,OAAAmC,EAAAqE,KAAAC,cAAAF,EAAAG,QACAvF,EAAA0B,SAAAkE,KAAAC,OAAA7F,EAAA0C,gBAAA1C,EAAA0C,gBAAA1C,EAAA0B,SAAAkE,KAAA/G,OACAmB,EAAA+J,gBAAA,IANA/J,EAAA0B,SAAAkE,KAAAC,OAAA,EACA7F,EAAA0B,SAAAkE,KAAA/G,YAAA4G,MASAC,OAAA,SAAA6B,GACAA,GAAA,cAAAA,EACAvH,EAAAgK,iBAGAhK,EAAA+J,gBAAA,EACA/J,EAAA0B,SAAAkE,KAAAC,OAAA,EACA7F,EAAA0B,SAAAkE,KAAA/G,YAAA4G,EACAtE,EAAAwE,QAAA,wBAAAxE,CAAAoG,WAlCAvH,EAAA+J,gBAAA,GAuCA/J,EAAAgK,cAAA,WACAhK,EAAA0B,SAAAkE,UAAAH,GAKAzF,EAAAiG,mBAAA,SAAAgE,GACA,OAAA5I,EAAA6I,cAAA,CAAAC,EAAAF,IACA5G,MAAA,SAAAL,GACA,GAAAA,GAAAA,EAAAnE,OAGA,OAFAmB,EAAA0B,SAAA7C,OAAAmE,EAAAnE,OACAmB,EAAA0B,SAAAkB,IAAAI,EAAAJ,UAAA6C,EACAxF,EAAAD,EAAAyE,QAAA,SAMAzE,EAAAoK,mBAAA,SAAAC,GACAA,EAAAC,kBACAnJ,EAAAoJ,QAAArF,KAAAmF,EAAA,CACAG,YAAA,uCACApB,MAAApJ,EACAyK,YAAA,EACAC,UAAA,SAAAH,GACAvK,EAAA2K,eAAAJ,EACApJ,EAAAkD,IAAA,CAAAC,SAAA,qCAKAtE,EAAA0I,mBAAA,WACA1I,EAAA2K,iBACA3K,EAAA2K,eAAAvG,OACApE,EAAA2K,eAAA,OAKA3K,EAAAoD,OAcA,SAAAwH,EAAA5K,EAAAE,GAGAE,QAAAC,OAAA9D,KAAA2D,EAAA,iBAAA,CAAAF,OAAAA,EAAAwB,WAAA,CAAAY,MAAA,MAEApC,EAAA6K,QAAA,SAAAlG,GACA3E,EAAA2E,KAAAA,GCniBA,SAAAmG,EAAA9K,EAAA+K,EAAA9K,EAAA+K,EAAA1J,GAGAtB,EAAAW,IAAA,oBAAA,SAAAsK,GACAjL,EAAAkL,OAAA5J,EAAAuC,KAAAqH,OAAA/M,GACA4M,EAAAI,aAAAJ,EAAAI,YAAAC,SACApL,EAAAoL,OAAAL,EAAAI,YAAAC,OACAnL,GAAA,WACA+K,EAAAD,EAAAI,YAAAC,UACA,SAKA,SAAAC,EAAArL,EAAAC,EAAA+K,EAAA1J,EAAAE,GAGAxB,EAAAsL,WAAA,GACAtL,EAAAkL,OAAA5J,EAAAuC,KAAAqH,OAAA/M,IAEAqD,EAAAA,GAAA,KACA,iBAAAA,IACAA,EAAA,CAAA4J,OAAA5J,IAGAA,EAAA4J,SAEAnL,GAAA,WACA+K,EAAAxJ,EAAA4J,UACA,KAGApL,EAAAsL,WAAA,GACAtL,EAAAsL,WAAA9J,EAAA4J,QAAA,WACApL,EAAAuL,UAAA,aASA,SAAAC,EAAAxL,EAAA+K,EAAAhK,EAAA0K,EAAAxL,EAAAY,EAAAmK,EACA7J,EAAAuK,EAAApK,EAAAqK,EAAAC,EAAArK,EAAApB,GAEAH,EAAA6L,MAAA,EACA7L,EAAA8L,UAAA,EAEA9L,EAAA+L,YAAA,SAAAC,EAAAC,EAAAC,GAGA,IAFAA,EAAA9L,QAAAoC,UAAA0J,GAAAA,EAAA,IAEAD,EAAAlP,OACA,OAAA8D,EAAAoH,MAAA,GAGA,IAAAkE,EAAAF,EAAAC,GACA,GAAA,mBAAAC,EACA,MAAA,IAAAvN,MAAA,6EAAAmD,OAAAmK,EAAAF,IAEA,IAAAnH,EAAAsH,IAIA,MAHA,kBAAAtH,IACAA,EAAAhE,EAAAoH,KAAApD,IAEAA,EACAxB,MAAA,SAAA+I,GACA,OAAAhM,QAAAiM,YAAAD,IACApM,EAAA8L,UAAA,EACAI,GAEAE,GAAAF,IAAAD,EAAAlP,OAAA,EAGAiD,EAAA+L,YAAAC,EAAAC,EAAAC,EAAA,GAFAE,GAAA,EAAAF,EAAA,KAIAxG,OAAA,SAAA6B,GAQA,OAPAA,GAAA,yBAAAA,EAAA/I,QACAuI,QAAAtG,MAAA,2GAAAsB,OAAAiK,EAAAE,IAGAnF,QAAAtG,MAAA,kDAAAsB,OAAAiK,EAAAE,EAAA3E,IAEAvH,EAAA8L,UAAA,EACAI,MAIAlM,EAAAsM,YAAA,SAAAnO,EAAA8K,GASA,OARAA,EAAAA,GAAA,IACAsD,SAAAtD,EAAAsD,UAAA,GACAtD,EAAAsD,SAAAC,MAAAvD,EAAAsD,SAAAC,OAAA,GACAvD,EAAAsD,SAAAE,SAAArM,QAAAoC,UAAAyG,EAAAsD,SAAAE,UAAAxD,EAAAsD,SAAAE,QACAxD,EAAAyD,QAAAzD,EAAAyD,UAAAnL,EAAAoL,OAAA,IAAA,KACA1D,EAAAwB,YAAA,EACAxB,EAAAsD,SAAAV,KAAA7L,EAAA6L,KACA5C,EAAA2D,sBAAA5M,EAAA6L,KACA1K,EAAAoJ,QAAAsC,QAAA1O,EAAA8K,IAGAjJ,EAAA4H,cAAA,SAAAkF,GACAzL,OAAAwG,SAAA,CAAAuD,OAAA0B,KAGA9M,EAAA+M,cAAA,WAKA,OAJA/M,EAAA6L,MAAA,EACA7L,EAAA8L,UAAA,EAGA9L,EAAAgN,uBAAA,GAAA,GAGA3J,MAAA,SAAA+I,GACA,QAAAA,KACAjM,EAAAK,WACAR,EAAAiN,gBAAA,GAAA,GACA5J,MAAA,SAAA6J,GACA,QAAAA,IACA5L,EAAAuC,KAAAgJ,QAAAM,OAAAD,EACA5L,EAAAqF,QACA3G,EAAA8L,iBAKAzI,MAAA,SAAA+I,GACA,QAAAA,KACAjM,EAAAK,WACAR,EAAAoN,oBAAA,GAAA,GACA/J,MAAA,SAAA6J,GACA,QAAAA,IACA5L,EAAAuC,KAAAgJ,QAAAQ,YAAAH,EACA5L,EAAAqF,QACA3G,EAAA8L,iBAKAzI,MAAA,SAAA+I,GACA,QAAAA,KACAjM,EAAAK,WACAR,EAAAsN,YAAA,GAAA,GACAjK,MAAA,SAAA6J,GACA,QAAAA,IACA5L,EAAAuC,KAAAgJ,QAAAU,GAAAL,EACA5L,EAAAqF,QACA3G,EAAA8L,iBAKAzI,MAAA,SAAA+I,GACA,QAAAA,KACAjM,EAAAK,WACAR,EAAAwN,iBAAA,GAAA,GACAnK,MAAA,SAAA6J,GACA,QAAAA,IACA5L,EAAAuC,KAAAgJ,QAAAY,QAAAP,EACA5L,EAAAqF,QACA3G,EAAA8L,iBAKAzI,MAAA,SAAA+I,GACA,QAAAA,GACApM,EAAA0N,gBAAA,GAAA,MAIArK,MAAA,SAAA+I,GACA,QAAAA,GACApM,EAAA2N,kBAAA,GAAA,MAIAtK,MAAA,SAAA+I,GACA,QAAAA,GACApM,EAAA4N,mBAAA,GAAA,GACAvK,MAAA,SAAA6J,GACA,SAAAA,GAAAlN,EAAA6N,aACAvM,EAAAuC,KAAAgJ,QAAAiB,UAAAZ,EACA5L,EAAAqF,QACA3G,EAAA8L,gBAKAzI,MAAA,SAAA+I,GACA,QAAAA,GACApM,EAAA+N,aAAA,GAAA,GACA1K,MAAA,SAAA6J,GACA,SAAAA,GAAAlN,EAAA6N,aACAvM,EAAAuC,KAAAgJ,QAAAmB,IAAAd,EACA5L,EAAAqF,QACA3G,EAAA8L,gBAKAzI,MAAA,SAAA+I,GACA,QAAAA,GACApM,EAAAiO,iBAAA,GAAA,GACA5K,MAAA,SAAA6J,GACA,QAAAA,IACA5L,EAAAuC,KAAAgJ,QAAAqB,SAAAhB,EACA5L,EAAAqF,QACA3G,EAAA8L,gBAKAzI,MAAA,SAAA+I,GACA,QAAAA,GAEApM,EAAAmO,kBAAA,GAAA,GACA9K,MAAA,SAAA6J,GACA,SAAAA,GAAAlN,EAAA6N,aACAvM,EAAAuC,KAAAgJ,QAAAuB,SAAAlB,EACA5L,EAAAqF,QACA3G,EAAA8L,gBAKAzI,MAAA,SAAA+I,GACA,QAAAA,GACApM,EAAAqO,iBAAA,GAAA,GACAhL,MAAA,SAAA6J,GACA,SAAAA,GAAAlN,EAAA6N,aACAvM,EAAAuC,KAAAgJ,QAAAyB,QAAApB,EACA5L,EAAAqF,QACA3G,EAAA8L,gBAMAzI,MAAA,SAAA+I,GACA,QAAAA,GACApM,EAAAuO,iBAQAvO,EAAAmO,kBAAA,SAAAK,EAAA/B,GAEA,IAMAgC,EAEAxC,EAAA,CAEA,WAEA,OADAR,EAAAiD,YAAA,GACA1O,EAAAsM,YAAA,4BAAA,CACAC,SAAA,CACA1C,QAAA,6BACA8E,KAAA,CACAC,SAAAzN,EAAAuC,OAAAC,UAAA,OAAA,mBAMA,WAIA,OAHA8H,EAAAoD,UACApD,EAAAiD,YAAA,GAEA3D,EAAA+D,GAAA3N,EAAAuC,OAAAC,UAAA,eAAA,mBACAN,MAAA,WACA,OAAArD,EAAAsM,YAAA,+BAAA,CACAC,SAAA,CACA1C,QAAA,yBACA8E,KAAA,CACAC,SAAA,iBAOA,WACA,OAAAtN,EAAAuC,KAAAkL,aACA/O,EAAAsM,YAAA,oCAAA,CACAC,SAAA,CACA1C,QAAA,kCACA4E,cAAAA,EACAE,KAAA,CACAC,SAAAzN,EAAAuC,OAAAC,UAAA,QAAA,cAkCA,WAEA,OADAqH,EAAA,iCACAhL,EAAAsM,YAAA,yBAAA,CACAC,SAAA,CACA1C,QAAA,0BACA8E,KAAA,CACAC,SAAA,SACAI,MAAA,+BAMA,WAGA,OA/FAjE,EAAAkE,GAAA,gCACAlE,EAAA+D,GAAA,wBA6FA9D,EAAA,qCACAhL,EAAAsM,YAAA,6BAAA,CACAC,SAAA,CACA1C,QAAA,wBACA8E,KAAA,CACAC,SAAA,UAEAnC,QAAAA,GAEAC,QAAA,KACAwC,MAAA,MAMA,OAAAvD,EAAAwD,MAAA9L,MAAA,SAAA+K,GAGA,OAFAK,EAAAL,EAAA5M,WAEAxB,EAAA+L,YAAA,WAAAE,EAAAuC,OAQAxO,EAAAqO,iBAAA,SAAAG,EAAA/B,GAEA,IAAA2C,EAAA,WACArE,EAAAkE,GAAA,iBAEAhP,GAAA,WACA,IAAAoP,EAAAtO,EAAAuO,SAAAC,iBAAA,oBACAF,GAAA,GAAAA,EAAAtS,QACAqD,QAAAoP,QAAAH,EAAA,IAAAI,eAAA,WAEA,MAMAxD,EAAA,CAEA,WACA,QAAA9K,EAAAuC,OAAAC,YACA8H,EAAAiD,YAAA,GACA1O,EAAAsM,YAAA,2BAAA,CACAC,SAAA,CACA1C,QAAA,4BACA8E,KAAA,CACAC,SAAAzN,EAAAuC,OAAAC,UAAA,OAAA,oBAMA,WAIA,OAHA8H,EAAAoD,UACApD,EAAAiD,YAAA,GAEA3D,EAAA+D,GAAA3N,EAAAuC,OAAAC,UAAA,2BAAA,eACAN,MAAA,WAEA,OADA+L,IACApP,EAAAsM,YAAA,wBAAA,CACAC,SAAA,CACA1C,QAAA,8BACA8E,KAAA,CACAC,SAAA,SACAI,MAAA,4BAGAtC,QAAA,WAKA,WAEA,OADA0C,IACApP,EAAAsM,YAAA,yBAAA,CACAC,SAAA,CACA1C,QAAA,yBACA8E,KAAA,CACAC,SAAAzN,EAAAuC,OAAAC,eAAA8B,EAAA,WAGAiH,QAAA,IACAwC,MAAA,MAKA,WAEA,OADAE,IACApP,EAAAsM,YAAA,+BAAA,CACAC,SAAA,CACA1C,QAAA,sCACA8E,KAAA,CACAC,SAAAzN,EAAAuC,OAAAC,eAAA8B,EAAA,cAMA,WACA2J,IACA,IAAAlE,EAAA5J,EAAAuC,KAAAqH,OAAA/M,GACA,OAAA6B,EAAAsM,YAAA,wBAAA,CACAC,SAAA,CACA1C,QAAA,qCACA4E,cAAA,CACAiB,cAAAhE,EAAAmB,SAAAnB,EAAAmB,QAAA6C,cACAhE,EAAAmB,QAAA6C,cAAAxE,GAAAQ,EAAAmB,QAAA6C,cAAAxE,GAAAQ,EAAAmB,QAAA6C,cACA,sBAEAf,KAAA,CACAC,SAAA,SACAI,MAAA,2BAEAvC,QAAAA,OAOA,OAAAd,EAAAnK,aAAA6B,MAAA,SAAA7B,GAGA,OAAAxB,EAAA+L,YAAA,UAAAE,EAAAuC,OAQAxO,EAAA4N,mBAAA,SAAAY,EAAA/B,GAEA,IAAAR,EAAA,CACA,WAEA,OADAR,EAAAiD,YAAA,GACA1O,EAAAsM,YAAA,uBAAA,CACAC,SAAA,CACA1C,QAAA,wBACA8E,KAAA,CACAC,SAAAzN,EAAAuC,OAAAC,UAAA,OAAA,gBAGAgC,QAAA,cAIA,WAIA,OAHA8F,EAAAoD,UACApD,EAAAiD,YAAA,GAEA3D,EAAA+D,GAAA3N,EAAAuC,OAAAC,UAAA,4BAAA,qBACAN,MAAA,WACA,OAAArD,EAAAsM,YAAA,0BAAA,CACAC,SAAA,CACA1C,QAAA1I,EAAAuC,OAAAC,UAAA,8BAAA,2BACAgL,KAAA,CACAC,SAAA,iBAOA,WACA,OAAA5O,EAAAsM,YAAA,8BAAA,CACAC,SAAA,CACA1C,QAAA,6BACA8E,KAAA,CACAC,SAAA,WAGAlC,QAAA,IACAwC,MAAA,MAIA,WACA,IAAAM,EAAAzO,EAAAuO,SAAAK,eAAA,+BACA,OAAAH,IACAvP,GAAA,WACAG,QAAAoP,QAAAA,GAAAC,eAAA,YAEAzP,EAAAsM,YAAA,kCAAA,CACAC,SAAA,CACA1C,QAAA,mCACA4C,QAAAA,GAEAC,QAAA,UAMA,OAAA1M,EAAA+L,YAAA,YAAAE,EAAAuC,IAOAxO,EAAA+N,aAAA,SAAAS,EAAA/B,GACA,IAAAgC,EAEAxC,EAAA,CACA,WACA,OAAAjM,EAAAsM,YAAA,kCAAA,CACAC,SAAA,CACA1C,QAAA,yCACA4E,cAAAA,EACAE,KAAA,CACAC,SAAA,SACAI,MAAA,+BAMA,WACA,OAAAhP,EAAAsM,YAAA,wCAAA,CACAC,SAAA,CACA1C,QAAA,yCACA8E,KAAA,CACAC,SAAA,UAEAnC,QAAAA,OAOA,OAAAd,EAAAwD,MAAA9L,MAAA,SAAA+K,GAIA,OAHAK,EAAAL,EAAA5M,YACAoO,UAAAxB,EAAAwB,UAEA5P,EAAA+L,YAAA,MAAAE,EAAAuC,OAQAxO,EAAAiO,iBAAA,SAAAO,EAAA/B,GACA,IAAAR,EAAA,CAEA,WAEA,GAAAlB,EAAAkE,GAAA,oBAAA,CACA,IAAAO,EAAAzO,EAAAuO,SAAAK,eAAA,mCACA,IAAAH,EAAA,OAAA,EACAvP,GAAA,WACAG,QAAAoP,QAAAA,GAAAC,eAAA,YAGA,OAAAzP,EAAAsM,YAAAnL,EAAAuC,OAAAC,UAAA,cAAA,wBAAA,CACA4I,SAAA,CACA1C,QAAA,4BACA8E,KAAA,CACAC,SAAAzN,EAAAuC,OAAAC,UAAA,eAAA,WAGA+I,QAAAvL,EAAAuC,OAAAC,UAAA,IAAA,IACAuL,MAAA,MAIA,WACA,OAAAlP,EAAAsM,YAAAnL,EAAAuC,OAAAC,UAAA,cAAA,wBAAA,CACA4I,SAAA,CACA1C,QAAA,yBACA8E,KAAA,CACAC,SAAA,SACAI,MAAA,qBAEAvC,QAAAA,OAMA,OAAAzM,EAAA+L,YAAA,QAAAE,EAAAuC,IAOAxO,EAAAgN,uBAAA,SAAAwB,EAAA/B,GACA,GAAAtM,EAAAK,UAAA,OAAAK,EAAAoH,MAAA,GAEA,IAAAgE,EAAA,CACA,WAEA,OADAR,EAAAiD,YAAA,GACA1O,EAAAsM,YAAA,2BAAA,CACAC,SAAA,CACA1C,QAAA,4BACA8E,KAAA,CACAC,SAAA,QAEAnC,QAAAA,MAKA,WAEA,OADAhB,EAAAiD,YAAA,GACA1O,EAAAsM,YAAA,sBAAA,CACAC,SAAA,CACA1C,QAAA,uBACA8E,KAAA,CACAC,SAAA,QAEAnC,QAAAA,MAKA,WAEA,OADAhB,EAAAiD,YAAA,GACA1O,EAAAsM,YAAA,2BAAA,CACAC,SAAA,CACA1C,QAAA,4BACA8E,KAAA,CACAC,SAAA,QAEAnC,QAAAA,OAMA,OAAAzM,EAAA+L,YAAA,kBAAAE,EAAAuC,IAOAxO,EAAAiN,gBAAA,SAAAuB,EAAA/B,GACA,IAAAtM,EAAAK,UAAA,OAAAK,EAAAoH,MAAA,GAEA,IAAA4H,EAAA1P,EAAA0D,KAAAiM,UAAA3P,EAAA0D,KAAAkM,cAAA5P,EAAA0D,KAAAkM,aAAAC,kBAGA/D,EAAA,CACA,WAEA,OADAR,EAAAiD,YAAA,GACA1O,EAAAsM,YAAA,2BAAA,CACAC,SAAA,CACA1C,QAAA1J,EAAA0D,KAAAiM,SAAA,mCAAA,4BACAnB,KAAA,CACAC,SAAA,YAMA,WAMA,OALAnD,EAAAoD,UACApD,EAAAiD,YAAA,GAIA3D,EAAA+D,GAAA,mBACAzL,MAAA,WACA,OAAArD,EAAAsM,YAAAnL,EAAAuC,OAAAC,UAAA,4BAAA,yBAAA,CACA4I,SAAA,CACA1C,QAAA,0BACA8E,KAAA,CACAC,SAAAzN,EAAAuC,OAAAC,UAAA,QAAA,WAGA+I,QAAAvL,EAAAuC,OAAAC,UAAA,IAAA,IACAuL,MAAA,SAMA,WAEA,OADAlE,EAAA,yBACAhL,EAAAsM,YAAA,wBAAA,CACAC,SAAA,CACA1C,QAAA,yBACA8E,KAAA,CACAC,SAAA,UAEAnC,SAAAoD,GAAApD,GAEAC,QAAAvL,EAAAuC,OAAAC,UAAA,IAAA,IACAuL,MAAA,MAIA,WACA,OAAAW,GACA7E,EAAA,iCACAhL,EAAAsM,YAAA,gCAAA,CACAC,SAAA,CACA1C,QAAA1I,EAAAuC,OAAAC,UAAA,0CAAA,iCACAgL,KAAA,CACAC,SAAA,UAEAnC,QAAAA,GAEAC,QAAA,IACA/G,QAAA,cAXA8G,IAsBA,OALAR,EAAAlP,QAAA6O,EAAAuB,OAAA8C,WACAlJ,QAAAtG,MAAA,mFAAAsB,OAAAkK,EAAAlP,SAIA4O,EAAAwD,MACA9L,MAAA,SAAA+K,GAIA,OAHAA,EAAA5M,WACAoO,UAAAxB,EAAAwB,UAEA5P,EAAA+L,YAAA,SAAAE,EAAAuC,OAQAxO,EAAAoN,oBAAA,SAAAoB,EAAA/B,GACA,IAAAtM,EAAAK,UAAA,OAAAK,EAAAoH,MAAA,GAEA,IACAiI,GAAA,EAEAjE,EAAA,CAEA,WAEA,GAAAlB,EAAAkE,GAAA,mBAAA,CACA,IAAAO,EAAAzO,EAAAuO,SAAAK,eAAA,iCACA,IAAAH,EAEA,OADAU,GAAA,GACA,EAEAjQ,GAAA,WACAG,QAAAoP,QAAAA,GAAAC,eAAA,YAGA,OAAAtO,EAAAuC,OAAAC,WACA3D,EAAAsM,YAAA,yBAAA,CACAC,SAAA,CACA1C,QAAA,qCAKA,WACA,SAAAqG,GAAA/O,EAAAuC,OAAAC,YACAoH,EAAA+D,GAAA,mBACAzL,MAAA,WACA,OAAArD,EAAAsM,YAAA,sCAAA,CACAC,SAAA,CACA1C,QAAA,uCACA8E,KAAA,CACAC,SAAA,WAGAlC,QAAA,UAKA,WACA,GAAAwD,EAAA,OAAA,EAGA,GAAAnF,EAAAkE,GAAA,mBAAA,CACA,IAAAO,EAAAzO,EAAAuO,SAAAK,eAAA,uCACA,IAAAH,EAEA,OADAU,GAAA,GACA,EAEAjQ,GAAA,WACAG,QAAAoP,QAAAA,GAAAC,eAAA,WACA,KAEA,OAAAzP,EAAAsM,YAAAnL,EAAAuC,OAAAC,UAAA,qBAAA,+BAAA,CACA4I,SAAA,CACA1C,QAAA,0BACA8E,KAAA,CACAC,SAAAzN,EAAAuC,OAAAC,UAAA,eAAA,WAGA+I,QAAAvL,EAAAuC,OAAAC,UAAA,IAAA,IACAuL,MAAA,MAIA,WACA,OAAAlP,EAAA6L,MAAAqE,EAAAzD,EACAzM,EAAAsM,YAAA,sBAAA,CACAC,SAAA,CACA1C,QAAA,yBACA8E,KAAA,CACAC,SAAA,SACAI,MAAA,qBAEAvC,QAAAA,OAoBA,OAAAd,EAAAnK,aAAA6B,MAAA,SAAA7B,GAEA,OAAAxB,EAAA+L,YAAA,QAAAE,EAAAuC,OAQAxO,EAAAsN,YAAA,SAAAkB,EAAA/B,GACA,IAAAtM,EAAAK,UAAA,OAAAK,EAAAoH,MAAA,GAEA,IAAAwG,EAEAxC,EAAA,CACA,WAEA,OADAR,EAAAiD,YAAA,GACA1O,EAAAsM,YAAA,sBAAA,CACAC,SAAA,CACA1C,QAAA,uBACA8E,KAAA,CACAC,SAAA,YAMA,WAMA,OALAnD,EAAAoD,UACApD,EAAAiD,YAAA,GAIA3D,EAAA+D,GAAA,sBACAzL,MAAA,WACA,OAAArD,EAAAsM,YAAA,yBAAA,CACAC,SAAA,CACA1C,QAAAvI,EAAAuC,KAAAkL,YAAA,mCAAA,0BACAN,cAAAA,EACAE,KAAA,CACAC,SAAA,WAGAM,MAAA,SAKA,WACA,OAAAlP,EAAAsM,YAAA,yBAAA,CACAC,SAAA,CACA1C,QAAA,sCACA4E,cAAAA,EACAE,KAAA,CACAC,SAAA,SACAI,MAAA,gCAQA,OAAArD,EAAAwD,MACA9L,MAAA,SAAA+K,GAIA,OAHAK,EAAAL,EAAA5M,YACAoO,UAAAxB,EAAAwB,UAEA5P,EAAA+L,YAAA,KAAAE,EAAAuC,OAQAxO,EAAAwN,iBAAA,SAAAgB,EAAA/B,GAEA,IAAAR,EAAA,CACA,WAEA,OADAR,EAAAiD,YAAA,GACA1O,EAAAsM,YAAA,2BAAA,CACAC,SAAA,CACA1C,QAAA,4BACA8E,KAAA,CACAC,SAAA,QAEAnC,QAAAA,OAMA,OAAAzM,EAAA+L,YAAA,aAAAE,EAAAuC,IAOAxO,EAAA0N,gBAAA,SAAAc,EAAA/B,GACA,GAAAtL,EAAAuC,OAAAC,UAAA,OAAA9C,EAAAoH,MAAA,GAEA,SAAAkI,IACA,IAAAC,EAAArP,EAAAuO,SAAAC,iBAAA,mCACA,OAAAa,GAAAA,EAAArT,OACAC,EAAA4L,KAAAwH,GAAA,SAAAC,GAAA,OAAAA,EAAAC,YAAA,KADA,KAIA,IAAArE,EAAA,CACA,WAEA,GAAA9K,EAAAuC,OAAAC,UAAA,OAAA,EACA,IAAA6L,EAAAW,IACA,IAAAX,EAAA,OAAA,EAGA,IAAAe,EAAAxF,EAAAkE,GAAA,YAAA,0BAAAxJ,EAEA,OAAAzF,EAAAsM,YAAAkD,EAAA,CACAjD,SAAA,CACA1C,QAAA,kCACA8E,KAAA,CACAC,SAAA,QACA4B,MAAAD,OAMA,WAEA,GAAApP,EAAAuC,OAAAC,UAEA,OADA8H,EAAAiD,YAAA,GACA1O,EAAAsM,YAAA,4BAAA,CACAC,SAAA,CACA1C,QAAA,6BACA8E,KAAA,CACAC,SAAA,QAEAnC,QAAAA,GAEAC,QAAA,MAKA,IAAA8C,EAAAW,IACA,OAAAX,IACAvP,GAAA,WACAG,QAAAoP,QAAAA,GAAAC,eAAA,YAEAzP,EAAAsM,YAAA,uCAAA,CACAC,SAAA,CACA1C,QAAA,6BACA8E,KAAA,CACAC,SAAA,UAEAnC,QAAAA,GAEAC,QAAA,MAEArJ,MAAA,SAAAL,GAGA,OADAhD,EAAAyQ,sBACAzN,QAMA,OAAAhD,EAAA+L,YAAA,SAAAE,EAAAuC,IAOAxO,EAAA2N,kBAAA,SAAAa,EAAA/B,GACA,IAAAgC,EACAxC,EAAA,CAEA,WACA,OAAA9K,EAAAuC,OAAAC,YACA8H,EAAAiD,YAAA,GACA1O,EAAAsM,YAAA,4BAAA,CACAC,SAAA,CACA1C,QAAA,6BACA8E,KAAA,CACAC,SAAA,SAGAlC,QAAA,QAIA,WAMA,OALAjB,EAAAoD,UACApD,EAAAiD,YAAA,GAIA3D,EAAA+D,GAAA,gBACAzL,MAAA,WACA,OAAArD,EAAAsM,YAAA,qCAAA,CACAC,SAAA,CACA1C,QAAA,gCACA4E,cAAAA,EACAE,KAAAxN,EAAAuC,OAAAC,UAAA,CACAiL,SAAA,QACA4B,MAAA,sBACA,CAAA5B,SAAA,UACAnC,QAAAA,GAEAC,QAAA,WAMA,OAAAf,EAAAnK,aACA6B,MAAA,SAAA7B,GAEA,OADAiN,EAAAjN,EACAxB,EAAA+L,YAAA,WAAAE,EAAAuC,OASAxO,EAAAuO,WAAA,WAMA,OALA9C,EAAAoD,UACApD,EAAAiD,YAAA,GAIAvO,EAAAK,UACAuK,EAAA+D,GAAA,mBACAzL,MAAA,WACA,OAAArD,EAAAsM,YAAA,wBAAA,CACAC,SAAA,CACA1C,QAAA,qBACA4C,SAAA,GAEAC,QAAA,UAQA7L,EAAA6P,IAAA,CACA1Q,EAAA2Q,WAEAhF,EAAAnK,aACA6B,MAAA,SAAA7B,GACAiN,EAAAjN,OAGA6B,MAAA,WACA,OAAArD,EAAAsM,YAAA,oBAAA,CACAC,SAAA,CACA1C,QAAA,yBACA4E,cAAAA,EACAhC,SAAA,QAdA,IAAAgC,GAyBA,SAAAmC,EAAA5Q,GAEAA,EAAAW,IAAA,oBAAA,SAAAsK,EAAA4F,GACA7Q,EAAA+M,mBChyBA,GCvaA3M,QAAA0Q,OAAA,2BAAA,CAAA,QAAA,kBAEAC,QAAA,aAAA,CAAA,aAAA,KAAA,UAAA,MAAA,eAAA,aAAA,WAAA,SAAAC,EAAAnQ,EAAAE,EAAAkQ,EAAAC,EAAAC,EAAAzF,GAIA,IAAA0F,EAAA,CACA,CAAAjT,GAAA,KAAA+E,MAAA,UAAAmO,KAAA,MACA,CAAAlT,GAAA,QAAA+E,MAAA,eAAAmO,KAAA,MACA,CAAAlT,GAAA,QAAA+E,MAAA,YAAAmO,KAAA,MACA,CAAAlT,GAAA,QAAA+E,MAAA,WAAAmO,KAAA,MACA,CAAAlT,GAAA,QAAA+E,MAAA,aAAAmO,KAAA,MACA,CAAAlT,GAAA,QAAA+E,MAAA,UAAAmO,KAAA,MACA,CAAAlT,GAAA,QAAA+E,MAAA,WAAAmO,KAAA,OAEAC,EAAA5F,EAAA6F,iBAAAC,EAAA9F,EAAA6F,kBAAA,KAGA,SAAAC,EAAAtG,GACA,IAAAA,EAAA,OAAAoG,EAGA,GAAAtU,EAAA8L,UAAAsI,EAAA,CAAAjT,GAAA+M,IAAA,OAAAA,EAGA,IAAAuG,EAAAvG,EAAAxM,MAAA,KACA,GAAA+S,EAAA1U,OAAA,EACA,OAAAyU,EAAAC,EAAA,IAIA,IAAAC,EAAA1U,EAAA4L,KAAAwI,GAAA,SAAAO,GACA,OAAAC,OAAAC,UAAAlT,WAAAmT,KAAAH,EAAAxT,GAAA+M,MAEA,OAAAwG,EAAAA,EAAAvT,GAEAmT,EAYA,IAoEAS,EAEAC,EA9EA9G,EACA+G,EAQAjQ,EAAA,CACAkQ,YAAA,WACAlO,uBAAA,MAGAmO,EAAA,CACAzF,QAAA,IACA0F,YAAA,IACAC,4BAAA,OACAC,kBAAA,OACAC,WAAA,QACAC,YAAA,+DACAC,aAAA,iCACAC,iBAAA,8DACAC,wBAAA,+DACAC,WAAA,GAEAC,EAAAzS,QAAA0S,MAAA,CACA/D,aAAA,EACArI,kBAAA3F,EAAAmQ,aACA6B,2BAAA,EACAC,cAAA,EACAC,wBAAA,OACAC,yBAAA,MACAC,0BAAA,EACAvP,YAAA,EACAE,aAAA,IACAsP,eAAA,EACAC,YAAA,EACAC,aAAA,EACAC,WAAA,EACAC,oBAAA,EACA3G,QAAA,CACAF,QAAA,EACA+C,cAAA,+CACAtB,SAAA,EACAE,QAAA,EACAR,UAAA,EACAE,IAAA,EACAE,SAAA,EACAf,OAAA,EACAE,YAAA,EACAI,QAAA,EACAgG,OAAA,EACAC,SAAA,GAEAtF,SAAA,CACAuF,UAAA,EACAC,aAAA,GAEAzG,OAAA,CACAxL,YAAA,EACAkS,qBAAA,GAEA3I,OAAA,CACA/M,IAhEA+M,EAgEAQ,EAAAoI,iBAAA3C,EAAA4C,MA/DA9B,EAAAT,EAAAtG,GACAA,IAAA+G,GACAlL,QAAAqB,MAAA,uCAAArG,OAAAmJ,EAAA+G,IAEAA,IA6DA+B,QAAA,CACAC,GAAA,wBACAC,QAAA,2BACAC,QAAA,6BAGAhC,EACAzG,GAEA7H,EAAA,GAEAuQ,GAAA,EAEAC,EAAA,IAAApD,EAAA1U,KAAA,cA2BA+X,EAAA,WAEA,GADAlU,QAAAiM,YAAA0F,KAAA3R,QAAAkG,OAAAyL,EAAAlO,GAGA,OADAkO,EAAA3R,QAAA4I,KAAAnF,GACAwQ,EAAAxQ,KAAA0Q,MAAAC,QAAA3Q,IAIA8C,EAAA,WACA,OAAAyN,GAMAvQ,EAAA6C,iBAEA,IAAA7C,EAAA4Q,KAAAC,UACAxD,EAAAyD,UAAA3S,EAAAkQ,aACA7O,MAAA,SAAAuR,GACA,IAAAC,EAAAzU,QAAA4I,KAAAnF,GAGA,OAFAgR,EAAAJ,KAAAG,GAAAA,EAAAH,MAAA,UACAI,EAAAH,UACAxD,EAAA4D,UAAA9S,EAAAkQ,YAAA2C,MAIA3D,EAAA4D,UAAA9S,EAAAkQ,YAAArO,GAIAqN,EAAA4D,UAAA9S,EAAAkQ,YAAA,OAIA7O,MAAA,WAMA,OALAQ,EAAA6C,iBACAK,QAAAqB,MAAA,2BAIAiM,EAAAxQ,KAAAkR,aAAApO,MAAA9C,MAIAR,KAAAiR,IAnCAvN,QAAAqB,MAAA,wCACA4J,GAAAgD,KAAA3R,KAAAsD,KAyCAsO,EAAA,SAAAC,GACA,GAAAA,EAAA,CAEA,IAAAC,GAAA,EACA,GAAAD,EAAAhK,QAAAgK,EAAAhK,OAAA/M,GAAA,CAEA,IAAAiX,EAAA5D,EAAA0D,EAAAhK,OAAA/M,IACA+W,EAAAhK,OAAAlO,EAAA8L,UAAAsI,EAAA,CAAAjT,GAAAiX,IACAD,GAAAtR,EAAAqH,QAAAgK,EAAAhK,OAAA/M,KAAA0F,EAAAqH,OAAA/M,IAAA+W,EAAAhK,OAAA/M,KAAAgT,EAAA4C,MAIA/W,EAAAP,KAAA0V,GAAAzV,SAAA,SAAAC,GACAuY,EAAAvY,GAAAkW,EAAAlW,MAIAyD,QAAA0S,MAAAjP,EAAAqR,IAGAA,GAAAA,EAAAT,OAAAS,EAAAT,KAAAC,YAAA7Q,EAAA4Q,KAAAC,mBAAA7Q,EAAA4Q,KAAAC,UAIAS,GACAhE,EAAA4C,IAAAlQ,EAAAqH,OAAA/M,MAKAkX,EAAA,WACA,IAAAC,EAAAC,KAAAD,MAEA,OAAApE,EAAAyD,UAAA3S,EAAAkQ,aACA7O,MAAA,SAAAmS,GAEA,IAAAA,EAIA,OAHAzO,QAAAqB,MAAA,4DACA6M,EAAApC,QACAyB,IAKAW,EAAAO,GAEAzO,QAAAqB,MAAA,4CAAAmN,KAAAD,MAAAA,GAAA,MACAhB,QA8DAU,EAAA,WAiBA,OAhBAjO,QAAAqB,MAAA,0BAEA4J,EAAAd,EAAAuE,QAGApS,KAAAgS,GAGAhS,MAAA,WACA0D,QAAAqB,MAAA,sBACAgM,GAAA,EACApC,EAAA,KAEAqC,EAAAxQ,KAAA0Q,MAAAkB,MAAA5R,OAoBA,OAdAmN,EAAArQ,IAAA,2BAjEA,WACA,IAAAuK,EAAAiG,EAAA4C,MACAhN,QAAAqB,MAAA,sBAAA8C,EAAA,KAGA,IACAwK,OAAAxK,OAAAA,EAAAzH,eAEA,MAAA8D,GACA,IACAmO,OAAAxK,OAAAA,EAAAyK,OAAA,EAAA,IAEA,MAAApO,GACAmO,OAAAxK,OAAA,SACAnE,QAAAC,KAAA,gEAKA,IACA4O,QAAAC,SAAA3K,EAAAzH,eAEA,MAAA8D,GACA,IACAqO,QAAAC,SAAA3K,EAAA1L,UAAA,EAAA,IAEA,MAAA+H,GACAqO,QAAAC,SAAA,SACA9O,QAAAC,KAAA,iEAKAqN,EAAAnJ,OAAAqJ,MAAAC,QAAAtJ,MAkCAmJ,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,OAAA,WACAzB,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,SAAA,WAGAb,EAAApC,GAKA,CACAkD,UA5CA,WACA,OAAA3B,GA4CAqB,MAzCA,WACA,OAAArB,EAAAvT,EAAAoH,OACA+J,GAAAgD,KAwCAA,MAAAA,EACAnR,KAAAA,EACAmS,MAAAf,EACAgB,UAtNA,SAAAC,EAAAC,GACA,IAAAC,EAAAvS,EASA,OARA7G,EAAAqZ,KAAAH,EAAAxX,MAAA,MAAA,SAAA/B,GACAyZ,EAAAA,EAAAzZ,GACAyD,QAAAiM,YAAA+J,KACAA,EAAAD,MAKAC,GA6MAE,MAlOA,WAOA,OANAtZ,EAAAP,KAAAoH,GAAAnH,SAAA,SAAAC,UACAkH,EAAAlH,MAGAsY,EAAApC,GAEAwB,EAAAxQ,KAAAkR,aAAAuB,MAAAzS,GACAR,KAAAsD,IA2NAA,MAAAA,EACA0O,QAAAA,EACAkB,cAtGA,WACA,IAAArL,EAAArH,EAAAqH,QAAArH,EAAAqH,OAAA/M,IAAAuN,EAAAoI,iBAAA,KACA,OAAApI,EAAA,QACAA,EAAAsI,QAAA9I,GAAAQ,EAAAsI,QAAA9I,GAAA2H,EAAAmB,QAAAtI,EAAAoI,iBAAA,OAAApI,EAAAsI,aAAAvO,GAoGA+Q,WAjGA,WACA,IAAAtL,EAAArH,EAAAqH,QAAArH,EAAAqH,OAAA/M,IAAAuN,EAAAoI,iBAAA,KACA,OAAApI,EAAA+K,MAAA/K,EAAA+K,KAAAC,SACAhL,EAAA+K,KAAAC,SAAAxL,GAAAQ,EAAA+K,KAAAC,SAAAxL,GAAA2H,EAAA4D,KAAAC,SAAAhL,EAAAoI,iBAAA,OAAApI,EAAA+K,UAAAhR,GA+FAoN,gBAAAA,EAEAwB,IAAAA,EACAjD,QAAAA,EACApP,UAAAA,MCrWA5B,QAAA0Q,OAAA,0BAAA,CAAA,QAAA,2BAAA,yBAEAC,QAAA,YAAA,CAAA,aAAA,KAAA,YAAA,WAAA,UAAA,WAAA,MAAA,SAAA,aAAA,MAAA,SAAAC,EAAAnQ,EAAA8V,EAAA1W,EAAAc,EAAA2K,EAAAtK,EAAAwV,EAAAjL,EAAAsF,GAGA,IACA4F,EAKAC,EAAA,WAAA/V,EAAAgW,SAAAC,SACA3C,EAAA,IAAApD,EAAA1U,KAAA,aAEAsH,EAAA,CACAoT,IAAA,KACAC,UAAA,GACA3W,SAAA,EACA4W,MAAA,GACAC,OAAA,CACAC,QAAA,EACAC,QAAA,EACAC,SAAA,KACAC,QAAA,EACAP,KAAA,EACAQ,SAAAhS,EACAiS,SAAAjS,GAEAkS,KAAA,CACAC,KAAA,KACAC,KAAA,EACAC,SAAA,GAEAC,QAAA,SACA1E,YAAA,EACA2E,YAAA,GACAC,UAAA,KACAC,qBAAA,EACAC,cAAA,KACAC,yBAAA,EACAC,aAAA,KACAC,UAAA,KACA5L,QAAAhB,EAAAgB,SAIA5N,EAAA,SAAAyZ,GACA,OAAAA,GAAA,CAAAA,EAAAna,OAAAma,EAAAla,MAAAC,KAAA,MAmDAka,EAAA,WACA,OAAA3U,EAAAoT,IAAA3I,QAAAmK,KAAAC,QACArV,MAAA,SAAAL,GACAa,EAAAyU,UAAAtV,EAAA0V,MAAA1V,EAAA0V,MAAA3V,QAAA,SAAAC,EAAA2V,GACA,GAAAA,EAAAna,SAAAma,EAAAC,IACA,IACA,IAAAC,EAAA,IAAAta,EAAAoa,EAAAna,SACAwE,EAAA,CAAA6V,EAAAha,OAAAga,EAAAlZ,QAAArB,KAAA,MAAAua,EAEA,MAAAtR,GAEAR,QAAAtG,MAAA,gCAAA8G,GAAAA,EAAA/I,SAAA+I,GAGA,OAAAvE,IACA,IAAA,MAEA0C,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAA+B,OAAAlI,EAAAmI,WAAAuP,gBACA,OAAA7Y,GAAA,WACA,OAAAuY,MACA,KAEAzR,QAAAtG,MAAA8G,GACA1D,EAAAyU,UAAA,OAKAS,EAAA,WACA,OAAAlV,EAAAoT,IAAA+B,WAAAC,MAAAZ,eACAhV,MAAA,SAAAL,GACAa,EAAAwU,aAAArV,EAAAkW,OAAAlW,EAAAkW,OAAAnW,QAAA,SAAAC,EAAA2V,GAEA,OADAA,EAAA/V,KAAA+V,EAAAQ,QAAAnW,EAAA2V,EAAA/V,KAAA+V,EAAAQ,OACAnW,IACA,IAAA,MAEA0C,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAA+B,OAAAlI,EAAAmI,WAAAuP,gBACA,OAAA7Y,GAAA,WACA,OAAA8Y,MACA,KAEAhS,QAAAtG,MAAA8G,GACA1D,EAAAwU,aAAA,OAIAe,EAAA,WACAvV,EAAAsT,MAAA,GACAtT,EAAAuU,yBAAA,EACAvU,EAAAtD,SAAA,EACAsD,EAAAoT,IAAApT,EAAAoT,KAAA7V,EACA,IAAAiY,EAAA,GAEAxC,GACAF,EAAA2C,OAAAzC,GAGAA,EAAAF,GAAA,WAEA0C,EAAAtc,OACAwc,EAAAF,GAEAxV,EAAAtD,UAAAsD,EAAAuU,0BACAvU,EAAAtD,SAAA,EACAoW,EAAA2C,OAAAzC,GAEA2C,GAAA,GAEAzS,QAAAqB,MAAA,qCAAArG,OAAA8B,EAAAsT,MAAApa,YAEA,KAEA,IAAA0c,EAAA,CAEA5V,EAAAoT,IAAAjJ,IAAAqJ,OAAAqC,OACArW,MAAA,SAAAqW,GACA7V,EAAAsU,cAAAuB,KAEAhU,OAAA,SAAA6B,GACAR,QAAAtG,MAAA8G,GACA1D,EAAAsU,cAAA,MAIAK,KAQA,OAJA3U,EAAAwP,YACAoG,EAAAE,KAAAZ,KAGAlY,EAAA6P,IAAA+I,GACApW,MAAA,WACA,OAAAQ,EAAAoT,KAAApT,EAAAoT,IAAA3I,QAAA6I,WAEA9T,MAAA,SAAAL,GACA,GAAAA,GAAAA,EAAAmU,OAAAnU,EAAAmU,MAAApa,OAAA,CAGA,IAAA8G,EAAAuT,OAAAI,OA8EA,OAAA3W,EAAA6P,IAAA1T,EAAAgG,GAAAA,EAAAmU,OAAA,IAAApU,QAAA,SAAAC,EAAA3G,GACA,OAAA2G,EAAAC,OAAA2W,EAAAvd,EAAAgd,MACA,KA/EA,IAAAQ,EAAA,GACA7c,EAAAN,QAAAsG,EAAAmU,OAAA,SAAA9a,GAEA,OAAAA,EAAAyd,SACAzd,EAAA0d,YAAA1d,EAAAkc,OAAAyB,SAAA3d,EAAAkc,MAAA7Z,MAAA,KAAA,IACArC,EAAA0d,aAAA1d,EAAA0d,YAAAlW,EAAAqU,qBACAnR,QAAAqB,MAAA,2DAAArG,OAAA1F,EAAAwC,OAAAW,UAAA,EAAA,MAIAqa,EAAAF,KAAAC,EAAAvd,EAAAgd,IAGArc,EAAAN,QAAAL,EAAAO,WAAA,IAAA,SAAAqd,GACA,GAAAA,EAAAtb,WAAA,QAAA,CACA,IAAAhC,EAAAN,EAAAwC,OAAA,IAAAob,EAAAvb,MAAA,KAAA,GACAmF,EAAAyU,UAAA3b,KACAkH,EAAAyU,UAAA3b,GAAAud,aAAA,YAOA,IAAAC,EAAAnd,EAAAod,OAAAvW,EAAAyU,WACA,GAAA6B,GAAAA,EAAApd,OAAA,CACA,IAAAsd,EAAA,EAEArd,EAAAN,QAAAyd,GAAA,SAAAtB,GAEA,IAAAA,EAAAyB,YAAA,CACA,IAAAC,EAAA1B,EAAA/Z,MAAAkb,SAAAnB,EAAA/Z,KAAAJ,MAAA,KAAA,IAEA,GAAA6b,GAAAA,EAAA1W,EAAAqU,qBAEA,YADAnR,QAAAqB,MAAA,0DAAArG,OAAA8W,EAAAha,OAAAW,UAAA,EAAA,KAIA,IAAAgb,EAAA,IAAApe,EAAA,CACA0C,KAAA+Z,EAAA/Z,KACAyb,cAAAA,EACA1b,OAAAga,EAAAha,OACAgB,QAAAgZ,EAAAhZ,QACAC,UAAA+Y,EAAA/Y,UACA0X,QAAA,EACA5U,IAAAiB,EAAAsU,cAAAU,EAAAha,QACAoY,IAAA,CACAwD,SAAA,EACApb,SAAA,EACAM,OAAAkZ,EAAAlZ,QAEA/C,UAAA,CAEA,QAAAic,EAAAlZ,UAGA6a,EAAArc,GAAAqc,EAAAE,QACAF,EAAA5X,KAAAiB,EAAAwP,YAAAxP,EAAAwU,eACAmC,EAAAG,WAAA9W,EAAAwU,aAAAmC,EAAA5X,MAEAgY,EAAAJ,KACAnB,EAAAM,KAAAa,GACAH,SAKAA,GACAtT,QAAAqB,MAAA,+DAAArG,OAAAsY,IAIA,OAAAR,EAAA9c,OAAA8D,EAAA6P,IAAAmJ,QAAA,MAUAxW,MAAA,WACAQ,EAAAuU,yBAAA,KAEA1S,OAAA,SAAA6B,GACAR,QAAAtG,MAAA8G,GACA1D,EAAAuU,yBAAA,MAOAwC,EAAA,SAAAJ,GAEA,QAAA3W,EAAAuT,SAGAvT,EAAAuT,OAAAC,SAAAxT,EAAAuT,OAAAE,SAAAkD,EAAA5X,KACAiB,EAAAuT,OAAAE,SAAAzT,EAAAuT,OAAAC,QAAAmD,EAAA5X,KAKAiB,EAAAuT,OAAAG,WAAAiD,EAAAN,YAAArW,EAAAuT,OAAAG,WAKA1T,EAAAuT,OAAAI,QAAA,OAAAgD,EAAAV,QAAAU,EAAAK,WAAAhX,EAAAuT,OAAAI,QAAA,OAAAgD,EAAAV,SAAAU,EAAAK,UAKAza,QAAAoC,UAAAqB,EAAAuT,OAAAH,MAAAuD,EAAAM,SAAAjX,EAAAuT,OAAAH,KAKA7W,QAAAoC,UAAAqB,EAAAuT,OAAAqB,OAAA+B,EAAAO,UAAAlX,EAAAuT,OAAAqB,MAKArY,QAAAoC,UAAAqB,EAAAuT,OAAAK,MAAA+C,EAAAQ,SAAAnX,EAAAuT,OAAAK,KAKArX,QAAAoC,UAAAqB,EAAAuT,OAAAM,MAAA8C,EAAAS,SAAApX,EAAAuT,OAAAM,OAOAkC,EAAA,SAAAvd,EAAA6e,GACAA,EAAAA,GAAArX,EAAAwV,SAGAhd,EAAA0d,YAAA1d,EAAAkc,OAAAyB,SAAA3d,EAAAkc,MAAA7Z,MAAA,KAAA,IACArC,EAAAwe,SAAA,OAAAxe,EAAAyd,QAAAzd,EAAA0d,aAAA1d,EAAA0d,YAAAlW,EAAAqU,qBAEA,IAAAf,EAAAgE,EAAA9e,GACA+e,GAAA,EAEAvB,EAAA1C,EAAApU,QAAA,SAAA8W,EAAAW,GACA,IAAAa,EAAAre,EAAA8L,UAAAjF,EAAAsT,MAAA,CAAAhZ,GAAAqc,EAAArc,KACAmd,EAAAD,EAAAA,EAAAvc,KAAA,KACAyc,IAAAF,GAAAA,EAAA7D,OAEA,OAAAqC,EAAA5W,OACAuY,EAAAhB,GACAnX,MAAA,SAAAoY,GACA,GAAAJ,EAEA,IAAAI,GAAAA,EAAAjE,SAAA3T,EAAAuT,OAAAI,QAAA,QAAA3T,EAAAuT,OAAAI,OAAA,CACA,IAAAkE,EAAA7X,EAAAsT,MAAAwE,QAAAN,IACA,IAAAK,IACA3U,QAAAqB,MAAA,4CAAArG,OAAAyY,EAAAoB,OAAAH,EAAAA,EAAAjE,OAAA,KAAA,OAAA,aACA3T,EAAAsT,MAAA0E,OAAAH,EAAA,GACAN,GAAA,QAGAK,EAAA3c,OAAAwc,GACAvU,QAAAqB,MAAA,iDAAArG,OACA0Z,EAAAxE,MAAAwE,EAAAxE,IAAA6E,OAAA,MAAA,SAAA,OACAL,EAAAG,SACAR,GAAA,GAEAG,IAAAE,EAAAjE,QACAzQ,QAAAqB,MAAA,0CAAArG,OACA0Z,EAAAxE,MAAAwE,EAAAxE,IAAA6E,OAAA,MAAA,SAAA,OACAL,EAAAG,OACAH,EAAAjE,OAAA,KAAA,SACA4D,GAAA,GAGArU,QAAAqB,MAAA,yCAAArG,OACA0Z,EAAAxE,MAAAwE,EAAAxE,IAAA6E,OAAA,MAAA,SAAA,OACAL,EAAAG,cAGAH,GAAAA,EAAAjE,SAAA3T,EAAAuT,OAAAI,QAAA,QAAA3T,EAAAuT,OAAAI,SACAzQ,QAAAqB,MAAA,sCAAArG,OACA0Z,EAAAxE,MAAAwE,EAAAxE,IAAA6E,OAAA,MAAA,SAAA,OACAL,EAAAG,OACAH,EAAAjE,OAAA,KAAA,SAEA0D,EAAAvB,KAAA8B,GACAL,GAAA,SAIA,IACA,OAAA,IAAAvB,EAAA9c,OAAA8c,EAAA,GAAAhZ,EAAA6P,IAAAmJ,IACAxW,MAAA,WACA,OAAA+X,MAIAD,EAAA,SAAA9e,EAAA4d,GACA,IAAA5d,EAAA,MAAA,GACA,IAAAme,EAAA,IAAApe,EAAAC,GAGA,IAAA4d,EAAA,CACA,IAAA8B,EAAAvB,EAAAwB,eACA,IAAAD,EAAA,MAAA,GAEA,IAAAnf,EAAAmf,EAAAhZ,QAAA,SAAAC,EAAAiZ,GACA,IAAAhC,EAAA7Y,EAAAqT,KAAAyH,cAAAD,GACA,OAAAhC,EAAAjX,EAAAC,OAAAgX,GAAAjX,IACA,IAGA,GAAApG,EAAAG,OAAA,EACA,OAAAH,EAAAmG,QAAA,SAAAC,EAAAiX,GACA,OAAAjX,EAAAC,OAAAkY,EAAA9e,EAAA4d,MACA,IAIAA,EAAArd,EAAA,GAUA,OAPA4d,EAAAvD,IAAAgD,EACAO,EAAAoB,OAAApB,EAAA2B,YACA3B,EAAA4B,IAAA5B,EAAA6B,SACA7B,EAAA1b,KAAA0b,EAAA1b,MAAA0b,EAAAjC,MACAiC,EAAAT,YAAAS,EAAA1b,MAAAkb,SAAAQ,EAAA1b,KAAAJ,MAAA,KAAA,IACA8b,EAAA5X,IAAA4X,EAAA3b,QAAAgF,EAAAsU,cAAAqC,EAAA3b,QACA2b,EAAArc,GAAAqc,EAAAE,QACA,CAAAF,IAGAgB,EAAA,SAAAhB,GAGA,IAAAI,EAAAJ,GAAA,OAAA3Z,EAAAoH,OAEA,IAAApE,EAAAuT,OAAAI,SAAA3T,EAAAuT,OAAAI,QAAA,SAAAgD,EAAAV,SAAAU,EAAA8B,UAEA,OADA9B,EAAAhD,QAAA,EACA3W,EAAAoH,KAAAuS,GAGA,GAAAA,EAAAvD,IAAAwD,SAAA5W,EAAAyU,UAAA,CACA,IAAAiE,EAAA,CAAA/B,EAAA3b,OAAA2b,EAAAvD,IAAAtX,QAAArB,KAAA,KACAua,EAAAhV,EAAAyU,UAAAiE,GAcA,cAbA1Y,EAAAyU,UAAAiE,GACA1D,IACA2B,EAAA1b,KAAA+Z,EAAA/Z,KACA0b,EAAAD,cAAA1B,EAAA/Z,MAAAkb,SAAAnB,EAAA/Z,KAAAJ,MAAA,KAAA,IACA8b,EAAA3a,QAAAgZ,EAAAhZ,QACA2a,EAAA1a,UAAA+Y,EAAA/Y,WAEA0a,EAAAhD,SAAAgD,EAAA1b,KAEA0b,EAAA5X,KAAAiB,EAAAwP,YAAAxP,EAAAwU,eACAmC,EAAAG,WAAA9W,EAAAwU,aAAAmC,EAAA5X,MAGA/B,EAAAoH,KAAAuS,GAIA,OAAAA,EAAAvD,IAAAwD,UAAA3D,GAAA0D,EAAAvD,IAAAuF,OAaAhC,EAAAvD,IAAA3X,QAAAkb,EAAAvD,IAAAwD,SACAD,EAAAhD,OAAA,OAAAgD,EAAAV,OACAU,EAAA1b,MA7dA,SA8dA0b,EAAA3a,QAEA2a,EAAA5X,KAAAiB,EAAAwP,YAAAxP,EAAAwU,eACAmC,EAAAG,WAAA9W,EAAAwU,aAAAmC,EAAA5X,MAEA/B,EAAAoH,KAAAuS,KAGAA,EAAAnG,IAAAmG,EAAAnG,KAAAjT,EAAAqb,cAAAjC,EAAA8B,UAAA9B,EAAAkC,UAAAlC,EAAAQ,QAAAnX,EAAA6I,SAGA8N,EAAAnG,IAAA2E,WAAA2D,SAAA,GACAtZ,MAAA,SAAAkV,GAQA,OAPAiC,EAAAD,cAAAhC,EAAAna,OACAoc,EAAAhD,QAAA,EACAgD,EAAA1b,KAAAA,EAAAyZ,GACAiC,EAAAoC,WAAArE,EAAAqE,YACA,IAAA/Y,EAAAmU,YAAA2D,QAAAnB,EAAA1b,OACA+E,EAAAmU,YAAA2B,KAAAa,EAAA1b,MAEA0b,KAEA9U,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAA+B,OAAAlI,EAAAmI,WAAAsT,iBAIA,OAHArC,EAAAhD,QAAA,EACAgD,EAAA1b,KAAAA,EAAA,CAAAV,OAAA,EAAAC,KAAA+C,EAAAY,UAAA8a,kBACAtC,EAAAG,WAAA,EACAH,EAEA,IAAAA,EAAAuC,UAAA,CACA,IAAA9F,EAAAuD,EAAAvD,KAAAuD,EAAAwC,SACA,GAAA/F,EAAAmF,MAAA,IAAA5B,EAAAoB,OAAAD,QAAA1E,EAAAmF,KAIA,OAFA5B,EAAAuC,WAAA,EACAvC,EAAAnG,IAAAjT,EAAAqb,cAAAxF,EAAAmF,IAAAnF,EAAAgG,KAAAhG,EAAAuF,QACAhB,EAAAhB,GASA,OALAA,EAAA1b,KAAA,KACA0b,EAAAT,YAAA,KACAS,EAAAD,cAAA,KACAC,EAAAhD,QAAA,EACAgD,EAAA5X,IAAAiB,EAAAsU,cAAAqC,EAAA3b,QACA2b,KAEAnX,MAAA,SAAAmX,GAEA,KAAA3W,EAAAuT,OAAAI,QAAAgD,GAAAA,EAAAhD,QAAA3T,EAAAwP,YAAA,OAAAmH,EACA,IAAAX,EAAA,GAwBA,OArBAW,EAAA5X,KACAiX,EAAAF,KAAAa,EAAAnG,IAAA2E,WAAAC,MAAAiE,SAAA,CAAAre,OAAA2b,EAAA3b,SACAwE,MAAA,SAAAL,GACAwX,EAAAG,WAAA3X,EAAAA,EAAAmW,MAAA,QAEAzT,OAAA,WACA8U,EAAAG,WAAA,SAKAd,EAAAF,KAAAa,EAAAnG,IAAAI,KAAA0I,UACA9Z,MAAA,SAAAL,GACAwX,EAAA5a,SAAAoD,GAAAA,EAAAoa,SAAApa,EAAAoa,QAAAxd,eAAA6F,EACA+U,EAAA3a,QAAAmD,GAAAA,EAAAoa,SAAApa,EAAAoa,QAAAvd,SAAA,OAEA6F,OAAA,WACA8U,EAAA5a,cAAA6F,EACA+U,EAAA3a,QAAA,QAGAgB,EAAA6P,IAAAmJ,GACAxW,MAAA,WACA,OAAAmX,UA3FAA,EAAAhD,OAAA,OAAAgD,EAAAV,OACAU,EAAA1b,MAhdA,SAidA0b,EAAA3a,QAEA2a,EAAA5X,KAAAiB,EAAAwP,YAAAxP,EAAAwU,eACAmC,EAAAG,WAAA9W,EAAAwU,aAAAmC,EAAA5X,MAGA/B,EAAAoH,KAAAuS,KAwFAjB,EAAA,SAAAF,EAAAgE,GAEA,IADAhE,EAAAA,GAAAxV,EAAAwV,UACAtc,OAAA,CACA,IAAAugB,EAAAtgB,EAAAugB,IAAA1Z,EAAAsT,OAAA,SAAAqD,GACA,OAAAA,EAAArc,MAEAid,GAAA,EACAoC,EAAA,EACAxgB,EAAAN,QAAA2c,EAAAwC,OAAA,IAAA,SAAArB,GACA8C,EAAA9C,EAAArc,MACA0F,EAAAsT,MAAAwC,KAAAa,GACA8C,EAAA9C,EAAArc,IAAAqc,EACAY,GAAA,EACAoC,QAGApC,IACArU,QAAAqB,MAAA,sCAAArG,OAAAyb,IACAhE,EAAA6D,MAIAI,EAAA,SAAAjR,EAAAkR,EAAA7F,GACA,IAAArL,EAAA,OAAA,EACA,IAAAmR,EAAA,EAEAD,GADAlR,EAAAA,EAAA/I,eACA1G,SACA2gB,EAAAlR,EAAAzP,QAEA4gB,GAAAnR,EAAAoR,WAAA,GACA,IAAA,IAAAC,EAAA,EAAAA,EAAAH,EAAAG,IACAF,GAAAG,KAAAC,IAAA,KAAAF,GAAArR,EAAAoR,WAAAC,GAEA,OAAAhG,EAAA,IAAA8F,EAAAA,GAGAnE,EAAA,SAAA6D,GAEA,IAAAW,EAAA,GACAna,EAAAoa,iBAAA,EACAjhB,EAAAN,QAAAmH,EAAAsT,OAAA,SAAAqD,GACA,GAAAA,EAAA1b,KAAA,CACA,IAAAA,EAAAkf,EAAAxD,EAAA1b,MACAA,GAAAA,EAAA8d,YASA9d,EAAA8d,YAAApC,EAAAoC,aACA9d,EAAA8d,WAAApC,EAAAoC,aATA9d,EAAA,CACAA,KAAA0b,EAAA1b,KACA8d,WAAApC,EAAAoC,WACAsB,MAAA,GAEAF,EAAAxD,EAAA1b,MAAAA,IAhmBA,IAsmBAA,EAAAA,MACAA,EAAAof,QAGAra,EAAAoa,kBAAAzD,EAAA5X,IAAA,EAAA,KAEA,IAgDAub,EAhDAlG,EAAApU,EAAAoU,UACApU,EAAAuT,OAAAI,SAEAxa,EAAAN,QAAAM,EAAAod,OAAA4D,IAAA,SAAAlf,GACAA,EAAAsf,IAAA,IAAAtf,EAAAof,MAAAra,EAAAsT,MAAApa,UAEAkb,EAAAjb,EAAAqhB,IAAAL,GAAA,SAAA5H,GACA,OAAAA,EAAA8H,SAEAlhB,EAAAN,QAAAmH,EAAAsT,OAAA,SAAAqD,GACAA,EAAA8D,sBAAA9D,EAAA1b,OAAAmZ,EAAAnZ,KACA0b,EAAA+D,kBAAA/D,EAAA1b,OAAA0b,EAAA8D,uBAAAN,EAAAxD,EAAA1b,MAAAof,MAAA,EACA1D,EAAA+D,oBACA/D,EAAAgE,oBAAAR,EAAAxD,EAAA1b,MAAA8d,WAAA3E,EAAA2E,gBAIA/Y,EAAAsT,MAAAna,EAAAyhB,KAAA5a,EAAAsT,OAAA,GAAA,SAAAqD,GACA,OAAAA,EAAArc,MAEA0F,EAAAsT,MAAAna,EAAA0hB,OAAA7a,EAAAsT,OAAA,SAAAqD,GACA,IAAAmD,EAAA,EAuBA,OAtBA9Z,EAAA8T,KAAAC,OACA+F,GAAA,QAAA9Z,EAAA8T,KAAAC,KAAA6F,EAAAjD,EAAA5X,KAAA4X,EAAA3b,OAAA,EAAAgF,EAAA8T,KAAAE,KAAA,EACA8F,GAAA,QAAA9Z,EAAA8T,KAAAC,OACA4C,EAAAO,WAAAlX,EAAA8T,KAAAE,IAAA,GAAA,IAAA,IACA2C,EAAAN,YAAA,iBAAArW,EAAA8T,KAAAE,IAAA,KAAA,MAAA,IACA2C,EAAAQ,UAAAnX,EAAA8T,KAAAE,IAAA,KAAA,MAAA,IAAA,EACA8F,GAAA,eAAA9Z,EAAA8T,KAAAC,MAAA4C,EAAAG,WAAA9W,EAAA8T,KAAAE,IAAA,IAAA2C,EAAAG,WAAAH,EAAAG,WAAA,EACAgD,GAAA,kBAAA9Z,EAAA8T,KAAAC,MAAA4C,EAAAD,cAAA1W,EAAA8T,KAAAE,IAAA,IAAA2C,EAAAD,cAAAC,EAAAD,cAAA,GAEAoD,GAAA,KACAA,GAAA,KAAAnD,EAAAhD,OAAA,EAAA,GACAmG,GAAA,KAAAnD,EAAA8D,sBAAA,EAAA,GACAX,GAAA,KAAAnD,EAAA+D,kBAAAP,EAAAxD,EAAA1b,MAAAsf,IAAA,GACAva,EAAAwP,YACAsK,GAAA,KAAAnD,EAAAG,WAAA,IAAAH,EAAAG,WAAA,GACAgD,GAAA,GAAAnD,EAAA5X,IAAA6a,EAAAjD,EAAA5X,IAAA,GAAA,GAAA,KAGA+a,GAAA,KAAAnD,EAAA5X,IAAA6a,EAAAjD,EAAA5X,IAAA,GAAA,GAAA,GACA+a,GAAA,GAAAnD,EAAA5X,IAAA,EAAA6a,EAAAjD,EAAA3b,OAAA,GAAA,OAEA8e,GAAAnD,EAAAM,QAAAN,EAAAQ,QAAA,IAAA,KAAA,MAIAnX,EAAAkU,SAEAlU,EAAAsT,MAAAza,SAAA,SAAA8d,GACAA,EAAAmE,UAAAR,GAAA3D,EAAA3W,EAAAkU,UAAAyC,EAAA3W,EAAAkU,WAAAoG,EAAAta,EAAAkU,SACAoG,EAAA3D,KAKA6C,GAAApF,GAAAA,EAAAnZ,QAAA+E,EAAAoU,WAAApU,EAAAoU,UAAAnZ,OAAAmZ,EAAAnZ,QACA+E,EAAAoU,UAAAA,EACA5D,EAAAxQ,KAAA0Q,MAAAqK,iBAAA3G,IAIA5D,EAAAxQ,KAAA0Q,MAAAC,QAAA3Q,IA2DAmR,EAAA,SAAAiC,EAAAhO,GAEA,OADAA,EAAAA,GAAA,GACA7H,EAAAqU,QACApS,MAAA,WAWA,GAVAwb,IAEAhb,EAAAoT,IAAAA,GAAA7V,EACAyC,EAAAuT,OAAAnO,EAAAmO,OAAAhX,QAAA0S,MAAAjP,EAAAuT,OAAAnO,EAAAmO,QAAAvT,EAAAuT,OACAvT,EAAA8T,KAAA1O,EAAA0O,KAAAvX,QAAA0S,MAAAjP,EAAA8T,KAAA1O,EAAA0O,MAAA9T,EAAA8T,KACA9T,EAAAwP,WAAAjT,QAAAoC,UAAAyG,EAAAoK,YAAApK,EAAAoK,WAAAxP,EAAAwP,WACAxP,EAAA6I,QAAAtM,QAAAoC,UAAAyG,EAAAyD,SAAAzD,EAAAyD,QAAAhB,EAAAgB,QAGA7I,EAAAqU,qBAAArU,EAAAoU,WAAApU,EAAAoU,UAAAnZ,MAAAkb,SAAAnW,EAAAoU,UAAAnZ,KAAAJ,MAAA,KAAA,IAjvBA,UAivBA+G,OACAA,IAAA5B,EAAAqU,qBACA,OAAAvM,EAAAqN,WAAA2D,SAAA,GACAtZ,MAAA,SAAAsZ,GACA9Y,EAAAqU,qBAAAyE,EAAAve,OArvBA,UAyvBAiF,MAAA,WACA0D,QAAA+X,KAAA,wCAAA/c,OAAAkV,EAAA2E,SACA,IAAAtG,EAAAC,KAAAD,MAIA,OA3EAzR,EAAAqT,UAAA,CAGArT,EAAAoT,IAAA8H,UAAAxG,QAAAyG,YAAA,SAAAzG,GACA,GAAAA,IAAA1U,EAAAtD,QAAA,CACA,IAAAzB,EAAA,CAAAyZ,EAAAna,OAAAma,EAAAla,MAAAC,KAAA,MACA,IAAAuF,EAAAmU,YAAA2D,QAAA7c,KACAiI,QAAAqB,MAAA,8BAAAtJ,EAAAU,UAAA,EAAA,KACAqE,EAAAmU,YAAA2B,KAAA7a,GAEA,IAAA+E,EAAAmU,YAAAjb,SAEA8G,EAAAtD,SAAA,EAEAN,GAAA,WACA8G,QAAAqB,MAAA,0DACAgR,MACA,KAAA,SAMAvV,EAAAoT,IAAA8H,UAAAvE,OAAAwE,YAAA,SAAA3iB,GACA,GAAAA,IAAAwH,EAAAtD,QAAA,CACA,IAAA8Y,EAAA,GACAO,EAAAvd,EAAAgd,GACAhW,MAAA,SAAA+X,GACAA,IACA/B,EAAAtc,OAAA,EACAwc,EAAAF,GAAA,IAGAtS,QAAAqB,MAAA,yCACAoR,GAAA,aAyCAJ,IACA/V,MAAA,SAAA8T,GAEA,OADApQ,QAAAqB,MAAA,yBAAAmN,KAAAD,MAAAA,GAAA,MACA6B,SAKA0H,EAAA,WACAhb,EAAAoT,MACAlQ,QAAA+X,KAAA,iCA5FA9hB,EAAAN,QAAAmH,EAAAqT,WAAA,SAAA+H,GACAA,OAEApb,EAAAqT,UAAA,GAtoBArT,EAAAoT,IAAA,KACApT,EAAAqT,UAAA,GACArT,EAAAsT,MAAA0E,OAAA,GACAhY,EAAAuT,OAAA,CACAC,QAAA,EACAC,QAAA,EACAC,SAAA,KACAC,QAAA,EACAP,KAAA,EACAQ,SAAAhS,EACAiS,SAAAjS,GAEA5B,EAAA8T,KAAA,CACAC,KAAA,KACAC,KAAA,GAEAhU,EAAAkU,QAAA,SACAlU,EAAAwP,YAAA,EACAxP,EAAAoa,iBAAA,EACApa,EAAAmU,YAAA,GACAnU,EAAAoU,UAAA,KACApU,EAAAqU,qBAAA,EACArU,EAAAsU,cAAA,GACAtU,EAAAtD,SAAA,EACAsD,EAAAuU,yBAAA,EACAvU,EAAAwU,aAAA,KACAxU,EAAAyU,UAAA,KACAzU,EAAA6I,QAAAhB,EAAAgB,UA8sBAwS,EAAA,SAAAC,GACA,OAJAtb,EAAAoT,IAKAjC,IACA3R,MAAA,WACA,OAAAxC,EAAAse,MAIAte,EAAAse,IAyBA,OAJA9K,EAAAyB,cAAA,OAAA,WACAzB,EAAAyB,cAAA,OAAA,oBACAzB,EAAAyB,cAAA,OAAA,YAEA,CACAjS,KAAAA,EACAmR,MAAAA,EACA6J,MAAAA,EACAO,SAhvBA,WACA,OAAAvb,EAAAsT,OAAAtT,EAAAsT,MAAApa,OAAA,GAgvBAsiB,SA7uBA,WACA,OAAAxb,EAAAsT,OA6uBAQ,KA7FA,SAAA1O,GACAA,EAAAA,GAAA,GACApF,EAAAuT,OAAAnO,EAAAmO,OAAAhX,QAAA0S,MAAAjP,EAAAuT,OAAAnO,EAAAmO,QAAAvT,EAAAuT,OACAvT,EAAA8T,KAAA1O,EAAA0O,KAAAvX,QAAA0S,MAAAjP,EAAA8T,KAAA1O,EAAA0O,MAAA9T,EAAA8T,KACA6B,GAAA,IA0FA8F,gBArBA,WACA,OAAAJ,GAAA,SAAAK,EAAAC,GACAD,EAAA1b,EAAAsT,MAAApU,QAAA,SAAAC,EAAAwX,GACA,OAAAA,EAAA8D,uBAAA9D,EAAA5X,IAAAI,EAAAC,OAAAuX,GAAAxX,IACA,SAkBAyc,eAxuBA,WACA,OAAA5b,EAAAmU,aAwuBA0H,gBA9BA,WACA,OAAAR,GAAA,SAAAK,EAAAC,GACAD,EAAA1b,EAAA8b,cA6BAvG,UAAAA,EACAwG,OA/uBA,WACA,OAAA/b,EAAAtD,SAgvBA8T,IAAAA,MRz0BAjU,QAAA0Q,OAAA,0BAAA,CAAA,yBAAA,6BAEAC,QAAA,YAAA,CAAA,aAAA,SAAA,SAAAC,EAAAzP,GAGAA,EAAAse,aAEA9Y,QAAA+X,KAAA,+BSPA1e,QAAA0Q,OAAA,yBAAA,CAAA,0BAEAC,QAAA,cAAA,CAAA,KAAA,WAAA,aAAA,SAAAlQ,EAAAZ,EAAAiB,GAOA,SAAA4e,IACAvjB,KAAAwjB,QAAA,EACA,IAAAzjB,EAAAC,KAEAA,KAAAyM,KAAA,SAAAgX,GACAhjB,EAAAN,QAAAM,EAAAP,KAAAujB,IAAA,SAAArjB,GACAL,EAAAK,GAAAqjB,EAAArjB,OAIAJ,KAAA0jB,SAAA,WACA,OAAA1jB,KAAAwjB,QAGAxjB,KAAA8I,KAAA9I,KAAA8I,MAAA,GASA9I,KAAA8I,KAAA6a,gBAAA,SAAAC,EAAAhB,GACA,IAAAiB,EAAA,IAAAC,KAAA,CAAA,IAAAC,WAAAH,KACAI,EAAA,IAAAC,WACAD,EAAAE,OAAA,SAAAxV,GACAkU,EAAAlU,EAAAyV,OAAAC,SAEAJ,EAAAK,WAAAR,IAIAN,EAAAjO,UAAA7P,UAAA,CACA6e,kBAAA,GACAC,4BAAA,GACAC,oBAAA,GACAC,YAAA,GACAle,cAAA,CACAme,OAAA,CACAC,EAAA,KACAC,EAAA,EACAC,EAAA,EACAC,QAAA,GAEAC,QAAA,CACAJ,EAAA,KACAC,EAAA,GACAC,EAAA,EACAC,QAAA,KAKAvB,EAAAjO,UAAA0P,kBAAA,SAAAC,GACA,IAAAllB,EAAAC,KACA,GAAA,OAAAklB,OAAA,OAAAD,EAAAC,QACAxhB,GAAA,WAAA3D,EAAAilB,kBAAAC,KAAA,MAGA1B,EAAAjO,UAAA6P,kBAAA,SAAAF,EAAAvY,GACA,IAAA3M,EAAAC,KACA,OAAAolB,sBAAAA,sBAAAH,EAAAvY,GACAhJ,GAAA,WAAA3D,EAAAolB,kBAAAF,EAAAvY,KAAA,MAGA6W,EAAAjO,UAAA+P,mBAAA,SAAAJ,EAAAvY,GACA,IAAA3M,EAAAC,KACA,OAAAslB,aAAAA,aAAAC,YAAAN,EAAAvY,GACAhJ,GAAA,WAAA3D,EAAAslB,mBAAAJ,EAAAvY,KAAA,MAGA6W,EAAAjO,UAAAkQ,kBAAA,SAAAP,GACA,IAAAllB,EAAAC,KACA,OAAAylB,OAAAR,EAAAQ,QACA/hB,GAAA,WAAA3D,EAAAylB,kBAAAP,KAAA,MAGA1B,EAAAjO,UAAAoQ,kBAAA,SAAAT,GACA,IAAAllB,EAAAC,KACA,GAAA,OAAA2lB,OAAA,OAAAV,EAAAU,QACAjiB,GAAA,WAAA3D,EAAA2lB,kBAAAT,KAAA,MAGA1B,EAAAjO,UAAAsQ,iBAAA,SAAA5Z,GAEA,IADA,IAAA6Z,EAAA,IAAA9B,WAAA/jB,KAAAyF,UAAAgf,aACAnD,EAAA,EAAAA,EAAAuE,EAAArlB,OAAA8gB,IAAAuE,EAAAvE,GAAAtV,EAAAsV,GACA,OAAAuE,GAIA,IAAAC,EAAAC,OAAAD,QAAAC,OAAAC,UAAAD,OAAAE,OAWA,SAAAC,IACAlmB,KAAA4B,GAAA,SAGA5B,KAAA0I,OAAA,KACA1I,KAAAmmB,KAAA,KACAnmB,KAAAiM,OAAA,KACAjM,KAAAomB,OAAA,KACA,IAAArmB,EAAAC,KA8VA,SAAAqmB,EAAAC,EAAAlC,GACA,GAAA,IAAAA,EACA,KAAA,CAAAniB,QAAA,YAAAqkB,EAAA,uBAIA,SAAAC,EAAAD,EAAAE,EAAAC,EAAAC,EAAAC,GAEA,OAfA,SAAAL,EAAAE,EAAAC,EAAAC,GACA,GAAAD,EAAAjmB,SAAAkmB,EACA,KAAA,CAAAzkB,QAAA,QAAAqkB,EAAA,aACAI,EAAA,SAAAF,EAAA,mBAAAC,EAAAjmB,QAWAomB,CAAAN,EAAAE,EAAAC,EAAAC,GAIA,SAAAG,EAAAF,GACA,IAAA9B,EAAA8B,GAAA,EACAG,EAAAC,EAAAF,EAAArmB,OAAAqkB,GACA9kB,EAAAomB,KAAAa,SAAAC,OAAAC,IAAAL,EAAAC,EAAAjC,GACA,IAAA,IAAAvD,EAAAwF,EAAAxF,EAAAwF,EAAAjC,EAAAvD,IACAvhB,EAAAomB,KAAAa,SAAAC,OAAA3F,GAAA,EAEA,OAAAwF,EAVAK,CAAAV,EAAAE,GAaA,SAAAI,EAAAK,GACA,IAAAhD,EAAArkB,EAAAomB,KAAAa,SAAAK,QAAAD,GACA,GAAA,IAAAhD,EACA,KAAA,CAAAniB,QAAA,kBAAAmlB,OAAAA,GAEA,OAAAhD,EAGA,SAAAkD,EAAAC,GACAxnB,EAAAomB,KAAAa,SAAAQ,MAAAD,GAeA,SAAAE,EAAAjnB,GACAR,KAAAQ,OAAAA,EACAR,KAAA8mB,QAAAC,EAAAvmB,GA3YAR,KAAA8I,KAAA9I,KAAA8I,MAAA,GACA9I,KAAA8I,KAAA4e,YAAA,SAAAC,GACA,IAAArG,EAAAsG,EAAAC,SAAAC,mBAAAH,IAAAI,EAAA,IAAAhE,WAAA6D,EAAApnB,QACA,IAAA8gB,EAAA,EAAAA,EAAAsG,EAAApnB,OAAA8gB,IAAAyG,EAAAzG,GAAAsG,EAAAvG,WAAAC,GACA,OAAAyG,GAEA/nB,KAAA8I,KAAAkf,YAAA,SAAAL,GACA,OAAA5nB,EAAAomB,KAAA6B,YAAAL,IAEA3nB,KAAA8I,KAAAC,cAAA,SAAAkf,GACA,OAAAloB,EAAAkM,OAAAC,OAAA+b,IAEAjoB,KAAA8I,KAAAof,cAAA,SAAAD,GACA,IAAA3G,EACAsG,EAAA7nB,EAAAkM,OAAAkc,OAAAF,GACAF,EAAA,IAAAhE,WAAA6D,EAAApnB,QACA,IAAA8gB,EAAA,EAAAA,EAAAsG,EAAApnB,OAAA8gB,IAAAyG,EAAAzG,GAAAsG,EAAAtG,GACA,OAAAyG,GAEA/nB,KAAA8I,KAAAsf,cAAA,SAAAH,GACA,OAAAloB,EAAAqmB,OAAA+B,OAAAF,IAEAjoB,KAAA8I,KAAAuf,cAAA,SAAAN,GACA,OAAAhoB,EAAAqmB,OAAAla,OAAA6b,IAGA/nB,KAAA8I,KAAAwf,YAAA,SAAArmB,GACA,OAAAqC,GAAA,SAAA0e,GACA,IAAAuF,EAAAxoB,EAAA+I,KAAA4e,YAAAzlB,GAEA+gB,EADAjjB,EAAAomB,KAAAqC,OAAAzoB,EAAAomB,KAAAsC,mBAAAF,IACAG,mBAGA1oB,KAAA8I,KAAA6f,aAAA,WACA,GAAA5oB,EAAA+lB,QAAA/lB,EAAA+lB,OAAA8C,gBAAA,CACA,IAAAC,EAAA,IAAA9E,WAAAhkB,EAAA0F,UAAA8e,6BAEA,OADAxkB,EAAA+lB,OAAA8C,gBAAAC,GACAvkB,EAAAoH,KAAAmd,GAGA,OAAAvkB,EAAAoH,KAAA3L,EAAAomB,KAAA2C,4BAGA9oB,KAAA8I,KAAA2f,mBAAA,SAAAM,GACA,OAAAhpB,EAAAomB,KAAAsC,mBAAAM,IAEA/oB,KAAA8I,KAAAkgB,cAAA,SAAAxgB,EAAAqC,EAAA8Z,EAAAC,EAAAC,EAAAoE,GAEA,OAAA3kB,GAAA,SAAA0e,EAAAC,GACA,IAQAD,EAPAjjB,EAAA2I,OAAAsgB,cACAxgB,EACAqC,EACA8Z,EACAC,EACAC,EACAoE,IAGA,MAAAje,GACAiY,EAAAjY,QAQAhL,KAAAkpB,sBAAA,SAAAC,GACA,OAAAA,EAAAC,OAAAD,EAAAE,MAAA/kB,EAAAoH,KAAAyd,GACA7kB,GAAA,SAAA0e,EAAAC,GACA,IAIAD,GA6OAsG,EAAA/C,EAAA,kCAAA,KA7OA4C,EAAAnd,OA8OAjM,EAAAomB,KAAAa,SAAAuC,+BACAC,EAAA,IAAA/B,EAAA1nB,EAAAomB,KAAAa,SAAAyC,8BACApD,EAAA,wCACAtmB,EAAAomB,KAAAa,SAAA0C,sCAAAF,EAAA1C,QAAAwC,IACAhC,EAAAgC,GACAvpB,EAAAomB,KAAAwD,+BAAAH,EAAAI,kBAjPA,MAAA5e,GACAiY,EAAAjY,GAyOA,IACAse,EAEAE,MApOAxpB,KAAA6pB,iBAAA,SAAA7gB,GACA,OAAA1E,GAAA,SAAA0e,EAAAC,GACA,IAIAD,GAsOA8G,EAAAvD,EAAA,6BAAA,KAtOAvd,EAuOAjJ,EAAAomB,KAAAa,SAAA+C,+BACAC,EAAA,IAAAvC,EAAA1nB,EAAAomB,KAAAa,SAAAiD,8BACA5D,EAAA,wCACAtmB,EAAAomB,KAAAa,SAAAkD,sCAAAF,EAAAlD,QAAAgD,IACAxC,EAAAwC,GACAE,EAAAJ,iBA1OA,MAAA5e,GACAiY,EAAAjY,GAkOA,IACA8e,EAEAE,MAhOAhqB,KAAAmqB,iBAAA,SAAAne,GACA,OAAA1H,GAAA,SAAA0e,EAAAC,GACA,IAGAD,GAmOAsG,EAAA/C,EAAA,6BAAA,KAnOAva,EAoOAjM,EAAAomB,KAAAa,SAAAuC,+BACAC,EAAA,IAAA/B,EAAA1nB,EAAAomB,KAAAa,SAAAyC,8BACApD,EAAA,wCACAtmB,EAAAomB,KAAAa,SAAA0C,sCAAAF,EAAA1C,QAAAwC,IACAhC,EAAAgC,GACAE,EAAAI,iBAvOA,MAAA5e,GACAiY,EAAAjY,GA+NA,IACAse,EAEAE,MA1NAxpB,KAAAoqB,IAAA,SAAAnoB,EAAA4mB,EAAAwB,EAAAC,GACA,OAAAhmB,GAAA,SAAA0e,EAAAC,GACA,GAAAhhB,EAAA,CAIA,IAAAsoB,EAAAxqB,EAAAomB,KAAA6B,YAAA/lB,GACA,iBAAAooB,IACAA,EAAAtqB,EAAA+I,KAAAof,cAAAmC,IAGA,IACA,IAAAG,EAAAzqB,EAAAomB,KAAAsE,WAAAF,EAAA1B,EAAAwB,EAAAC,GAEAtH,EADAjjB,EAAA+I,KAAAuf,cAAAmC,IAGA,MAAAxf,GACAiY,EAAAjY,SAdAgY,EAAA/gB,OAsBAjC,KAAA0qB,SAAA,SAAAC,EAAA9B,EAAA+B,EAAAC,GACA,OAAAvmB,GAAA,SAAA0e,EAAAC,GACA,GAAA0H,EAAA,CAKA,IAAAH,EAAAzqB,EAAA+I,KAAAsf,cAAAuC,GACA,iBAAAC,IACAA,EAAA7qB,EAAA+I,KAAAof,cAAA0C,IAGA,IACA,IAAA3oB,EAAAlC,EAAAomB,KAAA2E,gBAAAN,EAAA3B,EAAA+B,EAAAC,GACA7H,EAAAjjB,EAAAomB,KAAAuB,YAAAzlB,IAEA,MAAA+I,GACAiY,EAAAjY,SAdAgY,EAAA2H,OAuBA3qB,KAAA4I,cAAA,SAAAiC,EAAArC,EAAAuiB,GACA,OAAAhrB,EAAA+I,KAAAkgB,cACAjpB,EAAA+I,KAAAkf,YAAAxf,GACAzI,EAAA+I,KAAAkf,YAAAnd,GACAkgB,GAAAA,EAAApG,GAAA5kB,EAAA0F,UAAAc,cAAAwe,QAAAJ,EACAoG,GAAAA,EAAAnG,GAAA7kB,EAAA0F,UAAAc,cAAAwe,QAAAH,EACAmG,GAAAA,EAAAlG,GAAA9kB,EAAA0F,UAAAc,cAAAwe,QAAAF,EACA9kB,EAAA0F,UAAAgf,aACA3d,MAAA,SAAA+e,GACA,IAAAmF,EAAAjrB,EAAAomB,KAAA8E,yBAAApF,GACAqF,EAAAnrB,EAAAomB,KAAAgF,wBAAAtF,GACA,MAAA,CACA7c,OAAAgiB,EAAAhiB,OACAgD,OAAAgf,EAAAhf,OACAqd,MAAA6B,EAAA7B,MACAD,MAAA8B,EAAA9B,WAQAppB,KAAAorB,YAAA,SAAAvF,GACA,OAAAvhB,GAAA,SAAA0e,EAAAC,GACA,IAAA+H,EAAAjrB,EAAAomB,KAAA8E,yBAAApF,GACAqF,EAAAnrB,EAAAomB,KAAAgF,wBAAAtF,GACA7C,EAAA,CACAha,OAAAgiB,EAAAhiB,OACAgD,OAAAgf,EAAAhf,OACAqd,MAAA6B,EAAA7B,MACAD,MAAA8B,EAAA9B,YAQAppB,KAAA+K,aAAA,SAAAF,EAAArC,EAAAuiB,GACA,OAAAzmB,GAAA,SAAA0e,EAAAC,GACA,IACA,IAAA4C,EAAA9lB,EAAA2I,OAAAsgB,cACAjpB,EAAA+I,KAAAkf,YAAAxf,GACAzI,EAAA+I,KAAAkf,YAAAnd,GACAkgB,GAAAA,EAAApG,GAAA5kB,EAAA0F,UAAAc,cAAAwe,QAAAJ,EACAoG,GAAAA,EAAAnG,GAAA7kB,EAAA0F,UAAAc,cAAAwe,QAAAH,EACAmG,GAAAA,EAAAlG,GAAA9kB,EAAA0F,UAAAc,cAAAwe,QAAAF,EACA9kB,EAAA0F,UAAAgf,aAEAzB,EADAjjB,EAAAomB,KAAA8E,yBAAApF,GACA7c,QAEA,MAAAgC,GACAiY,EAAAjY,QAQAhL,KAAAqrB,OAAA,SAAAppB,EAAAqpB,EAAAhpB,GACA,OAAAgC,GAAA,SAAA0e,EAAAC,GACA,IAIA3B,EAJAiH,EAAAxoB,EAAA+I,KAAA4e,YAAAzlB,GACAoa,EAAAtc,EAAA+I,KAAAsf,cAAAkD,GACAC,EAAAxrB,EAAA+I,KAAAof,cAAA5lB,GACAkpB,EAAA,IAAAzH,WAAAhkB,EAAA0F,UAAA6e,kBAAAiE,EAAA/nB,QAEA,IAAA8gB,EAAA,EAAAA,EAAAvhB,EAAA0F,UAAA6e,kBAAAhD,IAAAkK,EAAAlK,GAAAjF,EAAAiF,GACA,IAAAA,EAAA,EAAAA,EAAAiH,EAAA/nB,OAAA8gB,IAAAkK,EAAAlK,EAAAvhB,EAAA0F,UAAA6e,mBAAAiE,EAAAjH,GAIA0B,EADA,OAAAjjB,EAAAomB,KAAAsF,iBAAAD,EAAAD,QAQAvrB,KAAA0rB,KAAA,SAAAzpB,EAAA4G,GACA,OAAAvE,GAAA,SAAA0e,EAAAC,GAKA,IAJA,IAAA0I,EAAA5rB,EAAA+I,KAAA4e,YAAAzlB,GACA2pB,EAAA/iB,EAAAmD,OACA6f,EAAA9rB,EAAAomB,KAAA2F,YAAAH,EAAAC,GACAvP,EAAA,IAAA0H,WAAAhkB,EAAA0F,UAAA6e,mBACAhD,EAAA,EAAAA,EAAAjF,EAAA7b,OAAA8gB,IAAAjF,EAAAiF,GAAAuK,EAAAvK,GAEA0B,EADAjjB,EAAAqmB,OAAAla,OAAAmQ,QAKArc,KAAA+rB,KAAA,WACA,IAAAC,EAAA1nB,EAAA2nB,QACAC,EAAA,GACAC,EAAA,GACA,KAAAplB,MAAAC,SAAAC,MAAAC,gBACAsD,QAAA+X,KAAA,4EAAA/c,OAAAuB,MAAAC,SAAAC,QACAilB,EAAAE,uBAAA,UAEA,IAAAC,EAAA,EACAC,EAAA,WAEA,KADAD,IAEAtsB,EAAAyjB,QAAA,EACAwI,EAAAhJ,YAoBA,OAjBAhjB,KAAAqlB,oBAAA,SAAAkH,GACAxsB,EAAAomB,KAAAoG,EACAD,MACAJ,GACAlsB,KAAAmlB,mBAAA,SAAAoH,GACAxsB,EAAA2I,OAAA6jB,EACAxsB,EAAA2I,OAAA0jB,uBAAAD,EAAAC,uBACAE,MACAH,GACAnsB,KAAAglB,mBAAA,SAAAuH,GACAxsB,EAAAkM,OAAAsgB,EACAD,OAEAvsB,EAAAylB,mBAAA,SAAA+G,GACAxsB,EAAAqmB,OAAAmG,EACAD,OAEAN,EAAA1jB,SAIAtI,KAAA8I,KAAAhH,KAAA/B,EAAA+I,KAAAwf,YACAtoB,KAAAoqB,IAAA,CACAvhB,QAAA,CACA2jB,gBAAAzsB,EAAAmpB,sBACAuD,aAAA1sB,EAAAoqB,iBACAuC,aAAA3sB,EAAA8pB,kBAEA8C,KAAA5sB,EAAAqqB,IACAwC,KAAA7sB,EAAA2qB,UA8FAjD,EAAAnS,UAAAsU,aAAA,SAAAiD,GACA,IAAAzI,EAZA,SAAA0C,EAAAtmB,GACA,IAAA4jB,EAAA,IAAAL,WAAAvjB,GAEA,OADA4jB,EAAA8C,IAAAnnB,EAAAomB,KAAAa,SAAAC,OAAA6F,SAAAhG,EAAAA,EAAAtmB,IACA4jB,EASAwF,CAAA5pB,KAAA8mB,SAAA+F,GAAA,GAAA7sB,KAAAQ,QAAAqsB,GAAA,IAGA,OAFAvF,EAAAtnB,KAAA8mB,SACA9mB,KAAA8mB,QAAA,KACA1C,GAtaA0B,GAAAA,EAAA8C,kBACArF,EAAAjO,UAAAwQ,OAAAA,EACAvC,EAAAjO,UAAAxM,KAAA,GACAya,EAAAjO,UAAAxM,KAAA6f,aAAA,WACA,IAAAE,EAAA,IAAA9E,WAAAQ,6BAEA,OADAvkB,KAAA8lB,OAAA8C,gBAAAC,GACAvkB,EAAAoH,KAAAmd,KAwaA3C,EAAA5Q,UAAA,IAAAiO,EAkVA,IAAAA,EAOA,IAAAwJ,EAAA,IAAAxJ,EAwCA,OA7BA5e,IAAAmC,MAAA,WACA0D,QAAAqB,MAAA,wBACA,IAEAmhB,EAFAjU,EAAAC,KAAAD,MAUAvO,QAAAqB,MAAA,gDACAmhB,EAAA,IAAA9G,GAIA6F,OACA5iB,OAAA,SAAA6B,GAEA,MADAR,QAAAtG,MAAA8G,GACAA,KAEAlE,MAAA,WACAimB,EAAAtgB,KAAAugB,GACAxiB,QAAAqB,MAAA,gDAAArG,OAAAunB,EAAAnrB,GAAAoX,KAAAD,MAAAA,UAKAgU,KAQAvY,QAAA,WAAA,CAAA,KAAA,aAAA,WAAA,cAAA,UAAA,SAAA,SAAAlQ,EAAAmQ,EAAA/Q,EAAAe,EAAAG,EAAAE,GAGA,SAAAmoB,EAAAC,GACA,OAAA,IAAAC,OAAAD,GAGA,SAAAE,EAAAnF,EAAAF,GAGA,IAFA,IAAAvnB,EAAA+gB,KAAAO,IAAAmG,EAAAznB,OAAAunB,EAAAvnB,QACA6sB,EAAA,IAAAtJ,WAAAvjB,GACA8gB,EAAA,EAAAA,EAAA9gB,IAAA8gB,EACA+L,EAAA/L,GAAA2G,EAAA3G,GAAAyG,EAAAzG,GAEA,OAAA+L,EAGA,SAAAC,EAAAC,EAAAC,GACA,IAAAC,EAAA,IAAA1J,WAAAwJ,EAAAG,WAAAF,EAAAE,YAGA,OAFAD,EAAAvG,IAAA,IAAAnD,WAAAwJ,GAAA,GACAE,EAAAvG,IAAA,IAAAnD,WAAAyJ,GAAAD,EAAAG,YACAD,EAGA,IAAAhoB,EAAA,CACAkoB,IAAA,CACAC,YAAA,IAEAC,KAAA,CACAC,YAAA,EACAC,oBAAA,GACAH,YAAA,GACArnB,cAAA,CACAoe,EAAA,MACAC,EAAA,EACAC,EAAA,IAGAmJ,OAAA,CACAtoB,OAAA,sEACAuoB,OAAA,sEACAC,KAAA,CACAC,UAAA,0BACAC,QAAA,sBACAC,IAAA,kFACAC,IAAA,sFACAC,KAAA,oFAIA7rB,EAAA,CACAwrB,KAAA,CACAC,UAAAlB,EAAAxnB,EAAAuoB,OAAAE,KAAAC,WACAC,QAAAnB,EAAAxnB,EAAAuoB,OAAAE,KAAAE,SACAC,IAAApB,EAAAxnB,EAAAuoB,OAAAE,KAAAG,KACAC,IAAArB,EAAAxnB,EAAAuoB,OAAAE,KAAAI,KACAC,KAAAtB,EAAAxnB,EAAAuoB,OAAAE,KAAAK,QAGAvhB,EAAA,CACAC,aAAA,KACAuhB,aAAA,MA2BA,SAAAC,EAAAnhB,EAAAZ,GAEA,IAAAY,EAAA,OAAAhJ,EAAA2e,OAAA,iCAMA,IAAAxgB,GAJAiK,EAAAA,GAAA,IACAlD,aAAA3F,QAAAoC,UAAAyG,EAAAlD,aAAAkD,EAAAlD,WACAkD,EAAAgiB,YAAAhiB,EAAAgiB,aAAA,SAIA,IAAAC,EAAAjsB,EAAAwrB,KAAAC,UAAAvrB,KAAA0K,GAGA+N,EAAAsT,GAAAA,EAAA,GACA,IAAAtT,GAAA3O,EAAAgiB,YACA,OAAAD,EAAA,iBAAAjpB,OAAAkH,EAAAgiB,YAAAphB,GAAAZ,GAIA,GAAA,UAAA2O,EAAA,CAIA,KADA5Y,EAAAC,EAAAwrB,KAAAG,IAAAzrB,KAAA0K,IACA,OAAAhJ,EAAA2e,OAAA,4DACA,IAAA+H,EAAA,CACAhiB,OAAAvE,EAAAwH,OAAAkc,OAAA1lB,EAAA,KAEA,OAAAiK,EAAAlD,YAGA/G,EAAAC,EAAAwrB,KAAAI,IAAA1rB,KAAA0K,KAEA0d,EAAAhf,OAAAvH,EAAAwH,OAAAkc,OAAA1lB,EAAA,IACA6B,EAAA0e,QAAAgI,IAFA1mB,EAAA2e,OAAA,4DAJA3e,EAAA0e,QAAAgI,GAUA,MAAA,OAAA3P,GAAA,QAAAA,GACA5Y,EAAAC,EAAAwrB,KAAAK,KAAA3rB,KAAA0K,IAKAshB,EAAAnsB,EAAA,GAAA,CACA4Y,KAAAA,EACA7S,SAAAkE,EAAAlE,WAEA1B,MAAA,SAAAkkB,GACA,OAAAA,IAAAte,EAAAlD,WAAA,CAAAR,OAAAgiB,EAAAhiB,QAAAgiB,KARA1mB,EAAA2e,OAAA,yEAaAvW,EAAAgiB,YACApqB,EAAA2e,OAAA,uCAGA3e,EAAA2e,OAAA,kCAAA5H,EAAA,KAWA,SAAAuT,EAAAC,EAAAniB,GACAA,EAAAA,GAAA,GAEA,IAAAoiB,EAAAD,GAAApqB,EAAAwH,OAAAkc,OAAA0G,GACA,OAAAC,GAAAA,EAAAtuB,QAAAiF,EAAAooB,KAAAD,aAAAkB,EAAAtuB,QAAAiF,EAAAkoB,IAAAC,YACAtpB,EAAA2e,OAAA,sDAIAvW,EAAA2O,KAAA3O,EAAA2O,MAAA,GAAAyT,EAAA,IAAA,OAAA,GAAAA,EAAA,IAAA,OAGA,OAAApiB,EAAA2O,KAqCA,SAAA0T,GACA,IAAAC,EAAAvqB,EAAAqE,KAAAof,cAAA6G,GAGA,GAAA,GAAAC,EAAA,GACA,OAAA1qB,EAAA2e,OAAA,CAAAhhB,QAAA,yDAIA,GAAA+sB,EAAAxuB,QAAAiF,EAAAkoB,IAAAC,YACA,OAAAtpB,EAAA2e,OAAA,CAAAhhB,QAAA,yCAAAwD,EAAAkoB,IAAAC,YAAA,sCAGA,IAAAqB,EAAAD,EAAAE,MAAA,GAAA,GACArJ,EAAAmJ,EAAAE,MAAA,GAAA,GACArlB,EAAAmlB,EAAAE,OAAA,GAGAC,EAAA1qB,EAAAqE,KAAA2f,mBAAAhkB,EAAAqE,KAAA2f,mBAAAwG,IAAAC,MAAA,EAAA,GAMA,OALAzqB,EAAAqE,KAAAC,cAAAc,IAAApF,EAAAqE,KAAAC,cAAAomB,IACA7qB,EAAA2e,OAAA,CAAAhhB,QAAA,qCAIAwC,EAAA2mB,YAAAvF,GA5DAuJ,CAAAP,GAIA,QAAAniB,EAAA2O,KAGA,mBAAA3O,EAAAlE,WAEAkE,EAAAlE,SAAAkE,EAAAlE,WACAkE,EAAAlE,UAMA,iBAAAkE,EAAAlE,UAAAkE,EAAAlE,SAAA1B,KACA4F,EAAAlE,SAAA1B,MAAA,SAAA0B,GACA,IAAAA,EAAA,KAAA,YACA,OAAA6mB,EAAAR,EAAArmB,MAKA,iBAAAkE,EAAAlE,SACA6mB,EAAAR,EAAAniB,EAAAlE,UAGAlE,EAAA2e,OAAA,CAAAhhB,QAAA,uFAjBAqC,EAAA2e,OAAA,CAAAhhB,QAAA,yFAqBAqC,EAAA2e,OAAA,CAAAhhB,QAAA,gEA+BA,SAAAotB,EAAAC,EAAA9mB,GACA,IAAA+mB,EAAA9qB,EAAAqE,KAAAof,cAAAoH,GAGA,GAAA,GAAAC,EAAA,GACA,OAAAjrB,EAAA2e,OAAA,CAAAhhB,QAAA,0DAIA,GAAAstB,EAAA/uB,QAAAiF,EAAAooB,KAAAD,YACA,OAAAtpB,EAAA2e,OAAA,CAAAhhB,QAAA,kEAAAuD,OAAAC,EAAAooB,KAAAD,eAGA,IAAA4B,EAAAD,EAAAL,MAAA,GAAA,GACArlB,EAAA0lB,EAAAL,OAAA,GACArkB,EAAA0kB,EAAAL,MAAA,EAAA,GACAO,EAAAF,EAAAL,MAAA,EAAA,IACAQ,EAAAH,EAAAL,MAAA,GAAA,IAGA,OAAAzqB,EAAAqE,KAAAkgB,cACAvkB,EAAAqE,KAAAkf,YAAAxf,GACAqC,EACApF,EAAAooB,KAAAtnB,cAAAoe,EACAlf,EAAAooB,KAAAtnB,cAAAqe,EACAnf,EAAAooB,KAAAtnB,cAAAse,EACA,IAGA/d,MAAA,SAAA6oB,GAEA,IAAAC,EAAAD,EAAAT,MAAA,EAAA,IACAW,EAAAF,EAAAT,MAAA,GAAA,IAGAY,EAAA,IAAAC,MAAAC,gBAAAC,IAAAJ,GACAK,EAAAJ,EAAAK,QAAAV,GACAW,EAAAN,EAAAK,QAAAT,GAUA,OARAQ,EAAA,IAAAnM,WAAAmM,GACAE,EAAA,IAAArM,WAAAqM,GAKA9C,EAFAF,EAAA8C,EAAAN,EAAAV,MAAA,EAAA,KACA9B,EAAAgD,EAAAR,EAAAV,MAAA,GAAA,SAOApoB,KAAArC,EAAA2mB,aAGAtkB,MAAA,SAAA+B,GAGA,IAAAwnB,EAAA5rB,EAAAqE,KAAA2f,mBAAAhkB,EAAAqE,KAAA2f,mBAAA5f,EAAAG,SAAAkmB,MAAA,EAAA,GACA,GAAAzqB,EAAAqE,KAAAC,cAAA8B,KAAApG,EAAAqE,KAAAC,cAAAsnB,GACA,KAAA,CAAAtjB,MAAAC,EAAAC,aAAAhL,QAAA,+CAIA,IAAAktB,EAAA1qB,EAAAqE,KAAA2f,mBAAAhkB,EAAAqE,KAAA2f,mBAAA+G,IAAAN,MAAA,EAAA,GACA,GAAAzqB,EAAAqE,KAAAC,cAAAc,IAAApF,EAAAqE,KAAAC,cAAAomB,GACA,KAAA,CAAApiB,MAAAC,EAAAwhB,aAAAvsB,QAAA,+CAGA,OAAA4G,KA8IA,SAAAynB,EAAAznB,GACA,IAAAA,EACA,MAAA,IAAAxG,MAAA,mBAEA,OAAAwG,EAAAwgB,OAAAxgB,EAAAugB,MACA9kB,EAAAoH,KAAA7C,GAGAvE,EAAA6P,IAAA,CACA1P,EAAA2lB,IAAAvhB,QAAA4jB,aAAA5jB,EAAAmD,QACAvH,EAAA2lB,IAAAvhB,QAAA6jB,aAAA7jB,EAAAG,UAEAlC,MAAA,SAAAL,GACA,MAAA,CACA2iB,MAAA3iB,EAAA,GACA4iB,MAAA5iB,EAAA,OA+JA,MAAA,CACAuG,WAAAA,EACAvH,UAAAA,EAEAqD,KAAAjF,QAAAC,OAAA,CACA6F,WA1LA,SAAArH,GACA,IAAAiuB,EAAA9rB,EAAAqE,KAAAof,cAAA5lB,GACA,OAAAmC,EAAAqE,KAAAC,cAAAtE,EAAAqE,KAAA2f,mBAAAhkB,EAAAqE,KAAA2f,mBAAA8H,KAAAttB,UAAA,EAAA,KAyLAwB,EAAAqE,MACAgD,QAAA,CACAgB,KA9iBA,SAAAzD,EAAAqD,GAEA,OAAArD,GAAAA,EAAAiE,QACAmhB,EAAAplB,EAAAiE,QAAAZ,GAGApI,GAAA,SAAA0e,EAAAC,GACA,IAAA5Z,EACA,OAAA4Z,EAAA,8BAIA,IAAAuN,EAAA,IAAAvM,WACAuM,EAAAtM,OAAA,SAAApW,GACA2gB,EAAA3gB,EAAAqW,OAAAC,OAAA1X,GACA5F,KAAAkc,GACA7Z,MAAA8Z,IAEAuN,EAAAnM,WAAAhb,EAAA,YA6hBA0C,UApDA,SAAA0kB,EAAAnpB,EAAAoF,GA2BA,OA1BAA,EAAAA,GAAA,IACAlD,YAAA3F,QAAAoC,UAAAyG,EAAAlD,aAAAkD,EAAAlD,WACAkD,EAAApC,SAAAzG,QAAAoC,UAAAyG,EAAAlD,aAAAkD,EAAApC,OACAoC,EAAAlE,SAAA,WACA,OAAA5D,EAAAZ,QAAA6D,KAAA,KACAf,MAAA,WACA,OAAAhC,EAAA6H,aAAA,CACA5G,MAAA,gDACA6G,SAAA,+CACA1I,MAAAwI,EAAAxI,MACA2I,MAAAH,EAAAG,WAGA/F,MAAA,SAAA0B,GAEA,OAAA9E,GAAA,WAEA,OADA8E,GAAA5D,EAAAZ,QAAA2E,OACAH,IACA,SAIAkE,EAAApC,QACA1F,EAAAZ,QAAA2E,OAGAimB,EAAAtnB,EAAAoF,GACA5F,MAAA,SAAAL,GACA,OAAAA,KAEA0C,OAAA,SAAA6B,GACA,IAAAA,GAAA,cAAAA,EAAA,CACA,GAAAA,GAAAA,EAAA+B,OAAAC,EAAAC,aAEA,OAAAwjB,EAAAnpB,EAAA,CAAAkC,WAAAkD,EAAAlD,WAAAtF,MAAA,gDAGA,MADAsG,QAAAtG,MAAA,oDAAA8G,GAAAA,EAAA/I,SAAA+I,IACAA,OAeA0lB,gBAlQA,SAAAC,EAAA9nB,EAAA6D,GAIA,QAHAA,EAAAA,GAAA,IACA2O,KAAA3O,EAAA2O,MAAA,SAEA3O,EAAA2O,MAGA,IAAA,SACA,OAAA/W,EAAA0e,QACA,kCAEAve,EAAAwH,OAAAC,OAAArD,EAAAG,QAAA,UACAvE,EAAAwH,OAAAC,OAAArD,EAAAmD,QAAA,MAGA,IAAA,MACA,OA/EA,SAAAnD,GAEA,IAAAgd,EAAAphB,EAAAmhB,iBAAA/c,EAAAmD,QACA,IAAA6Z,GAAAA,EAAA6H,aAAAjpB,EAAAgB,UAAAgf,YACA,KAAA,qCAAAjf,OAAAf,EAAAgB,UAAAgf,aAEA,IAAAmM,EAAA,IAAA7M,WAAA,GACA6M,EAAA,GAAA,EACA,IAAAC,EAAAvD,EAAAsD,EAAA/K,GAKAmJ,EAAA1B,EAAAuD,EAFApsB,EAAAqE,KAAA2f,mBAAAhkB,EAAAqE,KAAA2f,mBAAAoI,IAAA3B,MAAA,EAAA,IAGA,OAAA5qB,EAAAoH,KAAAjH,EAAAqE,KAAAC,cAAAimB,IAiEA8B,CAAAjoB,GACA/B,MAAA,SAAAQ,GACA,MAAA,gCAEAA,EAAA,QAIA,IAAA,OAEA,OAAAoF,EAAAlE,SAGAkE,EAAAlE,UAAA,mBAAAkE,EAAAlE,WACAgC,QAAAqB,MAAA,6EACAa,EAAAlE,SAAAkE,EAAAlE,YACAkE,EAAAlE,UACAlE,EAAA2e,OAAA,CAAAhhB,QAAA,yFAKAyK,EAAAlE,UAAA,iBAAAkE,EAAAlE,UAAAkE,EAAAlE,SAAA1B,KACA4F,EAAAlE,SAAA1B,MAAA,SAAA0B,GACA,IAAAA,EAAA,KAAA,YAEA,OAAAmoB,EAAA9nB,EAAAhF,QAAA0S,MAAA,GAAA7J,EAAA,CAAAlE,SAAAA,QAKAkE,EAAAlE,UAAA,iBAAAkE,EAAAlE,SA7FA,SAAAK,EAAAL,GAEA,IAAAqd,EAAAphB,EAAAmhB,iBAAA/c,EAAAmD,QACA,IAAA6Z,GAAAA,EAAA6H,aAAAjpB,EAAAgB,UAAAgf,YACA,OAAAngB,EAAA2e,OAAA,CAAAhhB,QAAA,qCAAAuD,OAAAf,EAAAgB,UAAAgf,eAGA,IAAA5Z,EAAApG,EAAAqE,KAAA2f,mBAAAhkB,EAAAqE,KAAA2f,mBAAA5f,EAAAG,SAAAkmB,MAAA,EAAA,GAGA,OAAAzqB,EAAAqE,KAAAkgB,cACAvkB,EAAAqE,KAAAkf,YAAAxf,GACAqC,EACApF,EAAAooB,KAAAtnB,cAAAoe,EACAlf,EAAAooB,KAAAtnB,cAAAqe,EACAnf,EAAAooB,KAAAtnB,cAAAse,EACA,IACA/d,MAAA,SAAA6oB,GACA,IAAAC,EAAAD,EAAAT,MAAA,EAAA,IACAW,EAAAF,EAAAT,MAAA,GAAA,IAGA6B,EAAA3D,EAAAvH,EAAAqJ,MAAA,EAAA,IAAAU,EAAAV,MAAA,EAAA,KACA8B,EAAA5D,EAAAvH,EAAAqJ,MAAA,GAAA,IAAAU,EAAAV,MAAA,GAAA,KAEAY,EAAA,IAAAC,MAAAC,gBAAAC,IAAAJ,GACAJ,EAAAK,EAAAmB,QAAAF,GACArB,EAAAI,EAAAmB,QAAAD,GAEAvB,EAAA,IAAA1L,WAAA0L,GACAC,EAAA,IAAA3L,WAAA2L,GAGA,IAAAH,EAAA,IAAAxL,WAAA,GASA,OARAwL,EAAA,GAAA,EACAA,EAAAjC,EAAAiC,EAAA1kB,GACA0kB,EAAAjC,EAAAiC,EAAAE,GACAF,EAAAjC,EAAAiC,EAAAG,GAGAH,EAAAjC,EAAAiC,EADA9qB,EAAAqE,KAAA2f,mBAAAhkB,EAAAqE,KAAA2f,mBAAA8G,IAAAL,MAAA,EAAA,IAGAzqB,EAAAqE,KAAAC,cAAAwmB,MAoDA2B,CAAAroB,EAAA6D,EAAAlE,UACA1B,MAAA,SAAAQ,GACA,MAAA,iCAEAA,EAAA,QAIAhD,EAAA2e,OAAA,CAAAhhB,QAAA,uFA9BAqC,EAAA2e,OAAA,CAAAhhB,QAAA,mCAgCA,QACA,OAAAqC,EAAA2e,OAAA,CAAAhhB,QAAA,2BAAAyK,EAAA2O,UAyMA+O,IAAA,CACA+G,WAAAb,EACA3D,KAxKA,SAAAyE,EAAAvoB,EAAAwoB,EAAAC,EAAAzI,GAGA,IAAAuI,EADAC,EAAAA,GAAA,aAEA,OAAA/sB,EAAA2e,OAAA,CAAAhhB,QAAA,2CAIA,iBADAqvB,EAAAA,GAAA,aAEAA,EAAA,CAAAA,IAIAF,EAAAvtB,QAAA4I,KAAA2kB,GAGA,IAAA/G,EAAA5lB,EAAAqE,KAAAof,cAAAkJ,EAAAC,IAEA,OAAA/sB,EAAA6P,IAAA,CACAmc,EAAAznB,GACApE,EAAA2lB,IAAAvhB,QAAA6jB,aAAArC,GACAxB,EAAAvkB,EAAAoH,KAAAmd,GAAApkB,EAAAqE,KAAA6f,iBAEA7hB,MAAA,SAAAL,GAEA,IACA6jB,EADA7jB,EAAA,GACA2iB,MACAmI,EAAA9qB,EAAA,GACAoiB,EAAApiB,EAAA,GAEA,OAAAnC,EAAA6P,IACAmd,EAAA9qB,QAAA,SAAAC,EAAA+qB,GACA,OAAAJ,EAAAI,GACA/qB,EAAAC,OACAjC,EAAA2lB,IAAAuC,KAAAyE,EAAAI,GAAA3I,EAAA0I,EAAAjH,IAFA7jB,IAIA,KAEAK,MAAA,SAAA2qB,GAEA,IAAAnQ,EAAA,EAeA,OAdA7gB,EAAAN,QAAAmxB,GAAA,SAAAI,GACAN,EAAAM,GAMAN,EAAAM,GAAAD,EAAAnQ,KAHA8P,EAAAM,GAAA,QAQAN,EAAAvI,MAAApkB,EAAAqE,KAAAC,cAAA8f,GAEAuI,SAkHAxE,KA7GA,SAAA+E,EAAA9oB,EAAA+oB,EAAAN,GAEAM,EAAAA,GAAA,SAEA,iBADAN,EAAAA,GAAA,aAEAA,EAAA,CAAAA,IAGA,IAAAvY,EAAAC,KAAAD,MACA8Y,EAAA,GAEAvU,EAAA,CAAAgT,EAAAznB,IACA,OAAAvE,EAAA6P,IAAAwd,EAAAnrB,QAAA,SAAA8W,EAAArb,GACA,IAAA6vB,EAAA7vB,EAAA2vB,GACA,IAAAE,EAAA,KAAA,iBAAAF,EACA,OAAAC,EAAAC,GAAArrB,IACA6W,EAAA5W,OACAjC,EAAA2lB,IAAAvhB,QAAA6jB,aAAAjoB,EAAAqE,KAAAof,cAAA4J,IACAhrB,MAAA,SAAAirB,GACAF,EAAAC,GAAAC,QAEAzU,IACAxW,MAAA,SAAAL,GACA,IAAAykB,EAAAzkB,EAAA,GACA,OAAAnC,EAAA6P,IAAAwd,EAAAnrB,QAAA,SAAA8W,EAAA8T,GACA,IAAAW,EAAAF,EAAAT,EAAAQ,IACA/I,EAAApkB,EAAAqE,KAAAof,cAAAkJ,EAAAvI,OAGA,OAFAuI,EAAA9nB,OAAA,EAEAgU,EAAA5W,OACA4qB,EAAA9qB,QAAA,SAAAC,EAAAirB,GACA,OAAAN,EAAAM,GACAjrB,EAAAC,OAAAjC,EAAA2lB,IAAAwC,KAAAwE,EAAAM,GAAA7I,EAAAkJ,EAAA7G,EAAA9B,OACAtiB,MAAA,SAAAkrB,GACAZ,EAAAM,GAAAM,KAEA7oB,OAAA,SAAA6B,GACAR,QAAAtG,MAAA8G,GACAR,QAAAC,KAAA,kDAAAinB,GACAN,EAAA9nB,OAAA,MARA7C,IAUA,OACA,QAEAK,MAAA,WAEA,OADA0D,QAAAqB,MAAA,0CAAAmN,KAAAD,MAAAA,GAAA,MACA4Y,WCn9CA9tB,QAAA0Q,OAAA,wBAAA,IAIAC,QAAA,aAAA,CAAA,iBAAA,SAAAyd,GAGA,IAAAC,EAEA,OAAA,WAIA,OAHAA,IACAA,EAAAD,EAAA/Y,SAEAgZ,MAIA1d,QAAA,UAAA,CAAA,gBAAA,cAAA,eAAA,gBAAA,aAAA,KAAA,mBAAA,sBAAA,UAAA,WAAA,aAAA,gBAAA,SAAA,aAAA,cAAA,SAAA2d,EAAAC,EAAAC,EAAAC,EAAA1d,EAAAtQ,EACAiuB,EAAAC,EAAAhuB,EAAAd,EAAA+uB,EACAluB,EAAAiK,EAAAiG,EAAAie,GAIA,IAWAC,EAVAC,EAAA,KACAC,EAAA,CACAC,WAAA,IACAC,UAAA,IACAC,iBAAA,IACAC,gBAAA,KAEA3rB,EAAA,CACA4rB,YAAAR,EAAAS,KAAA,SAAA1e,IAGA2e,EAAA,GAGA,SAAAC,EAAAroB,EAAAsoB,GACA,OAAAtoB,EAIA1G,GAAA,SAAA0e,GACApO,EAAA,CAAA5J,EAAAsoB,EAAA,oBAAA,sBAAA,kBACAxsB,MAAA,SAAAysB,GACA,IAAAtxB,EAAA+I,EAAA/I,SAAAsxB,EAAAvoB,GACA,OAAAonB,EAAAzpB,KAAA,CACA6qB,SAAA,OAAAvxB,GAAAsxB,EAAA,wBAAA,OACAxtB,MAAAwtB,EAAA,qBACA3mB,SAAA2mB,EAAAD,GACAG,QAAA,CACA,CACAzB,KAAA,MAAAuB,EAAA,iBAAA,OACAlY,KAAA,mBACAqY,MAAA,SAAAhlB,GACAsU,EAAAtU,cAhBApK,EAAAoH,OAyBA,SAAAioB,EAAA1xB,EAAAqxB,GACA,OAAAhvB,GAAA,SAAA0e,GACApO,EAAA,CAAA3S,EAAAqxB,EAAA,mBAAA,kBACAxsB,MAAA,SAAAysB,GACAnB,EAAAzpB,KAAA,CACA6qB,SAAA,MAAAD,EAAAtxB,GAAA,OACA8D,MAAAwtB,EAAA,oBACA3mB,SAAA2mB,EAAAD,GACAG,QAAA,CACA,CACAzB,KAAAuB,EAAA,iBACAlY,KAAA,kBACAqY,MAAA,SAAAhlB,GACAsU,EAAAtU,cAmCA,SAAAklB,EAAAzjB,GACA,OAAAA,EACAzM,GAAA,WACA,OAAAyuB,EAAAtqB,SACAsI,GAGAgiB,EAAAtqB,OAIA,SAAAgsB,EAAAnnB,GACA,OAAAkmB,IAOAlmB,EAAAA,GAAA,IACA8mB,SAAA9mB,EAAA8mB,UAAAZ,EAEAT,EAAAxpB,KAAA+D,IATAkI,EAAA,kBACA9N,MAAA,SAAAgtB,GAEA,OADAlB,EAAAkB,EACAD,EAAAnnB,MA6EA,SAAAqnB,IACA,OAAAzsB,EAAA4rB,YAAAc,OAiCA,SAAAC,EAAAjR,EAAAC,EAAAiR,GACA,OAAA,SAAApmB,GACA,IAOAqmB,EAPAC,EAAAtmB,EAAAqW,OAAAiQ,MACAC,EAAAvmB,EAAAqW,OAAAkQ,OACAC,EAAAJ,EAAArB,EAAAI,gBAAAJ,EAAAE,UACAwB,EAAAL,EAAArB,EAAAG,iBAAAH,EAAAC,WAGA0B,EAAAzhB,SAAA0hB,cAAA,UAIA,GAAAP,EAAA,CAGAE,EAAAC,GACAD,GAAAG,EAAAF,EACAA,EAAAE,IAKAF,GAAAC,EAAAF,EACAA,EAAAE,GAEAE,EAAAJ,MAAAE,EACAE,EAAAH,OAAAE,EACAJ,EAAAK,EAAAE,WAAA,MACA,IAAAC,EAAApT,KAAAqT,OAAAN,EAAAF,GAAA,EAAA,IACAS,EAAAtT,KAAAqT,OAAAL,EAAAF,GAAA,EAAA,IACAF,EAAAW,UAAAhnB,EAAAqW,OACAwQ,EACAE,EACAP,GAAA,EAAAK,EACAJ,GAAA,EAAAM,QAQAT,EAAAC,EACAD,EAAAE,IACAD,GAAAC,EAAAF,EACAA,EAAAE,GAMAD,EAAAE,IACAH,GAAAG,EAAAF,EACAA,EAAAE,GAIAC,EAAAJ,MAAAA,EACAI,EAAAH,OAAAA,GACAF,EAAAK,EAAAE,WAAA,OAGAI,UAAAhnB,EAAAqW,OAAA,EAAA,EAAAqQ,EAAAJ,MAAAI,EAAAH,QAGA,IAAAU,EAAAP,EAAAQ,YAEAR,EAAA9R,SAEAM,EAAA+R,IAwFA,SAAAE,EAAAnnB,EAAApB,GAEA,IAAAsf,EAAA1nB,EAAA2nB,SAEAvf,EAAAA,GAAA,IACAuB,YAAAvB,EAAAuB,YAAAvB,EAAAuB,YAAA,qCACAvB,EAAAG,MAAAH,EAAAG,OAAA4H,EACA/H,EAAAG,MAAAqoB,SAAAxoB,EAAAG,MAAAqoB,UAAA,GACAxoB,EAAAyoB,WAAAzoB,EAAAyoB,aAAA,EACAzoB,EAAAwB,YAAArK,QAAAoC,UAAAyG,EAAAwB,aAAAxB,EAAAwB,WACAxB,EAAA2D,sBAAAxM,QAAAoC,UAAAyG,EAAA2D,uBAAA3D,EAAA2D,qBACA3D,EAAA0oB,kBAAAvxB,QAAAoC,UAAAyG,EAAA0oB,kBAAA1oB,EAAA0oB,gBAEA,IAAAC,EAAA,SAAArnB,IACAA,EAAAA,GAAAtB,EAAAG,MAAAqoB,SAAAxoB,EAAAuB,cACAqnB,YAAA,EACAtnB,EAAAge,SAAAA,EACAhe,EAAAtB,QAAAA,EAEAA,EAAAsD,UACAnM,QAAA0S,MAAAvI,EAAAnB,MAAAH,EAAAsD,UAEAtM,GAAA,WACAsK,EAAArF,KAAAmF,GACAhH,MAAA,WACA,IAAAmM,EAEAvG,EAAAyoB,YACAliB,EAAAF,SAAAC,iBAAAtG,EAAAyoB,YAAA,MAEA3wB,EAAA+wB,eAAA/wB,EAAA+wB,eAAAC,YACAviB,EAAAwiB,kBAAA,EAAAxiB,EAAAhD,MAAAzP,QACAyS,EAAAyiB,SAGAziB,EAAAyiB,SAMAhpB,EAAAipB,YACA1iB,EAAAF,SAAAC,iBAAAtG,EAAAipB,WAAA,KACA1iB,EAAAyiB,QAIA1nB,EAAAnB,MAAA+oB,QAAAC,MAAA,iBAGAnpB,EAAAyB,WAAAzB,EAAAyB,UAAAH,UAKA8nB,EAAA,SAAA9nB,IACAA,EAAAA,GAAAtB,EAAAG,MAAAqoB,SAAAxoB,EAAAuB,uBAEAvB,EAAAG,MAAAqoB,SAAAxoB,EAAAuB,aAEAD,EAAA0U,SAIA5b,MAAA,WACAjD,QAAAoP,QAAAzO,EAAAuO,SAAAC,iBAAA,QAAA,IACA+iB,YAAA,qBAKA/nB,EAAAtB,EAAAG,MAAAqoB,SAAAxoB,EAAAuB,aAsDA,OArDAD,EAkDAqnB,EAAArnB,GAhDAzJ,EAAAyxB,gBAAAtpB,EAAAuB,YAAA,CACApB,MAAAH,EAAAG,MACAwD,qBAAA3D,EAAA2D,uBAEAvJ,MAAA,SAAAkH,GACAA,EAAAsnB,YAAA,EAEAtnB,EAAAnB,MAAAopB,aAAA,SAAA7R,GACA,IAAAlW,EAAAF,EAAAtB,SAAAsB,EAAAtB,QAAAwB,WACAF,EAAAtB,gBAAAsB,EAAAtB,QAAAwB,WACAF,EAAAnG,OACAf,MAAA,WACA,GAAAoH,EACA,OAAA4nB,EAAA9nB,MAGAlH,MAAA,WACAkH,EAAAge,UACAhe,EAAAge,SAAAhJ,QAAAoB,UAEApW,EAAAge,gBACAhe,EAAAtB,YAKAsB,EAAAnB,MAAAzI,IAAA,kBAAA,WACA4J,EAAAtB,SAAAsB,EAAAtB,QAAAwpB,aACAloB,EAAAtB,QAAAwpB,cAEAloB,EAAAtB,SAAAsB,EAAAtB,QAAAwB,YACA4nB,EAAA9nB,MAKAtB,EAAAG,MAAAzI,IAAA,WAAA,WACA4J,EAAAge,UACAhe,EAAAge,SAAAhJ,UAEA8S,OAGAppB,EAAAG,MAAAqoB,SAAAxoB,EAAAuB,aAAAD,EACAqnB,EAAArnB,MAOAge,EAAA1jB,QAyIA,SAAA6tB,EAAAC,EAAAC,GACA,IAAAC,EAAAvC,IAAA,IAAA,GACAwC,EAAA,oCAAA/wB,OAAA6wB,EAAAA,GACA,MAAA,CACAA,aAAAA,EACA1tB,KAAA,SAAA+D,GAKA,OAJAA,EAAAA,GAAA,IACA3E,SAAA2E,EAAA3E,UAAAwuB,EACA7pB,EAAA5E,KAAAjE,QAAAoC,UAAAyG,EAAA5E,MAAA4E,EAAA5E,IACA4E,EAAA8pB,cAAA9pB,EAAA8pB,gBAAAzC,IAAA,KAAA,KACArwB,GAAA,WAGAgJ,EAAA5E,KAAA6qB,EAAA7qB,MAGAsuB,EAAA1pB,KACAA,EAAAyD,SAAAmmB,KAuDA,SAAAG,EAAAzE,EAAA0E,EACAC,EAAA3zB,EAAA4zB,GAEAA,EAAAA,GAAA,UACAC,OAAAC,cAAAD,OAAAE,mBAAAH,GAEA,IAAAI,EAAAH,OAAAH,GAAA,EAAAC,GAAA,KAIA,OAHAK,EAAAC,QAAAjF,EAAAhvB,GACAg0B,EAAAE,OAEAF,EAmCA,SAAAG,EAAAzqB,EAAAyD,GAWA,GATA,iBAAAzD,IACAA,EAAA,CACA3E,SAAA2E,SAKA,IAAAA,EAAA3E,UAAA,KAAA2E,EAAA3E,SAIA,OADAyC,QAAAtG,MAAA,8BACA,EAGAR,GAAA,WACA,IAAAmQ,EAAAd,SAAAC,iBAAAtG,EAAA3E,UACA8L,GAAApT,EAAAN,QAAA0T,GAAA,SAAAZ,GACAA,EAAAmkB,UAAAC,OAAA,MAAA,QAEAlnB,GAAA,KAGA,SAAAmnB,EAAA5qB,EAAAyD,GAWA,GATA,iBAAAzD,IACAA,EAAA,CACA3E,SAAA2E,SAKA,IAAAA,EAAA3E,UAAA,KAAA2E,EAAA3E,SAIA,OADAyC,QAAAtG,MAAA,+BACA,EAGAR,GAAA,WACA,IAAAmQ,EAAAd,SAAAC,iBAAAtG,EAAA3E,UACA8L,GAAApT,EAAAN,QAAA0T,GAAA,SAAAZ,GACAA,EAAAmkB,UAAAC,OAAA,MAAA,QAEAlnB,GAAA,KAoDA,OA/JAijB,EAAAmE,OAAA,CACAnnB,QAAA,EACAonB,QAAArB,EAAA3D,EAAAiF,OAAA,kBACAC,OAAAvB,EAAA3D,EAAAkF,OAAA,kBACAC,YAAAxB,EAAA3D,EAAAmF,YAAA,yBACAC,iBAAAzB,EAAA3D,EAAAoF,iBAAA,+BACAC,UAAA1B,EAAA3D,EAAAqF,UAAA,uBACAC,SAAA3B,EAAA3D,EAAAsF,SAAA,aACAL,OAAAtB,EAAA3D,EAAAiF,OAAA,kBACAM,QAAA5B,EAAA3D,EAAAuF,QAAA,YACAC,OAAA7B,GAAA,SAAAzpB,GACAyqB,EAAAzqB,KACA,WACAyqB,SAAAA,EACAG,UAAAA,GAgGA3E,EAAA,CACAsF,MAAA,CACA/zB,MAAAmvB,EACA9Q,KAAAoR,EACAuE,QAjuBA,SAAAj2B,EAAA8D,EAAA2G,GAQA,OAPA3G,EAAAA,GAAA,uBAEA2G,EAAAA,GAAA,IACAyrB,SAAAzrB,EAAAyrB,UAAA,UACAzrB,EAAA5G,OAAA4G,EAAA5G,QAAA,gBACA4G,EAAA0rB,WAAA1rB,EAAA0rB,YAAA,oBAEAxjB,EAAA,CAAA3S,EAAA8D,EAAA2G,EAAA0rB,WAAA1rB,EAAA5G,SACAgB,MAAA,SAAAysB,GACA,OAAAnB,EAAA8F,QAAA,CACA1E,SAAAD,EAAAtxB,GACAk2B,SAAAzrB,EAAAyrB,SACApyB,MAAAwtB,EAAAxtB,GACAqyB,WAAA7E,EAAA7mB,EAAA0rB,YACAC,WAAA3rB,EAAA2rB,WACAvyB,OAAAytB,EAAA7mB,EAAA5G,QACAwyB,OAAA5rB,EAAA4rB,aAitBAC,eAtuBA,WACA,OAAA5E,EAAA,mCAuuBA3vB,QAAA,CACA2E,KAAAkrB,EACAhsB,KAAA+rB,EACA4E,OAxrBA,SAAA9rB,GACA,OAAAylB,EAAAsG,aAAA3xB,MAAA,SAAA4xB,GACA,GAAAA,GAAAA,EAAAC,QAEA,OAAAjsB,GAAAA,EAAA8mB,SACA5e,EAAAlI,GAAAA,EAAA8mB,UACA1sB,MAAA,SAAA0sB,GAEA,OADA9mB,EAAA8mB,SAAAA,EACAkF,UAJA,KAQA5xB,MAAA,SAAA4xB,GACA,GAAAA,GAAAA,EAAAC,QAAA,OAAA9E,EAAAnnB,QA6qBAksB,MAAA,CACAjwB,KA1qBA,SAAA1G,EAAA42B,EAAAxmB,GAIA,OAHAwmB,EAAAA,GAAA,QACAxmB,EAAAA,GAAA,SAEAuC,EAAA,CAAA3S,IACA6E,MAAA,SAAAysB,GAaA,MARA,iBAAAsF,IAEAA,EADA,SAAAA,EACA,IAGA,KAGA1G,EAAAxpB,KAAA,CAAA6qB,SAAAD,EAAAtxB,GAAA62B,YAAA,EAAAD,SAAAA,SA0pBAzvB,QArpBA,SAAAmf,EAAAtF,GACA,OAAA,SAAAjY,GACA,IACAsoB,EADAyF,EAAAxQ,EAUA,GARAvd,GAAAA,EAAA/I,SACA82B,EAAA/tB,EAAA/I,QACAqxB,EAAA/K,GAEAA,IACAwQ,EAAA/tB,IAGAiY,EAIA,MAAA,aAAA8V,EACAnF,EAAA,KAKAA,EAAA,IACAP,EAAA0F,EAAAzF,IAVArQ,EAAA8V,KAyoBA5xB,OAAA,CACAC,QAAA2sB,EACAiF,WAAAvG,GAEA3qB,IAAAyqB,EAAA0G,cACA1B,OAAAnE,EAAAmE,OACA2B,WArKA,SAAA9oB,GACA,GAAAuiB,EAAA4E,OAAAnnB,SAAAA,EAAA,CAIA,GAHA5F,QAAAqB,MAAA,mBAAAuE,EAAA,SAAA,YAEAuiB,EAAA4E,OAAAnnB,OAAAA,EACAA,EACAiiB,EAAA8G,MAAAC,WAAA,YACAv1B,QAAA0S,MAAAoc,EAAA4E,OAAAnE,EAAAmE,YAEA,CACAlF,EAAA8G,MAAAC,WAAA,QACA,IAAAC,EAAA,CACAC,WAAApwB,EACAP,KAAA,cAEA9E,QAAA0S,MAAAoc,EAAA4E,OAAA,CACAnnB,QAAA,EACAonB,QAAA6B,EACA1B,YAAA0B,EACAzB,iBAAAyB,EACAxB,UAAAwB,EACAvB,SAAAuB,EACA5B,OAAA4B,EACAtB,QAAAsB,EACArB,OAAAqB,EACAlC,SAAAA,EACAG,UAAAA,IAEA7iB,EAAA8iB,OAAA8B,EAEA/G,EAAAiH,eAwIA1C,OAAA,CACA2C,IA/FA,SAAAxH,EAAA0E,EACAC,EAAA3zB,EAAA4zB,GAGA,OADAH,EAAAzE,EAAA0E,EAAAC,EAAA3zB,EAAA4zB,GACA6C,gBA4FAC,IAhFA,SAAA1H,EAAA0E,EACAC,EAAA3zB,EAAA4zB,GAGA,OADAH,EAAAzE,EAAA0E,EAAAC,EAAA3zB,EAAA4zB,GACA+C,iBA8EAC,IAAA,CACAjxB,KAjOA,SAAA/G,EAAAuO,GACAA,IACAA,EAAA,KAEAzM,GAAA,WAGA,IAAAm2B,EAAA9mB,SAAA+mB,uBAAA,cACAr5B,EAAAN,QAAA05B,GAAA,SAAAD,GACAA,EAAAh4B,IAAAA,GACAg4B,EAAAxC,UAAAC,OAAA,MAAA,QAGAlnB,IAqNAtI,KAlNA,SAAAjG,EAAAuO,GACAA,IACAA,EAAA,IAEAzM,GAAA,WAGA,IAAAm2B,EAAA9mB,SAAA+mB,uBAAA,cACAr5B,EAAAN,QAAA05B,GAAA,SAAAD,GACAA,EAAAh4B,IAAAA,GACAg4B,EAAAxC,UAAAC,OAAA,MAAA,QAGAlnB,KAuMAnC,QAAA,CACArF,KAAAssB,EACAxoB,KA5UA,SAAAqB,EAAAmC,GACA,IAAA8pB,EAAA9pB,GAAAA,EAAAmP,QAAA,OAAA,EAAAnP,EAAA9N,MAAA,MAAA3B,OAAA,EACA,OAAAy0B,EAAAnnB,EAAA,CACAG,YAAA,qCACA+B,SAAA,CACAC,MAAAA,EACA8pB,KAAAA,GAEA5E,WAAA,kBAAA4E,GAAA,EAAA,QAAA,eAqUAC,MAjUA,SAAAlsB,EAAApB,GAUA,OATAA,EAAAA,GAAA,IACAuB,YAAAvB,EAAAuB,YAAAvB,EAAAuB,YAAA,sCACAvB,EAAAyoB,WAAAzoB,EAAAyoB,YAAA,uBACAzoB,EAAAsD,SAAAtD,EAAAsD,UAAA,GACAtD,EAAAsD,SAAAC,MAAAvD,EAAAsD,SAAAC,OAAAvD,EAAAsD,SAAAiqB,KACAzrB,EAAA0rB,KAAA1rB,EAAA4R,QAAA5R,EAAA5H,OAAA,CAAAuzB,UAAA,IACAztB,EAAAsD,SAAAoqB,QAAA1tB,EAAAsD,SAAAoqB,SAAA1tB,EAAAsD,SAAAC,MACAvD,EAAAsD,SAAAqqB,YAAA3tB,EAAAsD,SAAAqqB,aAAA,GACA3tB,EAAAsD,SAAAsqB,SAAA5tB,EAAAsD,SAAAsqB,UAAA,6BACArF,EAAAnnB,EAAApB,IAwTA4D,QArTA,SAAAiqB,EAAA34B,EAAA8K,GACA,IAAAuG,EAAA,iBAAArR,GAAAA,EAAA4C,EAAAuO,SAAAK,eAAAxR,GAAAA,EACAA,GAAAqR,IAAAvG,EAAA3E,WACAkL,EAAAzO,EAAAuO,SAAAynB,cAAA9tB,EAAA3E,WAIA,IAAAikB,GADAtf,EAAAA,GAAA,IACAsf,UAAA1nB,EAAA2nB,QAEA,GAAAhZ,IAAAvG,EAAAyD,QACAzD,EAAA+tB,WACAxnB,EAAAvG,EAAA+tB,aAEA/tB,EAAAuB,YAAAvB,EAAAuB,YAAAvB,EAAAuB,YAAA,wCACAvB,EAAAipB,UAAAjpB,EAAAipB,WAAA,kBACAjpB,EAAAsD,SAAAtD,EAAAsD,UAAA,GACAtD,EAAAsD,SAAAoC,KAAA1F,EAAAsD,SAAAoC,MAAA,GACA1F,EAAAsD,SAAAoC,KAAAC,SAAA3F,EAAAsD,SAAAoC,KAAAC,WAAA,EACA3F,EAAAsD,SAAAoC,KAAAK,MAAA/F,EAAAsD,SAAAoC,KAAAK,QACA/F,EAAAsD,SAAAoC,KAAAC,UAAA3F,EAAAsD,SAAAoC,KAAAC,SAAAjQ,WAAA,WAAA,mBAAA,kBACAsK,EAAAsD,SAAAoC,KAAAknB,MAAA5sB,EAAAsD,SAAAoC,KAAAknB,OAAA,aAAA5sB,EAAAsD,SAAAoC,KAAAK,MACA/F,EAAAsD,SAAAV,OAAAzL,QAAAoC,UAAAyG,EAAAsD,SAAAV,OAAA5C,EAAAsD,SAAAV,KACA2lB,EAAAhiB,EAAAvG,GACA5F,MAAA,SAAAsd,GACA1X,EAAAguB,YACAznB,EAAAvG,EAAAguB,cAEA1O,EAAAhJ,QAAAoB,MAEAjb,OAAA,SAAA6B,GACA0B,EAAAguB,YACAznB,EAAAvG,EAAAguB,cAEA1O,EAAA/I,OAAAjY,WAMA,GAAA0B,EAAAyD,QAAA,CACA,IAAAA,EAAAzD,EAAAyD,QACAzD,EAAAiuB,aAAAjuB,EAAAiuB,cAAAxqB,SACAzD,EAAAyD,QACAzD,EAAAsf,SAAAA,EACAtoB,GAAA,WACA62B,EAAA34B,EAAA8K,KACAyD,QAIAtM,QAAAoC,UAAAyG,EAAAiG,SAAAjG,EAAAiG,MAEA,aAAAjG,EAAAtD,QACA1F,GAAA,WACAsoB,EAAAhJ,SAAA,MAIAtf,GAAA,WACAsoB,EAAA/I,OAAA,gCAAArhB,OAOA8K,EAAAiG,MAAA9O,QAAAiM,YAAApD,EAAAiG,OAAA,EAAAjG,EAAAiG,MAAA,EACAjG,EAAAsf,SAAAA,EACAtoB,GAAA,WACA62B,EAAA34B,EAAA8K,KACAA,EAAAyD,SAAAzD,EAAAiuB,cAAA,MAIA,OAAA3O,EAAA1jB,UA6OAsyB,UAAA,CACAC,OA5oBA,SAAAC,EAAAhnB,GACA,GAAAA,EAAA7D,OAAA,QAAA6D,EAAAuH,MAAA,YAAAvH,EAAAuH,KAEA7W,EAAA+wB,eAAA/wB,EAAA+wB,eAAAC,YACA1hB,EAAA2hB,kBAAA,EAAA3hB,EAAA7D,MAAAzP,aAIA,GAAAsT,EAAAinB,YAAAjnB,EAAAinB,WAAAv6B,OAAA,EACAs6B,EAAAhnB,EAAAinB,WAAA,QAEA,CAEA,IAAAC,EAAAx2B,EAAAuO,SAAAkoB,cACAD,EAAAE,mBAAApnB,GACA,IAAA8mB,EAAAp2B,EAAA+wB,eACAqF,EAAAO,kBACAP,EAAAQ,SAAAJ,KA4nBApoB,IAvnBA,WACA,IAAAyoB,EAAA,GAIA,OAHAtV,OAAAwP,eACA8F,EAAA72B,EAAA+wB,eAAAC,YAEA6F,IAonBAC,MAAA,CACAC,WAziBA,SAAAlyB,EAAA6qB,GACA,IAAAwF,EAAA3mB,SAAA0hB,cAAA,OACA,OAAAnwB,GAAA,SAAA0e,EAAAC,GAEA,GAAA5Z,EAAA,CACA,IAAAmnB,EAAA,IAAAvM,WACAuM,EAAAtM,OAAA,SAAApW,GACA4rB,EAAAxV,OAAA+P,EAAAjR,EAAAC,EAAAiR,GACAwF,EAAA8B,IAAA1tB,EAAAqW,OAAAC,QAEAoM,EAAAiL,cAAApyB,QAGA4Z,EAAA,wBAGAnc,MAAA,SAAAiuB,GAEA,OADA2E,EAAAhX,SACAqS,MAwhBA2G,UAnhBA,SAAAC,EAAAzH,GACA,IAAAwF,EAAA3mB,SAAA0hB,cAAA,OACA,OAAAnwB,GAAA,SAAA0e,EAAAC,GACAyW,EAAAxV,OAAA+P,EAAAjR,EAAAC,EAAAiR,GACAwF,EAAA8B,IAAAG,KAEA70B,MAAA,SAAAQ,GAEA,OADAoyB,EAAAhX,SACApb,MA4gBAs0B,UAneA,SAAAD,EAAAE,GACA,IAAAnC,EAAA3mB,SAAA0hB,cAAA,OACA,OAAAnwB,GAAA,SAAA0e,EAAAC,GACAyW,EAAAxV,OAxCA,SAAAlB,EAAAC,GACA,IACA4Y,EADAta,KAAAua,GAAA,IACA,GACA,OAAA,SAAAhuB,GACA,IAAAsmB,EAAAtmB,EAAAqW,OAAAiQ,MACAC,EAAAvmB,EAAAqW,OAAAkQ,OACAC,EAAAzB,EAAAE,UACAwB,EAAA1B,EAAAC,WAEAsB,EAAAC,EACAD,EAAAE,IACAD,GAAAC,EAAAF,EACAA,EAAAE,GAGAD,EAAAE,IACAH,GAAAG,EAAAF,EACAA,EAAAE,GAIA,IAAAC,EAAAzhB,SAAA0hB,cAAA,UACAD,EAAAJ,MAAAC,EACAG,EAAAH,OAAAD,EAEA,IAAAD,EAAAK,EAAAE,WAAA,MACAP,EAAA4H,OAAAF,GACA1H,EAAAW,UAAAhnB,EAAAqW,OAAA,GAAA,EAAAqQ,EAAAJ,OAEA,IAAAW,EAAAP,EAAAQ,YAEAR,EAAA9R,SAEAM,EAAA+R,IAOAiH,CAAAhZ,GACA0W,EAAA8B,IAAAG,KAEA70B,MAAA,SAAAQ,GAEA,OADAoyB,EAAAhX,SACApb,OA6dA8rB,IAAAA,MAQA5e,QAAA,SAAA,CAAA,WAAA,UAAA,SAAA9Q,EAAAc,GAGA,OAAA,SAAA5C,GAKA8B,GAAA,WACA,IAAAuP,EAAAzO,EAAAuO,SAAAK,eAAAxR,GACAqR,GACAA,EAAAyiB,eC33BA7xB,QAAA0Q,OAAA,wBAAA,CAAA,kBAEAC,QAAA,UAAA,CAAA,aAAA,QAAA,UAAA,aAAA,eAAA,SAAAC,EAAAwnB,EAAAz3B,EAAAO,EAAAm3B,GAGA,IACAz2B,EAAA,CACA02B,UAAA,KACAC,KAAA,KACAC,OAAA,IACAC,MAAAv3B,EAAAuR,gBAAAT,aAEA0mB,EAAAC,IACAC,EAAA,GAGA,SAAAD,EAAArlB,GAEA,OADAA,EAAAA,GAAApS,EAAAuC,OACA6P,EAAAhN,iBAAAgN,EAAAV,cAAAjS,EAAAmQ,aAAA,eAAA,SAGA,SAAA+nB,EAAAhwB,GAOA,OANAA,EAAAA,GAAA,IACA6vB,YAAAC,IACA9vB,EAAAiwB,eAAA,iBAAAjwB,EAAA6vB,aAAA7vB,EAAAkwB,SAAA,aAAA,UACAlwB,EAAAmwB,mBAAA,YAAAnwB,EAAAiwB,eACA,KACA,KACAjwB,EAyDA,SAAAowB,EAAA3lB,GACA,IAAA4lB,EAAAP,EAAArlB,GACA4lB,IAAAR,IAEAA,EAAAQ,EACAvyB,QAAAqB,MAAA,kDAAArG,OAAA+2B,IACA97B,EAAAN,QAAAM,EAAAP,KAAAu8B,IAAA,SAAAO,GACA,IAAAC,EAAAf,EAAAtpB,IAAAoqB,GACAC,GACAA,EAAAC,WAAAR,KAAA,OAeA,OATA,WACA/hB,UAAA,CAEA5V,EAAA+S,IAAAxQ,KAAA61B,GAAAllB,QAAAxD,EAAAqoB,EAAA98B,OAIAo9B,GAEA,CACAxqB,IA/EA,SAAApQ,EAAA66B,EAAAT,GAGA,IAGAK,EAHAD,GAFAx6B,EAAAA,GAAA,MACA66B,EAAAA,GAAA53B,EAAA62B,OACA,IAAA,KAIA,GAAAM,GAAA,mBAAAA,EAAA,CAEA,IADA,IAAAU,EAAA,EACApB,EAAAtpB,IAAAoqB,EAAAM,IACAA,IAEAN,GAAAM,OAGAL,EAAAf,EAAAtpB,IAAAoqB,GAOA,GAHAP,EAAAO,KAAAP,EAAAO,IAAA,GAGAC,EAAA,OAAAA,EAGA,IAAAvwB,EAAAgwB,EAAA,CACAW,OAAAA,EACAT,SAAAA,GAAA,OAGA,OADApyB,QAAAqB,MAAA,0DAAArG,OAAAw3B,EAAAtwB,EAAA6vB,cACAL,EAAAqB,YAAAP,EAAAtwB,IAkDA8wB,MArCA,SAAAC,GACAh9B,EAAAN,QAAAM,EAAAP,KAAAu8B,IAAA,SAAAO,GACA,GAAAA,EAAA56B,WAAAq7B,GAAA,CACA,IAAAR,EAAAf,EAAAtpB,IAAAoqB,GACAC,GACAA,EAAAS,iBAiCAC,SAhDA,WACAnzB,QAAAqB,MAAA,kCACApL,EAAAN,QAAAM,EAAAP,KAAAu8B,IAAA,SAAAO,GACA,IAAAC,EAAAf,EAAAtpB,IAAAoqB,GACAC,GACAA,EAAAS,gBA4CAj4B,UAAAA,MCjHA5B,QAAA0Q,OAAA,wBAAA,CAAA,0BAGAqpB,WAAA,kBAAA,eAKAA,WAAA,iBAAA,CAAA,SAAA,UAAA,SAAA,SAAAn6B,EAAAmB,EAAAyV,GAGA5W,EAAAo6B,SAAA,SAAA/vB,EAAAnC,EAAAe,GAQA,OAPAA,EAAAA,GAAA,IAGAtD,QAAA,WACA,OAAAxE,EAAAoJ,QAAAvB,KAAAqB,EAAAnC,IAGA0O,EAAA1O,IAAAihB,KAAAjhB,EAAAe,OAIA8H,QAAA,aAAA,CAAA,cAAA,aAAA,KAAA,YAAA,cAAA,WAAA,SAAA,SAAAspB,EAAArpB,EAAAnQ,EAAAy5B,EAAAp6B,EAAAD,EAAAsB,GAsBA,SAAAg5B,EAAAv6B,EAAAuoB,EAAA/mB,GAEAxB,EAAAuoB,SAAAA,GAAA1nB,EAAA2nB,QACAxoB,EAAAw6B,UAAA,EAEAx6B,EAAAy6B,UAAA,WACA,OAAAz6B,EAAA06B,MAAAx1B,QAGAlF,EAAA26B,UAAA,WACA,OAAA36B,EAAA06B,MAAAt2B,QAGApE,EAAA8G,WAAA,SAAA6Z,GAGA,OAFA3gB,EAAAw6B,UAAA,EAEAx6B,EAAA06B,MAAAzb,SACA5b,MAAA,WAIA,OAFAiM,SAAAsrB,KAAAjH,UAAA1U,OAAA,cACAjf,EAAAuoB,SAAAhJ,QAAAoB,GACAA,MAMA3gB,EAAA6K,QAAA,SAAAlG,EAAAk2B,GACAA,EACA76B,EAAA66B,GAAAl2B,EAGA3E,EAAA2E,KAAAA,GAKA3E,EAAA86B,cAAA,WACA,OAAAt5B,GAGAxB,EAAAW,IAAA,gBAAA,WAGAX,EAAAw6B,WACAx6B,EAAAw6B,UAAA,EAEAv6B,GAAA,WAEA,OADAD,EAAAuoB,SAAAhJ,UACAvf,EAAA06B,MAAAzb,SAAA5b,MAAA,WAEAiM,SAAAsrB,KAAAjH,UAAA1U,OAAA,oBAEAjf,EAAA06B,MAAAK,WAAA,KAAA,QAyDA,MAAA,CACA71B,KArDA,SAAAsF,EAAA2vB,EAAA34B,EAAAyH,GACA,IAKA0oB,EAlFAqJ,EACAra,EAKAsa,EAuEA1S,EAAA1nB,EAAA2nB,QAYA,IAVAvf,EAAAA,GAAA,IACAiyB,UAAAjyB,EAAAiyB,WAAA,cAIAvJ,IAAAvxB,QAAAoC,UAAAyG,EAAA0oB,kBAAA1oB,EAAA0oB,gBAEA1oB,EAAA0oB,gBAAAA,EAGAwI,EAAA,CAEAlxB,EAAAG,MAAAH,EAAAG,MAAAH,EAAAG,MAAA+xB,OAAAnqB,EAAAmqB,OACAZ,EAAAzoB,KAAA,GAAA7I,EAAAG,MAAAmf,EAAA/mB,GAGA,IAAA45B,EAAA,CAAAp7B,OAAAiJ,EAAAG,MAAA5H,WAAAA,GACA65B,GA/FA1a,EAAA,CACA2a,gBAAA,EACAC,eAAA,GACAV,SAAA,IAEAI,IANAD,EAgGAb,IA1FA,IAAAn0B,OAAAtH,MAAA,OACAiiB,EAAA2a,eAAA,IAAAL,EAAAl+B,QAAA,QAAAk+B,EAAA,IAAA,IAAAx3B,cACAkd,EAAA2a,gBACA3a,EAAA4a,eAAAN,EAAA,GACAta,EAAAka,SAAAI,EAAA,IAEAta,EAAA4a,eAAAP,EAGAra,GAkFA6a,EAAAt7B,EAAAi6B,EAAAiB,GACAC,EAAAC,iBACAE,EAAAf,UAAAxxB,EAAAG,MAAAqxB,UACAe,EAAA10B,WAAAmC,EAAAG,MAAAtC,YAyBA,OArBAuzB,EAAA9H,gBAAA/nB,EAAAvB,GACA5F,MAAA,SAAAq3B,GACA,GAAAP,EAEAO,EAAAtxB,MAAA+oB,QAAAuI,MAAAA,MAEA,CACA,IAAAtxB,EAAAsxB,EAAAtxB,MAEAmxB,EAAAzoB,KAAA,GAAA1I,EAAAmf,EAAA/mB,GAEA4H,EAAAsxB,MAAAA,EAIA,OAAAA,EAAAx1B,UAEA,SAAAqC,GACAghB,EAAA/I,OAAAjY,MAGAghB,EAAA1jB,aAQAkM,QAAA,SAAA,CAAA,aAAA,aAAA,cAAA,WAAA,aAAA,UAAA,SAAAC,EAAAG,EAAAwd,EAAA1uB,EAAAw7B,EAAAt6B,GA+CA,SAAAu6B,EAAAl6B,GACA,OAAAi6B,EAAAv2B,KAAA,wCAAA,gBACA1D,GAGA,SAAAm6B,EAAAn6B,GACA,OAAAi6B,EAAAv2B,KAAA,wCAAA,gBACA1D,GA+DA,MAAA,CACAo6B,aAnHA,SAAAp6B,GACA,IAAAq6B,EAAA16B,EAAAuC,OAAAC,UACA,OAAA83B,EAAAv2B,KAAA,uCAAA,oBACA1D,EAAA,CACAmwB,iBAAAkK,KAgHAC,UA5GA,SAAAt6B,GACA,OAAAi6B,EAAAv2B,KAAA,mCAAA,iBACA1D,EAAA,CAAAmwB,iBAAA,EAAA/kB,sBAAA,KA2GA1C,cAxGA,SAAA1I,GACA,OAAAi6B,EAAAv2B,KAAA,kCAAA,qBACA1D,GAAA,GAAA,CAAAmwB,iBAAA,KAuGAoK,kBApGA,SAAAv6B,GACA,OAAAi6B,EAAAv2B,KAAA,uCAAA,yBACA1D,EAAA,CAAAmwB,iBAAA,KAmGAqK,UAhGA,SAAAx6B,GACA,OAAAi6B,EAAAv2B,KAAA,6BAAA,iBACA1D,IA+FAiG,SAvFA,SAAAjG,GACA,OAAAi6B,EAAAv2B,KAAA,gDAAA,iCACA1D,GACA6B,MAAA,SAAAL,GACA,GAAAA,EACA,MAAA,UAAAA,EAAAi5B,YACAP,EAAA14B,GACA24B,EAAA34B,OAiFA04B,eAAAA,EACAC,eAAAA,EACA9zB,SArEA,SAAArG,GACA,OAAAi6B,EAAAv2B,KAAA,iCAAA,gBACA1D,IAoEAmG,oBAhGA,SAAAnG,GACA,OAAAi6B,EAAAv2B,KAAA,uCAAA,0BACA1D,IA+FA06B,YAlEA,SAAA16B,GACA,OAAAi6B,EAAAv2B,KAAA,wCAAA,2BACA1D,IAiEA26B,yBA9DA,SAAA36B,GACA,OAAAi6B,EAAAv2B,KAAA,kDAAA,mCACA1D,IA6DA46B,iBA1DA,SAAA56B,GACA,OAAAi6B,EAAAv2B,KAAA,2CAAA,wBACA1D,IAyDA0H,aAtDA,SAAAD,IACAA,EAAAA,GAAA,IACA3G,MAAA2G,EAAA3G,OAAA,4BACA2G,EAAAE,SAAAF,EAAAE,UAAA,+BACA,IAAAC,EAAAH,EAAAG,MAAAH,EAAAG,MAAA+xB,OAAAnqB,EAAAmqB,OAgBA,OAfA/xB,EAAA1H,SAAA,CAAAqD,cAAAU,GACA2D,EAAAyB,QAAA,SAAAlG,GACAyE,EAAAzE,KAAAA,GAEAyE,EAAAizB,OAAA,SAAApxB,GACA7B,EAAAzE,KAAAgE,YAAA,EACAsC,GAAAA,EAAAqxB,gBAAArxB,EAAAqxB,iBACAlzB,EAAAzE,KAAAC,QAAAwE,EAAA1H,SAAAqD,UACAkE,EAAAszB,MAAA1d,MAAAzV,EAAA1H,SAAAqD,WAIAqE,EAAA3I,MAAAwI,EAAAxI,YAAAgF,EAGA0L,EAAA,CAAAlI,EAAA3G,MAAA2G,EAAAE,SAAA,gBAAA,sBACA9F,MAAA,SAAAysB,GAcA,OAbA7mB,EAAAszB,MAAA5N,EAAAzpB,KAAA,CACAsF,YAAA,uCACAlI,MAAAwtB,EAAA7mB,EAAA3G,OACA6G,SAAA2mB,EAAA7mB,EAAAE,UACAC,MAAAA,EACA4mB,QAAA,CACA,CAAAzB,KAAAuB,EAAA,sBACA,CAAAvB,KAAAuB,EAAA,iBACAlY,KAAA,kBACAqY,MAAA7mB,EAAAizB,WAIApzB,EAAAszB,cAwBAxrB,QAAA,aAAA,CAAA,aAAA,aAAA,cAAA,WAAA,UAAA,cAAA,SAAAC,EAAAG,EAAAwd,EAAA1uB,EAAAkB,EAAAjB,GAqCA,MAAA,CACAk8B,iBAnCA,SAAA/xB,EAAApB,GAGA,IAAAzH,GAFAyH,EAAAA,GAAA,IAEAzH,YAAA,UACAyH,EAAAzH,WAEA,IAAA4H,EAAAH,EAAAG,OAAAH,EAAAG,MAAA+xB,QAAAnqB,EAAAmqB,MAAA,GACAlyB,EAAAG,MAAAA,EACAH,EAAAuB,YAAA,6CACAvB,EAAAwB,YAAA,EAGArK,QAAAC,OAAA9D,KAAA2D,EAAA,0BAAA,CAAAF,OAAAiJ,EAAAG,MAAA5H,WAAAA,KAEA,IAAAg7B,EAAAvzB,EAAAyB,UAYA,OAXAzB,EAAAyB,UAAA,SAAAH,GAGAnB,EAAAopB,aAAA,SAAAxvB,GACAuH,EAAAnB,MAAAopB,aAAAxvB,IAIAw5B,GAAAA,EAAAjyB,IAGApJ,EAAAoJ,QAAArF,KAAAmF,EAAApB,GACA5F,MAAA,SAAAL,GAGA,OADAoG,EAAAqzB,WACAz5B,UCzUA5C,QAAA0Q,OAAA,uBAAA,CAAA,0BAEAC,QAAA,SAAA,CAAA,QAAA,KAAA,WAAA,UAAA,aAAA,UAAA,SAAA,SAAAynB,EAAA33B,EAAAZ,EAAAc,EAAAO,EAAAo7B,EAAAn7B,GAGA,IAAAmL,EAAApL,EAAAuC,KAAA6I,QAGAiwB,EAAA,GAEAC,EAAA,GAOA,SAAAzgB,EAAA0gB,EAAA5f,GAEA,OAAA4f,EAAAA,GAAA5f,GAAA,IAAAA,GAAA,KAAAA,EAAA,IAAAA,EAAA,IAAA,KAGA,SAAA6f,EAAAD,EAAA5f,EAAA/G,EAAAsG,GAEA,OADA,KAAAS,GAAAT,EAAA,QAAA,QACA,MAAAL,EAAA0gB,EAAA5f,IAAA/G,GAAA,IAQA,SAAA6mB,EAAAvd,EAAA3b,EAAA2yB,EAAA1c,GACAjW,GAAAA,EAAArF,QACAghB,EAAA3b,GAGA,KAAAiW,EACA0F,EAAA,CAAAlW,MAAA,IAAA9K,QAAA,yBAAAg4B,EAAA,KAAAA,EAAA,IAAA,MAEA,KAAA1c,EACA0F,EAAA,CAAAlW,MAAA,IAAA9K,QAAA,sBAAAg4B,EAAA,KAAAA,EAAA,IAAA,MAEAA,GACAzvB,QAAAtG,MAAA,kCAAAqZ,EAAA,SAAA0c,EAAA,KACAhX,EAAA,2BAAAgX,EAAA,MAGAhX,EAAA,2BAKA,SAAAwd,EAAAxG,EAAArzB,EAAA85B,EAAA9d,GACA,IAAA+d,EAAA,GAAAC,EAAA,GAAAC,EAAA5G,EAaA,MAZA,iBAAArzB,IACA+5B,EAAAlgC,EAAAP,KAAA0G,IAGAnG,EAAAN,QAAAwgC,GAAA,SAAAG,GACAD,KACAA,EAAAA,EAAAE,QAAA,IAAAD,EAAAl6B,EAAAk6B,OAEAF,EAAAE,GAAAl6B,EAAAk6B,OAGAJ,EAAA95B,OAAAg6B,EACAhe,EAAAie,EAAAH,GA4PA,SAAAM,EAAAr1B,GACA,IAAA8O,EACA9O,EAAAvJ,WAAA,gBACAqY,EAAA,UACA9O,EAAAA,EAAAo1B,QAAA,aAAA,YAGA,IAAAE,EAAAluB,SAAA0hB,cAAA,KACAwM,EAAA/G,KAAAvuB,EAEA,IAAAu1B,EAAAD,EAAAC,SACAA,GAAAA,EAAA9+B,WAAA,OACA8+B,EAAAA,EAAAj+B,UAAA,IAGA,IAAAmhB,EAAA,CACA3J,SAAAA,GAAAwmB,EAAAxmB,SACA0mB,SAAAF,EAAAE,SACAb,KAAAW,EAAAX,KACA5f,KAAAugB,EAAAvgB,KACAnY,SAAA04B,EAAA14B,SACAC,SAAAy4B,EAAAz4B,SACA04B,SAAAA,EACAE,OAAAH,EAAAG,OACAt/B,KAAAm/B,EAAAn/B,MAGA,OADAm/B,EAAAve,SACA0B,EAgHA,SAAAid,EAAAC,EAAAC,GACA,IAAAC,EAAAF,EAAAn/B,MAAA,KACAs/B,EAAAF,EAAAp/B,MAAA,KAGA,SAAAu/B,EAAAx/B,GACA,IAAA,IAAAof,EAAA,EAAAA,EAAApf,EAAA1B,SAAA8gB,EAAA,CACA,GA9BAqgB,EA8BAz/B,EAAAof,IA5BA,QAAA2L,KAAA0U,GA6BA,OAAA,EAEAz/B,EAAAof,GAAA7D,SAAAvb,EAAAof,IAjCA,IAAAqgB,EAmCA,OAAA,EAEA,IAAAD,EAAAF,KAAAE,EAAAD,GACA,OAAAG,IAGA,IAAA,IAAAtgB,EAAA,EAAAA,EAAAkgB,EAAAhhC,SAAA8gB,EAAA,CACA,GAAAmgB,EAAAjhC,SAAA8gB,EACA,OAAA,EAGA,GAAAkgB,EAAAlgB,KAAAmgB,EAAAngB,GAGA,OAAAkgB,EAAAlgB,GAAAmgB,EAAAngB,GACA,GAEA,EAGA,OAAAkgB,EAAAhhC,QAAAihC,EAAAjhC,QACA,EAGA,EAqBA,OAtfA2P,IACAA,EAAA,KAqfA,CACAyC,IA9bA,SAAA0tB,EAAA5f,EAAA/G,EAAAsG,EAAA4hB,GAEA,IAAAvB,EACA,OAAAh8B,EAAA2e,OAAA,iCAAAqd,GAEA,IAAArG,EAAAsG,EAAAD,EAAA5f,EAAA/G,EAAAsG,GACA,OAAA,SAAArZ,GACA,OAAAtC,GAAA,SAAA0e,EAAAC,GAMAwd,EAAAxG,EAAArzB,EALA,CACAuJ,QAAA0xB,GAAA1xB,EACA2xB,aAAA,SAGA,SAAA7H,EAAAyG,GACAzE,EAAArpB,IAAAqnB,EAAAyG,GACAr2B,SAAA,SAAA/C,EAAAiW,EAAAwkB,EAAArB,GACA1d,EAAA1b,MAEApD,OAAA,SAAAoD,EAAAiW,EAAAwkB,EAAArB,GACAF,EAAAvd,EAAA3b,EAAA2yB,EAAA1c,cA4aAykB,aAraA,SAAA1B,EAAA5f,EAAA/G,EAAAsG,EAAAod,EAAA4E,EAAAJ,EAAApE,GACA,IAAAxD,EAAAsG,EAAAD,EAAA5f,EAAA/G,EAAAsG,GAOA,OANAwd,EAAAA,GAzFA,UA0FAJ,EAAAA,GAAA8C,EAAA16B,UAAA22B,KACAiE,EAAA5C,IAAA,EAIA,SAAA72B,GACA,OAAAtC,GAAA,SAAA0e,EAAAC,GACA,IAAAyd,EAAA,CACAvwB,QAAA0xB,GAAA1xB,EACA2xB,aAAA,QAGApB,EAAAzD,MADAgF,EACA9B,EAAAvtB,IAAA6qB,EAAAJ,GAAA,SAAAj9B,EAAA6P,EAAAiyB,GACA13B,QAAAqB,MAAA,qCAAArG,OAAApF,IACA67B,EAAArpB,IAAAxS,EAAAsgC,GACAr2B,SAAA,SAAA/C,GACAo5B,EAAAzD,MAAAkF,IAAA/hC,EAAAkH,GACA46B,GAAAA,EAAA9hC,EAAAkH,SAKA64B,EAAAvtB,IAAA6qB,EAAAJ,GAGAoD,EAAAxG,EAAArzB,EAAA85B,GAAA,SAAAzG,EAAAyG,GACAzE,EAAArpB,IAAAqnB,EAAAyG,GACAr2B,SAAA,SAAA/C,GACA0b,EAAA1b,MAEApD,OAAA,SAAAoD,EAAAiW,GACAijB,EAAAvd,EAAA3b,EAAA2yB,EAAA1c,cAoYA6kB,KA7XA,SAAA9B,EAAA5f,EAAA/G,EAAAsG,EAAA4hB,GACA,IAAA5H,EAAAsG,EAAAD,EAAA5f,EAAA/G,EAAAsG,GACA,OAAA,SAAA3Y,EAAAV,GACA,OAAAtC,GAAA,SAAA0e,EAAAC,GAMAwd,EAAAxG,EAAArzB,EALA,CACAuJ,QAAA0xB,GAAA1xB,EACA4xB,QAAA,CAAAM,eAAA,oCAGA,SAAApI,EAAAyG,GACAzE,EAAAmG,KAAAnI,EAAA3yB,EAAAo5B,GACAr2B,SAAA,SAAA/C,GACA0b,EAAA1b,MAEApD,OAAA,SAAAoD,EAAAiW,GACAijB,EAAAvd,EAAA3b,EAAA2yB,EAAA1c,cA+WA+kB,GAxWA,SAAAhC,EAAA5f,EAAA/G,EAAAsG,EAAA9P,GACA,IAAAwJ,EAEA,MADAnP,QAAAtG,MAAA,2CACA,0CAEA,IAAAyH,EAzIA,SAAA20B,EAAA5f,EAAA/G,EAAAsG,GAEA,OADA,KAAAS,GAAAT,EAAA,MAAA,MACA,MAAAL,EAAA0gB,EAAA5f,IAAA/G,GAAA,IAuIA4oB,CAAAjC,EAAA5f,EAAA/G,EAAAsG,GAGA,SAAAuiB,EAAAC,GACA,IAAAA,EAAArM,SACA,MAAA,IAAA/zB,MAAA,4BAAAmD,OAAAmG,IAEA,OAAA,GAAA82B,EAAArM,SAAAsM,WACAp+B,EAAAoH,KAAA+2B,EAAArM,UAEA,GAAAqM,EAAArM,SAAAsM,WACAp+B,EAAA2e,OAAA,mCAAAwf,EAAArM,SAAA6D,IAAA,MAGAwI,EAAAE,cAAAxyB,GACAsyB,EAAAG,eAAAH,EAAAG,gBAAArhB,KAAAshB,IAAAJ,EAAAG,eAAA,IAAA,MAAA,IACAp4B,QAAAqB,MAAA,+CAAArG,OAAAi9B,EAAA9oB,KAAA4H,KAAAuhB,MAAAL,EAAAG,eAAA,QAEArhB,KAAAuhB,MAAAL,EAAAE,aAAA,KAAA,IAAA,GACAn4B,QAAAqB,MAAA,6BAAA42B,EAAA9oB,KAAA,QAGAjW,GAAA,WAEA,OADA++B,EAAAE,cAAAF,EAAAG,eACAJ,EAAAC,KACAA,EAAAG,iBAGA,SAAAG,EAAAN,EAAA7f,EAAAhc,GA8DA,OA7DA67B,EAAArM,WACAqM,EAAA9oB,KAAAA,EACA8oB,EAAAO,UAAA,GACAP,EAAAE,aAAA,EACAF,EAAAG,eAAA,IAEAnC,EAAA90B,EAAA/E,EAAA,IAAA,SAAA+E,GACA82B,EAAArM,SAAA,IAAA6M,UAAAt3B,GACA82B,EAAArM,SAAA8M,QAAA,SAAAx0B,GACA+zB,EAAArM,SAAAsM,WAAA,GAEAD,EAAArM,SAAA+M,UAAA,SAAAz0B,GACA,IAAAmL,EAAAupB,KAAAx3B,MAAA8C,EAAApH,MACA7G,EAAAN,QAAAsiC,EAAAO,WAAA,SAAApgB,GACAA,EAAA/I,OAGA4oB,EAAArM,SAAAiN,OAAA,SAAA30B,GACAlE,QAAAqB,MAAA,kCAAA42B,EAAA9oB,KAAA,QACAymB,EAAAhjB,KAAAqlB,GACAA,EAAArM,SAAAkN,SAAAtqB,KAAAD,OAEA0pB,EAAArM,SAAAmN,QAAA,SAAAC,GAGA,IAAA7zB,EAAAlP,EAAAgjC,UAAArD,GAAA,SAAAsD,GAAA,OAAAA,EAAA/pB,OAAA8oB,EAAA9oB,QACAhK,GAAA,GACAywB,EAAA9gB,OAAA3P,EAAA,GAIA8yB,EAAArM,SAAAuN,QACAlB,EAAArM,SAAA,KAKAqM,EAAArM,SAAAkN,UACA94B,QAAAqB,MAAA,8EAAA8N,EAAAX,KAAAD,MAAA0pB,EAAArM,SAAAkN,UAGAb,EAAArM,SAAA,KAGA2M,EAAAN,EAAA,KAAA77B,IAEA48B,IACAh5B,QAAAqB,MAAA,2DAAArG,OAAAmU,GAAA6pB,GAAAA,EAAAI,MAAAJ,GAGAf,EAAArM,SAAA,KAGA2M,EAAAN,EAAA,KAAA77B,SAOAgc,GAAA6f,EAAAO,UAAA5lB,KAAAwF,GACA4f,EAAAC,GAGA,SAAAoB,EAAApB,GACAA,EAAArM,WACAqM,EAAArM,SAAAuN,SAAA,EACAn5B,QAAAqB,MAAA,6BAAA42B,EAAA9oB,KAAA,QACA8oB,EAAArM,SAAA9T,QACAmgB,EAAAO,UAAA,GACAP,EAAAc,SAAAd,EAAAc,WAaA,OA/GApzB,EAAAA,GAAApL,EAAAuC,KAAA6I,QA+GA,CACAyc,KAAA,SAAAhmB,GACA,OAAAm8B,EAAA/iC,KAAA,KAAA4G,IAEAu2B,GAAA,SAAAva,EAAAhc,GACA,OAAAm8B,EAAA/iC,KAAA4iB,EAAAhc,IAEA6b,WAAA,SAAAG,EAAAhc,GACA,IAAA67B,EAAAziC,KAEA,OADA+iC,EAAAN,EAAA7f,EAAAhc,GACA,YAnBA,SAAA67B,EAAA7f,GACA6f,EAAAO,UAAAviC,EAAAwiB,OAAAwf,EAAAO,WAAA,SAAA12B,GACA,OAAAA,IAAAsW,KAEA6f,EAAAO,UAAAxiC,QACAqjC,EAAApB,GAeAqB,CAAArB,EAAA7f,KAGAmhB,KAAA,SAAAz8B,GACA,IAAAm7B,EAAAziC,KACA,OAAAwiC,EAAAC,GACA37B,MAAA,WACA27B,EAAArM,UAAAqM,EAAArM,SAAA2N,KAAAz8B,OAGAgb,MAAA,WAEAuhB,EADA7jC,OAGAgkC,SAAA,WAEA,OADAhkC,KACAo2B,UADAp2B,KACAo2B,SAAAuN,WAyNAM,WApNA,WACA7D,EAAA5/B,OAAA,IACAgK,QAAAqB,MAAA,mCACApL,EAAAN,QAAAigC,GAAA,SAAA8D,GACAA,EAAA5hB,WAEA8d,EAAA,KA+MAG,OAAAA,EACA3gB,UAAAA,EACAjU,IAAA,CACAC,MAAAo1B,EACApU,KA1KA,SAAAjhB,EAAAe,GAGA,GAFAA,EAAAA,GAAA,IAEAf,EAAAvJ,WAAA,aAAAuJ,EAAAvJ,WAAA,YAAA,CACA,IAAAF,EAAA8+B,EAAAr1B,GASA,IAPAzJ,EAAAuY,UAAA/N,EAAA2O,OACAnZ,EAAAuY,SAAA,SAAA/N,EAAA2O,KAAA,UACA,SAAA3O,EAAA2O,KAAA,OAAA,GACA1P,EAAAzJ,EAAAuY,SAAA9O,GAIA,WAAAzJ,EAAAuY,UAAAzV,EAAAse,YACA,IAEA,YADA1jB,EAAAukC,MAAAC,aAAAz4B,GAGA,MAAAX,GACAR,QAAAtG,MAAA,4DAMA,GADA,WAAAhC,EAAAuY,UAAA,QAAAvY,EAAAuY,WAAAzV,EAAAoL,OAKA,YAHA1D,EAAAtD,SAAA,mBAAAsD,EAAAtD,SACAsD,EAAAtD,QAAAuC,IAOA,IAcA04B,EAdAC,EAAA53B,EAAAyX,SAAAnf,EAAAoL,OAAA,UAAA,UAGA,GAAA,WAAAk0B,GAAA,YAAAA,GAAAt/B,EAAAse,YACA,IAEA,YADA1jB,EAAAukC,MAAAC,aAAAz4B,GAGA,MAAAX,GACAR,QAAAtG,MAAA,qDAMA,WAAAogC,GAAAt/B,EAAAse,cAOA+gB,EAAA,8EAEA7/B,EAAA2C,QAAA3C,EAAA2C,OAAAitB,OAAA5vB,EAAA2C,OAAAktB,SACAgQ,GAAA,wBAAA7+B,OAAA+b,KAAAqT,MAAApwB,EAAA2C,OAAAitB,MAAA,GAAA7S,KAAAqT,MAAApwB,EAAA2C,OAAAktB,OAAA,MAIA,IAAAkQ,EAAA//B,EAAAooB,KAAAjhB,EACA24B,EACAD,GAGAA,GAAA7/B,EAAA2C,QAAA3C,EAAA2C,OAAAitB,OAAA5vB,EAAA2C,OAAAktB,SACAkQ,EAAAC,OAAAhgC,EAAA2C,OAAAitB,MAAA,EAAA,EAAA5vB,EAAA2C,OAAAktB,OAAA,EAAA,GACAkQ,EAAA7O,WAsGA+O,KAAA,CACA1rB,IAjGA,WACA,OAAAI,SAAAurB,MAAAC,SAkGArhC,QAAA,CACAshC,QAAAvD,EACAwD,aAnCA,SAAA7uB,EAAA8uB,GAEA,OADAt6B,QAAAqB,MAAA,qFAAArG,OAAAs/B,EAAA9uB,IACAqrB,EAAArrB,EAAA8uB,IAAA,IAmCA7H,MAAAp5B,QAAA0S,MAAA,CACAinB,MAjCA,SAAAC,GACAA,EAAAA,GA9eA,UA+eAjzB,QAAAqB,MAAA,2CAAArG,OAAAi4B,IACA0C,EAAA3C,MAAAC,IA+BAE,SA5BA,WACAnzB,QAAAqB,MAAA,iCACApL,EAAAP,KAAAmgC,GAAAlgC,SAAA,SAAAs9B,GACA0C,EAAA3C,MAAAC,QA0BA0C,EAAA16B,eCzhBA5B,QAAA0Q,OAAA,0BAAA,CAAA,kBAGAC,QAAA,iBAAA,CAAA,UAAA,KAAA,SAAAhQ,EAAAF,GAGA,IACAquB,EAAA,CACAoS,QAAAvgC,EAAAwgC,gBAAA,GAGA7C,IAAA,SAAA/hC,EAAA6P,GAEA,OADA0iB,EAAAoS,QAAA3kC,GAAA6P,EACA3L,EAAAoH,QAGAkH,IAAA,SAAAxS,EAAAwZ,GACA,OAAAtV,EAAAoH,KAAAinB,EAAAoS,QAAA3kC,IAAAwZ,IAGArB,UAAA,SAAAnY,EAAA6P,GAEA,OADA0iB,EAAAoS,QAAA3kC,GAAAgjC,KAAA6B,UAAAh1B,GACA3L,EAAAoH,QAGA0M,UAAA,SAAAhY,GACA,OAAAkE,EAAAoH,KAAA03B,KAAAx3B,MAAA+mB,EAAAoS,QAAA3kC,IAAA,WAGA,OAAAuyB,KAGAne,QAAA,eAAA,CAAA,UAAA,KAAA,OAAA,iBAAA,SAAAhQ,EAAAF,EAAA4gC,EAAAF,GAGA,IAGAvvB,EAFA0vB,EAAA,SACAttB,GAAA,EAEAutB,GAAA,EACAzS,EAAA,CACA0S,SAAA,CACAN,QAAA,MAEAO,OAAA,CACAP,QAAA,OAoHA,SAAAQ,IAmBA,OAjBA/gC,EAAAmQ,cACAnK,QAAAqB,MAAA,yCACA8mB,EAAA0S,SAAAN,QAAAvgC,EAAAmQ,aAEAlU,EAAAN,QAAAM,EAAAP,KAAAyyB,EAAA0S,WAAA,SAAAjlC,GACAuyB,EAAAvyB,GAAAuyB,EAAA0S,SAAAjlC,QAMAoK,QAAAqB,MAAA,2CAEApL,EAAAN,QAAAM,EAAAP,KAAA8kC,IAAA,SAAA5kC,GACAuyB,EAAAvyB,GAAA4kC,EAAA5kC,OAGAkE,EAAAoH,OA0CA,SAAA+M,IACA,GAAAhD,EAAA,OAAAA,EAEA,IAAAsD,EAAAC,KAAAD,MAYA,OARAtD,EADA2vB,EA7CA,WACA56B,QAAAqB,MAAA,0CAEApL,EAAAN,QAAAM,EAAAP,KAAAyyB,EAAA2S,SAAA,SAAAllC,GACAuyB,EAAAvyB,GAAAuyB,EAAA2S,OAAAllC,MAGA,IAAA4rB,EAAA1nB,EAAA2nB,QAoBA,OAjBAuZ,QAAAC,SAAAD,QAAAC,QAAAC,cAMA/S,EAAA2S,OAAAP,QAAA,IAAAS,QAAAC,QAAAC,eACA,WACA1Z,EAAAhJ,aAEA,SAAAhY,GACAR,QAAAtG,MAAA,6DAAA8G,GACAu6B,IACAvZ,EAAAhJ,YAEAmiB,IAdAI,IACAvZ,EAAAhJ,WAeAgJ,EAAA1jB,QAmBAq9B,GAKAJ,KAIAz+B,MAAA,WACA0D,QAAAqB,MAAA,yBAAAmN,KAAAD,MAAAA,GAAA,MACAlB,GAAA,EACApC,EAAA,QAOA,OArMA2vB,GAAA,EAKAzS,EAAA0S,SAAAlD,IAAA,SAAA/hC,EAAA6P,GAOA,OANApM,QAAAoC,UAAAgK,IAAA,MAAAA,EACA0iB,EAAA0S,SAAAN,QAAA3kC,GAAA6P,EAGA0iB,EAAA0S,SAAAN,QAAAa,WAAAxlC,GAEAkE,EAAAoH,QAGAinB,EAAA0S,SAAA3iB,OAAA,SAAAtiB,EAAA6P,GAEA,OADA0iB,EAAA0S,SAAAN,QAAAa,WAAAxlC,GACAkE,EAAAoH,QAGAinB,EAAA0S,SAAAzyB,IAAA,SAAAxS,EAAAwZ,GACA,OAAAtV,EAAAoH,KAAAinB,EAAA0S,SAAAN,QAAA3kC,IAAAwZ,IAGA+Y,EAAA0S,SAAA9sB,UAAA,SAAAnY,EAAA6P,GAEA,OADA0iB,EAAA0S,SAAAN,QAAA3kC,GAAAgjC,KAAA6B,UAAAh1B,GACA3L,EAAAoH,QAGAinB,EAAA0S,SAAAjtB,UAAA,SAAAhY,GACA,OAAAkE,EAAAoH,KAAA03B,KAAAx3B,MAAA+mB,EAAA0S,SAAAN,QAAA3kC,IAAA,UAMAuyB,EAAA2S,OAAAnD,IAAA,SAAA/hC,EAAA6P,GACA,OAAA3L,GAAA,SAAA0e,EAAAC,GACAhT,MAAAA,EACA0iB,EAAA2S,OAAAP,QAAA7d,KACA,SAAA9mB,GACA4iB,OAEA,SAAAhY,GACAk6B,EAAAhhC,MAAA8G,GACAiY,EAAAjY,KAEA5K,EAAA6P,GAIA0iB,EAAA2S,OAAAP,QAAAriB,QACA,WACAM,OAEA,SAAAhY,GACAk6B,EAAAhhC,MAAA8G,GACAgY,MAEA5iB,OAMAuyB,EAAA2S,OAAA1yB,IAAA,SAAAxS,EAAAwZ,GACA,OAAAtV,GAAA,SAAA0e,EAAAC,GACA0P,EAAA2S,OAAAP,QAAAnyB,KACA,SAAA3C,GAEA+S,GADA/S,GAAA2J,EACAA,EAGA3J,MAGA,SAAAjF,GACAk6B,EAAAhhC,MAAA8G,GACAgY,MAEA5iB,OAKAuyB,EAAA2S,OAAA/sB,UAAA,SAAAnY,EAAA6P,GAEA,OADAi1B,EAAAr5B,MAAA,2DAAAzL,GACAkE,GAAA,SAAA0e,EAAAC,GACA0P,EAAA2S,OAAAP,QAAA7d,IACAlE,EACAC,EACA7iB,EACA6P,EAAAmzB,KAAA6B,UAAAh1B,QAAA/G,OAKAypB,EAAA2S,OAAAltB,UAAA,SAAAhY,GAEA,OADA8kC,EAAAr5B,MAAA,2DAAAzL,GACAkE,GAAA,SAAA0e,EAAAC,GACA0P,EAAA2S,OAAAP,QAAAnyB,KACA,SAAA3C,GAAA+S,EAAAogB,KAAAx3B,MAAAqE,GAAA,YACA,SAAAjF,GACAk6B,EAAAhhC,MAAA8G,GACAgY,MAEA5iB,OAwDAuyB,EAAAnZ,UAAA,WACA,OAAA3B,GAGA8a,EAAAzZ,MAAA,WACA,OAAArB,EAAAvT,EAAAoH,OACA+J,GAAAgD,KA2BAA,IAEAka,KCtPA9uB,QAAA0Q,OAAA,yBAAA,CAAA,wBAAA,6BAEAC,QAAA,SAAA,CAAA,aAAA,aAAA,cAAA,KAAA,aAAA,SAAAC,EAAAG,EAAAwd,EAAA9tB,EACAK,GAGA,IAWA8Q,EAVAod,EACA,IADAA,EAEA,IAEAF,EAAA,CAEAviB,QAAA,GAEA6sB,EAAA,GACAplB,GAAA,EA4DA,SAAApM,EAAAo6B,GACA,IAAAlT,EAAAviB,OACA,OAAA9L,EAAA2e,OAAA,2FAEA,IAAA+I,EAAA1nB,EAAA2nB,QAiBA,OAhBAuZ,QAAAC,QAAAK,eAAAr6B,MACA,SAAA2Y,GACAA,EAAA9S,WAKA9G,QAAAqB,MAAA,4CACAmgB,EAAAhJ,YALAxY,QAAAqB,MAAA,kCAAAuY,EAAA4N,MACAhG,EAAAhJ,QAAAoB,EAAA4N,UAOA,SAAAhnB,GACAR,QAAAtG,MAAA,+CAAA8G,GACAghB,EAAA/I,OAAAjY,KAEA66B,GACA7Z,EAAA1jB,QAqKA,OAjPAqqB,EAAAviB,QAAA,EAmGAuiB,EAAAoT,UAAA,CAAAt5B,KApBA,SAAAulB,EAAApP,GACA,IAAA+P,EAAAviB,OACA,OAAA9L,EAAA2e,OAAA,mBAEA,IAAA+I,EAAA1nB,EAAA2nB,QAaA,OAZA+Z,kBACAv5B,KAAAulB,GACAlrB,MAAA,WAEA8b,GACAA,IAEAoJ,EAAAhJ,aACA,WAEAgJ,EAAA/I,OAAA,CAAAhhB,QAAA,4BAEA+pB,EAAA1jB,UAIAqqB,EAAAsT,OAAA,CACAC,WAlGA,SAAAx5B,GACA,OAAAimB,EAAAsT,OAAA71B,QAKA1D,GAAA,iBAAAA,IACAA,EAAA,CACAy5B,WAAAz5B,IAGAA,EAAAA,GAAA,GAGA7I,QAAAiM,YAAApD,EAAAy5B,YACAvxB,EAAA,CAAA,6BAAA,6BAAA,8BACA9N,MAAA,SAAAysB,GACA,OAAAnB,EAAAzpB,KAAA,CACA5C,MAAAwtB,EAAA,8BACAE,QAAA,CACA,CACAzB,KAAAuB,EAAA,8BACAlY,KAAA,SACAqY,MAAA,SAAAhlB,GACA,OAAA03B,UAAAH,OAAAI,kBAAAC,eAGA,CACAtU,KAAAuB,EAAA,6BACAlY,KAAA,yBACAqY,MAAA,SAAAhlB,GACA,OAAA03B,UAAAH,OAAAI,kBAAAE,YAKAz/B,MAAA,SAAAq/B,GAGA,OAFA37B,QAAA+X,KAAA,mCAAA4jB,GACAz5B,EAAAy5B,WAAAA,EACAxT,EAAAsT,OAAAC,WAAAx5B,UAKAA,EAAA85B,QAAA95B,EAAA85B,SAAA,GACA95B,EAAA+5B,gBAAA/5B,EAAA+5B,iBAAAL,UAAAH,OAAAS,gBAAAC,SACAj6B,EAAAk6B,aAAAl6B,EAAAk6B,cAAAR,UAAAH,OAAAY,aAAAC,IACAp6B,EAAAq6B,YAAAr6B,EAAAq6B,aAAAlU,EACAnmB,EAAAs6B,aAAAt6B,EAAAs6B,cAAAnU,EACAoU,eAAAf,WAAAx5B,KA/CApI,EAAA2e,OAAA,mFAiGAxX,KAAA,SAAAo6B,GAEA,OADAr7B,QAAAC,KAAA,6EACAgB,EAAAo6B,KAGAlT,EAAAnnB,QAAA,CACA4E,QAAA,EACA3E,KAAAA,GAEAknB,EAAAuU,SAAA,CACA92B,QAAA,EACAkS,MAAA,WACAqQ,EAAAuU,SAAA92B,QACAo1B,QAAAC,QAAA0B,SAAA7kB,UAKAqQ,EAAAuU,SAAAE,MAAA,CACAjwB,SAAA,CACAkwB,UAAA,SAAAC,EAAAC,EAAApwB,GAEAmwB,EAAAA,GAAA7yB,EACA,IAAA+yB,EAAA,WACA,OAAAD,GAAA,IAAAplC,MAAA,KAAAqE,QAAA,SAAAC,EAAAkT,GACA,OAAAlT,EAAAA,EAAAkT,QAAAzQ,IACAo+B,IAEAG,EAAA,SAAAx3B,GACA,IAAAy3B,GAAAH,GAAA,IAAAplC,MAAA,KACAwlC,EAAAD,EAAAlnC,QAAAknC,EAAAA,EAAAlnC,OAAA,GACAknC,EAAAlhC,QAAA,SAAAC,EAAAkT,GACA,GAAAA,GAAAguB,EAIA,OAAAlhC,EAAAkT,GAHAlT,EAAAkhC,GAAA13B,IAIAq3B,IAiCA,OAjDAnwB,EAAAA,GAAA,IAmBAwnB,UAAAxnB,EAAAwnB,WAAA,MACAxnB,EAAAywB,OAAAzwB,EAAAywB,QAAA,SAAA/lC,GACA4lC,GAAAD,KAAA,IAAA3lC,IAEAsV,EAAA0wB,UACA1wB,EAAA2wB,iBAAA3wB,EAAA2wB,kBAAA,IACA3wB,EAAA4wB,WAAA,CACAC,KAAA,iBACAJ,OAAA,WACA,IAAA5V,EAAAwV,KAAA,GAEAxV,EAAA5S,QAAAjI,EAAA2wB,mBAAA,IAEA9V,EAAAvoB,OAAAjJ,SACAwxB,EAAA,KAEAyV,EAAAzV,EAAA7a,EAAA2wB,sBAIA3wB,EAAA8wB,YAAA9wB,EAAA8wB,aAAA,CACAD,KAAA,6CACAJ,OAAA,WACA,IAAA5V,EAAAwV,IACAxV,GAAAA,EAAAxxB,SACAwxB,EAAAA,EAAA9C,MAAA,GAAA,GACAuY,EAAAzV,MAIA7a,KAKAwb,EAAAuV,MAAA,WACA,QAAA9B,UAAA+B,UAAAC,MAAA,0BAAArhC,MAAAC,SAAAkhC,SAGAvV,EAAA0V,MAAA,WACA,QAAAjC,UAAA+B,UAAAC,MAAA,eAAArhC,MAAAC,SAAA0L,GAAA,QAGAigB,EAAArP,UAAA,WACA,IAAAzf,QAAAoC,UAAAg3B,EAAA3Z,WACA,IAEA2Z,EAAA3Z,WAAAqP,EAAAviB,QAAAk4B,SAAA,GACA,MAAAt9B,GACAiyB,EAAA3Z,WAAA,EAGA,OAAA2Z,EAAA3Z,WAGAqP,EAAA4V,MAAA,WACA,OAAA5V,EAAAviB,SAAAuiB,EAAArP,aAGAqP,EAAAzZ,MAAA,WACA,OAAArB,EAAAvT,EAAAoH,OACA+J,GAAAkd,EAAAla,SAGAka,EAAAla,MAAA,WAgCA,OA9BAhD,EAAA9Q,IACAmC,MAAA,WAEA6rB,EAAAviB,OAAA2V,OAAAyf,SAAAA,SAAAA,QAAAC,QAEA9S,EAAAviB,QACAuiB,EAAAsT,OAAA71B,SAAAg2B,UAAAH,OACAtT,EAAAuU,SAAA92B,OAAAo1B,SAAAA,QAAAC,WAAAD,QAAAC,QAAA0B,SACAxU,EAAAnnB,QAAA4E,OAAAo1B,SAAAA,QAAAC,WAAAD,QAAAC,QAAAK,iBAAAnT,EAAA0V,QACA1V,EAAAoT,UAAA31B,OAAAo1B,SAAAA,QAAAC,WAAAD,QAAAC,QAAAM,UAEApT,EAAAuU,SAAA92B,QACAvM,QAAAC,OAAA6uB,EAAAuU,SAAA1B,QAAAC,QAAA0B,UAGA38B,QAAAqB,MAAA,4GACArG,OAAAmtB,EAAAsT,OAAA71B,OAAAuiB,EAAAnnB,QAAA4E,OAAAuiB,EAAAuU,SAAA92B,OAAAuiB,EAAAoT,UAAA31B,SAEAo1B,QAAAgD,cACAh+B,QAAAqB,MAAA,mCAIArB,QAAAqB,MAAA,uDAGAgM,GAAA,EACApC,EAAA,SAMAkd,KCvQA9uB,QAAA0Q,OAAA,2BAAA,CAAA,QAAA,wBAEAC,QAAA,aAAA,CAAA,aAAA,KAAA,WAAA,MAAA,MAAA,aAAA,SAAAC,EAAAnQ,EAAAZ,EAAAmB,EAAA6P,EAAA3P,GAGA,IAaA0Q,EACAkF,EAbAlV,EAAA,CAEAgjC,sBAAA,CACAC,GAAA,CACAC,eAAA,WACAC,iBAAA,QAKAthC,EAAA,GACAuQ,GAAA,EAGAC,EAAA,IAAApD,EAAA1U,KAAA,cAMA,SAAA6oC,IACAvhC,EAAA8F,KAAA,KACA9F,EAAArC,WAAA,KACAqC,EAAAqhC,eAAA,KACArhC,EAAAwhC,aAAA,KACAxhC,EAAA21B,MAAA,GACA31B,EAAA4Q,KAAArT,EACAyC,EAAA+L,UAAA,KACA/L,EAAAshC,iBAAA,EACA/wB,GAAA,EACApC,OAAAvM,EACA4O,EAAAxQ,KAAA0Q,MAAA+B,MAAAzS,GAGA,SAAAyhC,IAGA,OAAAzkC,EAAA6P,IAAA,CAsBAtP,EAAA4X,WAAAxX,aACA6B,MAAA,SAAAL,GAIA,OAHAa,EAAA8F,KAAA3G,EAAAoL,SACAvK,EAAArC,WAAAwB,EACAa,EAAAshC,iBAAAniC,EAAAuiC,WAAAviC,EAAAwiC,iBAAA,EACAxiC,KAvBAK,MAAA,SAAA7B,GAEA,OAyBAikC,EAzBAjkC,EAAA4M,SA2BApM,EAAAgjC,sBAAAS,IACArlC,QAAA0S,MAAAjP,EAAA7B,EAAAgjC,sBAAAS,IACA5kC,EAAAoH,QAGA7G,EAAA4X,WAAAT,MAAA,CAAAA,MAAA,IACAlV,MAAA,SAAAhH,GAEAwH,EAAAqhC,eAAA7oC,EAAAugB,cAEAlX,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAA+B,QAAAlI,EAAAmI,WAAAm8B,gBAIA,OAHA7hC,EAAAqhC,eAAA,EACArhC,EAAA8hC,WAAA,OACA5+B,QAAAC,KAAA,8DAGA,MAAAO,KApBA,IAAAk+B,KAyBArkC,EAAA4X,WAAAC,MAAA2sB,KACAviC,MAAA,SAAAL,GAEA,OAAAA,EAAA2d,OAAAklB,OAAA9oC,OAmBA,SAAA+oC,EAAA9iC,EAAA+iC,GAEA,IAAA/iC,EAAA2d,OAAAklB,OAAA9oC,QAAAgpC,EAAA,EAEA,OADAliC,EAAA+L,UAAA/L,EAAArC,WAAAqC,EAAArC,WAAAwkC,KAAA,EACAniC,EAAA+L,UAGA,IAAAq2B,EAAAjjC,EAAA2d,OAAAklB,OAAAE,GACA,OAAA3kC,EAAA4X,WAAAT,MAAA,CAAAA,MAAA0tB,IACA5iC,MAAA,SAAAkV,GA5GA,IAAA2tB,EAAAC,EA8GA,OADAtiC,EAAA+L,WA7GAs2B,EA6GA3tB,EAAA6tB,UA7GAD,EA6GA5tB,EAAA8tB,WA5GA,EAAAH,EAAAA,EAAApoB,KAAAC,IAAA,GAAAooB,IA6GAtiC,EAAA+L,aAEAlK,OAAA,SAAA6B,GAEA,GADAR,QAAAtG,MAAA,gEAAAsB,OAAAkkC,IACAF,EAAA,EAEA,OADAh/B,QAAAtG,MAAA,2DACAqlC,EAAA9iC,EAAA+iC,EAAA,GAGA,MADAliC,EAAA+L,UAAA,KACArI,KAnCAu+B,CAAA9iC,EAAAA,EAAA2d,OAAAklB,OAAA9oC,OAAA,IAHA8G,EAAA+L,UAAA/L,EAAArC,WAAAqC,EAAArC,WAAAwkC,KAAA,EACAniC,EAAA+L,cAIAlK,OAAA,SAAA6B,GAEA,MADA1D,EAAA+L,UAAA,KACArI,KAtDA8M,EAAAxQ,KAAAkR,aAAAuT,KAAAzkB,KAEA6B,OAAA,SAAA6B,GAEA,MADA69B,IACA79B,KAsFA,SAAA++B,IAEA,OAAAlyB,EACAvT,EAAAoH,KAAApE,GAIAmO,GAAAgD,IAGA,SAAAuxB,EAAAC,GACA,OAAA,WACA,OAAApyB,EACAvT,EAAAoH,KAAApE,EAAA2iC,IAIAx0B,GAAAgD,IACA3R,MAAA,WACA,OAAAQ,EAAA2iC,OAKA,SAAAC,EAAApqC,GACA,IAAAkc,EAAA,IAAA1b,EAAAR,GACAkc,EAAAmuB,YAGA3/B,QAAAqB,MAAA,kCAAAmQ,EAAAna,OAAA,IAAAma,EAAAla,KAAA,KAEAwF,EAAA8iC,aAAApuB,EACA1U,EAAA8iC,aAAAC,WAAAlxB,SAAAurB,MAAAC,OAEAr9B,EAAA+Y,WAAArE,EAAAqE,WACA/Y,EAAAwhC,aAAA9sB,EAAA8sB,aAGA9sB,EAAA6tB,WACAviC,EAAA+L,UAAA2I,EAAA6tB,UAIA/xB,EAAAxQ,KAAA0Q,MAAAsyB,SAAAtuB,GAwBA,SAAAuuB,IACA//B,QAAAqB,MAAA,0BAZApL,EAAAN,QAAAwa,GAAA,SAAA+H,GACAA,OAEA/H,EAAA,GAWAkuB,IAGA,SAAA2B,IAEA,OADAD,IACA7mC,EAAA+U,EAAA,KAGA,SAAAA,IACAjO,QAAAqB,MAAA,0BACA,IAAAkN,EAAAC,KAAAD,MAuBA,OArBAtD,EAAA5Q,EAAAqU,QAGApS,KAAAiiC,GAGAjiC,MAAA,YA1CA,WACA6T,EAAA,CAEA9V,EAAAiT,IAAAI,KAAAilB,GAAAqN,QAAA/1B,EAAA+1B,EAAAxqC,MAEA6E,EAAA2d,UAAAxG,QAAAyG,WAAAynB,IAsCA9M,GAEA5yB,QAAAqB,MAAA,0BAAAmN,KAAAD,MAAAA,GAAA,MAEAlB,GAAA,EACApC,EAAA,KAGAqC,EAAAxQ,KAAA0Q,MAAAkB,MAAA5R,MAEAR,MAAA,WACA,OAAAQ,KAMA,IAAAmjC,EAAAT,EAAA,gBAEA,SAAAU,EAAAzN,GAEA,OAAAwN,IAEA3jC,MAAA,SAAAsjC,GAEA,IAAArxB,EAAAI,SAAAurB,MAAAC,OAEA,GAAA1H,EAAA,CACA,GAAAmN,GAAAA,EAAAC,YAAAtxB,EAAAqxB,EAAAC,WAAA,GAEA,OAAAD,EAGAA,GAEA5/B,QAAAC,KAAA,yGAIA,OAAA5F,EAAA4X,WAAA2D,SAAA,GACAjX,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAA+B,OAAAlI,EAAAmI,WAAAsT,iBACA,MAAA,CAAAze,OAAA,EAAAC,KAAA+C,EAAAY,UAAA8a,gBAAAF,WAAAtH,GAEA,MAAA/N,KAEAlE,MAAA,SAAAsZ,GAGA,OAFA9Y,EAAA8iC,aAAAhqB,EACA9Y,EAAA8iC,aAAAC,WAAAtxB,EACAqH,QAoCA,OAXAtI,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,OAAA,QACAzB,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,OAAA,YAGAsvB,IAKA,CACA3vB,MAlHA,WACA,OAAArB,EAAAvT,EAAAoH,KAAApE,GACAmO,GAAAgD,KAiHAA,MAAAA,EACA8xB,KAAAA,EACAjjC,KAAAA,EACAsL,IAAAm3B,EACA38B,KAAA48B,EAAA,QACA/kC,WAAA+kC,EAAA,cACA32B,UAAA22B,EAAA,aACApB,iBAAAoB,EAAA,oBACAvtB,WAAA,CACA2D,QAAAsqB,EACAC,UA3CA,WACA,OAAA5lC,EAAAuC,KAAA2P,qBAAA,EACAyzB,GAAA,GAGAA,GAAA,GACA5jC,MAAA,SAAAsZ,GACA,IAAAve,EAAAue,EAAAve,OAAAkD,EAAAuC,KAAA2P,oBACA,OAAApV,EAAA,EAAAgD,EAAA4X,WAAAT,MAAA,CAAAA,MAAAna,IAAAue,OAqCAqkB,KAAA,CACA1rB,IAjCA,WACA,OAAAI,SAAAurB,MAAAC,QAAAr9B,EAAAshC,kBAAAnjC,EAAAgjC,sBAAAC,GAAAE,oBAmCA9wB,IAAAA,EAEA0f,QAAA,WAEA,OADAhtB,QAAAC,KAAA,kGACAs/B,SCtVAlmC,QAAA0Q,OAAA,sBAAA,CAAA,QAAA,uBAAA,6BAEAC,QAAA,MAAA,CAAA,KAAA,UAAA,aAAA,WAAA,WAAA,MAAA,SAAA,UAAA,WAAA,aAAA,UAAA,SAAA,SAAAlQ,EAAAE,EAAAiQ,EAAA/Q,EAAAgB,EAAAgQ,EAAA1P,EAAAJ,EAAAuK,EAAApK,EAAAo7B,EAAA9lB,GAGA,SAAAxV,EAAAy7B,EAAA5f,EAAAT,EAAA2qB,GAEA,IA+DAjwB,EA9DA/Y,EAAA0+B,EAAA,UAAA96B,OAAA86B,EAAA5f,IAAAT,EAAA,MAAA,OAAA,UACAwd,EAAA,OACAn7B,EAAA,sEAEAuoC,EAAA,UAAAvoC,EAAA,OAOAwoC,EAAA,oBAEAC,EAAA,6EACAjzB,EAAA,CACAjT,IAAA,oBACAmmC,KAAA,OACAC,KAAA,OACAC,OAAA,SACAC,QAAA,WAEAzoC,EAAA,CACA0oC,QAAA,iBACAC,SAAA,iBACA3lC,OAAApD,EACAqD,qBAAA,IAAArD,EAAA,sEACAgpC,QAAA,oDACAC,sBAAA,qDAEAC,YAAA,oCAAAlpC,EAAA,wDACAmpC,cAAA,gDAAAnpC,EAAA,0BACAopC,aAAA5zB,EAAAjT,IAAAkmC,EACAY,cAAA7zB,EAAAkzB,KAAAD,EACAa,cAAA9zB,EAAAmzB,KAAA,iBAAAF,EACAc,gBAAA/zB,EAAAozB,OAAA,yDACAY,iBAAAh0B,EAAAqzB,QAAA,kFAmBA1lC,EAAA,CACAsmC,iBAAA,GACAxrB,gBAAA,mEACAyrB,oBAAA,EACAC,oBAAA,IACAvpC,OAAAA,EACAoV,IAAAA,GAGA/X,EAAAC,KAqBA,SAAA6G,EAAAy5B,EAAA5f,EAAAT,GACAlgB,EAAA8X,SAAA9X,EAAAwqC,OACAxqC,EAAAmsC,OAAA,EAGAnnC,EAAAuC,MAAAvC,EAAAuC,KAAA4Q,OACAooB,EAAAA,GAAAv7B,EAAAuC,KAAA4Q,KAAAooB,KACA5f,EAAAA,GAAA3b,EAAAuC,KAAA4Q,KAAAwI,KAEAT,EAAApc,QAAAoC,UAAAga,GAAAA,EAAA,KAAAS,GAAA3b,EAAAuC,KAAA4Q,KAAA+H,QAAAlgB,EAAAosC,aAGA7L,IAGAvgC,EAAAugC,KAAAA,EACAvgC,EAAA2gB,KAAAA,GAAA,GACA3gB,EAAAkgB,OAAApc,QAAAoC,UAAAga,GAAAA,EAAA,KAAAlgB,EAAA2gB,MAAA3gB,EAAAosC,YACApsC,EAAAsf,OAAAhF,EAAAuF,UAAA0gB,EAAA5f,GACA3gB,EAAAk6B,IAAA5f,EAAAkmB,OAAAD,EAAA5f,EAAA,GAAAT,IAGA,SAAAmsB,EAAAlf,GACA,OAAA,IAAAC,OAAA,IAAAD,EAAA,KAGA,SAAAD,EAAAC,GACA,OAAA,IAAAC,OAAAD,GAGA,SAAAmf,IACAtsC,EAAAqzB,MAEA5oB,QAAAC,KAAA,mCACAhK,EAAAP,KAAAH,EAAAqzB,IAAAkZ,UAAA,IAAAnsC,SAAA,SAAAC,GACAL,EAAAqzB,IAAAkZ,SAAAlsC,GACAkiB,WAEAviB,EAAAqzB,IAAAkZ,SAAA,IAaA,SAAA15B,EAAA+G,EAAA4yB,GAEAA,EAAAxsC,EAAA6qC,UAAA2B,GAAA,EACA,IAAAC,EAAA7yB,GAAA4yB,EAAA,IAAAA,EAAA,IAEAE,EAAA,SAAA7lC,GAEA,IAAA7G,EAAA8X,QAIA,OAHA9X,EAAA2sC,eACAliC,QAAAC,KAAA,uDAAAjF,OAAAmU,IAEA5Z,EAAAmZ,QAAApS,MAAA,WACA,OAAA2lC,EAAA7lC,MAIA,IAAA+lC,EAAA5sC,EAAAqzB,IAAA1Z,UAAA8yB,GACAG,IAEAA,EADAJ,EACAlyB,EAAA2nB,aAAAjiC,EAAAugC,KAAAvgC,EAAA2gB,KAAA/G,EAAA5Z,EAAAkgB,OAAAssB,EAAA,KAAA,KAAA9O,GAGApjB,EAAAzH,IAAA7S,EAAAugC,KAAAvgC,EAAA2gB,KAAA/G,EAAA5Z,EAAAkgB,QAEAlgB,EAAAqzB,IAAA1Z,UAAA8yB,GAAAG,GAEA,IAAAC,EAAA,EACA,OAAAD,EAAA/lC,GACAuC,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAA+B,QAAA4lB,EAAA3lB,WAAAuP,iBAEAqwB,GAAAja,EAAAltB,UAAAumC,oBAOA,OANA,IAAAY,IACApiC,QAAAC,KAAA,yDAEA7F,EAAAZ,QAAAw0B,OAAA,CAAAhF,SAAA,yBAGA9vB,GAAA,WAEA,OADAkpC,IACAD,EAAA/lC,KACA+rB,EAAAltB,UAAAwmC,qBAGA,MAAAjhC,MAIA,OAAAyhC,EAGA,SAAArK,EAAAzoB,GACA,IAAAkzB,EAAA,SAAAhzB,EAAAjT,GACA,IAAA7G,EAAA8X,QAIA,OAHA9X,EAAA2sC,eACAliC,QAAAtG,MAAA,+CAAAsB,OAAAmU,IAEA5Z,EAAAmZ,QAAApS,MAAA,WACA,OAAA+lC,EAAAhzB,EAAAjT,MAIA,IAAA+lC,EAAA5sC,EAAAqzB,IAAA0Z,WAAAnzB,GAKA,OAJAgzB,IACAA,EAAAtyB,EAAA+nB,KAAAriC,EAAAugC,KAAAvgC,EAAA2gB,KAAA/G,EAAA5Z,EAAAkgB,QACAlgB,EAAAqzB,IAAA0Z,WAAAnzB,GAAAgzB,GAEAA,EAAA9yB,EAAAjT,IAGA,OAAAimC,EAGA,SAAAvK,EAAA3oB,GACA,OAAA,WACA,IAAAuqB,EAAAnkC,EAAAqzB,IAAAkZ,SAAA3yB,GAWA,OAVAuqB,IAAAA,EAAAF,cACAE,EAAA7pB,EAAAioB,GAAAviC,EAAAugC,KAAAvgC,EAAA2gB,KAAA/G,EAAA5Z,EAAAkgB,SAGAsjB,QAAA,kBACAxjC,EAAAqzB,IAAAkZ,SAAA3yB,IAGA5Z,EAAAqzB,IAAAkZ,SAAA3yB,GAAAuqB,GAEAA,GA0DA,SAAApH,EAAA3lB,GAEAzT,GAAA,WACAivB,EAAAlmB,KAAA0K,EAAAe,QACA,KA3NAnY,EAAAqzB,IAAA,CACA1Z,UAAA,GACAozB,WAAA,GACAR,SAAA,IAEAvsC,EAAA+X,IAAA,IAAApD,EAAA1U,KAAA,OAAA4B,GACA7B,EAAA8X,SAAA,EACA9X,EAAA8G,KAAAA,EAGA9G,EAAAosC,eAAA,SAAAh9B,EAAAkH,YAAA,IAAAlH,EAAAkH,WAAA,UAAAlH,EAAAkH,WACA7R,EAAAgW,UAAA,WAAAhW,EAAAgW,SAAAC,UACA1a,EAAAosC,aACA3hC,QAAAqB,MAAA,0DAGAy0B,GAAAz5B,EAAAy5B,EAAA5f,EAAAT,GACAlgB,EAAA6qC,UAAA/mC,QAAAoC,UAAA2kC,IAAAA,EAgJA7qC,EAAAgtC,QAAA,SAAA70B,GAMA,OALAA,EAAAA,GAAAnY,EAKAsa,EAAAzH,IAAAsF,EAAAooB,KAAApoB,EAAAwI,KAAA,gBAAAxI,EAAA+H,OAAA5F,GACAvT,MAAA,SAAAhH,GACA,IAAAuD,EAAAvD,GAAAA,EAAA+gB,SAAA/gB,EAAA+gB,QAAAxd,SACAwhC,GAAA,EAaA,MAVA,YAAAxhC,GAAAvD,EAAA+gB,QAAAvd,QACAuhC,EAAAxqB,EAAA/W,QAAAuhC,aAAA9/B,EAAAuC,KAAA0O,WAAAlW,EAAA+gB,QAAAvd,SAIAkH,QAAAqB,MAAA,yEAAArG,OAAAnC,GAAA,IAAAvD,EAAA+gB,QAAAvd,SAAA,MAEAuhC,GACAr6B,QAAAtG,MAAA,6DAAAsB,OAAAnC,EAAAvD,EAAA+gB,QAAAvd,QAAAyB,EAAAuC,KAAA0O,aAEA6uB,KAEA17B,OAAA,WACA,OAAA,MAoCApJ,EAAAyZ,UAAA,WACA,OAAAzZ,EAAA8X,SAGA9X,EAAAmZ,MAAA,WACA,OAAAnZ,EAAA8X,QAAAvT,EAAAoH,MAAA,GACA3L,EAAA2sC,eAAA3sC,EAAA0Y,SAGA1Y,EAAA0Y,MAAA,WACA,GAAA1Y,EAAA2sC,cAAA,OAAA3sC,EAAA2sC,cACA,GAAA3sC,EAAA8X,QAAA,OAAAvT,EAAAoH,KAAA3L,EAAAmsC,OAEA,IAAAnsC,EAAAugC,KACA,OAAAv7B,EAAAmU,QACApS,MAAA,WAMA,OALA/G,EAAA8G,OAGA9G,EAAA6qC,UAAA,EAEA7qC,EAAA0Y,WAIAjO,QAAAqB,MAAA,mCAAArG,OAAAzF,EAAAsf,OAAAtf,EAAAkgB,SAEA,IAAAlH,EAAAC,KAAAD,MA0BA,OAxBAhZ,EAAA2sC,cAAApoC,EAAA6P,IAAA,CACApP,EAAAmU,MACAnZ,EAAAgtC,YAEAjmC,MAAA,SAAAL,GAEA,OADA1G,EAAAmsC,MAAAzlC,EAAA,GACA1G,EAAAmsC,OAQAvxB,GAAAA,EAAAna,QAzDA,WACAma,EAAA,CAEA5V,EAAA+S,IAAAxQ,KAAA61B,GAAAllB,QAAAxD,EAAAqoB,EAAA98B,OAuDAo9B,GAEA5yB,QAAAqB,MAAA,qBAAAmN,KAAAD,MAAAA,GAAA,MAEAhZ,EAAA+X,IAAAI,KAAAF,MAAAS,QACA1Y,EAAA8X,SAAA,SACA9X,EAAA2sC,eACA,IAfAliC,QAAAtG,MAAA,0CAAAsB,OAAAzF,EAAAsf,SACAtf,EAAA8X,SAAA,SACA9X,EAAA2sC,eACA,MAcA3sC,EAAA2sC,eAGA3sC,EAAAwqC,KAAA,WACA,OAAAxqC,EAAA8X,SAAA9X,EAAA2sC,eAEAliC,QAAAqB,MAAA,qBA/EApL,EAAAN,QAAAwa,GAAA,SAAA+H,GACAA,OAEA/H,EAAA,UA+EA5a,EAAA2sC,cAEA3sC,EAAAmsC,OACAG,IAlOA7hC,QAAAqB,MAAA,0CAAArG,OAAAi4B,IACA0C,EAAA3C,MAAAC,GAGA19B,EAAAqzB,IAAA1Z,UAAA,GACA3Z,EAAAqzB,IAAA0Z,WAAA,GACA/sC,EAAAqzB,IAAAkZ,SAAA,GA8NAvsC,EAAAmsC,OAAA,EACAnsC,EAAA8X,SAAA,EACA9X,EAAA+X,IAAAI,KAAAF,MAAAuyB,QAGAxqC,EAAA8X,SAAA,EAEAvT,EAAAoH,QAjBApH,EAAAoH,QAoBA3L,EAAAyqC,QAAA,WAEA,OADAzqC,EAAAwqC,OACA7mC,EAAA3D,EAAA0Y,MAAA,KACA3R,MAAA,SAAAolC,GAIA,OAHAA,GACAnsC,EAAA+X,IAAAI,KAAAF,MAAAwyB,UAEA0B,MAIAnsC,EAAA+X,IAAAyB,cAAA,OAAA,SACAxZ,EAAA+X,IAAAyB,cAAA,OAAA,QACAxZ,EAAA+X,IAAAyB,cAAA,OAAA,WAEA,IAAAoZ,EAAA,CACA3lB,WAvVA,CACAggC,8BAAA,KACAzwB,gBAAA,KACA0wB,sBAAA,KACAC,qBAAA,KACAC,iBAAA,KACAC,mBAAA,KACAC,4BAAA,KACAC,2BAAA,KACAC,wBAAA,KACAjtB,iBAAA,KACA6oB,gBAAA,KACAqE,wBAAA,KACAC,4BAAA,KACAC,qCAAA,KACAC,qBAAA,MAyUAloC,UAAAA,EACA/C,OAAA,CACA0oC,QAAAgB,EAAA1pC,EAAA0oC,SACAE,QAAAc,EAAA1pC,EAAA4oC,SACA5lC,OAAA0mC,EAAA1pC,EAAAgD,QACAC,qBAAAymC,EAAA1pC,EAAAiD,sBACA0lC,SAAAe,EAAA1pC,EAAA2oC,UACAuC,IAAAxB,EAAA1pC,EAAAkrC,KACAlC,aAAAU,EAAA1pC,EAAAgpC,cACAC,cAAAS,EAAA1pC,EAAAipC,eACAC,cAAAQ,EAAA1pC,EAAAkpC,eACAC,gBAAAO,EAAA1pC,EAAAmpC,iBACAC,iBAAAM,EAAA1pC,EAAAopC,kBAEA+B,cAAAzB,EAAAvB,GACAiD,mBAAA7gB,EApYA4d,0JAqYAkD,2BAAA9gB,EAAA6d,EAAA,eAAAA,EAAA,OACAkD,0BAAA/gB,EAAA6d,EAAA,mBAAAA,EAAA,OACAmD,cAAAhhB,EAAA6d,GACAoD,uBAAAjhB,EApYA6d,2DAqYAqD,0BAAAlhB,EAAA,OAAA6d,EAAA,QACAsD,oBAAAnhB,EAxYAohB,yUA0YAn2B,KAAA,CACA0I,QAAAhO,EAAA,gBAAAutB,EAAA16B,UAAA22B,MACAkS,KAvJA,SAAAC,GAIA,OAHAA,EAAAA,GAAA,IACAtuB,OAAApc,QAAAoC,UAAAsoC,EAAAtuB,QAAAsuB,EAAAtuB,OAAAsuB,EAAA7tB,MAAA,KAAA6tB,EAAA7tB,KAEA3gB,EAAAugC,OAAAiO,EAAAjO,QAEAvgC,EAAA2gB,OAAA6tB,EAAAC,OAAAzuC,EAAA2gB,MAAA6tB,EAAAC,OAAA,KAEAzuC,EAAAkgB,SAAAsuB,EAAAtuB,QAgJAksB,YAAApsC,EAAAosC,aAEAp6B,QAAA,CACA08B,QAAA,CACAhM,KAAA7vB,EAAA,oBACAgI,MAAAhI,EAAA,2BAEAgI,MAAAhI,EAAA,kBACAsJ,KAAA,CACAqG,KAAA3P,EAAA,sBACAuJ,MAAAvJ,EAAA,yBAGAnB,IAAA,CACAi9B,OAAA97B,EAAA,uBACA+7B,YAAA/7B,EAAA,4BAAAutB,EAAA16B,UAAA62B,OACAsS,aAAAh8B,EAAA,6BAAAutB,EAAA16B,UAAA62B,OACAxhB,OAAA,CACA3G,IAAAvB,EAAA,eAAAutB,EAAA16B,UAAA22B,MACAyS,QAAAj8B,EAAA,eAAAutB,EAAA16B,UAAA62B,QAEA9oB,aAAA,SAAA5M,EAAAq2B,GAEA,OAAA,IAAAA,EAAAtK,EAAAS,IAAA3hB,IAAA+B,aAAA5M,GACA+rB,EAAAS,IAAA3hB,IAAAq9B,sBAAAloC,IAEAmoC,IAAA3M,EAAA,YACA4M,QAAA5M,EAAA,gBACA6M,OAAA7M,EAAA,gBAEA3lB,WAAA,CACAxX,WAAA2N,EAAA,yBAAAutB,EAAA16B,UAAA02B,WACAngB,MAAApJ,EAAA,2BAAAutB,EAAA16B,UAAA62B,OACA4S,YAAAt8B,EAAA,mCACAwN,QAAA,SAAA6c,GAEA,OAAA,IAAAA,EAAAtK,EAAAS,IAAA3W,WAAA2D,UAAAuS,EAAAS,IAAA3W,WAAA0yB,oBAEAC,WAAAhN,EAAA,0BACA1lB,MAAA,CACA2sB,GAAAz2B,EAAA,sBAAAutB,EAAA16B,UAAA42B,QACArrB,GAAA4B,EAAA,uBACAy8B,UAAAz8B,EAAA,6BAAAutB,EAAA16B,UAAA42B,QACA1b,SAAA/N,EAAA,gCACAkJ,aAAAlJ,EAAA,8BAGA5B,GAAA,CACAs+B,QAAA18B,EAAA,sBAAAutB,EAAA16B,UAAA62B,OACAgM,QAAAlG,EAAA,eACAmN,QAAA,CACAp7B,IAAA,SAAAvN,GACA,OAAA+rB,EAAAS,IAAApiB,GAAAu+B,QAAAp7B,IAAAvN,GACAE,MAAA,SAAAL,GAKA,OAJAA,EAAA8oC,QAAA9oC,EAAA8oC,SAAA,GAEA9oC,EAAA8oC,QAAAC,QAAA,GACA/oC,EAAA8oC,QAAAE,SAAA,GACAhpC,MAGAipC,MAAA,SAAA9oC,EAAAq2B,GAEA,QAAA,IAAAA,EAAAtK,EAAAS,IAAApiB,GAAAu+B,QAAAG,MAAA9oC,GAAA+rB,EAAAS,IAAApiB,GAAAu+B,QAAAI,eAAA/oC,IACAE,MAAA,SAAAL,GAKA,OAJAA,EAAA8oC,QAAA9oC,EAAA8oC,SAAA,GAEA9oC,EAAA8oC,QAAAC,QAAA,GACA/oC,EAAA8oC,QAAAE,SAAA,GACAhpC,MAGA6iC,OAAA12B,EAAA,uCAAAutB,EAAA16B,UAAA22B,MACAyS,QAAAj8B,EAAA,iCAGAy2B,GAAA,CACAkG,QAAA38B,EAAA,wBAEAjH,IAAA,GACArI,QAAA,GACA8vB,IAAA,CACA3W,WAAA,CACA0yB,iBAAAv8B,EAAA,sBAAAutB,EAAA16B,UAAA62B,OACAlc,QAAAxN,EAAA,wBAEAnB,IAAA,CACAq9B,sBAAAl8B,EAAA,4BAAAutB,EAAA16B,UAAA22B,MACA5oB,aAAAZ,EAAA,8BAEA5B,GAAA,CACAu+B,QAAA,CACAI,eAAA/8B,EAAA,sCAAAutB,EAAA16B,UAAA22B,MACAsT,MAAA98B,EAAA,uCACAuB,IAAAvB,EAAA,2BAMA+f,EAAA3hB,GAAA4+B,qBAAA,SAAAC,GAaA,IAVA,IAEAC,EACAC,EACAC,EACAC,EALAC,EAAAL,EACAM,EAAA,GAKAC,EAAA,GAGA3tC,EAAAkwB,EAAAjwB,OAAAorC,mBAAAlrC,KAAAstC,GACAztC,GACAqtC,EAAA,GACAC,EAAA,OAAAI,EAAA3vC,OAAA,IACAsvC,EAAAz0B,KAAA60B,EAAA92B,OAAA3W,EAAAkN,MAAAlN,EAAA,GAAA2c,QAAA,MACA0wB,EAAA7/B,MAAAxN,EAAA,IAAAA,EAAA,IAAAA,EAAA,IAAAA,EAAA,GACA0tC,EAAA/yB,KAAA0yB,GAEAM,EAAAN,EAAAz0B,MAAA+0B,EAAAN,EAAAz0B,SAAA,EAEA60B,EAAAA,EAAAnP,QAAAt+B,EAAA,GAAAstC,GACAttC,EAAAkwB,EAAAjwB,OAAAorC,mBAAAlrC,KAAAstC,GAIA,IADA,IAAAG,GAAA,EACAA,GAAA,CAIA,IADAA,KADA5tC,EAAAkwB,EAAAjwB,OAAAqrC,2BAAAnrC,KAAAstC,IAEAztC,GAAA,CASA,IARAqtC,EAAA,GACAC,EAAA,OAAAI,EAAA3vC,OAAA,IACAsvC,EAAAz0B,KAAA,MACAy0B,EAAAQ,SAAA,GACAH,EAAA/yB,KAAA0yB,GAEAE,EAAAvtC,EAAA,GACAwtC,EAAAtd,EAAAjwB,OAAAurC,cAAArrC,KAAAotC,GACAC,GAEAH,EAAAQ,SAAAlzB,KAAA+yB,EAAAF,EAAA,KACAD,EAAAA,EAAAjP,QAAAkP,EAAA,GAAA,IACAA,EAAAtd,EAAAjwB,OAAAurC,cAAArrC,KAAAotC,GAGAE,EAAAA,EAAAnP,QAAAt+B,EAAA,GAAAstC,GACAttC,EAAAkwB,EAAAjwB,OAAAqrC,2BAAAnrC,KAAAotC,GAOA,IAFAvtC,EAAAkwB,EAAAjwB,OAAAsrC,0BAAAprC,KAAAstC,GACAG,EAAAA,KAAA5tC,EACAA,GAAA,CASA,IARAqtC,EAAA,GACAC,EAAA,OAAAI,EAAA3vC,OAAA,IACAsvC,EAAAz0B,KAAA,KACAy0B,EAAAQ,SAAA,GACAH,EAAA/yB,KAAA0yB,GAEAE,EAAAvtC,EAAA,GACAwtC,EAAAtd,EAAAjwB,OAAAurC,cAAArrC,KAAAotC,GACAC,GACAH,EAAAQ,SAAAlzB,KAAA+yB,EAAAF,EAAA,KACAD,EAAAA,EAAAjP,QAAAkP,EAAA,GAAA,IACAA,EAAAtd,EAAAjwB,OAAAurC,cAAArrC,KAAAotC,GAGAE,EAAAA,EAAAnP,QAAAt+B,EAAA,GAAAstC,GACAttC,EAAAkwB,EAAAjwB,OAAAqrC,2BAAAnrC,KAAAstC,GAMA,IAFAztC,EAAAkwB,EAAAjwB,OAAAyrC,0BAAAvrC,KAAAstC,GACAG,EAAAA,KAAA5tC,EACAA,GACAytC,EAAAA,EAAAnP,QAAAt+B,EAAA,GAAAA,EAAA,IACAA,EAAAkwB,EAAAjwB,OAAAyrC,0BAAAvrC,KAAAstC,GAKA,GAAA,KADAE,EAAA3vC,EAAAP,KAAAkwC,IACA5vC,OAKA,OADAgK,QAAAqB,MAAA,+CAAAikC,GACA,CACAS,gBAAAH,EACAI,WAAAV,GANAtlC,QAAAtG,MAAA,uCAAAusC,SAUA9d,EAAAza,KAAAyH,cAAA,SAAA3E,EAAA01B,GAEA,IAAAjuC,EAAAkwB,EAAAjwB,OAAAgpC,aAAA9oC,KAAAoY,GACA,OAAAvY,EACA,CACAod,IAAApd,EAAA,IAAA,GACAkuC,KAAAluC,EAAA,IAAA,GACAmuC,KAAAnuC,EAAA,IAAA,GACAie,KAAAje,EAAA,IAAA,GACAwd,OAAAxd,EAAA,IAAA,KAAAA,EAAA,GACAkX,KAAAlX,EAAA,IACA8c,QAAA,IAIA9c,EAAAkwB,EAAAjwB,OAAAipC,cAAA/oC,KAAAoY,IAEA,CACA6E,IAAApd,EAAA,IAAA,GACAkuC,KAAAluC,EAAA,IAAA,GACAmuC,KAAAnuC,EAAA,IAAA,GACAie,KAAAje,EAAA,IAAA,GACAwd,QAAA,EACAtG,KAAAlX,EAAA,IACA8c,QAAA,IAIA9c,EAAAkwB,EAAAjwB,OAAAmpC,gBAAAjpC,KAAAoY,IAEA,CACA6E,IAAApd,EAAA,IAAA,GACAie,KAAAje,EAAA,IAAA,GACAwd,QAAA,EACAld,QAAA,EACAwc,QAAA,IAIA9c,EAAAkwB,EAAAjwB,OAAAkpC,cAAAhpC,KAAAoY,IAEA,CACA5X,OAAAX,EAAA,IAAA,GACAod,IAAApd,EAAA,IAAA,GACAkuC,KAAAluC,EAAA,IAAA,GACAmuC,KAAAnuC,EAAA,IAAA,GACAie,KAAAje,EAAA,IAAA,GACAwd,OAAAxd,EAAA,IAAA,KAAAA,EAAA,GACAkX,KAAAlX,EAAA,KAAA,GACAyb,SAAA,IAIAzb,EAAAkwB,EAAAjwB,OAAAopC,iBAAAlpC,KAAAoY,IAEA,CACA5X,OAAAX,EAAA,IAAA,GACAod,IAAApd,EAAA,IAAA,GACAie,KAAAje,EAAA,IAAA,GACAkX,KAAAlX,EAAA,IAAA,GACAwd,QAAA,EACAld,QAAA,EACAmb,SAAA,GAKAwyB,IACAjuC,EAAA2pC,EAAAsE,EAAA3F,GAAAnoC,KAAAoY,IAEA,CACA6E,IAAApd,EAAA,IAAA,GACAkuC,KAAAluC,EAAA,IAAA,GACAmuC,KAAAnuC,EAAA,IAAA,GACAie,KAAAje,EAAA,IAAA,GACAwd,OAAAxd,EAAA,IAAA,KAAAA,EAAA,GACAkX,KAAAlX,EAAA,IACA8c,QAAA,QAVA,GAiBAoT,EAAAlmB,KAAA,SAAAokC,GAIA,GAFAx2B,EAAAkmB,OAAAsQ,EAAAvQ,KAAAuQ,EAAAnwB,KAAA,GAAAmwB,EAAA5wB,UACAlgB,EAAAk6B,IACA,CACA,IAAA6W,EAAA/wC,EAAA8X,QAGA,GAFAi5B,GAAA/wC,EAAAwqC,OACAxqC,EAAA8G,KAAAgqC,EAAAvQ,KAAAuQ,EAAAnwB,KAAAmwB,EAAA5wB,OAAAlgB,EAAA6qC,UACAkG,EACA,OAAAptC,GAAA,WACA,OAAA3D,EAAA0Y,QACA3R,MAAA,SAAAolC,GAIA,OAHAA,GACAnsC,EAAA+X,IAAAI,KAAAF,MAAAwyB,UAEA0B,OAEA,OAKAvZ,EAAAlhB,IAAAqJ,OAAAqC,KAAA,WACA,OAAAwV,EAAAlhB,IAAAqJ,OAAA3G,MACArN,MAAA,SAAAL,GACA,OAAAA,EAAAsqC,QAAAvqC,QAAA,SAAAC,EAAAqU,GAEA,OADArU,EAAAqU,EAAAxY,QAAAwY,EAAAzU,IACAI,IACA,QAIAksB,EAAAlhB,IAAAqJ,OAAAlI,IAAA,SAAAtQ,GACA,OAAAqwB,EAAAlhB,IAAAqJ,OAAAqC,OACArW,MAAA,SAAAkqC,GACA,IAAA3qC,EAAA2qC,EAAA1uC,GACA,MAAA,CACAA,OAAAA,EACA+D,IAAAA,GAAA,UAKAssB,EAAAlhB,IAAAqJ,OAAAm2B,SAAA,SAAA5qC,GACA,OAAAssB,EAAAlhB,IAAAqJ,OAAA3G,MACArN,MAAA,SAAAL,GACA,OAAAhG,EAAA8L,UAAA9F,EAAAsqC,QAAA,CAAA1qC,IAAAA,QAQAssB,EAAAlW,WAAA6sB,OAAA,SAAA4H,GACA,OAAAve,EAAAS,IAAA+d,iBAAAxe,EAAAlW,WAAAT,MAAA,QAAAk1B,IAOAve,EAAA5gB,QAAA08B,QAAA2C,cAAA,SAAAC,GACA,OAAA1e,EAAAS,IAAA+d,iBAAAxe,EAAA5gB,QAAA08B,QAAA7zB,MAAA,OAAAy2B,EAAA,EAAA,KAGA1e,EAAAS,IAAA+d,iBAAA,SAAAG,EAAAC,EAAAC,EAAA3kB,EAAAxf,GAGA,OAFAwf,EAAAhpB,QAAAoC,UAAA4mB,GAAAA,EAAA,EACAxf,EAAAA,GAAAslB,EAAAltB,UAAAumC,oBACA1nC,GAAA,SAAA0e,EAAAC,GACA,IAAAmB,EAAA,GACA9G,EAAA,GACA7c,EAAAqZ,KAAA03B,EAAAtiB,MAAArC,EAAAA,EAAAxf,IAAA,SAAAokC,GACA,IAAAC,EAAA,GACAA,EAAAH,GAAAE,EACAn0B,EAAAF,KACAk0B,EAAAI,GACA5qC,MAAA,SAAAL,GACAA,GACA2d,EAAAhH,KAAA3W,UAKAnC,EAAA6P,IAAAmJ,GACAxW,MAAA,WACA+lB,EAAA2kB,EAAAhxC,OAAA,EACAkD,GAAA,WACAivB,EAAAS,IAAA+d,iBAAAG,EAAAC,EAAAC,EAAA3kB,EAAAxf,EAAAA,GACAvG,MAAA,SAAAL,GACAA,GAAAA,EAAAjG,OAKAwiB,EAAAoB,EAAA1d,OAAAD,IAJAuc,EAAAoB,MAMAjb,OAAA,SAAA6B,GACAiY,EAAAjY,QAEA2nB,EAAAltB,UAAAwmC,qBAGAjpB,EAAAoB,MAGAjb,OAAA,SAAA6B,GACAA,GAAAA,EAAA+B,QAAA4lB,EAAA3lB,WAAAuP,gBACAyG,EAAAoB,GAGAnB,EAAAjY,UAMA2nB,EAAAS,IAAAue,6BAAA,SAAA/uC,GACA,OAAAA,IACAuG,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAA+B,OAAA4lB,EAAA3lB,WAAAuP,gBACA,OAAA7Y,GAAA,WAEA,OAAAivB,EAAAS,IAAAue,6BAAA/uC,KACA+vB,EAAAltB,UAAAwmC,yBAKAtZ,EAAAlW,WAAAm1B,OAAA,WACA,OAAAjf,EAAAlW,WAAAC,MAAA2sB,KACAviC,MAAA,SAAAL,GACA,IAAAA,EAAA2d,OAAAklB,SAAA7iC,EAAA2d,OAAAklB,OAAA9oC,OACA,OAAA,KAEA,IAAAkpC,EAAAjjC,EAAA2d,OAAAklB,OAAA7iC,EAAA2d,OAAAklB,OAAA9oC,OAAA,GACA,OAAAmyB,EAAAlW,WAAAT,MAAA,CAAAA,MAAA0tB,IACA5iC,MAAA,SAAAkV,GACA,OAAAA,EAAA8tB,SAAA,EAAA9tB,EAAA6tB,SAAAtoB,KAAAC,IAAA,GAAAxF,EAAA8tB,UAAA9tB,EAAA6tB,gBAKAlX,EAAAhnB,IAAAC,MAAA,SAAAD,GACA,OAAArH,GAAA,SAAA0e,EAAAC,GACA,IAAA3gB,EAGA,GAAA8pC,EAAA1pC,EAAAgD,QAAAunB,KAAAthB,GACAqX,EAAA,CACA1gB,OAAAqJ,SAIA,GAAAygC,EAAA1pC,EAAAiD,sBAAAsnB,KAAAthB,GAAA,CACAnB,QAAAqB,MAAA,iDAAAF,GACA,IAAAlJ,EAAAkwB,EAAAjwB,OAAAiD,qBAAA/C,KAAA+I,GACArJ,EAAAG,EAAA,GACA,IAAAoH,EAAApH,EAAA,GACA+H,QAAAqB,MAAA,mCAAAvJ,EAAA,oBAAAuH,EAAA,KACA,IAAAslB,EAAAzqB,EAAAoE,KAAAa,WAAArH,GACAkI,QAAAqB,MAAA,iDAAAsjB,EAAA,KACAtlB,GAAAslB,EACAlM,EAAA,CAAAhhB,QAAA,kCAGA+gB,EAAA,CACA1gB,OAAAA,SAIA,GAAAqJ,EAAAvJ,WAAA,cAAA,CACA,IACAiE,EADA46B,EAAA5mB,EAAA1O,IAAAC,MAAAD,GAEAkG,GAAA,IAAAovB,EAAAX,KAAAlhB,QAAA,KAAA6hB,EAAAX,KAAA,KACAA,GAAA,IAAAW,EAAAX,KAAAlhB,QAAA,KAAA6hB,EAAAX,KAAA,KAUA,GATAW,EAAA14B,WACA04B,EAAAz4B,UACAnC,EAAA46B,EAAA14B,SACAjG,EAAA2+B,EAAAz4B,UAGAlG,EAAA2+B,EAAA14B,UAGA04B,EAAAC,SAAA,CACA,IAAAwG,EAAAzG,EAAAC,SAAA/+B,MAAA,KACA0vC,EAAAnK,EAAAA,EAAAlnC,OAAA,EACAmP,EAAA,EAUA,IATAkC,GAAAggC,EAAAliC,IACAkC,EAAA61B,EAAA/3B,OAEArN,GAAAuvC,EAAAliC,IACArN,EAAAolC,EAAA/3B,OAEAtJ,GAAAwrC,EAAAliC,IACAtJ,EAAAqhC,EAAA/3B,MAEAkiC,EAAAliC,EACA,YAAAsT,EAAA,CAAAhhB,QAAA,mEAAAg/B,EAAAC,WAIA,GAAArvB,EA8BA,OATAyuB,GACAtd,EAAA,CACA3c,IAAAA,EACA/D,OAAAA,EACAuP,SAAAA,IAKAwI,EAAAzH,IAAA0tB,EAAA,yBAAAjmB,GACAvT,MAAA,SAAA7B,GACAA,EAAA4M,WAAAA,EAGAmR,EAAA,CACA3c,IAAAA,EACA/D,OAAAA,EACAg+B,KAAAA,EACAzuB,SAAAA,IANAoR,EAAA,CAAAhhB,QAAA,oBAAAgD,EAAA4M,SAAA,sCAAAA,EAAA,UASA1I,OAAA,SAAA6B,GACAR,QAAAtG,MAAA8G,GACAiY,EAAA,CAAAhhB,QAAA,oEA3CA,IAAAq+B,EAgBA,YAAArd,EAAA,CAAAhhB,QAAA,qEAfAoY,EAAAzH,IAAA0tB,EAAA,yBAAAjmB,GACAvT,MAAA,SAAA7B,GACA+d,EAAA,CACA3c,IAAAA,EACA/D,OAAAA,EACAg+B,KAAAA,EACAzuB,SAAA5M,EAAA4M,cAGA1I,OAAA,SAAA6B,GACAR,QAAAtG,MAAA8G,GACAiY,EAAA,CAAAhhB,QAAA,yEAoCAuI,QAAAqB,MAAA,oCAAAF,GACAsX,EAAA,CAAAhhB,QAAA,gCAKA6E,MAAA,SAAAsd,GACA,GAAAA,EAAA,CACA,GAAAA,EAAA9hB,SAAA8pC,EAAA1pC,EAAAgD,QAAAunB,KAAA7I,EAAA9hB,QACA,KAAA,CAAAL,QAAA,0BAAAmiB,EAAA9hB,OAAA,KAEA,GAAA8hB,EAAA/d,MAAA+lC,EAAA1pC,EAAA0oC,SAAAne,KAAA7I,EAAA/d,KACA,KAAA,CAAApE,QAAA,uBAAAmiB,EAAA/d,IAAA,KAEA,GAAA+d,EAAAvS,WAAAu6B,EAAA1pC,EAAA2oC,UAAApe,KAAA7I,EAAAvS,UACA,KAAA,CAAA5P,QAAA,4BAAAmiB,EAAAvS,SAAA,KAEA,OAAAuS,OAKA,IAAAhO,EAAArR,EAAAuC,KAAA8O,yBAAAiE,EAAA1O,IAAAC,MAAA7G,EAAAuC,KAAA8O,yBACAuc,EAAAS,IAAA0e,iBAAA17B,EACAiE,EAAA2nB,aAAA5rB,EAAAkqB,KACAlqB,EAAAsK,KACA,IAAAtK,EAAA8qB,SACA,MAAA9qB,EAAA,MAAA,WAAAA,EAAAqE,UAAA1a,EAAAosC,YACAhM,EAAA16B,UAAA22B,MAGA,WACA,OAAA93B,EAAAoH,QAGAinB,EAAArvB,QAAAyuC,OAAA,WACA,OAAApf,EAAAS,IAAA0e,mBACAhrC,MAAA,SAAAhH,GACA,GAAAA,EACA,OAAAA,EAAAsN,MAAAtN,EAAAkyC,SACA,CACA1uC,QAAAxD,EAAAsN,KACA6sB,IAAAn6B,EAAAkyC,UAGAlyC,EAAAmyC,UAAAnyC,EAAAkyC,SACA,CACA1uC,QAAAxD,EAAAmyC,SAAAhvC,UAAA,GACAg3B,IAAAn6B,EAAAkyC,eAHA,KAOA7oC,OAAA,SAAA6B,GAEAR,QAAAtG,MAAA,6CAAA8G,OAIA2nB,EAAAnQ,UAAA,CACAxG,MAAAsmB,EAAA,aACArkB,KAAAqkB,EAAA,YACAhgB,MAAA+pB,GAGAxoC,QAAA0S,MAAAxW,EAAA4yB,GAGA,IAAA5F,EAAA,IAAAloB,EAoCA,OAlCAkoB,EAAAmlB,SAAA,SAAA5R,EAAA5f,EAAAT,EAAA2qB,GAEA,OAAA,IAAA/lC,EAAAy7B,EAAA5f,EAAAT,EADA2qB,IAAA/mC,QAAAoC,UAAA2kC,IAAAA,IAIA7d,EAAA7M,cAAA,SAAAogB,EAAA5f,EAAAT,EAAA9P,GAGA,MAAA,CACAmwB,KAAAA,EACA5f,KAJAA,EAAAA,GAAA,GAKAT,OAJAA,EAAApc,QAAAoC,UAAAga,GAAAA,EAAA,KAAAS,EAKAuZ,IAAA5f,EAAAkmB,OAAAD,EAAA5f,EAAA,GAAAT,GACA/H,KAAA,CACA0I,QAAAvG,EAAA2nB,aAAA1B,EAAA5f,EAAA,gBAAAT,EAAAkgB,EAAA16B,UAAA42B,QAAA,EAAAlsB,IAEA4B,QAAA,CACA08B,QAAA,CACAhM,KAAApoB,EAAAzH,IAAA0tB,EAAA5f,EAAA,mBAAAT,EAAA9P,IAEAyK,MAAAP,EAAAzH,IAAA0tB,EAAA5f,EAAA,iBAAAT,EAAA9P,IAEAsM,WAAA,CACA2D,QAAA/F,EAAAzH,IAAA0tB,EAAA5f,EAAA,sBAAAT,EAAA9P,GACAuM,MAAA,CACAiE,SAAAtG,EAAAzH,IAAA0tB,EAAA5f,EAAA,+BAAAT,EAAA9P,OASA4c,KC3hCAlpB,QAAA0Q,OAAA,sBAAA,CAAA,QAAA,sBAAA,yBAAA,wBACA,6BAEAC,QAAA,QAAA,CAAA,aAAA,KAAA,WAAA,MAAA,MAAA,eAAA,UAAA,WAAA,aAAA,aAAA,UAAA,SAAAC,EAAAnQ,EAAAZ,EAAAmB,EAAA6P,EAAAwnB,EAAAt3B,EAAAuK,EAAAC,EAAArK,EAAAo7B,GAIA,IACAroB,EAAA,IAAApD,EAAA1U,KAAA,SAEAmyC,EAAAhS,EAAAvtB,IAAA6qB,cAAA0C,EAAA16B,UAAA42B,QACA+V,EAAAjS,EAAAvtB,IAAA6qB,sBAAA0C,EAAA16B,UAAA42B,QAGAgW,EAAA,SAAAC,GACA,IAAAC,EAAA,GACA,OAAAD,EAAA9rC,QAAA,SAAAC,EAAA+rC,GAEA,OADAA,EAAA5wC,GAAA4wC,EAAA5wC,IAAA4wC,EAAAnsC,IAAA,IAAAmsC,EAAAlwC,OACAiwC,EAAAC,EAAA5wC,IAIA6E,GAHA8rC,EAAAC,EAAA5wC,KAAA,EACA6E,EAAAC,OAAA8rC,MAGA,KAGAC,EAAA,SAAAH,EAAAzlB,EAAAxf,GAkBA,OAjBAwf,EAAAA,GAAA,EAGAylB,EAAAD,EAAAC,GAGAA,EAAA7xC,EAAA0hB,OAAAmwB,GAAA,SAAAE,GACA,IAAApxB,EAAA,EAGA,OAFAA,GAAA,IAAAoxB,EAAA,QACApxB,GAAA,IAAA,IAAAoxB,EAAAnsC,IAAAa,cAAAma,WAAA,QAGAxd,QAAAoC,UAAAoH,IAAAilC,EAAA9xC,OAAA6M,IACAilC,EAAAA,EAAApjB,MAAArC,EAAAA,EAAAxf,IAIAilC,GAcAI,EAAA,SAAAprC,GACAA,EAAAkM,aAAA,CACAgQ,QAAA,EACAmvB,KAAA,GACAC,SAAA,EACAC,UAAA,EACAC,gBAAA,EACAC,kBAAA,EACAC,WAAA,EACAv/B,mBAAA,EACAF,UAAA,EACA0/B,WAAA,EACAC,mBAAA,EACAC,oBAAA,EACAC,uBAAA,EACAC,2BAAA,EACAC,kBAAApqC,GAEA5B,EAAAisC,SAAA,KACAjsC,EAAAiM,UAAA,EACAjM,EAAAksC,QAAA,KACAlsC,EAAAsrC,SAAA,GAGAa,EAAA,SAAAjgC,EAAAkgC,GAyBA,GAvBAlgC,EAAAo/B,UAAAp/B,EAAAm/B,KAAAgB,UACAngC,EAAAq/B,UAAAr/B,EAAAo/B,SAAAp/B,EAAAm/B,KAAAiB,QACApgC,EAAAy/B,YAAApvC,QAAAoC,UAAAuN,EAAAy/B,YAAAz/B,EAAAy/B,UACAz/B,EAAAs/B,gBAAAt/B,EAAArS,SAAAqS,EAAAqgC,qBAAA,GAAArgC,EAAAsgC,4BAAA,IAAAtgC,EAAAy/B,UACAz/B,EAAAw/B,WAAAx/B,EAAAs/B,iBAAAt/B,EAAArS,SACAqS,EAAAqgC,qBAAA9uC,EAAAuC,KAAAwO,6BACAtC,EAAAsgC,4BAAA,GACAtgC,EAAAy/B,YAAAz/B,EAAArS,SAAA,IAAAqS,EAAAqgC,qBACA,IAAArgC,EAAAsgC,2BACAtgC,EAAAu/B,kBAAAv/B,EAAArS,SAAAqS,EAAAqgC,oBAAA,EACArgC,EAAAC,mBAAAD,EAAArS,SAAAqS,EAAAqgC,qBAAA,GAAArgC,EAAAsgC,2BAAA,EACAtgC,EAAAD,UAAAC,EAAArS,SAAAqS,EAAAqgC,oBAAA,EACArgC,EAAA+/B,SAAA//B,EAAAm/B,KAAAgB,UAEAngC,EAAA0/B,oBAAA1/B,EAAAD,UAAAC,EAAAy/B,YAAAz/B,EAAAugC,UAAAvgC,EAAAjS,eAAAiS,EAAAjS,eAAAf,OAAA,EACAgT,EAAAwgC,6BAAAxgC,EAAAjS,eAAAiS,EAAAjS,eAAAiF,QAAA,SAAAmb,EAAAsyB,GACA,OAAAtyB,GAAAsyB,EAAAC,WAAAnvC,EAAAuC,KAAAyO,kBAAA,EAAA,KACA,GAAA,EACAvC,EAAA2gC,WAAA3gC,EAAAwgC,6BAAA,EACAxgC,EAAA4gC,mBAAA5gC,EAAArS,WAAAqS,EAAA6gC,eAIA7gC,EAAAD,UAAAC,EAAAy/B,UAQAz/B,EAAA8gC,0BAAAzwC,QAAAoC,UAAAuN,EAAA+gC,cAAA/gC,EAAA+gC,aAAA/zC,OAAA,MARA,CACA,IAAAg0C,EAAA/zC,EAAAg0C,MACAh0C,EAAAi0C,MAAAlhC,EAAA+gC,cAAA,GAAA,QACA9zC,EAAAi0C,MAAAlhC,EAAAjS,gBAAA,GAAA,SAEAiS,EAAA8gC,0BAAA7zC,EAAA4M,KAAAmnC,GAiBA,OAVAhhC,EAAA4/B,wBAAA5/B,EAAAq/B,UAAAr/B,EAAA0/B,mBAAAQ,EAAAiB,OACAjB,EAAAiB,OAAAnhC,EAAA0/B,mBAAA,EACA1/B,EAAA6/B,4BAAA7/B,EAAAs/B,iBAAAt/B,EAAA4/B,wBACA5/B,EAAA0/B,mBAAA1/B,EAAAwgC,6BAAAN,EAAAiB,OACAjB,EAAAiB,OAAAnhC,EAAA0/B,mBAAA1/B,EAAAwgC,6BAAA,EAGAxgC,EAAAgQ,QAAA,EAGAhQ,GAGAohC,EAAA,SAAAj0C,GACA,IAAAA,EAAA,OAAA2D,EAAAoH,KAAA/K,GAEA,IAAA2oC,EAAA,GAWA,OAVA7oC,EAAAN,QAAAQ,GAAA,SAAAk0C,GACA,IAAAtB,EAAAsB,EAAAlC,KAAAgB,UAAAxxC,MAAA,IAAA,GACA0yC,EAAAlC,KAAA9wC,OAAA4b,SAAA81B,EAAA,IACAsB,EAAAlC,KAAA7wC,KAAAyxC,EAAA,GACAsB,EAAAlC,KAAAt2B,IAAAw4B,EAAAlC,KAAAt2B,KAAAw4B,EAAAx4B,WACAw4B,EAAAx4B,IACAitB,EAAAlsB,KAAAy3B,EAAAlC,KAAA9wC,WAIAgD,EAAA4X,WAAA6sB,OAAA7oC,EAAAyhB,KAAAonB,IACAxiC,MAAA,SAAAwiC,GAWA,OAVA7oC,EAAAN,QAAAQ,GAAA,SAAAk0C,GACA,IAAA74B,EAAAvb,EAAA8L,UAAA+8B,EAAA,CAAAznC,OAAAgzC,EAAAlC,KAAA9wC,SACAgzC,EAAAlC,KAAAmC,KAAA94B,GAAAA,EAAAqE,WAGArE,GAAA,IAAA64B,EAAAlC,KAAA9wC,QAAAgzC,EAAAlC,KAAA7wC,OAAAka,EAAAla,OACA+yC,EAAAlC,KAAAiB,SAAA,MAIAjzC,KAEAwI,OAAA,SAAA6B,GAEA,GAAAA,GAAAA,EAAA+B,OAAAlI,EAAAmI,WAAAm8B,gBAMA,OALA1oC,EAAAN,QAAAQ,GAAA,SAAAk0C,GACA,IAAAA,EAAAhzC,SACAgzC,EAAAlC,KAAAmC,KAAA37B,SAAAurB,MAAAC,WAGAhkC,EAGA,MAAAqK,MAKA+pC,EAAA,SAAAC,EAAAC,GACA,IAAAD,IAAAA,EAAA1yC,SAAA0yC,EAAA3uC,IAAA,OAAA/B,EAAAoH,KAAAspC,GAEA,IAAAE,EAAAF,EAAA1yC,QAAA0yC,EAAA3uC,IACAiB,GAAA,IAAA2tC,EAAA7C,EAAAx/B,IAAAsiC,GAAA,KACA,GAAA5tC,EAIA,OAHAkD,QAAAqB,MAAA,sBAAAqpC,EAAA,mBAEArxC,QAAA0S,MAAAy+B,EAAA1tC,GACAhD,EAAAoH,KAAApE,GAEAA,EAAA,CAAAhF,OAAA0yC,EAAA1yC,OAAA+D,IAAA2uC,EAAA3uC,KAGA3C,GAAA,WACA4D,EAAAkM,cAAAlM,EAAAkM,aAAAgQ,QAAA5e,EAAAZ,QAAAw0B,OAAA,CAAAhF,SAAA,0BACA,KAEA,IAAAza,EAAAC,KAAAD,MACA,OAAAzU,EAAA6P,IAAA,CAEA/E,EAAAwD,MAGA/N,EAAA4M,IAAA+B,aAAA,CAAAlR,OAAAgF,EAAAhF,QAAAgF,EAAAjB,MAAA,GACAS,MAAA,SAAAL,GACA,OAAAmuC,EAAAnuC,GAAAA,EAAA9F,iBAGAmG,MAAA,SAAAL,GACA,IAAAoL,EAAApL,EAAA,GACA9F,EAAA8F,EAAA,GAEA,GAAA9F,GAAAA,EAAAH,OA0DA,OAvDAG,EAAAH,OAAA,IAWAG,EAAAF,EAAA0hB,OAAAxhB,GAAA,SAAA6xC,GACA,IAAApxB,EAAA,EACAA,GAAA,MAAA9Z,EAAAjB,KAAAmsC,EAAAnsC,MAAAiB,EAAAjB,IAAA,EAAA,GACA+a,GAAA,MAAAoxB,EAAAG,KAAAiB,QAAA,EAAA,GACAxyB,GAAA,MAAA9Z,EAAAisC,UAAAf,EAAAG,KAAAgB,WAAAnB,EAAAG,KAAAgB,YAAArsC,EAAAisC,SAAA,EAAA,GACAnyB,GAAA,KAAAoxB,EAAAqB,oBAAA,EAAA,EAAA,GACAzyB,GAAA,KAAAoxB,EAAAsB,2BAAA,EAAA,EAAA,GACA1yB,GAAA,KAAAoxB,EAAAuB,QAAA,EAAA,GACA3yB,GAAA,KAAAoxB,EAAA2C,aAAA,EAAA,GACA/zB,GAAA,KAAAoxB,EAAAS,UAAA,EAAA,GACA,IAAAmC,GAAA5C,EAAAuB,SAAAvB,EAAAjxC,eAAAixC,EAAAjxC,eAAAf,OAAA,EAGA,OAFA4gB,GAAA,GAAAg0B,GAAA,KACAh0B,GAAA,IAAAg0B,GAAA5C,EAAAsB,2BAAA,EAAAtB,EAAAsB,2BAAA,IAAA,OAGAtpC,QAAAqB,MAAA,2EAAArG,OAAA7E,EAAAH,UAIA8G,EAAAkM,aAAAigC,EAAA9yC,EAAA,GAAAkR,EAAA5M,YAGAqC,EAAAhF,OAAAgF,EAAAkM,aAAAlR,OACAgF,EAAAjB,IAAAiB,EAAAkM,aAAAnN,IACAiB,EAAAiM,SAAAjM,EAAAkM,aAAAD,SACAjM,EAAAisC,SAAAjsC,EAAAkM,aAAAm/B,MAAArrC,EAAAkM,aAAAm/B,KAAAgB,UACArsC,EAAAsrC,QAAAtrC,EAAAkM,aAAAo/B,QACAtrC,EAAAksC,QAAAlsC,EAAAkM,aAAAm/B,MAAArrC,EAAAkM,aAAAm/B,KAAAmC,MAGAxtC,EAAAkM,aAAAD,WAAAjM,EAAAkM,aAAAy/B,WAAAtyC,EAAAH,OAAA,IACA8G,EAAAkM,aAAA8/B,aAAA3yC,EAAA2e,OAAA,GACA7e,EAAAN,QAAAmH,EAAAkM,aAAA8/B,cAAA,SAAA9/B,GACAigC,EAAAjgC,EAAA3B,EAAA5M,gBAKAmtC,EAAAjQ,IAAA+S,EAAA5tC,GAEAzD,QAAA0S,MAAAy+B,EAAA1tC,GAEAkD,QAAAqB,MAAA,+CAAArG,OAAA8B,EAAAhF,QAAAgF,EAAAhF,OAAAW,UAAA,EAAA,IAAAqE,EAAAjB,IAAA2S,KAAAD,MAAAA,IAEAi8B,KAEA7rC,OAAA,SAAA6B,GAIA,GAHA1D,EAAAkM,aAAA,CAAAgQ,QAAA,GACAkvB,EAAAsC,GAEAhqC,IACAA,EAAA+B,OAAAlI,EAAAmI,WAAAogC,oBACApiC,EAAA+B,OAAAlI,EAAAmI,WAAAqgC,6BAEA,OADA2H,EAAAxhC,aAAAgQ,QAAA,EACAwxB,EAEA,MAAAhqC,MAIAqqC,EAAA,SAAA/yC,EAAA+D,GACA,IAAAiB,EAAA,CACAhF,OAAAA,EACA+D,IAAAA,EACAusC,SAAA,GAEA,OAAA/tC,EAAA4M,IAAAi9B,OAAA,CAAAtN,OAAA9+B,GAAA+D,IACAS,MAAA,SAAAL,GACA,IAAA9F,EAAA8F,EAAAsqC,QAAAvqC,QAAA,SAAA8rC,EAAA7rC,GACA,OAAA6rC,EAAA5rC,OAAAD,EAAA0W,KAAA3W,QAAA,SAAA2W,EAAAq1B,GACA,IAAAe,EAAAf,EAAAG,KAAAgB,UAAAxxC,MAAA,IAAA,GACAqb,EAAAC,SAAA81B,EAAA,IACA,OAAAp2B,EAAAzW,OAAA,CACAL,IAAAmsC,EAAAnsC,IACA/D,OAAAmE,EAAAnE,OACAqwC,KAAA,CACAgB,UAAAnB,EAAAG,KAAAgB,UACA9xC,OAAA2b,EACA1b,KAAAyxC,EAAA,GACAl3B,IAAAm2B,EAAA/P,MAEAthC,QAAAqxC,EAAArxC,QACAm0C,WAAA9C,EAAA8C,eAEA,OACA,IAGA,OAAAV,EAAAj0C,GACAmG,MAAA,SAAAnG,GACA,MAAA,CACAA,WAAAA,EACAowC,QAAAtqC,EAAAsqC,eAIAjqC,MAAA,SAAAL,GACA,IAAA9F,EAAA8F,EAAA9F,WAGAA,EAAAH,OAAA,IAMAiG,EAAA9F,WAAAF,EAAA0hB,OAAAxhB,GAAA,SAAA6xC,GACA,IAAApxB,EAAA,EAMA,OALAA,GAAA,MAAA9Z,EAAAjB,KAAAmsC,EAAAnsC,MAAAiB,EAAAjB,IAAA,EAAA,GACA+a,GAAA,MAAAoxB,EAAAG,KAAAiB,QAAA,EAAA,GACAxyB,GAAA,KAAA9Z,EAAAisC,UAAAf,EAAAG,KAAAgB,WAAAnB,EAAAG,KAAAgB,YAAArsC,EAAAisC,SAAA,EAAA,GACAnyB,GAAA,KAAAoxB,EAAArxC,QAAA,EAAA,KACAigB,GAAA,GAAAoxB,EAAAG,KAAA9wC,OAAA2wC,EAAAG,KAAA9wC,OAAA,GAAA,QAGA2I,QAAAqB,MAAA,qEAAArG,OAAA7E,EAAAH,UAIAC,EAAAN,QAAAQ,GAAA,SAAA6xC,GACAA,EAAAI,WAAAJ,EAAAnsC,KAAAmsC,EAAAG,KAAAgB,WAAAnB,EAAAG,KAAAt2B,QAIA/U,EAAAkM,aAAA7S,EAAA,GAGA2G,EAAAhF,OAAAgF,EAAAkM,aAAAlR,OACAgF,EAAAjB,IAAAiB,EAAAkM,aAAAnN,IACAiB,EAAAisC,SAAAjsC,EAAAkM,aAAAm/B,MAAArrC,EAAAkM,aAAAm/B,KAAAgB,UACArsC,EAAAsrC,QAAAtrC,EAAAkM,aAAAo/B,QACAtrC,EAAAksC,QAAAlsC,EAAAkM,aAAAm/B,MAAArrC,EAAAkM,aAAAm/B,KAAAmC,KAEAn0C,EAAAH,OAAA,IACA8G,EAAAkM,aAAA8/B,aAAA3yC,EAAA2e,OAAA,IAIAhY,EAAAonC,OAAA,GAGA,IAAA6G,EAAA,GAsEA,OArEAjuC,EAAAonC,OAAAntC,gBAAAkF,EAAAsqC,SAAA,IAAAvqC,QAAA,SAAAgvC,EAAA/uC,GACA,OAAAA,EAAA0W,KAAA3W,QAAA,SAAAgvC,EAAAhD,GACA,IAAAiD,EAAAjD,EAAAnsC,IAAA,KAAAmsC,EAAAG,KAAAH,EAAAG,KAAAgB,UAAA,IA4BA,OA3BA6B,EAAAC,IAAAjD,EAAAkD,QAAA,IAAAlvC,QAAA,SAAAmvC,EAAA1B,GACA,IAAA2B,EAAAH,EAAA,IAAAxB,EAAA3xC,OACA8hB,EAAA,CACA9hB,OAAA2xC,EAAA3xC,OACA+D,IAAA4tC,EAAA92B,KAAA,GACA04B,UAAA,CACA75B,MAAAi4B,EAAAtB,MAAAsB,EAAAtB,KAAAmD,aAAA7B,EAAAtB,KAAAmD,aAAA,EACAC,WAAA9B,EAAAtB,MAAAsB,EAAAtB,KAAAoD,WAAA9B,EAAAtB,KAAAoD,WAAA,MAEAxiC,SAAA0gC,EAAA1gC,SACA0/B,UAAAgB,EAAAhB,WAEA,OAAAsC,EAAAK,GAIAxxB,EAAAyxB,UAAA75B,MAAAu5B,EAAAK,GAAAC,UAAA75B,OACAu5B,EAAAK,GAAAxxB,EACAuxB,EAAAr2B,OAAA7e,EAAAgjC,UAAAkS,EAAA,CAAArzC,OAAA2xC,EAAA3xC,SAAA,EAAA8hB,GACAuxB,GAGAA,GATAJ,EAAAK,GAAAxxB,EAYAuxB,EAAAjvC,OAAA0d,MACA,IACAoxB,IACAA,KACA,IAGAD,EAAA,GACAjuC,EAAAonC,OAAAsH,qBAAAvvC,EAAAsqC,SAAA,IAAAvqC,QAAA,SAAAmvC,EAAAlvC,GACA,OAAAA,EAAAwvC,QAAA,IAAAzvC,QAAA,SAAAmvC,EAAA1B,GACA,IAAA7vB,EAAA,CACA9hB,OAAA2xC,EAAA3xC,OACA+D,IAAA4tC,EAAA5tC,IACAwvC,UAAA,CACA75B,MAAAi4B,EAAA4B,WAAA5B,EAAA4B,UAAA75B,MAAAi4B,EAAA4B,UAAA75B,MAAA,EACA+5B,WAAA9B,EAAA4B,WAAA5B,EAAA4B,UAAAE,WAAA9B,EAAA4B,UAAAE,WAAA,MAEAvC,QAAAS,EAAAtB,KAAAsB,EAAAtB,KAAAgB,UAAA,KACApgC,SAAA0gC,EAAA1gC,SACA0/B,UAAAgB,EAAAhB,WAEA,GAAAsC,EAAAtB,EAAA3xC,QAGA,CACA,KAAA8hB,EAAApI,MAAAu5B,EAAAtB,EAAA3xC,QAAA0Z,OASA,OAAA25B;CARAJ,EAAAtB,EAAA3xC,QAAA8hB,OAJAmxB,EAAAtB,EAAA3xC,QAAA8hB,EAeA,OAAAuxB,EAAAjvC,OAAA0d,KACAuxB,KACA,IAEAruC,KAEA6B,OAAA,SAAA6B,GACA,GAAAA,GAAAA,EAAA+B,OAAAlI,EAAAmI,WAAAkgC,qBAEA,OADAwF,EAAAprC,GACAA,EAGA,MAAA0D,MAKAkrC,EAAA,SAAAC,EAAA7zC,EAAA8zC,EAAAnxC,EAAAob,EAAAuuB,GAEA,SAAAyH,EAAA/zC,EAAA0Z,GACA,OAAA1Z,EAAA,IAAA0Z,EAIA,IAAAs6B,GAAA,EACAC,EAAAH,EAAAA,EAAA5vC,QAAA,SAAAC,EAAAwtC,GACA,IAAAuC,EAAAH,EAAApC,EAAA3xC,OAAA2xC,EAAA4B,UAAA5B,EAAA4B,UAAA75B,MAAAi4B,EAAAT,SAGA,OAFAS,EAAA4B,YAAAS,GAAA,GACA7vC,EAAA+vC,GAAAvC,EACAxtC,IACA,IAAA,GAIA,OAAA0vC,EAAA,CAAA7zC,OAAAA,IACAwE,MAAA,SAAAL,GACA,OAAAA,GAAAA,EAAAlF,gBAAA,IAAAiF,QAAA,SAAAC,EAAAwtC,GAMA,IAAApF,GAAAoF,EAAAwC,QACAC,EAAAzC,EAAA4B,UAAA5B,EAAA4B,UAAAx1B,WAAA,KACA6zB,EAAAwC,EAAA7H,EACA6H,EAAAzxC,EAAA0xC,UAAAt2B,EACAq2B,EAAAzxC,EAAA2xC,YAAAv2B,EAFA,EAGA6zB,EAAAA,EAAA,EAAA,EAAAA,EAEA,IAAAsC,EAAAH,EAAApC,EAAA3xC,OAAAg0C,GAAArC,EAAA4B,UAAA5B,EAAA4B,UAAA75B,MAAAi4B,EAAAT,SAIA,cAHA+C,EAAAC,GAGA/vC,EAAAC,OAAA,CACApE,OAAA2xC,EAAA3xC,OACA+D,IAAA4tC,EAAA5tC,IACAyuC,KAAA4B,EACAnjC,SAAA0gC,EAAA1gC,SACA0/B,UAAAgB,EAAAhB,UACAiB,UAAAA,EACAC,WAAAD,GAAAA,GAAAnvC,EAAAuC,KAAAyO,kBACA84B,QAAAA,EACA7yB,MAAA,OAAAi4B,EAAAwC,QAAAxC,EAAAwC,QAAA50C,OACAoyC,EAAA4B,UAAA5B,EAAA4B,UAAA75B,MAAA,KACA1S,MAAA4qC,EAAA,MAEA,OAEA/qC,OAAA,SAAA6B,GACA,GAAAA,GAAAA,EAAA+B,OAAAlI,EAAAmI,WAAAogC,mBAEA,MAAA,GAGA,GAAApiC,GAAA,MAAAA,EAAA+B,MAGA,OAFAvC,QAAAC,KAAA,4EAEA,GAGA,MAAAO,KAKAlE,MAAA,SAAAvF,GACA,IAAAs1C,EAAAp2C,EAAAod,OAAA04B,GACA,IAAAM,EAAAr2C,OAAA,OAAAe,EAGA,GAAA6N,EAAA9H,KAAA8hC,UACA,OAAAyN,EAAArwC,QAAA,SAAAC,EAAAwtC,GACA,OAAAxtC,EAAAC,OAAA,CACApE,OAAA2xC,EAAA3xC,OACA+D,IAAA4tC,EAAA5tC,IACAkN,SAAA0gC,EAAA1gC,SACA0/B,UAAAgB,EAAAhB,UACA6B,KAAA,KACAZ,UAAAjvC,EAAA0xC,UACAxC,YAAA,EACAtF,SAAA,EACA7yB,MAAA,EACA1S,OAAA,MAEA/H,GAGA,IAAAu1C,EAAAD,EAAArwC,QAAA,SAAAC,EAAAwtC,GACA,IAAAj4B,EAAAs6B,GAAArC,EAAA4B,UAAA5B,EAAA4B,UAAA75B,MACAi4B,EAAAT,QAAAS,EAAAT,QAAArxC,MAAA,KAAA,GAAA,KASA,OARA0B,QAAAoC,UAAA+V,KACAvV,EAAAuV,GAIAvV,EAAAuV,GAAAoB,KAAA62B,GAHAxtC,EAAAuV,GAAA,CAAAi4B,IAMAxtC,IACA,IAGA,OAAA5B,EAAA4X,WAAA6sB,OAAA7oC,EAAAP,KAAA42C,IAAAhwC,MAAA,SAAAwiC,GAyBA,OAxBA/nC,EAAA+nC,EAAA9iC,QAAA,SAAAC,EAAAuV,GACA,OAAAvV,EAAAC,OAAAowC,EAAA96B,EAAAna,QAAA2E,QAAA,SAAAC,EAAAwtC,GACA,IAAAyC,EAAA16B,EAAAqE,WACA6zB,EAAA3yB,KAAAO,IAAA,EAAA40B,EAAAzxC,EAAA0xC,UAAAt2B,GACA02B,GAAA9C,EAAA4B,YAAA5B,EAAA4B,UAAAE,YAAA9B,EAAA4B,UAAAE,YAAA/5B,EAAAla,KACAi1C,GACAvsC,QAAAqB,MAAA,6CAAArG,OAAAyuC,EAAA3xC,OAAAW,UAAA,EAAA,KAEA,IAAAqG,EAAA4qC,EAAA,KAAAtF,GAAAqF,EAAA1gC,WAAAwjC,EACA,OAAAtwC,EAAAC,OAAA,CACApE,OAAA2xC,EAAA3xC,OACA+D,IAAA4tC,EAAA5tC,IACAkN,SAAA0gC,EAAA1gC,SACA0/B,UAAAgB,EAAAhB,UACA6B,KAAA4B,EACAxC,UAAAA,EACAC,WAAAD,GAAAA,GAAAnvC,EAAAuC,KAAAyO,kBACA84B,SAAA,EACA7yB,MAAAs6B,GAAArC,EAAA4B,UAAA5B,EAAA4B,UAAA75B,MACAi4B,EAAAT,QAAAS,EAAAT,QAAArxC,MAAA,KAAA,GAAA,KACAmH,MAAAA,MAEA,OACA/H,SAMAuF,MAAA,SAAAvF,GAGA,IAAAy1C,EAAAz1C,EAAAiF,QAAA,SAAAC,EAAAwtC,GAIA,OAHAA,EAAApF,SAAAoF,EAAA3qC,OAAA2qC,EAAAC,WAAAjvC,EAAA0xC,YACAlwC,EAAAwtC,EAAA3xC,SAAA,GAEAmE,IACA,IAGAlF,EAliBA,SAAAA,GAQA,OAPAd,EAAA0hB,OAAA5gB,GAAA,SAAA0yC,GACA,IAAA7yB,EAAA,EAIA,OAHAA,GAAA,MAAA6yB,EAAAC,UAAAD,EAAAC,UAAA,GACA9yB,GAAA,KAAA6yB,EAAA1gC,SAAA,EAAA,KACA6N,GAAA,IAAA6yB,EAAAj4B,MAAAi4B,EAAAj4B,MAAA,OA6hBAi7B,CAAA11C,GAGA,IAAAs1C,EAAA,GACAK,EAAA,GAcA,MAAA,CACA5tC,MAdA/H,EAAAiF,QAAA,SAAAC,EAAAwtC,GACA,OAAAA,EAAApF,SACAoF,EAAA3qC,QAAA0tC,EAAA/C,EAAA3xC,QACAu0C,EAAAz5B,KAAA62B,GAEAA,EAAA3qC,OAAA0tC,EAAA/C,EAAA3xC,SACA40C,EAAA95B,KAAA62B,GAEAxtC,GAEAA,EAAAC,OAAAutC,KACA,IAIApF,QAAAgI,EACA3yC,MAAAgzC,OAgDAnO,EAAA,SAAAzmC,EAAA+D,EAAAqG,GAGA,IAAApF,EAEA,GAHAoF,EAAAA,GAAA,IAGApK,GAAA+D,IAAAqG,EAAAyqC,MACA,OAAAtyC,EAAA4M,IAAAqJ,OAAAm2B,SAAA5qC,GACAS,MAAA,SAAAgU,GACA,GAAAA,EAAA,OAAAiuB,EAAAjuB,EAAAxY,OAAAwY,EAAAzU,IAAAqG,GAEA,IAAAA,EAAA7I,QAAA4I,KAAAC,GAAA,IAEA,OADAA,EAAAyqC,OAAA,EACApO,EAAAzmC,EAAA+D,EAAAqG,MAKA,GAAApK,EAAA,CAEA,IADAgF,GAAA,IAAAoF,EAAAuwB,MAAAkV,EAAAv/B,IAAAtQ,GAAA,SACA+D,GAAAiB,EAAAjB,MAAAA,MAAAqG,EAAA6mC,UAAAjsC,EAAAisC,WAAA7mC,EAAA6mC,UAEA,OADA/oC,QAAAqB,MAAA,sCAAArG,OAAAlD,EAAAW,UAAA,EAAA,KACAqB,EAAAoH,KAAApE,GAEAkD,QAAAqB,MAAA,kCAAArG,OAAAlD,EAAAW,UAAA,EAAA,KACAqE,EAAA,CACAhF,OAAAA,EACA+D,IAAAA,QAIAmE,QAAAqB,MAAA,2CAAArG,OAAAa,IACAiB,EAAA,CACAjB,IAAAA,GAGAqG,EAAA6mC,WACAjsC,EAAAisC,SAAA7mC,EAAA6mC,UAGA,IACAtuC,EACAob,EAFAtH,EAAAC,KAAAD,MAIA,OAAAzU,EAAA6P,IAAA,CAGA/E,EAAAnK,aACA6B,MAAA,SAAAL,GACAxB,EAAAwB,KAIA2I,EAAAqN,WAAA2D,SAAA,GACAtZ,MAAA,SAAAsZ,GACAC,EAAAD,EAAAC,cAEAlX,OAAA,SAAA6B,GAEA,IAAAA,GAAAA,EAAA+B,OAAAlI,EAAAmI,WAAAsT,iBAIA,MAAAtV,EAHAqV,EAAAlH,OAAAurB,MAAAC,UAQAoQ,EAAAztC,GAAA,IAAAoF,EAAAuwB,OAGAoY,EAAA/yC,EAAA+D,KAGAS,MAAA,SAAAL,GACA,IAAA2wC,EAAA3wC,EAAA,GAGA,IAAAa,EAAAkM,aAAAnN,IAIA,OAHAmE,QAAAqB,MAAA,uDACAhI,QAAA0S,MAAAjP,EAAA8vC,eACA9vC,EAAAonC,OAIA,IAAA+G,EAAAnuC,EAAAkM,aAAAnN,IAAA,IAAAiB,EAAAkM,aAAAm/B,KAAAgB,UAEA,OAAArvC,EAAA6P,IAAA,CAEA+hC,EAAArxC,EAAA4M,IAAAm9B,aAAAtnC,EAAAhF,OAAA80C,EAAA1I,OAAA0I,EAAA1I,OAAAntC,eAAAk0C,GAAA,KAAAxwC,EAAAob,GAAA,GACAvZ,MAAA,SAAAL,GACAa,EAAA+vC,cAAA5wC,EAAA6C,MACAhC,EAAAgwC,sBAAA7wC,EAAAooC,QACAvnC,EAAAiwC,oBAAA9wC,EAAAvC,SAIAgyC,EAAArxC,EAAA4M,IAAAk9B,YAAArnC,EAAAhF,OAAA80C,EAAA1I,OAAA0I,EAAA1I,OAAAsH,oBAAA,KAAA/wC,EAAAob,GAAA,GACAvZ,MAAA,SAAAL,GACAa,EAAAkwC,WAAA/wC,EAAA6C,MACAhC,EAAAmwC,mBAAAhxC,EAAAooC,QACAvnC,EAAAowC,iBAAAjxC,EAAAvC,cAIA4C,MAAA,WAWA,OARAQ,EAAAkM,aAAA8gC,0BAAAhtC,EAAAgwC,sBAAAhwC,EAAAgwC,sBAAA92C,OAAA8G,EAAAkM,aAAA8gC,0BAEAhtC,EAAAkM,aAAArS,QAAA0C,QAAAoC,UAAAqB,EAAAkM,aAAArS,SAAAmG,EAAAkM,aAAArS,QAAAmG,EAAAnG,QAtJA,SAAAmG,GAEAA,EAAAkM,aAAArS,gBACAmG,EAAAkM,aAAAm/B,KAAAiB,QACAtsC,EAAAkM,aAAA8hC,YACAqC,EAAArwC,EAAA,CAAA+T,KAAA,QAAApZ,QAAA,mCAAA21C,cAAA,CAAAC,eAAAvwC,EAAAkM,aAAA8hC,cACA9qC,QAAAqB,MAAA,+CAAArG,OAAA8B,EAAAjB,IAAAiB,EAAAkM,aAAA8hC,eAGAqC,EAAArwC,EAAA,CAAA+T,KAAA,QAAApZ,QAAA,2BACAuI,QAAAqB,MAAA,wCAAArG,OAAA8B,EAAAjB,QAGAiB,EAAAkM,aAAA4gC,0BACA9sC,EAAAkM,aAAAm/B,KAAAiB,QACA+D,EAAArwC,EAAA,CAAA+T,KAAA,QAAApZ,QAAA,sCACAuI,QAAAqB,MAAA,8CAAArG,OAAA8B,EAAAjB,OAEAiB,EAAAkM,aAAAm/B,MAAArrC,EAAAkM,aAAAm/B,KAAAiB,QACAtsC,EAAAiM,WACAokC,EAAArwC,EAAA,CAAA+T,KAAA,QAAApZ,QAAA,sCACAuI,QAAAqB,MAAA,2DAAArG,OAAA8B,EAAAjB,OAGAiB,EAAAkM,aAAAugC,SACA4D,EAAArwC,EAAA,CAAA+T,KAAA,QAAApZ,QAAA,2BACAuI,QAAAqB,MAAA,0CAAArG,OAAA8B,EAAAjB,OAEAiB,EAAAkM,aAAA6/B,2BAAA,GACAsE,EAAArwC,EAAA,CAAA+T,KAAA,QAAApZ,QAAA,4CAAA21C,cAAAtwC,EAAAkM,eACAhJ,QAAAqB,MAAA,oDAAArG,OAAA8B,EAAAjB,IAAAiB,EAAAkM,aAAA6/B,+BAEA/rC,EAAAkM,aAAAq/B,UAAAvrC,EAAAkM,aAAAs/B,iBACA6E,EAAArwC,EAAA,CAAA+T,KAAA,QAAApZ,QAAA,kCACAuI,QAAAqB,MAAA,kDAAArG,OAAA8B,EAAAjB,QAEAiB,EAAAiM,UAAAjM,EAAAkM,aAAA8/B,cACAqE,EAAArwC,EAAA,CAAA+T,KAAA,OAAApZ,QAAA,oCAoHA61C,CAAAxwC,GAGAwQ,EAAAxQ,KAAAkR,aAAAuT,KAAAzkB,GACA6B,OAAA,SAAA6B,GACAR,QAAAqB,MAAA,0DACArB,QAAAtG,MAAA8G,SAGAlE,MAAA,WACA,GAAAQ,EAAAhF,OAGA,OAFA6vC,EAAAhQ,IAAA76B,EAAAhF,OAAAgF,GACAkD,QAAAqB,MAAA,kBAAAvE,EAAAhF,OAAAW,UAAA,EAAA,GAAA,eAAA+V,KAAAD,MAAAA,GAAA,MACAzR,MAIA85B,EAAA,SAAApP,EAAAtlB,GACA,IAAAslB,GAAAA,EAAAvoB,SAAAuoB,EACA,OAAA1tB,EAAAoH,UAAAxC,GAIA,IAAA6uC,EAAA/lB,EAAA+O,QAAA,cAAA,IAiDA,OA/CAgX,GADAA,EAAAA,EAAAhX,QAAA,qBAAA,KACAA,QAAA,OAAA,KAAAt3B,QAEAiD,EAAAA,GAAA,IACAsrC,aAAAn0C,QAAAoC,UAAAyG,EAAAsrC,cAAAtrC,EAAAsrC,YACAtrC,EAAAurC,gBAAAp0C,QAAAoC,UAAAyG,EAAAurC,iBAAAvrC,EAAAurC,eACAvrC,EAAAwrC,iBAAAr0C,QAAAoC,UAAAyG,EAAAwrC,iBAAAxrC,EAAAwrC,gBAGAH,EAIAzzC,EAAA6P,IACA4jC,EAAA51C,MAAA,KAAAqE,QAAA,SAAAC,EAAAurB,GAEA,OADAxnB,QAAAqB,MAAA,0BAAAmmB,EAAA,KACAvrB,EAAAC,OAAA7B,EAAA4M,IAAAi9B,OAAA,CAAAtN,OAAApP,OACA,KACAlrB,MAAA,SAAAL,GACA,OAAAA,EAAAD,QAAA,SAAA8rC,EAAA7rC,GACA,OAAA6rC,EAAA5rC,OAAAD,EAAAsqC,QAAAvqC,QAAA,SAAA8rC,EAAA7rC,GACA,OAAA6rC,EAAA5rC,OAAAD,EAAA0W,KAAA3W,QAAA,SAAA2W,EAAAq1B,GACA,IAAA2F,EAAA3F,EAAAG,KAAAgB,UAAAxxC,MAAA,IAAA,GACAhB,GAAAqxC,EAAArxC,SAAAqxC,EAAA6B,eACA,OAAA3nC,EAAAwrC,gBAAA/2C,EASAgc,EARAA,EAAAzW,OAAA,CACAL,IAAAmsC,EAAAnsC,IACA/D,OAAAmE,EAAAnE,OACAT,OAAAs2C,EAAA,GACAr2C,KAAAq2C,EAAA,GACAh3C,QAAAA,MAIA,OACA,OACA,OAEAgI,OAAA,SAAA6B,GACA,GAAAA,GAAAA,EAAA+B,OAAAlI,EAAAmI,WAAAkgC,qBACA,MAAA,GAGA,MAAAliC,KAjCA1G,EAAAoH,KAAA,KAuCA5E,MAAA,SAAAwrC,GACA,IAAA5lC,EAAAurC,eAEA,OAAAvrC,EAAAsrC,YAAA3F,EAAAC,GAAAA,EAEA,IAAA8F,EAAA9F,EAAA9xC,OAEA,OAAAsX,EAAAxQ,KAAAkR,aAAA4oB,OAAApP,EAAAsgB,EAAA,UACAxrC,MAAA,WAGA,GAAAwrC,EAAA9xC,OAAA43C,GACA33C,EAAAoa,OAAAy3B,GAAA,SAAAE,GACA,OAAAA,EAAAnsC,KAAAmsC,EAAAlwC,UAEA9B,OACA,OAAAqE,EAAA4M,IAAAqJ,OAAAqC,OACArW,MAAA,SAAAqW,GACA1c,EAAAN,QAAAmyC,GAAA,SAAAE,IACAA,EAAAnsC,KAAAmsC,EAAAlwC,SACAkwC,EAAAnsC,IAAA8W,EAAAq1B,EAAAlwC,kBAOAwE,MAAA,WAEA,OAAA4F,EAAAsrC,YAAA3F,EAAAC,GAAAA,SA0CA+F,EAAA,SAAA/O,EAAAzc,EAAAxf,EAAAirC,GACA,OAAAh0C,GAAA,SAAA0e,EAAAC,GACA,IAAAmB,EAAA,GACA9G,EAAA,GACA7c,EAAAqZ,KAAAwvB,EAAApa,MAAArC,EAAAA,EAAAxf,IAAA,SAAAxL,GACAyb,EAAAF,KACAvY,EAAA4X,WAAAT,MAAA,CAAAA,MAAAna,IACAiF,MAAA,SAAAkV,GACAA,GAAAA,EAAAnb,SACAJ,EAAAqZ,KAAAkC,EAAAnb,SAAA,SAAA03C,GACA,IAAAr2C,EAAAq2C,EAAAp2C,MAAA,KACAq2C,EAAAt2C,EAAAA,EAAA1B,OAAA,GAAA,IAAA0B,EAAA,GACAkiB,EAAAhH,KAAA,CACAxb,GAAA42C,EACAnyC,IAAAnE,EAAAA,EAAA1B,OAAA,GACA8B,OAAAJ,EAAA,GACAu2C,WAAAz8B,EAAAqE,WACArE,MAAAA,EAAAna,mBAOAyC,EAAA6P,IAAAmJ,GACAxW,MAAA,WACAsd,EAAA5jB,OAAA83C,GAAAzrB,EAAAyc,EAAA9oC,OAAA,EACAkD,GAAA,WACA20C,EAAA/O,EAAAzc,EAAAxf,EAAAA,EAAAirC,EAAAl0B,EAAA5jB,QACAsG,MAAA,SAAAL,GACAuc,EAAAoB,EAAA1d,OAAAD,OAEA0C,OAAA,SAAA6B,GACAiY,EAAAjY,QAEA,KAGAgY,EAAAoB,MAGAjb,OAAA,SAAA6B,GACAA,GAAAA,EAAA+B,QAAAlI,EAAAmI,WAAAuP,gBACAyG,EAAAoB,GAGAnB,EAAAjY,UA6GA0tC,EAAA,SAAAC,EAAA9rB,EAAAxf,GACA,OAAA/I,GAAA,SAAA0e,EAAAC,GACA,IAAAmB,EAAA,GACAw0B,EAAA,GACAt7B,EAAA,GACA7c,EAAAqZ,KAAA6+B,EAAAzpB,MAAArC,EAAAA,EAAAxf,IAAA,SAAAwrC,GACAv7B,EAAAF,KACAgkB,EAAAyX,EAAA,CACAb,aAAA,EACAC,gBAAA,IAEAnxC,MAAA,SAAAwrC,GACAA,GAAAA,EAAA9xC,SACA4jB,EAAAkuB,EAAA9rC,QAAA,SAAAC,EAAA+rC,GACA,OAAAoG,EAAApG,EAAAlwC,QAIAmE,GAHAmyC,EAAApG,EAAAlwC,SAAA,EACAmE,EAAAC,OAAA8rC,MAGApuB,WAKA9f,EAAA6P,IAAAmJ,GACAxW,MAAA,WACA+lB,EAAA8rB,EAAAn4C,OAAA,EACAkD,GAAA,WACAg1C,EAAAC,EAAA9rB,EAAAxf,EAAAA,GACAvG,MAAA,SAAAwrC,GACAA,GAAAA,EAAA9xC,OAIAwiB,EAAAsvB,EAAA9rC,QAAA,SAAAC,EAAA+rC,GACA,OAAAoG,EAAApG,EAAAlwC,QAIAmE,GAHAmyC,EAAApG,EAAAlwC,SAAA,EACAmE,EAAAC,OAAA8rC,MAGApuB,IATApB,EAAAoB,MAWAjb,OAAA,SAAA6B,GACAiY,EAAAjY,QAEAnG,EAAAY,UAAAwmC,qBAGAjpB,EAAAoB,MAGAjb,OAAA,SAAA6B,GACAA,GAAAA,EAAA+B,QAAAlI,EAAAmI,WAAAuP,gBACAyG,EAAAoB,GAGAnB,EAAAjY,UAaA8tC,EAAA,SAAAxG,EAAAyG,EAAAC,GAEAD,EAAAA,GAAA,SAEA,IAAAz7B,EAAA,GASA,OARA07B,GAAA17B,EAAAF,KAAAvY,EAAA4M,IAAAqJ,OAAAqC,QAEAG,EAAAF,KAAAtF,EAAAxQ,KAAAkR,aAAA4oB,OAAA,KAAAkR,EAAAyG,GACA5vC,OAAA,SAAA6B,GACAR,QAAAqB,MAAA,sDACArB,QAAAtG,MAAA8G,OAGA1G,EAAA6P,IAAAmJ,GACAxW,MAAA,SAAAL,GACA,IAAAuyC,EAAA,CACA,IAAAC,EAAAxyC,EAAA,GAEAhG,EAAAN,QAAAmyC,GAAA,SAAAhrC,IACAA,EAAAjB,KAAAiB,EAAAyxC,KACAzxC,EAAAjB,IAAA4yC,EAAA3xC,EAAAyxC,IAEAzxC,EAAAjB,KAAAiB,EAAAjB,KAAAiB,EAAA8F,aACA9F,EAAA8F,SAMA,OAAAklC,MAIAqF,EAAA,SAAArwC,EAAAwG,IACAA,EAAAA,GAAA,IACAuN,KAAAvN,EAAAuN,MAAA,OACAvN,EAAA7L,QAAA6L,EAAA7L,SAAA,GACA6L,EAAA8pC,cAAA9pC,EAAA8pC,eAAA,GACAtwC,EAAA4xC,OAAA5xC,EAAA4xC,QAAA,GACA5xC,EAAA4xC,OAAA97B,KAAAtP,IAgBA,OANAgK,EAAAyB,cAAA,OAAA,QACAzB,EAAAyB,cAAA,OAAA,UAGA1U,EAAAiT,IAAAI,KAAAilB,GAAAoN,KAAA91B,GAXA,WACAjK,QAAAqB,MAAA,2BACAs0B,EAAA3C,MAzpCA,YAkqCAx9B,MAEA,CACA+rB,KAAAgd,EACAgM,iBAAAA,EACA3T,OAAAA,EACAiO,UAhUA,SAAAxiB,EAAAxf,GAGA,IAAA8rC,EACA,OAHAtsB,EAAAA,GAAA,EACAxf,EAAAA,GAAA,GAEA/I,EAAA6P,IAAA,CACA/E,EAAAqN,WAAA2D,SAAA,GACAtZ,MAAA,SAAAkV,GACAm9B,EAAAn9B,EAAA8sB,cAAA,KAEAjkC,EAAA4X,WAAAC,MAAA2yB,cAEAvoC,MAAA,SAAAL,GAEA,MADAA,EAAAA,EAAA,KACAA,EAAA2d,QAAA3d,EAAA2d,OAAAklB,QAAA7iC,EAAA2d,OAAAklB,OAAA9oC,QAAA,OAAA,KACA,IAAA8oC,EAAA7oC,EAAA0hB,OAAA1b,EAAA2d,OAAAklB,QAAA,SAAAzD,GACA,OAAAA,KAEA,OAAAwS,EAAA/O,EAAA,EAAA,EAAAzc,EAAAxf,MAEAvG,MAAA,SAAAwrC,GACA,OAAAA,GAAAA,EAAA9xC,QAGA8xC,EAAAG,EAAAH,EAAAzlB,EAAAxf,GAGAyrC,EAAAxG,EAAA,UAAA,IALA,QAOAxrC,MAAA,SAAAwrC,GACA,MAAA,CACA8G,KAAA9G,EACA6G,MAAAA,OAkSAtK,QAxOA,SAAAhiB,EAAAxf,GACAwf,EAAAA,GAAA,EACAxf,EAAAA,GAAA,GACA,IAAA0L,EAAAC,KAAAD,MACA,OAAAzU,EAAA6P,IAAA,CACAtP,EAAA4M,IAAAqJ,OAAAqC,OACAtY,EAAA4M,IAAAqJ,OAAA+zB,UACA/nC,MAAA,SAAAL,GACA,OAAAA,EAAA4yC,aAAA5yC,EAAA4yC,YAAA74C,OAAAiG,EAAA4yC,iBAAAnwC,OAGApC,MAAA,SAAAL,GACA,IAAA0W,EAAA1W,EAAA,GACA4yC,EAAA5yC,EAAA,GACA,GAAA4yC,EAAA,CAEA,IAAAC,EAAA,GACAC,EAAA,GACA94C,EAAAN,QAAAk5C,GAAA,SAAAG,GACA,GAAA,MAAAA,EAAApK,aAAAjyB,EAAAq8B,EAAAl3C,QAAA,CACA,IAAAkwC,EAAA,CACAnsC,IAAAmzC,EAAAnzC,IACA/D,OAAAk3C,EAAAl3C,OACA0Z,MAAAw9B,EAAAh8B,YACAi8B,UAAAD,EAAAC,WAEAC,EAAAH,EAAAC,EAAAl3C,QACA,GAAAo3C,GAAAlH,EAAAx2B,MAAA09B,EAAA19B,MACA,OAEAu9B,EAAA/G,EAAAlwC,QAAAkwC,EACA8G,EAAA9G,EAAAx2B,OAIAs9B,EAAA9G,EAAAx2B,OAAAoB,KAAAo1B,GAHA8G,EAAA9G,EAAAx2B,OAAA,CAAAw2B,GAOAkH,IACAJ,EAAAI,EAAA19B,OAAAs9B,EAAAI,EAAA19B,OAAAxV,QAAA,SAAAC,EAAAkzC,GACA,OAAAA,EAAAr3C,QAAAo3C,EAAAp3C,OAAAmE,GACAA,GAAA,IAAAC,OAAAizC,KACA,MACA,OAAAL,EAAAI,EAAA19B,eACAs9B,EAAAI,EAAA19B,YAMA,IAAAs2B,EAAA7xC,EAAAod,OAAA07B,GACAJ,EAAA7G,EAAA9xC,OAGA8oC,GADAgJ,EAAAG,EAAAH,EAAAzlB,EAAAxf,IACA7G,QAAA,SAAAC,EAAAkzC,GACA,OAAAlzC,EAAAC,OAAAizC,EAAA39B,SACA,IAEA,OAAA1X,EAAA6P,IAAA,CAEAtP,EAAA4X,WAAA6sB,OAAA7oC,EAAAyhB,KAAAonB,IACAxiC,MAAA,SAAAwiC,GAEA7oC,EAAAN,QAAAmpC,GAAA,SAAAttB,GACAvb,EAAAN,QAAAm5C,EAAAt9B,EAAAna,SAAA,SAAA2wC,GACAA,EAAAgB,QAAAx3B,EAAAqE,WACA,IAAArE,EAAAna,QAAA2wC,EAAAiH,YAAAz9B,EAAAla,OACA61C,EAAAnF,EAAA,CAAAn3B,KAAA,QAAApZ,QAAA,yCACAuI,QAAAqB,MAAA,qDAAArG,OAAAgtC,EAAAnsC,gBAOAyyC,EAAAxG,EAAA,UAAA,KAEAxrC,MAAA,WAEA,OADA0D,QAAAqB,MAAA,yDAAArG,OAAA8sC,GAAAA,EAAA9xC,QAAA,EAAA24C,EAAAngC,KAAAD,MAAAA,IACA,CACAqgC,KAAA9G,EACA6G,MAAAA,WAuJAhlC,IAjJA,WAEA,OAAAukC,EADA,CAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,KACA,EAAA7zC,EAAAY,UAAAumC,qBACAllC,MAAA,SAAAwrC,GACA,OAAAwG,EAAAxG,EAAA,UAAA,MAEAxrC,KAAAurC,GACAvrC,MAAA,WACA,MAAA,CACAsyC,KAAA9G,OACA6G,MAAA7G,OAAA9xC,YAwIAsD,OArEA,SAAA0uC,EAAAuG,EAAAC,GACA,OAAAF,EAAA,CAAAtG,GAAAuG,EAAAC,GACAlyC,MAAA,SAAAL,GACA,OAAAA,EAAA,OAmEAqyC,UAAAA,EAEAhhC,IAAAA,MCvrCAjU,QAAA0Q,OAAA,qBAAA,CAAA,QAAA,sBACA,2BAAA,wBAEAC,QAAA,OAAA,CAAA,KAAA,WAAA,UAAA,aAAA,YAAA,UAAA,MAAA,MAAA,WAAA,aAAA,QAAA,aAAA,SAAAlQ,EAAAZ,EAAAk2C,EAAAhlC,EAAAilC,EAAAj1C,EAAAC,EAAA6P,EACAvF,EAAApK,EAAA+0C,EAAA1qC,GAGA,IACA0I,EAAA,IAAApD,EAAA1U,KAAA,QAEA,SAAA+5C,EAAAz3C,EAAA03C,EAAA51B,EAAA61B,EAAAC,GACAF,GAAAA,EAAAx5C,QAEAC,EAAAN,QAAA65C,GAAA,SAAAhpC,GACA,GAAA,OAAAA,EAAA8kC,cAAAoE,EAAA,CACA,IAMAC,EAEAC,EARAC,GAAA,EACAC,EAAAtpC,EAAAupC,QAAA/zC,QAAA,SAAAC,EAAAqrB,GAEA,OADAuoB,EAAAA,GAAAvoB,IAAAxvB,EACAwvB,IAAAxvB,EAAAmE,EAAAC,OAAAorB,GAAArrB,IACA,IACA+zC,EAAA,GAEAlL,EAAA,GAGA3F,EAAA34B,EAAAypC,QAAAj0C,QAAA,SAAAk0C,EAAAjK,EAAAkK,GAEA,IAAAC,EAAA,iBAAAnK,EAAAA,EAAAtuC,MAAA,IAAA,GAAA,CAAAsuC,EAAA9G,OAAA8G,EAAA7G,KAAA6G,EAAAoK,YACAV,EAAA18B,SAAAm9B,EAAA,IACA,IAAAE,EAAAC,EAAAt9B,SAAAm9B,EAAA,IAAAT,GACAa,EAAAJ,EAAA,GACAK,EAAAp2C,EAAAnC,OAAAmrC,cAAAjrC,KAAAo4C,GAGA,GAAAC,EAAA,CACA,IAAAC,EAAAD,EAAA,GACA,GAAAC,IAAA54C,EAAA,CACA,IAAA+3C,EACA,OAAAK,EAAAI,EAGA,OAAA9pC,EAAA8kC,cACAxG,EAAAlyB,KAAA,CACAusB,OAAAlsB,SAAAm9B,EAAA,IACAhR,KAAAuQ,EACA9+B,KAAA,IACA8/B,WAAAnqC,EAAAlP,KACA64C,QAAAA,EACAS,UAAA,EACAP,WAAAG,SAWA,GAHA,KAAAE,GAAAz6C,EAAA46C,SAAAf,EAAAY,IACAV,EAAAp9B,KAAA89B,GAEAb,EAEA,OAAAK,EAAAI,OAOA,IAAA,IAAAE,EAAA57B,QAAA,OAAA9c,EAAA,KAAA,CACA,IAAAg5C,EAAAz2C,EAAAmM,GAAA4+B,qBAAAoL,GACA,GAAAM,EAgBA,OAdAhM,EAAAlyB,KAAAvZ,QAAA0S,MAAA,CACAozB,OAAAlsB,SAAAm9B,EAAA,IACAhR,KAAAuQ,EACA9+B,KAAA,IACA8/B,WAAAnqC,EAAAlP,KACA64C,QAAAA,EACAE,WAAAG,EACAI,UAAA,GACAE,IACAA,EAAA3R,OAAAmR,GACAV,EAAAA,GAAA,IACAh9B,KAAAk+B,GACA9wC,QAAAqB,MAAA,0BAAAyvC,GAEAZ,EAAAI,EAGA,OAAAJ,IACA,GAEAa,EAAA5R,EAAA,EAAA2Q,EAAAE,EACA1F,EAAA9jC,EAAA8jC,MAAA9jC,EAAAwqC,eAGAC,EAAA,IAAA9R,GAAAA,EAAA,IAAA34B,EAAAlP,KAAA,IAAAgzC,EACA,GAAA2G,IAAAxB,EAAAwB,GAAA,CACAxB,EAAAwB,IAAA,EACA,IAAAC,EAAA,CACA5G,KAAAA,EACAnL,OAAAA,EACArnC,OAAA,IAAAi5C,EAAA/6C,OAAA+6C,EAAA,QAAAryC,EACA0vC,QAAA2C,EAAA/6C,OAAA,EAAA+6C,OAAAryC,EACAyyC,QAAA3qC,EAAA2qC,QACAC,MAAA,EACA95C,KAAAkP,EAAAlP,KACA+5C,SAAA7qC,EAAA6qC,SACA/F,aAAA9kC,EAAA8kC,cAIAuE,GAAA,OAAArpC,EAAA8kC,eACA4F,EAAAI,OAAA9qC,EAAA8qC,OACAJ,EAAApM,QAAAA,GAEA8K,IACAsB,EAAAtB,cAAAA,GAEAh2B,EAAAhH,KAAAs+B,QAOA,SAAAK,EAAAz5C,EAAA05C,GACA,OAAA13C,GAAA,SAAA0e,EAAAC,GAEA,IAAAg5B,EAAA9iC,SAAAurB,MAAAC,OACAqX,EAAAA,GAAAC,EAAAl3C,EAAAuC,KAAAoP,wBACA,IAAA1F,EAAA,CACAy+B,SAAA,GACAyM,WAAA,GACA3M,QAAA,GACA4M,OAAA,IAGAlC,EAAA,GAEA38B,EAAA,CAEAlO,EAAAqN,WAAA2D,SAAA,GAGAvb,EAAAmM,GAAAu+B,QAAAV,QAAA,CAAAvsC,OAAAA,IACAwE,MAAA,SAAAL,GACAszC,EAAAz3C,EAAAmE,EAAA8oC,QAAAC,QAAAx+B,EAAAy+B,SAAAwK,GAAA,GACAF,EAAAz3C,EAAAmE,EAAA8oC,QAAAV,QAAA79B,EAAAy+B,SAAAwK,GAAA,OAKA,GAAA,YAAA+B,EAAA,CACA,IAAAI,EAAA,SAAA31C,GACAszC,EAAAz3C,EAAAmE,EAAA8oC,QAAA8M,KAAArrC,EAAAu+B,QAAA0K,GAAA,GACAF,EAAAz3C,EAAAmE,EAAA8oC,QAAA+M,SAAAtrC,EAAAu+B,QAAA0K,GAAA,IAIA,GAAA+B,EAAA,EAAA,CAIA,IAFA,IAAAO,EAAAx3C,EAAAuC,KAAAqP,yBAEA2K,EADA06B,GAAAA,EAAAO,EACAj7B,EAAAi7B,EAAAN,EAAA36B,GAAAi7B,EACAj/B,EAAAF,KAAAvY,EAAAmM,GAAAu+B,QAAAG,MAAA,CAAAptC,OAAAA,EAAAk6C,KAAAl7B,EAAAm7B,GAAAn7B,EAAAi7B,EAAA,IAAA,GACAz1C,KAAAs1C,IAKA9+B,EAAAF,KAAAvY,EAAAmM,GAAAu+B,QAAAG,MAAA,CAAAptC,OAAAA,EAAAk6C,KAAAP,EAAAA,EAAAM,EAAAE,GAAAR,EAAA,YAAA,GACAn1C,KAAAs1C,SAKA9+B,EAAAF,KAAAvY,EAAAmM,GAAAu+B,QAAAp7B,IAAA,CAAA7R,OAAAA,IACAwE,KAAAs1C,IAKAr3C,EAAAuC,KAAAuP,eAAAmlC,EAAA,GAiBA1+B,EAAAF,KACAtF,EAAAxQ,KAAAkR,aAAAkkC,QAAA,CACAp6C,OAAAA,EACA05C,SAAAA,IAEAl1C,MAAA,SAAAL,GACAA,GAAAA,EAAAjG,QACAC,EAAAN,QAAAsG,GAAA,SAAA2yC,GACApoC,EAAAu+B,QAAAnyB,KAAAg8B,SAIAjwC,OAAA,SAAA6B,GACAR,QAAAqB,MAAA,wDACArB,QAAAtG,MAAA8G,OAOA1G,EAAA6P,IAAAmJ,GACAxW,MAAA,SAAAL,GACA,IAAA2Z,EAAA3Z,EAAA,GAGAuK,EAAAu+B,QAAAn0B,MAAA,SAAAuhC,EAAAC,GACA,OAAAA,EAAA9H,KAAA6H,EAAA7H,QAEA,IAAA+H,EAAA7rC,EAAAu+B,QAAA9L,WAAA,SAAAzyB,GACA,OAAAA,EAAA8kC,cAAA11B,EAAAve,OAAAkD,EAAAuC,KAAA2P,uBAGAjG,EAAAkrC,WAAAW,EAAA,EAAA7rC,EAAAu+B,QAAAjwB,OAAA,EAAAu9B,GAAA,GAEA7rC,EAAAgrC,SAAA,YAAAA,GAAAA,QAAA9yC,EACA8H,EAAA8rC,OAAA9rC,EAAAu+B,QAAA/uC,OAAAwQ,EAAAu+B,QAAA,GAAAuF,KAAA9jC,EAAAgrC,SAEAh5B,EAAAhS,MAEA7H,MAAA8Z,MAIA,SAAA83B,EAAApR,EAAAC,GACA,OAAAA,GAAA,EAAAD,EAAAA,EAAApoB,KAAAC,IAAA,GAAAooB,GAWA,SAAAmT,EAAA34B,EAAAkrB,GACA7uC,EAAA6uC,GAAAnvC,SAAA,SAAAq7B,IATA,SAAAA,EAAA8T,EAAA0N,GACA,IAAAC,EAAAzhB,EAAAngB,KAAA,IAAAmgB,EAAA2f,WAAA,IAAA3f,EAAAmf,QACA92C,QAAAiM,YAAAktC,EAAAC,MACA3N,EAAAlyB,KAAAoe,GACAwhB,EAAAC,GAAA3N,EAAA9uC,OAAA,GAMA08C,CAAA1hB,EAAApX,EAAAkrB,QAAAlrB,EAAA44B,sBAIA,SAAAG,EAAA76C,GACA,OAAAuC,EAAAmM,GAAAs+B,QAAA,CAAAhtC,OAAAA,IACAwE,MAAA,SAAAL,GACA,IAAAa,EAAA,CACAgoC,QAAA,GACA0N,kBAAA,GACAI,QAAA,GASA,OAPA32C,EAAA6oC,SAAA7oC,EAAA6oC,QAAA9uC,SACAC,EAAAN,QAAAsG,EAAA6oC,SAAA,SAAA9T,GACAA,EAAA4f,UAAA,EACA9zC,EAAA81C,SAAArC,EAAAvf,EAAAmO,OAAAnO,EAAAoO,SAEAmT,EAAAz1C,EAAAb,EAAA6oC,UAEAhoC,KAEA6B,OAAA,SAAA6B,GAEA,MADAR,QAAAC,KAAA,sCAAAO,GACAA,KAIA,SAAA+9B,EAAAzmC,EAAA05C,GACA,IAEA10C,EAFAyR,EAAAC,KAAAD,MASA,OAJArV,GAAA,WACA4D,GAAA1C,EAAAZ,QAAAw0B,OAAA,CAAAhF,SAAA,0BACA,KAEAlvB,EAAA6P,IAAA,CAGAgpC,EAAA76C,GAGAy5C,EAAAz5C,EAAA05C,KAGAl1C,MAAA,SAAAL,IAEAa,EAAAb,EAAA,IACAuK,GAAAvK,EAAA,GAEA,IAAA42C,EAAA,GACAC,EAAA,GACAC,EAAAj2C,EAAA81C,QACAI,EAAAl2C,EAAA81C,QAEA,SAAAK,EAAAzsC,GACA,IAAA0sC,EAAA,GACAp0C,GAAA,EACA0H,EAAA24B,OAAA,EACArgC,GAAA,GAIA7I,EAAA4L,KAAA2E,EAAA8qC,QAAA,SAAA6B,GACA,IAAAC,EAAAD,EAAAx7C,MAAA,KAAA+sB,MAAA,GAAAntB,KAAA,KACA87C,EAAAv2C,EAAA01C,kBAAAY,GACA,IAAA/5C,QAAAoC,UAAA43C,GAKA,OADAv0C,GAAA,GACA,EAJAo0C,EAAAtgC,KAAA9V,EAAAgoC,QAAAuO,OAOA7sC,EAAAs+B,SACAyN,EAAAz1C,EAAA0J,EAAAs+B,gBAEAt+B,EAAAs+B,eACAt+B,EAAA8qC,QAEAxyC,GACAk0C,GAAAxsC,EAAA24B,OACA0T,EAAAjgC,KAAApM,GACAvQ,EAAAN,QAAAu9C,GAAA,SAAAliB,GACAA,EAAA4f,UAAA,MAIAkC,EAAAlgC,KAAApM,GAMA,IAFA,IAAA8sC,EAAAx2C,EAAA0J,GAAAy+B,SACA98B,GAAA,EACAmrC,GAAAA,EAAAt9C,QAEAC,EAAAN,QAAA29C,EAAAL,GAGAH,EAAA98C,OAAA,GAAA68C,EAAA78C,OAAA,GAAAmS,GACAmrC,EAAAR,EACAA,EAAA,GACA3qC,GAAA,GAGAmrC,EAAA,KAIAx2C,EAAA0J,GAAA1J,EAAA0J,IAAA,GACA1J,EAAA0J,GAAAy+B,SAAA4N,EAAAjiC,MAAA,SAAAuhC,EAAAC,GACA,OAAAA,EAAA9H,KAAA6H,EAAA7H,QAEAxtC,EAAA0J,GAAAmrC,OAAAmB,EAAAliC,MAAA,SAAAuhC,EAAAC,GACA,OAAAA,EAAA9H,KAAA6H,EAAA7H,QAGAxtC,EAAA81C,QAAAI,EAAA,EAAAD,EAAAC,EAGA,IAAAO,GAAAz2C,EAAA0J,GAAAu+B,SAAA,IAAA7oC,OAAAY,EAAA0J,GAAAkrC,YAAA,GAAA50C,EAAA0J,GAAAy+B,UAAA,GAAAnoC,EAAA0J,GAAAmrC,QAAA,IACA,OAAArC,EAAAhB,UAAAiF,EAAA,UACAj3C,MAAA,WAEA,OADA0D,QAAAqB,MAAA,kCAAAmN,KAAAD,MAAAA,GAAA,MACAzR,QAGA6B,OAAA,SAAA6B,GAEA,MADAR,QAAAC,KAAA,6CAAAO,GACAA,KAyEA,OAFA8M,EAAAyB,cAAA,OAAA,WAEA,CACAwS,KAAAgd,EACAiV,YAvEA,SAAA17C,GAEA,OADAkI,QAAAqB,MAAA,4BAAAvJ,EAAAW,UAAA,EAAA,IACA8lC,EAAAzmC,EAAA,YAsEA27C,oBAlEA,SAAA37C,EAAAoK,GAOA,OALAA,EAAAA,GAAA,IACAsvC,SAAAtvC,EAAAsvC,WAAA,EAEAxxC,QAAAqB,MAAA,6CAAArG,OAAAlD,EAAA8W,OAAA,EAAA,KAEA9U,EAAA6P,IAAA,CACAS,EAAA,CAAA,uBACA,aACA,gBACA,4BACA,yBACA,4BACAxF,EAAAqN,WAAA2D,SAAA,GACA2oB,EAAAzmC,EAAAoK,EAAAsvC,YAEAl1C,MAAA,SAAAsd,GACA,IAAAmP,EAAAnP,EAAA,GACAgmB,EAAAhmB,EAAA,GACA85B,EAAA9T,GAAAA,EAAA/pB,YAAAlH,SAAAurB,MAAAC,OACA9yB,EAAAu4B,GAAAA,EAAAv4B,SAEAvK,EAAA8c,EAAA,GAGA,OAAA9c,GAAAA,EAAA0J,IAAA1J,EAAA0J,GAAAu+B,QAIA36B,EAAA,oBAAA,CAAA/C,SAAAA,EAAAvP,OAAAA,EAAA47C,YAAAA,IACAp3C,MAAA,SAAAq3C,GAEA,IAAAC,EAAAxE,EAAA,iBACAyE,EAAAzE,EAAA,cACA0E,EAAA1E,EAAA,wBAEA7X,EAAA,CACAxO,EAAA,wBACAA,EAAA,cACAA,EAAA,iBACAA,EAAA,0BAAA,KAAA+qB,EAAAzsC,GAAA,IACA0hB,EAAA,4BAEAjmB,EAAAhG,EAAA0J,GAAAu+B,QAAA7oC,OAAAY,EAAA0J,GAAAkrC,YAAA11C,QAAA,SAAAC,EAAAuK,GACA,OAAAvK,EAAAC,OAAA,CACA23C,EAAArtC,EAAA8jC,MACA9jC,EAAA3K,IACA2K,EAAA1O,OACA87C,EAAAptC,EAAA24B,OAAA,KACA,KAAA34B,EAAA4qC,KAAAroB,EAAA,6BAAAviB,EAAA2qC,SAAA,KACA55C,KAAA,KAAA,QACA,CAAAggC,EAAAhgC,KAAA,KAAA,OAEAsH,EAAA,IAAAya,KAAAxW,EAAA,CAAA+N,KAAA,8BACAw+B,EAAA0E,OAAAl1C,EAAA80C,MA5BAv5C,EAAAg0B,MAAAjwB,KAAA,6BAyCAmP,IAAAA,MCndAjU,QAAA0Q,OAAA,yBAAA,CAAA,QAAA,cAAA,sBAAA,yBAAA,wBACA,6BAGAC,QAAA,WAAA,CAAA,KAAA,aAAA,WAAA,aAAA,UAAA,gBAAA,UAAA,MAAA,OAAA,eAAA,iBAAA,SAAA,cAAA,WAAA,MAAA,WAAA,aAAA,YAAA,OAAA,QAAA,OAAA,aAAA,SAAAlQ,EAAAmQ,EAAA/Q,EAAAkR,EAAAglC,EAAAtnB,EAAA1tB,EACA8P,EAAA8pC,EAAA7pC,EAAAqwB,EAAAlgC,EACAL,EAAAC,EAAAG,EAAAsK,EAAApK,EAAA80C,EAAA/1B,EAAAg2B,EAAA2E,EAAArvC,GAGA,IACA2d,EADA2xB,EAAA75C,EAGA,SAAA85C,EAAA/8C,EAAAiD,GAGA,IACA8tB,EAeAxb,EACAwD,EACA9C,EACApC,EACAmpC,EAlBAn5C,GAHAZ,EAAAA,GAAA65C,GASAj5C,UAAAsmC,iBANAtmC,EAOAZ,EAAAY,UAAAsmC,iBAPAtmC,EAQAZ,EAAAY,UAAAsmC,iBARAtmC,EASAZ,EAAAY,UAAAsmC,iBATAtmC,EAUAZ,EAAAY,UAAAsmC,iBAGAzkC,EAAA,GAMAu3C,GAAA,EACA/mC,EAAA,IAAApD,EAAA1U,KAAA,YAAA4B,GAEAinC,EAAA,SAAAhiC,GACAS,EAAAkc,QAAA,EACAlc,EAAAhF,OAAA,KACAgF,EAAAuvB,OAAA,KAEAvvB,EAAAjB,IAAA,KACAiB,EAAAw3C,UAAA,KACAx3C,EAAAy3C,MAAA,KACAz3C,EAAA01C,kBAAA,KACA11C,EAAA+Y,WAAA,KACA/Y,EAAAkM,aAAA,GACAlM,EAAAisC,SAAA,KACAjsC,EAAAksC,QAAA,KACAlsC,EAAA03C,SAAA,KACA13C,EAAAiM,UAAA,EACAjM,EAAA4xC,OAAA,GAGA5xC,EAAAgpC,SAAA,GAGAhpC,EAAA23C,cAAA,KAEAC,IACAC,IAEAtnC,GAAA,EACApC,OAAAvM,EAEArC,EACAiR,EAAAxQ,KAAA0Q,MAAAnR,KAAAS,IAGA83C,KAAAjoC,IAAAA,EAAAhN,iBACApF,EAAAgV,QAEAjC,EAAAxQ,KAAA0Q,MAAA+B,MAAAzS,KAIA43C,EAAA,WACA53C,EAAAuB,QAAA,CACAmD,OAAA,KACAhD,OAAA,OAsBAm2C,EAAA,WAhBA73C,EAAAgoC,aAAApmC,EACA5B,EAAA01C,uBAAA9zC,EACA5B,EAAA81C,QAAA,EAKA91C,EAAA0J,GAAA1J,EAAA0J,IAAA,GACA1J,EAAA0J,GAAAu+B,QAAA,GACAjoC,EAAA0J,GAAAy+B,SAAA,GACAnoC,EAAA0J,GAAAkrC,WAAA,GACA50C,EAAA0J,GAAAmrC,OAAA,UACA70C,EAAA0J,GAAAgrC,gBACA10C,EAAA0J,GAAA8rC,QAUAsC,EAAA,WACA,MAAA,YAAAx9C,GAGAy9C,EAAA,WACA,OAAA/3C,EAAA23C,eAAA33C,EAAA23C,cAAAp2B,OAAAvhB,EAAA23C,cAAA3xC,SAcAyvC,EAAA,SAAAzN,GACAhoC,EAAAgoC,QAAAhoC,EAAAgoC,SAAA,GACAhoC,EAAA01C,kBAAA11C,EAAA01C,mBAAA,GACAv8C,EAAA6uC,GAAAnvC,SAAA,SAAAq7B,IAdA,SAAAA,EAAA8T,EAAA0N,GACA,IAAAC,EAAAzhB,EAAAngB,KAAA,IAAAmgB,EAAA2f,WAAA,IAAA3f,EAAAmf,QACA92C,QAAAiM,YAAAktC,EAAAC,MACAzhB,EAAAqf,YACArwC,QAAAC,KAAA,oDAAA+wB,GAEA8T,EAAAlyB,KAAAoe,GACAwhB,EAAAC,GAAA3N,EAAA9uC,OAAA,GAQA08C,CAAA1hB,EAAAl0B,EAAAgoC,QAAAhoC,EAAA01C,uBAKA74C,EAAA,SAAAuI,GACA,IAAAmL,EACA,OAAApC,GAAAgD,MACA3R,MAAA,WACA,OAAA3C,EAAAuI,MAIA,IAAA4yC,GAAAr7C,IACAs7C,EAAA7yC,IAAAA,EAAA7G,OAAAD,KAAA8G,EAAA8yC,WAGA,IAAAF,IAAAC,EACA,OAAAE,GAAA/yC,GAGApI,EAAAoH,KAAApE,GAFAyhC,GAAAr8B,GAIA,IAEAgzC,EAFAl4C,EAAAzC,EAAAuC,KAAAC,aAAA,EAGA,OAAAmF,GAAAA,EAAAgzC,SAAAp7C,EAAAoH,KAAAgB,EAAAgzC,UAAA56C,EAAAy6B,UAAA7yB,IACA5F,MAAA,SAAAL,GACA,IAAAA,IAAAA,EAAAnE,SACAg9C,GAAA74C,EAAAnE,SAAAgF,EAAAhF,QACAi9C,KAAA94C,EAAAoC,UAAApC,EAAAoC,QAAAG,SAAAvC,EAAAoC,QAAAmD,QACA,KAAA,YAcA,GAXA0zC,EAAAj5C,EACAa,EAAAhF,OAAAo9C,EAAAp9C,OACAgF,EAAAjB,IAAAq5C,EAAAr5C,KAAAiB,EAAAjB,IACAiB,EAAAy3C,MAAAryC,GAAA7I,QAAAoC,UAAAyG,EAAAqyC,OAAAryC,EAAAqyC,MAAAz3C,EAAAy3C,MACAv3C,IACAF,EAAAuB,QAAA62C,EAAA72C,SAAA,CACAmD,OAAA,KACAhD,OAAA,OAIAs2C,EAEA,OAAAxnC,EAAAxQ,KAAAkR,aAAAmnC,WAAAr4C,GACA6B,OAAA,SAAA6B,GAEA,MADA69B,IACA79B,KAGAlE,MAAA,WACA,GAAAw4C,EACA,OAAAxnC,EAAAxQ,KAAAkR,aAAArU,MAAAmD,GACA6B,OAAA,SAAA6B,GACAR,QAAAC,KAAA,yDAAAO,YAQAlE,MAAA,WAEA,OAAAw4C,EACAM,KAGAL,EACAM,yBADA,KAKA/4C,MAAA,WAQA,GAPAw4C,GAGAl1C,KAIAm1C,GAAA35C,IAIA,OAFAk6C,eAAA,GAEAhoC,EAAAxQ,KAAAkR,aAAA3S,KAAA2B,EAAAF,EAAAo4C,MAGA54C,MAAA,WAIA,IAAAi5C,GAAAT,GAAA5yC,GAAAA,EAAAszC,QAAA,CAAAA,SAAA,QAAA92C,EACA,IAAAu2C,GAAAM,GACA,OAAAhX,GAAAgX,MAGAj5C,MAAA,WAQA,OAPA4F,GAAAA,EAAApC,OACA1F,EAAAZ,QAAA6D,KAAA,IAGAjD,EAAAZ,QAAA6D,KAAA,KAGAL,EAAAF,EAAAzD,QAAA0S,MAAA,GAAAjP,EAAAo4C,MAEAv2C,OAAA,SAAA6B,GACA,KAAA,UAAAA,GAAA0B,GAAAA,EAAAgzC,UACA,OAAAh8C,GAAA,WACA,OAAAS,EAAAuI,KACA,KAEA,MAAA1B,MAIAi1C,EAAA,WACA,IAAAC,EAAAt6C,IAEA,OAAAtB,GAAA,SAAA0e,EAAAC,GAEA,IAAA3gB,EAAAgF,EAAAhF,OACAumC,IACAsX,GAAA79C,GAGAwV,EAAAxQ,KAAA0Q,MAAAioC,SAEAC,GACApoC,EAAAxQ,KAAA0Q,MAAAooC,SAGAN,eAAA,GAEAxtB,EAAAiH,aAEAvW,QAIA/e,EAAA,WACA,QAAAqD,EAAAhF,QAGAuD,EAAA,SAAA6G,GACA,OAAAmL,GAOAjS,KAAA8G,GAAAA,EAAA8yC,YAIA9yC,EAAAA,GAAA,IACAvG,eAAAlC,KAAAqD,EAAAhF,OACAoK,EAAA7G,MAAA,EACA1B,EAAAuI,IANApI,EAAAoH,KAAApE,IAPAmO,GAAAgD,MACA3R,MAAA,WACA,OAAAjB,EAAA6G,OAcA0zC,EAAA,WACA,OAAA97C,GAAA,SAAA0e,EAAAC,GAEAi8B,IACA90C,KAGA0N,EAAAxQ,KAAA0Q,MAAAooC,SAEAN,eAAA,GAEAxtB,EAAAiH,aAEAvW,QAIApd,EAAA,WACA,OAAA0B,EAAAhF,QAAAgF,EAAAuB,SAAAvB,EAAAuB,QAAAmD,SAAA,GAGAmlB,EAAA,SAAAzkB,GACA,OAAAmL,EAOAjS,IACAtB,EAAAoH,KAAApE,EAAAuB,WAEA6D,EAAAA,GAAA,IACApC,QAAAzG,QAAAoC,UAAAyG,EAAApC,SAAAoC,EAAApC,OACAzE,EAAA6G,GACA5F,MAAA,WACA,OAAAQ,EAAAuB,aAbA4M,GAAAgD,MACA3R,MAAA,WACA,OAAAqqB,EAAAzkB,OAmBA+yC,GAAA,SAAA/yC,GACA,GAAAA,EAAA,CACA,GAAAA,EAAAszC,UAAAtzC,EAAA4iC,QAAA,OAAAhoC,EAAAkc,SAAA,EACA,GAAA9W,EAAA8G,eAAAlM,EAAAkM,aAAAgQ,OAAA,OAAA,EACA,GAAA9W,EAAAsE,IAAAtE,EAAAsE,GAAAZ,UAAA9I,EAAA0J,GAAAgrC,UAAA,YAAA10C,EAAA0J,GAAAgrC,UAAA,OAAA,EACA,GAAAtvC,EAAAsyC,WAAA13C,EAAA03C,SAAA,OAAA,EAEA,OAAA13C,EAAAkc,QAAAlc,EAAAgoC,UAAA,GAGA+Q,GAAA,WACA,GAAA/4C,EAAAkc,OACA,OAAAlc,EAAAhF,UAEAgF,EAAAiM,UACAjM,EAAAkM,aAAAC,mBACAnM,EAAAkM,aAAArS,UACAmG,EAAAkM,aAAAq/B,UACAvrC,EAAAkM,aAAAy/B,WAGA3rC,EAAAgoC,SAAAhoC,EAAAgoC,QAAA9uC,OAAA,GAGA8G,EAAA0J,GAAAu+B,QAAA/uC,OAAA,GACA8G,EAAA0J,GAAAkrC,WAAA17C,OAAA,GACA8G,EAAA0J,GAAAy+B,SAAAjvC,OAAA,GAGA8G,EAAAw3C,WACAx3C,EAAA8F,MACA9F,EAAAg5C,SAIAvB,GAAA,WAAA,QAAAz3C,EAAAy3C,OAQA30C,GAAA,SAAA9H,GAEA,GADAA,EAAAA,GAAA,iBAAAA,EAAAA,EAAAgF,EAAAhF,OACA6U,GAAAA,EAAAhN,gBAAA,CAEA,GAAAlG,KAAAkT,EAAA9P,WAAA,CAEA,IAAA0R,EAAAC,KAAAD,MACAvO,QAAAqB,MAAA,uBAEA,IAAAyR,EAAA,GAqBA,OAlBAnG,EAAA5P,cAAAxC,EAAAU,UAAAgC,wBAAA7B,IACA0X,EAAAF,KAAA4nB,EAAA7C,IA3XA,SA2XA19B,EAAAqE,KAAAC,cAAAzB,EAAAuB,QAAAmD,UAGAsR,EAAAF,KAAA4nB,EAAA7C,IA9XA,SA8XA,OAIA7kB,EAAAF,KAAAzI,EAAAwtB,IArYA,SAqYA76B,EAAAhF,SAGAgF,EAAAjB,IACAiX,EAAAF,KAAAzI,EAAAwtB,IAxYA,MAwYA76B,EAAAjB,MAGAiX,EAAAF,KAAAzI,EAAAwtB,IA3YA,MA2YA,OAGA79B,EAAA6P,IAAAmJ,GACAxW,MAAA,WACA0D,QAAAqB,MAAA,uBAAAmN,KAAAD,MAAAA,GAAA,SAKA,OAAAzU,EAAA6P,IAAA,CACA6wB,EAAA7C,IApZA,SAoZA,MACAxtB,EAAAwtB,IAxZA,SAwZA,MACAxtB,EAAAwtB,IAxZA,MAwZA,MAEA7/B,EAAA0iC,EAAA7C,IAzZA,QAyZA7/B,EAAA,MAAAgC,EAAAoH,SAKA,OAAApH,EAAA6P,IAAA,CACA6wB,EAAA7C,IA9ZA,SA8ZA,MACAxtB,EAAAwtB,IAlaA,SAkaA,MACAxtB,EAAAwtB,IAlaA,MAkaA,MAEA7/B,EAAA0iC,EAAA7C,IAnaA,QAmaA7/B,EAAA,MAAAgC,EAAAoH,OACApJ,EAAAqS,EAAAwtB,IApaA,QAoaA7/B,EAAA,MAAAgC,EAAAoH,UAMAy0C,GAAA,SAAA79C,GAQA,OANAkI,QAAAqB,MAAA,kEAEAm5B,EAAA7C,IA7aA,SA6aA,MACAxtB,EAAAwtB,IAjbA,SAibA,MACAxtB,EAAAwtB,IAjbA,MAibA,MAEAhrB,GAAAA,EAAAhN,gBAEA7H,EAAA0iC,EAAA7C,IApbA,QAobA7/B,EAAA,MAAAgC,EAAAoH,QAGAlB,QAAAqB,MAAA,sDACAvH,EAAA6P,IAAA,CACA7R,EAAA0iC,EAAA7C,IAzbA,QAybA7/B,EAAA,MAAAgC,EAAAoH,OACApJ,EAAAqS,EAAAwtB,IA1bA,QA0bA7/B,EAAA,MAAAgC,EAAAoH,WAMA60C,GAAA,WACA,IAAAt8C,IAAA,KAAA,CAAAhC,QAAA,0BAEA,IAGAqL,EACAkzC,EAJAC,EAAAtpC,GAAAA,EAAAX,0BACAkqC,EApcA,QAocAp5C,EAAAhF,OAMAgF,EAAAq5C,eAAAr5C,EAAAq5C,cAAA7L,QACAxnC,EAAAA,GAAA,IACAqzC,cAAA,CACA7L,KAAAxtC,EAAAq5C,cAAA7L,OAGAxtC,EAAAs5C,aAAAt5C,EAAAs5C,YAAA9L,QACAxnC,EAAAA,GAAA,IACAszC,YAAA,CACA9L,KAAAxtC,EAAAs5C,YAAA9L,OAKAxtC,EAAAgpC,UAAAhpC,EAAAgpC,SAAA9vC,UAEA8M,EAAAA,GAAA,IACAuzC,cAAAv5C,EAAAgpC,SAAA9vC,QAEAggD,EAAAA,GAAA,IAEAlQ,SAAA7vC,EAAAugB,IAAA1Z,EAAAgpC,UAAA,SAAA1/B,GACA,MAAA,CACAtO,OAAAsO,EAAAtJ,KAAAhF,OACA+D,IAAAuK,EAAAtJ,KAAAjB,IACAy4C,UAAAluC,EAAAtJ,KAAAw3C,eAIA,IAAAgC,GAAAxzC,GAAAkzC,IAAApd,KAAA6B,UAAAphC,QAAA0S,MAAA,GAAAjJ,GAAA,GAAAkzC,GAAA,KAGA,OAAAC,GAAAD,EASA56C,IAIAtB,EAAA6P,IAAA,CAEA1P,EAAAqE,KAAA6f,eAEAlkB,EAAA2lB,IAAAvhB,QAAA2jB,gBAAAllB,EAAAuB,SAEAm8B,EAAA7C,IAAAue,EAAAI,GAAA,QAEAh6C,MAAA,SAAAL,GACA,IAAAoiB,EAAApiB,EAAA,GACAoC,EAAApC,EAAA,GAEA,OAAAhC,EAAA2lB,IAAAuC,KAAAyW,KAAA6B,UAAAub,GAAA33B,EAAAhgB,EAAAwgB,MAAAxgB,EAAAugB,OACAtiB,MAAA,SAAAi6C,GAQA,OAPAzzC,EAAAzJ,QAAA0S,MAAAjJ,GAAA,GAAA,CACA2xC,cAAA,CACAp2B,MAAApkB,EAAAqE,KAAAC,cAAA8f,GACAvb,QAAAyzC,KAIApsC,EAAAwtB,IAAAue,EAAAtd,KAAA6B,UAAA33B,UAxBA03B,EAAA7C,IAAAue,EAAAI,GAAA,MATAx8C,EAAA6P,IAAA,CACA6wB,EAAA7C,IAAAue,EAAA,MACA/rC,EAAAwtB,IAAAue,EAAAI,GAAA,SAoCAhoC,GAAA,WACA,OAAAxU,EAAA6P,IAAA,CACA6wB,EAAApyB,IAlhBA,UAmhBA+B,EAAA/B,IAthBA,UAuhBA+B,EAAA/B,IAthBA,SAwhBA9L,MAAA,SAAAL,GACA,IAAAu6C,EAAAv6C,EAAA,GACAnE,EAAAmE,EAAA,GACAJ,EAAAI,EAAA,GACA,GAAAnE,GAAA,QAAAA,EAAA,CAIA,IAAAuG,EACA,GAHA2B,QAAAqB,MAAA,qBAAAvJ,EAAAW,UAAA,EAAA,GAAA,wBAGA+9C,GAAAA,EAAAxgD,QAAA,QAAAwgD,EACA,IACAn4C,EAAA,CACAG,OAAAvE,EAAAqE,KAAAof,cAAA5lB,GACA0J,OAAAvH,EAAAqE,KAAAof,cAAA84B,IAGA,MAAAh2C,GACAR,QAAAC,KAAA,2CAAAO,GACAnC,OAAAK,EASA,OALA5B,EAAAhF,OAAAA,EACAgF,EAAAjB,IAAAA,GAAA,QAAAA,EAAAA,OAAA6C,EACA5B,EAAAuB,QAAAA,GAAA,CAAAG,YAAAE,EAAA8C,YAAA9C,GAGA02C,SAGA94C,MAAA,WAEA,OAAAlB,IACAtB,EAAA6P,IAAA,CACA2D,EAAAxQ,KAAAkR,aAAArU,MAAAmD,GACAw4C,eAAA,GACAhoC,EAAAxQ,KAAAkR,aAAA3S,KAAAyB,KAEA6B,OAAA,SAAA6B,GACAR,QAAAC,KAAA,wDAAAO,MAIA/G,IACA6T,EAAAxQ,KAAAkR,aAAArU,MAAAmD,GACA6B,OAAA,SAAA6B,GACAR,QAAAC,KAAA,yDAAAO,WAHA,KASAlE,MAAA,WACA,OAAAQ,MAIAs4C,GAAA,WACA,IAAA37C,IAAA,KAAA,CAAAhC,QAAA,0BACA,OAAA88C,KAAAz6C,EAAAoH,KAAApE,GAEAhD,EAAA6P,IAAA,CACA6wB,EAAA5sB,UArlBA,QAqlBA9Q,EAAAhF,QACAqS,EAAAyD,UAtlBA,QAslBA9Q,EAAAhF,UAGAwE,MAAA,SAAAL,GACA,IAAAw6C,EAAAx6C,EAAA,GACAy6C,EAAAz6C,EAAA,GACA,OAAAw6C,GAAAA,EAAA3Q,UAAA2Q,EAAA3Q,SAAA9vC,SAAA0gD,EAAAL,cACAM,GAAAF,GACA93C,OAAA,SAAA6B,GAGA,OAFAR,QAAAtG,MAAA,2FAAA8G,GAEAm2C,GAAAD,MAGAC,GAAAD,OAIAC,GAAA,SAAA7zC,GACA,IAAAA,EAAA,OAAAhJ,EAAAoH,OAGA,GAAA4B,EAAAgjC,SAAA,CACA,IAAA8Q,EAAA95C,EAAAu5C,cACAQ,EAAAC,GAAA,CACA/W,MAAA,EACAngC,OAAA,IAGA,IACA,IAAAwuC,EAAA,GACAn4C,EAAAN,QAAAmN,EAAAgjC,UAAA,SAAAiR,GACA,IAAA3I,EAAA2I,EAAAj/C,QAAA,CACAs2C,EAAA2I,EAAAj/C,SAAA,EACA,IAAAsO,EAAA4wC,KACA5wC,EAAAtJ,KAAAhF,OAAAi/C,EAAAj/C,OACAsO,EAAAtJ,KAAAw3C,UAAAyC,EAAAzC,UACAluC,EAAAtJ,KAAAjB,IAAAk7C,EAAAl7C,IACAo7C,GAAA7wC,EAAA,CAAAxG,OAAA,eAGAkD,EAAAgjC,gBAEAhpC,EAAAu5C,cAEA,MAAA71C,GAKA,OAJAR,QAAAtG,MAAA,8CAAA8G,GAEA1D,EAAAu5C,cAAAO,EACA95C,EAAAgpC,SAAA+Q,EACA/8C,EAAA2e,OAAA,CAAAhhB,QAAA,qCAIAxB,EAAAN,QAAAkhD,GAAA,IAAA,SAAAE,GACAA,EAAAhX,UAYA,cAPAj9B,EAAAhL,cACAgL,EAAAjH,IAGAxC,QAAA0S,MAAAjP,EAAAgG,GAGA+xC,KAAAz5C,IACAi6C,kBAAA,CAAAz1C,OAAA,IACAtD,MAAA,WACA,OAAAQ,KAIAhD,EAAAoH,KAAApE,IAOAytC,GAAA,SAAAE,EAAAz0B,GAKA,OAHAkhC,GAAA,gBAGA5H,EAAA/E,iBAAAztC,EAAA2tC,GACA9rC,OAAA,SAAA6B,GAEA,IAAAwV,EAGA,OAFAhW,QAAAtG,MAAA,0DAAA8G,GACApG,EAAAZ,QAAAw0B,OAAA,CAAAhF,SAAA,wBACAuhB,GAAAE,GAAA,GAEA,MAAAjqC,MAIA22C,GAAA,SAAA3F,GACA,OAAAyC,EAAA1yB,KAAAzkB,EAAAhF,OAAA05C,GACAl1C,MAAA,SAAAL,GACA04C,IACAt7C,QAAA0S,MAAAjP,EAAAb,MAEA0C,OAAA,SAAA6B,GAEA,MADAm0C,IACAn0C,MAmBA8sC,GAAA,WACAxwC,EAAAkM,aAAArS,gBACAmG,EAAAkM,aAAAm/B,KAAAiB,QACA+D,GAAA,CAAAt8B,KAAA,OAAApZ,QAAA,uBAAA2/C,QAAA,kBAEAt6C,EAAAkM,aAAA4gC,0BACA9sC,EAAAkM,aAAAm/B,KAAAiB,QACA+D,GAAA,CAAAt8B,KAAA,UAAApZ,QAAA,uCAAA2/C,QAAA,oBAKAt6C,EAAAiM,UAAAjM,EAAAkM,aAAAm/B,MAAArrC,EAAAkM,aAAAm/B,KAAAiB,SACA+D,GAAA,CAAAt8B,KAAA,QAAApZ,QAAA,kCAAA2/C,QAAA,iBACAp3C,QAAAqB,MAAA,qDAAArG,OAAA8B,EAAAjB,QAGAiB,EAAAiM,UAAAjM,EAAAkM,aAAAugC,SACA4D,GAAA,CAAAt8B,KAAA,QAAApZ,QAAA,gCAAA2/C,QAAA,iBACAp3C,QAAAqB,MAAA,gCAAArG,OAAA8B,EAAAjB,OAGAiB,EAAAkM,aAAAC,mBACAkkC,GAAA,CAAAt8B,KAAA,UAAApZ,QAAA,6BAAA2/C,QAAA,kBAIAt6C,EAAAkM,aAAA4/B,wBAAA9rC,EAAAkM,aAAA2hC,cACAwC,GAAA,CAAAt8B,KAAA,OAAApZ,QAAA,wBAAA2/C,QAAA,mBAIAt6C,EAAAkM,aAAAq/B,UAAAvrC,EAAAkM,aAAAs/B,gBACA6E,GAAA,CAAAt8B,KAAA,OAAApZ,QAAA,gCAAA2/C,QAAA,iBAGAt6C,EAAAkM,aAAAw/B,UAEA1rC,EAAAiM,UAAAjM,EAAAkM,aAAAqgC,oBAAA,EACA8D,GAAA,CAAAt8B,KAAA,OAAApZ,QAAA,qCAAA21C,cAAAtwC,EAAAkM,aAAAouC,QAAA,kBAGAt6C,EAAAiM,UAAAjM,EAAAkM,aAAAqgC,oBAAA,GAAAvsC,EAAAkM,aAAA4/B,uBAAA,EACAuE,GAAA,CAAAt8B,KAAA,OAAApZ,QAAA,gDAAA21C,cAAAtwC,EAAAkM,aAAAouC,QAAA,iBAIAjK,GAAA,CAAAt8B,KAAA,OAAApZ,QAAA,gCAAA21C,cAAAtwC,EAAAkM,aAAAouC,QAAA,kBAKAt6C,EAAAkM,aAAA4/B,uBAAA,IACAuE,GAAA,CAAAt8B,KAAA,OAAApZ,QAAA,iCAAA21C,cAAAtwC,EAAAkM,aAAAouC,QAAA,iBAEAt6C,EAAAkM,aAAAy/B,WACA0E,GAAA,CACAt8B,KAAA,OACApZ,QAAA,sCACA21C,cAAAtwC,EAAAkM,aACAouC,QAAA,kBAIAt6C,EAAAkM,aAAA6/B,2BAAA,GACAsE,GAAA,CAAAt8B,KAAA,OAAApZ,QAAA,sCAAA21C,cAAAtwC,EAAAkM,aAAAouC,QAAA,iBAEAt6C,EAAAkM,aAAAy/B,WAAA3rC,EAAAkM,aAAAs/B,gBACA6E,GAAA,CAAAt8B,KAAA,OAAApZ,QAAA,gCAAA21C,cAAAtwC,EAAAkM,aAAAouC,QAAA,iBAGAt6C,EAAAkM,aAAA4/B,wBAAA9rC,EAAAkM,aAAA6/B,6BAAA/rC,EAAAkM,aAAA2hC,cACAwC,GAAA,CAAAt8B,KAAA,OAAApZ,QAAA,wBAAA2/C,QAAA,oBAMAC,GAAA,WAEA,OAAAh9C,EAAA4M,IAAAk9B,YAAA,CAAArsC,OAAAgF,EAAAhF,SACAwE,MAAA,SAAAL,GACAa,EAAA03C,SAAAv4C,EAAAlF,eAAAkF,EAAAlF,eAAAiF,QAAA,SAAAC,EAAAwtC,GACA,OAAA,OAAAA,EAAAwC,QAAAhwC,EAAAA,EAAA,IACA,GAFA,KAIA0C,OAAA,SAAA6B,GACA,GAAAA,GAAAA,EAAA+B,OAAAlI,EAAAmI,WAAAogC,mBACA9lC,EAAA03C,SAAA,MAGA,CAAA,IAAAh0C,GAAA,MAAAA,EAAA+B,MAKA,MAAA/B,EAJAR,QAAAC,KAAA,4EACAnD,EAAA03C,SAAA,OAQA8C,GAAA,WACA,OAAAx6C,EAAAhF,QAAAgF,EAAAuvB,OAAAvyB,EAAAoH,KAAApE,EAAAuvB,SACArsB,QAAAqB,MAAA,mCACAnI,GAAA,WAEA,OADA4D,EAAAuvB,OAAAjyB,EAAAiyB,OAAA2C,IAAAlyB,EAAAhF,QACAgF,EAAAuvB,YAIAkS,GAAA,SAAAr8B,GAEA,IAAA4K,GAAAlI,EAAA9H,KAAA8hC,aAAArkC,EAAAuC,KAAAsJ,QAAA7L,EAAAuC,KAAAsJ,OAAA0G,uBACAhQ,EAAAkc,UAAA9W,IAAAA,EAAAszC,UAAAtzC,EAAApC,QAGA,OAAAs0C,EACAA,EAAA93C,MAAA,WACA,OAAA24C,GAAA/yC,GAAApF,EAAAy6C,GAAAr1C,OAKAkyC,EADAlyC,GAAAA,EAAAszC,QACAgC,GAAAt1C,GAEAA,GAAApF,EAAAkc,OACAu+B,GAAAr1C,GAGAu1C,KAGA39C,EAAA6P,IAAA,CACAyqC,EAGAkD,OAGAh7C,MAAA,WACA,IAAAo7C,EAAA7B,KAEA,QADA/oC,IAAAynC,OAAA,IAAAmD,IAEAt9C,EAAAZ,QAAA6D,OACAf,MAAA,WACA,OAAAlC,EAAAqzB,MAAAC,QAAA,8BAAA,oCAAA,CACAE,WAAA,sBACAtyB,OAAA,wBAGAgB,MAAA,SAAA6L,GACA,OAAAA,EACAstC,IAAAn5C,MAAA,WACA,KAAA,YAKA/B,EAAAuC,KAAAsJ,OAAA0G,sBACAvS,EAAAuC,KAAAsJ,OAAA0G,qBAAA,EACAvS,EAAAqF,UAGA,SAKAtD,MAAA,SAAAoxB,GAEA,GADA0mB,EAAA,KACA1mB,EACA,OAAA5wB,EAIA,KAAA,iBAKA26C,GAAA,SAAAjG,GACA10C,EAAAkc,QAAA,EAEA,IAAAzK,EAAAC,KAAAD,MAGA,OAFAvO,QAAAqB,MAAA,sCAAArG,OAAA8B,EAAAhF,OAAA8W,OAAA,EAAA,KAEA9U,EAAA6P,IAAA,CAGA4gC,IAAA,GACAjuC,MAAA,SAAAQ,GACA,GAAAA,EAAAkM,eAAAlM,EAAAkM,aAAAD,UAAAjM,EAAAkM,aAAAy/B,WAEA,OAAA4O,KAGAv6C,EAAA03C,SAAA,KAKA2C,GAAA3F,GAAA,aAEAl1C,MAAA,WAMA,OAHAgxC,KAGAhgC,EAAAxQ,KAAAkR,aAAAuT,KAAAzkB,GACA6B,OAAA,SAAA6B,GACAR,QAAAtG,MAAA,kEAAA8G,SAGAlE,MAAA,WAMA,OALAQ,EAAAkc,QAAA,EACAhZ,QAAAqB,MAAA,2CAAArG,OAAA8B,EAAAhF,OAAA8W,OAAA,EAAA,GAAAJ,KAAAD,MAAAA,IAGAnU,EAAAZ,QAAA6D,KAAA,KACAP,KAEA6B,OAAA,SAAA6B,GAEA,MADA1D,EAAAkc,QAAA,EACAxY,MAIAg3C,GAAA,SAAAt1C,GAIA,OAHAA,EAAAA,GAAA,IACA8G,aAAA3P,QAAAoC,UAAAyG,EAAA8G,cAAA9G,EAAA8G,cACAlM,EAAAkM,aAAAgQ,QAAA3f,QAAAiM,YAAAxI,EAAAkM,aAAAq/B,UACAnmC,EAAA8G,aAIAuuC,GAAAr1C,GACA5F,MAAA,SAAAQ,GAEA,OADAA,EAAAkc,QAAA,EACAlc,KANAhD,EAAAoH,KAAApE,IAUAy6C,GAAA,SAAAr1C,IACAA,EAAAA,GAAA,CACA8G,cAAA,EACA87B,SAAA,EACAt+B,GAAA,CACAZ,QAAA,EACA4rC,SAAA10C,EAAA0J,IAAA,YAAA1J,EAAA0J,GAAAgrC,SAAA10C,EAAA0J,GAAAgrC,cAAA9yC,GAEA81C,UAAA,EACAlnC,KAAA,IAIAtE,aAAA3P,QAAAoC,UAAAyG,EAAA8G,cAAA9G,EAAA8G,cAAAlM,EAAAkM,aAAAgQ,OAGA3f,QAAAiM,YAAApD,EAAA4iC,UAAA5iC,EAAAsE,IAAAtE,EAAAsE,GAAAZ,SACA1D,EAAA4iC,SAAA,GAGA,IAAAhyB,EAAA,GAEAvE,EAAAC,KAAAD,MA6BA,OA5BAvO,QAAAqB,MAAA,0CAAArG,OAAA8B,EAAAkc,OAAA,aAAA,UAAAlc,EAAAhF,OAAA8W,OAAA,EAAA,IAAA1M,GAGAA,EAAA8G,eAEAkuC,GAAA,gBAEApkC,EAAAF,KACA23B,IAAA,GAGAjuC,KAAAgxC,OAIAprC,EAAA4iC,SAAA5iC,EAAAsE,KAAAtE,EAAAsE,GAAAZ,OAKA1D,EAAA4iC,SAAA5iC,EAAAsE,KAAAtE,EAAAsE,GAAAZ,QAEAkN,EAAAF,KAAAukC,GAAA,YALArkC,EAAAF,KAAAukC,GAAAj1C,EAAAsE,GAAAtE,EAAAsE,GAAAgrC,cAAA9yC,IASAwD,EAAAsyC,UAAA1hC,EAAAF,KAAAykC,OAEAvkC,EAAA9c,OAAA8D,EAAA6P,IAAAmJ,GAAAhZ,EAAAoH,QACA5E,MAAA,WAEA,OAAAjD,QAAAoC,UAAAyG,EAAAoL,OAAApL,EAAAoL,IAAAxQ,EAGAwQ,EAAAxQ,KAAAkR,aAAAuT,KAAAzkB,GACAR,MAAA,WASA,OAPA0D,QAAAqB,MAAA,mCAAArG,OAAA8B,EAAAkc,OAAA,YAAA,SAAAlc,EAAAhF,OAAA8W,OAAA,EAAA,GAAAJ,KAAAD,MAAAA,IAGAzR,EAAAkc,SACAlc,EAAAkc,OAAAlc,EAAAkM,aAAAgQ,QAAAlc,EAAAgoC,UAAA,GAGAhoC,QAGA6B,OAAA,SAAA6B,GAGA,MAFAR,QAAAtG,MAAA,kCAAAsB,OAAA8B,EAAAkc,OAAA,aAAA,WAAAxY,GACA1D,EAAAkc,OAAAlc,EAAAkM,aAAAgQ,QAAAlc,EAAAgoC,UAAA,EACAtkC,MAIAm3C,GAAA,SAAA97C,EAAAktC,GAEA,OAAAjsC,EAAAjB,KAAAA,GAAAktC,GAAAjsC,EAAAisC,UAAAA,EAGAjsC,EAAAkc,QAUAlc,EAAAjB,IAAAA,EACAiB,EAAAisC,SAAAA,EAGAwO,GAAA,CAAAvuC,cAAA,EAAAwrC,UAAA,IACAl4C,MAAA,WAEA,OAAAsD,GAAA,CAAAg4C,UAAA,QAhBAxD,EAIAA,EAAA93C,MAAA,WACA,OAAAq7C,GAAA97C,EAAAktC,MAHAjvC,EAAAoH,OANApH,EAAAoH,QAgCA22C,GAAA,SAAA1Y,EAAAC,GACA,IAAApoB,EAAAD,KAAAC,IAAA,GAAAooB,GACA,OAAAD,EAAAnoB,EAAA,EACAD,KAAAqT,MAAA+U,EAAAnoB,GAAAA,GASAu5B,GAAA,SAAApR,EAAAC,GACA,OAAAA,GAAA,EAAAD,EAAAA,EAAApoB,KAAAC,IAAA,GAAAooB,IAGA0Y,GAAA,SAAA3Y,EAAAwQ,EAAAoI,GACA1+C,QAAAiM,YAAAyyC,KACAA,EAAApI,GAEA,IAAAqI,EAAA,EACAlT,EAAA,GACAmT,EAAAF,EACAG,EAAAH,EAcA,GAbA9hD,EAAA4L,KAAA/E,EAAAgoC,SAAA,IAAA,SAAA7rB,GASA,OARAA,EAAA23B,UAAA33B,EAAAmmB,OAAA2Y,GAEA19C,EAAAnC,OAAAmrC,cAAAjrC,KAAA6gB,EAAAo3B,cAEA2H,GAAAzH,GAAAt3B,EAAAkmB,OAAAlmB,EAAAmmB,MACA0F,EAAAlyB,KAAAqG,IAGA++B,GAAA7Y,KAIA6Y,EAAA7Y,GAAA4Y,EAAA,EAAA,CAEA,IACAI,EAAAL,GADA3Y,EAAA6Y,EACArI,EAFAoI,GAAA,GAKAI,EAAAhZ,OAAA,IACA8Y,EAAAE,EAAAF,QACAD,GAAAG,EAAAhZ,OACA,GAAAvsB,KAAA3D,MAAA61B,EAAAqT,EAAArT,UAIA,MAAA,CACAmT,QAAAA,EACAC,QAAAA,EACA/Y,OAAA6Y,EACAlT,QAAAA,IAOAsT,GAAA,SAAAC,EAAAlZ,EAAAmZ,EAAAtwC,EAAAuwC,EAAA/mC,GACA,OAAA1X,EAAA6P,IAAA,CACAgd,IACA/hB,EAAAwD,MACAoJ,GAAA1X,EAAAoH,KAAAsQ,IAAA5M,EAAAqN,WAAA2D,SAAA,KAEAtZ,MAAA,SAAAL,GACA,IAAAoC,EAAApC,EAAA,GACAoL,EAAApL,EAAA,GAEA,GADAuV,EAAAvV,EAAA,IACA5B,EAAAnC,OAAAgD,OAAAunB,KAAA41B,GACA,KAAA,CAAA5gD,QAAA,wBAEA,IAAA4C,EAAAnC,OAAA4oC,QAAAre,KAAA61B,GACA,KAAA,CAAA7gD,QAAA,yBAEA,IAAAgC,IACA,KAAA,CAAAhC,QAAA,0BAEA,GAAA4gD,IAAAv7C,EAAAhF,OACA,KAAA,CAAAL,QAAA,2BAEA,IAAA0nC,EACA,KAAA,CAAA1nC,QAAA,yBAEA,GAAA0nC,GAAA,EACA,KAAA,CAAA1nC,QAAA,yBAEA0nC,EAAApoB,KAAAyhC,MAAArZ,GAEA,IAAAmS,EAAA,CACAnS,OAAA,EACA8Y,QAAAzmC,EAAA8tB,SACA4Y,QAAA1mC,EAAA8tB,SAAA,EACAwF,QAAA,IAGA2T,EAAA,GACAA,EAAA7lC,KAAA,mBAAAusB,GAIA,IADA,IAAAuZ,EAAA,EACApH,EAAAnS,OAAAA,GAAAuZ,GAAAlnC,EAAA8tB,WACAgS,EAAAwG,GAAA3Y,EAAA3tB,EAAA8tB,WAEAH,OAAAA,KAEAuZ,GACAlnC,EAAA8tB,WACAH,EAAA0Y,GAAA1Y,EAAAuZ,GACAD,EAAA7lC,KAAA,oDAAAusB,EAAA,kCAAAuZ,IAKA,GAAApH,EAAAnS,OAAAA,EAAA,CACA,GAAAriC,EAAA81C,QAAAzT,EACA,KAAA,CAAA1nC,QAAA,2BAEA,GAAA,IAAA65C,EAAAnS,OACA,KAAA,CAAA1nC,QAAA,0BAGA,OAAA2S,EAAA,aACA9N,MAAA,SAAAq8C,GACA,IAAAv8C,EAeA,OAbAA,EADA4L,EACA,CACAm3B,OAAAiQ,EAAA,gBAAA,CAAAkC,EAAAnS,OAAA93B,EAAAwB,WACA+vC,KAAAD,EACAE,QAAAzJ,EAAA,aAAAA,CAAA/nC,EAAAzE,OAIA,CACAu8B,OAAAiQ,EAAA,gBAAA,CAAAkC,EAAAnS,OAAA,KACAyZ,KAAAxJ,EAAA,aAAAA,CAAA/nC,EAAAzE,MACAi2C,QAAA,IAGAzuC,EAAA,2BAAAhO,GACAE,MAAA,SAAA7E,GACA,KAAA,CAAAA,QAAAA,SAiBA,OAXAihD,EAAApH,EAAA2G,UA7JA,SAAA9Y,EAAAC,GACA,IAAAA,EAAA,OAAA,EACA,GAAAD,EAAApoB,KAAAC,IAAA,GAAAooB,GAAA,OAAA,EACA,IAAA0Z,EAAA,WAAA3Z,EAEA,OAAA,IADAlsB,SAAA6lC,EAAArgD,UAAAqgD,EAAA9iD,OAAAopC,IAyJA2Z,CAAA5Z,EAAAmS,EAAA2G,UACA9Y,EAhJA,SAAAA,EAAAC,GACA,IAAApoB,EAAAD,KAAAC,IAAA,GAAAooB,GACA,OAAAD,EAAAnoB,EAAAA,EACAD,KAAAqT,MAAA+U,EAAAnoB,GAAAA,EA6IAgiC,CAAA7Z,EAAAmS,EAAA2G,SACAj4C,QAAAqB,MAAA,wCAAA89B,GACAsZ,EAAA7lC,KAAA,wCAAAusB,IAEAuZ,EAAA,IACA14C,QAAAqB,MAAA,wCAAA89B,GACAsZ,EAAA7lC,KAAA,yCAAAusB,EAAA,gBAAAuZ,EAAA,MAIAO,GAAA5xC,EAAAmK,EAAAnT,EAAAg6C,EAAAlZ,EAAAmS,EAAAgH,EAAAC,GAAAz7C,EAAAhF,OAAA2gD,GACAn8C,MAAA,SAAAL,GACAa,EAAA81C,SAAA32C,EAAAkjC,OACAriC,EAAA81C,QAAA,IAAA91C,EAAA81C,QAAA,GACA38C,EAAAN,QAAA27C,EAAAxM,SAAA,SAAA7rB,GACAA,EAAA23B,UAAA,KAIA30C,GAAAA,EAAA6oC,QAAA9uC,SACAgK,QAAAqB,MAAA,wDAAApF,EAAA6oC,SACAyN,EAAAt2C,EAAA6oC,UAIA,IAAAoU,EAAA,CACA5O,KAAA1lC,EAAAq1B,KAAA1rB,MACA4wB,QAAAA,EACArnC,OAAAugD,EACAlH,QAAAmH,EACAlH,MAAA,EACA95C,KAAA2E,EAAA3E,KACA+5C,SAAA,EACA/F,aAAA,MAEA,OAAAgE,EAAAhB,UAAA,CAAA4K,GAAA,UACA58C,MAAA,WAQA,OAPAQ,EAAA0J,GAAAy+B,SAAAkU,QAAAD,GAGA5rC,EAAAxQ,KAAA0Q,MAAA4rC,eAAAt8C,GACAwQ,EAAAxQ,KAAA0Q,MAAA0jC,MAAAp0C,GAGA,CACAxF,KAAA2E,EAAA3E,YAIAqH,OAAA,SAAA6B,GAGA,GAAAA,GAAAA,EAAA+B,QAAAlI,EAAAmI,WAAAwgC,wBAEA,OADAhjC,QAAAqB,MAAA,iFAAArG,OAAAwF,EAAA/I,SAAA,4BACAyB,EAAAi+C,GAAA,KACA76C,MAAA,WACA,OAAA87C,GAAAC,EAAAlZ,EAAAmZ,EAAAtwC,EAAAuwC,EAAA/mC,MAKA,GAAAhR,GAAAA,EAAA+B,QAAAlI,EAAAmI,WAAAygC,6BAEA1oC,EAAAuC,KAAAm+B,SAAA1gC,EAAAuC,KAAAm+B,QAAAoe,IAAA9+C,EAAAuC,KAAAm+B,QAAAoe,GAAAzzC,OAGA,OADAxL,EAAAZ,QAAA6D,OACAjD,EAAAqzB,MAAAC,QAAA,6BAAA,oBAAA,CACAC,SAAA,UACAryB,OAAA,gBACAsyB,WAAA,kBAEAtxB,MAAA,SAAAoxB,GACA,GAAAA,EAOA,OANApgB,EAAA5T,MAAA8T,MAAA+rB,KAAA,CACAh+B,MAAA,kBACAuH,QAAA,gBAAA6B,EAAA7L,QAAA,gBACA6L,EAAA20C,MAAA,cACAb,EAAAlhD,KAAA,QAEA2B,GAAA,WACA,KAAA,CAAAzB,QAAA,+BACA,MAEA,KAAA,CAAAA,QAAA,2BAIA,MAAA+I,SAyCAy4C,GAAA,SAAA5xC,EAAAmK,EAAAnT,EAAAg6C,EAAAlZ,EAAAmS,EAAAgH,EAAAC,EAAAE,GAIA,GAAAnH,EAAAxM,QAAA9uC,OAv0CA,GAu0CA,CACAgK,QAAAqB,MAAA,qDAGA,IAAAk4C,EAAA,CACAtB,QAAAzmC,EAAA8tB,SACA4Y,QAAA,EACA/Y,OAAA,EACA2F,QAAAwM,EAAAxM,QAAApgB,MAAA,EA/0CA,KAw1CA,OAPAzuB,EAAAN,QAAA4jD,EAAAzU,SAAA,SAAA7rB,GACAA,EAAAmmB,KAAAma,EAAAtB,UAAAsB,EAAAtB,QAAAh/B,EAAAmmB,MACAnmB,EAAAmmB,KAAAma,EAAArB,UAAAqB,EAAArB,QAAAj/B,EAAAmmB,MACAma,EAAApa,QAAAoR,GAAAt3B,EAAAkmB,OAAAlmB,EAAAmmB,SAIA6Z,GAAA5xC,EAAAmK,EAAAnT,EAAAvB,EAAAhF,OAAAyhD,EAAApa,OAAAoa,OAAA76C,EAAA5B,EAAAhF,OAAA2gD,GACAn8C,MAAA,SAAAL,GACAhG,EAAAN,QAAA4jD,EAAAzU,SAAA,SAAA7rB,GACAA,EAAA23B,UAAA,KAEA2B,EAAAt2C,EAAA6oC,SAEA,IAAA0U,EAAA,CACAvB,QAAAzmC,EAAA8tB,SACA4Y,QAAA,EACA/Y,OAAA,EACA2F,QAAAwM,EAAAxM,QAAApgB,MAn2CA,IAm2CAxoB,OAAAD,EAAA6oC,UASA,OAPA7uC,EAAAN,QAAA6jD,EAAA1U,SAAA,SAAA7rB,GACAA,EAAAmmB,KAAAoa,EAAAvB,UAAAuB,EAAAvB,QAAAh/B,EAAAmmB,MACAnmB,EAAAmmB,KAAAoa,EAAAtB,UAAAsB,EAAAtB,QAAAj/B,EAAAmmB,MACAoa,EAAAra,QAAAoR,GAAAt3B,EAAAkmB,OAAAlmB,EAAAmmB,SAIA6Z,GAAA5xC,EAAAmK,EAAAnT,EAAAg6C,EAAAlZ,EAAAqa,EAAAlB,EAAAC,EAAAE,MAIA,IAAAjyC,EAAA,YAAAvL,EAAA,kCAEAoM,EAAAzE,KAAA,iBACA4O,EAAAna,OAAA,IAAAma,EAAAla,KAAA,4BAGAwF,EAAAhF,OAAA,cAUA,IAPA7B,EAAAN,QAAA27C,EAAAxM,SAAA,SAAA7rB,GAGAzS,GAAA,CAAAyS,EAAAkmB,OAAAlmB,EAAAmmB,KAAAnmB,EAAApI,KAAAoI,EAAA03B,WAAA13B,EAAAk3B,SAAA54C,KAAA,KAAA,QAGAiP,GAAA,aACAsQ,EAAA,EAAAA,EAAAw6B,EAAAxM,QAAA9uC,OAAA8gB,IAEAtQ,GAAAsQ,EAAA,YAGAtQ,GAAA,aAEA,IAEA8pC,EAFAwI,EAAA3Z,EACAwQ,EAAA2B,EAAA4G,QAEAuB,EAAA,EACAC,EAAA,GAEA,GAAArB,IAAAv7C,EAAAhF,OAAA,CACA,KAAAghD,EAAA,GAEAA,GADAxI,EAAAuH,GAAAiB,EAAAnJ,GAEAW,EAAA,IACAA,EAAA,IAAAX,EAAAW,EAAAA,EAAAv5B,KAAAC,IAAA,GAAA24B,GACAnpC,GAAA8pC,EAAA,IAAAX,EAAA,QAAA0I,EAAA,MACAoB,KAEA9J,IAEAmJ,EAAAxH,EAAAnS,OAAAA,EACAwQ,EAAA2B,EAAA4G,QAGA,KAAAY,EAAA,GAEAA,GADAxI,EAAAuH,GAAAiB,EAAAnJ,GAEAW,EAAA,IACAA,EAAA,IAAAX,EAAAW,EAAAA,EAAAv5B,KAAAC,IAAA,GAAA24B,GACAnpC,GAAA8pC,EAAA,IAAAX,EAAA,QAAA4I,EAAA,MAEAz7C,EAAAhF,SAAAygD,GACAmB,EAAA9mC,KAAA,CACA/B,KAAA,IACAs/B,QAAAsJ,EACAta,OAAAmR,EACAlR,KAAAuQ,EACAU,WAAA,OAAAkI,EAAA,IACA3H,UAAA,IAGA6I,KAEA9J,IAmBA,OAhBAnpC,GAAA,aAAA8xC,GAAA,IAAA,KAGAG,IACAJ,GAAAv7C,EAAAhF,OACA2gD,EAAA7lC,KAAA,wDAAA0+B,EAAA2G,QAAA,iBAAA3G,EAAA4G,SAGAO,EAAA7lC,KAAA,wDAAA0+B,EAAA2G,QAAA,iBAAA3G,EAAA4G,QAAA,8BAEAjiD,EAAAN,QAAA27C,EAAAxM,SAAA,SAAA7rB,GACAw/B,EAAA7lC,KAAA,CAAAqG,EAAAkmB,OAAAlmB,EAAAmmB,KAAAnmB,EAAApI,KAAAoI,EAAA03B,WAAA13B,EAAAk3B,SAAA54C,KAAA,SAEAkhD,EAAA7lC,KAAA,gFAAApM,EAAA,wBAGAvM,EAAAinB,KAAA1a,EAAAnI,GACA/B,MAAA,SAAAwkB,GACA,IAAA64B,EAAAnzC,EAAAsa,EAAA,KACA,OAAAzmB,EAAAmM,GAAAs3B,QAAA,CAAA8b,YAAAD,IACAh7C,OAAA,SAAA6B,GACA,IAAAA,GAAAA,EAAA+B,QAAAlI,EAAAmI,WAAA2gC,qBAIA,MAAA3iC,KAEAlE,MAAA,WACA,OAAArC,EAAAqE,KAAAhH,KAAAqiD,MAEAr9C,MAAA,SAAAu9C,GAMA,OALA5jD,EAAAN,QAAA+jD,GAAA,SAAAzT,GACAA,EAAA0K,WAAAkJ,EACA5T,EAAA2K,UAAA,EACA3K,EAAA5B,SAAA,KAEA,CACAlF,OAAAriC,EAAAhF,SAAAugD,EAAA,EAAAv7C,EAAAhF,SAAAygD,EAAApZ,EAAAmS,EAAAnS,OACA34B,GAAAmzC,EACAriD,KAAAuiD,EACA/U,QAAA4U,UAMAI,GAAA,SAAAzyC,EAAAhJ,EAAAxC,EAAAktC,GAGA,GAFAltC,EAAAA,GAAAiB,EAAAjB,IACAktC,EAAAA,GAAAjsC,EAAAisC,UACAltC,IAAAktC,EACA,KAAA,CAAAtxC,QAAA,4BAEA,GAAAqF,EAAAkM,aAAAugC,QACA,KAAA,CAAA9xC,QAAA,iCAGA,IAAA4yC,EAAA,YAAApvC,EAAA,+BAEAoM,EAAAzE,KAAA,aACA9F,EAAAhF,OAAA,eACA+D,EAAA,gBACAktC,EAAA,KACA,OAAA9uC,EAAAinB,KAAAmpB,EAAAhsC,GACA/B,MAAA,SAAAwkB,GAGA,OAFAupB,GAAAvpB,EAAA,KACA9gB,QAAAqB,MAAA,6CAAAgpC,EAAA,QACAA,MAsDAzF,GAAA,SAAAmV,GACA,OAAA,WACA,IAAAnV,EAEA,OAAA9qC,EAAA6P,IAAA,CACAgd,IACA/hB,EAAAqN,WAAAkuB,cAEA7jC,MAAA,SAAAL,GACA,IAAAoC,EAAApC,EAAA,GACAuV,EAAAvV,EAAA,GAWA,OATA2oC,EAAA,YAAA3pC,EAAA,iCAEAuW,EAAAnK,SAAA,aACAvK,EAAAhF,OAAA,YACA0Z,EAAAna,OAAA,IAAAma,EAAAla,KAAA,kBACAyiD,EAAA,KAAA,OAAA,aACAj9C,EAAAjB,IAAA,aACAiB,EAAAisC,SAAA,KAEA9uC,EAAAinB,KAAA0jB,EAAAvmC,MAEA/B,MAAA,SAAAwkB,GACA,IAAAk5B,EAAApV,EAAA9jB,EAAA,KAEA,OAAAzmB,EAAA4X,WAAA2yB,WAAA,CAAAA,WAAAoV,OAEA19C,MAAA,WACA,OAAApD,GAAA,WACA,OAAAqxC,IAAA,KACA,QAIAjuC,KAAAgxC,MA4DAH,GAAA,SAAA7pC,EAAA22C,IACA32C,EAAAA,GAAA,IACAuN,KAAAvN,EAAAuN,MAAA,OACAvN,EAAA7L,QAAA6L,EAAA7L,SAAA,GACA6L,EAAA8pC,cAAA9pC,EAAA8pC,eAAA,GACA9pC,EAAA8zC,QAAA9zC,EAAA8zC,SAAA,YACA9zC,EAAA7L,QAAAwH,OAAAjJ,OACAikD,EAIAn9C,EAAA4xC,OAAA55B,OAAA,EAAA,EAAAxR,GAHAxG,EAAA4xC,OAAA97B,KAAAtP,GAOAtD,QAAAqB,MAAA,+CAIA64C,GAAA,SAAAtzB,GACA,IAAAuzB,EAAApjC,KAAAuhB,MAAA1R,EAAAwzB,OAAApkD,OAAA,GACAqK,EAAAumB,EAAAwzB,OAAAxrC,OAAA,EAAAurC,GACA75C,EAAAsmB,EAAAwzB,OAAAxrC,OAAAurC,GACA,OAAAlgD,EAAAmE,cAAAiC,EAAAC,GACAhE,MAAA,SAAA+B,GAGA,OAFAuoB,EAAA9uB,OAAAmC,EAAAqE,KAAAC,cAAAF,EAAAG,QACAooB,EAAAvoB,QAAAA,EACAuoB,MAgHAyzB,GAAA,WACA,OAAAvgD,EAAA6P,IAAA,CACAgd,IACA/hB,EAAAwD,QAGA9L,MAAA,SAAAL,GACA,IAAAoC,EAAApC,EAAA,GACAoL,EAAApL,EAAA,GAEA,OAAA69C,GAAAzyC,EAAAhJ,GAGA/B,MAAA,SAAA+tC,GACA,IAAAiQ,EAAAjQ,EAAAprC,OAAAtH,MAAA,MACA4iD,EAAAD,EAAAA,EAAAtkD,OAAA,GAEAwkD,EAAA,YAAAv/C,EAAA,iCAEAoM,EAAAzE,KAAA,aACA9F,EAAAhF,OAAA,mBACAgF,EAAAjB,IAAA,oBACAiB,EAAAisC,SAAA,oBACAwR,EAAA,KAIA,OAAAtgD,EAAAinB,KAAAs5B,EAAAn8C,GAGA/B,MAAA,SAAAwkB,GAGA,OAFA05B,GAAA15B,EAAA,KACA9gB,QAAAqB,MAAA,+CAAAm5C,EAAA,QACAA,YA+FAtD,GAAA,SAAAE,GACAt6C,EAAA4xC,OAAA5xC,EAAA4xC,OAAA1yC,QAAA,SAAAC,EAAAqH,GACA,OAAAA,EAAA8zC,SAAA9zC,EAAA8zC,SAAAA,EAAAn7C,EACAA,EAAAC,OAAAoH,KACA,KAgCA2zC,GAAA,SAAA7wC,EAAAlE,GAQA,OANAkE,EAAA0/B,SAAA2U,UAAAtyB,GAEArrB,EAAAgpC,SAAAhpC,EAAAgpC,UAAA,GACAhpC,EAAAgpC,SAAAlzB,KAAAxM,IAGAlE,GAAA7I,QAAAiM,YAAApD,EAAAtC,QAAAsC,EAAAtC,MACAm2C,KAEAj8C,EAAAoH,QAGA41C,GAAA,SAAA50C,GAGAA,IAAAA,EAAA69B,MACA9pC,EAAAN,QAAAmH,EAAAgpC,UAAA,IAAA,SAAA1/B,GACAA,EAAA25B,UAGA,IAAA2a,EAAA59C,EAAAgpC,SAAAhxB,OAAA,EAAAhY,EAAAgpC,SAAA9vC,QAGA,OAAAkM,GAAA7I,QAAAiM,YAAApD,EAAAtC,QAAAsC,EAAAtC,MACAm2C,KAEA2E,GA2BAC,GAAA,SAAA7iD,GACA,OAAA7B,EAAA4L,KAAA/E,EAAAgpC,UAAA,IAAA,SAAAiR,GAAA,OAAAA,EAAA6D,aAAA9iD,OAWAk/C,GAAA,WAEA,IAAA6D,GAAA/9C,EAAAgpC,UAAA,IAAA9pC,QAAA,SAAAC,EAAAmK,GACA,OAAA2Q,KAAAO,IAAArb,EAAAmK,EAAAhP,MACA,GAAA,EACA,OAAAmrB,EAAAmlB,SAAAmT,EAAAxgD,IAGAygD,GAAA,WACA,OAAAzF,oBACA/4C,MAAA,WACA,OAAAQ,EAAAgpC,aAuKA,SAAAiV,GAAApuC,GACA,OAAAA,GAAA,CACAhN,gBAAAgN,EAAAhN,gBACAqM,0BAAAW,EAAAX,0BACAnP,WAAA8P,EAAA9P,WACAE,aAAA4P,EAAA5P,cAIA,SAAAu1B,GAAA0oB,GACA,IAAAC,EAAAF,GAAAC,GAEA,IADA3hD,QAAAkG,OAAAoN,EAAAsuC,IACAtuC,EAAA,CAEA,IAAAuuC,GAAA7hD,QAAAkG,OAAAoN,EAAAX,0BAAAivC,EAAAjvC,2BACAmvC,GAAA9hD,QAAAkG,OAAAoN,EAAAhN,gBAAAs7C,EAAAt7C,kBAAAu7C,EACA17C,GAAAnG,QAAAkG,OAAAoN,EAAA5P,aAAAk+C,EAAAl+C,cASA,GAPA4P,EAAAsuC,EAEAz7C,GACA81C,gBAIA6F,EAAA,CAGA,GAAAxuC,EAAAhN,gBAMA,OAAAC,KACAtD,MAAA,WAGA,GAAAQ,EAAAu5C,cAAA,GAAA6E,GAAAvuC,EAAAX,0BACA,OAAA3Q,EAAA,CAAAm6C,SAAA,EAAA11C,QAAA,IACAnB,OAAA,SAAA6B,GAEA,GAAA,cAAAA,EAEA,OADAjG,EAAA0U,MAAA,CAAAjD,2BAAA,IACAzR,EAAAqF,QAGA,MAAAY,QAOAlE,KAAAy5C,IAzBAJ,GAAA74C,EAAAhF,UA8CA,SAAAsjD,KACAnlD,EAAAN,QAAAwa,GAAA,SAAA+H,GACAA,OAEA/H,EAAA,GAQA,SAAA4vB,KACA//B,QAAAqB,MAAA,wBACA+5C,KACA/c,IAGA,SAAA2B,KAEA,OADAD,KACA7mC,EAAA+U,GAAA,KAGA,SAAAA,GAAA/L,IACAA,EAAAA,GAAA,IAEAoM,QAAAjV,QAAAoC,UAAAyG,EAAAoM,SAAApM,EAAAoM,QAAA,YAAAlX,EAEA4I,QAAAqB,MAAA,wBACA,IAAAkN,EAAAC,KAAAD,MA2BA,OAzBAtD,EAAAnR,EAAA6P,IAAA,CACApP,EAAAmU,QACApS,MAAA,WACAqQ,EAAAouC,GAAAxgD,EAAAuC,SAEA8H,EAAA8J,QACArU,EAAAqU,UAIAxM,EAAAoM,UAAArD,EAAAA,EAAA3O,KAAAgS,KAGArD,EAAA3O,MAAA,YA5DA,WACA6T,EAAA,CAEA5V,EAAA+S,IAAAxQ,KAAA61B,GAAAllB,QAAAxD,EAAAqoB,GAAA98B,MAEA6E,EAAAiT,IAAAI,KAAAilB,GAAAqN,QAAA/1B,EAAA+1B,GAAAxqC,OAGAyU,EAAArQ,IAAA,YAAAg8C,GAqDAhjB,GAEA5yB,QAAAqB,MAAA,wBAAAmN,KAAAD,MAAAA,GAAA,MAEAlB,GAAA,EACApC,EAAA,QAEA3O,MAAA,WACA,OAAAQ,KAGAmO,EA6GA,OA5YAowC,YAAA,SAAAvjD,GACA,IAAAA,EAAA,MAAA,IAAAD,MAAA,+BACA,IAAAiF,EAAAhF,OAAA,MAAA,IAAAD,MAAA,mBACA,OAAAiF,EAAAhF,SAAAA,EAAAqwB,EACAwyB,GAAA7iD,IAGAwjD,2BAAA,WACA,OAAAxhD,EAAA6P,IAAA,CACAmxC,KACAl2C,EAAAwD,QAEA9L,MAAA,SAAAL,GACA,IAAA6pC,EAAA7pC,EAAA,GACAoL,EAAApL,EAAA,GACA6G,GAAAgjC,GAAA,IAAA9pC,QAAA,SAAAC,EAAAmK,GACA,OAAAnK,EAAA,CAAAmK,EAAAtJ,KAAAhF,OAAAsO,EAAAtJ,KAAAjB,IAAAuK,EAAAtJ,KAAAw3C,WAAAluC,EAAAtJ,KAAA8F,MAAArL,KAAA,MAAA,OACA,IACAsH,EAAA,IAAAya,EAAA,CAAAxW,GAAA,CAAA+N,KAAA,8BACA,OAAAzG,EAAA,sCAAA,CACAtS,OAAAgF,EAAAhF,OACAuP,SAAAA,EAAAzE,OAEAtG,MAAA,SAAAi/C,GACAlM,EAAA0E,OAAAl1C,EAAA08C,UAOAlG,kBAAA,SAAAnzC,GACA,OAAA2yC,IACAz5C,IAGAnB,EAAA2lB,IAAAvhB,QAAA2jB,gBAAAllB,EAAAuB,SACA/B,MAAA,SAAA+B,GACA,IAAAggB,EAAApkB,EAAAqE,KAAAof,cAAA5gB,EAAA23C,cAAAp2B,OACA,OAAApkB,EAAA2lB,IAAAwC,KAAAtlB,EAAA23C,cAAA3xC,QAAAub,EAAAhgB,EAAAwgB,MAAAxgB,EAAAugB,UAGAtiB,MAAA,SAAAwG,GACAhG,EAAA23C,cAAA,KACA,IAAA32C,EAAA64C,GAAA/d,KAAAx3B,MAAA0B,IASA,QANAZ,GAAA7I,QAAAiM,YAAApD,EAAAtC,QAAAsC,EAAAtC,QACA9B,EAAAxB,MAAA,WACA,OAAAy5C,QAIAj4C,KApBAzC,IAAAiB,KAAA+4C,mBADAv7C,EAAAoH,QA6BAs6C,SAAA,SAAAlmD,EAAAmmD,GAEA,OADAA,IAAApiD,QAAAiM,YAAAm2C,IAAAA,EACA3hD,GAAA,SAAA0e,EAAAC,GACA,IAAApJ,EACA,IACAA,EAAAupB,KAAAx3B,MAAA9L,GAAA,MAEA,MAAAkL,IASA,GAAA6O,GAAAA,EAAAhR,SAAAgR,EAAAhR,QAAAG,QAAA6Q,EAAAhR,QAAAmD,OAAA,CACA,IACAsV,EADAzY,EAAA,GAIAG,EAAA,IAAA+a,WAAA,IACA,IAAAzC,EAAA,EAAAA,EAAA,GAAAA,IAAAtY,EAAAsY,GAAAzH,EAAAhR,QAAAG,OAAAsY,GACAzY,EAAAG,OAAAA,EAEA,IAAAgD,EAAA,IAAA+X,WAAA,IACA,IAAAzC,EAAA,EAAAA,EAAA,GAAAA,IAAAtV,EAAAsV,GAAAzH,EAAAhR,QAAAmD,OAAAsV,GAIA,GAHAzY,EAAAmD,OAAAA,EAGA6N,EAAAvW,SAAAuW,EAAAhR,QAAAwgB,MAAA,CACA,IAAAA,EAAA,IAAAtF,WAAA,IACA,IAAAzC,EAAA,EAAAA,EAAA,GAAAA,IAAA+H,EAAA/H,GAAAzH,EAAAhR,QAAAwgB,MAAA/H,GACAzY,EAAAwgB,MAAAA,EAGA,GAAAxP,EAAAvW,SAAAuW,EAAAhR,QAAAugB,MAAA,CACA,IAAAA,EAAA,IAAArF,WAAA,IACA,IAAAzC,EAAA,EAAAA,EAAA,GAAAA,IAAA8H,EAAA9H,GAAAzH,EAAAhR,QAAAugB,MAAA9H,GACAzY,EAAAugB,MAAAA,EAGApG,EAAA,CACA1gB,OAAAuX,EAAAvX,OACAuG,QAAAA,EACAmI,GAAA6I,EAAA7I,UAGAi1C,EACAhjC,EAAA,kCAGAD,QAKA88B,cAAA,SAAAoG,GAEA,IAAAC,GADAD,EAAAriD,QAAAoC,UAAAigD,GAAAA,EAAAtgD,MACAuR,GAAAA,EAAA5P,aAAA,GAAA4P,EAAA5P,cAAAxC,EAAAU,UAAAgC,uBACAwQ,EAAA4mC,GAAAsH,EAGAluC,GAEAkuC,GACA37C,QAAAqB,MAAA,oCAAArG,OAAA2R,EAAA5P,eACAi3C,EAAA4H,QAAAjvC,EAAA5P,cACAi3C,EAAA6H,SAGAxH,IACAr0C,QAAAqB,MAAA,sBACA2yC,EAAA8H,WAEAzH,EAAAsH,GAIAA,GAAA3H,EAAA+H,YAAApvC,EAAA5P,eACAiD,QAAAqB,MAAA,0CAAArG,OAAA2R,EAAA5P,eACAi3C,EAAA4H,QAAAjvC,EAAA5P,eAIA2+C,GAAA/uC,GAAAA,EAAA5P,cAAAxC,EAAAU,UAAAgC,uBAEAu9B,EAAA7C,IA5qEA,SA4qEA19B,EAAAqE,KAAAC,cAAAzB,EAAAuB,QAAAmD,SAGAiM,GACA+sB,EAAA7C,IAhrEA,SAgrEA,OA2IArqB,EAAAyB,cAAA,OAAA,QACAzB,EAAAyB,cAAA,OAAA,cACAzB,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,OAAA,QACAzB,EAAAyB,cAAA,OAAA,UACAzB,EAAAyB,cAAA,OAAA,QACAzB,EAAAyB,cAAA,OAAA,UACAzB,EAAAyB,cAAA,OAAA,SACAzB,EAAAyB,cAAA,OAAA,SAEAzB,EAAAyB,cAAA,QAAA,QAGAzB,EAAAyB,cAAA,OAAA,kBACAzB,EAAAyB,cAAA,OAAA,SAEAzB,EAAAyB,cAAA,SAAA,WAIAsvB,GAAA,GAGA,YAAAjnC,IAGAwI,GAAA9F,EAAAoH,KACAoN,GAAAxU,EAAAoH,KACAk0C,GAAAt7C,EAAAoH,MAIAinB,EAAA,CACA/wB,GAAAA,EACA0F,KAAAA,EACA4R,MAxFA,WACA,OAAArB,EAAAvT,EAAAoH,OACA+J,GAAAgD,MAuFAA,MAAAA,GACA8xB,KAAAA,GAEApmC,MAAAA,EACA87C,OAAAA,EACAp6C,KAAAA,EACAu6C,OAAAA,EACAn8C,QAAAA,EACA2B,OAAAA,EACAurB,WAAAA,EACAyhB,QA1iEA,WACA,QAAAtrC,EAAAhF,SAAAgF,EAAAkM,aAAAq/B,UA0iEAsP,QAAAA,GACA5uC,SAAA,WACA,OAAAjM,EAAAiM,UAEAksC,aAAAA,GACAL,UAAAA,EACAiB,YAAAA,GACAtB,MAAAA,GACAqG,aAzgEA,SAAA9iD,GACA,OAAA2B,KAAAqD,EAAAhF,SAAAA,GAygEAynC,QAjtDA,WACA,OAAAziC,GAitDAyhC,SAAAA,GACAgZ,YAAAA,GACAD,WAAAA,GAEA0E,SAAA,CACAC,YA/HA,SAAAC,IACA/rC,EAAAA,GAAA,IACAyC,KAAAspC,IA8HAd,gBAAAA,IAGAx7C,MAAAA,GACAm2C,UAAAA,GAEAqC,SAAAA,GACA+D,YAxlCA,SAAA9D,EAAAlZ,EAAAmZ,EAAAtwC,EAAAuwC,GACA,OAAA9+C,IAEA8+C,GAAAF,GAAAE,EAIA3zC,EAAAqN,WAAAkuB,YACA7jC,MAAA,SAAAkV,GAGA,OAFAxR,QAAAqB,MAAA,4EAAAmQ,GAEA4mC,GAAAC,EAAAlZ,EAAAmZ,EAAAtwC,EAAAuwC,EAAA/mC,GACAlV,MAAA,WAEA,GAAAQ,EAAA81C,QAAA,GAAA2F,EAEA,OADAv4C,QAAAqB,MAAA,iEAAArG,OAAAu9C,EAAA9/C,UAAA,EAAA,KACA2/C,GAAAG,EAAAz7C,EAAA81C,aAAAl0C,GAAA,EAAA65C,EAAA/mC,SAZA1X,EAAA2e,OAAA,CAAAhhB,QAAA,2DAHAqC,EAAA2e,OAAA,CAAAhhB,QAAA,4BAwlCAwgC,KAh4BA,SAAAp8B,EAAAugD,GACA,OAAA/hD,EAAAnC,OAAA0oC,QAAAne,KAAA5mB,GAIA/B,EAAA6P,IAAA,CACAgd,IACA/hB,EAAAwD,MACAxD,EAAAqN,WAAAkuB,cAGA7jC,MAAA,SAAAL,GACA,IAAAoC,EAAApC,EAAA,GACAoL,EAAApL,EAAA,GAEA,OADAuV,EAAAvV,EAAA,GACA69C,GAAAzyC,EAAAhJ,EAAAxC,EAAA2V,EAAAna,OAAA,IAAAma,EAAAla,SAIAgF,MAAA,SAAA+tC,GACA,OAAAhwC,EAAA4M,IAAAs9B,IAAA,CAAA8F,SAAAA,OAGA/tC,MAAA,WACA,GAAA8/C,EAEA,OAAA7R,IAAA,GAGAjuC,KAAAgxC,IAGAxwC,EAAAjB,IAAAA,EACAiB,EAAAisC,SAAAv3B,EAAAna,OAAA,IAAAma,EAAAla,QAGAqH,OAAA,SAAA6B,GACA,GAAAA,GAAAA,EAAA+B,QAAAlI,EAAAmI,WAAAigC,sBACA,KAAA,CAAAlgC,MAAAlI,EAAAmI,WAAAigC,sBAAAhrC,QAAA,+BAEA,MAAA+I,KAtCA1G,EAAA2e,OAAA,CAAAhhB,QAAA,0BAEA,IAAA+Z,GA63BAizB,OA9jBA,WAMA,OAHAyS,GAAA,cAGAmD,KAEA/9C,MAAA,SAAAk+C,GACA,OAAAngD,EAAA4M,IAAAw9B,OAAA,CAAA+V,WAAAA,OAIAl+C,MAAA,WAEA,OAAApD,GAAA,WACA,OAAAqxC,IAAA,KACA,QAIAjuC,KAAAgxC,IAEA3uC,OAAA,SAAA6B,GACA,IAAAA,GAAAA,EAAA+B,OAAAlI,EAAAmI,WAAAggC,8BAKA,MAAAhiC,EAHA2sC,GAAA,CAAAt8B,KAAA,UAAApZ,QAAA,uCAAA2/C,QAAA,iBAAA,OAqiBAiF,eA5hBA,SAAA7B,GACA,OAAA1gD,EAAA6P,IAAA,CACAtP,EAAA4M,IAAAw9B,OAAA,CAAA+V,WAAAA,MAGAl+C,MAAA,SAAAL,GACA,GAAAxC,IACA,OAAAP,GAAA,WACA,OAAAqxC,IAAA,KACA,KAGAjuC,KAAAgxC,IAEA3uC,OAAA,SAAA6B,GACA,IAAAA,GAAAA,EAAA+B,OAAAlI,EAAAmI,WAAAggC,8BAKA,MAAAhiC,EAHA2sC,GAAA,CAAAt8B,KAAA,UAAApZ,QAAA,uCAAA2/C,QAAA,iBAAA,MAQAjK,GAAA,CAAAt8B,KAAA,UAAApZ,QAAA,uCAAA2/C,QAAA,iBAAA,OAogBA5S,QA1yBA,SAAA3oC,EAAA/D,EAAAqxC,EAAAroB,EAAA/X,EAAA0/B,GACA,OAAA3uC,EAAA6P,IAAA,CACAgd,IACA/hB,EAAAwD,MACAxD,EAAAqN,WAAAkuB,cAEA7jC,MAAA,SAAAL,GACA,IAAAoC,EAAApC,EAAA,GACAoL,EAAApL,EAAA,GACAuV,EAAAvV,EAAA,GAGA,IAAAa,EAAAiM,WAAApE,EAAAi6B,UACA,KAAA,CAAAnnC,QAAA,6CAIA,IAAAgyC,EAAA,YAAAxuC,EAAA,oCAEAoM,EAAAzE,KAAA,aACA9F,EAAAhF,OAAA,iBACAA,EAAA,mBACA+D,EAAA,oBACAstC,EAAA,oBACAroB,EAAA,oBACAtP,EAAAna,OAAA,IAAAma,EAAAla,KAAA,KAEA,OAAA2C,EAAAinB,KAAAuoB,EAAAprC,GACA/B,MAAA,SAAAwkB,GACA,IAAAw7B,EAAA7S,EAAA3oB,EAAA,KACA,OAAAzmB,EAAA4M,IAAAu9B,QAAA,CAAAiF,KAAA6S,OAEAhgD,MAAA,WACA,IAAAmtC,EAAA,CACA3xC,OAAAA,EACA+D,IAAAA,EACAyuC,KAAA94B,EAAAqE,WACA9M,SAAAA,EACA0/B,UAAAA,EACAiB,UAAAriC,EAAA5M,WAAA0xC,UACA9H,SAAA,EACA7yB,MAAAA,EAAAna,OACAyH,OAAA,GAMA,OAFAwO,EAAA8vB,OAAA5vB,MAAAg3B,QAAAiF,GAEAA,SA2vBA8S,eA1pBA,SAAA31B,GACA,OAtBA,SAAAA,GACA,IAAA41B,EAAA,4CAEA51B,EAAA61B,UACA,WAAA3/C,EAAAhF,OAAA,oBACA8uB,EAAAvI,MAAA,qBACAuI,EAAA9uB,OAAA,mBACA8uB,EAAAvmB,KAAA,kBACAumB,EAAAtmB,IAAA,KAGA,OAAArG,EAAAinB,KAAAs7B,EAAA1/C,EAAAuB,SAEA/B,MAAA,SAAAwkB,GAGA,OAFA07B,GAAA17B,EAAA,KACA9gB,QAAAqB,MAAA,2CAAAm7C,EAAA,QACAA,KAMAE,CAAA91B,GACAtqB,MAAA,SAAAkgD,GACA,IAAAG,EAAA,IAAArjC,EAAA,CAAAkjC,GAAA,CAAA3rC,KAAA,8BACAw+B,EAAA0E,OAAA4I,EAAA,qBAAA3hD,OAAA8B,EAAAhF,OAAAW,UAAA,EAAA,SAupBAmkD,aAxtBA,SAAAh2B,GACA,OAAAszB,GAAAtzB,GACAtqB,KAAArC,EAAAqE,KAAA6f,cACA7hB,MAAA,SAAA+hB,GAEA,OADAuI,EAAAvI,MAAApkB,EAAAqE,KAAAC,cAAA8f,GACAvkB,EAAA6P,IAAA,CACA1P,EAAA2lB,IAAAuC,KAAAyE,EAAAvmB,KAAAge,EAAAuI,EAAAvoB,QAAAwgB,MAAA+H,EAAAvoB,QAAAugB,OACA3kB,EAAA2lB,IAAAuC,KAAAyE,EAAAtmB,IAAA+d,EAAAuI,EAAAvoB,QAAAwgB,MAAA+H,EAAAvoB,QAAAugB,YAGAtiB,MAAA,SAAAL,GAGA,OAFA2qB,EAAAvmB,KAAApE,EAAA,GACA2qB,EAAAtmB,IAAArE,EAAA,GACA2qB,MA4sBAi2B,UAxsBA,SAAAC,GACA,KAAAA,GAAAA,EAAAC,aAAAD,EAAAE,YAAAF,EAAAG,WACA,KAAA,CAAAxlD,QAAA,6BAEA,IAAA4mB,EAAApkB,EAAAqE,KAAAof,cAAAo/B,EAAAC,aACA,OAAA7C,GAAA4C,GACAxgD,MAAA,SAAAwgD,GACA,OAAA7iD,EAAA2lB,IAAAwC,KAAA06B,EAAAE,WAAA3+B,EAAAy+B,EAAAz+C,QAAAwgB,MAAAi+B,EAAAz+C,QAAAugB,UAEAtiB,MAAA,SAAA+D,GAEA,OADAy8C,EAAAz8C,KAAAA,EACApG,EAAA2lB,IAAAwC,KAAA06B,EAAAG,UAAA5+B,EAAAy+B,EAAAz+C,QAAAwgB,MAAAi+B,EAAAz+C,QAAAugB,UAEAtiB,MAAA,SAAAgE,GAEA,OADAw8C,EAAAx8C,IAAAA,EACAw8C,KAEAn+C,OAAA,SAAA6B,GAEA,MADAR,QAAAC,KAAA,mDAAAO,GACA,IAAA3I,MAAA,wDAsrBAqlD,mBAlgBA,WACA,OAAApjD,EAAA6P,IAAA,CACA/E,EAAAwD,MACAiyC,OAEA/9C,MAAA,SAAAL,GACA,IAAAoL,EAAApL,EAAA,GACAu+C,EAAAv+C,EAAA,GACAkhD,EAAA,IAAA7jC,EAAA,CAAAkhC,GAAA,CAAA3pC,KAAA,8BACA,OAAAzG,EAAA,uCAAA,CACAvO,IAAAiB,EAAAjB,IACAwL,SAAAA,EAAAzE,KACA9K,OAAAgF,EAAAhF,SAEAwE,MAAA,SAAAi/C,GACAlM,EAAA0E,OAAAoJ,EAAA5B,UAofA6B,gBAtpBA,SAAApiD,GACA,OAAAI,IAEAtB,EAAA6P,IAAA,CACA/E,EAAAwD,MACAlO,EAAAoH,QAAA4kB,gBAAAppB,EAAAuB,QACA,CACAwS,KAAA7V,EACAgD,SAAA,WAEA,OADA5D,EAAAZ,QAAA6D,OACA/C,EAAA6H,aAAA,CACA5G,MAAA,gDACA6G,SAAA,iDAEA9F,MAAA,SAAA0B,GACA,OAAA5D,EAAAZ,QAAA2E,KAAA,IACA7B,MAAA,WACA,OAAA0B,aAMA1B,MAAA,SAAAL,GACA,IAAAoL,EAAApL,EAAA,GACAsM,EAAAtM,EAAA,GACA,OAAAmO,EAAA,oCAAA,CACA/C,SAAAA,EAAAzE,KACA9K,OAAAgF,EAAAhF,OACAkD,OAAAA,IAEAsB,MAAA,SAAAq3C,GACA,IAAA90C,EAAA,IAAAya,EAAA,CAAA/Q,GAAA,CAAAsI,KAAA,8BACAw+B,EAAA0E,OAAAl1C,EAAA80C,SAhCA75C,EAAA2e,OAAA,2BAspBA21B,QA1XA,WACA,IAAAtxC,EAAAhF,OAAA,MAAA,IAAAD,MAAA,mBACA,OAAAiF,EAAAgpC,UAAA,IAAA9pC,QAAA,SAAAC,EAAAmK,GACA,OAAAA,EAAAtJ,KAAAhF,OAAAmE,EAAAC,OAAAkK,EAAAtJ,KAAAhF,QAAAmE,IACA,CAAAa,EAAAhF,UAuXAujD,YAAAA,YACAzW,WAAA,CACAyY,OAAAzY,IAAA,GACA0Y,IAAA1Y,IAAA,IAEA8J,OAAA,CACAnK,IAAA4I,GACAoQ,eAAArG,IAEApR,SAAA,CACA0X,OA7dA,SAAAt7C,GACA,IAAAkE,EAAA4wC,KAEA,OADAC,GAAA7wC,EAAAlE,GACAkE,GA2dAm+B,IAAA0S,GACA/+B,OAzbA,SAAA9gB,EAAA8K,GACApF,EAAAgpC,SAAAhpC,EAAAgpC,UAAA,GACA,IAAA2X,EAAAxnD,EAAAgjC,UAAAn8B,EAAAgpC,UAAA,SAAAiR,GAAA,OAAAA,EAAA3/C,KAAAA,KACA,IAAA,IAAAqmD,EAWA,OANA3gD,EAAAgpC,SAAAhxB,OAAA2oC,EAAA,GAAA,GAGA1d,QAGA79B,GAAA7I,QAAAiM,YAAApD,EAAAtC,QAAAsC,EAAAtC,MACAm2C,UADA,EAVA/1C,QAAAC,KAAA,2CAAA7I,EAAA,kBAsbAgR,IAvaA,SAAAhR,GACA,MAAA,YAAAA,GAAAnB,EAAA4L,KAAA/E,EAAAgpC,UAAA,IAAA,SAAAiR,GAAA,OAAAA,EAAA3/C,MAAAA,WAAAsH,GAuaA28C,YAAAV,GACAhxC,IAAAmxC,GACAL,UAxfA,SAAAiD,GAEA,IAAAxB,EADA/rC,EAAAA,GAAA,GAEAla,EAAAN,QAAA,CAAA,OAAA,UAAA,SAAAuH,GACAg/C,EAAA5uC,EAAAxQ,KAAA61B,GAAAz1B,GAAA+M,GAAA,SAAAnN,EAAA0kB,GAKA,OAJAA,EAAAA,GAAA1nB,EAAA2nB,QACAi8B,EAAApwC,IAAAxQ,KAAAkR,aAAA9Q,GAAAJ,GACAR,KAAAklB,EAAAhJ,SACA7Z,MAAA6iB,EAAA/I,QACA+I,EAAA1jB,UACAtI,MACA2a,EAAAyC,KAAAspC,MAIAA,EAAAwB,EAAApwC,IAAAxQ,KAAA61B,GAAAijB,OAAA3rC,GAAA,WACA7O,KAAAw6C,MACApgD,MACA2a,EAAAyC,KAAAspC,IAueA/kC,MA/ZA,WACA,OAAA9d,QAAAoC,UAAAqB,EAAAu5C,eAAAv5C,EAAAu5C,cAAAv5C,EAAAgpC,UAAAhpC,EAAAgpC,SAAA9vC,QAAA,GA+ZA2nD,UApaA,SAAA7lD,GACA,QAAA6iD,GAAA7iD,IAoaA4vC,SAAAsP,GACA4G,aAAAtC,4BAEAhuC,IAAAA,GAQA,OAHAiV,EAAA4xB,EAAA,UAAA95C,IACAqtC,SAAAyM,EAEA5xB,KCh8EAlpB,QAAA0Q,OAAA,uBAAA,IAEA8zC,SAAA,kBAAA,CACAz3C,OAAA,CACA8C,UAAA,KAIAc,QAAA,SAAA,CAAA,aAAA,aAAA,UAAA,kBAAA,cAAA,SAAAC,EAAA1P,EAAAH,EAAAyK,EAAA1L,GAcA,SAAA2kD,EAAA34C,EAAA44C,GAIA,GAHA54C,EAAA9L,QAAAoC,UAAA0J,GAAAA,EAAA5K,EAAAuC,KAAAgJ,QAAAM,OACA23C,IAAA1kD,QAAAoC,UAAAsiD,IAAAA,IAEA54C,EAAA,GAAAA,GAAAN,EAAAuB,OAAA8C,WAAA,CAGA,IAAA80C,EAjBA,SAAAD,EAAAE,GACA,GAAAF,IAAA9zC,EAAAnF,MAAAvK,EAAAuC,KAAAgJ,QAAAF,SAAAxL,EAAAuC,OAAAC,UAAA,CAIA,IAAAohD,EAAA/zC,EAAAmqB,OAEA,OADAj7B,EAAA,cAAA,CAAAF,OAAA+kD,IACAA,GAUAE,CAAAH,GACA,GAAAC,EAIA,OAFAA,EAAAl5C,KAAAi5C,EAEAC,EAAA93C,gBAAAf,GAAA,GACA7I,MAAA,SAAA6J,GACA63C,EAAAtoB,WACAqoB,IACAxjD,EAAAuC,KAAAgJ,QAAAM,OAAAD,EACA5L,EAAAqF,aAKA,MAAA,CACAwG,OAAA,CACAtB,KAAA,WACA,OAAAg5C,EAAA,GAAA,IAEAh4C,QAAAg4C,OC/CAzkD,QAAA0Q,OAAA,yBAAA,IAEAo0C,SAAA,iBAAA,WAGA,IAAAC,EAAA,GAEAC,EAAA,GAEA7oD,KAAA8oD,4BAAA,SAAAC,GAEA,OADAH,EAAAxrC,KAAA2rC,GACA/oD,MAGAA,KAAAgpD,YAAA,SAAAC,EAAAC,GAOA,OANArlD,QAAAoC,UAAAgjD,IAAAplD,QAAAoC,UAAAijD,KACAL,EAAAI,KACAJ,EAAAI,GAAA,IAEAJ,EAAAI,GAAA7rC,KAAA8rC,IAEAlpD,MAGAA,KAAAmpD,aAAA,SAAAC,EAAAF,GACA,IAAAnpD,EAAAC,KAIA,OAHAopD,EAAAjpD,SAAA,SAAA8oD,GACAlpD,EAAAipD,YAAAC,EAAAC,MAEAlpD,MAGAA,KAAAqpD,KAAA,CAAA,YAAA,SAAA,SAAAtrB,EAAAvvB,GAEA,IAAA86C,EA2BA,MAAA,CACA7wC,MA1BA,WACAmwC,EAAApoD,OAAA,GACAC,EAAAN,QAAAyoD,GAAA,SAAAx7C,GACA2wB,EAAAnrB,IAAAxF,OAwBAm8C,WAAA,CACAC,OAAA,CACAC,iBArBA,SAAAC,GAIA,OAHAjpD,EAAAP,KAAA2oD,GAAAriD,QAAA,SAAAC,EAAAwiD,GACA,OAAAz6C,EAAAm7C,SAAAV,GAAAxiD,EAAAC,OAAAmiD,EAAAI,IAAAxiD,IACA,IACAD,QAAA,SAAAC,EAAAyiD,GACA,OAAAA,EAAAM,QAAAN,EAAAM,OAAAE,GAAAjjD,EAAAC,OAAAwiD,EAAAM,OAAAE,IAAAjjD,IACA,KAgBA2Z,QAAA,CACAxN,IAVA,WACA,OAAA02C,GAUApiC,IAfA,SAAAwiC,GACAJ,EAAAI,YCxDA7lD,QAAA0Q,OAAA,kBAAA,CAEA,0BAEA,2BACA,uBACA,0BACA,sBACA,yBACA,wBACA,wBACA,0BACA,yBACA,2BACA,sBACA,qBACA,yBACA,uBACA,2BClBA1Q,QAAA0Q,OAAA,2BAAA,CAAA,sBAAA,yBAAA,wBAAA,6BAGAC,QAAA,eAAA,CAAA,aAAA,WAAA,cAAA,SAAA,KAAA,aAAA,UAAA,MAAA,cAAA,SAAAC,EAAA/Q,EAAAC,EAAA6K,EAAAlK,EAAAsQ,EAAAglC,EACA/0C,EAAAJ,GA+DA,MAAA,CACAytC,SA7DA,SAAAwN,GAEA,IAAAkK,EAEA,MAAA,CACAnxC,MAAA,WACA,OAAAnU,EAAAoH,QAEAvH,MAAA,WACA,IAAAs+B,EAAAziC,KACA,OAAA4U,EAAA,4BACA9N,MAAA,SAAAxE,GAEA,GADAsnD,EAAAtnD,GACAo9C,GAAAA,EAAAp9C,QAAAsnD,EACA,KAAA,CAAA3nD,QAAA,qCAKA,OAHAwgC,EAAAn7B,KAAA,CACAuB,QAAA62C,EAAA72C,SAEA,CACAxC,IAAA,OACA/D,OAAAsnD,OAIAhH,SAAA,SAAAtgD,EAAAqnC,EAAAgS,GACA,IAAAlZ,EAAAziC,KACA,OAAA6E,EAAA4X,WAAA2D,UACAtZ,MAAA,SAAAkV,GACA,IAAAhL,EAAA,YAAAnM,EAAAY,UAAAsmC,iBAAA,kCAEA/vB,EAAAnK,SAAA,iBACAmK,EAAAna,OAAA,IAAAma,EAAAla,KAAA,4BAGA8nD,EAAA,cAEA,CAAAjgB,EAAA3tB,EAAA8tB,SAAA,IAAA,gDAAA,GAAA/nC,KAAA,KAAA,mCAIA,CAAA4nC,EAAA3tB,EAAA8tB,SAAA,OAAAxnC,EAAA,KAAAP,KAAA,KAAA,eACA45C,GAAA,IAAA,KAEA,OAAAl3C,EAAAinB,KAAA1a,EAAAyxB,EAAAn7B,KAAAuB,SACA/B,MAAA,SAAAwkB,GACA,IAAA64B,EAAAnzC,EAAAsa,EAAA,KACA,OAAA7mB,EAAAqE,KAAAhH,KAAAqiD,GACAr9C,MAAA,SAAAu9C,GACA,OAAA//C,EAAAoH,KAAA,CACAsF,GAAAmzC,EACAriD,KAAAuiD,oBvB5CAxkD,EAAAyV,UAAA5S,OAAA,CACAmC,IAAA,yBACAmmC,KAAA,YACAC,KAAA,YACA4e,WAAA,oGACAC,YAAA,uFACAC,YAAA,6HACAC,iBAAA,wDAEAnqD,EAAAyV,UAAA20C,MAAApqD,EAAAyV,UAAA5S,OAEA7C,EAAAyV,UAAA6I,MAAA,WACA,IAAAzD,EAAA1a,KAAA0a,KAAA1a,KAAAygB,SACA,OAAA/F,EAAA6E,OACA,CAAAvf,KAAAsC,QAAA,UAAAoY,EAAAmF,IAAAnF,EAAAi2B,KAAAj2B,EAAAk2B,KAAAl2B,EAAAgG,KAAAhG,EAAAuF,OAAAvF,EAAAf,MAAA5X,KAAA,KAEA,CAAA/B,KAAAsC,QAAA,UAAAoY,EAAAtX,OAAAsX,EAAAf,MAAA5X,KAAA,MAGAlC,EAAAyV,UAAA40C,WAAA,SAAAzN,GACA,IAAA5iC,EAAA7Z,KACA,CAAA,UAAA,WAAA,MAAA,YAAA,OAAA,SAAA,QAAA,aAAAG,SAAA,SAAAC,GACAq8C,EAAAr8C,GAAAyZ,EAAAzZ,OAIAP,EAAAyV,UAAA60C,eAAA,SAAA3N,GACA,IAAA3iC,EAAA7Z,KACA,CAAA,UAAA,WAAA,MAAA,YAAA,QAAA,aAAAG,SAAA,SAAAC,GACAyZ,EAAAzZ,GAAAo8C,EAAAp8C,OAIAP,EAAAyV,UAAAxV,KAAA,WACA,IAAA+Z,EAAA7Z,KACAF,EAAA,GAMA,MALA,CAAA,UAAA,WAAA,YAAA,SAAA,QAAA,aAAAK,SAAA,SAAAC,GACAN,EAAAM,GAAAyZ,EAAAzZ,MAEAN,EAAAszB,IAAApzB,KAAAozB,KAAApzB,KAAAoqD,SACAtqD,EAAAwC,OAAAtC,KAAAsC,OACAxC,GAGAD,EAAAyV,UAAAmL,OAAA,WACA,GAAAzgB,KAAA0a,IAAA,OAAA1a,KAAA0a,IACA,IAAAA,EAAA,KACA2vC,EAAArqD,KAAA0C,OAAAmnD,WACAS,EAAAtqD,KAAA0C,OAAAonD,YAyBA,OAxBA9pD,KAAAK,UAAAF,SAAA,SAAAud,GACA,IAAAjb,GAAAiY,GAAA2vC,EAAAznD,KAAA8a,GACAjb,IACAiY,EAAA,CACAmF,IAAApd,EAAA,IAAA,GACAkuC,KAAAluC,EAAA,IAAA,GACAmuC,KAAAnuC,EAAA,IAAA,GACAie,KAAAje,EAAA,IAAA,GACAwd,OAAA,KAAAxd,EAAA,GACA8c,QAAA,KAGA9c,GAAAiY,GAAA4vC,EAAA1nD,KAAA8a,MAEAhD,EAAA,CACAmF,IAAApd,EAAA,IAAA,GACAkuC,KAAAluC,EAAA,IAAA,GACAmuC,KAAAnuC,EAAA,IAAA,GACAie,KAAAje,EAAA,IAAA,GACAwd,QAAA,EACAV,QAAA,OAIA7E,GAAA,IAGA7a,EAAAyV,UAAAmK,aAAA,SAAAwqC,GACA,OAAAA,EACAjqD,KAAAK,UAAAmG,QAAA,SAAAC,EAAAiX,GACA,OAAAA,EAAA0qB,MAAA6hB,GAAAxjD,EAAAC,OAAAgX,GAAAjX,IACA,IAHAzG,KAAAK,WAMAR,EAAAyV,UAAAqI,YAAA,SAAA3C,GAEA,IAAAuvC,EAAAvqD,KAAA0C,OAAAsY,IAAA,IAAAmS,OAAA,IAAAnS,GAEA,QADAhb,KAAAyf,aAAA8qC,GACA/pD,QAIAX,EAAAyV,UAAAwK,OAAA,WACA,IAAApF,EAAA1a,KAAA0a,KAAA1a,KAAAygB,SACA,OAAA/F,EAAAmF,IAAAnF,EAAAmF,IAAA,MAGAhgB,EAAAyV,UAAAk1C,QAAA,WACA,IAAA9vC,EAAA1a,KAAA0a,KAAA1a,KAAAygB,SACA,OAAA/F,EAAAi2B,KAAAj2B,EAAAi2B,KAAA,MAGA9wC,EAAAyV,UAAAm1C,QAAA,WACA,IAAA/vC,EAAA1a,KAAA0a,KAAA1a,KAAAygB,SACA,OAAA/F,EAAAk2B,KAAAl2B,EAAAk2B,KAAA,MAGA/wC,EAAAyV,UAAA6K,QAAA,WACA,IAAAzF,EAAA1a,KAAA0a,KAAA1a,KAAAygB,SACA,OAAA/F,EAAAgG,KAAAhG,EAAAgG,KAAA,MAGA7gB,EAAAyV,UAAAyK,QAAA,SAAAA,GAEA,OADArF,IAAAqF,GAAA/f,KAAA0a,KAAA1a,KAAAygB,UACA,KAAA/F,IAAAgG,MAAAhG,IAAAuF,SAAAvF,IAAAmF,IAAAnF,IAAAmF,IACA7f,KAAA0qD,UAAAhwC,KAAAA,IAAAi2B,KACAj2B,IAAAmF,IAAAnF,IAAAmF,IACAnF,IAAAk2B,KAAA,IAAAl2B,IAAAk2B,KAAA,IAAA,IAGA/wC,EAAAyV,UAAAq1C,OAAA,SAAAjwC,GACAA,EAAAA,GAAA1a,KAAA0a,KAAA1a,KAAAygB,SACA,IAAA6f,EAAAtgC,KAAA+f,QAAArF,GAEA,OADA,KAAAA,EAAAgG,MAAAhG,EAAAuF,OAAA,QAAA,QACA,MAAAqgB,GAAA5lB,EAAAgG,KAAA,IAAAhG,EAAAgG,KAAA,KAGA7gB,EAAAyV,UAAAsK,UAAA,SAAAlF,GACAA,EAAAA,GAAA1a,KAAA0a,KAAA1a,KAAAygB,SACA,IAAA6f,EAAAtgC,KAAA+f,QAAArF,GACA,OAAA4lB,GAAAA,GAAA5lB,EAAAgG,KAAA,IAAAhG,EAAAgG,KAAA,KAGA7gB,EAAAyV,UAAAo1C,UAAA,SAAAhwC,GACA,SAAAA,EAAAi2B,MAEAj2B,EAAAi2B,KAAAvI,MAAApoC,KAAA0C,OAAAsnD,oBAIAnqD,EAAAyV,UAAAs1C,YAAA,WACA,QAAA5qD,KAAA4f,aAGA/f,EAAAyV,UAAAmJ,MAAA,WAEA,OADAze,KAAA0a,KAAA1a,KAAAygB,UACAR,QAGApgB,EAAAyV,UAAAoJ,MAAA,WAEA,OADA1e,KAAA0a,KAAA1a,KAAAygB,UACA1d,QAGAlD,EAAAyV,UAAAkJ,OAAA,WAEA,OADAxe,KAAA0a,KAAA1a,KAAAygB,UACAvC,SAGAre,EAAAyV,UAAAiJ,MAAA,WACA,IAAA7D,EAAA1a,KAAA0a,KAAA1a,KAAAygB,SACA,OAAA/F,EAAAwD,UAAAxD,EAAA3X,QAGAlD,EAAAyV,UAAAu1C,OAAA,WACA,OAAA7qD,KAAA2d,YAAA,mCC7IArd,EAAAgV,UAAA3T,QAAA,WACA,aACA,QAAA3B,KAAAwB,mBACAxB,KAAAsB,qBACAtB,KAAAY,cACAZ,KAAA6pC,UACA7pC,KAAAc,cACAd,KAAAU,iBACAV,KAAAgB,cACAhB,KAAAoB,eACApB,KAAAkB,eAGAZ,EAAAgV,UAAAvJ,UAAA,WACA/L,KAAAW,WAAAX,KAAA8qD,iBAAA9qD,KAAAW,WAAA,CAAA,SAAA,YAAA,OAAA,QACAX,KAAAa,QAAAb,KAAA8qD,iBAAA9qD,KAAAa,QAAA,CAAA,SAAA,YAAA,QAAA,QAAA,QACAb,KAAAe,QAAAf,KAAA8qD,iBAAA9qD,KAAAe,QAAA,CAAA,SAAA,YAAA,QAAA,QAAA,QACAf,KAAAiB,QAAAjB,KAAA8qD,iBAAA9qD,KAAAiB,QAAA,CAAA,SAAA,YAAA,QAAA,QAAA,QACAjB,KAAAmB,QAAAnB,KAAA8qD,iBAAA9qD,KAAAmB,QAAA,CAAA,SAAA,cACAnB,KAAAqB,SAAArB,KAAA8qD,iBAAA9qD,KAAAqB,SAAA,CAAA,WAGArB,KAAAuB,eAAAvB,KAAA8qD,iBAAA9qD,KAAAuB,eAAA,CAAA,OAAA,KAAA,QAAA,cAIAvB,KAAAyB,aAAAzB,KAAA+qD,kBAAA/qD,KAAAyB,qBAEAzB,KAAAozB,KAGA9yB,EAAAgV,UAAA60B,UAAA,kBACAnqC,KAAAW,kBACAX,KAAAa,eACAb,KAAAe,eACAf,KAAAiB,eACAjB,KAAAmB,eACAnB,KAAAqB,gBACArB,KAAAuB,sBACAvB,KAAAyB,oBAEAzB,KAAAozB,KAGA9yB,EAAAgV,UAAAw1C,iBAAA,SAAAE,EAAAC,GACA,OAAAD,GAAAA,EAAAxqD,OACAwqD,EAAAxkD,QAAA,SAAAC,EAAA2sB,GACA,IAAAlxB,EAAAkxB,EAAAjxB,MAAA,KACA,GAAAD,EAAA1B,QAAAyqD,EAAAzqD,OAEA,OADAgK,QAAAqB,MAAA,oEAAArG,OAAA0lD,cAAA93B,EAAA63B,EAAAzqD,SACAiG,EAGA,IADA,IAAAoT,EAAA,GACAyH,EAAA,EAAAA,EAAA2pC,EAAAzqD,OAAA8gB,IACAzH,EAAAoxC,EAAA3pC,IAAApf,EAAAof,GAEA,OAAA7a,EAAAC,OAAAmT,KACA,IAZA,IAmBAvZ,EAAAgV,UAAA5S,OAAA,CACAmrC,eAAA,gCAJA,IAAA1gB,OAAA,qCAOA7sB,EAAAgV,UAAAy1C,kBAAA,SAAAtpD,GACA,OAAAA,GAAAA,EAAAjB,OACAiB,EAAA+E,QAAA,SAAAC,EAAAuK,GACA,IAAA6I,EAAA,CACA0gC,QAAAvpC,EAAAupC,QACAzF,KAAA9jC,EAAA8jC,MA2CA,OAxCAj7B,EAAA4gC,QAAAzpC,EAAAypC,QAAAj0C,QAAA,SAAAC,EAAAgqC,GACA,IAAAvuC,EAAAuuC,EAAAtuC,MAAA,KACA,GAAA,GAAAD,EAAA1B,OAEA,OADAgK,QAAAqB,MAAA,yEAAArG,OAAAirC,IACAhqC,EAGA,IAAAkjC,EAAAznC,EAAA,GACA4nC,EAAA5nC,EAAA,GACA2tC,EAAA3tC,EAAA,GAEAO,EAAAnC,EAAAgV,UAAA5S,OAAAmrC,cAAAjrC,KAAAV,EAAA,IAGA,GAAAO,EAAA,CACA,IAAAH,EAAAG,EAAA,GACA,OAAAuO,EAAAupC,UAAA,GAAAvpC,EAAAupC,QAAAn7B,QAAA9c,GACAmE,EAAAC,OAAA,CACAijC,OAAAG,GAAA,EAAAH,EAAAA,EAAApoB,KAAAC,IAAA,GAAAsoB,GACAA,SAAAA,EACAxnC,OAAAA,IAJAmE,EAWA,OAAAA,EAAAC,OAAA,CACAijC,OAAAG,GAAA,EAAAH,EAAAA,EAAApoB,KAAAC,IAAA,GAAAsoB,GACAA,SAAAA,EACA+F,gBAAAA,MAGA,IAGAh2B,EAAA3V,OAAA2V,EAAA4gC,QAAAj6C,SACAqZ,EAAAsxC,WAAA,GAGA1kD,EAAAC,OAAAmT,KACA,IAhDA,IC1BA7X,EAAAsT,UAAA5S,OAAA,CACAC,YAAA,uCChFAa,EAAA4nD,QAAA,CAAA,SAAA,WAAA,cAAA,YACA/mD,EAAA+mD,QAAA,CAAA,SAAA,WAAA,KAAA,gBAAA,UAAA,cAAA,WAAA,aAAA,UAAA,MAAA,SAAA,aAAA,SAAA,cACA/8C,EAAA+8C,QAAA,CAAA,SAAA,eACAvnD,QAAA0Q,OAAA,2BAAA,CAAA,oBAEAmsB,OAAA,CAAA,iBAAA,SAAA2qB,GAGAA,EACA/2C,MAAA,YAAA,CACA2lB,IAAA,SACAd,MAAA,CACAmyB,YAAA,CACAr9C,YAAA,2BACA2vB,WAAA,mBAOAA,WAAA,YAAAp6B,GAEAo6B,WAAA,iBAAAv5B,GAEAu5B,WAAA,WAAAvvB,GCzBAE,EAAA68C,QAAA,CAAA,SAAA,SAAA,WAAA,gBAAA,cACAt8C,EAAAs8C,QAAA,CAAA,SAAA,WAAA,gBAAA,aAAA,cACAn8C,EAAAm8C,QAAA,CAAA,SAAA,SAAA,UAAA,yBAAA,WAAA,KAAA,gBAAA,UAAA,WAAA,aAAA,aAAA,kBAAA,SAAA,YACA/2C,EAAA+2C,QAAA,CAAA,UACAvnD,QAAA0Q,OAAA,0BAAA,CAAA,oBAEAmsB,OAAA,CAAA,iBAAA,SAAA2qB,GAGAA,EAGA/2C,MAAA,gBAAA,CACA2lB,IAAA,QACAd,MAAA,CACAmyB,YAAA,CACAr9C,YAAA,2BACA2vB,WAAA,mBAKAtpB,MAAA,WAAA,CACA2lB,IAAA,eACAd,MAAA,CACAmyB,YAAA,CACAr9C,YAAA,gCACA2vB,WAAA,eAKAtpB,MAAA,kBAAA,CACA2lB,IAAA,gBACAd,MAAA,CACAmyB,YAAA,CACAr9C,YAAA,gCACA2vB,WAAA,kBAUAA,WAAA,WAAArvB,GAEAqvB,WAAA,gBAAA9uB,GAEA8uB,WAAA,cAAA3uB,GAEA2uB,WAAA,eAAAvpB,GoBtDAxQ,QAAA0Q,OAAA,mBAAA,IAAAg3C,IAAA,CAAA,iBAAA,SAAAC,GAAAA,EAAArpB,IAAA,sBAAA,gyQACAqpB,EAAArpB,IAAA,6BAAA,sjGACAqpB,EAAArpB,IAAA,yBAAA,g4QACAqpB,EAAArpB,IAAA,0BAAA,gvDACAqpB,EAAArpB,IAAA,0BAAA,6QACAqpB,EAAArpB,IAAA,qCAAA,qaACAqpB,EAAArpB,IAAA,8BAAA,ynLACAqpB,EAAArpB,IAAA,uCAAA,yqEACAqpB,EAAArpB,IAAA,gDAAA,k1BACAqpB,EAAArpB,IAAA,0CAAA,6iEACAqpB,EAAArpB,IAAA,yCAAA,6hBACAqpB,EAAArpB,IAAA,0CAAA,iVACAqpB,EAAArpB,IAAA,wCAAA,ujBACAqpB,EAAArpB,IAAA,2CAAA,mvCACAqpB,EAAArpB,IAAA,mCAAA,wPACAqpB,EAAArpB,IAAA,sCAAA,yQACAqpB,EAAArpB,IAAA,qDAAA,m+CACAqpB,EAAArpB,IAAA,uCAAA,4vXACAqpB,EAAArpB,IAAA,kDAAA,47BACAqpB,EAAArpB,IAAA,wDAAA,8gBACAqpB,EAAArpB,IAAA,4CAAA,4YACAqpB,EAAArpB,IAAA,qCAAA,sZACAqpB,EAAArpB,IAAA,wCAAA,4rDACAqpB,EAAArpB,IAAA,wCAAA,oaACAqpB,EAAArpB,IAAA,wCAAA;AACAqpB,EAAArpB,IAAA,sCAAA,2lEACAqpB,EAAArpB,IAAA,uCAAA,2zBACAqpB,EAAArpB,IAAA,+BAAA,ogBACAqpB,EAAArpB,IAAA,sCAAA,uMACAqpB,EAAArpB,IAAA,wCAAA,gpEACAqpB,EAAArpB,IAAA,2CAAA,qtLACAqpB,EAAArpB,IAAA,oCAAA,63KACAqpB,EAAArpB,IAAA,iCAAA,iSACAqpB,EAAArpB,IAAA,sCAAA,yjBACAqpB,EAAArpB,IAAA,wCAAA,+/BACAqpB,EAAArpB,IAAA,0CAAA,8aACAqpB,EAAArpB,IAAA,wCAAA,61BACAqpB,EAAArpB,IAAA,2CAAA,04DACAqpB,EAAArpB,IAAA,2BAAA,gsFACAqpB,EAAArpB,IAAA,iCAAA,8lBACAqpB,EAAArpB,IAAA,gCAAA,kUACAqpB,EAAArpB,IAAA,2BAAA,ilKACAqpB,EAAArpB,IAAA,gDAAA,s3GACAqpB,EAAArpB,IAAA,wCAAA,yzYACAqpB,EAAArpB,IAAA,wCAAA,mhRACAqpB,EAAArpB,IAAA,wCAAA,qtDACAqpB,EAAArpB,IAAA,kCAAA,+hFACAqpB,EAAArpB,IAAA,mCAAA,m4BACAqpB,EAAArpB,IAAA,iCAAA,ioCACAqpB,EAAArpB,IAAA,mCAAA,goFACAqpB,EAAArpB,IAAA,4CAAA,wgDACAqpB,EAAArpB,IAAA,wCAAA,mLACAqpB,EAAArpB,IAAA,mCAAA,msBACAqpB,EAAArpB,IAAA,uCAAA,kzCACAqpB,EAAArpB,IAAA,2CAAA,4rHACAqpB,EAAArpB,IAAA,qCAAA,4tDACAqpB,EAAArpB,IAAA,gDAAA,q8BACAqpB,EAAArpB,IAAA,uCAAA,kzDACAqpB,EAAArpB,IAAA,2CAAA,uoBACAqpB,EAAArpB,IAAA,yCAAA,mgCACAqpB,EAAArpB,IAAA,2CAAA,6yEACAqpB,EAAArpB,IAAA,sCAAA,6mHACAqpB,EAAArpB,IAAA,mCAAA,wiHACAqpB,EAAArpB,IAAA,0CAAA,2hBACAqpB,EAAArpB,IAAA,qCAAA,k9CACAqpB,EAAArpB,IAAA,mCAAA,02QACAqpB,EAAArpB,IAAA,gCAAA,uuEACAqpB,EAAArpB,IAAA,gCAAA,4sBACAqpB,EAAArpB,IAAA,uCAAA,yzMACAqpB,EAAArpB,IAAA,uCAAA,+mBACAqpB,EAAArpB,IAAA,qCAAA,g5BACAqpB,EAAArpB,IAAA,wCAAA,4nEACAqpB,EAAArpB,IAAA,qCAAA,mpBACAqpB,EAAArpB,IAAA,uCAAA;AACAqpB,EAAArpB,IAAA,sCAAA,iiNACAqpB,EAAArpB,IAAA,kDAAA,w2EACAqpB,EAAArpB,IAAA,oCAAA,24NACAqpB,EAAArpB,IAAA,uCAAA,8qLACAqpB,EAAArpB,IAAA,6CAAA,gwEACAqpB,EAAArpB,IAAA,wCAAA,giDACAqpB,EAAArpB,IAAA,2CAAA,+6CACAqpB,EAAArpB,IAAA,gDAAA,qoDACAqpB,EAAArpB,IAAA,mDAAA,85DACAqpB,EAAArpB,IAAA,4BAAA,sUACAqpB,EAAArpB,IAAA,iCAAA,87JACAqpB,EAAArpB,IAAA,+BAAA,gfACAqpB,EAAArpB,IAAA,4CAAA,orBACAqpB,EAAArpB,IAAA,kCAAA,kgCACAqpB,EAAArpB,IAAA,kDAAA,knDACAqpB,EAAArpB,IAAA,yCAAA,msHACAqpB,EAAArpB,IAAA,mCAAA,64LACAqpB,EAAArpB,IAAA,sCAAA,suHACAqpB,EAAArpB,IAAA,0CAAA,4zBACAqpB,EAAArpB,IAAA,2CAAA,wcACAqpB,EAAArpB,IAAA,8CAAA,sXACAqpB,EAAArpB,IAAA,uCAAA,+PACAqpB,EAAArpB,IAAA,yCAAA,wwDACAqpB,EAAArpB,IAAA,+CAAA,k1CACAqpB,EAAArpB,IAAA,+CAAA,kqEACAqpB,EAAArpB,IAAA,2CAAA,+4BACAqpB,EAAArpB,IAAA,6CAAA,0mCACAqpB,EAAArpB,IAAA,6CAAA,woCACAqpB,EAAArpB,IAAA,6CAAA,yrBACAqpB,EAAArpB,IAAA,0CAAA,mjFACAqpB,EAAArpB,IAAA,uDAAA,+qDACAqpB,EAAArpB,IAAA,kDAAA,2nCACAqpB,EAAArpB,IAAA,kDAAA,s+CACAqpB,EAAArpB,IAAA,kDAAA,4hBACAqpB,EAAArpB,IAAA,sDAAA,81CACAqpB,EAAArpB,IAAA,+CAAA,2vDACAqpB,EAAArpB,IAAA,+CAAA,qgDACAqpB,EAAArpB,IAAA,mDAAA,4rBACAqpB,EAAArpB,IAAA,qCAAA,mhBACAqpB,EAAArpB,IAAA,sDAAA,stBCjHAt+B,QAAA0Q,OAAA,sBAAA,IAAAmsB,OAAA,CAAA,qBAAA,SAAA+qB,GACAA,EAAAl4B,aAAA,QAAA,CACAm4B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,kBACAnmD,OAAA,aACAomD,OAAA,SACAC,MAAA,QACAC,OAAA,KACAC,QAAA,MACAC,OAAA,KACAC,SAAA,OACAC,eAAA,iBACAC,qBAAA,WACAC,SAAA,OACAC,aAAA,YACAC,iBAAA,gBACAC,SAAA,OACAC,gBAAA,WACAC,kBAAA,yBACAC,SAAA,OACAC,SAAA,OACAC,WAAA,SACAC,WAAA,SACAC,UAAA,QACAC,UAAA,QACAC,UAAA,UACAC,WAAA,SACAC,gBAAA,cACAC,UAAA,QACAC,SAAA,OACAC,WAAA,SACAC,QAAA,MACAC,WAAA,SACAC,YAAA,UACAC,UAAA,QACAC,UAAA,QACAC,aAAA,WACAC,WAAA,SACAC,eAAA,eACAC,YAAA,UACAC,cAAA,gBACAC,qBAAA,uBACAC,aAAA,WACAC,+BAAA,6BACAC,WAAA,SACAC,YAAA,wCACAC,KAAA,OACAC,oBAAA,kCACAC,iBAAA,kBACAC,QAAA,aACAC,aAAA,gEACAC,UAAA,eACAC,KAAA,OACAC,GAAA,KACAC,KAAA,OACAC,SAAA,WACAC,mBAAA,qBACA9L,GAAA,KACA+L,aAAA,mBACAC,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,UACAC,IAAA,YACAC,OAAA,UACAC,QAAA,WACAC,aAAA,WACAC,cAAA,oBACAC,eAAA,4CACAC,YAAA,yBACAC,sBAAA,UACAC,qBAAA,UACAC,UAAA,YACAC,gBAAA,+BACAC,cAAA,CACAC,MAAA,QACAC,iBAAA,mBACAC,kBAAA,oBACAC,kBAAA,qBACAC,oBAAA,oBAEAriC,KAAA,CACAsiC,KAAA,QACAC,KAAA,QACAC,KAAA,QACAC,WAAA,kBAGAC,OAAA,CACAC,oBAAA,iBACAC,oBAAA,UACAC,mBAAA,iBAEAC,KAAA,CACAC,KAAA,OACAC,IAAA,WACA7lB,SAAA,WACA8lB,QAAA,aACAC,QAAA,aACAC,SAAA,WACAC,QAAA,UACAC,aAAA,mBAEAC,MAAA,CACArB,MAAA,QACAsB,QAAA,mDACAC,eAAA,8FACAC,cAAA,wFACAC,KAAA,eACAC,kBAAA,qBACAC,WAAA,cACAC,MAAA,SACAC,oBAAA,iCACAC,aAAA,kBACAC,oBAAA,yBAEAjB,KAAA,CACAd,MAAA,SACAgC,QAAA,qCACAC,QAAA,0DACAC,aAAA,mBACAC,UAAA,QACAC,SAAA,OACAN,aAAA,kBACAO,0BAAA,qFACAC,mBAAA,0BACAC,iBAAA,8LACAC,cAAA,WACAC,UAAA,YACAC,YAAA,UAEAxB,SAAA,CACAlB,MAAA,WACA2C,gBAAA,UACAC,gBAAA,UACAC,iBAAA,UACAC,KAAA,uBACAC,WAAA,eACAC,uBAAA,2BACAC,cAAA,sCACAC,mBAAA,sGACAC,kBAAA,uBACAC,uBAAA,mCACAC,iBAAA,aACAC,uBAAA,kBACAC,4BAAA,yFACAC,eAAA,8BACAC,gBAAA,+BACAC,kBAAA,wBACAC,iBAAA,qBACAC,mBAAA,8BACAC,wBAAA,4BACAC,6BAAA,oDACAC,wBAAA,iBACAC,UAAA,+BACAC,gBAAA,aACAC,eAAA,qDACAC,iBAAA,CACAC,MAAA,uBACAC,QAAA,iCACAC,OAAA,mCACAC,QAAA,mCACAC,KAAA,iCACAC,OAAA,6BAEAC,aAAA,eACAC,kBAAA,2HACAC,YAAA,gBACAC,iBAAA,2FACAC,iBAAA,aACAC,UAAA,yBACAC,YAAA,qBACAC,iBAAA,4BACAC,sBAAA,yBACAC,4BAAA,sBACAC,2BAAA,8DACAC,sBAAA,CACAC,KAAA,WACA9wC,EAAA,gDAEA+wC,WAAA,CACAvF,MAAA,eACAwF,KAAA,UACAC,UAAA,uBACAC,QAAA,WACAC,aAAA,mBACAC,cAAA,gBAGAC,WAAA,CACAC,KAAA,iBACAC,KAAA,CACAC,aAAA,wCACAC,cAAA,gBACAjG,MAAA,kCACAkG,YAAA,cACAC,SAAA,gBACAC,kBAAA,yBACAnoC,QAAA,iBACA6nC,KAAA,gBACAO,wBAAA,4DACAC,MAAA,6BACAC,QAAA,qBACAC,aAAA,yCACAC,aAAA,OACAC,iBAAA,iBACAC,cAAA,UACAC,cAAA,WACAC,mBAAA,0CACAC,cAAA,UACAC,mBAAA,yCACAC,eAAA,mBACAC,oBAAA,6EACAC,cAAA,qBACAC,mBAAA,yCACAC,SAAA,eACAC,WAAA,iBACAC,cAAA,SACAC,4BAAA,oBACAC,mBAAA,CACAC,IAAA,MACAC,GAAA,MAEA/pB,mBAAA,CACAjD,IAAA,gCACAitB,IAAA,sCACAC,IAAA,iBACAC,KAAA,iBAGAC,OAAA,CACA9H,MAAA,SACA+H,SAAA,UACAC,YAAA,eACAC,YAAA,YAGA/sB,SAAA,CACA6qB,KAAA,CACA/F,MAAA,WACAkI,aAAA,WACAC,QAAA,eACAC,YAAA,UACAC,WAAA,SACAC,2BAAA,iQACAC,sBAAA,gBACAC,cAAA,gBACAC,QAAA,gBACAC,kBAAA,8DACAC,cAAA,QACAC,KAAA,gBACAC,MAAA,cACA7V,GAAA,qBACA8V,SAAA,iBACAC,YAAA,0BACAxC,QAAA,oBACAyC,oBAAA,oBACAC,OAAA,4BACAC,QAAA,+BACAC,UAAA,6CACAC,cAAA,SACAC,gBAAA,4FACAC,gBAAA,uCACAC,aAAA,uDACAC,UAAA,oDACAC,WAAA,0EACAC,WAAA,uDACAC,aAAA,oDACAC,UAAA,4DACAC,YAAA,iDACAC,SAAA,kEACAC,kBAAA,yBACAC,SAAA,6FACAC,iBAAA,2EACAC,SAAA,0EACAC,aAAA,oCACAC,QAAA,UACAC,aAAA,UACAC,kBAAA,qBACAC,iBAAA,eACAC,YAAA,gBAEAlJ,QAAA,CACAtB,MAAA,mBACAhC,aAAA,gBACAyM,gBAAA,4BAGAtJ,QAAA,CACA4E,KAAA,CACAgD,YAAA,kBACA2B,cAAA,mBACAC,aAAA,WACAC,SAAA,YACAC,iBAAA,kDACAC,iBAAA,uCACAC,OAAA,cACAC,eAAA,iBACAC,WAAA,wBACAC,UAAA,CACArwB,KAAA,wBACAE,OAAA,eACAD,KAAA,gBACAqwB,YAAA,sBAGAC,KAAA,CACAC,eAAA,8EAGAvI,KAAA,CACAwI,MAAA,QACAC,gBAAA,kBACAC,OAAA,SACAC,QAAA,UACAC,aAAA,eACAC,UAAA,cACAlD,QAAA,UACAmD,aAAA,eACAC,UAAA,YACAC,WAAA,aACAC,IAAA,MACAC,cAAA,UACApM,qBAAA,SACAqM,QAAA,UACAC,cAAA,gBACAC,cAAA,YACApG,KAAA,CACA/F,MAAA,OACAoM,MAAA,YACAC,iBAAA,uBACAC,uBAAA,iCACAtE,YAAA,cACAuE,YAAA,gBACAC,gBAAA,sBACAC,MAAA,CACAC,uBAAA,kDACAC,mBAAA,6BAIA5L,IAAA,CACA6L,YAAA,gCACAC,0BAAA,8GACAC,iBAAA,gBACAC,uBAAA,2BACAC,iBAAA,6BACAC,uBAAA,yBACAC,uBAAA,eACAC,6BAAA,qBACAC,sCAAA,kBACAC,UAAA,UACAC,sBAAA,yBACAC,QAAA,UACAC,OAAA,YACAjC,gBAAA,8BACAkC,iBAAA,8BACAjB,gBAAA,sBACAkB,mBAAA,qBACAC,wBAAA,mEACAvH,kBAAA,iBACAwH,YAAA,UACAC,gBAAA,eACAC,uBAAA,oBACAC,mBAAA,qBACAhI,KAAA,CACAiI,oBAAA,sBAEAlG,OAAA,CACA9H,MAAA,WACAiO,UAAA,eACAC,gBAAA,oBACAC,QAAA,yBACAC,cAAA,kCACAC,WAAA,yCACAC,YAAA,iDACAC,cAAA,iBACAC,YAAA,wBACA3O,UAAA,YACAC,gBAAA,+BACA2O,WAAA,4BACAC,aAAA,eAEAC,SAAA,CACA3O,MAAA,YAEA4O,MAAA,CACA5O,MAAA,UAEA6O,eAAA,CACA7O,MAAA,2BACA8O,QAAA,0BACAC,KAAA,qCACAC,aAAA,yBACAC,SAAA,0BACAC,YAAA,qCACAzC,MAAA,mCACA0C,cAAA,oBAEAC,WAAA,CACApP,MAAA,wBAEAqP,qBAAA,CACArP,MAAA,gCACA8O,QAAA,sBACAC,KAAA,iCACAC,aAAA,yBACAM,KAAA,sBACAC,QAAA,iCACA9C,MAAA,mCAGA+C,MAAA,CACAxP,MAAA,wCACAyP,iBAAA,yFACAC,iBAAA,qCACAC,eAAA,mCACAC,eAAA,gCACAC,KAAA,oBACAC,UAAA,oBACAC,UAAA,6BACAC,SAAA,WACAC,cAAA,WACAC,YAAA,0BACA7R,oBAAA,6BACA8R,sBAAA,4BACAC,eAAA,oBACAC,oBAAA,wBACAC,aAAA,mBACAC,kBAAA,eACAC,YAAA,gBACAC,iBAAA,mBACAC,qBAAA,UACAC,mBAAA,uDACAC,kBAAA,wBACAC,YAAA,CACA7Q,MAAA,cACAiC,QAAA,uGACA6O,YAAA,UACAC,aAAA,uCAEAC,OAAA,CACAC,eAAA,iCACAC,gBAAA,gBACAnzC,KAAA,gBACAxoB,OAAA,0BACA47D,KAAA,kBAEAC,OAAA,CACA78C,OAAA,aACAK,QAAA,gBACAy8C,OAAA,cACAC,QAAA,eACAC,QAAA,eACAC,KAAA,iBACAh9C,EAAA,YACAC,EAAA,WACAC,EAAA,YAEAqJ,KAAA,CACA0zC,KAAA,0GAGAC,KAAA,CACA1R,MAAA,iDACA2R,SAAA,eACAC,aAAA,gCACAC,kBAAA,yEACAC,qBAAA,qFACAlC,eAAA,6DAEA5O,QAAA,CACAhB,MAAA,aACA+R,QAAA,UACAC,QAAA,gCACAC,gBAAA,kBACAC,MAAA,iBACAC,aAAA,YACAC,YAAA,WACAC,aAAA,qDACAC,WAAA,uBACAC,cAAA,+BACAC,SAAA,2BACAC,cAAA,oBACAC,oBAAA,gCACAC,OAAA,SACAC,cAAA,mUACAC,mBAAA,mDACAC,uBAAA,iOACAC,4BAAA,wTACAC,4BAAA,qGACAC,2BAAA,sKACAC,sBAAA,oJACAC,sCAAA,sLACAC,sBAAA,oKACAC,oBAAA,0BACAC,0BAAA,iBACA9J,UAAA,kCACA+J,kBAAA,UACAC,mCAAA,gCACAC,mBAAA,iCACAC,qBAAA,mBACAC,0BAAA,sBACAC,wBAAA,uBACAC,kBAAA,0BACAC,iBAAA,yBACAC,uBAAA,CACA/T,MAAA,gBACAgU,YAAA,qDACAC,iBAAA,kFACAC,cAAA,8BAEAC,IAAA,CACAnU,MAAA,eACAoU,mBAAA,8JACAC,uBAAA,+GACAC,4BAAA,wFACAC,WAAA,gHACAC,kBAAA,wJACAC,uBAAA,qHACAC,oBAAA,wCACAC,eAAA,iBACAC,qBAAA,0BACAC,oBAAA,wFACAC,eAAA,gBACAC,qBAAA,kBACAC,oBAAA,4IACAC,aAAA,0LACAC,iBAAA,+KACAC,eAAA,qPACA3H,OAAA,YACA4H,YAAA,SACAC,aAAA,UACAC,kBAAA,gCACAC,iBAAA,UACAC,sBAAA,uBACAC,cAAA,gBACAC,iBAAA,eACAC,0BAAA,2VACAC,4BAAA,4NACAC,4BAAA,+KACAC,gBAAA,cACAC,iBAAA,8BACAC,qBAAA,kCACAC,aAAA,2FACAC,WAAA,WACAC,mBAAA,wBAEAC,eAAA,CACApW,MAAA,oBACAyR,KAAA,wDAEA4E,sBAAA,CACArW,MAAA,qBACAyR,KAAA,+LAEA6E,oBAAA,CACAtW,MAAA,oBAEAuW,YAAA,CACAvW,MAAA,aACAwW,QAAA,eACAxY,aAAA,oBACAyY,qBAAA,wBACAC,UAAA,sBACAtZ,WAAA,+BACAuZ,WAAA,oBACAC,gBAAA,sDACAC,WAAA,UACAC,aAAA,CACA9W,MAAA,oBACAyR,KAAA,uBACAsF,UAAA,eAEAC,aAAA,CACAhX,MAAA,2BACAyR,KAAA,uHACAwF,aAAA,sDACAC,cAAA,kBAGAC,SAAA,CACAC,aAAA,sBACAC,UAAA,QACAtS,UAAA,QACAuS,gBAAA,yBACAC,qBAAA,sLACAC,iBAAA,gCACAC,sBAAA,wMACAC,iBAAA,mEACAC,cAAA,wBACAC,mBAAA,wLACAC,cAAA,sBACAC,mBAAA,qNACAC,WAAA,wDACAC,MAAA,iBACAC,UAAA,2DACAC,aAAA,8DACAC,WAAA,0DACAC,WAAA,wCACAC,WAAA,oDACAC,WAAA,iDACAC,WAAA,6CACAC,WAAA,6DACAC,WAAA,0CACAC,WAAA,uCACAC,WAAA,4CACAC,YAAA,iDACAC,YAAA,4EACAC,YAAA,kEACAC,YAAA,wCACAC,YAAA,yCACAC,YAAA,qDACAC,YAAA,0DACAC,YAAA,wCACAC,YAAA,iDACAC,YAAA,qCACAC,WAAA,yBACAC,gBAAA,0HACAC,uBAAA,4DACAC,qBAAA,8BACAC,iCAAA,kMACAC,0BAAA,8IACAC,kBAAA,kCACAC,uBAAA,wQACAC,oBAAA,8DACAC,QAAA,yBACAC,aAAA,wLACAC,aAAA,+DACAja,MAAA,uBACAka,QAAA,CACAC,cAAA,iBACAC,mBAAA,gMACAC,WAAA,6BACAC,gBAAA,6KACAC,YAAA,uCACAC,iBAAA,kIACAC,eAAA,CACAza,MAAA,0BACAyR,KAAA,+BACAxB,cAAA,cAEAxD,MAAA,CACA3vD,aAAA,iBACAuhB,aAAA,kBAIAq8C,UAAA,oGACAC,QAAA,CACAC,KAAA,OACAC,OAAA,SACA1/B,QAAA,YAGA2/B,SAAA,CACA9a,MAAA,WACA+a,UAAA,iBACAC,cAAA,oBACAtc,KAAA,OACAC,GAAA,KACAkc,OAAA,SACAI,YAAA,SACA9/B,QAAA,UACA+/B,aAAA,qBACAlf,SAAA,OACAmf,gBAAA,gBACAC,KAAA,kBACAC,QAAA,KACAC,uBAAA,+DACA1M,MAAA,CACA5O,MAAA,aAGAyM,MAAA,CACA8O,mBAAA,qBACAC,wBAAA,qCACAC,YAAA,QACAC,cAAA,gBACAC,qBAAA,8DACAC,wBAAA,wCACAC,iBAAA,mCACAC,eAAA,2CACAC,eAAA,0BACAC,gBAAA,iCACAC,4BAAA,qDACAC,eAAA,iCACAC,2BAAA,oDACAC,UAAA,yBACAC,UAAA,yBACAC,aAAA,2CACAC,iBAAA,wBACAC,cAAA,0BACAC,gBAAA,yBACAC,uBAAA,gCACAC,mBAAA,kCACAC,qBAAA,kCACAC,0BAAA,8BACAC,+BAAA,yFACAC,wCAAA,4IACAC,gCAAA,gFACAC,aAAA,uBACAC,qBAAA,2BACAC,yBAAA,wCACAC,0BAAA,8CACAC,2BAAA,6CACAC,oBAAA,4BACAC,uBAAA,qCACAC,oBAAA,+CACAC,eAAA,8BACAC,iBAAA,kFACAC,mBAAA,qHACAC,wBAAA,4CACAC,0BAAA,oDACAC,uBAAA,mCACAC,sBAAA,8BACAC,oBAAA,yBACAC,YAAA,0BACAC,oBAAA,uBACAC,kBAAA,iBACAC,sBAAA,mDACAC,iBAAA,wBACAC,gBAAA,sBACAC,gBAAA,+BACAC,kBAAA,qBACAC,qBAAA,sCACAC,gBAAA,oEACAC,gBAAA,sCACAC,eAAA,+BACAC,wBAAA,oBACAC,iBAAA,2EACAC,2BAAA,4IACAC,4BAAA,6HACAC,4BAAA,uMACAC,iBAAA,sFACApiC,sBAAA,uIACAqiC,mBAAA,qBACAC,mBAAA,8CACAC,+BAAA,wBACAC,0BAAA,iOACAC,wBAAA,gKACAC,eAAA,qIACAC,mBAAA,iEACAC,cAAA,2BACAC,oBAAA,uDACAC,oBAAA,gCACAC,kBAAA,yBACAC,gBAAA,+BACAC,yBAAA,oIACAC,iCAAA,uJACAC,wBAAA,oBACAC,sBAAA,8BACAC,oBAAA,wCACAC,oCAAA,+DACAC,kDAAA,+EACAC,kCAAA,gFACAC,iBAAA,4BACAC,mBAAA,mCACAC,2BAAA,2CACAC,kBAAA,6CACAC,+BAAA,uCACAC,kBAAA,6BACAC,iBAAA,sBACAC,0BAAA,8CACAC,uBAAA,sDACAC,mBAAA,8CACAC,iBAAA,+HACAC,yBAAA,+EACAC,wBAAA,6BACAC,yBAAA,2FACAC,oBAAA,+HACAC,4BAAA,kCACAC,0BAAA,yCACAC,wBAAA,sCACAC,wBAAA,sCACAC,0BAAA,+GACAC,8BAAA,uCACAC,kBAAA,4BACAC,2BAAA,yCACAC,oBAAA,uBACAC,kBAAA,oDAEA3W,KAAA,CACAqQ,YAAA,cACAuG,mBAAA,+BACAxD,kBAAA,oBACAyD,cAAA,qCACAC,uBAAA,iBACAC,oBAAA,6BACAC,oBAAA,oBACAC,qCAAA,wFACAC,yBAAA,sGACAC,2BAAA,kPACAC,gBAAA,+BACAC,gCAAA,2EACAC,yBAAA,4FACAC,iBAAA,2BAEAC,QAAA,CACAnH,YAAA,sBACAoH,oBAAA,iBACAC,6BAAA,iEACAC,wBAAA,kBACAC,cAAA,6VACAC,WAAA,uCACAC,SAAA,0BACApI,SAAA,uPACAqI,aAAA,kUACAC,eAAA;AACAC,iBAAA,6GACAC,0BAAA,gBACAC,oBAAA,kKACAC,aAAA,4JACAC,eAAA,+EACAC,WAAA,wEACAC,iBAAA,kEACAC,gBAAA,gOACAC,kBAAA,wGACAC,0BAAA,gLACAC,kBAAA,mEACAC,wBAAA,oBACAC,OAAA,mCACAC,kBAAA,uHACAC,mBAAA,8PAEAC,SAAA,CACA3I,YAAA,yBACA4I,qBAAA,sPAEA5S,KAAA,CACAzR,MAAA,cACAskB,KAAA,CACAC,QAAA,OACA1U,KAAA,ggBACAG,SAAA,kbACAxC,OAAA,oWAEAgC,MAAA,CACA+U,QAAA,SACAhvE,OAAA,qBACAivE,WAAA,+dACAxT,OAAA,qBACAyT,WAAA,yhBAEAC,SAAA,CACAH,QAAA,WACAC,WAAA,8IACA7oB,OAAA,SACAgpB,WAAA,uPACAC,eAAA,iBACAC,mBAAA,4gBACAhf,WAAA,aACAif,eAAA,wRACAC,uBAAA,6jBACAhkB,IAAA,qBACAikB,QAAA,qHACAC,cAAA,gBACAC,kBAAA,4LAEAC,IAAA,CACAC,kBAAA,0GACAC,aAAA,6EACAC,cAAA,sPACAC,uBAAA,gWACAC,qBAAA,uRACAC,iCAAA,wRACAb,eAAA,4MACAc,iBAAA,sFACAC,mBAAA,oIACAC,cAAA,2NACAC,2BAAA,2NACAC,0BAAA,wQACAC,iBAAA,sGACAC,wBAAA,yFACAC,sBAAA,gFACAC,+BAAA,2EACAC,4BAAA,wEACAC,eAAA,6CACAC,wBAAA,kWACAC,2BAAA,uQACAC,cAAA,2HACAC,YAAA,wCACAC,qBAAA,mFACAC,eAAA,qJACAC,sBAAA,qDACAC,eAAA,sLACAC,kBAAA,2LACAC,iBAAA,qGACAC,YAAA,iHACAC,aAAA,0GACAC,mBAAA,6IACAC,gBAAA,mJACAC,kBAAA,qDACAC,wBAAA,iQACAC,8BAAA,2HACAC,8BAAA,wFACAC,iBAAA,uGACAvE,cAAA,4LACAwE,kBAAA,oLACAC,uBAAA,gDACAC,qBAAA,qTACAC,UAAA,mFACAC,cAAA,gLAGA7b,IAAA,CACAxQ,OAAA,CACAssB,SAAA,oBACAC,cAAA,mCACAC,kBAAA,mBACAC,uBAAA,2DACAzlB,iBAAA,0IAEAzB,KAAA,CACAd,MAAA,oDACAiC,QAAA,kLACAgmB,cAAA,kGACAC,WAAA,uBAEApN,SAAA,CACA9a,MAAA,mDACAmoB,YAAA,iBACArZ,QAAA,iBACA+L,OAAA,UACAuN,aAAA,4BACAC,KAAA,QACA9yE,OAAA,+BACA4lC,QAAA,mBACAmtC,KAAA,gBACAC,KAAA,CACA1Y,KAAA,OACAG,SAAA,OACAz6D,OAAA,+CACAk8D,KAAA,6MACA+W,gBAAA,8JAEApd,KAAA,CACAqd,8BAAA,mDACAC,oBAAA,wDACAC,6BAAA,wDACAC,mBAAA,8DAEAnc,MAAA,CACAoc,gBAAA,mBAGAC,IAAA,CACAC,oBAAA,cACAC,YAAA,kBACAC,mBAAA,aACAC,qBAAA,+CACAC,aAAA,WACAC,UAAA,wFACAC,YAAA,2BACAC,iBAAA,qBACAC,aAAA,8CACAC,eAAA,kDACAC,kBAAA,sBACAC,eAAA,QACAC,iBAAA,kBACAC,qBAAA,aACA9O,SAAA,CACA9a,MAAA,WACAgU,YAAA,wJACA6V,aAAA,yBACAC,kBAAA,oCACAC,aAAA,SACAC,kBAAA,gCACAC,cAAA,yBACAC,mBAAA,8FACAC,WAAA,iCACAC,gBAAA,uHACAC,mBAAA,kBACAC,wBAAA,gOACAC,iBAAA,mBACAC,sBAAA,mIACAC,qBAAA,yBACAC,0BAAA,wFACAC,cAAA,2BACAC,eAAA,cACAC,4BAAA,iCACAC,6BAAA,eACAC,yBAAA,cACAC,wBAAA,mBACAC,6BAAA,mDACAC,0BAAA,aACAC,+BAAA,sCACAC,yBAAA,OACAC,0BAAA,QACAC,+BAAA,iBACAC,yBAAA,UACAC,4BAAA,eACAC,2BAAA,cACAC,6BAAA,UACAC,6BAAA,yBAOArwB,EAAAl4B,aAAA,KAAA,CACAm4B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,kBACAnmD,OAAA,aACAomD,OAAA,SACAC,MAAA,QACAC,OAAA,KACAC,QAAA,MACAC,OAAA,KACAC,SAAA,OACAC,eAAA,iBACAC,qBAAA,WACAC,SAAA,OACAC,aAAA,YACAC,iBAAA,gBACAC,SAAA,OACAC,gBAAA,WACAC,kBAAA,yBACAC,SAAA,OACAC,SAAA,OACAC,WAAA,SACAC,WAAA,SACAC,UAAA,QACAC,UAAA,QACAC,UAAA,UACAC,WAAA,SACAC,gBAAA,cACAC,UAAA,QACAC,SAAA,OACAC,WAAA,SACAC,QAAA,MACAC,WAAA,SACAC,YAAA,UACAC,UAAA,QACAC,UAAA,QACAC,aAAA,WACAC,WAAA,SACAC,eAAA,eACAC,YAAA,UACAC,cAAA,gBACAC,qBAAA,uBACAC,aAAA,WACAC,+BAAA,6BACAC,WAAA,SACAC,YAAA,wCACAC,KAAA,OACAC,oBAAA,kCACAC,iBAAA,kBACAC,QAAA,aACAC,aAAA,gEACAC,UAAA,eACAC,KAAA,OACAC,GAAA,KACAC,KAAA,OACAC,SAAA,WACAC,mBAAA,qBACA9L,GAAA,KACA+L,aAAA,mBACAC,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,UACAC,IAAA,YACAC,OAAA,UACAC,QAAA,WACAC,aAAA,WACAC,cAAA,oBACAC,eAAA,4CACAC,YAAA,yBACAC,sBAAA,UACAC,qBAAA,UACAC,UAAA,YACAC,gBAAA,+BACAC,cAAA,CACAC,MAAA,QACAC,iBAAA,mBACAC,kBAAA,oBACAC,kBAAA,qBACAC,oBAAA,oBAEAriC,KAAA,CACAsiC,KAAA,QACAC,KAAA,QACAC,KAAA,QACAC,WAAA,kBAGAC,OAAA,CACAC,oBAAA,iBACAC,oBAAA,UACAC,mBAAA,iBAEAC,KAAA,CACAC,KAAA,OACAC,IAAA,WACA7lB,SAAA,WACA8lB,QAAA,aACAC,QAAA,aACAC,SAAA,WACAC,QAAA,UACAC,aAAA,mBAEAC,MAAA,CACArB,MAAA,QACAsB,QAAA,mDACAC,eAAA,8FACAC,cAAA,wFACAC,KAAA,eACAC,kBAAA,qBACAC,WAAA,cACAC,MAAA,SACAC,oBAAA,iCACAC,aAAA,kBACAC,oBAAA,yBAEAjB,KAAA,CACAd,MAAA,SACAgC,QAAA,qCACAC,QAAA,0DACAC,aAAA,mBACAC,UAAA,QACAC,SAAA,OACAN,aAAA,kBACAO,0BAAA,qFACAC,mBAAA,0BACAC,iBAAA,8LACAC,cAAA,WACAC,UAAA,YACAC,YAAA,UAEAxB,SAAA,CACAlB,MAAA,WACA2C,gBAAA,UACAC,gBAAA,UACAC,iBAAA,UACAC,KAAA,uBACAC,WAAA,eACAC,uBAAA,2BACAC,cAAA,sCACAC,mBAAA,sGACAC,kBAAA,uBACAC,uBAAA,mCACAC,iBAAA,aACAC,uBAAA,kBACAC,4BAAA,yFACAC,eAAA,8BACAC,gBAAA,+BACAC,kBAAA,wBACAC,iBAAA,qBACAC,mBAAA,8BACAC,wBAAA,4BACAC,6BAAA,oDACAC,wBAAA,iBACAC,UAAA,+BACAC,gBAAA,aACAC,eAAA,qDACAC,iBAAA,CACAC,MAAA,uBACAC,QAAA,iCACAC,OAAA,mCACAC,QAAA,mCACAC,KAAA,iCACAC,OAAA,6BAEAC,aAAA,eACAC,kBAAA,2HACAC,YAAA,gBACAC,iBAAA,2FACAC,iBAAA,aACAC,UAAA,yBACAC,YAAA,qBACAC,iBAAA,4BACAC,sBAAA,yBACAC,4BAAA,sBACAC,2BAAA,8DACAC,sBAAA,CACAC,KAAA,WACA9wC,EAAA,gDAEA+wC,WAAA,CACAvF,MAAA,eACAwF,KAAA,UACAC,UAAA,uBACAC,QAAA,WACAC,aAAA,mBACAC,cAAA,gBAGAC,WAAA,CACAC,KAAA,iBACAC,KAAA,CACAC,aAAA,wCACAC,cAAA,gBACAjG,MAAA,kCACAkG,YAAA,cACAC,SAAA,gBACAC,kBAAA,yBACAnoC,QAAA,iBACA6nC,KAAA,gBACAO,wBAAA,4DACAC,MAAA,6BACAC,QAAA,qBACAC,aAAA,yCACAC,aAAA,OACAC,iBAAA,iBACAC,cAAA,UACAC,cAAA,WACAC,mBAAA,0CACAC,cAAA,UACAC,mBAAA,yCACAC,eAAA,mBACAC,oBAAA,6EACAC,cAAA,qBACAC,mBAAA,yCACAC,SAAA,eACAC,WAAA,iBACAC,cAAA,SACAC,4BAAA,oBACAC,mBAAA,CACAC,IAAA,MACAC,GAAA,MAEA/pB,mBAAA,CACAjD,IAAA,gCACAitB,IAAA,sCACAC,IAAA,iBACAC,KAAA,iBAGAC,OAAA,CACA9H,MAAA,SACA+H,SAAA,UACAC,YAAA,eACAC,YAAA,YAGA/sB,SAAA,CACA6qB,KAAA,CACA/F,MAAA,WACAkI,aAAA,WACAC,QAAA,eACAC,YAAA,UACAC,WAAA,SACAC,2BAAA,iQACAC,sBAAA,gBACAC,cAAA,gBACAC,QAAA,gBACAC,kBAAA,8DACAC,cAAA,QACAC,KAAA,gBACAC,MAAA,cACA7V,GAAA,qBACA8V,SAAA,iBACAC,YAAA,0BACAxC,QAAA,oBACAyC,oBAAA,oBACAC,OAAA,4BACAC,QAAA,+BACAC,UAAA,6CACAC,cAAA,SACAC,gBAAA,4FACAC,gBAAA,uCACAC,aAAA,uDACAC,UAAA,oDACAC,WAAA,0EACAC,WAAA,uDACAC,aAAA,oDACAC,UAAA,4DACAC,YAAA,iDACAC,SAAA,kEACAC,kBAAA,yBACAC,SAAA,6FACAC,iBAAA,2EACAC,SAAA,0EACAC,aAAA,oCACAC,QAAA,UACAC,aAAA,UACAC,kBAAA,qBACAC,iBAAA,eACAC,YAAA,gBAEAlJ,QAAA,CACAtB,MAAA,mBACAhC,aAAA,gBACAyM,gBAAA,4BAGAtJ,QAAA,CACA4E,KAAA,CACAgD,YAAA,kBACA2B,cAAA,mBACAC,aAAA,WACAC,SAAA,YACAC,iBAAA,kDACAC,iBAAA,uCACAC,OAAA,cACAC,eAAA,iBACAC,WAAA,wBACAC,UAAA,CACArwB,KAAA,wBACAE,OAAA,eACAD,KAAA,gBACAqwB,YAAA,sBAGAC,KAAA,CACAC,eAAA,8EAGAvI,KAAA,CACAwI,MAAA,QACAC,gBAAA,kBACAC,OAAA,SACAC,QAAA,UACAC,aAAA,eACAC,UAAA,cACAlD,QAAA,UACAmD,aAAA,eACAC,UAAA,YACAC,WAAA,aACAC,IAAA,MACAC,cAAA,UACApM,qBAAA,SACAqM,QAAA,UACAC,cAAA,gBACAC,cAAA,YACApG,KAAA,CACA/F,MAAA,OACAoM,MAAA,YACAC,iBAAA,uBACAC,uBAAA,iCACAtE,YAAA,cACAuE,YAAA,gBACAC,gBAAA,sBACAC,MAAA,CACAC,uBAAA,kDACAC,mBAAA,6BAIA5L,IAAA,CACA6L,YAAA,gCACAC,0BAAA,8GACAC,iBAAA,gBACAC,uBAAA,2BACAC,iBAAA,6BACAC,uBAAA,yBACAC,uBAAA,eACAC,6BAAA,qBACAC,sCAAA,kBACAC,UAAA,UACAC,sBAAA,yBACAC,QAAA,UACAC,OAAA,YACAjC,gBAAA,8BACAkC,iBAAA,8BACAjB,gBAAA,sBACAkB,mBAAA,qBACAC,wBAAA,mEACAvH,kBAAA,iBACAwH,YAAA,UACAC,gBAAA,eACAC,uBAAA,oBACAC,mBAAA,qBACAhI,KAAA,CACAiI,oBAAA,sBAEAlG,OAAA,CACA9H,MAAA,WACAiO,UAAA,eACAC,gBAAA,oBACAC,QAAA,yBACAC,cAAA,kCACAC,WAAA,yCACAC,YAAA,iDACAC,cAAA,iBACAC,YAAA,wBACA3O,UAAA,YACAC,gBAAA,+BACA2O,WAAA,4BACAC,aAAA,eAEAC,SAAA,CACA3O,MAAA,YAEA4O,MAAA,CACA5O,MAAA,UAEA6O,eAAA,CACA7O,MAAA,2BACA8O,QAAA,0BACAC,KAAA,qCACAC,aAAA,yBACAC,SAAA,0BACAC,YAAA,qCACAzC,MAAA,mCACA0C,cAAA,oBAEAC,WAAA,CACApP,MAAA,wBAEAqP,qBAAA,CACArP,MAAA,gCACA8O,QAAA,sBACAC,KAAA,iCACAC,aAAA,yBACAM,KAAA,sBACAC,QAAA,iCACA9C,MAAA,mCAGA+C,MAAA,CACAxP,MAAA,wCACAyP,iBAAA,yFACAC,iBAAA,qCACAC,eAAA,mCACAC,eAAA,gCACAC,KAAA,oBACAC,UAAA,oBACAC,UAAA,6BACAC,SAAA,WACAC,cAAA,WACAC,YAAA,0BACA7R,oBAAA,6BACA8R,sBAAA,4BACAC,eAAA,oBACAC,oBAAA,wBACAC,aAAA,mBACAC,kBAAA,eACAC,YAAA,gBACAC,iBAAA,mBACAC,qBAAA,UACAC,mBAAA,uDACAC,kBAAA,wBACAC,YAAA,CACA7Q,MAAA,cACAiC,QAAA,uGACA6O,YAAA,UACAC,aAAA,uCAEAC,OAAA,CACAC,eAAA,iCACAC,gBAAA,gBACAnzC,KAAA,gBACAxoB,OAAA,0BACA47D,KAAA,kBAEAC,OAAA,CACA78C,OAAA,aACAK,QAAA,gBACAy8C,OAAA,cACAC,QAAA,eACAC,QAAA,eACAC,KAAA,iBACAh9C,EAAA,YACAC,EAAA,WACAC,EAAA,YAEAqJ,KAAA,CACA0zC,KAAA,0GAGAC,KAAA,CACA1R,MAAA,iDACA2R,SAAA,eACAC,aAAA,gCACAC,kBAAA,yEACAC,qBAAA,qFACAlC,eAAA,6DAEA5O,QAAA,CACAhB,MAAA,aACA+R,QAAA,UACAC,QAAA,gCACAC,gBAAA,kBACAC,MAAA,iBACAC,aAAA,YACAC,YAAA,WACAC,aAAA,qDACAC,WAAA,uBACAC,cAAA,+BACAC,SAAA,2BACAC,cAAA,oBACAC,oBAAA,gCACAC,OAAA,SACAC,cAAA,mUACAC,mBAAA,mDACAC,uBAAA,iOACAC,4BAAA,wTACAC,4BAAA,qGACAC,2BAAA,sKACAC,sBAAA,oJACAC,sCAAA,qLACAC,sBAAA,oKACAC,oBAAA,0BACAC,0BAAA,iBACA9J,UAAA,kCACA+J,kBAAA,UACAC,mCAAA,gCACAC,mBAAA,iCACAC,qBAAA,mBACAC,0BAAA,sBACAC,wBAAA,uBACAC,kBAAA,0BACAC,iBAAA,yBACAC,uBAAA,CACA/T,MAAA,gBACAgU,YAAA,qDACAC,iBAAA,kFACAC,cAAA,8BAEAC,IAAA,CACAnU,MAAA,eACAoU,mBAAA,8JACAC,uBAAA,+GACAC,4BAAA,wFACAC,WAAA,gHACAC,kBAAA,wJACAC,uBAAA,qHACAC,oBAAA,wCACAC,eAAA,iBACAC,qBAAA,0BACAC,oBAAA,wFACAC,eAAA,gBACAC,qBAAA,kBACAC,oBAAA,4IACAC,aAAA,0LACAC,iBAAA,+KACAC,eAAA,qPACA3H,OAAA,YACA4H,YAAA,SACAC,aAAA,UACAC,kBAAA,gCACAC,iBAAA,UACAC,sBAAA,uBACAC,cAAA,gBACAC,iBAAA,eACAC,0BAAA,2VACAC,4BAAA,4NACAC,4BAAA,+KACAC,gBAAA,cACAC,iBAAA,8BACAC,qBAAA,kCACAC,aAAA,2FACAC,WAAA,WACAC,mBAAA,wBAEAC,eAAA,CACApW,MAAA,oBACAyR,KAAA,wDAEA4E,sBAAA,CACArW,MAAA,qBACAyR,KAAA,+LAEA6E,oBAAA,CACAtW,MAAA,oBAEAuW,YAAA,CACAvW,MAAA,aACAwW,QAAA,eACAxY,aAAA,oBACAyY,qBAAA,wBACAC,UAAA,sBACAtZ,WAAA,+BACAuZ,WAAA,oBACAC,gBAAA,sDACAC,WAAA,UACAC,aAAA,CACA9W,MAAA,oBACAyR,KAAA,uBACAsF,UAAA,eAEAC,aAAA,CACAhX,MAAA,2BACAyR,KAAA,uHACAwF,aAAA,sDACAC,cAAA,kBAGAC,SAAA,CACAC,aAAA,sBACAC,UAAA,QACAtS,UAAA,QACAuS,gBAAA,yBACAC,qBAAA,sLACAC,iBAAA,gCACAC,sBAAA,wMACAC,iBAAA,mEACAC,cAAA,wBACAC,mBAAA,wLACAC,cAAA,sBACAC,mBAAA,qNACAC,WAAA,wDACAC,MAAA,iBACAC,UAAA,2DACAC,aAAA,8DACAC,WAAA,0DACAC,WAAA,wCACAC,WAAA,oDACAC,WAAA,iDACAC,WAAA,6CACAC,WAAA,6DACAC,WAAA,0CACAC,WAAA,uCACAC,WAAA,4CACAC,YAAA,iDACAC,YAAA,4EACAC,YAAA,kEACAC,YAAA,wCACAC,YAAA,yCACAC,YAAA,qDACAC,YAAA,0DACAC,YAAA,wCACAC,YAAA,iDACAC,YAAA,qCACAC,WAAA,yBACAC,gBAAA,0HACAC,uBAAA,4DACAC,qBAAA,8BACAC,iCAAA,kMACAC,0BAAA,8IACAC,kBAAA,kCACAC,uBAAA,wQACAC,oBAAA,8DACAC,QAAA,yBACAC,aAAA,wLACAC,aAAA,+DACAja,MAAA,uBACAka,QAAA,CACAC,cAAA,iBACAC,mBAAA,gMACAC,WAAA,6BACAC,gBAAA,6KACAC,YAAA,uCACAC,iBAAA,kIACAC,eAAA,CACAza,MAAA,0BACAyR,KAAA,+BACAxB,cAAA,cAEAxD,MAAA,CACA3vD,aAAA,iBACAuhB,aAAA,kBAIAq8C,UAAA,oGACAC,QAAA,CACAC,KAAA,OACAC,OAAA,SACA1/B,QAAA,YAGA2/B,SAAA,CACA9a,MAAA,WACA+a,UAAA,iBACAC,cAAA,oBACAtc,KAAA,OACAC,GAAA,KACAkc,OAAA,SACAI,YAAA,SACA9/B,QAAA,UACA+/B,aAAA,qBACAlf,SAAA,OACAmf,gBAAA,gBACAC,KAAA,kBACAC,QAAA,KACAC,uBAAA,+DACA1M,MAAA,CACA5O,MAAA,aAGAyM,MAAA,CACA8O,mBAAA,qBACAC,wBAAA,qCACAC,YAAA,QACAC,cAAA,gBACAC,qBAAA,8DACAC,wBAAA,wCACAC,iBAAA,mCACAC,eAAA,2CACAC,eAAA,0BACAC,gBAAA,iCACAC,4BAAA,qDACAC,eAAA,iCACAC,2BAAA,oDACAC,UAAA,yBACAC,UAAA,yBACAC,aAAA,2CACAC,iBAAA,wBACAC,cAAA,0BACAC,gBAAA,yBACAC,uBAAA,gCACAC,mBAAA,kCACAC,qBAAA,kCACAC,0BAAA,8BACAC,+BAAA,yFACAC,wCAAA,4IACAC,gCAAA,gFACAC,aAAA,uBACAC,qBAAA,2BACAC,yBAAA,wCACAC,0BAAA,8CACAC,2BAAA,6CACAC,oBAAA,4BACAC,uBAAA,qCACAC,oBAAA,+CACAC,eAAA,8BACAC,iBAAA,kFACAC,mBAAA,qHACAC,wBAAA,4CACAC,0BAAA,oDACAC,uBAAA,mCACAC,sBAAA,8BACAC,oBAAA,yBACAC,YAAA,0BACAC,oBAAA,uBACAC,kBAAA,iBACAC,sBAAA,mDACAC,iBAAA,wBACAC,gBAAA,sBACAC,gBAAA,+BACAC,kBAAA,qBACAC,qBAAA,sCACAC,gBAAA,oEACAC,gBAAA,sCACAC,eAAA,+BACAC,wBAAA,oBACAC,iBAAA,2EACAC,2BAAA,4IACAC,4BAAA,6HACAC,4BAAA,uMACAC,iBAAA,sFACApiC,sBAAA,uIACAqiC,mBAAA,qBACAC,mBAAA,8CACAC,+BAAA,wBACAC,0BAAA,iOACAC,wBAAA,gKACAC,eAAA,qIACAC,mBAAA,iEACAC,cAAA,2BACAC,oBAAA,uDACAC,oBAAA,gCACAC,kBAAA,yBACAC,gBAAA,+BACAC,yBAAA,oIACAC,iCAAA,uJACAC,wBAAA,oBACAC,sBAAA,8BACAC,oBAAA,wCACAC,oCAAA,+DACAC,kDAAA,+EACAC,kCAAA,gFACAC,iBAAA,4BACAC,mBAAA,mCACAC,2BAAA,2CACAC,kBAAA,6CACAC,+BAAA,uCACAC,kBAAA,6BACAC,iBAAA,sBACAC,0BAAA,8CACAC,uBAAA,sDACAC,mBAAA,8CACAC,iBAAA,+HACAC,yBAAA,+EACAC,wBAAA,6BACAC,yBAAA,2FACAC,oBAAA,+HACAC,4BAAA,kCACAC,0BAAA,yCACAC,wBAAA,sCACAC,wBAAA,sCACAC,0BAAA,+GACAC,8BAAA,uCACAC,kBAAA,4BACAC,2BAAA,yCACAC,oBAAA,uBACAC,kBAAA,oDAEA3W,KAAA,CACAqQ,YAAA,cACAuG,mBAAA,+BACAxD,kBAAA,oBACAyD,cAAA,qCACAC,uBAAA,iBACAC,oBAAA,6BACAC,oBAAA,oBACAC,qCAAA,wFACAC,yBAAA,sGACAC,2BAAA,kPACAC,gBAAA,+BACAC,gCAAA,2EACAC,yBAAA,4FACAC,iBAAA,2BAEAC,QAAA,CACAnH,YAAA,sBACAoH,oBAAA,iBACAC,6BAAA,iEACAC,wBAAA,kBACAC,cAAA,6VACAC,WAAA,uCACAC,SAAA,0BACApI,SAAA,uPACAqI,aAAA,kUACAC,eAAA,8GACAC,iBAAA,6GACAC,0BAAA,gBACAC,oBAAA,kKACAC,aAAA,4JACAC,eAAA,+EACAC,WAAA,wEACAC,iBAAA,kEACAC,gBAAA,gOACAC,kBAAA,wGACAC,0BAAA,gLACAC,kBAAA,mEACAC,wBAAA,oBACAC,OAAA,mCACAC,kBAAA,uHACAC,mBAAA,8PAEAC,SAAA,CACA3I,YAAA,yBACA4I,qBAAA,sPAEA5S,KAAA,CACAzR,MAAA,cACAskB,KAAA,CACAC,QAAA,OACA1U,KAAA,ggBACAG,SAAA,kbACAxC,OAAA,oWAEAgC,MAAA,CACA+U,QAAA,SACAhvE,OAAA,qBACAivE,WAAA,+dACAxT,OAAA,qBACAyT,WAAA,yhBAEAC,SAAA,CACAH,QAAA,WACAC,WAAA,8IACA7oB,OAAA,SACAgpB,WAAA,uPACAC,eAAA,iBACAC,mBAAA,4gBACAhf,WAAA,aACAif,eAAA,wRACAC,uBAAA,6jBACAhkB,IAAA,qBACAikB,QAAA,qHACAC,cAAA,gBACAC,kBAAA,4LAEAC,IAAA,CACAC,kBAAA,0GACAC,aAAA,6EACAC,cAAA,sPACAC,uBAAA,gWACAC,qBAAA,uRACAC,iCAAA,wRACAb,eAAA,4MACAc,iBAAA,sFACAC,mBAAA,oIACAC,cAAA,2NACAC,2BAAA,2NACAC,0BAAA,wQACAC,iBAAA,sGACAC,wBAAA,yFACAC,sBAAA,gFACAC,+BAAA,2EACAC,4BAAA,wEACAC,eAAA,6CACAC,wBAAA,kWACAC,2BAAA,uQACAC,cAAA,2HACAC,YAAA,wCACAC,qBAAA,mFACAC,eAAA,qJACAC,sBAAA,qDACAC,eAAA,sLACAC,kBAAA,2LACAC,iBAAA,qGACAC,YAAA,iHACAC,aAAA,0GACAC,mBAAA,6IACAC,gBAAA,mJACAC,kBAAA,qDACAC,wBAAA,iQACAC,8BAAA,2HACAC,8BAAA,wFACAC,iBAAA,uGACAvE,cAAA,4LACAwE,kBAAA,oLACAC,uBAAA,gDACAC,qBAAA,qTACAC,UAAA,mFACAC,cAAA,gLAGA7b,IAAA,CACAxQ,OAAA,CACAssB,SAAA,oBACAC,cAAA,mCACAC,kBAAA,mBACAC,uBAAA,2DACAzlB,iBAAA,0IAEAzB,KAAA,CACAd,MAAA,oDACAiC,QAAA,kLACAgmB,cAAA,kGACAC,WAAA,uBAEApN,SAAA,CACA9a,MAAA,mDACAmoB,YAAA,iBACArZ,QAAA,iBACA+L,OAAA,UACAuN,aAAA,4BACAC,KAAA,QACA9yE,OAAA,+BACA4lC,QAAA,mBACAmtC,KAAA,gBACAC,KAAA,CACA1Y,KAAA,OACAG,SAAA,OACAz6D,OAAA,+CACAk8D,KAAA,6MACA+W,gBAAA,8JAEApd,KAAA,CACAqd,8BAAA,mDACAC,oBAAA,wDACAC,6BAAA,wDACAC,mBAAA,8DAEAnc,MAAA,CACAoc,gBAAA,mBAGAC,IAAA,CACAC,oBAAA,cACAC,YAAA,kBACAC,mBAAA,aACAC,qBAAA,+CACAC,aAAA,WACAC,UAAA,wFACAC,YAAA,2BACAC,iBAAA,qBACAC,aAAA,8CACAC,eAAA,kDACAC,kBAAA,sBACAC,eAAA,QACAC,iBAAA,kBACAC,qBAAA,aACA9O,SAAA,CACA9a,MAAA,WACAgU,YAAA,wJACA6V,aAAA,yBACAC,kBAAA,oCACAC,aAAA,SACAC,kBAAA,gCACAC,cAAA,yBACAC,mBAAA,8FACAC,WAAA,iCACAC,gBAAA,uHACAC,mBAAA,kBACAC,wBAAA,gOACAC,iBAAA,mBACAC,sBAAA,mIACAC,qBAAA,yBACAC,0BAAA,wFACAC,cAAA,2BACAC,eAAA,cACAC,4BAAA,iCACAC,6BAAA,eACAC,yBAAA,cACAC,wBAAA,mBACAC,6BAAA,mDACAC,0BAAA,aACAC,+BAAA,sCACAC,yBAAA,OACAC,0BAAA,QACAC,+BAAA,iBACAC,yBAAA,UACAC,4BAAA,eACAC,2BAAA,cACAC,6BAAA,UACAC,6BAAA,yBAOArwB,EAAAl4B,aAAA,QAAA,CACAm4B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,mBACAnmD,OAAA,kBACAomD,OAAA,SACAC,MAAA,QACAC,OAAA,KACAC,QAAA,MACAC,OAAA,KACAC,SAAA,QACAC,eAAA,gBACAC,qBAAA,UACAC,SAAA,WACAC,aAAA,gBACAC,iBAAA,eACAC,SAAA,OACAC,gBAAA,6BACAC,kBAAA,yBACAC,SAAA,QACAC,SAAA,QACAC,WAAA,UACAC,WAAA,SACAC,UAAA,QACAC,UAAA,QACAC,UAAA,YACAC,WAAA,eACAC,gBAAA,aACAC,UAAA,YACAC,SAAA,SACAC,WAAA,SACAC,QAAA,SACAC,WAAA,QACAC,YAAA,YACAC,UAAA,YACAC,UAAA,UACAC,aAAA,UACAC,WAAA,OACAC,eAAA,eACAC,YAAA,cACAC,cAAA,iBACAC,qBAAA,yBACAC,aAAA,SACAC,+BAAA,0BACAC,WAAA,SACAC,YAAA,oDACAC,KAAA,QACAC,oBAAA,uCACAC,iBAAA,wBACAC,QAAA,sBACAC,aAAA,gFACAC,UAAA,cACAC,KAAA,KACAC,GAAA,KACAC,KAAA,QACAC,SAAA,SACAC,mBAAA,uBACA9L,GAAA,KACA+L,aAAA,iBACAC,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,aACAC,IAAA,aACAC,OAAA,SACAC,QAAA,YACAC,aAAA,WACAC,cAAA,qBACAC,eAAA,6CACAC,YAAA,0BACAC,sBAAA,cACAC,qBAAA,YACAC,UAAA,YACAC,gBAAA,2BACAC,cAAA,CACAC,MAAA,YACAC,iBAAA,uBACAC,kBAAA,wBACAC,kBAAA,yBACAC,oBAAA,wBAEAriC,KAAA,CACAsiC,KAAA,QACAC,KAAA,QACAC,KAAA,QACAC,WAAA,mBAGAC,OAAA,CACAC,oBAAA,oBACAC,oBAAA,UACAC,mBAAA,kBAEAC,KAAA,CACAC,KAAA,WACAC,IAAA,UACA7lB,SAAA,OACA8lB,QAAA,YACAC,QAAA,eACAC,SAAA,aACAC,QAAA,OACAC,aAAA,eAEAC,MAAA,CACArB,MAAA,OACAsB,QAAA,+CACAC,eAAA,+FACAC,cAAA,wFACAC,KAAA,cACAC,kBAAA,mBACAC,WAAA,iBACAC,MAAA,UACAC,oBAAA,kDACAC,aAAA,mBACAC,oBAAA,yCAEAjB,KAAA,CACAd,MAAA,SACAgC,QAAA,kCACAC,QAAA,yDACAC,aAAA,uCACAC,UAAA,OACAC,SAAA,aACAN,aAAA,SACAO,0BAAA,mFACAC,mBAAA,4BACAC,iBAAA,kMAEArB,SAAA,CACAlB,MAAA,aACA2C,gBAAA,UACAC,gBAAA,UACAC,iBAAA,OACAC,KAAA,4BACAC,WAAA,oBACAC,uBAAA,yBACAG,kBAAA,0BACAC,uBAAA,qCACAC,iBAAA,eACAC,uBAAA,sBACAC,4BAAA,mGACAC,eAAA,uCACAE,kBAAA,0BACAC,iBAAA,cACAC,mBAAA,qCACAC,wBAAA,qBACAC,6BAAA,+EACAC,wBAAA,cACAC,UAAA,0BACAC,gBAAA,iBACAC,eAAA,yEACAC,iBAAA,CACAC,MAAA,eACAC,QAAA,iCACAC,OAAA,mCACAC,QAAA,mCACAC,KAAA,iCACAC,OAAA,oBAEAC,aAAA,wBACAC,kBAAA,wJACAC,YAAA,cACAC,iBAAA,oFACAC,iBAAA,iBACAC,UAAA,kCACAC,YAAA,8BACAC,iBAAA,gCACAC,sBAAA,sCACAC,4BAAA,yBACAC,2BAAA,0DACAC,sBAAA,CACAC,KAAA,iBACA9wC,EAAA,gDAEA+wC,WAAA,CACAvF,MAAA,eACAwF,KAAA,SACAC,UAAA,6BACAC,QAAA,cACAC,aAAA,gBACAC,cAAA,sBAGAC,WAAA,CACAC,KAAA,mBACAC,KAAA,CACAC,aAAA,wCACAC,cAAA,aACAjG,MAAA,kCACAkG,YAAA,0BACAC,SAAA,6BACAC,kBAAA,oBACAnoC,QAAA,+BACA6nC,KAAA,mBACAO,wBAAA,2DACAC,MAAA,+BACAC,QAAA,uBACAC,aAAA,2CACAC,aAAA,UACAC,iBAAA,kBACAC,cAAA,gBACAC,cAAA,cACAC,mBAAA,wCACAC,cAAA,oBACAC,mBAAA,sCACAC,eAAA,oBACAC,oBAAA,oEACAC,cAAA,sBACAC,mBAAA,wCACAC,SAAA,SACAC,WAAA,YACAC,cAAA,wBACAC,4BAAA,0BACAC,mBAAA,CACAC,IAAA,MACAC,GAAA,MAEA/pB,mBAAA,CACAjD,IAAA,uBACAitB,IAAA,mCACAC,IAAA,cACAC,KAAA,gBAGAC,OAAA,CACA9H,MAAA,SACA+H,SAAA,cACAC,YAAA,iBACAC,YAAA,YAGA/sB,SAAA,CACA6qB,KAAA,CACA/F,MAAA,OACAkI,aAAA,OACAC,QAAA,eACAC,YAAA,OACAC,WAAA,SACAC,2BAAA,gQACAC,sBAAA,qBACAC,cAAA,kBACAC,QAAA,oBACAC,kBAAA,6BACAC,cAAA,OACAC,KAAA,YACAC,MAAA,kBACA7V,GAAA,uBACA8V,SAAA,gBACAC,YAAA,sBACAxC,QAAA,6CACAyC,oBAAA,qBACAC,OAAA,yBACAC,QAAA,qCACAC,UAAA,iCACAC,cAAA,QACAC,gBAAA,2FACAC,gBAAA,6BACAC,aAAA,gDACAC,UAAA,oDACAC,WAAA,kFACAC,WAAA,iCACAC,aAAA,4CACAC,UAAA,+CACAC,YAAA,yCACAC,SAAA,sFACAC,kBAAA,6BACAC,SAAA,kFACAC,iBAAA,4FACAC,SAAA,6FACAC,aAAA,6BACAC,QAAA,OACAC,aAAA,UACAC,kBAAA,wBACAC,iBAAA,mBACAC,YAAA,gBAEAlJ,QAAA,CACAtB,MAAA,qBACAhC,aAAA,qBACAyM,gBAAA,oCAGAtJ,QAAA,CACA4E,KAAA,CACAgD,YAAA,sBACA2B,cAAA,uBACAC,aAAA,UACAC,SAAA,WACAC,iBAAA,0DACAC,iBAAA,uCACAC,OAAA,cACAC,eAAA,gBACAC,WAAA,4BACAC,UAAA,CACArwB,KAAA,6BACAE,OAAA,qBACAD,KAAA,iBACAqwB,YAAA,4BAGAC,KAAA,CACAC,eAAA,8EAGAvI,KAAA,CACAwI,MAAA,QACAC,gBAAA,uBACAC,OAAA,UACAC,QAAA,WACAC,aAAA,eACAC,UAAA,oBACAlD,QAAA,UACAmD,aAAA,eACAC,UAAA,aACAC,WAAA,cACAC,IAAA,MACAC,cAAA,UACApM,qBAAA,WACAqM,QAAA,cACAC,cAAA,qBACAC,cAAA,gBACApG,KAAA,CACA/F,MAAA,OACAoM,MAAA,eACAC,iBAAA,+BACAC,uBAAA,6CACAtE,YAAA,wBACAuE,YAAA,iBACAC,gBAAA,qBACAC,MAAA,CACAC,uBAAA,qFACAC,mBAAA,4CAIA5L,IAAA,CACA6L,YAAA,yCACAC,0BAAA,oHACAC,iBAAA,gBACAC,uBAAA,2BACAC,iBAAA,4BACAC,uBAAA,yBACAC,uBAAA,cACAC,6BAAA,sBACAC,sCAAA,cACAC,UAAA,SACAC,sBAAA,0BACAC,QAAA,YACAC,OAAA,aACAjC,gBAAA,iCACAkC,iBAAA,oCACAjB,gBAAA,qBACAkB,mBAAA,2BACAC,wBAAA,oDACAvH,kBAAA,oBACAwH,YAAA,SACAC,gBAAA,cACAC,uBAAA,gBACAC,mBAAA,qBACAhI,KAAA,CACAiI,oBAAA,sBAEAlG,OAAA,CACA9H,MAAA,eACAiO,UAAA,gBACAC,gBAAA,oBACAC,QAAA,yBACAC,cAAA,mCACAC,WAAA,yCACAC,YAAA,kDACAC,cAAA,gBACAC,YAAA,yBACA3O,UAAA,YACAC,gBAAA,2BACA2O,WAAA,8BACAC,aAAA,iBAEAC,SAAA,CACA3O,MAAA,aAEA4O,MAAA,CACA5O,MAAA,cAEA6O,eAAA,CACA7O,MAAA,sBACA8O,QAAA,sBACAC,KAAA,oCACAC,aAAA,iCACAC,SAAA,sBACAC,YAAA,iCACAzC,MAAA,4BACA0C,cAAA,oBAEAC,WAAA,CACApP,MAAA,oBAEAqP,qBAAA,CACArP,MAAA,+BACA8O,QAAA,qBACAC,KAAA,mCACAC,aAAA,iCACAM,KAAA,qBACAC,QAAA,gCACA9C,MAAA,6BAGA+C,MAAA,CACAxP,MAAA,4CACAyP,iBAAA,qGACAC,iBAAA,4CACAC,eAAA,uCACAC,eAAA,+BACAC,KAAA,qBACAC,UAAA,qBACAC,UAAA,iCACAC,SAAA,WACAC,cAAA,WACAC,YAAA,gCACA7R,oBAAA,8BACA8R,sBAAA,uBACAC,eAAA,iBACAC,oBAAA,sBACAC,aAAA,sBACAC,kBAAA,mCACAC,YAAA,gBACAC,iBAAA,mBACAC,qBAAA,UACAC,mBAAA,gEACAC,kBAAA,wBACAC,YAAA,CACA7Q,MAAA,UACAiC,QAAA,qGACA6O,YAAA,cACAC,aAAA,0CAEAC,OAAA,CACAC,eAAA,kCACAC,gBAAA,kBACAnzC,KAAA,wBACAxoB,OAAA,gCACA47D,KAAA,kBAEAC,OAAA,CACA78C,OAAA,mBACAK,QAAA,kBACAy8C,OAAA,kBACAC,QAAA,uBACAC,QAAA,oBACAC,KAAA,uBACAh9C,EAAA,YACAC,EAAA,WACAC,EAAA,YAEAqJ,KAAA,CACA0zC,KAAA,8FAGAC,KAAA,CACA1R,MAAA,8CACA2R,SAAA,YACAC,aAAA,qBACAC,kBAAA,qEACAC,qBAAA,2GACAlC,eAAA,gEAEA5O,QAAA,CACAhB,MAAA,YACA+R,QAAA,QACAC,QAAA,4BACAC,gBAAA,cACAC,MAAA,cACAC,aAAA,YACAC,YAAA,aACAC,aAAA,iDACAC,WAAA,8BACAC,cAAA,mCACAC,SAAA,uBACAC,cAAA,wBACAC,oBAAA,4BACAC,OAAA,WACAC,cAAA,8TACAC,mBAAA,0CACAC,uBAAA,0OACAC,4BAAA,sTACAC,4BAAA,8FACAC,2BAAA,wKACAC,sBAAA,yIACAC,sCAAA,0IACAC,sBAAA,2IACAC,oBAAA,sBACAC,0BAAA,YACA9J,UAAA,qBACA+J,kBAAA,WACAC,mCAAA,2BACAC,mBAAA,4BACAC,qBAAA,uBACAC,0BAAA,0BACAC,wBAAA,sBACAC,kBAAA,wBACAC,iBAAA,+BACAC,uBAAA,CACA/T,MAAA,eACAgU,YAAA,6CACAC,iBAAA,+EACAC,cAAA,yBAEAC,IAAA,CACAnU,MAAA,kBACAoU,mBAAA,4LACAC,uBAAA,qHACAC,4BAAA,kGACAC,WAAA,mHACAC,kBAAA,yHACAC,uBAAA,sHACAC,oBAAA,mCACAC,eAAA,eACAC,qBAAA,yBACAC,oBAAA,8MACAC,eAAA,gBACAC,qBAAA,mBACAC,oBAAA,wHACAC,aAAA,4LACAC,iBAAA,sLACAC,eAAA,oWACA3H,OAAA,aACA4H,YAAA,aACAC,aAAA,WACAC,kBAAA,oCACAC,iBAAA,WACAC,sBAAA,0BACAC,cAAA,YACAC,iBAAA,gBACAC,0BAAA,8UACAC,4BAAA,iPACAC,4BAAA,wOACAC,gBAAA,cACAC,iBAAA,wBACAC,qBAAA,2BACAC,aAAA,iGACAC,WAAA,cACAC,mBAAA,2BAEAC,eAAA,CACApW,MAAA,qBACAyR,KAAA,8CAEA4E,sBAAA,CACArW,MAAA,wBACAyR,KAAA,+LAEA6E,oBAAA,CACAtW,MAAA,uBAEAuW,YAAA,CACAvW,MAAA,eACAwW,QAAA,iBACAxY,aAAA,mBACAyY,qBAAA,wBACAC,UAAA,qBACAtZ,WAAA,2BACAuZ,WAAA,oBACAC,gBAAA,wDACAC,WAAA,SACAC,aAAA,CACA9W,MAAA,oBACAyR,KAAA,wBACAsF,UAAA,qBAEAC,aAAA,CACAhX,MAAA,mBACAyR,KAAA,mJACAwF,aAAA,+EACAC,cAAA,sBAGAC,SAAA,CACAC,aAAA,+BACAC,UAAA,aACAtS,UAAA,aACAuS,gBAAA,oCACAC,qBAAA,0LACAC,iBAAA,sCACAC,sBAAA,sNACAC,iBAAA,oEACAC,cAAA,iCACAC,mBAAA,oJACAC,cAAA,8BACAC,mBAAA,uMACAC,WAAA,qGACAC,MAAA,qBACAC,UAAA,gEACAC,aAAA,4DACAC,WAAA,uEACAC,WAAA,oCACAC,WAAA,sCACAC,WAAA,yCACAC,WAAA,6DACAC,WAAA,2DACAC,WAAA,uCACAC,WAAA,uCACAC,WAAA,2CACAC,YAAA,gDACAC,YAAA,oFACAC,YAAA,+EACAC,YAAA,yCACAC,YAAA,8BACAC,YAAA,0CACAC,YAAA,qDACAC,YAAA,yCACAC,YAAA,2CACAC,YAAA,oCACAC,WAAA,4BACAC,gBAAA,kIACAE,qBAAA,+BACAC,iCAAA,oPACAC,0BAAA,uJACAC,kBAAA,4BACAC,uBAAA,2QACAC,oBAAA,0DACAC,QAAA,iCACAC,aAAA,6LACAC,aAAA,8DACAja,MAAA,qBACAka,QAAA,CACAC,cAAA,oBACAC,mBAAA,wPACAC,WAAA,4CACAC,gBAAA,0TACAC,YAAA,uDACAC,iBAAA,4PACAC,eAAA,CACAza,MAAA,gCACAyR,KAAA,wCACAxB,cAAA,iBAEAxD,MAAA,CACA3vD,aAAA,yBACAuhB,aAAA,2BAIAq8C,UAAA,+FACAC,QAAA,CACAC,KAAA,OACAC,OAAA,OACA1/B,QAAA,YAGA2/B,SAAA,CACA9a,MAAA,UACA+a,UAAA,gBACAC,cAAA,uBACAtc,KAAA,KACAC,GAAA,KACAkc,OAAA,OACAI,YAAA,OACA9/B,QAAA,UACA+/B,aAAA,UACAlf,SAAA,QACAmf,gBAAA,kBACAC,KAAA,oBACAC,QAAA,KACAC,uBAAA,oEACA1M,MAAA,CACA5O,MAAA,YAGAyM,MAAA,CACA8O,mBAAA,yBACAC,wBAAA,2CACAC,YAAA,QACAC,cAAA,iBACAC,qBAAA,gEACAC,wBAAA,wDACAC,iBAAA,sCACAC,eAAA,8CACAC,eAAA,eACAC,gBAAA,uBACAC,4BAAA,uDACAC,eAAA,oBACAC,2BAAA,qDACAC,UAAA,4BACAC,UAAA,6BACAC,aAAA,4CACAC,iBAAA,yBACAC,cAAA,0BACAC,gBAAA,qBACAC,uBAAA,8BACAC,mBAAA,wCACAC,qBAAA,mBACAC,0BAAA,sBACAC,+BAAA,0EACAC,wCAAA,6JACAC,gCAAA,wFACAC,aAAA,uBACAC,qBAAA,gCACAC,yBAAA,qDACAC,0BAAA,gDACAC,2BAAA,wCACAC,oBAAA,4CACAC,uBAAA,gDACAC,oBAAA,sDACAC,eAAA,wBACAC,iBAAA,qFACAC,mBAAA,8HACAC,wBAAA,wCACAC,0BAAA,2DACAC,uBAAA,iDACAC,sBAAA,6BACAC,oBAAA,kCACAC,YAAA,oCACAC,oBAAA,mBACAC,kBAAA,sBACAC,sBAAA,yDACAC,iBAAA,0BACAC,gBAAA,2BACAC,gBAAA,6BACAC,kBAAA,kBACAC,qBAAA,uCACAC,gBAAA,gFACAC,gBAAA,gEACAC,eAAA,uDACAC,wBAAA,yBACAC,iBAAA,wEACAC,2BAAA,yIACAC,4BAAA,8GACAC,4BAAA,yKACAC,iBAAA,mHACApiC,sBAAA,6LACAqiC,mBAAA,uBACAC,mBAAA,mCACAC,+BAAA,mBACAC,0BAAA,yMACAC,wBAAA,uKACAC,eAAA,oIACAC,mBAAA,mEACAC,cAAA,sBACAC,oBAAA,+EACAC,oBAAA,mCACAC,kBAAA,kCACAC,gBAAA,qDACAC,yBAAA,qHACAC,iCAAA,sIACAC,wBAAA,kBACAC,sBAAA,2CACAC,oBAAA,+CACAC,oCAAA,iEACAC,kDAAA,kFACAC,kCAAA,2FACAC,iBAAA,mCACAC,mBAAA,oCACAC,2BAAA,gDACAC,kBAAA,yBACAC,+BAAA,2CACAC,kBAAA,wCACAC,iBAAA,mCACAC,0BAAA,+DACAC,uBAAA,mEACAC,mBAAA,0DACAC,iBAAA,4HACAC,yBAAA,0EACAC,wBAAA,gDACAC,yBAAA,kFACAC,oBAAA,6IACAC,4BAAA,wCACAC,0BAAA,gDACAC,wBAAA,4CACAC,wBAAA,+CACAC,0BAAA,0HACAC,8BAAA,qCACAC,kBAAA,yBACAC,2BAAA,gDACAC,oBAAA,kCAEA1W,KAAA,CACAqQ,YAAA,UACAuG,mBAAA,mBACAxD,kBAAA,iBACAyD,cAAA,kBACAC,uBAAA,yBACAC,oBAAA,iBACAC,oBAAA,uBACAC,qCAAA,uFACAC,yBAAA,0FACAC,2BAAA,4PACAC,gBAAA,iBACAC,gCAAA,0EACAC,yBAAA,sHACAC,iBAAA,yBAEAC,QAAA,CACAnH,YAAA,kBACAoH,oBAAA,gBACAC,6BAAA,oEACAC,wBAAA,iBACAC,cAAA,iYACAC,WAAA,kCACAC,SAAA,sBACApI,SAAA,6PACAqI,aAAA,yUACAC,eAAA,gHACAC,iBAAA,2HACAC,0BAAA,aACAC,oBAAA,2MACAC,aAAA,iKACAC,eAAA,sGACAC,WAAA,oGACAC,iBAAA,oGACAC,gBAAA,qPACAC,kBAAA,2HACAC,0BAAA,0KACAC,kBAAA,wEACAC,wBAAA,yBACAC,OAAA,0CACAC,kBAAA,mHACAC,mBAAA,wRAEAC,SAAA,CACA3I,YAAA,4BACA4I,qBAAA,yPAEA5S,KAAA,CACAzR,MAAA,YACAskB,KAAA,CACAC,QAAA,aACA1U,KAAA;AACAG,SAAA,8eACAxC,OAAA,mYAEAgC,MAAA,CACA+U,QAAA,UACAhvE,OAAA,kCACAivE,WAAA,qdACAxT,OAAA,kBACAyT,WAAA,2qBAEAC,SAAA,CACAH,QAAA,UACAC,WAAA,qVACA7oB,OAAA,SACAgpB,WAAA,iPACAC,eAAA,qBACAC,mBAAA,mfACAhf,WAAA,uEACAif,eAAA,sRACAC,uBAAA,kkBACAhkB,IAAA,qBACAikB,QAAA,6GACAC,cAAA,sBACAC,kBAAA,qOAEAC,IAAA,CACAC,kBAAA,gHACAC,aAAA,wGACAC,cAAA,4OACAC,uBAAA,8UACAC,qBAAA,2PACAC,iCAAA,yRACAb,eAAA,8KACAc,iBAAA,sFACAC,mBAAA,sKACAC,cAAA,oNACAC,2BAAA,gQACAC,0BAAA,+PACAC,iBAAA,6FACAC,wBAAA,8EACAC,sBAAA,uFACAC,+BAAA,+EACAC,4BAAA,8EACAC,eAAA,gDACAC,wBAAA,yWACAC,2BAAA,iQACAC,cAAA,iHACAC,YAAA,sCACAC,qBAAA,+EACAC,eAAA,yGACAC,sBAAA,6DACAC,eAAA,oKACAC,kBAAA,2KACAE,YAAA,6HACAC,aAAA,gHACAC,mBAAA,wIACAC,gBAAA,gLACAC,kBAAA,4DACAC,wBAAA,wPACAC,8BAAA,6GACAC,8BAAA,+GACAC,iBAAA,kGACAvE,cAAA,qKACAwE,kBAAA,6EACAC,uBAAA,yDACAC,qBAAA,gVACAC,UAAA,qHACAC,cAAA,2LAGA7b,IAAA,CACAxQ,OAAA,CACAssB,SAAA,kBACAC,cAAA,kCACAC,kBAAA,iBACAC,uBAAA,kEACAzlB,iBAAA,sJAEAzB,KAAA,CACAd,MAAA,kDACAiC,QAAA,qLACAgmB,cAAA,kGACAC,WAAA,uBAEApN,SAAA,CACA9a,MAAA,8CACAmoB,YAAA,YACArZ,QAAA,qBACA+L,OAAA,QACAuN,aAAA,2BACAC,KAAA,QACA9yE,OAAA,mCACA4lC,QAAA,yBACAmtC,KAAA,qBACAC,KAAA,CACA1Y,KAAA,OACAG,SAAA,OACAz6D,OAAA,+CACAk8D,KAAA,wMACA+W,gBAAA,8JAEApd,KAAA,CACAqd,8BAAA,sDACAC,oBAAA,+DACAC,6BAAA,uDACAC,mBAAA,iEAEAnc,MAAA,CACAoc,gBAAA,oBAGAC,IAAA,CACAC,oBAAA,YACAC,YAAA,kBACAC,mBAAA,aACAC,qBAAA,uCACAC,aAAA,QACAC,UAAA,gFACAC,YAAA,gCACAC,iBAAA,2BACAC,aAAA,8CACAC,eAAA,uDACAC,kBAAA,UACAC,eAAA,QACAC,iBAAA,6BACAC,qBAAA,aACA9O,SAAA,CACA9a,MAAA,QACAgU,YAAA,iKACA6V,aAAA,kCACAC,kBAAA,2CACAC,aAAA,OACAC,kBAAA,qHACAC,cAAA,yBACAC,mBAAA,qFACAC,WAAA,yCACAC,gBAAA,+IACAC,mBAAA,4BACAC,wBAAA,yOACAC,iBAAA,uBACAC,sBAAA,oLACAC,qBAAA,8BACAC,0BAAA,uGACAC,cAAA,+BACAC,eAAA,cACAC,4BAAA,sCACAC,6BAAA,oBACAC,yBAAA,eACAC,wBAAA,aACAC,6BAAA,uDACAC,0BAAA,gBACAC,+BAAA,4CACAC,yBAAA,QACAC,0BAAA,UACAC,+BAAA,uBACAC,yBAAA,QACAC,4BAAA,kBACAC,2BAAA,iBACAC,6BAAA,aACAC,6BAAA,0BAOArwB,EAAAl4B,aAAA,QAAA,CACAm4B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,mBACAnmD,OAAA,gBACAomD,OAAA,UACAC,MAAA,SACAC,OAAA,KACAC,QAAA,KACAC,OAAA,KACAC,SAAA,SACAC,eAAA,0BACAC,qBAAA,gBACAC,SAAA,UACAC,aAAA,cACAC,iBAAA,gBACAC,SAAA,MACAC,gBAAA,eACAC,kBAAA,+BACAC,SAAA,WACAC,SAAA,YACAC,WAAA,WACAC,WAAA,WACAC,UAAA,SACAC,UAAA,YACAC,UAAA,cACAC,WAAA,cACAC,gBAAA,eACAC,UAAA,YACAC,SAAA,YACAC,WAAA,WACAC,QAAA,SACAC,WAAA,SACAC,YAAA,aACAC,UAAA,mBACAC,UAAA,UACAC,aAAA,YACAC,WAAA,QACAC,eAAA,YACAC,YAAA,WACAC,cAAA,gBACAC,qBAAA,0BACAC,aAAA,YACAC,+BAAA,gCACAC,WAAA,YACAC,YAAA,mDACAC,KAAA,OACAC,oBAAA,6CACAC,iBAAA,8BACAC,QAAA,sBACAC,aAAA,4EACAC,UAAA,yBACAC,KAAA,KACAC,GAAA,IACAC,KAAA,SACAC,SAAA,SACAC,mBAAA,sBACA9L,GAAA,KACA+L,aAAA,mBACAC,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,UACAC,IAAA,YACAC,OAAA,WACAC,QAAA,cACAC,aAAA,cACAC,cAAA,uBACAC,eAAA,6CACAC,YAAA,wCACAC,sBAAA,WACAC,qBAAA,UACAC,UAAA,cACAC,gBAAA,4BACAC,cAAA,CACAC,MAAA,YACAC,iBAAA,uBACAC,kBAAA,wBACAC,kBAAA,yBACAC,oBAAA,wBAEAriC,KAAA,CACAsiC,KAAA,SACAC,KAAA,QACAC,KAAA,UACAC,WAAA,8BAGAC,OAAA,CACAC,oBAAA,oBACAC,oBAAA,UACAC,mBAAA,iBAEAC,KAAA,CACAC,KAAA,YACAC,IAAA,aACA7lB,SAAA,SACA8lB,QAAA,YACAC,QAAA,gBACAC,SAAA,kBACAC,QAAA,MACAC,aAAA,mBAEAC,MAAA,CACArB,MAAA,eACAsB,QAAA,iDACAC,eAAA,8FACAC,cAAA,8FACAC,KAAA,iBACAE,WAAA,oBACAC,MAAA,QACAC,oBAAA,sDACAC,aAAA,wBAEAhB,KAAA,CACAd,MAAA,SACAgC,QAAA,yCACAC,QAAA,2DACAC,aAAA,qBACAC,UAAA,aACAC,SAAA,iBACAN,aAAA,WACAO,0BAAA,2FACAC,mBAAA,0BACAC,iBAAA,iNAEArB,SAAA,CACAlB,MAAA,gBACA2C,gBAAA,gBACAC,gBAAA,iBACAC,iBAAA,MACAC,KAAA,6BACAE,uBAAA,oCACAC,cAAA,8CACAC,mBAAA,iHACAC,kBAAA,kCACAC,uBAAA,6CACAC,iBAAA,gBACAC,uBAAA,sBACAE,eAAA,kCACAE,kBAAA,+BACAC,iBAAA,yBACAC,mBAAA,uCACAC,wBAAA,oCACAC,6BAAA,8EACAC,wBAAA,gBACAC,UAAA,gCACAC,gBAAA,YACAC,eAAA,sDACAC,iBAAA,CACAC,MAAA,4BACAC,QAAA,+CACAC,OAAA,yCACAC,QAAA,0CACAC,KAAA,uCACAC,OAAA,0BAEAC,aAAA,qBACAE,YAAA,aACAC,iBAAA,kGACAC,iBAAA,cACAC,UAAA,oCACAC,YAAA,0BACAC,iBAAA,0CACAM,WAAA,CACAvF,MAAA,eACAwF,KAAA,YACAC,UAAA,6BACAC,QAAA,WACAC,aAAA,gBACAC,cAAA,mBAGAC,WAAA,CACAC,KAAA,iBACAC,KAAA,CACAC,aAAA,yCACAC,cAAA,mBACAjG,MAAA,mCACAkG,YAAA,2BACAC,SAAA,0BACAC,kBAAA,yBACAnoC,QAAA,sBACA6nC,KAAA,iBACAO,wBAAA,oEACAC,MAAA,6BACAC,QAAA,oBACAC,aAAA,8CACAC,aAAA,QACAC,iBAAA,qBACAC,cAAA,kBACAC,cAAA,eACAC,mBAAA,2CACAC,cAAA,qBACAC,mBAAA,0DACAC,eAAA,qBACAC,oBAAA,2EACAC,cAAA,wBACAC,mBAAA,uCACAC,SAAA,gBACAC,WAAA,kBACAC,cAAA,sBACAC,4BAAA,4BACAC,mBAAA,CACAC,IAAA,IACAC,GAAA,KAEA/pB,mBAAA,CACAjD,IAAA,mBACAitB,IAAA,mCACAC,IAAA,oBACAC,KAAA,oBAGAC,OAAA,CACA9H,MAAA,UACA+H,SAAA,gBACAC,YAAA,mBACAC,YAAA,cAGA/sB,SAAA,CACA6qB,KAAA,CACA/F,MAAA,SACAkI,aAAA,SACAC,QAAA,mBACAC,YAAA,MACAC,WAAA,UACAC,2BAAA,0QACAC,sBAAA,mBACAC,cAAA,sBACAC,QAAA,uBACAC,kBAAA,4BACAC,cAAA,SACAC,KAAA,iBACAC,MAAA,mBACA7V,GAAA,sBACA8V,SAAA,qBACAC,YAAA,wBACAxC,QAAA,wCACAyC,oBAAA,sBACAC,OAAA,+BACAC,QAAA,kCACAC,UAAA,mCACAC,cAAA,QACAC,gBAAA,gGACAC,gBAAA,qCACAC,aAAA,wDACAC,UAAA,yDACAC,WAAA,yFACAC,WAAA,sDACAC,aAAA,4DACAC,UAAA,sDACAC,YAAA,gCACAC,SAAA,qEACAC,kBAAA,gCACAC,SAAA,oEACAC,iBAAA,8EACAC,SAAA,yFACAC,aAAA,iCACAC,QAAA,SACAC,aAAA,QACAC,kBAAA,yBACAC,iBAAA,kBACAC,YAAA,oBAEAlJ,QAAA,CACAtB,MAAA,wBACAhC,aAAA,sBACAyM,gBAAA,uCAGAtJ,QAAA,CACA4E,KAAA,CACAgD,YAAA,wBACA2B,cAAA,wBACAC,aAAA,aACAC,SAAA,YACAC,iBAAA,8DACAC,iBAAA,wCACAC,OAAA,MACAC,eAAA,iBACAC,WAAA,mCACAC,UAAA,CACArwB,KAAA,wBACAE,OAAA,mBACAD,KAAA,gBACAqwB,YAAA,0BAGAC,KAAA,CACAC,eAAA,iGAGAvI,KAAA,CACAwI,MAAA,QACAC,gBAAA,0BACAC,OAAA,SACAC,QAAA,SACAC,aAAA,eACAC,UAAA,iBACAlD,QAAA,UACAmD,aAAA,gBACAC,UAAA,kBACAC,WAAA,aACAC,IAAA,MACAC,cAAA,WACApM,qBAAA,SACAqM,QAAA,iBACAC,cAAA,uBACAC,cAAA,WACApG,KAAA,CACA/F,MAAA,OACAoM,MAAA,eACAC,iBAAA,qBACAC,uBAAA,uCACAtE,YAAA,oBACAuE,YAAA,mBACAC,gBAAA,sBACAC,MAAA,CACAC,uBAAA,gEACAC,mBAAA,gDAIA5L,IAAA,CACA6L,YAAA,qCACAC,0BAAA,+IACAC,iBAAA,gBACAC,uBAAA,4BACAC,iBAAA,iCACAC,uBAAA,gCACAC,uBAAA,eACAC,6BAAA,uBACAC,sCAAA,0BACAC,UAAA,YACAC,sBAAA,oCACAC,QAAA,WACAC,OAAA,YACAjC,gBAAA,kCACAkC,iBAAA,kCACAjB,gBAAA,0BACAkB,mBAAA,oBACAC,wBAAA,uEACAvH,kBAAA,yBACAwH,YAAA,aACAC,gBAAA,iBACAC,uBAAA,sBACAC,mBAAA,wBACAhI,KAAA,CACAiI,oBAAA,uBAEAlG,OAAA,CACA9H,MAAA,aACAiO,UAAA,mBACAC,gBAAA,qBACAC,QAAA,2BACAC,cAAA,oCACAC,WAAA,uCACAC,YAAA,kDACAC,cAAA,kBACAC,YAAA,0BACA3O,UAAA,cACAC,gBAAA,8BACA2O,WAAA,iCACAC,aAAA,mBAEAC,SAAA,CACA3O,MAAA,aAEA4O,MAAA,CACA5O,MAAA,UAEA6O,eAAA,CACA7O,MAAA,4BACA8O,QAAA,4BACAC,KAAA,2CACAC,aAAA,2CACAC,SAAA,4BACAC,YAAA,wCACAzC,MAAA,sCACA0C,cAAA,qBAEAC,WAAA,CACApP,MAAA,yBAEAqP,qBAAA,CACArP,MAAA,qCACA8O,QAAA,2BACAC,KAAA,0CACAC,aAAA,6CACAM,KAAA,2BACAC,QAAA,uCACA9C,MAAA,uCAGA+C,MAAA,CACAxP,MAAA,2CACAyP,iBAAA,qFACAC,iBAAA,iDACAC,eAAA,yCACAC,eAAA,uCACAC,KAAA,wBACAC,UAAA,wBACAC,UAAA,wCACAC,SAAA,gBACAC,cAAA,gBACAC,YAAA,gBACA7R,oBAAA,wBACA8R,sBAAA,yBACAC,eAAA,mBACAC,oBAAA,0BACAC,aAAA,4BACAC,kBAAA,6BACAC,YAAA,gBACAC,iBAAA,sBACAC,qBAAA,UACAC,mBAAA,8DACAC,kBAAA,6BACAC,YAAA,CACA7Q,MAAA,cACAiC,QAAA,mIACA6O,YAAA,sBACAC,aAAA,uCAEAC,OAAA,CACAC,eAAA,gCACAC,gBAAA,mBACAnzC,KAAA,kBACAxoB,OAAA,qBACA47D,KAAA,yBAEAC,OAAA,CACA78C,OAAA,SACAK,QAAA,iBACAy8C,OAAA,SACAC,QAAA,gBACAC,QAAA,UACAC,KAAA,gBACAh9C,EAAA,YACAC,EAAA,WACAC,EAAA,YAEAqJ,KAAA,CACA0zC,KAAA,0FAGAC,KAAA,CACA1R,MAAA,iDACA2R,SAAA,aACAC,aAAA,2BACAC,kBAAA,8EACAC,qBAAA,6FACAlC,eAAA,mEAEA5O,QAAA,CACAhB,MAAA,YACA+R,QAAA,QACAC,QAAA,+BACAC,gBAAA,qBACAC,MAAA,sBACAC,aAAA,cACAC,YAAA,eACAC,aAAA,oDACAC,WAAA,4CACAC,cAAA,0BACAC,SAAA,8BACAC,cAAA,oCACAC,oBAAA,sCACAC,OAAA,UACAE,mBAAA,0DACAC,uBAAA,8EACAE,4BAAA,yGACAC,2BAAA,+KACAC,sBAAA,8HACAE,sBAAA,oKACAC,oBAAA,4BACAC,0BAAA,kBACA9J,UAAA,2BACA+J,kBAAA,UACAC,mCAAA,8BACAC,mBAAA,iCACAC,qBAAA,sBACAC,0BAAA,yBACAC,wBAAA,0BACAC,kBAAA,wBACAC,iBAAA,kCACAC,uBAAA,CACA/T,MAAA,oBACAgU,YAAA,4DACAC,iBAAA,yFACAC,cAAA,4BAEAC,IAAA,CACAnU,MAAA,cACAoU,mBAAA,kMACAC,uBAAA,2HACAC,4BAAA,uGACAC,WAAA,wHACAC,kBAAA,oIACAC,uBAAA,iHACAC,oBAAA,oCACAC,eAAA,iBACAC,qBAAA,2BACAC,oBAAA,0FACAC,eAAA,kBACAC,qBAAA,0BACAC,oBAAA,+JACAC,aAAA,kNACAC,iBAAA,gMACAC,eAAA,qQACA3H,OAAA,YACA4H,YAAA,YACAC,aAAA,eACAC,kBAAA,yCACAC,iBAAA,eACAC,sBAAA,mCACAC,cAAA,gBACAC,iBAAA,wBACAC,0BAAA,8UACAC,4BAAA,oPACAC,4BAAA,iPACAC,gBAAA,iCACAC,iBAAA,8BACAC,qBAAA,4CACAC,aAAA,oEACAC,WAAA,SACAC,mBAAA,sBAEAC,eAAA,CACApW,MAAA,qBACAyR,KAAA,iDAEA4E,sBAAA,CACArW,MAAA,yBACAyR,KAAA,yMAEA6E,oBAAA,CACAtW,MAAA,yBAEAuW,YAAA,CACAvW,MAAA,gBACAwW,QAAA,qBACAxY,aAAA,qBACAyY,qBAAA,+BACAC,UAAA,0BACAtZ,WAAA,sCACAuZ,WAAA,wBACAC,gBAAA,qDACAE,aAAA,CACA9W,MAAA,wBACAyR,KAAA,2BACAsF,UAAA,0BAGAI,SAAA,CACAC,aAAA,oCACAC,UAAA,UACAtS,UAAA,gBACAuS,gBAAA,kCACAS,WAAA,iHACAC,MAAA,qBACAC,UAAA,6DACAC,aAAA,iEACAC,WAAA,sDACAC,WAAA,iDACAC,WAAA,mDACAC,WAAA,mDACAC,WAAA,mDACAC,WAAA,+DACAC,WAAA,0CACAC,WAAA,0CACAC,WAAA,6CACAC,YAAA,+CACAC,YAAA,2EACAC,YAAA,mEACAC,YAAA,4CACAC,YAAA,mCACAC,YAAA,wCACAC,YAAA,iDACAC,YAAA,uCACAC,YAAA,uDACAC,YAAA,oCACAC,WAAA,gCACAG,qBAAA,+CACAC,iCAAA,6OACAC,0BAAA,uKACAG,oBAAA,8DACAF,kBAAA,yBACAG,QAAA,6BACAE,aAAA,4DACAja,MAAA,sBAEA0a,UAAA,kGACAC,QAAA,CACAC,KAAA,QACAC,OAAA,WACA1/B,QAAA,eAGA2/B,SAAA,CACA9a,MAAA,gBACA+a,UAAA,0BACArc,KAAA,KACAC,GAAA,IACAkc,OAAA,UACAI,YAAA,UACA9/B,QAAA,aACA+/B,aAAA,aACAlf,SAAA,SACAmf,gBAAA,uBACAC,KAAA,kBACAC,QAAA,IACAC,uBAAA,2EACA1M,MAAA,CACA5O,MAAA,kBAGAyM,MAAA,CACA8O,mBAAA,0BACAC,wBAAA,6DACAC,YAAA,QACAC,cAAA,oBACAC,qBAAA,4EACAC,wBAAA,0CACAC,iBAAA,oCACAC,eAAA,gDACAC,eAAA,qBACAC,gBAAA,yBACAC,4BAAA,uDACAC,eAAA,wBACAC,2BAAA,wDACAC,UAAA,wBACAC,UAAA,wBACAC,aAAA,+CACAC,iBAAA,0BACAC,cAAA,wBACAC,gBAAA,kBACAC,uBAAA,qCACAC,mBAAA,2CACAC,qBAAA,2BACAC,0BAAA,6BACAC,+BAAA,iEACAC,wCAAA,8HACAC,gCAAA,8EACAC,aAAA,oCACAC,qBAAA,kCACAC,yBAAA,qDACAC,0BAAA,kDACAC,2BAAA,wCACAC,oBAAA,0CACAC,uBAAA,oDACAC,oBAAA,8DACAC,eAAA,6BACAC,iBAAA,oGACAC,mBAAA,yIACAC,wBAAA,6CACAC,0BAAA,yEACAC,uBAAA,+CACAC,sBAAA,+BACAC,oBAAA,uCACAC,YAAA,kCACAC,oBAAA,wBACAC,kBAAA,uBACAC,sBAAA,oEACAC,iBAAA,wCACAC,gBAAA,6BACAC,gBAAA,kCACAC,kBAAA,wBACAC,qBAAA,0CACAC,gBAAA,kFACAC,gBAAA,gEACAC,eAAA,iDACAC,wBAAA,iCACAC,iBAAA,8DACAC,2BAAA,+HACAC,4BAAA,sIACAC,4BAAA,gMACAC,iBAAA,+IACApiC,sBAAA,kNACAqiC,mBAAA,0BACAC,mBAAA,oCACAC,+BAAA,wBACAC,0BAAA,6NACAC,wBAAA,6KACAC,eAAA,qIACAC,mBAAA,iFACAC,cAAA,2BACAC,oBAAA,6DACAC,oBAAA,sCACAC,kBAAA,8BACAC,gBAAA,uCACAC,yBAAA,sIACAC,iCAAA,mKACAC,wBAAA,0BACAC,sBAAA,4CACAC,oBAAA,oDACAC,oCAAA,6DACAE,kCAAA,4EACAC,iBAAA,sCACAC,mBAAA,wCACAC,2BAAA,uCACAC,kBAAA,0BACAC,+BAAA,iDACAC,kBAAA,kDACAC,iBAAA,gCACAC,0BAAA,+DACAC,uBAAA,iDACAC,mBAAA,iDACAC,iBAAA,wHACAC,yBAAA,gFACAC,wBAAA,0CACAC,yBAAA,mFACAU,oBAAA,+BACAC,kBAAA,kDAEA3W,KAAA,CACAqQ,YAAA,cACAuG,mBAAA,wBACAxD,kBAAA,uBACAyD,cAAA,wBACAC,uBAAA,kBACAC,oBAAA,oBACAC,oBAAA,iBACAC,qCAAA,kGACAC,yBAAA,wGACAC,2BAAA,qQACAC,gBAAA,qBACAC,gCAAA,2FACAC,yBAAA,2IACAC,iBAAA,gCAEAC,QAAA,CACAnH,YAAA,sBACAoH,oBAAA,qBACAC,6BAAA,yEACAC,wBAAA,qBAAAC,cAAA,8ZACAlI,SAAA,kRACAqI,aAAA,+VACAC,eAAA,8GACAC,iBAAA,qHACAC,0BAAA,mCACAC,oBAAA,8RACAC,aAAA,yJACAC,eAAA,2HACAC,WAAA,6GACAC,iBAAA,wGACAC,gBAAA,2PACAC,kBAAA,4HACAC,0BAAA,4KACAC,kBAAA,kEACAC,wBAAA,yBACAC,OAAA,iDACAC,kBAAA,oHAEAE,SAAA,CACA3I,YAAA,gCACA4I,qBAAA,0PAEA5S,KAAA,CACAzR,MAAA,iBACAskB,KAAA,CACAC,QAAA,cACA1U,KAAA,8hBACAG,SAAA,yhBACAxC,OAAA,+ZAEAkX,SAAA,CACAH,QAAA,WACAC,WAAA,wIACA7oB,OAAA,UACAgpB,WAAA,6PACAC,eAAA,sBACAC,mBAAA,sgBACAhf,WAAA,kEACAif,eAAA,gSACAC,uBAAA,0rBAEAI,IAAA,CACAC,kBAAA,6GACAC,aAAA,8GACAC,cAAA,mPACAC,uBAAA,uYACAC,qBAAA,2NACAC,iCAAA,qPACAb,eAAA,iMAAAc,iBAAA,qFACAC,mBAAA,qMACAC,cAAA,iPACAC,2BAAA,mQACAC,0BAAA,kQACAC,iBAAA,0FACAC,wBAAA,mFACAC,sBAAA,0FACAC,+BAAA,oFACAC,4BAAA,mFACAC,eAAA,kDACAC,wBACA,yXACAC,2BAAA,gSACAC,cAAA,8HACAC,YAAA,oCACAC,qBAAA,qEACAC,eAAA,qHACAC,sBAAA,oEACAC,eAAA,iLACAC,kBAAA,oLACAE,YAAA,mIACAC,aAAA,sGACAC,mBAAA,+JACAC,gBAAA,yLACAC,kBAAA,oFACAC,wBAAA,8QACAC,8BAAA,gHACAC,8BAAA,kHACAC,iBAAA,oGACAvE,cAAA,4LACAwE,kBAAA,mFACAC,uBAAA,+DACAC,qBAAA,oYACAC,UAAA,kHACAC,cAAA,8LAMAtsB,EAAAl4B,aAAA,QAAA,CACAm4B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,mBACAnmD,OAAA,eACAomD,OAAA,SACAC,MAAA,OACAC,OAAA,KACAC,QAAA,MACAC,OAAA,MACAC,SAAA,UACAC,eAAA,oBACAC,qBAAA,WACAC,SAAA,cACAC,aAAA,mBACAC,iBAAA,iBACAC,SAAA,OACAC,gBAAA,2BACAC,kBAAA,gCACAC,SAAA,SACAC,SAAA,UACAC,WAAA,WACAC,WAAA,UACAC,UAAA,SACAC,UAAA,YACAC,UAAA,eACAC,WAAA,cACAC,gBAAA,iBACAC,UAAA,WACAC,SAAA,WACAC,WAAA,YACAC,QAAA,UACAC,WAAA,aACAC,YAAA,aACAC,UAAA,cACAC,UAAA,YACAC,aAAA,YACAC,WAAA,QACAC,eAAA,eACAC,YAAA,UACAC,cAAA,gBACAC,qBAAA,sBACAC,aAAA,cACAC,+BAAA,kCACAC,WAAA,WACAC,YAAA,6DACAC,KAAA,QACAC,oBAAA,oDACAC,iBAAA,wBACAC,QAAA,wBACAC,aAAA,8EACAC,UAAA,wBACAC,KAAA,KACAC,GAAA,IACAC,KAAA,SACAC,SAAA,SACAC,mBAAA,sBACA9L,GAAA,KACA+L,aAAA,iBACAC,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,SACAC,IAAA,aACAC,OAAA,SACAC,QAAA,YACAC,aAAA,YACAC,cAAA,sBACAC,eAAA,2CACAC,YAAA,kCACAC,sBAAA,UACAC,qBAAA,UACAC,UAAA,gBACAC,gBAAA,gCACAC,cAAA,CACAC,MAAA,WACAC,iBAAA,uBACAC,kBAAA,wBACAC,kBAAA,yBACAC,oBAAA,wBAEAriC,KAAA,CACAsiC,KAAA,SACAC,KAAA,SACAC,KAAA,WACAC,WAAA,2BAGAC,OAAA,CACAC,oBAAA,sBACAC,oBAAA,UACAC,mBAAA,iBAEAC,KAAA,CACAC,KAAA,UACAC,IAAA,WACA7lB,SAAA,UACA8lB,QAAA,aACAC,QAAA,oBACAC,SAAA,aACAC,QAAA,SACAC,aAAA,kBAEAC,MAAA,CACArB,MAAA,WACAsB,QAAA,iDACAC,eAAA,qGACAC,cAAA,kGACAC,KAAA,gBACAC,kBAAA,sBACAC,WAAA,kBACAC,MAAA,UACAC,oBAAA,0DACAC,aAAA,uBACAC,oBAAA,kCAEAjB,KAAA,CACAd,MAAA,SACAgC,QAAA,wCACAC,QAAA,iEACAC,aAAA,0CACAC,UAAA,WACAC,SAAA,gBACAN,aAAA,WACAO,0BAAA,iGACAC,mBAAA,wBACAC,iBAAA,0MACAC,cAAA,YACAC,UAAA,gBACAC,YAAA,UAEAxB,SAAA,CACAlB,MAAA,aACA2C,gBAAA,YACAC,gBAAA,WACAC,iBAAA,SACAC,KAAA,eACAC,WAAA,eACAC,uBAAA,kCACAC,cAAA,qDACAC,mBAAA,6HACAC,kBAAA,4BACAC,uBAAA,uCACAC,iBAAA,oBACAC,uBAAA,uBACAC,4BAAA,wHACAC,eAAA,0CACAC,gBAAA,6CACAC,kBAAA,6BACAC,iBAAA,iBACAC,mBAAA,qCACAC,wBAAA,6BACAC,6BAAA,0FACAC,wBAAA,mBACAC,UAAA,kCACAC,gBAAA,sBACAC,eAAA,sEACAC,iBAAA,CACAC,MAAA,yBACAC,QAAA,gCACAC,OAAA,kCACAC,QAAA,kCACAC,KAAA,gCACAC,OAAA,0BAEAC,aAAA,uBACAC,kBAAA,yMACAC,YAAA,uBACAC,iBAAA,gGACAC,iBAAA,aACAC,UAAA,mCACAC,YAAA,yBACAC,iBAAA,qCACAC,sBAAA,gCACAC,4BAAA,sBACAC,2BAAA,2DACAC,sBAAA,CACAC,KAAA,cACA9wC,EAAA,+CAEA+wC,WAAA,CACAvF,MAAA,eACAwF,KAAA,UACAC,UAAA,yBACAC,QAAA,aACAC,aAAA,oBACAC,cAAA,qBAGAC,WAAA,CACAC,KAAA,kBACAC,KAAA,CACAC,aAAA,uCACAC,cAAA,eACAjG,MAAA,iCACAkG,YAAA,0BACAC,SAAA,uBACAC,kBAAA,0BACAnoC,QAAA,oBACA6nC,KAAA,eACAO,wBAAA,8DACAC,MAAA,6BACAC,QAAA,sBACAC,aAAA,4CACAC,aAAA,UACAC,iBAAA,sBACAC,cAAA,mBACAC,cAAA,kBACAC,mBAAA,wCACAC,cAAA,mBACAC,mBAAA,8CACAC,eAAA,iBACAC,oBAAA,4EACAC,cAAA,sBACAC,mBAAA,4CACAC,SAAA,eACAC,WAAA,iBACAC,cAAA,sBACAC,4BAAA,0BACAC,mBAAA,CACAC,IAAA,KACAC,GAAA,MAEA/pB,mBAAA,CACAjD,IAAA,uBACAitB,IAAA,qCACAC,IAAA,iBACAC,KAAA,mBAGAC,OAAA,CACA9H,MAAA,QACA+H,SAAA,aACAC,YAAA,mBACAC,YAAA,cAGA/sB,SAAA,CACA6qB,KAAA,CACA/F,MAAA,UACAkI,aAAA,UACAC,QAAA,qBACAC,YAAA,SACAC,WAAA,QACAC,2BAAA,gRACAC,sBAAA,mBACAC,cAAA,oBACAC,QAAA,oBACAC,kBAAA,iCACAC,cAAA,UACAC,KAAA,kBACAC,MAAA,mBACA7V,GAAA,sBACA8V,SAAA,sBACAC,YAAA,yBACAxC,QAAA,yCACAyC,oBAAA,uBACAC,OAAA,6BACAC,QAAA,gCACAC,UAAA,kCACAC,cAAA,QACAC,gBAAA,+FACAC,gBAAA,iCACAC,aAAA,wDACAC,UAAA,qDACAC,WAAA,0FACAC,WAAA,sDACAC,aAAA,6DACAC,UAAA,wEACAC,YAAA,wDACAC,SAAA,8FACAC,kBAAA,kCACAC,SAAA,kFACAC,iBAAA,4FACAC,SAAA,2FACAC,aAAA,+BACAC,QAAA,SACAC,aAAA,UACAC,kBAAA,+BACAC,iBAAA,kBACAC,YAAA,sBAEAlJ,QAAA,CACAtB,MAAA,wBACAhC,aAAA,yBACAyM,gBAAA,mCAGAtJ,QAAA,CACA4E,KAAA,CACAgD,YAAA,yBACA2B,cAAA,2BACAC,aAAA,YACAC,SAAA,WACAC,iBAAA,6DACAC,iBAAA,wCACAC,OAAA,gBACAC,eAAA,cACAC,WAAA,iCACAC,UAAA,CACArwB,KAAA,4BACAE,OAAA,uBACAD,KAAA,iBACAqwB,YAAA,6BAGAC,KAAA,CACAC,eAAA,sFAGAvI,KAAA,CACAwI,MAAA,QACAC,gBAAA,oBACAC,OAAA,SACAC,QAAA,UACAC,aAAA,gBACAC,UAAA,kBACAlD,QAAA,UACAmD,aAAA,gBACAC,UAAA,iBACAC,WAAA,aACAC,IAAA,MACAC,cAAA,SACApM,qBAAA,SACAqM,QAAA,aACAC,cAAA,mBACAC,cAAA,eACApG,KAAA,CACA/F,MAAA,OACAoM,MAAA,eACAC,iBAAA,wBACAC,uBAAA,qCACAtE,YAAA,wBACAuE,YAAA,iBACAC,gBAAA,yBACAC,MAAA,CACAC,uBAAA,qFACAC,mBAAA,uDAIA5L,IAAA,CACA6L,YAAA,qCACAC,0BAAA,8HACAC,iBAAA,aACAC,uBAAA,oBACAC,iBAAA,+BACAC,uBAAA,6BACAC,uBAAA,eACAC,6BAAA,sBACAC,sCAAA,2BACAC,UAAA,aACAC,sBAAA,gCACAC,QAAA,SACAC,OAAA,aACAjC,gBAAA,2BACAkC,iBAAA,4BACAjB,gBAAA,yBACAkB,mBAAA,6BACAC,wBAAA,0EACAvH,kBAAA,0BACAwH,YAAA,YACAC,gBAAA,iBACAC,uBAAA,yBACAC,mBAAA,2BACAhI,KAAA,CACAiI,oBAAA,sBAEAlG,OAAA,CACA9H,MAAA,qBACAiO,UAAA,mBACAC,gBAAA,oBACAC,QAAA,0BACAC,cAAA,oCACAC,WAAA,sCACAC,YAAA,kDACAC,cAAA,mBACAC,YAAA,0BACA3O,UAAA,gBACAC,gBAAA,gCACA2O,WAAA,iCACAC,aAAA,iBAEAC,SAAA,CACA3O,MAAA,YAEA4O,MAAA,CACA5O,MAAA,aAEA6O,eAAA,CACA7O,MAAA,2BACA8O,QAAA,wBACAC,KAAA,mCACAC,aAAA,0CACAC,SAAA,wBACAC,YAAA,oCACAzC,MAAA,kCACA0C,cAAA,mBAEAC,WAAA,CACApP,MAAA,wBAEAqP,qBAAA,CACArP,MAAA,kCACA8O,QAAA,wBACAC,KAAA,mCACAC,aAAA,0CACAM,KAAA,wBACAC,QAAA,oCACA9C,MAAA,oCAGA+C,MAAA,CACAxP,MAAA,4CACAyP,iBAAA,wGACAC,iBAAA,+CACAC,eAAA,kDACAC,eAAA,wCACAC,KAAA,qBACAC,UAAA,qBACAC,UAAA,kCACAC,SAAA,eACAC,cAAA,eACAC,YAAA,6BACA7R,oBAAA,qCACA8R,sBAAA,6BACAC,eAAA,qBACAC,oBAAA,+BACAC,aAAA,wBACAC,kBAAA,8BACAC,YAAA,kBACAC,iBAAA,wBACAC,qBAAA,WACAC,mBAAA,8DACAC,kBAAA,wBACAC,YAAA,CACA7Q,MAAA,cACAiC,QAAA,sHACA6O,YAAA,iBACAC,aAAA,+CAEAC,OAAA,CACAC,eAAA,qCACAC,gBAAA,gBACAnzC,KAAA,uBACAxoB,OAAA,6BACA47D,KAAA,sBAEAC,OAAA,CACA78C,OAAA,eACAK,QAAA,kBACAy8C,OAAA,aACAC,QAAA,qBACAC,QAAA,iBACAC,KAAA,sBACAh9C,EAAA,YACAC,EAAA,WACAC,EAAA,YAEAqJ,KAAA,CACA0zC,KAAA,2FAGAC,KAAA,CACA1R,MAAA,mDACA2R,SAAA,iBACAC,aAAA,+BACAC,kBAAA,gFACAC,qBAAA,2HACAlC,eAAA,gEAEA5O,QAAA,CACAhB,MAAA,aACA+R,QAAA,QACAC,QAAA,kCACAC,gBAAA,kBACAC,MAAA,qBACAC,aAAA,gBACAC,YAAA,gBACAC,aAAA,sDACAC,WAAA,wCACAC,cAAA,sCACAC,SAAA,6BACAC,cAAA,iCACAC,oBAAA,uCACAC,OAAA,aACAC,cAAA,8WACAC,mBAAA,wDACAC,uBAAA,gQACAC,4BAAA,sXACAC,4BAAA,8GACAC,2BAAA,+KACAC,sBAAA,yJACAC,sCAAA,2JACAC,sBAAA,sKACAC,oBAAA,wBACAC,0BAAA,iBACA9J,UAAA,0BACA+J,kBAAA,YACAC,mCAAA,sCACAC,mBAAA,oCACAC,qBAAA,wBACAC,0BAAA,2BACAC,wBAAA,wBACAC,kBAAA,wBACAC,iBAAA,gCACAC,uBAAA,CACA/T,MAAA,qBACAgU,YAAA,yDACAC,iBAAA,oGACAC,cAAA,gCAEAC,IAAA,CACAnU,MAAA,qBACAoU,mBAAA,wNACAC,uBAAA,uIACAC,4BAAA,0FACAC,WAAA,4HACAC,kBAAA,wIACAC,uBAAA,6IACAC,oBAAA,yCACAC,eAAA,gBACAC,qBAAA,8BACAC,oBAAA,6NACAC,eAAA,sBACAC,qBAAA,6BACAC,oBAAA,kJACAC,aAAA,sMACAC,iBAAA,yMACAC,eAAA,0WACA3H,OAAA,aACA4H,YAAA,aACAC,aAAA,eACAC,kBAAA,uCACAC,iBAAA,eACAC,sBAAA,+BACAC,cAAA,iBACAC,iBAAA,qBACAC,0BAAA,kZACAC,4BAAA,+QACAC,4BAAA,2PACAC,gBAAA,kBACAC,iBAAA,wBACAC,qBAAA,4BACAC,aAAA,uGACAC,WAAA,YACAC,mBAAA,wBAEAC,eAAA,CACApW,MAAA,2BACAyR,KAAA,sDAEA4E,sBAAA,CACArW,MAAA,0BACAyR,KAAA,8MAEA6E,oBAAA,CACAtW,MAAA,6BAEAuW,YAAA,CACAvW,MAAA,oBACAwW,QAAA,0BACAxY,aAAA,uBACAyY,qBAAA,gCACAC,UAAA,gCACAtZ,WAAA,wCACAuZ,WAAA,2BACAC,gBAAA,6DACAC,WAAA,WACAC,aAAA,CACA9W,MAAA,2BACAyR,KAAA,4BACAsF,UAAA,uBAEAC,aAAA,CACAhX,MAAA,6BACAyR,KAAA,uLACAwF,aAAA,wFACAC,cAAA,+BAGAC,SAAA,CACAC,aAAA,qCACAC,UAAA,QACAtS,UAAA,gBACAuS,gBAAA,wCACAC,qBAAA,sNACAC,iBAAA,sCACAC,sBAAA,6OACAC,iBAAA,oEACAC,cAAA,kCACAC,mBAAA,2LACAC,cAAA,0BACAC,mBAAA,+OACAC,WAAA,sHACAC,MAAA,qBACAC,UAAA,8DACAC,aAAA,6DACAC,WAAA,wEACAC,WAAA,yDACAC,WAAA,6DACAC,WAAA,wDACAC,WAAA,kEACAC,WAAA,oEACAC,WAAA,2CACAC,WAAA,qDACAC,WAAA,mDACAC,YAAA,sDACAC,YAAA,wFACAC,YAAA,4EACAC,YAAA,yDACAC,YAAA,4CACAC,YAAA,kDACAC,YAAA,kEACAC,YAAA,mDACAC,YAAA,sDACAC,YAAA,6CACAC,WAAA,gCACAC,gBAAA,4JACAC,uBAAA,8EACAC,qBAAA,gCACAC,iCAAA,8PACAC,0BAAA,uLACAC,kBAAA,mCACAC,uBAAA,ySACAC,oBAAA,8DACAC,QAAA,kCACAC,aAAA,iNACAC,aAAA,6DACAja,MAAA,qBACAka,QAAA,CACAC,cAAA,iBACAC,mBAAA,kQACAC,WAAA,yCACAC,gBAAA,yUACAC,YAAA,oDACAC,iBAAA,2QACAC,eAAA,CACAza,MAAA,+BACAyR,KAAA,wCACAxB,cAAA,kBAEAxD,MAAA,CACA3vD,aAAA,4BACAuhB,aAAA,kCAIAq8C,UAAA,mGACAC,QAAA,CACAC,KAAA,OACAC,OAAA,UACA1/B,QAAA,gBAGA2/B,SAAA,CACA9a,MAAA,WACA+a,UAAA,oBACAC,cAAA,kBACAtc,KAAA,KACAC,GAAA,IACAkc,OAAA,UACAI,YAAA,UACA9/B,QAAA,cACA+/B,aAAA,cACAlf,SAAA,UACAmf,gBAAA,yBACAC,KAAA,kBACAC,QAAA,IACAC,uBAAA,0EACA1M,MAAA,CACA5O,MAAA,aAGAyM,MAAA,CACA8O,mBAAA,uBACAC,wBAAA,wCACAC,YAAA,SACAC,cAAA,kBACAC,qBAAA,uFACAC,wBAAA,kDACAC,iBAAA,oCACAC,eAAA,8CACAC,eAAA,oBACAC,gBAAA,qBACAC,4BAAA,oDACAC,eAAA,qBACAC,2BAAA,oDACAC,UAAA,4BACAC,UAAA,4BACAC,aAAA,iDACAC,iBAAA,4BACAC,cAAA,0BACAC,gBAAA,2BACAC,uBAAA,oCACAC,mBAAA,2CACAC,qBAAA,yBACAC,0BAAA,4BACAC,+BAAA,wFACAC,wCAAA,4LACAC,gCAAA,wGACAC,aAAA,+BACAC,qBAAA,sCACAC,yBAAA,oDACAC,0BAAA,qDACAC,2BAAA,kCACAC,oBAAA,6CACAC,uBAAA,qDACAC,oBAAA,qEACAC,eAAA,qBACAC,iBAAA,kGACAC,mBAAA,yIACAC,wBAAA,yCACAC,0BAAA,gEACAC,uBAAA,mDACAC,sBAAA,iCACAC,oBAAA,wCACAC,YAAA,4BACAC,oBAAA,oBACAC,kBAAA,yBACAC,sBAAA,yEACAC,iBAAA,mCACAC,gBAAA,8BACAC,gBAAA,gCACAC,kBAAA,sBACAC,qBAAA,wCACAC,gBAAA,6EACAC,gBAAA,qEACAC,eAAA,6CACAC,wBAAA,8BACAC,iBAAA,0EACAC,2BAAA,2IACAC,4BAAA,+HACAC,4BAAA,mMACAC,iBAAA,2IACApiC,sBAAA,oNACAqiC,mBAAA,wBACAC,mBAAA,sCACAC,+BAAA,uBACAC,0BAAA,qOACAC,wBAAA,8KACAC,eAAA,6IACAC,mBAAA,yEACAC,cAAA,4BACAC,oBAAA,0EACAC,oBAAA,wCACAC,kBAAA,iCACAC,gBAAA,gDACAC,yBAAA,6IACAC,iCAAA,uKACAC,wBAAA,2BACAC,sBAAA,4CACAC,oBAAA,mDACAC,oCAAA,qEACAC,kDAAA,wFACAC,kCAAA,qFACAC,iBAAA,oCACAC,mBAAA,oCACAC,2BAAA,oDACAC,kBAAA,0BACAC,+BAAA,gDACAC,kBAAA,4CACAC,iBAAA,iCACAC,0BAAA,+DACAC,uBAAA,iEACAC,mBAAA,uDACAC,iBAAA,oIACAC,yBAAA,wFACAC,wBAAA,iDACAC,yBAAA,+FACAC,oBAAA,6IACAC,4BAAA,+CACAC,0BAAA,2DACAC,wBAAA,qDACAC,wBAAA,wDACAC,0BAAA,mJACAC,8BAAA,4CACAC,kBAAA,mCACAC,2BAAA,0DACAC,oBAAA,8BACAC,kBAAA,sDAEA3W,KAAA,CACAqQ,YAAA,cACAuG,mBAAA,wBACAxD,kBAAA,qBACAyD,cAAA,kBACAC,uBAAA,8BACAC,oBAAA,sBACAC,oBAAA,yBACAC,qCAAA,iGACAC,yBAAA,uGACAC,2BAAA,6QACAC,gBAAA,qBACAC,gCAAA,yFACAC,yBAAA,iJACAC,iBAAA,+BAEAC,QAAA,CACAnH,YAAA,sBACAoH,oBAAA,uBACAC,6BAAA,0EACAC,wBAAA,oBACAC,cAAA,ybACAC,WAAA,0CACAC,SAAA,yBACApI,SAAA,sQACAqI,aAAA,iVACAC,eAAA,oHACAC,iBAAA,qIACAC,0BAAA,qBACAC,oBAAA,uOACAC,aAAA,yKACAC,eAAA,gHACAC,WAAA,+GACAC,iBAAA,wGACAC,gBAAA,oQACAC,kBAAA,kIACAC,0BAAA,2LACAC,kBAAA,8EACAC,wBAAA,iCACAC,OAAA,8CACAC,kBAAA,6HACAC,mBAAA,uSAEAC,SAAA,CACA3I,YAAA,+BACA4I,qBAAA,qSAEA5S,KAAA,CACAzR,MAAA,gBACAskB,KAAA,CACAC,QAAA,cACA1U,KAAA,6hBACAG,SAAA,0fACAxC,OAAA,qbAEAgC,MAAA,CACA+U,QAAA,YACAhvE,OAAA,4BACAivE,WAAA,6hBACAxT,OAAA,wBACAyT,WAAA,quBAEAC,SAAA,CACAH,QAAA,YACAC,WAAA,gYACA7oB,OAAA,SACAgpB,WAAA,iRACAC,eAAA,uBACAC,mBAAA,shBACAhf,WAAA,gEACAif,eAAA,uSACAC,uBAAA,unBACAhkB,IAAA,2BACAikB,QAAA,+HACAC,cAAA,oBACAC,kBAAA,2PAEAC,IAAA,CACAC,kBAAA,sHACAC,aAAA,6GACAC,cAAA,wPACAC,uBAAA,6VACAC,qBAAA,yQACAC,iCAAA,2SACAb,eAAA,8LACAc,iBAAA,0FACAC,mBAAA;AACAC,cAAA,gOACAC,2BAAA,kPACAC,0BAAA,2QACAC,iBAAA,6FACAC,wBAAA,mFACAC,sBAAA,iFACAC,+BAAA,4EACAC,4BAAA,4EACAC,eAAA,iDACAC,wBAAA,+WACAC,2BAAA,6RACAC,cAAA,kIACAC,YAAA,2CACAC,qBAAA,qFACAC,eAAA,oHACAC,sBAAA,gEACAC,eAAA,yMACAC,kBAAA,iMACAC,iBAAA,iHACAC,YAAA,4IACAC,aAAA,6HACAC,mBAAA,iKACAC,gBAAA,qLACAC,kBAAA,6EACAC,wBAAA,kQACAC,8BAAA,mHACAC,8BAAA,6GACAC,iBAAA,0GACAvE,cAAA,6LACAwE,kBAAA,yFACAC,uBAAA,8DACAC,qBAAA,8WACAC,UAAA,mIACAC,cAAA,mNAGA7b,IAAA,CACAxQ,OAAA,CACAssB,SAAA,oBACAC,cAAA,sCACAC,kBAAA,oBACAC,uBAAA,iEACAzlB,iBAAA,kJAEAzB,KAAA,CACAd,MAAA,oDACAiC,QAAA,gMACAgmB,cAAA,oGACAC,WAAA,0BAEApN,SAAA,CACA9a,MAAA,sDACAmoB,YAAA,oBACArZ,QAAA,8BACA+L,OAAA,YACAuN,aAAA,gCACAC,KAAA,QACA9yE,OAAA,iCACA4lC,QAAA,6BACAmtC,KAAA,oBACAC,KAAA,CACA1Y,KAAA,OACAG,SAAA,OACAz6D,OAAA,+CACAk8D,KAAA,qOACA+W,gBAAA,iKAEApd,KAAA,CACAqd,8BAAA,2DACAC,oBAAA,8DACAC,6BAAA,2DACAC,mBAAA,+DAEAnc,MAAA,CACAoc,gBAAA,sBAGAC,IAAA,CACAC,oBAAA,cACAC,YAAA,kBACAC,mBAAA,aACAC,qBAAA,4CACAC,aAAA,SACAC,UAAA,+FACAC,YAAA,kCACAC,iBAAA,4BACAC,aAAA,8CACAC,eAAA,2DACAC,kBAAA,WACAC,eAAA,SACAC,iBAAA,iCACAC,qBAAA,aACA9O,SAAA,CACA9a,MAAA,YACAgU,YAAA,8LACA6V,aAAA,+BACAC,kBAAA,6CACAC,aAAA,UACAC,kBAAA,gJACAC,cAAA,6BACAC,mBAAA,oGACAC,WAAA,uCACAC,gBAAA,0JACAC,mBAAA,6BACAC,wBAAA,6OACAC,iBAAA,2BACAC,sBAAA,0LACAC,qBAAA,0BACAC,0BAAA,6GACAC,cAAA,qCACAC,eAAA,cACAC,4BAAA,uCACAC,6BAAA,qBACAC,yBAAA,kBACAC,wBAAA,kBACAC,6BAAA,wDACAC,0BAAA,mBACAC,+BAAA,4CACAC,yBAAA,QACAC,0BAAA,UACAC,+BAAA,uBACAC,yBAAA,SACAC,4BAAA,eACAC,2BAAA,cACAC,6BAAA,UACAC,6BAAA,sBAOArwB,EAAAl4B,aAAA,QAAA,CACAm4B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,kBACAnmD,OAAA,iBACAomD,OAAA,SACAC,MAAA,SACAC,OAAA,KACAC,QAAA,KACAC,OAAA,KACAC,SAAA,UACAC,eAAA,mBACAC,qBAAA,aACAC,SAAA,UACAC,aAAA,cACAC,iBAAA,iBACAC,SAAA,WACAC,gBAAA,2BACAC,kBAAA,wBACAC,SAAA,WACAC,SAAA,SACAE,WAAA,aACAC,UAAA,WACAC,UAAA,YACAC,UAAA,SACAC,WAAA,UACAC,gBAAA,cACAC,UAAA,cACAC,SAAA,aACAC,WAAA,YACAC,QAAA,aACAC,WAAA,UACAC,YAAA,aACAC,UAAA,YACAC,UAAA,WACAC,aAAA,aACAC,WAAA,SACAC,eAAA,YACAC,YAAA,UACAC,cAAA,2BACAC,qBAAA,0BACAC,aAAA,YACAC,+BAAA,2BACAC,WAAA,aACAC,YAAA,mDACAC,KAAA,SACAC,oBAAA,4CACAC,iBAAA,2BACAC,QAAA,eACAE,UAAA,cACAC,KAAA,KACAC,GAAA,IACAC,KAAA,UACAC,SAAA,SACAC,mBAAA,uBACA9L,GAAA,KACA+L,aAAA,mBACAC,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,UACAC,IAAA,aACAC,OAAA,WACAC,QAAA,cACAC,aAAA,aACAC,cAAA,sBACAC,eAAA,4CACAC,YAAA,uCACAC,sBAAA,UACAC,qBAAA,SACAC,UAAA,kBACAC,gBAAA,gCACAC,cAAA,CACAC,MAAA,cACAC,iBAAA,yBACAC,kBAAA,0BACAC,kBAAA,2BACAC,oBAAA,0BAEAriC,KAAA,CACAsiC,KAAA,QACAC,KAAA,QACAC,KAAA,uBACAC,WAAA,4BAGAC,OAAA,CACAC,oBAAA,qBACAC,oBAAA,WACAC,mBAAA,iBAEAC,KAAA,CACAC,KAAA,OACAC,IAAA,WACA7lB,SAAA,SACA8lB,QAAA,YACAC,QAAA,oBACAC,SAAA,eACAC,QAAA,OACAC,aAAA,kBAEAC,MAAA,CACArB,MAAA,cACAsB,QAAA,mDACAG,KAAA,mBACAE,WAAA,gBACAC,MAAA,SACAgqB,YAAA,cACAC,oBAAA,8EACAC,0BAAA,gDACAhqB,aAAA,oBAEAhB,KAAA,CACAd,MAAA,SACAgC,QAAA,sDACAC,QAAA,uDACAC,aAAA,sBACAC,UAAA,cACAC,SAAA,QACAN,aAAA,mBACAO,0BAAA,yFACAC,mBAAA,4BACAC,iBAAA,qMAEArB,SAAA,CACAlB,MAAA,eACA6C,iBAAA,OACAC,KAAA,yBACAE,uBAAA,2CACAG,kBAAA,0BACAC,uBAAA,uCACAI,eAAA,8BACAE,kBAAA,2BACAC,iBAAA,YACAC,mBAAA,+BACAG,wBAAA,iBACAC,UAAA,+BACAC,gBAAA,WACAC,eAAA,kEACAC,iBAAA,CACAC,MAAA,uBACAC,QAAA,+BACAC,OAAA,gCACAC,QAAA,iCACAC,KAAA,+BACAC,OAAA,4BAEAG,YAAA,oBACAC,iBAAA,uFACAC,iBAAA,aACAC,UAAA,gCACAC,YAAA,6BACAC,iBAAA,kCACAM,WAAA,CACAvF,MAAA,eACAwF,KAAA,YACAC,UAAA,yBACAC,QAAA,eACAC,aAAA,mBACAC,cAAA,oBAGAC,WAAA,CACAC,KAAA,iBACAC,KAAA,CACAC,aAAA,yCACAC,cAAA,iBACAjG,MAAA,mCACAkG,YAAA,eACAC,SAAA,uBACAC,kBAAA,wBACAnoC,QAAA,uBACA6nC,KAAA,iBACAO,wBAAA,6DACAC,MAAA,+BACAC,QAAA,sBACAC,aAAA,0CACAC,aAAA,OACAC,iBAAA,iBACAC,cAAA,eACAC,cAAA,UACAC,mBAAA,yDACAC,cAAA,GACAC,mBAAA,gDACAC,eAAA,iBACAC,oBAAA,oGACAC,cAAA,oBACAC,mBAAA,mDACAC,SAAA,cACAC,WAAA,iBACAC,cAAA,SACAC,4BAAA,uBACAC,mBAAA,CACAC,IAAA,IACAC,GAAA,KAEA/pB,mBAAA,CACAjD,IAAA,oCACAitB,IAAA,oCACAC,IAAA,eACAC,KAAA,oBAGAC,OAAA,CACA9H,MAAA,UACA+H,SAAA,gBACAC,YAAA,kBACAC,YAAA,YAGA/sB,SAAA,CACA6qB,KAAA,CACA/F,MAAA,SACAkI,aAAA,SACAC,QAAA,eACAC,YAAA,OACAC,WAAA,UACAC,2BAAA,8PACAC,sBAAA,oBACAC,cAAA,oBACAC,QAAA,mBACAC,kBAAA,8DACAC,cAAA,SACAC,KAAA,kBACAC,MAAA,mBACA7V,GAAA,uBACA8V,SAAA,mBACAC,YAAA,0BACAxC,QAAA,qBACAyC,oBAAA,sBACAC,OAAA,gCACAC,QAAA,iCACAC,UAAA,wCACAC,cAAA,SACAC,gBAAA,2FACAC,gBAAA,wCACAC,aAAA,0DACAC,UAAA,wDACAC,WAAA,gEACAC,WAAA,8DACAC,aAAA,kEACAC,UAAA,qEACAC,YAAA,2DACAC,SAAA,gEACAC,kBAAA,4BACAC,SAAA,oFACAC,iBAAA,qEACAC,SAAA,8FACAC,aAAA,8BACAC,QAAA,UACAC,aAAA,UACAC,kBAAA,4BACAC,iBAAA,mBACAC,YAAA,gBAEAlJ,QAAA,CACAtB,MAAA,kBACAhC,aAAA,oBACAyM,gBAAA,kCAGAtJ,QAAA,CACA4E,KAAA,CACAgD,YAAA,kBACA2B,cAAA,qBACAC,aAAA,qBACAC,SAAA,WACAC,iBAAA,6DACAC,iBAAA,0CACAC,OAAA,mBACAC,eAAA,kBACAC,WAAA,6BACAC,UAAA,CACArwB,KAAA,wBACAE,OAAA,uBACAD,KAAA,mBACAqwB,YAAA,sBAGAC,KAAA,CACAC,eAAA,2FAGAvI,KAAA,CACAwI,MAAA,aACAC,gBAAA,qBACAC,OAAA,WACAC,QAAA,WACAC,aAAA,iBACAC,UAAA,kBACAlD,QAAA,SACAmD,aAAA,eACAC,UAAA,gBACAC,WAAA,aACAC,IAAA,MACAC,cAAA,WACApM,qBAAA,SACAqM,QAAA,WACAC,cAAA,iBACAC,cAAA,gBACApG,KAAA,CACA/F,MAAA,OACAoM,MAAA,gBACAC,iBAAA,iCACAC,uBAAA,0CACAtE,YAAA,iBACAuE,YAAA,qBACAC,gBAAA,wBACAC,MAAA,CACAC,uBAAA,mEACAC,mBAAA,0CAIA5L,IAAA,CACA6L,YAAA,qCACAC,0BAAA,wIACAC,iBAAA,oBACAC,uBAAA,6BACAC,iBAAA,gCACAC,uBAAA,8BACAC,uBAAA,eACAC,6BAAA,sBACAC,sCAAA,yCACAC,UAAA,QACAC,sBAAA,kBACAC,QAAA,UACAC,OAAA,aACAjC,gBAAA,+BACAkC,iBAAA,gCACAjB,gBAAA,wBACAkB,mBAAA,mBACAC,wBAAA,0FACAvH,kBAAA,eACAwH,YAAA,cACAC,gBAAA,kBACAC,uBAAA,uBACAC,mBAAA,uBACAhI,KAAA,CACAiI,oBAAA,sBAEAlG,OAAA,CACA9H,MAAA,WACAiO,UAAA,gBACAC,gBAAA,mBACAC,QAAA,yBACAC,cAAA,iCACAC,WAAA,yCACAC,YAAA,+CACAC,cAAA,gBACAC,YAAA,yBACA3O,UAAA,gBACAC,gBAAA,gCACA2O,WAAA,mCACAC,aAAA,kBAEAC,SAAA,CACA3O,MAAA,YAEA4O,MAAA,CACA5O,MAAA,WAEA6O,eAAA,CACA7O,MAAA,2BACA8O,QAAA,0BACAC,KAAA,yCACAC,aAAA,0BACAC,SAAA,0BACAC,YAAA,qCACAzC,MAAA,qCACA0C,cAAA,oBAEAC,WAAA,CACApP,MAAA,wBAEAqP,qBAAA,CACArP,MAAA,mCACA8O,QAAA,yBACAC,KAAA,wCACAC,aAAA,kBACAM,KAAA,yBACAC,QAAA,oCACA9C,MAAA,sCAGA+C,MAAA,CACAxP,MAAA,yCACAyP,iBAAA,kGACAC,iBAAA,oCACAC,eAAA,0CACAC,eAAA,4CACAC,KAAA,yBACAC,UAAA,yBACAC,UAAA,mCACAC,SAAA,WACAC,cAAA,WACAC,YAAA,8BACA7R,oBAAA,2BACA8R,sBAAA,sBACAC,eAAA,kBACAC,oBAAA,yBACAC,aAAA,2BACAC,kBAAA,mBACAC,YAAA,eACAC,iBAAA,qBACAC,qBAAA,SACAC,mBAAA,kEACAC,kBAAA,uBACAC,YAAA,CACA7Q,MAAA,eACAiC,QAAA,sHACA6O,YAAA,SACAC,aAAA,wCAEAC,OAAA,CACAC,eAAA,uCACAC,gBAAA,oBACAnzC,KAAA,uBACAxoB,OAAA,2BACA47D,KAAA,0BAEAC,OAAA,CACA78C,OAAA,mBACAK,QAAA,oBACAy8C,OAAA,kBACAC,QAAA,sBACAC,QAAA,mBACAC,KAAA,0BACAh9C,EAAA,YACAC,EAAA,WACAC,EAAA,YAEAqJ,KAAA,CACA0zC,KAAA,kGAGAC,KAAA,CACA1R,MAAA,iDACA2R,SAAA,eACAC,aAAA,gBACAC,kBAAA,sEACAC,qBAAA,4FACAlC,eAAA,uEAEA5O,QAAA,CACAhB,MAAA,YACA+R,QAAA,QACAC,QAAA,qBACAC,gBAAA,kBACAC,MAAA,sBACAC,aAAA,kBACAC,YAAA,iBACAC,aAAA,uDACAC,WAAA,uBACAC,cAAA,oCACAC,SAAA,2BACAC,cAAA,sBACAC,oBAAA,qCACAC,OAAA,SACAE,mBAAA,iEACAC,uBAAA,oFACAE,4BAAA,oHACAC,2BAAA,oJACAC,sBAAA,oJACAE,sBAAA,wKACAC,oBAAA,0BACAC,0BAAA,iBACA9J,UAAA,qCACA+J,kBAAA,WACAC,mCAAA,4BACAC,mBAAA,kCACAC,qBAAA,qBACAC,0BAAA,yBACAC,wBAAA,uBACAC,kBAAA,sBACAC,iBAAA,4BACAC,uBAAA,CACA/T,MAAA,mBACAgU,YAAA,mDACAC,iBAAA,4FACAC,cAAA,6BAEAC,IAAA,CACAnU,MAAA,gBACAoU,mBAAA,oLACAC,uBAAA,sHACAC,4BAAA,6FACAC,WAAA,2HACAC,kBAAA,uHACAC,uBAAA,6HACAC,oBAAA,8BACAC,eAAA,eACAC,qBAAA,yBACAC,oBAAA,6EACAC,eAAA,uBACAC,qBAAA,wBACAC,oBAAA,0JACAC,aAAA,0LACAC,iBAAA,6KACAC,eAAA,kPACA3H,OAAA,aACA4H,YAAA,SACAC,aAAA,aACAC,kBAAA,sCACAC,iBAAA,aACAC,sBAAA,yBACAC,cAAA,YACAC,iBAAA,gBACAC,0BAAA,sWACAC,4BAAA,sOACAC,4BAAA,oMACAC,gBAAA,4BACAC,iBAAA,yBACAC,qBAAA,2BACAC,aAAA,4FACAC,WAAA,UACAC,mBAAA,sBAEAC,eAAA,CACApW,MAAA,aACAyR,KAAA,oEAEA4E,sBAAA,CACArW,MAAA,2BACAyR,KAAA,wLAEA6E,oBAAA,CACAtW,MAAA,6BAEAuW,YAAA,CACAvW,MAAA,yBACAwW,QAAA,wBACAE,UAAA,gCACAtZ,WAAA,wCACAuZ,WAAA,4BACAG,aAAA,CACA9W,MAAA,4BACAyR,KAAA,wBACAsF,UAAA,yBAGAI,SAAA,CACAC,aAAA,oCACAC,UAAA,WACAtS,UAAA,QACAuS,gBAAA,4BACAC,qBAAA,yMACAQ,WAAA,sDACAC,MAAA,uBACAC,UAAA,6DACAC,aAAA,6DACAC,WAAA,kEACAC,WAAA,oDACAC,WAAA,mDACAC,WAAA,gDACAC,WAAA,+CACAC,WAAA,4DACAC,WAAA,yCACAC,WAAA,2CACAC,WAAA,gDACAC,YAAA,6CACAC,YAAA,6EACAC,YAAA,0EACAC,YAAA,kDACAC,YAAA,wCACAC,YAAA,qDACAC,YAAA,gDACAC,YAAA,8CACAC,YAAA,oDACAC,YAAA,0BACAC,WAAA,6BACAC,gBAAA,kIACAE,qBAAA,kCACAC,iCAAA,oPACAC,0BAAA,wLACAC,kBAAA,+BACAC,uBAAA,gSACAC,oBAAA,8DACAC,QAAA,8BACAC,aAAA,0MACAC,aAAA,6DACAja,MAAA,qBAEA0a,UAAA,oGACAC,QAAA,CACAC,KAAA,OACAC,OAAA,SACA1/B,QAAA,YAGA2/B,SAAA,CACA9a,MAAA,WACA+a,UAAA,mBACArc,KAAA,KACAC,GAAA,IACAkc,OAAA,UACAI,YAAA,UACA9/B,QAAA,WACA+/B,aAAA,WACAlf,SAAA,UACAmf,gBAAA,wBACAG,uBAAA,mEACA1M,MAAA,CACA5O,MAAA,aAGAyM,MAAA,CACAgP,YAAA,SACAC,cAAA,SACAC,qBAAA,6EACAE,iBAAA,qCACAC,eAAA,iDACAC,eAAA,sBACAC,gBAAA,uBACAC,4BAAA,oDACAC,eAAA,sBACAC,2BAAA,qDACAC,UAAA,0BACAC,UAAA,2BACAC,aAAA,wCACAC,iBAAA,yBACAC,cAAA,uBACAC,gBAAA,4BACAC,uBAAA,iCACAC,mBAAA,6CACAC,qBAAA,sBACAC,0BAAA,0BACAC,+BAAA,wFACAC,wCAAA,sHACAC,gCAAA,0GACAC,aAAA,mBACAC,qBAAA,wCACAC,yBAAA,qDACAC,0BAAA,8BACAC,2BAAA,sCACAC,oBAAA,yCACAC,uBAAA,mDACAC,oBAAA,uDACAC,eAAA,uCACAC,iBAAA,0GACAC,mBAAA,gJACAC,wBAAA,+CACAC,0BAAA,yEACAC,uBAAA,mDACAC,sBAAA,mCACAC,oBAAA,+BACAC,YAAA,wCACAC,oBAAA,2BACAC,kBAAA,mBACAC,sBAAA,qDACAC,iBAAA,6BACAC,gBAAA,sBACAC,gBAAA,mCACAC,kBAAA,sBACAC,qBAAA,yDACAC,gBAAA,6EACAC,gBAAA,6CACAC,eAAA,6CACAE,iBAAA,yEACAC,2BAAA,0IACAC,4BAAA,0IACAC,4BAAA,yNACAC,iBAAA,0HACApiC,sBAAA,mNACAqiC,mBAAA,uBACAC,mBAAA,qCACAC,+BAAA,uBACAC,0BAAA,iPACAC,wBAAA,uKACAC,eAAA,iHACAC,mBAAA,kFACAC,cAAA,6BACAC,oBAAA,uDACAC,oBAAA,wCACAC,kBAAA,kCACAC,gBAAA,4CACAC,yBAAA,6HACAC,iCAAA,+JACAC,wBAAA,0BACAC,sBAAA,uCACAC,oBAAA,mDACAC,oCAAA,mDACAE,kCAAA,kEACAC,iBAAA,iCACAC,mBAAA,mCACAC,2BAAA,qEACAC,kBAAA,uEACAC,+BAAA,8CACAC,kBAAA,qCACAC,iBAAA,+BACAC,0BAAA,yEACAC,uBAAA,oEACAC,mBAAA,4DACAC,iBAAA,6IACAC,yBAAA,0FACAC,wBAAA,6CACAC,yBAAA,mGACAC,oBAAA,sIAEAjW,KAAA,CACAqQ,YAAA,eACAuG,mBAAA,gCACAxD,kBAAA,sBACAyD,cAAA,mCACAC,uBAAA,uBACAC,oBAAA,+BACAC,oBAAA,iBACAC,qCAAA,8FACAG,gBAAA,+BACAC,gCAAA,qFACAC,yBAAA,gHACAC,iBAAA,mCAEAC,QAAA,CACAnH,YAAA,kBACAoH,oBAAA,gBACAC,6BAAA,0EACAC,wBAAA,sBACAC,cAAA,8UACAlI,SAAA,2QACAsI,eAAA,yHACAC,iBAAA,4GACAC,0BAAA,uBACAC,oBAAA,qMACAC,aAAA,yKACAC,eAAA,uFACAC,WAAA,wHACAC,iBAAA,+DACAC,gBAAA,gPACAC,kBAAA,4GACAC,0BAAA,mLACAC,kBAAA,kEACAC,wBAAA,wBACAC,OAAA,8CACAC,kBAAA,wHACApC,oBAAA,2BACAC,kBAAA,uDAEAqC,SAAA,CACA3I,YAAA,4CACA4I,qBAAA,2QAEA5S,KAAA,CACAzR,MAAA,eACAskB,KAAA,CACAC,QAAA,qBACA1U,KAAA,ihBACAG,SAAA,saACAxC,OAAA,sYAEAgC,MAAA,CACA+U,QAAA,SACAhvE,OAAA,4BACAivE,WAAA,geACAxT,OAAA,wBACAyT,WAAA,ojBAEAC,SAAA,CACAH,QAAA,YACAC,WAAA,yJACA7oB,OAAA,SACAgpB,WAAA,oPACAC,eAAA,sBACAC,mBAAA,ihBACAhf,WAAA,aACAif,eAAA,2SACAC,uBAAA,goBAEAI,IAAA,CACAC,kBAAA,iIACAC,aAAA,yFACAC,cAAA,iRACAC,uBAAA,iWACAC,qBAAA,uSACAC,iCAAA,+RACAb,eAAA,mOACAc,iBAAA,8FACAC,mBAAA,yIACAC,cAAA,wMACAC,2BAAA,iOACAC,0BAAA,8QACAC,iBAAA,gHACAC,wBAAA,uGACAC,sBAAA,+EACAC,+BAAA,iFACAC,4BAAA,6EACAC,eAAA,gDACAC,wBAAA,mWACAC,2BAAA,yRACAC,cAAA,2GACAC,YAAA,wBACAC,qBAAA,+DACAC,eAAA,0JACAC,sBAAA,6EACAC,eAAA,0MACAC,kBAAA,sLACAE,YAAA,oIACAC,aAAA,wGACAC,mBAAA,yKACAC,gBAAA,gLACAC,kBAAA,mFACAC,wBAAA,iRACAC,8BAAA,yHACAC,8BAAA,wGACAC,iBAAA,iHACAvE,cAAA,qLACAwE,kBAAA,gKACAC,uBAAA,uDACAC,qBAAA,iTACAC,UAAA,kFACAC,cAAA,oLAGA7b,IAAA,CACAxQ,OAAA,CACAssB,SAAA,qBACAC,cAAA,oCACAC,kBAAA,oBACAC,uBAAA,gEAEAlnB,KAAA,CACAd,MAAA,qDACAiC,QAAA,gMACAgmB,cAAA,oGACAC,WAAA,0BAEApN,SAAA,CACA9a,MAAA,sDACAmoB,YAAA,mBACArZ,QAAA,iCACA+L,OAAA,YACAwN,KAAA,QACA9yE,OAAA,+BACA4lC,QAAA,6BACAotC,KAAA,CACA1Y,KAAA,OACAG,SAAA,OACAz6D,OAAA,+CACAk8D,KAAA,qOACA+W,gBAAA,iKAEApd,KAAA,CACAqd,8BAAA,2DACAC,oBAAA,8DACAC,6BAAA,2DACAC,mBAAA,+DAEAnc,MAAA,CACAoc,gBAAA,sBAGAC,IAAA,CACAC,oBAAA,cACAC,YAAA,qBACAC,mBAAA,eACAC,qBAAA,4CACAC,aAAA,UACAC,UAAA,kGACAC,YAAA,6BACAE,aAAA,gDACAC,eAAA,qDACAC,kBAAA,YACAC,eAAA,WACAC,iBAAA,iCACAC,qBAAA,YACA9O,SAAA,CACA9a,MAAA,YACAgU,YAAA,2LACA6V,aAAA,mCACAC,kBAAA,kDACAC,aAAA,UACAC,kBAAA,0CACAC,cAAA,2BACAC,mBAAA,+FACAC,WAAA,wCACAC,gBAAA,sJACAC,mBAAA,+BACAC,wBAAA,gOACAC,iBAAA,oCACAC,sBAAA,2LACAG,cAAA,gCACAC,eAAA,eACAC,4BAAA,wCACAC,6BAAA,wBACAC,yBAAA,oBACAC,wBAAA,mBACAC,6BAAA,2DACAC,0BAAA,mBACAC,+BAAA,2CACAC,yBAAA,QACAC,0BAAA,YACAC,+BAAA,sBACAC,yBAAA,UACAC,4BAAA,eACAC,2BAAA,cACAC,6BAAA,UACAC,6BAAA,sBAOArwB,EAAAl4B,aAAA,QAAA,CACAm4B,OAAA,CACAC,SAAA,SACAC,YAAA,eACAC,UAAA,kBACAnmD,OAAA,mBACAomD,OAAA,MACAC,MAAA,OACAC,OAAA,KACAC,QAAA,KACAC,OAAA,MACAC,SAAA,YACAC,eAAA,gBACAC,qBAAA,YACAC,SAAA,UACAC,aAAA,cACAC,iBAAA,eACAC,SAAA,QACAC,gBAAA,eACAC,kBAAA,4BACAC,SAAA,QACAC,SAAA,WACAE,WAAA,WACAC,UAAA,QACAC,UAAA,QACAC,UAAA,YACAC,WAAA,YACAC,gBAAA,kBACAC,UAAA,QACAC,SAAA,WACAC,WAAA,SACAC,QAAA,YACAC,WAAA,SACAC,YAAA,iBACAE,UAAA,WACAC,aAAA,WACAE,eAAA,sBACAC,YAAA,SACAC,cAAA,cACAC,qBAAA,oBACAC,aAAA,aACAC,+BAAA,mCACAC,WAAA,WACAE,KAAA,QACAC,oBAAA,+BACAC,iBAAA,kBACAC,QAAA,iBACAE,UAAA,YACAC,KAAA,MACAC,GAAA,MACAC,KAAA,WACAC,SAAA,OACAC,mBAAA,sBACA9L,GAAA,KACA+L,aAAA,mBACAC,kBAAA,aACAC,mBAAA,WACAC,wBAAA,UACAC,kBAAA,SACAC,IAAA,aACAC,OAAA,cACAC,QAAA,gBACAC,aAAA,cACAC,cAAA,sBACAC,eAAA,8CACAC,YAAA,yBACAC,sBAAA,SACAC,qBAAA,UACAC,UAAA,YACAC,gBAAA,+BACAC,cAAA,CACAC,MAAA,QACAC,iBAAA,kBACAC,kBAAA,mBACAC,kBAAA,oBACAC,oBAAA,oBAGAK,OAAA,CACAC,oBAAA,kBACAC,oBAAA,WACAC,mBAAA,iBAEAC,KAAA,CACAC,KAAA,SACAC,IAAA,WACA7lB,SAAA,SACA6wC,WAAA,WACA/qB,QAAA,gBACAE,SAAA,eACAC,QAAA,UACAC,aAAA,oBAEAC,MAAA,CACArB,MAAA,OACAsB,QAAA,+CACAG,KAAA,YACAE,WAAA,iBACAC,MAAA,SACAgqB,YAAA,eACAC,oBAAA,2EACAC,0BAAA,+CACAhqB,aAAA,qBAEAhB,KAAA,CACAd,MAAA,SACAgC,QAAA,mCACAC,QAAA,+DACA+pB,aAAA,WACA9pB,aAAA,gBACAC,UAAA,OACAC,SAAA,OACAN,aAAA,oBACAO,0BAAA,mFACAC,mBAAA,2BACAC,iBAAA,qMAEArB,SAAA,CACAlB,MAAA,eACA6C,iBAAA,UACAC,KAAA,0BACAE,uBAAA,kCACAG,kBAAA,4BACAC,uBAAA,+BACAI,eAAA,mCACAE,kBAAA,2BACAC,iBAAA,gBACAC,mBAAA,iCACAG,wBAAA,kBACAa,YAAA,cACAC,iBAAA,+DACAC,iBAAA,gBACAC,UAAA,gCACAC,YAAA,iCACAC,iBAAA,oBACAM,WAAA,CACAvF,MAAA,oBACAwF,KAAA,QACAC,UAAA,uBACAC,QAAA,UACAC,aAAA,kBACAC,cAAA,0BAGAC,WAAA,CACAC,KAAA,oBACAC,KAAA,CACAC,aAAA,uCACAC,cAAA,eACAjG,MAAA,iCACAkG,YAAA,8BACAC,SAAA,qBACAC,kBAAA,wBACAnoC,QAAA,gBACA6nC,KAAA,gBACAO,wBAAA,gEACAC,MAAA,oCACAC,QAAA,wBACAC,aAAA,0CACAC,aAAA,WACAC,iBAAA,sBACAC,cAAA,eACAC,cAAA,eACAC,mBAAA,2CACAC,cAAA,YACAC,mBAAA,4CACAC,eAAA,oBACAC,oBAAA,2EACAC,cAAA,2BACAC,mBAAA,2CACAC,SAAA,cACAC,WAAA,kBACAC,cAAA,YACAC,4BAAA,oCACAC,mBAAA,CACAC,IAAA,KACAC,GAAA,MAEA/pB,mBAAA,CACAjD,IAAA,uBACAitB,IAAA,oCACAC,IAAA,cACAC,KAAA,eAGAC,OAAA,CACA9H,MAAA,UACA+H,SAAA,YACAC,YAAA,oBACAC,YAAA,YAGA/sB,SAAA,CACA+wC,OAAA,CACAjsB,MAAA,WACA+rB,WAAA,mBACAG,cAAA,0BAEAnmB,KAAA,CACA/F,MAAA,SACAkI,aAAA,SACAC,QAAA,cACAC,YAAA,UACAI,cAAA,cACAC,QAAA,WACAC,kBAAA,+CACAC,cAAA,OACAC,KAAA,kBACAC,MAAA,kBACA7V,GAAA,sBACA8V,SAAA,kBACAC,YAAA,kBACAxC,QAAA,8BACAyC,oBAAA,mBACAC,OAAA,UACAC,QAAA,gCACAK,aAAA,iDACAC,UAAA,oDACAC,WAAA,oFACAC,WAAA,wEACAI,SAAA,uDACAC,kBAAA,qBACAG,SAAA,oFAGA/I,QAAA,CACA4E,KAAA,CACAgD,YAAA,kBACA2B,cAAA,iBACAC,aAAA,UACAO,UAAA,CACArwB,KAAA,iBACAE,OAAA,eACAowB,YAAA,kBAGAC,KAAA,CACAC,eAAA,sFAGAvI,KAAA,CACAwI,MAAA,SACAC,gBAAA,mBACAC,OAAA,UACAQ,cAAA,SACAjG,KAAA,CACA/F,MAAA,QACAoM,MAAA,qBACAC,iBAAA,sBACAE,YAAA,mBACAC,gBAAA,sBACAC,MAAA,CACAC,uBAAA,wEACAC,mBAAA,yCAIA5L,IAAA,CACA6L,YAAA,mCACAC,0BAAA,kHACAC,iBAAA,cACAC,uBAAA,0BACAC,iBAAA,kCACAC,uBAAA,gCACAC,uBAAA,aACAC,6BAAA,2BACAC,sCAAA,8BACAC,UAAA,WACAC,sBAAA,6BACAC,QAAA,WACAC,OAAA,aACAjC,gBAAA,iCACAkC,iBAAA,iCACAjB,gBAAA,sBACAkB,mBAAA,8BACAC,wBAAA,wGACAvH,kBAAA,wBACAwH,YAAA,eACAC,gBAAA,mBACAC,uBAAA,sBACAC,mBAAA,2BACAhI,KAAA,CACAiI,oBAAA,wBAEAlG,OAAA,CACA9H,MAAA,WACAiO,UAAA,gBACAE,QAAA,kBACAE,WAAA,4CACAC,YAAA,8CACAC,cAAA,iBACAC,YAAA,6BACA3O,UAAA,YACAC,gBAAA,gCACA2O,WAAA,oDACAC,aAAA,uCAEAE,MAAA,CACA5O,MAAA,UAEA6O,eAAA,CACA7O,MAAA,0BACA8O,QAAA,0BACAC,KAAA,sCACAC,aAAA,8BACAC,SAAA,0BACAC,YAAA,uCACAzC,MAAA,mCACA0C,cAAA,gBAEAE,qBAAA,CACArP,MAAA,oCACA8O,QAAA,0BACAC,KAAA,sCACAC,aAAA,8BACAM,KAAA,0BACAC,QAAA,uCACA9C,MAAA,qCAGA+C,MAAA,CACAxP,MAAA,2CACA6P,KAAA,kBACAC,UAAA,sCACAC,UAAA,0BACAC,SAAA,aACAC,cAAA,6CACA5R,oBAAA,qBACA+R,eAAA,oBACAE,aAAA,wBAEAtP,QAAA,CACAhB,MAAA,gBACA+R,QAAA,QACAC,QAAA,sBACAC,gBAAA,gBACAC,MAAA,mBACAC,aAAA,YACAC,YAAA,WACAC,aAAA,sDACAC,WAAA,4BACAE,SAAA,+BACAC,cAAA,wBACA0Z,kBAAA,wBACAxZ,OAAA,iBACAE,mBAAA,+DACAC,uBAAA,4EACAE,4BAAA,4GACAC,2BAAA,sLACAI,oBAAA,uBACAC,0BAAA,gBACA9J,UAAA,sCACA+J,kBAAA,YACA6Y,uBAAA,4BACA1Y,qBAAA,yBACAC,0BAAA,4BACAC,wBAAA,2BACAyY,uBAAA,2BACAxY,kBAAA,4BACAC,iBAAA,8BACAwY,WAAA,kFACAnY,IAAA,CACAnU,MAAA,cACAusB,cAAA,wBACAC,cAAA,kBACA7X,eAAA,uCACAE,oBAAA,wFACAC,eAAA,yBACAE,oBAAA,gMACAC,aAAA,iNACAC,iBAAA,6MACAC,eAAA,kQACA3H,OAAA,aACA4H,YAAA,SACAC,aAAA,WACAC,kBAAA,8BACAC,iBAAA,WACAC,sBAAA,0BACAC,cAAA,eACAC,iBAAA,gBACAC,0BAAA,iXACAC,4BAAA,iPACAC,4BAAA,wNACAE,iBAAA,2BACAC,qBAAA,0CACAC,aAAA,oFACAC,WAAA,eACAC,mBAAA,iCAEAC,eAAA,CACApW,MAAA,yBACAyR,KAAA,gEAEAiJ,UAAA,iGACAC,QAAA,CACAC,KAAA,QACAC,OAAA,SACA1/B,QAAA,eAGA2/B,SAAA,CACA9a,MAAA,aACA+a,UAAA,kBACArc,KAAA,MACAC,GAAA,MACAkc,OAAA,SACAI,YAAA,SACA9/B,QAAA,YACA+/B,aAAA,wBACAlf,SAAA,YACAmf,gBAAA,sBACAG,uBAAA,8EACA1M,MAAA,CACA5O,MAAA,gBAGAyM,MAAA,CACAgP,YAAA,QACAC,cAAA,gBACAC,qBAAA,8DACAI,eAAA,0BACAC,gBAAA,qDACAC,4BAAA,iCACAC,eAAA,iCACAC,2BAAA,oDACAG,aAAA,2CACAC,iBAAA,wBACAC,cAAA,0BACAE,uBAAA,gCACAC,mBAAA,8BACAC,qBAAA,kCACAC,0BAAA,8BACAC,+BAAA,yFACAC,wCAAA,4IACAC,gCAAA,gFACAC,aAAA,uBACAC,qBAAA,2BACAC,yBAAA,wCACAC,0BAAA,8CACAC,2BAAA,6CACAC,oBAAA,4BACAC,uBAAA,qCACAC,oBAAA,2BACAC,eAAA,8BACAC,iBAAA,kFACAC,mBAAA,qHACAC,wBAAA,4CACAC,0BAAA,oDACAC,uBAAA,mCACAC,sBAAA,8BACAC,oBAAA,yBACAC,YAAA,0BACAC,oBAAA,uBACAC,kBAAA,iBACAC,sBAAA,mDACAC,iBAAA,wBACAC,gBAAA,sBACAC,gBAAA,+BACAC,kBAAA,qBACAC,qBAAA,sCACAC,gBAAA,oEACAC,gBAAA,sCACAC,eAAA,+BACAK,4BAAA,uMACAC,iBAAA,sFACApiC,sBAAA,uIACAuiC,+BAAA,wBACAC,0BAAA,iOACAC,wBAAA,gKACAE,mBAAA,iEACAM,yBAAA,oIACAC,iCAAA,uJACAC,wBAAA,oBACAC,sBAAA,8BACAC,oBAAA,wCACAC,oCAAA,+DACAE,kCAAA,gFACAW,iBAAA,6HACAC,yBAAA,0FAEA9V,KAAA,CACAqQ,YAAA,aACAuG,mBAAA,gCACAxD,kBAAA,sBACAyD,cAAA,6CACAC,uBAAA,iBACAC,oBAAA,6CACAC,oBAAA,kBACAC,qCAAA,iHAEAO,QAAA,CACAnH,YAAA,qBACAoH,oBAAA,sBACAE,wBAAA,sBACAC,cAAA,6ZACAlI,SAAA,6QACAsI,eAAA,iLACAE,0BAAA,YACAC,oBAAA,6PACAC,aAAA,yKACAC,eAAA,uFACAE,iBAAA,2EACAC,gBAAA,wPACAC,kBAAA,sGACAC,0BAAA,+LACAC,kBAAA,kEACAC,wBAAA,8BACAyI,QAAA,sEAEArI,SAAA,CACA3I,YAAA,6BACA4I,qBAAA,kRAEA5S,KAAA,CACAzR,MAAA,cACAskB,KAAA,CACAC,QAAA,OACA1U,KAAA,qfACAG,SAAA,2aACAxC,OAAA,4VAEAkX,SAAA,CACAH,QAAA,WACAC,WAAA,sJACA7oB,OAAA,SACAgpB,WAAA,uPACAC,eAAA,iBACAC,mBAAA,4gBACAhf,WAAA,aACAif,eAAA,wRACAC,uBAAA,8jBAEAI,IAAA,CACAC,kBAAA,0GACAC,aAAA,6EACAC,cAAA,sPACAC,uBAAA,gWACAC,qBAAA,wOACAC,iCAAA,yOACAb,eAAA,4MACAe,mBAAA,oIACAC,cAAA,2NACAC,2BAAA,gNACAC,0BAAA,0QACAC,iBAAA,sGACAC,wBAAA,yFACAC,sBAAA,gFACAG,eAAA,6CACAC,wBAAA,kWACAC,2BAAA,uQACAE,YAAA,wCACAC,qBAAA,mFACAC,eAAA,qJACAC,sBAAA,qDACAC,eAAA,sLACAC,kBAAA,2LACAG,aAAA,0GACAC,mBAAA,6IACAC,gBAAA,mJACAC,kBAAA,qDACAC,wBAAA,iQACAC,8BAAA,2HACAC,8BAAA,wFACAC,iBAAA,uGACAvE,cAAA,4LACAwE,kBAAA,oLACAC,uBAAA,gDACAC,qBAAA,qTACAC,UAAA,mFACAC,cAAA,gLCtpMAl0E,QAAA0Q,OAAA,aAAA,CAAA,QAAA,iBAAA,aAAA,yBAAA,QAAA,gBAAA,sBACA,YACA,iBAAA,gBAAA,kBAAA,mBAAA,sBAAA,oBAEA,kBAAA,2BAAA,2BAAA,4BAGAmsB,OAAA,CAAA,iBAAA,qBAAA,SAAA2qB,EAAAwxB,GAEAxxB,EAEA/2C,MAAA,MAAA,CACA2lB,IAAA,OACA6iD,UAAA,EACA7uE,YAAA,0BACA2vB,WAAA,YAGAtpB,MAAA,WAAA,CACA2lB,IAAA,mCACAd,MAAA,CACAmyB,YAAA,CACAr9C,YAAA,0BACA2vB,WAAA,iBAKAtpB,MAAA,MAAA,CACA2lB,IAAA,MACA6iD,UAAA,EACA7uE,YAAA,0BACA2vB,WAAA,YAGAtpB,MAAA,eAAA,CACA2oB,OAAA,EACAhD,IAAA,kGACAd,MAAA,CACAmyB,YAAA,CACAr9C,YAAA,8BACA2vB,WAAA,sBAMAi/C,EAAAE,UAAA,gBAGAn/C,WAAA,UAAA,CAAA,SAAA,SAAA,aAAA,gBAAA,UAAA,SAAA,aAAA,SAAAn6B,EAAA+K,EAAAoG,EAAArQ,EAAAK,EAAAE,EAAAC,GAIAtB,EAAAoR,QAAAhR,QAAA4I,KAAA1H,EAAA8P,SAEApR,EAAAu5E,eAAA,SAAAtuE,GACAA,EAAAqxB,iBACAj7B,EAAA26B,aAGAh8B,EAAA2Q,SAAA,WACA5F,EAAA+D,GAAA,aAGA9O,EAAAw5E,eAAA,SAAAC,GACAtoE,EAAA4C,IAAA0lE,GACAz5E,EAAA05E,qBACAp4E,EAAAuC,KAAAqH,OAAAlO,EAAA8L,UAAA9I,EAAAoR,QAAA,CAAAjT,GAAAs7E,KAKAz5E,EAAA25E,mBAAA,SAAAtvE,GACAlJ,EAAAoJ,QAAArF,KAAAmF,EAAA,CACAG,YAAA,qCACApB,MAAApJ,EACAyK,YAAA,EACAC,UAAA,SAAAH,GACAvK,EAAA45E,eAAArvE,MAKAvK,EAAA05E,mBAAA,WACA15E,EAAA45E,iBACA55E,EAAA45E,eAAAx1E,OACApE,EAAA45E,eAAA,UAKAz/C,WAAA,aAAA,CAAA,SAAA,aAAA,SAAA,aAAA,OAAA,aAAA,SAAAn6B,EAAAgR,EAAAjG,EAAAoG,EAAA0oE,EAAAluE,GAGA3L,EAAAO,SAAA,EACAP,EAAA85E,aAAA,CACAj7E,OAAA,+CACAqnC,OAAA,IACAgS,QAAA,YACAvuC,KAAA,iBACAowE,oBAAAt0E,EACAu0E,aAAA,kEACAC,WAAA,sDAEAj6E,EAAAk6E,eAAA,CACA31C,UAAA9+B,EACA00E,gBAAA,EACAC,MAAA,CACA,CACAl3E,MAAA,6CAEA,CACAA,MAAA,+CACAw3C,SAAA,gCAEA,CACAx3C,MAAA,8CACAw3C,SAAA,wBAEA,CACAx3C,MAAA,gDACAw3C,SAAA,2BAEA,CACAx3C,MAAA,gDACAw3C,SAAA,kCAGAlqC,MAAA,CACA7D,QAAA,EACA4hB,KAAA,YACA8rD,QAAA,UACAC,UAAA,QACA3pD,WAAAlrB,IAGAzF,EAAAk6E,eAAA1pE,MAAA7B,KAAA3O,EAAAk6E,eAAAE,MAAA,GACAp6E,EAAAu6E,gBAAAvpE,EAAAwpE,SAAAzvE,EAAA0rB,KAAA,eAAAr2B,QAAA0S,MAAA,GAAA9S,EAAA85E,aAAA,CACAW,MAAA,EACAT,aAAAhpE,EAAAwpE,SAAA,qDACAP,WAAAjpE,EAAAwpE,SAAA,uCAGAx6E,EAAAmE,MAAA,SAAA8G,EAAA4F,GACA7Q,EAAAO,UAEAP,EAAA2gB,OAAA,GACA9P,EAAA1F,aAAA0F,EAAA1F,YAAAme,UACAtpB,EAAA2gB,OAAA/I,KAAA/G,EAAA1F,YAAAme,SAEAzY,EAAA1F,aAAA0F,EAAA1F,YAAAwV,SACA3gB,EAAA2gB,OAAA9W,QAAAgH,EAAA1F,YAAAwV,QAEA9P,EAAA1F,aAAA0F,EAAA1F,YAAAmO,SACAtZ,EAAA2gB,OAAA9S,WAAA,GAEAgD,EAAA1F,aAAA0F,EAAA1F,YAAAsJ,OACAzU,EAAA2gB,OAAAlM,KAAA5D,EAAA1F,YAAAsJ,MAGA9I,EAAAwD,MACA9L,MAAA,SAAA+K,GACA,OAAA+C,EAAA,+CAAA,CAAA/C,SAAAA,EAAAzE,UAEAtG,MAAA,SAAAq3E,GACA16E,EAAAk6E,eAAA1pE,MAAA+d,KAAAmsD,EACA16E,EAAAO,SAAA,EAGAP,EAAA26E,iCAIA36E,EAAAW,IAAA,mBAAAX,EAAAmE,OAGAnE,EAAA26E,0BAAA,WACA,IAAA36E,EAAAO,QAAA,CAGA,IAEAgkC,EAFA/N,EAAAxlB,EAAAwpE,SAAAzvE,EAAA0rB,KAAA,eAAAz2B,EAAA85E,cAIA95E,EAAAk6E,eAAA1pE,MAAA7D,QAOA43B,EAAA,YAAA/N,EAAA,gHAEAx2B,EAAAk6E,eAAA1pE,MAAAmgB,QACA4T,GAAA,cAAAvkC,EAAAk6E,eAAA1pE,MAAAmgB,MAAA,MAEA3wB,EAAAk6E,eAAA1pE,MAAA6pE,UACA91C,GAAA,qBAAAvkC,EAAAk6E,eAAA1pE,MAAA6pE,QAAA,MAEAr6E,EAAAk6E,eAAA1pE,MAAA8pE,YACA/1C,GAAA,UAAAvkC,EAAAk6E,eAAA1pE,MAAA8pE,UAAA,MAEA/1C,GAAA,OACAvkC,EAAAk6E,eAAA1pE,MAAA7B,MAAA3O,EAAAk6E,eAAA1pE,MAAA7B,KAAA+rC,WACAnW,GAAA,iDAAAvzB,EAAAwpE,SAAAx6E,EAAAk6E,eAAA1pE,MAAA7B,KAAA+rC,SAAA,QAEAnW,GAAA,OAAAvkC,EAAAk6E,eAAA1pE,MAAA+d,KAAA,oBArBAgW,EAAA,YAAA/N,EAAA,mBACAxlB,EAAAwpE,SAAA,oCAyBAx6E,EAAAk6E,eAAA31C,MAAAA,IACAvkC,EAAAk6E,eAAA31C,KAAAA,EACAvkC,EAAA46E,WAAA,+BAGA56E,EAAAmH,OAAA,eAAAnH,EAAA26E,2BAAA,GACA36E,EAAAmH,OAAA,uBAAAnH,EAAA26E,2BAAA,MAGAxgD,WAAA,kBAAA,CAAA,SAAA,aAAA,WAAA,cAAA,SAAA,KAAA,aAAA,UAAA,UAAA,gBAAA,MAAA,cAAA,UAAA,aAAA,aAAA,aAAA,OAAA,WAAA,eAAA,SAAAn6B,EAAAgR,EAAA/Q,EAAAC,EAAA6K,EAAAlK,EAAAsQ,EAAAglC,EACAp1C,EAAA8tB,EAAAztB,EAAAJ,EAAAG,EAAAG,EAAAqK,EACAkvE,EAAA7/B,EAAA76C,EAAA26E,GAkJA,SAAAC,EAAAC,GACA,OAAA,IAAAC,YAAAD,GAAA,KAAAh1E,OAAAs3B,QAAA,IAAA5T,OAAA,QAAA,MAAAwxD,QAAA,GA/IA96E,QAAAC,OAAA9D,KAAA2D,EAAA,WAAA,CAAAF,OAAAA,KAEAA,EAAAO,SAAA,EACAP,EAAA85E,aAAA,CACA5zC,YAAAzgC,EACA01E,aAAA11E,EACAyyC,aAAAzyC,EACA5G,YAAA4G,EACAkE,UAAAlE,EACAu0E,kBAAAv0E,EACAw0E,gBAAAx0E,EACAgP,UAAAhP,GAGAzF,EAAAmE,MAAA,SAAA8G,EAAA4F,GAGA,GAFAG,EAAAoqE,WAAAvqE,EAAA20C,UAEAxlD,EAAAO,QAAA,CAEA,GAAAsQ,EAAA1F,aAAA0F,EAAA1F,YAAA+6B,OAAA,CACA,IAAA80C,EAAAnqE,EAAA1F,YAAA+6B,OAAAlgC,OACAm1E,GAAA,IAAAH,EAAAr/D,QAAA,MAAAq/D,EAAAt8E,MAAA,OACA,IAAAs8E,EAAAr/D,QAAA,MAAAq/D,EAAAt8E,MAAA,OACA,IAAAs8E,EAAAr/D,QAAA,MAAAq/D,EAAAt8E,MAAA,KACAy8E,GACAn7E,EAAA85E,aAAAqB,QAAAA,EAAAp4E,QAAA,SAAAC,EAAAg4E,GACA,IAAA90C,EAAA60C,EAAAC,GACA,OAAA90C,EAAA,EAAAljC,EAAAC,OAAAijC,GAAAljC,IACA,IACA,IAAAhD,EAAA85E,aAAAqB,QAAAp+E,QACAiD,EAAA85E,aAAA5zC,OAAAlmC,EAAA85E,aAAAqB,QAAA,UACAn7E,EAAA85E,aAAAqB,SAGAn7E,EAAA85E,aAAAqB,QAAAxjE,QAIA3X,EAAA85E,aAAA5zC,OAAA60C,EAAAC,GAsBA,GAnBAnqE,EAAA1F,aAAA0F,EAAA1F,YAAAtM,SACAmB,EAAA85E,aAAAj7E,OAAAgS,EAAA1F,YAAAtM,QAEAgS,EAAA1F,aAAA0F,EAAA1F,YAAAxB,OACA3J,EAAA85E,aAAAnwE,KAAAkH,EAAA1F,YAAAxB,MAEAkH,EAAA1F,aAAA0F,EAAA1F,YAAA+sC,UACAl4C,EAAA85E,aAAA5hC,QAAArnC,EAAA1F,YAAA+sC,SAEArnC,EAAA1F,aAAA0F,EAAA1F,YAAA6uE,eACAh6E,EAAA85E,aAAAE,aAAAnpE,EAAA1F,YAAA6uE,cAEAnpE,EAAA1F,aAAA0F,EAAA1F,YAAA8uE,aACAj6E,EAAA85E,aAAAG,WAAAppE,EAAA1F,YAAA8uE,YAEAppE,EAAA1F,aAAA0F,EAAA1F,YAAAsvE,OACAz6E,EAAAy6E,MAAA,GAGA5pE,EAAA1F,aAAA0F,EAAA1F,YAAA4uE,eAAA,CACA,IAEAv9D,EADA,WAAAzb,EAAAgW,SAAAC,SAEAqkE,EAAAxqE,EAAA1F,YAAA4uE,eACA/6E,EAAA,4BAAAG,KAAAk8E,GACAr8E,IACAwd,EAAA,WAAAxd,EAAA,GACAq8E,EAAAr8E,EAAA,IAEA,IAAAP,EAAA48E,EAAA38E,MAAA,KACA,GAAAD,EAAA1B,QAAA,EAAA,CACA,IAAAkgB,EAAAxe,EAAA,KAAA+d,EAAA,IAAA,IAQA,GAPAxc,EAAAyU,KAAA,CACAooB,KAAAp+B,EAAA,GACAwe,KAAAA,EACAT,OAAAA,GAAA,KAAAS,IAIAjd,EAAAyU,KAAA+H,OAAA,CACA,IAAA/H,EAAArU,QAAA4I,KAAAhJ,EAAAyU,MACAA,EAAA+H,QAAA,EACA/H,EAAAwI,KAAA,IACA3b,EAAAuC,KAAAy3E,cAAAh6E,EAAAuC,KAAAy3E,eAAA,GACAh6E,EAAAuC,KAAAy3E,cAAAz/D,OAAA,EAAA,EAAApH,SAIA1N,QAAAC,KAAA,iEAAA6J,EAAA1F,YAAA4uE,gBAKA,OAAA/5E,EAAAgV,UAEAhV,EAAAW,IAAA,mBAAAX,EAAAmE,OAGAnE,EAAAgV,MAAA,WACA,IAAAhV,EAAAu7E,SAeA,OAbAv7E,EAAAu7E,UAAA,EACAv7E,EAAAO,SAAA,EAGAP,EAAAS,QAAAT,EAAAyU,MAAArT,EAAAqT,KAAAo2B,KAAA7qC,EAAAyU,QACA1N,QAAAqB,MAAA,sCAAArG,OAAA/B,EAAAyU,KAAAooB,KAAA78B,EAAAyU,KAAAwI,OACA7b,EAAA0lC,OACA1lC,EAAA4H,KAAAhJ,EAAAyU,MACAzU,EAAAyU,KAAAmH,OAAAxa,EAAAwa,QAKAi/D,EAAA9zC,UACA1jC,KAAAsI,EAAAwD,KACA9L,MAAA,SAAA+K,GACApO,EAAAoO,SAAAA,EACApO,EAAAyU,KAAArG,EAAAqG,KACAzU,EAAAO,SAAA,EACAP,EAAAS,OAAA,EACAT,EAAAu7E,UAAA,EAEA1sD,EAAAiH,gBAGApwB,OAAA,SAAA6B,GACAR,QAAAtG,MAAA8G,GAAAA,EAAA/I,SAAA+I,GACAvH,EAAAS,OAAA,EACAT,EAAAO,SAAA,EACAP,EAAAu7E,UAAA,EAGA,IAAAC,EAAAp6E,EAAAiT,IAAAI,KAAAilB,GAAA1kB,MAAAhV,GAAA,WACAA,EAAAgV,QACAwmE,WA4FAx7E,EAAAy7E,mBAAA,SAAAC,GACA,OAAAvqE,EAAA,CAAA,YAAA,6BACA9N,MAAA,SAAAysB,GACA,OAAA3e,EAAA,mBAAA,CACA4nC,KAAA2iC,EAAA5rE,SAAA4rE,EAAA94E,IAAAuzC,EAAA,eAAAA,CAAAulC,EAAA78E,QACAm6C,GAAAh5C,EAAA85E,aAAAnwE,MAAAwsC,EAAA,eAAAA,CAAAn2C,EAAA85E,aAAAj7E,QACAqnC,OAAAlmC,EAAA85E,aAAA5zC,OAAA,IACAyZ,KAAAxJ,EAAA,aAAAA,CAAAnlC,EAAA5C,SAAAzE,MACAuuC,QAAAl4C,EAAA85E,aAAA5hC,SAAA,IAAAl4C,EAAA85E,aAAA5hC,QAAAlyC,OAAAjJ,OAAAiD,EAAA85E,aAAA5hC,QAAApoB,EAAA,iCAGAzsB,KAAAlC,EAAAqzB,MAAAC,UAGAz0B,EAAA27E,UAAA,SAAAC,GACA,OAAA57E,EAAA85E,aAAAE,cAIAh6E,EAAA85E,aAAAnwE,KAAAwH,EAAA,kDAAAnR,EAAA85E,cAAA3oE,EAAA,0CACA9N,MAAA,SAAA7E,GACA,OAAA2C,EAAAZ,QAAA2E,KAAA,CAAA6qB,SAAAvxB,OAEA6E,MAAA,WACA,IAAAmzB,EAAAx2B,EAAA85E,aAAAE,aASA,OAFAxjD,GADAA,GADAA,GADAA,GADAA,GADAA,EAAAA,EAAA8G,QAAA,cAAAt9B,EAAA85E,aAAAj7E,SACAy+B,QAAA,YAAAs+C,EAAAv9E,MAAA,KACAi/B,QAAA,eAAAt9B,EAAA85E,aAAA5hC,SAAA,KACA5a,QAAA,cAAAt9B,EAAA85E,aAAA5zC,SAAAlmC,EAAA85E,aAAA5zC,OAAA,KAAAnU,YAAA,KACAuL,QAAA,UAAAu+C,UAAAD,EAAAruE,MACA+vB,QAAA,YAAAu+C,UAAAz6E,EAAAy7B,KAAA,IAAAz7B,EAAA6b,OAEAjd,EAAA87E,cAAAtlD,EAAA,SAjBAr1B,EAAAg0B,MAAAjwB,KAAA,uBAqBAlF,EAAA+7E,SAAA,WACA,OAAA/7E,EAAA85E,aAAAG,YAMAj6E,EAAA85E,aAAAnwE,KAAAwH,EAAA,iDAAAnR,EAAA85E,cAAA3oE,EAAA,yCACA9N,MAAA,SAAA7E,GACA,OAAA2C,EAAAZ,QAAA2E,KAAA,CAAA6qB,SAAAvxB,OAEA6E,MAAA,WACA,IAAAmzB,EAAAx2B,EAAA85E,aAAAG,WAMA,OAFAzjD,GADAA,GADAA,EAAAA,EAAA8G,QAAA,cAAAt9B,EAAA85E,aAAAj7E,SACAy+B,QAAA,eAAAt9B,EAAA85E,aAAA5hC,SAAA,KACA5a,QAAA,cAAAt9B,EAAA85E,aAAA5zC,SAAAlmC,EAAA85E,aAAA5zC,OAAA,KAAAnU,YAAA,IAEA/xB,EAAA87E,cAAAtlD,EAAA,UAhBAx2B,EAAA0B,SAAA0F,UAAA3B,OACAzF,EAAA0B,SAAAqD,cAAAU,KAmBAzF,EAAA87E,cAAA,SAAAtlD,EAAA9pB,GACA,GAAA8pB,EAEA,OAAAv2B,GAAA,WAWA,OATAqiB,OAAA05D,KAAA15D,OAAA05D,IAAAjlE,SACAuL,OAAA05D,IAAAjlE,SAAA0f,KAAAD,EAEAylD,QAAAA,OAAA3sE,UAAA2sE,OAAA3sE,SAAAyH,SACAklE,OAAA3sE,SAAAyH,SAAA0f,KAAAD,EAGAlU,OAAAvL,SAAAmlE,OAAA1lD,GAEAr1B,EAAAZ,QAAA6D,SACAsI,GAAA,IAKA1M,EAAA8G,WAjKA,SAAAm1C,GAGA,IAAAA,EAAA,OAAAj8C,EAAA+7E,WAGA,IAAA/7E,EAAA85E,aAAA5zC,SAAAlmC,EAAA85E,aAAAj7E,OAGA,OAFAmB,EAAA2E,KAAAgE,YAAA,EACAxH,EAAAZ,QAAA6D,OACAvD,EAAA2e,SAIA,IAAAxf,EAAA+rC,QAAA,CACA/rC,EAAA+rC,SAAA,SACA/rC,EAAA85E,aAAAr5E,MAEA,IAAA0M,EAAAnN,EAAAy6E,KAAAK,EAAArsC,SAAAwN,GAAA97C,EAAAsuC,SAAA,MAAArtC,GAEAD,EAAAZ,QAAA2E,OAEAiI,EAAA6H,MAAA,CAAAK,SAAA,IACAhS,MAAA,WACA,OAAA8J,EAAAzM,MAAA,CACA0B,MAAA,EACA65C,SAAAA,EACAM,SAAA,EACA1Q,SAAA,EACAt+B,GAAA,CAAAZ,QAAA,QAGAtJ,MAAA,SAAAq4E,GACA,GAAAA,EAKA,OAHA17E,EAAAU,OAAA,EAEAS,EAAAZ,QAAA6D,OACApE,EAAAy7E,mBAAAC,MAEAr4E,MAAA,SAAAoxB,GACA,GAAAA,EAGA,OAAAtzB,EAAAZ,QAAA2E,OACA7B,MAAA,WACA,IAAA6iC,EAAAlsB,SAAAha,EAAA85E,aAAA5zC,QACA,OAAA/4B,EAAAgyC,SAAAn/C,EAAA85E,aAAAj7E,OAAAqnC,EAAAlmC,EAAA85E,aAAA5hC,SAAA,MAEA70C,MAAA,SAAAu4E,GAGA,OADAz6E,EAAAZ,QAAA6D,OACAw3E,KAEAl2E,OAAA,SAAA6B,GAEA,OADApG,EAAAwE,SAAAxE,CAAAoG,IACA,QAGAlE,MAAA,SAAAu4E,GACA,GAAAA,EACA,OAAA57E,EAAA27E,UAAAC,GAGA57E,EAAA+rC,SAAA,KAGArmC,OAAA,SAAA6B,GAEA,GAAAA,GAAA,cAAAA,EACA,OAAAvH,EAAA+7E,WAGAx0E,GAAA,UAAAA,EACAvH,EAAA+rC,SAAA,GAGA/rC,EAAA+rC,SAAA,EACA5qC,EAAAwE,SAAAxE,CAAAoG,YAwFAugD,IAAA,CAAA,aAAA,SAAAxmD,GAGAA,EAAAuC,KAAAD,YAAA,EACAtC,EAAAuC,KAAA6C,iBAAA,EAEApF,EAAAuC,KAAAC,aAAA,MCtiBA1D,QAAA0Q,OAAA,oBAAA,IAGAqrE,UAAA,aAAA,WACA,MAAA,CACAC,QAAA,WACAC,KAAA,SAAAjzE,EAAAoG,EAAA1S,EAAAw/E,GACAA,GAAAx/E,EAAAy/E,YACAD,EAAAE,YAAAD,UAAA,SAAAE,GACA,OAAAA,GAAArzE,EAAAszE,MAAA5/E,EAAAy/E,YAGAnzE,EAAAjC,OAAArK,EAAAy/E,WAAA,WACAD,EAAAK,qBAQAR,UAAA,eAAA,WACA,MAAA,CACAC,QAAA,WACAC,KAAA,SAAAjzE,EAAAoG,EAAA1S,EAAAw/E,GACAA,GAAAx/E,EAAA8/E,cACAN,EAAAE,YAAAI,YAAA,SAAAH,GACA,OAAAA,GAAArzE,EAAAszE,MAAA5/E,EAAA8/E,cAGAxzE,EAAAjC,OAAArK,EAAA8/E,aAAA,WACAN,EAAAK,qBAOAR,UAAA,eAAA,WACA,IAAAU,EAAA,IAAAnzD,OAAA,yBAEA,MAAA,CACA0yD,QAAA,WACAC,KAAA,SAAAjzE,EAAAoG,EAAA1S,EAAAw/E,GACAA,IACAA,EAAAE,YAAAM,YAAA,SAAAtwE,GACA,OAAA8vE,EAAAS,SAAAvwE,IAAAqwE,EAAArzD,KAAAhd,UAOA2vE,UAAA,aAAA,WACA,IAAAa,EAAA,IAAAtzD,OAAA,YACA,MAAA,CACA0yD,QAAA,UACAC,KAAA,SAAAjzE,EAAAoG,EAAAytE,EAAAX,GACAA,IACAA,EAAAE,YAAAU,UAAA,SAAA1wE,GACA,OAAA8vE,EAAAS,SAAAvwE,IAAAwwE,EAAAxzD,KAAAhd,UAOA2vE,UAAA,SAAA,WACA,IAAAgB,EAAA,IAAAzzD,OAAA,yIACA,MAAA,CACA0yD,QAAA,UACAC,KAAA,SAAAjzE,EAAAoG,EAAAytE,EAAAX,GACAA,IACAA,EAAAE,YAAAY,MAAA,SAAA5wE,GACA,OAAA8vE,EAAAS,SAAAvwE,IAAA2wE,EAAA3zD,KAAAhd,UAOA2vE,UAAA,cAAA,WACA,MAAA,CACAC,QAAA,WACAC,KAAA,SAAAjzE,EAAAoG,EAAA1S,EAAAw/E,GACAA,GAAAx/E,EAAAugF,aACAf,EAAAE,YAAAc,SAAA,SAAA9wE,GACA,OAAApD,EAAAszE,MAAA5/E,EAAAugF,cAAAf,EAAAS,SAAAvwE,IAGApD,EAAAjC,OAAArK,EAAAugF,YAAA,WACAf,EAAAK,qBAOAR,UAAA,YAAA,WACA,MAAA,CACAC,QAAA,WACAC,KAAA,SAAAjzE,EAAAoG,EAAA1S,EAAAw/E,GACAA,IACAA,EAAAE,YAAAe,SAAA,SAAA/wE,GACA,OAAA8vE,EAAAS,SAAAvwE,IAEApM,QAAAoC,UAAAgK,EAAAgxE,MAAAp9E,QAAAoC,UAAAgK,EAAAixE,MAEAr9E,QAAAiM,YAAAG,EAAAgxE,MAAAp9E,QAAAiM,YAAAG,EAAAixE,YAQAtB,UAAA,cAAA,CAAA,UAAA,SAAA,UAAA,SAAAp7E,EAAAQ,EAAAJ,GAEA,MAAA,CACAu8E,SAAA,IACArB,KAAA,SAAAjzE,EAAAoG,EAAAytE,GACA,IAAAU,EAAA,SAAAtzE,GACA,IAAAmC,EAAAywE,EAAAW,YACA,GAAApxE,GAAAjL,EAAA+gC,UAAA31B,OAEApL,EAAA+gC,UAAAt5B,KAAAwD,GACAnJ,MAAA,WACAlC,EAAAg0B,MAAAjwB,KAAA,kCAEAQ,MAAAvE,EAAAwE,QAAA,8BAEA,GAAA6G,EAAA,CACA,IAAA8pB,EAAA9pB,GAAAA,EAAAmP,QAAA,OAAA,EAAAnP,EAAA9N,MAAA,MAAA3B,OAAA,EACAoE,EAAAoJ,QAAArF,KAAAmF,EAAA,CACAjB,MAAAA,EACAoB,YAAA,qCACA+B,SAAA,CACAC,MAAAywE,EAAAW,YACAtnD,KAAAA,GAEA5E,WAAA,kBAAA4E,GAAA,EAAA,QAAA,gBAIA9mB,EAAAkgB,KAAA,QAAAiuD,GACAnuE,EAAAkgB,KAAA,OAAAiuD,QAMAxB,UAAA,gBAAA,CAAA,UAAA,SAAAp7E,GAEA,MAAA,CACA28E,SAAA,IACArB,KAAA,SAAAjzE,EAAAoG,EAAAytE,GACAztE,EAAAkgB,KAAA,SAAA,WACA3uB,EAAA+wB,eAAA/wB,EAAA+wB,eAAAC,YAAAx1B,KAAAiQ,OACAjQ,KAAAy1B,kBAAA,EAAAz1B,KAAAiQ,MAAAzP,gBAOAo/E,UAAA,aAAA,CAAA,YAAA,SAAA0B,GAEA,MAAA,CACAH,SAAA,IACArB,KAAA,SAAAjzE,EAAAoG,EAAAytE,EAAA9iD,GACA,IACAjkB,EADA4nE,EAAAb,EAAAc,WAEAd,EAAAe,sBACA9nE,EAAA+mE,EAAAe,qBAAAx+E,UAAA,GACA4J,EAAA2N,SAAA8mE,EACAz0E,EAAAjC,OAAA,mBAAA,SAAA82E,GACAA,GAAA,IAAAA,EAAAtiE,QAAAzF,GACA1G,EAAA0uE,SAAAJ,GAEAtuE,EAAA8iB,YAAAwrD,OAIAb,EAAAxmD,OACAvgB,EAAA+mE,EAAAxmD,KAAAj3B,UAAA,GACA4J,EAAA2N,SAAA8mE,EACAz0E,EAAAjC,OAAA,mBAAA,SAAA82E,GACAA,GAAAA,GAAA/nE,EACA1G,EAAA0uE,SAAAJ,GAEAtuE,EAAA8iB,YAAAwrD,YAUA3B,UAAA,QAAA,CAAA,WAAA,SAAAl8E,GACA,MAAA,CACAy9E,SAAA,IACAt0E,MAAA,CACA+0E,YAAA,IACAC,SAAA,IACAC,QAAA,IACAC,OAAA,KAEAjC,KAAA,SAAAjzE,EAAAoG,EAAA+uE,GACA/uE,EAAAkgB,KAAA,SAAA,SAAAzkB,GACA7B,EAAAi1E,SACAp+E,GAAA,WACAmJ,EAAAi1E,gBAIA7uE,EAAAkgB,KAAA,QAAA,SAAAzkB,GACA7B,EAAAk1E,QACAr+E,GAAA,WACAmJ,EAAAk1E,eAIA9uE,EAAAkgB,KAAA,WAAA,SAAAzkB,GACA,IAAAA,EAAAuzE,QACAp1E,EAAA+0E,aAAA3uE,EAAA,GAAAivE,OACAr1E,EAAAg1E,UACAn+E,GAAA,WACAmJ,EAAAg1E,uBASAjC,UAAA,cAAA,CAAA,OAAA,WAAA,SAAA,SAAAtC,EAAA6E,EAAAC,GACA,MAAA,CACAjB,SAAA,IACAkB,QAAA,SAAAC,EAAAC,GACA,IAAAC,EAAAJ,EAAAG,EAAAE,aACAC,EAAAN,EAAAG,EAAAE,aAAA,SAAAxyE,GACA,OAAAA,GAAA,IAAAulB,cAIA,OAFA2sD,EAAAQ,kBAAAL,GAEA,SAAAz1E,EAAAoG,EAAA+uE,GACAG,EAAAS,iBAAA3vE,EAAA+uE,EAAAS,aAEA51E,EAAAjC,OAAA83E,GAAA,WAGAzvE,EAAA+0B,KAAAs1C,EAAAuF,eAAAvF,EAAAmF,YAAAD,EAAA31E,MAAA,IACAs1E,EAAAlvE,EAAA6vE,WAAAX,CAAAt1E,YAUA+yE,UAAA,aAAA,CAAA,gBAAA,WAAA,SAAAttD,EAAA5uB,GACA,MAAA,CACAy9E,SAAA,KACArB,KAAA,SAAAr8E,EAAAs/E,GACAA,EAAA5vD,KAAA,SAAA,WACA1vB,EAAA8G,aACA+nB,EAAA0wD,gBAAA,CACAC,aAAA,EACAC,gBAAA,EACAC,OAAA,MAKAz/E,GAAA,WACA4uB,EAAA0wD,gBAAA,CACAC,aAAA,EACAC,gBAAA,MAEA,KACAz/E,EAAA8G,sBAUAq1E,UAAA,mBAAA,CAAA,SAAA,WAAA,cAAA,iBAAA,gBAAA,SAAApxE,EAAA2zE,EAAAx+E,EAAA6nD,EAAA43B,GAoCA,MAAA,CACAjC,SAAA,IACAkB,QAzBA,SAAAC,EAAAe,GAEA,GAAAx/E,QAAAoC,UAAAo9E,EAAAj2E,MAAA,CACA,IAAAk2E,EAAAF,EAAA75B,WAAAC,OAAAC,iBAAA45B,EAAAj2E,MACAk2E,EAAA9iF,OAAA,IACA8hF,EAAAt6C,KAAA,IACAvnC,EAAAN,QAAAmjF,GAAA,SAAAC,GACAjB,EAAAkB,OAnBA,SAAAD,GACA,IAAA/vD,EAAA+vD,EAAAt1E,YAAAu9C,EAAA54C,IAAA2wE,EAAAt1E,aAAAs1E,EAAA/vD,SACA,OAAAA,GAIA+vD,EAAA3lD,aACApK,EAAA,iCAAA+vD,EAAA3lD,WAAA,KAAApK,EAAA,UAEAA,IANAhpB,QAAAtG,MAAA,qDAAAq/E,EAAAt1E,YAAAs1E,EAAAt1E,YAAAs1E,EAAA/vD,WACA,IAeAiwD,CAAAF,QAKA,MAAA,CACAG,IAAA,SAAA72E,EAAA82E,EAAAC,GACAR,EAAA75B,WAAAC,OAAAppC,QAAA8G,IAAA08D,EAAAx2E,OAEAg1B,KAAA,WACAghD,EAAA75B,WAAAC,OAAAppC,QAAA8G,SASAra,MAAA,CACAS,QAAA,SAKAsyE,UAAA,aAAA,CAAA,SAAA,SAAAwC,GACA,MAAA,CACAjB,SAAA,IACAt0E,OAAA,EACAizE,KAAA,SAAAjzE,EAAAoG,EAAAytE,GACA,IAAAmD,EAAAzB,EAAA1B,EAAAoD,YAEA7wE,EAAAkqB,GAAA,UAAA,SAAA4mD,GACA,IAAAvzD,EAAA,IAAAvM,WACA9W,EAAA,CACAC,KAAApN,KAAAgkF,MAAA,GAAA52E,KACAC,KAAArN,KAAAgkF,MAAA,GAAA32E,KACAgO,KAAArb,KAAAgkF,MAAA,GAAA3oE,MAGAmV,EAAAtM,OAAA,SAAA+/D,GACAp3E,EAAAq3E,aAAA,WACAL,EAAAh3E,EAAA,CACAxD,KAAA,CACAkE,YAAA02E,EAAA9/D,OAAAC,OACAjX,SAAAA,SAIAqjB,EAAAnM,YAAA0/D,EAAAI,YAAAJ,EAAA5/D,QAAA6/D,MAAA,YAMApE,UAAA,WAAA,CAAA,SAAA,SAAAwC,GACA,MAAA,CACAjB,SAAA,IACAt0E,OAAA,EACAizE,KAAA,SAAAjzE,EAAAu3E,EAAA1D,GACA,IAAAmD,EAAAzB,EAAA1B,EAAA2D,UACAD,EAAAjxD,KAAA,YAAA,SAAAzkB,GACAA,EAAA41E,kBACA51E,EAAAqxB,oBAEAqkD,EAAAjxD,KAAA,aAAA,SAAAzkB,GACAA,EAAA41E,kBACA51E,EAAAqxB,oBAEAqkD,EAAAjxD,KAAA,aAAA,SAAAzkB,GACAA,EAAA41E,kBACA51E,EAAAqxB,oBAEAqkD,EAAAjxD,KAAA,QAAA,SAAAzkB,GACAA,EAAA41E,kBACA51E,EAAAqxB,iBACA,IAAA5yB,EAAA,CACAC,KAAAsB,EAAA61E,aAAAP,MAAA,GAAA52E,KACAC,KAAAqB,EAAA61E,aAAAP,MAAA,GAAA32E,KACAgO,KAAA3M,EAAA61E,aAAAP,MAAA,GAAA3oE,MAGAmV,EAAA,IAAAvM,WACAuM,EAAAtM,OAAA,SAAA+/D,GACAp3E,EAAA23E,QAAA,WACAX,EAAAh3E,EAAA,CACAxD,KAAA,CACAkE,YAAA02E,EAAA9/D,OAAAC,OACAjX,SAAAA,SAIAqjB,EAAAnM,WAAA3V,EAAA61E,aAAAP,MAAA,YAQApE,UAAA,aAAA,CAAA,SAAA,SAAAwC,GACA,aAEA,MAAA,CACAjB,SAAA,IACAt0E,OAAA,EACA2mB,SAAA,8EAEAixD,YAAA,EACA3E,KAAA,SAAAjzE,EAAAoG,EAAAytE,GACA,IAAAmD,EAAAzB,EAAA1B,EAAAgE,YAEAC,EAAA1xE,EAAAq9B,SAAA,eAEAowC,EAAAkE,SACAD,EAAA,GAAAC,OAAAlE,EAAAkE,QAGAD,EAAAxnD,GAAA,UAAA,SAAA4mD,GACA,IAAAvzD,EAAA,IAAAvM,WACA9W,EAAA,CACAC,KAAApN,KAAAgkF,MAAA,GAAA52E,KACAC,KAAArN,KAAAgkF,MAAA,GAAA32E,KACAgO,KAAArb,KAAAgkF,MAAA,GAAA3oE,MAGAmV,EAAAtM,OAAA,SAAA+/D,GACAp3E,EAAAq3E,aAAA,WACAL,EAAAh3E,EAAA,CACAxD,KAAA,CACAkE,YAAA02E,EAAA9/D,OAAAC,OACAjX,SAAAA,SAIAqjB,EAAAnM,YAAA0/D,EAAAI,YAAAJ,EAAA5/D,QAAA6/D,MAAA,OAGA/wE,EAAAkqB,GAAA,SAAA,WACAwnD,EAAA,GAAAE,gBASAjF,UAAA,mBAAA,CAAA,UAAA,aAAA,WAAA,SAAAp7E,EAAAO,EAAAnB,GACA,MAAA,CACAu9E,SAAA,KACArB,KAAA,SAAA7sE,EAAAytE,IACAl8E,EAAAsgF,aAAAtgF,EAAAugF,kBACAvgF,EAAAsgF,YAAA,WAAA,UAEA,SAAAp2E,GACA,GAAA3J,EAAAuC,MAAAvC,EAAAuC,KAAAC,cAAAxC,EAAAU,UAAAgC,uBACA,OAAA7D,EAAAw8C,iBCvdAv8C,QAAA0Q,OAAA,iBAAA,CAAA,gBAAA,kBAAA,yBAAA,wBAGAC,QAAA,qBAAA,CAAA,aAAA,KAAA,aAAA,aAAA,aAAA,aAAA,WAAA,SAAAC,EAAAnQ,EAAAg6E,EAAAv5E,EAAAqK,EAAAwF,EAAAlR,GAGA,IAEA+R,EADAoC,GAAA,EAEA9X,EAAAC,KAKA,SAAAglF,IAEA,OADAx6E,QAAAqB,MAAA,iDAAArG,OAAAoP,EAAA4C,QACA5C,EAAA,CAAA,sBAAA,4BAAA,YAAA,gBACA9N,MAAA,SAAAysB,GACAxzB,EAAAmvD,aAAA37B,EAAA,uBACA,wBAAAxzB,EAAAmvD,eACAnvD,EAAAmvD,aAAA,oBAEAnvD,EAAAqvD,mBAAA77B,EAAA,6BACA,8BAAAxzB,EAAAqvD,qBACArvD,EAAAqvD,mBAAA,cAEArvD,EAAAsvD,wBAAA97B,EAAA,kCACA,mCAAAxzB,EAAAsvD,0BACAtvD,EAAAsvD,wBAAA,UAEAtvD,EAAAwuD,KAAAh7B,EAAA,eACA,gBAAAxzB,EAAAwuD,OACAxuD,EAAAwuD,KAAA,QAEAxuD,EAAAojD,GAAA5vB,EAAA,aACA,cAAAxzB,EAAAojD,KACApjD,EAAAojD,GAAA,SAMA,SAAA8hC,IACAz6E,QAAAqB,MAAA,yDACA9L,EAAAmlF,mBAAA91E,EAAA9H,KAAAshC,kBAAA7oC,EAAAmlF,mBA2BA,OA5DAnlF,EAAAmlF,mBAAA,KAoCAnlF,EAAAmZ,MAAA,WACA,OAAArB,EAAAvT,EAAAoH,OACA+J,GAAA1V,EAAA0Y,SAGA1Y,EAAA0Y,MAAA,WAUA,OATAhD,EAAA6oE,EAAAplE,QACApS,KAAAk+E,GACAl+E,MAAA,WACAm+E,IACAptE,GAAA,EAEA9S,EAAA+S,IAAAnJ,OAAAwuB,GAAAllB,QAAAxD,EAAAuwE,EAAAhlF,MACAoP,EAAA0I,IAAAxQ,KAAA61B,GAAAjkB,MAAAzE,EAAAwwE,EAAAjlF,UAOA0D,GAAA,WACA3D,EAAA0Y,WAGA1Y,KAGA8a,OAAA,iBAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,EAAAA,EAAA,IAAAtkC,QAAAskC,GAAAn4C,OAAA,OAAA6T,QAAAskC,GAAAn4C,OAAA,aAAA,QAIAqV,OAAA,eAAA,CAAA,WAAA,aAAA,aAAA,UAAA,SAAA1L,EAAApK,EAAAqK,EAAAwqC,GACA,IAAAurC,EAAA,QAAAC,MAAAj2E,EAAA4H,cAAA,GAAAhV,KAAA,KAEAsjF,EAAAzrC,EAAA,kBAGA0rC,EAAAH,EAAA,IACAI,EAAA,EAAAhkE,KAAAC,IAAA,IAAArS,EAAA4H,cAAA,GAAA,GA6BA,OAAA,SAAA4mC,EAAAjxC,GACA,QAAAxD,IAAAy0C,EACA,OAAAjxC,GAAA7I,QAAAoC,UAAAyG,EAAA8F,aAAA9F,EAAA8F,YAAAzN,EAAAuC,KAAAkL,aA7BA,SAAAmrC,EAAAjxC,GACA,IAAA2G,EAAA3G,GAAAA,EAAA2G,UAAA3G,EAAA2G,UAAAjE,EAAA9H,KAAA+L,UACA,GAAAA,EAAA,CAIA,IAAAs2B,EAAAgU,EAAAtqC,EAOA,OALAs2B,EADApoB,KAAAikE,IAAA7nC,GAAA4nC,GAAA,IAAA5nC,EACA,MAGAtkC,QAAAswB,GAAAnkC,OAAA8/E,GAEA54E,GAAAA,EAAAmF,SACA83B,EAAA,IAAA07C,EAAA34E,EAAAmF,UAAA,GAEA83B,EAbAn/B,QAAAC,KAAA,uCA2BAg7E,CAAA9nC,EAAAjxC,GAXA,SAAAixC,EAAAjxC,GACA,IAAAi9B,EAAAtwB,QAAAskC,EAAA,KAAAn4C,OAAAm4C,GAAA,KAAAA,EAAA,IA3BA,YA2BAwnC,GACA,OAAAz4E,GAAAA,EAAAmF,SACA83B,EAAA,IAAA07C,EAAA34E,EAAAmF,UAAA,GAEA83B,EAOA+7C,CAAA/nC,EAAAjxC,OAIAmO,OAAA,qBAAA,CAAA,WAAA,aAAA,aAAA,UAAA,SAAA1L,EAAApK,EAAAqK,EAAAwqC,GACA,IAAA+rC,EAAA,EAAApkE,KAAAC,IAAA,GAAArS,EAAA4H,cAAA,GACAvR,EAAA,QAAA4/E,MAAAj2E,EAAA4H,cAAA,GAAAhV,KAAA,KACAsjF,EAAAzrC,EAAA,wBA6BA,OAAA,SAAA+D,EAAAjxC,GACA,QAAAxD,IAAAy0C,EACA,OAAAjxC,GAAA7I,QAAAoC,UAAAyG,EAAA8F,aAAA9F,EAAA8F,YAAAzN,EAAAuC,KAAAkL,aA7BA,SAAAmrC,EAAAjxC,GACA,IAAA2G,EAAA3G,GAAAA,EAAA2G,UAAA3G,EAAA2G,UAAAjE,EAAA9H,KAAA+L,UACA,GAAAA,EAAA,CAIA,IAAAs2B,EAAAgU,EAAAtqC,EAOA,OALAs2B,EADApoB,KAAAikE,IAAA77C,GAAAg8C,GAAA,IAAAhoC,EACA,MAGAtkC,QAAAswB,GAAAnkC,OAAAA,GAEAkH,GAAAA,EAAAmF,SACA83B,EAAA,IAAA07C,EAAA34E,EAAAmF,UAAA,GAEA83B,EAbAn/B,QAAAC,KAAA,uCA2BAg7E,CAAA9nC,EAAAjxC,GAXA,SAAAixC,EAAAjxC,GACA,IAAAi9B,EAAAtwB,QAAAskC,EAAA,KAAAn4C,OAAAm4C,GAAA,KAAAA,EAAA,IAAA,SAAA,aACA,OAAAjxC,GAAAA,EAAAmF,SACA83B,EAAA,IAAA07C,EAAA34E,EAAAmF,UAAA,GAEA83B,EAOA+7C,CAAA/nC,EAAAjxC,OAIAmO,OAAA,iBAAA,CAAA,qBAAA,UAAA,aAAA,SAAA+qE,EAAAhsC,EAAA70C,GACA,OAAA,SAAA44C,EAAAnrC,GACA,OAAAmrC,GACA95C,QAAAoC,UAAAuM,GAAAA,EAAAzN,EAAAuC,KAAAkL,aACAozE,EAAAziC,GAAA,QAAAvJ,EAAA,aAAAA,CAAA+D,GAAA,SACA/D,EAAA,aAAAA,CAAA+D,GAHA,OAOA9iC,OAAA,uBAAA,CAAA,qBAAA,UAAA,aAAA,SAAA+qE,EAAAhsC,EAAA70C,GACA,OAAA,SAAA44C,EAAAnrC,GACA,OAAAmrC,GACA95C,QAAAoC,UAAAuM,GAAAA,EAAAzN,EAAAuC,KAAAkL,aACAozE,EAAAziC,GAAA,IAAAvJ,EAAA,aAAAA,CAAA+D,GACA/D,EAAA,aAAAA,CAAA+D,GAHA,OAOA9iC,OAAA,gBAAA,CAAA,WAAA,aAAA,SAAA1L,EAAAC,GACA,IAAAu2E,EAAA,EAAApkE,KAAAC,IAAA,GAAArS,EAAA4H,cAAA,GACAvR,EAAA,QAAA4/E,MAAAj2E,EAAA4H,cAAA,GAAAhV,KAAA,KAEA,OAAA,SAAA47C,GACA,YAAAz0C,IAAAy0C,EAAA,IACAA,IAAAkoC,EAAAA,GAAAloC,KAAA,EAAA,GACAnzC,QAAAC,KAAA,gEAAA2E,EAAA9H,KAAA+L,WACA,SAEAkO,KAAAikE,IAAA7nC,GAAAgoC,EAAA,MACAtsE,QAAAskC,GAAAn4C,OAAAA,OAIAqV,OAAA,iBAAA,WACA,OAAA,SAAA8iC,EAAAwnC,GACA,YAAAj8E,IAAAy0C,EAAA,IAKAp8B,KAAAikE,IAAA7nC,GAAA,KAAA,MACAtkC,QAAAskC,GAAAn4C,OAAA2/E,OAIAtqE,OAAA,aAAA,CAAA,qBAAA,SAAA+qE,GACA,OAAA,SAAAjoC,GACA,OAAAA,EAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,IAAAmoC,QAAAtgF,OAAAogF,EAAA12B,cAAA,oBAAA,OAIAr0C,OAAA,kBAAA,CAAA,qBAAA,SAAA+qE,GACA,OAAA,SAAAjoC,GACA,OAAAA,EAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,IAAAmoC,QAAAtgF,OAAAogF,EAAAx2B,oBAAA,cAAA,OAIAv0C,OAAA,kBAAA,CAAA,qBAAA,SAAA+qE,GACA,OAAA,SAAAjoC,GACA,OAAAA,EAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,IAAAmoC,QAAAtgF,OAAAogF,EAAAv2B,yBAAA,UAAA,OAIAx0C,OAAA,oBAAA,CAAA,qBAAA,SAAA+qE,GACA,OAAA,SAAAjoC,GACA,OAAAA,EAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,IAAAmoC,QAAAtgF,OAAAogF,EAAAz2B,mBAAA,cAAA,OAIAt0C,OAAA,cAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,EAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,IAAAmoC,QAAAtgF,OAAA,SAAA,OAIAqV,OAAA,iBAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,EAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,IAAAooC,UAAA,OAIAlrE,OAAA,uBAAA,CAAA,qBAAA,SAAA+qE,GACA,OAAA,SAAAjoC,EAAAjxC,GACA,IAAAif,EAAAgyB,GAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,IACA,OAAAhyB,GAAAA,EAAAo6D,WAAAr5E,GAAAA,EAAAs5E,WAAA,OAAAr6D,EAAAm6D,QAAAtgF,OAAAogF,EAAA12B,cAAA,qBAAA,OAIAr0C,OAAA,oBAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,EAAAxkC,OAAAwrB,KAAAxrB,SAAAurB,MAAAC,OAAAlnB,SAAAkgC,IAAAooC,UAAA,OAIAlrE,OAAA,kBAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,EAAAxkC,OAAA,GAAAqjC,KAAArjC,OAAAwrB,KAAAlnB,SAAAkgC,KAAA,GAAA,OAKA9iC,OAAA,qBAAA,CAAA,qBAAA,SAAA+qE,GACA,OAAA,SAAAjoC,GACA,IAAAA,EAAA,MAAA,GACA,IAAAjyB,EAAAiyB,GAAAA,EAAA,EAAA,IAAA,IACAA,EAAAp8B,KAAAikE,IAAA7nC,GACA,IAAAsoC,EAAA1kE,KAAAqT,MAAA+oB,EAAA,KAAA,IACAuoC,EAAA3kE,KAAAqT,MAAA+oB,EAAA,KAAA,GAAAsoC,GACApjD,EAAAthB,KAAAqT,MAAA+oB,EAAA,GAAA,GAAAsoC,EAAA,GAAA,GAAAC,GACA,OAAAD,EAAA,EAAAv6D,EAAAu6D,EAAA,IAAAL,EAAAr3B,KAAA,IAAA23B,EAAA,KAAArjD,EAAA,IACAqjD,EAAA,EAAAx6D,EAAAw6D,EAAA,KAAArjD,EAAA,IAAAnX,EAAAmX,EAAA,QAKAhoB,OAAA,oBAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,EACAA,EAAA,IACAA,EAAA,KACAA,EAAA,IAAA,IACA,OAIA9iC,OAAA,gBAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,EACAxkC,OAAA,GAAAqjC,KAAArjC,OAAAwrB,KAAAlnB,SAAAkgC,KAAA,GACAx7C,MAAA,KAAA+sB,OAAA,GAAA,GAFA,SAMArU,OAAA,sBAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,EAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,GAAA9wB,QAAAk5D,SAAA,GAAA;IAMAlrE,OAAA,aAAA,CAAA,qBAAA,SAAA+qE,GACA,OAAA,SAAAjoC,GACA,OAAAA,EAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,GAAAioC,EAAAV,oBAAAY,QAAAtgF,OAAAogF,EAAA12B,cAAA,oBAAA,OAIAr0C,OAAA,kBAAA,CAAA,qBAAA,SAAA+qE,GACA,OAAA,SAAAjoC,GACA,OAAAA,EAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,GAAAioC,EAAAV,oBAAAY,QAAAtgF,OAAAogF,EAAAx2B,oBAAA,cAAA,OAKAv0C,OAAA,aAAA,CAAA,qBAAA,SAAA+qE,GACA,OAAA,SAAAjoC,GACA,OAAAA,EAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,GAAAioC,EAAAV,oBAAAY,QAAAtgF,OAAA,SAAA,OAIAqV,OAAA,gBAAA,CAAA,qBAAA,SAAA+qE,GACA,OAAA,SAAAjoC,GACA,OAAAA,EAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,GAAAioC,EAAAV,oBAAAa,UAAA,OAIAlrE,OAAA,qBAAA,CAAA,qBAAA,SAAA+qE,GACA,OAAA,SAAAjoC,GACA,OAAAA,EAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,GAAAioC,EAAAV,oBAAAa,SAAA,GAAA,OAIAlrE,OAAA,uBAAA,CAAA,qBAAA,SAAA+qE,GACA,OAAA,SAAAjoC,EAAAjxC,GACA,IAAAif,EAAAgyB,GAAAxkC,OAAAwrB,KAAAlnB,SAAAkgC,GAAAioC,EAAAV,oBACA,OAAAv5D,GAAAA,EAAAo6D,WAAAr5E,GAAAA,EAAAs5E,WAAA,OAAAr6D,EAAAm6D,QAAAtgF,OAAAogF,EAAA12B,cAAA,qBAAA,OAOAr0C,OAAA,cAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,GACAA,EAAAA,EAAAz2C,eACA1G,OAAA,EAAAm9C,EAAA16C,UAAA,EAAA,GAAAylB,cAAAi1B,EAAA16C,UAAA,GAAA06C,EAFA,OAMA9iC,OAAA,cAAA,WACA,IAAAsrE,EAAA,GACA,OAAA,SAAAxoC,GACA,IAAA9rC,EAAA8rC,GAAA,GACA,GAAAwoC,EAAAt0E,GAAA,OAAAs0E,EAAAt0E,GACA,GAAAA,EAAArR,OAAA,EAAA,CAEA,IADA,IAAA4iD,EAAA,GAAAgjC,EAAA,CAAA,IAAA,IAAA,KACA9kE,EAAA,EAAAA,EAAAzP,EAAArR,OAAA8gB,IAAA,CACA,IAAA+kE,EAAAx0E,EAAAyP,GACA,IAAAA,EACA8hC,EAAA,MAAAijC,GAAA,MAAAA,EAAA,IAAAA,EAEA/kE,EAAA,IAAA,GAAA8kE,EAAAhnE,QAAAvN,EAAAyP,EAAA,MACA8hC,GAAAijC,GAGAx0E,EAAAuxC,EAAA16B,kBAIA,OADA7W,EAAAA,EAAA6W,eACA49D,OAAA,KACAz0E,EAAA,KAAAA,EAAArR,OAAA,EAAAqR,EAAAuH,OAAA,GAAA,KAKA,OADA+sE,EAAAxoC,GAAA9rC,EACAA,MAIAgJ,OAAA,SAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,EACAA,EAAAj1B,cADA,OAKA7N,OAAA,gBAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,EAAAA,EAAAvkC,OAAA,EAAA,GAAA,OAIAyB,OAAA,cAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,EAAAA,EAAAvkC,OAAA,EAAA,GAAAukC,EAAAvkC,OAAAukC,EAAAn9C,OAAA,GAAA,OAIAqa,OAAA,kBAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,GAAAA,EAAAn9C,OAAA,GAAAm9C,EAAAvkC,OAAA,EAAA,IAAA,MAAAukC,MAKA9iC,OAAA,cAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,EAAA71B,mBAAA61B,EACAz2C,cACA65B,QAAA,WAAA,IACAA,QAAA,WAAA,IACAA,QAAA,MAAA,MACA,OAKAlmB,OAAA,mBAAA,WACA,OAAA,SAAA8iC,GACA,OAAAA,EAAA71B,mBAAA61B,GAAA,OAIA9iC,OAAA,aAAA,WACA,OAAA,SAAA8iC,EAAAtwC,GAEA,OADAA,EAAAA,GAAA,KACAswC,GAAAA,EAAAn9C,QAAA6M,EAAAswC,EAAAA,EAAAvkC,OAAA,EAAA/L,GAAA,UAIAwN,OAAA,YAAA,WACA,OAAA,SAAA8iC,EAAAtwC,GACAA,EAAAA,GAAA,GACA,IAAA4E,EAAA0rC,EAAAv7C,WAAA,WAAA,EAAAu7C,EAAAv7C,WAAA,YAAA,EAAA,EAEA,OADA6P,EAAA0rC,EAAAv7C,WAAA,OAAA6P,GAAAA,EAAA,EAAAA,GACA0rC,GAAAA,EAAAn9C,OAAAyR,GAAA5E,EAAAswC,EAAAvkC,OAAAnH,GAAA0rC,EAAAvkC,OAAAnH,EAAA5E,GAAA,UAIAwN,OAAA,cAAA,CAAA,OAAA,SAAAyiE,GACA,OAAA,SAAAt1C,GACA,OAAAs1C,EAAAmF,YAAAz6C,OvB9bAnkC,QAAA0Q,OAAA,kBAAA,CAAA,SAAA,gBAAA,oBAGAmsB,OAAA,CAAA,qBAAA,WAAA,SAAA+qB,EAAAt8C,GAGAs8C,EACA86B,mBAAA,SACAC,6BAGAC,yBAAA,MACAzxE,iBAAA,CAAA7F,EAAA6F,iBAAA7F,EAAA6F,iBAAA,OACA0xE,gBAAA,MAGAhmD,OAAA,CAAA,gBAAA,WAAA,SAAAimD,EAAAx3E,GAIAw3E,EAAAC,SAAAz2E,QAAAhB,EAAAgB,QAAAhB,EAAAgB,QAAA,IAGAw2E,EAAAC,SAAAC,YAAA,SAGAF,EAAAC,SAAA7kD,QAAA+kD,OAAA,uBAIApmD,OAAA,CAAA,mBAAA,WAAA,SAAAqmD,EAAA53E,GAGA43E,EAAAC,kBAAA,IAAA73E,EAAAtD,OAIAk7E,EAAAE,4BAAA,8EAGAvmD,OAAA,CAAA,mBAAA,SAAAwmD,GAGAA,EAAAC,gBAAA,iBAIAzmD,OAAA,CAAA,uBAAA,WAAA,SAAA0mD,EAAAj4E,GAGAtL,QAAAC,OAAAsjF,EAAAR,SAAA,CAEAS,YAAA,IACAC,cAAA,UACAC,SAAA,IAGAlqD,OAAAluB,EAAA0G,aAAA,IACA0mB,YAAA,cAKAmE,OAAA,CAAA,4BAAA,SAAA8mD,GAGAA,EAAA9mD,OAAA+mD,MAAA,eAGA/mD,OAAA,CAAA,uBAAA,SAAAgnD,GAIA,IAAAC,EAAA5gF,MAAAC,SAAAkhC,QACAw/C,EAAAE,UAAAC,YAAAF,GAGAD,EAAAvuD,MAAA2uD,SAAA,MAGApnD,OAAA,CAAA,eAAA,WAAA,SAAAqnD,EAAA54E,GAGA44E,EAAAC,KAAA74E,EAAA84E,YAAA,KACAF,EAAA53E,QAAAhB,EAAA+4E,eAAA,OAGA1zE,QAAA,oBAAA,CAAA,OAAA,SAAA0wB,GAGA,OAAA,SAAAijD,EAAAC,GACAA,EAAAljD,EAAAhhC,MAAAikF,EAAAC,GACAljD,EAAAhhC,MAAAikF,OAKA3zE,QAAA,aAAA,CAAA,aAAA,aAAA,KAAA,SAAA,aAAA,WAAA,UAAA,MAAA,SAAA,SAAA,WAAA,UAAA,aAAA,aAAA,WAAA,SAAA7P,EAAA8P,EAAAnQ,EAAAkK,EAAAoG,EAAAlR,EAAAkB,EACAC,EAAAG,EAAAqV,EAAAlL,EAAAgxB,EAAAp7B,EAAAqK,EAAAxL,GAGA,IAEAykF,EAEA5yE,EACAkF,EACA2tE,EALAC,EAAA,EAEA1wE,GAAA,EAKA,SAAA2wE,IACA,IAAAF,EAAA,CAEA,IAAA5lE,EAAAjO,EAAArQ,IAAA,qBAAA,SAAA0J,EAAA+B,EAAA44E,EAAAC,GACA56E,EAAAC,kBAAA,aAAA8B,EAAAzC,MAAA,iBAAAyC,EAAAzC,OACAU,EAAAiyB,iBACAtqB,EACAA,EAAA3O,MAAA,WACA0H,EAAA+D,GAAA1C,EAAAzC,KAAAq7E,MAIA7jF,EAAAZ,QAAA6D,WAMAygF,EAAA5lE,GAGA,SAAAimE,IACAL,GAAAA,IACAA,EAAA,KAIA,SAAAM,EAAA18C,GACA,GAAAA,EAAA,OAAA,EAGAm8C,EAAAA,GAAAtjF,EAAAuC,KAAA4Q,KAEA,IAAA2wE,EAAA9jF,EAAAuC,KAAAy3E,eAAAwJ,EAAAxjF,EAAAuC,KAAAy3E,cAAAv+E,QAAAuE,EAAAuC,KAAAy3E,cAAAwJ,KACA,IAAAM,EACA,KAAA,iCAEA,IAAAC,EAAAD,EAAAvoD,MAAAuoD,EAAAnoE,MAAA,IAAAmoE,EAAAnoE,MAAA,KAAAmoE,EAAAnoE,KAAA,GAAA,IAAAmoE,EAAAnoE,MAGA,OAAA7b,EAAAqT,KAAAo2B,KAAAu6C,IACAr+E,QAAAqB,MAAA,+DAAArG,OAAAsjF,IACAF,KAIAvuE,EAAAzH,IAAAi2E,EAAAvoD,KAAAuoD,EAAAnoE,KAAA,gBAAA,KAAAmoE,EAAAnoE,MAAA7b,EAAAqT,KAAAi0B,YAAA9xB,GACAlR,OAAA,SAAA6B,GACAR,QAAAtG,MAAA,2DAAAsB,OAAAsjF,OAGAhiF,MAAA,SAAAL,GACA,IAAAA,EAAA,OAAAmiF,IAGA,IAAAG,EAAA,CAAAC,IAAAnkF,EAAAwa,OAAA4pE,IAAAH,GAUA,OATAC,EAAAC,MAAAD,EAAAE,MACApkF,EAAA6b,MAAAmoE,EAAAnoE,KACAqoE,EAAAE,KAAA,IAAAJ,EAAAnoE,KAEA,GAAA7b,EAAAob,SAAA4oE,EAAA5oE,QAAA,KAAA4oE,EAAAnoE,OACAqoE,EAAAE,KAAA,WAIAr0E,EAAA,4BAAAm0E,GACAjiF,MAAA,SAAAyhB,GACA,OAAA3jB,EAAAqzB,MAAAC,QAAA3P,MAEAzhB,MAAA,SAAAoxB,GACA,GAAAA,EAWA,OARAnzB,EAAAuC,KAAA4Q,KAAA2wE,EAGA9jF,EAAAuC,KAAA4Q,KAAAC,WAAA,EAEAkC,EAAA4iB,MAAAO,QAGA34B,EAAA4H,KAAAo8E,GACA/hF,KAAA8hF,SAkDA,SAAAp+C,IAEA,OADAhgC,QAAAqB,MAAA,oCACA0+B,IACAzjC,MAAA,WACA,OAAApD,EAAA+U,EAAA,QAIA,SAAAA,IA0CA,OAvCA+vE,IAGA/yE,EAAA9Q,IAEAmC,KAAAxC,EAAA6P,IAAA,CAEAnP,EAAAkU,QAGAnU,EAAAmU,WAIApS,MAAA,WACA,OAAAjC,EAAAqU,QAAApS,KAAA8hF,MAIA9hF,KAAAsI,EAAA8J,OAGApS,KAAAlD,EAAAsV,OAEApS,MAAA,WACA6hF,IAvDA,WACAhuE,EAAA,CAEA9V,EAAAiT,IAAAI,KAAAilB,GAAAqN,QAAA/1B,EAAA+1B,EAAAxqC,OAqDAo9B,GACA3nB,EAAA,KACAoC,GAAA,KAEA1O,OAAA,SAAA6B,GAMA,MALAyK,EAAA,KACAoC,GAAA,EACArJ,EAAA4R,QAAAhT,OAAAqH,EAAAoqE,YACArwE,EAAA+D,GAAAkC,EAAAoqE,WAAA,CAAA36E,MAAA,SAEA8G,KAMA,SAAAu/B,IACA,OAAA1yB,GAjEApX,EAAAN,QAAAwa,GAAA,SAAA+H,GACAA,OAEA/H,EAAA,GAiEA/W,EAAA2mC,OACAn7B,EAAAm7B,OACA1lC,EAAA0lC,OAEA7mC,GAAA,WACAilF,IACA9wE,GAAA,EACApC,EAAA,OACA,MAXAnR,EAAAoH,OAcA,MAAA,CACA88E,mBAAAA,EACAhvE,UAnHA,WACA,OAAA3B,GAmHAqB,MA5EA,WACA,OAAArB,EAAAvT,EAAAoH,OACA+J,GAAAgD,KA2EA+xB,QAAAA,EACA/xB,MAAAA,EACA8xB,KAAAA,EACAjnC,QAAA,CACAyuC,OArHA,WACA,IAAAm3C,EAAAnkF,EAAAuC,KAAA6O,kBAAAkE,EAAA1O,IAAAC,MAAA7G,EAAAuC,KAAA6O,kBACA,OAAA+yE,EACA7uE,EAAA2nB,aAAAknD,EAAA5oD,KAAA,WAAA4oD,EAAAzuE,SAAA,IAAAyuE,EAAAxoE,KAAA,IAAAwoE,EAAAhoD,cAAAh4B,EAAAi3B,EAAA16B,UAAA22B,KAAA/hB,GACAvT,MAAA,SAAAhH,GACA,GAAAA,GAAAA,EAAAsN,MAAAtN,EAAAmyC,UAAAnyC,EAAAkyC,SACA,MAAA,CACA1uC,QAAAxD,EAAAsN,KACA6sB,IAAAn6B,EAAAkyC,SACAm3C,QAAA9uE,EAAA/W,QAAAshC,QAAAz1B,EAAA7L,QAAAxD,EAAAsN,MAAA,MAIAjE,OAAA,SAAA6B,GAEAR,QAAAtG,MAAA,iDAAA8G,MAIA1G,EAAAoH,aAuGA6/C,IAAA,CAAA,aAAA,SAAA,UAAA,aAAA,aAAA,iBAAA,gBAAA,SAAA,UAAA,eAAA,gBAAA,aAAA,WAAA,aAAA,WAAA,aAAA,SAAA92C,EAAAjG,EAAAhK,EAAA4kF,EAAAzkF,EAAAstB,EAAAK,EACAttB,EAAAJ,EAAAytB,EAAA+wD,EAAA9E,EAAA16E,EAAAmB,EAAAoK,EAAAC,GAIAqF,EAAAisB,OAAAvxB,EACAsF,EAAA0C,SAAApS,EAAAuC,KACAmN,EAAA5C,SAAAzC,EAAA9H,KACAmN,EAAA40E,OAAArkF,EACAyP,EAAAoqE,WAAA,WACApqE,EAAAye,YAAAtuB,EAAAuC,OAAAC,UAGA,IAAAkiF,EAAA9kF,EAAAgW,SAAA0f,KAAA9a,QAAA,KACA3K,EAAAwpE,UAAA,IAAAqL,EAAA9kF,EAAAgW,SAAA0f,KAAA9gB,OAAA,EAAAkwE,GAAA9kF,EAAAgW,SAAA0f,KACA1vB,QAAAqB,MAAA,uBAAA4I,EAAAwpE,SAAA,MAIA,IAAA9uE,EAAAkH,WAAA,QAAAlH,EAAAkH,WAAA,UAAAlH,EAAAkH,WACA,WAAA7R,EAAAgW,SAAAC,UACAhG,EAAArQ,IAAA,qBAAA,SAAA0J,EAAA+B,EAAA44E,EAAAC,GACA,IAAA/uE,EAAA,QAAAlF,EAAAwpE,SAAA7kE,OAAA,GAAA5K,EAAA0rB,KAAArqB,EAAA44E,GACAt5E,EAAAo6E,eACA/+E,QAAAqB,MAAA,6CAAA8N,GAIAnV,EAAAgW,SAAA0f,KAAAvgB,KAOAhV,IAAAmC,MAAA,WAoDA,OAjDA9B,EAAAkiC,SAAA92B,SAGApL,EAAAkiC,SAAAsiD,0BAAA,GAIAziF,MAAAC,SAAAkhC,SACAljC,EAAAkiC,SAAAuiD,eAAA,IAKA,MAAA1iF,MAAAC,SAAAC,MAAAC,gBACAsD,QAAA+X,KAAA,6DAAAxb,MAAAC,SAAAC,MAAA,KACArC,EAAAs0B,YAAA,IAIAnT,OAAA2jE,WACAl/E,QAAAqB,MAAA,kCAIAyyE,EAAAh7E,QAAAyuC,SACAjrC,MAAA,SAAA6iF,GACAA,GAAAA,EAAAR,SACA3+E,QAAA+X,KAAA,mCAAA/c,OAAAmkF,EAAArmF,UACAmR,EAAAm1E,WAAAD,GAGAn/E,QAAA+X,KAAA,oDAAA/c,OAAA2J,EAAA7L,aAKA2uB,EAAA43D,0BAAA,SAAA/7E,GACA,OAAAwkB,EAAAw3D,WACAx3D,EAAAy3D,UAEAj8E,EAAAiyB,iBACAn7B,EAAAqzB,MAAAC,QAAA,oBACApxB,MAAA,SAAAoxB,GACAA,GACAnxB,MAAAC,SAAAgjF,gBAEA,KAGA1L,EAAAplE,cAMA,mBAAA7D,OAAAC,UAAAlT,aACAoI,QAAAqB,MAAA,wEACAwJ,OAAAC,UAAAlT,WAAA,SAAAI,EAAA6P,GACA,OAAA,IAAArS,KAAAof,QAAA5c,EAAA6P,KAKA,mBAAAgD,OAAAC,UAAA7L,KAAA,CACAe,QAAAqB,MAAA,kEAEA,IAAAo+E,EAAA,qCACA50E,OAAAC,UAAA7L,KAAA,WACA,OAAAzJ,KAAA+gC,QAAAkpD,EAAA,KAKA1oE,MAAA,mBAAAA,KAAAqT,QACApqB,QAAAqB,MAAA,uDACA0V,KAAAqT,MAAA,SAAA/yB,GACA,OAAAA,EAAA,IAAA88E,YAKA,mBAAAtpE,OAAAC,UAAA9P,SACAgF,QAAAqB,MAAA,oEACAwJ,OAAAC,UAAA9P,OAAA,WACA,IAAA0kF,EAAAC,UACA,OAAAnqF,KAAA+gC,QAAA,YAAA,SAAAqH,EAAAvmC,GACA,YAAA,IAAAqoF,EAAAroF,GAAAqoF,EAAAroF,GAAAumC","file":"../../dist_js/cesium-api.js","sourcesContent":["var App, nw;\n\nangular.module('cesium.desktop.services', ['cesium.device.services', 'cesium.settings.services'])\n\n .factory('csDesktop', ['$rootScope', 'Device', function($rootScope, Device) {\n 'ngInject';\n\n if (!Device.isDesktop()) return;\n\n console.info(\"Starting desktop mode...\");\n }]);\n","\n\nfunction Peer(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\nPeer.prototype.regexp = {\n BMA: /^BASIC_MERKLED_API[ ]?/,\n BMAS: /^BMAS[ ]?/,\n WS2P: /^WS2P[ ]?/,\n BMA_REGEXP: /^BASIC_MERKLED_API([ ]+([a-z_][a-z0-9-_.ğĞ]*))?([ ]+([0-9.]+))?([ ]+([0-9a-f:]+))?([ ]+([0-9]+))$/,\n BMAS_REGEXP: /^BMAS([ ]+([a-z_][a-z0-9-_.ğĞ]*))?([ ]+([0-9.]+))?([ ]+([0-9a-f:]+))?([ ]+([0-9]+))$/,\n WS2P_REGEXP: /^WS2P[ ]+([a-z0-9]+)([ ]+([a-z_][a-z0-9-_.ğĞ]*))?([ ]+([0-9.]+))?([ ]+([0-9a-f:]+))?([ ]+([0-9]+))([ ]+([a-z0-9/.&#!]+))?$/,\n LOCAL_IP_ADDRESS: /^127[.]0[.]0.|192[.]168[.]|10[.]0[.]0[.]|172[.]16[.]/\n};\nPeer.prototype.regex = Peer.prototype.regexp; // for backward compat\n\nPeer.prototype.keyID = function () {\n var bma = this.bma || this.getBMA();\n if (bma.useBma) {\n return [this.pubkey || \"Unknown\", bma.dns, bma.ipv4, bma.ipv6, bma.port, bma.useSsl, bma.path].join('-');\n }\n return [this.pubkey || \"Unknown\", bma.ws2pid, bma.path].join('-');\n};\n\nPeer.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\nPeer.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\nPeer.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\nPeer.prototype.getBMA = function() {\n if (this.bma) return this.bma;\n var bma = null;\n var bmaRegex = this.regexp.BMA_REGEXP;\n var bmasRegex = this.regexp.BMAS_REGEXP;\n this.endpoints.forEach(function(ep){\n var matches = !bma && bmaRegex.exec(ep);\n if (matches) {\n bma = {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": matches[8] == 443,\n \"useBma\": true\n };\n }\n matches = !bma && bmasRegex.exec(ep);\n if (matches) {\n bma = {\n \"dns\": matches[2] || '',\n \"ipv4\": matches[4] || '',\n \"ipv6\": matches[6] || '',\n \"port\": matches[8] || 80,\n \"useSsl\": true,\n \"useBma\": true\n };\n }\n });\n return bma || {};\n};\n\nPeer.prototype.getEndpoints = function(regex) {\n if (!regex) return this.endpoints;\n return this.endpoints.reduce(function(res, ep){\n return ep.match(regex) ? res.concat(ep) : res;\n }, []);\n};\n\nPeer.prototype.hasEndpoint = function(endpoint){\n //console.debug('testing if hasEndpoint:' + endpoint);\n var regExp = this.regexp[endpoint] || new RegExp('^' + endpoint);\n var endpoints = this.getEndpoints(regExp);\n if (!endpoints.length) return false;\n else return true;\n};\n\nPeer.prototype.getDns = function() {\n var bma = this.bma || this.getBMA();\n return bma.dns ? bma.dns : null;\n};\n\nPeer.prototype.getIPv4 = function() {\n var bma = this.bma || this.getBMA();\n return bma.ipv4 ? bma.ipv4 : null;\n};\n\nPeer.prototype.getIPv6 = function() {\n var bma = this.bma || this.getBMA();\n return bma.ipv6 ? bma.ipv6 : null;\n};\n\nPeer.prototype.getPort = function() {\n var bma = this.bma || this.getBMA();\n return bma.port ? bma.port : null;\n};\n\nPeer.prototype.getHost = function(getHost) {\n bma = getHost || this.bma || this.getBMA();\n return ((bma.port == 443 || bma.useSsl) && bma.dns) ? bma.dns :\n (this.hasValid4(bma) ? bma.ipv4 :\n (bma.dns ? bma.dns :\n (bma.ipv6 ? '[' + bma.ipv6 + ']' :'')));\n};\n\nPeer.prototype.getURL = function(bma) {\n bma = bma || this.bma || this.getBMA();\n var host = this.getHost(bma);\n var protocol = (bma.port == 443 || bma.useSsl) ? 'https' : 'http';\n return protocol + '://' + host + (bma.port ? (':' + bma.port) : '');\n};\n\nPeer.prototype.getServer = function(bma) {\n bma = bma || this.bma || this.getBMA();\n var host = this.getHost(bma);\n return host + (host && bma.port ? (':' + bma.port) : '');\n};\n\nPeer.prototype.hasValid4 = function(bma) {\n return bma.ipv4 &&\n /* exclude private address - see https://fr.wikipedia.org/wiki/Adresse_IP */\n !bma.ipv4.match(this.regexp.LOCAL_IP_ADDRESS) ?\n true : false;\n};\n\nPeer.prototype.isReachable = function () {\n return !!this.getServer();\n};\n\nPeer.prototype.isSsl = function() {\n var bma = this.bma || this.getBMA();\n return bma.useSsl;\n};\n\nPeer.prototype.isTor = function() {\n var bma = this.bma || this.getBMA();\n return bma.useTor;\n};\n\nPeer.prototype.isWs2p = function() {\n var bma = this.bma || this.getBMA();\n return bma.useWs2p;\n};\n\nPeer.prototype.isBma = function() {\n var bma = this.bma || this.getBMA();\n return !bma.useWs2p && !bma.useTor;\n};\n\nPeer.prototype.hasBma = function() {\n return this.hasEndpoint('(BASIC_MERKLE_API|BMAS|BMATOR)');\n};\n","/**\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\", \"unitbase\"]\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 that.id = [that.number, that.hash].join('-');\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= 1) {\n var prefix = parts[0];\n\n // Private/public options\n if (prefix.length > 4) {\n var matches = this.regexp.WS2P_PREFIX.exec(prefix);\n if (!matches) {\n throw Error('Invalid format: ' + message);\n }\n\n // Private options\n var privateOptions = matches[1];\n if (privateOptions) {\n that.private = {\n useTor: privateOptions.startsWith('T')\n };\n var mode = privateOptions.substring(1);\n if (mode == 'A') {\n that.private.mode = 'all';\n }\n else if (mode == 'M') {\n that.private.mode = 'mixed';\n }\n else if (mode == 'S') {\n that.private.mode = 'strict';\n }\n }\n\n // Public options\n var publicOptions = matches[2];\n if (publicOptions) {\n that.public = {\n useTor: publicOptions.startsWith('T'),\n mode: 'all'\n };\n }\n\n // For DEBUG only:\n /*\n console.log('[http] private {0}, public {1}'.format(\n (that.private && (that.private.useTor ? 'TOR ' : '' ) + (that.private.mode || 'false')) || 'false',\n that.public && ((that.public.useTor ? 'TOR ' : '' ) + (that.public.mode || 'false')) || 'false'\n ), prefix);*/\n }\n\n that.pubkey=parts[3];\n that.buid=parts[4];\n that.ws2pid=parts[5];\n that.software=parts[6];\n that.version=parts[7];\n that.powPrefix=parts[8];\n }\n }\n }\n\n}\n\n\nWs2pMessage.prototype.regexp = {\n WS2P_PREFIX: /^WS2P(?:O([CT][SAM]))?(?:I([CT]))?$/,\n};\n\n\n","\nLoginController.$inject = ['$scope', '$timeout', '$controller', 'csWallet'];\nLoginModalController.$inject = ['$scope', '$timeout', '$q', '$ionicPopover', '$window', 'CryptoUtils', 'csCrypto', 'ionicReady', 'UIUtils', 'BMA', 'Modals', 'csSettings', 'Device', 'parameters'];\nAuthController.$inject = ['$scope', '$controller'];\nangular.module('cesium.login.controllers', ['cesium.services'])\n\n .config(['$stateProvider', function($stateProvider) {\n 'ngInject';\n\n $stateProvider\n .state('app.login', {\n url: \"/login\",\n views: {\n 'menuContent': {\n templateUrl: \"templates/home/home.html\",\n controller: 'LoginCtrl'\n }\n }\n })\n ;\n }])\n\n .controller('LoginCtrl', LoginController)\n\n .controller('LoginModalCtrl', LoginModalController)\n\n .controller('AuthCtrl', AuthController)\n\n;\n\n\nfunction LoginController($scope, $timeout, $controller, csWallet) {\n 'ngInject';\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('HomeCtrl', {$scope: $scope}));\n\n $scope.showLoginModal = function() {\n if ($scope.loading) return $timeout($scope.showLoginModal, 500); // recursive call\n\n if (!csWallet.isLogin() && !$scope.error) {\n return $timeout(csWallet.login, 300);\n }\n };\n $scope.$on('$ionicView.enter', $scope.showLoginModal);\n\n}\n\nfunction LoginModalController($scope, $timeout, $q, $ionicPopover, $window, CryptoUtils, csCrypto, ionicReady,\n UIUtils, BMA, Modals, csSettings, Device, parameters) {\n 'ngInject';\n\n parameters = parameters || {};\n\n $scope.computing = false;\n $scope.pubkey = null;\n $scope.formData = {};\n $scope.showPubkey = false;\n $scope.showComputePubkeyButton = false;\n $scope.autoComputePubkey = false;\n $scope.pubkeyPattern = '^(:?{0}|{1})$'.format(BMA.constants.regexp.PUBKEY, BMA.constants.regexp.PUBKEY_WITH_CHECKSUM);\n\n $scope.isAuth = parameters.auth;\n $scope.okText = parameters.okText;\n $scope.title = parameters.title || ($scope.isAuth ? 'AUTH.TITLE' : 'LOGIN.TITLE');\n $scope.showMethods = angular.isDefined(parameters.showMethods) ? parameters.showMethods : true;\n $scope.showNewAccountLink = angular.isDefined(parameters.showNewAccountLink) ? parameters.showNewAccountLink : true;\n $scope.expectedPubkey = parameters.expectedPubkey;\n $scope.expectedUid = parameters.uid;\n\n $scope.scryptParamsValues = _.keys(CryptoUtils.constants.SCRYPT_PARAMS)\n .reduce(function(res, key) {\n return res.concat({id: key, label: 'LOGIN.SCRYPT.' + key, params: CryptoUtils.constants.SCRYPT_PARAMS[key]});\n }, [{id: 'USER', label: 'LOGIN.SCRYPT.USER', params: {}}]);\n\n // modal init\n $scope.init = function() {\n\n ionicReady().then(function(){\n // Should auto-compute pubkey ?\n $scope.autoComputePubkey = ionic.Platform.grade.toLowerCase()==='a' &&\n !UIUtils.screen.isSmall();\n });\n\n // Init remember me\n $scope.formData.rememberMe = csSettings.data.rememberMe;\n\n // Init keep auth, from idle time\n $scope.formData.keepAuthIdle = csSettings.data.keepAuthIdle;\n $scope.formData.keepAuth = ($scope.formData.keepAuthIdle == csSettings.constants.KEEP_AUTH_IDLE_SESSION);\n\n // Init method\n var method = parameters.method || csSettings.data.login && csSettings.data.login.method || 'SCRYPT_DEFAULT';\n var params = csSettings.data.login && csSettings.data.login.params;\n // used default method, when PUBKEY + auth, or SCAN, or if ask for 'default'\n if (($scope.isAuth && method === 'PUBKEY') || (method === 'SCAN') || (method === 'default')) {\n method = 'SCRYPT_DEFAULT';\n }\n $scope.changeMethod(method, params);\n };\n\n // modal enter\n $scope.enter = function() {\n UIUtils.loading.hide();\n // Ink effect\n UIUtils.ink({selector: '.modal-login .ink'});\n };\n $scope.$on('modal.shown', $scope.enter);\n\n // modal leave\n $scope.leave = function() {\n $scope.formData = {};\n $scope.computing = false;\n $scope.pubkey = null;\n $scope.methods = [];\n };\n $scope.$on('modal.hide', $scope.leave);\n\n // Login form submit\n $scope.doLogin = function(skipForm) {\n var method = $scope.formData.method;\n\n if(!$scope.form.$valid && method !== 'SCAN') return;\n\n var keepAuthIdle = $scope.formData.keepAuthIdle;\n var promise;\n\n // Scrypt\n if (method === 'SCRYPT_DEFAULT' || method === 'SCRYPT_ADVANCED') {\n if (!$scope.formData.username || !$scope.formData.password) return;\n var scryptPrams = $scope.formData.scrypt && $scope.formData.scrypt.params;\n UIUtils.loading.show();\n promise = CryptoUtils.scryptKeypair($scope.formData.username, $scope.formData.password, scryptPrams)\n .then(function(keypair) {\n if (!keypair) return UIUtils.loading.hide(10);\n var pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n // Check pubkey\n if (parameters.expectedPubkey && parameters.expectedPubkey != pubkey) {\n $scope.pubkey = pubkey;\n $scope.showPubkey = true;\n $scope.pubkeyError = true;\n return UIUtils.loading.hide(10);\n }\n\n $scope.pubkeyError = false;\n\n return {\n pubkey: pubkey,\n keypair: keypair,\n params: ($scope.formData.scrypt && $scope.formData.scrypt.id != 'SCRYPT_DEFAULT') ? scryptPrams : undefined\n };\n })\n .catch(UIUtils.onError('ERROR.CRYPTO_UNKNOWN_ERROR'));\n }\n\n // File\n else if (method === 'FILE') {\n if (!$scope.formData.file || !$scope.formData.file.valid || !$scope.formData.file.pubkey) return;\n\n // If checkbox keep auth checked: set idle time to session\n keepAuthIdle = ($scope.formData.keepAuth && csSettings.constants.KEEP_AUTH_IDLE_SESSION) || keepAuthIdle;\n\n promise =\n UIUtils.loading.show()\n .then(function() {\n return $scope.readKeyFile($scope.formData.file, {\n withSecret: ($scope.isAuth || $scope.formData.keepAuth)\n });\n })\n .then(function(keypair) {\n if (!keypair) return UIUtils.loading.hide(10);\n var pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n\n // Check pubkey\n if (parameters.expectedPubkey && parameters.expectedPubkey != pubkey) {\n $scope.formData.file.valid = false;\n return UIUtils.loading.hide(10);\n }\n\n $scope.pubkeyError = false;\n\n return {\n pubkey: pubkey,\n keypair: keypair\n };\n })\n .catch(UIUtils.onError('ERROR.AUTH_FILE_ERROR'));\n }\n\n // Pubkey\n else if (method === 'PUBKEY') {\n var pubkey = $scope.formData.pubkey && $scope.formData.pubkey.trim();\n var uid = $scope.formData.uid && $scope.formData.uid.trim() || undefined;\n if (!pubkey) return;\n var matches = BMA.regexp.PUBKEY.exec(pubkey);\n // valid pubkey: use it\n if (matches) {\n promise = UIUtils.loading.show()\n .then(function() {\n return {\n pubkey: pubkey,\n uid : uid\n };\n });\n }\n\n // Check checksum\n else {\n\n matches = BMA.regexp.PUBKEY_WITH_CHECKSUM.exec(pubkey);\n if (matches) {\n\n pubkey = matches[1];\n var checksum = matches[2];\n var expectedChecksum = csCrypto.util.pkChecksum(pubkey);\n if (checksum != expectedChecksum) {\n $scope.form.pubkey.$error = {checksum: true};\n }\n else {\n promise = UIUtils.loading.show()\n .then(function() {\n return {\n pubkey: pubkey,\n uid : uid\n };\n });\n }\n }\n // Not a pubkey: launch search on\n else {\n return $scope.showWotLookupModal(pubkey);\n }\n }\n }\n\n // Scan QR code\n else if (method === 'SCAN') {\n var valid = $scope.formData.pubkey && (!$scope.isAuth || !!$scope.formData.keypair);\n if (!valid) return;\n\n promise = UIUtils.loading.show()\n .then(function() {\n return {\n pubkey: $scope.formData.pubkey,\n keypair: $scope.formData.keypair\n };\n });\n }\n\n if (!promise) {\n console.warn('[login] unknown method: ', method);\n return;\n }\n\n return promise.then(function(res) {\n if (!res) return;\n\n // Update settings (if need)\n var rememberMeChanged = !angular.equals(csSettings.data.rememberMe, $scope.formData.rememberMe);\n var keepAuthIdleChanged = !angular.equals(csSettings.data.keepAuthIdle, keepAuthIdle);\n var methodChanged = !angular.equals(csSettings.data.login && csSettings.data.login.method, method);\n var paramsChanged = !angular.equals(csSettings.data.login && csSettings.data.login.params, res.params);\n if (rememberMeChanged || keepAuthIdleChanged || methodChanged || paramsChanged) {\n csSettings.data.rememberMe = $scope.formData.rememberMe;\n csSettings.data.keepAuthIdle = keepAuthIdle;\n csSettings.data.useLocalStorage = csSettings.data.rememberMe ? true : csSettings.data.useLocalStorage;\n csSettings.data.login = csSettings.data.login || {};\n csSettings.data.login.method = method;\n csSettings.data.login.params = res.params;\n $timeout(csSettings.store, 500);\n }\n\n if (parameters.success) {\n parameters.success($scope.formData);\n }\n\n // hide loading\n if (parameters.silent) {\n UIUtils.loading.hide();\n }\n\n // Return result then close\n return $scope.closeModal(res);\n });\n };\n\n $scope.onScryptFormChanged = function() {\n if ($scope.computing) return; // avoid multiple call\n $scope.pubkey = null;\n $scope.pubkeyError = false;\n $scope.showPubkey = !!$scope.formData.username && !!$scope.formData.password;\n if ($scope.autoComputePubkey && $scope.showPubkey) {\n $scope.computePubkey();\n $scope.showComputePubkeyButton = false;\n }\n else {\n $scope.showComputePubkeyButton = !$scope.autoComputePubkey && $scope.showPubkey;\n }\n };\n $scope.$watch('formData.username + formData.password', $scope.onScryptFormChanged, true);\n\n $scope.computePubkey = function() {\n $scope.showComputePubkeyButton = false;\n $scope.computing = true;\n $scope.pubkey = null;\n return $timeout(function() {\n var salt = $scope.formData.username;\n var pwd = $scope.formData.password;\n var scryptPrams = $scope.formData.scrypt && $scope.formData.scrypt.params;\n return CryptoUtils.scryptSignPk(salt, pwd, scryptPrams)\n .then(function (signPk) {\n\n // If model has changed before the response, then retry\n if (salt !== $scope.formData.username || pwd !== $scope.formData.password) {\n return $scope.computePubkey();\n }\n\n $scope.pubkey = CryptoUtils.util.encode_base58(signPk);\n if ($scope.expectedPubkey && $scope.expectedPubkey != $scope.pubkey) {\n $scope.pubkeyError = true;\n }\n\n $scope.computing = false;\n }\n )\n .catch(function (err) {\n UIUtils.onError('ERROR.CRYPTO_UNKNOWN_ERROR')(err);\n $scope.computing = false;\n $scope.autoComputePubkey = false; // Avoid a infinite loop (computePubkey -> onScryptFormChanged -> computePubkey)\n $scope.onScryptFormChanged();\n });\n }, 100);\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 $scope.showHelpModal = function(parameters) {\n return Modals.showHelp(parameters);\n };\n\n $scope.doScan = function() {\n if ($scope.computing) return;\n\n $scope.computing = true;\n $scope.formData.pubkey = null;\n $scope.formData.keypair = null;\n\n // Run scan cordova plugin, on device\n return Device.barcode.scan()\n .then(function(data) {\n if (!data) return;\n\n // Skip simple parsing, if auth if need\n if ($scope.isAuth) return $q.when(data);\n\n // Try to parse as an URI\n return BMA.uri.parse(data)\n .then(function (res) {\n if (!res || !res.pubkey) throw {message: 'ERROR.SCAN_UNKNOWN_FORMAT'};\n // If simple pubkey\n return res;\n })\n .catch(function(err) {\n console.debug('[login] Error while parsing as URI: ' + (err && err.message || err));\n return data;\n });\n })\n .then(function(data) {\n if (!data) return;\n // Parse success: continue\n if (data && data.pubkey) return data;\n\n // Try to read as WIF format\n return csCrypto.keyfile.parseData(data, {silent: true})\n .then(function(keypair) {\n if (!keypair || !keypair.signPk || !keypair.signSk) throw {message: 'ERROR.SCAN_UNKNOWN_FORMAT'}; // rethrow an error\n\n var pubkey = CryptoUtils.base58.encode(keypair.signPk);\n\n // Login using keypair\n return {\n pubkey: pubkey,\n keypair: keypair\n };\n })\n // Unknown format (nor URI, nor WIF/EWIF)\n .catch(UIUtils.onError('ERROR.SCAN_UNKNOWN_FORMAT'));\n })\n .then(function(res) {\n if (!res || !res.pubkey) return; // no data\n\n $scope.pubkeyError = $scope.expectedPubkey && $scope.expectedPubkey != res.pubkey;\n $scope.formData.pubkey = res.pubkey;\n $scope.formData.keypair = res.keypair;\n })\n .then(function() {\n $scope.computing = false;\n UIUtils.loading.hide(10);\n })\n .catch(function(err) {\n $scope.computing = false;\n UIUtils.onError('ERROR.SCAN_FAILED')(err);\n });\n };\n\n $scope.changeMethod = function(method, params){\n $scope.hideMethodsPopover();\n\n if (!method || method == $scope.formData.method) return; // same method\n\n console.debug(\"[login] method is: \" + method);\n $scope.formData.method = method;\n $scope.formData.uid = null;\n\n if ($scope.form) {\n // hide form's fields errors on the form\n delete $scope.form.$submitted;\n }\n\n // Scrypt (advanced or not)\n if (method == 'SCRYPT_DEFAULT' || method == 'SCRYPT_ADVANCED') {\n $scope.pubkey = null;\n\n\n // Search scrypt object\n var scrypt;\n if (params) {\n scrypt = _.find($scope.scryptParamsValues, function(item){\n return item.params && angular.equals(item.params, params);\n });\n if (!scrypt) {\n scrypt = _.findWhere($scope.scryptParamsValues, {id: 'USER'}) || {};\n scrypt.params = params;\n }\n }\n else {\n scrypt = _.findWhere($scope.scryptParamsValues, {id: 'DEFAULT'});\n }\n $scope.changeScrypt(scrypt);\n\n $scope.autoComputePubkey = $scope.autoComputePubkey && (method == 'SCRYPT_DEFAULT');\n }\n else if (method == 'SCAN') {\n return $scope.doScan();\n }\n else {\n $scope.formData.username = null;\n $scope.formData.password = null;\n $scope.formData.pubkey = null;\n $scope.pubkey = null;\n $scope.computing = false;\n }\n };\n\n $scope.changeScrypt = function(scrypt) {\n // Protect params against changes\n $scope.formData.scrypt = angular.copy(scrypt||{});\n $scope.onScryptFormChanged();\n };\n\n $scope.readKeyFile = function(file, options) {\n options = options || {};\n\n options.password = options.password || $scope.formData.file.password || function() {\n $scope.formData.file.password = undefined;\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: $scope\n })\n .then(function (password) {\n // Remember password (for validation)\n $scope.formData.file.password = password;\n // Timeout is need to force popup to be hide\n return $timeout(function() {\n return password;\n }, 150);\n });\n };\n\n return csCrypto.keyfile.read($scope.formData.file, options)\n .catch(function(err) {\n $scope.formData.file.password = undefined;\n if (err === 'CANCELLED') {\n UIUtils.loading.hide(10);\n }\n if (err && err.ucode == csCrypto.errorCodes.BAD_PASSWORD) {\n // Recursive call\n return $scope.readKeyFile($scope.formData.file, {withSecret: options.withSecret, error: 'ACCOUNT.SECURITY.KEYFILE.ERROR.BAD_PASSWORD'});\n }\n throw err;\n });\n };\n\n $scope.onFileChanged = function(file) {\n if (!file || !file.fileData) {\n $scope.validatingFile = false;\n return; // Skip\n }\n $scope.formData.file = {\n name: file.fileData.name,\n size: file.fileData.size,\n content: file.fileContent\n };\n $scope.validatingFile = true;\n $timeout(function() {\n console.debug(\"[login] key file changed: \", $scope.formData.file);\n $scope.validatingFile = true;\n\n return $scope.readKeyFile($scope.formData.file, {withSecret: false, password: $scope.formData.file.password})\n .then(function(keypair) {\n if (!keypair || !keypair.signPk) {\n $scope.formData.file.valid = false;\n $scope.formData.file.pubkey = undefined;\n }\n else {\n $scope.formData.file.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);\n $scope.formData.file.valid = !$scope.expectedPubkey || $scope.expectedPubkey == $scope.formData.file.pubkey;\n $scope.validatingFile = false;\n }\n\n })\n .catch(function(err) {\n if (err && err === 'CANCELLED') {\n $scope.removeKeyFile();\n return;\n }\n $scope.validatingFile = false;\n $scope.formData.file.valid = false;\n $scope.formData.file.pubkey = undefined;\n UIUtils.onError('ERROR.AUTH_FILE_ERROR')(err);\n });\n });\n };\n\n $scope.removeKeyFile = function() {\n $scope.formData.file = undefined;\n };\n\n /* -- modals -- */\n\n $scope.showWotLookupModal = function(searchText) {\n return Modals.showWotLookup({q: searchText})\n .then(function(res){\n if (res && res.pubkey) {\n $scope.formData.pubkey = res.pubkey;\n $scope.formData.uid = res.uid || undefined;\n return $timeout($scope.doLogin, 300);\n }\n });\n };\n\n /* -- popover -- */\n $scope.showMethodsPopover = function(event) {\n if (event.defaultPrevented) return;\n UIUtils.popover.show(event, {\n templateUrl :'templates/login/popover_methods.html',\n scope: $scope,\n autoremove: true,\n afterShow: function(popover) {\n $scope.methodsPopover = popover;\n UIUtils.ink({selector: '.popover-login-methods .item'});\n }\n });\n };\n\n $scope.hideMethodsPopover = function() {\n if ($scope.methodsPopover) {\n $scope.methodsPopover.hide();\n $scope.methodsPopover = null;\n }\n };\n\n // Default action\n $scope.init();\n\n\n // TODO : for DEV only\n /*$timeout(function() {\n $scope.formData = {\n username: 'benoit.lavenier@e-is.pro',\n password: ''\n };\n //$scope.form = {$valid:true};\n }, 900);*/\n}\n\n\nfunction AuthController($scope, $controller){\n\n // Initialize the super class and extend it.\n angular.extend(this, $controller('LoginModalCtrl', {$scope: $scope, parameters: {auth: true}}));\n\n $scope.setForm = function(form) {\n $scope.form = form;\n };\n\n}\n","\nHelpController.$inject = ['$scope', '$state', '$timeout', '$anchorScroll', 'csSettings'];\nHelpModalController.$inject = ['$scope', '$timeout', '$anchorScroll', 'csSettings', 'parameters'];\nHelpTipController.$inject = ['$scope', '$state', '$window', '$ionicSideMenuDelegate', '$timeout', '$q', '$anchorScroll', 'UIUtils', 'csConfig', 'csSettings', 'csCurrency', 'csHelpConstants', '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 $scope.anchor = $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.itemsClass = {};\n $scope.locale = csSettings.data.locale.id;\n\n parameters = parameters || {};\n if (parameters && typeof parameters == \"string\") {\n parameters = {anchor: parameters};\n }\n\n if (parameters.anchor) {\n\n $timeout(function() {\n $anchorScroll(parameters.anchor);\n }, 100);\n\n // Change CSS classes\n $scope.itemsClass = {};\n $scope.itemsClass[parameters.anchor] = 'selected';\n $scope.listClass = 'selection';\n }\n\n}\n\n\n/* ----------------------------\n* Help Tip\n* ---------------------------- */\nfunction HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $timeout, $q, $anchorScroll,\n UIUtils, csConfig, csSettings, csCurrency, csHelpConstants, 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 // Wallet (if NOT login)\n return $scope.startWalletNoLoginTour(0, true)\n\n // Wallet (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\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 // My operations (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 // My wallets (if login)\n .then(function(next){\n if (!next) return false;\n if (!csWallet.isLogin()) return true; // not login: continue\n return $scope.startWalletsTour(0, true)\n .then(function(endIndex){\n if (!endIndex) return false;\n csSettings.data.helptip.wallets=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 // Wot lookup tour\n .then(function(next){\n if (!next) return false;\n return $scope.startWotLookupTour(0, true)\n .then(function(endIndex){\n if (!endIndex || $scope.cancelled) return false;\n csSettings.data.helptip.wotLookup=endIndex;\n csSettings.store();\n return $scope.continue;\n });\n })\n\n // Wot identity\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\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 // Currency tour\n .then(function(next){\n if (!next) return false;\n\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\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\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: UIUtils.screen.isSmall() ? 'left' : 'bottom-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_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 // $anchorScroll('helptip-currency-change-unit');\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' : undefined\n // }\n // }\n // });\n // },\n //\n // function () {\n // if (csSettings.data.useRelative) return true; //skip but continue\n // $anchorScroll('helptip-currency-change-unit');\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' : undefined\n // }\n // }\n // });\n // },\n\n function () {\n $anchorScroll('helptip-currency-rules-anchor');\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 $anchorScroll('helptip-currency-newcomers-anchor');\n return $scope.showHelpTip('helptip-currency-newcomers', {\n bindings: {\n content: 'HELP.TIP.CURRENCY_WOT',\n icon: {\n position: 'center'\n },\n hasNext: hasNext\n },\n timeout: 1200, // need for Firefox\n retry: 2\n });\n }\n ];\n\n // Get currency parameters, with currentUD\n return csCurrency.get().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: UIUtils.screen.isSmall() ? 'left' : 'bottom-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.parameters().then(function(parameters) {\n contentParams = parameters;\n // Launch steps\n return $scope.executeStep('network', steps, startIndex);\n });\n };\n\n /**\n * Features tour on WOT lookup\n * @returns {*}\n */\n $scope.startWotLookupTour = function(startIndex, hasNext) {\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: UIUtils.screen.isSmall() ? 'left' : 'bottom-left'\n }\n },\n onError: 'continue'\n });\n },\n\n function() {\n if ($ionicSideMenuDelegate.isOpen()) {\n $ionicSideMenuDelegate.toggleLeft(false);\n }\n return $state.go(UIUtils.screen.isSmall() ? 'app.wot_lookup.tab_search' : 'app.wot_lookup_lg')\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 hasNext: hasNext\n },\n timeout: 2500\n });\n }\n ];\n\n // Launch steps\n return $scope.executeStep('wotLookup', steps, startIndex);\n };\n\n /**\n * Features tour on WOT identity\n * @returns {*}\n */\n $scope.startWotTour = function(startIndex, hasNext) {\n var contentParams;\n\n var steps = [\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.get().then(function(currency) {\n contentParams = currency.parameters;\n contentParams.currentUD = currency.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.wot_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: 'HELP.TIP.MENU_BTN_ACCOUNT',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n }\n });\n },\n\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-tx', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_TX',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n }\n });\n },\n\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-wallets', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_WALLETS',\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 hasCertificationsItem = csWallet.data.isMember||(csWallet.data.requirements && csWallet.data.requirements.pendingMembership);\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: csWallet.data.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 timeout: UIUtils.screen.isSmall() ? 2000 : 1000,\n retry: 10\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: 'center'\n },\n hasNext: !hasCertificationsItem && hasNext\n },\n timeout: UIUtils.screen.isSmall() ? 2000 : 500,\n retry: 10\n });\n },\n\n function () {\n if (!hasCertificationsItem) return hasNext;\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 hasNext: hasNext\n },\n timeout: 500,\n onError: 'continue' // if simple wallet: no certification item, so continue\n });\n }\n ];\n\n // Check that constants are well configured\n if (steps.length != csHelpConstants.wallet.stepCount) {\n console.error(\"[help] Invalid value of 'csHelpConstants.wallet.stepCount'. Please update to {0}\".format(steps.length));\n }\n\n // Get currency parameters, with currentUD\n return csCurrency.get()\n .then(function(currency) {\n contentParams = currency.parameters;\n contentParams.currentUD = currency.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.parameters().then(function(parameters) {\n contentParams = 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: '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.get()\n .then(function(currency) {\n contentParams = currency.parameters;\n contentParams.currentUD = currency.currentUD;\n // Launch steps\n return $scope.executeStep('tx', steps, startIndex);\n });\n };\n\n /**\n * Features tour on My wallets\n * @returns {*}\n */\n $scope.startWalletsTour = function(startIndex, hasNext) {\n\n var steps = [\n function () {\n $ionicSideMenuDelegate.toggleLeft(true);\n return $scope.showHelpTip('helptip-menu-btn-wallets', {\n bindings: {\n content: 'HELP.TIP.MENU_BTN_WALLETS',\n icon: {\n position: 'left'\n },\n hasNext: hasNext\n }\n });\n }\n ];\n\n return $scope.executeStep('my-wallets', steps, startIndex);\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\n // If home; add offset because of locales button\n var iconStyle = $state.is('app.home') ? 'margin-right: 60px' : undefined;\n\n return $scope.showHelpTip(element, {\n bindings: {\n content: 'HELP.TIP.HEADER_BAR_BTN_PROFILE',\n icon: {\n position: 'right',\n style: iconStyle\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: UIUtils.screen.isSmall() ? {\n position: 'right',\n style: 'margin-right: 60px'\n } : {position: 'center'},\n hasNext: hasNext\n },\n timeout: 1000\n });\n });\n }\n ];\n\n return csCurrency.parameters()\n .then(function(parameters) {\n contentParams = 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-pubkey', {\n bindings: {\n content: 'HELP.TIP.END_LOGIN',\n hasNext: false\n },\n timeout: 1200\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.parameters()\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","\nangular.module('cesium.platform', ['ngIdle', '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 .config(['$compileProvider', 'csConfig', function($compileProvider, csConfig) {\n 'ngInject';\n\n $compileProvider.debugInfoEnabled(csConfig.debug === true);\n\n // Fix issue #893\n // See https://stackoverflow.com/questions/31859257/firefox-addon-using-angularjs-ng-src-not-working\n $compileProvider.imgSrcSanitizationWhitelist(/^\\s*(filesystem:resource|resource|moz-extension|chrome-extension|file):/);\n }])\n\n .config(['$animateProvider', function($animateProvider) {\n 'ngInject';\n\n $animateProvider.classNameFilter( /\\banimate-/ );\n }])\n\n // Configure cache (used by HTTP requests) default options\n .config(['CacheFactoryProvider', 'csConfig', function (CacheFactoryProvider, csConfig) {\n 'ngInject';\n\n angular.extend(CacheFactoryProvider.defaults, {\n // Fixed options:\n recycleFreq: 60 * 1000, // Scan expired items every 1min\n storagePrefix: 'caches.', // Override storage key prefix\n capacity: 100, // Force to use a LRU cache, to avoid size exceed max\n\n // Options overwritten by the csCache service:\n maxAge: csConfig.cacheTimeMs || 60 * 1000, // from config if exists, or 1min\n storageMode: 'memory' // Do NOT use local Storage by default\n });\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)) {\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.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","\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'},\n {id:'en-GB', label:'English (UK)', flag: 'gb'},\n {id:'eo-EO', label:'Esperanto', flag: 'eo'},\n {id:'fr-FR', label:'Français', flag: 'fr'},\n {id:'nl-NL', label:'Nederlands', flag: 'nl'},\n {id:'es-ES', label:'Spanish', flag: 'es'},\n {id:'it-IT', label:'Italiano', flag: 'it'}\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: 'settings', // for version >= v1.1.0\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.1.0',\n newIssueUrl: \"https://git.duniter.org/clients/cesium-grp/cesium/issues/new\",\n userForumUrl: \"https://forum.monnaie-libre.fr\",\n latestReleaseUrl: \"https://api.github.com/repos/duniter/cesium/releases/latest\",\n duniterLatestReleaseUrl: \"https://api.github.com/repos/duniter/duniter/releases/latest\",\n httpsMode: false\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 expertMode: false,\n decimalCount: 4,\n uiEffects: true,\n blockValidityWindow: 6,\n helptip: {\n enable: true,\n installDocUrl: \"https://duniter.org/en/wiki/duniter/install/\",\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 },\n locale: {\n id: fixLocaleWithLog(csConfig.defaultLanguage || $translate.use()) // use config locale if set, or browser default\n },\n license: {\n \"en\": \"license/license_g1-en\",\n \"fr-FR\": \"license/license_g1-fr-FR\",\n \"es-ES\": \"license/license_g1-es-ES\"\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 // 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 getLicenseUrl = function() {\n var locale = data.locale && data.locale.id || csConfig.defaultLanguage || 'en';\n return (csConfig.license) ?\n (csConfig.license[locale] ? csConfig.license[locale] : defaultSettings.license[csConfig.defaultLanguage || 'en'] || csConfig.license) : undefined;\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 getLicenseUrl: getLicenseUrl,\n getFeedUrl: getFeedUrl,\n defaultSettings: defaultSettings,\n // api extension\n api: api,\n locales: locales,\n constants: constants\n };\n}]);\n","\nangular.module('cesium.network.services', ['ngApi', 'cesium.currency.services', 'cesium.http.services'])\n\n.factory('csNetwork', ['$rootScope', '$q', '$interval', '$timeout', '$window', 'csConfig', 'BMA', 'csHttp', 'csCurrency', 'Api', function($rootScope, $q, $interval, $timeout, $window, csConfig, BMA, csHttp, csCurrency, Api) {\n 'ngInject';\n\n var\n interval,\n constants = {\n UNKNOWN_BUID: -1,\n MAX_BLOCK_OFFSET: 1000\n },\n isHttpsMode = $window.location.protocol === 'https:',\n api = new Api(this, \"csNetwork\"),\n\n data = {\n bma: null,\n listeners: [],\n loading: true,\n peers: [],\n filter: {\n member: true,\n mirror: true,\n endpoint: null,\n online: false,\n bma: false,\n ssl: undefined,\n tor: undefined\n },\n sort:{\n type: null,\n asc: true,\n compact: true\n },\n groupBy: 'pubkey',\n expertMode: false,\n knownBlocks: [],\n mainBlock: null,\n minOnlineBlockNumber: 0,\n uidsByPubkeys: null,\n searchingPeersOnNetwork: false,\n difficulties: null,\n ws2pHeads: null,\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.bma = null;\n data.listeners = [];\n data.peers.splice(0);\n data.filter = {\n member: true,\n mirror: true,\n endpoint: null,\n online: true,\n bma: false,\n ssl: undefined,\n tor: undefined\n };\n data.sort = {\n type: null,\n asc: true\n };\n data.groupBy = 'pubkey';\n data.expertMode = false;\n data.memberPeersCount = 0;\n data.knownBlocks = [];\n data.mainBlock = null;\n data.minOnlineBlockNumber = 0;\n data.uidsByPubkeys = {};\n data.loading = true;\n data.searchingPeersOnNetwork = false;\n data.difficulties = null;\n data.ws2pHeads = null;\n data.timeout = csConfig.timeout;\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 // Load WS2P heads\n loadW2spHeads = function() {\n return data.bma.network.ws2p.heads()\n .then(function (res) {\n data.ws2pHeads = res.heads ? res.heads.reduce(function (res, hit) {\n if (hit.message && hit.sig) {\n try {\n var head = new Ws2pMessage(hit.message);\n res[[head.pubkey, head.ws2pid].join('-')] = head;\n }\n catch(err) {\n // just log, then ignore\n console.error('[network] Ignoring WS2P head.', err && err.message || err);\n }\n }\n return res;\n }, {}) : {};\n })\n .catch(function(err) {\n // When too many request, retry in 3s\n if (err && err.ucode == BMA.errorCodes.HTTP_LIMITATION) {\n return $timeout(function() {\n return loadW2spHeads();\n }, 3000);\n }\n console.error(err); // can occur on duniter v1.6\n data.ws2pHeads = {};\n });\n },\n\n // Load personal difficulties\n loadDifficulties = function() {\n return data.bma.blockchain.stats.difficulties()\n .then(function (res) {\n data.difficulties = res.levels ? res.levels.reduce(function (res, hit) {\n if (hit.uid && hit.level) res[hit.uid] = hit.level;\n return res;\n }, {}) : {};\n })\n .catch(function(err) {\n // When too many request, retry in 3s\n if (err && err.ucode == BMA.errorCodes.HTTP_LIMITATION) {\n return $timeout(function() {\n return loadDifficulties();\n }, 3000);\n }\n console.error(err);\n data.difficulties = {};\n });\n },\n\n loadPeers = function() {\n data.peers = [];\n data.searchingPeersOnNetwork = true;\n data.loading = true;\n data.bma = data.bma || BMA;\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 var initJobs = [\n // Load uids\n data.bma.wot.member.uids()\n .then(function(uids) {\n data.uidsByPubkeys = uids;\n })\n .catch(function(err) {\n console.error(err);\n data.uidsByPubkeys = {};\n }),\n\n // Load WS2P heads\n loadW2spHeads()\n ];\n\n // Get difficulties (expert mode only)\n if (data.expertMode) {\n initJobs.push(loadDifficulties());\n }\n\n return $q.all(initJobs)\n .then(function() {\n return data.bma && data.bma.network.peers();\n })\n .then(function(res){\n if (!res || !res.peers || !res.peers.length) return;\n\n // If filter online peers\n if (data.filter.online) {\n var jobs = [];\n _.forEach(res.peers, function(json) {\n // Exclude, if not UP or on a too old block\n if (json.status !== 'UP') return;\n json.blockNumber = json.block && parseInt(json.block.split('-')[0]);\n if (json.blockNumber && json.blockNumber < data.minOnlineBlockNumber) {\n console.debug(\"[network] Exclude a too old peer document, on pubkey {0}\".format(json.pubkey.substring(0,6)));\n return;\n }\n\n jobs.push(addOrRefreshPeerFromJson(json, newPeers));\n\n // Mark WS2P\n _.forEach(json.endpoints||[], function(ep) {\n if (ep.startsWith('WS2P')) {\n var key = json.pubkey + '-' + ep.split(' ')[1];\n if (data.ws2pHeads[key]) {\n data.ws2pHeads[key].hasEndpoint = true;\n }\n }\n });\n });\n\n // Add private WS2P endpoints\n var privateWs2pHeads = _.values(data.ws2pHeads);\n if (privateWs2pHeads && privateWs2pHeads.length) {\n var privateEPCount = 0;\n //console.debug(\"[http] Found WS2P endpoints without endpoint:\", data.ws2pHeads);\n _.forEach(privateWs2pHeads, function(head) {\n\n if (!head.hasEndPoint) {\n var currentNumber = head.buid && parseInt(head.buid.split('-')[0]);\n // Exclude if on a too old block\n if (currentNumber && currentNumber < data.minOnlineBlockNumber) {\n console.debug(\"[network] Exclude a too old WS2P message, on pubkey {0}\".format(head.pubkey.substring(0,6)));\n return;\n }\n\n var peer = new Peer({\n buid: head.buid,\n currentNumber: currentNumber,\n pubkey: head.pubkey,\n version: head.version,\n powPrefix: head.powPrefix,\n online: true,\n uid: data.uidsByPubkeys[head.pubkey],\n bma: {\n useWs2p: true,\n private: true,\n ws2pid: head.ws2pid\n },\n endpoints: [\n // fake endpoint\n 'WS2P ' + head.ws2pid\n ]\n });\n peer.id = peer.keyID();\n if (peer.uid && data.expertMode && data.difficulties) {\n peer.difficulty = data.difficulties[peer.uid];\n }\n if (applyPeerFilter(peer)) {\n newPeers.push(peer);\n privateEPCount++;\n }\n }\n });\n\n if (privateEPCount) {\n console.debug(\"[http] Found {0} WS2P endpoints without endpoint (private ?)\".format(privateEPCount));\n }\n }\n\n if (jobs.length) return $q.all(jobs);\n }\n\n // If filter offline peers\n else {\n return $q.all(_(res && res.peers || []).reduce(function(res, json) {\n return res.concat(addOrRefreshPeerFromJson(json, newPeers));\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 member and mirror\n if ((data.filter.member && !data.filter.mirror && !peer.uid) ||\n (data.filter.mirror && !data.filter.member && peer.uid)) {\n return false;\n }\n\n // Filter on endpoint\n if (data.filter.endpoint && !peer.hasEndpoint(data.filter.endpoint)) {\n return false;\n }\n\n // Filter on status\n if ((data.filter.online && peer.status !== 'UP' && peer.oldBlock) || (!data.filter.online && peer.status === 'UP' && !peer.oldBlock)) {\n return false;\n }\n\n // Filter on bma\n if (angular.isDefined(data.filter.bma) && peer.isBma() != data.filter.bma) {\n return false;\n }\n\n // Filter on ws2p\n if (angular.isDefined(data.filter.ws2p) && peer.isWs2p() != data.filter.ws2p) {\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 // Analyze the peer document, and exclude using the online filter\n json.blockNumber = json.block && parseInt(json.block.split('-')[0]);\n json.oldBlock = (json.status === 'UP' && json.blockNumber && json.blockNumber < data.minOnlineBlockNumber);\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 var existingIndex = data.peers.indexOf(existingPeer);\n if (existingIndex !== -1) {\n console.debug('[network] Peer [{0}] removed (cause: {1})'.format(peer.server, !refreshedPeer ? 'filtered' : (refreshedPeer.online ? 'UP' : 'DOWN')));\n data.peers.splice(existingIndex, 1);\n hasUpdates = true;\n }\n }\n else if (refreshedPeer.buid !== existingMainBuid){\n console.debug('[network] {0} endpoint [{1}] new current block'.format(\n refreshedPeer.bma && (refreshedPeer.bma.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.bma && (refreshedPeer.bma.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.bma && (refreshedPeer.bma.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.bma && (refreshedPeer.bma.useBma ? 'BMA' : 'WS2P') || 'null',\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 Peer(json);\n\n // Read bma 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 = BMA.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.bma = ep;\n peer.server = peer.getServer();\n peer.dns = peer.getDns();\n peer.buid = peer.buid || peer.block;\n peer.blockNumber = peer.buid && parseInt(peer.buid.split('-')[0]);\n peer.uid = peer.pubkey && data.uidsByPubkeys[peer.pubkey];\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 && peer.status === 'DOWN') || !peer.getHost() /*fix #537*/) {\n peer.online = false;\n return $q.when(peer);\n }\n\n if (peer.bma.useWs2p && data.ws2pHeads) {\n var ws2pHeadKey = [peer.pubkey, peer.bma.ws2pid].join('-');\n var head = data.ws2pHeads[ws2pHeadKey];\n delete data.ws2pHeads[ws2pHeadKey];\n if (head) {\n peer.buid = head.buid;\n peer.currentNumber=head.buid && parseInt(head.buid.split('-')[0]);\n peer.version = head.version;\n peer.powPrefix = head.powPrefix;\n }\n peer.online = !!peer.buid;\n\n if (peer.uid && data.expertMode && data.difficulties) {\n peer.difficulty = data.difficulties[peer.uid];\n }\n\n return $q.when(peer);\n }\n\n // Cesium running in SSL: Do not try to access not SSL node,\n if (!peer.bma.useWs2p && isHttpsMode && !peer.bma.useSsl) {\n peer.online = (peer.status === 'UP');\n peer.buid = constants.UNKNOWN_BUID;\n delete peer.version;\n\n if (peer.uid && data.expertMode && data.difficulties) {\n peer.difficulty = data.difficulties[peer.uid];\n }\n\n return $q.when(peer);\n }\n\n // Do not try to access TOR or WS2P endpoints\n if (peer.bma.useTor || peer.bma.useWs2p) {\n peer.online = (peer.status === 'UP');\n peer.buid = constants.UNKNOWN_BUID;\n delete peer.version;\n\n if (peer.uid && data.expertMode && data.difficulties) {\n peer.difficulty = data.difficulties[peer.uid];\n }\n return $q.when(peer);\n }\n\n peer.api = peer.api || BMA.lightInstance(peer.getHost(), peer.getPort(), peer.isSsl(), data.timeout);\n\n // Get current block\n return peer.api.blockchain.current(false/*no cache*/)\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 bma = peer.bma || peer.getBMA();\n if (bma.dns && peer.server.indexOf(bma.dns) === -1) {\n // try again, using DNS instead of IPv4 / IPV6\n peer.secondTry = true;\n peer.api = BMA.lightInstance(bma.dns, bma.port, bma.useSsl);\n return refreshPeer(peer); // recursive call\n }\n }\n\n peer.buid = null;\n peer.blockNumber = null;\n peer.currentNumber = null;\n peer.online=false;\n peer.uid = data.uidsByPubkeys[peer.pubkey];\n return peer;\n })\n .then(function(peer) {\n // Exit if offline, or not expert mode or too small device\n if (!data.filter.online || !peer || !peer.online || !data.expertMode) return peer;\n var jobs = [];\n\n // Get hardship (only for a member peer)\n if (peer.uid) {\n jobs.push(peer.api.blockchain.stats.hardship({pubkey: peer.pubkey})\n .then(function (res) {\n peer.difficulty = res ? res.level : null;\n })\n .catch(function() {\n peer.difficulty = null; // continue\n }));\n }\n\n // Get Version\n jobs.push(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 = '?'; // continue\n }));\n\n return $q.all(jobs)\n .then(function(){\n return peer;\n });\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 data.memberPeersCount = 0;\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 medianTime: peer.medianTime,\n count: 0\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 data.memberPeersCount += peer.uid ? 1 : 0;\n });\n var mainBlock = data.mainBlock;\n if (data.filter.online) {\n // Compute pct of use, per buid\n _.forEach(_.values(buids), function(buid) {\n buid.pct = buid.count * 100 / data.peers.length;\n });\n 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 }\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 score += (data.sort.type === 'uid' ? computeScoreAlphaValue(peer.uid||peer.pubkey, 3, data.sort.asc) : 0);\n score += (data.sort.type === 'api') &&\n ((peer.isWs2p() && (data.sort.asc ? 1 : -1) || 0) +\n (peer.hasEndpoint('ES_USER_API') && (data.sort.asc ? 0.01 : -0.01) || 0) +\n (peer.isSsl() && (data.sort.asc ? 0.75 : -0.75) || 0)) || 0;\n score += (data.sort.type === 'difficulty' ? (peer.difficulty ? (data.sort.asc ? (10000-peer.difficulty) : peer.difficulty): 0) : 0);\n score += (data.sort.type === 'current_block' ? (peer.currentNumber ? (data.sort.asc ? (1000000000 - peer.currentNumber) : peer.currentNumber) : 0) : 0);\n }\n score = (10000000000 * score);\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 score += (peer.isBma() ? (peer.isSsl() ? 0.01 : 0.001) :0); // If many endpoints: BMAS first, then BMA\n return -score;\n });\n\n if (data.groupBy) {\n var previousPeer;\n data.peers.forEach(function(peer) {\n peer.compacted = (previousPeer && peer[data.groupBy] && peer[data.groupBy] === previousPeer[data.groupBy]);\n previousPeer = peer;\n });\n }\n\n // Raise event on new main block\n if (updateMainBuid && mainBlock && 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.bma.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.bma.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(bma, options) {\n options = options || {};\n return BMA.ready()\n .then(function() {\n close();\n\n data.bma = bma || BMA;\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\n // Init a min block number\n data.minOnlineBlockNumber = data.mainBlock && data.mainBlock.buid && (parseInt(data.mainBlock.buid.split('-')[0]) - constants.MAX_BLOCK_OFFSET) || undefined;\n if (data.minOnlineBlockNumber === undefined) {\n return csCurrency.blockchain.current(true/*use cache*/)\n .then(function(current) {\n data.minOnlineBlockNumber = current.number - constants.MAX_BLOCK_OFFSET;\n });\n }\n })\n .then(function() {\n console.info('[network] Starting network from [{0}]'.format(bma.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.bma) {\n console.info('[network-service] Stopping...');\n removeListeners();\n resetData();\n }\n },\n\n isStarted = function() {\n return !data.bma;\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 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","//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(this.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.signSk);\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', [])\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', '$ionicPopover', '$state', '$rootScope', 'screenmatch', function($ionicLoading, $ionicPopup, $ionicConfig, $ionicHistory, $translate, $q,\n ionicMaterialInk, ionicMaterialMotion, $window, $timeout, Fullscreen,\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();\n }\n\n return $q(function(resolve) {\n $translate([err, subtitle, 'ERROR.POPUP_TITLE', 'ERROR.UNKNOWN_ERROR', 'COMMON.BTN_OK'])\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: translations[subtitle],\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) {\n return $q(function(resolve) {\n $translate([message, subtitle, 'INFO.POPUP_TITLE', 'COMMON.BTN_OK'])\n .then(function (translations) {\n $ionicPopup.show({\n template: '

' + translations[message] + '

',\n title: translations['INFO.POPUP_TITLE'],\n subTitle: translations[subtitle],\n buttons: [\n {\n text: translations['COMMON.BTN_OK'],\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 title = title || 'CONFIRM.POPUP_TITLE';\n\n options = options || {};\n options.cssClass = options.cssClass || 'confirm';\n options.okText = options.okText || 'COMMON.BTN_OK';\n options.cancelText = options.cancelText || 'COMMON.BTN_CANCEL';\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 duration = duration || 'short';\n position = position || 'bottom';\n\n return $translate([message])\n .then(function(translations){\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: translations[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 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 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 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 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 ;\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 if node changed\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', ['cesium.utils.services'])\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', 'Device', function($ionicModal, $rootScope, $q, $injector, $controller, $timeout, Device) {\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.hideModal = function () {\n return $scope.modal.hide();\n };\n\n $scope.closeModal = function (result) {\n $scope.resolved = true;\n\n return $scope.modal.remove()\n .then(function() {\n // Workaround modal-open not removed\n document.body.classList.remove('modal-open');\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().then(function() {\n // Workaround modal-open not removed\n document.body.classList.remove('modal-open');\n });\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 var focusFirstInput = false;\n // removeIf(device)\n focusFirstInput = angular.isDefined(options.focusFirstInput) ? options.focusFirstInput : false;\n // endRemoveIf(device)\n options.focusFirstInput = focusFirstInput;\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', ['$rootScope', '$translate', '$ionicPopup', '$timeout', 'ModalUtils', 'UIUtils', function($rootScope, $translate, $ionicPopup, $timeout, ModalUtils, UIUtils) {\n 'ngInject';\n\n function showTransfer(parameters) {\n var useDigitKeyboard = UIUtils.screen.isSmall();\n return ModalUtils.show('templates/wallet/modal_transfer.html','TransferModalCtrl',\n parameters, {\n focusFirstInput: !useDigitKeyboard\n });\n }\n\n function showLogin(parameters) {\n return ModalUtils.show('templates/login/modal_login.html','LoginModalCtrl',\n parameters, {focusFirstInput: true, backdropClickToClose: false});\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_choose_account_type.html','JoinChooseAccountTypeModalCtrl',\n parameters)\n .then(function(res){\n if (!res) return;\n return (res.accountType == 'member') ?\n showJoinMember(res) :\n showJoinWallet(res);\n });\n }\n\n function showJoinMember(parameters) {\n return ModalUtils.show('templates/join/modal_join_member.html','JoinModalCtrl',\n parameters);\n }\n\n function showJoinWallet(parameters) {\n return ModalUtils.show('templates/join/modal_join_wallet.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 function showLicense(parameters) {\n return ModalUtils.show('templates/currency/modal_license.html','CurrencyLicenseModalCtrl',\n parameters);\n }\n\n function showSelectPubkeyIdentity(parameters) {\n return ModalUtils.show('templates/wot/modal_select_pubkey_identity.html', 'WotSelectPubkeyIdentityModalCtrl',\n parameters);\n }\n\n function showSelectWallet(parameters) {\n return ModalUtils.show('templates/wallet/list/modal_wallets.html','WalletSelectModalCtrl',\n parameters);\n }\n\n function showPassword(options) {\n options = options || {};\n options.title = options.title || 'COMMON.SET_PASSWORD_TITLE';\n options.subTitle = options.subTitle || 'COMMON.SET_PASSWORD_SUBTITLE';\n var scope = options.scope ? options.scope.$new() : $rootScope.$new();\n scope.formData = {password: undefined};\n scope.setForm = function(form) {\n scope.form=form;\n };\n scope.submit = function(e) {\n scope.form.$submitted=true;\n if (e && e.preventDefault) e.preventDefault();\n if(scope.form.$valid && scope.formData.password) {\n options.popup.close(scope.formData.password);\n }\n };\n\n scope.error = options.error || undefined;\n\n // Choose password popup\n return $translate([options.title, options.subTitle, 'COMMON.BTN_OK', 'COMMON.BTN_CANCEL'])\n .then(function (translations) {\n options.popup = $ionicPopup.show({\n templateUrl: 'templates/common/popup_password.html',\n title: translations[options.title],\n subTitle: translations[options.subTitle],\n scope: scope,\n buttons: [\n { text: translations['COMMON.BTN_CANCEL'] },\n { text: translations['COMMON.BTN_OK'],\n type: 'button-positive',\n onTap: scope.submit\n }\n ]\n });\n return options.popup;\n });\n\n }\n\n return {\n showTransfer: showTransfer,\n showLogin: showLogin,\n showWotLookup: showWotLookup,\n showNetworkLookup: showNetworkLookup,\n showAbout: showAbout,\n showJoin: showJoin,\n showJoinMember: showJoinMember,\n showJoinWallet: showJoinWallet,\n showHelp: showHelp,\n showAccountSecurity: showAccountSecurity,\n showLicense: showLicense,\n showSelectPubkeyIdentity: showSelectPubkeyIdentity,\n showSelectWallet: showSelectWallet,\n showPassword: showPassword\n };\n\n}])\n\n.factory('csPopovers', ['$rootScope', '$translate', '$ionicPopup', '$timeout', 'UIUtils', '$controller', function($rootScope, $translate, $ionicPopup, $timeout, UIUtils, $controller) {\n 'ngInject';\n\n function showSelectWallet(event, options) {\n options = options || {};\n\n var parameters = options.parameters || {};\n delete options.parameters;\n\n var scope = options.scope && options.scope.$new() || $rootScope.$new(true);\n options.scope = scope;\n options.templateUrl = 'templates/wallet/list/popover_wallets.html';\n options.autoremove = true;\n\n // Initialize the popover controller, with parameters\n angular.extend(this, $controller('WalletSelectPopoverCtrl', {$scope: options.scope, parameters: parameters}));\n\n var afterShowSaved = options.afterShow;\n options.afterShow = function(popover) {\n\n // Add a missing method, to close the popover\n scope.closePopover = function(res) {\n popover.scope.closePopover(res);\n };\n\n // Execute default afterShow fn, if any\n if (afterShowSaved) afterShowSaved(popover);\n };\n // Show the popover\n return UIUtils.popover.show(event, options)\n .then(function(res) {\n // Then destroy the scope\n scope.$destroy();\n return res;\n });\n }\n\n return {\n showSelectWallet: showSelectWallet\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 ;\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 (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;\n if (uri.startsWith('duniter://')) {\n protocol = 'duniter';\n uri = uri.replace('duniter://', 'http://');\n }\n\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 result = {\n protocol: protocol ? protocol : parser.protocol,\n hostname: parser.hostname,\n host: parser.host,\n port: parser.port,\n username: parser.username,\n password: parser.password,\n pathname: pathname,\n search: parser.search,\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: protocole\n var validProtocol = (parts.protocol == 'mailto:' || parts.protocol == 'tel:') && Device.enable;\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 if (!isPositiveInteger(parts[i])) {\n return false;\n }\n 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.remove = function(key, value) {\n exports.standard.storage.removeItem(key);\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 (localStorage 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","var App;\n\nangular.module('cesium.device.services', ['cesium.utils.services', 'cesium.settings.services'])\n\n .factory('Device', ['$rootScope', '$translate', '$ionicPopup', '$q', 'ionicReady', function($rootScope, $translate, $ionicPopup, $q,\n ionicReady) {\n 'ngInject';\n\n var\n CONST = {\n MAX_HEIGHT: 400,\n MAX_WIDTH: 400\n },\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 // 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: '.',\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: '',\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.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\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 scanner: {1}] [keyboard: {2}] [clipboard: {3}]'\n .format(exports.camera.enable, exports.barcode.enable, exports.keyboard.enable, exports.clipboard.enable));\n\n if (cordova.InAppBrowser) {\n console.debug('[device] Enabling InAppBrowser');\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 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 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\");\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);\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 && currentBlock.receivedAt && (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(false)\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: now};\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","//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', 'csCrypto', 'Api', 'Device', 'UIUtils', 'csConfig', 'csSettings', 'csCache', 'csHttp', function($q, $window, $rootScope, $timeout, csCrypto, Api, Device, UIUtils, csConfig, csSettings, csCache, csHttp) {\n 'ngInject';\n\n function BMA(host, port, useSsl, useCache) {\n\n var\n id = (!host ? 'default' : '{0}:{1}'.format(host, (port || (useSsl ? '443' : '80')))), // Unique id of this instance\n cachePrefix = \"BMA-\",\n pubkey = \"[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}\",\n // TX output conditions\n SIG = \"SIG\\\\((\" + pubkey + \")\\\\)\",\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 ms) to wait between to call of a rest request\n regexp: regexp,\n api: api\n },\n listeners,\n that = this;\n\n that.raw = {\n getByPath: {},\n postByPath: {},\n wsByPath: {}\n };\n that.api = new Api(this, 'BMA-' + id);\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) init(host, port, useSsl);\n that.useCache = angular.isDefined(useCache) ? useCache : true; // need here because used in get() function\n\n function init(host, port, useSsl) {\n if (that.started) that.stop();\n that.alive = false;\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 }\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.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 closeWs() {\n if (!that.raw) return;\n\n console.warn('[BMA] Closing all websockets...');\n _.keys(that.raw.wsByPath||{}).forEach(function(key) {\n var sock = that.raw.wsByPath[key];\n sock.close();\n });\n that.raw.wsByPath = {};\n }\n\n function cleanCache() {\n console.debug(\"[BMA] Cleaning cache {prefix: '{0}'}...\".format(cachePrefix));\n csCache.clear(cachePrefix);\n\n // Clean raw requests by path cache\n that.raw.getByPath = {};\n that.raw.postByPath = {};\n that.raw.wsByPath = {};\n }\n\n function get(path, cacheTime) {\n\n cacheTime = that.useCache && cacheTime || 0 /* no cache*/ ;\n var requestKey = 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.raw.getByPath[requestKey];\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.raw.getByPath[requestKey] = 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 function post(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.raw.postByPath[path];\n if (!request) {\n request = csHttp.post(that.host, that.port, path, that.useSsl);\n that.raw.postByPath[path] = request;\n }\n return request(obj, params);\n };\n\n return postRequest;\n }\n\n function ws(path) {\n return function() {\n var sock = that.raw.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.raw.wsByPath[path];\n };\n\n that.raw.wsByPath[path] = sock;\n }\n return sock;\n };\n }\n\n that.isAlive = function(node) {\n node = node || that;\n // WARN:\n // - Cannot use previous get() function, because\n // node can be !=that, or not be started yet\n // - Do NOT use cache here\n return csHttp.get(node.host, node.port, '/node/summary', node.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) {\n isCompatible = csHttp.version.isCompatible(csSettings.data.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 isSameNode(node2) {\n node2 = node2 || {};\n node2.useSsl = angular.isDefined(node2.useSsl) ? node2.useSsl : (node2.port && node2.port == 443);\n // Same host\n return that.host === node2.host &&\n // Same port\n ((!that.port && !node2.port2) || (that.port == node2.port2||80)) &&\n // Same useSsl\n (that.useSsl === node2.useSsl);\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 // Wait 1s (because settings controller can have restart the service), then copy the settings node\n $timeout(function() {\n exports.copy(settings.node);\n }, 1000);\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 console.debug(\"[BMA] Starting {0} {ssl: {1})...\".format(that.server, that.useSsl));\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} : 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) {\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 if (!that.started && !that._startPromise) return $q.when(); // Skip multiple call\n\n console.debug('[BMA] Stopping...');\n\n removeListeners();\n delete that._startPromise;\n\n if (that.alive) {\n closeWs();\n 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 .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', csCache.constants.LONG),\n same: isSameNode,\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'),\n certifiedBy: get('/wot/certified-by/:pubkey', csCache.constants.SHORT),\n certifiersOf: get('/wot/certifiers-of/:pubkey', csCache.constants.SHORT),\n member: {\n all: get('/wot/members', csCache.constants.LONG),\n pending: get('/wot/pending', csCache.constants.SHORT)\n },\n requirements: function(params, cache) {\n // No cache by default\n if (cache !== 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', csCache.constants.VERY_LONG),\n block: get('/blockchain/block/:block', csCache.constants.SHORT),\n blocksSlice: get('/blockchain/blocks/:count/:from'),\n current: function(cache) {\n // No cache by default\n return (cache !== true) ? exports.raw.blockchain.current() : exports.raw.blockchain.currentWithCache();\n },\n membership: post('/blockchain/membership'),\n stats: {\n ud: get('/blockchain/with/ud', csCache.constants.MEDIUM),\n tx: get('/blockchain/with/tx'),\n newcomers: get('/blockchain/with/newcomers', csCache.constants.MEDIUM),\n hardship: get('/blockchain/hardship/:pubkey'),\n difficulties: get('/blockchain/difficulties')\n }\n },\n tx: {\n sources: get('/tx/sources/:pubkey', csCache.constants.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, cache) {\n // No cache by default\n return ((cache !== 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', csCache.constants.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 blockchain: {\n currentWithCache: get('/blockchain/current', csCache.constants.SHORT),\n current: get('/blockchain/current')\n },\n wot: {\n requirementsWithCache: get('/wot/requirements/:pubkey', csCache.constants.LONG),\n requirements: get('/wot/requirements/:pubkey')\n },\n tx: {\n history: {\n timesWithCache: get('/tx/history/:pubkey/times/:from/:to', csCache.constants.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\n var server = csHttp.getUrl(otherNode.host, otherNode.port, ''/*path*/, otherNode.useSsl);\n var hasChanged = (server !== that.url);\n if (hasChanged) {\n var wasStarted = that.started;\n if (wasStarted) that.stop();\n that.init(otherNode.host, otherNode.port, otherNode.useSsl, that.useCache/*keep original value*/);\n if (wasStarted) {\n return $timeout(function () {\n return that.start()\n .then(function (alive) {\n if (alive) {\n that.api.node.raise.restart();\n }\n return alive;\n });\n }, 200); // Wait stop finished\n }\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 csCache.constants.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();\n\n service.instance = function(host, port, useSsl, useCache) {\n useCache = angular.isDefined(useCache) ? useCache : false; // No cache by default\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, ''/*no path*/, useSsl),\n node: {\n summary: csHttp.getWithCache(host, port, '/node/summary', useSsl, csCache.constants.MEDIUM, false/*autoRefresh*/, 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', ['$rootScope', '$q', '$timeout', 'BMA', 'Api', 'CacheFactory', 'UIUtils', 'csConfig', 'csCurrency', 'csSettings', 'csCache', function($rootScope, $q, $timeout, BMA, Api, CacheFactory, UIUtils, csConfig, csCurrency, csSettings, csCache) {\n 'ngInject';\n\n\n var\n api = new Api(this, \"csWot\"),\n cachePrefix = 'csWot-',\n identityCache = csCache.get(cachePrefix + 'idty-', csCache.constants.MEDIUM),\n requirementsCache = csCache.get(cachePrefix + 'requirements-', csCache.constants.MEDIUM),\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 _resetRequirements = function(data) {\n data.requirements = {\n loaded: false,\n meta: {},\n hasSelf: false,\n needSelf: true,\n needMembership: true,\n canMembershipOut: false,\n needRenew: false,\n pendingMembership: false,\n isMember: false,\n wasMember: false,\n certificationCount: 0,\n needCertifications: false,\n needCertificationCount: 0,\n willNeedCertificationCount: 0,\n alternatives: undefined\n };\n data.blockUid = null;\n data.isMember = false;\n data.sigDate = null;\n data.hasSelf = false;\n },\n\n _fillRequirements = function(requirements, currencyParameters) {\n // Add useful custom fields\n requirements.hasSelf = !!requirements.meta.timestamp;\n requirements.needSelf = !requirements.hasSelf || requirements.meta.invalid;\n requirements.wasMember = angular.isDefined(requirements.wasMember) ? requirements.wasMember : false; // Compat with Duniter 0.9\n requirements.needMembership = (!requirements.revoked && requirements.membershipExpiresIn <= 0 && requirements.membershipPendingExpiresIn <= 0 && !requirements.wasMember);\n requirements.needRenew = (!requirements.needMembership && !requirements.revoked &&\n requirements.membershipExpiresIn <= csSettings.data.timeWarningExpireMembership &&\n requirements.membershipPendingExpiresIn <= 0) ||\n (requirements.wasMember && !requirements.revoked && requirements.membershipExpiresIn === 0 &&\n requirements.membershipPendingExpiresIn === 0);\n requirements.canMembershipOut = (!requirements.revoked && requirements.membershipExpiresIn > 0);\n requirements.pendingMembership = (!requirements.revoked && requirements.membershipExpiresIn <= 0 && requirements.membershipPendingExpiresIn > 0);\n requirements.isMember = (!requirements.revoked && requirements.membershipExpiresIn > 0);\n requirements.blockUid = requirements.meta.timestamp;\n // Force certification count to 0, is not a member yet - fix #269\n requirements.certificationCount = ((requirements.isMember || (requirements.wasMember && !requirements.expired)) && requirements.certifications) ? requirements.certifications.length : 0;\n requirements.willExpireCertificationCount = requirements.certifications ? requirements.certifications.reduce(function(count, cert){\n return count + (cert.expiresIn <= csSettings.data.timeWarningExpire ? 1 : 0);\n }, 0) : 0;\n requirements.willExpire = requirements.willExpireCertificationCount > 0;\n requirements.pendingRevocation = !requirements.revoked && !!requirements.revocation_sig;\n //requirements.outdistanced = requirements.outdistanced; // outdistanced is always present in requirement - see #777\n\n // Fix pending certifications count - Fix #624\n if (!requirements.isMember && !requirements.wasMember) {\n var certifiers = _.union(\n _.pluck(requirements.pendingCerts || [], 'from'),\n _.pluck(requirements.certifications || [], 'from')\n );\n requirements.pendingCertificationCount = _.size(certifiers);\n }\n else {\n requirements.pendingCertificationCount = angular.isDefined(requirements.pendingCerts) ? requirements.pendingCerts.length : 0 ;\n }\n\n // Compute\n requirements.needCertificationCount = (!requirements.needSelf && (requirements.certificationCount < currencyParameters.sigQty)) ?\n (currencyParameters.sigQty - requirements.certificationCount) : 0;\n requirements.willNeedCertificationCount = (!requirements.needMembership && !requirements.needCertificationCount &&\n (requirements.certificationCount - requirements.willExpireCertificationCount) < currencyParameters.sigQty) ?\n (currencyParameters.sigQty - requirements.certificationCount + requirements.willExpireCertificationCount) : 0;\n\n // Mark as loaded - need by csWallet.isDataLoaded()\n requirements.loaded = true;\n\n\n return requirements;\n },\n\n _fillIdentitiesMeta = function(identities) {\n if (!identities) return $q.when(identities);\n\n var blocks = [];\n _.forEach(identities, function(identity) {\n var blockUid = identity.meta.timestamp.split('-', 2);\n identity.meta.number = parseInt(blockUid[0]);\n identity.meta.hash = blockUid[1];\n identity.meta.sig = identity.meta.sig || identity.sig;\n delete identity.sig;\n blocks.push(identity.meta.number);\n });\n\n // Get identities blocks, to fill self and revocation time\n return BMA.blockchain.blocks(_.uniq(blocks))\n .then(function(blocks) {\n _.forEach(identities, function(identity) {\n var block = _.findWhere(blocks, {number: identity.meta.number});\n identity.meta.time = block && block.medianTime;\n\n // Check if self has been done on a valid block\n if (block && identity.meta.number !== 0 && identity.meta.hash !== block.hash) {\n identity.meta.invalid = true;\n }\n });\n\n return identities;\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) {\n _.forEach(identities, function(identity) {\n if (identity.number === 0) {\n identity.meta.time = moment().utc().unix();\n }\n });\n return identities;\n }\n else {\n throw err;\n }\n });\n },\n\n loadRequirements = function(inputData, withCache) {\n if (!inputData || (!inputData.pubkey && !inputData.uid)) return $q.when(inputData);\n\n var cacheKey = inputData.pubkey||inputData.uid;\n var data = (withCache !== false) ? requirementsCache.get(cacheKey) : null;\n if (data) {\n console.debug(\"[wot] Requirements \" + cacheKey + \" found in cache\");\n // Update data with cache\n angular.merge(inputData, data);\n return $q.when(data);\n }\n data = {pubkey: inputData.pubkey, uid: inputData.uid};\n\n // Alert user, when request is too long (> 2s)\n $timeout(function() {\n if (!data.requirements || !data.requirements.loaded) UIUtils.loading.update({template: \"COMMON.LOADING_WAIT\"});\n }, 2000);\n\n var now = Date.now();\n return $q.all([\n // Get currency\n csCurrency.get(),\n\n // Get requirements\n BMA.wot.requirements({pubkey: data.pubkey||data.uid}, false/*no cache*/)\n .then(function(res) {\n return _fillIdentitiesMeta(res && res.identities);\n })\n ])\n .then(function(res){\n var currency = res[0];\n var identities = res[1];\n\n if (!identities || !identities.length) return;\n\n // Sort to select the best identity\n if (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 identities = _.sortBy(identities, function(idty) {\n var score = 0;\n score += (1000000000000* ((data.uid && idty.uid === data.uid) ? 1 : 0));\n score += (100000000000 * (!idty.meta.invalid ? 1 : 0));\n score += (10000000000 * ((data.blockUid && idty.meta.timestamp && idty.meta.timestamp === data.blockUid) ? 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 score += (100000 * (idty.wasMember ? 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('[wot] Found {0} identities (in requirements). Will selected the best one'.format(identities.length));\n }\n\n // Select the first identity\n data.requirements = _fillRequirements(identities[0], currency.parameters);\n\n // Copy some useful properties into data\n data.pubkey = data.requirements.pubkey;\n data.uid = data.requirements.uid;\n data.isMember = data.requirements.isMember;\n data.blockUid = data.requirements.meta && data.requirements.meta.timestamp;\n data.hasSelf = data.requirements.hasSelf;\n data.sigDate = data.requirements.meta && data.requirements.meta.time;\n\n // Prepare alternatives identities if any\n if (!data.requirements.isMember && !data.requirements.wasMember && identities.length > 1) {\n data.requirements.alternatives = identities.splice(1);\n _.forEach(data.requirements.alternatives, function(requirements) {\n _fillRequirements(requirements, currency.parameters);\n });\n }\n\n /// Save to cache\n requirementsCache.put(cacheKey, data);\n\n angular.merge(inputData, data); // Update the input data\n\n console.debug(\"[wot] Requirements for '{0}' loaded in {1}ms\".format((data.pubkey && data.pubkey.substring(0,8))||data.uid, Date.now() - now));\n\n return inputData;\n })\n .catch(function(err) {\n data.requirements = {loaded: true}; // Mark has loaded - need by the previous $timeout\n _resetRequirements(inputData);\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 inputData.requirements.loaded = true;\n return inputData;\n }\n throw err;\n });\n },\n\n loadIdentityByLookup = function(pubkey, uid) {\n var data = {\n pubkey: pubkey,\n uid: uid,\n hasSelf: false\n };\n return BMA.wot.lookup({ search: pubkey||uid })\n .then(function(res){\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 var blockNumber = parseInt(blockUid[0]);\n return uids.concat({\n uid: idty.uid,\n pubkey: res.pubkey,\n meta: {\n timestamp: idty.meta.timestamp,\n number: blockNumber,\n hash: blockUid[1],\n sig: idty.self\n },\n revoked: idty.revoked,\n revoked_on: idty.revoked_on\n });\n }, []));\n }, []);\n\n // Fill identities meta (self)\n return _fillIdentitiesMeta(identities)\n .then(function(identities) {\n return {\n identities: identities,\n results: res.results\n };\n });\n })\n .then(function(res){\n var identities = res.identities;\n\n // Sort identities if need\n if (identities.length > 1) {\n // Select the best identity, by sorting using this order\n // - valid block\n // - same given uid\n // - not revoked\n // - max(block_number)\n res.identities = _.sortBy(identities, function(idty) {\n var score = 0;\n score += (100000000000 * ((data.uid && idty.uid === data.uid) ? 1 : 0));\n score += (10000000000 * (!idty.meta.invalid ? 1 : 0));\n score += (1000000000 * ((data.blockUid && idty.meta.timestamp && idty.meta.timestamp === data.blockUid) ? 1 : 0));\n score += (100000000 * (!idty.revoked ? 1 : 0));\n score += (1 * (idty.meta.number ? idty.meta.number : 0) / 1000);\n return -score;\n });\n console.debug('[wot] Found {0} identities (in lookup). Will selected the best one'.format(identities.length));\n }\n\n // Prepare alternatives identities\n _.forEach(identities, function(idty) {\n idty.hasSelf = !!(idty.uid && idty.meta.timestamp && idty.meta.sig);\n });\n\n // Select the first identity\n data.requirements = identities[0];\n\n // Copy some useful properties into data\n data.pubkey = data.requirements.pubkey;\n data.uid = data.requirements.uid;\n data.blockUid = data.requirements.meta && data.requirements.meta.timestamp;\n data.hasSelf = data.requirements.hasSelf;\n data.sigDate = data.requirements.meta && data.requirements.meta.time;\n\n if (identities.length > 1) {\n data.requirements.alternatives = identities.splice(1);\n }\n\n // Store additional data (e.g. certs)\n data.lookup = {};\n\n // Store received certifications (can be usefull later)\n var certPubkeys = {};\n data.lookup.certifications = (res.results || []).reduce(function(certsMap, res) {\n return res.uids.reduce(function(certsMap, idty) {\n var idtyFullKey = idty.uid + '-' + (idty.meta ? idty.meta.timestamp : '');\n certsMap[idtyFullKey] = (idty.others||[]).reduce(function(certs, cert) {\n var certFullKey = idtyFullKey + '-' + cert.pubkey;\n var result = {\n pubkey: cert.pubkey,\n uid: cert.uids[0],\n cert_time: {\n block: (cert.meta && cert.meta.block_number) ? cert.meta.block_number : 0,\n block_hash: (cert.meta && cert.meta.block_hash) ? cert.meta.block_hash : null\n },\n isMember: cert.isMember,\n wasMember: cert.wasMember,\n };\n if (!certPubkeys[certFullKey]) {\n certPubkeys[certFullKey] = result;\n }\n else { // if duplicated cert: keep the most recent\n if (result.cert_time.block > certPubkeys[certFullKey].cert_time.block) {\n certPubkeys[certFullKey] = result;\n certs.splice(_.findIndex(certs, {pubkey: cert.pubkey}), 1, result);\n return certs;\n }\n else {\n return certs; // skip this cert\n }\n }\n return certs.concat(result);\n }, []);\n return certsMap;\n }, certsMap);\n }, {});\n\n // Store given certifications\n certPubkeys = {};\n data.lookup.givenCertifications = (res.results || []).reduce(function(certs, res) {\n return (res.signed || []).reduce(function(certs, cert) {\n var result = {\n pubkey: cert.pubkey,\n uid: cert.uid,\n cert_time: {\n block: (cert.cert_time && cert.cert_time.block) ? cert.cert_time.block : 0,\n block_hash: (cert.cert_time && cert.cert_time.block_hash) ? cert.cert_time.block_hash : null\n },\n sigDate: cert.meta ? cert.meta.timestamp : null,\n isMember: cert.isMember,\n wasMember: cert.wasMember\n };\n if (!certPubkeys[cert.pubkey]) {\n certPubkeys[cert.pubkey] = result;\n }\n else { // if duplicated cert: keep the most recent\n if (result.block > certPubkeys[cert.pubkey].block) {\n certPubkeys[cert.pubkey] = result;\n // TODO: Replace the existing one ? May be not, to be able to see renewal\n // (see issue #806)\n // If yes (need to replace), check this code works:\n //certs.splice(_.findIndex(certs, {pubkey: cert.pubkey}), 1, result);\n //return certs;\n }\n else {\n return certs; // skip this cert\n }\n }\n return certs.concat(result);\n }, certs);\n }, []);\n\n return data;\n })\n .catch(function(err) {\n if (!!err && err.ucode == BMA.errorCodes.NO_MATCHING_IDENTITY) { // Identity not found (if no self)\n _resetRequirements(data);\n return data;\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 && 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 /*FIXME: workaround for Duniter issue #1309 */\n else if (!!err && err.ucode == 1002) {\n console.warn(\"[wallet-service] Detecting Duniter issue #1309 ! Applying workaround... \");\n isMember = false;\n return []; // not found\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 // Add events on given account\n addEvents = function(data) {\n\n if (data.requirements.revoked) {\n delete data.requirements.meta.invalid;\n if (data.requirements.revoked_on) {\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_REVOKED_WITH_TIME', messageParams: {revocationTime: data.requirements.revoked_on}});\n console.debug(\"[wot] Identity [{0}] has been revoked on {1}\".format(data.uid, data.requirements.revoked_on));\n }\n else {\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_REVOKED'});\n console.debug(\"[wot] Identity [{0}] has been revoked\".format(data.uid));\n }\n }\n else if (data.requirements.pendingRevocation) {\n delete data.requirements.meta.invalid;\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.requirements.meta && data.requirements.meta.invalid) {\n if (!data.isMember) {\n addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_INVALID_BLOCK_HASH'});\n console.debug(\"[wot] Invalid membership for uid {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 else if (!data.requirements.needSelf && data.requirements.needMembership) {\n addEvent(data, {type: 'error', message: 'INFO.IDENTITY_NEED_MEMBERSHIP'});\n console.debug(\"[wot] Identity {0} has a self but no membership\".format(data.uid));\n }\n if (!data.isMember && data.requirements.alternatives) {\n addEvent(data, {type: 'info', message: 'INFO.HAS_ALTERNATIVE_IDENTITIES'});\n }\n },\n\n loadData = function(pubkey, uid, options) {\n\n options = options || {};\n var data;\n\n if (!pubkey && uid && !options.force) {\n return BMA.wot.member.getByUid(uid)\n .then(function(member) {\n if (member) return loadData(member.pubkey, member.uid, options); // recursive call, with a pubkey\n //throw {message: 'NOT_A_MEMBER'};\n var options = angular.copy(options || {});\n options.force = true;\n return loadData(pubkey, uid, options); // Loop with force=true\n });\n }\n\n // Check cached data\n if (pubkey) {\n data = (options.cache !== false) ? identityCache.get(pubkey) : null;\n if (data && (!uid || data.uid === uid) && (!options.blockUid || data.blockUid === options.blockUid)) {\n console.debug(\"[wot] Identity {{0}} found in cache\".format(pubkey.substring(0, 8)));\n return $q.when(data);\n }\n console.debug(\"[wot] Loading identity {{0}}...\".format(pubkey.substring(0, 8)));\n data = {\n pubkey: pubkey,\n uid: uid\n };\n }\n else {\n console.debug(\"[wot] Loading identity from uid {{0}}...\".format(uid));\n data = {\n uid: uid\n };\n }\n if (options.blockUid) {\n data.blockUid = options.blockUid;\n }\n\n var now = Date.now();\n var parameters;\n var medianTime;\n\n return $q.all([\n\n // Get parameters\n csCurrency.parameters()\n .then(function(res) {\n parameters = res;\n }),\n\n // Get current time\n csCurrency.blockchain.current(true)\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 = moment.utc().unix();\n }\n else {\n throw err;\n }\n }),\n\n // Get requirements\n loadRequirements(data, options.cache !== false),\n\n // Get identity using lookup\n loadIdentityByLookup(pubkey, uid)\n\n ])\n .then(function(res) {\n var dataByLookup = res[3];\n\n // If no requirements found: copy from lookup data\n if (!data.requirements.uid) {\n console.debug(\"[wot] No requirements found: using data from lookup\");\n angular.merge(data, dataByLookup);\n delete data.lookup; // not need\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, dataByLookup.lookup ? dataByLookup.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, dataByLookup.lookup ? dataByLookup.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\n // Add compute some additional requirements (that required all data like certifications)\n data.requirements.pendingCertificationCount = data.received_cert_pending ? data.received_cert_pending.length : data.requirements.pendingCertificationCount;\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 account events\n addEvents(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 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 var total;\n return $q.all([\n csCurrency.blockchain.current(true)\n .then(function(block) {\n total = block.membersCount || 0;\n }),\n BMA.blockchain.stats.newcomers()\n ])\n .then(function(res) {\n res = res[1];\n if (!res || !res.result || !res.result.blocks || !res.result.blocks.length) return null; // no result\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 .then(function(idties) {\n return {\n hits: idties,\n total: total\n };\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 var now = Date.now();\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\n var idties = _.values(idtiesByPubkey);\n var total = idties.length; // get total BEFORE slice\n\n idties = _sortAndSliceIdentities(idties, 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 console.debug(\"[ES] [wot] Loaded {0}/{1} pending identities in {2} ms\".format(idties && idties.length || 0, total, Date.now() - now));\n return {\n hits: idties,\n total: total\n };\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 })\n .then(_addUniqueIds)\n .then(function() {\n return {\n hits: idties,\n total: idties.length\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 cleanCache = function() {\n console.debug(\"[wot] Cleaning cache...\");\n csCache.clear(cachePrefix);\n }\n ;\n\n // Register extension points\n api.registerEvent('data', 'load');\n api.registerEvent('data', 'search');\n\n // Listen if node changed\n BMA.api.node.on.stop($rootScope, cleanCache, this);\n\n return {\n load: loadData,\n loadRequirements: loadRequirements,\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","\nangular.module('cesium.tx.services', ['ngApi', 'cesium.bma.services',\n 'cesium.settings.services', 'cesium.wot.services' ])\n\n.factory('csTx', ['$q', '$timeout', '$filter', '$translate', 'FileSaver', 'UIUtils', 'BMA', 'Api', 'csConfig', 'csSettings', 'csWot', 'csCurrency', function($q, $timeout, $filter, $translate, FileSaver, UIUtils, BMA, Api,\n csConfig, csSettings, csWot, csCurrency) {\n 'ngInject';\n\n var\n api = new Api(this, \"csTx\");\n\n function reduceTxAndPush(pubkey, txArray, result, processedTxMap, allowPendings) {\n if (!txArray || !txArray.length) return; // Skip if empty\n\n _.forEach(txArray, function(tx) {\n if (tx.block_number !== null || allowPendings) {\n var walletIsIssuer = false;\n var otherIssuers = tx.issuers.reduce(function(res, issuer) {\n walletIsIssuer = walletIsIssuer || (issuer === pubkey);\n return (issuer !== pubkey) ? res.concat(issuer) : res;\n }, []);\n var otherRecipients = [],\n outputBase,\n sources = [],\n lockedOutputs;\n\n var amount = tx.outputs.reduce(function(sum, output, noffset) {\n // FIXME duniter v1.4.13\n var outputArray = (typeof output === 'string') ? output.split(':',3) : [output.amount,output.base,output.conditions];\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 conditions: outputCondition\n });\n }\n }\n\n // The output is for someone else\n else {\n // Add into recipients list(if not a issuer)\n if (outputPubkey !== '' && !_.contains(otherIssuers, outputPubkey)) {\n otherRecipients.push(outputPubkey);\n }\n if (walletIsIssuer) {\n // TODO: should be fix, when TX has multiple issuers (need a repartition)\n return sum - outputAmount;\n }\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 sources.push(angular.merge({\n amount: parseInt(outputArray[0]),\n base: outputBase,\n type: 'T',\n identifier: tx.hash,\n noffset: noffset,\n conditions: outputCondition,\n consumed: false\n }, lockedOutput));\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 txPubkeys = amount > 0 ? otherIssuers : otherRecipients;\n var time = tx.time || tx.blockstampTime;\n\n // Avoid duplicated tx, or tx to him self\n var txKey = (amount !== 0) && amount + ':' + tx.hash + ':' + time;\n if (txKey && !processedTxMap[txKey]) {\n processedTxMap[txKey] = true; // Mark as processed\n var newTx = {\n time: time,\n amount: amount,\n pubkey: txPubkeys.length === 1 ? txPubkeys[0] : undefined,\n pubkeys: txPubkeys.length > 1 ? txPubkeys : undefined,\n comment: tx.comment,\n isUD: false,\n hash: tx.hash,\n locktime: tx.locktime,\n block_number: tx.block_number\n };\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\n function loadTx(pubkey, fromTime) {\n return $q(function(resolve, reject) {\n\n var nowInSec = moment().utc().unix();\n fromTime = fromTime || (nowInSec - csSettings.data.walletHistoryTimeSecond);\n var tx = {\n pendings: [],\n validating: [],\n history: [],\n errors: []\n };\n\n var processedTxMap = {};\n\n var jobs = [\n // get current block\n csCurrency.blockchain.current(true),\n\n // get pending tx\n BMA.tx.history.pending({pubkey: pubkey})\n .then(function (res) {\n reduceTxAndPush(pubkey, res.history.sending, tx.pendings, processedTxMap, true /*allow pendings*/);\n reduceTxAndPush(pubkey, res.history.pending, tx.pendings, processedTxMap, true /*allow pendings*/);\n })\n ];\n\n // get TX history since\n if (fromTime !== 'pending') {\n var reduceTxFn = function (res) {\n reduceTxAndPush(pubkey, res.history.sent, tx.history, processedTxMap, false);\n reduceTxAndPush(pubkey, res.history.received, tx.history, processedTxMap, false);\n };\n\n // get TX from a given time\n if (fromTime > 0) {\n // Use slice, to be able to cache requests result\n var sliceTime = csSettings.data.walletHistorySliceSecond;\n fromTime = fromTime - (fromTime % sliceTime);\n for(var i = fromTime; i - sliceTime < nowInSec; i += sliceTime) {\n jobs.push(BMA.tx.history.times({pubkey: pubkey, from: i, to: i+sliceTime-1}, true /*with cache*/)\n .then(reduceTxFn)\n );\n }\n\n // Last slide: no cache\n jobs.push(BMA.tx.history.times({pubkey: pubkey, from: nowInSec - (nowInSec % sliceTime), to: nowInSec+999999999}, false/*no cache*/)\n .then(reduceTxFn));\n }\n\n // get all TX\n else {\n jobs.push(BMA.tx.history.all({pubkey: pubkey})\n .then(reduceTxFn)\n );\n }\n\n // get UD history\n if (csSettings.data.showUDHistory && fromTime > 0) {\n /*jobs.push(\n BMA.ud.history({pubkey: pubkey})\n .then(function(res){\n udHistory = !res.history || !res.history.history ? [] :\n _.forEach(res.history.history, function(ud){\n if (ud.time < fromTime) return res; // skip to old UD\n var amount = powBase(ud.amount, ud.base);\n udHistory.push({\n time: ud.time,\n amount: amount,\n isUD: true,\n block_number: ud.block_number\n });\n });\n }));*/\n // API extension\n jobs.push(\n api.data.raisePromise.loadUDs({\n pubkey: pubkey,\n fromTime: fromTime\n })\n .then(function(res) {\n if (!res || !res.length) return;\n _.forEach(res, function(hits) {\n tx.history.push(hits);\n });\n })\n\n .catch(function(err) {\n console.debug('Error while loading UDs history, on extension point.');\n console.error(err);\n })\n );\n }\n }\n\n // Execute jobs\n $q.all(jobs)\n .then(function(res){\n var current = res[0];\n\n // sort by time desc\n tx.history.sort(function(tx1, tx2) {\n return (tx2.time - tx1.time);\n });\n var firstValidatedTxIndex = tx.history.findIndex(function(tx){\n return (tx.block_number <= current.number - csSettings.data.blockValidityWindow);\n });\n // remove validating from history\n tx.validating = firstValidatedTxIndex > 0 ? tx.history.splice(0, firstValidatedTxIndex) : [];\n\n tx.fromTime = fromTime !== 'pending' && fromTime || undefined;\n tx.toTime = tx.history.length ? tx.history[0].time /*=max(tx.time)*/: tx.fromTime;\n\n resolve(tx);\n })\n .catch(reject);\n });\n }\n\n function powBase(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n }\n\n function addSource(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 function addSources(result, sources) {\n _(sources).forEach(function(src) {\n addSource(src, result.sources, result.sourcesIndexByKey);\n });\n }\n\n function loadSourcesAndBalance(pubkey) {\n return BMA.tx.sources({pubkey: pubkey})\n .then(function(res){\n var data = {\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 data.balance += powBase(src.amount, src.base);\n });\n addSources(data, res.sources);\n }\n return data;\n })\n .catch(function(err) {\n console.warn(\"[tx] Error while getting sources...\", err);\n throw err;\n });\n }\n\n function loadData(pubkey, fromTime) {\n var now = Date.now();\n\n var data;\n\n // Alert user, when request is too long (> 2s)\n $timeout(function() {\n if (!data) UIUtils.loading.update({template: \"COMMON.LOADING_WAIT\"});\n }, 2000);\n\n return $q.all([\n\n // Load Sources\n loadSourcesAndBalance(pubkey),\n\n // Load Tx\n loadTx(pubkey, fromTime)\n ])\n\n .then(function(res) {\n // Copy sources and balance\n data = res[0];\n data.tx = res[1];\n\n var txPendings = [];\n var txErrors = [];\n var balanceFromSource = data.balance;\n var balanceWithPending = 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 _.find(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 true; // 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 balanceWithPending += 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) {\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 = data.tx || {};\n data.tx.pendings = txPendings.sort(function(tx1, tx2) {\n return (tx2.time - tx1.time);\n });\n data.tx.errors = txErrors.sort(function(tx1, tx2) {\n return (tx2.time - tx1.time);\n });\n // Negative balance not allow (use only source's balance) - fix #769\n data.balance = (balanceWithPending < 0) ? balanceFromSource : balanceWithPending;\n\n // Will add uid (+ plugin will add name, avatar, etc. if enable)\n var allTx = (data.tx.history || []).concat(data.tx.validating||[], data.tx.pendings||[], data.tx.errors||[]);\n return csWot.extendAll(allTx, 'pubkey')\n .then(function() {\n console.debug('[tx] TX and sources loaded in '+ (Date.now()-now) +'ms');\n return data;\n });\n })\n .catch(function(err) {\n console.warn(\"[tx] Error while getting sources and tx...\", err);\n throw err;\n });\n }\n\n function loadSources(pubkey) {\n console.debug(\"[tx] Loading sources for \" + pubkey.substring(0,8));\n return loadData(pubkey, 'pending');\n }\n\n // Download TX history file\n function downloadHistoryFile(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 'COMMON.UNIVERSAL_DIVIDEND',\n 'ACCOUNT.HEADERS.AMOUNT',\n 'ACCOUNT.HEADERS.COMMENT']),\n csCurrency.blockchain.current(true/*withCache*/),\n loadData(pubkey, options.fromTime)\n ])\n .then(function(result){\n var translations = result[0];\n var currentBlock = result[1];\n var currentTime = (currentBlock && currentBlock.medianTime) || moment().utc().unix();\n var currency = currentBlock && currentBlock.currency;\n\n var data = result[2];\n\n // no TX\n if (!data || !data.tx || !data.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(filename){\n\n var formatDecimal = $filter('formatDecimal');\n var medianDate = $filter('medianDate');\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 = data.tx.history.concat(data.tx.validating).reduce(function(res, tx){\n return res.concat([\n medianDate(tx.time),\n tx.uid,\n tx.pubkey,\n formatDecimal(tx.amount/100),\n '\"' + (tx.isUD ? translations['COMMON.UNIVERSAL_DIVIDEND'] : tx.comment) + '\"'\n ].join(';') + '\\n');\n }, [headers.join(';') + '\\n']);\n\n var file = new Blob(content, {type: 'text/plain; charset=utf-8'});\n FileSaver.saveAs(file, filename);\n });\n });\n }\n\n // Register extension points\n api.registerEvent('data', 'loadUDs');\n\n return {\n load: loadData,\n loadSources: loadSources,\n downloadHistoryFile: downloadHistoryFile,\n // api extension\n api: api\n };\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', '$ionicHistory', 'UIUtils', 'Api', 'Idle', 'localStorage', 'sessionStorage', 'Modals', 'CryptoUtils', 'csCrypto', 'BMA', 'csConfig', 'csSettings', 'FileSaver', 'Blob', 'csWot', 'csTx', 'csCurrency', function($q, $rootScope, $timeout, $translate, $filter, $ionicHistory, UIUtils,\n Api, Idle, localStorage, sessionStorage, Modals,\n CryptoUtils, csCrypto, BMA, csConfig, csSettings, FileSaver, Blob, csWot, csTx, csCurrency) {\n 'ngInject';\n\n var defaultBMA = BMA;\n var service;\n\n function CsWallet(id, BMA) {\n\n BMA = BMA || defaultBMA;\n var\n exports,\n constants = {\n STORAGE_PUBKEY: 'pubkey',\n STORAGE_UID: 'uid',\n STORAGE_DATA_PREFIX: 'data-',\n STORAGE_SECKEY: 'seckey',\n /* Need for compat with old currencies (test_net and sou) */\n TX_VERSION: BMA.constants.PROTOCOL_VERSION,\n IDTY_VERSION: BMA.constants.PROTOCOL_VERSION,\n MS_VERSION: BMA.constants.PROTOCOL_VERSION,\n CERT_VERSION: BMA.constants.PROTOCOL_VERSION,\n REVOKE_VERSION: BMA.constants.PROTOCOL_VERSION,\n TX_MAX_INPUTS_COUNT: 40 // Allow to get a TX with less than 100 rows (=max row count in Duniter protocol)\n },\n data = {},\n settings,\n listeners,\n started,\n startPromise,\n loadPromise,\n enableAuthIdle = false,\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.localName = null;\n data.isNew = null;\n data.sourcesIndexByKey = null;\n data.medianTime = null;\n data.requirements = {};\n data.blockUid = null;\n data.sigDate = null;\n data.sigStock = null;\n data.isMember = false;\n data.events = [];\n\n // children's wallets\n data.children = [];\n\n // Encrypted (need auth() to be encrypted)\n data.encryptedData = null;\n\n resetKeypair();\n resetTxAndSources();\n\n started = false;\n startPromise = undefined;\n\n if (init) {\n api.data.raise.init(data);\n }\n else {\n if (isDefault() && settings && !settings.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 resetSources = function(){\n // reset sources data\n data.sources = undefined;\n data.sourcesIndexByKey = undefined;\n data.balance = 0;\n },\n\n resetTx = function(){\n // reset TX data\n data.tx = data.tx || {};\n data.tx.history = [];\n data.tx.pendings = [];\n data.tx.validating = [];\n data.tx.errors = [];\n delete data.tx.fromTime;\n delete data.tx.toTime;\n },\n\n resetTxAndSources = function(){\n // reset sources data\n resetSources();\n // reset TX data\n resetTx();\n },\n\n isDefault = function(){\n return id === 'default';\n },\n\n hasEncryptedData = function(){\n return data.encryptedData && data.encryptedData.nonce && data.encryptedData.content;\n },\n\n addSource = function(src, sources, sourcesIndexByKey) {\n var srcKey = src.type+':'+src.identifier+':'+src.noffset;\n if (angular.isUndefined(sourcesIndexByKey[srcKey])) {\n if (!src.conditions) {\n console.warn(\"Trying to add a source without output condition !\", src);\n }\n sources.push(src);\n sourcesIndexByKey[srcKey] = sources.length - 1;\n }\n },\n\n addSources = function(sources) {\n data.sources = data.sources || [];\n data.sourcesIndexByKey = data.sourcesIndexByKey || {};\n _(sources).forEach(function(src) {\n addSource(src, data.sources, data.sourcesIndexByKey);\n });\n },\n\n // Show login modal\n login = function(options) {\n if (!started) {\n return (startPromise || start())\n .then(function () {\n return login(options); // loop\n });\n }\n\n var needLogin = !isLogin();\n var needAuth = options && ((options.auth && !isAuth()) || options.forceAuth);\n\n // user already login\n if (!needLogin && !needAuth) {\n if (!isDataLoaded(options)) {\n return loadData(options);\n }\n return $q.when(data);\n }\n var keepAuth = csSettings.data.keepAuthIdle > 0;\n\n var authData;\n return (options && options.authData ? $q.when(options.authData) : Modals.showLogin(options))\n .then(function(res){\n if (!res || !res.pubkey ||\n (!needLogin && res.pubkey !== data.pubkey) ||\n (needAuth && (!res.keypair || !res.keypair.signPk || !res.keypair.signSk))) {\n throw 'CANCELLED';\n } // invalid data\n\n authData = res;\n data.pubkey = authData.pubkey;\n data.uid = authData.uid || data.uid;\n data.isNew = options && angular.isDefined(options.isNew) ? options.isNew : data.isNew;\n if (keepAuth) {\n data.keypair = authData.keypair || {\n signSk: null,\n signPk: null\n };\n }\n\n if (needLogin) {\n // extend API to check login validity\n return api.data.raisePromise.loginCheck(data)\n .catch(function (err) {\n resetData(); // Reset data if not valid, then exit process\n throw err;\n })\n // Call extend api\n .then(function() {\n if (needLogin) {\n return api.data.raisePromise.login(data)\n .catch(function(err) {\n console.warn('Error during extension call [wallet.api.data.on.login]', err);\n // continue\n });\n }\n });\n }\n })\n\n .then(function() {\n // Read data from pubkey (when first login)\n if (needLogin) {\n return restoreData();\n }\n // Or the was login but now auth: just try to decrypt data\n else if (needAuth) {\n return openEncryptedData();\n }\n })\n\n .then(function() {\n if (needLogin) {\n\n // store wallet\n store();\n }\n\n // Send auth event (if need)\n if (needAuth || isAuth()) {\n // Check if need to start/stop auth idle\n checkAuthIdle(true);\n\n return api.data.raisePromise.auth(keepAuth ? data : authData);\n }\n })\n .then(function() {\n // Load data if need\n // If user just login, force data full load (even if min data asked)\n // because the user can wait (after the login modal)\n var loadOptions = !needLogin && options && options.minData ? {minData: true} : undefined/*=load all*/;\n if (!isDataLoaded(loadOptions)) {\n return loadData(loadOptions);\n }\n })\n .then(function() {\n if (options && options.silent) {\n UIUtils.loading.hide(10);\n }\n else {\n UIUtils.loading.hide(1000);\n }\n\n return keepAuth ? data : angular.merge({}, data, authData);\n })\n .catch(function(err) {\n if (err === 'RETRY' && (!options || !options.authData)) {\n return $timeout(function(){\n return login(options);\n }, 300);\n }\n throw err;\n });\n },\n\n logout = function() {\n var wasAuth = isAuth();\n\n return $q(function(resolve, reject) {\n\n var pubkey = data.pubkey;\n resetData(); // will reset keypair\n resetStore(pubkey); // reset store\n\n // Send logout event\n api.data.raise.logout();\n\n if (wasAuth) {\n api.data.raise.unauth();\n }\n\n checkAuthIdle(false);\n\n $ionicHistory.clearCache();\n\n resolve();\n });\n },\n\n isLogin = function() {\n return !!data.pubkey;\n },\n\n auth = function(options) {\n if (!started) {\n return (startPromise || start())\n .then(function () {\n return auth(options); // loop\n });\n }\n\n if (isAuth() && (!options || !options.forceAuth)) {\n return $q.when(data);\n }\n\n options = options || {};\n options.expectedPubkey = isLogin() && data.pubkey;\n options.auth = true;\n return login(options);\n },\n\n unauth = function() {\n return $q(function(resolve, reject) {\n\n resetKeypair();\n store();\n\n // Send unauth event\n api.data.raise.unauth();\n\n checkAuthIdle(false);\n\n $ionicHistory.clearCache();\n\n resolve();\n });\n },\n\n isAuth = function() {\n return data.pubkey && data.keypair && data.keypair.signSk && true;\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 (isAuth()) {\n return $q.when(data.keypair);\n }\n options = options || {};\n options.silent = angular.isDefined(options.silent) ? options.silent : true;\n return auth(options)\n .then(function() {\n return data.keypair;\n });\n },\n\n hasSelf = function() {\n return !!data.pubkey && !data.requirements.needSelf;\n },\n\n isDataLoaded = function(options) {\n if (options) {\n if (options.minData && !options.sources) return data.loaded && true;\n if (options.requirements && !data.requirements.loaded) return false;\n if (options.tx && options.tx.enable && (!data.tx.fromTime || data.tx.fromTime === 'pending')) return false;\n if (options.sigStock && !data.sigStock) return false;\n }\n return data.loaded && data.sources && true;\n },\n\n isNeverUsed = function() {\n if (!data.loaded) return undefined; // undefined if not full loaded\n return !data.pubkey || !(\n // Check registration\n data.isMember ||\n data.requirements.pendingMembership ||\n data.requirements.revoked ||\n !data.requirements.needSelf ||\n data.requirements.wasMember ||\n\n // Check sources\n (data.sources && data.sources.length > 0) ||\n\n // Check TX history\n data.tx.history.length > 0 ||\n data.tx.validating.length > 0 ||\n data.tx.pendings.length > 0 ||\n\n // Check extended data (name+avatar)\n !!data.localName ||\n !!data.name ||\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 pubkey and uid\n store = function(pubkey) {\n pubkey = pubkey && typeof pubkey == 'string' ? pubkey : data.pubkey;\n if (settings && settings.useLocalStorage) {\n\n if (isLogin() && settings.rememberMe) {\n\n var now = Date.now();\n console.debug(\"[wallet] Storing...\");\n\n var jobs = [];\n\n // Use session storage for secret key - fix #372\n if (settings.keepAuthIdle == csSettings.constants.KEEP_AUTH_IDLE_SESSION && isAuth()) {\n jobs.push(sessionStorage.put(constants.STORAGE_SECKEY, CryptoUtils.util.encode_base58(data.keypair.signSk)));\n }\n else {\n jobs.push(sessionStorage.put(constants.STORAGE_SECKEY, null));\n }\n\n // Use local storage for pubkey\n jobs.push(localStorage.put(constants.STORAGE_PUBKEY, data.pubkey));\n\n // Use local storage for uid - fix #625\n if (data.uid) {\n jobs.push(localStorage.put(constants.STORAGE_UID, data.uid));\n }\n else {\n jobs.push(localStorage.put(constants.STORAGE_UID, null));\n }\n\n return $q.all(jobs)\n .then(function() {\n console.debug(\"[wallet] Stored in \"+ (Date.now() - now) +\"ms\");\n });\n }\n else {\n // Resetting local storage\n return $q.all([\n sessionStorage.put(constants.STORAGE_SECKEY, null),\n localStorage.put(constants.STORAGE_PUBKEY, null),\n localStorage.put(constants.STORAGE_UID, null),\n // Clean data (only in the session storage - keep local)\n pubkey ? sessionStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when()\n ]);\n }\n }\n else {\n return $q.all([\n sessionStorage.put(constants.STORAGE_SECKEY, null),\n localStorage.put(constants.STORAGE_PUBKEY, null),\n localStorage.put(constants.STORAGE_UID, null),\n // Clean data\n pubkey ? sessionStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when(),\n pubkey ? localStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when()\n ]);\n }\n },\n\n // reset data store for this pubkey\n resetStore = function(pubkey) {\n\n console.debug(\"[wallet] Resetting stored pubkey (and uid) in local storage...\");\n\n sessionStorage.put(constants.STORAGE_SECKEY, null);\n localStorage.put(constants.STORAGE_PUBKEY, null);\n localStorage.put(constants.STORAGE_UID, null);\n\n if (settings && settings.useLocalStorage) {\n // Clean data (only in the session storage - keep local)\n return pubkey ? sessionStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when();\n }\n else {\n console.debug(\"[wallet] Resetting stored data in local storage...\");\n return $q.all([\n pubkey ? sessionStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when(),\n pubkey ? localStorage.put(constants.STORAGE_DATA_PREFIX + pubkey, null) : $q.when()\n ]);\n }\n },\n\n // store children wallet, notifications read Time, ...\n storeData = function() {\n if (!isLogin()) throw {message:'ERROR.NEED_LOGIN_FIRST'};\n\n var useEncryption = settings && settings.useLocalStorageEncryption;\n var storageKey = constants.STORAGE_DATA_PREFIX + data.pubkey;\n\n var content; // Init only if used\n var secureContent; // Init only if used\n\n // Add time\n if (data.notifications && data.notifications.time) {\n content = content || {};\n content.notifications = {\n time: data.notifications.time\n };\n }\n if (data.invitations && data.invitations.time) {\n content = content || {};\n content.invitations = {\n time: data.invitations.time\n };\n }\n\n // Add children wallets\n if (data.children && data.children.length) {\n // remember children count - need when data still encrypted, by method getChildrenCount()\n content = content || {};\n content.childrenCount = data.children.length;\n\n secureContent = secureContent || {}; // Init th secured content\n // Add children wallet\n secureContent.children = _.map(data.children, function(wallet) {\n return {\n pubkey: wallet.data.pubkey,\n uid: wallet.data.uid,\n localName: wallet.data.localName\n };\n });\n }\n var contentStr = (content || secureContent) && JSON.stringify(angular.merge({}, content||{}, secureContent||{}));\n\n // Not encryption (or nothing to secure content): store without encryption\n if (!useEncryption || !secureContent) {\n return $q.all([\n sessionStorage.put(storageKey, null), // clear session storage (not used if no encryption)\n localStorage.put(storageKey, contentStr || null)\n ]);\n }\n\n // Encryption is enable, but user not auth: use the session storage\n // (and keep the local storage value)\n if (!isAuth()) {\n return sessionStorage.put(storageKey, contentStr||null);\n }\n\n return $q.all([\n // Get a unique nonce\n CryptoUtils.util.random_nonce(),\n // Get box keypair\n CryptoUtils.box.keypair.fromSignKeypair(data.keypair),\n // Put also (without encryption) in the session storage\n sessionStorage.put(storageKey, contentStr || null)\n ])\n .then(function(res) {\n var nonce = res[0];\n var keypair = res[1];\n\n return CryptoUtils.box.pack(JSON.stringify(secureContent), nonce, keypair.boxPk, keypair.boxSk)\n .then(function(cypherContent) {\n content = angular.merge(content||{}, {\n encryptedData: {\n nonce: CryptoUtils.util.encode_base58(nonce),\n content: cypherContent\n }\n });\n //console.debug(\"[wallet] Storing with encryption: \", content);\n return localStorage.put(storageKey, JSON.stringify(content));\n });\n });\n },\n\n restore = function() {\n return $q.all([\n sessionStorage.get(constants.STORAGE_SECKEY),\n localStorage.get(constants.STORAGE_PUBKEY),\n localStorage.get(constants.STORAGE_UID)\n ])\n .then(function(res) {\n var seckey = res[0];\n var pubkey = res[1];\n var uid = res[2];\n if (!pubkey || pubkey == 'null') return;\n\n console.debug('[wallet] Restore {' + pubkey.substring(0, 8) + '} from local storage');\n\n var keypair;\n if (seckey && seckey.length && seckey != 'null') {\n try {\n keypair = {\n signPk: CryptoUtils.util.decode_base58(pubkey),\n signSk: CryptoUtils.util.decode_base58(seckey)\n };\n }\n catch (err) {\n console.warn('[wallet] Secret key restoration failed: ', err);\n keypair = undefined;\n }\n }\n\n data.pubkey = pubkey;\n data.uid = uid && uid != 'null' ? uid : undefined;\n data.keypair = keypair || {signPk: undefined, signSk: undefined};\n\n // Get pubkey's data\n return restoreData();\n })\n\n .then(function() {\n // Successful restored: raise API events\n if (isAuth()) {\n return $q.all([\n api.data.raisePromise.login(data),\n checkAuthIdle(true),\n api.data.raisePromise.auth(data)\n ])\n .catch(function(err) {\n console.warn('Error during extension call [wallet.api.data.on.auth]', err);\n // continue\n });\n }\n else if (isLogin()) {\n return api.data.raisePromise.login(data)\n .catch(function(err) {\n console.warn('Error during extension call [wallet.api.data.on.login]', err);\n // continue\n });\n }\n })\n\n .then(function(){\n return data;\n });\n },\n\n restoreData = function() {\n if (!isLogin()) throw {message:'ERROR.NEED_LOGIN_FIRST'};\n if (isNew()) return $q.when(data); // Skip restore\n // Get pubkey's data\n return $q.all([\n sessionStorage.getObject(constants.STORAGE_DATA_PREFIX + data.pubkey),\n localStorage.getObject(constants.STORAGE_DATA_PREFIX + data.pubkey)\n ])\n // Apply data, first from the session storage, then from local storage\n .then(function (res) {\n var sessionStorageData = res[0];\n var localStorageData = res[1];\n if (sessionStorageData && sessionStorageData.children && sessionStorageData.children.length === localStorageData.childrenCount) {\n return applyRestoredData(sessionStorageData)\n .catch(function(err) {\n console.error(\"[wallet] Failed to restore from the session storage ! Retrying from the local storage...\", err);\n // Retry using another storage\n return applyRestoredData(localStorageData);\n });\n }\n return applyRestoredData(localStorageData);\n });\n },\n\n applyRestoredData = function(content) {\n if (!content) return $q.when(); // skip\n\n // Apply children\n if (content.children) {\n var oldChildrenCount = data.childrenCount;\n var oldChildren = removeAllChildrenWallets({\n stop: false, /*do not stop wallet*/\n store: false/*skip store*/\n });\n\n try {\n var pubkeys = {};\n _.forEach(content.children, function(child) {\n if (!pubkeys[child.pubkey]) { // make sure wallet is unique by pubkey\n pubkeys[child.pubkey] = true;\n var wallet = newChildInstance();\n wallet.data.pubkey = child.pubkey;\n wallet.data.localName = child.localName;\n wallet.data.uid = child.uid;\n addChildWallet(wallet, {store: false/*skip store*/});\n }\n });\n delete content.children;\n // childrenCount not need anymore\n delete data.childrenCount;\n }\n catch(err) {\n console.error(\"[wallet] Failed to restore children wallet.\", err);\n // Restore removed values\n data.childrenCount = oldChildrenCount;\n data.children = oldChildren;\n return $q.reject({message:'ERROR.RESTORE_WALLET_LIST_FAILED'});\n }\n\n // Restoration succeed: stop old children\n _.forEach(oldChildren||[], function(child) {\n child.stop();\n });\n }\n\n // make sure to remove pubkey before copy\n delete content.pubkey;\n delete content.uid;\n\n // Copy to data\n angular.merge(data, content);\n\n // If auth: open encrypted data\n if (hasEncryptedData() && isAuth()) {\n return openEncryptedData({store: false})\n .then(function(){\n return data; // Important: return the data\n });\n }\n\n return $q.when(data); // Important: return the data\n },\n\n getData = function() {\n return data;\n },\n\n loadRequirements = function(withCache, secondTry) {\n // Clean existing events\n cleanEventsByContext('requirements');\n\n // Get requirements\n return csWot.loadRequirements(data, withCache)\n .catch(function(err) {\n // Retry once (can be a timeout, because Duniter node are long to response)\n if (!secondTry) {\n console.error(\"[wallet] Unable to load requirements: Will retrying... \", err);\n UIUtils.loading.update({template: \"COMMON.LOADING_WAIT\"});\n return loadRequirements(withCache, true);\n }\n throw err;\n });\n },\n\n loadTxAndSources = function(fromTime) {\n return csTx.load(data.pubkey, fromTime)\n .then(function(res){\n resetTxAndSources();\n angular.merge(data, res);\n })\n .catch(function(err) {\n resetTxAndSources();\n throw err;\n });\n },\n\n loadSources = function() {\n return csTx.loadSources(data.pubkey)\n .then(function(res){\n resetSources();\n angular.merge(data, res);\n })\n .catch(function(err) {\n resetSources();\n throw err;\n });\n },\n\n /**\n * Add user events (generate events from requirements)\n */\n addEvents = function() {\n if (data.requirements.revoked) {\n delete data.requirements.meta.invalid;\n addEvent({type:'info', message: 'ERROR.WALLET_REVOKED', context: 'requirements'});\n }\n else if (data.requirements.pendingRevocation) {\n delete data.requirements.meta.invalid;\n addEvent({type:'pending', message: 'INFO.REVOCATION_SENT_WAITING_PROCESS', context: 'requirements'});\n }\n\n // If not revoked\n else {\n if (!data.isMember && data.requirements.meta && data.requirements.meta.invalid) {\n addEvent({type: 'error', message: 'ERROR.WALLET_INVALID_BLOCK_HASH', context: 'requirements'});\n console.debug(\"Invalid membership for uid={0}: block hash changed\".format(data.uid));\n }\n // Check if self expired\n else if (!data.isMember && data.requirements.expired) {\n addEvent({type: 'error', message: 'ERROR.WALLET_IDENTITY_EXPIRED', context: 'requirements'});\n console.debug(\"Identity expired for uid={0}.\".format(data.uid));\n }\n // Pending membership\n else if (data.requirements.pendingMembership) {\n addEvent({type:'pending', message: 'ACCOUNT.WAITING_MEMBERSHIP', context: 'requirements'});\n\n // Add a warning when out distanced\n // (only if has enough certification - fix #808)\n if (!data.requirements.needCertificationCount && data.requirements.outdistanced) {\n addEvent({type:'warn', message: 'ACCOUNT.OUT_DISTANCED', context: 'requirements'});\n }\n }\n // If user has send a SELF, ask for membership - fix #625\n else if (!data.requirements.needSelf && data.requirements.needMembership){\n addEvent({type:'warn', message: 'ACCOUNT.NO_WAITING_MEMBERSHIP', context: 'requirements'});\n }\n\n if (data.requirements.needRenew) {\n // Still a member: WILL need renew\n if (data.isMember && data.requirements.membershipExpiresIn > 0) {\n addEvent({type:'warn', message: 'ACCOUNT.WILL_NEED_RENEW_MEMBERSHIP', messageParams: data.requirements, context: 'requirements'});\n }\n // Fix #649: Not a member anymore, even if membership NOT expired, because membersjip cancelled for lack of certifications\n else if (!data.isMember && data.requirements.membershipExpiresIn > 0 && data.requirements.needCertificationCount > 0) {\n addEvent({type:'warn', message: 'ACCOUNT.NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED', messageParams: data.requirements, context: 'requirements'});\n }\n // Not a member anymore\n else {\n addEvent({type:'warn', message: 'ACCOUNT.NEED_RENEW_MEMBERSHIP', messageParams: data.requirements, context: 'requirements'});\n }\n }\n else\n {\n if (data.requirements.needCertificationCount > 0) {\n addEvent({type:'info', message: 'ACCOUNT.WAITING_CERTIFICATIONS', messageParams: data.requirements, context: 'requirements'});\n // Add a help message, if user has never been a member\n if (!data.requirements.wasMember) {\n addEvent({\n type: 'help',\n message: 'ACCOUNT.WAITING_CERTIFICATIONS_HELP',\n messageParams: data.requirements,\n context: 'requirements'\n });\n }\n }\n if (data.requirements.willNeedCertificationCount > 0) {\n addEvent({type:'warn', message: 'ACCOUNT.WILL_MISSING_CERTIFICATIONS', messageParams: data.requirements, context: 'requirements'});\n }\n if (data.requirements.wasMember && data.requirements.needMembership) {\n addEvent({type:'warn', message: 'ACCOUNT.NEED_RENEW_MEMBERSHIP', messageParams: data.requirements, context: 'requirements'});\n }\n // Add a warning when out distanced - fix #777\n if (!data.requirements.needCertificationCount && !data.requirements.willNeedCertificationCount && data.requirements.outdistanced) {\n addEvent({type:'warn', message: 'ACCOUNT.OUT_DISTANCED', context: 'requirements'});\n }\n }\n }\n },\n\n loadSigStock = function() {\n // Get certified by, then count written certification\n return BMA.wot.certifiedBy({pubkey: data.pubkey})\n .then(function(res){\n data.sigStock = !res.certifications ? 0 : res.certifications.reduce(function(res, cert) {\n return cert.written === null ? res : res+1;\n }, 0);\n })\n .catch(function(err) {\n if (!!err && err.ucode == BMA.errorCodes.NO_MATCHING_MEMBER) {\n data.sigStock = 0;\n }\n /*FIXME: workaround for Duniter issue #1309 */\n else if (!!err && err.ucode == 1002) {\n console.warn(\"[wallet-service] Detecting Duniter issue #1309 ! Applying workaround... \");\n data.sigStock = 0;\n }\n else {\n throw err;\n }\n });\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 var alertIfUnusedWallet = !csCurrency.data.initPhase && (!csSettings.data.wallet || csSettings.data.wallet.alertIfUnusedWallet) &&\n !data.loaded && (!options || !options.minData || !options.silent);\n\n // Make sure to load once at a time\n if (loadPromise) {\n return loadPromise.then(function() {\n return isDataLoaded(options) ? data : refreshData(options);\n });\n }\n\n if (options && options.minData) {\n loadPromise = loadMinData(options);\n }\n else if (options || data.loaded) {\n loadPromise = refreshData(options);\n }\n else {\n loadPromise = loadFullData();\n }\n\n return $q.all([\n loadPromise,\n\n // Create the QR code\n loadQrCode()\n ])\n // Warn if wallet has been never used - see #167\n .then(function() {\n var unused = isNeverUsed();\n var showAlert = alertIfUnusedWallet && !isNew() && unused === true;\n if (!showAlert) return true;\n return UIUtils.loading.hide()\n .then(function() {\n return UIUtils.alert.confirm('CONFIRM.LOGIN_UNUSED_WALLET', 'CONFIRM.LOGIN_UNUSED_WALLET_TITLE', {\n cancelText: 'COMMON.BTN_CONTINUE',\n okText: 'COMMON.BTN_RETRY'\n });\n })\n .then(function(retry) {\n if (retry) {\n return logout().then(function() {\n throw 'RETRY';\n });\n }\n else {\n // Remembering to not ask for confirmation\n if (csSettings.data.wallet.alertIfUnusedWallet) {\n csSettings.data.wallet.alertIfUnusedWallet = false;\n csSettings.store();\n }\n }\n return true;\n });\n })\n\n // Return wallet data\n .then(function(confirm) {\n loadPromise = null;\n if (confirm) {\n return data;\n }\n else { // cancel\n\n throw 'CANCELLED';\n }\n });\n },\n\n loadFullData = function(fromTime) {\n data.loaded = false;\n\n var now = Date.now();\n console.debug(\"[wallet] Loading {{0}} full data...\".format(data.pubkey.substr(0,8)));\n\n return $q.all([\n\n // Get requirements\n loadRequirements(true)\n .then(function(data) {\n if (data.requirements && (data.requirements.isMember || data.requirements.wasMember)) {\n // Load sigStock\n return loadSigStock();\n }\n else {\n data.sigStock = 0;\n }\n }),\n\n // Get TX and sources (only pending by default)\n loadTxAndSources(fromTime || 'pending')\n ])\n .then(function() {\n\n // Load wallet events\n addEvents();\n\n // API extension\n return api.data.raisePromise.load(data)\n .catch(function(err) {\n console.error('[wallet] Error during load API extension point. Try to continue',err);\n });\n })\n .then(function() {\n data.loaded = true;\n console.debug(\"[wallet] Loaded {{0}} full data in {1}ms\".format(data.pubkey.substr(0,8), Date.now() - now));\n\n // Make sure to hide loading, because sometimes it stay - should fix freeze screen\n UIUtils.loading.hide(1000);\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 options.requirements = angular.isDefined(options.requirements) ? options.requirements :\n (!data.requirements.loaded || angular.isUndefined(data.requirements.needSelf));\n if (!options.requirements) {\n return $q.when(data);\n }\n\n return refreshData(options)\n .then(function(data) {\n data.loaded = true;\n return data;\n });\n },\n\n refreshData = function(options) {\n options = options || {\n requirements: true,\n sources: true,\n tx: {\n enable: true,\n fromTime: data.tx && data.tx.fromTime !== 'pending' ? data.tx.fromTime : undefined // keep previous time\n },\n sigStock: true,\n api: true\n };\n\n // Force some load (requirements) if not already loaded\n options.requirements = angular.isDefined(options.requirements) ? options.requirements : !data.requirements.loaded;\n\n // Force sources when TX enable\n if (angular.isUndefined(options.sources) && options.tx && options.tx.enable) {\n options.sources = true;\n }\n\n var jobs = [];\n\n var now = Date.now();\n console.debug(\"[wallet] {0} {{1}} data, with options: \".format(!data.loaded ? 'Loading' : 'Refreshing', data.pubkey.substr(0,8)), options);\n\n // Get requirements\n if (options.requirements) {\n // Reset events\n cleanEventsByContext('requirements');\n\n jobs.push(\n loadRequirements(true)\n\n // Add wallet events\n .then(addEvents)\n );\n }\n\n if (options.sources && (!options.tx || options.tx.enable)) {\n // Get TX and sources\n jobs.push(loadTxAndSources(options.tx ? options.tx.fromTime: undefined));\n }\n\n else if (options.sources && (options.tx && !options.tx.enable)) {\n // Get sources and only pending TX (and NOT the TX history)\n jobs.push(loadTxAndSources('pending'));\n }\n\n // Load sigStock\n if (options.sigStock) jobs.push(loadSigStock());\n\n return (jobs.length ? $q.all(jobs) : $q.when())\n .then(function() {\n // Skip api\n if (angular.isDefined(options.api) && !options.api) return data;\n\n // API extension (after all other jobs)\n return api.data.raisePromise.load(data)\n .then(function(){\n\n console.debug(\"[wallet] {0} {{1}} data in {2}ms\".format(!data.loaded ? 'Loaded' : 'Refreshed', data.pubkey.substr(0,8), Date.now() - now));\n\n // Compute if full loaded\n if (!data.loaded) {\n data.loaded = data.requirements.loaded && data.sources && true;\n }\n\n return data;\n });\n })\n .catch(function(err) {\n console.error(\"[wallet] Error while {0} data: \".format(!data.loaded ? 'Loading' : 'Refreshing'), err);\n data.loaded = data.requirements.loaded && data.sources && true;\n throw err;\n });\n },\n\n setSelf = function(uid, blockUid){\n // Skip if same self\n if (data.uid == uid && (!blockUid || data.blockUid == blockUid)) return $q.when();\n\n // Data not loaded\n if (!data.loaded) {\n return !loadPromise ?\n // If no pending load: ok\n $q.when() :\n // If a load is running: force a reload\n loadPromise.then(function() {\n return setSelf(uid, blockUid); // loop\n });\n }\n\n data.uid = uid;\n data.blockUid = blockUid;\n\n // Refresh requirements\n return refreshData({requirements: true, sigStock: true})\n .then(function() {\n // Store (to remember the new uid)\n return store({skipData: true});\n });\n },\n\n isBase = function(amount, base) {\n if (!base) return true; // no base\n if (amount < Math.pow(10, base)) return false; // too small\n var rest = '00000000' + amount;\n var lastDigits = parseInt(rest.substring(rest.length-base));\n return lastDigits === 0; // no rest\n },\n\n truncBase = function(amount, base) {\n var pow = Math.pow(10, base); // = min value in this base\n if (amount < pow) return 0;\n return Math.trunc(amount / pow ) * pow;\n },\n\n truncBaseOrMinBase = function(amount, base) {\n var pow = Math.pow(10, base);\n if (amount < pow) return pow; //\n return Math.trunc(amount / pow ) * pow;\n },\n\n powBase = function(amount, base) {\n return base <= 0 ? amount : amount * Math.pow(10, base);\n },\n\n getInputs = function(amount, outputBase, filterBase) {\n if (angular.isUndefined(filterBase)) {\n filterBase = outputBase;\n }\n var sourcesAmount = 0;\n var sources = [];\n var minBase = filterBase;\n var maxBase = filterBase;\n _.find(data.sources || [], function(source) {\n if (!source.consumed && source.base === filterBase &&\n // Filter on simple SIG output condition - fix #845\n BMA.regexp.TX_OUTPUT_SIG.exec(source.conditions)\n ) {\n sourcesAmount += powBase(source.amount, source.base);\n sources.push(source);\n }\n // Stop if enough sources\n return (sourcesAmount >= amount);\n });\n\n // IF not enough sources, get add inputs from lower base (recursively)\n if (sourcesAmount < amount && filterBase > 0) {\n filterBase -= 1;\n var missingAmount = amount - sourcesAmount;\n var lowerInputs = getInputs(missingAmount, outputBase, filterBase);\n\n // Add lower base inputs to result\n if (lowerInputs.amount > 0) {\n minBase = lowerInputs.minBase;\n sourcesAmount += lowerInputs.amount;\n [].push.apply(sources, lowerInputs.sources);\n }\n }\n\n return {\n minBase: minBase,\n maxBase: maxBase,\n amount: sourcesAmount,\n sources: sources\n };\n },\n\n /**\n * Send a new transaction\n */\n transfer = function(destPub, amount, comments, useRelative, restPub, block) {\n return $q.all([\n getKeypair(),\n csCurrency.get(),\n block && $q.when(block) || csCurrency.blockchain.current(true)\n ])\n .then(function(res) {\n var keypair = res[0];\n var currency = res[1];\n block = res[2];\n if (!BMA.regexp.PUBKEY.test(destPub)){\n throw {message:'ERROR.INVALID_PUBKEY'};\n }\n if (!BMA.regexp.COMMENT.test(comments)){\n throw {message:'ERROR.INVALID_COMMENT'};\n }\n if (!isLogin()){\n throw {message:'ERROR.NEED_LOGIN_FIRST'};\n }\n if (destPub === data.pubkey){\n throw {message:'ERROR.SAME_TX_RECIPIENT'};\n }\n if (!amount) {\n throw {message:'ERROR.AMOUNT_REQUIRED'};\n }\n if (amount <= 0) {\n throw {message:'ERROR.AMOUNT_NEGATIVE'};\n }\n amount = Math.floor(amount); // remove decimals\n\n var inputs = {\n amount: 0,\n minBase: block.unitbase,\n maxBase: block.unitbase + 1,\n sources : []\n };\n\n var logs = [];\n logs.push(\"[wallet] amount=\" + amount);\n\n // Get inputs, starting to use current base sources\n var amountBase = 0;\n while (inputs.amount < amount && amountBase <= block.unitbase) {\n inputs = getInputs(amount, block.unitbase);\n\n if (inputs.amount < amount) {\n // try to reduce amount (replace last digits to zero)\n amountBase++;\n if (amountBase <= block.unitbase) {\n amount = truncBase(amount, amountBase);\n logs.push(\"[wallet] inputs not found. Retrying with amount =\" + amount + \" be compatible with amountBase=\" + amountBase);\n }\n }\n }\n\n if (inputs.amount < amount) {\n if (data.balance < amount) {\n throw {message:'ERROR.NOT_ENOUGH_CREDIT'};\n }\n else if (inputs.amount === 0) {\n throw {message:'ERROR.ALL_SOURCES_USED'};\n }\n else {\n return $translate('COMMON.UD')\n .then(function(UD) {\n var params;\n if(useRelative) {\n params = {\n amount: ($filter('formatDecimal')(inputs.amount / currency.currentUD)),\n unit: UD,\n subUnit: $filter('abbreviate')(currency.name)\n };\n }\n else {\n params = {\n amount: ($filter('formatDecimal')(inputs.amount/100)),\n unit: $filter('abbreviate')(currency.name),\n subUnit: ''\n };\n }\n return $translate('ERROR.NOT_ENOUGH_SOURCES', params)\n .then(function(message) {\n throw {message: message};\n });\n });\n }\n }\n // Avoid to get outputs on lower base\n if (amountBase < inputs.minBase && !isBase(amount, inputs.minBase)) {\n amount = truncBaseOrMinBase(amount, inputs.minBase);\n console.debug(\"[wallet] Amount has been truncate to \" + amount);\n logs.push(\"[wallet] Amount has been truncate to \" + amount);\n }\n else if (amountBase > 0) {\n console.debug(\"[wallet] Amount has been truncate to \" + amount);\n logs.push(\"[wallet] Will use amount truncated to \" + amount + \" (amountBase=\"+amountBase+\")\");\n }\n\n // Send tx\n return createAndSendTx(currency, block, keypair, destPub, amount, inputs, comments, restPub||data.pubkey, logs)\n .then(function(res) {\n data.balance -= res.amount;\n if (data.balance < 0) data.balance = 0; // fix #712\n _.forEach(inputs.sources, function(source) {\n source.consumed=true;\n });\n\n // Add new sources\n if (res && res.sources.length) {\n console.debug(\"[wallet-service] New sources to be add after the TX: \", res.sources);\n addSources(res.sources);\n }\n\n // Add TX to pendings\n var pendingTx = {\n time: csCurrency.date.now(),\n amount: -amount,\n pubkey: destPub,\n comment: comments,\n isUD: false,\n hash: res.hash,\n locktime: 0,\n block_number: null\n };\n return csWot.extendAll([pendingTx], 'pubkey')\n .then(function() {\n data.tx.pendings.unshift(pendingTx);\n\n // API extension\n api.data.raise.balanceChanged(data);\n api.data.raise.newTx(data);\n\n // Return TX hash (if chained TXs, return the last tx hash) - required by Cesium-API\n return {\n hash: res.hash\n };\n });\n })\n .catch(function(err) {\n\n // Source already consumed: whould refresh wallet sources\n if (err && err.ucode === BMA.errorCodes.SOURCE_ALREADY_CONSUMED) {\n console.debug('[wallet] TX rejected by node with error [{0}]. Reloading sources then retry...'.format(err.message||'Source already consumed'));\n return $timeout(loadTxAndSources, 500)\n .then(function() {\n return transfer(destPub, amount, comments, useRelative, restPub, block);\n });\n }\n\n // Error in generated TX - issue #524\n else if (err && err.ucode === BMA.errorCodes.TX_INPUTS_OUTPUTS_NOT_EQUAL) {\n // Ask user to send log to developers\n var esEnable = csSettings.data.plugins && csSettings.data.plugins.es && csSettings.data.plugins.es.enable;\n if (esEnable) {\n UIUtils.loading.hide();\n return UIUtils.alert.confirm('CONFIRM.ISSUE_524_SEND_LOG', 'ERROR.POPUP_TITLE', {\n cssClass: 'warning',\n okText: 'COMMON.BTN_OK',\n cancelText: 'COMMON.BTN_NO'\n })\n .then(function(confirm) {\n if (confirm) {\n api.error.raise.send({\n title: 'Issue #524 logs',\n content: 'App version: ' +csConfig.version+'\\n'+\n 'App build: ' +csConfig.build+'\\n'+\n 'Logs:\\n\\n' + logs.join('\\n')\n });\n return $timeout(function() {\n throw {message: 'ERROR.ISSUE_524_TX_FAILED'};\n }, 1500);\n }\n throw {message: 'ERROR.SEND_TX_FAILED'};\n });\n }\n }\n throw err;\n });\n });\n },\n\n /**\n * Send a WIF wallet\n */\n transferAll = function(destPub, amount, comments, useRelative, restPub) {\n if (!isLogin()) return $q.reject({message:'ERROR.NEED_LOGIN_FIRST'});\n\n if (!restPub || destPub == restPub) {\n return $q.reject({message: \"Could not have same pubkey for 'destPub' and 'restPub'\"});\n }\n\n return csCurrency.blockchain.lastValid()\n .then(function(block) {\n console.debug(\"[wallet] Using last valid block as TX reference (to avoid network fork): \", block);\n\n return transfer(destPub, amount, comments, useRelative, restPub, block)\n .then(function() {\n // If more money: transfer all to restPub\n if (data.balance > 0 && restPub) {\n console.debug(\"[wallet] Wallet has some more money: transfering fund to [{0}]\".format(restPub.substring(0,8)));\n return transfer(restPub, data.balance, undefined/*comments*/, false/*useRelative*/, restPub, block);\n }\n });\n\n });\n\n },\n\n /**\n * Create TX doc and send it\n * @param block the current block\n * @param destPub\n * @param amount\n * @param inputs\n * @param comments\n * @return the hash of the sent TX\n */\n createAndSendTx = function(currency, block, keypair, destPub, amount, inputs, comments, restPub, logs) {\n\n // Make sure a TX in compact mode has no more than 100 lines (fix #118)\n // (If more than 100 lines, send to TX to himself first, then its result as sources for the final TX)\n if (inputs.sources.length > constants.TX_MAX_INPUTS_COUNT) {\n console.debug(\"[Wallet] TX has to many sources. Will chain TX...\");\n\n // Compute a slice of sources\n var firstSlice = {\n minBase: block.unitbase,\n maxBase: 0,\n amount: 0,\n sources: inputs.sources.slice(0, constants.TX_MAX_INPUTS_COUNT) /* end index is excluded, so array length=TX_MAX_INPUTS_COUNT - issue #524 */\n };\n _.forEach(firstSlice.sources, function(source) {\n if (source.base < firstSlice.minBase) firstSlice.minBase = source.base;\n if (source.base > firstSlice.maxBase) firstSlice.maxBase = source.base;\n firstSlice.amount += powBase(source.amount, source.base);\n });\n\n // Send inputs first slice\n return createAndSendTx(currency, block, keypair, data.pubkey/*to himself*/, firstSlice.amount, firstSlice, undefined/*comment not need*/, data.pubkey/*rest to himself*/, logs)\n .then(function(res) {\n _.forEach(firstSlice.sources, function(source) {\n source.consumed=true;\n });\n addSources(res.sources);\n\n var secondSlice = {\n minBase: block.unitbase,\n maxBase: 0,\n amount: 0,\n sources: inputs.sources.slice(constants.TX_MAX_INPUTS_COUNT).concat(res.sources)\n };\n _.forEach(secondSlice.sources, function(source) {\n if (source.base < secondSlice.minBase) secondSlice.minBase = source.base;\n if (source.base > secondSlice.maxBase) secondSlice.maxBase = source.base;\n secondSlice.amount += powBase(source.amount, source.base);\n });\n\n // Send inputs second slice (recursive call)\n return createAndSendTx(currency, block, keypair, destPub, amount, secondSlice, comments, restPub, logs);\n });\n }\n\n var tx = 'Version: '+ constants.TX_VERSION +'\\n' +\n 'Type: Transaction\\n' +\n 'Currency: ' + currency.name + '\\n' +\n 'Blockstamp: ' + block.number + '-' + block.hash + '\\n' +\n 'Locktime: 0\\n' + // no lock\n 'Issuers:\\n' +\n data.pubkey + '\\n' +\n 'Inputs:\\n';\n\n _.forEach(inputs.sources, function(source) {\n // if D : AMOUNT:BASE:D:PUBLIC_KEY:BLOCK_ID\n // if T : AMOUNT:BASE:T:T_HASH:T_INDEX\n tx += [source.amount, source.base, source.type, source.identifier,source.noffset].join(':')+\"\\n\";\n });\n\n tx += 'Unlocks:\\n';\n for (i=0; i 0) {\n outputAmount = truncBase(rest, outputBase);\n rest -= outputAmount;\n if (outputAmount > 0) {\n outputAmount = outputBase === 0 ? outputAmount : outputAmount / Math.pow(10, outputBase);\n tx += outputAmount + ':' + outputBase + ':SIG(' + destPub + ')\\n';\n outputOffset++;\n }\n outputBase--;\n }\n rest = inputs.amount - amount;\n outputBase = inputs.maxBase;\n }\n // Outputs to restPub\n while(rest > 0) {\n outputAmount = truncBase(rest, outputBase);\n rest -= outputAmount;\n if (outputAmount > 0) {\n outputAmount = outputBase === 0 ? outputAmount : outputAmount / Math.pow(10, outputBase);\n tx += outputAmount +':'+outputBase+':SIG('+restPub+')\\n';\n // If rest to himself: add new sources\n if (data.pubkey === restPub) {\n newSources.push({\n type: 'T',\n noffset: outputOffset,\n amount: outputAmount,\n base: outputBase,\n conditions: 'SIG('+restPub+')',\n consumed: false\n });\n }\n outputOffset++;\n }\n outputBase--;\n }\n\n tx += \"Comment: \"+ (comments||\"\") + \"\\n\";\n\n // Append to logs (need to resolve issue #524)\n if (logs) {\n if (destPub == data.pubkey) {\n logs.push('[wallet] Creating new TX, using inputs:\\n - minBase: '+inputs.minBase+'\\n - maxBase: '+inputs.maxBase);\n }\n else {\n logs.push('[wallet] Creating new TX, using inputs:\\n - minBase: '+inputs.minBase+'\\n - maxBase: '+inputs.maxBase + '\\n - sources (=TX inputs):');\n }\n _.forEach(inputs.sources, function(source) {\n logs.push([source.amount, source.base, source.type, source.identifier,source.noffset].join(':'));\n });\n logs.push(\"\\n[wallet] generated TX document (without signature) :\\n------ START ------\\n\" + tx + \"------ END ------\\n\");\n }\n\n return CryptoUtils.sign(tx, keypair)\n .then(function(signature) {\n var signedTx = tx + signature + \"\\n\";\n return BMA.tx.process({transaction: signedTx})\n .catch(function(err) {\n if (err && err.ucode === BMA.errorCodes.TX_ALREADY_PROCESSED) {\n // continue\n return;\n }\n throw err;\n })\n .then(function() {\n return CryptoUtils.util.hash(signedTx);\n })\n .then(function(txHash) {\n _.forEach(newSources, function(output) {\n output.identifier= txHash;\n output.consumed = false;\n output.pending = true;\n });\n return {\n amount: (data.pubkey === destPub) ? 0 : ((data.pubkey === restPub) ? amount : inputs.amount),\n tx: signedTx,\n hash: txHash,\n sources: newSources\n };\n });\n });\n },\n\n getIdentityDocument = function(currency, keypair, uid, blockUid) {\n uid = uid || data.uid;\n blockUid = blockUid || data.blockUid;\n if (!uid || !blockUid) {\n throw {message: 'ERROR.WALLET_HAS_NO_SELF'};\n }\n if (data.requirements.expired) {\n throw {message: 'ERROR.WALLET_IDENTITY_EXPIRED'};\n }\n\n var identity = 'Version: '+ constants.IDTY_VERSION +'\\n' +\n 'Type: Identity\\n' +\n 'Currency: ' + currency.name + '\\n' +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'UniqueID: ' + uid + '\\n' +\n 'Timestamp: ' + blockUid + '\\n';\n return CryptoUtils.sign(identity, keypair)\n .then(function(signature) {\n identity += signature + '\\n';\n console.debug('Has generate an identity document:\\n----\\n' + identity + '----');\n return identity;\n });\n },\n\n /**\n * Send self identity\n */\n self = function(uid, needToLoadRequirements) {\n if (!BMA.regexp.USER_ID.test(uid)){\n return $q.reject({message: 'ERROR.INVALID_USER_ID'});\n }\n var block;\n return $q.all([\n getKeypair(),\n csCurrency.get(),\n csCurrency.blockchain.lastValid()\n ])\n // Create identity document\n .then(function(res) {\n var keypair = res[0];\n var currency = res[1];\n block = res[2];\n return getIdentityDocument(currency, keypair, uid, block.number + '-' + block.hash);\n })\n\n // Send to node\n .then(function (identity) {\n return BMA.wot.add({identity: identity});\n })\n\n .then(function () {\n if (!!needToLoadRequirements) {\n // Refresh membership data (if need)\n return loadRequirements(false/*no cache*/)\n\n // Add wallet events\n .then(addEvents);\n }\n else {\n data.uid = uid;\n data.blockUid = block.number + '-' + block.hash;\n }\n })\n .catch(function (err) {\n if (err && err.ucode === BMA.errorCodes.IDENTITY_SANDBOX_FULL) {\n throw {ucode: BMA.errorCodes.IDENTITY_SANDBOX_FULL, message: 'ERROR.IDENTITY_SANDBOX_FULL'};\n }\n throw err;\n });\n },\n\n /**\n * Send membership (in or out)\n */\n membership = function(sideIn) {\n return function() {\n var membership;\n\n return $q.all([\n getKeypair(),\n csCurrency.blockchain.lastValid()\n ])\n .then(function(res) {\n var keypair = res[0];\n var block = res[1];\n // Create membership to sign\n membership = 'Version: '+ constants.MS_VERSION +'\\n' +\n 'Type: Membership\\n' +\n 'Currency: ' + block.currency + '\\n' +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'Block: ' + block.number + '-' + block.hash + '\\n' +\n 'Membership: ' + (!!sideIn ? \"IN\" : \"OUT\" ) + '\\n' +\n 'UserID: ' + data.uid + '\\n' +\n 'CertTS: ' + data.blockUid + '\\n';\n\n return CryptoUtils.sign(membership, keypair);\n })\n .then(function(signature) {\n var signedMembership = membership + signature + '\\n';\n // Send signed membership\n return BMA.blockchain.membership({membership: signedMembership});\n })\n .then(function() {\n return $timeout(function() {\n return loadRequirements(false /*no cache*/);\n }, 1000); // waiting for node to process membership doc\n })\n\n // Add wallet events\n .then(addEvents);\n };\n },\n\n /**\n * Send identity certification\n */\n certify = function(uid, pubkey, timestamp, signature, isMember, wasMember) {\n return $q.all([\n getKeypair(),\n csCurrency.get(),\n csCurrency.blockchain.lastValid()\n ])\n .then(function(res) {\n var keypair = res[0];\n var currency = res[1];\n var block = res[2];\n\n // Check if member account\n if (!data.isMember && !csConfig.initPhase) {\n throw {message:'ERROR.ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION'};\n }\n\n // Create the self part to sign\n var cert = 'Version: '+ constants.CERT_VERSION +'\\n' +\n 'Type: Certification\\n' +\n 'Currency: ' + currency.name + '\\n' +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'IdtyIssuer: ' + pubkey + '\\n' +\n 'IdtyUniqueID: ' + uid + '\\n' +\n 'IdtyTimestamp: ' + timestamp + '\\n' +\n 'IdtySignature: ' + signature + '\\n' +\n 'CertTimestamp: ' + block.number + '-' + block.hash + '\\n';\n\n return CryptoUtils.sign(cert, keypair)\n .then(function(signature) {\n var signedCert = cert + signature + '\\n';\n return BMA.wot.certify({cert: signedCert});\n })\n .then(function() {\n var cert = {\n pubkey: pubkey,\n uid: uid,\n time: block.medianTime,\n isMember: isMember,\n wasMember: wasMember,\n expiresIn: currency.parameters.sigWindow,\n pending: true,\n block: block.number,\n valid: true\n };\n\n // Notify extension\n api.action.raise.certify(cert);\n\n return cert;\n });\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(CryptoUtils.util.random_nonce)\n .then(function(nonce) {\n record.nonce = CryptoUtils.util.encode_base58(nonce);\n return $q.all([\n CryptoUtils.box.pack(record.salt, nonce, record.keypair.boxPk, record.keypair.boxSk),\n CryptoUtils.box.pack(record.pwd, nonce, record.keypair.boxPk, record.keypair.boxSk)\n ]);\n })\n .then(function (res) {\n record.salt = res[0];\n record.pwd = res[1];\n return record;\n });\n },\n\n recoverId = function(recover) {\n if (!recover || !recover.cypherNonce || !recover.cypherSalt || !recover.cypherPwd) {\n throw {message:'ERROR.INVALID_FILE_FORMAT'};\n }\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 identifiers', err);\n throw new Error('Incorrect answers: unable to recover identifiers');\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, '{0}-recover_ID.txt'.format(data.pubkey.substring(0,8)));\n });\n },\n\n downloadKeyFile = function(format){\n if (!isAuth()) return $q.reject('user not authenticated');\n\n return $q.all([\n csCurrency.get(),\n csCrypto.keyfile.generateContent(data.keypair,\n {\n type: format,\n password: function() {\n UIUtils.loading.hide();\n return Modals.showPassword({\n title: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.TITLE',\n subTitle: 'ACCOUNT.SECURITY.KEYFILE.PASSWORD_POPUP.HELP'\n })\n .then(function(password) {\n return UIUtils.loading.show(10)\n .then(function(){\n return password;\n });\n });\n }\n })\n ])\n .then(function(res) {\n var currency = res[0];\n var document = res[1];\n return $translate('ACCOUNT.SECURITY.KEYFILE_FILENAME', {\n currency: currency.name,\n pubkey: data.pubkey,\n format: format,\n })\n .then(function(filename){\n var file = new Blob([document], {type: 'text/plain; charset=utf-8'});\n FileSaver.saveAs(file, filename);\n });\n });\n\n },\n\n getRevocationDocument = function() {\n return $q.all([\n getKeypair(),\n csCurrency.get()\n ])\n\n .then(function(res) {\n var keypair = res[0];\n var currency = res[1];\n // get the Identity document\n return getIdentityDocument(currency, keypair)\n\n // Create membership document (unsigned)\n .then(function(identity){\n var identityLines = identity.trim().split('\\n');\n var idtySignature = identityLines[identityLines.length-1];\n\n var revocation = 'Version: '+ constants.REVOKE_VERSION +'\\n' +\n 'Type: Revocation\\n' +\n 'Currency: ' + currency.name + '\\n' +\n 'Issuer: ' + data.pubkey + '\\n' +\n 'IdtyUniqueID: ' + data.uid + '\\n' +\n 'IdtyTimestamp: ' + data.blockUid + '\\n' +\n 'IdtySignature: ' + idtySignature + '\\n';\n\n\n // Sign revocation document\n return CryptoUtils.sign(revocation, keypair)\n\n // Add revocation to document\n .then(function(signature) {\n revocation += signature + '\\n';\n console.debug('Has generate an revocation document:\\n----\\n' + revocation + '----');\n return revocation;\n });\n });\n });\n },\n\n /**\n * Send a revocation\n */\n revoke = function() {\n\n // Clear old events\n cleanEventsByContext('revocation');\n\n // Get revocation document\n return getRevocationDocument()\n // Send revocation document\n .then(function(revocation) {\n return BMA.wot.revoke({revocation: revocation});\n })\n\n // Reload requirements\n .then(function() {\n\n return $timeout(function() {\n return loadRequirements(false/*no cache*/);\n }, 1000); // waiting for node to process membership doc\n })\n\n // Add wallet events\n .then(addEvents)\n\n .catch(function(err) {\n if (err && err.ucode == BMA.errorCodes.REVOCATION_ALREADY_REGISTERED) {\n // Already registered by node: just add an event\n addEvent({type:'pending', message: 'INFO.REVOCATION_SENT_WAITING_PROCESS', context: 'requirements'}, true);\n }\n else {\n throw err;\n }\n })\n ;\n },\n\n revokeWithFile = function(revocation){\n return $q.all([\n BMA.wot.revoke({revocation: revocation})\n ])\n // Reload requirements\n .then(function(res) {\n if (isLogin()) {\n return $timeout(function () {\n return loadRequirements(false/*no cache*/);\n }, 1000) // waiting for node to process membership doc\n\n // Add wallet events\n .then(addEvents)\n\n .catch(function (err) {\n if (err && err.ucode == BMA.errorCodes.REVOCATION_ALREADY_REGISTERED) {\n // Already registered by node: just add an event\n addEvent({type: 'pending', message: 'INFO.REVOCATION_SENT_WAITING_PROCESS', context: 'requirements'}, true);\n }\n else {\n throw err;\n }\n });\n }\n else {\n addEvent({type: 'pending', message: 'INFO.REVOCATION_SENT_WAITING_PROCESS', context: 'requirements'}, true);\n }\n });\n\n },\n\n downloadRevocation = function(){\n return $q.all([\n csCurrency.get(),\n getRevocationDocument()\n ])\n .then(function(res) {\n var currency = res[0];\n var revocation = res[1];\n var revocationFile = new Blob([revocation], {type: 'text/plain; charset=utf-8'});\n return $translate('ACCOUNT.SECURITY.REVOCATION_FILENAME', {\n uid: data.uid,\n currency: currency.name,\n pubkey: data.pubkey\n })\n .then(function (fileName) {\n FileSaver.saveAs(revocationFile, fileName);\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 /* -- children wallets -- */\n\n setParentWallet = function(parentWallet) {\n listeners = listeners || [];\n var listener;\n _.forEach(['load', 'reset'], function(method) {\n listener = api.data.on[method]($rootScope, function(data, deferred) {\n deferred = deferred || $q.defer();\n parentWallet.api.data.raisePromise[method](data)\n .then(deferred.resolve)\n .catch(deferred.reject);\n return deferred.promise;\n }, this);\n listeners.push(listener);\n });\n\n // Unauth when parent wallet unauth\n listener = parentWallet.api.data.on.unauth($rootScope, function() {\n if (isAuth()) unauth();\n }, this);\n listeners.push(listener);\n },\n\n createNewChildWallet = function(options) {\n var wallet = newChildInstance();\n addChildWallet(wallet, options);\n return wallet;\n },\n\n addChildWallet = function(wallet, options) {\n // Link to parent\n wallet.children.setParent(exports); // = link to self wallet\n\n data.children = data.children || [];\n data.children.push(wallet);\n\n // Store (store children locally)\n if (!options || angular.isUndefined(options.store) || options.store) {\n return storeData();\n }\n return $q.when();\n },\n\n removeAllChildrenWallets = function(options) {\n\n // stop/unauth all existing wallets\n if (!options || options.stop) {\n _.forEach(data.children || [], function(wallet){\n wallet.stop();\n });\n }\n var removedChildren = data.children.splice(0, data.children.length);\n\n // Store (store children locally)\n if (!options || angular.isUndefined(options.store) || options.store) {\n return storeData();\n }\n return removedChildren;\n\n },\n\n removeChildWalletById = function(id, options) {\n data.children = data.children || [];\n var childIndex = _.findIndex(data.children, function(child) {return child.id === id;});\n if (childIndex === -1) {\n console.warn('[wallet] Unable to remove child wallet {'+id+'} (not found)');\n return;\n }\n // Remove the wallet, and return it\n var wallet = data.children.splice(childIndex, 1)[0];\n\n // Force to stop without calling api\n wallet.stop();\n\n // Store (store children locally)\n if (!options || angular.isUndefined(options.store) || options.store) {\n return storeData();\n }\n },\n\n getChildWalletById = function(id) {\n return (id !== 'default') && _.find(data.children|| [], function(child) {return child.id === +id;}) || undefined;\n },\n\n getChildWalletByPubkey = function(pubkey) {\n return _.find(data.children|| [], function(child) {return child.isUserPubkey(pubkey);});\n },\n\n hasChildrenWithPubkey = function(pubkey) {\n return !!getChildWalletByPubkey(pubkey);\n },\n\n getChildrenWalletCount = function() {\n return angular.isDefined(data.childrenCount) ? data.childrenCount : (data.children && data.children.length || 0);\n },\n\n newChildInstance = function() {\n // Return max(id) + 1\n var walletId = (data.children || []).reduce(function(res, wallet) {\n return Math.max(res, wallet.id);\n }, 0) + 1;\n return service.instance(walletId, BMA);\n },\n\n getAllChildrenWallet = function() {\n return openEncryptedData()\n .then(function() {\n return data.children;\n });\n },\n\n getAllPubkeys = function() {\n if (!data.pubkey) throw new Error('User not login!');\n return (data.children || []).reduce(function(res, wallet) {\n return wallet.data.pubkey ? res.concat(wallet.data.pubkey) : res;\n }, [data.pubkey])\n }\n\n getByPubkey = function(pubkey) {\n if (!pubkey) throw new Error(\"Missing 'pubkey' argument !\");\n if (!data.pubkey) throw new Error('User not login!');\n if (data.pubkey === pubkey) return exports; // main wallet\n return getChildWalletByPubkey(pubkey);\n }\n\n downloadChildrenWalletFile = function() {\n return $q.all([\n getAllChildrenWallet(),\n csCurrency.get()\n ])\n .then(function(res) {\n var children = res[0];\n var currency = res[1];\n var content = (children||[]).reduce(function(res, wallet) {\n return res + [wallet.data.pubkey, wallet.data.uid, wallet.data.localName||wallet.data.name].join('\\t') + '\\n';\n }, '');\n var file = new Blob([content], {type: 'text/plain; charset=utf-8'});\n return $translate('ACCOUNT.WALLET_LIST.EXPORT_FILENAME', {\n pubkey: data.pubkey,\n currency: currency.name,\n })\n .then(function (fileName) {\n FileSaver.saveAs(file, fileName);\n });\n });\n },\n\n /* -- END children wallets -- */\n\n openEncryptedData = function(options) {\n if (!hasEncryptedData()) return $q.when();\n if (!isAuth()) return auth().then(openEncryptedData); // Force auth if need\n\n // Open encrypted data\n return CryptoUtils.box.keypair.fromSignKeypair(data.keypair)\n .then(function(keypair) {\n var nonce = CryptoUtils.util.decode_base58(data.encryptedData.nonce);\n return CryptoUtils.box.open(data.encryptedData.content, nonce, keypair.boxPk, keypair.boxSk);\n })\n // Then apply\n .then(function(content) {\n data.encryptedData = null; // reset encrypted data\n var promise = applyRestoredData(JSON.parse(content));\n\n // Store (store data into session storage)\n if (!options || angular.isUndefined(options.store) || options.store) {\n promise.then(function() {\n return storeData();\n });\n }\n\n return promise;\n })\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;\n try {\n obj = JSON.parse(json || '{}');\n }\n catch(err) { /* invalid JSON : continue*/}\n\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 checkAuthIdle = function(isAuthResult) {\n isAuthResult = angular.isDefined(isAuthResult) ? isAuthResult : isAuth();\n var newEnableAuthIdle = isAuthResult && settings && settings.keepAuthIdle > 0 && settings.keepAuthIdle != csSettings.constants.KEEP_AUTH_IDLE_SESSION;\n var changed = (enableAuthIdle != newEnableAuthIdle);\n\n // need start/top watching\n if (changed) {\n // start idle\n if (newEnableAuthIdle) {\n console.debug(\"[wallet] Start idle (delay: {0}s)\".format(settings.keepAuthIdle));\n Idle.setIdle(settings.keepAuthIdle);\n Idle.watch();\n }\n // stop idle, if was enable\n else if (enableAuthIdle){\n console.debug(\"[wallet] Stop idle\");\n Idle.unwatch();\n }\n enableAuthIdle = newEnableAuthIdle;\n }\n\n // if idle time changed: apply it\n else if (newEnableAuthIdle && Idle.getIdle() !== settings.keepAuthIdle) {\n console.debug(\"[idle] Updating auth idle (delay: {0}s)\".format(settings.keepAuthIdle));\n Idle.setIdle(settings.keepAuthIdle);\n }\n\n // Make sure to store seckey, in the session storage for secret key -fix #372\n var storeSecKey = isAuthResult && settings && settings.keepAuthIdle == csSettings.constants.KEEP_AUTH_IDLE_SESSION && true;\n if (storeSecKey) {\n sessionStorage.put(constants.STORAGE_SECKEY, CryptoUtils.util.encode_base58(data.keypair.signSk));\n }\n // Make sure to clean previous seckey, if exists in session storage\n else if (changed) {\n sessionStorage.put(constants.STORAGE_SECKEY, null);\n }\n };\n\n function getWalletSettings(settings) {\n return settings && {\n useLocalStorage: settings.useLocalStorage,\n useLocalStorageEncryption: settings.useLocalStorageEncryption,\n rememberMe: settings.rememberMe,\n keepAuthIdle: settings.keepAuthIdle\n };\n }\n\n function onSettingsChanged(allSettings) {\n var newSettings = getWalletSettings(allSettings);\n var hasChanged = !angular.equals(settings, newSettings);\n if (!hasChanged || !settings) return; // skip\n\n var useEncryptionChanged = !angular.equals(settings.useLocalStorageEncryption, newSettings.useLocalStorageEncryption);\n var useStorageChanged = !angular.equals(settings.useLocalStorage, newSettings.useLocalStorage) || useEncryptionChanged;\n var keepAuthIdleChanged = !angular.equals(settings.keepAuthIdle, newSettings.keepAuthIdle);\n\n settings = newSettings;\n\n if (keepAuthIdleChanged) {\n checkAuthIdle();\n }\n\n // Local storage option changed\n if (useStorageChanged) {\n\n // If disabled, then reset the store\n if (!settings.useLocalStorage) {\n resetStore(data.pubkey);\n }\n // If storage enable\n else {\n // Store login data\n return store()\n .then(function() {\n\n // Encryption enable: auth before saving data\n if (data.childrenCount > 0 && useEncryptionChanged && settings.useLocalStorageEncryption) {\n return auth({minData: true, silent: true})\n .catch(function(err){\n // user not auth: revert encryption to false\n if (err === 'CANCELLED') {\n csSettings.apply({useLocalStorageEncryption: false});\n return csSettings.store();\n }\n else {\n throw err;\n }\n });\n }\n })\n\n // Store other data (children wallet, ...)\n .then(storeData);\n }\n }\n }\n\n function addListeners() {\n listeners = [\n // Listen if settings changed\n csSettings.api.data.on.changed($rootScope, onSettingsChanged, this),\n // Listen if node changed\n BMA.api.node.on.restart($rootScope, restart, this)\n ];\n\n $rootScope.$on('IdleStart', unauth);\n }\n\n function addListener(listener) {\n listeners = listeners || [];\n listeners.push(listener);\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(options) {\n options = options || {};\n // By default, restore if the service is the default object\n options.restore = angular.isDefined(options.restore) ? options.restore : (id === 'default');\n\n console.debug('[wallet] Starting...');\n var now = Date.now();\n\n startPromise = $q.all([\n csSettings.ready()\n .then(function() {\n settings = getWalletSettings(csSettings.data);\n }),\n csCurrency.ready(),\n BMA.ready()\n ]);\n\n // Restore\n if (options.restore) startPromise = startPromise.then(restore);\n\n // Emit ready event\n startPromise.then(function() {\n addListeners();\n\n console.debug('[wallet] Started in ' + (Date.now() - now) + 'ms');\n\n started = true;\n startPromise = null;\n })\n .then(function(){\n return data;\n });\n\n return startPromise;\n }\n\n // Register extension points\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', 'auth');\n api.registerEvent('data', 'unauth');\n api.registerEvent('data', 'load');\n api.registerEvent('data', 'logout');\n api.registerEvent('data', 'reset');\n api.registerEvent('data', 'store');\n\n api.registerEvent('error', 'send');\n\n // Data changed : balance changed, new TX\n api.registerEvent('data', 'balanceChanged');\n api.registerEvent('data', 'newTx');\n\n api.registerEvent('action', 'certify');\n\n\n // init data\n resetData(true);\n\n // Override default store/restore function, when not the 'default' wallet\n if (id !== \"default\") {\n //start = $q.when;\n //started = true;\n store = $q.when;\n restore = $q.when;\n restoreData = $q.when;\n //checkAuthIdle = function(){};\n }\n\n exports = {\n id: id,\n data: data,\n ready: ready,\n start: start,\n stop: stop,\n // auth\n login: login,\n logout: logout,\n auth: auth,\n unauth: unauth,\n isLogin: isLogin,\n isAuth: isAuth,\n getKeypair: getKeypair,\n hasSelf: hasSelf,\n setSelf: setSelf,\n isMember: function() {\n return data.isMember;\n },\n isDataLoaded : isDataLoaded,\n isDefault: isDefault,\n isNeverUsed: isNeverUsed,\n isNew: isNew,\n isUserPubkey: isUserPubkey,\n getData: getData,\n loadData: loadData,\n refreshData: refreshData,\n loadQrCode: loadQrCode,\n // internal\n internal: {\n addListener: addListener,\n removeListeners: removeListeners\n },\n // local storage\n store: store,\n storeData: storeData, // store children wallet, readTime, etc.\n // operations\n transfer: transfer,\n transferAll: transferAll,\n self: self,\n revoke: revoke,\n revokeWithFile: revokeWithFile,\n certify: certify,\n downloadSaveId: downloadSaveId,\n getCryptedId: getCryptedId,\n recoverId: recoverId,\n downloadRevocation: downloadRevocation,\n downloadKeyFile: downloadKeyFile,\n pubkeys: getAllPubkeys,\n getByPubkey: getByPubkey,\n membership: {\n inside: membership(true),\n out: membership(false)\n },\n events: {\n add: addEvent,\n cleanByContext: cleanEventsByContext\n },\n children: {\n create: createNewChildWallet,\n add: addChildWallet,\n remove: removeChildWalletById,\n get: getChildWalletById,\n getByPubkey: getChildWalletByPubkey,\n all: getAllChildrenWallet,\n setParent: setParentWallet,\n count: getChildrenWalletCount,\n hasPubkey: hasChildrenWithPubkey,\n instance: newChildInstance,\n downloadFile: downloadChildrenWalletFile\n },\n api: api\n };\n return exports;\n }\n\n service = CsWallet('default', BMA);\n service.instance = CsWallet;\n\n return service;\n}]);\n","angular.module('cesium.help.services', [])\n\n.constant('csHelpConstants', {\n wallet: {\n stepCount: 4\n }\n})\n\n.factory('csHelp', ['$rootScope', 'csSettings', 'UIUtils', 'csHelpConstants', '$controller', function($rootScope, csSettings, UIUtils, csHelpConstants, $controller) {\n 'ngInject';\n\n\n function createHelptipScope(isTour, helpController) {\n if (!isTour && ($rootScope.tour || !csSettings.data.helptip.enable || UIUtils.screen.isSmall())) {\n return; // avoid other helptip to be launched (e.g. csWallet)\n }\n // Create a new scope for the tour controller\n var helptipScope = $rootScope.$new();\n $controller(helpController||'HelpTipCtrl', { '$scope': helptipScope});\n return helptipScope;\n }\n\n function startWalletHelpTip(index, isTour) {\n index = angular.isDefined(index) ? index : csSettings.data.helptip.wallet;\n isTour = angular.isDefined(isTour) ? isTour : false;\n\n if (index < 0 || index >= csHelpConstants.wallet.stepCount) return;\n\n // Create a new scope for the tour controller\n var helptipScope = createHelptipScope(isTour);\n if (!helptipScope) return; // could be undefined, if a global tour already is already started\n\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 return {\n wallet: {\n tour: function() {\n return startWalletHelpTip(0, true);\n },\n helptip: startWalletHelpTip\n }\n };\n\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 // removeIf(device)\n 'cesium.desktop.services',\n // endRemoveIf(device)\n 'cesium.settings.services',\n 'cesium.http.services',\n 'cesium.network.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.wot.services',\n 'cesium.tx.services',\n 'cesium.wallet.services',\n 'cesium.help.services',\n 'cesium.plugin.services'\n ])\n;\n","angular.module('cesium.api.demo.services', ['cesium.bma.services', 'cesium.crypto.services', 'cesium.utils.services', 'cesium.settings.services'])\n\n\n .factory('csDemoWallet', ['$rootScope', '$timeout', '$controller', '$state', '$q', '$translate', '$filter', 'BMA', 'CryptoUtils', function($rootScope, $timeout, $controller, $state, $q, $translate, $filter,\n BMA, CryptoUtils) {\n 'ngInject';\n\n function factory(authData) {\n\n var demoPubkey;\n\n return {\n start: function() {\n return $q.when();\n },\n login: function() {\n var self = this;\n return $translate('API.TRANSFER.DEMO.PUBKEY')\n .then(function(pubkey) {\n demoPubkey = pubkey;\n if (!authData || authData.pubkey != demoPubkey) {\n throw {message: 'API.TRANSFER.DEMO.BAD_CREDENTIALS'};\n }\n self.data = {\n keypair: authData.keypair\n };\n return {\n uid: 'Demo',\n pubkey: demoPubkey\n };\n });\n },\n transfer: function(pubkey, amount, comment) {\n var self = this;\n return BMA.blockchain.current()\n .then(function(block) {\n var tx = 'Version: '+ BMA.constants.PROTOCOL_VERSION +'\\n' +\n 'Type: Transaction\\n' +\n 'Currency: ' + block.currency + '\\n' +\n 'Blockstamp: ' + block.number + '-' + block.hash + '\\n' +\n 'Locktime: 0\\n' + // no lock\n 'Issuers:\\n' +\n demoPubkey + '\\n' +\n 'Inputs:\\n' +\n [amount, block.unitbase, 'T', 'FakeId27jQMAf3jqL2fr75ckZ6Jgi9TZL9fMf9TR9vBvG', 0].join(':')+ '\\n' +\n 'Unlocks:\\n' +\n '0:SIG(0)\\n' +\n 'Outputs:\\n' +\n [amount, block.unitbase, 'SIG(' + pubkey + ')'].join(':')+'\\n' +\n 'Comment: '+ (comment||'') + '\\n';\n\n return CryptoUtils.sign(tx, self.data.keypair)\n .then(function(signature) {\n var signedTx = tx + signature + \"\\n\";\n return CryptoUtils.util.hash(signedTx)\n .then(function(txHash) {\n return $q.when({\n tx: signedTx,\n hash: txHash\n });\n });\n });\n });\n }\n };\n }\n\n return {\n instance: factory\n };\n }])\n;\n","angular.module('cesium.templates', []).run(['$templateCache', function($templateCache) {$templateCache.put('templates/menu.html','

{{:locale:\\'COMMON.APP_NAME\\'|translate}} {{$root.currency.name|abbreviate}}

{{:locale:\\'MENU.HOME\\'|translate}} {{:locale:\\'MENU.HOME\\'|translate}}
{{:locale:\\'MENU.ACCOUNT\\'|translate}} {{:locale:\\'MENU.TRANSACTIONS\\'|translate}} {{:locale:\\'MENU.WALLETS\\'|translate}}
{{:locale:\\'COMMON.BTN_HELP_TOUR\\'|translate}} {{:locale:\\'MENU.WOT\\'|translate}} {{:locale:\\'MENU.CURRENCY\\'|translate}} {{:locale:\\'MENU.NETWORK\\'|translate}}
{{:locale:\\'MENU.SETTINGS\\'|translate}}
{{:locale:\\'COMMON.BTN_LOGOUT\\'|translate}}
{{:locale:\\'COMMON.APP_VERSION\\'|translate:{version: config.version} }} | {{:locale:\\'HOME.BTN_ABOUT\\'|translate}}
');\n$templateCache.put('templates/modal_about.html','

ABOUT.TITLE

{{\\'COMMON.APP_NAME\\'|translate}} {{\\'COMMON.APP_VERSION\\'|translate:$root.config}} - www.cesium.app

{{\\'COMMON.APP_BUILD\\'|translate:$root.config}}

ABOUT.LICENSE

{{::$root.newRelease.url}}

ABOUT.OFFICIAL_WEB_SITE

https://www.cesium.app

{{\\'ABOUT.FORUM\\' | translate}}

{{::$root.settings.userForumUrl}}

ABOUT.PLEASE_REPORT_ISSUE

ABOUT.REPORT_ISSUE

{{\\'ABOUT.CODE\\' | translate}}

https://git.duniter.org/clients/cesium-grp/cesium

{{\\'ABOUT.DEVELOPERS\\' | translate}}

Benoit Lavenier, bpresles, cgeek, DiG, Ji_emme

');\n$templateCache.put('templates/api/doc.html','

API.DOC.TRANSFER.TITLE

API.DOC.DESCRIPTION_DIVIDER

API.DOC.TRANSFER.DESCRIPTION

API.DOC.URL_DIVIDER

{{$root.rootPath}}#/v1/payment/:pubkey?amount=API.DOC.TRANSFER.PARAM_AMOUNT

API.DOC.PARAMETERS_DIVIDER

API.DOC.AVAILABLE_PARAMETERS

pubkey
API.DOC.TRANSFER.PARAM_PUBKEY_HELP
amount
API.DOC.TRANSFER.PARAM_AMOUNT_HELP
comment
API.DOC.TRANSFER.PARAM_COMMENT_HELP
name
API.DOC.TRANSFER.PARAM_NAME_HELP
preferred_node
API.DOC.TRANSFER.PARAM_PREFERRED_NODE_HELP
redirect_url
API.DOC.TRANSFER.PARAM_REDIRECT_URL_HELP
cancel_url
API.DOC.TRANSFER.PARAM_CANCEL_URL_HELP

API.DOC.DEMO_DIVIDER

API.DOC.DEMO_HELP

API.DOC.DEMO_SUCCEED

API.DOC.DEMO_RESULT

{{result.content}}

API.DOC.DEMO_RESULT_PEER {{result.node}}

API.DOC.DEMO_CANCELLED

API.DOC.INTEGRATE_DIVIDER

API.DOC.TRANSFER.EXAMPLES_HELP

API.DOC.TRANSFER.EXAMPLE_BUTTON

API.DOC.INTEGRATE_CODE

API.DOC.INTEGRATE_RESULT

 

API.DOC.INTEGRATE_PARAMETERS

{{\\'API.DOC.TRANSFER.PARAM_PUBKEY\\' | translate}} :

{{\\'API.DOC.TRANSFER.PARAM_AMOUNT\\' | translate}} :

{{\\'API.DOC.TRANSFER.PARAM_COMMENT\\' | translate}} :

{{\\'API.DOC.TRANSFER.PARAM_NAME\\' | translate}} :

{{\\'API.DOC.TRANSFER.PARAM_PREFERRED_NODE\\' | translate}} :

{{\\'API.DOC.TRANSFER.PARAM_REDIRECT_URL\\' | translate}} :

{{\\'API.DOC.TRANSFER.PARAM_CANCEL_URL\\' | translate}} :

API.DOC.TRANSFER.EXAMPLE_BUTTON_DEFAULT_STYLE

{{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_ICON\\' | translate}} :

{{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_HELP\\' | translate}} :

{{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_BG_COLOR\\' | translate}} :

{{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_FONT_COLOR\\' | translate}} :

{{\\'API.DOC.TRANSFER.EXAMPLE_BUTTON_TEXT_WIDTH\\' | translate}} :

');\n$templateCache.put('templates/api/home.html','API.HOME.TITLE

API.HOME.MESSAGE

API.HOME.MESSAGE_SHORT


 
v{{$root.config.version}}

{{\\'COMMON.APP_NAME\\'|translate}} API - v{{$root.config.version}}

{{\\'COMMON.APP_NAME\\'|translate}} API v{{$root.config.version}} - {{\\'HOME.BTN_ABOUT\\'|translate}} - {{\\'API.COMMON.LINK_STANDARD_APP\\'|translate}}

');\n$templateCache.put('templates/api/menu.html','');\n$templateCache.put('templates/api/popover_locales.html','');\n$templateCache.put('templates/api/transfer.html','API.TRANSFER.TITLE_SHORT
 

API.TRANSFER.TITLE

API.TRANSFER.DEMO.HELP



API.TRANSFER.SUMMARY

API.TRANSFER.AMOUNT

API.TRANSFER.NAME

{{transferData.name}}

API.TRANSFER.PUBKEY


{{transferData.pubkey}}

{{transferData.pubkey|formatPubkey}}

API.TRANSFER.COMMENT


{{::transferData.comment}}

{{::transferData.comment}}

API.TRANSFER.NODE


 {{node.server}}

 
v{{$root.config.version}}

{{\\'COMMON.APP_NAME\\'|translate}} - v{{$root.config.version}}

{{\\'COMMON.APP_NAME\\'|translate}} API v{{$root.config.version}} - {{\\'HOME.BTN_ABOUT\\'|translate}} - {{\\'API.COMMON.LINK_DOC\\'|translate}} - {{\\'API.COMMON.LINK_STANDARD_APP\\'|translate}}

');\n$templateCache.put('templates/blockchain/item_block.html','

{{:rebind:block.medianTime|medianDate}}

+{{:rebind:block.joinersCount}} -{{:rebind:block.excludedCount-block.revokedCount}} {{:rebind:block.revokedCount}}   {{:rebind:block.activesCount}}   {{:rebind:block.certificationsCount}}   {{\\'COMMON.UD\\'|translate}}   {{:rebind:block.transactionsCount}}

{{:rebind:block.name||block.uid}}

{{::block.number|formatInteger}}
');\n$templateCache.put('templates/blockchain/item_block_empty_lg.html','

{{:rebind:block.medianTime|medianDate}}

{{:rebind:block.issuer|formatPubkey}} {{:rebind:block.name||block.uid}}

{{block.number|formatInteger}}
');\n$templateCache.put('templates/blockchain/item_block_lg.html','

{{:rebind:block.medianTime|medianDate}}

{{:rebind:\\'BLOCKCHAIN.HASH\\'|translate}} {{:rebind:block.hash|formatHash}}

{{:rebind:block.issuer|formatPubkey}} {{:rebind:block.name||block.uid}}

+{{:rebind:block.joinersCount}} -{{:rebind:block.excludedCount-block.revokedCount}}    -{{:rebind:block.revokedCount}}   {{:rebind:block.activesCount}}   {{:rebind:block.certificationsCount}}   {{:rebind:\\'COMMON.UD\\'|translate}}   {{:rebind:block.transactionsCount}}  
{{:rebind:block.number}}
');\n$templateCache.put('templates/blockchain/items_blocks.html','
BLOCKCHAIN.LOOKUP.NO_BLOCK
');\n$templateCache.put('templates/blockchain/link_identity.html',' {{::identity.uid}}   {{::identity.pubkey|formatPubkey}}');\n$templateCache.put('templates/blockchain/list_blocks.html','
BLOCKCHAIN.LOOKUP.NO_BLOCK
');\n$templateCache.put('templates/blockchain/list_blocks_lg.html','
{{:locale:\\'BLOCKCHAIN.LOOKUP.NO_BLOCK\\'|translate}}
');\n$templateCache.put('templates/blockchain/lookup.html','BLOCKCHAIN.LOOKUP.TITLE');\n$templateCache.put('templates/blockchain/lookup_lg.html','BLOCKCHAIN.LOOKUP.TITLE');\n$templateCache.put('templates/blockchain/unlock_condition_popover.html','

BLOCKCHAIN.VIEW.TX_OUTPUT_UNLOCK_CONDITIONS

{{::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_OPERATOR.\\'+condition.operator|translate}} 
{{::condition.value|formatDuration}}
{{::condition.value|medianDate}}
');\n$templateCache.put('templates/blockchain/view_block.html','{{\\'BLOCKCHAIN.VIEW.TITLE_CURRENT\\'|translate}} {{\\'BLOCKCHAIN.VIEW.TITLE\\'|translate:formData}}
 

{{\\'BLOCKCHAIN.VIEW.TITLE\\'|translate:formData}} {{\\'BLOCKCHAIN.VIEW.TITLE_CURRENT\\'|translate}}

{{formData.medianTime | medianFromNowAndDate}}

{{\\'BLOCKCHAIN.VIEW.COMPUTED_BY\\'|translate}} {{issuer.name||issuer.uid}} ({{issuer.uid}})

{{\\'BLOCKCHAIN.VIEW.SHOW_RAW\\'|translate}}

{{\\'BLOCKCHAIN.VIEW.TECHNICAL_DIVIDER\\' | translate}} {{\\'BLOCKCHAIN.VIEW.VERSION\\'|translate}} {{::formData.version}} {{\\'BLOCKCHAIN.VIEW.POW_MIN\\'|translate}}

{{\\'BLOCKCHAIN.VIEW.POW_MIN_HELP\\'|translate}}

{{::formData.powMin}}
{{\\'BLOCKCHAIN.VIEW.HASH\\'|translate}} {{::formData.hash}}
{{::formData.hash}}
{{\\'BLOCKCHAIN.VIEW.DATA_DIVIDER\\' | translate}}{{\\'BLOCKCHAIN.VIEW.EMPTY\\'|translate}}
{{\\'COMMON.UNIVERSAL_DIVIDEND\\'|translate}}

{{\\'BLOCKCHAIN.VIEW.UNIVERSAL_DIVIDEND_HELP\\'|translate: {membersCount: formData.membersCount} }}

+1 / {{\\'COMMON.MEMBER\\'|translate|lowercase}} 0 + {{formData.dividend| formatAmount: {currency: formData.currency, useRelative: false} }} / {{\\'COMMON.MEMBER\\'|translate|lowercase}}
{{\\'BLOCKCHAIN.VIEW.IDENTITIES_COUNT\\'|translate}} +{{::formData.identitiesCount}} 0
{{\\'BLOCKCHAIN.VIEW.JOINERS_COUNT\\'|translate}} +{{::formData.joinersCount}} 0
{{\\'BLOCKCHAIN.VIEW.ACTIVES_COUNT\\'|translate}}

{{\\'BLOCKCHAIN.VIEW.ACTIVES_COUNT_HELP\\'|translate}}

{{::formData.activesCount}} 0
{{\\'BLOCKCHAIN.VIEW.EXCLUDED_COUNT\\'|translate}}

{{\\'BLOCKCHAIN.VIEW.EXCLUDED_COUNT_HELP\\'|translate}}

-{{::formData.excludedCount-formData.revokedCount}} 0
{{\\'BLOCKCHAIN.VIEW.LEAVERS_COUNT\\'|translate}}

{{\\'BLOCKCHAIN.VIEW.LEAVERS_COUNT_HELP\\'|translate}}

-{{::formData.leaversCount}} 0
{{\\'BLOCKCHAIN.VIEW.REVOKED_COUNT\\'|translate}}

{{\\'BLOCKCHAIN.VIEW.REVOKED_COUNT_HELP\\'|translate}}

-{{::formData.revokedCount}} 0
{{\\'BLOCKCHAIN.VIEW.CERT_COUNT\\'|translate}} {{::formData.certificationsCount}}

{{\\'BLOCKCHAIN.VIEW.TX_COUNT\\'|translate}} {{::formData.transactionsCount}}

BLOCKCHAIN.VIEW.TX_TO_HIMSELF
( )
');\n$templateCache.put('templates/common/badge_certification_count.html','= $ctrl.parameters.sigQty),\\n \\'badge-assertive\\': ($ctrl.requirements.needCertificationCount + $ctrl.requirements.pendingCertificationCount < $ctrl.parameters.sigQty)}\"> {{$ctrl.requirements.certificationCount}} + {{$ctrl.requirements.pendingCertificationCount}}');\n$templateCache.put('templates/common/badge_given_certification_count.html','
= $ctrl.parameters.sigStock}\"> {{$ctrl.identity.given_cert.length}} (+ {{$ctrl.identity.given_cert_pending.length}}) / {{$ctrl.parameters.sigStock}}
');\n$templateCache.put('templates/common/form_error_messages.html','
');\n$templateCache.put('templates/common/popover_copy.html','
');\n$templateCache.put('templates/common/popover_helptip.html','

 

');\n$templateCache.put('templates/common/popover_locales.html','');\n$templateCache.put('templates/common/popover_profile.html','

{{walletData.name||walletData.uid}}

{{walletData.pubkey|formatPubkey}}

{{walletData.pubkey|formatPubkey}}
{{\\'LOGIN.NO_ACCOUNT_QUESTION\\'|translate}}
');\n$templateCache.put('templates/common/popover_share.html','

{{titleKey|translate:titleValues}}

{{time|formatDate}}
');\n$templateCache.put('templates/common/popup_password.html','
{{error|translate}}
');\n$templateCache.put('templates/common/qrcode.html','
{{:locale:\\'COMMON.PUBKEY\\'|translate}}

{{:rebind:formData.pubkey}}

');\n$templateCache.put('templates/common/view_passcode.html','COMMON.PASSCODE.TITLE');\n$templateCache.put('templates/currency/items_network.html',' CURRENCY.VIEW.MEDIAN_TIME {{formData.medianTime | medianDate}} CURRENCY.VIEW.POW_MIN {{formData.difficulty | formatInteger}}
CURRENCY.VIEW.NETWORK_RULES_DIVIDER
CURRENCY.VIEW.AVG_GEN_TIME {{formData.avgGenTime | formatDuration}}
PEER.MEMBERS PEER.MIRRORS PEER.OFFLINE PEER.PEERS ({{search.results.length}})
');\n$templateCache.put('templates/currency/items_parameters.html','
CURRENCY.VIEW.CURRENCY_NAME
{{formData.currency}} ()
CURRENCY.VIEW.SHARE (Mt/Nt)
CURRENCY.VIEW.MASS (Mt)
CURRENCY.VIEW.C_ACTUAL (c{{\\'CURRENCY.VIEW.CURRENT\\'|translate}})
{{formData.cactual | formatNumeral: \\'0,0.00\\'}} % / {{formData.dt | formatPeriod}}
CURRENCY.VIEW.UD ({{\\'COMMON.UD\\'|translate}}t)
1  / {{formData.dt | formatPeriod}}
COMMON.BTN_RELATIVE_UNIT
CURRENCY.VIEW.MONEY_RULES_DIVIDER
CURRENCY.VIEW.C_RULE (c)
{{formData.c*100 | formatNumeral: \\'0,0.00\\'}} % / {{formData.dt | formatPeriod}}{{formData.c*100 | formatNumeral: \\'0,0.00\\'}} % / {{formData.dtReeval | formatDuration}}
CURRENCY.VIEW.DT_REEVAL (dt{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}})
CURRENCY.VIEW.UD_REEVAL_TIME0 (t0{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}})
{{formData.udReevalTime0|medianDate}}
CURRENCY.VIEW.UD_RULE - {{\\'COMMON.UD\\'|translate}}{{formData.dt|formatPeriod}}(t{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}})
{{\\'COMMON.UD\\'|translate}}t-1 + c2 * Mt-1/Nt-1{{\\'COMMON.UD\\'|translate}}{{formData.dt|formatPeriod}}(t{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}} - dt{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}})+ c2 * (M/N)(t{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}} - dt{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}) / dt{{\\'CURRENCY.VIEW.REEVAL_SYMBOL\\'|translate}}
CURRENCY.VIEW.DISPLAY_ALL_RULES
');\n$templateCache.put('templates/currency/items_wot.html','
CURRENCY.VIEW.MEMBERS (N{{\\'CURRENCY.VIEW.CURRENT\\'|translate}})
{{formData.N | formatInteger}}
(ΔN)
formData.Nprev), \\'badge-stable\\': (formData.N==formData.Nprev) ,\\'badge-assertive\\': (formData.Nprev>formData.N)}\">{{formData.N > formData.Nprev ? \\'+\\' : \\'\\'}}{{formData.N - formData.Nprev}}
CURRENCY.VIEW.WOT_RULES_DIVIDER
CURRENCY.VIEW.SIG_QTY_RULE {{formData.sigQty}} CURRENCY.VIEW.MS_WINDOW {{formData.msWindow | formatDuration}} CURRENCY.VIEW.MS_VALIDITY {{formData.msValidity | formatDuration}} CURRENCY.VIEW.SIG_WINDOW {{formData.sigWindow | formatDuration}} CURRENCY.VIEW.SIG_VALIDITY {{formData.sigValidity | formatDuration}} CURRENCY.VIEW.SIG_STOCK {{formData.sigStock}} CURRENCY.VIEW.SIG_PERIOD {{formData.sigPeriod | formatDuration}}
(stepMax)
{{formData.stepMax}}
CURRENCY.VIEW.SENTRIES {{formData.sentries}} CURRENCY.VIEW.SENTRIES_FORMULA {{\\'CURRENCY.VIEW.MATH_CEILING\\'| translate}}( Nt^ (1 / stepMax)) CURRENCY.VIEW.XPERCENT {{formData.xpercent*100| formatNumeral: \\'0,0\\'}} %
CURRENCY.VIEW.DISPLAY_ALL_RULES
');\n$templateCache.put('templates/currency/lookup.html','

CURRENCY.SELECT.CURRENCIES

');\n$templateCache.put('templates/currency/lookup_form.html','

{{currency.name}}

{{currency.peer.server}}

{{\\'CURRENCY.SELECT.MEMBERS_COUNT\\'|translate:currency}}
');\n$templateCache.put('templates/currency/modal_license.html','

CURRENCY.LICENSE.TITLE

translate>CURRENCY.LICENSE.NO_LICENSE_FILE

');\n$templateCache.put('templates/currency/popover_actions.html','

COMMON.POPOVER_ACTIONS_TITLE

');\n$templateCache.put('templates/currency/view_currency.html','');\n$templateCache.put('templates/currency/view_currency_lg.html','{{\\'CURRENCY.VIEW.TITLE\\' | translate}} {{formData.currency|abbreviate}}
CURRENCY.VIEW.MONEY_DIVIDER
CURRENCY.VIEW.WOT_DIVIDER
');\n$templateCache.put('templates/help/help.html','

HELP.JOIN.SECTION

LOGIN.SALT
HELP.JOIN.SALT
LOGIN.PASSWORD
HELP.JOIN.PASSWORD
ACCOUNT.NEW.PSEUDO
HELP.JOIN.PSEUDO

HELP.LOGIN.SECTION

HELP.LOGIN.PUBKEY
HELP.LOGIN.PUBKEY_DEF
HELP.LOGIN.METHOD
HELP.LOGIN.METHOD_DEF

HELP.GLOSSARY.SECTION

COMMON.PUBKEY
HELP.GLOSSARY.PUBKEY_DEF
HELP.GLOSSARY.BLOCKCHAIN
HELP.GLOSSARY.BLOCKCHAIN_DEF
COMMON.UNIVERSAL_DIVIDEND
HELP.GLOSSARY.UNIVERSAL_DIVIDEND_DEF
HELP.GLOSSARY.MEMBER
HELP.GLOSSARY.MEMBER_DEF
HELP.GLOSSARY.WOT
HELP.GLOSSARY.WOT_DEF
HELP.GLOSSARY.CURRENCY_RULES
HELP.GLOSSARY.CURRENCY_RULES_DEF
HELP.GLOSSARY.DISTANCE_RULE
HELP.GLOSSARY.DISTANCE_RULE_DEF
');\n$templateCache.put('templates/help/modal_help.html','

HELP.TITLE

');\n$templateCache.put('templates/help/view_help.html','HELP.TITLE

HELP.TITLE

');\n$templateCache.put('templates/home/home.html','
 

HOME.WELCOME HOME.MESSAGE



{{\\'LOGIN.HAVE_ACCOUNT_QUESTION\\'|translate}} COMMON.BTN_LOGIN

{{\\'COMMON.APP_VERSION\\'|translate:{version: config.version} }} | HOME.BTN_ABOUT
 
');\n$templateCache.put('templates/join/modal_choose_account_type.html','

ACCOUNT.NEW.TITLE

ACCOUNT.NEW.INTRO_WARNING_SECURITY
ACCOUNT.NEW.INTRO_WARNING_SECURITY_HELP


ACCOUNT.NEW.SELECT_ACCOUNT_TYPE

ACCOUNT.NEW.MEMBER_ACCOUNT

ACCOUNT.NEW.WALLET_ACCOUNT

ACCOUNT.NEW.WALLET_ACCOUNT_HELP

');\n$templateCache.put('templates/join/modal_join_member.html','

ACCOUNT.NEW.MEMBER_ACCOUNT_TITLE

ACCOUNT.NEW.INFO_LICENSE
ACCOUNT.NEW.PSEUDO_WARNING
ACCOUNT.NEW.PSEUDO
ACCOUNT.NEW.CHECKING_PSEUDO
ACCOUNT.NEW.PSEUDO_AVAILABLE
ACCOUNT.NEW.PSEUDO_NOT_AVAILABLE
ACCOUNT.NEW.SALT_WARNING
LOGIN.SALT
ACCOUNT.NEW.SALT_CONFIRM
COMMON.SHOW_VALUES
ACCOUNT.NEW.PASSWORD_WARNING
LOGIN.PASSWORD
ACCOUNT.NEW.PASSWORD_CONFIRM
COMMON.SHOW_VALUES
ACCOUNT.NEW.LAST_SLIDE_CONGRATULATION

LOGIN.ASSOCIATED_PUBKEY

{{formData.pubkey}}

{{formData.pubkey}}
ERROR.EXISTING_ACCOUNT_REQUEST
');\n$templateCache.put('templates/join/modal_join_wallet.html','

ACCOUNT.NEW.WALLET_ACCOUNT_TITLE

ACCOUNT.NEW.SALT_WARNING
LOGIN.SALT
ACCOUNT.NEW.SALT_CONFIRM
COMMON.SHOW_VALUES
ACCOUNT.NEW.PASSWORD_WARNING
LOGIN.PASSWORD
ACCOUNT.NEW.PASSWORD_CONFIRM
COMMON.SHOW_VALUES
ACCOUNT.NEW.LAST_SLIDE_CONGRATULATION
COMMON.PUBKEY ACCOUNT.NEW.COMPUTING_PUBKEY {{formData.pubkey}}
ERROR.EXISTING_ACCOUNT
ACCOUNT.NEW.COMPUTING_PUBKEY
{{formData.pubkey}}
ERROR.EXISTING_ACCOUNT_REQUEST
');\n$templateCache.put('templates/login/form_file_import.html','

LOGIN.FILE_FORM_HELP

LOGIN.FILE.HELP

COMMON.CHOOSE_FILE

{{formData.file.name}}

COMMON.FILE.DATE {{formData.file.lastModified/1000|formatDate}}

COMMON.FILE.SIZE {{formData.file.size|formatInteger}} Ko

COMMON.PUBKEY

COMMON.FILE.VALIDATING

{{formData.file.pubkey}}
{{formData.file.pubkey ? \\'ERROR.AUTH_INVALID_PUBKEY\\' : \\'ERROR.AUTH_INVALID_FILE\\' |translate}}

LOGIN.MEMORIZE_AUTH_FILE
');\n$templateCache.put('templates/login/form_login.html','


{{\\'LOGIN.NO_ACCOUNT_QUESTION\\'|translate}}
LOGIN.CREATE_ACCOUNT

');\n$templateCache.put('templates/login/form_pubkey.html','

LOGIN.PUBKEY_FORM_HELP

COMMON.PUBKEY
');\n$templateCache.put('templates/login/form_scan.html','

COMMON.PUBKEY
{{formData.pubkey}}
');\n$templateCache.put('templates/login/form_scrypt.html','

');\n$templateCache.put('templates/login/form_scrypt_advanced.html','

INFO.FEATURES_NOT_IMPLEMENTED

');\n$templateCache.put('templates/login/item_remember_me.html','
SETTINGS.REMEMBER_ME
');\n$templateCache.put('templates/login/modal_login.html','

');\n$templateCache.put('templates/login/popover_methods.html','

LOGIN.METHOD_POPOVER_TITLE

');\n$templateCache.put('templates/network/item_content_peer.html','

{{:rebind:peer.dns || peer.server}}

{{:locale:\\'NETWORK.VIEW.PRIVATE_ACCESS\\'|translate}}

{{:rebind:peer.pubkey|formatPubkey}} {{:rebind:peer.name || peer.uid}} {{:rebind:peer.dns && (\\' | \\' + peer.server) + (peer.bma.path||\\'\\') }}

SSL BMA WS2P

{{:rebind:peer.difficulty||\\'?\\'}} PEER.MIRROR

{{:rebind: peer.software !== \\'duniter\\' ? peer.software : \\'\\'}} {{:rebind: peer.version ? (\\'v\\'+peer.version) : \\'\\'}}

{{:locale:!expertMode ? (\\'COMMON.BLOCK\\'|translate) : \\'\\' }} {{:rebind:(peer.currentNumber || peer.blockNumber) | formatInteger}}   {{:rebind:peer.consensusBlockDelta|formatDurationTime}}
');\n$templateCache.put('templates/network/items_peers.html','');\n$templateCache.put('templates/network/lookup_popover_actions.html','

PEER.POPOVER_FILTER_TITLE

');\n$templateCache.put('templates/network/modal_network.html','

PEER.PEER_LIST

PEER.MEMBER_PEERS PEER.MIRROR_PEERS PEER.ALL_PEERS ({{search.results.length}})

');\n$templateCache.put('templates/network/popover_endpoints.html','
{{titleKey | translate:titleValues }}
{{item.label | translate}}
{{item.value}}
');\n$templateCache.put('templates/network/popover_network.html','
{{\\'MENU.NETWORK\\'|translate}}
');\n$templateCache.put('templates/network/popover_peer_info.html','
{{\\'PEER.VIEW.TITLE\\'|translate}}
{{\\'NETWORK.VIEW.SOFTWARE\\'|translate}}
{{formData.software}} v{{:rebind:formData.version}}
{{\\'NETWORK.VIEW.ENDPOINTS.BMAS\\'|translate}}
COMMON.BTN_YES
COMMON.BTN_NO
{{\\'BLOCKCHAIN.VIEW.TITLE_CURRENT\\'|translate}}
{{:rebind:formData.number | formatInteger}}
{{\\'CURRENCY.VIEW.MEDIAN_TIME\\'|translate}}
{{:rebind:formData.medianTime | medianDate}}
{{\\'CURRENCY.VIEW.POW_MIN\\'|translate}}
{{:rebind:formData.powMin | formatInteger}}
');\n$templateCache.put('templates/network/view_network.html','MENU.NETWORK');\n$templateCache.put('templates/network/view_peer.html','PEER.VIEW.TITLE
 

PEER.VIEW.TITLE {{node.host}}

{{node.bma.dns || node.server}} SSL ({{\\'PEER.MIRROR\\'|translate}})

{{\\'PEER.VIEW.OWNER\\'|translate}} {{node.name || node.uid}} ({{node.uid}}) {{node.pubkey|formatPubkey}} ({{node.name}})

{{\\'PEER.VIEW.SHOW_RAW_PEERING\\'|translate}} | PEER.VIEW.SHOW_RAW_CURRENT_BLOCK

PEER.VIEW.GENERAL_DIVIDER
COMMON.PUBKEY

{{node.pubkey}}

BLOCKCHAIN.VIEW.TITLE_CURRENT
{{current.number|formatInteger}}
PEER.VIEW.LAST_BLOCKS
PEER.VIEW.KNOWN_PEERS
{{\\'NETWORK.INFO.ONLY_SSL_PEERS\\'|translate}}
 
');\n$templateCache.put('templates/settings/popover_actions.html','

COMMON.POPOVER_ACTIONS_TITLE

');\n$templateCache.put('templates/settings/popup_node.html','
{{\\'SETTINGS.POPUP_PEER.USE_SSL\\' | translate}}

{{\\'SETTINGS.POPUP_PEER.BTN_SHOW_LIST\\' | translate}}
');\n$templateCache.put('templates/settings/settings.html','SETTINGS.TITLE
SETTINGS.DISPLAY_DIVIDER
{{\\'COMMON.BTN_RELATIVE_UNIT\\' | translate}}
SETTINGS.STORAGE_DIVIDER
{{\\'SETTINGS.USE_LOCAL_STORAGE\\' | translate}}

{{\\'SETTINGS.AUTHENTICATION_SETTINGS\\' | translate}}
{{\\'SETTINGS.REMEMBER_ME\\' | translate}}

SETTINGS.KEYRING_FILE

{{formData.keyringFile}}
{{\\'SETTINGS.WALLETS_SETTINGS\\' | translate}}
SETTINGS.USE_WALLETS_ENCRYPTION

SETTINGS.HISTORY_SETTINGS
SETTINGS.DISPLAY_UD_HISTORY
SETTINGS.TX_HISTORY_AUTO_REFRESH

SETTINGS.NETWORK_SETTINGS
SETTINGS.PEER

{{bma.server}}
{{bma.server}}
SETTINGS.PEER
SETTINGS.PEER_SHORT

{{bma.server}}
{{bma.server}}

SETTINGS.PLUGINS_SETTINGS
');\n$templateCache.put('templates/wallet/item_tx.html',' ');\n$templateCache.put('templates/wallet/item_ud.html','
COMMON.UNIVERSAL_DIVIDEND

{{::tx.time | medianFromNowAndDate}}

()
');\n$templateCache.put('templates/wallet/modal_security.html','

ACCOUNT.SECURITY.TITLE

ACCOUNT.SECURITY.RECOVER_ID

ACCOUNT.SECURITY.RECOVER_ID_HELP

ACCOUNT.SECURITY.REVOCATION_WITH_FILE

ACCOUNT.SECURITY.REVOCATION_WITH_FILE_DESCRIPTION

ACCOUNT.SECURITY.SAVE_ID

ACCOUNT.SECURITY.SAVE_ID_HELP

ACCOUNT.SECURITY.GENERATE_KEYFILE

ACCOUNT.SECURITY.GENERATE_KEYFILE_HELP

ACCOUNT.SECURITY.DOWNLOAD_REVOKE

ACCOUNT.SECURITY.DOWNLOAD_REVOKE_HELP

ACCOUNT.SECURITY.SEND_IDENTITY

ACCOUNT.SECURITY.MEMBERSHIP_IN

ACCOUNT.SECURITY.REVOCATION_WALLET

ACCOUNT.SECURITY.REVOCATION_WALLET_HELP

');\n$templateCache.put('templates/wallet/modal_transfer.html','

TRANSFER.MODAL.TITLE

');\n$templateCache.put('templates/wallet/new_transfer.html','TRANSFER.TITLE
 

{{(formData.all ? \\'TRANSFER.SUB_TITLE_ALL\\' : \\'TRANSFER.SUB_TITLE\\')|translate}}

 

 
');\n$templateCache.put('templates/wallet/popover_actions.html','

COMMON.POPOVER_ACTIONS_TITLE

');\n$templateCache.put('templates/wallet/popover_unit.html','');\n$templateCache.put('templates/wallet/popup_register.html','
');\n$templateCache.put('templates/wallet/transfer_form.html','
TRANSFER.TO {{destUid}}   {{formData.destPub | formatPubkey}}
TRANSFER.FROM 0 && (!form.amount.$error.max)) }\"> {{walletData.pubkey| formatPubkey}}   {{walletData.name||walletData.uid}}  
TRANSFER.AMOUNT ()
 
TRANSFER.REST()TRANSFER.REST_TO {{restUid}}   {{formData.restPub | formatPubkey}}

TRANSFER.WARN_COMMENT_IS_PUBLIC

TRANSFER.WARN_COMMENT_IS_PUBLIC

');\n$templateCache.put('templates/wallet/tx_locked_outputs_popover.html','

ACCOUNT.LOCKED_OUTPUTS_POPOVER.TITLE

ACCOUNT.LOCKED_OUTPUTS_POPOVER.DESCRIPTION

1\" class=\"item item-text-wrap no-border\">

ACCOUNT.LOCKED_OUTPUTS_POPOVER.DESCRIPTION_MANY

1\" translate>ACCOUNT.LOCKED_OUTPUTS_POPOVER.LOCKED_AMOUNT

1\" class=\"badge item-note\" ng-class=\"{\\'badge-balanced\\': output.amount > 0}\">
1}\" ng-style=\"::condition.style\">{{::\\'BLOCKCHAIN.VIEW.TX_OUTPUT_OPERATOR.\\'+condition.operator|translate}} 
{{::condition.value|formatDuration}}
{{::condition.value|medianDate}}
');\n$templateCache.put('templates/wallet/view_wallet.html','
  

 
WOT.GENERAL_DIVIDER
{{:locale:\\'COMMON.PUBKEY\\'|translate}}

{{:rebind:formData.pubkey}}

COMMON.UID
WOT.REGISTERED_SINCE {{:rebind:formData.sigDate | medianDate}}
{{:rebind:formData.uid}}
{{:locale:\\'ACCOUNT.CERTIFICATION_COUNT\\'|translate}} WOT.GIVEN_CERTIFICATIONS.SENT WOT.ACCOUNT_OPERATIONS {{:locale:\\'ACCOUNT.EVENTS\\' | translate}}
 
');\n$templateCache.put('templates/wallet/view_wallet_tx.html','MENU.TRANSACTIONS
  
 
{{:locale:\\'ACCOUNT.ERROR_TX\\'|translate}}
{{formData.tx.errors.length}}
{{:locale:\\'ACCOUNT.PENDING_TX\\'|translate}}
{{:locale:\\'ACCOUNT.VALIDATING_TX\\'|translate}}
{{:locale:\\'ACCOUNT.LAST_TX\\'|translate}}   {{:locale:\\'ACCOUNT.NO_TX\\'|translate}}
 
');\n$templateCache.put('templates/wallet/view_wallet_tx_error.html','
 
{{:locale:\\'ACCOUNT.PENDING_TX_RECEIVED\\'|translate}}
({{$root.currency.name | abbreviate}}) ({{\\'COMMON.UD\\' | translate}}{{$root.currency.name | abbreviate}})
{{:locale:\\'ACCOUNT.NO_TX\\'|translate}}
{{:locale:\\'ACCOUNT.ERROR_TX_SENT\\'|translate}}
({{$root.currency.name | abbreviate}}) ({{\\'COMMON.UD\\' | translate}}{{$root.currency.name | abbreviate}})
{{:locale:\\'ACCOUNT.NO_TX\\'|translate}}
 
');\n$templateCache.put('templates/wot/item_certification.html','

{{::cert.name||cert.uid}}

{{::cert.pubkey | formatPubkey}} | {{::cert.time|medianDate}} | {{::cert.pending ? \\'WOT.SIGNED_ON_BLOCK\\' : \\'WOT.WRITTEN_ON_BLOCK\\' | translate:cert}}

{{::cert.name||cert.uid}} {{::cert.pubkey | formatPubkey}}

{{::\\'WOT.NOT_MEMBER_PARENTHESIS\\'|translate}}

{{::cert.pubkey | formatPubkey}} | {{::cert.time|medianDate}} | {{::cert.pending ? \\'WOT.SIGNED_ON_BLOCK\\' : \\'WOT.WRITTEN_ON_BLOCK\\' | translate:cert}}

{{::cert.expiresIn | formatDurationTo}}
{{::\\'WOT.EXPIRED\\' | translate}}
');\n$templateCache.put('templates/wot/item_content_identity.html','

{{::item.pubkey|formatPubkey}}

{{::\\'WOT.LOOKUP.REGISTERED\\' | translate:item }}

{{::\\'WOT.LOOKUP.MEMBER_FROM\\' | translate:item}}

{{::item.uid}}  {{::item.pubkey | formatPubkey}} WOT.NOT_MEMBER_PARENTHESIS WOT.IDENTITY_REVOKED_PARENTHESIS

#

');\n$templateCache.put('templates/wot/items_given_certifications.html','
WOT.GIVEN_CERTIFICATIONS.SUMMARY
WOT.GIVEN_CERTIFICATIONS.SENT
WOT.GIVEN_CERTIFICATIONS.ERROR {{formData.given_cert_error.length}}
WOT.GIVEN_CERTIFICATIONS.PENDING_LIST
WOT.NOT_WRITTEN_EXPIRE_IN
WOT.GIVEN_CERTIFICATIONS.LIST
WOT.EXPIRE_IN
WOT.NO_GIVEN_CERTIFICATION
');\n$templateCache.put('templates/wot/items_received_certifications.html','
WOT.CERTIFICATIONS.SUMMARY
WOT.CERTIFICATIONS.RECEIVED

WOT.CERTIFICATIONS.SENTRY_MEMBER

WOT.CERTIFICATIONS.ERROR {{formData.received_cert_error.length}}
WOT.CERTIFICATIONS.PENDING_LIST
WOT.NOT_WRITTEN_EXPIRE_IN
WOT.CERTIFICATIONS.LIST
WOT.EXPIRE_IN
WOT.NO_CERTIFICATION
');\n$templateCache.put('templates/wot/lookup.html','');\n$templateCache.put('templates/wot/lookup_form.html','
{{::parameters.help|translate}}
  

WOT.LOOKUP.NEWCOMERS

{{\\'WOT.LOOKUP.NEWCOMERS_COUNT\\'|translate:{count: search.total} }}

WOT.LOOKUP.PENDING

{{\\'WOT.LOOKUP.PENDING_COUNT\\'|translate:{count: search.total} }}

COMMON.RESULTS_LIST ({{search.total}})

{{\\'WOT.LOOKUP.BTN_NEWCOMERS\\' | translate}} {{\\'WOT.LOOKUP.BTN_PENDING\\' | translate}} {{\\'MENU.WALLETS\\' | translate}} 

WOT.SEARCH_INIT_PHASE_WARNING

COMMON.SEARCH_NO_RESULT WOT.LOOKUP.NO_PENDING WOT.LOOKUP.NO_NEWCOMERS
{{::(\\'WOT.SEARCH.DIVIDER_\\' + item.index)|upper|translate}}
');\n$templateCache.put('templates/wot/lookup_lg.html','{{\\'MENU.WOT\\' | translate}}');\n$templateCache.put('templates/wot/lookup_popover_actions.html','

COMMON.POPOVER_FILTER_TITLE

');\n$templateCache.put('templates/wot/modal_lookup.html','

{{::parameters.title?parameters.title:\\'WOT.MODAL.TITLE\\'|translate}}

');\n$templateCache.put('templates/wot/modal_select_pubkey_identity.html','

ACCOUNT.SELECT_IDENTITY_MODAL.TITLE

{{item.uid}}

{{::item.pubkey | formatPubkey}} WOT.NOT_MEMBER_PARENTHESIS WOT.IDENTITY_REVOKED_PARENTHESIS ERROR.WOT_PENDING_INVALID_BLOCK_HASH

WOT.REGISTERED_SINCE {{::item.meta.time|medianDate}}

ACCOUNT.CERTIFICATION_COUNT
');\n$templateCache.put('templates/wot/view_certifications.html','{{::formData.name||formData.uid}}
');\n$templateCache.put('templates/wot/view_identity.html','

{{::formData.name}}

{{:rebind:formData.uid}}

{{:rebind:formData.pubkey | formatPubkey}}

WOT.IDENTITY_REVOKED_PARENTHESISWOT.MEMBER_PENDING_REVOCATION_PARENTHESIS

 
WOT.GENERAL_DIVIDER COMMON.PUBKEY

{{:rebind:formData.pubkey}}

WOT.NOT_MEMBER_ACCOUNT

WOT.NOT_MEMBER_ACCOUNT_HELP

COMMON.UID
WOT.REGISTERED_SINCE {{:rebind:formData.sigDate|medianDate}}
{{:rebind:formData.uid}}
ACCOUNT.CERTIFICATION_COUNT WOT.GIVEN_CERTIFICATIONS.SENT WOT.ACCOUNT_OPERATIONS
 
');\n$templateCache.put('templates/wot/view_identity_tx.html','{{formData.name || formData.uid}} {{formData.pubkey|formatPubkey}} {{\\'WOT.OPERATIONS.TITLE\\'|translate: {uid: formData.name || formData.uid} }} {{formData.pubkey|formatPubkey}} {{\\'WOT.OPERATIONS.TITLE\\'|translate}}
 
{{:locale:\\'ACCOUNT.BALANCE_ACCOUNT\\'|translate}}
0 }\" ng-bind-html=\":balance:formData.balance|formatAmount:{currency: $root.currency.name}\">
()
{{:locale:\\'ACCOUNT.ERROR_TX\\'|translate}}
{{formData.tx.errors.length}}
{{:locale:\\'ACCOUNT.PENDING_TX\\'|translate}}
{{:locale:\\'ACCOUNT.VALIDATING_TX\\'|translate}}
{{:locale:\\'ACCOUNT.LAST_TX\\'|translate}}  
 
');\n$templateCache.put('templates/currency/tabs/tab_blocks.html','
BLOCKCHAIN.LOOKUP.LAST_BLOCKS
');\n$templateCache.put('templates/currency/tabs/tab_network.html','
');\n$templateCache.put('templates/currency/tabs/tab_parameters.html','
');\n$templateCache.put('templates/currency/tabs/tab_wot.html','
');\n$templateCache.put('templates/wallet/list/item_wallet.html','

{{::walletData.pubkey|formatPubkey}}

{{::walletData.uid}}  {{::walletData.pubkey | formatPubkey}} WOT.NOT_MEMBER_PARENTHESIS

0) }\">
');\n$templateCache.put('templates/wallet/list/item_wallet_light.html','

{{::walletData.localName||walletData.name||walletData.uid}}{{::walletData.pubkey|formatPubkey}}

{{::walletData.uid}}  {{::walletData.pubkey | formatPubkey}} WOT.NOT_MEMBER_PARENTHESIS

0) }\">
');\n$templateCache.put('templates/wallet/list/modal_import_file.html','

ACCOUNT.WALLET_LIST.IMPORT_MODAL.TITLE

ACCOUNT.WALLET_LIST.IMPORT_MODAL.HELP

COMMON.CHOOSE_FILE

{{fileData.name}}

COMMON.FILE.DATE {{fileData.lastModified/1000|formatDate}}

COMMON.FILE.SIZE {{fileData.size|formatInteger}} Ko

COMMON.FILE.VALIDATING


{{\\'ACCOUNT.WALLET_LIST.IMPORT_MODAL.NO_NEW_WALLET\\' |translate}}

{{\\'ERROR.INVALID_FILE_FORMAT\\' |translate}}

');\n$templateCache.put('templates/wallet/list/modal_wallets.html','

ACCOUNT.SELECT_WALLET_MODAL.TITLE

{{:locale:\\'ACCOUNT.WALLET_LIST.NO_WALLET\\'|translate}}
');\n$templateCache.put('templates/wallet/list/popover_actions.html','

COMMON.POPOVER_ACTIONS_TITLE

');\n$templateCache.put('templates/wallet/list/popover_wallets.html','
ACCOUNT.SELECT_WALLET_MODAL.TITLE
{{:locale:\\'ACCOUNT.WALLET_LIST.NO_WALLET\\'|translate}}
');\n$templateCache.put('templates/wallet/list/popup_edit_name.html','
');\n$templateCache.put('templates/wallet/list/view_wallets.html','

ACCOUNT.WALLET_LIST.TITLE (ACCOUNT.WALLET_LIST.TOTAL_DOTS  )

{{:locale:\\'ACCOUNT.WALLET_LIST.NO_WALLET\\'|translate}}
');\n$templateCache.put('templates/wallet/slides/slides_generate_keyfile.html','

ACCOUNT.SECURITY.GENERATE_KEYFILE

ACCOUNT.SECURITY.KEYFILE.PUBSEC_FORMAT

ACCOUNT.SECURITY.KEYFILE.PUBSEC_FORMAT_HELP

ACCOUNT.SECURITY.KEYFILE.WIF_FORMAT

ACCOUNT.SECURITY.KEYFILE.WIF_FORMAT_HELP

ACCOUNT.SECURITY.KEYFILE.EWIF_FORMAT

ACCOUNT.SECURITY.KEYFILE.EWIF_FORMAT_HELP

');\n$templateCache.put('templates/wallet/slides/slides_recoverID_1.html','

ACCOUNT.SECURITY.RECOVER_ID_SELECT_FILE

COMMON.CHOOSE_FILE

{{fileData.name}}
{{fileData.size}} Ko
');\n$templateCache.put('templates/wallet/slides/slides_recoverID_2.html','

ACCOUNT.SECURITY.RECOVER_ID

');\n$templateCache.put('templates/wallet/slides/slides_recoverID_3.html','

ACCOUNT.SECURITY.RECOVER_ID

{{\\'LOGIN.SALT\\' | translate}} : {{recover.salt}}
{{\\'LOGIN.PASSWORD\\' | translate}} : {{recover.pwd}}
');\n$templateCache.put('templates/wallet/slides/slides_revocation_file.html','

ACCOUNT.SECURITY.REVOCATION_WITH_FILE_HELP

COMMON.CHOOSE_FILE

{{fileData.name}}

COMMON.FILE.DATE {{fileData.lastModified/1000|formatDate}}

COMMON.FILE.SIZE {{fileData.size|formatInteger}} Ko


{{revocationError|translate}}

');\n$templateCache.put('templates/wallet/slides/slides_saveID_1.html','

ACCOUNT.SECURITY.SAVE_ID

{{question.value | translate}}
');\n$templateCache.put('templates/wallet/slides/slides_saveID_2.html','

ACCOUNT.SECURITY.SAVE_ID

');\n$templateCache.put('templates/wot/tabs/tab_given_certifications.html','
');\n$templateCache.put('templates/wot/tabs/tab_lookup.html','');\n$templateCache.put('templates/wot/tabs/tab_received_certifications.html','
');}]);","angular.module(\"cesium.translations\", []).config([\"$translateProvider\", function($translateProvider) {\n$translateProvider.translations(\"en-GB\", {\n \"COMMON\": {\n \"APP_NAME\": \"Cesium\",\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_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
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...
(Waiting for node availability)\",\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_GOOGLEPLUS\": \"Share on Google+\"\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\": \"Camera\"\n },\n \"MENU\": {\n \"HOME\": \"Home\",\n \"WOT\": \"Registry\",\n \"CURRENCY\": \"Currency\",\n \"ACCOUNT\": \"My Account\",\n \"WALLETS\": \"My wallets\",\n \"SETTINGS\": \"Settings\",\n \"NETWORK\": \"Network\",\n \"TRANSACTIONS\": \"My transactions\"\n },\n \"ABOUT\": {\n \"TITLE\": \"About\",\n \"LICENSE\": \"Free/libre software (License GNU AGPLv3).\",\n \"LATEST_RELEASE\": \"There is a newer version of {{'COMMON.APP_NAME' | translate}} (v{{version}})\",\n \"PLEASE_UPDATE\": \"Please update {{'COMMON.APP_NAME' | translate}} (latest version: v{{version}})\",\n \"CODE\": \"Source code:\",\n \"OFFICIAL_WEB_SITE\": \"Official web site:\",\n \"DEVELOPERS\": \"Developers:\",\n \"FORUM\": \"Forum:\",\n \"PLEASE_REPORT_ISSUE\": \"Please report any issue to us!\",\n \"REPORT_ISSUE\": \"Report an issue\",\n \"BTN_OPEN_DEV_WINDOW\": \"Open the debug window\"\n },\n \"HOME\": {\n \"TITLE\": \"Cesium\",\n \"WELCOME\": \"Welcome to the Cesium Application!\",\n \"MESSAGE\": \"Receive and send 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 {{pubkey|formatPubkey}}?\",\n \"BTN_CHANGE_ACCOUNT\": \"Disconnect this account\",\n \"CONNECTION_ERROR\": \"Peer {{server}} unreachable or invalid address.

Check your Internet connection, or change node in the settings.\",\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 \"WALLETS_SETTINGS\": \"My wallets\",\n \"USE_WALLETS_ENCRYPTION\": \"Secure the list\",\n \"USE_WALLETS_ENCRYPTION_HELP\": \"Enables you to encrypt the list of your wallets. Authentication required to access it.\",\n \"ENABLE_HELPTIP\": \"Enable contextual help tips\",\n \"DISABLE_HELPTIP\": \"Disable contextual help tips\",\n \"ENABLE_UI_EFFECTS\": \"Enable visual effects\",\n \"HISTORY_SETTINGS\": \"Account operations\",\n \"DISPLAY_UD_HISTORY\": \"Display produced dividends?\",\n \"TX_HISTORY_AUTO_REFRESH\": \"Enable automatic refresh?\",\n \"TX_HISTORY_AUTO_REFRESH_HELP\": \"Updates the list of operations to each new block.\",\n \"AUTHENTICATION_SETTINGS\": \"Authentication\",\n \"KEEP_AUTH\": \"Expiration of authentication\",\n \"KEEP_AUTH_SHORT\": \"Expiration\",\n \"KEEP_AUTH_HELP\": \"Define when authentication is cleared from memory.\",\n \"KEEP_AUTH_OPTION\": {\n \"NEVER\": \"After each operation\",\n \"SECONDS\": \"After {{value}}s of inactivity\",\n \"MINUTE\": \"After {{value}}min of inactivity\",\n \"MINUTES\": \"After {{value}}min of inactivity\",\n \"HOUR\": \"After {{value}}h of inactivity\",\n \"ALWAYS\": \"At the end of the session\"\n },\n \"KEYRING_FILE\": \"Keyring file\",\n \"KEYRING_FILE_HELP\": \"Allow auto-connect at startup, or to authenticate (only if \\\"Expiration of authentication\\\" is \\\"at the end of the session\\\"\",\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 \"BLOCK_VALIDITY_WINDOW\": \"Block uncertainty time\",\n \"BLOCK_VALIDITY_WINDOW_SHORT\": \"Time of uncertainty\",\n \"BLOCK_VALIDITY_WINDOW_HELP\": \"Time to wait before considering an information is validated\",\n \"BLOCK_VALIDITY_OPTION\": {\n \"NONE\": \"No delay\",\n \"N\": \"{{time | formatDuration}} ({{count}} blocks)\"\n },\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\": \"Sign of the public key\",\n \"XHX\": \"Password, 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 libre money, started {{firstBlockTime | formatFromNow}}. It currently counts {{N}} members , who produce and collect a Universal Dividend (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 {{dtReeval|formatDuration}} ({{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 and 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: {{version}})\",\n \"WARN_NEW_RELEASE\": \"Version {{version}} 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 (member or public key)\",\n \"SEARCH_INIT_PHASE_WARNING\": \"During the pre-registration phase, the search for pending registrations may be long. 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
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 {{sigDate | formatFromNow}}\",\n \"MEMBER_FROM\": \"Member since {{memberDate|medianFromNowShort}}\",\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\": \" Login\",\n \"SCRYPT_FORM_HELP\": \"Please enter your credentials.
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\": \"Secret identifier\",\n \"SALT_HELP\": \"Secret identifier\",\n \"SHOW_SALT\": \"Display secret identifier?\",\n \"PASSWORD\": \"Password\",\n \"PASSWORD_HELP\": \"Password\",\n \"PUBKEY_HELP\": \"Public key or pseudonym\",\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\": \" You were logout 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 identifier and password\",\n \"SCRYPT_ADVANCED\": \"Advanced salt\",\n \"FILE\": \"Keychain file\",\n \"PUBKEY\": \"Public key or pseudonym\",\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 \"HELP\": \"Expected file format: .dunikey (type PubSec). Other formats are under development (EWIF, WIF).\"\n }\n },\n \"AUTH\": {\n \"TITLE\": \" Authentication\",\n \"BTN_AUTH\": \"Authenticate\",\n \"GENERAL_HELP\": \"Please authenticate yourself:\",\n \"EXPECTED_UID_HELP\": \"Please authenticate to the account {{uid}}:\",\n \"EXPECTED_PUBKEY_HELP\": \"Please authenticate to the wallet {{pubkey|formatPubkey}}:\",\n \"SCAN_FORM_HELP\": \"Scan the QR code of the private key of the wallet.\"\n },\n \"ACCOUNT\": {\n \"TITLE\": \"My Account\",\n \"BALANCE\": \"Balance\",\n \"LAST_TX\": \"Latest validated transactions\",\n \"BALANCE_ACCOUNT\": \"Account balance\",\n \"NO_TX\": \"No transaction\",\n \"SHOW_MORE_TX\": \"Show more\",\n \"SHOW_ALL_TX\": \"Show all\",\n \"TX_FROM_DATE\": \"(current limit to {{fromTime|medianFromNowShort}})\",\n \"PENDING_TX\": \"Pending transactions\",\n \"VALIDATING_TX\": \"Transactions being validated\",\n \"ERROR_TX\": \"Transaction not executed\",\n \"ERROR_TX_SENT\": \"Sent transactions\",\n \"PENDING_TX_RECEIVED\": \"Transactions awaiting receipt\",\n \"EVENTS\": \"Events\",\n \"OUT_DISTANCED\": \"Your current certifications come from a group too isolated from the Web of Trust (WoT): the maximum distance rule is violated.
You must obtain certifications from another area of the Web of Trust, or wait for it to tighten.\",\n \"WAITING_MEMBERSHIP\": \"Membership application sent. Waiting validation.\",\n \"WAITING_CERTIFICATIONS\": \"You need {{needCertificationCount}} certification(s) to become a member and produce the Universal Dividend. Your account is however already operational, to receive and send payments.\",\n \"WAITING_CERTIFICATIONS_HELP\": \"To get your certifications, only request members who know you enough, as required by the currency license that you have accepted.
If you do not know enough members, let them know on the user forum.\",\n \"WILL_MISSING_CERTIFICATIONS\": \"You will lack certifications soon (at least {{willNeedCertificationCount}} more are needed)\",\n \"WILL_NEED_RENEW_MEMBERSHIP\": \"Your membership will expire {{membershipExpiresIn|formatDurationTo}}. Remember to renew your membership before then.\",\n \"NEED_RENEW_MEMBERSHIP\": \"You are no longer a member because your membership has expired. Remember to renew your membership.\",\n \"NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED\": \"You are no longer a member because your membership has been cancelled for lack of certifications. Remember to renew your membership.\",\n \"NO_WAITING_MEMBERSHIP\": \"No membership application pending. If you'd like to become a member, please send the membership application.\",\n \"CERTIFICATION_COUNT\": \"Received certifications\",\n \"CERTIFICATION_COUNT_SHORT\": \"Certifications\",\n \"SIG_STOCK\": \"Stock of certifications to give\",\n \"BTN_RECEIVE_MONEY\": \"Receive\",\n \"BTN_SELECT_ALTERNATIVES_IDENTITIES\": \"Switch to another identity...\",\n \"BTN_FIX_MEMBERSHIP\": \"Resubmit membership request...\",\n \"BTN_MEMBERSHIP_RENEW\": \"Renew membership\",\n \"BTN_MEMBERSHIP_RENEW_DOTS\": \"Renew membership...\",\n \"BTN_MEMBERSHIP_OUT_DOTS\": \"Revoke membership...\",\n \"BTN_SECURITY_DOTS\": \"Sign-in and security...\",\n \"BTN_SHOW_DETAILS\": \"Display technical data\",\n \"LOCKED_OUTPUTS_POPOVER\": {\n \"TITLE\": \"Locked amount\",\n \"DESCRIPTION\": \"Here are the conditions for unlocking this amount:\",\n \"DESCRIPTION_MANY\": \"This transaction consists of several parts, of which the unlock conditions are:\",\n \"LOCKED_AMOUNT\": \"Conditions for the amount:\"\n },\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) is secure and trustworthy .\",\n \"INTRO_WARNING_SECURITY_HELP\": \"Up-to-date anti-virus, firewall enabled, session protected by password or pin code...\",\n \"INTRO_HELP\": \"Click {{'COMMON.BTN_START'|translate}} to begin creating an account. You will be guided step by step.\",\n \"REGISTRATION_NODE\": \"Your registration will be registered via the Duniter peer {{server}} 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 in the settings 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 secret identifier.
You need it for each connection to this account.

Make sure to remember this identifier.
If lost, there are no means to retrieve it!\",\n \"PASSWORD_WARNING\": \"Choose a password.
You need it for each connection to this account.

Make sure to remember this password.
If lost, there are no means to retrieve it!\",\n \"PSEUDO_WARNING\": \"Choose a pseudonym.
It may be used by other people to find you more easily.

.Use of commas, spaces and accents is not allowed.