angular.module("bit",["ui.router","ngMessages","angular-jwt","angular-md5","ui.bootstrap.showErrors","toastr","angulartics","angulartics.google.analytics","bit.directives","bit.services","bit.global","bit.accounts","bit.vault","bit.settings","bit.tools"]),angular.module("bit").constant("appSettings",{rememberedEmailCookieName:"bit.rememberedEmail",apiUri:"https://api.bitwarden.com",version:"1.5.0",environment:"Production"}),angular.module("bit.accounts",["ui.bootstrap","ngCookies"]),angular.module("bit.directives",[]),angular.module("bit.global",[]),angular.module("bit.services",["ngResource","ngStorage","angular-jwt"]),angular.module("bit.settings",["ui.bootstrap","toastr"]),angular.module("bit.tools",["ui.bootstrap","toastr"]),angular.module("bit.vault",["ui.bootstrap","ngclipboard"]),angular.module("bit").factory("apiInterceptor",["$injector","$q","toastr",function(e,t,r){return{request:function(e){return e},response:function(o){return 401!==o.status&&403!==o.status||(e.get("authService").logOut(),e.get("$state").go("frontend.login.info").then(function(){r.warning("Your login session has expired.","Logged out")})),o||t.when(o)},responseError:function(o){return 401!==o.status&&403!==o.status||(e.get("authService").logOut(),e.get("$state").go("frontend.login.info").then(function(){r.warning("Your login session has expired.","Logged out")})),t.reject(o)}}}]),angular.module("bit").config(["$stateProvider","$urlRouterProvider","$httpProvider","jwtInterceptorProvider","$uibTooltipProvider","toastrConfig",function(e,t,r,o,n,a){o.urlParam="access_token",o.tokenGetter=["config","appSettings","tokenService",function(e,t,r){return 0===e.url.indexOf(t.apiUri)?r.getToken():void 0}],angular.extend(a,{closeButton:!0,progressBar:!0,showMethod:"slideDown",target:".toast-target"}),n.options({popupDelay:600}),r.defaults.headers.post&&(r.defaults.headers.post={}),r.defaults.headers.post["Content-Type"]="text/plain; charset=utf-8",r.interceptors.push("apiInterceptor"),r.interceptors.push("jwtInterceptor"),t.otherwise("/"),e.state("backend",{templateUrl:"app/views/backendLayout.html","abstract":!0,data:{authorize:!0}}).state("backend.vault",{url:"^/",templateUrl:"app/vault/views/vault.html",controller:"vaultController",data:{pageTitle:"My Vault"}}).state("backend.settings",{url:"^/settings",templateUrl:"app/settings/views/settings.html",controller:"settingsController",data:{pageTitle:"Settings"}}).state("backend.tools",{url:"^/tools",templateUrl:"app/tools/views/tools.html",controller:"toolsController",data:{pageTitle:"Tools"}}).state("frontend",{templateUrl:"app/views/frontendLayout.html","abstract":!0,data:{authorize:!1}}).state("frontend.login",{templateUrl:"app/accounts/views/accountsLogin.html",controller:"accountsLoginController",data:{bodyClass:"login-page"}}).state("frontend.login.info",{url:"^/login",templateUrl:"app/accounts/views/accountsLoginInfo.html",data:{pageTitle:"Log In"}}).state("frontend.login.twoFactor",{url:"^/login/two-factor",templateUrl:"app/accounts/views/accountsLoginTwoFactor.html",data:{pageTitle:"Log In (Two Factor)",authorizeTwoFactor:!0}}).state("frontend.logout",{url:"^/logout",controller:"accountsLogoutController",data:{authorize:!0}}).state("frontend.passwordHint",{url:"^/password-hint",templateUrl:"app/accounts/views/accountsPasswordHint.html",controller:"accountsPasswordHintController",data:{pageTitle:"Master Password Hint",bodyClass:"login-page"}}).state("frontend.recover",{url:"^/recover",templateUrl:"app/accounts/views/accountsRecover.html",controller:"accountsRecoverController",data:{pageTitle:"Recover Account",bodyClass:"login-page"}}).state("frontend.register",{url:"^/register",templateUrl:"app/accounts/views/accountsRegister.html",controller:"accountsRegisterController",data:{pageTitle:"Register",bodyClass:"register-page"}})}]).run(["$rootScope","authService","jwtHelper","tokenService","$state",function(e,t,r,o,n){e.$on("$stateChangeStart",function(e,a,s){return a.data&&a.data.authorize?void(t.isAuthenticated()&&!r.isTokenExpired(o.getToken())||(e.preventDefault(),t.logOut(),n.go("frontend.login.info"))):void(t.isAuthenticated()&&!r.isTokenExpired(o.getToken())&&(e.preventDefault(),n.go("backend.vault")))})}]),angular.module("bit.accounts").controller("accountsLoginController",["$scope","$rootScope","$cookies","apiService","cryptoService","authService","$state","appSettings","$analytics",function(e,t,r,o,n,a,s,i,l){var c=r.get(i.rememberedEmailCookieName);c&&(e.model={email:c,rememberEmail:!0}),e.login=function(t){e.loginPromise=a.logIn(t.email,t.masterPassword),e.loginPromise.then(function(){if(t.rememberEmail){var e=new Date;e.setFullYear(e.getFullYear()+10),r.put(i.rememberedEmailCookieName,t.email,{expires:e})}else r.remove(i.rememberedEmailCookieName);var o=a.getUserProfile();o.twoFactor?(l.eventTrack("Logged In To Two-step"),s.go("frontend.login.twoFactor")):(l.eventTrack("Logged In"),s.go("backend.vault"))})},e.twoFactor=function(t){e.twoFactorPromise=a.logInTwoFactor(t.code,"Authenticator"),e.twoFactorPromise.then(function(){l.eventTrack("Logged In From Two-step"),s.go("backend.vault")})}}]),angular.module("bit.accounts").controller("accountsLogoutController",["$scope","authService","$state","$analytics",function(e,t,r,o){t.logOut(),o.eventTrack("Logged Out"),r.go("frontend.login.info")}]),angular.module("bit.accounts").controller("accountsPasswordHintController",["$scope","$rootScope","apiService",function(e,t,r){e.success=!1,e.submit=function(t){e.submitPromise=r.accounts.postPasswordHint({email:t.email},function(){e.success=!0}).$promise}}]),angular.module("bit.accounts").controller("accountsRecoverController",["$scope","apiService","cryptoService",function(e,t,r){e.success=!1,e.submit=function(o){var n=o.email.toLowerCase(),a=r.makeKey(o.masterPassword,n),s={email:n,masterPasswordHash:r.hashPassword(o.masterPassword,a),recoveryCode:o.code.replace(/\s/g,"").toLowerCase()};e.submitPromise=t.accounts.postTwoFactorRecover(s,function(){e.success=!0}).$promise}}]),angular.module("bit.accounts").controller("accountsRegisterController",["$scope","$location","apiService","cryptoService","validationService","$analytics",function(e,t,r,o,n,a){var s=t.search();e.success=!1,e.model={email:s.email},e.registerPromise=null,e.register=function(t){var s=!1;if(e.model.masterPassword.length<8&&(n.addError(t,"MasterPassword","Master password must be at least 8 characters long.",!0),s=!0),e.model.masterPassword!==e.model.confirmMasterPassword&&(n.addError(t,"ConfirmMasterPassword","Master password confirmation does not match.",!0),s=!0),!s){var i=e.model.email.toLowerCase(),l=o.makeKey(e.model.masterPassword,i),c={name:e.model.name,email:i,masterPasswordHash:o.hashPassword(e.model.masterPassword,l),masterPasswordHint:e.model.masterPasswordHint};e.registerPromise=r.accounts.register(c,function(){e.success=!0,a.eventTrack("Registered")}).$promise}}}]),angular.module("bit.directives").directive("apiField",function(){var e=function(e,t,r,o){function n(){return o.$setValidity("api",!0),!0}function a(){o.$setValidity("api",!1)}o.$registerApiError=a,o.$validators.apiValidate=n};return{require:"ngModel",restrict:"A",compile:function(t,r){if(!r.name||""===r.name)throw"api-field element does not have a valid name attribute";return e}}}),angular.module("bit.directives").directive("apiForm",["$rootScope","validationService",function(e,t){function r(e,r,o){o&&o.then&&(e.$errors=null,e.$loading=!0,o.then(function(t){e.$loading=!1},function(o){e.$loading=!1,t.addErrors(e,o),r.$broadcast("show-errors-check-validity")}))}return{require:"form",restrict:"A",link:function(e,t,o,n){var a=o.apiForm||null;void 0!==a&&e.$watch(a,r.bind(null,n,e))}}}]),angular.module("bit.directives").directive("masterPassword",["cryptoService","authService",function(e,t){return{require:"ngModel",restrict:"A",link:function(r,o,n,a){var s=t.getUserProfile();s&&(a.$parsers.unshift(function(t){if(t){var r=e.makeKey(t,s.email,!0),o=r===e.getKey(!0);return a.$setValidity("masterPassword",o),o?t:void 0}}),a.$formatters.unshift(function(t){if(t){var r=e.makeKey(t,s.email,!0),o=r===e.getKey(!0);return a.$setValidity("masterPassword",o),t}}))}}}]),angular.module("bit.directives").directive("pageTitle",["$rootScope","$timeout","appSettings",function(e,t,r){return{link:function(r,o){var n=function(e,r,n,a,s){var i="bitwarden Password Manager";r.data&&r.data.pageTitle&&(i=r.data.pageTitle+" - bitwarden Password Manager"),t(function(){o.text(i)})};e.$on("$stateChangeStart",n)}}}]),angular.module("bit.directives").directive("passwordMeter",function(){return{template:'
',restrict:"A",scope:{password:"=passwordMeter",username:"=passwordMeterUsername",outerClass:"@?"},link:function(e){var t=function(e,t){if(!t||t===e)return 0;var r=t.length;return e&&""!==e&&(-1!==e.indexOf(t)&&(r-=15),-1!==t.indexOf(e)&&(r-=e.length)),t.length>0&&t.length<=4?r+=t.length:t.length>=5&&t.length<=7?r+=6:t.length>=8&&t.length<=15?r+=12:t.length>=16&&(r+=18),t.match(/[a-z]/)&&(r+=1),t.match(/[A-Z]/)&&(r+=5),t.match(/\d/)&&(r+=5),t.match(/.*\d.*\d.*\d/)&&(r+=5),t.match(/[!,@,#,$,%,^,&,*,?,_,~]/)&&(r+=5),t.match(/.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~]/)&&(r+=5),t.match(/(?=.*[a-z])(?=.*[A-Z])/)&&(r+=2),t.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/)&&(r+=2),t.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!,@,#,$,%,^,&,*,?,_,~])/)&&(r+=2),r=Math.round(2*r),Math.max(0,Math.min(100,r))},r=function(e){switch(Math.round(e/33)){case 0:case 1:return"danger";case 2:return"warning";case 3:return"success"}},o=function(e){e.value=t(e.username,e.password),e.valueClass=r(e.value)};e.$watch("password",function(){o(e)}),e.$watch("username",function(){o(e)})}}}),angular.module("bit.directives").directive("passwordViewer",function(){return{restrict:"A",link:function(e,t,r){var o=r.passwordViewer;o&&(t.onclick=function(e){},t.on("click",function(e){var r=$(o);r&&"password"===r.attr("type")?(t.removeClass("fa-eye").addClass("fa-eye-slash"),r.attr("type","text")):r&&"text"===r.attr("type")&&(t.removeClass("fa-eye-slash").addClass("fa-eye"),r.attr("type","password"))}))}}}),angular.module("bit.global").controller("mainController",["$scope","$state","authService","appSettings","toastr",function(e,t,r,o,n){var a=this;a.bodyClass="",a.userProfile=null,a.searchVaultText=null,a.version=o.version,e.currentYear=(new Date).getFullYear(),e.$on("$viewContentLoaded",function(){$.AdminLTE&&($.AdminLTE.layout&&($.AdminLTE.layout.fix(),$.AdminLTE.layout.fixSidebar()),$.AdminLTE.pushMenu&&$.AdminLTE.pushMenu.expandOnHover())}),e.$on("$stateChangeSuccess",function(e,t,o,n,s){return a.searchVaultText=null,a.userProfile=r.getUserProfile(),t.data.bodyClass?void(a.bodyClass=t.data.bodyClass):void(a.bodyClass="")}),e.searchVault=function(){t.go("backend.vault")},e.addSite=function(){e.$broadcast("vaultAddSite")},e.addFolder=function(){e.$broadcast("vaultAddFolder")},e.changeEmail=function(){e.$broadcast("settingsChangeEmail")},e.changePassword=function(){e.$broadcast("settingsChangePassword")},e.sessions=function(){e.$broadcast("settingsSessions")},e["delete"]=function(){e.$broadcast("settingsDelete")},e.twoFactor=function(){e.$broadcast("settingsTwoFactor")},e["import"]=function(){e.$broadcast("toolsImport")},e["export"]=function(){e.$broadcast("toolsExport")},e.audits=function(){e.$broadcast("toolsAudits")}}]),angular.module("bit.global").controller("sideNavController",["$scope","$state",function(e,t){e.$state=t}]),angular.module("bit.global").controller("topNavController",["$scope",function(e){}]),angular.module("bit.services").factory("apiService",["$resource","tokenService","appSettings",function(e,t,r){var o={},n=r.apiUri;return o.sites=e(n+"/sites/:id",{},{get:{method:"GET",params:{id:"@id"}},list:{method:"GET",params:{}},post:{method:"POST",params:{}},put:{method:"POST",params:{id:"@id"}},del:{url:n+"/sites/:id/delete",method:"POST",params:{id:"@id"}}}),o.folders=e(n+"/folders/:id",{},{get:{method:"GET",params:{id:"@id"}},list:{method:"GET",params:{}},post:{method:"POST",params:{}},put:{method:"POST",params:{id:"@id"}},del:{url:n+"/folders/:id/delete",method:"POST",params:{id:"@id"}}}),o.ciphers=e(n+"/ciphers/:id",{},{get:{method:"GET",params:{id:"@id"}},list:{method:"GET",params:{}},"import":{url:n+"/ciphers/import",method:"POST",params:{}},favorite:{url:n+"/ciphers/:id/favorite",method:"POST",params:{id:"@id"}},del:{url:n+"/ciphers/:id/delete",method:"POST",params:{id:"@id"}}}),o.accounts=e(n+"/accounts",{},{register:{url:n+"/accounts/register",method:"POST",params:{}},emailToken:{url:n+"/accounts/email-token",method:"POST",params:{}},email:{url:n+"/accounts/email",method:"POST",params:{}},putPassword:{url:n+"/accounts/password",method:"POST",params:{}},getProfile:{url:n+"/accounts/profile",method:"GET",params:{}},putProfile:{url:n+"/accounts/profile",method:"POST",params:{}},getTwoFactor:{url:n+"/accounts/two-factor",method:"GET",params:{}},putTwoFactor:{url:n+"/accounts/two-factor",method:"POST",params:{}},postTwoFactorRecover:{url:n+"/accounts/two-factor-recover",method:"POST",params:{}},postPasswordHint:{url:n+"/accounts/password-hint",method:"POST",params:{}},putSecurityStamp:{url:n+"/accounts/security-stamp",method:"POST",params:{}},"import":{url:n+"/accounts/import",method:"POST",params:{}},postDelete:{url:n+"/accounts/delete",method:"POST",params:{}}}),o.auth=e(n+"/auth",{},{token:{url:n+"/auth/token",method:"POST",params:{}},tokenTwoFactor:{url:n+"/auth/token/two-factor",method:"POST",params:{}}}),o}]),angular.module("bit.services").factory("authService",["cryptoService","apiService","tokenService","$q","jwtHelper",function(e,t,r,o,n){function a(e){i.extended={name:e.Name,twoFactorEnabled:e.TwoFactorEnabled,culture:e.Culture}}var s={},i=null;return s.logIn=function(n,a){n=n.toLowerCase();var i=e.makeKey(a,n),l={email:n,masterPasswordHash:e.hashPassword(a,i)},c=o.defer();return t.auth.token(l,function(t){t&&t.Token&&(r.setToken(t.Token),e.setKey(i),s.setUserProfile(t.Profile),c.resolve(t))},function(e){c.reject(e)}),c.promise},s.logInTwoFactor=function(e,n){var a={code:e.replace(" ",""),provider:n},i=o.defer();return t.auth.tokenTwoFactor(a,function(e){e&&e.Token&&(r.setToken(e.Token),s.setUserProfile(e.Profile),i.resolve(e))},function(e){i.reject(e)}),i.promise},s.logOut=function(){r.clearToken(),e.clearKey(),i=null},s.getUserProfile=function(){return i||s.setUserProfile(),i},s.setUserProfile=function(e){var o=r.getToken();if(o){var s=n.decodeToken(o),l="TwoFactor"===s.authmethod;i={id:s.nameid,email:s.email,twoFactor:l},!l&&e?a(e):l||e||t.accounts.getProfile({},a)}},s.isAuthenticated=function(){return null!==s.getUserProfile()&&!s.getUserProfile().twoFactor},s.isTwoFactorAuthenticated=function(){return null!==s.getUserProfile()&&s.getUserProfile().twoFactor},s}]),angular.module("bit.services").factory("cipherService",["cryptoService","apiService",function(e,t){var r={};return r.decryptSites=function(e){if(!e)throw"encryptedSites is undefined or null";for(var t=[],o=0;o1e3?e.substring(0,1e3):e}function t(e){if(e.errors&&e.errors.length)for(var t=0;tt.length/2?n("CSV data is not formatted correctly from LastPass. Please check your import file and try again."):o(r,a,s)}if("text/html"===r.type){var s=new FileReader;s.readAsText(r,"utf-8"),s.onload=function(e){var t,r,o=$(e.target.result),s=o.find("pre");if(1===s.length)t=s.text().trim(),r=Papa.parse(t,{header:!0,encoding:"UTF-8"}),a(r.data);else{for(var i=!1,l=0;l label");if(m.length)for(l=0;l card");if(g.length)for(l=0;l field");for(c=0;c label_id"),m.length){var P=$(m[0]).text(),k=i[P];null!==P&&""!==P&&null!==k&&s.push({key:a.length-1,value:k})}}}r(n,a,s)}else o()},u.onerror=function(e){o()}}function s(r,o,n){Papa.parse(r,{encoding:"UTF-8",complete:function(r){t(r);var n=[],a=[],s=[],i=[],l=0,c=0;for(l=0;l "),c+=t.find("> Name").text(),a.push({name:c}));var u=t.find("> Entry");if(u.length)for(var d=0;d String"),v=0;v Key").text(),b=h.find("> Value").text();if(""!==b)switch(w){case"URL":f.uri=e(b);break;case"UserName":f.username=b;break;case"Password":f.password=b;break;case"Title":f.name=b;break;case"Notes":f.notes=null===f.notes?b+"\n":f.notes+b+"\n";break;default:f.notes=null===f.notes?w+": "+b+"\n":f.notes+w+": "+b+"\n"}}null===f.name&&(f.name="--"),s.push(f),r||i.push({key:m,value:l})}var y=t.find("> Group");if(y.length)for(var S=0;S Group");u.length&&(n($(u[0]),!0,""),r(a,s,i))}else o()},l.onerror=function(e){o()}}function l(t,r,o){var n=[],a=[],s=[],i=0,l=0,c=new FileReader;c.readAsText(t,"utf-8"),c.onload=function(t){var o=t.target.result,c=o.split(/(?:\r\n|\r|\n)/);for(i=0;i=6){var o=n.length,i=a.length,l=t[0]&&""!==t[0],c=l,u=0;if(l)for(u=0;u6)for(null===d.notes?d.notes="":d.notes+="\n",u=6;u record");if(d.length)for(var p=0;p Account-Name"),g=f.length?$(f):null,v=m.find("> User-Id"),h=v.length?$(v):null,w=m.find("> Password"),b=w.length?$(w):null,y=m.find("> URL"),S=y.length?$(y):null,P=m.find("> Notes"),k=P.length?$(P):null,T=m.find("> Category"),C=T.length?$(T):null,F=C?C.text():null,E=n.length,x=a.length,M=F&&""!==F&&"Unfiled"!==F,U=M;if(M)for(i=0;i=i;i++)L+="> Attribute-"+i,10>i&&(L+=", ");var I=m.find(L);if(I.length)for(i=0;i53)throw new Exception("We cannot generate numbers larger than 53 bits.");var s=Math.ceil(a/8),i=Math.pow(2,a)-1,l=new Uint8Array(s);window.crypto.getRandomValues(l);for(var c=8*(s-1),u=0;s>u;u++)o+=l[u]*Math.pow(2,c),c-=8;return o&=i,o>=n?e(t,r):t+o}var t={};return t.generatePassword=function(t){var r={length:10,ambiguous:!1,number:!0,minNumber:1,uppercase:!0,minUppercase:1,lowercase:!0,minLowercase:1,special:!1,minSpecial:1},o=angular.extend({},r,t);o.uppercase&&o.minUppercase<0&&(o.minUppercase=1),o.lowercase&&o.minLowercase<0&&(o.minLowercase=1),o.number&&o.minNumber<0&&(o.minNumber=1),o.special&&o.minSpecial<0&&(o.minSpecial=1),(!o.length||o.length<1)&&(o.length=10);var n=o.minUppercase+o.minLowercase+o.minNumber+o.minSpecial;o.length0)for(var s=0;s0)for(var i=0;i0)for(var l=0;l0)for(var c=0;c=t?e:new Array(t-e.length+1).join(r)+e}l.eventTrack("toolsExportController",{category:"Modal"}),e["export"]=function(r){e.startedExport=!0,t.sites.list({expand:["folder"]},function(t){try{for(var r=a.decryptSites(t.Data),o=[],n=0;n0&&(r[0].folderId=t.data.folderId,r[0].name=t.data.name,r[0].username=t.data.username,r[0].favorite=t.data.favorite)}else if("delete"===t.action){var n=o("filter")(e.sites,{id:t.data},!0);if(n&&n.length>0){var a=e.sites.indexOf(n[0]);a>-1&&e.sites.splice(a,1)}}})},e.$on("vaultAddSite",function(t,r){e.addSite()}),e.addSite=function(r){var o=t.open({animation:!0,templateUrl:"app/vault/views/vaultAddSite.html",controller:"vaultAddSiteController",resolve:{folders:function(){return e.folders},selectedFolder:function(){return r}}});o.result.then(function(t){e.sites.push(t)})},e.deleteSite=function(t){confirm("Are you sure you want to delete this site ("+t.name+")?")&&r.sites.del({id:t.id},function(){var r=e.sites.indexOf(t);r>-1&&e.sites.splice(r,1)})},e.editFolder=function(r){var n=t.open({animation:!0,templateUrl:"app/vault/views/vaultEditFolder.html",controller:"vaultEditFolderController",size:"sm",resolve:{folderId:function(){return r.id}}});n.result.then(function(t){var r=o("filter")(e.folders,{id:t.id},!0);r&&r.length>0&&(r[0].name=t.name)})},e.$on("vaultAddFolder",function(t,r){e.addFolder()}),e.addFolder=function(){var r=t.open({animation:!0,templateUrl:"app/vault/views/vaultAddFolder.html",controller:"vaultAddFolderController",size:"sm"});r.result.then(function(t){e.folders.push(t)})},e.deleteFolder=function(t){confirm("Are you sure you want to delete this folder ("+t.name+")?")&&r.folders.del({id:t.id},function(){var r=e.folders.indexOf(t);r>-1&&e.folders.splice(r,1)})},e.canDeleteFolder=function(t){if(!t||!t.id)return!1;var r=o("filter")(e.sites,{folderId:t.id});return 0===r.length}}]),angular.module("bit.vault").controller("vaultEditFolderController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","folderId","$analytics",function(e,t,r,o,n,a,s){s.eventTrack("vaultEditFolderController",{category:"Modal"}),e.folder={},t.folders.get({id:a},function(t){e.folder=n.decryptFolder(t)}),e.savePromise=null,e.save=function(o){var i=n.encryptFolder(o);e.savePromise=t.folders.put({id:a},i,function(e){s.eventTrack("Edited Folder");var t=n.decryptFolder(e);r.close(t)}).$promise},e.close=function(){r.dismiss("cancel")}}]),angular.module("bit.vault").controller("vaultEditSiteController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","passwordService","siteId","folders","$analytics",function(e,t,r,o,n,a,s,i,l){function c(e){var t=$(e.trigger).parent().prev();"text"===t.attr("type")&&t.select()}l.eventTrack("vaultEditSiteController",{category:"Modal"}),e.folders=i,e.site={},t.sites.get({id:s},function(t){e.site=n.decryptSite(t)}),e.save=function(o){var a=n.encryptSite(o);e.savePromise=t.sites.put({id:s},a,function(e){l.eventTrack("Edited Site");var t=n.decryptSite(e);r.close({action:"edit",data:t})}).$promise},e.generatePassword=function(){e.site.password&&!confirm("Are you sure you want to overwrite the current password?")||(l.eventTrack("Generated Password From Edit"),e.site.password=a.generatePassword({length:10,special:!0}))},e.clipboardSuccess=function(e){e.clearSelection(),c(e)},e.clipboardError=function(e,t){t&&c(e),alert("Your web browser does not support easy clipboard copying. Copy it manually instead.")},e.folderSort=function(e){return e.name.toLowerCase()},e["delete"]=function(){confirm("Are you sure you want to delete this site ("+e.site.name+")?")&&t.sites.del({id:e.site.id},function(){r.close({action:"delete",data:e.site.id})})},e.close=function(){r.dismiss("cancel")}}]);