Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/passman.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpassman-bot <info@passman.cc>2019-07-08 23:36:03 +0300
committerpassman-bot <info@passman.cc>2019-07-08 23:36:03 +0300
commit966e0b20916eb2e890675e5edcef276f0506e8b3 (patch)
treeebd1c9b36044e34a6fff878a93f27faf563f9339
parent8acb7c4be0e929d0523e934b5b8711142d6786ab (diff)
Passman 2.3.22.3.2
Bump passman version to 2.3.2 Signed-off-by: passman-bot <info@passman.cc>
-rw-r--r--appinfo/info.xml2
-rw-r--r--controller/translationcontroller.php4
-rw-r--r--js/passman.min.js12
-rw-r--r--l10n/ca.js12
-rw-r--r--l10n/ca.json12
-rw-r--r--l10n/cs.js2
-rw-r--r--l10n/cs.json2
-rw-r--r--l10n/de.js4
-rw-r--r--l10n/de.json4
-rw-r--r--l10n/de_DE.js4
-rw-r--r--l10n/de_DE.json4
-rw-r--r--l10n/es.js1
-rw-r--r--l10n/es.json1
-rw-r--r--l10n/fr.js13
-rw-r--r--l10n/fr.json13
-rw-r--r--l10n/gl.js6
-rw-r--r--l10n/gl.json6
-rw-r--r--l10n/is.js11
-rw-r--r--l10n/is.json11
-rw-r--r--l10n/it.js2
-rw-r--r--l10n/it.json2
-rw-r--r--l10n/lt_LT.js8
-rw-r--r--l10n/lt_LT.json8
-rw-r--r--l10n/lv.js1
-rw-r--r--l10n/lv.json1
-rw-r--r--l10n/nl.js12
-rw-r--r--l10n/nl.json12
-rw-r--r--l10n/pl.js12
-rw-r--r--l10n/pl.json12
-rw-r--r--l10n/pt_BR.js2
-rw-r--r--l10n/pt_BR.json2
-rw-r--r--l10n/sr.js12
-rw-r--r--l10n/sr.json12
-rw-r--r--l10n/tr.js2
-rw-r--r--l10n/tr.json2
-rw-r--r--l10n/zh_CN.js2
-rw-r--r--l10n/zh_CN.json2
37 files changed, 185 insertions, 45 deletions
diff --git a/appinfo/info.xml b/appinfo/info.xml
index 48493b51..ebacc615 100644
--- a/appinfo/info.xml
+++ b/appinfo/info.xml
@@ -19,7 +19,7 @@ Features:
- Import from various password managers (KeePass, LastPass, DashLane, ZOHO, Clipperz.is )
For an demo of this app visit [https://demo.passman.cc](https://demo.passman.cc)
]]></description>
- <version>2.3.1</version>
+ <version>2.3.2</version>
<licence>agpl</licence>
<author homepage="https://github.com/brantje">Sander Brand</author>
<author homepage="https://github.com/animalillo">Marcos Zuriaga</author>
diff --git a/controller/translationcontroller.php b/controller/translationcontroller.php
index a5deb2e6..16aa7a0d 100644
--- a/controller/translationcontroller.php
+++ b/controller/translationcontroller.php
@@ -145,7 +145,7 @@ class TranslationController extends ApiController {
'use.icon' => $this->trans->t('Use this icon'),
'use.icon.delete' => $this->trans->t('Delete current icon'),
'use.icon.refresh' => $this->trans->t('Get icon from page'),
- 'use.icon.refresh.trying' => $this->trans->t('This may take a few seconds...'),
+ 'use.icon.refresh.trying' => $this->trans->t('This may take a few seconds…'),
'use.icon.refresh.error' => $this->trans->t('There was an error fetching the icon!'),
'selected.icon' => $this->trans->t('Selected icon'),
@@ -427,7 +427,7 @@ class TranslationController extends ApiController {
//compromised credentials
'compromised.label' => $this->trans->t('Compromise!'),
'compromised.warning.list' => $this->trans->t('Compromised!'),
- 'compromised.warning' => $this->trans->t('This password is compromised. You can only remove this warning with changing the password.'),
+ 'compromised.warning' => $this->trans->t('This password is compromised. You can only remove this warning by changing the password.'),
//searchboxexpanderservice
'search.settings.input.label' => $this->trans->t('Label'),
diff --git a/js/passman.min.js b/js/passman.min.js
index ab249c66..de114678 100644
--- a/js/passman.min.js
+++ b/js/passman.min.js
@@ -1,4 +1,4 @@
-/*! Passman 2019-05-20 */
+/*! Passman 2019-07-08 */
function _a1(b,a){this.count=b,this._fc=a,this.__defineGetter__("Count",function(){return this.count}),this.__defineGetter__("_dm",function(){return this._fc})}function _a2(a,c,b){this._bm=a,b?this._do=new Array(c,b):this._do=new Array(c),this.__defineGetter__("_bo",function(){return this._bm}),this.__defineGetter__("_dn",function(){return this._bm*this._fo}),this.__defineGetter__("_fo",function(){for(var e=0,d=0;d<this._do.length;d++)e+=this._do[d].length;return e}),this._fb=function(){return this._do}}function _a3(k,l,h,g,f,e){this._bs=k,this._ar=l,this._do=new Array(h,g,f,e);for(var j=0,b=h._bo,a=h._fb(),d=0;d<a.length;d++){var c=a[d];j+=c.Count*(c._dm+b)}this._br=j,this.__defineGetter__("_fd",function(){return this._bs}),this.__defineGetter__("_as",function(){return this._ar}),this.__defineGetter__("_dp",function(){return this._br}),this.__defineGetter__("_cr",function(){return 17+4*this._bs}),this._aq=function(){var r=this._cr,o=new _ac(r);o._bq(0,0,9,9),o._bq(r-8,0,8,9),o._bq(0,r-8,9,8);for(var n=this._ar.length,m=0;m<n;m++)for(var q=this._ar[m]-2,s=0;s<n;s++)0==m&&(0==s||s==n-1)||m==n-1&&0==s||o._bq(this._ar[s]-2,q,5,5);return o._bq(6,9,1,r-17),o._bq(9,6,r-17,1),this._bs>6&&(o._bq(r-11,0,3,6),o._bq(0,r-11,6,3)),o},this._bu=function(i){return this._do[i.ordinal()]}}function _ay(){return new Array(new _a3(1,new Array,new _a2(7,new _a1(1,19)),new _a2(10,new _a1(1,16)),new _a2(13,new _a1(1,13)),new _a2(17,new _a1(1,9))),new _a3(2,new Array(6,18),new _a2(10,new _a1(1,34)),new _a2(16,new _a1(1,28)),new _a2(22,new _a1(1,22)),new _a2(28,new _a1(1,16))),new _a3(3,new Array(6,22),new _a2(15,new _a1(1,55)),new _a2(26,new _a1(1,44)),new _a2(18,new _a1(2,17)),new _a2(22,new _a1(2,13))),new _a3(4,new Array(6,26),new _a2(20,new _a1(1,80)),new _a2(18,new _a1(2,32)),new _a2(26,new _a1(2,24)),new _a2(16,new _a1(4,9))),new _a3(5,new Array(6,30),new _a2(26,new _a1(1,108)),new _a2(24,new _a1(2,43)),new _a2(18,new _a1(2,15),new _a1(2,16)),new _a2(22,new _a1(2,11),new _a1(2,12))),new _a3(6,new Array(6,34),new _a2(18,new _a1(2,68)),new _a2(16,new _a1(4,27)),new _a2(24,new _a1(4,19)),new _a2(28,new _a1(4,15))),new _a3(7,new Array(6,22,38),new _a2(20,new _a1(2,78)),new _a2(18,new _a1(4,31)),new _a2(18,new _a1(2,14),new _a1(4,15)),new _a2(26,new _a1(4,13),new _a1(1,14))),new _a3(8,new Array(6,24,42),new _a2(24,new _a1(2,97)),new _a2(22,new _a1(2,38),new _a1(2,39)),new _a2(22,new _a1(4,18),new _a1(2,19)),new _a2(26,new _a1(4,14),new _a1(2,15))),new _a3(9,new Array(6,26,46),new _a2(30,new _a1(2,116)),new _a2(22,new _a1(3,36),new _a1(2,37)),new _a2(20,new _a1(4,16),new _a1(4,17)),new _a2(24,new _a1(4,12),new _a1(4,13))),new _a3(10,new Array(6,28,50),new _a2(18,new _a1(2,68),new _a1(2,69)),new _a2(26,new _a1(4,43),new _a1(1,44)),new _a2(24,new _a1(6,19),new _a1(2,20)),new _a2(28,new _a1(6,15),new _a1(2,16))),new _a3(11,new Array(6,30,54),new _a2(20,new _a1(4,81)),new _a2(30,new _a1(1,50),new _a1(4,51)),new _a2(28,new _a1(4,22),new _a1(4,23)),new _a2(24,new _a1(3,12),new _a1(8,13))),new _a3(12,new Array(6,32,58),new _a2(24,new _a1(2,92),new _a1(2,93)),new _a2(22,new _a1(6,36),new _a1(2,37)),new _a2(26,new _a1(4,20),new _a1(6,21)),new _a2(28,new _a1(7,14),new _a1(4,15))),new _a3(13,new Array(6,34,62),new _a2(26,new _a1(4,107)),new _a2(22,new _a1(8,37),new _a1(1,38)),new _a2(24,new _a1(8,20),new _a1(4,21)),new _a2(22,new _a1(12,11),new _a1(4,12))),new _a3(14,new Array(6,26,46,66),new _a2(30,new _a1(3,115),new _a1(1,116)),new _a2(24,new _a1(4,40),new _a1(5,41)),new _a2(20,new _a1(11,16),new _a1(5,17)),new _a2(24,new _a1(11,12),new _a1(5,13))),new _a3(15,new Array(6,26,48,70),new _a2(22,new _a1(5,87),new _a1(1,88)),new _a2(24,new _a1(5,41),new _a1(5,42)),new _a2(30,new _a1(5,24),new _a1(7,25)),new _a2(24,new _a1(11,12),new _a1(7,13))),new _a3(16,new Array(6,26,50,74),new _a2(24,new _a1(5,98),new _a1(1,99)),new _a2(28,new _a1(7,45),new _a1(3,46)),new _a2(24,new _a1(15,19),new _a1(2,20)),new _a2(30,new _a1(3,15),new _a1(13,16))),new _a3(17,new Array(6,30,54,78),new _a2(28,new _a1(1,107),new _a1(5,108)),new _a2(28,new _a1(10,46),new _a1(1,47)),new _a2(28,new _a1(1,22),new _a1(15,23)),new _a2(28,new _a1(2,14),new _a1(17,15))),new _a3(18,new Array(6,30,56,82),new _a2(30,new _a1(5,120),new _a1(1,121)),new _a2(26,new _a1(9,43),new _a1(4,44)),new _a2(28,new _a1(17,22),new _a1(1,23)),new _a2(28,new _a1(2,14),new _a1(19,15))),new _a3(19,new Array(6,30,58,86),new _a2(28,new _a1(3,113),new _a1(4,114)),new _a2(26,new _a1(3,44),new _a1(11,45)),new _a2(26,new _a1(17,21),new _a1(4,22)),new _a2(26,new _a1(9,13),new _a1(16,14))),new _a3(20,new Array(6,34,62,90),new _a2(28,new _a1(3,107),new _a1(5,108)),new _a2(26,new _a1(3,41),new _a1(13,42)),new _a2(30,new _a1(15,24),new _a1(5,25)),new _a2(28,new _a1(15,15),new _a1(10,16))),new _a3(21,new Array(6,28,50,72,94),new _a2(28,new _a1(4,116),new _a1(4,117)),new _a2(26,new _a1(17,42)),new _a2(28,new _a1(17,22),new _a1(6,23)),new _a2(30,new _a1(19,16),new _a1(6,17))),new _a3(22,new Array(6,26,50,74,98),new _a2(28,new _a1(2,111),new _a1(7,112)),new _a2(28,new _a1(17,46)),new _a2(30,new _a1(7,24),new _a1(16,25)),new _a2(24,new _a1(34,13))),new _a3(23,new Array(6,30,54,74,102),new _a2(30,new _a1(4,121),new _a1(5,122)),new _a2(28,new _a1(4,47),new _a1(14,48)),new _a2(30,new _a1(11,24),new _a1(14,25)),new _a2(30,new _a1(16,15),new _a1(14,16))),new _a3(24,new Array(6,28,54,80,106),new _a2(30,new _a1(6,117),new _a1(4,118)),new _a2(28,new _a1(6,45),new _a1(14,46)),new _a2(30,new _a1(11,24),new _a1(16,25)),new _a2(30,new _a1(30,16),new _a1(2,17))),new _a3(25,new Array(6,32,58,84,110),new _a2(26,new _a1(8,106),new _a1(4,107)),new _a2(28,new _a1(8,47),new _a1(13,48)),new _a2(30,new _a1(7,24),new _a1(22,25)),new _a2(30,new _a1(22,15),new _a1(13,16))),new _a3(26,new Array(6,30,58,86,114),new _a2(28,new _a1(10,114),new _a1(2,115)),new _a2(28,new _a1(19,46),new _a1(4,47)),new _a2(28,new _a1(28,22),new _a1(6,23)),new _a2(30,new _a1(33,16),new _a1(4,17))),new _a3(27,new Array(6,34,62,90,118),new _a2(30,new _a1(8,122),new _a1(4,123)),new _a2(28,new _a1(22,45),new _a1(3,46)),new _a2(30,new _a1(8,23),new _a1(26,24)),new _a2(30,new _a1(12,15),new _a1(28,16))),new _a3(28,new Array(6,26,50,74,98,122),new _a2(30,new _a1(3,117),new _a1(10,118)),new _a2(28,new _a1(3,45),new _a1(23,46)),new _a2(30,new _a1(4,24),new _a1(31,25)),new _a2(30,new _a1(11,15),new _a1(31,16))),new _a3(29,new Array(6,30,54,78,102,126),new _a2(30,new _a1(7,116),new _a1(7,117)),new _a2(28,new _a1(21,45),new _a1(7,46)),new _a2(30,new _a1(1,23),new _a1(37,24)),new _a2(30,new _a1(19,15),new _a1(26,16))),new _a3(30,new Array(6,26,52,78,104,130),new _a2(30,new _a1(5,115),new _a1(10,116)),new _a2(28,new _a1(19,47),new _a1(10,48)),new _a2(30,new _a1(15,24),new _a1(25,25)),new _a2(30,new _a1(23,15),new _a1(25,16))),new _a3(31,new Array(6,30,56,82,108,134),new _a2(30,new _a1(13,115),new _a1(3,116)),new _a2(28,new _a1(2,46),new _a1(29,47)),new _a2(30,new _a1(42,24),new _a1(1,25)),new _a2(30,new _a1(23,15),new _a1(28,16))),new _a3(32,new Array(6,34,60,86,112,138),new _a2(30,new _a1(17,115)),new _a2(28,new _a1(10,46),new _a1(23,47)),new _a2(30,new _a1(10,24),new _a1(35,25)),new _a2(30,new _a1(19,15),new _a1(35,16))),new _a3(33,new Array(6,30,58,86,114,142),new _a2(30,new _a1(17,115),new _a1(1,116)),new _a2(28,new _a1(14,46),new _a1(21,47)),new _a2(30,new _a1(29,24),new _a1(19,25)),new _a2(30,new _a1(11,15),new _a1(46,16))),new _a3(34,new Array(6,34,62,90,118,146),new _a2(30,new _a1(13,115),new _a1(6,116)),new _a2(28,new _a1(14,46),new _a1(23,47)),new _a2(30,new _a1(44,24),new _a1(7,25)),new _a2(30,new _a1(59,16),new _a1(1,17))),new _a3(35,new Array(6,30,54,78,102,126,150),new _a2(30,new _a1(12,121),new _a1(7,122)),new _a2(28,new _a1(12,47),new _a1(26,48)),new _a2(30,new _a1(39,24),new _a1(14,25)),new _a2(30,new _a1(22,15),new _a1(41,16))),new _a3(36,new Array(6,24,50,76,102,128,154),new _a2(30,new _a1(6,121),new _a1(14,122)),new _a2(28,new _a1(6,47),new _a1(34,48)),new _a2(30,new _a1(46,24),new _a1(10,25)),new _a2(30,new _a1(2,15),new _a1(64,16))),new _a3(37,new Array(6,28,54,80,106,132,158),new _a2(30,new _a1(17,122),new _a1(4,123)),new _a2(28,new _a1(29,46),new _a1(14,47)),new _a2(30,new _a1(49,24),new _a1(10,25)),new _a2(30,new _a1(24,15),new _a1(46,16))),new _a3(38,new Array(6,32,58,84,110,136,162),new _a2(30,new _a1(4,122),new _a1(18,123)),new _a2(28,new _a1(13,46),new _a1(32,47)),new _a2(30,new _a1(48,24),new _a1(14,25)),new _a2(30,new _a1(42,15),new _a1(32,16))),new _a3(39,new Array(6,26,54,82,110,138,166),new _a2(30,new _a1(20,117),new _a1(4,118)),new _a2(28,new _a1(40,47),new _a1(7,48)),new _a2(30,new _a1(43,24),new _a1(22,25)),new _a2(30,new _a1(10,15),new _a1(67,16))),new _a3(40,new Array(6,30,58,86,114,142,170),new _a2(30,new _a1(19,118),new _a1(6,119)),new _a2(28,new _a1(18,47),new _a1(31,48)),new _a2(30,new _a1(34,24),new _a1(34,25)),new _a2(30,new _a1(20,15),new _a1(61,16))))}function _ae(i,f,c,h,e,b,g,d,a){this.a11=i,this.a12=h,this.a13=g,this.a21=f,this.a22=e,this.a23=d,this.a31=c,this.a32=b,this.a33=a,this._ad=function(w){for(var t=w.length,A=this.a11,z=this.a12,v=this.a13,r=this.a21,q=this.a22,o=this.a23,m=this.a31,k=this.a32,j=this.a33,n=0;n<t;n+=2){var u=w[n],s=w[n+1],l=v*u+o*s+j;w[n]=(A*u+r*s+m)/l,w[n+1]=(z*u+q*s+k)/l}},this._fp=function(m,k){for(var r=m.length,l=0;l<r;l++){var j=m[l],q=k[l],o=this.a13*j+this.a23*q+this.a33;m[l]=(this.a11*j+this.a21*q+this.a31)/o,k[l]=(this.a12*j+this.a22*q+this.a32)/o}},this._fr=function(){return new _ae(this.a22*this.a33-this.a23*this.a32,this.a23*this.a31-this.a21*this.a33,this.a21*this.a32-this.a22*this.a31,this.a13*this.a32-this.a12*this.a33,this.a11*this.a33-this.a13*this.a31,this.a12*this.a31-this.a11*this.a32,this.a12*this.a23-this.a13*this.a22,this.a13*this.a21-this.a11*this.a23,this.a11*this.a22-this.a12*this.a21)},this.times=function(j){return new _ae(this.a11*j.a11+this.a21*j.a12+this.a31*j.a13,this.a11*j.a21+this.a21*j.a22+this.a31*j.a23,this.a11*j.a31+this.a21*j.a32+this.a31*j.a33,this.a12*j.a11+this.a22*j.a12+this.a32*j.a13,this.a12*j.a21+this.a22*j.a22+this.a32*j.a23,this.a12*j.a31+this.a22*j.a32+this.a32*j.a33,this.a13*j.a11+this.a23*j.a12+this.a33*j.a13,this.a13*j.a21+this.a23*j.a22+this.a33*j.a23,this.a13*j.a31+this.a23*j.a32+this.a33*j.a33)}}function _bg(b,a){this.bits=b,this.points=a}function Detector(a){this.image=a,this._am=null,this._bi=function(m,l,c,b){var d=Math.abs(b-l)>Math.abs(c-m);if(d){var s=m;m=l,l=s,s=c,c=b,b=s}for(var j=Math.abs(c-m),i=Math.abs(b-l),q=-j>>1,v=l<b?1:-1,f=m<c?1:-1,e=0,h=m,g=l;h!=c;h+=f){var u=d?g:h,t=d?h:g;if(1==e?this.image[u+t*qrcode.width]&&e++:this.image[u+t*qrcode.width]||e++,3==e){var o=h-m,n=g-l;return Math.sqrt(o*o+n*n)}if(q+=i,q>0){if(g==b)break;g+=v,q-=j}}var k=c-m,r=b-l;return Math.sqrt(k*k+r*r)},this._bh=function(i,g,h,f){var b=this._bi(i,g,h,f),e=1,d=i-(h-i);d<0?(e=i/(i-d),d=0):d>=qrcode.width&&(e=(qrcode.width-1-i)/(d-i),d=qrcode.width-1);var c=Math.floor(g-(f-g)*e);return e=1,c<0?(e=g/(g-c),c=0):c>=qrcode.height&&(e=(qrcode.height-1-g)/(c-g),c=qrcode.height-1),d=Math.floor(i+(d-i)*e),b+=this._bi(i,g,d,c),b-1},this._bj=function(c,d){var b=this._bh(Math.floor(c.X),Math.floor(c.Y),Math.floor(d.X),Math.floor(d.Y)),e=this._bh(Math.floor(d.X),Math.floor(d.Y),Math.floor(c.X),Math.floor(c.Y));return isNaN(b)?e/7:isNaN(e)?b/7:(b+e)/14},this._bk=function(d,c,b){return(this._bj(d,c)+this._bj(d,b))/2},this.distance=function(c,b){return xDiff=c.X-b.X,yDiff=c.Y-b.Y,Math.sqrt(xDiff*xDiff+yDiff*yDiff)},this._bx=function(g,f,d,e){var b=Math.round(this.distance(g,f)/e),c=Math.round(this.distance(g,d)/e),h=(b+c>>1)+7;switch(3&h){case 0:h++;break;case 2:h--;break;case 3:throw"Error"}return h},this._bl=function(g,f,d,j){var k=Math.floor(j*g),h=Math.max(0,f-k),i=Math.min(qrcode.width-1,f+k);if(i-h<3*g)throw"Error";var b=Math.max(0,d-k),c=Math.min(qrcode.height-1,d+k),e=new _ak(this.image,h,b,i-h,c-b,g,this._am);return e.find()},this.createTransform=function(l,h,k,b,g){var i,f,e,c,j=g-3.5;null!=b?(i=b.X,f=b.Y,e=c=j-3):(i=h.X-l.X+k.X,f=h.Y-l.Y+k.Y,e=c=j);var d=_ae._ag(3.5,3.5,j,3.5,e,c,3.5,j,l.X,l.Y,h.X,h.Y,i,f,k.X,k.Y);return d},this._bz=function(e,b,d){var c=_aa;return c._af(e,d,b)},this._cd=function(r){var j=r._gq,h=r._gs,n=r._gp,d=this._bk(j,h,n);if(d<1)throw"Error";var s=this._bx(j,h,n,d),b=_a3._at(s),k=b._cr-7,l=null;if(b._as.length>0)for(var f=h.X-j.X+n.X,e=h.Y-j.Y+n.Y,c=1-3/k,u=Math.floor(j.X+c*(f-j.X)),t=Math.floor(j.Y+c*(e-j.Y)),q=4;q<=16;q<<=1){l=this._bl(d,u,t,q);break}var o,g=this.createTransform(j,h,n,l,s),m=this._bz(this.image,g,s);return o=null==l?new Array(n,j,h):new Array(n,j,h,l),new _bg(m,o)},this.detect=function(){var b=(new _cc)._ce(this.image);return this._cd(b)}}function _ax(a){this._cf=_cg.forBits(a>>3&3),this._fe=7&a,this.__defineGetter__("_cg",function(){return this._cf}),this.__defineGetter__("_dx",function(){return this._fe}),this.GetHashCode=function(){return this._cf.ordinal()<<3|_fe},this.Equals=function(c){var b=c;return this._cf==b._cf&&this._fe==b._fe}}function _cg(a,c,b){this._ff=a,this.bits=c,this.name=b,this.__defineGetter__("Bits",function(){return this.bits}),this.__defineGetter__("Name",function(){return this.name}),this.ordinal=function(){return this._ff}}function _ac(d,a){if(a||(a=d),d<1||a<1)throw"Both dimensions must be greater than 0";this.width=d,this.height=a;var c=d>>5;0!=(31&d)&&c++,this.rowSize=c,this.bits=new Array(c*a);for(var b=0;b<this.bits.length;b++)this.bits[b]=0;this.__defineGetter__("Width",function(){return this.width}),this.__defineGetter__("Height",function(){return this.height}),this.__defineGetter__("Dimension",function(){if(this.width!=this.height)throw"Can't call getDimension() on a non-square matrix";return this.width}),this._ds=function(e,g){var f=g*this.rowSize+(e>>5);return 0!=(1&_ew(this.bits[f],31&e))},this._dq=function(e,g){var f=g*this.rowSize+(e>>5);this.bits[f]|=1<<(31&e)},this.flip=function(e,g){var f=g*this.rowSize+(e>>5);this.bits[f]^=1<<(31&e)},this.clear=function(){for(var e=this.bits.length,f=0;f<e;f++)this.bits[f]=0},this._bq=function(g,j,f,m){if(j<0||g<0)throw"Left and top must be nonnegative";if(m<1||f<1)throw"Height and width must be at least 1";var l=g+f,e=j+m;if(e>this.height||l>this.width)throw"The region must fit inside the matrix";for(var i=j;i<e;i++)for(var h=i*this.rowSize,k=g;k<l;k++)this.bits[h+(k>>5)]|=1<<(31&k)}}function _dl(a,b){this._dv=a,this._dw=b,this.__defineGetter__("_du",function(){return this._dv}),this.__defineGetter__("Codewords",function(){return this._dw})}function _cl(a){var b=a.Dimension;if(b<21||1!=(3&b))throw"Error _cl";this._au=a,this._cp=null,this._co=null,this._dk=function(d,c,e){return this._au._ds(d,c)?e<<1|1:e<<1},this._cm=function(){if(null!=this._co)return this._co;for(var g=0,e=0;e<6;e++)g=this._dk(e,8,g);g=this._dk(7,8,g),g=this._dk(8,8,g),g=this._dk(8,7,g);for(var c=5;c>=0;c--)g=this._dk(8,c,g);if(this._co=_ax._ci(g),null!=this._co)return this._co;var f=this._au.Dimension;g=0;for(var d=f-8,e=f-1;e>=d;e--)g=this._dk(e,8,g);for(var c=f-7;c<f;c++)g=this._dk(8,c,g);if(this._co=_ax._ci(g),null!=this._co)return this._co;throw"Error _cm"},this._cq=function(){if(null!=this._cp)return this._cp;var h=this._au.Dimension,f=h-17>>2;if(f<=6)return _a3._av(f);for(var g=0,e=h-11,c=5;c>=0;c--)for(var d=h-9;d>=e;d--)g=this._dk(d,c,g);if(this._cp=_a3._aw(g),null!=this._cp&&this._cp._cr==h)return this._cp;g=0;for(var d=5;d>=0;d--)for(var c=h-9;c>=e;c--)g=this._dk(d,c,g);if(this._cp=_a3._aw(g),null!=this._cp&&this._cp._cr==h)return this._cp;throw"Error _cq"},this._gk=function(){var r=this._cm(),o=this._cq(),c=_dx._gl(r._dx),f=this._au.Dimension;c._dj(this._au,f);for(var k=o._aq(),n=!0,s=new Array(o._dp),m=0,q=0,h=0,e=f-1;e>0;e-=2){6==e&&e--;for(var l=0;l<f;l++)for(var g=n?f-1-l:l,d=0;d<2;d++)k._ds(e-d,g)||(h++,q<<=1,this._au._ds(e-d,g)&&(q|=1),8==h&&(s[m++]=q,h=0,q=0));n^=!0}if(m!=o._dp)throw"Error _gk";return s}}function _fg(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(b,a){return 0==(b+a&1)}}function _fh(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(b,a){return 0==(1&b)}}function _fi(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(b,a){return a%3==0}}function _fj(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(b,a){return(b+a)%3==0}}function _fk(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(b,a){return 0==(_ew(b,1)+a/3&1)}}function _fl(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(c,b){var a=c*b;return(1&a)+a%3==0}}function _fm(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(c,b){var a=c*b;return 0==((1&a)+a%3&1)}}function _fn(){this._dj=function(c,d){for(var b=0;b<d;b++)for(var a=0;a<d;a++)this._fw(b,a)&&c.flip(a,b)},this._fw=function(b,a){return 0==((b+a&1)+b*a%3&1)}}function _db(_fa){this._fa=_fa,this.decode=function(received,_fv){for(var poly=new _bp(this._fa,received),_dh=new Array(_fv),i=0;i<_dh.length;i++)_dh[i]=0;for(var _fq=!1,noError=!0,i=0;i<_fv;i++){var eval=poly.evaluateAt(this._fa.exp(_fq?i+1:i));_dh[_dh.length-1-i]=eval,0!=eval&&(noError=!1)}if(!noError)for(var _fu=new _bp(this._fa,_dh),_dg=this._eb(this._fa._ba(_fv,1),_fu,_fv),sigma=_dg[0],omega=_dg[1],_dz=this._ey(sigma),_ea=this._di(omega,_dz,_fq),i=0;i<_dz.length;i++){var position=received.length-1-this._fa.log(_dz[i]);if(position<0)throw"ReedSolomonException Bad error location";received[position]=_az._bd(received[position],_ea[i])}},this._eb=function(a,b,R){if(a._ec<b._ec){var temp=a;a=b,b=temp}for(var rLast=a,r=b,sLast=this._fa.One,s=this._fa.Zero,tLast=this._fa.Zero,t=this._fa.One;r._ec>=Math.floor(R/2);){var rLastLast=rLast,_ga=sLast,_gb=tLast;if(rLast=r,sLast=s,tLast=t,rLast.Zero)throw"r_{i-1} was zero";r=rLastLast;for(var q=this._fa.Zero,_df=rLast._ex(rLast._ec),_fy=this._fa.inverse(_df);r._ec>=rLast._ec&&!r.Zero;){var _fx=r._ec-rLast._ec,scale=this._fa.multiply(r._ex(r._ec),_fy);q=q._bd(this._fa._ba(_fx,scale)),r=r._bd(rLast._dc(_fx,scale))}s=q.multiply1(sLast)._bd(_ga),t=q.multiply1(tLast)._bd(_gb)}var _de=t._ex(0);if(0==_de)throw"ReedSolomonException sigmaTilde(0) was zero";var inverse=this._fa.inverse(_de),sigma=t.multiply2(inverse),omega=r.multiply2(inverse);return new Array(sigma,omega)},this._ey=function(_ez){var _fz=_ez._ec;if(1==_fz)return new Array(_ez._ex(1));for(var result=new Array(_fz),e=0,i=1;i<256&&e<_fz;i++)0==_ez.evaluateAt(i)&&(result[e]=this._fa.inverse(i),e++);if(e!=_fz)throw"Error locator degree does not match number of roots";return result},this._di=function(_fs,_dz,_fq){for(var s=_dz.length,result=new Array(s),i=0;i<s;i++){for(var _gc=this._fa.inverse(_dz[i]),_dr=1,j=0;j<s;j++)i!=j&&(_dr=this._fa.multiply(_dr,_az._bd(1,this._fa.multiply(_dz[j],_gc))));result[i]=this._fa.multiply(_fs.evaluateAt(_gc),this._fa.inverse(_dr)),_fq&&(result[i]=this._fa.multiply(result[i],_gc))}return result}}function _bp(f,e){if(null==e||0==e.length)throw"bad arguments";this._fa=f;var c=e.length;if(c>1&&0==e[0]){for(var d=1;d<c&&0==e[d];)d++;if(d==c)this._dd=f.Zero._dd;else{this._dd=new Array(c-d);for(var b=0;b<this._dd.length;b++)this._dd[b]=0;for(var a=0;a<this._dd.length;a++)this._dd[a]=e[d+a]}}else this._dd=e;this.__defineGetter__("Zero",function(){return 0==this._dd[0]}),this.__defineGetter__("_ec",function(){return this._dd.length-1}),this.__defineGetter__("Coefficients",function(){return this._dd}),this._ex=function(g){return this._dd[this._dd.length-1-g]},this.evaluateAt=function(h){if(0==h)return this._ex(0);var l=this._dd.length;if(1==h){for(var g=0,k=0;k<l;k++)g=_az._bd(g,this._dd[k]);return g}for(var j=this._dd[0],k=1;k<l;k++)j=_az._bd(this._fa.multiply(h,j),this._dd[k]);return j},this._bd=function(g){if(this._fa!=g._fa)throw"GF256Polys do not have same _az _fa";if(this.Zero)return g;if(g.Zero)return this;var o=this._dd,n=g._dd;if(o.length>n.length){var j=o;o=n,n=j}for(var h=new Array(n.length),k=n.length-o.length,m=0;m<k;m++)h[m]=n[m];for(var l=k;l<n.length;l++)h[l]=_az._bd(o[l-k],n[l]);return new _bp(f,h)},this.multiply1=function(o){if(this._fa!=o._fa)throw"GF256Polys do not have same _az _fa";if(this.Zero||o.Zero)return this._fa.Zero;for(var r=this._dd,g=r.length,l=o._dd,n=l.length,q=new Array(g+n-1),m=0;m<g;m++)for(var h=r[m],k=0;k<n;k++)q[m+k]=_az._bd(q[m+k],this._fa.multiply(h,l[k]));return new _bp(this._fa,q)},this.multiply2=function(g){if(0==g)return this._fa.Zero;if(1==g)return this;for(var j=this._dd.length,k=new Array(j),h=0;h<j;h++)k[h]=this._fa.multiply(this._dd[h],g);return new _bp(this._fa,k)},this._dc=function(l,g){if(l<0)throw"bad arguments";if(0==g)return this._fa.Zero;for(var j=this._dd.length,k=new Array(j+l),h=0;h<k.length;h++)k[h]=0;for(var h=0;h<j;h++)k[h]=this._fa.multiply(this._dd[h],g);return new _bp(this._fa,k)},this.divide=function(l){if(this._fa!=l._fa)throw"GF256Polys do not have same _az _fa";if(l.Zero)throw"Divide by 0";for(var j=this._fa.Zero,o=this,g=l._ex(l._ec),n=this._fa.inverse(g);o._ec>=l._ec&&!o.Zero;){var m=o._ec-l._ec,h=this._fa.multiply(o._ex(o._ec),n),i=l._dc(m,h),k=this._fa._ba(m,h);j=j._bd(k),o=o._bd(i)}return new Array(j,o)}}function _az(b){this._gh=new Array(256),this._gi=new Array(256);for(var a=1,e=0;e<256;e++)this._gh[e]=a,a<<=1,a>=256&&(a^=b);for(var e=0;e<255;e++)this._gi[this._gh[e]]=e;var d=new Array(1);d[0]=0,this.zero=new _bp(this,new Array(d));var c=new Array(1);c[0]=1,this.one=new _bp(this,new Array(c)),this.__defineGetter__("Zero",function(){return this.zero}),this.__defineGetter__("One",function(){return this.one}),this._ba=function(j,f){if(j<0)throw"bad arguments";if(0==f)return zero;for(var h=new Array(j+1),g=0;g<h.length;g++)h[g]=0;return h[0]=f,new _bp(this,h)},this.exp=function(f){return this._gh[f]},this.log=function(f){if(0==f)throw"bad arguments";return this._gi[f]},this.inverse=function(f){if(0==f)throw"System.ArithmeticException";return this._gh[255-this._gi[f]]},this.multiply=function(g,f){return 0==g||0==f?0:1==g?f:1==f?g:this._gh[(this._gi[g]+this._gi[f])%255]}}function _ew(a,b){return a>=0?a>>b:(a>>b)+(2<<~b)}function _cz(c,a,b){this.x=c,this.y=a,this.count=1,this._aj=b,this.__defineGetter__("_ei",function(){return this._aj}),this.__defineGetter__("Count",function(){return this.count}),this.__defineGetter__("X",function(){return this.x}),this.__defineGetter__("Y",function(){return this.y}),this._ek=function(){this.count++},this._ev=function(f,e,d){if(Math.abs(e-this.y)<=f&&Math.abs(d-this.x)<=f){var g=Math.abs(f-this._aj);return g<=1||g/this._aj<=1}return!1}}function _es(a){this._go=a[0],this._gu=a[1],this._gr=a[2],this.__defineGetter__("_gp",function(){return this._go}),this.__defineGetter__("_gq",function(){return this._gu}),this.__defineGetter__("_gs",function(){return this._gr})}function _cc(){this.image=null,this._cv=[],this._ge=!1,this._al=new Array(0,0,0,0,0),this._am=null,this.__defineGetter__("_da",function(){return this._al[0]=0,this._al[1]=0,this._al[2]=0,this._al[3]=0,this._al[4]=0,this._al}),this._ao=function(f){for(var b=0,d=0;d<5;d++){var e=f[d];if(0==e)return!1;b+=e}if(b<7)return!1;var c=Math.floor((b<<_el)/7),a=Math.floor(c/2);return Math.abs(c-(f[0]<<_el))<a&&Math.abs(c-(f[1]<<_el))<a&&Math.abs(3*c-(f[2]<<_el))<3*a&&Math.abs(c-(f[3]<<_el))<a&&Math.abs(c-(f[4]<<_el))<a},this._an=function(b,a){return a-b[4]-b[3]-b[2]/2},this._ap=function(a,j,d,g){for(var c=this.image,h=qrcode.height,b=this._da,f=a;f>=0&&c[j+f*qrcode.width];)b[2]++,f--;if(f<0)return NaN;for(;f>=0&&!c[j+f*qrcode.width]&&b[1]<=d;)b[1]++,f--;if(f<0||b[1]>d)return NaN;for(;f>=0&&c[j+f*qrcode.width]&&b[0]<=d;)b[0]++,f--;if(b[0]>d)return NaN;for(f=a+1;f<h&&c[j+f*qrcode.width];)b[2]++,f++;if(f==h)return NaN;for(;f<h&&!c[j+f*qrcode.width]&&b[3]<d;)b[3]++,f++;if(f==h||b[3]>=d)return NaN;for(;f<h&&c[j+f*qrcode.width]&&b[4]<d;)b[4]++,f++;if(b[4]>=d)return NaN;var e=b[0]+b[1]+b[2]+b[3]+b[4];return 5*Math.abs(e-g)>=2*g?NaN:this._ao(b)?this._an(b,f):NaN},this._ej=function(b,a,e,h){for(var d=this.image,i=qrcode.width,c=this._da,g=b;g>=0&&d[g+a*qrcode.width];)c[2]++,g--;if(g<0)return NaN;for(;g>=0&&!d[g+a*qrcode.width]&&c[1]<=e;)c[1]++,g--;if(g<0||c[1]>e)return NaN;for(;g>=0&&d[g+a*qrcode.width]&&c[0]<=e;)c[0]++,g--;if(c[0]>e)return NaN;for(g=b+1;g<i&&d[g+a*qrcode.width];)c[2]++,g++;if(g==i)return NaN;for(;g<i&&!d[g+a*qrcode.width]&&c[3]<e;)c[3]++,g++;if(g==i||c[3]>=e)return NaN;for(;g<i&&d[g+a*qrcode.width]&&c[4]<e;)c[4]++,g++;if(c[4]>=e)return NaN;var f=c[0]+c[1]+c[2]+c[3]+c[4];return 5*Math.abs(f-h)>=h?NaN:this._ao(c)?this._an(c,g):NaN},this._cu=function(c,f,e){var d=c[0]+c[1]+c[2]+c[3]+c[4],n=this._an(c,e),b=this._ap(f,Math.floor(n),c[2],d);if(!isNaN(b)&&(n=this._ej(Math.floor(n),Math.floor(b),c[2],d),!isNaN(n))){for(var l=d/7,m=!1,h=this._cv.length,g=0;g<h;g++){var a=this._cv[g];if(a._ev(l,b,n)){a._ek(),m=!0;break}}if(!m){var k=new _cz(n,b,l);this._cv.push(k),null!=this._am&&this._am._ep(k)}return!0}return!1},this._ee=function(){var a=this._cv.length;if(a<3)throw"Couldn't find enough finder patterns";if(a>3){for(var b=0,c=0;c<a;c++)b+=this._cv[c]._ei;for(var d=b/a,c=0;c<this._cv.length&&this._cv.length>3;c++){var e=this._cv[c];Math.abs(e._ei-d)>.2*d&&(this._cv.remove(c),c--)}}return this._cv.length>3&&this._cv.sort(function(g,f){return g.count>f.count?-1:g.count<f.count?1:0}),new Array(this._cv[0],this._cv[1],this._cv[2])},this._eq=function(){var b=this._cv.length;if(b<=1)return 0;for(var c=null,d=0;d<b;d++){var a=this._cv[d];if(a.Count>=_eg){if(null!=c)return this._ge=!0,Math.floor((Math.abs(c.X-a.X)-Math.abs(c.Y-a.Y))/2);c=a}}return 0},this._cx=function(){for(var g=0,c=0,a=this._cv.length,d=0;d<a;d++){var f=this._cv[d];f.Count>=_eg&&(g++,c+=f._ei)}if(g<3)return!1;for(var e=c/a,b=0,d=0;d<a;d++)f=this._cv[d],b+=Math.abs(f._ei-e);return b<=.05*c},this._ce=function(e){var o=!1;this.image=e;var n=qrcode.height,k=qrcode.width,a=Math.floor(3*n/(4*_eh));(a<_gf||o)&&(a=_gf);for(var g=!1,d=new Array(5),h=a-1;h<n&&!g;h+=a){d[0]=0,d[1]=0,d[2]=0,d[3]=0,d[4]=0;for(var b=0,f=0;f<k;f++)if(e[f+h*qrcode.width])1==(1&b)&&b++,d[b]++;else if(0==(1&b))if(4==b)if(this._ao(d)){var c=this._cu(d,h,f);if(c)if(a=2,this._ge)g=this._cx();else{var m=this._eq();m>d[2]&&(h+=m-d[2]-a,f=k-1)}else{do f++;while(f<k&&!e[f+h*qrcode.width]);f--}b=0,d[0]=0,d[1]=0,d[2]=0,d[3]=0,d[4]=0}else d[0]=d[2],d[1]=d[3],d[2]=d[4],d[3]=1,d[4]=0,b=3;else d[++b]++;else d[b]++;if(this._ao(d)){var c=this._cu(d,h,k);c&&(a=d[0],this._ge&&(g=_cx()))}}var l=this._ee();return qrcode._er(l),new _es(l)}}function _ai(c,a,b){this.x=c,this.y=a,this.count=1,this._aj=b,this.__defineGetter__("_ei",function(){return this._aj}),this.__defineGetter__("Count",function(){return this.count}),this.__defineGetter__("X",function(){return Math.floor(this.x)}),this.__defineGetter__("Y",function(){return Math.floor(this.y)}),this._ek=function(){this.count++},this._ev=function(f,e,d){if(Math.abs(e-this.y)<=f&&Math.abs(d-this.x)<=f){var g=Math.abs(f-this._aj);return g<=1||g/this._aj<=1}return!1}}function _ak(g,c,b,f,a,e,d){this.image=g,this._cv=new Array,this.startX=c,this.startY=b,this.width=f,this.height=a,this._ef=e,this._al=new Array(0,0,0),this._am=d,this._an=function(i,h){return h-i[2]-i[1]/2},this._ao=function(l){for(var k=this._ef,h=k/2,j=0;j<3;j++)if(Math.abs(k-l[j])>=h)return!1;return!0},this._ap=function(h,r,l,o){var k=this.image,q=qrcode.height,j=this._al;j[0]=0,j[1]=0,j[2]=0;for(var n=h;n>=0&&k[r+n*qrcode.width]&&j[1]<=l;)j[1]++,n--;if(n<0||j[1]>l)return NaN;for(;n>=0&&!k[r+n*qrcode.width]&&j[0]<=l;)j[0]++,n--;if(j[0]>l)return NaN;for(n=h+1;n<q&&k[r+n*qrcode.width]&&j[1]<=l;)j[1]++,n++;if(n==q||j[1]>l)return NaN;for(;n<q&&!k[r+n*qrcode.width]&&j[2]<=l;)j[2]++,n++;if(j[2]>l)return NaN;var m=j[0]+j[1]+j[2];return 5*Math.abs(m-o)>=2*o?NaN:this._ao(j)?this._an(j,n):NaN},this._cu=function(l,o,n){var m=l[0]+l[1]+l[2],u=this._an(l,n),k=this._ap(o,Math.floor(u),2*l[1],m);if(!isNaN(k)){for(var t=(l[0]+l[1]+l[2])/3,r=this._cv.length,q=0;q<r;q++){var h=this._cv[q];if(h._ev(t,k,u))return new _ai(u,k,t)}var s=new _ai(u,k,t);this._cv.push(s),null!=this._am&&this._am._ep(s)}return null},this.find=function(){for(var q=this.startX,t=this.height,r=q+f,s=b+(t>>1),m=new Array(0,0,0),k=0;k<t;k++){var o=s+(0==(1&k)?k+1>>1:-(k+1>>1));m[0]=0,m[1]=0,m[2]=0;for(var n=q;n<r&&!g[n+qrcode.width*o];)n++;for(var h=0;n<r;){if(g[n+o*qrcode.width])if(1==h)m[h]++;else if(2==h){if(this._ao(m)){var l=this._cu(m,o,n);if(null!=l)return l}m[0]=m[2],m[1]=1,m[2]=0,h=1}else m[++h]++;else 1==h&&h++,m[h]++;n++}if(this._ao(m)){var l=this._cu(m,o,r);if(null!=l)return l}}if(0!=this._cv.length)return this._cv[0];throw"Couldn't find enough alignment patterns"}}function QRCodeDataBlockReader(c,a,b){this._ed=0,this._cw=7,this.dataLength=0,this.blocks=c,this._en=b,a<=9?this.dataLengthMode=0:a>=10&&a<=26?this.dataLengthMode=1:a>=27&&a<=40&&(this.dataLengthMode=2),this._gd=function(f){var k=0;if(f<this._cw+1){for(var m=0,e=0;e<f;e++)m+=1<<e;return m<<=this._cw-f+1,k=(this.blocks[this._ed]&m)>>this._cw-f+1,this._cw-=f,k}if(f<this._cw+1+8){for(var j=0,e=0;e<this._cw+1;e++)j+=1<<e;return k=(this.blocks[this._ed]&j)<<f-(this._cw+1),this._ed++,k+=this.blocks[this._ed]>>8-(f-(this._cw+1)),this._cw=this._cw-f%8,this._cw<0&&(this._cw=8+this._cw),k}if(f<this._cw+1+16){for(var j=0,h=0,e=0;e<this._cw+1;e++)j+=1<<e;var g=(this.blocks[this._ed]&j)<<f-(this._cw+1);this._ed++;var d=this.blocks[this._ed]<<f-(this._cw+1+8);this._ed++;for(var e=0;e<f-(this._cw+1+8);e++)h+=1<<e;h<<=8-(f-(this._cw+1+8));var l=(this.blocks[this._ed]&h)>>8-(f-(this._cw+1+8));return k=g+d+l,this._cw=this._cw-(f-8)%8,this._cw<0&&(this._cw=8+this._cw),k}return 0},this.NextMode=function(){return this._ed>this.blocks.length-this._en-2?0:this._gd(4)},this.getDataLength=function(d){for(var e=0;;){if(d>>e==1)break;e++}return this._gd(qrcode._eo[this.dataLengthMode][e])},this.getRomanAndFigureString=function(h){var f=h,g=0,j="",d=new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":");do if(f>1){g=this._gd(11);var i=Math.floor(g/45),e=g%45;j+=d[i],j+=d[e],f-=2}else 1==f&&(g=this._gd(6),j+=d[g],f-=1);while(f>0);return j},this.getFigureString=function(f){var d=f,e=0,g="";do d>=3?(e=this._gd(10),e<100&&(g+="0"),e<10&&(g+="0"),d-=3):2==d?(e=this._gd(7),e<10&&(g+="0"),d-=2):1==d&&(e=this._gd(4),d-=1),g+=e;while(d>0);return g},this.get8bitByteArray=function(g){var e=g,f=0,d=new Array;do f=this._gd(8),d.push(f),e--;while(e>0);return d},this.getKanjiString=function(j){var g=j,i=0,h="";do{i=_gd(13);var e=i%192,f=i/192,k=(f<<8)+e,d=0;d=k+33088<=40956?k+33088:k+49472,h+=String.fromCharCode(d),g--}while(g>0);return h},this.__defineGetter__("DataByte",function(){for(var g=new Array,e=1,f=2,d=4,n=8;;){var k=this.NextMode();if(0==k){if(g.length>0)break;throw"Empty data block"}if(k!=e&&k!=f&&k!=d&&k!=n)throw"Invalid mode: "+k+" in (block:"+this._ed+" bit:"+this._cw+")";if(dataLength=this.getDataLength(k),dataLength<1)throw"Invalid data length: "+dataLength;switch(k){case e:for(var l=this.getFigureString(dataLength),i=new Array(l.length),h=0;h<l.length;h++)i[h]=l.charCodeAt(h);g.push(i);break;case f:for(var l=this.getRomanAndFigureString(dataLength),i=new Array(l.length),h=0;h<l.length;h++)i[h]=l.charCodeAt(h);g.push(i);break;case d:var m=this.get8bitByteArray(dataLength);g.push(m);break;case n:var l=this.getKanjiString(dataLength);g.push(l)}}return g})}function C_Promise(workload,context){this.parent=context,this.update=null,this.finally=null,this.error_function=null,this.then=function(callback){return this.finally=callback,this},this.progress=function(callback){return this.update=callback,this},this.error=function(callback){return this.error_function=callback,this},this.call_then=function(data){null!==this.finally&&this.finally(data);
},this.call_progress=function(data){null!==this.update&&this.update(data)},this.call_error=function(data){null!==this.error_function&&this.error_function(data)},setTimeout(workload.bind(this),100)}!function(C){function N(a){return function(){var d,b=arguments[0];for(d="["+(a?a+":":"")+b+"] http://errors.angularjs.org/1.5.8/"+(a?a+"/":"")+b,b=1;b<arguments.length;b++){d=d+(1==b?"?":"&")+"p"+(b-1)+"=";var e,c=encodeURIComponent;e=arguments[b],e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e,d+=c(e)}return Error(d)}}function ta(a){if(null==a||Va(a))return!1;if(L(a)||G(a)||F&&a instanceof F)return!0;var b="length"in Object(a)&&a.length;return T(b)&&(0<=b&&(b-1 in a||a instanceof Array)||"function"==typeof a.item)}function q(a,b,d){var c,e;if(a)if(z(a))for(c in a)"prototype"==c||"length"==c||"name"==c||a.hasOwnProperty&&!a.hasOwnProperty(c)||b.call(d,a[c],c,a);else if(L(a)||ta(a)){var f="object"!=typeof a;for(c=0,e=a.length;c<e;c++)(f||c in a)&&b.call(d,a[c],c,a)}else if(a.forEach&&a.forEach!==q)a.forEach(b,d,a);else if(sc(a))for(c in a)b.call(d,a[c],c,a);else if("function"==typeof a.hasOwnProperty)for(c in a)a.hasOwnProperty(c)&&b.call(d,a[c],c,a);else for(c in a)ua.call(a,c)&&b.call(d,a[c],c,a);return a}function tc(a,b,d){for(var c=Object.keys(a).sort(),e=0;e<c.length;e++)b.call(d,a[c[e]],c[e]);return c}function uc(a){return function(b,d){a(d,b)}}function Yd(){return++pb}function Pb(a,b,d){for(var c=a.$$hashKey,e=0,f=b.length;e<f;++e){var g=b[e];if(D(g)||z(g))for(var h=Object.keys(g),k=0,l=h.length;k<l;k++){var m=h[k],n=g[m];d&&D(n)?da(n)?a[m]=new Date(n.valueOf()):Wa(n)?a[m]=new RegExp(n):n.nodeName?a[m]=n.cloneNode(!0):Qb(n)?a[m]=n.clone():(D(a[m])||(a[m]=L(n)?[]:{}),Pb(a[m],[n],!0)):a[m]=n}}return c?a.$$hashKey=c:delete a.$$hashKey,a}function S(a){return Pb(a,va.call(arguments,1),!1)}function Zd(a){return Pb(a,va.call(arguments,1),!0)}function Z(a){return parseInt(a,10)}function Rb(a,b){return S(Object.create(a),b)}function A(){}function Xa(a){return a}function ha(a){return function(){return a}}function vc(a){return z(a.toString)&&a.toString!==ma}function y(a){return"undefined"==typeof a}function w(a){return"undefined"!=typeof a}function D(a){return null!==a&&"object"==typeof a}function sc(a){return null!==a&&"object"==typeof a&&!wc(a)}function G(a){return"string"==typeof a}function T(a){return"number"==typeof a}function da(a){return"[object Date]"===ma.call(a)}function z(a){return"function"==typeof a}function Wa(a){return"[object RegExp]"===ma.call(a)}function Va(a){return a&&a.window===a}function Ya(a){return a&&a.$evalAsync&&a.$watch}function Ga(a){return"boolean"==typeof a}function $d(a){return a&&T(a.length)&&ae.test(ma.call(a))}function Qb(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function be(a){var b={};a=a.split(",");var d;for(d=0;d<a.length;d++)b[a[d]]=!0;return b}function wa(a){return Q(a.nodeName||a[0]&&a[0].nodeName)}function Za(a,b){var d=a.indexOf(b);return 0<=d&&a.splice(d,1),d}function pa(a,b){function d(a,b){var e,d=b.$$hashKey;if(L(a)){e=0;for(var f=a.length;e<f;e++)b.push(c(a[e]))}else if(sc(a))for(e in a)b[e]=c(a[e]);else if(a&&"function"==typeof a.hasOwnProperty)for(e in a)a.hasOwnProperty(e)&&(b[e]=c(a[e]));else for(e in a)ua.call(a,e)&&(b[e]=c(a[e]));return d?b.$$hashKey=d:delete b.$$hashKey,b}function c(a){if(!D(a))return a;var b=f.indexOf(a);if(-1!==b)return g[b];if(Va(a)||Ya(a))throw xa("cpws");var b=!1,c=e(a);return void 0===c&&(c=L(a)?[]:Object.create(wc(a)),b=!0),f.push(a),g.push(c),b?d(a,c):c}function e(a){switch(ma.call(a)){case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Float32Array]":case"[object Float64Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return new a.constructor(c(a.buffer),a.byteOffset,a.length);case"[object ArrayBuffer]":if(!a.slice){var b=new ArrayBuffer(a.byteLength);return new Uint8Array(b).set(new Uint8Array(a)),b}return a.slice(0);case"[object Boolean]":case"[object Number]":case"[object String]":case"[object Date]":return new a.constructor(a.valueOf());case"[object RegExp]":return b=new RegExp(a.source,a.toString().match(/[^\/]*$/)[0]),b.lastIndex=a.lastIndex,b;case"[object Blob]":return new a.constructor([a],{type:a.type})}if(z(a.cloneNode))return a.cloneNode(!0)}var f=[],g=[];if(b){if($d(b)||"[object ArrayBuffer]"===ma.call(b))throw xa("cpta");if(a===b)throw xa("cpi");return L(b)?b.length=0:q(b,function(a,d){"$$hashKey"!==d&&delete b[d]}),f.push(a),g.push(b),d(a,b)}return c(a)}function na(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var c,d=typeof a;if(d==typeof b&&"object"==d){if(!L(a)){if(da(a))return!!da(b)&&na(a.getTime(),b.getTime());if(Wa(a))return!!Wa(b)&&a.toString()==b.toString();if(Ya(a)||Ya(b)||Va(a)||Va(b)||L(b)||da(b)||Wa(b))return!1;d=U();for(c in a)if("$"!==c.charAt(0)&&!z(a[c])){if(!na(a[c],b[c]))return!1;d[c]=!0}for(c in b)if(!(c in d)&&"$"!==c.charAt(0)&&w(b[c])&&!z(b[c]))return!1;return!0}if(!L(b))return!1;if((d=a.length)==b.length){for(c=0;c<d;c++)if(!na(a[c],b[c]))return!1;return!0}}return!1}function $a(a,b,d){return a.concat(va.call(b,d))}function ab(a,b){var d=2<arguments.length?va.call(arguments,2):[];return!z(b)||b instanceof RegExp?b:d.length?function(){return arguments.length?b.apply(a,$a(d,arguments,0)):b.apply(a,d)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function ce(a,b){var d=b;return"string"==typeof a&&"$"===a.charAt(0)&&"$"===a.charAt(1)?d=void 0:Va(b)?d="$WINDOW":b&&C.document===b?d="$DOCUMENT":Ya(b)&&(d="$SCOPE"),d}function bb(a,b){if(!y(a))return T(b)||(b=b?2:null),JSON.stringify(a,ce,b)}function xc(a){return G(a)?JSON.parse(a):a}function yc(a,b){a=a.replace(de,"");var d=Date.parse("Jan 01, 1970 00:00:00 "+a)/6e4;return isNaN(d)?b:d}function Sb(a,b,d){d=d?-1:1;var c=a.getTimezoneOffset();return b=yc(b,c),d*=b-c,a=new Date(a.getTime()),a.setMinutes(a.getMinutes()+d),a}function ya(a){a=F(a).clone();try{a.empty()}catch(b){}var d=F("<div>").append(a).html();try{return a[0].nodeType===Ma?Q(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+Q(b)})}catch(c){return Q(d)}}function zc(a){try{return decodeURIComponent(a)}catch(b){}}function Ac(a){var b={};return q((a||"").split("&"),function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=zc(e),w(e)&&(f=!w(f)||zc(f),ua.call(b,e)?L(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))}),b}function Tb(a){var b=[];return q(a,function(a,c){L(a)?q(a,function(a){b.push(ea(c,!0)+(!0===a?"":"="+ea(a,!0)))}):b.push(ea(c,!0)+(!0===a?"":"="+ea(a,!0)))}),b.length?b.join("&"):""}function qb(a){return ea(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ea(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function ee(a,b){var d,c,e=Na.length;for(c=0;c<e;++c)if(d=Na[c]+b,G(d=a.getAttribute(d)))return d;return null}function fe(a,b){var d,c,e={};q(Na,function(b){b+="app",!d&&a.hasAttribute&&a.hasAttribute(b)&&(d=a,c=a.getAttribute(b))}),q(Na,function(b){b+="app";var e;!d&&(e=a.querySelector("["+b.replace(":","\\:")+"]"))&&(d=e,c=e.getAttribute(b))}),d&&(e.strictDi=null!==ee(d,"strict-di"),b(d,c?[c]:[],e))}function Bc(a,b,d){D(d)||(d={}),d=S({strictDi:!1},d);var c=function(){if(a=F(a),a.injector()){var c=a[0]===C.document?"document":ya(a);throw xa("btstrpd",c.replace(/</,"&lt;").replace(/>/,"&gt;"))}return b=b||[],b.unshift(["$provide",function(b){b.value("$rootElement",a)}]),d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]),b.unshift("ng"),c=cb(b,d.strictDi),c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d),c(b)(a)})}]),c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;return C&&e.test(C.name)&&(d.debugInfoEnabled=!0,C.name=C.name.replace(e,"")),C&&!f.test(C.name)?c():(C.name=C.name.replace(f,""),ca.resumeBootstrap=function(a){return q(a,function(a){b.push(a)}),c()},void(z(ca.resumeDeferredBootstrap)&&ca.resumeDeferredBootstrap()))}function ge(){C.name="NG_ENABLE_DEBUG_INFO!"+C.name,C.location.reload()}function he(a){if(a=ca.element(a).injector(),!a)throw xa("test");return a.get("$$testability")}function Cc(a,b){return b=b||"_",a.replace(ie,function(a,c){return(c?b:"")+a.toLowerCase()})}function je(){var a;if(!Dc){var b=rb();(qa=y(b)?C.jQuery:b?C[b]:void 0)&&qa.fn.on?(F=qa,S(qa.fn,{scope:Oa.scope,isolateScope:Oa.isolateScope,controller:Oa.controller,injector:Oa.injector,inheritedData:Oa.inheritedData}),a=qa.cleanData,qa.cleanData=function(b){for(var c,f,e=0;null!=(f=b[e]);e++)(c=qa._data(f,"events"))&&c.$destroy&&qa(f).triggerHandler("$destroy");a(b)}):F=O,ca.element=F,Dc=!0}}function sb(a,b,d){if(!a)throw xa("areq",b||"?",d||"required");return a}function Pa(a,b,d){return d&&L(a)&&(a=a[a.length-1]),sb(z(a),b,"not a function, got "+(a&&"object"==typeof a?a.constructor.name||"Object":typeof a)),a}function Qa(a,b){if("hasOwnProperty"===a)throw xa("badname",b)}function Ec(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g<f;g++)c=b[g],a&&(a=(e=a)[c]);return!d&&z(a)?ab(e,a):a}function tb(a){for(var c,b=a[0],d=a[a.length-1],e=1;b!==d&&(b=b.nextSibling);e++)(c||a[e]!==b)&&(c||(c=F(va.call(a,0,e))),c.push(b));return c||a}function U(){return Object.create(null)}function ke(a){function b(a,b,c){return a[b]||(a[b]=c())}var d=N("$injector"),c=N("ng");return a=b(a,"angular",Object),a.$$minErr=a.$$minErr||N,b(a,"module",function(){var a={};return function(f,g,h){if("hasOwnProperty"===f)throw c("badname","module");return g&&a.hasOwnProperty(f)&&(a[f]=null),b(a,f,function(){function a(b,d,e,f){return f||(f=c),function(){return f[e||"push"]([b,d,arguments]),R}}function b(a,d){return function(b,e){return e&&z(e)&&(e.$$moduleName=f),c.push([a,d,arguments]),R}}if(!g)throw d("nomod",f);var c=[],e=[],p=[],u=a("$injector","invoke","push",e),R={_invokeQueue:c,_configBlocks:e,_runBlocks:p,requires:g,name:f,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),decorator:b("$provide","decorator"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),component:b("$compileProvider","component"),config:u,run:function(a){return p.push(a),this}};return h&&u(h),R})}})}function ia(a,b){if(L(a)){b=b||[];for(var d=0,c=a.length;d<c;d++)b[d]=a[d]}else if(D(a))for(d in b=b||{},a)"$"===d.charAt(0)&&"$"===d.charAt(1)||(b[d]=a[d]);return b||a}function le(a){S(a,{bootstrap:Bc,copy:pa,extend:S,merge:Zd,equals:na,element:F,forEach:q,injector:cb,noop:A,bind:ab,toJson:bb,fromJson:xc,identity:Xa,isUndefined:y,isDefined:w,isString:G,isFunction:z,isObject:D,isNumber:T,isElement:Qb,isArray:L,version:me,isDate:da,lowercase:Q,uppercase:ub,callbacks:{$$counter:0},getTestability:he,$$minErr:N,$$csp:Ba,reloadWithDebugInfo:ge}),(Ub=ke(C))("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:ne}),a.provider("$compile",Fc).directive({a:oe,input:Gc,textarea:Gc,form:pe,script:qe,select:re,style:se,option:te,ngBind:ue,ngBindHtml:ve,ngBindTemplate:we,ngClass:xe,ngClassEven:ye,ngClassOdd:ze,ngCloak:Ae,ngController:Be,ngForm:Ce,ngHide:De,ngIf:Ee,ngInclude:Fe,ngInit:Ge,ngNonBindable:He,ngPluralize:Ie,ngRepeat:Je,ngShow:Ke,ngStyle:Le,ngSwitch:Me,ngSwitchWhen:Ne,ngSwitchDefault:Oe,ngOptions:Pe,ngTransclude:Qe,ngModel:Re,ngList:Se,ngChange:Te,pattern:Hc,ngPattern:Hc,required:Ic,ngRequired:Ic,minlength:Jc,ngMinlength:Jc,maxlength:Kc,ngMaxlength:Kc,ngValue:Ue,ngModelOptions:Ve}).directive({ngInclude:We}).directive(vb).directive(Lc),a.provider({$anchorScroll:Xe,$animate:Ye,$animateCss:Ze,$$animateJs:$e,$$animateQueue:af,$$AnimateRunner:bf,$$animateAsyncRun:cf,$browser:df,$cacheFactory:ef,$controller:ff,$document:gf,$exceptionHandler:hf,$filter:Mc,$$forceReflow:jf,$interpolate:kf,$interval:lf,$http:mf,$httpParamSerializer:nf,$httpParamSerializerJQLike:of,$httpBackend:pf,$xhrFactory:qf,$jsonpCallbacks:rf,$location:sf,$log:tf,$parse:uf,$rootScope:vf,$q:wf,$$q:xf,$sce:yf,$sceDelegate:zf,$sniffer:Af,$templateCache:Bf,$templateRequest:Cf,$$testability:Df,$timeout:Ef,$window:Ff,$$rAF:Gf,$$jqLite:Hf,$$HashMap:If,$$cookieReader:Jf})}])}function db(a){return a.replace(Kf,function(a,d,c,e){return e?c.toUpperCase():c}).replace(Lf,"Moz$1")}function Nc(a){return a=a.nodeType,1===a||!a||9===a}function Oc(a,b){var d,c,e=b.createDocumentFragment(),f=[];if(Vb.test(a)){for(d=e.appendChild(b.createElement("div")),c=(Mf.exec(a)||["",""])[1].toLowerCase(),c=ja[c]||ja._default,d.innerHTML=c[1]+a.replace(Nf,"<$1></$2>")+c[2],c=c[0];c--;)d=d.lastChild;f=$a(f,d.childNodes),d=e.firstChild,d.textContent=""}else f.push(b.createTextNode(a));return e.textContent="",e.innerHTML="",q(f,function(a){e.appendChild(a)}),e}function Pc(a,b){var d=a.parentNode;d&&d.replaceChild(b,a),b.appendChild(a)}function O(a){if(a instanceof O)return a;var b;if(G(a)&&(a=W(a),b=!0),!(this instanceof O)){if(b&&"<"!=a.charAt(0))throw Wb("nosel");return new O(a)}if(b){b=C.document;var d;a=(d=Of.exec(a))?[b.createElement(d[1])]:(d=Oc(a,b))?d.childNodes:[]}Qc(this,a)}function Xb(a){return a.cloneNode(!0)}function wb(a,b){if(b||eb(a),a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,e=d.length;c<e;c++)eb(d[c])}function Rc(a,b,d,c){if(w(c))throw Wb("offargs");var e=(c=xb(a))&&c.events,f=c&&c.handle;if(f)if(b){var g=function(b){var c=e[b];w(d)&&Za(c||[],d),w(d)&&c&&0<c.length||(a.removeEventListener(b,f,!1),delete e[b])};q(b.split(" "),function(a){g(a),yb[a]&&g(yb[a])})}else for(b in e)"$destroy"!==b&&a.removeEventListener(b,f,!1),delete e[b]}function eb(a,b){var d=a.ng339,c=d&&fb[d];c&&(b?delete c.data[b]:(c.handle&&(c.events.$destroy&&c.handle({},"$destroy"),Rc(a)),delete fb[d],a.ng339=void 0))}function xb(a,b){var d=a.ng339,d=d&&fb[d];return b&&!d&&(a.ng339=d=++Pf,d=fb[d]={events:{},data:{},handle:void 0}),d}function Yb(a,b,d){if(Nc(a)){var c=w(d),e=!c&&b&&!D(b),f=!b;if(a=(a=xb(a,!e))&&a.data,c)a[b]=d;else{if(f)return a;if(e)return a&&a[b];S(a,b)}}}function zb(a,b){return!!a.getAttribute&&-1<(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" ")}function Ab(a,b){b&&a.setAttribute&&q(b.split(" "),function(b){a.setAttribute("class",W((" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+W(b)+" "," ")))})}function Bb(a,b){if(b&&a.setAttribute){var d=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");q(b.split(" "),function(a){a=W(a),-1===d.indexOf(" "+a+" ")&&(d+=a+" ")}),a.setAttribute("class",W(d))}}function Qc(a,b){if(b)if(b.nodeType)a[a.length++]=b;else{var d=b.length;if("number"==typeof d&&b.window!==b){if(d)for(var c=0;c<d;c++)a[a.length++]=b[c]}else a[a.length++]=b}}function Sc(a,b){return Cb(a,"$"+(b||"ngController")+"Controller")}function Cb(a,b,d){for(9==a.nodeType&&(a=a.documentElement),b=L(b)?b:[b];a;){for(var c=0,e=b.length;c<e;c++)if(w(d=F.data(a,b[c])))return d;a=a.parentNode||11===a.nodeType&&a.host}}function Tc(a){for(wb(a,!0);a.firstChild;)a.removeChild(a.firstChild)}function Db(a,b){b||wb(a);var d=a.parentNode;d&&d.removeChild(a)}function Qf(a,b){b=b||C,"complete"===b.document.readyState?b.setTimeout(a):F(b).on("load",a)}function Uc(a,b){var d=Eb[b.toLowerCase()];return d&&Vc[wa(a)]&&d}function Rf(a,b){var d=function(c,d){c.isDefaultPrevented=function(){return c.defaultPrevented};var f=b[d||c.type],g=f?f.length:0;if(g){if(y(c.immediatePropagationStopped)){var h=c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0,c.stopPropagation&&c.stopPropagation(),h&&h.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};var k=f.specialHandlerWrapper||Sf;1<g&&(f=ia(f));for(var l=0;l<g;l++)c.isImmediatePropagationStopped()||k(a,c,f[l])}};return d.elem=a,d}function Sf(a,b,d){d.call(a,b)}function Tf(a,b,d){var c=b.relatedTarget;c&&(c===a||Uf.call(a,c))||d.call(a,b)}function Hf(){this.$get=function(){return S(O,{hasClass:function(a,b){return a.attr&&(a=a[0]),zb(a,b)},addClass:function(a,b){return a.attr&&(a=a[0]),Bb(a,b)},removeClass:function(a,b){return a.attr&&(a=a[0]),Ab(a,b)}})}}function Ca(a,b){var d=a&&a.$$hashKey;return d?("function"==typeof d&&(d=a.$$hashKey()),d):(d=typeof a,d="function"==d||"object"==d&&null!==a?a.$$hashKey=d+":"+(b||Yd)():d+":"+a)}function Ra(a,b){if(b){var d=0;this.nextUid=function(){return++d}}q(a,this.put,this)}function Wc(a){return a=(Function.prototype.toString.call(a)+" ").replace(Vf,""),a.match(Wf)||a.match(Xf)}function Yf(a){return(a=Wc(a))?"function("+(a[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function cb(a,b){function d(a){return function(b,c){return D(b)?void q(b,uc(a)):a(b,c)}}function c(a,b){if(Qa(a,"service"),(z(b)||L(b))&&(b=p.instantiate(b)),!b.$get)throw Ha("pget",a);return n[a+"Provider"]=b}function e(a,b){return function(){var c=B.invoke(b,this);if(y(c))throw Ha("undef",a);return c}}function f(a,b,d){return c(a,{$get:!1!==d?e(a,b):b})}function g(a){sb(y(a)||L(a),"modulesToLoad","not an array");var c,b=[];return q(a,function(a){function d(a){var b,c;for(b=0,c=a.length;b<c;b++){var e=a[b],f=p.get(e[0]);f[e[1]].apply(f,e[2])}}if(!m.get(a)){m.put(a,!0);try{G(a)?(c=Ub(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):z(a)?b.push(p.invoke(a)):L(a)?b.push(p.invoke(a)):Pa(a,"module")}catch(e){throw L(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1==e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ha("modulerr",a,e.stack||e.message||e)}}}),b}function h(a,c){function d(b,e){if(a.hasOwnProperty(b)){if(a[b]===k)throw Ha("cdep",b+" <- "+l.join(" <- "));return a[b]}try{return l.unshift(b),a[b]=k,a[b]=c(b,e)}catch(f){throw a[b]===k&&delete a[b],f}finally{l.shift()}}function e(a,c,f){var g=[];a=cb.$$annotate(a,b,f);for(var h=0,k=a.length;h<k;h++){var l=a[h];if("string"!=typeof l)throw Ha("itkn",l);g.push(c&&c.hasOwnProperty(l)?c[l]:d(l,f))}return g}return{invoke:function(a,b,c,d){return"string"==typeof c&&(d=c,c=null),c=e(a,c,d),L(a)&&(a=a[a.length-1]),d=!(11>=Ea)&&("function"==typeof a&&/^(?:class\b|constructor\()/.test(Function.prototype.toString.call(a)+" ")),d?(c.unshift(null),new(Function.prototype.bind.apply(a,c))):a.apply(b,c)},instantiate:function(a,b,c){var d=L(a)?a[a.length-1]:a;return a=e(a,b,c),a.unshift(null),new(Function.prototype.bind.apply(d,a))},get:d,annotate:cb.$$annotate,has:function(b){return n.hasOwnProperty(b+"Provider")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],m=new Ra([],!0),n={$provide:{provider:d(c),factory:d(f),service:d(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return f(a,ha(b),!1)}),constant:d(function(a,b){Qa(a,"constant"),n[a]=b,u[a]=b}),decorator:function(a,b){var c=p.get(a+"Provider"),d=c.$get;c.$get=function(){var a=B.invoke(d,c);return B.invoke(b,null,{$delegate:a})}}}},p=n.$injector=h(n,function(a,b){throw ca.isString(b)&&l.push(b),Ha("unpr",l.join(" <- "))}),u={},R=h(u,function(a,b){var c=p.get(a+"Provider",b);return B.invoke(c.$get,c,void 0,a)}),B=R;n.$injectorProvider={$get:ha(R)};var r=g(a),B=R.get("$injector");return B.strictDi=b,q(r,function(a){a&&B.invoke(a)}),B}function Xe(){var a=!0;this.disableAutoScrolling=function(){a=!1},this.$get=["$window","$location","$rootScope",function(b,d,c){function e(a){var b=null;return Array.prototype.some.call(a,function(a){if("a"===wa(a))return b=a,!0}),b}function f(a){if(a){a.scrollIntoView();var c;c=g.yOffset,z(c)?c=c():Qb(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):T(c)||(c=0),c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=G(a)?a:d.hash();var b;a?(b=h.getElementById(a))?f(b):(b=e(h.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var h=b.document;return a&&c.$watch(function(){return d.hash()},function(a,b){a===b&&""===a||Qf(function(){c.$evalAsync(g)})}),g}]}function gb(a,b){return a||b?a?b?(L(a)&&(a=a.join(" ")),L(b)&&(b=b.join(" ")),a+" "+b):a:b:""}function Zf(a){G(a)&&(a=a.split(" "));var b=U();return q(a,function(a){a.length&&(b[a]=!0)}),b}function Ia(a){return D(a)?a:{}}function $f(a,b,d,c){function e(a){try{a.apply(null,va.call(arguments,1))}finally{if(R--,0===R)for(;B.length;)try{B.pop()()}catch(b){d.error(b)}}}function f(){t=null,g(),h()}function g(){r=K(),r=y(r)?null:r,na(r,E)&&(r=E),E=r}function h(){v===k.url()&&J===r||(v=k.url(),J=r,q(M,function(a){a(k.url(),r)}))}var k=this,l=a.location,m=a.history,n=a.setTimeout,p=a.clearTimeout,u={};k.isMock=!1;var R=0,B=[];k.$$completeOutstandingRequest=e,k.$$incOutstandingRequestCount=function(){R++},k.notifyWhenNoOutstandingRequests=function(a){0===R?a():B.push(a)};var r,J,v=l.href,fa=b.find("base"),t=null,K=c.history?function(){try{return m.state}catch(a){}}:A;g(),J=r,k.url=function(b,d,e){if(y(e)&&(e=null),l!==a.location&&(l=a.location),m!==a.history&&(m=a.history),b){var f=J===e;if(v===b&&(!c.history||f))return k;var h=v&&Ja(v)===Ja(b);return v=b,J=e,!c.history||h&&f?(h||(t=b),d?l.replace(b):h?(d=l,e=b.indexOf("#"),e=-1===e?"":b.substr(e),d.hash=e):l.href=b,l.href!==b&&(t=b)):(m[d?"replaceState":"pushState"](e,"",b),g(),J=r),t&&(t=b),k}return t||l.href.replace(/%27/g,"'")},k.state=function(){return r};var M=[],H=!1,E=null;k.onUrlChange=function(b){return H||(c.history&&F(a).on("popstate",f),F(a).on("hashchange",f),H=!0),M.push(b),b},k.$$applicationDestroyed=function(){F(a).off("hashchange popstate",f)},k.$$checkUrlChange=h,k.baseHref=function(){var a=fa.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""},k.defer=function(a,b){var c;return R++,c=n(function(){delete u[c],e(a)},b||0),u[c]=!0,c},k.defer.cancel=function(a){return!!u[a]&&(delete u[a],p(a),e(A),!0)}}function df(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new $f(a,c,b,d)}]}function ef(){this.$get=function(){function a(a,c){function e(a){a!=n&&(p?p==a&&(p=a.n):p=a,f(a.n,a.p),f(a,n),n=a,n.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw N("$cacheFactory")("iid",a);var g=0,h=S({},c,{id:a}),k=U(),l=c&&c.capacity||Number.MAX_VALUE,m=U(),n=null,p=null;return b[a]={put:function(a,b){if(!y(b)){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});e(c)}return a in k||g++,k[a]=b,g>l&&this.remove(p.key),b}},get:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;e(b)}return k[a]},remove:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;b==n&&(n=b.p),b==p&&(p=b.n),f(b.n,b.p),delete m[a]}a in k&&(delete k[a],g--)},removeAll:function(){k=U(),g=0,m=U(),n=p=null},destroy:function(){m=h=k=null,delete b[a]},info:function(){return S({},h,{size:g})}}}var b={};return a.info=function(){var a={};return q(b,function(b,e){a[e]=b.info()}),a},a.get=function(a){return b[a]},a}}function Bf(){this.$get=["$cacheFactory",function(a){return a("templates")}]}function Fc(a,b){function d(a,b,c){var d=/^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/,e=U();return q(a,function(a,f){if(a in n)e[f]=n[a];else{var g=a.match(d);if(!g)throw ga("iscp",b,f,a,c?"controller bindings definition":"isolate scope definition");e[f]={mode:g[1][0],collection:"*"===g[2],optional:"?"===g[3],attrName:g[4]||f},g[4]&&(n[a]=e[f])}}),e}function c(a){var b=a.charAt(0);if(!b||b!==Q(b))throw ga("baddir",a);if(a!==a.trim())throw ga("baddir",a)}function e(a){var b=a.require||a.controller&&a.name;return!L(b)&&D(b)&&q(b,function(a,c){var d=a.match(l);a.substring(d[0].length)||(b[c]=d[0]+c)}),b}var f={},g=/^\s*directive\:\s*([\w\-]+)\s+(.*)$/,h=/(([\w\-]+)(?:\:([^;]+))?;?)/,k=be("ngSrc,ngSrcset,src,srcset"),l=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,m=/^(on[a-z]+|formaction)$/,n=U();this.directive=function B(b,d){return Qa(b,"directive"),G(b)?(c(b),sb(d,"directiveFactory"),f.hasOwnProperty(b)||(f[b]=[],a.factory(b+"Directive",["$injector","$exceptionHandler",function(a,c){var d=[];return q(f[b],function(f,g){try{var h=a.invoke(f);z(h)?h={compile:ha(h)}:!h.compile&&h.link&&(h.compile=ha(h.link)),h.priority=h.priority||0,h.index=g,h.name=h.name||b,h.require=e(h),h.restrict=h.restrict||"EA",h.$$moduleName=f.$$moduleName,d.push(h)}catch(k){c(k)}}),d}])),f[b].push(d)):q(b,uc(B)),this},this.component=function(a,b){function c(a){function e(b){return z(b)||L(b)?function(c,d){return a.invoke(b,this,{$element:c,$attrs:d})}:b}var f=b.template||b.templateUrl?b.template:"",g={controller:d,controllerAs:Xc(b.controller)||b.controllerAs||"$ctrl",template:e(f),templateUrl:e(b.templateUrl),transclude:b.transclude,scope:{},bindToController:b.bindings||{},restrict:"E",require:b.require};return q(b,function(a,b){"$"===b.charAt(0)&&(g[b]=a)}),g}var d=b.controller||function(){};return q(b,function(a,b){"$"===b.charAt(0)&&(c[b]=a,z(d)&&(d[b]=a))}),c.$inject=["$injector"],this.directive(a,c)},this.aHrefSanitizationWhitelist=function(a){return w(a)?(b.aHrefSanitizationWhitelist(a),this):b.aHrefSanitizationWhitelist()},this.imgSrcSanitizationWhitelist=function(a){return w(a)?(b.imgSrcSanitizationWhitelist(a),this):b.imgSrcSanitizationWhitelist()};var p=!0;this.debugInfoEnabled=function(a){return w(a)?(p=a,this):p};var u=10;this.onChangesTtl=function(a){return arguments.length?(u=a,this):u},this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function(a,b,c,e,n,t,K,M,H,E){function I(){try{if(!--qa)throw Y=void 0,ga("infchng",u);K.$apply(function(){for(var a=[],b=0,c=Y.length;b<c;++b)try{Y[b]()}catch(d){a.push(d)}if(Y=void 0,a.length)throw a})}finally{qa++}}function Da(a,b){if(b){var d,e,f,c=Object.keys(b);for(d=0,e=c.length;d<e;d++)f=c[d],this[f]=b[f]}else this.$attr={};this.$$element=a}function P(a,b,c){pa.innerHTML="<span "+b+">",b=pa.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name),d.value=c,a.attributes.setNamedItem(d)}function x(a,b){try{a.addClass(b)}catch(c){}}function aa(a,b,c,d,e){a instanceof F||(a=F(a));for(var f=/\S+/,g=0,h=a.length;g<h;g++){var k=a[g];k.nodeType===Ma&&k.nodeValue.match(f)&&Pc(k,a[g]=C.document.createElement("span"))}var l=s(a,b,a,c,d,e);aa.$$addScopeClass(a);var m=null;return function(b,c,d){sb(b,"scope"),e&&e.needsNewScope&&(b=b.$parent.$new()),d=d||{};var f=d.parentBoundTranscludeFn,g=d.transcludeControllers;if(d=d.futureParentElement,f&&f.$$boundTransclude&&(f=f.$$boundTransclude),m||(m=(d=d&&d[0])&&"foreignobject"!==wa(d)&&ma.call(d).match(/SVG/)?"svg":"html"),d="html"!==m?F(da(m,F("<div>").append(a).html())):c?Oa.clone.call(a):a,g)for(var h in g)d.data("$"+h+"Controller",g[h].instance);return aa.$$addScopeInfo(d,b),c&&c(d,b),l&&l(b,d,d,f),d}}function s(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,p,r,v;if(n)for(v=Array(c.length),m=0;m<h.length;m+=3)f=h[m],v[f]=c[f];else v=c;for(m=0,p=h.length;m<p;)k=v[h[m++]],c=h[m++],f=h[m++],c?(c.scope?(l=a.$new(),aa.$$addScopeInfo(F(k),l)):l=a,r=c.transcludeOnThisElement?za(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?za(a,b):null,c(f,l,k,d,r)):f&&f(a,k.childNodes,void 0,e)}for(var k,l,m,p,n,h=[],r=0;r<a.length;r++)k=new Da,l=$b(a[r],[],k,0===r?d:void 0,e),(f=l.length?oa(l,a[r],k,b,c,null,[],[],f):null)&&f.scope&&aa.$$addScopeClass(k.$$element),k=f&&f.terminal||!(m=a[r].childNodes)||!m.length?null:s(m,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b),(f||k)&&(h.push(r,f,k),p=!0,n=n||f),f=null;return p?g:null}function za(a,b,c){function d(e,f,g,h,k){return e||(e=a.$new(!1,k),e.$$transcluded=!0),b(e,f,{parentBoundTranscludeFn:c,transcludeControllers:g,futureParentElement:h})}var f,e=d.$$slots=U();for(f in b.$$slots)e[f]=b.$$slots[f]?za(a,b.$$slots[f],c):null;return d}function $b(a,b,c,d,e){var f=c.$attr;switch(a.nodeType){case 1:O(b,Aa(wa(a)),"E",d,e);for(var g,k,l,m,p=a.attributes,n=0,r=p&&p.length;n<r;n++){var v=!1,u=!1;g=p[n],k=g.name,l=W(g.value),g=Aa(k),(m=Ba.test(g))&&(k=k.replace(Yc,"").substr(8).replace(/_(.)/g,function(a,b){return b.toUpperCase()})),(g=g.match(Ca))&&V(g[1])&&(v=k,u=k.substr(0,k.length-5)+"end",k=k.substr(0,k.length-6)),g=Aa(k.toLowerCase()),f[g]=k,!m&&c.hasOwnProperty(g)||(c[g]=l,Uc(a,g)&&(c[g]=!0)),ia(a,b,l,g,m),O(b,g,"A",d,e,v,u)}if(f=a.className,D(f)&&(f=f.animVal),G(f)&&""!==f)for(;a=h.exec(f);)g=Aa(a[2]),O(b,g,"C",d,e)&&(c[g]=W(a[3])),f=f.substr(a.index+a[0].length);break;case Ma:if(11===Ea)for(;a.parentNode&&a.nextSibling&&a.nextSibling.nodeType===Ma;)a.nodeValue+=a.nextSibling.nodeValue,a.parentNode.removeChild(a.nextSibling);ca(b,a.nodeValue);break;case 8:hb(a,b,c,d,e)}return b.sort(Z),b}function hb(a,b,c,d,e){try{var f=g.exec(a.nodeValue);if(f){var h=Aa(f[1]);O(b,h,"M",d,e)&&(c[h]=W(f[2]))}}catch(k){}}function N(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ga("uterdir",b,c);1==a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--),d.push(a),a=a.nextSibling}while(0<e)}else d.push(a);return F(d)}function Zc(a,b,c){return function(d,e,f,g,h){return e=N(e[0],b,c),a(d,e,f,g,h)}}function ac(a,b,c,d,e,f){var g;return a?aa(b,c,d,e,f):function(){return g||(g=aa(b,c,d,e,f),b=c=f=null),g.apply(this,arguments)}}function oa(a,b,d,e,f,g,h,k,l){function m(a,b,c,d){a&&(c&&(a=Zc(a,c,d)),a.require=x.require,a.directiveName=I,(u===x||x.$$isolateScope)&&(a=ja(a,{isolateScope:!0})),h.push(a)),b&&(c&&(b=Zc(b,c,d)),b.require=x.require,b.directiveName=I,(u===x||x.$$isolateScope)&&(b=ja(b,{isolateScope:!0})),k.push(b))}function p(a,e,f,g,l){function m(a,b,c,d){var e;if(Ya(a)||(d=c,c=b,b=a,a=void 0),fa&&(e=t),c||(c=fa?I.parent():I),!d)return l(a,b,e,c,s);var f=l.$$slots[d];if(f)return f(a,b,e,c,s);if(y(f))throw ga("noslot",d,ya(I))}var n,E,x,M,B,t,P,I;b===f?(g=d,I=d.$$element):(I=F(f),g=new Da(I,d)),B=e,u?M=e.$new(!0):r&&(B=e.$parent),l&&(P=m,P.$$boundTransclude=l,P.isSlotFilled=function(a){return!!l.$$slots[a]}),v&&(t=ag(I,g,P,v,M,e,u)),u&&(aa.$$addScopeInfo(I,M,!0,!(H&&(H===u||H===u.$$originalDirective))),aa.$$addScopeClass(I,!0),M.$$isolateBindings=u.$$isolateBindings,E=ka(e,g,M,M.$$isolateBindings,u),E.removeWatches&&M.$on("$destroy",E.removeWatches));for(n in t){E=v[n],x=t[n];var Zb=E.$$bindings.bindToController;x.bindingInfo=x.identifier&&Zb?ka(B,g,x.instance,Zb,E):{};var K=x();K!==x.instance&&(x.instance=K,I.data("$"+E.name+"Controller",K),x.bindingInfo.removeWatches&&x.bindingInfo.removeWatches(),x.bindingInfo=ka(B,g,x.instance,Zb,E))}for(q(v,function(a,b){var c=a.require;a.bindToController&&!L(c)&&D(c)&&S(t[b].instance,ib(b,c,I,t))}),q(t,function(a){var b=a.instance;if(z(b.$onChanges))try{b.$onChanges(a.bindingInfo.initialChanges)}catch(d){c(d)}if(z(b.$onInit))try{b.$onInit()}catch(e){c(e)}z(b.$doCheck)&&(B.$watch(function(){b.$doCheck()}),b.$doCheck()),z(b.$onDestroy)&&B.$on("$destroy",function(){b.$onDestroy()})}),n=0,E=h.length;n<E;n++)x=h[n],la(x,x.isolateScope?M:e,I,g,x.require&&ib(x.directiveName,x.require,I,t),P);var s=e;for(u&&(u.template||null===u.templateUrl)&&(s=M),a&&a(s,f.childNodes,void 0,l),n=k.length-1;0<=n;n--)x=k[n],la(x,x.isolateScope?M:e,I,g,x.require&&ib(x.directiveName,x.require,I,t),P);q(t,function(a){a=a.instance,z(a.$postLink)&&a.$postLink()})}l=l||{};for(var x,I,P,s,w,n=-Number.MAX_VALUE,r=l.newScopeDirective,v=l.controllerDirectives,u=l.newIsolateScopeDirective,H=l.templateDirective,E=l.nonTlbTranscludeDirective,M=!1,B=!1,fa=l.hasElementTranscludeDirective,t=d.$$element=F(b),K=e,Fa=!1,za=!1,A=0,C=a.length;A<C;A++){x=a[A];var G=x.$$start,hb=x.$$end;if(G&&(t=N(b,G,hb)),P=void 0,n>x.priority)break;if((w=x.scope)&&(x.templateUrl||(D(w)?(X("new/isolated scope",u||r,x,t),u=x):X("new/isolated scope",u,x,t)),r=r||x),I=x.name,!Fa&&(x.replace&&(x.templateUrl||x.template)||x.transclude&&!x.$$tlb)){for(w=A+1;Fa=a[w++];)if(Fa.transclude&&!Fa.$$tlb||Fa.replace&&(Fa.templateUrl||Fa.template)){za=!0;break}Fa=!0}if(!x.templateUrl&&x.controller&&(w=x.controller,
v=v||U(),X("'"+I+"' controller",v[I],x,t),v[I]=x),w=x.transclude)if(M=!0,x.$$tlb||(X("transclusion",E,x,t),E=x),"element"==w)fa=!0,n=x.priority,P=t,t=d.$$element=F(aa.$$createComment(I,d[I])),b=t[0],ea(f,va.call(P,0),b),P[0].$$parentNode=P[0].parentNode,K=ac(za,P,e,n,g&&g.name,{nonTlbTranscludeDirective:E});else{var oa=U();if(P=F(Xb(b)).contents(),D(w)){P=[];var Q=U(),O=U();q(w,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a,Q[a]=b,oa[b]=null,O[b]=c}),q(t.contents(),function(a){var b=Q[Aa(wa(a))];b?(O[b]=!0,oa[b]=oa[b]||[],oa[b].push(a)):P.push(a)}),q(O,function(a,b){if(!a)throw ga("reqslot",b)});for(var V in oa)oa[V]&&(oa[V]=ac(za,oa[V],e))}t.empty(),K=ac(za,P,e,void 0,void 0,{needsNewScope:x.$$isolateScope||x.$$newScope}),K.$$slots=oa}if(x.template)if(B=!0,X("template",H,x,t),H=x,w=z(x.template)?x.template(t,d):x.template,w=xa(w),x.replace){if(g=x,P=Vb.test(w)?$c(da(x.templateNamespace,W(w))):[],b=P[0],1!=P.length||1!==b.nodeType)throw ga("tplrt",I,"");ea(f,t,b),C={$attr:{}},w=$b(b,[],C);var Z=a.splice(A+1,a.length-(A+1));(u||r)&&T(w,u,r),a=a.concat(w).concat(Z),$(d,C),C=a.length}else t.html(w);if(x.templateUrl)B=!0,X("template",H,x,t),H=x,x.replace&&(g=x),p=ba(a.splice(A,a.length-A),t,d,f,M&&K,h,k,{controllerDirectives:v,newScopeDirective:r!==x&&r,newIsolateScopeDirective:u,templateDirective:H,nonTlbTranscludeDirective:E}),C=a.length;else if(x.compile)try{s=x.compile(t,d,K);var Y=x.$$originalDirective||x;z(s)?m(null,ab(Y,s),G,hb):s&&m(ab(Y,s.pre),ab(Y,s.post),G,hb)}catch(ca){c(ca,ya(t))}x.terminal&&(p.terminal=!0,n=Math.max(n,x.priority))}return p.scope=r&&!0===r.scope,p.transcludeOnThisElement=M,p.templateOnThisElement=B,p.transclude=K,l.hasElementTranscludeDirective=fa,p}function ib(a,b,c,d){var e;if(G(b)){var f=b.match(l);b=b.substring(f[0].length);var g=f[1]||f[3],f="?"===f[2];if("^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance,!e){var h="$"+b+"Controller";e=g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw ga("ctreq",b,a)}else if(L(b))for(e=[],g=0,f=b.length;g<f;g++)e[g]=ib(a,b[g],c,d);else D(b)&&(e={},q(b,function(b,f){e[f]=ib(a,b,c,d)}));return e||null}function ag(a,b,c,d,e,f,g){var k,h=U();for(k in d){var l=d[k],m={$scope:l===g||l.$$isolateScope?e:f,$element:a,$attrs:b,$transclude:c},p=l.controller;"@"==p&&(p=b[l.name]),m=t(p,m,!0,l.controllerAs),h[l.name]=m,a.data("$"+l.name+"Controller",m.instance)}return h}function T(a,b,c){for(var d=0,e=a.length;d<e;d++)a[d]=Rb(a[d],{$$isolateScope:b,$$newScope:c})}function O(b,e,g,h,k,l,m){if(e===k)return null;if(k=null,f.hasOwnProperty(e)){var p;e=a.get(e+"Directive");for(var n=0,r=e.length;n<r;n++)try{if(p=e[n],(y(h)||h>p.priority)&&-1!=p.restrict.indexOf(g)){if(l&&(p=Rb(p,{$$start:l,$$end:m})),!p.$$bindings){var u=p,v=p,x=p.name,H={isolateScope:null,bindToController:null};if(D(v.scope)&&(!0===v.bindToController?(H.bindToController=d(v.scope,x,!0),H.isolateScope={}):H.isolateScope=d(v.scope,x,!1)),D(v.bindToController)&&(H.bindToController=d(v.bindToController,x,!0)),D(H.bindToController)){var E=v.controller,M=v.controllerAs;if(!E)throw ga("noctrl",x);if(!Xc(E,M))throw ga("noident",x)}var t=u.$$bindings=H;D(t.isolateScope)&&(p.$$isolateBindings=t.isolateScope)}b.push(p),k=p}}catch(I){c(I)}}return k}function V(b){if(f.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,e=c.length;d<e;d++)if(b=c[d],b.multiElement)return!0;return!1}function $(a,b){var c=b.$attr,d=a.$attr;q(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))}),q(b,function(b,e){a.hasOwnProperty(e)||"$"===e.charAt(0)||(a[e]=b,"class"!==e&&"style"!==e&&(d[e]=c[e]))})}function ba(a,b,c,d,f,g,h,k){var m,p,l=[],n=b[0],r=a.shift(),u=Rb(r,{templateUrl:null,transclude:null,replace:null,$$originalDirective:r}),H=z(r.templateUrl)?r.templateUrl(b,c):r.templateUrl,E=r.templateNamespace;return b.empty(),e(H).then(function(e){var v,M;if(e=xa(e),r.replace){if(e=Vb.test(e)?$c(da(E,W(e))):[],v=e[0],1!=e.length||1!==v.nodeType)throw ga("tplrt",r.name,H);e={$attr:{}},ea(d,b,v);var B=$b(v,[],e);D(r.scope)&&T(B,!0),a=B.concat(a),$(c,e)}else v=n,b.html(e);for(a.unshift(u),m=oa(a,v,c,f,b,r,g,h,k),q(d,function(a,c){a==v&&(d[c]=b[0])}),p=s(b[0].childNodes,f);l.length;){e=l.shift(),M=l.shift();var t=l.shift(),I=l.shift(),B=b[0];if(!e.$$destroyed){if(M!==n){var P=M.className;k.hasElementTranscludeDirective&&r.replace||(B=Xb(v)),ea(t,F(M),B),x(F(B),P)}M=m.transcludeOnThisElement?za(e,m.transclude,I):I,m(p,e,B,d,M)}}l=null}),function(a,b,c,d,e){a=e,b.$$destroyed||(l?l.push(b,c,d,a):(m.transcludeOnThisElement&&(a=za(b,m.transclude,e)),m(p,b,c,d,a)))}}function Z(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function X(a,b,c,d){function e(a){return a?" (module: "+a+")":""}if(b)throw ga("multidir",b.name,e(b.$$moduleName),c.name,e(c.$$moduleName),a,ya(d))}function ca(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;return b&&aa.$$addBindingClass(a),function(a,c){var e=c.parent();b||aa.$$addBindingClass(e),aa.$$addBindingInfo(e,d.expressions),a.$watch(d,function(a){c[0].nodeValue=a})}}})}function da(a,b){switch(a=Q(a||"html")){case"svg":case"math":var c=C.document.createElement("div");return c.innerHTML="<"+a+">"+b+"</"+a+">",c.childNodes[0].childNodes;default:return b}}function ha(a,b){if("srcdoc"==b)return M.HTML;var c=wa(a);return"xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b)?M.RESOURCE_URL:void 0}function ia(a,c,d,e,f){var g=ha(a,e);f=k[e]||f;var h=b(d,!0,g,f);if(h){if("multiple"===e&&"select"===wa(a))throw ga("selmulti",ya(a));c.push({priority:100,compile:function(){return{pre:function(a,c,k){if(c=k.$$observers||(k.$$observers=U()),m.test(e))throw ga("nodomevents");var l=k[e];l!==d&&(h=l&&b(l,!0,g,f),d=l),h&&(k[e]=h(a),(c[e]||(c[e]=[])).$$inter=!0,(k.$$observers&&k.$$observers[e].$$scope||a).$watch(h,function(a,b){"class"===e&&a!=b?k.$updateClass(a,b):k.$set(e,a)}))}}}})}}function ea(a,b,c){var g,h,d=b[0],e=b.length,f=d.parentNode;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c,h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1,a.context===d&&(a.context=c);break}for(f&&f.replaceChild(c,d),a=C.document.createDocumentFragment(),g=0;g<e;g++)a.appendChild(b[g]);for(F.hasData(d)&&(F.data(c,F.data(d)),F(d).off("$destroy")),F.cleanData(a.querySelectorAll("*")),g=1;g<e;g++)delete b[g];b[0]=c,b.length=1}function ja(a,b){return S(function(){return a.apply(null,arguments)},a,b)}function la(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,ya(d))}}function ka(a,c,d,e,f){function g(b,c,e){z(d.$onChanges)&&c!==e&&(Y||(a.$$postDigest(I),Y=[]),m||(m={},Y.push(h)),m[b]&&(e=m[b].previousValue),m[b]=new Fb(e,c))}function h(){d.$onChanges(m),m=void 0}var m,k=[],l={};return q(e,function(e,h){var v,u,x,H,m=e.attrName,p=e.optional;switch(e.mode){case"@":p||ua.call(c,m)||(d[h]=c[m]=void 0),c.$observe(m,function(a){(G(a)||Ga(a))&&(g(h,a,d[h]),d[h]=a)}),c.$$observers[m].$$scope=a,v=c[m],G(v)?d[h]=b(v)(a):Ga(v)&&(d[h]=v),l[h]=new Fb(bc,d[h]);break;case"=":if(!ua.call(c,m)){if(p)break;c[m]=void 0}if(p&&!c[m])break;u=n(c[m]),H=u.literal?na:function(a,b){return a===b||a!==a&&b!==b},x=u.assign||function(){throw v=d[h]=u(a),ga("nonassign",c[m],m,f.name)},v=d[h]=u(a),p=function(b){return H(b,d[h])||(H(b,v)?x(a,b=d[h]):d[h]=b),v=b},p.$stateful=!0,p=e.collection?a.$watchCollection(c[m],p):a.$watch(n(c[m],p),null,u.literal),k.push(p);break;case"<":if(!ua.call(c,m)){if(p)break;c[m]=void 0}if(p&&!c[m])break;u=n(c[m]);var E=d[h]=u(a);l[h]=new Fb(bc,d[h]),p=a.$watch(u,function(a,b){if(b===a){if(b===E)return;b=E}g(h,a,b),d[h]=a},u.literal),k.push(p);break;case"&":if(u=c.hasOwnProperty(m)?n(c[m]):A,u===A&&p)break;d[h]=function(b){return u(a,b)}}}),{initialChanges:l,removeWatches:k.length&&function(){for(var a=0,b=k.length;a<b;++a)k[a]()}}}var Y,ta=/^\w/,pa=C.document.createElement("div"),qa=u;Da.prototype={$normalize:Aa,$addClass:function(a){a&&0<a.length&&H.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&H.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=ad(a,b);c&&c.length&&H.addClass(this.$$element,c),(c=ad(b,a))&&c.length&&H.removeClass(this.$$element,c)},$set:function(a,b,d,e){var f=Uc(this.$$element[0],a),g=bd[a],h=a;if(f?(this.$$element.prop(a,b),e=f):g&&(this[g]=b,h=g),this[a]=b,e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=e=Cc(a,"-")),f=wa(this.$$element),"a"===f&&("href"===a||"xlinkHref"===a)||"img"===f&&"src"===a)this[a]=b=E(b,"src"===a);else if("img"===f&&"srcset"===a&&w(b)){for(var f="",g=W(b),k=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,k=/\s/.test(g)?k:/(,)/,g=g.split(k),k=Math.floor(g.length/2),l=0;l<k;l++)var m=2*l,f=f+E(W(g[m]),!0),f=f+(" "+W(g[m+1]));g=W(g[2*l]).split(/\s/),f+=E(W(g[0]),!0),2===g.length&&(f+=" "+W(g[1])),this[a]=b=f}!1!==d&&(null===b||y(b)?this.$$element.removeAttr(e):ta.test(e)?this.$$element.attr(e,b):P(this.$$element[0],e,b)),(a=this.$$observers)&&q(a[h],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=U()),e=d[a]||(d[a]=[]);return e.push(b),K.$evalAsync(function(){e.$$inter||!c.hasOwnProperty(a)||y(c[a])||b(c[a])}),function(){Za(e,b)}}};var ra=b.startSymbol(),sa=b.endSymbol(),xa="{{"==ra&&"}}"==sa?Xa:function(a){return a.replace(/\{\{/g,ra).replace(/}}/g,sa)},Ba=/^ngAttr[A-Z]/,Ca=/^(.+)Start$/;return aa.$$addBindingInfo=p?function(a,b){var c=a.data("$binding")||[];L(b)?c=c.concat(b):c.push(b),a.data("$binding",c)}:A,aa.$$addBindingClass=p?function(a){x(a,"ng-binding")}:A,aa.$$addScopeInfo=p?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:A,aa.$$addScopeClass=p?function(a,b){x(a,b?"ng-isolate-scope":"ng-scope")}:A,aa.$$createComment=function(a,b){var c="";return p&&(c=" "+(a||"")+": ",b&&(c+=b+" ")),C.document.createComment(c)},aa}]}function Fb(a,b){this.previousValue=a,this.currentValue=b}function Aa(a){return db(a.replace(Yc,""))}function ad(a,b){var d="",c=a.split(/\s+/),e=b.split(/\s+/),f=0;a:for(;f<c.length;f++){for(var g=c[f],h=0;h<e.length;h++)if(g==e[h])continue a;d+=(0<d.length?" ":"")+g}return d}function $c(a){a=F(a);var b=a.length;if(1>=b)return a;for(;b--;)8===a[b].nodeType&&bg.call(a,b,1);return a}function Xc(a,b){if(b&&G(b))return b;if(G(a)){var d=cd.exec(a);if(d)return d[3]}}function ff(){var a={},b=!1;this.has=function(b){return a.hasOwnProperty(b)},this.register=function(b,c){Qa(b,"controller"),D(b)?S(a,b):a[b]=c},this.allowGlobals=function(){b=!0},this.$get=["$injector","$window",function(d,c){function e(a,b,c,d){if(!a||!D(a.$scope))throw N("$controller")("noscp",d,b);a.$scope[b]=c}return function(f,g,h,k){var l,m,n;if(h=!0===h,k&&G(k)&&(n=k),G(f)){if(k=f.match(cd),!k)throw cg("ctrlfmt",f);m=k[1],n=n||k[3],f=a.hasOwnProperty(m)?a[m]:Ec(g.$scope,m,!0)||(b?Ec(c,m,!0):void 0),Pa(f,m,!0)}return h?(h=(L(f)?f[f.length-1]:f).prototype,l=Object.create(h||null),n&&e(g,n,l,m||f.name),S(function(){var a=d.invoke(f,l,g,m);return a!==l&&(D(a)||z(a))&&(l=a,n&&e(g,n,l,m||f.name)),l},{instance:l,identifier:n})):(l=d.instantiate(f,g,m),n&&e(g,n,l,m||f.name),l)}}]}function gf(){this.$get=["$window",function(a){return F(a.document)}]}function hf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function cc(a){return D(a)?da(a)?a.toISOString():bb(a):a}function nf(){this.$get=function(){return function(a){if(!a)return"";var b=[];return tc(a,function(a,c){null===a||y(a)||(L(a)?q(a,function(a){b.push(ea(c)+"="+ea(cc(a)))}):b.push(ea(c)+"="+ea(cc(a))))}),b.join("&")}}}function of(){this.$get=function(){return function(a){function b(a,e,f){null===a||y(a)||(L(a)?q(a,function(a,c){b(a,e+"["+(D(a)?c:"")+"]")}):D(a)&&!da(a)?tc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):d.push(ea(e)+"="+ea(cc(a))))}if(!a)return"";var d=[];return b(a,"",!0),d.join("&")}}}function dc(a,b){if(G(a)){var d=a.replace(dg,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf(dd))||(c=(c=d.match(eg))&&fg[c[0]].test(d)),c&&(a=xc(d))}}return a}function ed(a){var d,b=U();return G(a)?q(a.split("\n"),function(a){d=a.indexOf(":");var e=Q(W(a.substr(0,d)));a=W(a.substr(d+1)),e&&(b[e]=b[e]?b[e]+", "+a:a)}):D(a)&&q(a,function(a,d){var f=Q(d),g=W(a);f&&(b[f]=b[f]?b[f]+", "+g:g)}),b}function fd(a){var b;return function(d){return b||(b=ed(a)),d?(d=b[Q(d)],void 0===d&&(d=null),d):b}}function gd(a,b,d,c){return z(c)?c(a,b,d):(q(c,function(c){a=c(a,b,d)}),a)}function mf(){var a=this.defaults={transformResponse:[dc],transformRequest:[function(a){return D(a)&&"[object File]"!==ma.call(a)&&"[object Blob]"!==ma.call(a)&&"[object FormData]"!==ma.call(a)?bb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ia(ec),put:ia(ec),patch:ia(ec)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return w(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return w(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(e,f,g,h,k,l){function m(b){function c(a,b){for(var d=0,e=b.length;d<e;){var f=b[d++],g=b[d++];a=a.then(f,g)}return b.length=0,a}function e(a,b){var c,d={};return q(a,function(a,e){z(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a}),d}function f(a){var b=S({},a);return b.data=gd(a.data,a.headers,a.status,g.transformResponse),a=a.status,200<=a&&300>a?b:k.reject(b)}if(!D(b))throw N("$http")("badreq",b);if(!G(b.url))throw N("$http")("badreq",b.url);var g=S({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);g.headers=function(b){var f,g,h,c=a.headers,d=S({},b.headers),c=S({},c.common,c[Q(b.method)]);a:for(f in c){g=Q(f);for(h in d)if(Q(h)===g)continue a;d[f]=c[f]}return e(d,ia(b))}(b),g.method=ub(g.method),g.paramSerializer=G(g.paramSerializer)?l.get(g.paramSerializer):g.paramSerializer;var h=[],m=[],p=k.when(g);return q(R,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError),(a.response||a.responseError)&&m.push(a.response,a.responseError)}),p=c(p,h),p=p.then(function(b){var c=b.headers,d=gd(b.data,fd(c),void 0,b.transformRequest);return y(d)&&q(c,function(a,b){"content-type"===Q(b)&&delete c[b]}),y(b.withCredentials)&&!y(a.withCredentials)&&(b.withCredentials=a.withCredentials),n(b,d).then(f,f)}),p=c(p,m),d?(p.success=function(a){return Pa(a,"fn"),p.then(function(b){a(b.data,b.status,b.headers,g)}),p},p.error=function(a){return Pa(a,"fn"),p.then(null,function(b){a(b.data,b.status,b.headers,g)}),p}):(p.success=hd("success"),p.error=hd("error")),p}function n(c,d){function g(a){if(a){var c={};return q(a,function(a,d){c[d]=function(c){function d(){a(c)}b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}}),c}}function l(a,c,d,e){function f(){n(c,a,d,e)}E&&(200<=a&&300>a?E.put(P,[a,c,ed(d),e]):E.remove(P)),b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function n(a,b,d,e){b=-1<=b?b:0,(200<=b&&300>b?M.resolve:M.reject)({data:a,status:b,headers:fd(d),config:c,statusText:e})}function t(a){n(a.data,a.status,ia(a.headers()),a.statusText)}function R(){var a=m.pendingRequests.indexOf(c);-1!==a&&m.pendingRequests.splice(a,1)}var E,I,M=k.defer(),H=M.promise,Da=c.headers,P=p(c.url,c.paramSerializer(c.params));return m.pendingRequests.push(c),H.then(R,R),!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(E=D(c.cache)?c.cache:D(a.cache)?a.cache:u),E&&(I=E.get(P),w(I)?I&&z(I.then)?I.then(t,t):L(I)?n(I[1],I[0],ia(I[2]),I[3]):n(I,200,{},"OK"):E.put(P,H)),y(I)&&((I=id(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(Da[c.xsrfHeaderName||a.xsrfHeaderName]=I),e(c.method,P,d,l,Da,c.timeout,c.withCredentials,c.responseType,g(c.eventHandlers),g(c.uploadEventHandlers))),H}function p(a,b){return 0<b.length&&(a+=(-1==a.indexOf("?")?"?":"&")+b),a}var u=g("$http");a.paramSerializer=G(a.paramSerializer)?l.get(a.paramSerializer):a.paramSerializer;var R=[];return q(c,function(a){R.unshift(G(a)?l.get(a):l.invoke(a))}),m.pendingRequests=[],function(a){q(arguments,function(a){m[a]=function(b,c){return m(S({},c||{},{method:a,url:b}))}})}("get","delete","head","jsonp"),function(a){q(arguments,function(a){m[a]=function(b,c,d){return m(S({},d||{},{method:a,url:b,data:c}))}})}("post","put","patch"),m.defaults=a,m}]}function qf(){this.$get=function(){return function(){return new C.XMLHttpRequest}}}function pf(){this.$get=["$browser","$jsonpCallbacks","$document","$xhrFactory",function(a,b,d,c){return gg(a,c,a.defer,b,d[0])}]}function gg(a,b,d,c,e){function f(a,b,d){a=a.replace("JSON_CALLBACK",b);var f=e.createElement("script"),m=null;return f.type="text/javascript",f.src=a,f.async=!0,m=function(a){f.removeEventListener("load",m,!1),f.removeEventListener("error",m,!1),e.body.removeChild(f),f=null;var g=-1,u="unknown";a&&("load"!==a.type||c.wasCalled(b)||(a={type:"error"}),u=a.type,g="error"===a.type?404:200),d&&d(g,u)},f.addEventListener("load",m,!1),f.addEventListener("error",m,!1),e.body.appendChild(f),m}return function(e,h,k,l,m,n,p,u,R,B){function r(){fa&&fa(),t&&t.abort()}function J(b,c,e,f,g){w(M)&&d.cancel(M),fa=t=null,b(c,e,f,g),a.$$completeOutstandingRequest(A)}if(a.$$incOutstandingRequestCount(),h=h||a.url(),"jsonp"===Q(e))var v=c.createCallback(h),fa=f(h,v,function(a,b){var d=200===a&&c.getResponse(v);J(l,a,d,"",b),c.removeCallback(v)});else{var t=b(e,h);if(t.open(e,h,!0),q(m,function(a,b){w(a)&&t.setRequestHeader(b,a)}),t.onload=function(){var a=t.statusText||"",b="response"in t?t.response:t.responseText,c=1223===t.status?204:t.status;0===c&&(c=b?200:"file"==Y(h).protocol?404:0),J(l,c,b,t.getAllResponseHeaders(),a)},e=function(){J(l,-1,null,null,"")},t.onerror=e,t.onabort=e,q(R,function(a,b){t.addEventListener(b,a)}),q(B,function(a,b){t.upload.addEventListener(b,a)}),p&&(t.withCredentials=!0),u)try{t.responseType=u}catch(K){if("json"!==u)throw K}t.send(y(k)?null:k)}if(0<n)var M=d(r,n);else n&&z(n.then)&&n.then(r)}}function kf(){var a="{{",b="}}";this.startSymbol=function(b){return b?(a=b,this):a},this.endSymbol=function(a){return a?(b=a,this):b},this.$get=["$parse","$exceptionHandler","$sce",function(d,c,e){function f(a){return"\\\\\\"+a}function g(c){return c.replace(n,a).replace(p,b)}function h(a,b,c,d){var e;return e=a.$watch(function(a){return e(),d(a)},b,c)}function k(f,k,p,n){function J(a){try{var b=a;a=p?e.getTrusted(p,b):e.valueOf(b);var d;if(n&&!w(a))d=a;else if(null==a)d="";else{switch(typeof a){case"string":break;case"number":a=""+a;break;default:a=bb(a)}d=a}return d}catch(g){c(Ka.interr(f,g))}}if(!f.length||-1===f.indexOf(a)){var v;return k||(k=g(f),v=ha(k),v.exp=f,v.expressions=[],v.$$watchDelegate=h),v}n=!!n;var q,t,K=0,M=[],H=[];v=f.length;for(var E=[],I=[];K<v;){if(-1==(q=f.indexOf(a,K))||-1==(t=f.indexOf(b,q+l))){K!==v&&E.push(g(f.substring(K)));break}K!==q&&E.push(g(f.substring(K,q))),K=f.substring(q+l,t),M.push(K),H.push(d(K,J)),K=t+m,I.push(E.length),E.push("")}if(p&&1<E.length&&Ka.throwNoconcat(f),!k||M.length){var Da=function(a){for(var b=0,c=M.length;b<c;b++){if(n&&y(a[b]))return;E[I[b]]=a[b]}return E.join("")};return S(function(a){var b=0,d=M.length,e=Array(d);try{for(;b<d;b++)e[b]=H[b](a);return Da(e)}catch(g){c(Ka.interr(f,g))}},{exp:f,expressions:M,$$watchDelegate:function(a,b){var c;return a.$watchGroup(H,function(d,e){var f=Da(d);z(b)&&b.call(this,f,d!==e?c:f,a),c=f})}})}}var l=a.length,m=b.length,n=new RegExp(a.replace(/./g,f),"g"),p=new RegExp(b.replace(/./g,f),"g");return k.startSymbol=function(){return a},k.endSymbol=function(){return b},k}]}function lf(){this.$get=["$rootScope","$window","$q","$$q","$browser",function(a,b,d,c,e){function f(f,k,l,m){function n(){p?f.apply(null,u):f(r)}var p=4<arguments.length,u=p?va.call(arguments,4):[],R=b.setInterval,q=b.clearInterval,r=0,J=w(m)&&!m,v=(J?c:d).defer(),fa=v.promise;return l=w(l)?l:0,fa.$$intervalId=R(function(){J?e.defer(n):a.$evalAsync(n),v.notify(r++),0<l&&r>=l&&(v.resolve(r),q(fa.$$intervalId),delete g[fa.$$intervalId]),J||a.$apply()},k),g[fa.$$intervalId]=v,fa}var g={};return f.cancel=function(a){return!!(a&&a.$$intervalId in g)&&(g[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete g[a.$$intervalId],!0)},f}]}function fc(a){a=a.split("/");for(var b=a.length;b--;)a[b]=qb(a[b]);return a.join("/")}function jd(a,b){var d=Y(a);b.$$protocol=d.protocol,b.$$host=d.hostname,b.$$port=Z(d.port)||hg[d.protocol]||null}function kd(a,b){var d="/"!==a.charAt(0);d&&(a="/"+a);var c=Y(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname),b.$$search=Ac(c.search),b.$$hash=decodeURIComponent(c.hash),b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function ka(a,b){if(0===b.lastIndexOf(a,0))return b.substr(a.length)}function Ja(a){var b=a.indexOf("#");return-1==b?a:a.substr(0,b)}function jb(a){return a.replace(/(#.+)|#$/,"$1")}function gc(a,b,d){this.$$html5=!0,d=d||"",jd(a,this),this.$$parse=function(a){var d=ka(b,a);if(!G(d))throw Gb("ipthprfx",a,b);kd(d,this),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var a=Tb(this.$$search),d=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=fc(this.$$path)+(a?"?"+a:"")+d,this.$$absUrl=b+this.$$url.substr(1)},this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;return w(f=ka(a,c))?(g=f,g=w(f=ka(d,f))?b+(ka("/",f)||f):a+g):w(f=ka(b,c))?g=b+f:b==c+"/"&&(g=b),g&&this.$$parse(g),!!g}}function hc(a,b,d){jd(a,this),this.$$parse=function(c){var f,e=ka(a,c)||ka(b,c);y(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",y(e)&&(a=c,this.replace())):(f=ka(d,e),y(f)&&(f=e)),kd(f,this),c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;0===f.lastIndexOf(e,0)&&(f=f.replace(e,"")),g.exec(f)||(c=(f=g.exec(c))?f[1]:c),this.$$path=c,this.$$compose()},this.$$compose=function(){var b=Tb(this.$$search),e=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=fc(this.$$path)+(b?"?"+b:"")+e,this.$$absUrl=a+(this.$$url?d+this.$$url:"")},this.$$parseLinkUrl=function(b,d){return Ja(a)==Ja(b)&&(this.$$parse(b),!0)}}function ld(a,b,d){this.$$html5=!0,hc.apply(this,arguments),this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;return a==Ja(c)?f=c:(g=ka(b,c))?f=a+d+g:b===c+"/"&&(f=b),f&&this.$$parse(f),!!f},this.$$compose=function(){var b=Tb(this.$$search),e=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=fc(this.$$path)+(b?"?"+b:"")+e,this.$$absUrl=a+d+this.$$url}}function Hb(a){return function(){return this[a]}}function md(a,b){return function(d){return y(d)?this[a]:(this[a]=b(d),this.$$compose(),this)}}function sf(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return w(b)?(a=b,this):a},this.html5Mode=function(a){return Ga(a)?(b.enabled=a,this):D(a)?(Ga(a.enabled)&&(b.enabled=a.enabled),Ga(a.requireBase)&&(b.requireBase=a.requireBase),Ga(a.rewriteLinks)&&(b.rewriteLinks=a.rewriteLinks),this):b},this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,e,f,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,m;m=c.baseHref();var p,n=c.url();if(b.enabled){if(!m&&b.requireBase)throw Gb("nobase");p=n.substring(0,n.indexOf("/",n.indexOf("//")+2))+(m||"/"),m=e.history?gc:ld}else p=Ja(n),m=hc;var u=p.substr(0,Ja(p).lastIndexOf("/")+1);l=new m(p,u,"#"+a),l.$$parseLinkUrl(n,n),l.$$state=c.state();var R=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(b.rewriteLinks&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!=a.which&&2!=a.button){for(var e=F(a.target);"a"!==wa(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");D(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=Y(h.animVal).href),R.test(h)||!h||e.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(h,k)||(a.preventDefault(),l.absUrl()!=c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]=!0))}}),jb(l.absUrl())!=jb(n)&&c.url(l.absUrl(),!0);var q=!0;return c.onUrlChange(function(a,b){y(ka(u,a))?g.location.href=a:(d.$evalAsync(function(){var f,c=l.absUrl(),e=l.$$state;a=jb(a),l.$$parse(a),l.$$state=b,f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented,l.absUrl()===a&&(f?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(q=!1,k(c,e)))}),d.$$phase||d.$digest())}),d.$watch(function(){var a=jb(c.url()),b=jb(l.absUrl()),f=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&e.history&&f!==l.$$state;(q||m)&&(q=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,f).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=f):(m&&h(b,g,f===l.$$state?null:l.$$state),k(a,f)))})),l.$$replace=!1}),l}]}function tf(){var a=!0,b=this;this.debugEnabled=function(b){return w(b)?(a=b,this):a},this.$get=["$window",function(d){function c(a){return a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line)),a}function e(a){var b=d.console||{},e=b[a]||b.log||A;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];return q(arguments,function(b){a.push(c(b))}),e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Sa(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"===a||"__proto__"===a)throw X("isecfld",b);return a}function ig(a){return a+""}function ra(a,b){if(a){if(a.constructor===a)throw X("isecfn",b);if(a.window===a)throw X("isecwindow",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw X("isecdom",b);if(a===Object)throw X("isecobj",b)}return a}function nd(a,b){if(a){if(a.constructor===a)throw X("isecfn",b);if(a===jg||a===kg||a===lg)throw X("isecff",b)}}function Ib(a,b){if(a&&(a===(0).constructor||a===(!1).constructor||a==="".constructor||a==={}.constructor||a===[].constructor||a===Function.constructor))throw X("isecaf",b)}function mg(a,b){return"undefined"!=typeof a?a:b}function od(a,b){return"undefined"==typeof a?b:"undefined"==typeof b?a:a+b}function V(a,b){var d,c;switch(a.type){case s.Program:d=!0,q(a.body,function(a){V(a.expression,b),d=d&&a.expression.constant}),a.constant=d;break;case s.Literal:a.constant=!0,a.toWatch=[];break;case s.UnaryExpression:V(a.argument,b),a.constant=a.argument.constant,a.toWatch=a.argument.toWatch;break;case s.BinaryExpression:V(a.left,b),V(a.right,b),a.constant=a.left.constant&&a.right.constant,a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case s.LogicalExpression:V(a.left,b),V(a.right,b),a.constant=a.left.constant&&a.right.constant,a.toWatch=a.constant?[]:[a];break;case s.ConditionalExpression:V(a.test,b),V(a.alternate,b),V(a.consequent,b),a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant,a.toWatch=a.constant?[]:[a];break;case s.Identifier:a.constant=!1,a.toWatch=[a];break;case s.MemberExpression:V(a.object,b),a.computed&&V(a.property,b),a.constant=a.object.constant&&(!a.computed||a.property.constant),a.toWatch=[a];break;case s.CallExpression:d=!!a.filter&&!b(a.callee.name).$stateful,c=[],q(a.arguments,function(a){V(a,b),d=d&&a.constant,a.constant||c.push.apply(c,a.toWatch)}),a.constant=d,a.toWatch=a.filter&&!b(a.callee.name).$stateful?c:[a];break;case s.AssignmentExpression:V(a.left,b),V(a.right,b),a.constant=a.left.constant&&a.right.constant,a.toWatch=[a];break;case s.ArrayExpression:d=!0,c=[],q(a.elements,function(a){V(a,b),d=d&&a.constant,a.constant||c.push.apply(c,a.toWatch)}),a.constant=d,a.toWatch=c;break;case s.ObjectExpression:d=!0,c=[],q(a.properties,function(a){V(a.value,b),d=d&&a.value.constant&&!a.computed,a.value.constant||c.push.apply(c,a.value.toWatch)}),a.constant=d,a.toWatch=c;break;case s.ThisExpression:a.constant=!1,a.toWatch=[];break;case s.LocalsExpression:a.constant=!1,a.toWatch=[]}}function pd(a){if(1==a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function qd(a){return a.type===s.Identifier||a.type===s.MemberExpression}function rd(a){if(1===a.body.length&&qd(a.body[0].expression))return{type:s.AssignmentExpression,left:a.body[0].expression,right:{type:s.NGValueParameter},operator:"="}}function sd(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===s.Literal||a.body[0].expression.type===s.ArrayExpression||a.body[0].expression.type===s.ObjectExpression)}function td(a,b){this.astBuilder=a,this.$filter=b}function ud(a,b){this.astBuilder=a,this.$filter=b}function Jb(a){return"constructor"==a}function ic(a){return z(a.valueOf)?a.valueOf():ng.call(a)}function uf(){var c,e,a=U(),b=U(),d={true:!0,false:!1,null:null,undefined:void 0};this.addLiteral=function(a,b){d[a]=b},this.setIdentifierFns=function(a,b){return c=a,e=b,this},this.$get=["$filter",function(f){function g(c,d,e){var g,k,H;switch(e=e||J,typeof c){case"string":H=c=c.trim();var E=e?b:a;if(g=E[H],!g){":"===c.charAt(0)&&":"===c.charAt(1)&&(k=!0,c=c.substring(2)),g=e?r:B;var q=new jc(g);g=new kc(q,f,g).parse(c),g.constant?g.$$watchDelegate=p:k?g.$$watchDelegate=g.literal?n:m:g.inputs&&(g.$$watchDelegate=l),e&&(g=h(g)),E[H]=g}return u(g,d);case"function":return u(c,d);default:return u(A,d)}}function h(a){function b(c,d,e,f){var g=J;J=!0;try{return a(c,d,e,f)}finally{J=g}}if(!a)return a;b.$$watchDelegate=a.$$watchDelegate,b.assign=h(a.assign),b.constant=a.constant,b.literal=a.literal;for(var c=0;a.inputs&&c<a.inputs.length;++c)a.inputs[c]=h(a.inputs[c]);return b.inputs=a.inputs,b}function k(a,b){return null==a||null==b?a===b:("object"!=typeof a||(a=ic(a),"object"!=typeof a))&&(a===b||a!==a&&b!==b)}function l(a,b,c,d,e){var g,f=d.inputs;if(1===f.length){var h=k,f=f[0];return a.$watch(function(a){var b=f(a);return k(b,h)||(g=d(a,void 0,void 0,[b]),h=b&&ic(b)),g},b,c,e)}for(var l=[],m=[],p=0,n=f.length;p<n;p++)l[p]=k,m[p]=null;return a.$watch(function(a){for(var b=!1,c=0,e=f.length;c<e;c++){var h=f[c](a);(b||(b=!k(h,l[c])))&&(m[c]=h,l[c]=h&&ic(h))}return b&&(g=d(a,void 0,void 0,m)),g},b,c,e)}function m(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a,z(b)&&b.apply(this,arguments),w(a)&&d.$$postDigest(function(){w(f)&&e()})},c)}function n(a,b,c,d){function e(a){var b=!0;return q(a,function(a){w(a)||(b=!1)}),b}var f,g;return f=a.$watch(function(a){return d(a)},function(a,c,d){g=a,z(b)&&b.call(this,a,c,d),e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function p(a,b,c,d){var e;return e=a.$watch(function(a){return e(),d(a)},b,c)}function u(a,b){if(!b)return a;var c=a.$$watchDelegate,d=!1,c=c!==n&&c!==m?function(c,e,f,g){return f=d&&g?g[0]:a(c,e,f,g),b(f,c,e)}:function(c,d,e,f){return e=a(c,d,e,f),c=b(e,c,d),w(e)?c:e};return a.$$watchDelegate&&a.$$watchDelegate!==l?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=l,d=!a.inputs,c.inputs=a.inputs?a.inputs:[a]),c}var R=Ba().noUnsafeEval,B={csp:R,expensiveChecks:!1,literals:pa(d),isIdentifierStart:z(c)&&c,isIdentifierContinue:z(e)&&e},r={csp:R,expensiveChecks:!0,literals:pa(d),isIdentifierStart:z(c)&&c,isIdentifierContinue:z(e)&&e},J=!1;return g.$$runningExpensiveChecks=function(){return J},g}]}function wf(){this.$get=["$rootScope","$exceptionHandler",function(a,b){return vd(function(b){a.$evalAsync(b)},b)}]}function xf(){this.$get=["$browser","$exceptionHandler",function(a,b){return vd(function(b){a.defer(b)},b)}]}function vd(a,b){function d(){this.$$state={status:0}}function c(a,b){return function(c){b.call(a,c)}}function e(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,a(function(){var a,d,e;e=c.pending,c.processScheduled=!1,c.pending=void 0;for(var f=0,g=e.length;f<g;++f){d=e[f][0],a=e[f][c.status];try{z(a)?d.resolve(a(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),b(h)}}}))}function f(){this.promise=new d}var g=N("$q",TypeError),h=function(){var a=new f;return a.resolve=c(a,a.resolve),
@@ -25,10 +25,10 @@ if(s.encryptedContent){var f="";if(e.util.isArray(s.encryptedContent))for(var l=
tabindex:[Number,null],removeTagSymbol:[String,String.fromCharCode(215)],replaceSpacesWithDashes:[Boolean,!0],minLength:[Number,3],maxLength:[Number,b],addOnEnter:[Boolean,!0],addOnSpace:[Boolean,!1],addOnComma:[Boolean,!0],addOnBlur:[Boolean,!0],addOnPaste:[Boolean,!1],pasteSplitPattern:[RegExp,/,/],allowedTagsPattern:[RegExp,/.+/],enableEditingLastTag:[Boolean,!1],minTags:[Number,0],maxTags:[Number,b],displayProperty:[String,"text"],keyProperty:[String,""],allowLeftoverText:[Boolean,!1],addFromAutocompleteOnly:[Boolean,!1],spellcheck:[Boolean,!0]}),a.tagList=new j(a.options,a.events,i.handleUndefinedResult(a.onTagAdding,!0),i.handleUndefinedResult(a.onTagRemoving,!0)),this.registerAutocomplete=function(){return d.find("input"),{addTag:function(b){return a.tagList.add(b)},getTags:function(){return a.tagList.items},getCurrentTagText:function(){return a.newTag.text()},getOptions:function(){return a.options},getTemplateScope:function(){return a.templateScope},on:function(b,c){return a.events.on(b,c,!0),this}}},this.registerTagItem=function(){return{getOptions:function(){return a.options},removeTag:function(b){a.disabled||a.tagList.remove(b)}}}}],link:function(b,c,g,h){var j,k,l=[a.enter,a.comma,a.space,a.backspace,a.delete,a.left,a.right],m=b.tagList,n=b.events,o=b.options,p=c.find("input"),q=["minTags","maxTags","allowLeftoverText"];j=function(){h.$setValidity("maxTags",m.items.length<=o.maxTags),h.$setValidity("minTags",m.items.length>=o.minTags),h.$setValidity("leftoverText",!(!b.hasFocus&&!o.allowLeftoverText)||!b.newTag.text())},k=function(){d(function(){p[0].focus()})},h.$isEmpty=function(a){return!a||!a.length},b.newTag={text:function(a){return angular.isDefined(a)?(b.text=a,void n.trigger("input-change",a)):b.text||""},invalid:null},b.track=function(a){return a[o.keyProperty||o.displayProperty]},b.getTagClass=function(a,c){var d=a===m.selected;return[b.tagClass({$tag:a,$index:c,$selected:d}),{selected:d}]},b.$watch("tags",function(a){a?(m.items=i.makeObjectArray(a,o.displayProperty),b.tags=m.items):m.items=[]}),b.$watch("tags.length",function(){j(),h.$validate()}),g.$observe("disabled",function(a){b.disabled=a}),b.eventHandlers={input:{keydown:function(a){n.trigger("input-keydown",a)},focus:function(){b.hasFocus||(b.hasFocus=!0,n.trigger("input-focus"))},blur:function(){d(function(){var a=e.prop("activeElement"),d=a===p[0],f=c[0].contains(a);!d&&f||(b.hasFocus=!1,n.trigger("input-blur"))})},paste:function(a){a.getTextData=function(){var b=a.clipboardData||a.originalEvent&&a.originalEvent.clipboardData;return b?b.getData("text/plain"):f.clipboardData.getData("Text")},n.trigger("input-paste",a)}},host:{click:function(){b.disabled||k()}},tag:{click:function(a){n.trigger("tag-clicked",{$tag:a})}}},n.on("tag-added",b.onTagAdded).on("invalid-tag",b.onInvalidTag).on("tag-removed",b.onTagRemoved).on("tag-clicked",b.onTagClicked).on("tag-added",function(){b.newTag.text("")}).on("tag-added tag-removed",function(){b.tags=m.items,h.$setDirty(),k()}).on("invalid-tag",function(){b.newTag.invalid=!0}).on("option-change",function(a){-1!==q.indexOf(a.name)&&j()}).on("input-change",function(){m.clearSelection(),b.newTag.invalid=null}).on("input-focus",function(){c.triggerHandler("focus"),h.$setValidity("leftoverText",!0)}).on("input-blur",function(){o.addOnBlur&&!o.addFromAutocompleteOnly&&m.addText(b.newTag.text()),c.triggerHandler("blur"),j()}).on("input-keydown",function(c){var d,e,f,g,h=c.keyCode,j={};i.isModifierOn(c)||-1===l.indexOf(h)||(j[a.enter]=o.addOnEnter,j[a.comma]=o.addOnComma,j[a.space]=o.addOnSpace,d=!o.addFromAutocompleteOnly&&j[h],e=(h===a.backspace||h===a.delete)&&m.selected,g=h===a.backspace&&0===b.newTag.text().length&&o.enableEditingLastTag,f=(h===a.backspace||h===a.left||h===a.right)&&0===b.newTag.text().length&&!o.enableEditingLastTag,d?m.addText(b.newTag.text()):g?(m.selectPrior(),m.removeSelected().then(function(a){a&&b.newTag.text(a[o.displayProperty])})):e?m.removeSelected():f&&(h===a.left||h===a.backspace?m.selectPrior():h===a.right&&m.selectNext()),(d||f||e||g)&&c.preventDefault())}).on("input-paste",function(a){if(o.addOnPaste){var b=a.getTextData(),c=b.split(o.pasteSplitPattern);c.length>1&&(c.forEach(function(a){m.addText(a)}),a.preventDefault())}})}}}]),d.directive("tiTagItem",["tiUtil",function(a){return{restrict:"E",require:"^tagsInput",template:'<ng-include src="$$template"></ng-include>',scope:{$scope:"=scope",data:"="},link:function(b,c,d,e){var f=e.registerTagItem(),g=f.getOptions();b.$$template=g.template,b.$$removeTagSymbol=g.removeTagSymbol,b.$getDisplayText=function(){return a.safeToString(b.data[g.displayProperty])},b.$removeTag=function(){f.removeTag(b.$index)},b.$watch("$parent.$index",function(a){b.$index=a})}}}]),d.directive("autoComplete",["$document","$timeout","$sce","$q","tagsInputConfig","tiUtil",function(b,c,d,e,f,g){function h(a,b,c){var d,f,h,i={};return h=function(){return b.tagsInput.keyProperty||b.tagsInput.displayProperty},d=function(a,c){return a.filter(function(a){return!g.findInObjectArray(c,a,h(),function(a,c){return b.tagsInput.replaceSpacesWithDashes&&(a=g.replaceSpacesWithDashes(a),c=g.replaceSpacesWithDashes(c)),g.defaultComparer(a,c)})})},i.reset=function(){f=null,i.items=[],i.visible=!1,i.index=-1,i.selected=null,i.query=null},i.show=function(){b.selectFirstMatch?i.select(0):i.selected=null,i.visible=!0},i.load=g.debounce(function(c,j){i.query=c;var k=e.when(a({$query:c}));f=k,k.then(function(a){k===f&&(a=g.makeObjectArray(a.data||a,h()),a=d(a,j),i.items=a.slice(0,b.maxResultsToShow),i.items.length>0?i.show():i.reset())})},b.debounceDelay),i.selectNext=function(){i.select(++i.index)},i.selectPrior=function(){i.select(--i.index)},i.select=function(a){0>a?a=i.items.length-1:a>=i.items.length&&(a=0),i.index=a,i.selected=i.items[a],c.trigger("suggestion-selected",a)},i.reset(),i}function i(a,b){var c=a.find("li").eq(b),d=c.parent(),e=c.prop("offsetTop"),f=c.prop("offsetHeight"),g=d.prop("clientHeight"),h=d.prop("scrollTop");h>e?d.prop("scrollTop",e):e+f>g+h&&d.prop("scrollTop",e+f-g)}return{restrict:"E",require:"^tagsInput",scope:{source:"&",matchClass:"&"},templateUrl:"ngTagsInput/auto-complete.html",controller:["$scope","$element","$attrs",function(a,b,c){a.events=g.simplePubSub(),f.load("autoComplete",a,c,{template:[String,"ngTagsInput/auto-complete-match.html"],debounceDelay:[Number,100],minLength:[Number,3],highlightMatchedText:[Boolean,!0],maxResultsToShow:[Number,10],loadOnDownArrow:[Boolean,!1],loadOnEmpty:[Boolean,!1],loadOnFocus:[Boolean,!1],selectFirstMatch:[Boolean,!0],displayProperty:[String,""]}),a.suggestionList=new h(a.source,a.options,a.events),this.registerAutocompleteMatch=function(){return{getOptions:function(){return a.options},getQuery:function(){return a.suggestionList.query}}}}],link:function(b,c,d,e){var f,h=[a.enter,a.tab,a.escape,a.up,a.down],j=b.suggestionList,k=e.registerAutocomplete(),l=b.options,m=b.events;l.tagsInput=k.getOptions(),f=function(a){return a&&a.length>=l.minLength||!a&&l.loadOnEmpty},b.templateScope=k.getTemplateScope(),b.addSuggestionByIndex=function(a){j.select(a),b.addSuggestion()},b.addSuggestion=function(){var a=!1;return j.selected&&(k.addTag(angular.copy(j.selected)),j.reset(),a=!0),a},b.track=function(a){return a[l.tagsInput.keyProperty||l.tagsInput.displayProperty]},b.getSuggestionClass=function(a,c){var d=a===j.selected;return[b.matchClass({$match:a,$index:c,$selected:d}),{selected:d}]},k.on("tag-added tag-removed invalid-tag input-blur",function(){j.reset()}).on("input-change",function(a){f(a)?j.load(a,k.getTags()):j.reset()}).on("input-focus",function(){var a=k.getCurrentTagText();l.loadOnFocus&&f(a)&&j.load(a,k.getTags())}).on("input-keydown",function(c){var d=c.keyCode,e=!1;if(!g.isModifierOn(c)&&-1!==h.indexOf(d))return j.visible?d===a.down?(j.selectNext(),e=!0):d===a.up?(j.selectPrior(),e=!0):d===a.escape?(j.reset(),e=!0):d!==a.enter&&d!==a.tab||(e=b.addSuggestion()):d===a.down&&b.options.loadOnDownArrow&&(j.load(k.getCurrentTagText(),k.getTags()),e=!0),e?(c.preventDefault(),c.stopImmediatePropagation(),!1):void 0}),m.on("suggestion-selected",function(a){i(c,a)})}}}]),d.directive("tiAutocompleteMatch",["$sce","tiUtil",function(a,b){return{restrict:"E",require:"^autoComplete",template:'<ng-include src="$$template"></ng-include>',scope:{$scope:"=scope",data:"="},link:function(c,d,e,f){var g=f.registerAutocompleteMatch(),h=g.getOptions();c.$$template=h.template,c.$index=c.$parent.$index,c.$highlight=function(c){return h.highlightMatchedText&&(c=b.safeHighlight(c,g.getQuery())),a.trustAsHtml(c)},c.$getDisplayText=function(){return b.safeToString(c.data[h.displayProperty||h.tagsInput.displayProperty])}}}}]),d.directive("tiTranscludeAppend",function(){return function(a,b,c,d,e){e(function(a){b.append(a)})}}),d.directive("tiAutosize",["tagsInputConfig",function(a){return{restrict:"A",require:"ngModel",link:function(b,c,d,e){var f,g,h=a.getTextAutosizeThreshold();f=angular.element('<span class="input"></span>'),f.css("display","none").css("visibility","hidden").css("width","auto").css("white-space","pre"),c.parent().append(f),g=function(a){var b,e=a;return angular.isString(e)&&0===e.length&&(e=d.placeholder),e&&(f.text(e),f.css("display",""),b=f.prop("offsetWidth"),f.css("display","none")),c.css("width",b?b+h+"px":""),a},e.$parsers.unshift(g),e.$formatters.unshift(g),d.$observe("placeholder",function(a){e.$modelValue||g(a)})}}}]),d.directive("tiBindAttrs",function(){return function(a,b,c){a.$watch(c.tiBindAttrs,function(a){angular.forEach(a,function(a,b){c.$set(b,a)})},!0)}}),d.provider("tagsInputConfig",function(){var a={},b={},c=3;this.setDefaults=function(b,c){return a[b]=c,this},this.setActiveInterpolation=function(a,c){return b[a]=c,this},this.setTextAutosizeThreshold=function(a){return c=a,this},this.$get=["$interpolate",function(d){var e={};return e[String]=function(a){return a},e[Number]=function(a){return parseInt(a,10)},e[Boolean]=function(a){return"true"===a.toLowerCase()},e[RegExp]=function(a){return new RegExp(a)},{load:function(c,f,g,h){var i=function(){return!0};f.options={},angular.forEach(h,function(h,j){var k,l,m,n,o,p;k=h[0],l=h[1],m=h[2]||i,n=e[k],o=function(){var b=a[c]&&a[c][j];return angular.isDefined(b)?b:l},p=function(a){f.options[j]=a&&m(a)?n(a):o()},b[c]&&b[c][j]?g.$observe(j,function(a){p(a),f.events.trigger("option-change",{name:j,newValue:a})}):p(g[j]&&d(g[j])(f.$parent))})},getTextAutosizeThreshold:function(){return c}}}]}),d.factory("tiUtil",["$timeout","$q",function(a,b){var c={};return c.debounce=function(b,c){var d;return function(){var e=arguments;a.cancel(d),d=a(function(){b.apply(null,e)},c)}},c.makeObjectArray=function(a,b){if(!angular.isArray(a)||0===a.length||angular.isObject(a[0]))return a;var c=[];return a.forEach(function(a){var d={};d[b]=a,c.push(d)}),c},c.findInObjectArray=function(a,b,d,e){var f=null;return e=e||c.defaultComparer,a.some(function(a){return e(a[d],b[d])?(f=a,!0):void 0}),f},c.defaultComparer=function(a,b){return c.safeToString(a).toLowerCase()===c.safeToString(b).toLowerCase()},c.safeHighlight=function(a,b){function d(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}if(!b)return a;a=c.encodeHTML(a),b=c.encodeHTML(b);var e=new RegExp("&[^;]+;|"+d(b),"gi");return a.replace(e,function(a){return a.toLowerCase()===b.toLowerCase()?"<em>"+a+"</em>":a})},c.safeToString=function(a){return angular.isUndefined(a)||null==a?"":a.toString().trim()},c.encodeHTML=function(a){return c.safeToString(a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")},c.handleUndefinedResult=function(a,b){return function(){var c=a.apply(null,arguments);return angular.isUndefined(c)?b:c}},c.replaceSpacesWithDashes=function(a){return c.safeToString(a).replace(/\s/g,"-")},c.isModifierOn=function(a){return a.shiftKey||a.ctrlKey||a.altKey||a.metaKey},c.promisifyValue=function(a){return a=!!angular.isUndefined(a)||a,b[a?"when":"reject"]()},c.simplePubSub=function(){var a={};return{on:function(b,c,d){return b.split(" ").forEach(function(b){a[b]||(a[b]=[]);var e=d?[].unshift:[].push;e.call(a[b],c)}),this},trigger:function(b,d){var e=a[b]||[];return e.every(function(a){return c.handleUndefinedResult(a,!0)(d)}),this}}},c}]),d.run(["$templateCache",function(a){a.put("ngTagsInput/tags-input.html",'<div class="host" tabindex="-1" ng-click="eventHandlers.host.click()" ti-transclude-append><div class="tags" ng-class="{focused: hasFocus}"><ul class="tag-list"><li use-theme class="tag-item" ng-repeat="tag in tagList.items track by track(tag)" ng-class="getTagClass(tag, $index)" ng-click="eventHandlers.tag.click(tag)"><ti-tag-item scope="templateScope" data="::tag"></ti-tag-item></li></ul><input class="input" autocomplete="off" ng-model="newTag.text" ng-model-options="{getterSetter: true}" ng-keydown="eventHandlers.input.keydown($event)" ng-focus="eventHandlers.input.focus($event)" ng-blur="eventHandlers.input.blur($event)" ng-paste="eventHandlers.input.paste($event)" ng-trim="false" ng-class="{\'invalid-tag\': newTag.invalid}" ng-disabled="disabled" ti-bind-attrs="{type: options.type, placeholder: options.placeholder, tabindex: options.tabindex, spellcheck: options.spellcheck}" ti-autosize></div></div>'),a.put("ngTagsInput/tag-item.html",'<span ng-bind="$getDisplayText()"></span> <a class="remove-button" ng-click="$removeTag()" ng-bind="::$$removeTagSymbol"></a>'),a.put("ngTagsInput/auto-complete.html",'<div class="autocomplete" ng-if="suggestionList.visible"><ul class="suggestion-list"><li class="suggestion-item" ng-repeat="item in suggestionList.items track by track(item)" ng-class="getSuggestionClass(item, $index)" ng-click="addSuggestionByIndex($index)" ng-mouseenter="suggestionList.select($index)"><ti-autocomplete-match scope="templateScope" data="::item"></ti-autocomplete-match></li></ul></div>'),a.put("ngTagsInput/auto-complete-match.html",'<span ng-bind-html="$highlight($getDisplayText())"></span>')}])}(),angular.module("xeditable",[]).value("editableOptions",{theme:"default",icon_set:"default",buttons:"right",blurElem:"cancel",blurForm:"ignore",activate:"focus",isDisabled:!1,activationEvent:"click"}),angular.module("xeditable").directive("editableBsdate",["editableDirectiveFactory",function(a){return a({directiveName:"editableBsdate",inputTpl:"<div></div>",render:function(){this.parent.render.call(this);var a=angular.element('<input type="text" class="form-control" data-ng-model="$parent.$data"/>');a.attr("uib-datepicker-popup",this.attrs.eDatepickerPopupXEditable||"yyyy/MM/dd"),a.attr("is-open",this.attrs.eIsOpen),a.attr("date-disabled",this.attrs.eDateDisabled),a.attr("uib-datepicker-popup",this.attrs.eDatepickerPopup),a.attr("year-range",this.attrs.eYearRange||20),a.attr("show-button-bar",this.attrs.eShowButtonBar||!0),a.attr("current-text",this.attrs.eCurrentText||"Today"),a.attr("clear-text",this.attrs.eClearText||"Clear"),a.attr("close-text",this.attrs.eCloseText||"Done"),a.attr("close-on-date-selection",this.attrs.eCloseOnDateSelection||!0),a.attr("datepicker-append-to-body",this.attrs.eDatePickerAppendToBody||!1),a.attr("date-disabled",this.attrs.eDateDisabled),a.attr("name",this.attrs.eName),a.attr("on-open-focus",this.attrs.eOnOpenFocus||!0),a.attr("ng-readonly",this.attrs.eReadonly||!1),this.attrs.eNgChange&&(a.attr("ng-change",this.attrs.eNgChange),this.inputEl.removeAttr("ng-change")),this.attrs.eStyle&&(a.attr("style",this.attrs.eStyle),this.inputEl.removeAttr("style")),this.scope.dateOptions={formatDay:this.attrs.eFormatDay||"dd",formatMonth:this.attrs.eFormatMonth||"MMMM",formatYear:this.attrs.eFormatYear||"yyyy",formatDayHeader:this.attrs.eFormatDayHeader||"EEE",formatDayTitle:this.attrs.eFormatDayTitle||"MMMM yyyy",formatMonthTitle:this.attrs.eFormatMonthTitle||"yyyy",showWeeks:!this.attrs.eShowWeeks||"true"===this.attrs.eShowWeeks.toLowerCase(),startingDay:this.attrs.eStartingDay||0,minMode:this.attrs.eMinMode||"day",maxMode:this.attrs.eMaxMode||"year",initDate:this.scope.$eval(this.attrs.eInitDate)||new Date,datepickerMode:this.attrs.eDatepickerMode||"day",maxDate:this.scope.$eval(this.attrs.eMaxDate)||null,minDate:this.scope.$eval(this.attrs.eMinDate)||null};var b=angular.isDefined(this.attrs.eShowCalendarButton)?this.attrs.eShowCalendarButton:"true";if("true"===b){var c=angular.element('<button type="button" class="btn btn-default"><i class="glyphicon glyphicon-calendar"></i></button>'),d=angular.element('<span class="input-group-btn"></span>');c.attr("ng-click",this.attrs.eNgClick),d.append(c),this.inputEl.append(d)}else a.attr("ng-click",this.attrs.eNgClick);a.attr("datepicker-options","dateOptions"),this.inputEl.prepend(a),this.inputEl.removeAttr("class"),this.inputEl.removeAttr("ng-click"),this.inputEl.removeAttr("is-open"),this.inputEl.removeAttr("init-date"),this.inputEl.removeAttr("datepicker-popup"),this.inputEl.removeAttr("required"),this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("date-picker-append-to-body"),this.inputEl.removeAttr("name"),this.inputEl.attr("class","input-group")}})}]),angular.module("xeditable").directive("editableBstime",["editableDirectiveFactory",function(a){return a({directiveName:"editableBstime",inputTpl:"<uib-timepicker></uib-timepicker>",render:function(){this.parent.render.call(this);var a=angular.element('<div class="well well-small" style="display:inline-block;"></div>');a.attr("ng-model",this.inputEl.attr("ng-model")),this.inputEl.removeAttr("ng-model"),this.attrs.eNgChange&&(a.attr("ng-change",this.inputEl.attr("ng-change")),this.inputEl.removeAttr("ng-change")),this.inputEl.wrap(a)}})}]),angular.module("xeditable").directive("editableCheckbox",["editableDirectiveFactory",function(a){return a({directiveName:"editableCheckbox",inputTpl:'<input type="checkbox">',render:function(){this.parent.render.call(this),this.attrs.eTitle&&(this.inputEl.wrap("<label></label>"),this.inputEl.parent().append("<span>"+this.attrs.eTitle+"</span>"))},autosubmit:function(){var a=this;a.inputEl.bind("change",function(){setTimeout(function(){a.scope.$apply(function(){a.scope.$form.$submit()})},500)})}})}]),angular.module("xeditable").directive("editableChecklist",["editableDirectiveFactory","editableNgOptionsParser",function(a,b){return a({directiveName:"editableChecklist",inputTpl:"<span></span>",useCopy:!0,render:function(){this.parent.render.call(this);var a=b(this.attrs.eNgOptions),c='<label ng-repeat="'+a.ngRepeat+'"><input type="checkbox" checklist-model="$parent.$parent.$data" checklist-value="'+a.locals.valueFn+'"><span ng-bind="'+a.locals.displayFn+'"></span></label>';this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("ng-options"),this.inputEl.html(c)}})}]),angular.module("xeditable").directive("editableCombodate",["editableDirectiveFactory","editableCombodate",function(a,b){return a({directiveName:"editableCombodate",inputTpl:'<input type="text">',render:function(){this.parent.render.call(this);var a={value:new Date(this.scope.$data)},c=this;angular.forEach(["format","template","minYear","maxYear","yearDescending","minuteStep","secondStep","firstItem","errorClass","customClass","roundTime","smartDays"],function(b){var d="e"+b.charAt(0).toUpperCase()+b.slice(1);d in c.attrs&&(a[b]=c.attrs[d])});var d=b.getInstance(this.inputEl,a);d.$widget.find("select").bind("change",function(a){c.scope.$data=new Date(d.getValue()).toISOString()})}})}]),function(){var a=function(a){return a.toLowerCase().replace(/-(.)/g,function(a,b){return b.toUpperCase()})},b="text|password|email|tel|number|url|search|color|date|datetime|datetime-local|time|month|week|file".split("|");angular.forEach(b,function(b){var c=a("editable-"+b);angular.module("xeditable").directive(c,["editableDirectiveFactory",function(a){return a({directiveName:c,inputTpl:'<input type="'+b+'">',render:function(){if(this.parent.render.call(this),this.attrs.eLabel){var a=angular.element("<label>"+this.attrs.eLabel+"</label>");this.inputEl.parent().prepend(a)}this.attrs.eFormclass&&this.editorEl.addClass(this.attrs.eFormclass)}})}])}),angular.module("xeditable").directive("editableRange",["editableDirectiveFactory",function(a){return a({directiveName:"editableRange",inputTpl:'<input type="range" id="range" name="range">',render:function(){this.parent.render.call(this),this.inputEl.after("<output>{{$data}}</output>")}})}])}(),angular.module("xeditable").directive("editableTagsInput",["editableDirectiveFactory","editableUtils",function(a,b){var c=function(a){for(var b=0,c=d.length;c>b;b++)if(d[b].name===a)return b},d=[],e=a({directiveName:"editableTagsInput",inputTpl:"<tags-input></tags-input>",render:function(){var a=c(this.name);this.parent.render.call(this),this.inputEl.append(b.rename("auto-complete",d[a].element)),this.inputEl.removeAttr("ng-model"),this.inputEl.attr("ng-model","$parent.$data")}}),f=e.link;return e.link=function(a,b,c,e){var g=b.find("editable-tags-input-auto-complete");return d.push({name:c.name||c.editableTagsInput,element:g.clone()}),g.remove(),f(a,b,c,e)},e}]),angular.module("xeditable").directive("editableRadiolist",["editableDirectiveFactory","editableNgOptionsParser",function(a,b){return a({directiveName:"editableRadiolist",inputTpl:"<span></span>",render:function(){this.parent.render.call(this);var a=b(this.attrs.eNgOptions),c='<label data-ng-repeat="'+a.ngRepeat+'"><input type="radio" data-ng-disabled="::'+this.attrs.eNgDisabled+'" data-ng-model="$parent.$parent.$data" value="{{::'+a.locals.valueFn+'}}"><span data-ng-bind="::'+a.locals.displayFn+'"></span></label>';this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("ng-options"),this.inputEl.html(c)},autosubmit:function(){var a=this;a.inputEl.bind("change",function(){setTimeout(function(){a.scope.$apply(function(){a.scope.$form.$submit()})},500)})}})}]),angular.module("xeditable").directive("editableSelect",["editableDirectiveFactory",function(a){return a({directiveName:"editableSelect",inputTpl:"<select></select>",render:function(){if(this.parent.render.call(this),this.attrs.ePlaceholder){var a=angular.element('<option value="">'+this.attrs.ePlaceholder+"</option>");this.inputEl.append(a)}},autosubmit:function(){var a=this;a.inputEl.bind("change",function(){a.scope.$apply(function(){a.scope.$form.$submit()})})}})}]),angular.module("xeditable").directive("editableTextarea",["editableDirectiveFactory",function(a){return a({directiveName:"editableTextarea",inputTpl:"<textarea></textarea>",addListeners:function(){var a=this;a.parent.addListeners.call(a),a.single&&"no"!==a.buttons&&a.autosubmit()},autosubmit:function(){var a=this;a.inputEl.bind("keydown",function(b){(b.ctrlKey||b.metaKey)&&13===b.keyCode&&a.scope.$apply(function(){a.scope.$form.$submit()})})}})}]),angular.module("xeditable").directive("editableUiSelect",["editableDirectiveFactory","editableUtils",function(a,b){var c=function(a){for(var b=0,c=d.length;c>b;b++)if(d[b].name===a)return b},d=[],e=[],f=a({directiveName:"editableUiSelect",inputTpl:"<ui-select></ui-select>",render:function(){var a=c(this.name);this.parent.render.call(this),this.inputEl.append(b.rename("ui-select-match",d[a].element)),this.inputEl.append(b.rename("ui-select-choices",e[a].element)),this.inputEl.removeAttr("ng-model"),this.inputEl.attr("ng-model","$parent.$parent.$data")}}),g=f.link;return f.link=function(a,b,c,f){var h=b.find("editable-ui-select-match"),i=b.find("editable-ui-select-choices");return d.push({name:c.name||c.editableUiSelect,element:h.clone()}),e.push({name:c.name||c.editableUiSelect,element:i.clone()}),h.remove(),i.remove(),g(a,b,c,f)},f}]),angular.module("xeditable").factory("editableController",["$q","editableUtils",function(a,b){function c(a,c,d,e,f,g,h,i,j,k){var l,m,n=this;n.scope=a,n.elem=d,n.attrs=c,n.inputEl=null,n.editorEl=null,n.single=!0,n.error="",n.theme=f[c.editableTheme]||f[h.theme]||f.default,n.parent={},n.icon_set="default"===h.icon_set?g.default[h.theme]:g.external[h.icon_set],n.inputTpl="",n.directiveName="",n.useCopy=!1,n.single=null,n.buttons="right",n.init=function(b){if(n.single=b,n.name=c.eName||c[n.directiveName],!c[n.directiveName])throw"You should provide value for `"+n.directiveName+"` in editable element!";l=e(c[n.directiveName]),n.single?n.buttons=n.attrs.buttons||h.buttons:n.buttons="no",c.eName&&n.scope.$watch("$data",function(a){n.scope.$form.$data[c.eName]=a}),c.onshow&&(n.onshow=function(){return n.catchError(e(c.onshow)(a))}),c.onhide&&(n.onhide=function(){return e(c.onhide)(a)}),c.oncancel&&(n.oncancel=function(){return e(c.oncancel)(a)}),c.onbeforesave&&(n.onbeforesave=function(){return n.catchError(e(c.onbeforesave)(a))}),c.onaftersave&&(n.onaftersave=function(){return n.catchError(e(c.onaftersave)(a))}),a.$parent.$watch(c[n.directiveName],function(a,b){n.setLocalValue(),n.handleEmpty()})},n.render=function(){var a=n.theme;n.inputEl=angular.element(n.inputTpl),n.controlsEl=angular.element(a.controlsTpl),n.controlsEl.append(n.inputEl),"no"!==n.buttons&&(n.buttonsEl=angular.element(a.buttonsTpl),n.submitEl=angular.element(a.submitTpl),n.cancelEl=angular.element(a.cancelTpl),n.icon_set&&(n.submitEl.find("span").addClass(n.icon_set.ok),n.cancelEl.find("span").addClass(n.icon_set.cancel)),n.buttonsEl.append(n.submitEl).append(n.cancelEl),n.controlsEl.append(n.buttonsEl),n.inputEl.addClass("editable-has-buttons")),n.errorEl=angular.element(a.errorTpl),n.controlsEl.append(n.errorEl),n.editorEl=angular.element(n.single?a.formTpl:a.noformTpl),n.editorEl.append(n.controlsEl);for(var d in c.$attr)if(!(d.length<=1)){var e=!1,f=d.substring(1,2);if("e"===d.substring(0,1)&&f===f.toUpperCase()&&(e=d.substring(1),"Form"!==e&&"NgSubmit"!==e)){e=e.substring(0,1).toLowerCase()+b.camelToDash(e.substring(1));var g="value"!==e&&""===c[d]?e:c[d];n.inputEl.attr(e,g)}}n.inputEl.addClass("editable-input"),n.inputEl.attr("ng-model","$parent.$data"),n.editorEl.addClass(b.camelToDash(n.directiveName)),n.single&&(n.editorEl.attr("editable-form","$form"),n.editorEl.attr("blur",n.attrs.blur||("no"===n.buttons?"cancel":h.blurElem))),angular.isFunction(a.postrender)&&a.postrender.call(n)},n.setLocalValue=function(){n.scope.$data=n.useCopy?angular.copy(l(a.$parent)):l(a.$parent)};var o=null;n.show=function(){return n.setLocalValue(),n.render(),d.after(n.editorEl),o=a.$new(),j(n.editorEl)(o),n.addListeners(),d.addClass("editable-hide"),n.onshow()},n.hide=function(){return o.$destroy(),n.controlsEl.remove(),n.editorEl.remove(),d.removeClass("editable-hide"),n.onhide()},n.cancel=function(){n.oncancel()},n.addListeners=function(){n.inputEl.bind("keyup",function(a){if(n.single)switch(a.keyCode){case 27:n.scope.$apply(function(){n.scope.$form.$cancel()})}}),n.single&&"no"===n.buttons&&n.autosubmit(),n.editorEl.bind("click",function(a){a.which&&1!==a.which||n.scope.$form.$visible&&(n.scope.$form._clicked=!0)})},n.setWaiting=function(a){a?(m=!n.inputEl.attr("disabled")&&!n.inputEl.attr("ng-disabled")&&!n.inputEl.attr("ng-enabled"),m&&(n.inputEl.attr("disabled","disabled"),n.buttonsEl&&n.buttonsEl.find("button").attr("disabled","disabled"))):m&&(n.inputEl.removeAttr("disabled"),n.buttonsEl&&n.buttonsEl.find("button").removeAttr("disabled"))},n.activate=function(a,b){setTimeout(function(){var c=n.inputEl[0];"focus"===h.activate&&c.focus&&(a&&(b=b||a,c.onfocus=function(){var c=this;setTimeout(function(){c.setSelectionRange(a,b)})}),c.focus()),"select"===h.activate&&c.select&&c.select()},0)},n.setError=function(b){angular.isObject(b)||(a.$error=b,n.error=b)},n.catchError=function(a,b){return angular.isObject(a)&&b!==!0?k.when(a).then(angular.bind(this,function(a){this.catchError(a,!0)}),angular.bind(this,function(a){this.catchError(a,!0)})):b&&angular.isObject(a)&&a.status&&200!==a.status&&a.data&&angular.isString(a.data)?(this.setError(a.data),a=a.data):angular.isString(a)&&this.setError(a),a},n.save=function(){l.assign(a.$parent,n.useCopy?angular.copy(n.scope.$data):n.scope.$data)},n.handleEmpty=function(){var b=l(a.$parent),c=null===b||void 0===b||""===b||angular.isArray(b)&&0===b.length;d.toggleClass("editable-empty",c)},n.autosubmit=angular.noop,n.onshow=angular.noop,n.onhide=angular.noop,n.oncancel=angular.noop,n.onbeforesave=angular.noop,n.onaftersave=angular.noop}return c.$inject=["$scope","$attrs","$element","$parse","editableThemes","editableIcons","editableOptions","$rootScope","$compile","$q"],c}]),angular.module("xeditable").factory("editableDirectiveFactory",["$parse","$compile","editableThemes","$rootScope","$document","editableController","editableFormController","editableOptions",function(a,b,c,d,e,f,g,h){return function(b){return{restrict:"A",scope:!0,require:[b.directiveName,"?^form"],controller:f,link:function(c,f,i,j){var k,l=j[0],m=!1;if(j[1])k=j[1],m=void 0===i.eSingle;else if(i.eForm){var n=a(i.eForm)(c);if(n)k=n,m=!0;else if(f&&"function"==typeof f.parents&&f.parents().last().find("form[name="+i.eForm+"]").length)k=null,m=!0;else for(var o=0;o<e[0].forms.length;o++)if(e[0].forms[o].name===i.eForm){k=null,m=!0;break}}angular.forEach(b,function(a,b){void 0!==l[b]&&(l.parent[b]=l[b])}),angular.extend(l,b);var p=angular.isDefined(i.editDisabled)?c.$eval(i.editDisabled):h.isDisabled;if(!p)if(l.init(!m),c.$editable=l,f.addClass("editable"),m)if(k){if(c.$form=k,!c.$form.$addEditable)throw"Form with editable elements should have `editable-form` attribute.";c.$form.$addEditable(l)}else d.$$editableBuffer=d.$$editableBuffer||{},d.$$editableBuffer[i.eForm]=d.$$editableBuffer[i.eForm]||[],d.$$editableBuffer[i.eForm].push(l),c.$form=null;else c.$form=g(),c.$form.$addEditable(l),i.eForm&&(a(i.eForm).assign||angular.noop)(c.$parent,c.$form),(!i.eForm||i.eClickable)&&(f.addClass("editable-click"),f.bind(h.activationEvent,function(a){a.preventDefault(),a.editable=l,c.$apply(function(){c.$form.$show()})}))}}}}]),angular.module("xeditable").factory("editableFormController",["$parse","$document","$rootScope","editablePromiseCollection","editableUtils",function(a,b,c,d,e){var f=[],g=function(a,b){if(b==a)return!0;for(var c=b.parentNode;null!==c;){if(c==a)return!0;c=c.parentNode}return!1},h=function(a,b){var c=!0,d=a.$editables;return angular.forEach(d,function(a){var d=a.editorEl[0];g(d,b.target)&&(c=!1)}),c};b.bind("click",function(a){if(!a.which||1===a.which){for(var b=[],d=[],e=0;e<f.length;e++)f[e]._clicked?f[e]._clicked=!1:f[e].$waiting||("cancel"===f[e]._blur&&h(f[e],a)&&b.push(f[e]),"submit"===f[e]._blur&&h(f[e],a)&&d.push(f[e]));(b.length||d.length)&&c.$apply(function(){angular.forEach(b,function(a){a.$cancel()}),angular.forEach(d,function(a){a.$submit()})})}}),c.$on("closeEdit",function(){for(var a=0;a<f.length;a++)f[a].$hide()});var i={$addEditable:function(a){this.$editables.push(a),a.elem.bind("$destroy",angular.bind(this,this.$removeEditable,a)),a.scope.$form||(a.scope.$form=this),this.$visible&&a.catchError(a.show()),a.catchError(a.setWaiting(this.$waiting))},$removeEditable:function(a){for(var b=0;b<this.$editables.length;b++)if(this.$editables[b]===a)return void this.$editables.splice(b,1)},$show:function(){if(!this.$visible){this.$visible=!0;var a=d();a.when(this.$onshow()),this.$setError(null,""),angular.forEach(this.$editables,function(b){a.when(b.show())}),a.then({onWait:angular.bind(this,this.$setWaiting),onTrue:angular.bind(this,this.$activate),onFalse:angular.bind(this,this.$activate),onString:angular.bind(this,this.$activate)}),setTimeout(angular.bind(this,function(){this._clicked=!1,-1===e.indexOf(f,this)&&f.push(this)}),0)}},$activate:function(a){var b;if(this.$editables.length){if(angular.isString(a))for(b=0;b<this.$editables.length;b++)if(this.$editables[b].name===a)return void this.$editables[b].activate();for(b=0;b<this.$editables.length;b++)if(this.$editables[b].error)return void this.$editables[b].activate();this.$editables[0].activate(this.$editables[0].elem[0].selectionStart,this.$editables[0].elem[0].selectionEnd)}},$hide:function(){this.$visible&&(this.$visible=!1,this.$onhide(),angular.forEach(this.$editables,function(a){a.hide()}),e.arrayRemove(f,this))},$cancel:function(){this.$visible&&(this.$oncancel(),angular.forEach(this.$editables,function(a){a.cancel();
}),this.$hide())},$setWaiting:function(a){this.$waiting=!!a,angular.forEach(this.$editables,function(b){b.setWaiting(!!a)})},$setError:function(a,b){angular.forEach(this.$editables,function(c){a&&c.name!==a||c.setError(b)})},$submit:function(){function a(a){var b=d();b.when(this.$onbeforesave()),b.then({onWait:angular.bind(this,this.$setWaiting),onTrue:a?angular.bind(this,this.$save):angular.bind(this,this.$hide),onFalse:angular.bind(this,this.$hide),onString:angular.bind(this,this.$activate)})}if(!this.$waiting){this.$setError(null,"");var b=d();angular.forEach(this.$editables,function(a){b.when(a.onbeforesave())}),b.then({onWait:angular.bind(this,this.$setWaiting),onTrue:angular.bind(this,a,!0),onFalse:angular.bind(this,a,!1),onString:angular.bind(this,this.$activate)})}},$save:function(){angular.forEach(this.$editables,function(a){a.save()});var a=d();a.when(this.$onaftersave()),angular.forEach(this.$editables,function(b){a.when(b.onaftersave())}),a.then({onWait:angular.bind(this,this.$setWaiting),onTrue:angular.bind(this,this.$hide),onFalse:angular.bind(this,this.$hide),onString:angular.bind(this,this.$activate)})},$onshow:angular.noop,$oncancel:angular.noop,$onhide:angular.noop,$onbeforesave:angular.noop,$onaftersave:angular.noop};return function(){return angular.extend({$editables:[],$visible:!1,$waiting:!1,$data:{},_clicked:!1,_blur:null},i)}}]),angular.module("xeditable").directive("editableForm",["$rootScope","$parse","editableFormController","editableOptions",function(a,b,c,d){return{restrict:"A",require:["form"],compile:function(){return{pre:function(b,d,e,f){var g,h=f[0];e.editableForm?b[e.editableForm]&&b[e.editableForm].$show?(g=b[e.editableForm],angular.extend(h,g)):(g=c(),b[e.editableForm]=g,angular.extend(g,h)):(g=c(),angular.extend(h,g));var i=a.$$editableBuffer,j=h.$name;j&&i&&i[j]&&(angular.forEach(i[j],function(a){g.$addEditable(a)}),delete i[j])},post:function(a,c,e,f){var g;g=e.editableForm&&a[e.editableForm]&&a[e.editableForm].$show?a[e.editableForm]:f[0],e.onshow&&(g.$onshow=angular.bind(g,b(e.onshow),a)),e.onhide&&(g.$onhide=angular.bind(g,b(e.onhide),a)),e.oncancel&&(g.$oncancel=angular.bind(g,b(e.oncancel),a)),e.shown&&b(e.shown)(a)&&g.$show(),g._blur=e.blur||d.blurForm,e.ngSubmit||e.submit||(e.onbeforesave&&(g.$onbeforesave=function(){return b(e.onbeforesave)(a,{$data:g.$data})}),e.onaftersave&&(g.$onaftersave=function(){return b(e.onaftersave)(a,{$data:g.$data})}),c.bind("submit",function(b){b.preventDefault(),a.$apply(function(){g.$submit()})})),c.bind("click",function(a){a.which&&1!==a.which||g.$visible&&(g._clicked=!0)})}}}}}]),angular.module("xeditable").factory("editablePromiseCollection",["$q",function(a){function b(){return{promises:[],hasFalse:!1,hasString:!1,when:function(b,c){if(b===!1)this.hasFalse=!0;else if(!c&&angular.isObject(b))this.promises.push(a.when(b));else{if(!angular.isString(b))return;this.hasString=!0}},then:function(b){function c(){h.hasString||h.hasFalse?!h.hasString&&h.hasFalse?e():f():d()}b=b||{};var d=b.onTrue||angular.noop,e=b.onFalse||angular.noop,f=b.onString||angular.noop,g=b.onWait||angular.noop,h=this;this.promises.length?(g(!0),a.all(this.promises).then(function(a){g(!1),angular.forEach(a,function(a){h.when(a,!0)}),c()},function(a){g(!1),f()})):c()}}}return b}]),angular.module("xeditable").factory("editableUtils",[function(){return{indexOf:function(a,b){if(a.indexOf)return a.indexOf(b);for(var c=0;c<a.length;c++)if(b===a[c])return c;return-1},arrayRemove:function(a,b){var c=this.indexOf(a,b);return c>=0&&a.splice(c,1),b},camelToDash:function(a){var b=/[A-Z]/g;return a.replace(b,function(a,b){return(b?"-":"")+a.toLowerCase()})},dashToCamel:function(a){var b=/([\:\-\_]+(.))/g,c=/^moz([A-Z])/;return a.replace(b,function(a,b,c,d){return d?c.toUpperCase():c}).replace(c,"Moz$1")},rename:function(a,b){var c=angular.element("<"+a+"/>");c.html(b.html());for(var d=b[0].attributes,e=0;e<d.length;++e)c.attr(d.item(e).nodeName,d.item(e).value);return c}}}]),angular.module("xeditable").factory("editableNgOptionsParser",[function(){function a(a){var c;if(!(c=a.match(b)))throw"ng-options parse error";var d,e=c[2]||c[1],f=c[4]||c[6],g=c[5],h=(c[3]||"",c[2]?c[1]:f),i=c[7],j=c[8],k=j?c[8]:null;return void 0===g?(d=f+" in "+i,void 0!==j&&(d+=" track by "+k)):d="("+g+", "+f+") in "+i,{ngRepeat:d,locals:{valueName:f,keyName:g,valueFn:h,displayFn:e}}}var b=/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/;return a}]),angular.module("xeditable").factory("editableCombodate",[function(){function a(a,b){if(this.$element=angular.element(a),"INPUT"!=this.$element[0].nodeName)throw"Combodate should be applied to INPUT element";var c=(new Date).getFullYear();this.defaults={format:"YYYY-MM-DD HH:mm",template:"D / MMM / YYYY H : mm",value:null,minYear:1970,maxYear:c,yearDescending:!0,minuteStep:5,secondStep:1,firstItem:"empty",errorClass:null,customClass:"",roundTime:!0,smartDays:!0},this.options=angular.extend({},this.defaults,b),this.init()}return a.prototype={constructor:a,init:function(){if(this.map={day:["D","date"],month:["M","month"],year:["Y","year"],hour:["[Hh]","hours"],minute:["m","minutes"],second:["s","seconds"],ampm:["[Aa]",""]},this.$widget=angular.element('<span class="combodate"></span>').html(this.getTemplate()),this.initCombos(),this.options.smartDays){var a=this;this.$widget.find("select").bind("change",function(b){(angular.element(b.target).hasClass("month")||angular.element(b.target).hasClass("year"))&&a.fillCombo("day")})}this.$widget.find("select").css("width","auto"),this.$element.css("display","none").after(this.$widget),this.setValue(this.$element.val()||this.options.value)},getTemplate:function(){var a=this.options.template,b=this.options.customClass;return angular.forEach(this.map,function(b,c){b=b[0];var d=new RegExp(b+"+"),e=b.length>1?b.substring(1,2):b;a=a.replace(d,"{"+e+"}")}),a=a.replace(/ /g,"&nbsp;"),angular.forEach(this.map,function(c,d){c=c[0];var e=c.length>1?c.substring(1,2):c;a=a.replace("{"+e+"}",'<select class="'+d+" "+b+'"></select>')}),a},initCombos:function(){for(var a in this.map){var b=this.$widget[0].querySelectorAll("."+a);this["$"+a]=b.length?angular.element(b):null,this.fillCombo(a)}},fillCombo:function(a){var b=this["$"+a];if(b){var c="fill"+a.charAt(0).toUpperCase()+a.slice(1),d=this[c](),e=b.val();b.html("");for(var f=0;f<d.length;f++)b.append('<option value="'+d[f][0]+'">'+d[f][1]+"</option>");b.val(e)}},fillCommon:function(a){var b,c=[];if("name"===this.options.firstItem){b=moment.relativeTime||moment.langData()._relativeTime;var d="function"==typeof b[a]?b[a](1,!0,a,!1):b[a];d=d.split(" ").reverse()[0],c.push(["",d])}else"empty"===this.options.firstItem&&c.push(["",""]);return c},fillDay:function(){var a,b,c=this.fillCommon("d"),d=-1!==this.options.template.indexOf("DD"),e=31;if(this.options.smartDays&&this.$month&&this.$year){var f=parseInt(this.$month.val(),10),g=parseInt(this.$year.val(),10);isNaN(f)||isNaN(g)||(e=moment([g,f]).daysInMonth())}for(b=1;e>=b;b++)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillMonth:function(){var a,b,c=this.fillCommon("M"),d=-1!==this.options.template.indexOf("MMMM"),e=-1!==this.options.template.indexOf("MMM"),f=-1!==this.options.template.indexOf("MM");for(b=0;11>=b;b++)a=d?moment().date(1).month(b).format("MMMM"):e?moment().date(1).month(b).format("MMM"):f?this.leadZero(b+1):b+1,c.push([b,a]);return c},fillYear:function(){var a,b,c=[],d=-1!==this.options.template.indexOf("YYYY");for(b=this.options.maxYear;b>=this.options.minYear;b--)a=d?b:(b+"").substring(2),c[this.options.yearDescending?"push":"unshift"]([b,a]);return c=this.fillCommon("y").concat(c)},fillHour:function(){var a,b,c=this.fillCommon("h"),d=-1!==this.options.template.indexOf("h"),e=(-1!==this.options.template.indexOf("H"),-1!==this.options.template.toLowerCase().indexOf("hh")),f=d?1:0,g=d?12:23;for(b=f;g>=b;b++)a=e?this.leadZero(b):b,c.push([b,a]);return c},fillMinute:function(){var a,b,c=this.fillCommon("m"),d=-1!==this.options.template.indexOf("mm");for(b=0;59>=b;b+=this.options.minuteStep)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillSecond:function(){var a,b,c=this.fillCommon("s"),d=-1!==this.options.template.indexOf("ss");for(b=0;59>=b;b+=this.options.secondStep)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillAmpm:function(){var a=-1!==this.options.template.indexOf("a"),b=(-1!==this.options.template.indexOf("A"),[["am",a?"am":"AM"],["pm",a?"pm":"PM"]]);return b},getValue:function(a){var b,c={},d=this,e=!1;return angular.forEach(this.map,function(a,b){if("ampm"!==b){var f="day"===b?1:0;return c[b]=d["$"+b]?parseInt(d["$"+b].val(),10):f,isNaN(c[b])?(e=!0,!1):void 0}}),e?"":(this.$ampm&&(12===c.hour?c.hour="am"===this.$ampm.val()?0:12:c.hour="am"===this.$ampm.val()?c.hour:c.hour+12),b=moment([c.year,c.month,c.day,c.hour,c.minute,c.second]),this.highlight(b),a=void 0===a?this.options.format:a,null===a?b.isValid()?b:null:b.isValid()?b.format(a):"")},setValue:function(a){function b(a,b){var c={};return angular.forEach(a.children("option"),function(a,d){var e=angular.element(a).attr("value");if(""!==e){var f=Math.abs(e-b);("undefined"==typeof c.distance||f<c.distance)&&(c={value:e,distance:f})}}),c.value}if(a){var c="string"==typeof a?moment(a,this.options.format,!0):moment(a),d=this,e={};c.isValid()&&(angular.forEach(this.map,function(a,b){"ampm"!==b&&(e[b]=c[a[1]]())}),this.$ampm&&(e.hour>=12?(e.ampm="pm",e.hour>12&&(e.hour-=12)):(e.ampm="am",0===e.hour&&(e.hour=12))),angular.forEach(e,function(a,c){d["$"+c]&&("minute"===c&&d.options.minuteStep>1&&d.options.roundTime&&(a=b(d["$"+c],a)),"second"===c&&d.options.secondStep>1&&d.options.roundTime&&(a=b(d["$"+c],a)),d["$"+c].val(a))}),this.options.smartDays&&this.fillCombo("day"),this.$element.val(c.format(this.options.format)).triggerHandler("change"))}},highlight:function(a){a.isValid()?this.options.errorClass?this.$widget.removeClass(this.options.errorClass):this.$widget.find("select").css("border-color",this.borderColor):this.options.errorClass?this.$widget.addClass(this.options.errorClass):(this.borderColor||(this.borderColor=this.$widget.find("select").css("border-color")),this.$widget.find("select").css("border-color","red"))},leadZero:function(a){return 9>=a?"0"+a:a},destroy:function(){this.$widget.remove(),this.$element.removeData("combodate").show()}},{getInstance:function(b,c){return new a(b,c)}}}]),angular.module("xeditable").factory("editableIcons",function(){var a={default:{bs2:{ok:"icon-ok icon-white",cancel:"icon-remove"},bs3:{ok:"glyphicon glyphicon-ok",cancel:"glyphicon glyphicon-remove"}},external:{"font-awesome":{ok:"fa fa-check",cancel:"fa fa-times"}}};return a}),angular.module("xeditable").factory("editableThemes",function(){var a={default:{formTpl:'<form class="editable-wrap"></form>',noformTpl:'<span class="editable-wrap"></span>',controlsTpl:'<span class="editable-controls"></span>',inputTpl:"",errorTpl:'<div class="editable-error" data-ng-if="$error" data-ng-bind="$error"></div>',buttonsTpl:'<span class="editable-buttons"></span>',submitTpl:'<button type="submit">save</button>',cancelTpl:'<button type="button" ng-click="$form.$cancel()">cancel</button>'},bs2:{formTpl:'<form class="form-inline editable-wrap" role="form"></form>',noformTpl:'<span class="editable-wrap"></span>',controlsTpl:'<div class="editable-controls controls control-group" ng-class="{\'error\': $error}"></div>',inputTpl:"",errorTpl:'<div class="editable-error help-block" data-ng-if="$error" data-ng-bind="$error"></div>',buttonsTpl:'<span class="editable-buttons"></span>',submitTpl:'<button type="submit" class="btn btn-primary"><span></span></button>',cancelTpl:'<button type="button" class="btn" ng-click="$form.$cancel()"><span></span></button>'},bs3:{formTpl:'<form class="form-inline editable-wrap" role="form"></form>',noformTpl:'<span class="editable-wrap"></span>',controlsTpl:'<div class="editable-controls form-group" ng-class="{\'has-error\': $error}"></div>',inputTpl:"",errorTpl:'<div class="editable-error help-block" data-ng-if="$error" data-ng-bind="$error"></div>',buttonsTpl:'<span class="editable-buttons"></span>',submitTpl:'<button type="submit" class="btn btn-primary"><span></span></button>',cancelTpl:'<button type="button" class="btn btn-default" ng-click="$form.$cancel()"><span></span></button>',buttonsClass:"",inputClass:"",postrender:function(){switch(this.directiveName){case"editableText":case"editableSelect":case"editableTextarea":case"editableEmail":case"editableTel":case"editableNumber":case"editableUrl":case"editableSearch":case"editableDate":case"editableDatetime":case"editableBsdate":case"editableTime":case"editableMonth":case"editableWeek":case"editablePassword":case"editableDatetimeLocal":if(this.inputEl.addClass("form-control"),this.theme.inputClass){if(this.inputEl.attr("multiple")&&("input-sm"===this.theme.inputClass||"input-lg"===this.theme.inputClass))break;this.inputEl.addClass(this.theme.inputClass)}break;case"editableCheckbox":this.editorEl.addClass("checkbox")}this.buttonsEl&&this.theme.buttonsClass&&this.buttonsEl.find("button").addClass(this.theme.buttonsClass)}},semantic:{formTpl:'<form class="editable-wrap ui form" ng-class="{\'error\': $error}" role="form"></form>',noformTpl:'<span class="editable-wrap"></span>',controlsTpl:'<div class="editable-controls ui fluid input" ng-class="{\'error\': $error}"></div>',inputTpl:"",errorTpl:'<div class="editable-error ui error message" data-ng-if="$error" data-ng-bind="$error"></div>',buttonsTpl:'<span class="mini ui buttons"></span>',submitTpl:'<button type="submit" class="ui primary button"><i class="ui check icon"></i></button>',cancelTpl:'<button type="button" class="ui button" ng-click="$form.$cancel()"><i class="ui cancel icon"></i></button>'}};return a}),function(T){function z(a,c,b){var g=0,f=[0],h="",l=null,h=b||"UTF8";if("UTF8"!==h&&"UTF16"!==h)throw"encoding must be UTF8 or UTF16";if("HEX"===c){if(0!==a.length%2)throw"srcString of HEX type must be in byte increments";l=B(a),g=l.binLen,f=l.value}else if("ASCII"===c||"TEXT"===c)l=J(a,h),g=l.binLen,f=l.value;else{if("B64"!==c)throw"inputFormat must be HEX, TEXT, ASCII, or B64";l=K(a),g=l.binLen,f=l.value}this.getHash=function(a,c,b,h){var p,l=null,d=f.slice(),n=g;if(3===arguments.length?"number"!=typeof b&&(h=b,b=1):2===arguments.length&&(b=1),b!==parseInt(b,10)||1>b)throw"numRounds must a integer >= 1";switch(c){case"HEX":l=L;break;case"B64":l=M;break;default:throw"format must be HEX or B64"}if("SHA-1"===a)for(p=0;p<b;p++)d=y(d,n),n=160;else if("SHA-224"===a)for(p=0;p<b;p++)d=v(d,n,a),n=224;else if("SHA-256"===a)for(p=0;p<b;p++)d=v(d,n,a),n=256;else if("SHA-384"===a)for(p=0;p<b;p++)d=v(d,n,a),n=384;else{if("SHA-512"!==a)throw"Chosen SHA variant is not supported";for(p=0;p<b;p++)d=v(d,n,a),n=512}return l(d,N(h))},this.getHMAC=function(a,b,c,l,s){var d,n,p,m,w=[],x=[];switch(d=null,l){case"HEX":l=L;break;case"B64":l=M;break;default:throw"outputFormat must be HEX or B64"}if("SHA-1"===c)n=64,m=160;else if("SHA-224"===c)n=64,m=224;else if("SHA-256"===c)n=64,m=256;else if("SHA-384"===c)n=128,m=384;else{if("SHA-512"!==c)throw"Chosen SHA variant is not supported";n=128,m=512}if("HEX"===b)d=B(a),p=d.binLen,d=d.value;else if("ASCII"===b||"TEXT"===b)d=J(a,h),p=d.binLen,d=d.value;else{if("B64"!==b)throw"inputFormat must be HEX, TEXT, ASCII, or B64";d=K(a),p=d.binLen,d=d.value}for(a=8*n,b=n/4-1,n<p/8?(d="SHA-1"===c?y(d,p):v(d,p,c),d[b]&=4294967040):n>p/8&&(d[b]&=4294967040),n=0;n<=b;n+=1)w[n]=909522486^d[n],x[n]=1549556828^d[n];return c="SHA-1"===c?y(x.concat(y(w.concat(f),a+g)),a+m):v(x.concat(v(w.concat(f),a+g,c)),a+m,c),l(c,N(s))}}function s(a,c){this.a=a,this.b=c}function J(a,c){var g,l,b=[],f=[],h=0;if("UTF8"===c)for(l=0;l<a.length;l+=1)for(g=a.charCodeAt(l),f=[],2048<g?(f[0]=224|(61440&g)>>>12,f[1]=128|(4032&g)>>>6,f[2]=128|63&g):128<g?(f[0]=192|(1984&g)>>>6,f[1]=128|63&g):f[0]=g,g=0;g<f.length;g+=1)b[h>>>2]|=f[g]<<24-h%4*8,h+=1;else if("UTF16"===c)for(l=0;l<a.length;l+=1)b[h>>>2]|=a.charCodeAt(l)<<16-h%4*8,h+=2;return{value:b,binLen:8*h}}function B(a){var g,f,c=[],b=a.length;if(0!==b%2)throw"String of HEX type must be in byte increments";for(g=0;g<b;g+=2){if(f=parseInt(a.substr(g,2),16),isNaN(f))throw"String of HEX type contains invalid characters";c[g>>>3]|=f<<24-g%8*4}return{value:c,binLen:4*b}}function K(a){var g,f,h,l,r,c=[],b=0;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw"Invalid character in base-64 string";if(g=a.indexOf("="),a=a.replace(/\=/g,""),-1!==g&&g<a.length)throw"Invalid '=' found in base-64 string";for(f=0;f<a.length;f+=4){for(r=a.substr(f,4),h=l=0;h<r.length;h+=1)g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(r[h]),l|=g<<18-6*h;for(h=0;h<r.length-1;h+=1)c[b>>2]|=(l>>>16-8*h&255)<<24-b%4*8,b+=1}return{value:c,binLen:8*b}}function L(a,c){var f,h,b="",g=4*a.length;for(f=0;f<g;f+=1)h=a[f>>>2]>>>8*(3-f%4),b+="0123456789abcdef".charAt(h>>>4&15)+"0123456789abcdef".charAt(15&h);return c.outputUpper?b.toUpperCase():b}function M(a,c){var f,h,l,b="",g=4*a.length;for(f=0;f<g;f+=3)for(l=(a[f>>>2]>>>8*(3-f%4)&255)<<16|(a[f+1>>>2]>>>8*(3-(f+1)%4)&255)<<8|a[f+2>>>2]>>>8*(3-(f+2)%4)&255,h=0;4>h;h+=1)b=8*f+6*h<=32*a.length?b+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>>6*(3-h)&63):b+c.b64Pad;return b}function N(a){var c={outputUpper:!1,b64Pad:"="};try{a.hasOwnProperty("outputUpper")&&(c.outputUpper=a.outputUpper),a.hasOwnProperty("b64Pad")&&(c.b64Pad=a.b64Pad)}catch(b){}if("boolean"!=typeof c.outputUpper)throw"Invalid outputUpper formatting option";if("string"!=typeof c.b64Pad)throw"Invalid b64Pad formatting option";return c}function U(a,c){return a<<c|a>>>32-c}function u(a,c){return a>>>c|a<<32-c}function t(a,c){var b=null,b=new s(a.a,a.b);return b=32>=c?new s(b.a>>>c|b.b<<32-c&4294967295,b.b>>>c|b.a<<32-c&4294967295):new s(b.b>>>c-32|b.a<<64-c&4294967295,b.a>>>c-32|b.b<<64-c&4294967295)}function O(a,c){var b=null;return b=32>=c?new s(a.a>>>c,a.b>>>c|a.a<<32-c&4294967295):new s(0,a.a>>>c-32)}function V(a,c,b){return a^c^b}function P(a,c,b){return a&c^~a&b}function W(a,c,b){return new s(a.a&c.a^~a.a&b.a,a.b&c.b^~a.b&b.b)}function Q(a,c,b){return a&c^a&b^c&b}function X(a,c,b){return new s(a.a&c.a^a.a&b.a^c.a&b.a,a.b&c.b^a.b&b.b^c.b&b.b)}function Y(a){return u(a,2)^u(a,13)^u(a,22)}function Z(a){var c=t(a,28),b=t(a,34);return a=t(a,39),new s(c.a^b.a^a.a,c.b^b.b^a.b)}function $(a){return u(a,6)^u(a,11)^u(a,25)}function aa(a){var c=t(a,14),b=t(a,18);return a=t(a,41),new s(c.a^b.a^a.a,c.b^b.b^a.b)}function ba(a){return u(a,7)^u(a,18)^a>>>3}function ca(a){var c=t(a,1),b=t(a,8);return a=O(a,7),new s(c.a^b.a^a.a,c.b^b.b^a.b)}function da(a){return u(a,17)^u(a,19)^a>>>10}function ea(a){var c=t(a,19),b=t(a,61);return a=O(a,6),new s(c.a^b.a^a.a,c.b^b.b^a.b)}function R(a,c){var b=(65535&a)+(65535&c);return((a>>>16)+(c>>>16)+(b>>>16)&65535)<<16|65535&b}function fa(a,c,b,g){var f=(65535&a)+(65535&c)+(65535&b)+(65535&g);return((a>>>16)+(c>>>16)+(b>>>16)+(g>>>16)+(f>>>16)&65535)<<16|65535&f}function S(a,c,b,g,f){var h=(65535&a)+(65535&c)+(65535&b)+(65535&g)+(65535&f);return((a>>>16)+(c>>>16)+(b>>>16)+(g>>>16)+(f>>>16)+(h>>>16)&65535)<<16|65535&h}function ga(a,c){var b,g,f;return b=(65535&a.b)+(65535&c.b),g=(a.b>>>16)+(c.b>>>16)+(b>>>16),f=(65535&g)<<16|65535&b,b=(65535&a.a)+(65535&c.a)+(g>>>16),g=(a.a>>>16)+(c.a>>>16)+(b>>>16),new s((65535&g)<<16|65535&b,f)}function ha(a,c,b,g){var f,h,l;return f=(65535&a.b)+(65535&c.b)+(65535&b.b)+(65535&g.b),h=(a.b>>>16)+(c.b>>>16)+(b.b>>>16)+(g.b>>>16)+(f>>>16),l=(65535&h)<<16|65535&f,f=(65535&a.a)+(65535&c.a)+(65535&b.a)+(65535&g.a)+(h>>>16),h=(a.a>>>16)+(c.a>>>16)+(b.a>>>16)+(g.a>>>16)+(f>>>16),new s((65535&h)<<16|65535&f,l)}function ia(a,c,b,g,f){var h,l,r;return h=(65535&a.b)+(65535&c.b)+(65535&b.b)+(65535&g.b)+(65535&f.b),l=(a.b>>>16)+(c.b>>>16)+(b.b>>>16)+(g.b>>>16)+(f.b>>>16)+(h>>>16),r=(65535&l)<<16|65535&h,h=(65535&a.a)+(65535&c.a)+(65535&b.a)+(65535&g.a)+(65535&f.a)+(l>>>16),l=(a.a>>>16)+(c.a>>>16)+(b.a>>>16)+(g.a>>>16)+(f.a>>>16)+(h>>>16),new s((65535&l)<<16|65535&h,r)}function y(a,c){var g,f,h,l,r,s,p,m,x,b=[],u=P,t=V,v=Q,d=U,n=R,w=S,q=[1732584193,4023233417,2562383102,271733878,3285377520];for(a[c>>>5]|=128<<24-c%32,a[(c+65>>>9<<4)+15]=c,x=a.length,p=0;p<x;p+=16){for(g=q[0],f=q[1],h=q[2],l=q[3],r=q[4],m=0;80>m;m+=1)b[m]=16>m?a[m+p]:d(b[m-3]^b[m-8]^b[m-14]^b[m-16],1),s=20>m?w(d(g,5),u(f,h,l),r,1518500249,b[m]):40>m?w(d(g,5),t(f,h,l),r,1859775393,b[m]):60>m?w(d(g,5),v(f,h,l),r,2400959708,b[m]):w(d(g,5),t(f,h,l),r,3395469782,b[m]),r=l,l=h,h=d(f,30),f=g,g=s;q[0]=n(g,q[0]),q[1]=n(f,q[1]),q[2]=n(h,q[2]),q[3]=n(l,q[3]),q[4]=n(r,q[4])}return q}function v(a,c,b){var g,f,h,l,r,t,u,v,z,d,n,p,m,w,x,q,y,C,D,E,F,G,H,I,e,B,A=[],k=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];if(d=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428],f=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],"SHA-224"===b||"SHA-256"===b)n=64,g=(c+65>>>9<<4)+15,w=16,x=1,e=Number,q=R,y=fa,C=S,D=ba,E=da,F=Y,G=$,I=Q,H=P,d="SHA-224"===b?d:f;else{if("SHA-384"!==b&&"SHA-512"!==b)throw"Unexpected error in SHA-2 implementation";n=80,g=(c+128>>>10<<5)+31,w=32,x=2,e=s,q=ga,y=ha,C=ia,D=ca,E=ea,F=Z,G=aa,I=X,H=W,k=[new e(k[0],3609767458),new e(k[1],602891725),new e(k[2],3964484399),new e(k[3],2173295548),new e(k[4],4081628472),new e(k[5],3053834265),new e(k[6],2937671579),new e(k[7],3664609560),new e(k[8],2734883394),new e(k[9],1164996542),new e(k[10],1323610764),new e(k[11],3590304994),new e(k[12],4068182383),new e(k[13],991336113),new e(k[14],633803317),new e(k[15],3479774868),new e(k[16],2666613458),new e(k[17],944711139),new e(k[18],2341262773),new e(k[19],2007800933),new e(k[20],1495990901),new e(k[21],1856431235),new e(k[22],3175218132),new e(k[23],2198950837),new e(k[24],3999719339),new e(k[25],766784016),new e(k[26],2566594879),new e(k[27],3203337956),new e(k[28],1034457026),new e(k[29],2466948901),new e(k[30],3758326383),new e(k[31],168717936),new e(k[32],1188179964),new e(k[33],1546045734),new e(k[34],1522805485),new e(k[35],2643833823),new e(k[36],2343527390),new e(k[37],1014477480),new e(k[38],1206759142),new e(k[39],344077627),new e(k[40],1290863460),new e(k[41],3158454273),new e(k[42],3505952657),new e(k[43],106217008),new e(k[44],3606008344),new e(k[45],1432725776),new e(k[46],1467031594),new e(k[47],851169720),new e(k[48],3100823752),new e(k[49],1363258195),new e(k[50],3750685593),new e(k[51],3785050280),new e(k[52],3318307427),new e(k[53],3812723403),new e(k[54],2003034995),new e(k[55],3602036899),new e(k[56],1575990012),new e(k[57],1125592928),new e(k[58],2716904306),new e(k[59],442776044),new e(k[60],593698344),new e(k[61],3733110249),new e(k[62],2999351573),new e(k[63],3815920427),new e(3391569614,3928383900),new e(3515267271,566280711),new e(3940187606,3454069534),new e(4118630271,4000239992),new e(116418474,1914138554),new e(174292421,2731055270),new e(289380356,3203993006),new e(460393269,320620315),new e(685471733,587496836),new e(852142971,1086792851),new e(1017036298,365543100),new e(1126000580,2618297676),new e(1288033470,3409855158),new e(1501505948,4234509866),new e(1607167915,987167468),new e(1816402316,1246189591)],d="SHA-384"===b?[new e(3418070365,d[0]),new e(1654270250,d[1]),new e(2438529370,d[2]),new e(355462360,d[3]),new e(1731405415,d[4]),new e(41048885895,d[5]),new e(3675008525,d[6]),new e(1203062813,d[7])]:[new e(f[0],4089235720),new e(f[1],2227873595),new e(f[2],4271175723),new e(f[3],1595750129),new e(f[4],2917565137),new e(f[5],725511199),new e(f[6],4215389547),new e(f[7],327033209)]}for(a[c>>>5]|=128<<24-c%32,a[g]=c,B=a.length,p=0;p<B;p+=w){for(c=d[0],g=d[1],f=d[2],h=d[3],l=d[4],r=d[5],t=d[6],u=d[7],m=0;m<n;m+=1)A[m]=16>m?new e(a[m*x+p],a[m*x+p+1]):y(E(A[m-2]),A[m-7],D(A[m-15]),A[m-16]),v=C(u,G(l),H(l,r,t),k[m],A[m]),z=q(F(c),I(c,g,f)),u=t,t=r,r=l,l=q(h,v),h=f,f=g,g=c,c=q(v,z);d[0]=q(c,d[0]),d[1]=q(g,d[1]),d[2]=q(f,d[2]),d[3]=q(h,d[3]),d[4]=q(l,d[4]),d[5]=q(r,d[5]),d[6]=q(t,d[6]),d[7]=q(u,d[7])}if("SHA-224"===b)a=[d[0],d[1],d[2],d[3],d[4],d[5],d[6]];else if("SHA-256"===b)a=d;else if("SHA-384"===b)a=[d[0].a,d[0].b,d[1].a,d[1].b,d[2].a,d[2].b,d[3].a,d[3].b,d[4].a,d[4].b,d[5].a,d[5].b];else{if("SHA-512"!==b)throw"Unexpected error in SHA-2 implementation";a=[d[0].a,d[0].b,d[1].a,d[1].b,d[2].a,d[2].b,d[3].a,d[3].b,d[4].a,d[4].b,d[5].a,d[5].b,d[6].a,d[6].b,d[7].a,d[7].b]}return a}"function"!=typeof define||(define.amd,0)?"undefined"!=typeof exports?"undefined"!=typeof module&&module.exports?module.exports=exports=z:exports=z:T.jsSHA=z:define(function(){return z})}(this),_aa={},_aa._ab=function(f,e){for(var d=qrcode.width,b=qrcode.height,c=!0,g=0;g<e.Length&&c;g+=2){var a=Math.floor(e[g]),h=Math.floor(e[g+1]);if(a<-1||a>d||h<-1||h>b)throw"Error._ab ";c=!1,a==-1?(e[g]=0,c=!0):a==d&&(e[g]=d-1,c=!0),h==-1?(e[g+1]=0,c=!0):h==b&&(e[g+1]=b-1,c=!0)}c=!0;for(var g=e.Length-2;g>=0&&c;g-=2){var a=Math.floor(e[g]),h=Math.floor(e[g+1]);if(a<-1||a>d||h<-1||h>b)throw"Error._ab ";c=!1,a==-1?(e[g]=0,c=!0):a==d&&(e[g]=d-1,c=!0),h==-1?(e[g+1]=0,c=!0):h==b&&(e[g+1]=b-1,c=!0)}},_aa._af=function(b,d,a){for(var l=new _ac(d),k=new Array(d<<1),g=0;g<d;g++){for(var h=k.length,j=g+.5,i=0;i<h;i+=2)k[i]=(i>>1)+.5,k[i+1]=j;a._ad(k),_aa._ab(b,k);try{for(var i=0;i<h;i+=2){var e=4*Math.floor(k[i])+Math.floor(k[i+1])*qrcode.width*4,f=b[Math.floor(k[i])+qrcode.width*Math.floor(k[i+1])];qrcode.imagedata.data[e]=f?255:0,qrcode.imagedata.data[e+1]=f?255:0,qrcode.imagedata.data[e+2]=0,qrcode.imagedata.data[e+3]=255,f&&l._dq(i>>1,g)}}catch(c){throw"Error._ab"}}return l},_aa._ah=function(h,o,l,k,r,q,b,a,f,e,n,m,t,s,d,c,j,i){var g=_ae._ag(l,k,r,q,b,a,f,e,n,m,t,s,d,c,j,i);return _aa._af(h,o,g)},_a3._bv=new Array(31892,34236,39577,42195,48118,51042,55367,58893,63784,68472,70749,76311,79154,84390,87683,92361,96236,102084,102881,110507,110734,117786,119615,126325,127568,133589,136944,141498,145311,150283,152622,158308,161089,167017),_a3.VERSIONS=_ay(),_a3._av=function(a){if(a<1||a>40)throw"bad arguments";return _a3.VERSIONS[a-1]},_a3._at=function(b){if(b%4!=1)throw"Error _at";try{return _a3._av(b-17>>2)}catch(a){throw"Error _av"}},_a3._aw=function(d){for(var b=4294967295,f=0,c=0;c<_a3._bv.length;c++){var a=_a3._bv[c];if(a==d)return this._av(c+7);var e=_ax._gj(d,a);e<b&&(f=c+7,b=e)}return b<=3?this._av(f):null},_ae._ag=function(q,e,o,d,n,c,m,b,h,r,l,f,a,j,i,s){var g=this._be(q,e,o,d,n,c,m,b),k=this._bf(h,r,l,f,a,j,i,s);return k.times(g)},_ae._bf=function(f,h,d,g,b,e,a,c){return dy2=c-e,dy3=h-g+e-c,0==dy2&&0==dy3?new _ae(d-f,b-d,f,g-h,e-g,h,0,0,1):(dx1=d-b,dx2=a-b,dx3=f-d+b-a,dy1=g-e,_dr=dx1*dy2-dx2*dy1,a13=(dx3*dy2-dx2*dy3)/_dr,a23=(dx1*dy3-dx3*dy1)/_dr,new _ae(d-f+a13*d,a-f+a23*a,f,g-h+a13*g,c-h+a23*c,h,a13,a23,1))},_ae._be=function(f,h,d,g,b,e,a,c){return this._bf(f,h,d,g,b,e,a,c)._fr()};var _ca=21522,_cb=new Array(new Array(21522,0),new Array(20773,1),new Array(24188,2),new Array(23371,3),new Array(17913,4),new Array(16590,5),new Array(20375,6),new Array(19104,7),new Array(30660,8),new Array(29427,9),new Array(32170,10),new Array(30877,11),new Array(26159,12),new Array(25368,13),new Array(27713,14),new Array(26998,15),new Array(5769,16),new Array(5054,17),new Array(7399,18),new Array(6608,19),new Array(1890,20),new Array(597,21),new Array(3340,22),new Array(2107,23),new Array(13663,24),new Array(12392,25),new Array(16177,26),new Array(14854,27),new Array(9396,28),new Array(8579,29),new Array(11994,30),new Array(11245,31)),_ch=new Array(0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4);_ax._gj=function(d,c){return d^=c,_ch[15&d]+_ch[15&_ew(d,4)]+_ch[15&_ew(d,8)]+_ch[15&_ew(d,12)]+_ch[15&_ew(d,16)]+_ch[15&_ew(d,20)]+_ch[15&_ew(d,24)]+_ch[15&_ew(d,28)]},_ax._ci=function(a){var b=_ax._cj(a);return null!=b?b:_ax._cj(a^_ca)},_ax._cj=function(d){for(var b=4294967295,a=0,c=0;c<_cb.length;c++){var g=_cb[c],f=g[0];if(f==d)return new _ax(g[1]);var e=this._gj(d,f);e<b&&(a=g[1],b=e)}return b<=3?new _ax(a):null},_cg.forBits=function(a){if(a<0||a>=FOR_BITS.Length)throw"bad arguments";return FOR_BITS[a]};var L=new _cg(0,1,"L"),M=new _cg(1,0,"M"),Q=new _cg(2,3,"Q"),H=new _cg(3,2,"H"),FOR_BITS=new Array(M,L,H,Q);_dl._gn=function(c,h,s){if(c.length!=h._dp)throw"bad arguments";for(var k=h._bu(s),e=0,d=k._fb(),r=0;r<d.length;r++)e+=d[r].Count;for(var l=new Array(e),n=0,o=0;o<d.length;o++)for(var f=d[o],r=0;r<f.Count;r++){var m=f._dm,t=k._bo+m;l[n++]=new _dl(m,new Array(t))}for(var u=l[0]._dw.length,b=l.length-1;b>=0;){var w=l[b]._dw.length;if(w==u)break;b--}b++;for(var g=u-k._bo,a=0,r=0;r<g;r++)for(var o=0;o<n;o++)l[o]._dw[r]=c[a++];for(var o=b;o<n;o++)l[o]._dw[g]=c[a++];for(var q=l[0]._dw.length,r=g;r<q;r++)for(var o=0;o<n;o++){var v=o<b?r:r+1;l[o]._dw[v]=c[a++]}return l},_dx={},_dx._gl=function(a){if(a<0||a>7)throw"bad arguments";return _dx._dy[a]},_dx._dy=new Array(new _fg,new _fh,new _fi,new _fj,new _fk,new _fl,new _fm,new _fn),_az._bb=new _az(285),_az._bc=new _az(301),_az._bd=function(d,c){return d^c},Decoder={},Decoder.rsDecoder=new _db(_az._bb),Decoder.correctErrors=function(g,b){for(var d=g.length,f=new Array(d),e=0;e<d;e++)f[e]=255&g[e];var a=g.length-b;try{Decoder.rsDecoder.decode(f,a)}catch(c){throw c}for(var e=0;e<b;e++)g[e]=f[e]},Decoder.decode=function(r){for(var b=new _cl(r),o=b._cq(),c=b._cm()._cg,q=b._gk(),a=_dl._gn(q,o,c),f=0,k=0;k<a.Length;k++)f+=a[k]._du;for(var e=new Array(f),n=0,h=0;h<a.length;h++){var m=a[h],d=m.Codewords,g=m._du;Decoder.correctErrors(d,g);for(var k=0;k<g;k++)e[n++]=d[k]}var l=new QRCodeDataBlockReader(e,o._fd,c.Bits);return l},qrcode={},qrcode.imagedata=null,qrcode.width=0,qrcode.height=0,qrcode.qrCodeSymbol=null,qrcode.debug=!1,qrcode._eo=[[10,9,8,8],[12,11,16,10],[14,13,16,12]],qrcode.callback=null,qrcode.decode=function(d){if(0==arguments.length){var b=document.getElementById("qr-canvas"),a=b.getContext("2d");return qrcode.width=b.width,qrcode.height=b.height,qrcode.imagedata=a.getImageData(0,0,qrcode.width,qrcode.height),qrcode.result=qrcode.process(a),null!=qrcode.callback&&qrcode.callback(qrcode.result),qrcode.result}var c=new Image;c.onload=function(){var i=document.createElement("canvas"),h=i.getContext("2d"),f=document.getElementById("out-canvas");if(null!=f){var g=f.getContext("2d");g.clearRect(0,0,320,240),g.drawImage(c,0,0,320,240)}i.width=c.width,i.height=c.height,h.drawImage(c,0,0),qrcode.width=c.width,qrcode.height=c.height;try{qrcode.imagedata=h.getImageData(0,0,c.width,c.height)}catch(j){return qrcode.result="Cross domain image reading not supported in your browser! Save it to your computer then drag and drop the file!",void(null!=qrcode.callback&&qrcode.callback(qrcode.result))}try{qrcode.result=qrcode.process(h)}catch(j){console.log(j),qrcode.result="error decoding QR Code"}null!=qrcode.callback&&qrcode.callback(qrcode.result)},c.src=d},qrcode.decode_utf8=function(a){return decodeURIComponent(escape(a))},qrcode.process=function(r){var c=((new Date).getTime(),qrcode.grayScaleToBitmap(qrcode.grayscale()));if(qrcode.debug){for(var m=0;m<qrcode.height;m++)for(var n=0;n<qrcode.width;n++){var o=4*n+m*qrcode.width*4;qrcode.imagedata.data[o]=(c[n+m*qrcode.width],0),qrcode.imagedata.data[o+1]=(c[n+m*qrcode.width],0),qrcode.imagedata.data[o+2]=c[n+m*qrcode.width]?255:0}r.putImageData(qrcode.imagedata,0,0)}var h=new Detector(c),q=h.detect();qrcode.debug&&r.putImageData(qrcode.imagedata,0,0);
for(var k=Decoder.decode(q.bits),g=k.DataByte,l="",f=0;f<g.length;f++)for(var e=0;e<g[f].length;e++)l+=String.fromCharCode(g[f][e]);(new Date).getTime();return qrcode.decode_utf8(l)},qrcode.getPixel=function(a,b){if(qrcode.width<a)throw"point error";if(qrcode.height<b)throw"point error";return point=4*a+b*qrcode.width*4,p=(33*qrcode.imagedata.data[point]+34*qrcode.imagedata.data[point+1]+33*qrcode.imagedata.data[point+2])/100,p},qrcode.binarize=function(d){for(var c=new Array(qrcode.width*qrcode.height),e=0;e<qrcode.height;e++)for(var b=0;b<qrcode.width;b++){var a=qrcode.getPixel(b,e);c[b+e*qrcode.width]=a<=d}return c},qrcode._em=function(d){for(var c=4,k=Math.floor(qrcode.width/c),j=Math.floor(qrcode.height/c),f=new Array(c),g=0;g<c;g++){f[g]=new Array(c);for(var e=0;e<c;e++)f[g][e]=new Array(0,0)}for(var o=0;o<c;o++)for(var a=0;a<c;a++){f[a][o][0]=255;for(var l=0;l<j;l++)for(var n=0;n<k;n++){var h=d[k*a+n+(j*o+l)*qrcode.width];h<f[a][o][0]&&(f[a][o][0]=h),h>f[a][o][1]&&(f[a][o][1]=h)}}for(var m=new Array(c),b=0;b<c;b++)m[b]=new Array(c);for(var o=0;o<c;o++)for(var a=0;a<c;a++)m[a][o]=Math.floor((f[a][o][0]+f[a][o][1])/2);return m},qrcode.grayScaleToBitmap=function(f){for(var j=qrcode._em(f),b=j.length,e=Math.floor(qrcode.width/b),d=Math.floor(qrcode.height/b),c=new Array(qrcode.height*qrcode.width),i=0;i<b;i++)for(var a=0;a<b;a++)for(var g=0;g<d;g++)for(var h=0;h<e;h++)c[e*a+h+(d*i+g)*qrcode.width]=f[e*a+h+(d*i+g)*qrcode.width]<j[a][i];return c},qrcode.grayscale=function(){for(var c=new Array(qrcode.width*qrcode.height),d=0;d<qrcode.height;d++)for(var b=0;b<qrcode.width;b++){var a=qrcode.getPixel(b,d);c[b+d*qrcode.width]=a}return c},Array.prototype.remove=function(c,b){var a=this.slice((b||c)+1||this.length);return this.length=c<0?this.length+c:c,this.push.apply(this,a)};var _gf=3,_eh=57,_el=8,_eg=2;qrcode._er=function(c){function b(l,k){return xDiff=l.X-k.X,yDiff=l.Y-k.Y,Math.sqrt(xDiff*xDiff+yDiff*yDiff)}function d(k,o,n){var m=o.x,l=o.y;return(n.x-m)*(k.y-l)-(n.y-l)*(k.x-m)}var a,j,h,i=b(c[0],c[1]),f=b(c[1],c[2]),e=b(c[0],c[2]);if(f>=i&&f>=e?(j=c[0],a=c[1],h=c[2]):e>=f&&e>=i?(j=c[1],a=c[0],h=c[2]):(j=c[2],a=c[0],h=c[1]),d(a,j,h)<0){var g=a;a=h,h=g}c[0]=a,c[1]=j,c[2]=h},angular.module("ui.sortable",[]).value("uiSortableConfig",{items:"> [ng-repeat],> [data-ng-repeat],> [x-ng-repeat]"}).directive("uiSortable",["uiSortableConfig","$timeout","$log",function(uiSortableConfig,$timeout,$log){return{require:"?ngModel",scope:{ngModel:"=",uiSortable:"="},link:function(scope,element,attrs,ngModel){function combineCallbacks(first,second){var firstIsFunc="function"==typeof first,secondIsFunc="function"==typeof second;return firstIsFunc&&secondIsFunc?function(){first.apply(this,arguments),second.apply(this,arguments)}:secondIsFunc?second:first}function getSortableWidgetInstance(element){var data=element.data("ui-sortable");return data&&"object"==typeof data&&"ui-sortable"===data.widgetFullName?data:null}function patchSortableOption(key,value){return callbacks[key]?("stop"===key&&(value=combineCallbacks(value,function(){scope.$apply()}),value=combineCallbacks(value,afterStop)),value=combineCallbacks(callbacks[key],value)):wrappers[key]&&(value=wrappers[key](value)),value||"items"!==key&&"ui-model-items"!==key||(value=uiSortableConfig.items),value}function patchUISortableOptions(newVal,oldVal,sortableWidgetInstance){function addDummyOptionKey(value,key){key in opts||(opts[key]=null)}angular.forEach(callbacks,addDummyOptionKey);var optsDiff=null;if(oldVal){var defaultOptions;angular.forEach(oldVal,function(oldValue,key){if(!(newVal&&key in newVal)){if(key in directiveOpts)return void("ui-floating"===key?opts[key]="auto":opts[key]=patchSortableOption(key,void 0));defaultOptions||(defaultOptions=angular.element.ui.sortable().options);var defaultValue=defaultOptions[key];defaultValue=patchSortableOption(key,defaultValue),optsDiff||(optsDiff={}),optsDiff[key]=defaultValue,opts[key]=defaultValue}})}return angular.forEach(newVal,function(value,key){return key in directiveOpts?("ui-floating"!==key||value!==!1&&value!==!0||!sortableWidgetInstance||(sortableWidgetInstance.floating=value),void(opts[key]=patchSortableOption(key,value))):(value=patchSortableOption(key,value),optsDiff||(optsDiff={}),optsDiff[key]=value,void(opts[key]=value))}),optsDiff}function getPlaceholderElement(element){var placeholder=element.sortable("option","placeholder");if(placeholder&&placeholder.element&&"function"==typeof placeholder.element){var result=placeholder.element();return result=angular.element(result)}return null}function getPlaceholderExcludesludes(element,placeholder){var notCssSelector=opts["ui-model-items"].replace(/[^,]*>/g,""),excludes=element.find('[class="'+placeholder.attr("class")+'"]:not('+notCssSelector+")");return excludes}function hasSortingHelper(element,ui){var helperOption=element.sortable("option","helper");return"clone"===helperOption||"function"==typeof helperOption&&ui.item.sortable.isCustomHelperUsed()}function getSortingHelper(element,ui,savedNodes){var result=null;return hasSortingHelper(element,ui)&&"parent"===element.sortable("option","appendTo")&&(result=savedNodes.last()),result}function isFloating(item){return/left|right/.test(item.css("float"))||/inline|table-cell/.test(item.css("display"))}function getElementScope(elementScopes,element){for(var result=null,i=0;i<elementScopes.length;i++){var x=elementScopes[i];if(x.element[0]===element[0]){result=x.scope;break}}return result}function afterStop(e,ui){ui.item.sortable._destroy()}function getItemIndex(item){return item.parent().find(opts["ui-model-items"]).index(item)}function wireUp(){scope.$watchCollection("ngModel",function(){$timeout(function(){getSortableWidgetInstance(element)&&element.sortable("refresh")},0,!1)}),callbacks.start=function(e,ui){if("auto"===opts["ui-floating"]){var siblings=ui.item.siblings(),sortableWidgetInstance=getSortableWidgetInstance(angular.element(e.target));sortableWidgetInstance.floating=isFloating(siblings)}var index=getItemIndex(ui.item);ui.item.sortable={model:ngModel.$modelValue[index],index:index,source:ui.item.parent(),sourceModel:ngModel.$modelValue,cancel:function(){ui.item.sortable._isCanceled=!0},isCanceled:function(){return ui.item.sortable._isCanceled},isCustomHelperUsed:function(){return!!ui.item.sortable._isCustomHelperUsed},_isCanceled:!1,_isCustomHelperUsed:ui.item.sortable._isCustomHelperUsed,_destroy:function(){angular.forEach(ui.item.sortable,function(value,key){ui.item.sortable[key]=void 0})}}},callbacks.activate=function(e,ui){savedNodes=element.contents();var placeholder=getPlaceholderElement(element);if(placeholder&&placeholder.length){var excludes=getPlaceholderExcludesludes(element,placeholder);savedNodes=savedNodes.not(excludes)}var connectedSortables=ui.item.sortable._connectedSortables||[];connectedSortables.push({element:element,scope:scope}),ui.item.sortable._connectedSortables=connectedSortables},callbacks.update=function(e,ui){if(!ui.item.sortable.received){ui.item.sortable.dropindex=getItemIndex(ui.item);var droptarget=ui.item.parent();ui.item.sortable.droptarget=droptarget;var droptargetScope=getElementScope(ui.item.sortable._connectedSortables,droptarget);ui.item.sortable.droptargetModel=droptargetScope.ngModel,element.sortable("cancel")}var sortingHelper=!ui.item.sortable.received&&getSortingHelper(element,ui,savedNodes);sortingHelper&&sortingHelper.length&&(savedNodes=savedNodes.not(sortingHelper)),savedNodes.appendTo(element),ui.item.sortable.received&&(savedNodes=null),ui.item.sortable.received&&!ui.item.sortable.isCanceled()&&scope.$apply(function(){ngModel.$modelValue.splice(ui.item.sortable.dropindex,0,ui.item.sortable.moved)})},callbacks.stop=function(e,ui){if(!ui.item.sortable.received&&"dropindex"in ui.item.sortable&&!ui.item.sortable.isCanceled())scope.$apply(function(){ngModel.$modelValue.splice(ui.item.sortable.dropindex,0,ngModel.$modelValue.splice(ui.item.sortable.index,1)[0])});else if((!("dropindex"in ui.item.sortable)||ui.item.sortable.isCanceled())&&!angular.equals(element.contents(),savedNodes)){var sortingHelper=getSortingHelper(element,ui,savedNodes);sortingHelper&&sortingHelper.length&&(savedNodes=savedNodes.not(sortingHelper)),savedNodes.appendTo(element)}savedNodes=null},callbacks.receive=function(e,ui){ui.item.sortable.received=!0},callbacks.remove=function(e,ui){"dropindex"in ui.item.sortable||(element.sortable("cancel"),ui.item.sortable.cancel()),ui.item.sortable.isCanceled()||scope.$apply(function(){ui.item.sortable.moved=ngModel.$modelValue.splice(ui.item.sortable.index,1)[0]})},wrappers.helper=function(inner){return inner&&"function"==typeof inner?function(e,item){var oldItemSortable=item.sortable,index=getItemIndex(item);item.sortable={model:ngModel.$modelValue[index],index:index,source:item.parent(),sourceModel:ngModel.$modelValue,_restore:function(){angular.forEach(item.sortable,function(value,key){item.sortable[key]=void 0}),item.sortable=oldItemSortable}};var innerResult=inner.apply(this,arguments);return item.sortable._restore(),item.sortable._isCustomHelperUsed=item!==innerResult,innerResult}:inner},scope.$watchCollection("uiSortable",function(newVal,oldVal){var sortableWidgetInstance=getSortableWidgetInstance(element);if(sortableWidgetInstance){var optsDiff=patchUISortableOptions(newVal,oldVal,sortableWidgetInstance);optsDiff&&element.sortable("option",optsDiff)}},!0),patchUISortableOptions(opts)}function init(){ngModel?wireUp():$log.info("ui.sortable: ngModel not provided!",element),element.sortable(opts)}function initIfEnabled(){return(!scope.uiSortable||!scope.uiSortable.disabled)&&(init(),initIfEnabled.cancelWatcher(),initIfEnabled.cancelWatcher=angular.noop,!0)}var savedNodes,opts={},directiveOpts={"ui-floating":void 0,"ui-model-items":uiSortableConfig.items},callbacks={receive:null,remove:null,start:null,stop:null,update:null},wrappers={helper:null};return angular.extend(opts,directiveOpts,uiSortableConfig,scope.uiSortable),angular.element.fn&&angular.element.fn.jquery?(initIfEnabled.cancelWatcher=angular.noop,void(initIfEnabled()||(initIfEnabled.cancelWatcher=scope.$watch("uiSortable.disabled",initIfEnabled)))):void $log.error("ui.sortable: jQuery should be included before AngularJS!")}}}]),!function(e){function t(t,r){if(r=r||{},r.worker&&S.WORKERS_SUPPORTED){var n=f();return n.userStep=r.step,n.userChunk=r.chunk,n.userComplete=r.complete,n.userError=r.error,r.step=m(r.step),r.chunk=m(r.chunk),r.complete=m(r.complete),r.error=m(r.error),delete r.worker,void n.postMessage({input:t,config:r,workerId:n.id})}var o=null;return"string"==typeof t?o=r.download?new i(r):new a(r):(e.File&&t instanceof File||t instanceof Object)&&(o=new s(r)),o.stream(t)}function r(e,t){function r(){"object"==typeof t&&("string"==typeof t.delimiter&&1==t.delimiter.length&&-1==S.BAD_DELIMITERS.indexOf(t.delimiter)&&(u=t.delimiter),("boolean"==typeof t.quotes||t.quotes instanceof Array)&&(o=t.quotes),"string"==typeof t.newline&&(h=t.newline))}function n(e){if("object"!=typeof e)return[];var t=[];for(var r in e)t.push(r);return t}function i(e,t){var r="";"string"==typeof e&&(e=JSON.parse(e)),"string"==typeof t&&(t=JSON.parse(t));var n=e instanceof Array&&e.length>0,i=!(t[0]instanceof Array);if(n){for(var a=0;a<e.length;a++)a>0&&(r+=u),r+=s(e[a],a);t.length>0&&(r+=h)}for(var o=0;o<t.length;o++){for(var f=n?e.length:t[o].length,c=0;f>c;c++){c>0&&(r+=u);var d=n&&i?e[c]:c;r+=s(t[o][d],c)}o<t.length-1&&(r+=h)}return r}function s(e,t){if("undefined"==typeof e||null===e)return"";e=e.toString().replace(/"/g,'""');var r="boolean"==typeof o&&o||o instanceof Array&&o[t]||a(e,S.BAD_DELIMITERS)||e.indexOf(u)>-1||" "==e.charAt(0)||" "==e.charAt(e.length-1);return r?'"'+e+'"':e}function a(e,t){for(var r=0;r<t.length;r++)if(e.indexOf(t[r])>-1)return!0;return!1}var o=!1,u=",",h="\r\n";if(r(),"string"==typeof e&&(e=JSON.parse(e)),e instanceof Array){if(!e.length||e[0]instanceof Array)return i(null,e);if("object"==typeof e[0])return i(n(e[0]),e)}else if("object"==typeof e)return"string"==typeof e.data&&(e.data=JSON.parse(e.data)),e.data instanceof Array&&(e.fields||(e.fields=e.data[0]instanceof Array?e.fields:n(e.data[0])),e.data[0]instanceof Array||"object"==typeof e.data[0]||(e.data=[e.data])),i(e.fields||[],e.data||[]);throw"exception: Unable to serialize unrecognized input"}function n(t){function r(e){var t=_(e);t.chunkSize=parseInt(t.chunkSize),e.step||e.chunk||(t.chunkSize=null),this._handle=new o(t),this._handle.streamer=this,this._config=t}this._handle=null,this._paused=!1,this._finished=!1,this._input=null,this._baseIndex=0,this._partialLine="",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},r.call(this,t),this.parseChunk=function(t){if(this.isFirstChunk&&m(this._config.beforeFirstChunk)){var r=this._config.beforeFirstChunk(t);void 0!==r&&(t=r)}this.isFirstChunk=!1;var n=this._partialLine+t;this._partialLine="";var i=this._handle.parse(n,this._baseIndex,!this._finished);if(!this._handle.paused()&&!this._handle.aborted()){var s=i.meta.cursor;this._finished||(this._partialLine=n.substring(s-this._baseIndex),this._baseIndex=s),i&&i.data&&(this._rowCount+=i.data.length);var a=this._finished||this._config.preview&&this._rowCount>=this._config.preview;if(y)e.postMessage({results:i,workerId:S.WORKER_ID,finished:a});else if(m(this._config.chunk)){if(this._config.chunk(i,this._handle),this._paused)return;i=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(i.data),this._completeResults.errors=this._completeResults.errors.concat(i.errors),this._completeResults.meta=i.meta),!a||!m(this._config.complete)||i&&i.meta.aborted||this._config.complete(this._completeResults),a||i&&i.meta.paused||this._nextChunk(),i}},this._sendError=function(t){m(this._config.error)?this._config.error(t):y&&this._config.error&&e.postMessage({workerId:S.WORKER_ID,error:t,finished:!1})}}function i(e){function t(e){var t=e.getResponseHeader("Content-Range");return parseInt(t.substr(t.lastIndexOf("/")+1))}e=e||{},e.chunkSize||(e.chunkSize=S.RemoteChunkSize),n.call(this,e);var r;this._nextChunk=k?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)return void this._chunkLoaded();if(r=new XMLHttpRequest,k||(r.onload=g(this._chunkLoaded,this),r.onerror=g(this._chunkError,this)),r.open("GET",this._input,!k),this._config.chunkSize){var e=this._start+this._config.chunkSize-1;r.setRequestHeader("Range","bytes="+this._start+"-"+e),r.setRequestHeader("If-None-Match","webkit-no-cache")}try{r.send()}catch(t){this._chunkError(t.message)}k&&0==r.status?this._chunkError():this._start+=this._config.chunkSize},this._chunkLoaded=function(){if(4==r.readyState){if(r.status<200||r.status>=400)return void this._chunkError();this._finished=!this._config.chunkSize||this._start>t(r),this.parseChunk(r.responseText)}},this._chunkError=function(e){var t=r.statusText||e;this._sendError(t)}}function s(e){e=e||{},e.chunkSize||(e.chunkSize=S.LocalChunkSize),n.call(this,e);var t,r,i="undefined"!=typeof FileReader;this.stream=function(e){this._input=e,r=e.slice||e.webkitSlice||e.mozSlice,i?(t=new FileReader,t.onload=g(this._chunkLoaded,this),t.onerror=g(this._chunkError,this)):t=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount<this._config.preview)||this._readChunk()},this._readChunk=function(){var e=this._input;if(this._config.chunkSize){var n=Math.min(this._start+this._config.chunkSize,this._input.size);e=r.call(e,this._start,n)}var s=t.readAsText(e,this._config.encoding);i||this._chunkLoaded({target:{result:s}})},this._chunkLoaded=function(e){this._start+=this._config.chunkSize,this._finished=!this._config.chunkSize||this._start>=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(t.error)}}function a(e){e=e||{},n.call(this,e);var t,r;this.stream=function(e){return t=e,r=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e=this._config.chunkSize,t=e?r.substr(0,e):r;return r=e?r.substr(e):"",this._finished=!r,this.parseChunk(t)}}}function o(e){function t(){if(b&&d&&(h("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+S.DefaultDelimiter+"'"),d=!1),e.skipEmptyLines)for(var t=0;t<b.data.length;t++)1==b.data[t].length&&""==b.data[t][0]&&b.data.splice(t--,1);return r()&&n(),i()}function r(){return e.header&&0==y.length}function n(){if(b){for(var e=0;r()&&e<b.data.length;e++)for(var t=0;t<b.data[e].length;t++)y.push(b.data[e][t]);b.data.splice(0,1)}}function i(){if(!b||!e.header&&!e.dynamicTyping)return b;for(var t=0;t<b.data.length;t++){for(var r={},n=0;n<b.data[t].length;n++){if(e.dynamicTyping){var i=b.data[t][n];b.data[t][n]="true"==i||"TRUE"==i||"false"!=i&&"FALSE"!=i&&o(i)}e.header&&(n>=y.length?(r.__parsed_extra||(r.__parsed_extra=[]),r.__parsed_extra.push(b.data[t][n])):r[y[n]]=b.data[t][n])}e.header&&(b.data[t]=r,n>y.length?h("FieldMismatch","TooManyFields","Too many fields: expected "+y.length+" fields but parsed "+n,t):n<y.length&&h("FieldMismatch","TooFewFields","Too few fields: expected "+y.length+" fields but parsed "+n,t))}return e.header&&b.meta&&(b.meta.fields=y),b}function s(t){for(var r,n,i,s=[",","\t","|",";",S.RECORD_SEP,S.UNIT_SEP],a=0;a<s.length;a++){var o=s[a],h=0,f=0;i=void 0;for(var c=new u({delimiter:o,preview:10}).parse(t),d=0;d<c.data.length;d++){var l=c.data[d].length;f+=l,"undefined"!=typeof i?l>1&&(h+=Math.abs(l-i),i=l):i=l}c.data.length>0&&(f/=c.data.length),("undefined"==typeof n||n>h)&&f>1.99&&(n=h,r=o)}return e.delimiter=r,{successful:!!r,bestDelimiter:r}}function a(e){e=e.substr(0,1048576);var t=e.split("\r");if(1==t.length)return"\n";for(var r=0,n=0;n<t.length;n++)"\n"==t[n][0]&&r++;return r>=t.length/2?"\r\n":"\r"}function o(e){var t=l.test(e);return t?parseFloat(e):e}function h(e,t,r,n){b.errors.push({type:e,code:t,message:r,row:n})}var f,c,d,l=/^\s*-?(\d*\.?\d+|\d+\.?\d*)(e[-+]?\d+)?\s*$/i,p=this,g=0,v=!1,k=!1,y=[],b={data:[],errors:[],meta:{}};if(m(e.step)){var R=e.step;e.step=function(n){if(b=n,r())t();else{if(t(),0==b.data.length)return;g+=n.data.length,e.preview&&g>e.preview?c.abort():R(b,p)}}}this.parse=function(r,n,i){if(e.newline||(e.newline=a(r)),d=!1,!e.delimiter){var o=s(r);o.successful?e.delimiter=o.bestDelimiter:(d=!0,e.delimiter=S.DefaultDelimiter),b.meta.delimiter=e.delimiter}var h=_(e);return e.preview&&e.header&&h.preview++,f=r,c=new u(h),b=c.parse(f,n,i),t(),v?{meta:{paused:!0}}:b||{meta:{paused:!1}}},this.paused=function(){return v},this.pause=function(){v=!0,c.abort(),f=f.substr(c.getCharIndex())},this.resume=function(){v=!1,p.streamer.parseChunk(f)},this.aborted=function(){return k},this.abort=function(){k=!0,c.abort(),b.meta.aborted=!0,m(e.complete)&&e.complete(b),f=""}}function u(e){e=e||{};var t=e.delimiter,r=e.newline,n=e.comments,i=e.step,s=e.preview,a=e.fastMode;if(("string"!=typeof t||S.BAD_DELIMITERS.indexOf(t)>-1)&&(t=","),n===t)throw"Comment character same as delimiter";n===!0?n="#":("string"!=typeof n||S.BAD_DELIMITERS.indexOf(n)>-1)&&(n=!1),"\n"!=r&&"\r"!=r&&"\r\n"!=r&&(r="\n");var o=0,u=!1;this.parse=function(e,h,f){function c(e){b.push(e),S=o}function d(t){return f?p():("undefined"==typeof t&&(t=e.substr(o)),w.push(t),o=g,c(w),y&&_(),p())}function l(t){o=t,c(w),w=[],O=e.indexOf(r,o)}function p(e){return{data:b,errors:R,meta:{delimiter:t,linebreak:r,aborted:u,truncated:!!e,cursor:S+(h||0)}}}function _(){i(p()),b=[],R=[]}if("string"!=typeof e)throw"Input must be a string";var g=e.length,m=t.length,v=r.length,k=n.length,y="function"==typeof i;o=0;var b=[],R=[],w=[],S=0;if(!e)return p();if(a||a!==!1&&-1===e.indexOf('"')){for(var C=e.split(r),E=0;E<C.length;E++){var w=C[E];if(o+=w.length,E!==C.length-1)o+=r.length;else if(f)return p();if(!n||w.substr(0,k)!=n){if(y){if(b=[],c(w.split(t)),_(),u)return p()}else c(w.split(t));if(s&&E>=s)return b=b.slice(0,s),p(!0)}}return p()}for(var x=e.indexOf(t,o),O=e.indexOf(r,o);;)if('"'!=e[o])if(n&&0===w.length&&e.substr(o,k)===n){if(-1==O)return p();o=O+v,O=e.indexOf(r,o),x=e.indexOf(t,o)}else if(-1!==x&&(O>x||-1===O))w.push(e.substring(o,x)),o=x+m,x=e.indexOf(t,o);else{if(-1===O)break;if(w.push(e.substring(o,O)),l(O+v),y&&(_(),u))return p();if(s&&b.length>=s)return p(!0)}else{var I=o;for(o++;;){var I=e.indexOf('"',I+1);if(-1===I)return f||R.push({type:"Quotes",code:"MissingQuotes",message:"Quoted field unterminated",row:b.length,index:o}),d();if(I===g-1){var D=e.substring(o,I).replace(/""/g,'"');return d(D)}if('"'!=e[I+1]){if(e[I+1]==t){w.push(e.substring(o,I).replace(/""/g,'"')),o=I+1+m,x=e.indexOf(t,o),O=e.indexOf(r,o);break}if(e.substr(I+1,v)===r){if(w.push(e.substring(o,I).replace(/""/g,'"')),l(I+1+v),x=e.indexOf(t,o),y&&(_(),u))return p();if(s&&b.length>=s)return p(!0);break}}else I++}}return d()},this.abort=function(){u=!0},this.getCharIndex=function(){return o}}function h(){var e=document.getElementsByTagName("script");return e.length?e[e.length-1].src:""}function f(){if(!S.WORKERS_SUPPORTED)return!1;if(!b&&null===S.SCRIPT_PATH)throw new Error("Script path cannot be determined automatically when Papa Parse is loaded asynchronously. You need to set Papa.SCRIPT_PATH manually.");var t=S.SCRIPT_PATH||v;t+=(-1!==t.indexOf("?")?"&":"?")+"papaworker";var r=new e.Worker(t);return r.onmessage=c,r.id=w++,R[r.id]=r,r}function c(e){var t=e.data,r=R[t.workerId],n=!1;if(t.error)r.userError(t.error,t.file);else if(t.results&&t.results.data){var i=function(){n=!0,d(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},s={abort:i,pause:l,resume:l};if(m(r.userStep)){for(var a=0;a<t.results.data.length&&(r.userStep({data:[t.results.data[a]],errors:t.results.errors,meta:t.results.meta},s),!n);a++);delete t.results}else m(r.userChunk)&&(r.userChunk(t.results,s,t.file),delete t.results)}t.finished&&!n&&d(t.workerId,t.results)}function d(e,t){var r=R[e];m(r.userComplete)&&r.userComplete(t),r.terminate(),delete R[e]}function l(){throw"Not implemented."}function p(t){var r=t.data;if("undefined"==typeof S.WORKER_ID&&r&&(S.WORKER_ID=r.workerId),"string"==typeof r.input)e.postMessage({workerId:S.WORKER_ID,results:S.parse(r.input,r.config),finished:!0});else if(e.File&&r.input instanceof File||r.input instanceof Object){var n=S.parse(r.input,r.config);n&&e.postMessage({workerId:S.WORKER_ID,results:n,finished:!0})}}function _(e){if("object"!=typeof e)return e;var t=e instanceof Array?[]:{};for(var r in e)t[r]=_(e[r]);return t}function g(e,t){return function(){e.apply(t,arguments)}}function m(e){return"function"==typeof e}var v,k=!e.document&&!!e.postMessage,y=k&&/(\?|&)papaworker(=|&|$)/.test(e.location.search),b=!1,R={},w=0,S={};if(S.parse=t,S.unparse=r,S.RECORD_SEP=String.fromCharCode(30),S.UNIT_SEP=String.fromCharCode(31),S.BYTE_ORDER_MARK="\ufeff",S.BAD_DELIMITERS=["\r","\n",'"',S.BYTE_ORDER_MARK],S.WORKERS_SUPPORTED=!k&&!!e.Worker,S.SCRIPT_PATH=null,S.LocalChunkSize=10485760,S.RemoteChunkSize=5242880,S.DefaultDelimiter=",",S.Parser=u,S.ParserHandle=o,S.NetworkStreamer=i,S.FileStreamer=s,S.StringStreamer=a,"undefined"!=typeof module&&module.exports?module.exports=S:m(e.define)&&e.define.amd?define(function(){return S}):e.Papa=S,e.jQuery){var C=e.jQuery;C.fn.parse=function(t){function r(){if(0==a.length)return void(m(t.complete)&&t.complete());var e=a[0];if(m(t.before)){var r=t.before(e.file,e.inputElem);if("object"==typeof r){if("abort"==r.action)return void n("AbortError",e.file,e.inputElem,r.reason);if("skip"==r.action)return void i();"object"==typeof r.config&&(e.instanceConfig=C.extend(e.instanceConfig,r.config))}else if("skip"==r)return void i()}var s=e.instanceConfig.complete;e.instanceConfig.complete=function(t){m(s)&&s(t,e.file,e.inputElem),i()},S.parse(e.file,e.instanceConfig)}function n(e,r,n,i){m(t.error)&&t.error({name:e},r,n,i)}function i(){a.splice(0,1),r()}var s=t.config||{},a=[];return this.each(function(){var t="INPUT"==C(this).prop("tagName").toUpperCase()&&"file"==C(this).attr("type").toLowerCase()&&e.FileReader;if(!t||!this.files||0==this.files.length)return!0;for(var r=0;r<this.files.length;r++)a.push({file:this.files[r],inputElem:this,instanceConfig:C.extend({},s)})}),r(),this}}y?e.onmessage=p:S.WORKERS_SUPPORTED&&(v=h(),document.body?document.addEventListener("DOMContentLoaded",function(){b=!0},!0):b=!0),i.prototype=Object.create(n.prototype),i.prototype.constructor=i,s.prototype=Object.create(n.prototype),s.prototype.constructor=s,a.prototype=Object.create(a.prototype),a.prototype.constructor=a}("undefined"!=typeof window?window:this);var CRYPTO={paranoia_level:null,PASSWORD:{generate:function(length,callback,progress,start_string){return sjcl.random.isReady(paranoia_level)?(null==start_string&&(start_string=""),start_string.length<length?(start_string+=CRYPTO.RANDOM.getRandomASCII(),null!=progress&&progress(start_string.length/length*100),void setTimeout(this.generate(length,callback,progress,start_string),100)):(callback(start_string),void(null!=progress&&progress(100)))):void setTimeout(this.generate(length,callback,progress,start_string),500)},logRepeatedCharCount:function(str){var chars=[];for(i=0;i<str.length;i++)chars[str.charAt(i)]=null==chars[str.charAt(i)]?0:chars[str.charAt(i)]+1;return chars}},RANDOM:{getRandomASCII:function(){for(var ret="";ret.length<4;){var int=sjcl.random.randomWords(1,paranoia_level);int=int[0];var tmp=this._isASCII((4278190080&int)>>24);tmp&&(ret+=tmp),tmp=this._isASCII((16711680&int)>>16),tmp&&(ret+=tmp),tmp=this._isASCII((65280&int)>>8),tmp&&(ret+=tmp),tmp=this._isASCII(255&int),tmp&&(ret+=tmp)}return ret},_isASCII:function(data){return data>31&&data<127&&String.fromCharCode(data)}},initEngines:function(default_paranoia){paranoia_level=default_paranoia||10,sjcl.random.setDefaultParanoia(this.paranoia_level),sjcl.random.startCollectors(),console.warn("Crypto stuff initialized")}};CRYPTO.initEngines(),function(){angular.module("passmanApp",["ngAnimate","ngCookies","ngResource","ngRoute","ngSanitize","ngTouch","templates-main","LocalStorageModule","offClick","ngPasswordMeter","ngclipboard","xeditable","ngTagsInput","angularjs-datetime-picker","ui.sortable","pascalprecht.translate"]).config(function($routeProvider){$routeProvider.when("/",{templateUrl:"views/vaults.html",controller:"VaultCtrl"}).when("/vault/:vault_id",{templateUrl:"views/show_vault.html",controller:"CredentialCtrl"}).when("/vault/:vault_id/new",{templateUrl:"views/edit_credential.html",controller:"CredentialEditCtrl"}).when("/vault/:vault_id/edit/:credential_id",{templateUrl:"views/edit_credential.html",controller:"CredentialEditCtrl"}).when("/vault/:vault_id/:credential_id/share",{templateUrl:"views/share_credential.html",controller:"ShareCtrl"}).when("/vault/:vault_id/:credential_id/revisions",{templateUrl:"views/credential_revisions.html",controller:"RevisionCtrl"}).when("/vault/:vault_id/request-deletion",{templateUrl:"views/vault_req_deletion.html",controller:"RequestDeleteCtrl"}).when("/vault/:vault_id/settings",{templateUrl:"views/settings.html",controller:"SettingsCtrl"}).otherwise({redirectTo:"/"})}).config(["$httpProvider",function($httpProvider){$httpProvider.defaults.headers.common.requesttoken=oc_requesttoken}]).config(function(localStorageServiceProvider){localStorageServiceProvider.setNotify(!0,!0)}).config(function($translateProvider){$translateProvider.useSanitizeValueStrategy("sanitizeParameters"),$translateProvider.useUrlLoader(OC.generateUrl("/apps/passman/api/v2/language")),$translateProvider.preferredLanguage("en")}).run(["$rootScope",function($rootScope){$rootScope.$on("$routeChangeSuccess",function(e,curr,prev){$(".ui-dialog-content").dialog("close")})}]),jQuery(document).ready(function(){var findItemByID=function(id){var credentials,foundItem=!1;return credentials=angular.element("#app-content-wrapper").scope().credentials,angular.forEach(credentials,function(credential){credential.credential_id===id&&(foundItem=credential)}),foundItem};jQuery(document).on("click",".undoDelete",function(){var credential=findItemByID($(this).attr("data-item-id"));angular.element("#app-content-wrapper").scope().recoverCredential(credential),angular.element("#app-content-wrapper").scope().$apply()}),jQuery(document).on("click",".undoRestore",function(){var credential=findItemByID($(this).attr("data-item-id"));angular.element("#app-content-wrapper").scope().deleteCredential(credential),angular.element("#app-content-wrapper").scope().$apply()})})}(),function(){angular.module("passmanApp").filter("as",function($parse){return function(value,context,path){return $parse(path).assign(context,value)}})}(),function(){angular.module("passmanApp").filter("bytes",function(){return function(bytes,precision){if(isNaN(parseFloat(bytes))||!isFinite(bytes))return"-";"undefined"==typeof precision&&(precision=1);var units=["bytes","kB","MB","GB","TB","PB"],number=Math.floor(Math.log(bytes)/Math.log(1024));return(bytes/Math.pow(1024,Math.floor(number))).toFixed(precision)+" "+units[number]}})}(),function(){angular.module("passmanApp").filter("credentialSearch",function(){return function(credentials,filter){var _credentials=[];if(credentials){if(!filter)return credentials;if(""===filter.filterText.trim())return credentials;for(var matchedWithFilter=function(c){for(var f=0;f<filter.fields.length;f++){var field=filter.fields[f],fieldValue="string"==typeof c[field]?c[field]:JSON.stringify(c[field]);if(filter.hasOwnProperty("useRegex")&&filter.useRegex===!0)try{var patt=new RegExp(filter.filterText);if(patt.test(fieldValue))return!0}catch(e){}if(fieldValue.toLowerCase().indexOf(filter.filterText.toLowerCase())>=0)return!0}return!1},ci=0;ci<credentials.length;ci++){var c=credentials[ci];matchedWithFilter(c)&&_credentials.push(c)}return _credentials}return[]}})}(),function(){angular.module("passmanApp").filter("propsFilter",function(){return function(items,props){var out=[];if(angular.isArray(items)){var keys=Object.keys(props);items.forEach(function(item){for(var itemMatches=!1,i=0;i<keys.length;i++){var prop=keys[i],text=props[prop].toLowerCase();if(item[prop].toString().toLowerCase().indexOf(text)!==-1){itemMatches=!0;break}}itemMatches&&out.push(item)})}else out=items;return out}})}(),function(){angular.module("passmanApp").filter("range",function(){return function(val,range){range=parseInt(range);for(var i=0;i<range;i++)val.push(i);return val}})}(),function(){angular.module("passmanApp").filter("tagFilter",function(){return function(credentials,tags){var _credentials=[];if(tags.length>0)for(var ci=0;ci<credentials.length;ci++){for(var c=credentials[ci],matches=0,ct=0;ct<c.tags_raw.length;ct++){var t=c.tags_raw[ct];tags.indexOf(t.text)!==-1&&matches++}matches===tags.length&&_credentials.push(c)}return 0===tags.length&&(_credentials=credentials),_credentials}})}(),function(){angular.module("passmanApp").filter("toHHMMSS",function(){return function(_seconds){var sec_num=parseInt(_seconds,10),hours=Math.floor(sec_num/3600),minutes=Math.floor((sec_num-3600*hours)/60),seconds=sec_num-3600*hours-60*minutes;return hours<10&&(hours="0"+hours),minutes<10&&(minutes="0"+minutes),seconds<10&&(seconds="0"+seconds),hours+":"+minutes+":"+seconds}})}(),function(){angular.module("passmanApp").service("CacheService",["localStorageService","EncryptService",function(localStorageService,EncryptService){return{get:function(name){return EncryptService.decryptString(localStorageService.get(name))},set:function(key,value){value=EncryptService.encryptString(value),localStorageService.set(key,value)}}}])}(),function(){angular.module("passmanApp").service("CredentialService",["$http","EncryptService","VaultService","FileService",function($http,EncryptService,VaultService,FileService){var credential={credential_id:null,guid:null,vault_id:null,label:null,description:null,created:null,changed:null,tags:[],email:null,
-icon:{type:!1,content:""},username:null,password:null,url:null,favicon:null,renew_interval:null,expire_time:0,delete_time:0,files:[],custom_fields:[],otp:{},compromised:!1,hidden:!1},_encryptedFields=["description","username","password","files","custom_fields","otp","email","tags","url","compromised"];return{newCredential:function(){return angular.copy(credential)},createCredential:function(credential){for(var _credential=angular.copy(credential),i=0;i<_encryptedFields.length;i++){var field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);_credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue))}_credential.expire_time=new Date(angular.copy(credential.expire_time)).getTime()/1e3;var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials");return $http.post(queryUrl,_credential).then(function(response){return response.data?response.data:response})},getEncryptedFields:function(){return _encryptedFields},updateCredential:function(credential,skipEncryption,key){var _credential=angular.copy(credential);if(!skipEncryption)for(var i=0;i<_encryptedFields.length;i++){var field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);_credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue),key)}_credential.expire_time=new Date(angular.copy(credential.expire_time)).getTime()/1e3;var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+credential.guid);return $http.patch(queryUrl,_credential).then(function(response){return response.data?response.data:response})},getCredential:function(guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+guid);return $http.get(queryUrl).then(function(response){return response.data?response.data:response})},destroyCredential:function(guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+guid);return $http.delete(queryUrl).then(function(response){return response.data?response.data:response})},encryptCredential:function(credential,key){for(var i=0;i<_encryptedFields.length;i++){var field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue),key)}return credential},decryptCredential:function(credential,key){for(var i=0;i<_encryptedFields.length;i++){var field_decrypted_value,field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);try{field_decrypted_value=null!==fieldValue?EncryptService.decryptString(fieldValue,key):null}catch(e){throw e}try{credential[field]=JSON.parse(field_decrypted_value)}catch(e){console.warn("Field"+field+" in "+credential.label+" could not be parsed! Value:"+fieldValue)}}return credential},getSharedKeyFromCredential:function(credential){var key=null;return!credential.hasOwnProperty("acl")&&credential.hasOwnProperty("shared_key")&&credential.shared_key&&(key=EncryptService.decryptString(angular.copy(credential.shared_key))),credential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy(credential.acl.shared_key))),key},getRevisions:function(guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+guid+"/revision");return $http.get(queryUrl).then(function(response){return response.data?response.data:response})},updateRevision:function(revision){var _revision=angular.copy(revision);_revision.credential_data=window.btoa(JSON.stringify(_revision.credential_data));var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+revision.credential_data.guid+"/revision/"+revision.revision_id);return $http.patch(queryUrl,_revision).then(function(response){return response.data?response.data:response})},deleteRevision:function(credential_guid,revision_id){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+credential_guid+"/revision/"+revision_id);return $http.delete(queryUrl).then(function(response){return response.data?response.data:response})},reencryptCredential:function(credential_guid,old_password,new_password,skipSharingKey){var service=this,progress_datatype=function(current,total,process){this.process=process,this.current=current,this.total=total,this.calculated=current/total*100},promise_credential_update=function(){service.getCredential(credential_guid).then(function(credential){this.parent.plain_credential=service.decryptCredential(credential,this.parent.old_password);var tmp=angular.copy(this.parent.plain_credential);if(tmp.hasOwnProperty("shared_key")&&null!==tmp.shared_key&&!skipSharingKey){var shared_key=EncryptService.decryptString(angular.copy(tmp.shared_key)).trim();tmp.shared_key=EncryptService.encryptString(angular.copy(shared_key),this.parent.new_password),tmp.set_share_key=!0,tmp.skip_revision=!0,this.parent.new_password=shared_key}this.parent.new_credential_cryptogram=service.encryptCredential(tmp,this.parent.new_password),this.call_progress(new progress_datatype(1,2,"credential")),this.parent.new_credential_cryptogram.skip_revision=!0,service.updateCredential(this.parent.new_credential_cryptogram,!0).then(function(){this.call_progress(new progress_datatype(2,2,"credential")),this.call_then({plain_text:this.parent.plain_credential,cryptogram:this.parent.new_credential_cryptogram})}.bind(this))}.bind(this))},promise_files_update=function(){this.total=2*this.parent.plain_credential.files.length,this.current=0;for(var i=0;i<this.parent.plain_credential.files.length;i++){var _file=this.parent.plain_credential.files[i];FileService.getFile(_file).then(function(fileData){fileData.filename=EncryptService.decryptString(fileData.filename,this.parent.old_password),fileData.file_data=EncryptService.decryptString(fileData.file_data,this.parent.old_password),this.current++,this.call_progress(new progress_datatype(this.current,this.total,"files")),FileService.updateFile(fileData,this.parent.new_password).then(function(){this.current++,this.call_progress(new progress_datatype(this.current,this.total,"files")),this.current===this.total&&this.call_then("All files has been updated")}.bind(this))}.bind(this))}0===this.parent.plain_credential.files.length&&(this.call_progress(new progress_datatype(0,0,"files")),this.call_then("No files to update"))},promise_revisions_update=function(){service.getRevisions(this.parent.plain_credential.guid).then(function(revisions){this.total=2*revisions.length,this.upload=0,this.current=0,this.revisions=revisions;var revision_workload=function(){if(0===this.revisions.length)return this.call_progress(new progress_datatype(0,0,"revisions")),void this.call_then("No history to update");var _revision=revisions[this.current];_revision.credential_data=service.decryptCredential(_revision.credential_data,this.parent.old_password),_revision.credential_data=service.encryptCredential(_revision.credential_data,this.parent.new_password),this.current++,this.call_progress(new progress_datatype(this.current+this.upload,this.total,"revisions")),service.updateRevision(_revision).then(function(){this.upload++,this.call_progress(new progress_datatype(this.upload+this.current,this.total,"revisions")),this.current+this.upload===this.total&&this.call_then("History updated")}.bind(this)),this.current!==this.total/2&&setTimeout(revision_workload.bind(this),1)};setTimeout(revision_workload.bind(this),1)}.bind(this))},promise_workload=function(){this.old_password=angular.copy(old_password),this.new_password=angular.copy(new_password),this.promises=0;var master_promise=this,password_data=function(){this.old_password=master_promise.old_password,this.new_password=master_promise.new_password,this.plain_credential=master_promise.plain_credential};this.credential_data={},new C_Promise(promise_credential_update,new password_data).progress(function(data){master_promise.call_progress(data)}).then(function(data){console.warn("End credential update"),master_promise.plain_credential=data.plain_text,master_promise.promises++,master_promise.credential_data=data,new C_Promise(promise_files_update,new password_data).progress(function(data){master_promise.call_progress(data)}).then(function(){console.warn("End files update"),master_promise.promises--,0===master_promise.promises&&master_promise.call_then(master_promise.credential_data)}),master_promise.promises++,new C_Promise(promise_revisions_update,new password_data).progress(function(data){master_promise.call_progress(data)}).then(function(){console.warn("End revisions update"),master_promise.promises--,0===master_promise.promises&&master_promise.call_then(master_promise.credential_data)})})};return new C_Promise(promise_workload)}}}])}(),function(){angular.module("passmanApp").service("EncryptService",["VaultService",function(VaultService){var encryption_config={adata:"",iter:1e3,ks:256,mode:"ccm",ts:64};return{encryptString:function(string,_key){_key||(_key=VaultService.getActiveVault().vaultKey);var rp={},ct=sjcl.encrypt(_key,string,encryption_config,rp);return window.btoa(ct)},decryptString:function(ciphertext,_key){_key||(_key=VaultService.getActiveVault().vaultKey),ciphertext=window.atob(ciphertext);var rp={};try{return sjcl.decrypt(_key,ciphertext,encryption_config,rp)}catch(e){throw e}}}}])}(),function(){angular.module("passmanApp").service("FileService",["$http","EncryptService",function($http,EncryptService){return{uploadFile:function(file,key){var queryUrl=OC.generateUrl("apps/passman/api/v2/file"),_file=angular.copy(file);_file.filename=EncryptService.encryptString(_file.filename,key);var data=EncryptService.encryptString(angular.copy(file.data),key);return _file.data=data,$http.post(queryUrl,_file).then(function(response){return response.data?response.data:response})},deleteFile:function(file){var queryUrl=OC.generateUrl("apps/passman/api/v2/file/"+file.file_id),_file=angular.copy(file);return $http.delete(queryUrl,_file).then(function(response){return response.data?response.data:response})},getFile:function(file){var queryUrl=OC.generateUrl("apps/passman/api/v2/file/"+file.file_id),_file=angular.copy(file);return $http.get(queryUrl,_file).then(function(response){return response.data?"[object Array]"===Object.prototype.toString.call(response.data)?response.data.pop():response.data:response})},updateFile:function(file,key){var queryUrl=OC.generateUrl("apps/passman/api/v2/file/"+file.file_id),_file=angular.copy(file);_file.filename=EncryptService.encryptString(_file.filename,key);var data=EncryptService.encryptString(angular.copy(file.file_data),key);return _file.file_data=data,$http.patch(queryUrl,_file).then(function(response){return response.data?response.data:response})},dataURItoBlob:function(dataURI,ftype){var byteString,ab,ia,bb,i;for(byteString=atob(dataURI.split(",")[1]),ab=new ArrayBuffer(byteString.length),ia=new Uint8Array(ab),i=0;i<byteString.length;i++)ia[i]=byteString.charCodeAt(i);return bb=new Blob([ab],{type:ftype}),URL.createObjectURL(bb)}}}])}(),function(){angular.module("passmanApp").service("IconService",["$http",function($http){return{getIcons:function(){var queryUrl=OC.generateUrl("apps/passman/api/v2/icon/list");return $http.get(queryUrl).then(function(response){return response.data?response.data:response})}}}])}(),function(){angular.module("passmanApp").service("NotificationService",["$timeout",function($timeout){var to;return{showNotification:function(text,time,closeCallback){var notification=OC.Notification.showHtml(text);return to=$timeout(function(){OC.Notification.hide(notification,closeCallback)},time),notification},hideNotification:function(notification){$timeout.cancel(to),OC.Notification.hide(notification)},hideAll:function(){OC.Notification.hide()}}}])}(),function(){angular.module("passmanApp").service("SearchboxexpanderService",["SettingsService","$translate",function(SettingsService,$translate){function getSearchFieldArraySettings(){var res=SettingsService.getSetting("searchbox_settings");searchfields="undefined"!=typeof res&&null!==res&&""!==res?JSON.parse(res):defaults}function getSearchFieldArrayForFiltering(){var fields=[];for(var key in searchfields)searchfields[key]&&fields.push(key);return fields}function buildDefaultFix(rootScope,scope){null!==native_search&&(native_search.nextElementSibling.addEventListener("click",function(e){scope.$apply(function(){rootScope.$broadcast("nc_searchbox","")})}),native_search.classList.remove("hidden"),native_search.addEventListener("keypress",function(e){13===e.keyCode&&e.preventDefault()}),native_search.addEventListener("keyup",function(e){scope.$apply(function(){rootScope.$broadcast("nc_searchbox",native_search.value,getSearchFieldArrayForFiltering())})}))}function buildCog(){if(null!==native_search){var parent=document.createElement("div");parent.classList.add("notifications"),parent.id="searchbox-settings",parent.classList.add("hidden");var node=document.createElement("div");node.classList.add("icon-settings-white"),node.classList.add("searchbox-settings"),node.id="searchbox-settings-icon",parent.appendChild(node),native_search.after(parent)}}function addListenerToCog(){null!==native_search&&($("#searchbox").on("focus",function(evt){$("#searchbox-settings").removeClass("hidden")}),$("#searchbox").on("blur",function(evt){native_search.value||setTimeout(function(){$("#searchbox-settings").addClass("hidden")},150)}))}function openPopup(){null!==native_search&&(buildPopup(title,defaults_button),$(function(){$("#dialog-searchboxsettings").dialog({width:280,height:280,dialogClass:"custom-search-dialog",close:function(){$(this).dialog("destroy")}}).removeClass("ui-corner-all")}))}function buildPopup(title){$("#dialog-searchboxsettings").length&&$("#dialog-searchboxsettings").remove();var dialogdiv=document.createElement("div");dialogdiv.id="dialog-searchboxsettings",dialogdiv.title=title,dialogdiv.classList.add("hidden"),native_search.after(dialogdiv),getSearchFieldArraySettings();for(var key in searchfields){var div_inner=document.createElement("div");div_inner.id=key+"_div";var input=document.createElement("input");input.id=key+"_input",input.classList.add("searchbox_settings_input"),input.setAttribute("key",key),input.type="checkbox",searchfields[key]&&(input.checked="true"),input.innerText=key;var label=document.createElement("label");label.classList.add("searchbox_settings_label"),label.innerHTML=translations[key],label.setAttribute("key",key),div_inner.appendChild(input),div_inner.appendChild(label),dialogdiv.appendChild(div_inner)}attachListener()}function attachListener(){$(".searchbox_settings_input").on("change",function(evt){var key=$(this).attr("key");searchfields[key]=$("#"+key+"_input").prop("checked");var string=JSON.stringify(searchfields);SettingsService.setSetting("searchbox_settings",string)}),$(".searchbox_settings_label").on("click",function(evt){})}var defaults={label:!0,username:!0,email:!0,custom_fields:!0,password:!1,description:!1,url:!1},searchfields={label:!0,username:!0,email:!0,custom_fields:!0,password:!1,description:!1,url:!1},native_search=document.getElementById("searchbox"),title="Loading...",defaults_button="Loading...",translations={};return $translate.onReady(function(){for(var key in defaults)translations[key]=$translate.instant("search.settings.input."+key);title=$translate.instant("search.settings.title"),defaults_button=$translate.instant("search.settings.defaults_button")}),{expandSearch:function($rootScope,$scope,translation){getSearchFieldArraySettings(),buildDefaultFix($rootScope,$scope),buildCog(),addListenerToCog(),$("#searchbox-settings-icon").on("click",function(evt){openPopup()})}}}])}(),function(){angular.module("passmanApp").service("SettingsService",["localStorageService","$http","$rootScope",function(localStorageService,$http,$rootScope){var settings={defaultVault:null,defaultVaultPass:null};$http.get(OC.generateUrl("apps/passman/api/v2/settings")).then(function(response){response.data&&(settings=angular.merge(settings,response.data),$rootScope.$broadcast("settings_loaded"))});var cookie=localStorageService.get("settings");return settings=angular.merge(settings,cookie),{getSettings:function(){return settings},getSetting:function(name){return settings[name]},setSetting:function(name,value){settings[name]=value,localStorageService.set("settings",settings)},isEnabled:function(name){return 1===settings[name]||"1"===settings[name]}}}])}(),function(){angular.module("passmanApp").service("ShareService",["$http","VaultService","EncryptService","CredentialService",function($http,VaultService,EncryptService,CredentialService){var paranoia_level=10;return sjcl.random.setDefaultParanoia(paranoia_level),sjcl.random.startCollectors(),{search:function(string){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/search");return $http.post(queryUrl,{search:string}).then(function(response){return response.data?response.data:response})},shareWithUser:function(credential,target_user_data){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/share");return $http.post(queryUrl,{item_id:credential.credential_id,item_guid:credential.guid,permissions:target_user_data.accessLevel,vaults:target_user_data.vaults})},getVaultsByUser:function(userId){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/vaults/"+userId);return $http.get(queryUrl,{search:userId}).then(function(response){if(response.data){for(var i=0;i<response.data.length;i++)response.data[i].public_sharing_key=forge.pki.publicKeyFromPem(response.data[i].public_sharing_key);return response.data}return response})},getPendingRequests:function(){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/pending");return $http.get(queryUrl).then(function(response){if(response.data)return response.data})},saveSharingRequest:function(request,crypted_shared_key){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/save");return $http.post(queryUrl,{item_guid:request.item_guid,target_vault_guid:request.target_vault_guid,final_shared_key:crypted_shared_key}).then(function(response){return response.data})},declineSharingRequest:function(request){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/decline/"+request.req_id);return $http.delete(queryUrl).then(function(response){return response.data})},unshareCredential:function(credential){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid);return $http.delete(queryUrl).then(function(response){return response.data})},unshareCredentialFromUser:function(credential,user_id){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/"+user_id);return $http.delete(queryUrl).then(function(response){return response.data})},createPublicSharedCredential:function(shareObj){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/public");return $http.post(queryUrl,shareObj).then(function(response){return response.data})},getPublicSharedCredential:function(credential_guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential_guid+"/public");return $http.get(queryUrl).then(function(response){return response.data?response:response},function(result){return result})},getSharedCredentialACL:function(credential){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/acl");return $http.get(queryUrl).then(function(response){return response.data?response.data:response},function(result){return result})},updateCredentialAcl:function(credential,acl){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/acl");return $http.patch(queryUrl,acl).then(function(response){return response.data})},getCredendialsSharedWithUs:function(vault_guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/vault/"+vault_guid+"/get");return $http.get(queryUrl).then(function(response){if(response.data)return response.data})},downloadSharedFile:function(credential,file){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/file/"+file.guid);return $http.get(queryUrl).then(function(response){if(response.data)return response.data})},encryptSharedCredential:function(credential,sharedKey){var _credential=angular.copy(credential);_credential.shared_key=EncryptService.encryptString(sharedKey);for(var encrypted_fields=CredentialService.getEncryptedFields(),i=0;i<encrypted_fields.length;i++){var field=encrypted_fields[i],fieldValue=angular.copy(credential[field]);_credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue),sharedKey)}return _credential},decryptSharedCredential:function(credential,sharedKey){for(var _credential=angular.copy(credential),encrypted_fields=CredentialService.getEncryptedFields(),i=0;i<encrypted_fields.length;i++){var field_decrypted_value,field=encrypted_fields[i],fieldValue=angular.copy(_credential[field]);if(_credential.hasOwnProperty(field)){try{field_decrypted_value=EncryptService.decryptString(fieldValue,sharedKey)}catch(e){if("compromised"!==field||null!==fieldValue)throw e;field_decrypted_value=0}try{_credential[field]=JSON.parse(field_decrypted_value)}catch(e){throw console.warn("Field"+field+" in "+_credential.label+" could not be parsed! Value:"+fieldValue),e}}}return _credential},generateRSAKeys:function(key_length){var p=new C_Promise(function(){var state=forge.pki.rsa.createKeyPairGenerationState(key_length,65537),step=function(){forge.pki.rsa.stepKeyPairGenerationState(state,100)?this.call_then(state.keys):(null!==state.p?this.call_progress(50):this.call_progress(0),setTimeout(step.bind(this),1))};setTimeout(step.bind(this),100)});return p},generateSharedKey:function(size){return size=size||20,new C_Promise(function(){var t=this;CRYPTO.PASSWORD.generate(size,function(pass){t.call_then(pass)},function(progress){t.call_progress(progress)})})},rsaKeyPairToPEM:function(keypair){return{publicKey:forge.pki.publicKeyToPem(keypair.publicKey),privateKey:forge.pki.privateKeyToPem(keypair.privateKey)}},getSharingKeys:function(){var vault=VaultService.getActiveVault();return{private_sharing_key:EncryptService.decryptString(angular.copy(vault.private_sharing_key)),public_sharing_key:vault.public_sharing_key}},rsaPrivateKeyFromPEM:function(private_pem){return forge.pki.privateKeyFromPem(private_pem)},rsaPublicKeyFromPEM:function(public_pem){return forge.pki.publicKeyFromPem(public_pem)},cypherRSAStringWithPublicKeyBulkAsync:function(vaults,string){var workload=function(){if(this.current_index<this.vaults.length>0&&this.vaults.length>0){var _vault=angular.copy(this.vaults[this.current_index]);_vault.key=forge.util.encode64(_vault.public_sharing_key.encrypt(this.string)),this.data.push(_vault),this.current_index++,this.call_progress(this.current_index),setTimeout(workload.bind(this),1)}else this.call_then(this.data)};return new C_Promise(function(){this.data=[],this.vaults=vaults,this.string=string,this.current_index=0,setTimeout(workload.bind(this),0)})}}}])}(),function(){angular.module("passmanApp").service("TagService",["$filter",function($filter){var _tags=[];return{getTags:function(){return _tags},searchTag:function(string){return $filter("filter")(_tags,{text:string})},addTags:function(tags){for(var i=0;i<tags.length;i++)tags[i].text&&0===$filter("filter")(_tags,{text:tags[i].text}).length&&_tags.push(tags[i])},resetTags:function(){_tags=[]}}}])}(),function(){angular.module("passmanApp").service("VaultService",["$http",function($http){var _activeVault,service={getVaults:function(){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults");return $http.get(queryUrl).then(function(response){return response.data?response.data:response})},setActiveVault:function(vault){_activeVault=angular.copy(vault)},getActiveVault:function(){return _activeVault},getVaultSetting:function(key,default_value){return _activeVault.vault_settings&&void 0!==_activeVault.vault_settings[key]?_activeVault.vault_settings[key]:default_value},setVaultSetting:function(key,value){return!!_activeVault.vault_settings&&(_activeVault.vault_settings[key]=value,void this.updateVault(_activeVault))},createVault:function(vaultName){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults");return $http.post(queryUrl,{vault_name:vaultName}).then(function(response){return response.data?response.data:response})},getVault:function(vault){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+vault.guid);return $http.get(queryUrl).then(function(response){return response.data?(response.data.vault_settings?response.data.vault_settings=JSON.parse(window.atob(response.data.vault_settings)):response.data.vault_settings={},response.data):response})},updateVault:function(vault){var _vault=angular.copy(vault);delete _vault.defaultVaultPass,delete _vault.defaultVault,delete _vault.vaultKey,_vault.vault_settings=window.btoa(JSON.stringify(_vault.vault_settings));var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+_vault.guid);return $http.patch(queryUrl,_vault).then(function(response){return response.data?response.data:response})},updateSharingKeys:function(vault){var _vault=angular.copy(vault);delete _vault.vaultKey;var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+_vault.guid+"/sharing-keys");return $http.post(queryUrl,_vault).then(function(response){return response.data?response.data:response})},deleteVault:function(vault){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+vault.guid);return $http.delete(queryUrl).then(function(response){return response.data?response.data:response})},clearVaultService:function(){_activeVault=null}};return service}])}(),function(){angular.module("passmanApp").factory("SharingACL",function(){function ACL(acl_permission){this.permission=acl_permission}return ACL.prototype.permissions={READ:1,WRITE:2,FILES:4,HISTORY:8,OWNER:128},ACL.prototype.hasPermission=function(permission){return permission===(this.permission&permission)},ACL.prototype.addPermission=function(permission){this.permission=this.permission|permission},ACL.prototype.removePermission=function(permission){this.permission=this.permission&~permission},ACL.prototype.togglePermission=function(permission){this.permission^=permission},ACL.prototype.getAccessLevel=function(){return this.permission},ACL})}(),function(){angular.module("passmanApp").directive("autoScroll",function(){return{restrict:"A",scope:{autoScroll:"="},link:function(scope,el){scope.$watch("autoScroll",function(){$(el).scrollTop($(el)[0].scrollHeight)},!0)}}})}(),function(){angular.module("passmanApp").directive("clearBtn",["$parse",function($parse){return{link:function(scope,elm,attr){elm.wrap("<div style='position: relative'></div>");var btn="<span id="+Math.round(1e9*Math.random())+' class="searchclear ng-hide fa fa-times-circle-o"></span>',angularBtn=angular.element(btn);elm.after(angularBtn),angularBtn.on("click",function(){elm.val("").trigger("change"),$parse(attr.ngModel).assign(scope,""),scope.$apply()}),elm.bind("focus keyup change paste propertychange",function(){elm.val()&&elm.val().length>0?angularBtn.removeClass("ng-hide"):angularBtn.addClass("ng-hide")})}}}])}(),function(){angular.module("passmanApp").directive("clickDisable",function(){return function(scope,element){element.bind("click",function(){element.prepend('<i class="fa fa-spin fa-spinner"></i>&nbsp;'),element.attr("disabled","disabled")})}})}(),function(){angular.module("passmanApp").directive("selectOnClick",["$window",function($window){return{restrict:"A",link:function(scope,element){element.on("click",function(){$window.getSelection().toString()||this.setSelectionRange(0,this.value.length)})}}}])}(),function(){angular.module("passmanApp").directive("colorFromString",[function(){return{restrict:"A",scope:{string:"=colorFromString"},link:function(scope,el){function genColor(str){for(var hash=0,i=0;i<str.length;i++)hash=str.charCodeAt(i)+((hash<<5)-hash);var c=(16777215&hash).toString(16).toUpperCase();return"#"+"00000".substring(0,6-c.length)+c}scope.$watch("string",function(){jQuery(el).css("border-color",genColor(scope.string))})}}}])}(),function(){angular.module("passmanApp").directive("credentialCounter",[function(){return{template:'<div ng-show="counter" translate="number.filtered" translate-values="{number_filtered: counter, credential_number: total}"></div>',replace:!1,restrict:"A",scope:{filteredCredentials:"=credentialCounter",deleteTime:"=",vault:"=",filters:"="},link:function(scope){function countCredentials(){var countedCredentials=0,total=0;scope.vault&&scope.vault.hasOwnProperty("credentials")&&(angular.forEach(scope.vault.credentials,function(credential){var pos=scope.filteredCredentials.map(function(c){return c.guid}).indexOf(credential.guid);0===scope.deleteTime&&0===credential.hidden&&0===credential.delete_time&&(total+=1,countedCredentials=pos!==-1?countedCredentials+1:countedCredentials),scope.deleteTime>0&&0===credential.hidden&&credential.delete_time>0&&(total+=1,countedCredentials=pos!==-1?countedCredentials+1:countedCredentials)}),scope.counter=countedCredentials,scope.total=total)}scope.$watch("[filteredCredentials, deleteTime, filters]",function(){countCredentials()},!0)}}}])}(),function(){angular.module("passmanApp").directive("credentialField",["$timeout","$translate",function($timeout,$translate){return{scope:{value:"=value",secret:"=secret",inputField:"=useInput",inputFieldplaceholder:"=inputPlaceholder",isURLFIELD:"=url"},restrict:"A",replace:"true",template:'<span class="credential_field"><div class="value" ng-class="{\'ellipsis\': isLink}"><span ng-if="secret"><span ng-repeat="n in [] | range:value.length" ng-if="!valueVisible">*</span></span><span ng-if="valueVisible && !inputField" ng-bind-html="value"></span><span ng-if="valueVisible && inputField"><input type="text" ng-model="value" select-on-click placeholder="{{ inputFieldplaceholder }}!"</span></div><div class="tools"><div class="cell" ng-if="toggle" tooltip="tggltxt" ng-click="toggleVisibility()"><i class="fa" ng-class="{\'fa-eye\': !valueVisible, \'fa-eye-slash\': valueVisible }"></i></div><div class="cell" ng-if="isURLFIELD && isLink"><a ng-href="{{value}}" target="_blank" rel="nofollow noopener noreferrer"><i tooltip="\'Open in new window\'" class="link fa fa-external-link"></i></a></div><div class="cell" ng-if="isURLFIELD && isPartialLink"><a ng-href="//{{value}}" target="_blank" rel="nofollow noopener noreferrer"><i tooltip="\'Open in new window\'" class="link fa fa-external-link"></i></a></div><div class="cell" ngclipboard-success="onSuccess(e);" ngclipboard-error="onError(e);" ngclipboard data-clipboard-text="{{value}}"><i tooltip="copy_msg" class="fa fa-files-o"></i></div></div></span>',link:function(scope){var expression=/(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/gi,regex=new RegExp(expression);$translate(["toggle.visibility","copy.field","copy","copied"]).then(function(translations){scope.tggltxt=translations["toggle.visibility"],scope.copy_msg=translations["copy.field"]}),scope.$watch("value",function(){scope.value&&(scope.secret&&(scope.valueVisible=!1),regex.test(scope.value)?scope.isLink=!0:(scope.isLink=!1,regex.test("https://"+scope.value)&&(scope.isPartialLink=!0)))}),scope.toggle||scope.secret&&(scope.toggle=!0);var timer;scope.onSuccess=function(){scope.copy_msg=$translate.instant("copied"),$timeout.cancel(timer),timer=$timeout(function(){scope.copy_msg=$translate.instant("copy")},5e3)},scope.valueVisible=!0,scope.toggleVisibility=function(){scope.valueVisible=!scope.valueVisible}}}}])}(),function(){angular.module("passmanApp").directive("credentialTemplate",["EncryptService","$translate","FileService","ShareService","NotificationService","CredentialService",function(EncryptService,$translate,FileService,ShareService,NotificationService,CredentialService){return{templateUrl:"views/partials/credential_template.html",replace:!0,restrict:"A",scope:{credential:"=credentialTemplate"},link:function(scope,element,attrs){scope.downloadFile=function(credential,file){var callback=function(result){var key=CredentialService.getSharedKeyFromCredential(credential);if(!result.hasOwnProperty("file_data"))return void NotificationService.showNotification($translate.instant("error.loading.file.perm"),5e3);var file_data=EncryptService.decryptString(result.file_data,key);
-download(file_data,escapeHTML(file.filename),file.mimetype)};credential.hasOwnProperty("acl")?ShareService.downloadSharedFile(credential,file).then(callback):FileService.getFile(file).then(callback)},scope.showLabel=attrs.hasOwnProperty("showLabel")}}}])}(),function(){angular.module("passmanApp").directive("fileSelect",["$window",function($window){return{restrict:"A",scope:{success:"&success",error:"&error",progress:"&progress"},link:function(scope,el){scope.success=scope.success(),scope.error=scope.error(),scope.progress=scope.progress();var _currentFile,fileReader=new $window.FileReader;fileReader.onload=function(){_currentFile.data=fileReader.result,scope.success(_currentFile)},fileReader.onprogress=function(event){var percent=event.loaded/event.total*100;scope.progress&&scope.$apply(scope.progress({file_total:event.total,file_loaded:event.loaded,file_percent:percent}))},fileReader.onerror=function(){scope.error()},el.bind("change",function(e){var i,_queueTotalFileSize=0;for(i=0;i<e.target.files.length;i++)_queueTotalFileSize+=e.target.files[i].size;for(i=0;i<e.target.files.length;i++){_currentFile=e.target.files[i];var mb_limit=5;_currentFile.size>1024*mb_limit*1024&&scope.error("TO_BIG",_currentFile),fileReader.readAsDataURL(_currentFile)}})}}}])}(),function(){angular.module("passmanApp").directive("credentialIcon",["$window",function($window){return{template:'<img ng-src="{{ iconUrl }}" class="icon-image">',restrict:"E",scope:{credential:"="},link:function(scope,element){scope.credential&&scope.$watch("credential",function(){if(scope.credential.icon&&scope.credential.icon.type)scope.iconUrl="data:image/"+scope.credential.icon.type+";base64,"+scope.credential.icon.content;else if(scope.credential.url){var url=window.btoa(angular.copy(scope.credential.url)).replace("/","_");scope.iconUrl=OC.generateUrl("apps/passman/api/v2/icon/")+url+"/"+scope.credential.credential_id}},!0)}}}])}(),function(){angular.module("passmanApp").directive("iconPicker",["$window","IconService","$http","NotificationService","$translate",function($window,IconService,$http,NotificationService,$translate){return{templateUrl:"views/partials/icon-picker.html",restrict:"A",scope:{credential:"=iconPicker"},link:function(scope,element){IconService.getIcons().then(function(icons){scope.iconGroupsAll=icons,scope.iconGroups=icons}),scope.selectIcon=function(icon){scope.selectedIcon=icon},scope.jumpToGroup=function(groupName){var offset=$("#"+groupName).position();$(".iconList").scrollTop(offset.top)};var search=document.getElementById("iconPicker-Search");search.addEventListener("keypress",function(e){13===e.keyCode&&e.preventDefault()}),search.addEventListener("keyup",function(e){var g={};g.Numix=[],scope.iconGroupsAll.Numix.forEach(function(element){scope.isAllowedIcon(element)&&g.Numix.push(element)}),g["essential-collection"]=[],scope.iconGroupsAll["essential-collection"].forEach(function(element){scope.isAllowedIcon(element)&&g["essential-collection"].push(element)}),g["font-awesome"]=[],scope.iconGroupsAll["font-awesome"].forEach(function(element){scope.isAllowedIcon(element)&&g["font-awesome"].push(element)}),scope.iconGroups=g,scope.$apply()}),scope.isAllowedIcon=function(IconElement){var searchval=search.value.toLowerCase(),urlCropped=IconElement.url.substring(IconElement.url.lastIndexOf("/")+1,IconElement.url.length);return!(!urlCropped.includes(searchval)&&IconElement.pack.toLowerCase()!==searchval)},$("#iconPicker-CustomIcon").on("change",function(ev){scope.customIcon={};var f=ev.target.files[0],fr=new FileReader;fr.onload=function(ev2){scope.customIcon.data=ev2.target.result,scope.$apply()},fr.readAsDataURL(f)}),scope.deleteIcon=function(){delete scope.credential.icon.type,delete scope.credential.icon.content,delete scope.credential.icon,$("#iconPicker").dialog("close")},scope.refreshUrlIcon=function(){NotificationService.showNotification($translate.instant("use.icon.refresh.trying"),5e3);var queryUrl=OC.generateUrl("apps/passman/api/v2/geticon/"+btoa(scope.credential.url));$http.get(queryUrl).then(function(response){"undefined"!=typeof response.data.content?(scope.customIcon={},scope.customIcon.data="data:image/"+response.data.type+";base64,"+response.data.content):NotificationService.showNotification($translate.instant("use.icon.refresh.error"),5e3)})},scope.useIcon=function(){if(scope.customIcon){var data=scope.customIcon.data;scope.credential.icon.type=data.substring(data.lastIndexOf(":")+1,data.lastIndexOf(";")),scope.credential.icon.content=data.substring(data.lastIndexOf(",")+1,data.length)}else $http.get(scope.selectedIcon.url).then(function(result){var base64Data=window.btoa(result.data),mimeType="svg+xml";scope.credential.icon||(scope.credential.icon={}),scope.credential.icon.type=mimeType,scope.credential.icon.content=base64Data});$("#iconPicker").dialog("close")},$(element).click(function(){$("#iconPicker").dialog({width:800,height:380,modal:!0,dialogClass:"iconpicker-dialog",close:function(){$(this).dialog("destroy")}})})}}}])}(),function(){angular.module("passmanApp").directive("ngEnter",function(){return function(scope,element,attrs){element.bind("keydown keypress",function(event){13===event.which&&(scope.$apply(function(){scope.$eval(attrs.ngEnter)}),event.preventDefault())})}})}(),function(){angular.module("passmanApp").directive("otpGenerator",["$compile","$timeout",function($compile,$timeout){function dec2hex(s){return(s<15.5?"0":"")+Math.round(s).toString(16)}function hex2dec(s){return parseInt(s,16)}function base32tohex(base32){if(base32){var i,base32chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bits="",hex="";for(i=0;i<base32.length;i++){var val=base32chars.indexOf(base32.charAt(i).toUpperCase());bits+=leftpad(val.toString(2),5,"0")}for(i=0;i+4<=bits.length;i+=4){var chunk=bits.substr(i,4);hex+=parseInt(chunk,2).toString(16)}return hex}}function leftpad(str,len,pad){return len+1>=str.length&&(str=Array(len+1-str.length).join(pad)+str),str}return{restrict:"A",template:'<span class="otp_generator"><span credential-field value="otp" secret="\'true\'"></span> <span ng-bind="timeleft"></span></span>',transclude:!1,scope:{secret:"="},replace:!0,link:function(scope){scope.otp=null,scope.timeleft=null,scope.timer=null;var updateOtp=function(){if(scope.secret){var key=base32tohex(scope.secret),epoch=Math.round((new Date).getTime()/1e3),time=leftpad(dec2hex(Math.floor(epoch/30)),16,"0"),hmacObj=new jsSHA(time,"HEX"),hmac=hmacObj.getHMAC(key,"HEX","SHA-1","HEX"),offset=hex2dec(hmac.substring(hmac.length-1)),otp=(hex2dec(hmac.substr(2*offset,8))&hex2dec("7fffffff"))+"";otp=otp.substr(otp.length-6,6),scope.otp=otp}},timer=function(){var epoch=Math.round((new Date).getTime()/1e3),countDown=30-epoch%30;epoch%30===0&&updateOtp(),scope.timeleft=countDown,scope.timer=$timeout(timer,1e3)};scope.$watch("secret",function(n){n?($timeout.cancel(scope.timer),updateOtp(),timer()):$timeout.cancel(scope.timer)},!0),scope.$on("$destroy",function(){$timeout.cancel(scope.timer)})}}}])}(),function(){angular.module("passmanApp").directive("passwordGen",function($timeout,$translate){function Arcfour(){this.j=this.i=0,this.S=[]}function ARC4init(r){var t,n,e;for(t=0;256>t;++t)this.S[t]=t;for(t=n=0;256>t;++t)n=n+this.S[t]+r[t%r.length]&255,e=this.S[t],this.S[t]=this.S[n],this.S[n]=e;this.j=this.i=0}function ARC4next(){var r;return this.i=this.i+1&255,this.j=this.j+this.S[this.i]&255,r=this.S[this.i],this.S[this.i]=this.S[this.j],this.S[this.j]=r,this.S[r+this.S[this.i]&255]}function prng_newstate(){return new Arcfour}function generatePassword(r,t,n,e,o,i,p,g){var _,a,s,f,d,h,u,l,c,v,w,y,m;if(void 0===r&&(r=8+get_random(0,1)),r>256&&(r=256,document.getElementById("length").value=256),i>256&&(i=256),void 0===t&&(t=!0),void 0===n&&(n=!0),void 0===e&&(e=!0),void 0===o&&(o=!1),void 0===i&&(i=0),void 0===p&&(p=!1),void 0===g&&(g=!0),_=0,a=0,s=0,g&&(_=a=s=1),f=[],n&&_>0)for(d=0;_>d;d++)f[f.length]="L";if(t&&a>0)for(d=0;a>d;d++)f[f.length]="U";if(e&&i>0)for(d=0;i>d;d++)f[f.length]="D";if(o&&s>0)for(d=0;s>d;d++)f[f.length]="S";for(;f.length<r;)f[f.length]="A";for(f.sort(function(){return 2*get_random(0,1)-1}),h="",u="abcdefghjkmnpqrstuvwxyz",p||(u+="ilo"),n&&(h+=u),l="ABCDEFGHJKMNPQRSTUVWXYZ",p||(l+="ILO"),t&&(h+=l),c="23456789",p||(c+="10"),e&&(h+=c),v="!@#$%^&*",o&&(h+=v),w="",y=0;r>y;y++){switch(f[y]){case"L":m=u;break;case"U":m=l;break;case"D":m=c;break;case"S":m=v;break;case"A":m=h}d=get_random(0,m.length-1),w+=m.charAt(d)}return w}function rng_seed_int(r){rng_pool[rng_pptr++]^=255&r,rng_pool[rng_pptr++]^=r>>8&255,rng_pool[rng_pptr++]^=r>>16&255,rng_pool[rng_pptr++]^=r>>24&255,rng_pptr>=rng_psize&&(rng_pptr-=rng_psize)}function rng_seed_time(){rng_seed_int((new Date).getTime())}function rng_get_byte(){if(null==rng_state){for(rng_seed_time(),rng_state=prng_newstate(),rng_state.init(rng_pool),rng_pptr=0;rng_pptr<rng_pool.length;++rng_pptr)rng_pool[rng_pptr]=0;rng_pptr=0}return rng_state.next()}function rng_get_bytes(r){var t;for(t=0;t<r.length;++t)r[t]=rng_get_byte()}function SecureRandom(){}function get_random(r,t){var n,e,o,i=t-r+1;for(rng_seed_time(),n=[],e=0;4>e;e++)n[e]=0;for(rng_get_bytes(n),o=0,e=0;4>e;e++)o*=256,o+=n[e];return o%=i,o+=r}var rng_psize,rng_state,rng_pool,rng_pptr,t,z,crypt_obj,num,buf,i;if(Arcfour.prototype.init=ARC4init,Arcfour.prototype.next=ARC4next,rng_psize=256,null==rng_pool){if(rng_pool=[],rng_pptr=0,"undefined"!=typeof navigator&&"Netscape"==navigator.appName&&navigator.appVersion<"5"&&"undefined"!=typeof window&&window.crypto)for(z=window.crypto.random(32),t=0;t<z.length;++t)rng_pool[rng_pptr++]=255&z.charCodeAt(t);try{if(crypt_obj=null,"undefined"!=typeof window&&void 0!==window.crypto?crypt_obj=window.crypto:"undefined"!=typeof window&&void 0!==window.msCrypto&&(crypt_obj=window.msCrypto),void 0!==crypt_obj&&"function"==typeof crypt_obj.getRandomValues&&rng_psize>rng_pptr)for(num=Math.floor((rng_psize-rng_pptr)/2)+1,buf=new Uint16Array(num),crypt_obj.getRandomValues(buf),i=0;i<buf.length;i++)t=buf[i],rng_pool[rng_pptr++]=t>>>8,rng_pool[rng_pptr++]=255&t}catch(e){}for(;rng_psize>rng_pptr;)t=Math.floor(65536*sjcl.random.randomWords(1)),rng_pool[rng_pptr++]=t>>>8,rng_pool[rng_pptr++]=255&t;rng_pptr=0,rng_seed_time()}return SecureRandom.prototype.nextBytes=rng_get_bytes,{scope:{model:"=ngModel",length:"@",placeholder:"@",settings:"=settings",callback:"&callback"},restrict:"E",replace:"true",template:'<div class=" pw-gen "><div class="input-group "><input ng-show="!passwordVisible" type="password" ng-disabled="disabled" class="form-control " ng-model="password" placeholder="{{placeholder}}"><input ng-show="passwordVisible" type="text" ng-disabled="disabled" class="form-control " ng-model="password" placeholder="{{placeholder}}"><span class="generate_pw"><div class="cell" tooltip="gen_msg" ng-click="generatePasswordStart()"><i class="fa fa-refresh"></i></div><div class="cell" tooltip="tggltxt" ng-click="toggleVisibility()"><i class="fa" ng-class="{\'fa-eye\': passwordVisible, \'fa-eye-slash\': !passwordVisible }"></i></div><div class="cell" tooltip="\'Copy password to clipboard\'"><i class="fa fa-clipboard" ngclipboard-success="onSuccess(e);" ngclipboard-error="onError(e);" ngclipboard data-clipboard-text="{{password}}"></i></div></button></div></div>',link:function(scope){scope.callback=scope.callback(),scope.$watch("model",function(){scope.password=scope.model}),scope.passwordVisible=!1,scope.toggleVisibility=function(){scope.passwordVisible=!scope.passwordVisible},scope.passwordNotNull=!1,scope.$watch("settings",function(){scope.settings&&!scope.password&&scope.settings.generateOnCreate&&scope.generatePasswordStart()}),$translate(["password.gen","password.copy","copied","toggle.visibility"]).then(function(translations){scope.tggltxt=translations["toggle.visibility"],scope.copy_msg=translations["password.copy"],scope.gen_msg=translations["password.gen"]}),scope.$watch("password",function(){scope.model=scope.password,scope.password_repeat=scope.model}),scope.onSuccess=function(e){OC.Notification.showTemporary($translate.instant("password.copied")),e.clearSelection()},scope.onError=function(){OC.Notification.showTemporary("Press Ctrl+C to copy!")},scope.progressDivShow=!1,scope.generatePasswordStart=function(){scope.progressDivShow=!0,scope.progressValue=0,scope.progressWidth={width:scope.progressValue+"%"},scope.generatePasswordProgress()},scope.generatePasswordProgress=function(){$timeout(function(){scope.progressValue<100?(scope.password=scope._generatePassword(scope.settings),scope.progressValue+=10,scope.progressWidth={width:scope.progressValue+"%"},scope.disabled=!0,scope.generatePasswordProgress()):(scope.disabled=!1,scope.callback&&scope.callback(scope.password))},10)},scope._generatePassword=function(settings){var _settings={length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0};settings=angular.merge(_settings,settings);var password=generatePassword(settings.length,settings.useUppercase,settings.useLowercase,settings.useDigits,settings.useSpecialChars,settings.minimumDigitCount,settings.avoidAmbiguousCharacters,settings.requireEveryCharType);return password}}}})}(),function(){angular.module("passmanApp").directive("progressBar",["$translate",function($translate){return{restrict:"A",template:'<div class="progress"><div class="progress-bar" role="progressbar" aria-valuenow="{{progress}}"aria-valuemin="0" aria-valuemax="100" style="width:{{progress}}%;" use-theme><span class="sr-only">{{progress}}% {{completed_text}}</span><span ng-if="index && total" class="progress-label" use-theme type="\'color\'" color="\'true\'">{{index}} / {{total}}</span><span ng-if="!index && !total" class="progress-label" use-theme type="\'color\'" color="\'true\'">{{progress}}%</span></div></div>',scope:{progress:"=progressBar",index:"=index",total:"=total"},link:function(scope){$translate(["complete"]).then(function(translations){scope.completed_text=translations.complete})}}}])}(),function(){angular.module("passmanApp").directive("qrread",["$parse",function($parse){return{scope:!0,link:function(scope,element,attributes){var invoker=$parse(attributes.onRead);scope.imageData=null,qrcode.callback=function(result){invoker(scope,{qrdata:{qrData:result,image:scope.imageData}})},element.bind("change",function(changeEvent){var reader=new FileReader,file=changeEvent.target.files[0];reader.readAsDataURL(file),reader.onload=function(){return function(e){scope.imageData=e.target.result,qrcode.decode(e.target.result)}}(file)})}}}])}(),function(){angular.module("passmanApp").directive("tooltip",[function(){return{restrict:"A",scope:{tooltip:"=tooltip"},link:function(scope,el){scope.$watch("tooltip",function(){scope.tooltip&&(jQuery(el).attr("title",scope.tooltip),jQuery(el).tooltip(),jQuery(el).attr("title",scope.tooltip).tooltip("fixTitle"),jQuery(".tooltip-inner").text(scope.tooltip),jQuery(el).is(":visible"))})}}}])}(),function(){angular.module("passmanApp").directive("useTheme",[function(){function invertColor(hexTripletColor){var color=hexTripletColor;return color=color.substring(1),color=parseInt(color,16),color^=16777215,color=color.toString(16),color=("000000"+color).slice(-6),color="#"+color}return{restrict:"A",scope:{type:"=type",color:"=",negative:"="},link:function(scope,el){var _color=jQuery("#header").css("background-color"),_bg=_color;scope.negative&&(_bg=invertColor(_bg)),scope.type?jQuery(el).css(scope.type,_bg):jQuery(el).css("background-color",_bg),scope.color&&jQuery(el).css("color",invertColor(_color))}}}])}();var PassmanImporter={};!function(window,$,PassmanImporter){PassmanImporter.parseRow_=function(row){row=row.trim();var isQuoted=!1;return'"'===row.charAt(0)&&(row=row.substring(1),isQuoted=!0),'"'===row.charAt(row.length-2)&&(row=row.substring(0,row.length-2),isQuoted=!0),row=isQuoted===!0?row.split('","'):row.split(",")},PassmanImporter.htmlDecode=function(input){var e=document.createElement("div");return e.innerHTML=input,e.childNodes[0].nodeValue},PassmanImporter.toObject_=function(headings,row){for(var result={},i=0,ii=row.length;i<ii;i++)headings[i]?(headings[i]=headings[i].replace(",","_").toLowerCase().replace(" ","_").replace("(","").replace(")","").replace('"',""),result[headings[i]]=row[i]):result[ii]=row[i];return result},PassmanImporter.join_=function(arr,sep){for(var parts=[],i=0,ii=arr.length;i<ii;i++)arr[i]&&parts.push(arr[i]);return parts.join(sep)},PassmanImporter.newCredential=function(){var credential={credential_id:null,guid:null,vault_id:null,label:null,description:null,created:null,changed:null,tags:[],email:null,username:null,password:null,url:null,favicon:null,renew_interval:null,expire_time:0,delete_time:0,files:[],custom_fields:[],otp:{},hidden:!1};return credential},PassmanImporter.readCsv=function(csv,hasHeadings){hasHeadings=void 0===hasHeadings||hasHeadings;var lines=[];return Papa.parse(csv,{complete:function(results){if(results.data)for(var headings=hasHeadings?results.data[0]:null,start=hasHeadings?1:0,i=start;i<results.data.length;i++){var _row=hasHeadings?PassmanImporter.toObject_(headings,results.data[i]):results.data[i];lines.push(_row)}}}),lines},PassmanImporter.readJson=function(string){return JSON.parse(string)}}(window,$,PassmanImporter),String.prototype.replaceAll=function(search,replacement){var target=this;return target.replace(new RegExp(search,"g"),replacement)},Array.prototype.clean=function(deleteValue){for(var i=0;i<this.length;i++)this[i]===deleteValue&&(this.splice(i,1),i--);return this};var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.clippers={info:{name:"Clipperz.is",id:"clippers",exportSteps:["Go to menu -> Export -> Download HTML + JSON. Fields will be imported as custom fields."]}},PassmanImporter.clippers.readFile=function(file_data){return new C_Promise(function(){var credential_list=[],re=/<textarea>(.*?)<\/textarea>/gi,matches=re.exec(file_data);if(matches){var raw_json=matches[0].substring(10);raw_json=PassmanImporter.htmlDecode(raw_json.slice(0,-11));for(var json_objects=PassmanImporter.readJson(raw_json),i=0;i<json_objects.length;i++){var card=json_objects[i];re=/(\w+)/gi;var tags=card.label.match(re);card.label=card.label.replace(tags.join(" "),"").trim(),tags=tags.map(function(item){return{text:item.replace("","")}});var _credential=PassmanImporter.newCredential();_credential.label=card.label,_credential.description=card.data.notes,_credential.tags=tags;for(var field in card.currentVersion.fields){var field_data=card.currentVersion.fields[field];_credential.custom_fields.push({label:field_data.label,value:field_data.value,secret:field_data.hidden===!0})}_credential.label&&credential_list.push(_credential);var progress={percent:i/json_objects.length*100,loaded:i,total:json_objects.length};this.call_progress(progress)}}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.dashLaneCsv={info:{name:"Dashlane 4 csv",id:"dashLaneCsv",exportSteps:["Create an csv export. Go to File -> export -> Unsecured archive (readable) in CSV format"]}},PassmanImporter.dashLaneCsv.readFile=function(file_data){return new C_Promise(function(){for(var rows=file_data.split("\n"),credential_list=[],i=0;i<rows.length;i++){var row=rows[i],row_data=row.split('","');'"'===row_data[0].charAt(0)&&(row_data[0]=row_data[0].substring(1)),'"'===row_data[row_data.length-1].toString().charAt(row_data[row_data.length-1].length-1)&&(row_data[row_data.length-1]=row_data[row_data.length-1].substring(0,row_data[row_data.length-1].length-1));var _credential=PassmanImporter.newCredential();_credential.label=row_data[0],_credential.username=row_data[2],_credential.password=row_data[row_data.length-2],_credential.url=row_data[0],_credential.description=row_data[row_data.length-1],_credential.label&&credential_list.push(_credential);var progress={percent:i/rows.length*100,loaded:i,total:rows.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){function parseEnpass(fileData){var lastProperty,matches,loginBlocks,property;loginBlocks=fileData.replaceAll("Title :","<~passman~>\nTitle :").split("<~passman~>\n").clean("");for(var regex=/(.*) : (.*)/,results=[],l=0;l<loginBlocks.length;l++){for(var loginBlock=loginBlocks[l],lrow=loginBlock.split("\n"),result={},r=0;r<lrow.length;r++){var row=lrow[r];matches=regex.exec(row),matches?(property=matches[1],result[property]=matches[2]):lastProperty&&(result[lastProperty]+="\n"+row),property&&(lastProperty=property)}results.push(result)}return results}PassmanImporter.EnPassTXT={info:{name:"EnPass text file",id:"EnPassTXT",exportSteps:['Access your Enpass Database. Select "File" > "Export" > "As Text"']}},PassmanImporter.EnPassTXT.readFile=function(file_data){var mapper={Title:"label",Username:"username",Password:"password",Email:"email",Url:"url",Note:"description"},secret_fields=["cvc","pin","security answer"];return new C_Promise(function(){for(var credential_list=[],credentials=parseEnpass(file_data),i=0;i<credentials.length;i++){var enpass_credential=credentials[i],new_credential=PassmanImporter.newCredential();for(var key in enpass_credential)if(enpass_credential.hasOwnProperty(key))if(mapper.hasOwnProperty(key)){var prop=mapper[key];new_credential[prop]=enpass_credential[key]}else if("TOTP"!==key){var isSecret=secret_fields.indexOf(key.toLowerCase())!==-1?1:0;new_credential.custom_fields.push({label:key,value:enpass_credential[key],secret:isSecret})}enpass_credential.hasOwnProperty("TOTP")&&(new_credential.otp.secret=enpass_credential.TOTP);var progress={percent:i/credentials.length*100,loaded:i,total:credentials.length};credential_list.push(new_credential),this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.keepassCsv={info:{name:"KeePass csv",id:"keepassCsv",exportSteps:["Create an csv export with the following options enabled: http://i.imgur.com/CaeTA4d.png"]}},PassmanImporter.keepassCsv.readFile=function(file_data){var p=new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=row.account,_credential.username=row.login_name,_credential.password=row.password,_credential.url=row.web_site,row.hasOwnProperty("expires")&&(row.expires=row.expires.replace('"',""),_credential.expire_time=new Date(row.expires).getTime()/1e3);var tags=row.group?[{text:row.group}]:[];if(row.hasOwnProperty("group_tree"))for(var exploded_tree=row.group_tree.split("\\\\"),t=0;t<exploded_tree.length;t++)exploded_tree[t].trim().length>0&&tags.push({text:exploded_tree[t].trim()});_credential.tags=tags,credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)});return p}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.lastpassCsv={info:{name:"LastPass csv",id:"lastpassCsv",exportSteps:["Create an csv export. Go to More options -> Advanced -> Export -> Last Pass CSV File"]}},PassmanImporter.lastpassCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=PassmanImporter.htmlDecode(row.name),_credential.username=row.username,_credential.password=row.password,_credential.url=row.url,_credential.tags=row.grouping?[{text:row.grouping}]:[],_credential.description=row.extra,_credential.label&&"undefined"!==_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){var steps=["Backups for the Passwords app need to be enabled on the Admin panel (they are disabled by default).","On the Passwords App, in the bottom left corner, press Settings",'Press "Download Backup"',"Confirm the export and save the file"];PassmanImporter.passwordsApp={info:{name:"Passwords App csv",id:"passwordsApp",exportSteps:steps}},PassmanImporter.passwordsApp.readFile=function(file_data){var p=new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=row.website+" - "+row.username,_credential.username=row.username,_credential.password=row.password,_credential.url=row.fulladdress,_credential.description=row.notes,credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)});return p}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.padlock={info:{name:"Padlock",id:"padlock",exportSteps:["Create a csv export. Go to Menu -> Settings -> Export Data and copy text into a .csv file"]}},PassmanImporter.padlock.readFile=function(file_data){return new C_Promise(function(){for(var rows=PassmanImporter.readCsv(file_data,!0),credential_list=[],i=0;i<rows.length;i++){var row=rows[i],_credential=PassmanImporter.newCredential(),j=0;for(var k in row)row[k]&&("name"!=k?"username"!=k?"password"!=k?"url"!=k.toLowerCase()?"e-mail"!=k.toLowerCase()&&"email"!=k.toLowerCase()?"description"!=k.toLowerCase()?(_credential.custom_fields[j]={label:k,value:row[k],secret:!0,field_type:"text"},j++):_credential.description=row[k]:_credential.email=row[k]:_credential.url=row[k]:_credential.password=row.password:_credential.username=row.username:_credential.label=row.name);_credential.label&&credential_list.push(_credential);var progress={percent:i/rows.length*100,loaded:i,total:rows.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.passmanJson={info:{name:"Passman JSON",id:"passmanJson",exportSteps:["Export the item in passman as passman json, with all fields enabled"]}},PassmanImporter.passmanJson.readFile=function(file_data){return new C_Promise(function(){for(var parsed_json=PassmanImporter.readJson(file_data),credential_list=[],i=0;i<parsed_json.length;i++){var item=parsed_json[i],_credential=PassmanImporter.newCredential();if(_credential.label=item.label,_credential.username=item.username,_credential.password=item.password,_credential.email=item.email,_credential.url=item.url,_credential.tags=item.tags,_credential.description=item.description,item.hasOwnProperty("customFields")&&item.customFields.length>0)for(var cf=0;cf<item.customFields.length;cf++)_credential.custom_fields.push({label:item.customFields[cf].label,value:item.customFields[cf].value,secret:"1"===item.customFields[cf].clicktoshow});item.hasOwnProperty("otpsecret")&&item.otpsecret&&(_credential.otp={issuer:item.otpsecret.issuer,label:item.otpsecret.label,qr_uri:{image:item.otpsecret.qrCode,qrData:""},secret:item.otpsecret.secret,type:item.otpsecret.type}),_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_json.length*100,loaded:i,total:parsed_json.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.passpackCsv={info:{name:"Passpack csv",id:"passpackCsv",exportSteps:["Go to Tools -> Export. Select Comma Separated Values, All entries then continue."]}},PassmanImporter.passpackCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data,!1),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=row[0],_credential.username=row[1],_credential.password=row[2],_credential.url=row[3];var tags=row[4].split(" ");tags.length>0&&(_credential.tags=tags.map(function(item){if(item)return{text:item}}).filter(function(item){return item})),_credential.description=row[5],_credential.email=row[6],_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.randomData={info:{name:"Random data",id:"randomData",exportSteps:["Create's 50 random credentials for testing purposes."]}},PassmanImporter.randomData.readFile=function(){return new C_Promise(function(){var label,tags=["Social media","Hosting","Forums","Webshops","FTP","SSH","Banking","Applications","Server stuff","mysql","Wifi","Games","Certificate","Serials"],credential_list=[],_this=this,generateCredential=function(max,i,callback){if(jQuery){var url=OC.generateUrl("apps/passman/api/internal/generate_person");$.ajax({url:url,dataType:"json",success:function(data){if(data){var _credential=PassmanImporter.newCredential();label=Math.random()>=.5?data.domain:data.email_d+" - "+data.email_u,_credential.label=label,_credential.username=data.username,_credential.password=data.password,_credential.url=data.url;for(var tag_amount=Math.floor(5*Math.random()),ta=0,_tags=[];ta<tag_amount;){var item=tags[Math.floor(Math.random()*tags.length)];_tags.indexOf(item)===-1&&(_tags.push(item),ta++)}if(_credential.tags=_tags.map(function(item){if(item)return{text:item}}).filter(function(item){return item}),credential_list.push(_credential),i<max){var progress={percent:i/max*100,loaded:i,total:max};_this.call_progress(progress),generateCredential(max,i+1,callback)}else callback(credential_list)}else generateCredential(max,i,callback)}})}};generateCredential(50,1,function(credential_list){_this.call_then(credential_list)})})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.teamPassCsv={info:{name:"TeamPass csv",id:"teamPassCsv",exportSteps:["Go to Tools -> Export. Select Comma Separated Values, All entries then continue."]}},PassmanImporter.teamPassCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data,!1),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=row[1],_credential.description=row[2],_credential.password=row[3],_credential.username=row[4];var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};credential_list.push(_credential),this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};if(function(window,$,PassmanImporter){PassmanImporter.zohoCsv={info:{name:"ZOHO csv",id:"zohoCsv",exportSteps:['Create an csv export. Go to Tools -> Export secrets -> Select "General CSV" and click "Export Secrets"']}},PassmanImporter.zohoCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();if(_credential.label=row.secret_name,_credential.url=row.secret_url,_credential.description=row.notes,
-row.hasOwnProperty("secretdata"))for(var rows=row.secretdata.split("\n"),r=0;r<rows.length;r++){var cells=rows[r].split(":"),key=cells[0],value=cells.slice(1).join(":");key&&value&&_credential.custom_fields.push({label:key,value:value,secret:!1})}""!==_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter),!window.PassmanExporter)var PassmanExporter={getCredentialsWithFiles:function(credentials,FileService,EncryptService){var t={cred:credentials,FS:FileService,ES:EncryptService};return new C_Promise(function(){var _this=this.parent,credentials=_this.cred;this.parent.total=0,this.parent.finished=0,this.parent.fileGUID_cred=[],this.parent.files=[],this.parent.step=function(file){this.parent.finished++,this.call_progress({total:this.parent.total,finished:this.parent.finished});var dta=this.parent.fileGUID_cred[file.guid];file.filename=this.parent.ES.decryptString(file.filename,this.parent.cred[dta.cred_pos].vault_key),file.file_data=this.parent.ES.decryptString(file.file_data,this.parent.cred[dta.cred_pos].vault_key),"files"===dta.on?this.parent.cred[dta.cred_pos][dta.on][dta.at]=file:this.parent.cred[dta.cred_pos][dta.on][dta.at].value=file,this.parent.total===this.parent.finished&&this.call_then(this.parent.cred)}.bind(this);for(var i=0;i<credentials.length;i++){var item=credentials[i];for(c=0;c<item.custom_fields.length;c++){var cf=item.custom_fields[c];"file"===cf.field_type&&(this.parent.total++,this.parent.fileGUID_cred[cf.value.guid]={cred_pos:i,on:"custom_fields",at:c},this.parent.FS.getFile(cf.value).then(function(data){this.parent.step(data)}.bind(this)))}for(var c=0;c<item.files.length;c++)this.parent.total++,this.parent.fileGUID_cred[item.files[c].guid]={cred_pos:i,on:"files",at:c},this.parent.FS.getFile(item.files[c]).then(function(data){this.parent.step(data)}.bind(this))}0===this.parent.total&&this.call_then(this.parent.cred)},t)}};PassmanExporter.csv={info:{name:"CSV",id:"csv",description:"Export credentials as a csv file."}},PassmanExporter.csv.export=function(credentials,FileService,EncryptService){return new C_Promise(function(){PassmanExporter.getCredentialsWithFiles(credentials,FileService,EncryptService).then(function(){for(var headers=["label","username","password","email","description","tags","url","custom_fields","files"],file_data='"'+headers.join('","')+'"\n',i=0;i<credentials.length;i++){for(var _credential=credentials[i],row_data=[],h=0;h<headers.length;h++){var field=headers[h];if("tags"===field){for(var _tags=[],t=0;t<_credential[field].length;t++)_tags.push(_credential[field][t].text);var tag_data="["+_tags.join(",")+"]";row_data.push('"'+tag_data.replaceAll('"','""')+'"')}else if("custom_fields"==field||"files"==field){var _fields=JSON.stringify(_credential[field]);_fields=_fields.replaceAll('"','""'),row_data.push('"'+_fields+'"')}else{var data=_credential[field],value=null===data?"":data.replaceAll('"','""');row_data.push('"'+value+'"')}}var progress={percent:i/credentials.length*100,loaded:i,total:credentials.length};this.call_progress(progress),file_data+=row_data.join(",")+"\n"}this.call_then(),download(file_data,"passman-export.csv","text/csv")}.bind(this)).progress(function(){})})},PassmanExporter.json={info:{name:"JSON",id:"json",description:"Export credentials as a JSON file."}},PassmanExporter.json.export=function(credentials,FileService,EncryptService){return new C_Promise(function(){PassmanExporter.getCredentialsWithFiles(credentials,FileService,EncryptService).then(function(){for(var _output=[],i=0;i<credentials.length;i++){var _credential=angular.copy(credentials[i]);delete _credential.vault_key,delete _credential.vault_id,delete _credential.shared_key,_output.push(_credential);var progress={percent:i/credentials.length*100,loaded:i,total:credentials.length};this.call_progress(progress)}var file_data=JSON.stringify(_output);this.call_then(),download(file_data,"passman-export.json")}.bind(this)).progress(function(){})})},function(){angular.module("passmanApp").controller("BookmarkletCtrl",["$scope","$rootScope","$location","VaultService","CredentialService","SettingsService","NotificationService","EncryptService","TagService","FileService","ShareService","$translate",function($scope,$rootScope,$location,VaultService,CredentialService,SettingsService,NotificationService,EncryptService,TagService,FileService,ShareService,$translate){if($scope.active_vault=!1,$scope.http_warning_hidden=!0,"http"===$location.$$protocol&&($scope.using_http=!0),$scope.logout=function(){$rootScope.override_default_vault=!0,$scope.active_vault=!1},SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));VaultService.getVault(_vault).then(function(vault){vault.vaultKey=angular.copy(SettingsService.getSetting("defaultVaultPass")),VaultService.setActiveVault(vault),$scope.active_vault=vault,$scope.pwSettings=VaultService.getVaultSetting("pwSettings",{length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0,generateOnCreate:!0})})}VaultService.getVaults().then(function(vaults){$scope.vaults=vaults}),$scope.default_vault=!1,$scope.remember_vault_password=!1,$scope.list_selected_vault=!1,$scope.toggleDefaultVault=function(){$scope.default_vault=!$scope.default_vault,$scope.default_vault===!0?SettingsService.setSetting("defaultVault",$scope.list_selected_vault):SettingsService.setSetting("defaultVault",null)},$scope.toggleRememberPassword=function(){$scope.remember_vault_password=!$scope.remember_vault_password,$scope.remember_vault_password&&(SettingsService.setSetting("defaultVault",$scope.list_selected_vault),$scope.default_vault=!0),$scope.remember_vault_password!==!0&&SettingsService.setSetting("defaultVault",null)},$scope.clearState=function(){$scope.list_selected_vault=!1,$scope.creating_vault=!1,$scope.error=!1},$scope.selectVault=function(vault){$scope.list_selected_vault=vault},$scope.sharing_keys={},$scope.newVault=function(){$scope.creating_vault=!0;var key_size=1024;ShareService.generateRSAKeys(key_size).progress(function(progress){var p=progress>0?2:1,msg=$translate.instant("generating.sharing.keys");msg=msg.replace("%step",p),$scope.creating_keys=msg,$scope.$digest()}).then(function(kp){var pem=ShareService.rsaKeyPairToPEM(kp);$scope.creating_keys=!1,$scope.sharing_keys.private_sharing_key=pem.privateKey,$scope.sharing_keys.public_sharing_key=pem.publicKey,$scope.$digest()})};var _loginToVault=function(vault,vault_key){var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),delete _vault.credentials,$scope.active_vault=_vault};$scope.vaultDecryptionKey="",$scope.loginToVault=function(vault,vault_key){$scope.error=!1;var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault);try{EncryptService.decryptString(vault.challenge_password),$scope.remember_vault_password&&SettingsService.setSetting("defaultVaultPass",vault_key),_loginToVault(vault,vault_key)}catch(e){$scope.error=$translate.instant("invalid.vault.key")}},$scope.createVault=function(vault_name,vault_key,vault_key2){return vault_key!==vault_key2?void($scope.error=$translate.instant("password.do.not.match")):void VaultService.createVault(vault_name).then(function(vault){$scope.vaults.push(vault);var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault);var test_credential=CredentialService.newCredential();test_credential.label="Test key for vault "+vault_name,test_credential.hidden=!0,test_credential.vault_id=vault.vault_id,test_credential.password="lorum ipsum",CredentialService.createCredential(test_credential).then(function(){_vault.public_sharing_key=angular.copy($scope.sharing_keys.public_sharing_key),_vault.private_sharing_key=EncryptService.encryptString(angular.copy($scope.sharing_keys.private_sharing_key)),VaultService.updateSharingKeys(_vault).then(function(){_loginToVault(vault,vault_key)})})})},$scope.storedCredential=CredentialService.newCredential();var QueryString=function(){for(var query_string={},query=window.location.search.substring(1),vars=query.split("&"),i=0;i<vars.length;i++){var pair=vars[i].split("=");if("undefined"==typeof query_string[pair[0]])query_string[pair[0]]=decodeURIComponent(pair[1]);else if("string"==typeof query_string[pair[0]]){var arr=[query_string[pair[0]],decodeURIComponent(pair[1])];query_string[pair[0]]=arr}else query_string[pair[0]].push(decodeURIComponent(pair[1]))}return query_string}(),query_string=QueryString;$scope.storedCredential.label=query_string.title,$scope.storedCredential.url=query_string.url,$scope.setHttpWarning=function(state){$scope.http_warning_hidden=state},$translate(["general","password","custom.fields","files","otp"]).then(function(translations){$scope.tabs=[{title:translations.general,url:"views/partials/forms/edit_credential/basics.html",color:"blue"},{title:translations.password,url:"views/partials/forms/edit_credential/password.html",color:"green"},{title:translations["custom.fields"],url:"views/partials/forms/edit_credential/custom_fields.html",color:"orange"},{title:translations.files,url:"views/partials/forms/edit_credential/files.html",color:"yellow"},{title:translations.otp,url:"views/partials/forms/edit_credential/otp.html",color:"purple"}],$scope.currentTab=$scope.tabs[0]}),$scope.getTags=function($query){return TagService.searchTag($query)},$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url},$scope.pwGenerated=function(pass){$scope.storedCredential.password_repeat=pass};var _customField={label:"",value:"",secret:!1,field_type:"text"};$scope.selected_field_type="text",$scope.new_custom_field=angular.copy(_customField),$scope.addCustomField=function(){var _field=angular.copy($scope.new_custom_field);if(_field.label||NotificationService.showNotification($translate.instant("error.no.label"),3e3),_field.value||NotificationService.showNotification($translate.instant("error.no.value"),3e3),_field.label&&_field.value)if($scope.selected_field_type="text",_field.secret=angular.copy("password"===$scope.selected_field_type),_field.field_type=angular.copy($scope.selected_field_type),"file"===_field.field_type){var _file=$scope.new_custom_field.value;FileService.uploadFile(_file).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename),_field.value=result,$scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)})}else $scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)},$scope.addFileToCustomField=function(file){var _file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};$scope.new_custom_field.value=_file,$scope.$digest()},$scope.deleteCustomField=function(field){field.hasOwnProperty("field_type")&&"file"===field.field_type&&FileService.deleteFile(field.value);var idx=$scope.storedCredential.custom_fields.indexOf(field);$scope.storedCredential.custom_fields.splice(idx,1)},$scope.new_file={name:"",data:null},$scope.deleteFile=function(file){var idx=$scope.storedCredential.files.indexOf(file);FileService.deleteFile(file).then(function(){$scope.storedCredential.files.splice(idx,1)})},$scope.fileLoaded=function(file){var _file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};FileService.uploadFile(_file).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename),$scope.storedCredential.files.push(result)}),$scope.$digest()},$scope.fileLoadError=function(error){return error},$scope.selected_file="",$scope.fileprogress=[],$scope.fileSelectProgress=function(progress){progress&&($scope.fileprogress=progress,$scope.$digest())},$scope.renewIntervalValue=0,$scope.renewIntervalModifier="0",$scope.updateInterval=function(renewIntervalValue,renewIntervalModifier){var value=parseInt(renewIntervalValue),modifier=parseInt(renewIntervalModifier);value&&modifier&&($scope.storedCredential.renew_interval=value*modifier)},$scope.parseQR=function(QRCode){var parsedQR,qrInfo,re=/otpauth:\/\/(totp|hotp)\/(.*)\?(secret|issuer)=(.*)&(issuer|secret)=(.*)/;qrInfo=[],parsedQR=QRCode.qrData.match(re),parsedQR&&(qrInfo={type:parsedQR[1],label:decodeURIComponent(parsedQR[2]),qr_uri:QRCode}),qrInfo[parsedQR[3]]=parsedQR[4],qrInfo[parsedQR[5]]=parsedQR[6],$scope.storedCredential.otp=qrInfo,$scope.$digest()},$scope.saveCredential=function(){delete $scope.storedCredential.password_repeat,$scope.storedCredential.credential_id||($scope.storedCredential.vault_id=$scope.active_vault.vault_id,CredentialService.createCredential($scope.storedCredential).then(function(){NotificationService.showNotification($translate.instant("credential.created"),5e3)}))}}])}(),function(){angular.module("passmanApp").controller("CredentialCtrl",["$scope","VaultService","SettingsService","$location","CredentialService","$rootScope","FileService","EncryptService","TagService","$timeout","NotificationService","CacheService","ShareService","SharingACL","$interval","$filter","$routeParams","$sce","$translate",function($scope,VaultService,SettingsService,$location,CredentialService,$rootScope,FileService,EncryptService,TagService,$timeout,NotificationService,CacheService,ShareService,SharingACL,$interval,$filter,$routeParams,$sce,$translate){if($scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=angular.copy(SettingsService.getSetting("defaultVaultPass")),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else $scope.active_vault||$location.path("/");$scope.show_spinner=!0;var fetchCredentials=function(){VaultService.getVault({guid:$routeParams.vault_id}).then(function(vault){var vaultKey=angular.copy($scope.active_vault.vaultKey),_credentials=angular.copy(vault.credentials);vault.credentials=[],$scope.active_vault=vault,$scope.active_vault.vaultKey=vaultKey,$rootScope.vaultCache||($rootScope.vaultCache=[]),VaultService.setActiveVault($scope.active_vault);for(var i=0;i<_credentials.length;i++){var _credential=_credentials[i];try{if(_credential.shared_key){var enc_key=EncryptService.decryptString(_credential.shared_key);_credential=ShareService.decryptSharedCredential(angular.copy(_credential),enc_key)}else _credential=CredentialService.decryptCredential(angular.copy(_credential));_credential.tags_raw=_credential.tags}catch(e){NotificationService.showNotification($translate.instant("error.decrypt"),5e3)}_credentials[i]=_credential}ShareService.getCredendialsSharedWithUs(vault.guid).then(function(shared_credentials){for(var c=0;c<shared_credentials.length;c++){var _shared_credential_data,_shared_credential=shared_credentials[c],decrypted_key=EncryptService.decryptString(_shared_credential.shared_key);try{_shared_credential_data=ShareService.decryptSharedCredential(_shared_credential.credential_data,decrypted_key)}catch(e){}_shared_credential_data&&(delete _shared_credential.credential_data,_shared_credential_data.acl=_shared_credential,_shared_credential_data.acl.permissions=new SharingACL(_shared_credential_data.acl.permissions),_shared_credential_data.tags_raw=_shared_credential_data.tags,_credentials.push(_shared_credential_data))}if(angular.merge($scope.active_vault.credentials,_credentials),$scope.show_spinner=!1,$rootScope.$broadcast("credentials_loaded"),$rootScope.vaultCache[$scope.active_vault.guid]=angular.copy($scope.active_vault),!vault.private_sharing_key){var key_size=1024;ShareService.generateRSAKeys(key_size).then(function(kp){var pem=ShareService.rsaKeyPairToPEM(kp);$scope.creating_keys=!1,$scope.active_vault.private_sharing_key=pem.privateKey,$scope.active_vault.public_sharing_key=pem.publicKey,$scope.$digest(),VaultService.updateSharingKeys($scope.active_vault)})}})})},getPendingShareRequests=function(){ShareService.getPendingRequests().then(function(shareRequests){shareRequests.length>0&&($scope.incoming_share_requests=shareRequests,jQuery(".share_popup").dialog({width:800,modal:!0,dialogClass:"shareincoming-dialog"}))})},refresh_data_interval=null;$scope.active_vault&&($scope.$parent.selectedVault=!0,$rootScope.vaultCache&&$rootScope.vaultCache[$scope.active_vault.guid]?($scope.active_vault=$rootScope.vaultCache[$scope.active_vault.guid],$rootScope.$broadcast("credentials_loaded"),$scope.show_spinner=!1):fetchCredentials(),getPendingShareRequests(),refresh_data_interval=$interval(function(){fetchCredentials(),getPendingShareRequests()},3e5)),$scope.$on("$destroy",function(){$interval.cancel(refresh_data_interval)}),$scope.permissions=new SharingACL(0),$scope.hasPermission=function(acl,permission){if(acl){var tmp=new SharingACL(acl.permission);return tmp.hasPermission(permission)}return!0},$scope.acceptShareRequest=function(share_request){var crypted_shared_key=share_request.shared_key,private_key=EncryptService.decryptString(VaultService.getActiveVault().private_sharing_key);private_key=ShareService.rsaPrivateKeyFromPEM(private_key),crypted_shared_key=private_key.decrypt(forge.util.decode64(crypted_shared_key)),crypted_shared_key=EncryptService.encryptString(crypted_shared_key),ShareService.saveSharingRequest(share_request,crypted_shared_key).then(function(){var idx=$scope.incoming_share_requests.indexOf(share_request);$scope.incoming_share_requests.splice(idx,1);for(var active_share_requests=!1,v=0;v<$scope.incoming_share_requests.length;v++)$scope.incoming_share_requests[v].target_vault_id===$scope.active_vault.vault_id&&(active_share_requests=!0);active_share_requests===!1&&(jQuery(".ui-dialog").remove(),fetchCredentials())})},$scope.declineShareRequest=function(share_request){ShareService.declineSharingRequest(share_request).then(function(){var idx=$scope.incoming_share_requests.indexOf(share_request);$scope.incoming_share_requests.splice(idx,1);for(var active_share_requests=!1,v=0;v<$scope.incoming_share_requests.length;v++)$scope.incoming_share_requests[v].target_vault_id===$scope.active_vault.vault_id&&(active_share_requests=!0);active_share_requests===!1&&(jQuery(".ui-dialog").remove(),fetchCredentials())})};var settingsLoaded=function(){$scope.settings=SettingsService.getSettings()};SettingsService.getSetting("settings_loaded")?settingsLoaded():$rootScope.$on("settings_loaded",function(){settingsLoaded()}),$scope.addCredential=function(){var new_credential=CredentialService.newCredential(),enc_c=CredentialService.encryptCredential(new_credential);SettingsService.setSetting("edit_credential",enc_c),$location.path("/vault/"+$scope.active_vault.guid+"/new")},$scope.editCredential=function(credential){var _credential=angular.copy(credential);$rootScope.$emit("app_menu",!1),SettingsService.setSetting("edit_credential",CredentialService.encryptCredential(_credential)),$location.path("/vault/"+$scope.active_vault.guid+"/edit/"+_credential.guid)},$scope.getRevisions=function(credential){var _credential=angular.copy(credential);$rootScope.$emit("app_menu",!1),SettingsService.setSetting("revision_credential",CredentialService.encryptCredential(_credential)),$location.path("/vault/"+$scope.active_vault.guid+"/"+_credential.guid+"/revisions")},$scope.shareCredential=function(credential){var _credential=angular.copy(credential);$rootScope.$emit("app_menu",!1),SettingsService.setSetting("share_credential",CredentialService.encryptCredential(_credential)),$location.path("/vault/"+$scope.active_vault.guid+"/"+_credential.guid+"/share")};var notification;$scope.deleteCredential=function(credential){var _credential=angular.copy(credential);try{_credential=CredentialService.decryptCredential(_credential)}catch(e){}_credential.delete_time=(new Date).getTime()/1e3;for(var i=0;i<$scope.active_vault.credentials.length;i++)$scope.active_vault.credentials[i].credential_id===credential.credential_id&&($scope.active_vault.credentials[i].delete_time=_credential.delete_time);$scope.closeSelected(),notification&&NotificationService.hideNotification(notification);var key=CredentialService.getSharedKeyFromCredential(_credential);CredentialService.updateCredential(_credential,!1,key).then(function(){notification=NotificationService.showNotification($translate.instant("credential.deleted"),5e3)})},$scope.recoverCredential=function(credential){var _credential=angular.copy(credential);try{_credential=CredentialService.decryptCredential(_credential)}catch(e){}for(var i=0;i<$scope.active_vault.credentials.length;i++)$scope.active_vault.credentials[i].credential_id===credential.credential_id&&($scope.active_vault.credentials[i].delete_time=0);_credential.delete_time=0,$scope.closeSelected(),notification&&NotificationService.hideNotification(notification);var key=CredentialService.getSharedKeyFromCredential(_credential);CredentialService.updateCredential(_credential,!1,key).then(function(){NotificationService.showNotification($translate.instant("credential.recovered"),5e3)})},$scope.destroyCredential=function(credential){var _credential=angular.copy(credential);CredentialService.destroyCredential(_credential.guid).then(function(){for(var i=0;i<$scope.active_vault.credentials.length;i++)if($scope.active_vault.credentials[i].credential_id===credential.credential_id){$scope.active_vault.credentials.splice(i,1),NotificationService.showNotification($translate.instant("credential.destroyed"),5e3);break}})},$scope.view_mode="list",$scope.switchViewMode=function(viewMode){$scope.view_mode=viewMode},$rootScope.$on("push_decrypted_credential_to_list",function(){$rootScope.$broadcast("credentials_loaded")}),$scope.filterOptions={filterText:"",fields:["label","username","email","custom_fields"]},$scope.$on("nc_searchbox",function(event,searchterm,fields){$scope.filterOptions.filterText=searchterm,fields&&($scope.filterOptions.fields=fields)}),$scope.filtered_credentials=[],$scope.$watch("[selectedtags, filterOptions, delete_time, active_vault.credentials]",function(){if($scope.active_vault&&$scope.active_vault.credentials){var credentials=angular.copy($scope.active_vault.credentials),filtered_credentials=$filter("credentialSearch")(credentials,$scope.filterOptions);filtered_credentials=$filter("tagFilter")(filtered_credentials,$scope.selectedtags),filtered_credentials=$filter("filter")(filtered_credentials,{hidden:0}),$scope.filtered_credentials=filtered_credentials,$scope.filterOptions.selectedtags=angular.copy($scope.selectedtags);for(var i=0;i<$scope.active_vault.credentials.length;i++){var _credential=$scope.active_vault.credentials[i];_credential.tags&&TagService.addTags(_credential.tags)}}},!0),$scope.no_credentials_label=[],$scope.no_credentials_label.all=!0,$scope.no_credentials_label.s_good=!1,$scope.no_credentials_label.s_medium=!1,$scope.no_credentials_label.s_low=!1,$scope.no_credentials_label.expired=!1,$scope.disableAllLabels=function(){$scope.no_credentials_label.all=!1,$scope.no_credentials_label.s_good=!1,$scope.no_credentials_label.s_medium=!1,$scope.no_credentials_label.s_low=!1,$scope.no_credentials_label.expired=!1},$scope.$on("filterSpecial",function(event,args){switch($scope.disableAllLabels(),args){case"strength_good":$scope.filterStrength(3,1e3),$scope.no_credentials_label.s_good=!0;break;case"strength_medium":$scope.filterStrength(2,3),$scope.no_credentials_label.s_medium=!0;break;case"strength_low":$scope.filterStrength(0,1),$scope.no_credentials_label.s_low=!0;break;case"expired":$scope.filterExpired(),$scope.no_credentials_label.expired=!0;break;case"all":$scope.filterAll(),$scope.no_credentials_label.all=!0}}),$scope.getListSizes=function(){for(var l=$scope.filtered_credentials,deleted=0,i=0;i<l.length;i++)l[i].delete_time>0&&deleted++;var result=[];return result.listsize=l.length,result.listsize_wout_deleted=l.length-deleted,result.listsize_deleted=deleted,result},$scope.filterAll=function(){$scope.selectedtags=[],$scope.filterOptions.filterText="";for(var creds_filtered=[],i=0;i<$scope.active_vault.credentials.length;i++)0===$scope.active_vault.credentials[i].delete_time&&creds_filtered.push($scope.active_vault.credentials[i]);$scope.filtered_credentials=$scope.filterHidden(creds_filtered)},$scope.filterStrength=function(strength_min,strength_max){for(var initialCredentials=$scope.active_vault.credentials,postFiltered=[],i=0;i<initialCredentials.length;i++){var _credential=initialCredentials[i],zxcvbn_result=zxcvbn(_credential.password);zxcvbn_result.score>=strength_min&&zxcvbn_result.score<=strength_max&&postFiltered.push(initialCredentials[i])}$scope.filtered_credentials=$scope.filterHidden(postFiltered)},$scope.filterExpired=function(){for(var initialCredentials=$scope.active_vault.credentials,now=Date.now(),postFiltered=[],i=0;i<initialCredentials.length;i++){var _credential=initialCredentials[i];0!==_credential.expire_time&&_credential.expire_time<=now&&postFiltered.push(initialCredentials[i])}$scope.filtered_credentials=$scope.filterHidden(postFiltered)},$scope.filterHidden=function(list){for(var list_without_hidden=[],i=0;i<list.length;i++)1!==list[i].hidden&&list_without_hidden.push(list[i]);return list_without_hidden},$scope.selectedtags=[];var to;$rootScope.$on("selected_tags_updated",function(evt,_sTags){for(var _selectedTags=[],x=0;x<_sTags.length;x++)_selectedTags.push(_sTags[x].text);$scope.selectedtags=_selectedTags,$timeout.cancel(to),_selectedTags.length>0&&(to=$timeout(function(){if($scope.filtered_credentials){for(var _filtered_tags=[],i=0;i<$scope.filtered_credentials.length;i++)for(var tags=$scope.filtered_credentials[i].tags_raw,x=0;x<tags.length;x++){var tag=tags[x].text;_filtered_tags.indexOf(tag)===-1&&_filtered_tags.push(tag)}$rootScope.$emit("limit_tags_in_list",_filtered_tags)}},50))}),$scope.delete_time=0,$scope.showCredentialRow=function(credential){return 0===$scope.delete_time?0===credential.delete_time:credential.delete_time>$scope.delete_time},$rootScope.$on("set_delete_time",function(event,time){$scope.delete_time=time}),$scope.setDeleteTime=function(delete_time){$scope.delete_time=delete_time},$scope.selectedCredential=!1,$scope.selectCredential=function(credential){credential.description&&(credential.description_html=$sce.trustAsHtml(angular.copy(credential.description).replace("\n","<br />"))),$scope.selectedCredential=angular.copy(credential),$rootScope.$emit("app_menu",!0)},$scope.closeSelected=function(){$rootScope.$emit("app_menu",!1),$scope.selectedCredential=!1},$rootScope.$on("logout",function(){$scope.active_vault&&($rootScope.vaultCache[$scope.active_vault.guid]=null),$scope.active_vault=null,$scope.credentials=[],VaultService.clearVaultService()}),$scope.clearState=function(){$scope.delete_time=0}}])}(),function(){angular.module("passmanApp").controller("CredentialEditCtrl",["$scope","VaultService","CredentialService","SettingsService","$location","$routeParams","FileService","EncryptService","TagService","NotificationService","ShareService","$translate","$rootScope",function($scope,VaultService,CredentialService,SettingsService,$location,$routeParams,FileService,EncryptService,TagService,NotificationService,ShareService,$translate,$rootScope){if($scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else if(!$scope.active_vault)return void $location.path("/");VaultService.getVault($scope.active_vault).then(function(vault){vault.vaultKey=VaultService.getActiveVault().vaultKey,delete vault.credentials,VaultService.setActiveVault(vault),$scope.pwSettings=VaultService.getVaultSetting("pwSettings",{length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0,generateOnCreate:!0})}),$scope.currentTab={title:$translate.instant("general"),url:"views/partials/forms/edit_credential/basics.html",color:"blue"},$scope.otpType="qrcode",$translate(["general","password","custom.fields","files","otp"]).then(function(translations){$scope.tabs=[{title:translations.general,url:"views/partials/forms/edit_credential/basics.html",color:"blue"},{title:translations.password,url:"views/partials/forms/edit_credential/password.html",color:"green"},{title:translations["custom.fields"],url:"views/partials/forms/edit_credential/custom_fields.html",color:"orange"},{title:translations.files,url:"views/partials/forms/edit_credential/files.html",color:"yellow"},{title:translations.otp,url:"views/partials/forms/edit_credential/otp.html",color:"purple"}],$scope.currentTab=$scope.tabs[0]}),$scope.active_vault&&($scope.$parent.selectedVault=!0);var storedCredential=SettingsService.getSetting("edit_credential");storedCredential?($scope.storedCredential=CredentialService.decryptCredential(angular.copy(storedCredential)),$scope.storedCredential.password_repeat=angular.copy($scope.storedCredential.password),$scope.storedCredential.expire_time=1e3*$scope.storedCredential.expire_time):CredentialService.getCredential($routeParams.credential_id).then(function(result){$scope.storedCredential=CredentialService.decryptCredential(angular.copy(result))}),$scope.oldPassword=$scope.storedCredential.password,$scope.getTags=function($query){return TagService.searchTag($query)},$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url},$scope.pwGenerated=function(pass){$scope.storedCredential.password_repeat=pass};var _customField={label:"",value:"",secret:!1,field_type:"text"};$scope.selected_field_type="text",$scope.new_custom_field=angular.copy(_customField),$scope.addCustomField=function(){var _field=angular.copy($scope.new_custom_field);if(_field.label||NotificationService.showNotification($translate.instant("error.no.label"),3e3),_field.value||NotificationService.showNotification($translate.instant("error.no.value"),3e3),_field.label&&_field.value)if($scope.selected_field_type="text",_field.secret="password"===_field.field_type,"file"===_field.field_type){var key=!1,_file=$scope.new_custom_field.value;!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),FileService.uploadFile(_file,key).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename,key),_field.value=result,$scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)})}else $scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)},$scope.addFileToCustomField=function(file){$scope.new_custom_field.value={filename:file.name,size:file.size,mimetype:file.type,data:file.data},$scope.$digest()},$scope.deleteCustomField=function(field){field.hasOwnProperty("field_type")&&"file"===field.field_type&&FileService.deleteFile(field.value);var idx=$scope.storedCredential.custom_fields.indexOf(field);$scope.storedCredential.custom_fields.splice(idx,1)},$scope.new_file={name:"",data:null},$scope.deleteFile=function(file){var idx=$scope.storedCredential.files.indexOf(file);
-FileService.deleteFile(file).then(function(){$scope.storedCredential.files.splice(idx,1)})},$scope.fileLoaded=function(file){var key,_file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),FileService.uploadFile(_file,key).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename,key),$scope.storedCredential.files.push(result)}),$scope.$digest()},$scope.fileLoadError=function(error){console.log($translate.instant("error.loading.file"),error)},$scope.selected_file="",$scope.fileprogress=[],$scope.fileSelectProgress=function(progress){progress&&($scope.fileprogress=progress,$scope.$digest())},$scope.renewIntervalValue=0,$scope.renewIntervalModifier="0",$scope.updateInterval=function(renewIntervalValue,renewIntervalModifier){var value=parseInt(renewIntervalValue),modifier=parseInt(renewIntervalModifier);value&&modifier&&($scope.storedCredential.renew_interval=value*modifier)},$scope.parseQR=function(QRCode){if(!QRCode)return void NotificationService.showNotification($translate.instant("invalid.qr"),5e3);var uri=new URL(QRCode.qrData),type=uri.href.indexOf("totp/")!==-1?"totp":"hotp",label=uri.pathname.replace("//"+type+"/","");$scope.storedCredential.otp={type:type,label:decodeURIComponent(label),qr_uri:QRCode,issuer:uri.searchParams.get("issuer"),secret:uri.searchParams.get("secret")},$scope.$digest()},$scope.saving=!1,$scope.compromise=function(){console.log("This password was compromised"),$scope.storedCredential.compromised=!0},$scope.saveCredential=function(){if($scope.saving=!0,$scope.storedCredential.compromised&&$scope.oldPassword!==$scope.storedCredential.password&&($scope.storedCredential.compromised=!1),$scope.new_custom_field.label&&$scope.new_custom_field.value&&$scope.storedCredential.custom_fields.push(angular.copy($scope.new_custom_field)),$scope.storedCredential.password!==$scope.storedCredential.password_repeat)return $scope.saving=!1,void NotificationService.showNotification($translate.instant("password.do.not.match"),5e3);if(delete $scope.storedCredential.password_repeat,$scope.storedCredential.credential_id){var key,_credential;!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),_credential=key?ShareService.encryptSharedCredential($scope.storedCredential,key):angular.copy($scope.storedCredential),delete _credential.shared_key;var _useKey=null!=key,regex=/(<([^>]+)>)/gi;_credential.description&&""!==_credential.description&&(_credential.description=_credential.description.replace(regex,"")),CredentialService.updateCredential(_credential,_useKey).then(function(updated_cred){$scope.saving=!1,SettingsService.setSetting("edit_credential",null),$location.path("/vault/"+$routeParams.vault_id),NotificationService.showNotification($translate.instant("credential.updated"),5e3),$scope.updateExistingListWithCredential(updated_cred)})}else $scope.storedCredential.vault_id=$scope.active_vault.vault_id,CredentialService.createCredential($scope.storedCredential).then(function(new_cred){$scope.saving=!1,$location.path("/vault/"+$routeParams.vault_id),NotificationService.showNotification($translate.instant("credential.created"),5e3),$scope.updateExistingListWithCredential(new_cred)})},$scope.updateExistingListWithCredential=function(credential){try{if(credential.shared_key){var enc_key=EncryptService.decryptString(credential.shared_key);credential=ShareService.decryptSharedCredential(credential,enc_key)}else credential=CredentialService.decryptCredential(credential);credential.tags_raw=credential.tags;for(var found=!1,credList=$rootScope.vaultCache[$scope.active_vault.guid].credentials,i=0;i<credList.length;i++)credList[i].credential_id===credential.credential_id&&($rootScope.vaultCache[$scope.active_vault.guid].credentials[i]=credential,found=!0);found||$rootScope.vaultCache[$scope.active_vault.guid].credentials.push(credential),$rootScope.$broadcast("push_decrypted_credential_to_list",credential)}catch(e){NotificationService.showNotification($translate.instant("error.decrypt"),5e3),console.log(e)}},$scope.cancel=function(){$location.path("/vault/"+$routeParams.vault_id)}}])}(),function(){angular.module("passmanApp").controller("ExportCtrl",["$scope","$window","CredentialService","VaultService","FileService","EncryptService","$translate",function($scope,$window,CredentialService,VaultService,FileService,EncryptService,$translate){$scope.available_exporters=[],$scope.active_vault=VaultService.getActiveVault(),$scope.confirm_key="",$scope.$watch(function(){return $window.PassmanExporter},function(exporters){exporters=Object.keys(angular.copy(exporters));for(var i=0;i<exporters.length;i++){var exporter=exporters[i];$window.PassmanExporter[exporter].hasOwnProperty("info")&&$scope.available_exporters.push($window.PassmanExporter[exporter].info)}},!0),$scope.log=[],$scope.setExporter=function(exporter){exporter=JSON.parse(exporter),$scope.selectedExporter=exporter};var _log=function(str){$scope.log.push(str)};$scope.startExport=function(){if($scope.error=!1,VaultService.getActiveVault().vaultKey!==$scope.confirm_key){var msg=$translate.instant("invalid.vault.key");return $scope.error=msg,void _log(msg)}_log($translate.instant("export.starting"));var _credentials=[];VaultService.getVault(VaultService.getActiveVault()).then(function(vault){if(_log($translate.instant("export.decrypt")),vault.hasOwnProperty("credentials")&&vault.credentials.length>0){for(var i=0;i<vault.credentials.length;i++){var _credential=angular.copy(vault.credentials[i]);if(0===_credential.hidden){var key=CredentialService.getSharedKeyFromCredential(_credential);_credential=CredentialService.decryptCredential(_credential,key),_credential.vault_key=key,_credentials.push(_credential)}}$window.PassmanExporter[$scope.selectedExporter.id].export(_credentials,FileService,EncryptService).then(function(){_log($translate.instant("done"))})}})}}])}(),function(){angular.module("passmanApp").controller("GenericCsvImportCtrl",["$scope","CredentialService","$translate",function($scope,CredentialService,$translate){$scope.hello="world",$scope.credentialProperties=[{label:"Label",prop:"label",matching:["label","title","name"]},{label:"Username",prop:"username",matching:["username","user","login","login name"]},{label:"Password",prop:"password",matching:["password","pass","pw"]},{label:"TOTP Secret",prop:"otp",matching:["totp"]},{label:"Custom field",prop:"custom_field"},{label:"Notes",prop:"description",matching:["notes","description","comments"]},{label:"Email",prop:"email",matching:["email","mail"]},{label:"URL",prop:"url",matching:["website","url","fulladdress","site","web site"]},{label:"Tags",prop:"tags"},{label:"Ignored",prop:null}];var tagMapper=function(t){return{text:t}},rowToCredential=function(row){for(var _credential=PassmanImporter.newCredential(),k=0;k<$scope.import_fields.length;k++){var field=$scope.import_fields[k];if(field)if("otp"===field)_credential.otp.secret=row[k];else if("custom_field"===field){var key=$scope.matched?$scope.parsed_csv[0][k]:"Custom field "+k;_credential.custom_fields.push({label:key,value:row[k],secret:0})}else if("tags"===field){if(row[k]){var tags=row[k].split(",");_credential.tags=tags.map(tagMapper)}}else _credential[field]=row[k]}return _credential};$scope.inspectCredential=function(row){$scope.inspected_credential=rowToCredential(row)},$scope.csvLoaded=function(file){$scope.import_fields=[],$scope.inspected_credential=!1,$scope.matched=!1,$scope.skipFirstRow=!1;var file_data=file.data.split(",");file_data=decodeURIComponent(escape(window.atob(file_data[1]))),Papa.parse(file_data,{complete:function(results){if(results.data){for(var i=0;i<results.data[0].length;i++){var propName=results.data[0][i];$scope.import_fields[i]=null;for(var p=0;p<$scope.credentialProperties.length;p++){var credentialProperty=$scope.credentialProperties[p];credentialProperty.matching&&credentialProperty.matching.indexOf(propName.toLowerCase())!==-1&&($scope.import_fields[i]=credentialProperty.prop,$scope.matched=!0)}}$scope.matched&&$scope.inspectCredential(results.data[1]),$scope.parsed_csv=results.data,$scope.$apply()}}})};var addCredential=function(index){function handleState(index){$scope.parsed_csv[index+1]?($scope.import_progress={progress:index/$scope.parsed_csv.length*100,loaded:index,total:$scope.parsed_csv.length},addCredential(index+1)):($scope.import_progress={progress:100,loaded:$scope.parsed_csv.length,total:$scope.parsed_csv.length},$scope.log.push($translate.instant("done")),$scope.importing=!1)}var _credential=rowToCredential($scope.parsed_csv[index]);return _credential.vault_id=$scope.active_vault.vault_id,_credential.label?($scope.log.push($translate.instant("import.adding",{credential:_credential.label})),void CredentialService.createCredential(_credential).then(function(result){result.credential_id&&($scope.log.push($translate.instant("import.added",{credential:_credential.label})),handleState(index))})):($scope.log.push($translate.instant("import.skipping",{line:index})),void handleState(index))};$scope.importing=!1,$scope.startCSVImport=function(){$scope.importing=!0,$scope.log=[];var start=$scope.skipFirstRow?1:0;addCredential(start)},$scope.updateExample=function(){var start=$scope.skipFirstRow?1:0;$scope.inspectCredential($scope.parsed_csv[start])}}])}(),function(){angular.module("passmanApp").controller("ImportCtrl",["$scope","$window","CredentialService","VaultService","$translate",function($scope,$window,CredentialService,VaultService,$translate){$scope.available_importers=[],$scope.active_vault=VaultService.getActiveVault(),$scope.$watch(function(){return $window.PassmanImporter},function(importers){for(var key in importers){var importer=importers[key];importer.hasOwnProperty("info")&&$scope.available_importers.push(importer.info)}},!0),$scope.log=[],$scope.setImporter=function(importer){importer=JSON.parse(importer),$scope.selectedImporter=importer};var file_data,_log=function(str){$scope.log.push(str)};$scope.fileLoaded=function(file){file_data=file.data.split(","),file_data=decodeURIComponent(escape(window.atob(file_data[1]))),_log($translate.instant("import.file.read")),$scope.$digest()},$scope.fileLoadError=function(file){console.error($translate.instant("error.loading.file"),file)},$scope.fileSelectProgress=function(){};var parsed_data;$scope.import_progress={progress:0,loaded:0,total:0};var addCredential=function(parsed_data_index){if(parsed_data[parsed_data_index]){var _credential=parsed_data[parsed_data_index];if(!_credential.label)return void(parsed_data[parsed_data_index+1]&&(_log($translate.instant("import.no.label")),addCredential(parsed_data_index+1)));_log($translate.instant("import.adding",{credential:_credential.label})),_credential.vault_id=$scope.active_vault.vault_id,CredentialService.createCredential(_credential).then(function(result){result.credential_id&&(_log($translate.instant("import.added",{credential:_credential.label})),parsed_data[parsed_data_index+1]?($scope.import_progress={progress:parsed_data_index/parsed_data.length*100,loaded:parsed_data_index,total:parsed_data.length},addCredential(parsed_data_index+1)):($scope.import_progress={progress:100,loaded:parsed_data.length,total:parsed_data.length},_log($translate.instant("done"))))})}};$scope.file_read_progress={percent:0,loaded:0,total:0},$scope.startImport=function(){$scope.import_progress=0,$scope.file_read_percent=0,file_data&&$window.PassmanImporter[$scope.selectedImporter.id].readFile(file_data).then(function(parseddata){parsed_data=parseddata,$scope.file_read_progress={percent:100,loaded:parsed_data.length,total:parsed_data.length};var msg=$translate.instant("import.loaded").replace("{{num}}",parsed_data.length);_log(msg),parsed_data.length>0&&addCredential(0)}).progress(function(progress){$scope.file_read_progress=progress,$scope.$digest()})}}])}(),function(){angular.module("passmanApp").controller("MainCtrl",["$scope","$rootScope","$location","SettingsService","$window","$interval","$filter",function($scope,$rootScope,$location,SettingsService,$window,$interval,$filter){$scope.selectedVault=!1,$scope.http_warning_hidden=!0,"http"===$location.$$protocol&&"localhost"!==$location.$$host&&"127.0.0.1"!==$location.$host&&($scope.using_http=!0,$scope.http_warning_hidden=!1),$scope.removeHiddenStyles=function(){document.getElementById("warning_bar").classList.remove("template-hidden")},$rootScope.$on("settings_loaded",function(){SettingsService.isEnabled("disable_contextmenu")&&document.addEventListener("contextmenu",function(event){event.preventDefault()}),SettingsService.isEnabled("https_check")&&($scope.http_warning_hidden=!0),SettingsService.isEnabled("disable_debugger")&&!function a(){try{!function b(i){1===(""+i/i).length&&i%20!==0||function(){}.constructor("debugger")(),b(++i)}(0)}catch(e){setTimeout(a,5e3)}}()}),$rootScope.setHttpWarning=function(state){$scope.http_warning_hidden=state},$rootScope.$on("app_menu",function(evt,shown){$scope.app_sidebar=shown}),$rootScope.$on("logout",function(){$scope.selectedVault=!1});var tickSessionTimer=function(){if($scope.session_time_left){$scope.session_time_left--;var session_time_left_formatted=$filter("toHHMMSS")($scope.session_time_left);$scope.translationData={session_time:session_time_left_formatted},$rootScope.$broadcast("logout_timer_tick_tack",$scope.session_time_left),0===$scope.session_time_left&&$window.location.reload()}};$scope.session_time_left=!1,$scope.$on("logout_timer_set",function(evt,timer){$scope.session_time_left=timer,$scope.translationData={session_time:timer},$interval(tickSessionTimer,1e3)})}])}(),function(){angular.module("passmanApp").controller("MenuCtrl",["$scope","VaultService","$location","$rootScope","TagService","SettingsService","$translate","SearchboxexpanderService",function($scope,VaultService,$location,$rootScope,TagService,SettingsService,$translate,SearchboxexpanderService){$rootScope.logout=function(){$rootScope.override_default_vault=!0,SettingsService.setSetting("defaultVaultPass",!1),TagService.resetTags(),$rootScope.$broadcast("logout"),$location.path("/")},$scope.removeHiddenStyles=function(){document.getElementById("app-navigation").classList.remove("template-hidden")},$scope.selectedTags=[],$scope.getTags=function($query){return TagService.searchTag($query)},$scope.$watch(function(){return VaultService.getActiveVault()},function(vault){$scope.active_vault=vault}),$scope.filtered_tags=[],$rootScope.$on("limit_tags_in_list",function(evt,tags){$scope.filtered_tags=[];for(var i=0;i<tags.length;i++){for(var tag={text:tags[i]},found=!1,x=0;x<$scope.selectedTags.length;x++)$scope.selectedTags[x].text===tag.text&&(found=!0);found===!1&&$scope.filtered_tags.push(tag)}}),$scope.$watch("selectedTags",function(){$rootScope.$broadcast("selected_tags_updated",$scope.selectedTags)},!0),$scope.tagSelected=function(tag){for(var i=0;i<$scope.selectedTags.length;i++)if($scope.selectedTags[i].text===tag.text)return!0;return!1},$scope.removeTagFromSelected=function(tag){for(var where=-1,i=0;i<$scope.selectedTags.length;i++)$scope.selectedTags[i].text===tag.text&&(where=i);$scope.selectedTags.splice(where,1)},$scope.clearForm=function(){document.getElementById("tagsearch").value=""},$scope.tagClickedString=function(tagtext){var tag=[];tag.text=tagtext,$scope.tagClicked(tag)},$scope.tagClicked=function(tag){$scope.tagSelected(tag)?$scope.removeTagFromSelected(tag):$scope.selectedTags.push(tag)},SearchboxexpanderService.expandSearch($rootScope,$scope),$scope.clickedNavigationItem="all",$scope.filterCredentialBySpecial=function(string){$scope.clickedNavigationItem=string,"nav_trashbin"!==string&&($scope.delete_time=0,$rootScope.$broadcast("set_delete_time",$scope.delete_time)),$scope.selectedTags=[],$rootScope.$broadcast("filterSpecial",string),$scope.settingsShown=!1},$scope.collapsedDefaultValue=!0,$scope.tagCollapsibleOpen=VaultService.getVaultSetting("vaultTagCollapsedState",$scope.collapsedDefaultValue),$scope.tagCollapsibleClicked=function(){VaultService.getVaultSetting("vaultTagCollapsedState",$scope.collapsedDefaultValue)===!0?VaultService.setVaultSetting("vaultTagCollapsedState",!1):VaultService.setVaultSetting("vaultTagCollapsedState",!0)},$scope.tagCollapsibleState=function(){return VaultService.getVaultSetting("vaultTagCollapsedState",$scope.collapsedDefaultValue)?"":"open"},$scope.initPlaceholder=function(){$translate.onReady().then(function(){var string=$translate.instant("navigation.advanced.filter");document.getElementById("tags-input-outer").setAttribute("placeholder",string),document.getElementById("tags-input-outer").firstChild.firstChild.childNodes[1].setAttribute("placeholder",string)})},$scope.legacyNavbarDefault=!0,$scope.legacyNavbarAlreadyInitialized=!1,"undefined"==typeof $scope.legacyNavbar&&($scope.legacyNavbar=$scope.legacyNavbarDefault),$scope.$watch("legacyNavbar",function(newValue,oldValue){VaultService.setVaultSetting("vaultNavBarLegacy",newValue)}),$scope.initializeNavbar=function(){$scope.legacyNavbarAlreadyInitialized||($scope.legacyNavbar=VaultService.getVaultSetting("vaultNavBarLegacy",$scope.legacyNavbarDefault),$scope.legacyNavbarAlreadyInitialized=!0)},$rootScope.$on("credentials_loaded",function(){$rootScope.$broadcast("selected_tags_updated",$scope.selectedTags),$scope.initializeNavbar()}),$scope.available_tags=TagService.getTags(),$scope.$watch(function(){return 0===$scope.selectedTags.length?TagService.getTags():TagService.getTags()},function(tags){$scope.available_tags=TagService.getTags()},!0),$scope.toggleDeleteTime=function(){$scope.delete_time>0?$scope.delete_time=0:($scope.delete_time=1,this.filterCredentialBySpecial("nav_trashbin")),$rootScope.$broadcast("set_delete_time",$scope.delete_time)}}])}(),function(){angular.module("passmanApp").controller("PublicSharedCredential",["$scope","ShareService","$window","EncryptService","NotificationService","$translate",function($scope,ShareService,$window,EncryptService,NotificationService,$translate){var _key;$scope.loading=!1,$scope.loadSharedCredential=function(){$scope.loading=!0;var data=window.atob($window.location.hash.replace("#","")).split("<::>"),guid=data[0];_key=data[1],ShareService.getPublicSharedCredential(guid).then(function(sharedCredential){$scope.loading=!1,200===sharedCredential.status?$scope.shared_credential=ShareService.decryptSharedCredential(sharedCredential.data.credential_data,_key):$scope.expired=!0})},$scope.downloadFile=function(credential,file){ShareService.downloadSharedFile(credential,file).then(function(result){if(!result.hasOwnProperty("file_data"))return void NotificationService.showNotification($translate.instant("error.loading.file.perm"),5e3);var file_data=EncryptService.decryptString(result.file_data,_key);download(file_data,escapeHTML(file.filename),file.mimetype)})}}])}(),function(){angular.module("passmanApp").controller("RevisionCtrl",["$scope","SettingsService","VaultService","CredentialService","$location","$routeParams","$rootScope","NotificationService","$filter","ShareService","EncryptService","$translate",function($scope,SettingsService,VaultService,CredentialService,$location,$routeParams,$rootScope,NotificationService,$filter,ShareService,EncryptService,$translate){if($scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(_vault),VaultService.getVault(_vault).then(function(vault){vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(vault),$scope.active_vault=vault,$scope.$parent.selectedVault=!0})}}else $scope.active_vault||$location.path("/");$scope.active_vault&&($scope.$parent.selectedVault=!0);var storedCredential=SettingsService.getSetting("revision_credential"),getRevisions=function(){CredentialService.getRevisions($scope.storedCredential.guid).then(function(revisions){$scope.revisions=revisions})};storedCredential?($scope.storedCredential=CredentialService.decryptCredential(angular.copy(storedCredential)),getRevisions()):CredentialService.getCredential($routeParams.credential_id).then(function(result){$scope.storedCredential=CredentialService.decryptCredential(angular.copy(result)),getRevisions()}),$scope.selectRevision=function(revision){var key;$scope.selectedRevision=angular.copy(revision),!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),key?$scope.selectedRevision.credential_data=ShareService.decryptSharedCredential(angular.copy(revision.credential_data),key):$scope.selectedRevision.credential_data=CredentialService.decryptCredential(angular.copy(revision.credential_data)),$rootScope.$emit("app_menu",!0)},$scope.closeSelected=function(){$rootScope.$emit("app_menu",!1),$scope.selectedRevision=!1},$scope.deleteRevision=function(revision){CredentialService.deleteRevision($scope.storedCredential.guid,revision.revision_id).then(function(){for(var i=0;i<$scope.revisions.length;i++)if($scope.revisions[i].revision_id===revision.revision_id){$scope.revisions.splice(i,1),NotificationService.showNotification($translate.instant("revision.deleted"),5e3);break}})},$scope.restoreRevision=function(revision){var key,_revision=angular.copy(revision),_credential=_revision.credential_data;!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),key&&(_credential=ShareService.encryptSharedCredential(_credential,key)),delete _credential.shared_key,_credential.revision_created=$filter("date")(1e3*_revision.created,"dd-MM-yyyy @ HH:mm:ss"),CredentialService.updateCredential(_credential,key).then(function(restored_cred){SettingsService.setSetting("revision_credential",null),$rootScope.$emit("app_menu",!1),$location.path("/vault/"+$routeParams.vault_id),NotificationService.showNotification($translate.instant("revision.restored"),5e3),$scope.updateExistingListWithCredential(restored_cred)})},$scope.updateExistingListWithCredential=function(credential){try{if(credential.shared_key){var enc_key=EncryptService.decryptString(credential.shared_key);credential=ShareService.decryptSharedCredential(credential,enc_key)}else credential=CredentialService.decryptCredential(credential);credential.tags_raw=credential.tags;for(var found=!1,credList=$rootScope.vaultCache[$scope.active_vault.guid].credentials,i=0;i<credList.length;i++)credList[i].credential_id===credential.credential_id&&($rootScope.vaultCache[$scope.active_vault.guid].credentials[i]=credential,found=!0);found||$rootScope.vaultCache[$scope.active_vault.guid].credentials.push(credential),$rootScope.$broadcast("push_decrypted_credential_to_list",credential)}catch(e){NotificationService.showNotification($translate.instant("error.decrypt"),5e3),console.log(e)}},$scope.cancelRevision=function(){$location.path("/vault/"+$routeParams.vault_id),$scope.storedCredential=null,SettingsService.setSetting("revision_credential",null)}}])}(),function(){angular.module("passmanApp").controller("SettingsCtrl",["$scope","$rootScope","SettingsService","VaultService","CredentialService","$location","$routeParams","$http","EncryptService","NotificationService","$sce","$translate",function($scope,$rootScope,SettingsService,VaultService,CredentialService,$location,$routeParams,$http,EncryptService,NotificationService,$sce,$translate){if($scope.vault_settings={},$scope.new_vault_name="",$scope.showGenericImport=!1,$scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else if(!$scope.active_vault)return void $location.path("/");VaultService.getVault($scope.active_vault).then(function(vault){vault.vaultKey=VaultService.getActiveVault().vaultKey,delete vault.credentials,VaultService.setActiveVault(vault),$scope.vault_settings=vault.vault_settings,$scope.vault_settings.hasOwnProperty("pwSettings")||($scope.vault_settings.pwSettings={length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0,generateOnCreate:!0})});var key_strengths=["password.poor","password.poor","password.weak","password.good","password.strong"];$scope.minimal_value_key_strength=SettingsService.getSetting("vault_key_strength"),$translate(key_strengths[SettingsService.getSetting("vault_key_strength")]).then(function(translation){$scope.required_score={strength:translation}});var btn_txt=$translate.instant("bookmarklet.text"),http=location.protocol,slashes=http.concat("//"),host=slashes.concat(window.location.hostname),complete=host+location.pathname;$scope.bookmarklet=$sce.trustAsHtml('<a class="button" href="javascript:(function(){var a=window,b=document,c=encodeURIComponent,e=c(document.title),d=a.open(\''+complete+"bookmarklet?url='+c(b.location)+'&title='+e,'bkmk_popup','left='+((a.screenX||a.screenLeft)+10)+',top='+((a.screenY||a.screenTop)+10)+',height=750px,width=475px,resizable=0,alwaysRaised=1');a.setTimeout(function(){d.focus()},300);})();\">"+btn_txt+"</a>"),$scope.saveVaultSettings=function(){var _vault=$scope.active_vault;_vault.name=$scope.new_vault_name,_vault.vault_settings=angular.copy($scope.vault_settings),VaultService.updateVault(_vault).then(function(){$scope.active_vault.name=angular.copy(_vault.name),NotificationService.showNotification($translate.instant("settings.saved"),5e3)})},$scope.tabs=[{title:$translate.instant("settings.general"),url:"views/partials/forms/settings/general_settings.html"},{title:$translate.instant("settings.audit"),url:"views/partials/forms/settings/tool.html"},{title:$translate.instant("settings.password"),url:"views/partials/forms/settings/password_settings.html"},{title:$translate.instant("settings.import"),url:"views/partials/forms/settings/import.html"},{title:$translate.instant("settings.export"),url:"views/partials/forms/settings/export.html"},{title:$translate.instant("settings.sharing"),url:"views/partials/forms/settings/sharing.html"}],$scope.currentTab=$scope.tabs[0],$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url};var getPassmanVersion=function(){var url=OC.generateUrl("apps/passman/api/internal/version");$http.get(url).then(function(result){$scope.passman_version=result.data.version})};getPassmanVersion(),$scope.$watch(function(){return VaultService.getActiveVault()},function(vault){vault&&($scope.active_vault=vault)}),$rootScope.$on("logout",function(){$scope.selectedVault=!1});var getCurrentVaultCredentials=function(callback){VaultService.getVault($scope.active_vault).then(callback)};$scope.startScan=function(minStrength){getCurrentVaultCredentials(function(vault){for(var results=[],i=0;i<vault.credentials.length;i++){var c=angular.copy(vault.credentials[i]);if(c.password&&0===c.hidden)try{if(c=CredentialService.decryptCredential(c),c.password){var zxcvbn_result=zxcvbn(c.password);zxcvbn_result.score<=minStrength&&results.push({guid:c.guid,label:c.label,password:c.password,password_zxcvbn_result:zxcvbn_result})}}catch(e){console.warn(e)}}$scope.scan_result=results})},$scope.cur_state={},$scope.$on("$locationChangeStart",function(event){$scope.change_pw&&$scope.change_pw.total>0&&$scope.change_pw.done<$scope.change_pw.total&&(confirm($translate.instant("changepw.navigate.away.warning"))||event.preventDefault())}),$scope.changeVaultPassword=function(oldVaultPass,newVaultPass,newVaultPass2){return $scope.error="",oldVaultPass!==VaultService.getActiveVault().vaultKey?void($scope.error=$translate.instant("incorrect.password")):newVaultPass!==newVaultPass2?void($scope.error=$translate.instant("password.no.match")):(SettingsService.setSetting("defaultVault",null),SettingsService.setSetting("defaultVaultPass",null),void VaultService.getVault($scope.active_vault).then(function(vault){jQuery("input").attr("disabled",!0),jQuery("button").attr("disabled",!0);var _selected_credentials=angular.copy(vault.credentials);$scope.change_pw={percent:0,done:0,total:_selected_credentials.length};var changeCredential=function(index,oldVaultPass,newVaultPass){var usedKey=oldVaultPass;_selected_credentials[index].hasOwnProperty("shared_key")&&_selected_credentials[index].shared_key&&(usedKey=EncryptService.decryptString(angular.copy(_selected_credentials[index].shared_key),oldVaultPass)),CredentialService.reencryptCredential(_selected_credentials[index].guid,usedKey,newVaultPass).progress(function(data){$scope.cur_state=data}).then(function(){var percent=index/_selected_credentials.length*100;$scope.change_pw={percent:percent,done:index+1,total:_selected_credentials.length},index<_selected_credentials.length-1?changeCredential(index+1,oldVaultPass,newVaultPass):(vault.private_sharing_key=EncryptService.decryptString(angular.copy(vault.private_sharing_key),oldVaultPass),vault.private_sharing_key=EncryptService.encryptString(vault.private_sharing_key,newVaultPass),VaultService.updateSharingKeys(vault).then(function(){$rootScope.$broadcast("logout"),NotificationService.showNotification($translate.instant("login.new.pass"),5e3)}))})};changeCredential(0,VaultService.getActiveVault().vaultKey,newVaultPass)}))},$scope.confirm_vault_delete=!1,$scope.delete_vault_password="",$scope.delete_vault=function(){$scope.confirm_vault_delete&&$scope.delete_vault_password===VaultService.getActiveVault().vaultKey&&getCurrentVaultCredentials(function(vault){var credentials=vault.credentials;$scope.remove_pw={percent:0,done:0,total:vault.credentials.length};var deleteCredential=function(index){$scope.translationData={password:credentials[index].label},CredentialService.destroyCredential(credentials[index].guid).then(function(){var percent=index/vault.credentials.length*100;return $scope.remove_pw={percent:percent,done:index,total:vault.credentials.length},index===credentials.length-1?void VaultService.deleteVault(vault).then(function(){SettingsService.setSetting("defaultVaultPass",!1),SettingsService.setSetting("defaultVault",null),$rootScope.$broadcast("logout"),$location.path("/")}):void deleteCredential(index+1)})};deleteCredential(0)})},$rootScope.$on("logout",function(){$scope.active_vault=null,VaultService.setActiveVault(null),$location.path("/")}),$scope.cancel=function(){$location.path("/vault/"+$routeParams.vault_id)}}])}(),function(){angular.module("passmanApp").controller("ShareCtrl",["$scope","VaultService","CredentialService","SettingsService","$location","$routeParams","ShareService","NotificationService","SharingACL","EncryptService","$translate","$rootScope",function($scope,VaultService,CredentialService,SettingsService,$location,$routeParams,ShareService,NotificationService,SharingACL,EncryptService,$translate,$rootScope){
-$scope.active_vault=VaultService.getActiveVault(),$scope.tabs=[{title:$translate.instant("share.u.g"),url:"views/partials/forms/share_credential/basics.html"},{title:$translate.instant("share.link"),url:"views/partials/forms/share_credential/link_sharing.html",color:"green"}],$scope.currentTab=$scope.tabs[0];var settingsLoaded=function(){var settings=SettingsService.getSettings();0!==settings.user_sharing_enabled&&"0"!==settings.user_sharing_enabled||$scope.tabs.splice(0,1),0!==settings.link_sharing_enabled&&"0"!==settings.link_sharing_enabled||$scope.tabs.splice(1,1),$scope.tabs.length>0&&($scope.currentTab=$scope.tabs[0])};if(SettingsService.getSetting("settings_loaded")?settingsLoaded():$rootScope.$on("settings_loaded",function(){settingsLoaded()}),$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url},SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=angular.copy(SettingsService.getSetting("defaultVaultPass")),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else $scope.active_vault||$location.path("/");var storedCredential=SettingsService.getSetting("share_credential");storedCredential?$scope.storedCredential=CredentialService.decryptCredential(angular.copy(storedCredential)):$location.path("/vault/"+$routeParams.vault_id),$scope.active_vault&&($scope.$parent.selectedVault=!0),$scope.cancel=function(){SettingsService.setSetting("share_credential",null),$location.path("/vault/"+$routeParams.vault_id)},$scope.default_permissions=new SharingACL(0),$scope.default_permissions.addPermission($scope.default_permissions.permissions.READ|$scope.default_permissions.permissions.WRITE|$scope.default_permissions.permissions.FILES);var link_acl=angular.copy($scope.default_permissions);link_acl.removePermission($scope.default_permissions.permissions.WRITE);var oneMonthLater=new Date;oneMonthLater.setMonth(oneMonthLater.getMonth()+1),$scope.share_settings={linkSharing:{enabled:!1,settings:{expire_time:oneMonthLater,expire_views:5,acl:link_acl}},credentialSharedWithUserAndGroup:[],cypher_progress:{done:0,total:0},upload_progress:{done:0,total:0}};var getAcl=function(){ShareService.getSharedCredentialACL($scope.storedCredential).then(function(aclList){for(var _list=[],enc_key=!!$scope.storedCredential.shared_key&&EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key)),i=0;i<aclList.length;i++){var acl=aclList[i];if(null===acl.user_id){if($scope.share_settings.linkSharing={enabled:!0,settings:{expire_time:new Date(1e3*acl.expire),expire_views:acl.expire_views,acl:new SharingACL(acl.permissions)}},enc_key){var hash=window.btoa($scope.storedCredential.guid+"<::>"+enc_key);$scope.share_link=getShareLink(hash)}}else{var obj={userId:acl.user_id,displayName:acl.user_id,type:"user",acl:new SharingACL(acl.permissions),acl_id:acl.acl_id,pending:acl.pending,credential_guid:acl.item_guid,created:acl.created};_list.push(obj)}}$scope.share_settings.credentialSharedWithUserAndGroup=_list})};getAcl();new SharingACL(0);$scope.$watch("share_settings.upload_progress.done",function(){$scope.share_settings.upload_progress.done===$scope.share_settings.upload_progress.total&&$scope.share_settings.upload_progress.total>0&&getAcl()}),$scope.inputSharedWith=[],$scope.searchUsers=function($query){return ShareService.search($query)},$scope.hasPermission=function(acl,permission){return acl.hasPermission(permission)},$scope.setPermission=function(acl,permission){acl.togglePermission(permission)},$scope.shareWith=function(shareWith){if($scope.inputSharedWith=[],shareWith.length>0)for(var i=0;i<shareWith.length;i++){for(var obj={userId:shareWith[i].uid,displayName:shareWith[i].text,type:shareWith[i].type,acl:angular.copy($scope.default_permissions),pending:!0,credential_guid:$scope.storedCredential.guid},found=!1,z=0;z<$scope.share_settings.credentialSharedWithUserAndGroup.length;z++)shareWith[z]&&$scope.share_settings.credentialSharedWithUserAndGroup[z].userId===shareWith[z].uid&&(found=!0);found===!1&&$scope.share_settings.credentialSharedWithUserAndGroup.push(obj)}},$scope.unshareUser=function(user){ShareService.unshareCredentialFromUser($scope.storedCredential,user.userId).then(function(result){if(result.result===!0){var idx=$scope.share_settings.credentialSharedWithUserAndGroup.indexOf(user);$scope.share_settings.credentialSharedWithUserAndGroup.splice(idx,1)}})},$scope.unshareCredential=function(credential){var _credential=angular.copy(credential),old_key=EncryptService.decryptString(angular.copy(_credential.shared_key)),new_key=VaultService.getActiveVault().vaultKey;_credential.shared_key=null,_credential.unshare_action=!0,_credential.skip_revision=!0,CredentialService.reencryptCredential(_credential.guid,old_key,new_key,!0).then(function(data){getAcl();var c=data.cryptogram;c.shared_key=null,c.unshare_action=!0,c.skip_revision=!0,ShareService.unshareCredential(c),CredentialService.updateCredential(c,!0).then(function(){NotificationService.showNotification($translate.instant("credential.unshared"),4e3),$scope.sharing_complete=!0,$scope.storedCredential.shared_key=null,$scope.share_settings.credentialSharedWithUserAndGroup=[]})})},$scope.applyShareToUser=function(user,enc_key){ShareService.getVaultsByUser(user.userId).then(function(data){$scope.share_settings.cypher_progress.total+=data.length,user.vaults=data;var start=(new Date).getTime()/1e3;ShareService.cypherRSAStringWithPublicKeyBulkAsync(user.vaults,enc_key).progress(function(){$scope.share_settings.cypher_progress.done++,$scope.share_settings.cypher_progress.percent=$scope.share_settings.cypher_progress.done/$scope.share_settings.cypher_progress.total*100,$scope.$digest()}).then(function(result){$scope.share_settings.cypher_progress.times.push({time:(new Date).getTime()/1e3-start,user:data[0].user_id}),user.vaults=result,user.hasOwnProperty("acl_id")||$scope.uploadChanges(user),$scope.$digest()})})},$scope.$on("$locationChangeStart",function(event){$scope.sharing_complete||confirm($translate.instant("share.navigate.away.warning"))||event.preventDefault()});var getShareLink=function(hash){var port,defaultPort="http"===$location.$$protocol?80:443;return port=defaultPort!==$location.$$port?":"+$location.$$port:"",$location.$$protocol+"://"+$location.$$host+port+OC.generateUrl("apps/passman/share/public#")+hash};$scope.sharing_complete=!0,$scope.applyShare=function(){if($scope.sharing_complete=!1,$scope.share_settings.cypher_progress.percent=0,$scope.share_settings.cypher_progress.done=0,$scope.share_settings.cypher_progress.total=0,$scope.share_settings.cypher_progress.times=[],$scope.share_settings.cypher_progress.times_total=[],$scope.share_settings.upload_progress.done=0,$scope.share_settings.upload_progress.total=0,$scope.storedCredential.shared_key&&""!==$scope.storedCredential.shared_key&&null!==$scope.storedCredential.shared_key){var enc_key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key));if($scope.share_settings.linkSharing.enabled){var expire_time=new Date(angular.copy($scope.share_settings.linkSharing.settings.expire_time)).getTime()/1e3,shareObj={item_id:$scope.storedCredential.credential_id,item_guid:$scope.storedCredential.guid,permissions:$scope.share_settings.linkSharing.settings.acl.getAccessLevel(),expire_timestamp:expire_time,expire_views:$scope.share_settings.linkSharing.settings.expire_views};ShareService.createPublicSharedCredential(shareObj).then(function(){var hash=window.btoa($scope.storedCredential.guid+"<::>"+enc_key);$scope.share_link=getShareLink(hash)})}for(var list=$scope.share_settings.credentialSharedWithUserAndGroup,i=0;i<list.length;i++){var iterator=i,target_user=list[i];if(target_user.hasOwnProperty("created")){var acl={user_id:target_user.userId,permission:target_user.acl.getAccessLevel()};ShareService.updateCredentialAcl($scope.storedCredential,acl)}else $scope.applyShareToUser(list[iterator],enc_key)}NotificationService.showNotification($translate.instant("saved"),4e3),$scope.sharing_complete=!0}else ShareService.generateSharedKey(20).then(function(key){var encryptedSharedCredential=angular.copy($scope.storedCredential),old_key=VaultService.getActiveVault().vaultKey;CredentialService.reencryptCredential(encryptedSharedCredential.guid,old_key,key).progress(function(){}).then(function(data){var _credential=data.cryptogram;_credential.set_share_key=!0,_credential.skip_revision=!0,_credential.shared_key=EncryptService.encryptString(key),CredentialService.updateCredential(_credential,!0).then(function(){$scope.storedCredential.shared_key=_credential.shared_key,NotificationService.showNotification($translate.instant("credential.shared"),4e3),$scope.sharing_complete=!0})});for(var list=$scope.share_settings.credentialSharedWithUserAndGroup,i=0;i<list.length;i++)"user"===list[i].type&&$scope.applyShareToUser(list[i],key);if($scope.share_settings.linkSharing.enabled){var expire_time=new Date(angular.copy($scope.share_settings.linkSharing.settings.expire_time)).getTime()/1e3,shareObj={item_id:$scope.storedCredential.credential_id,item_guid:$scope.storedCredential.guid,permissions:$scope.share_settings.linkSharing.settings.acl.getAccessLevel(),expire_timestamp:expire_time,expire_views:$scope.share_settings.linkSharing.settings.expire_views};ShareService.createPublicSharedCredential(shareObj).then(function(){var hash=window.btoa($scope.storedCredential.guid+"<::>"+key);$scope.share_link=getShareLink(hash)})}})},$scope.uploadChanges=function(user){$scope.share_settings.upload_progress.total++,user.accessLevel=angular.copy(user.acl.getAccessLevel()),ShareService.shareWithUser(storedCredential,user).then(function(){$scope.share_settings.upload_progress.done++,$scope.share_settings.upload_progress.percent=$scope.share_settings.upload_progress.done/$scope.share_settings.upload_progress.total*100})},$scope.calculate_total_time=function(){$scope.share_settings.cypher_progress.times=$scope.share_settings.cypher_progress.times||[];for(var total=0,i=0;i<$scope.share_settings.cypher_progress.times.length;i++)total+=$scope.share_settings.cypher_progress.times[i].time;return total}}])}(),function(){angular.module("passmanApp").controller("SharingSettingsCtrl",["$scope","VaultService","CredentialService","SettingsService","$location","$routeParams","ShareService","EncryptService",function($scope,VaultService,CredentialService,SettingsService,$location,$routeParams,ShareService,EncryptService){$scope.active_vault=VaultService.getActiveVault(),$scope.sharing_keys=angular.copy(ShareService.getSharingKeys()),$scope.progress=1,$scope.generating=!1,$scope.available_sizes=[{size:1024,name:1024},{size:2048,name:2048},{size:4096,name:4096}],$scope.setKeySize=function(size){for(var i=0;i<$scope.available_sizes.length;i++)if($scope.available_sizes[i].size===size)return void($scope.key_size=$scope.available_sizes[i])},$scope.setKeySize(2048),$scope.generateKeys=function(length){$scope.progress=1,$scope.generating=!0,ShareService.generateRSAKeys(length).progress(function(progress){$scope.progress=progress>0?2:1,$scope.$digest()}).then(function(kp){$scope.generating=!1;var pem=ShareService.rsaKeyPairToPEM(kp);$scope.active_vault.private_sharing_key=EncryptService.encryptString(pem.privateKey),$scope.active_vault.public_sharing_key=pem.publicKey,VaultService.updateSharingKeys($scope.active_vault).then(function(){$scope.sharing_keys=ShareService.getSharingKeys()})})},$scope.updateSharingKeys=function(){$scope.active_vault.private_sharing_key=EncryptService.encryptString(angular.copy($scope.sharing_keys.private_sharing_key)),$scope.active_vault.public_sharing_key=angular.copy($scope.sharing_keys.public_sharing_key),VaultService.updateSharingKeys($scope.active_vault).then(function(){$scope.sharing_keys=ShareService.getSharingKeys()})}}])}(),function(){angular.module("passmanApp").controller("VaultCtrl",["$scope","VaultService","SettingsService","CredentialService","$location","ShareService","EncryptService","$translate","$rootScope","$interval",function($scope,VaultService,SettingsService,CredentialService,$location,ShareService,EncryptService,$translate,$rootScope,$interval){VaultService.getVaults().then(function(vaults){if($scope.vaults=vaults,null!=SettingsService.getSetting("defaultVault"))for(var default_vault=SettingsService.getSetting("defaultVault"),i=0;i<vaults.length;i++){var vault=vaults[i];if(vault.guid===default_vault.guid){$scope.default_vault=!0,$rootScope.override_default_vault||($scope.list_selected_vault=vault,$rootScope.override_default_vault=!1),SettingsService.setSetting("defaultVault",vault),SettingsService.getSetting("defaultVaultPass")&&$location.path("/vault/"+vault.guid),$scope.vault_tries[vault.guid]={tries:0,timeout:0};break}}});var key_strengths=["password.poor","password.poor","password.weak","password.good","password.strong"];$scope.default_vault=!1,$scope.remember_vault_password=!1,$scope.auto_logout_timer=!1,$scope.logout_timer="0",$scope.list_selected_vault=!1,$scope.minimal_value_key_strength=3;var settingsLoaded=function(){$scope.minimal_value_key_strength=SettingsService.getSetting("vault_key_strength"),$translate(key_strengths[SettingsService.getSetting("vault_key_strength")]).then(function(translation){$scope.required_score={strength:translation}})};SettingsService.getSetting("settings_loaded")?settingsLoaded():$rootScope.$on("settings_loaded",function(){settingsLoaded()}),$scope.toggleDefaultVault=function(){$scope.default_vault=!$scope.default_vault,$scope.default_vault===!0?SettingsService.setSetting("defaultVault",$scope.list_selected_vault):SettingsService.setSetting("defaultVault",null)},$scope.toggleRememberPassword=function(){$scope.remember_vault_password=!$scope.remember_vault_password,$scope.remember_vault_password&&(SettingsService.setSetting("defaultVault",$scope.list_selected_vault),$scope.default_vault=!0),$scope.remember_vault_password!==!0&&SettingsService.setSetting("defaultVault",null)},$scope.toggleAutoLogout=function(){$scope.auto_logout_timer=!$scope.auto_logout_timer},$scope.clearState=function(){$scope.list_selected_vault=!1,$scope.creating_vault=!1,$scope.error=!1},$scope.selectVault=function(vault){$scope.list_selected_vault=vault,$scope.vault_tries[vault.guid]||($scope.vault_tries[vault.guid]={tries:0,timeout:0})},$scope.sharing_keys={},$scope.newVault=function(){$scope.creating_vault=!0;var key_size=1024;ShareService.generateRSAKeys(key_size).progress(function(progress){var p=progress>0?2:1,msg=$translate.instant("generating.sharing.keys");msg=msg.replace("%step",p),$scope.creating_keys=msg,$scope.$digest()}).then(function(kp){var pem=ShareService.rsaKeyPairToPEM(kp);$scope.creating_keys=!1,$scope.sharing_keys.private_sharing_key=pem.privateKey,$scope.sharing_keys.public_sharing_key=pem.publicKey,$scope.$digest()})},$scope.requestDeletion=function(vault){$location.path("/vault/"+vault.guid+"/request-deletion")};var _loginToVault=function(vault,vault_key){var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),delete _vault.credentials;var timer=parseInt($scope.logout_timer);$scope.auto_logout_timer&&timer>0&&$rootScope.$broadcast("logout_timer_set",60*timer),VaultService.setActiveVault(_vault),$location.path("/vault/"+vault.guid)};$scope.selectLogoutTimer=function(time){$scope.auto_logout_timer=!0,$scope.logout_timer=time};var tickLockTimer=function(guid){$scope.vault_tries[guid].timeout=$scope.vault_tries[guid].timeout-1,$scope.vault_tries[guid].timeout<=0&&($interval.cancel($scope.vault_tries[guid].timer),$scope.vault_tries[guid].timeout=0)};$scope.vault_tries={},$scope.vaultDecryptionKey="",$scope.loginToVault=function(vault,vault_key){$scope.error=!1;var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault);try{EncryptService.decryptString(vault.challenge_password),$scope.remember_vault_password&&SettingsService.setSetting("defaultVaultPass",vault_key),_loginToVault(vault,vault_key)}catch(e){if($scope.error=$translate.instant("invalid.vault.key"),$scope.vault_tries[vault.guid].tries=$scope.vault_tries[vault.guid].tries+1,$scope.vault_tries[vault.guid].tries>=3){var duration=Math.pow(2,1/7)*Math.pow(15,4/7)*Math.pow(Math.pow(2,2/7)*Math.pow(15,1/7),$scope.vault_tries[vault.guid].tries);$scope.vault_tries[vault.guid].timeout=duration,$scope.vault_tries[vault.guid].hasOwnProperty("timer")&&$interval.cancel($scope.vault_tries[vault.guid].timer),$scope.vault_tries[vault.guid].timer=$interval(function(){tickLockTimer(vault.guid)},1e3)}}},$scope.createVault=function(vault_name,vault_key,vault_key2){return vault_key!==vault_key2?void($scope.error=$translate.instant("password.do.not.match")):void VaultService.createVault(vault_name).then(function(vault){$scope.vaults.push(vault);var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault),SettingsService.setSetting("defaultVaultPass",null),SettingsService.setSetting("defaultVault",null);var test_credential=CredentialService.newCredential();test_credential.label="Test key for vault "+vault_name,test_credential.hidden=!0,test_credential.vault_id=vault.vault_id,test_credential.password="lorum ipsum",CredentialService.createCredential(test_credential).then(function(){_vault.public_sharing_key=angular.copy($scope.sharing_keys.public_sharing_key),_vault.private_sharing_key=EncryptService.encryptString(angular.copy($scope.sharing_keys.private_sharing_key)),VaultService.updateSharingKeys(_vault).then(function(){_loginToVault(vault,vault_key)})})})}}])}(),function(){angular.module("passmanApp").controller("RequestDeleteCtrl",["$scope","$location","$http","$routeParams","VaultService","NotificationService","$translate",function($scope,$location,$http,$routeParams,VaultService,NotificationService,$translate){$scope.reason="",VaultService.getVault({guid:$routeParams.vault_id}).then(function(vault){$scope.pending_deletion=vault.delete_request_pending}),$scope.requestDeletion=function(){var queryUrl=OC.generateUrl("apps/passman/admin/request-deletion/"+$routeParams.vault_id),params={reason:$scope.reason};$http.post(queryUrl,params).then(function(){NotificationService.showNotification($translate.instant("deletion.requested"),5e3),$location.path("#/")})},$scope.removeRequestDeletion=function(){var queryUrl=OC.generateUrl("apps/passman/admin/request-deletion/"+$routeParams.vault_id);$http.delete(queryUrl).then(function(){NotificationService.showNotification($translate.instant("deletion.removed"),5e3),$location.path("#/")})}}])}(),angular.module("templates-main",["views/credential_revisions.html","views/edit_credential.html","views/partials/credential_template.html","views/partials/forms/edit_credential/basics.html","views/partials/forms/edit_credential/custom_fields.html","views/partials/forms/edit_credential/files.html","views/partials/forms/edit_credential/otp.html","views/partials/forms/edit_credential/password.html","views/partials/forms/settings/export.html","views/partials/forms/settings/general_settings.html","views/partials/forms/settings/generic_csv_import.html","views/partials/forms/settings/import.html","views/partials/forms/settings/password_settings.html","views/partials/forms/settings/sharing.html","views/partials/forms/settings/tool.html","views/partials/forms/share_credential/basics.html","views/partials/forms/share_credential/link_sharing.html","views/partials/icon-picker.html","views/partials/password-meter.html","views/settings.html","views/share_credential.html","views/show_vault.html","views/vault_req_deletion.html","views/vaults.html"]),angular.module("views/credential_revisions.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/credential_revisions.html",'<div class="main_list" off-click-filter="\'.download-js-link, .sidebar-shown, #app-sidebar\'"><div id="passman-controls"><div class="actions creatable"><div class="breadcrumb"><div class="crumb svg ui-droppable"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg"><a ng-click="cancelRevision()">{{active_vault.name}}</a></div><div class="crumb svg last"><a ng-if="storedCredential.credential_id">{{ \'showing.revisions\' | translate}} "{{revision.credential_data.label}}"</a></div></div></div></div><table class="credential-table" ng-init="menuOpen = false;"><tr ng-repeat="revision in revisions | orderBy:\'-created\'" ng-click="selectRevision(revision)" ng-class="{\'selected\': selectedRevision.revision_id == revision.revision_id}"><td><span class="icon"><i class="fa fa-lock"></i></span> <span class="label">{{ \'revision.of\' | translate}} {{revision.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} ({{revision.credential_data.label}}) <span ng-if="revision.edited_by">{{ \'revision.edited.by\' | translate}} {{revision.edited_by}}</span></span></td></tr><tr ng-show="revisions.length == 0"><td>{{ \'no.revisions\' | translate}}</td></tr></table></div><div id="app-sidebar" class="detailsView scroll-container app_sidebar" off-click="closeSelected()" ng-show="selectedRevision"><span class="close icon-close" ng-click="closeSelected()" alt="Close"></span> <b ng-show="selectedRevision">{{ \'revision.of\' | translate}} {{selectedRevision.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</b><div class="credential-data"><div class="row" ng-show="selectedRevision.credential_data.label"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'label\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.label"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.username"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'account\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.username"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.password"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'password\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.password" secret="\'true\'"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.otp.secret"><div class="col-xs-4 col-md-3 col-lg-3">{{\'otp\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span otp-generator secret="selectedRevision.credential_data.otp.secret"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.email"><div class="col-xs-4 col-md-3 col-lg-3">{{\'email\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.email"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.url"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'url\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.url"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.description"><div class="col-xs-4 col-md-3 col-lg-3">{{\'notes\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.description_html"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.files.length > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'files\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><div ng-repeat="file in selectedRevision.credential_data.files" class="link" ng-click="downloadFile(selectedRevision.credential_data, file)">{{file.filename}} ({{file.size | bytes}})</div></div></div><div class="row" ng-repeat="field in selectedRevision.credential_data.custom_fields"><div class="col-xs-4 col-md-3 col-lg-3">{{field.label}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="field.value" secret="field.secret" ng-if="field.field_type !== \'file\' || !field.field_type"></span> <span ng-if="field.field_type === \'file\'" class="link" ng-click="downloadFile(selectedCredential, field.value)">{{field.value.filename}} ({{field.value.size | bytes}})</span></div></div><div class="row" ng-show="selectedRevision.credential_data.expire_time > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'expire.time\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedRevision.credential_data.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="selectedRevision.credential_data.changed"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'changed\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedRevision.credential_data.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="selectedRevision.credential_data.created"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'created\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedRevision.credential_data.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row"><div class="col-xs-12"><div class="tags"><span class="tag" ng-repeat="tag in selectedRevision.credential_data.tags">{{tag.text}}</span></div></div></div></div><div ng-show="selectedRevision"><button class="button" ng-click="restoreRevision(selectedRevision)"><span class="fa fa-edit"></span> {{ \'restore.revision\' | translate}}</button> <button class="button" ng-click="deleteRevision(selectedRevision)"><span class="fa fa-trash"></span> {{ \'delete.revision\' | translate}}</button></div></div>')}]),angular.module("views/edit_credential.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/edit_credential.html",'<div id="passman-controls"><div class="breadcrumb"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg" data-dir="/Test"><a ng-click="cancel()">{{active_vault.name}}</a></div><div class="crumb svg last" data-dir="/Test"><a ng-if="storedCredential.credential_id">{{ \'edit.credential\' | translate}} "{{storedCredential.label}}"</a> <a ng-if="!storedCredential.credential_id">{{ \'create.credential\' | translate}}</a></div></div></div></div><div><ul class="tab_header"><li ng-repeat="tab in tabs track by $index" class="tab" ng-class="isActiveTab(tab)? \'active\' : \'inactive\'" ng-click="onClickTab(tab)" use-theme color="\'true\'">{{tab.title}}<div class="indicator" use-theme negative="\'true\'"></div></li></ul><div class="tab_container edit_credential" use-theme type="\'border-top-color\'"><div ng-include="currentTab.url"></div><button ng-click="saveCredential()" ng-disabled="saving"><i class="fa fa-spinner fa-spin" ng-show="saving"></i> {{ \'save\' | translate}}</button> <button ng-click="cancel()">{{ \'cancel\' | translate}}</button></div></div>')}]),angular.module("views/partials/credential_template.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/credential_template.html",'<div class="credential-data"><div class="row" ng-show="credential.label && showLabel"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'label\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.label"></span></div></div><div class="compromised-details" ng-show="credential.compromised"><div class="icon-error-color icon"></div><div class="text">{{ \'compromised.warning\' | translate }}</div></div><div class="row" ng-show="credential.username"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'account\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.username"></span></div></div><div class="row" ng-show="credential.password"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'password\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.password" secret="\'true\'"></span></div></div><div class="row" ng-show="credential.otp.secret"><div class="col-xs-4 col-md-3 col-lg-3">{{\'otp\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span otp-generator secret="credential.otp.secret"></span></div></div><div class="row" ng-show="credential.email"><div class="col-xs-4 col-md-3 col-lg-3">{{\'email\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.email"></span></div></div><div class="row" ng-show="credential.url"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'url\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.url" url="true"></span></div></div><div class="row" ng-show="credential.description"><div class="col-xs-4 col-md-3 col-lg-3">{{\'notes\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.description_html"></span></div></div><div class="row" ng-show="credential.files.length > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'files\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><div ng-repeat="file in credential.files"><a class="link" ng-click="downloadFile(credential, file)">{{file.filename}} ({{file.size | bytes}})</a><br></div></div></div><div class="row" ng-repeat="field in credential.custom_fields"><div class="col-xs-4 col-md-3 col-lg-3">{{field.label}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="field.value" secret="field.secret" ng-if="field.field_type !== \'file\' || !field.field_type"></span> <span ng-if="field.field_type === \'file\'" class="link" ng-click="downloadFile(credential, field.value)">{{field.value.filename}} ({{field.value.size | bytes}})</span></div></div><div class="row" ng-show="credential.expire_time > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'expire.time\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9">{{credential.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="credential.changed"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'changed\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{credential.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="credential.created"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'created\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{credential.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row"><div class="col-xs-12"><div class="tags"><span class="tag" ng-repeat="tag in credential.tags track by $index">{{tag.text}}</span></div></div></div></div>')}]),angular.module("views/partials/forms/edit_credential/basics.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/basics.html",'<div class="row"><div class="col-xs-12 col-md-6"><label>{{ \'label\' | translate}}</label><div class="icon-label"><div class="icon-picker" icon-picker="storedCredential"></div><input type="text" class="form-control" ng-model="storedCredential.label"></div><label>{{ \'username\' | translate}}</label><div><input type="text" ng-model="storedCredential.username"></div><label>{{ \'email\' | translate}}</label><div><input type="text" ng-model="storedCredential.email"></div><label>{{ \'password\' | translate}}</label><div><password-gen ng-model="storedCredential.password" settings="pwSettings" callback="pwGenerated"></password-gen><ng-password-meter password="storedCredential.password"></ng-password-meter></div><div><label>{{ \'password.r\' | translate}}</label><input type="password" ng-model="storedCredential.password_repeat"></div><label>{{ \'url\' | translate}}</label><div><input type="text" ng-model="storedCredential.url"></div></div><div class="col-xs-12 col-md-6"><label>{{ \'notes\' | translate}}</label><div><textarea class="credential_textarea" ng-model="storedCredential.description"></textarea></div><label>{{ \'add.tag\' | translate}}</label><div class="tags_input"><tags-input ng-model="storedCredential.tags" replace-spaces-with-dashes="false"><auto-complete source="getTags($query)" min-length="0"></auto-complete></tags-input></div></div><div class="col-xs-12 col-md-6"><button class="compromised-button" ng-click="compromise()">{{ \'compromised.label\' | translate}}</button><div class="compromised-details" ng-show="storedCredential.compromised"><div class="icon-error-color icon"></div><div class="text">{{ \'compromised.warning\' | translate }}</div></div></div></div>');
+icon:{type:!1,content:""},username:null,password:null,url:null,favicon:null,renew_interval:null,expire_time:0,delete_time:0,files:[],custom_fields:[],otp:{},compromised:!1,hidden:!1},_encryptedFields=["description","username","password","files","custom_fields","otp","email","tags","url","compromised"];return{newCredential:function(){return angular.copy(credential)},createCredential:function(credential){for(var _credential=angular.copy(credential),i=0;i<_encryptedFields.length;i++){var field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);_credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue))}_credential.expire_time=new Date(angular.copy(credential.expire_time)).getTime()/1e3;var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials");return $http.post(queryUrl,_credential).then(function(response){return response.data?response.data:response})},getEncryptedFields:function(){return _encryptedFields},updateCredential:function(credential,skipEncryption,key){var _credential=angular.copy(credential);if(!skipEncryption)for(var i=0;i<_encryptedFields.length;i++){var field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);_credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue),key)}_credential.expire_time=new Date(angular.copy(credential.expire_time)).getTime()/1e3;var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+credential.guid);return $http.patch(queryUrl,_credential).then(function(response){return response.data?response.data:response})},getCredential:function(guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+guid);return $http.get(queryUrl).then(function(response){return response.data?response.data:response})},destroyCredential:function(guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+guid);return $http.delete(queryUrl).then(function(response){return response.data?response.data:response})},encryptCredential:function(credential,key){for(var i=0;i<_encryptedFields.length;i++){var field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue),key)}return credential},decryptCredential:function(credential,key){for(var i=0;i<_encryptedFields.length;i++){var field_decrypted_value,field=_encryptedFields[i],fieldValue=angular.copy(credential[field]);try{field_decrypted_value=null!==fieldValue?EncryptService.decryptString(fieldValue,key):null}catch(e){throw e}try{credential[field]=JSON.parse(field_decrypted_value)}catch(e){console.warn("Field"+field+" in "+credential.label+" could not be parsed! Value:"+fieldValue)}}return credential},getSharedKeyFromCredential:function(credential){var key=null;return!credential.hasOwnProperty("acl")&&credential.hasOwnProperty("shared_key")&&credential.shared_key&&(key=EncryptService.decryptString(angular.copy(credential.shared_key))),credential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy(credential.acl.shared_key))),key},getRevisions:function(guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+guid+"/revision");return $http.get(queryUrl).then(function(response){return response.data?response.data:response})},updateRevision:function(revision){var _revision=angular.copy(revision);_revision.credential_data=window.btoa(JSON.stringify(_revision.credential_data));var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+revision.credential_data.guid+"/revision/"+revision.revision_id);return $http.patch(queryUrl,_revision).then(function(response){return response.data?response.data:response})},deleteRevision:function(credential_guid,revision_id){var queryUrl=OC.generateUrl("apps/passman/api/v2/credentials/"+credential_guid+"/revision/"+revision_id);return $http.delete(queryUrl).then(function(response){return response.data?response.data:response})},reencryptCredential:function(credential_guid,old_password,new_password,skipSharingKey){var service=this,progress_datatype=function(current,total,process){this.process=process,this.current=current,this.total=total,this.calculated=current/total*100},promise_credential_update=function(){service.getCredential(credential_guid).then(function(credential){this.parent.plain_credential=service.decryptCredential(credential,this.parent.old_password);var tmp=angular.copy(this.parent.plain_credential);if(tmp.hasOwnProperty("shared_key")&&null!==tmp.shared_key&&!skipSharingKey){var shared_key=EncryptService.decryptString(angular.copy(tmp.shared_key)).trim();tmp.shared_key=EncryptService.encryptString(angular.copy(shared_key),this.parent.new_password),tmp.set_share_key=!0,tmp.skip_revision=!0,this.parent.new_password=shared_key}this.parent.new_credential_cryptogram=service.encryptCredential(tmp,this.parent.new_password),this.call_progress(new progress_datatype(1,2,"credential")),this.parent.new_credential_cryptogram.skip_revision=!0,service.updateCredential(this.parent.new_credential_cryptogram,!0).then(function(){this.call_progress(new progress_datatype(2,2,"credential")),this.call_then({plain_text:this.parent.plain_credential,cryptogram:this.parent.new_credential_cryptogram})}.bind(this))}.bind(this))},promise_files_update=function(){this.total=2*this.parent.plain_credential.files.length,this.current=0;for(var i=0;i<this.parent.plain_credential.files.length;i++){var _file=this.parent.plain_credential.files[i];FileService.getFile(_file).then(function(fileData){fileData.filename=EncryptService.decryptString(fileData.filename,this.parent.old_password),fileData.file_data=EncryptService.decryptString(fileData.file_data,this.parent.old_password),this.current++,this.call_progress(new progress_datatype(this.current,this.total,"files")),FileService.updateFile(fileData,this.parent.new_password).then(function(){this.current++,this.call_progress(new progress_datatype(this.current,this.total,"files")),this.current===this.total&&this.call_then("All files has been updated")}.bind(this))}.bind(this))}0===this.parent.plain_credential.files.length&&(this.call_progress(new progress_datatype(0,0,"files")),this.call_then("No files to update"))},promise_revisions_update=function(){service.getRevisions(this.parent.plain_credential.guid).then(function(revisions){this.total=2*revisions.length,this.upload=0,this.current=0,this.revisions=revisions;var revision_workload=function(){if(0===this.revisions.length)return this.call_progress(new progress_datatype(0,0,"revisions")),void this.call_then("No history to update");var _revision=revisions[this.current];_revision.credential_data=service.decryptCredential(_revision.credential_data,this.parent.old_password),_revision.credential_data=service.encryptCredential(_revision.credential_data,this.parent.new_password),this.current++,this.call_progress(new progress_datatype(this.current+this.upload,this.total,"revisions")),service.updateRevision(_revision).then(function(){this.upload++,this.call_progress(new progress_datatype(this.upload+this.current,this.total,"revisions")),this.current+this.upload===this.total&&this.call_then("History updated")}.bind(this)),this.current!==this.total/2&&setTimeout(revision_workload.bind(this),1)};setTimeout(revision_workload.bind(this),1)}.bind(this))},promise_workload=function(){this.old_password=angular.copy(old_password),this.new_password=angular.copy(new_password),this.promises=0;var master_promise=this,password_data=function(){this.old_password=master_promise.old_password,this.new_password=master_promise.new_password,this.plain_credential=master_promise.plain_credential};this.credential_data={},new C_Promise(promise_credential_update,new password_data).progress(function(data){master_promise.call_progress(data)}).then(function(data){console.warn("End credential update"),master_promise.plain_credential=data.plain_text,master_promise.promises++,master_promise.credential_data=data,new C_Promise(promise_files_update,new password_data).progress(function(data){master_promise.call_progress(data)}).then(function(){console.warn("End files update"),master_promise.promises--,0===master_promise.promises&&master_promise.call_then(master_promise.credential_data)}),master_promise.promises++,new C_Promise(promise_revisions_update,new password_data).progress(function(data){master_promise.call_progress(data)}).then(function(){console.warn("End revisions update"),master_promise.promises--,0===master_promise.promises&&master_promise.call_then(master_promise.credential_data)})})};return new C_Promise(promise_workload)}}}])}(),function(){angular.module("passmanApp").service("EncryptService",["VaultService",function(VaultService){var encryption_config={adata:"",iter:1e3,ks:256,mode:"ccm",ts:64};return{encryptString:function(string,_key){_key||(_key=VaultService.getActiveVault().vaultKey);var rp={},ct=sjcl.encrypt(_key,string,encryption_config,rp);return window.btoa(ct)},decryptString:function(ciphertext,_key){_key||(_key=VaultService.getActiveVault().vaultKey),ciphertext=window.atob(ciphertext);var rp={};try{return sjcl.decrypt(_key,ciphertext,encryption_config,rp)}catch(e){throw e}}}}])}(),function(){angular.module("passmanApp").service("FileService",["$http","EncryptService",function($http,EncryptService){return{uploadFile:function(file,key){var queryUrl=OC.generateUrl("apps/passman/api/v2/file"),_file=angular.copy(file);_file.filename=EncryptService.encryptString(_file.filename,key);var data=EncryptService.encryptString(angular.copy(file.data),key);return _file.data=data,$http.post(queryUrl,_file).then(function(response){return response.data?response.data:response})},deleteFile:function(file){var queryUrl=OC.generateUrl("apps/passman/api/v2/file/"+file.file_id),_file=angular.copy(file);return $http.delete(queryUrl,_file).then(function(response){return response.data?response.data:response})},getFile:function(file){var queryUrl=OC.generateUrl("apps/passman/api/v2/file/"+file.file_id),_file=angular.copy(file);return $http.get(queryUrl,_file).then(function(response){return response.data?"[object Array]"===Object.prototype.toString.call(response.data)?response.data.pop():response.data:response})},updateFile:function(file,key){var queryUrl=OC.generateUrl("apps/passman/api/v2/file/"+file.file_id),_file=angular.copy(file);_file.filename=EncryptService.encryptString(_file.filename,key);var data=EncryptService.encryptString(angular.copy(file.file_data),key);return _file.file_data=data,$http.patch(queryUrl,_file).then(function(response){return response.data?response.data:response})},dataURItoBlob:function(dataURI,ftype){var byteString,ab,ia,bb,i;for(byteString=atob(dataURI.split(",")[1]),ab=new ArrayBuffer(byteString.length),ia=new Uint8Array(ab),i=0;i<byteString.length;i++)ia[i]=byteString.charCodeAt(i);return bb=new Blob([ab],{type:ftype}),URL.createObjectURL(bb)}}}])}(),function(){angular.module("passmanApp").service("IconService",["$http",function($http){return{getIcons:function(){var queryUrl=OC.generateUrl("apps/passman/api/v2/icon/list");return $http.get(queryUrl).then(function(response){return response.data?response.data:response})}}}])}(),function(){angular.module("passmanApp").service("NotificationService",["$timeout",function($timeout){var to;return{showNotification:function(text,time,closeCallback){var notification=OC.Notification.showHtml(text);return to=$timeout(function(){OC.Notification.hide(notification,closeCallback)},time),notification},hideNotification:function(notification){$timeout.cancel(to),OC.Notification.hide(notification)},hideAll:function(){OC.Notification.hide()}}}])}(),function(){angular.module("passmanApp").service("SearchboxexpanderService",["SettingsService","$translate",function(SettingsService,$translate){function getSearchFieldArraySettings(){var res=SettingsService.getSetting("searchbox_settings");searchfields="undefined"!=typeof res&&null!==res&&""!==res?JSON.parse(res):defaults}function getSearchFieldArrayForFiltering(){var fields=[];for(var key in searchfields)searchfields[key]&&fields.push(key);return fields}function buildDefaultFix(rootScope,scope){null!==native_search&&(native_search.nextElementSibling.addEventListener("click",function(e){scope.$apply(function(){rootScope.$broadcast("nc_searchbox","")})}),native_search.classList.remove("hidden"),native_search.addEventListener("keypress",function(e){13===e.keyCode&&e.preventDefault()}),native_search.addEventListener("keyup",function(e){scope.$apply(function(){rootScope.$broadcast("nc_searchbox",native_search.value,getSearchFieldArrayForFiltering())})}))}function buildCog(){if(null!==native_search){var parent=document.createElement("div");parent.classList.add("notifications"),parent.id="searchbox-settings",parent.classList.add("hidden");var node=document.createElement("div");node.classList.add("icon-settings-white"),node.classList.add("searchbox-settings"),node.id="searchbox-settings-icon",parent.appendChild(node),native_search.after(parent)}}function addListenerToCog(){null!==native_search&&($("#searchbox").on("focus",function(evt){$("#searchbox-settings").removeClass("hidden")}),$("#searchbox").on("blur",function(evt){native_search.value||setTimeout(function(){$("#searchbox-settings").addClass("hidden")},150)}))}function openPopup(){null!==native_search&&(buildPopup(title,defaults_button),$(function(){$("#dialog-searchboxsettings").dialog({width:280,height:280,dialogClass:"custom-search-dialog",close:function(){$(this).dialog("destroy")}}).removeClass("ui-corner-all")}))}function buildPopup(title){$("#dialog-searchboxsettings").length&&$("#dialog-searchboxsettings").remove();var dialogdiv=document.createElement("div");dialogdiv.id="dialog-searchboxsettings",dialogdiv.title=title,dialogdiv.classList.add("hidden"),native_search.after(dialogdiv),getSearchFieldArraySettings();for(var key in searchfields){var div_inner=document.createElement("div");div_inner.id=key+"_div";var input=document.createElement("input");input.id=key+"_input",input.classList.add("searchbox_settings_input"),input.setAttribute("key",key),input.type="checkbox",searchfields[key]&&(input.checked="true"),input.innerText=key;var label=document.createElement("label");label.classList.add("searchbox_settings_label"),label.innerHTML=translations[key],label.setAttribute("key",key),div_inner.appendChild(input),div_inner.appendChild(label),dialogdiv.appendChild(div_inner)}attachListener()}function attachListener(){$(".searchbox_settings_input").on("change",function(evt){var key=$(this).attr("key");searchfields[key]=$("#"+key+"_input").prop("checked");var string=JSON.stringify(searchfields);SettingsService.setSetting("searchbox_settings",string)}),$(".searchbox_settings_label").on("click",function(evt){})}var defaults={label:!0,username:!0,email:!0,custom_fields:!0,password:!1,description:!1,url:!1},searchfields={label:!0,username:!0,email:!0,custom_fields:!0,password:!1,description:!1,url:!1},native_search=document.getElementById("searchbox"),title="Loading...",defaults_button="Loading...",translations={};return $translate.onReady(function(){for(var key in defaults)translations[key]=$translate.instant("search.settings.input."+key);title=$translate.instant("search.settings.title"),defaults_button=$translate.instant("search.settings.defaults_button")}),{expandSearch:function($rootScope,$scope,translation){getSearchFieldArraySettings(),buildDefaultFix($rootScope,$scope),buildCog(),addListenerToCog(),$("#searchbox-settings-icon").on("click",function(evt){openPopup()})}}}])}(),function(){angular.module("passmanApp").service("SettingsService",["localStorageService","$http","$rootScope",function(localStorageService,$http,$rootScope){var settings={defaultVault:null,defaultVaultPass:null};$http.get(OC.generateUrl("apps/passman/api/v2/settings")).then(function(response){response.data&&(settings=angular.merge(settings,response.data),$rootScope.$broadcast("settings_loaded"))});var cookie=localStorageService.get("settings");return settings=angular.merge(settings,cookie),{getSettings:function(){return settings},getSetting:function(name){return settings[name]},setSetting:function(name,value){settings[name]=value,localStorageService.set("settings",settings)},isEnabled:function(name){return 1===settings[name]||"1"===settings[name]}}}])}(),function(){angular.module("passmanApp").service("ShareService",["$http","VaultService","EncryptService","CredentialService",function($http,VaultService,EncryptService,CredentialService){var paranoia_level=10;return sjcl.random.setDefaultParanoia(paranoia_level),sjcl.random.startCollectors(),{search:function(string){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/search");return $http.post(queryUrl,{search:string}).then(function(response){return response.data?response.data:response})},shareWithUser:function(credential,target_user_data){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/share");return $http.post(queryUrl,{item_id:credential.credential_id,item_guid:credential.guid,permissions:target_user_data.accessLevel,vaults:target_user_data.vaults})},getVaultsByUser:function(userId){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/vaults/"+userId);return $http.get(queryUrl,{search:userId}).then(function(response){if(response.data){for(var i=0;i<response.data.length;i++)response.data[i].public_sharing_key=forge.pki.publicKeyFromPem(response.data[i].public_sharing_key);return response.data}return response})},getPendingRequests:function(){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/pending");return $http.get(queryUrl).then(function(response){if(response.data)return response.data})},saveSharingRequest:function(request,crypted_shared_key){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/save");return $http.post(queryUrl,{item_guid:request.item_guid,target_vault_guid:request.target_vault_guid,final_shared_key:crypted_shared_key}).then(function(response){return response.data})},declineSharingRequest:function(request){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/decline/"+request.req_id);return $http.delete(queryUrl).then(function(response){return response.data})},unshareCredential:function(credential){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid);return $http.delete(queryUrl).then(function(response){return response.data})},unshareCredentialFromUser:function(credential,user_id){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/"+user_id);return $http.delete(queryUrl).then(function(response){return response.data})},createPublicSharedCredential:function(shareObj){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/public");return $http.post(queryUrl,shareObj).then(function(response){return response.data})},getPublicSharedCredential:function(credential_guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential_guid+"/public");return $http.get(queryUrl).then(function(response){return response.data?response:response},function(result){return result})},getSharedCredentialACL:function(credential){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/acl");return $http.get(queryUrl).then(function(response){return response.data?response.data:response},function(result){return result})},updateCredentialAcl:function(credential,acl){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/acl");return $http.patch(queryUrl,acl).then(function(response){return response.data})},getCredendialsSharedWithUs:function(vault_guid){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/vault/"+vault_guid+"/get");return $http.get(queryUrl).then(function(response){if(response.data)return response.data})},downloadSharedFile:function(credential,file){var queryUrl=OC.generateUrl("apps/passman/api/v2/sharing/credential/"+credential.guid+"/file/"+file.guid);return $http.get(queryUrl).then(function(response){if(response.data)return response.data})},encryptSharedCredential:function(credential,sharedKey){var _credential=angular.copy(credential);_credential.shared_key=EncryptService.encryptString(sharedKey);for(var encrypted_fields=CredentialService.getEncryptedFields(),i=0;i<encrypted_fields.length;i++){var field=encrypted_fields[i],fieldValue=angular.copy(credential[field]);_credential[field]=EncryptService.encryptString(JSON.stringify(fieldValue),sharedKey)}return _credential},decryptSharedCredential:function(credential,sharedKey){for(var _credential=angular.copy(credential),encrypted_fields=CredentialService.getEncryptedFields(),i=0;i<encrypted_fields.length;i++){var field_decrypted_value,field=encrypted_fields[i],fieldValue=angular.copy(_credential[field]);if(_credential.hasOwnProperty(field)){try{field_decrypted_value=EncryptService.decryptString(fieldValue,sharedKey)}catch(e){if("compromised"!==field||null!==fieldValue)throw e;field_decrypted_value=0}try{_credential[field]=JSON.parse(field_decrypted_value)}catch(e){throw console.warn("Field"+field+" in "+_credential.label+" could not be parsed! Value:"+fieldValue),e}}}return _credential},generateRSAKeys:function(key_length){var p=new C_Promise(function(){var state=forge.pki.rsa.createKeyPairGenerationState(key_length,65537),step=function(){forge.pki.rsa.stepKeyPairGenerationState(state,100)?this.call_then(state.keys):(null!==state.p?this.call_progress(50):this.call_progress(0),setTimeout(step.bind(this),1))};setTimeout(step.bind(this),100)});return p},generateSharedKey:function(size){return size=size||20,new C_Promise(function(){var t=this;CRYPTO.PASSWORD.generate(size,function(pass){t.call_then(pass)},function(progress){t.call_progress(progress)})})},rsaKeyPairToPEM:function(keypair){return{publicKey:forge.pki.publicKeyToPem(keypair.publicKey),privateKey:forge.pki.privateKeyToPem(keypair.privateKey)}},getSharingKeys:function(){var vault=VaultService.getActiveVault();return{private_sharing_key:EncryptService.decryptString(angular.copy(vault.private_sharing_key)),public_sharing_key:vault.public_sharing_key}},rsaPrivateKeyFromPEM:function(private_pem){return forge.pki.privateKeyFromPem(private_pem)},rsaPublicKeyFromPEM:function(public_pem){return forge.pki.publicKeyFromPem(public_pem)},cypherRSAStringWithPublicKeyBulkAsync:function(vaults,string){var workload=function(){if(this.current_index<this.vaults.length>0&&this.vaults.length>0){var _vault=angular.copy(this.vaults[this.current_index]);_vault.key=forge.util.encode64(_vault.public_sharing_key.encrypt(this.string)),this.data.push(_vault),this.current_index++,this.call_progress(this.current_index),setTimeout(workload.bind(this),1)}else this.call_then(this.data)};return new C_Promise(function(){this.data=[],this.vaults=vaults,this.string=string,this.current_index=0,setTimeout(workload.bind(this),0)})}}}])}(),function(){angular.module("passmanApp").service("TagService",["$filter",function($filter){var _tags=[];return{getTags:function(){return _tags},searchTag:function(string){return $filter("filter")(_tags,{text:string})},addTags:function(tags){for(var i=0;i<tags.length;i++)tags[i].text&&0===$filter("filter")(_tags,{text:tags[i].text}).length&&_tags.push(tags[i])},resetTags:function(){_tags=[]}}}])}(),function(){angular.module("passmanApp").service("VaultService",["$http",function($http){var _activeVault,service={getVaults:function(){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults");return $http.get(queryUrl).then(function(response){return response.data?response.data:response})},setActiveVault:function(vault){_activeVault=angular.copy(vault)},getActiveVault:function(){return _activeVault},getVaultSetting:function(key,default_value){return _activeVault.vault_settings&&void 0!==_activeVault.vault_settings[key]?_activeVault.vault_settings[key]:default_value},setVaultSetting:function(key,value){return!!_activeVault.vault_settings&&(_activeVault.vault_settings[key]=value,void this.updateVault(_activeVault))},createVault:function(vaultName){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults");return $http.post(queryUrl,{vault_name:vaultName}).then(function(response){return response.data?response.data:response})},getVault:function(vault){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+vault.guid);return $http.get(queryUrl).then(function(response){return response.data?(response.data.vault_settings?response.data.vault_settings=JSON.parse(window.atob(response.data.vault_settings)):response.data.vault_settings={},response.data):response})},updateVault:function(vault){var _vault=angular.copy(vault);delete _vault.defaultVaultPass,delete _vault.defaultVault,delete _vault.vaultKey,_vault.vault_settings=window.btoa(JSON.stringify(_vault.vault_settings));var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+_vault.guid);return $http.patch(queryUrl,_vault).then(function(response){return response.data?response.data:response})},updateSharingKeys:function(vault){var _vault=angular.copy(vault);delete _vault.vaultKey;var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+_vault.guid+"/sharing-keys");return $http.post(queryUrl,_vault).then(function(response){return response.data?response.data:response})},deleteVault:function(vault){var queryUrl=OC.generateUrl("apps/passman/api/v2/vaults/"+vault.guid);return $http.delete(queryUrl).then(function(response){return response.data?response.data:response})},clearVaultService:function(){_activeVault=null}};return service}])}(),function(){angular.module("passmanApp").factory("SharingACL",function(){function ACL(acl_permission){this.permission=acl_permission}return ACL.prototype.permissions={READ:1,WRITE:2,FILES:4,HISTORY:8,OWNER:128},ACL.prototype.hasPermission=function(permission){return permission===(this.permission&permission)},ACL.prototype.addPermission=function(permission){this.permission=this.permission|permission},ACL.prototype.removePermission=function(permission){this.permission=this.permission&~permission},ACL.prototype.togglePermission=function(permission){this.permission^=permission},ACL.prototype.getAccessLevel=function(){return this.permission},ACL})}(),function(){angular.module("passmanApp").directive("autoScroll",function(){return{restrict:"A",scope:{autoScroll:"="},link:function(scope,el){scope.$watch("autoScroll",function(){$(el).scrollTop($(el)[0].scrollHeight)},!0)}}})}(),function(){angular.module("passmanApp").directive("clearBtn",["$parse",function($parse){return{link:function(scope,elm,attr){elm.wrap("<div style='position: relative'></div>");var btn="<span id="+Math.round(1e9*Math.random())+' class="searchclear ng-hide fa fa-times-circle-o"></span>',angularBtn=angular.element(btn);elm.after(angularBtn),angularBtn.on("click",function(){elm.val("").trigger("change"),$parse(attr.ngModel).assign(scope,""),scope.$apply()}),elm.bind("focus keyup change paste propertychange",function(){elm.val()&&elm.val().length>0?angularBtn.removeClass("ng-hide"):angularBtn.addClass("ng-hide")})}}}])}(),function(){angular.module("passmanApp").directive("clickDisable",function(){return function(scope,element){element.bind("click",function(){element.prepend('<i class="fa fa-spin fa-spinner"></i>&nbsp;'),element.attr("disabled","disabled")})}})}(),function(){angular.module("passmanApp").directive("selectOnClick",["$window",function($window){return{restrict:"A",link:function(scope,element){element.on("click",function(){$window.getSelection().toString()||this.setSelectionRange(0,this.value.length)})}}}])}(),function(){angular.module("passmanApp").directive("colorFromString",[function(){return{restrict:"A",scope:{string:"=colorFromString"},link:function(scope,el){function genColor(str){for(var hash=0,i=0;i<str.length;i++)hash=str.charCodeAt(i)+((hash<<5)-hash);var c=(16777215&hash).toString(16).toUpperCase();return"#"+"00000".substring(0,6-c.length)+c}scope.$watch("string",function(){jQuery(el).css("border-color",genColor(scope.string))})}}}])}(),function(){angular.module("passmanApp").directive("credentialCounter",[function(){return{template:'<div ng-show="counter" translate="number.filtered" translate-values="{number_filtered: counter, credential_number: total}"></div>',replace:!1,restrict:"A",scope:{filteredCredentials:"=credentialCounter",deleteTime:"=",vault:"=",filters:"="},link:function(scope){function countCredentials(){var countedCredentials=0,total=0;scope.vault&&scope.vault.hasOwnProperty("credentials")&&(angular.forEach(scope.vault.credentials,function(credential){var pos=scope.filteredCredentials.map(function(c){return c.guid}).indexOf(credential.guid);0===scope.deleteTime&&0===credential.hidden&&0===credential.delete_time&&(total+=1,countedCredentials=pos!==-1?countedCredentials+1:countedCredentials),scope.deleteTime>0&&0===credential.hidden&&credential.delete_time>0&&(total+=1,countedCredentials=pos!==-1?countedCredentials+1:countedCredentials)}),scope.counter=countedCredentials,scope.total=total)}scope.$watch("[filteredCredentials, deleteTime, filters]",function(){countCredentials()},!0)}}}])}(),function(){angular.module("passmanApp").directive("credentialField",["$timeout","$translate",function($timeout,$translate){return{scope:{value:"=value",secret:"=secret",inputField:"=useInput",inputFieldplaceholder:"=inputPlaceholder",isURLFIELD:"=url"},restrict:"A",replace:"true",template:'<span class="credential_field"><div class="value" ng-class="{\'ellipsis\': isLink}"><span ng-if="secret"><span ng-repeat="n in [] | range:value.length" ng-if="!valueVisible">*</span></span><span ng-if="valueVisible && !inputField" ng-bind-html="value"></span><span ng-if="valueVisible && inputField"><input type="text" ng-model="value" select-on-click placeholder="{{ inputFieldplaceholder }}!"</span></div><div class="tools"><div class="cell" ng-if="toggle" tooltip="tggltxt" ng-click="toggleVisibility()"><i class="fa" ng-class="{\'fa-eye\': !valueVisible, \'fa-eye-slash\': valueVisible }"></i></div><div class="cell" ng-if="isURLFIELD && isLink"><a ng-href="{{value}}" target="_blank" rel="nofollow noopener noreferrer"><i tooltip="\'Open in new window\'" class="link fa fa-external-link"></i></a></div><div class="cell" ng-if="isURLFIELD && isPartialLink"><a ng-href="//{{value}}" target="_blank" rel="nofollow noopener noreferrer"><i tooltip="\'Open in new window\'" class="link fa fa-external-link"></i></a></div><div class="cell" ngclipboard-success="onSuccess(e);" ngclipboard-error="onError(e);" ngclipboard data-clipboard-text="{{value}}"><i tooltip="copy_msg" class="fa fa-files-o"></i></div></div></span>',link:function(scope){var expression=/(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/i,regex=new RegExp(expression);$translate(["toggle.visibility","copy.field","copy","copied"]).then(function(translations){scope.tggltxt=translations["toggle.visibility"],scope.copy_msg=translations["copy.field"]}),scope.$watch("value",function(){scope.value&&(scope.secret&&(scope.valueVisible=!1),regex.test(scope.value)?(scope.isLink=!0,scope.isPartialLink=!1):(scope.isLink=!1,regex.test("https://"+scope.value)&&(scope.isPartialLink=!0)))}),scope.toggle||scope.secret&&(scope.toggle=!0);var timer;scope.onSuccess=function(){scope.copy_msg=$translate.instant("copied"),$timeout.cancel(timer),timer=$timeout(function(){scope.copy_msg=$translate.instant("copy")},5e3)},scope.valueVisible=!0,scope.toggleVisibility=function(){scope.valueVisible=!scope.valueVisible}}}}])}(),function(){angular.module("passmanApp").directive("credentialTemplate",["EncryptService","$translate","FileService","ShareService","NotificationService","CredentialService",function(EncryptService,$translate,FileService,ShareService,NotificationService,CredentialService){return{templateUrl:"views/partials/credential_template.html",replace:!0,restrict:"A",scope:{credential:"=credentialTemplate"},link:function(scope,element,attrs){scope.downloadFile=function(credential,file){var callback=function(result){var key=CredentialService.getSharedKeyFromCredential(credential);if(!result.hasOwnProperty("file_data"))return void NotificationService.showNotification($translate.instant("error.loading.file.perm"),5e3);var file_data=EncryptService.decryptString(result.file_data,key);
+download(file_data,escapeHTML(file.filename),file.mimetype)};credential.hasOwnProperty("acl")?ShareService.downloadSharedFile(credential,file).then(callback):FileService.getFile(file).then(callback)},scope.showLabel=attrs.hasOwnProperty("showLabel")}}}])}(),function(){angular.module("passmanApp").directive("fileSelect",["$window",function($window){return{restrict:"A",scope:{success:"&success",error:"&error",progress:"&progress"},link:function(scope,el){scope.success=scope.success(),scope.error=scope.error(),scope.progress=scope.progress();var _currentFile,fileReader=new $window.FileReader;fileReader.onload=function(){_currentFile.data=fileReader.result,scope.success(_currentFile)},fileReader.onprogress=function(event){var percent=event.loaded/event.total*100;scope.progress&&scope.$apply(scope.progress({file_total:event.total,file_loaded:event.loaded,file_percent:percent}))},fileReader.onerror=function(){scope.error()},el.bind("change",function(e){var i,_queueTotalFileSize=0;for(i=0;i<e.target.files.length;i++)_queueTotalFileSize+=e.target.files[i].size;for(i=0;i<e.target.files.length;i++){_currentFile=e.target.files[i];var mb_limit=5;_currentFile.size>1024*mb_limit*1024&&scope.error("TO_BIG",_currentFile),fileReader.readAsDataURL(_currentFile)}})}}}])}(),function(){angular.module("passmanApp").directive("credentialIcon",["$window",function($window){return{template:'<img ng-src="{{ iconUrl }}" class="icon-image">',restrict:"E",scope:{credential:"="},link:function(scope,element){scope.credential&&scope.$watch("credential",function(){if(scope.credential.icon&&scope.credential.icon.type)scope.iconUrl="data:image/"+scope.credential.icon.type+";base64,"+scope.credential.icon.content;else if(scope.credential.url){var url=window.btoa(angular.copy(scope.credential.url)).replace("/","_");scope.iconUrl=OC.generateUrl("apps/passman/api/v2/icon/")+url+"/"+scope.credential.credential_id}},!0)}}}])}(),function(){angular.module("passmanApp").directive("iconPicker",["$window","IconService","$http","NotificationService","$translate",function($window,IconService,$http,NotificationService,$translate){return{templateUrl:"views/partials/icon-picker.html",restrict:"A",scope:{credential:"=iconPicker"},link:function(scope,element){IconService.getIcons().then(function(icons){scope.iconGroupsAll=icons,scope.iconGroups=icons}),scope.selectIcon=function(icon){scope.selectedIcon=icon},scope.jumpToGroup=function(groupName){var offset=$("#"+groupName).position();$(".iconList").scrollTop(offset.top)};var search=document.getElementById("iconPicker-Search");search.addEventListener("keypress",function(e){13===e.keyCode&&e.preventDefault()}),search.addEventListener("keyup",function(e){var g={};g.Numix=[],scope.iconGroupsAll.Numix.forEach(function(element){scope.isAllowedIcon(element)&&g.Numix.push(element)}),g["essential-collection"]=[],scope.iconGroupsAll["essential-collection"].forEach(function(element){scope.isAllowedIcon(element)&&g["essential-collection"].push(element)}),g["font-awesome"]=[],scope.iconGroupsAll["font-awesome"].forEach(function(element){scope.isAllowedIcon(element)&&g["font-awesome"].push(element)}),scope.iconGroups=g,scope.$apply()}),scope.isAllowedIcon=function(IconElement){var searchval=search.value.toLowerCase(),urlCropped=IconElement.url.substring(IconElement.url.lastIndexOf("/")+1,IconElement.url.length);return!(!urlCropped.includes(searchval)&&IconElement.pack.toLowerCase()!==searchval)},$("#iconPicker-CustomIcon").on("change",function(ev){scope.customIcon={};var f=ev.target.files[0],fr=new FileReader;fr.onload=function(ev2){scope.customIcon.data=ev2.target.result,scope.$apply()},fr.readAsDataURL(f)}),scope.deleteIcon=function(){delete scope.credential.icon.type,delete scope.credential.icon.content,delete scope.credential.icon,$("#iconPicker").dialog("close")},scope.refreshUrlIcon=function(){NotificationService.showNotification($translate.instant("use.icon.refresh.trying"),5e3);var queryUrl=OC.generateUrl("apps/passman/api/v2/geticon/"+btoa(scope.credential.url));$http.get(queryUrl).then(function(response){"undefined"!=typeof response.data.content?(scope.customIcon={},scope.customIcon.data="data:image/"+response.data.type+";base64,"+response.data.content):NotificationService.showNotification($translate.instant("use.icon.refresh.error"),5e3)})},scope.useIcon=function(){if(scope.customIcon){var data=scope.customIcon.data;scope.credential.icon.type=data.substring(data.lastIndexOf(":")+1,data.lastIndexOf(";")),scope.credential.icon.content=data.substring(data.lastIndexOf(",")+1,data.length)}else $http.get(scope.selectedIcon.url).then(function(result){var base64Data=window.btoa(result.data),mimeType="svg+xml";scope.credential.icon||(scope.credential.icon={}),scope.credential.icon.type=mimeType,scope.credential.icon.content=base64Data});$("#iconPicker").dialog("close")},$(element).click(function(){$("#iconPicker").dialog({width:800,height:380,modal:!0,dialogClass:"iconpicker-dialog",close:function(){$(this).dialog("destroy")}})})}}}])}(),function(){angular.module("passmanApp").directive("ngEnter",function(){return function(scope,element,attrs){element.bind("keydown keypress",function(event){13===event.which&&(scope.$apply(function(){scope.$eval(attrs.ngEnter)}),event.preventDefault())})}})}(),function(){angular.module("passmanApp").directive("otpGenerator",["$compile","$timeout",function($compile,$timeout){function dec2hex(s){return(s<15.5?"0":"")+Math.round(s).toString(16)}function hex2dec(s){return parseInt(s,16)}function base32tohex(base32){if(base32){var i,base32chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bits="",hex="";for(i=0;i<base32.length;i++){var val=base32chars.indexOf(base32.charAt(i).toUpperCase());bits+=leftpad(val.toString(2),5,"0")}for(i=0;i+4<=bits.length;i+=4){var chunk=bits.substr(i,4);hex+=parseInt(chunk,2).toString(16)}return hex}}function leftpad(str,len,pad){return len+1>=str.length&&(str=Array(len+1-str.length).join(pad)+str),str}return{restrict:"A",template:'<span class="otp_generator"><span credential-field value="otp" secret="\'true\'"></span> <span ng-bind="timeleft"></span></span>',transclude:!1,scope:{secret:"="},replace:!0,link:function(scope){scope.otp=null,scope.timeleft=null,scope.timer=null;var updateOtp=function(){if(scope.secret){var key=base32tohex(scope.secret),epoch=Math.round((new Date).getTime()/1e3),time=leftpad(dec2hex(Math.floor(epoch/30)),16,"0"),hmacObj=new jsSHA(time,"HEX"),hmac=hmacObj.getHMAC(key,"HEX","SHA-1","HEX"),offset=hex2dec(hmac.substring(hmac.length-1)),otp=(hex2dec(hmac.substr(2*offset,8))&hex2dec("7fffffff"))+"";otp=otp.substr(otp.length-6,6),scope.otp=otp}},timer=function(){var epoch=Math.round((new Date).getTime()/1e3),countDown=30-epoch%30;epoch%30===0&&updateOtp(),scope.timeleft=countDown,scope.timer=$timeout(timer,1e3)};scope.$watch("secret",function(n){n?($timeout.cancel(scope.timer),updateOtp(),timer()):$timeout.cancel(scope.timer)},!0),scope.$on("$destroy",function(){$timeout.cancel(scope.timer)})}}}])}(),function(){angular.module("passmanApp").directive("passwordGen",function($timeout,$translate){function Arcfour(){this.j=this.i=0,this.S=[]}function ARC4init(r){var t,n,e;for(t=0;256>t;++t)this.S[t]=t;for(t=n=0;256>t;++t)n=n+this.S[t]+r[t%r.length]&255,e=this.S[t],this.S[t]=this.S[n],this.S[n]=e;this.j=this.i=0}function ARC4next(){var r;return this.i=this.i+1&255,this.j=this.j+this.S[this.i]&255,r=this.S[this.i],this.S[this.i]=this.S[this.j],this.S[this.j]=r,this.S[r+this.S[this.i]&255]}function prng_newstate(){return new Arcfour}function generatePassword(r,t,n,e,o,i,p,g){var _,a,s,f,d,h,u,l,c,v,w,y,m;if(void 0===r&&(r=8+get_random(0,1)),r>256&&(r=256,document.getElementById("length").value=256),i>256&&(i=256),void 0===t&&(t=!0),void 0===n&&(n=!0),void 0===e&&(e=!0),void 0===o&&(o=!1),void 0===i&&(i=0),void 0===p&&(p=!1),void 0===g&&(g=!0),_=0,a=0,s=0,g&&(_=a=s=1),f=[],n&&_>0)for(d=0;_>d;d++)f[f.length]="L";if(t&&a>0)for(d=0;a>d;d++)f[f.length]="U";if(e&&i>0)for(d=0;i>d;d++)f[f.length]="D";if(o&&s>0)for(d=0;s>d;d++)f[f.length]="S";for(;f.length<r;)f[f.length]="A";for(f.sort(function(){return 2*get_random(0,1)-1}),h="",u="abcdefghjkmnpqrstuvwxyz",p||(u+="ilo"),n&&(h+=u),l="ABCDEFGHJKMNPQRSTUVWXYZ",p||(l+="ILO"),t&&(h+=l),c="23456789",p||(c+="10"),e&&(h+=c),v="!@#$%^&*",o&&(h+=v),w="",y=0;r>y;y++){switch(f[y]){case"L":m=u;break;case"U":m=l;break;case"D":m=c;break;case"S":m=v;break;case"A":m=h}d=get_random(0,m.length-1),w+=m.charAt(d)}return w}function rng_seed_int(r){rng_pool[rng_pptr++]^=255&r,rng_pool[rng_pptr++]^=r>>8&255,rng_pool[rng_pptr++]^=r>>16&255,rng_pool[rng_pptr++]^=r>>24&255,rng_pptr>=rng_psize&&(rng_pptr-=rng_psize)}function rng_seed_time(){rng_seed_int((new Date).getTime())}function rng_get_byte(){if(null==rng_state){for(rng_seed_time(),rng_state=prng_newstate(),rng_state.init(rng_pool),rng_pptr=0;rng_pptr<rng_pool.length;++rng_pptr)rng_pool[rng_pptr]=0;rng_pptr=0}return rng_state.next()}function rng_get_bytes(r){var t;for(t=0;t<r.length;++t)r[t]=rng_get_byte()}function SecureRandom(){}function get_random(r,t){var n,e,o,i=t-r+1;for(rng_seed_time(),n=[],e=0;4>e;e++)n[e]=0;for(rng_get_bytes(n),o=0,e=0;4>e;e++)o*=256,o+=n[e];return o%=i,o+=r}var rng_psize,rng_state,rng_pool,rng_pptr,t,z,crypt_obj,num,buf,i;if(Arcfour.prototype.init=ARC4init,Arcfour.prototype.next=ARC4next,rng_psize=256,null==rng_pool){if(rng_pool=[],rng_pptr=0,"undefined"!=typeof navigator&&"Netscape"==navigator.appName&&navigator.appVersion<"5"&&"undefined"!=typeof window&&window.crypto)for(z=window.crypto.random(32),t=0;t<z.length;++t)rng_pool[rng_pptr++]=255&z.charCodeAt(t);try{if(crypt_obj=null,"undefined"!=typeof window&&void 0!==window.crypto?crypt_obj=window.crypto:"undefined"!=typeof window&&void 0!==window.msCrypto&&(crypt_obj=window.msCrypto),void 0!==crypt_obj&&"function"==typeof crypt_obj.getRandomValues&&rng_psize>rng_pptr)for(num=Math.floor((rng_psize-rng_pptr)/2)+1,buf=new Uint16Array(num),crypt_obj.getRandomValues(buf),i=0;i<buf.length;i++)t=buf[i],rng_pool[rng_pptr++]=t>>>8,rng_pool[rng_pptr++]=255&t}catch(e){}for(;rng_psize>rng_pptr;)t=Math.floor(65536*sjcl.random.randomWords(1)),rng_pool[rng_pptr++]=t>>>8,rng_pool[rng_pptr++]=255&t;rng_pptr=0,rng_seed_time()}return SecureRandom.prototype.nextBytes=rng_get_bytes,{scope:{model:"=ngModel",length:"@",placeholder:"@",settings:"=settings",callback:"&callback"},restrict:"E",replace:"true",template:'<div class=" pw-gen "><div class="input-group "><input ng-show="!passwordVisible" type="password" ng-disabled="disabled" class="form-control " ng-model="password" placeholder="{{placeholder}}"><input ng-show="passwordVisible" type="text" ng-disabled="disabled" class="form-control " ng-model="password" placeholder="{{placeholder}}"><span class="generate_pw"><div class="cell" tooltip="gen_msg" ng-click="generatePasswordStart()"><i class="fa fa-refresh"></i></div><div class="cell" tooltip="tggltxt" ng-click="toggleVisibility()"><i class="fa" ng-class="{\'fa-eye\': passwordVisible, \'fa-eye-slash\': !passwordVisible }"></i></div><div class="cell" tooltip="\'Copy password to clipboard\'"><i class="fa fa-clipboard" ngclipboard-success="onSuccess(e);" ngclipboard-error="onError(e);" ngclipboard data-clipboard-text="{{password}}"></i></div></button></div></div>',link:function(scope){scope.callback=scope.callback(),scope.$watch("model",function(){scope.password=scope.model}),scope.passwordVisible=!1,scope.toggleVisibility=function(){scope.passwordVisible=!scope.passwordVisible},scope.passwordNotNull=!1,scope.$watch("settings",function(){scope.settings&&!scope.password&&scope.settings.generateOnCreate&&scope.generatePasswordStart()}),$translate(["password.gen","password.copy","copied","toggle.visibility"]).then(function(translations){scope.tggltxt=translations["toggle.visibility"],scope.copy_msg=translations["password.copy"],scope.gen_msg=translations["password.gen"]}),scope.$watch("password",function(){scope.model=scope.password,scope.password_repeat=scope.model}),scope.onSuccess=function(e){OC.Notification.showTemporary($translate.instant("password.copied")),e.clearSelection()},scope.onError=function(){OC.Notification.showTemporary("Press Ctrl+C to copy!")},scope.progressDivShow=!1,scope.generatePasswordStart=function(){scope.progressDivShow=!0,scope.progressValue=0,scope.progressWidth={width:scope.progressValue+"%"},scope.generatePasswordProgress()},scope.generatePasswordProgress=function(){$timeout(function(){scope.progressValue<100?(scope.password=scope._generatePassword(scope.settings),scope.progressValue+=10,scope.progressWidth={width:scope.progressValue+"%"},scope.disabled=!0,scope.generatePasswordProgress()):(scope.disabled=!1,scope.callback&&scope.callback(scope.password))},10)},scope._generatePassword=function(settings){var _settings={length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0};settings=angular.merge(_settings,settings);var password=generatePassword(settings.length,settings.useUppercase,settings.useLowercase,settings.useDigits,settings.useSpecialChars,settings.minimumDigitCount,settings.avoidAmbiguousCharacters,settings.requireEveryCharType);return password}}}})}(),function(){angular.module("passmanApp").directive("progressBar",["$translate",function($translate){return{restrict:"A",template:'<div class="progress"><div class="progress-bar" role="progressbar" aria-valuenow="{{progress}}"aria-valuemin="0" aria-valuemax="100" style="width:{{progress}}%;" use-theme><span class="sr-only">{{progress}}% {{completed_text}}</span><span ng-if="index && total" class="progress-label" use-theme type="\'color\'" color="\'true\'">{{index}} / {{total}}</span><span ng-if="!index && !total" class="progress-label" use-theme type="\'color\'" color="\'true\'">{{progress}}%</span></div></div>',scope:{progress:"=progressBar",index:"=index",total:"=total"},link:function(scope){$translate(["complete"]).then(function(translations){scope.completed_text=translations.complete})}}}])}(),function(){angular.module("passmanApp").directive("qrread",["$parse",function($parse){return{scope:!0,link:function(scope,element,attributes){var invoker=$parse(attributes.onRead);scope.imageData=null,qrcode.callback=function(result){invoker(scope,{qrdata:{qrData:result,image:scope.imageData}})},element.bind("change",function(changeEvent){var reader=new FileReader,file=changeEvent.target.files[0];reader.readAsDataURL(file),reader.onload=function(){return function(e){scope.imageData=e.target.result,qrcode.decode(e.target.result)}}(file)})}}}])}(),function(){angular.module("passmanApp").directive("tooltip",[function(){return{restrict:"A",scope:{tooltip:"=tooltip"},link:function(scope,el){scope.$watch("tooltip",function(){scope.tooltip&&(jQuery(el).attr("title",scope.tooltip),jQuery(el).tooltip(),jQuery(el).attr("title",scope.tooltip).tooltip("fixTitle"),jQuery(".tooltip-inner").text(scope.tooltip),jQuery(el).is(":visible"))})}}}])}(),function(){angular.module("passmanApp").directive("useTheme",[function(){function invertColor(hexTripletColor){var color=hexTripletColor;return color=color.substring(1),color=parseInt(color,16),color^=16777215,color=color.toString(16),color=("000000"+color).slice(-6),color="#"+color}return{restrict:"A",scope:{type:"=type",color:"=",negative:"="},link:function(scope,el){var _color=jQuery("#header").css("background-color"),_bg=_color;scope.negative&&(_bg=invertColor(_bg)),scope.type?jQuery(el).css(scope.type,_bg):jQuery(el).css("background-color",_bg),scope.color&&jQuery(el).css("color",invertColor(_color))}}}])}();var PassmanImporter={};!function(window,$,PassmanImporter){PassmanImporter.parseRow_=function(row){row=row.trim();var isQuoted=!1;return'"'===row.charAt(0)&&(row=row.substring(1),isQuoted=!0),'"'===row.charAt(row.length-2)&&(row=row.substring(0,row.length-2),isQuoted=!0),row=isQuoted===!0?row.split('","'):row.split(",")},PassmanImporter.htmlDecode=function(input){var e=document.createElement("div");return e.innerHTML=input,e.childNodes[0].nodeValue},PassmanImporter.toObject_=function(headings,row){for(var result={},i=0,ii=row.length;i<ii;i++)headings[i]?(headings[i]=headings[i].replace(",","_").toLowerCase().replace(" ","_").replace("(","").replace(")","").replace('"',""),result[headings[i]]=row[i]):result[ii]=row[i];return result},PassmanImporter.join_=function(arr,sep){for(var parts=[],i=0,ii=arr.length;i<ii;i++)arr[i]&&parts.push(arr[i]);return parts.join(sep)},PassmanImporter.newCredential=function(){var credential={credential_id:null,guid:null,vault_id:null,label:null,description:null,created:null,changed:null,tags:[],email:null,username:null,password:null,url:null,favicon:null,renew_interval:null,expire_time:0,delete_time:0,files:[],custom_fields:[],otp:{},hidden:!1,compromised:!1};return credential},PassmanImporter.readCsv=function(csv,hasHeadings){hasHeadings=void 0===hasHeadings||hasHeadings;var lines=[];return Papa.parse(csv,{complete:function(results){if(results.data)for(var headings=hasHeadings?results.data[0]:null,start=hasHeadings?1:0,i=start;i<results.data.length;i++){var _row=hasHeadings?PassmanImporter.toObject_(headings,results.data[i]):results.data[i];lines.push(_row)}}}),lines},PassmanImporter.readJson=function(string){return JSON.parse(string)}}(window,$,PassmanImporter),String.prototype.replaceAll=function(search,replacement){var target=this;return target.replace(new RegExp(search,"g"),replacement)},Array.prototype.clean=function(deleteValue){for(var i=0;i<this.length;i++)this[i]===deleteValue&&(this.splice(i,1),i--);return this};var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.clippers={info:{name:"Clipperz.is",id:"clippers",exportSteps:["Go to menu -> Export -> Download HTML + JSON. Fields will be imported as custom fields."]}},PassmanImporter.clippers.readFile=function(file_data){return new C_Promise(function(){var credential_list=[],re=/<textarea>(.*?)<\/textarea>/gi,matches=re.exec(file_data);if(matches){var raw_json=matches[0].substring(10);raw_json=PassmanImporter.htmlDecode(raw_json.slice(0,-11));for(var json_objects=PassmanImporter.readJson(raw_json),i=0;i<json_objects.length;i++){var card=json_objects[i];re=/(\w+)/gi;var tags=card.label.match(re);card.label=card.label.replace(tags.join(" "),"").trim(),tags=tags.map(function(item){return{text:item.replace("","")}});var _credential=PassmanImporter.newCredential();_credential.label=card.label,_credential.description=card.data.notes,_credential.tags=tags;for(var field in card.currentVersion.fields){var field_data=card.currentVersion.fields[field];_credential.custom_fields.push({label:field_data.label,value:field_data.value,secret:field_data.hidden===!0})}_credential.label&&credential_list.push(_credential);var progress={percent:i/json_objects.length*100,loaded:i,total:json_objects.length};this.call_progress(progress)}}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.dashLaneCsv={info:{name:"Dashlane 4 csv",id:"dashLaneCsv",exportSteps:["Create an csv export. Go to File -> export -> Unsecured archive (readable) in CSV format"]}},PassmanImporter.dashLaneCsv.readFile=function(file_data){return new C_Promise(function(){for(var rows=file_data.split("\n"),credential_list=[],i=0;i<rows.length;i++){var row=rows[i],row_data=row.split('","');'"'===row_data[0].charAt(0)&&(row_data[0]=row_data[0].substring(1)),'"'===row_data[row_data.length-1].toString().charAt(row_data[row_data.length-1].length-1)&&(row_data[row_data.length-1]=row_data[row_data.length-1].substring(0,row_data[row_data.length-1].length-1));var _credential=PassmanImporter.newCredential();_credential.label=row_data[0],_credential.username=row_data[2],_credential.password=row_data[row_data.length-2],_credential.url=row_data[0],_credential.description=row_data[row_data.length-1],_credential.label&&credential_list.push(_credential);var progress={percent:i/rows.length*100,loaded:i,total:rows.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){function parseEnpass(fileData){var lastProperty,matches,loginBlocks,property;loginBlocks=fileData.replaceAll("Title :","<~passman~>\nTitle :").split("<~passman~>\n").clean("");for(var regex=/(.*) : (.*)/,results=[],l=0;l<loginBlocks.length;l++){for(var loginBlock=loginBlocks[l],lrow=loginBlock.split("\n"),result={},r=0;r<lrow.length;r++){var row=lrow[r];matches=regex.exec(row),matches?(property=matches[1],result[property]=matches[2]):lastProperty&&(result[lastProperty]+="\n"+row),property&&(lastProperty=property)}results.push(result)}return results}PassmanImporter.EnPassTXT={info:{name:"EnPass text file",id:"EnPassTXT",exportSteps:['Access your Enpass Database. Select "File" > "Export" > "As Text"']}},PassmanImporter.EnPassTXT.readFile=function(file_data){var mapper={Title:"label",Username:"username",Password:"password",Email:"email",Url:"url",Note:"description"},secret_fields=["cvc","pin","security answer"];return new C_Promise(function(){for(var credential_list=[],credentials=parseEnpass(file_data),i=0;i<credentials.length;i++){var enpass_credential=credentials[i],new_credential=PassmanImporter.newCredential();for(var key in enpass_credential)if(enpass_credential.hasOwnProperty(key))if(mapper.hasOwnProperty(key)){var prop=mapper[key];new_credential[prop]=enpass_credential[key]}else if("TOTP"!==key){var isSecret=secret_fields.indexOf(key.toLowerCase())!==-1?1:0;new_credential.custom_fields.push({label:key,value:enpass_credential[key],secret:isSecret})}enpass_credential.hasOwnProperty("TOTP")&&(new_credential.otp.secret=enpass_credential.TOTP);var progress={percent:i/credentials.length*100,loaded:i,total:credentials.length};credential_list.push(new_credential),this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.keepassCsv={info:{name:"KeePass csv",id:"keepassCsv",exportSteps:["If using Keepass V1: Create an csv export with the following options enabled: http://i.imgur.com/CaeTA4d.png","With Keepass V2 or Keepass XC no configuration is needed"]}},PassmanImporter.keepassCsv.readFile=function(file_data){var p=new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=row.account,_credential.username=row.login_name,_credential.password=row.password,_credential.url=row.web_site,row.hasOwnProperty("expires")&&(row.expires=row.expires.replace('"',""),_credential.expire_time=new Date(row.expires).getTime()/1e3);var tags=row.group?[{text:row.group}]:[];if(row.hasOwnProperty("group_tree"))for(var exploded_tree=row.group_tree.split("\\\\"),t=0;t<exploded_tree.length;t++)exploded_tree[t].trim().length>0&&tags.push({text:exploded_tree[t].trim()});_credential.tags=tags,credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)});return p}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.lastpassCsv={info:{name:"LastPass csv",id:"lastpassCsv",exportSteps:["Create an csv export. Go to More options -> Advanced -> Export -> Last Pass CSV File"]}},PassmanImporter.lastpassCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=PassmanImporter.htmlDecode(row.name),_credential.username=row.username,_credential.password=row.password,_credential.url=row.url,_credential.tags=row.grouping?[{text:row.grouping}]:[],_credential.description=row.extra,_credential.label&&"undefined"!==_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){var steps=["Backups for the Passwords app need to be enabled on the Admin panel (they are disabled by default).","On the Passwords App, in the bottom left corner, press Settings",'Press "Download Backup"',"Confirm the export and save the file"];PassmanImporter.passwordsApp={info:{name:"Passwords App csv",id:"passwordsApp",exportSteps:steps}},PassmanImporter.passwordsApp.readFile=function(file_data){var p=new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=row.website+" - "+row.username,_credential.username=row.username,_credential.password=row.password,_credential.url=row.fulladdress,_credential.description=row.notes,credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)});return p}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.padlock={info:{name:"Padlock",id:"padlock",exportSteps:["Create a csv export. Go to Menu -> Settings -> Export Data and copy text into a .csv file"]}},PassmanImporter.padlock.readFile=function(file_data){return new C_Promise(function(){for(var rows=PassmanImporter.readCsv(file_data,!0),credential_list=[],i=0;i<rows.length;i++){var row=rows[i],_credential=PassmanImporter.newCredential(),j=0;for(var k in row)row[k]&&("name"!=k?"username"!=k?"password"!=k?"url"!=k.toLowerCase()?"e-mail"!=k.toLowerCase()&&"email"!=k.toLowerCase()?"description"!=k.toLowerCase()?(_credential.custom_fields[j]={label:k,value:row[k],secret:!0,field_type:"text"},j++):_credential.description=row[k]:_credential.email=row[k]:_credential.url=row[k]:_credential.password=row.password:_credential.username=row.username:_credential.label=row.name);_credential.label&&credential_list.push(_credential);var progress={percent:i/rows.length*100,loaded:i,total:rows.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.passmanJson={info:{name:"Passman JSON",id:"passmanJson",exportSteps:["Export the item in passman as passman json, with all fields enabled"]}},PassmanImporter.passmanJson.readFile=function(file_data){return new C_Promise(function(){for(var parsed_json=PassmanImporter.readJson(file_data),credential_list=[],i=0;i<parsed_json.length;i++){var item=parsed_json[i],_credential=PassmanImporter.newCredential();if(_credential.label=item.label,_credential.username=item.username,_credential.password=item.password,_credential.email=item.email,_credential.url=item.url,_credential.tags=item.tags,_credential.description=item.description,item.hasOwnProperty("customFields")&&item.customFields.length>0)for(var cf=0;cf<item.customFields.length;cf++)_credential.custom_fields.push({label:item.customFields[cf].label,value:item.customFields[cf].value,secret:"1"===item.customFields[cf].clicktoshow});item.hasOwnProperty("otp")&&item.otp&&(_credential.otp={issuer:item.otp.issuer,label:item.otp.label,qr_uri:{image:item.otp.qrCode,qrData:""},secret:item.otp.secret,type:item.otp.type}),_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_json.length*100,loaded:i,total:parsed_json.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.passpackCsv={info:{name:"Passpack csv",id:"passpackCsv",exportSteps:["Go to Tools -> Export. Select Comma Separated Values, All entries then continue."]}},PassmanImporter.passpackCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data,!1),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=row[0],_credential.username=row[1],_credential.password=row[2],_credential.url=row[3];var tags=row[4].split(" ");tags.length>0&&(_credential.tags=tags.map(function(item){if(item)return{text:item}}).filter(function(item){return item})),_credential.description=row[5],_credential.email=row[6],_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.randomData={info:{name:"Random data",id:"randomData",exportSteps:["Create's 50 random credentials for testing purposes."]}},PassmanImporter.randomData.readFile=function(){return new C_Promise(function(){var label,tags=["Social media","Hosting","Forums","Webshops","FTP","SSH","Banking","Applications","Server stuff","mysql","Wifi","Games","Certificate","Serials"],credential_list=[],_this=this,generateCredential=function(max,i,callback){if(jQuery){var url=OC.generateUrl("apps/passman/api/internal/generate_person");$.ajax({url:url,dataType:"json",success:function(data){if(data){var _credential=PassmanImporter.newCredential();label=Math.random()>=.5?data.domain:data.email_d+" - "+data.email_u,_credential.label=label,_credential.username=data.username,_credential.password=data.password,_credential.url=data.url;for(var tag_amount=Math.floor(5*Math.random()),ta=0,_tags=[];ta<tag_amount;){var item=tags[Math.floor(Math.random()*tags.length)];_tags.indexOf(item)===-1&&(_tags.push(item),ta++)}if(_credential.tags=_tags.map(function(item){if(item)return{text:item}}).filter(function(item){return item}),credential_list.push(_credential),i<max){var progress={percent:i/max*100,loaded:i,total:max};_this.call_progress(progress),generateCredential(max,i+1,callback)}else callback(credential_list)}else generateCredential(max,i,callback)}})}};generateCredential(50,1,function(credential_list){_this.call_then(credential_list)})})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};!function(window,$,PassmanImporter){PassmanImporter.teamPassCsv={info:{name:"TeamPass csv",id:"teamPassCsv",exportSteps:["Go to Tools -> Export. Select Comma Separated Values, All entries then continue."]}},PassmanImporter.teamPassCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data,!1),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();_credential.label=row[1],_credential.description=row[2],_credential.password=row[3],_credential.username=row[4];var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};credential_list.push(_credential),this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter);var PassmanImporter=PassmanImporter||{};if(function(window,$,PassmanImporter){PassmanImporter.zohoCsv={info:{name:"ZOHO csv",id:"zohoCsv",exportSteps:['Create an csv export. Go to Tools -> Export secrets -> Select "General CSV" and click "Export Secrets"']}},PassmanImporter.zohoCsv.readFile=function(file_data){return new C_Promise(function(){for(var parsed_csv=PassmanImporter.readCsv(file_data),credential_list=[],i=0;i<parsed_csv.length;i++){var row=parsed_csv[i],_credential=PassmanImporter.newCredential();if(_credential.label=row.secret_name,
+_credential.url=row.secret_url,_credential.description=row.notes,row.hasOwnProperty("secretdata"))for(var rows=row.secretdata.split("\n"),r=0;r<rows.length;r++){var cells=rows[r].split(":"),key=cells[0],value=cells.slice(1).join(":");key&&value&&_credential.custom_fields.push({label:key,value:value,secret:!1})}""!==_credential.label&&credential_list.push(_credential);var progress={percent:i/parsed_csv.length*100,loaded:i,total:parsed_csv.length};this.call_progress(progress)}this.call_then(credential_list)})}}(window,$,PassmanImporter),!window.PassmanExporter)var PassmanExporter={getCredentialsWithFiles:function(credentials,FileService,EncryptService){var t={cred:credentials,FS:FileService,ES:EncryptService};return new C_Promise(function(){var _this=this.parent,credentials=_this.cred;this.parent.total=0,this.parent.finished=0,this.parent.fileGUID_cred=[],this.parent.files=[],this.parent.step=function(file){this.parent.finished++,this.call_progress({total:this.parent.total,finished:this.parent.finished});var dta=this.parent.fileGUID_cred[file.guid];file.filename=this.parent.ES.decryptString(file.filename,this.parent.cred[dta.cred_pos].vault_key),file.file_data=this.parent.ES.decryptString(file.file_data,this.parent.cred[dta.cred_pos].vault_key),"files"===dta.on?this.parent.cred[dta.cred_pos][dta.on][dta.at]=file:this.parent.cred[dta.cred_pos][dta.on][dta.at].value=file,this.parent.total===this.parent.finished&&this.call_then(this.parent.cred)}.bind(this);for(var i=0;i<credentials.length;i++){var item=credentials[i];for(c=0;c<item.custom_fields.length;c++){var cf=item.custom_fields[c];"file"===cf.field_type&&(this.parent.total++,this.parent.fileGUID_cred[cf.value.guid]={cred_pos:i,on:"custom_fields",at:c},this.parent.FS.getFile(cf.value).then(function(data){this.parent.step(data)}.bind(this)))}for(var c=0;c<item.files.length;c++)this.parent.total++,this.parent.fileGUID_cred[item.files[c].guid]={cred_pos:i,on:"files",at:c},this.parent.FS.getFile(item.files[c]).then(function(data){this.parent.step(data)}.bind(this))}0===this.parent.total&&this.call_then(this.parent.cred)},t)}};PassmanExporter.csv={info:{name:"CSV",id:"csv",description:"Export credentials as a csv file."}},PassmanExporter.csv.export=function(credentials,FileService,EncryptService){return new C_Promise(function(){PassmanExporter.getCredentialsWithFiles(credentials,FileService,EncryptService).then(function(){for(var headers=["label","username","password","email","description","tags","url","custom_fields","files"],file_data='"'+headers.join('","')+'"\n',i=0;i<credentials.length;i++){for(var _credential=credentials[i],row_data=[],h=0;h<headers.length;h++){var field=headers[h];if("tags"===field){for(var _tags=[],t=0;t<_credential[field].length;t++)_tags.push(_credential[field][t].text);var tag_data="["+_tags.join(",")+"]";row_data.push('"'+tag_data.replaceAll('"','""')+'"')}else if("custom_fields"==field||"files"==field){var _fields=JSON.stringify(_credential[field]);_fields=_fields.replaceAll('"','""'),row_data.push('"'+_fields+'"')}else{var data=_credential[field],value=null===data?"":data.replaceAll('"','""');row_data.push('"'+value+'"')}}var progress={percent:i/credentials.length*100,loaded:i,total:credentials.length};this.call_progress(progress),file_data+=row_data.join(",")+"\n"}this.call_then(),download(file_data,"passman-export.csv","text/csv")}.bind(this)).progress(function(){})})},PassmanExporter.json={info:{name:"JSON",id:"json",description:"Export credentials as a JSON file."}},PassmanExporter.json.export=function(credentials,FileService,EncryptService){return new C_Promise(function(){PassmanExporter.getCredentialsWithFiles(credentials,FileService,EncryptService).then(function(){for(var _output=[],i=0;i<credentials.length;i++){var _credential=angular.copy(credentials[i]);delete _credential.vault_key,delete _credential.vault_id,delete _credential.shared_key,_output.push(_credential);var progress={percent:i/credentials.length*100,loaded:i,total:credentials.length};this.call_progress(progress)}var file_data=JSON.stringify(_output);this.call_then(),download(file_data,"passman-export.json")}.bind(this)).progress(function(){})})},function(){angular.module("passmanApp").controller("BookmarkletCtrl",["$scope","$rootScope","$location","VaultService","CredentialService","SettingsService","NotificationService","EncryptService","TagService","FileService","ShareService","$translate",function($scope,$rootScope,$location,VaultService,CredentialService,SettingsService,NotificationService,EncryptService,TagService,FileService,ShareService,$translate){if($scope.active_vault=!1,$scope.http_warning_hidden=!0,"http"===$location.$$protocol&&($scope.using_http=!0),$scope.logout=function(){$rootScope.override_default_vault=!0,$scope.active_vault=!1},SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));VaultService.getVault(_vault).then(function(vault){vault.vaultKey=angular.copy(SettingsService.getSetting("defaultVaultPass")),VaultService.setActiveVault(vault),$scope.active_vault=vault,$scope.pwSettings=VaultService.getVaultSetting("pwSettings",{length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0,generateOnCreate:!0})})}VaultService.getVaults().then(function(vaults){$scope.vaults=vaults}),$scope.default_vault=!1,$scope.remember_vault_password=!1,$scope.list_selected_vault=!1,$scope.toggleDefaultVault=function(){$scope.default_vault=!$scope.default_vault,$scope.default_vault===!0?SettingsService.setSetting("defaultVault",$scope.list_selected_vault):SettingsService.setSetting("defaultVault",null)},$scope.toggleRememberPassword=function(){$scope.remember_vault_password=!$scope.remember_vault_password,$scope.remember_vault_password&&(SettingsService.setSetting("defaultVault",$scope.list_selected_vault),$scope.default_vault=!0),$scope.remember_vault_password!==!0&&SettingsService.setSetting("defaultVault",null)},$scope.clearState=function(){$scope.list_selected_vault=!1,$scope.creating_vault=!1,$scope.error=!1},$scope.selectVault=function(vault){$scope.list_selected_vault=vault},$scope.sharing_keys={},$scope.newVault=function(){$scope.creating_vault=!0;var key_size=1024;ShareService.generateRSAKeys(key_size).progress(function(progress){var p=progress>0?2:1,msg=$translate.instant("generating.sharing.keys");msg=msg.replace("%step",p),$scope.creating_keys=msg,$scope.$digest()}).then(function(kp){var pem=ShareService.rsaKeyPairToPEM(kp);$scope.creating_keys=!1,$scope.sharing_keys.private_sharing_key=pem.privateKey,$scope.sharing_keys.public_sharing_key=pem.publicKey,$scope.$digest()})};var _loginToVault=function(vault,vault_key){var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),delete _vault.credentials,$scope.active_vault=_vault};$scope.vaultDecryptionKey="",$scope.loginToVault=function(vault,vault_key){$scope.error=!1;var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault);try{EncryptService.decryptString(vault.challenge_password),$scope.remember_vault_password&&SettingsService.setSetting("defaultVaultPass",vault_key),_loginToVault(vault,vault_key)}catch(e){$scope.error=$translate.instant("invalid.vault.key")}},$scope.createVault=function(vault_name,vault_key,vault_key2){return vault_key!==vault_key2?void($scope.error=$translate.instant("password.do.not.match")):void VaultService.createVault(vault_name).then(function(vault){$scope.vaults.push(vault);var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault);var test_credential=CredentialService.newCredential();test_credential.label="Test key for vault "+vault_name,test_credential.hidden=!0,test_credential.vault_id=vault.vault_id,test_credential.password="lorum ipsum",CredentialService.createCredential(test_credential).then(function(){_vault.public_sharing_key=angular.copy($scope.sharing_keys.public_sharing_key),_vault.private_sharing_key=EncryptService.encryptString(angular.copy($scope.sharing_keys.private_sharing_key)),VaultService.updateSharingKeys(_vault).then(function(){_loginToVault(vault,vault_key)})})})},$scope.storedCredential=CredentialService.newCredential();var QueryString=function(){for(var query_string={},query=window.location.search.substring(1),vars=query.split("&"),i=0;i<vars.length;i++){var pair=vars[i].split("=");if("undefined"==typeof query_string[pair[0]])query_string[pair[0]]=decodeURIComponent(pair[1]);else if("string"==typeof query_string[pair[0]]){var arr=[query_string[pair[0]],decodeURIComponent(pair[1])];query_string[pair[0]]=arr}else query_string[pair[0]].push(decodeURIComponent(pair[1]))}return query_string}(),query_string=QueryString;$scope.storedCredential.label=query_string.title,$scope.storedCredential.url=query_string.url,$scope.setHttpWarning=function(state){$scope.http_warning_hidden=state},$translate(["general","password","custom.fields","files","otp"]).then(function(translations){$scope.tabs=[{title:translations.general,url:"views/partials/forms/edit_credential/basics.html",color:"blue"},{title:translations.password,url:"views/partials/forms/edit_credential/password.html",color:"green"},{title:translations["custom.fields"],url:"views/partials/forms/edit_credential/custom_fields.html",color:"orange"},{title:translations.files,url:"views/partials/forms/edit_credential/files.html",color:"yellow"},{title:translations.otp,url:"views/partials/forms/edit_credential/otp.html",color:"purple"}],$scope.currentTab=$scope.tabs[0]}),$scope.getTags=function($query){return TagService.searchTag($query)},$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url},$scope.pwGenerated=function(pass){$scope.storedCredential.password_repeat=pass};var _customField={label:"",value:"",secret:!1,field_type:"text"};$scope.selected_field_type="text",$scope.new_custom_field=angular.copy(_customField),$scope.addCustomField=function(){var _field=angular.copy($scope.new_custom_field);if(_field.label||NotificationService.showNotification($translate.instant("error.no.label"),3e3),_field.value||NotificationService.showNotification($translate.instant("error.no.value"),3e3),_field.label&&_field.value)if($scope.selected_field_type="text",_field.secret=angular.copy("password"===$scope.selected_field_type),_field.field_type=angular.copy($scope.selected_field_type),"file"===_field.field_type){var _file=$scope.new_custom_field.value;FileService.uploadFile(_file).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename),_field.value=result,$scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)})}else $scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)},$scope.addFileToCustomField=function(file){var _file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};$scope.new_custom_field.value=_file,$scope.$digest()},$scope.deleteCustomField=function(field){field.hasOwnProperty("field_type")&&"file"===field.field_type&&FileService.deleteFile(field.value);var idx=$scope.storedCredential.custom_fields.indexOf(field);$scope.storedCredential.custom_fields.splice(idx,1)},$scope.new_file={name:"",data:null},$scope.deleteFile=function(file){var idx=$scope.storedCredential.files.indexOf(file);FileService.deleteFile(file).then(function(){$scope.storedCredential.files.splice(idx,1)})},$scope.fileLoaded=function(file){var _file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};FileService.uploadFile(_file).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename),$scope.storedCredential.files.push(result)}),$scope.$digest()},$scope.fileLoadError=function(error){return error},$scope.selected_file="",$scope.fileprogress=[],$scope.fileSelectProgress=function(progress){progress&&($scope.fileprogress=progress,$scope.$digest())},$scope.renewIntervalValue=0,$scope.renewIntervalModifier="0",$scope.updateInterval=function(renewIntervalValue,renewIntervalModifier){var value=parseInt(renewIntervalValue),modifier=parseInt(renewIntervalModifier);value&&modifier&&($scope.storedCredential.renew_interval=value*modifier)},$scope.parseQR=function(QRCode){var parsedQR,qrInfo,re=/otpauth:\/\/(totp|hotp)\/(.*)\?(secret|issuer)=(.*)&(issuer|secret)=(.*)/;qrInfo=[],parsedQR=QRCode.qrData.match(re),parsedQR&&(qrInfo={type:parsedQR[1],label:decodeURIComponent(parsedQR[2]),qr_uri:QRCode}),qrInfo[parsedQR[3]]=parsedQR[4],qrInfo[parsedQR[5]]=parsedQR[6],$scope.storedCredential.otp=qrInfo,$scope.$digest()},$scope.saveCredential=function(){delete $scope.storedCredential.password_repeat,$scope.storedCredential.credential_id||($scope.storedCredential.vault_id=$scope.active_vault.vault_id,CredentialService.createCredential($scope.storedCredential).then(function(){NotificationService.showNotification($translate.instant("credential.created"),5e3)}))}}])}(),function(){angular.module("passmanApp").controller("CredentialCtrl",["$scope","VaultService","SettingsService","$location","CredentialService","$rootScope","FileService","EncryptService","TagService","$timeout","NotificationService","CacheService","ShareService","SharingACL","$interval","$filter","$routeParams","$sce","$translate",function($scope,VaultService,SettingsService,$location,CredentialService,$rootScope,FileService,EncryptService,TagService,$timeout,NotificationService,CacheService,ShareService,SharingACL,$interval,$filter,$routeParams,$sce,$translate){if($scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=angular.copy(SettingsService.getSetting("defaultVaultPass")),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else $scope.active_vault||$location.path("/");$scope.show_spinner=!0;var fetchCredentials=function(){VaultService.getVault({guid:$routeParams.vault_id}).then(function(vault){var vaultKey=angular.copy($scope.active_vault.vaultKey),_credentials=angular.copy(vault.credentials);vault.credentials=[],$scope.active_vault=vault,$scope.active_vault.vaultKey=vaultKey,$rootScope.vaultCache||($rootScope.vaultCache=[]),VaultService.setActiveVault($scope.active_vault);for(var i=0;i<_credentials.length;i++){var _credential=_credentials[i];try{if(_credential.shared_key){var enc_key=EncryptService.decryptString(_credential.shared_key);_credential=ShareService.decryptSharedCredential(angular.copy(_credential),enc_key)}else _credential=CredentialService.decryptCredential(angular.copy(_credential));_credential.tags_raw=_credential.tags}catch(e){NotificationService.showNotification($translate.instant("error.decrypt"),5e3)}_credentials[i]=_credential}ShareService.getCredendialsSharedWithUs(vault.guid).then(function(shared_credentials){for(var c=0;c<shared_credentials.length;c++){var _shared_credential_data,_shared_credential=shared_credentials[c],decrypted_key=EncryptService.decryptString(_shared_credential.shared_key);try{_shared_credential_data=ShareService.decryptSharedCredential(_shared_credential.credential_data,decrypted_key)}catch(e){}_shared_credential_data&&(delete _shared_credential.credential_data,_shared_credential_data.acl=_shared_credential,_shared_credential_data.acl.permissions=new SharingACL(_shared_credential_data.acl.permissions),_shared_credential_data.tags_raw=_shared_credential_data.tags,_credentials.push(_shared_credential_data))}if(angular.merge($scope.active_vault.credentials,_credentials),$scope.show_spinner=!1,$rootScope.$broadcast("credentials_loaded"),$rootScope.vaultCache[$scope.active_vault.guid]=angular.copy($scope.active_vault),!vault.private_sharing_key){var key_size=1024;ShareService.generateRSAKeys(key_size).then(function(kp){var pem=ShareService.rsaKeyPairToPEM(kp);$scope.creating_keys=!1,$scope.active_vault.private_sharing_key=pem.privateKey,$scope.active_vault.public_sharing_key=pem.publicKey,$scope.$digest(),VaultService.updateSharingKeys($scope.active_vault)})}})})},getPendingShareRequests=function(){ShareService.getPendingRequests().then(function(shareRequests){shareRequests.length>0&&($scope.incoming_share_requests=shareRequests,jQuery(".share_popup").dialog({width:800,modal:!0,dialogClass:"shareincoming-dialog"}))})},refresh_data_interval=null;$scope.active_vault&&($scope.$parent.selectedVault=!0,$rootScope.vaultCache&&$rootScope.vaultCache[$scope.active_vault.guid]?($scope.active_vault=$rootScope.vaultCache[$scope.active_vault.guid],$rootScope.$broadcast("credentials_loaded"),$scope.show_spinner=!1):fetchCredentials(),getPendingShareRequests(),refresh_data_interval=$interval(function(){fetchCredentials(),getPendingShareRequests()},3e5)),$scope.$on("$destroy",function(){$interval.cancel(refresh_data_interval)}),$scope.permissions=new SharingACL(0),$scope.hasPermission=function(acl,permission){if(acl){var tmp=new SharingACL(acl.permission);return tmp.hasPermission(permission)}return!0},$scope.acceptShareRequest=function(share_request){var crypted_shared_key=share_request.shared_key,private_key=EncryptService.decryptString(VaultService.getActiveVault().private_sharing_key);private_key=ShareService.rsaPrivateKeyFromPEM(private_key),crypted_shared_key=private_key.decrypt(forge.util.decode64(crypted_shared_key)),crypted_shared_key=EncryptService.encryptString(crypted_shared_key),ShareService.saveSharingRequest(share_request,crypted_shared_key).then(function(){var idx=$scope.incoming_share_requests.indexOf(share_request);$scope.incoming_share_requests.splice(idx,1);for(var active_share_requests=!1,v=0;v<$scope.incoming_share_requests.length;v++)$scope.incoming_share_requests[v].target_vault_id===$scope.active_vault.vault_id&&(active_share_requests=!0);active_share_requests===!1&&(jQuery(".ui-dialog").remove(),fetchCredentials())})},$scope.declineShareRequest=function(share_request){ShareService.declineSharingRequest(share_request).then(function(){var idx=$scope.incoming_share_requests.indexOf(share_request);$scope.incoming_share_requests.splice(idx,1);for(var active_share_requests=!1,v=0;v<$scope.incoming_share_requests.length;v++)$scope.incoming_share_requests[v].target_vault_id===$scope.active_vault.vault_id&&(active_share_requests=!0);active_share_requests===!1&&(jQuery(".ui-dialog").remove(),fetchCredentials())})};var settingsLoaded=function(){$scope.settings=SettingsService.getSettings()};SettingsService.getSetting("settings_loaded")?settingsLoaded():$rootScope.$on("settings_loaded",function(){settingsLoaded()}),$scope.addCredential=function(){var new_credential=CredentialService.newCredential(),enc_c=CredentialService.encryptCredential(new_credential);SettingsService.setSetting("edit_credential",enc_c),$location.path("/vault/"+$scope.active_vault.guid+"/new")},$scope.editCredential=function(credential){var _credential=angular.copy(credential);$rootScope.$emit("app_menu",!1),SettingsService.setSetting("edit_credential",CredentialService.encryptCredential(_credential)),$location.path("/vault/"+$scope.active_vault.guid+"/edit/"+_credential.guid)},$scope.getRevisions=function(credential){var _credential=angular.copy(credential);$rootScope.$emit("app_menu",!1),SettingsService.setSetting("revision_credential",CredentialService.encryptCredential(_credential)),$location.path("/vault/"+$scope.active_vault.guid+"/"+_credential.guid+"/revisions")},$scope.shareCredential=function(credential){var _credential=angular.copy(credential);$rootScope.$emit("app_menu",!1),SettingsService.setSetting("share_credential",CredentialService.encryptCredential(_credential)),$location.path("/vault/"+$scope.active_vault.guid+"/"+_credential.guid+"/share")};var notification;$scope.deleteCredential=function(credential){var _credential=angular.copy(credential);try{_credential=CredentialService.decryptCredential(_credential)}catch(e){}_credential.delete_time=(new Date).getTime()/1e3;for(var i=0;i<$scope.active_vault.credentials.length;i++)$scope.active_vault.credentials[i].credential_id===credential.credential_id&&($scope.active_vault.credentials[i].delete_time=_credential.delete_time);$scope.closeSelected(),notification&&NotificationService.hideNotification(notification);var key=CredentialService.getSharedKeyFromCredential(_credential);CredentialService.updateCredential(_credential,!1,key).then(function(){notification=NotificationService.showNotification($translate.instant("credential.deleted"),5e3)})},$scope.recoverCredential=function(credential){var _credential=angular.copy(credential);try{_credential=CredentialService.decryptCredential(_credential)}catch(e){}for(var i=0;i<$scope.active_vault.credentials.length;i++)$scope.active_vault.credentials[i].credential_id===credential.credential_id&&($scope.active_vault.credentials[i].delete_time=0);_credential.delete_time=0,$scope.closeSelected(),notification&&NotificationService.hideNotification(notification);var key=CredentialService.getSharedKeyFromCredential(_credential);CredentialService.updateCredential(_credential,!1,key).then(function(){NotificationService.showNotification($translate.instant("credential.recovered"),5e3)})},$scope.destroyCredential=function(credential){var _credential=angular.copy(credential);CredentialService.destroyCredential(_credential.guid).then(function(){for(var i=0;i<$scope.active_vault.credentials.length;i++)if($scope.active_vault.credentials[i].credential_id===credential.credential_id){$scope.active_vault.credentials.splice(i,1),NotificationService.showNotification($translate.instant("credential.destroyed"),5e3);break}})},$scope.view_mode="list",$scope.switchViewMode=function(viewMode){$scope.view_mode=viewMode},$rootScope.$on("push_decrypted_credential_to_list",function(){$rootScope.$broadcast("credentials_loaded")}),$scope.filterOptions={filterText:"",fields:["label","username","email","custom_fields"]},$scope.$on("nc_searchbox",function(event,searchterm,fields){$scope.filterOptions.filterText=searchterm,fields&&($scope.filterOptions.fields=fields)}),$scope.filtered_credentials=[],$scope.$watch("[selectedtags, filterOptions, delete_time, active_vault.credentials]",function(){if($scope.active_vault&&$scope.active_vault.credentials){var credentials=angular.copy($scope.active_vault.credentials),filtered_credentials=$filter("credentialSearch")(credentials,$scope.filterOptions);filtered_credentials=$filter("tagFilter")(filtered_credentials,$scope.selectedtags),filtered_credentials=$filter("filter")(filtered_credentials,{hidden:0}),$scope.filtered_credentials=filtered_credentials,$scope.filterOptions.selectedtags=angular.copy($scope.selectedtags);for(var i=0;i<$scope.active_vault.credentials.length;i++){var _credential=$scope.active_vault.credentials[i];_credential.tags&&TagService.addTags(_credential.tags)}}},!0),$scope.no_credentials_label=[],$scope.no_credentials_label.all=!0,$scope.no_credentials_label.s_good=!1,$scope.no_credentials_label.s_medium=!1,$scope.no_credentials_label.s_low=!1,$scope.no_credentials_label.expired=!1,$scope.disableAllLabels=function(){$scope.no_credentials_label.all=!1,$scope.no_credentials_label.s_good=!1,$scope.no_credentials_label.s_medium=!1,$scope.no_credentials_label.s_low=!1,$scope.no_credentials_label.expired=!1},$scope.$on("filterSpecial",function(event,args){switch($scope.disableAllLabels(),args){case"strength_good":$scope.filterStrength(3,1e3),$scope.no_credentials_label.s_good=!0;break;case"strength_medium":$scope.filterStrength(2,3),$scope.no_credentials_label.s_medium=!0;break;case"strength_low":$scope.filterStrength(0,1),$scope.no_credentials_label.s_low=!0;break;case"expired":$scope.filterExpired(),$scope.no_credentials_label.expired=!0;break;case"all":$scope.filterAll(),$scope.no_credentials_label.all=!0}}),$scope.getListSizes=function(){for(var l=$scope.filtered_credentials,deleted=0,i=0;i<l.length;i++)l[i].delete_time>0&&deleted++;var result=[];return result.listsize=l.length,result.listsize_wout_deleted=l.length-deleted,result.listsize_deleted=deleted,result},$scope.filterAll=function(){$scope.selectedtags=[],$scope.filterOptions.filterText="";for(var creds_filtered=[],i=0;i<$scope.active_vault.credentials.length;i++)0===$scope.active_vault.credentials[i].delete_time&&creds_filtered.push($scope.active_vault.credentials[i]);$scope.filtered_credentials=$scope.filterHidden(creds_filtered)},$scope.filterStrength=function(strength_min,strength_max){for(var initialCredentials=$scope.active_vault.credentials,postFiltered=[],i=0;i<initialCredentials.length;i++){var _credential=initialCredentials[i],zxcvbn_result=zxcvbn(_credential.password);zxcvbn_result.score>=strength_min&&zxcvbn_result.score<=strength_max&&postFiltered.push(initialCredentials[i])}$scope.filtered_credentials=$scope.filterHidden(postFiltered)},$scope.filterExpired=function(){for(var initialCredentials=$scope.active_vault.credentials,now=Date.now(),postFiltered=[],i=0;i<initialCredentials.length;i++){var _credential=initialCredentials[i];0!==_credential.expire_time&&_credential.expire_time<=now&&postFiltered.push(initialCredentials[i])}$scope.filtered_credentials=$scope.filterHidden(postFiltered)},$scope.filterHidden=function(list){for(var list_without_hidden=[],i=0;i<list.length;i++)1!==list[i].hidden&&list_without_hidden.push(list[i]);return list_without_hidden},$scope.selectedtags=[];var to;$rootScope.$on("selected_tags_updated",function(evt,_sTags){for(var _selectedTags=[],x=0;x<_sTags.length;x++)_selectedTags.push(_sTags[x].text);$scope.selectedtags=_selectedTags,$timeout.cancel(to),_selectedTags.length>0&&(to=$timeout(function(){if($scope.filtered_credentials){for(var _filtered_tags=[],i=0;i<$scope.filtered_credentials.length;i++)for(var tags=$scope.filtered_credentials[i].tags_raw,x=0;x<tags.length;x++){var tag=tags[x].text;_filtered_tags.indexOf(tag)===-1&&_filtered_tags.push(tag)}$rootScope.$emit("limit_tags_in_list",_filtered_tags)}},50))}),$scope.delete_time=0,$scope.showCredentialRow=function(credential){return 0===$scope.delete_time?0===credential.delete_time:credential.delete_time>$scope.delete_time},$rootScope.$on("set_delete_time",function(event,time){$scope.delete_time=time}),$scope.setDeleteTime=function(delete_time){$scope.delete_time=delete_time},$scope.selectedCredential=!1,$scope.selectCredential=function(credential){credential.description&&(credential.description_html=$sce.trustAsHtml(angular.copy(credential.description).replace("\n","<br />"))),$scope.selectedCredential=angular.copy(credential),$rootScope.$emit("app_menu",!0)},$scope.closeSelected=function(){$rootScope.$emit("app_menu",!1),$scope.selectedCredential=!1},$rootScope.$on("logout",function(){$scope.active_vault&&($rootScope.vaultCache[$scope.active_vault.guid]=null),$scope.active_vault=null,$scope.credentials=[],VaultService.clearVaultService()}),$scope.clearState=function(){$scope.delete_time=0}}])}(),function(){angular.module("passmanApp").controller("CredentialEditCtrl",["$scope","VaultService","CredentialService","SettingsService","$location","$routeParams","FileService","EncryptService","TagService","NotificationService","ShareService","$translate","$rootScope",function($scope,VaultService,CredentialService,SettingsService,$location,$routeParams,FileService,EncryptService,TagService,NotificationService,ShareService,$translate,$rootScope){if($scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else if(!$scope.active_vault)return void $location.path("/");VaultService.getVault($scope.active_vault).then(function(vault){vault.vaultKey=VaultService.getActiveVault().vaultKey,delete vault.credentials,VaultService.setActiveVault(vault),$scope.pwSettings=VaultService.getVaultSetting("pwSettings",{length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0,generateOnCreate:!0})}),$scope.currentTab={title:$translate.instant("general"),url:"views/partials/forms/edit_credential/basics.html",color:"blue"},$scope.otpType="qrcode",$translate(["general","password","custom.fields","files","otp"]).then(function(translations){$scope.tabs=[{title:translations.general,url:"views/partials/forms/edit_credential/basics.html",color:"blue"},{title:translations.password,url:"views/partials/forms/edit_credential/password.html",color:"green"},{title:translations["custom.fields"],url:"views/partials/forms/edit_credential/custom_fields.html",color:"orange"},{title:translations.files,url:"views/partials/forms/edit_credential/files.html",color:"yellow"},{title:translations.otp,url:"views/partials/forms/edit_credential/otp.html",color:"purple"}],$scope.currentTab=$scope.tabs[0]}),$scope.active_vault&&($scope.$parent.selectedVault=!0);var storedCredential=SettingsService.getSetting("edit_credential");storedCredential?($scope.storedCredential=CredentialService.decryptCredential(angular.copy(storedCredential)),$scope.storedCredential.password_repeat=angular.copy($scope.storedCredential.password),$scope.storedCredential.expire_time=1e3*$scope.storedCredential.expire_time):CredentialService.getCredential($routeParams.credential_id).then(function(result){$scope.storedCredential=CredentialService.decryptCredential(angular.copy(result))}),$scope.oldPassword=$scope.storedCredential.password,$scope.getTags=function($query){return TagService.searchTag($query)},$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url},$scope.pwGenerated=function(pass){$scope.storedCredential.password_repeat=pass};var _customField={label:"",value:"",secret:!1,field_type:"text"};$scope.selected_field_type="text",$scope.new_custom_field=angular.copy(_customField),$scope.addCustomField=function(){var _field=angular.copy($scope.new_custom_field);if(_field.label||NotificationService.showNotification($translate.instant("error.no.label"),3e3),_field.value||NotificationService.showNotification($translate.instant("error.no.value"),3e3),_field.label&&_field.value)if($scope.selected_field_type="text",_field.secret="password"===_field.field_type,"file"===_field.field_type){var key=!1,_file=$scope.new_custom_field.value;!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),FileService.uploadFile(_file,key).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename,key),_field.value=result,$scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)})}else $scope.storedCredential.custom_fields.push(_field),$scope.new_custom_field=angular.copy(_customField)},$scope.addFileToCustomField=function(file){$scope.new_custom_field.value={filename:file.name,size:file.size,mimetype:file.type,data:file.data},$scope.$digest()},$scope.deleteCustomField=function(field){field.hasOwnProperty("field_type")&&"file"===field.field_type&&FileService.deleteFile(field.value);var idx=$scope.storedCredential.custom_fields.indexOf(field);$scope.storedCredential.custom_fields.splice(idx,1)},$scope.new_file={name:"",data:null
+},$scope.deleteFile=function(file){var idx=$scope.storedCredential.files.indexOf(file);FileService.deleteFile(file).then(function(){$scope.storedCredential.files.splice(idx,1)})},$scope.fileLoaded=function(file){var key,_file={filename:file.name,size:file.size,mimetype:file.type,data:file.data};!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),FileService.uploadFile(_file,key).then(function(result){delete result.file_data,result.filename=EncryptService.decryptString(result.filename,key),$scope.storedCredential.files.push(result)}),$scope.$digest()},$scope.fileLoadError=function(error){console.log($translate.instant("error.loading.file"),error)},$scope.selected_file="",$scope.fileprogress=[],$scope.fileSelectProgress=function(progress){progress&&($scope.fileprogress=progress,$scope.$digest())},$scope.renewIntervalValue=0,$scope.renewIntervalModifier="0",$scope.updateInterval=function(renewIntervalValue,renewIntervalModifier){var value=parseInt(renewIntervalValue),modifier=parseInt(renewIntervalModifier);value&&modifier&&($scope.storedCredential.renew_interval=value*modifier)},$scope.parseQR=function(QRCode){if(!QRCode)return void NotificationService.showNotification($translate.instant("invalid.qr"),5e3);var uri=new URL(QRCode.qrData),type=uri.href.indexOf("totp/")!==-1?"totp":"hotp",label=uri.pathname.replace("//"+type+"/","");$scope.storedCredential.otp={type:type,label:decodeURIComponent(label),qr_uri:QRCode,issuer:uri.searchParams.get("issuer"),secret:uri.searchParams.get("secret")},$scope.$digest()},$scope.saving=!1,$scope.compromise=function(){console.log("This password was compromised"),$scope.storedCredential.compromised=!0},$scope.saveCredential=function(){if($scope.saving=!0,$scope.storedCredential.compromised&&$scope.oldPassword!==$scope.storedCredential.password&&($scope.storedCredential.compromised=!1),$scope.new_custom_field.label&&$scope.new_custom_field.value&&$scope.storedCredential.custom_fields.push(angular.copy($scope.new_custom_field)),$scope.storedCredential.password!==$scope.storedCredential.password_repeat)return $scope.saving=!1,void NotificationService.showNotification($translate.instant("password.do.not.match"),5e3);if(delete $scope.storedCredential.password_repeat,$scope.storedCredential.credential_id){var key,_credential;!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),_credential=key?ShareService.encryptSharedCredential($scope.storedCredential,key):angular.copy($scope.storedCredential),delete _credential.shared_key;var _useKey=null!=key,regex=/(<([^>]+)>)/gi;_credential.description&&""!==_credential.description&&(_credential.description=_credential.description.replace(regex,"")),CredentialService.updateCredential(_credential,_useKey).then(function(updated_cred){$scope.saving=!1,SettingsService.setSetting("edit_credential",null),$location.path("/vault/"+$routeParams.vault_id),NotificationService.showNotification($translate.instant("credential.updated"),5e3),$scope.updateExistingListWithCredential(updated_cred)})}else $scope.storedCredential.vault_id=$scope.active_vault.vault_id,CredentialService.createCredential($scope.storedCredential).then(function(new_cred){$scope.saving=!1,$location.path("/vault/"+$routeParams.vault_id),NotificationService.showNotification($translate.instant("credential.created"),5e3),$scope.updateExistingListWithCredential(new_cred)})},$scope.updateExistingListWithCredential=function(credential){try{if(credential.shared_key){var enc_key=EncryptService.decryptString(credential.shared_key);credential=ShareService.decryptSharedCredential(credential,enc_key)}else credential=CredentialService.decryptCredential(credential);credential.tags_raw=credential.tags;for(var found=!1,credList=$rootScope.vaultCache[$scope.active_vault.guid].credentials,i=0;i<credList.length;i++)credList[i].credential_id===credential.credential_id&&($rootScope.vaultCache[$scope.active_vault.guid].credentials[i]=credential,found=!0);found||$rootScope.vaultCache[$scope.active_vault.guid].credentials.push(credential),$rootScope.$broadcast("push_decrypted_credential_to_list",credential)}catch(e){NotificationService.showNotification($translate.instant("error.decrypt"),5e3),console.log(e)}},$scope.cancel=function(){$location.path("/vault/"+$routeParams.vault_id)}}])}(),function(){angular.module("passmanApp").controller("ExportCtrl",["$scope","$window","CredentialService","VaultService","FileService","EncryptService","$translate",function($scope,$window,CredentialService,VaultService,FileService,EncryptService,$translate){$scope.available_exporters=[],$scope.active_vault=VaultService.getActiveVault(),$scope.confirm_key="",$scope.$watch(function(){return $window.PassmanExporter},function(exporters){exporters=Object.keys(angular.copy(exporters));for(var i=0;i<exporters.length;i++){var exporter=exporters[i];$window.PassmanExporter[exporter].hasOwnProperty("info")&&$scope.available_exporters.push($window.PassmanExporter[exporter].info)}},!0),$scope.log=[],$scope.setExporter=function(exporter){exporter=JSON.parse(exporter),$scope.selectedExporter=exporter};var _log=function(str){$scope.log.push(str)};$scope.startExport=function(){if($scope.error=!1,VaultService.getActiveVault().vaultKey!==$scope.confirm_key){var msg=$translate.instant("invalid.vault.key");return $scope.error=msg,void _log(msg)}_log($translate.instant("export.starting"));var _credentials=[];VaultService.getVault(VaultService.getActiveVault()).then(function(vault){if(_log($translate.instant("export.decrypt")),vault.hasOwnProperty("credentials")&&vault.credentials.length>0){for(var i=0;i<vault.credentials.length;i++){var _credential=angular.copy(vault.credentials[i]);if(0===_credential.hidden){var key=CredentialService.getSharedKeyFromCredential(_credential);_credential=CredentialService.decryptCredential(_credential,key),_credential.vault_key=key,_credentials.push(_credential)}}$window.PassmanExporter[$scope.selectedExporter.id].export(_credentials,FileService,EncryptService).then(function(){_log($translate.instant("done"))})}})}}])}(),function(){angular.module("passmanApp").controller("GenericCsvImportCtrl",["$scope","CredentialService","$translate",function($scope,CredentialService,$translate){$scope.hello="world",$scope.credentialProperties=[{label:"Label",prop:"label",matching:["label","title","name"]},{label:"Username",prop:"username",matching:["username","user","login","login name"]},{label:"Password",prop:"password",matching:["password","pass","pw"]},{label:"TOTP Secret",prop:"otp",matching:["totp"]},{label:"Custom field",prop:"custom_field"},{label:"Notes",prop:"description",matching:["notes","description","comments"]},{label:"Email",prop:"email",matching:["email","mail"]},{label:"URL",prop:"url",matching:["website","url","fulladdress","site","web site"]},{label:"Tags",prop:"tags"},{label:"Ignored",prop:null}];var tagMapper=function(t){return{text:t}},rowToCredential=function(row){for(var _credential=PassmanImporter.newCredential(),k=0;k<$scope.import_fields.length;k++){var field=$scope.import_fields[k];if(field)if("otp"===field)_credential.otp.secret=row[k];else if("custom_field"===field){var key=$scope.matched?$scope.parsed_csv[0][k]:"Custom field "+k;_credential.custom_fields.push({label:key,value:row[k],secret:0})}else if("tags"===field){if(row[k]){var tags=row[k].split(",");_credential.tags=tags.map(tagMapper)}}else _credential[field]=row[k]}return _credential};$scope.inspectCredential=function(row){$scope.inspected_credential=rowToCredential(row)},$scope.csvLoaded=function(file){$scope.import_fields=[],$scope.inspected_credential=!1,$scope.matched=!1,$scope.skipFirstRow=!1;var file_data=file.data.split(",");file_data=decodeURIComponent(escape(window.atob(file_data[1]))),Papa.parse(file_data,{complete:function(results){if(results.data){for(var i=0;i<results.data[0].length;i++){var propName=results.data[0][i];$scope.import_fields[i]=null;for(var p=0;p<$scope.credentialProperties.length;p++){var credentialProperty=$scope.credentialProperties[p];credentialProperty.matching&&credentialProperty.matching.indexOf(propName.toLowerCase())!==-1&&($scope.import_fields[i]=credentialProperty.prop,$scope.matched=!0)}}$scope.matched&&$scope.inspectCredential(results.data[1]),$scope.parsed_csv=results.data,$scope.$apply()}}})};var addCredential=function(index){function handleState(index){$scope.parsed_csv[index+1]?($scope.import_progress={progress:index/$scope.parsed_csv.length*100,loaded:index,total:$scope.parsed_csv.length},addCredential(index+1)):($scope.import_progress={progress:100,loaded:$scope.parsed_csv.length,total:$scope.parsed_csv.length},$scope.log.push($translate.instant("done")),$scope.importing=!1)}var _credential=rowToCredential($scope.parsed_csv[index]);return _credential.vault_id=$scope.active_vault.vault_id,_credential.label?($scope.log.push($translate.instant("import.adding",{credential:_credential.label})),void CredentialService.createCredential(_credential).then(function(result){result.credential_id&&($scope.log.push($translate.instant("import.added",{credential:_credential.label})),handleState(index))})):($scope.log.push($translate.instant("import.skipping",{line:index})),void handleState(index))};$scope.importing=!1,$scope.startCSVImport=function(){$scope.importing=!0,$scope.log=[];var start=$scope.skipFirstRow?1:0;addCredential(start)},$scope.updateExample=function(){var start=$scope.skipFirstRow?1:0;$scope.inspectCredential($scope.parsed_csv[start])}}])}(),function(){angular.module("passmanApp").controller("ImportCtrl",["$scope","$window","CredentialService","VaultService","$translate",function($scope,$window,CredentialService,VaultService,$translate){$scope.available_importers=[],$scope.active_vault=VaultService.getActiveVault(),$scope.$watch(function(){return $window.PassmanImporter},function(importers){for(var key in importers){var importer=importers[key];importer.hasOwnProperty("info")&&$scope.available_importers.push(importer.info)}},!0),$scope.log=[],$scope.setImporter=function(importer){importer=JSON.parse(importer),$scope.selectedImporter=importer};var file_data,_log=function(str){$scope.log.push(str)};$scope.fileLoaded=function(file){file_data=file.data.split(","),file_data=decodeURIComponent(escape(window.atob(file_data[1]))),_log($translate.instant("import.file.read")),$scope.$digest()},$scope.fileLoadError=function(file){console.error($translate.instant("error.loading.file"),file)},$scope.fileSelectProgress=function(){};var parsed_data;$scope.import_progress={progress:0,loaded:0,total:0};var addCredential=function(parsed_data_index){if(parsed_data[parsed_data_index]){var _credential=parsed_data[parsed_data_index];if(!_credential.label)return void(parsed_data[parsed_data_index+1]&&(_log($translate.instant("import.no.label")),addCredential(parsed_data_index+1)));_log($translate.instant("import.adding",{credential:_credential.label})),_credential.vault_id=$scope.active_vault.vault_id,CredentialService.createCredential(_credential).then(function(result){result.credential_id&&(_log($translate.instant("import.added",{credential:_credential.label})),parsed_data[parsed_data_index+1]?($scope.import_progress={progress:parsed_data_index/parsed_data.length*100,loaded:parsed_data_index,total:parsed_data.length},addCredential(parsed_data_index+1)):($scope.import_progress={progress:100,loaded:parsed_data.length,total:parsed_data.length},_log($translate.instant("done"))))})}};$scope.file_read_progress={percent:0,loaded:0,total:0},$scope.startImport=function(){$scope.import_progress=0,$scope.file_read_percent=0,file_data&&$window.PassmanImporter[$scope.selectedImporter.id].readFile(file_data).then(function(parseddata){parsed_data=parseddata,$scope.file_read_progress={percent:100,loaded:parsed_data.length,total:parsed_data.length};var msg=$translate.instant("import.loaded").replace("{{num}}",parsed_data.length);_log(msg),parsed_data.length>0&&addCredential(0)}).progress(function(progress){$scope.file_read_progress=progress,$scope.$digest()})}}])}(),function(){angular.module("passmanApp").controller("MainCtrl",["$scope","$rootScope","$location","SettingsService","$window","$interval","$filter",function($scope,$rootScope,$location,SettingsService,$window,$interval,$filter){$scope.selectedVault=!1,$scope.http_warning_hidden=!0,"http"===$location.$$protocol&&"localhost"!==$location.$$host&&"127.0.0.1"!==$location.$host&&($scope.using_http=!0,$scope.http_warning_hidden=!1),$scope.removeHiddenStyles=function(){document.getElementById("warning_bar").classList.remove("template-hidden")},$rootScope.$on("settings_loaded",function(){SettingsService.isEnabled("disable_contextmenu")&&document.addEventListener("contextmenu",function(event){event.preventDefault()}),SettingsService.isEnabled("https_check")&&($scope.http_warning_hidden=!0),SettingsService.isEnabled("disable_debugger")&&!function a(){try{!function b(i){1===(""+i/i).length&&i%20!==0||function(){}.constructor("debugger")(),b(++i)}(0)}catch(e){setTimeout(a,5e3)}}()}),$rootScope.setHttpWarning=function(state){$scope.http_warning_hidden=state},$rootScope.$on("app_menu",function(evt,shown){$scope.app_sidebar=shown}),$rootScope.$on("logout",function(){$scope.selectedVault=!1});var tickSessionTimer=function(){if($scope.session_time_left){$scope.session_time_left--;var session_time_left_formatted=$filter("toHHMMSS")($scope.session_time_left);$scope.translationData={session_time:session_time_left_formatted},$rootScope.$broadcast("logout_timer_tick_tack",$scope.session_time_left),0===$scope.session_time_left&&$window.location.reload()}};$scope.session_time_left=!1,$scope.$on("logout_timer_set",function(evt,timer){$scope.session_time_left=timer,$scope.translationData={session_time:timer},$interval(tickSessionTimer,1e3)})}])}(),function(){angular.module("passmanApp").controller("MenuCtrl",["$scope","VaultService","$location","$rootScope","TagService","SettingsService","$translate","SearchboxexpanderService",function($scope,VaultService,$location,$rootScope,TagService,SettingsService,$translate,SearchboxexpanderService){$rootScope.logout=function(){$rootScope.override_default_vault=!0,SettingsService.setSetting("defaultVaultPass",!1),TagService.resetTags(),$rootScope.$broadcast("logout"),$location.path("/")},$scope.removeHiddenStyles=function(){document.getElementById("app-navigation").classList.remove("template-hidden")},$scope.selectedTags=[],$scope.getTags=function($query){return TagService.searchTag($query)},$scope.$watch(function(){return VaultService.getActiveVault()},function(vault){$scope.active_vault=vault}),$scope.filtered_tags=[],$rootScope.$on("limit_tags_in_list",function(evt,tags){$scope.filtered_tags=[];for(var i=0;i<tags.length;i++){for(var tag={text:tags[i]},found=!1,x=0;x<$scope.selectedTags.length;x++)$scope.selectedTags[x].text===tag.text&&(found=!0);found===!1&&$scope.filtered_tags.push(tag)}}),$scope.$watch("selectedTags",function(){$rootScope.$broadcast("selected_tags_updated",$scope.selectedTags)},!0),$scope.tagSelected=function(tag){for(var i=0;i<$scope.selectedTags.length;i++)if($scope.selectedTags[i].text===tag.text)return!0;return!1},$scope.removeTagFromSelected=function(tag){for(var where=-1,i=0;i<$scope.selectedTags.length;i++)$scope.selectedTags[i].text===tag.text&&(where=i);$scope.selectedTags.splice(where,1)},$scope.clearForm=function(){document.getElementById("tagsearch").value=""},$scope.tagClickedString=function(tagtext){var tag=[];tag.text=tagtext,$scope.tagClicked(tag)},$scope.tagClicked=function(tag){$scope.tagSelected(tag)?$scope.removeTagFromSelected(tag):$scope.selectedTags.push(tag)},SearchboxexpanderService.expandSearch($rootScope,$scope),$scope.clickedNavigationItem="all",$scope.filterCredentialBySpecial=function(string){$scope.clickedNavigationItem=string,"nav_trashbin"!==string&&($scope.delete_time=0,$rootScope.$broadcast("set_delete_time",$scope.delete_time)),$scope.selectedTags=[],$rootScope.$broadcast("filterSpecial",string),$scope.settingsShown=!1},$scope.collapsedDefaultValue=!0,$scope.tagCollapsibleOpen=VaultService.getVaultSetting("vaultTagCollapsedState",$scope.collapsedDefaultValue),$scope.tagCollapsibleClicked=function(){VaultService.getVaultSetting("vaultTagCollapsedState",$scope.collapsedDefaultValue)===!0?VaultService.setVaultSetting("vaultTagCollapsedState",!1):VaultService.setVaultSetting("vaultTagCollapsedState",!0)},$scope.tagCollapsibleState=function(){return VaultService.getVaultSetting("vaultTagCollapsedState",$scope.collapsedDefaultValue)?"":"open"},$scope.initPlaceholder=function(){$translate.onReady().then(function(){var string=$translate.instant("navigation.advanced.filter");document.getElementById("tags-input-outer").setAttribute("placeholder",string),document.getElementById("tags-input-outer").firstChild.firstChild.childNodes[1].setAttribute("placeholder",string)})},$scope.legacyNavbarDefault=!0,$scope.legacyNavbarAlreadyInitialized=!1,"undefined"==typeof $scope.legacyNavbar&&($scope.legacyNavbar=$scope.legacyNavbarDefault),$scope.$watch("legacyNavbar",function(newValue,oldValue){VaultService.setVaultSetting("vaultNavBarLegacy",newValue)}),$scope.initializeNavbar=function(){$scope.legacyNavbarAlreadyInitialized||($scope.legacyNavbar=VaultService.getVaultSetting("vaultNavBarLegacy",$scope.legacyNavbarDefault),$scope.legacyNavbarAlreadyInitialized=!0)},$rootScope.$on("credentials_loaded",function(){$rootScope.$broadcast("selected_tags_updated",$scope.selectedTags),$scope.initializeNavbar()}),$scope.available_tags=TagService.getTags(),$scope.$watch(function(){return 0===$scope.selectedTags.length?TagService.getTags():TagService.getTags()},function(tags){$scope.available_tags=TagService.getTags()},!0),$scope.toggleDeleteTime=function(){$scope.delete_time>0?$scope.delete_time=0:($scope.delete_time=1,this.filterCredentialBySpecial("nav_trashbin")),$rootScope.$broadcast("set_delete_time",$scope.delete_time)}}])}(),function(){angular.module("passmanApp").controller("PublicSharedCredential",["$scope","ShareService","$window","EncryptService","NotificationService","$translate",function($scope,ShareService,$window,EncryptService,NotificationService,$translate){var _key;$scope.loading=!1,$scope.loadSharedCredential=function(){$scope.loading=!0;var data=window.atob($window.location.hash.replace("#","")).split("<::>"),guid=data[0];_key=data[1],ShareService.getPublicSharedCredential(guid).then(function(sharedCredential){$scope.loading=!1,200===sharedCredential.status?$scope.shared_credential=ShareService.decryptSharedCredential(sharedCredential.data.credential_data,_key):$scope.expired=!0})},$scope.downloadFile=function(credential,file){ShareService.downloadSharedFile(credential,file).then(function(result){if(!result.hasOwnProperty("file_data"))return void NotificationService.showNotification($translate.instant("error.loading.file.perm"),5e3);var file_data=EncryptService.decryptString(result.file_data,_key);download(file_data,escapeHTML(file.filename),file.mimetype)})}}])}(),function(){angular.module("passmanApp").controller("RevisionCtrl",["$scope","SettingsService","VaultService","CredentialService","$location","$routeParams","$rootScope","NotificationService","$filter","ShareService","EncryptService","$translate",function($scope,SettingsService,VaultService,CredentialService,$location,$routeParams,$rootScope,NotificationService,$filter,ShareService,EncryptService,$translate){if($scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(_vault),VaultService.getVault(_vault).then(function(vault){vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(vault),$scope.active_vault=vault,$scope.$parent.selectedVault=!0})}}else $scope.active_vault||$location.path("/");$scope.active_vault&&($scope.$parent.selectedVault=!0);var storedCredential=SettingsService.getSetting("revision_credential"),getRevisions=function(){CredentialService.getRevisions($scope.storedCredential.guid).then(function(revisions){$scope.revisions=revisions})};storedCredential?($scope.storedCredential=CredentialService.decryptCredential(angular.copy(storedCredential)),getRevisions()):CredentialService.getCredential($routeParams.credential_id).then(function(result){$scope.storedCredential=CredentialService.decryptCredential(angular.copy(result)),getRevisions()}),$scope.selectRevision=function(revision){var key;$scope.selectedRevision=angular.copy(revision),!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),key?$scope.selectedRevision.credential_data=ShareService.decryptSharedCredential(angular.copy(revision.credential_data),key):$scope.selectedRevision.credential_data=CredentialService.decryptCredential(angular.copy(revision.credential_data)),$rootScope.$emit("app_menu",!0)},$scope.closeSelected=function(){$rootScope.$emit("app_menu",!1),$scope.selectedRevision=!1},$scope.deleteRevision=function(revision){CredentialService.deleteRevision($scope.storedCredential.guid,revision.revision_id).then(function(){for(var i=0;i<$scope.revisions.length;i++)if($scope.revisions[i].revision_id===revision.revision_id){$scope.revisions.splice(i,1),NotificationService.showNotification($translate.instant("revision.deleted"),5e3);break}})},$scope.restoreRevision=function(revision){var key,_revision=angular.copy(revision),_credential=_revision.credential_data;!$scope.storedCredential.hasOwnProperty("acl")&&$scope.storedCredential.hasOwnProperty("shared_key")&&$scope.storedCredential.shared_key&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key))),$scope.storedCredential.hasOwnProperty("acl")&&(key=EncryptService.decryptString(angular.copy($scope.storedCredential.acl.shared_key))),key&&(_credential=ShareService.encryptSharedCredential(_credential,key)),delete _credential.shared_key,_credential.revision_created=$filter("date")(1e3*_revision.created,"dd-MM-yyyy @ HH:mm:ss"),CredentialService.updateCredential(_credential,key).then(function(restored_cred){SettingsService.setSetting("revision_credential",null),$rootScope.$emit("app_menu",!1),$location.path("/vault/"+$routeParams.vault_id),NotificationService.showNotification($translate.instant("revision.restored"),5e3),$scope.updateExistingListWithCredential(restored_cred)})},$scope.updateExistingListWithCredential=function(credential){try{if(credential.shared_key){var enc_key=EncryptService.decryptString(credential.shared_key);credential=ShareService.decryptSharedCredential(credential,enc_key)}else credential=CredentialService.decryptCredential(credential);credential.tags_raw=credential.tags;for(var found=!1,credList=$rootScope.vaultCache[$scope.active_vault.guid].credentials,i=0;i<credList.length;i++)credList[i].credential_id===credential.credential_id&&($rootScope.vaultCache[$scope.active_vault.guid].credentials[i]=credential,found=!0);found||$rootScope.vaultCache[$scope.active_vault.guid].credentials.push(credential),$rootScope.$broadcast("push_decrypted_credential_to_list",credential)}catch(e){NotificationService.showNotification($translate.instant("error.decrypt"),5e3),console.log(e)}},$scope.cancelRevision=function(){$location.path("/vault/"+$routeParams.vault_id),$scope.storedCredential=null,SettingsService.setSetting("revision_credential",null)}}])}(),function(){angular.module("passmanApp").controller("SettingsCtrl",["$scope","$rootScope","SettingsService","VaultService","CredentialService","$location","$routeParams","$http","EncryptService","NotificationService","$sce","$translate",function($scope,$rootScope,SettingsService,VaultService,CredentialService,$location,$routeParams,$http,EncryptService,NotificationService,$sce,$translate){if($scope.vault_settings={},$scope.new_vault_name="",$scope.showGenericImport=!1,$scope.active_vault=VaultService.getActiveVault(),SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=SettingsService.getSetting("defaultVaultPass"),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else if(!$scope.active_vault)return void $location.path("/");VaultService.getVault($scope.active_vault).then(function(vault){vault.vaultKey=VaultService.getActiveVault().vaultKey,delete vault.credentials,VaultService.setActiveVault(vault),$scope.vault_settings=vault.vault_settings,$scope.vault_settings.hasOwnProperty("pwSettings")||($scope.vault_settings.pwSettings={length:12,useUppercase:!0,useLowercase:!0,useDigits:!0,useSpecialChars:!0,minimumDigitCount:3,avoidAmbiguousCharacters:!1,requireEveryCharType:!0,generateOnCreate:!0})});var key_strengths=["password.poor","password.poor","password.weak","password.good","password.strong"];$scope.minimal_value_key_strength=SettingsService.getSetting("vault_key_strength"),$translate(key_strengths[SettingsService.getSetting("vault_key_strength")]).then(function(translation){$scope.required_score={strength:translation}});var btn_txt=$translate.instant("bookmarklet.text"),http=location.protocol,slashes=http.concat("//"),host=slashes.concat(window.location.hostname),complete=host+location.pathname;$scope.bookmarklet=$sce.trustAsHtml('<a class="button" href="javascript:(function(){var a=window,b=document,c=encodeURIComponent,e=c(document.title),d=a.open(\''+complete+"bookmarklet?url='+c(b.location)+'&title='+e,'bkmk_popup','left='+((a.screenX||a.screenLeft)+10)+',top='+((a.screenY||a.screenTop)+10)+',height=750px,width=475px,resizable=0,alwaysRaised=1');a.setTimeout(function(){d.focus()},300);})();\">"+btn_txt+"</a>"),$scope.saveVaultSettings=function(){var _vault=$scope.active_vault;_vault.name=$scope.new_vault_name,_vault.vault_settings=angular.copy($scope.vault_settings),VaultService.updateVault(_vault).then(function(){$scope.active_vault.name=angular.copy(_vault.name),NotificationService.showNotification($translate.instant("settings.saved"),5e3)})},$scope.tabs=[{title:$translate.instant("settings.general"),url:"views/partials/forms/settings/general_settings.html"},{title:$translate.instant("settings.audit"),url:"views/partials/forms/settings/tool.html"},{title:$translate.instant("settings.password"),url:"views/partials/forms/settings/password_settings.html"},{title:$translate.instant("settings.import"),url:"views/partials/forms/settings/import.html"},{title:$translate.instant("settings.export"),url:"views/partials/forms/settings/export.html"},{title:$translate.instant("settings.sharing"),url:"views/partials/forms/settings/sharing.html"}],$scope.currentTab=$scope.tabs[0],$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url};var getPassmanVersion=function(){var url=OC.generateUrl("apps/passman/api/internal/version");$http.get(url).then(function(result){$scope.passman_version=result.data.version})};getPassmanVersion(),$scope.$watch(function(){return VaultService.getActiveVault()},function(vault){vault&&($scope.active_vault=vault)}),$rootScope.$on("logout",function(){$scope.selectedVault=!1});var getCurrentVaultCredentials=function(callback){VaultService.getVault($scope.active_vault).then(callback)};$scope.startScan=function(minStrength){getCurrentVaultCredentials(function(vault){for(var results=[],i=0;i<vault.credentials.length;i++){var c=angular.copy(vault.credentials[i]);if(c.password&&0===c.hidden)try{if(c=CredentialService.decryptCredential(c),c.password){var zxcvbn_result=zxcvbn(c.password);zxcvbn_result.score<=minStrength&&results.push({guid:c.guid,label:c.label,password:c.password,password_zxcvbn_result:zxcvbn_result})}}catch(e){console.warn(e)}}$scope.scan_result=results})},$scope.cur_state={},$scope.$on("$locationChangeStart",function(event){$scope.change_pw&&$scope.change_pw.total>0&&$scope.change_pw.done<$scope.change_pw.total&&(confirm($translate.instant("changepw.navigate.away.warning"))||event.preventDefault())}),$scope.changeVaultPassword=function(oldVaultPass,newVaultPass,newVaultPass2){return $scope.error="",oldVaultPass!==VaultService.getActiveVault().vaultKey?void($scope.error=$translate.instant("incorrect.password")):newVaultPass!==newVaultPass2?void($scope.error=$translate.instant("password.no.match")):(SettingsService.setSetting("defaultVault",null),SettingsService.setSetting("defaultVaultPass",null),void VaultService.getVault($scope.active_vault).then(function(vault){jQuery("input").attr("disabled",!0),jQuery("button").attr("disabled",!0);var _selected_credentials=angular.copy(vault.credentials);$scope.change_pw={percent:0,done:0,total:_selected_credentials.length};var changeCredential=function(index,oldVaultPass,newVaultPass){var usedKey=oldVaultPass;_selected_credentials[index].hasOwnProperty("shared_key")&&_selected_credentials[index].shared_key&&(usedKey=EncryptService.decryptString(angular.copy(_selected_credentials[index].shared_key),oldVaultPass)),CredentialService.reencryptCredential(_selected_credentials[index].guid,usedKey,newVaultPass).progress(function(data){$scope.cur_state=data}).then(function(){var percent=index/_selected_credentials.length*100;$scope.change_pw={percent:percent,done:index+1,total:_selected_credentials.length},index<_selected_credentials.length-1?changeCredential(index+1,oldVaultPass,newVaultPass):(vault.private_sharing_key=EncryptService.decryptString(angular.copy(vault.private_sharing_key),oldVaultPass),vault.private_sharing_key=EncryptService.encryptString(vault.private_sharing_key,newVaultPass),VaultService.updateSharingKeys(vault).then(function(){$rootScope.$broadcast("logout"),NotificationService.showNotification($translate.instant("login.new.pass"),5e3)}))})};changeCredential(0,VaultService.getActiveVault().vaultKey,newVaultPass)}))},$scope.confirm_vault_delete=!1,$scope.delete_vault_password="",$scope.delete_vault=function(){$scope.confirm_vault_delete&&$scope.delete_vault_password===VaultService.getActiveVault().vaultKey&&getCurrentVaultCredentials(function(vault){var credentials=vault.credentials;$scope.remove_pw={percent:0,done:0,total:vault.credentials.length};var deleteCredential=function(index){$scope.translationData={password:credentials[index].label},CredentialService.destroyCredential(credentials[index].guid).then(function(){var percent=index/vault.credentials.length*100;return $scope.remove_pw={percent:percent,done:index,total:vault.credentials.length},index===credentials.length-1?void VaultService.deleteVault(vault).then(function(){SettingsService.setSetting("defaultVaultPass",!1),SettingsService.setSetting("defaultVault",null),$rootScope.$broadcast("logout"),$location.path("/")}):void deleteCredential(index+1)})};deleteCredential(0)})},$rootScope.$on("logout",function(){$scope.active_vault=null,VaultService.setActiveVault(null),$location.path("/")}),$scope.cancel=function(){$location.path("/vault/"+$routeParams.vault_id);
+}}])}(),function(){angular.module("passmanApp").controller("ShareCtrl",["$scope","VaultService","CredentialService","SettingsService","$location","$routeParams","ShareService","NotificationService","SharingACL","EncryptService","$translate","$rootScope",function($scope,VaultService,CredentialService,SettingsService,$location,$routeParams,ShareService,NotificationService,SharingACL,EncryptService,$translate,$rootScope){$scope.active_vault=VaultService.getActiveVault(),$scope.tabs=[{title:$translate.instant("share.u.g"),url:"views/partials/forms/share_credential/basics.html"},{title:$translate.instant("share.link"),url:"views/partials/forms/share_credential/link_sharing.html",color:"green"}],$scope.currentTab=$scope.tabs[0];var settingsLoaded=function(){var settings=SettingsService.getSettings();0!==settings.user_sharing_enabled&&"0"!==settings.user_sharing_enabled||$scope.tabs.splice(0,1),0!==settings.link_sharing_enabled&&"0"!==settings.link_sharing_enabled||$scope.tabs.splice(1,1),$scope.tabs.length>0&&($scope.currentTab=$scope.tabs[0])};if(SettingsService.getSetting("settings_loaded")?settingsLoaded():$rootScope.$on("settings_loaded",function(){settingsLoaded()}),$scope.onClickTab=function(tab){$scope.currentTab=tab},$scope.isActiveTab=function(tab){return tab.url===$scope.currentTab.url},SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){if(SettingsService.getSetting("defaultVault")&&SettingsService.getSetting("defaultVaultPass")){var _vault=angular.copy(SettingsService.getSetting("defaultVault"));_vault.vaultKey=angular.copy(SettingsService.getSetting("defaultVaultPass")),VaultService.setActiveVault(_vault),$scope.active_vault=_vault}}else $scope.active_vault||$location.path("/");var storedCredential=SettingsService.getSetting("share_credential");storedCredential?$scope.storedCredential=CredentialService.decryptCredential(angular.copy(storedCredential)):$location.path("/vault/"+$routeParams.vault_id),$scope.active_vault&&($scope.$parent.selectedVault=!0),$scope.cancel=function(){SettingsService.setSetting("share_credential",null),$location.path("/vault/"+$routeParams.vault_id)},$scope.default_permissions=new SharingACL(0),$scope.default_permissions.addPermission($scope.default_permissions.permissions.READ|$scope.default_permissions.permissions.WRITE|$scope.default_permissions.permissions.FILES);var link_acl=angular.copy($scope.default_permissions);link_acl.removePermission($scope.default_permissions.permissions.WRITE);var oneMonthLater=new Date;oneMonthLater.setMonth(oneMonthLater.getMonth()+1),$scope.share_settings={linkSharing:{enabled:!1,settings:{expire_time:oneMonthLater,expire_views:5,acl:link_acl}},credentialSharedWithUserAndGroup:[],cypher_progress:{done:0,total:0},upload_progress:{done:0,total:0}};var getAcl=function(){ShareService.getSharedCredentialACL($scope.storedCredential).then(function(aclList){for(var _list=[],enc_key=!!$scope.storedCredential.shared_key&&EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key)),i=0;i<aclList.length;i++){var acl=aclList[i];if(null===acl.user_id){if($scope.share_settings.linkSharing={enabled:!0,settings:{expire_time:new Date(1e3*acl.expire),expire_views:acl.expire_views,acl:new SharingACL(acl.permissions)}},enc_key){var hash=window.btoa($scope.storedCredential.guid+"<::>"+enc_key);$scope.share_link=getShareLink(hash)}}else{var obj={userId:acl.user_id,displayName:acl.user_id,type:"user",acl:new SharingACL(acl.permissions),acl_id:acl.acl_id,pending:acl.pending,credential_guid:acl.item_guid,created:acl.created};_list.push(obj)}}$scope.share_settings.credentialSharedWithUserAndGroup=_list})};getAcl();new SharingACL(0);$scope.$watch("share_settings.upload_progress.done",function(){$scope.share_settings.upload_progress.done===$scope.share_settings.upload_progress.total&&$scope.share_settings.upload_progress.total>0&&getAcl()}),$scope.inputSharedWith=[],$scope.searchUsers=function($query){return ShareService.search($query)},$scope.hasPermission=function(acl,permission){return acl.hasPermission(permission)},$scope.setPermission=function(acl,permission){acl.togglePermission(permission)},$scope.shareWith=function(shareWith){if($scope.inputSharedWith=[],shareWith.length>0)for(var i=0;i<shareWith.length;i++){for(var obj={userId:shareWith[i].uid,displayName:shareWith[i].text,type:shareWith[i].type,acl:angular.copy($scope.default_permissions),pending:!0,credential_guid:$scope.storedCredential.guid},found=!1,z=0;z<$scope.share_settings.credentialSharedWithUserAndGroup.length;z++)shareWith[z]&&$scope.share_settings.credentialSharedWithUserAndGroup[z].userId===shareWith[z].uid&&(found=!0);found===!1&&$scope.share_settings.credentialSharedWithUserAndGroup.push(obj)}},$scope.unshareUser=function(user){ShareService.unshareCredentialFromUser($scope.storedCredential,user.userId).then(function(result){if(result.result===!0){var idx=$scope.share_settings.credentialSharedWithUserAndGroup.indexOf(user);$scope.share_settings.credentialSharedWithUserAndGroup.splice(idx,1)}})},$scope.unshareCredential=function(credential){var _credential=angular.copy(credential),old_key=EncryptService.decryptString(angular.copy(_credential.shared_key)),new_key=VaultService.getActiveVault().vaultKey;_credential.shared_key=null,_credential.unshare_action=!0,_credential.skip_revision=!0,CredentialService.reencryptCredential(_credential.guid,old_key,new_key,!0).then(function(data){getAcl();var c=data.cryptogram;c.shared_key=null,c.unshare_action=!0,c.skip_revision=!0,ShareService.unshareCredential(c),CredentialService.updateCredential(c,!0).then(function(){NotificationService.showNotification($translate.instant("credential.unshared"),4e3),$scope.sharing_complete=!0,$scope.storedCredential.shared_key=null,$scope.share_settings.credentialSharedWithUserAndGroup=[]})})},$scope.applyShareToUser=function(user,enc_key){ShareService.getVaultsByUser(user.userId).then(function(data){$scope.share_settings.cypher_progress.total+=data.length,user.vaults=data;var start=(new Date).getTime()/1e3;ShareService.cypherRSAStringWithPublicKeyBulkAsync(user.vaults,enc_key).progress(function(){$scope.share_settings.cypher_progress.done++,$scope.share_settings.cypher_progress.percent=$scope.share_settings.cypher_progress.done/$scope.share_settings.cypher_progress.total*100,$scope.$digest()}).then(function(result){$scope.share_settings.cypher_progress.times.push({time:(new Date).getTime()/1e3-start,user:data[0].user_id}),user.vaults=result,user.hasOwnProperty("acl_id")||$scope.uploadChanges(user),$scope.$digest()})})},$scope.$on("$locationChangeStart",function(event){$scope.sharing_complete||confirm($translate.instant("share.navigate.away.warning"))||event.preventDefault()});var getShareLink=function(hash){var port,defaultPort="http"===$location.$$protocol?80:443;return port=defaultPort!==$location.$$port?":"+$location.$$port:"",$location.$$protocol+"://"+$location.$$host+port+OC.generateUrl("apps/passman/share/public#")+hash};$scope.sharing_complete=!0,$scope.applyShare=function(){if($scope.sharing_complete=!1,$scope.share_settings.cypher_progress.percent=0,$scope.share_settings.cypher_progress.done=0,$scope.share_settings.cypher_progress.total=0,$scope.share_settings.cypher_progress.times=[],$scope.share_settings.cypher_progress.times_total=[],$scope.share_settings.upload_progress.done=0,$scope.share_settings.upload_progress.total=0,$scope.storedCredential.shared_key&&""!==$scope.storedCredential.shared_key&&null!==$scope.storedCredential.shared_key){var enc_key=EncryptService.decryptString(angular.copy($scope.storedCredential.shared_key));if($scope.share_settings.linkSharing.enabled){var expire_time=new Date(angular.copy($scope.share_settings.linkSharing.settings.expire_time)).getTime()/1e3,shareObj={item_id:$scope.storedCredential.credential_id,item_guid:$scope.storedCredential.guid,permissions:$scope.share_settings.linkSharing.settings.acl.getAccessLevel(),expire_timestamp:expire_time,expire_views:$scope.share_settings.linkSharing.settings.expire_views};ShareService.createPublicSharedCredential(shareObj).then(function(){var hash=window.btoa($scope.storedCredential.guid+"<::>"+enc_key);$scope.share_link=getShareLink(hash)})}for(var list=$scope.share_settings.credentialSharedWithUserAndGroup,i=0;i<list.length;i++){var iterator=i,target_user=list[i];if(target_user.hasOwnProperty("created")){var acl={user_id:target_user.userId,permission:target_user.acl.getAccessLevel()};ShareService.updateCredentialAcl($scope.storedCredential,acl)}else $scope.applyShareToUser(list[iterator],enc_key)}NotificationService.showNotification($translate.instant("saved"),4e3),$scope.sharing_complete=!0}else ShareService.generateSharedKey(20).then(function(key){var encryptedSharedCredential=angular.copy($scope.storedCredential),old_key=VaultService.getActiveVault().vaultKey;CredentialService.reencryptCredential(encryptedSharedCredential.guid,old_key,key).progress(function(){}).then(function(data){var _credential=data.cryptogram;_credential.set_share_key=!0,_credential.skip_revision=!0,_credential.shared_key=EncryptService.encryptString(key),CredentialService.updateCredential(_credential,!0).then(function(){$scope.storedCredential.shared_key=_credential.shared_key,NotificationService.showNotification($translate.instant("credential.shared"),4e3),$scope.sharing_complete=!0})});for(var list=$scope.share_settings.credentialSharedWithUserAndGroup,i=0;i<list.length;i++)"user"===list[i].type&&$scope.applyShareToUser(list[i],key);if($scope.share_settings.linkSharing.enabled){var expire_time=new Date(angular.copy($scope.share_settings.linkSharing.settings.expire_time)).getTime()/1e3,shareObj={item_id:$scope.storedCredential.credential_id,item_guid:$scope.storedCredential.guid,permissions:$scope.share_settings.linkSharing.settings.acl.getAccessLevel(),expire_timestamp:expire_time,expire_views:$scope.share_settings.linkSharing.settings.expire_views};ShareService.createPublicSharedCredential(shareObj).then(function(){var hash=window.btoa($scope.storedCredential.guid+"<::>"+key);$scope.share_link=getShareLink(hash)})}})},$scope.uploadChanges=function(user){$scope.share_settings.upload_progress.total++,user.accessLevel=angular.copy(user.acl.getAccessLevel()),ShareService.shareWithUser(storedCredential,user).then(function(){$scope.share_settings.upload_progress.done++,$scope.share_settings.upload_progress.percent=$scope.share_settings.upload_progress.done/$scope.share_settings.upload_progress.total*100})},$scope.calculate_total_time=function(){$scope.share_settings.cypher_progress.times=$scope.share_settings.cypher_progress.times||[];for(var total=0,i=0;i<$scope.share_settings.cypher_progress.times.length;i++)total+=$scope.share_settings.cypher_progress.times[i].time;return total}}])}(),function(){angular.module("passmanApp").controller("SharingSettingsCtrl",["$scope","VaultService","CredentialService","SettingsService","$location","$routeParams","ShareService","EncryptService",function($scope,VaultService,CredentialService,SettingsService,$location,$routeParams,ShareService,EncryptService){$scope.active_vault=VaultService.getActiveVault(),$scope.sharing_keys=angular.copy(ShareService.getSharingKeys()),$scope.progress=1,$scope.generating=!1,$scope.available_sizes=[{size:1024,name:1024},{size:2048,name:2048},{size:4096,name:4096}],$scope.setKeySize=function(size){for(var i=0;i<$scope.available_sizes.length;i++)if($scope.available_sizes[i].size===size)return void($scope.key_size=$scope.available_sizes[i])},$scope.setKeySize(2048),$scope.generateKeys=function(length){$scope.progress=1,$scope.generating=!0,ShareService.generateRSAKeys(length).progress(function(progress){$scope.progress=progress>0?2:1,$scope.$digest()}).then(function(kp){$scope.generating=!1;var pem=ShareService.rsaKeyPairToPEM(kp);$scope.active_vault.private_sharing_key=EncryptService.encryptString(pem.privateKey),$scope.active_vault.public_sharing_key=pem.publicKey,VaultService.updateSharingKeys($scope.active_vault).then(function(){$scope.sharing_keys=ShareService.getSharingKeys()})})},$scope.updateSharingKeys=function(){$scope.active_vault.private_sharing_key=EncryptService.encryptString(angular.copy($scope.sharing_keys.private_sharing_key)),$scope.active_vault.public_sharing_key=angular.copy($scope.sharing_keys.public_sharing_key),VaultService.updateSharingKeys($scope.active_vault).then(function(){$scope.sharing_keys=ShareService.getSharingKeys()})}}])}(),function(){angular.module("passmanApp").controller("VaultCtrl",["$scope","VaultService","SettingsService","CredentialService","$location","ShareService","EncryptService","$translate","$rootScope","$interval",function($scope,VaultService,SettingsService,CredentialService,$location,ShareService,EncryptService,$translate,$rootScope,$interval){VaultService.getVaults().then(function(vaults){if($scope.vaults=vaults,null!=SettingsService.getSetting("defaultVault"))for(var default_vault=SettingsService.getSetting("defaultVault"),i=0;i<vaults.length;i++){var vault=vaults[i];if(vault.guid===default_vault.guid){$scope.default_vault=!0,$rootScope.override_default_vault||($scope.list_selected_vault=vault,$rootScope.override_default_vault=!1),SettingsService.setSetting("defaultVault",vault),SettingsService.getSetting("defaultVaultPass")&&$location.path("/vault/"+vault.guid),$scope.vault_tries[vault.guid]={tries:0,timeout:0};break}}});var key_strengths=["password.poor","password.poor","password.weak","password.good","password.strong"];$scope.default_vault=!1,$scope.remember_vault_password=!1,$scope.auto_logout_timer=!1,$scope.logout_timer="0",$scope.list_selected_vault=!1,$scope.minimal_value_key_strength=3;var settingsLoaded=function(){$scope.minimal_value_key_strength=SettingsService.getSetting("vault_key_strength"),$translate(key_strengths[SettingsService.getSetting("vault_key_strength")]).then(function(translation){$scope.required_score={strength:translation}})};SettingsService.getSetting("settings_loaded")?settingsLoaded():$rootScope.$on("settings_loaded",function(){settingsLoaded()}),$scope.toggleDefaultVault=function(){$scope.default_vault=!$scope.default_vault,$scope.default_vault===!0?SettingsService.setSetting("defaultVault",$scope.list_selected_vault):SettingsService.setSetting("defaultVault",null)},$scope.toggleRememberPassword=function(){$scope.remember_vault_password=!$scope.remember_vault_password,$scope.remember_vault_password&&(SettingsService.setSetting("defaultVault",$scope.list_selected_vault),$scope.default_vault=!0),$scope.remember_vault_password!==!0&&SettingsService.setSetting("defaultVault",null)},$scope.toggleAutoLogout=function(){$scope.auto_logout_timer=!$scope.auto_logout_timer},$scope.clearState=function(){$scope.list_selected_vault=!1,$scope.creating_vault=!1,$scope.error=!1},$scope.selectVault=function(vault){$scope.list_selected_vault=vault,$scope.vault_tries[vault.guid]||($scope.vault_tries[vault.guid]={tries:0,timeout:0})},$scope.sharing_keys={},$scope.newVault=function(){$scope.creating_vault=!0;var key_size=1024;ShareService.generateRSAKeys(key_size).progress(function(progress){var p=progress>0?2:1,msg=$translate.instant("generating.sharing.keys");msg=msg.replace("%step",p),$scope.creating_keys=msg,$scope.$digest()}).then(function(kp){var pem=ShareService.rsaKeyPairToPEM(kp);$scope.creating_keys=!1,$scope.sharing_keys.private_sharing_key=pem.privateKey,$scope.sharing_keys.public_sharing_key=pem.publicKey,$scope.$digest()})},$scope.requestDeletion=function(vault){$location.path("/vault/"+vault.guid+"/request-deletion")};var _loginToVault=function(vault,vault_key){var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),delete _vault.credentials;var timer=parseInt($scope.logout_timer);$scope.auto_logout_timer&&timer>0&&$rootScope.$broadcast("logout_timer_set",60*timer),VaultService.setActiveVault(_vault),$location.path("/vault/"+vault.guid)};$scope.selectLogoutTimer=function(time){$scope.auto_logout_timer=!0,$scope.logout_timer=time};var tickLockTimer=function(guid){$scope.vault_tries[guid].timeout=$scope.vault_tries[guid].timeout-1,$scope.vault_tries[guid].timeout<=0&&($interval.cancel($scope.vault_tries[guid].timer),$scope.vault_tries[guid].timeout=0)};$scope.vault_tries={},$scope.vaultDecryptionKey="",$scope.loginToVault=function(vault,vault_key){$scope.error=!1;var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault);try{EncryptService.decryptString(vault.challenge_password),$scope.remember_vault_password&&SettingsService.setSetting("defaultVaultPass",vault_key),_loginToVault(vault,vault_key)}catch(e){if($scope.error=$translate.instant("invalid.vault.key"),$scope.vault_tries[vault.guid].tries=$scope.vault_tries[vault.guid].tries+1,$scope.vault_tries[vault.guid].tries>=3){var duration=Math.pow(2,1/7)*Math.pow(15,4/7)*Math.pow(Math.pow(2,2/7)*Math.pow(15,1/7),$scope.vault_tries[vault.guid].tries);$scope.vault_tries[vault.guid].timeout=duration,$scope.vault_tries[vault.guid].hasOwnProperty("timer")&&$interval.cancel($scope.vault_tries[vault.guid].timer),$scope.vault_tries[vault.guid].timer=$interval(function(){tickLockTimer(vault.guid)},1e3)}}},$scope.createVault=function(vault_name,vault_key,vault_key2){return vault_key!==vault_key2?void($scope.error=$translate.instant("password.do.not.match")):void VaultService.createVault(vault_name).then(function(vault){$scope.vaults.push(vault);var _vault=angular.copy(vault);_vault.vaultKey=angular.copy(vault_key),VaultService.setActiveVault(_vault),SettingsService.setSetting("defaultVaultPass",null),SettingsService.setSetting("defaultVault",null);var test_credential=CredentialService.newCredential();test_credential.label="Test key for vault "+vault_name,test_credential.hidden=!0,test_credential.vault_id=vault.vault_id,test_credential.password="lorum ipsum",CredentialService.createCredential(test_credential).then(function(){_vault.public_sharing_key=angular.copy($scope.sharing_keys.public_sharing_key),_vault.private_sharing_key=EncryptService.encryptString(angular.copy($scope.sharing_keys.private_sharing_key)),VaultService.updateSharingKeys(_vault).then(function(){_loginToVault(vault,vault_key)})})})}}])}(),function(){angular.module("passmanApp").controller("RequestDeleteCtrl",["$scope","$location","$http","$routeParams","VaultService","NotificationService","$translate",function($scope,$location,$http,$routeParams,VaultService,NotificationService,$translate){$scope.reason="",VaultService.getVault({guid:$routeParams.vault_id}).then(function(vault){$scope.pending_deletion=vault.delete_request_pending}),$scope.requestDeletion=function(){var queryUrl=OC.generateUrl("apps/passman/admin/request-deletion/"+$routeParams.vault_id),params={reason:$scope.reason};$http.post(queryUrl,params).then(function(){NotificationService.showNotification($translate.instant("deletion.requested"),5e3),$location.path("#/")})},$scope.removeRequestDeletion=function(){var queryUrl=OC.generateUrl("apps/passman/admin/request-deletion/"+$routeParams.vault_id);$http.delete(queryUrl).then(function(){NotificationService.showNotification($translate.instant("deletion.removed"),5e3),$location.path("#/")})}}])}(),angular.module("templates-main",["views/credential_revisions.html","views/edit_credential.html","views/partials/credential_template.html","views/partials/forms/edit_credential/basics.html","views/partials/forms/edit_credential/custom_fields.html","views/partials/forms/edit_credential/files.html","views/partials/forms/edit_credential/otp.html","views/partials/forms/edit_credential/password.html","views/partials/forms/settings/export.html","views/partials/forms/settings/general_settings.html","views/partials/forms/settings/generic_csv_import.html","views/partials/forms/settings/import.html","views/partials/forms/settings/password_settings.html","views/partials/forms/settings/sharing.html","views/partials/forms/settings/tool.html","views/partials/forms/share_credential/basics.html","views/partials/forms/share_credential/link_sharing.html","views/partials/icon-picker.html","views/partials/password-meter.html","views/settings.html","views/share_credential.html","views/show_vault.html","views/vault_req_deletion.html","views/vaults.html"]),angular.module("views/credential_revisions.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/credential_revisions.html",'<div class="main_list" off-click-filter="\'.download-js-link, .sidebar-shown, #app-sidebar\'"><div id="passman-controls"><div class="actions creatable"><div class="breadcrumb"><div class="crumb svg ui-droppable"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg"><a ng-click="cancelRevision()">{{active_vault.name}}</a></div><div class="crumb svg last"><a ng-if="storedCredential.credential_id">{{ \'showing.revisions\' | translate}} "{{revision.credential_data.label}}"</a></div></div></div></div><table class="credential-table" ng-init="menuOpen = false;"><tr ng-repeat="revision in revisions | orderBy:\'-created\'" ng-click="selectRevision(revision)" ng-class="{\'selected\': selectedRevision.revision_id == revision.revision_id}"><td><span class="icon"><i class="fa fa-lock"></i></span> <span class="label">{{ \'revision.of\' | translate}} {{revision.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} ({{revision.credential_data.label}}) <span ng-if="revision.edited_by">{{ \'revision.edited.by\' | translate}} {{revision.edited_by}}</span></span></td></tr><tr ng-show="revisions.length == 0"><td>{{ \'no.revisions\' | translate}}</td></tr></table></div><div id="app-sidebar" class="detailsView scroll-container app_sidebar" off-click="closeSelected()" ng-show="selectedRevision"><span class="close icon-close" ng-click="closeSelected()" alt="Close"></span> <b ng-show="selectedRevision">{{ \'revision.of\' | translate}} {{selectedRevision.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</b><div class="credential-data"><div class="row" ng-show="selectedRevision.credential_data.label"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'label\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.label"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.username"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'account\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.username"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.password"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'password\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.password" secret="\'true\'"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.otp.secret"><div class="col-xs-4 col-md-3 col-lg-3">{{\'otp\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span otp-generator secret="selectedRevision.credential_data.otp.secret"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.email"><div class="col-xs-4 col-md-3 col-lg-3">{{\'email\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.email"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.url"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'url\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.url"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.description"><div class="col-xs-4 col-md-3 col-lg-3">{{\'notes\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="selectedRevision.credential_data.description_html"></span></div></div><div class="row" ng-show="selectedRevision.credential_data.files.length > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'files\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><div ng-repeat="file in selectedRevision.credential_data.files" class="link" ng-click="downloadFile(selectedRevision.credential_data, file)">{{file.filename}} ({{file.size | bytes}})</div></div></div><div class="row" ng-repeat="field in selectedRevision.credential_data.custom_fields"><div class="col-xs-4 col-md-3 col-lg-3">{{field.label}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="field.value" secret="field.secret" ng-if="field.field_type !== \'file\' || !field.field_type"></span> <span ng-if="field.field_type === \'file\'" class="link" ng-click="downloadFile(selectedCredential, field.value)">{{field.value.filename}} ({{field.value.size | bytes}})</span></div></div><div class="row" ng-show="selectedRevision.credential_data.expire_time > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'expire.time\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedRevision.credential_data.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="selectedRevision.credential_data.changed"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'changed\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedRevision.credential_data.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="selectedRevision.credential_data.created"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'created\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{selectedRevision.credential_data.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row"><div class="col-xs-12"><div class="tags"><span class="tag" ng-repeat="tag in selectedRevision.credential_data.tags">{{tag.text}}</span></div></div></div></div><div ng-show="selectedRevision"><button class="button" ng-click="restoreRevision(selectedRevision)"><span class="fa fa-edit"></span> {{ \'restore.revision\' | translate}}</button> <button class="button" ng-click="deleteRevision(selectedRevision)"><span class="fa fa-trash"></span> {{ \'delete.revision\' | translate}}</button></div></div>')}]),angular.module("views/edit_credential.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/edit_credential.html",'<div id="passman-controls"><div class="breadcrumb"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg" data-dir="/Test"><a ng-click="cancel()">{{active_vault.name}}</a></div><div class="crumb svg last" data-dir="/Test"><a ng-if="storedCredential.credential_id">{{ \'edit.credential\' | translate}} "{{storedCredential.label}}"</a> <a ng-if="!storedCredential.credential_id">{{ \'create.credential\' | translate}}</a></div></div></div></div><div><ul class="tab_header"><li ng-repeat="tab in tabs track by $index" class="tab" ng-class="isActiveTab(tab)? \'active\' : \'inactive\'" ng-click="onClickTab(tab)" use-theme color="\'true\'">{{tab.title}}<div class="indicator" use-theme negative="\'true\'"></div></li></ul><div class="tab_container edit_credential" use-theme type="\'border-top-color\'"><div ng-include="currentTab.url"></div><button ng-click="saveCredential()" ng-disabled="saving"><i class="fa fa-spinner fa-spin" ng-show="saving"></i> {{ \'save\' | translate}}</button> <button ng-click="cancel()">{{ \'cancel\' | translate}}</button></div></div>')}]),angular.module("views/partials/credential_template.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/credential_template.html",'<div class="credential-data"><div class="row" ng-show="credential.label && showLabel"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'label\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.label"></span></div></div><div class="compromised-details" ng-show="credential.compromised"><div class="icon-error-color icon"></div><div class="text">{{ \'compromised.warning\' | translate }}</div></div><div class="row" ng-show="credential.username"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'account\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.username"></span></div></div><div class="row" ng-show="credential.password"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'password\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.password" secret="\'true\'"></span></div></div><div class="row" ng-show="credential.otp.secret"><div class="col-xs-4 col-md-3 col-lg-3">{{\'otp\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span otp-generator secret="credential.otp.secret"></span></div></div><div class="row" ng-show="credential.email"><div class="col-xs-4 col-md-3 col-lg-3">{{\'email\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.email"></span></div></div><div class="row" ng-show="credential.url"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'url\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.url" url="true"></span></div></div><div class="row" ng-show="credential.description"><div class="col-xs-4 col-md-3 col-lg-3">{{\'notes\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="credential.description_html"></span></div></div><div class="row" ng-show="credential.files.length > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'files\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9"><div ng-repeat="file in credential.files"><a class="link" ng-click="downloadFile(credential, file)">{{file.filename}} ({{file.size | bytes}})</a><br></div></div></div><div class="row" ng-repeat="field in credential.custom_fields"><div class="col-xs-4 col-md-3 col-lg-3">{{field.label}}</div><div class="col-xs-8 col-md-9 col-lg-9"><span credential-field value="field.value" secret="field.secret" ng-if="field.field_type !== \'file\' || !field.field_type"></span> <span ng-if="field.field_type === \'file\'" class="link" ng-click="downloadFile(credential, field.value)">{{field.value.filename}} ({{field.value.size | bytes}})</span></div></div><div class="row" ng-show="credential.expire_time > 0"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'expire.time\' | translate }}</div><div class="col-xs-8 col-md-9 col-lg-9">{{credential.expire_time * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="credential.changed"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'changed\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{credential.changed * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row" ng-show="credential.created"><div class="col-xs-4 col-md-3 col-lg-3">{{ \'created\' | translate}}</div><div class="col-xs-8 col-md-9 col-lg-9">{{credential.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</div></div><div class="row"><div class="col-xs-12"><div class="tags"><span class="tag" ng-repeat="tag in credential.tags track by $index">{{tag.text}}</span></div></div></div></div>')}]),angular.module("views/partials/forms/edit_credential/basics.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/basics.html",'<div class="row"><div class="col-xs-12 col-md-6"><label>{{ \'label\' | translate}}</label><div class="icon-label"><div class="icon-picker" icon-picker="storedCredential"></div><input type="text" class="form-control" ng-model="storedCredential.label"></div><label>{{ \'username\' | translate}}</label><div><input type="text" ng-model="storedCredential.username"></div><label>{{ \'email\' | translate}}</label><div><input type="text" ng-model="storedCredential.email"></div><label>{{ \'password\' | translate}}</label><div><password-gen ng-model="storedCredential.password" settings="pwSettings" callback="pwGenerated"></password-gen><ng-password-meter password="storedCredential.password"></ng-password-meter></div><div><label>{{ \'password.r\' | translate}}</label><input type="password" ng-model="storedCredential.password_repeat"></div><label>{{ \'url\' | translate}}</label><div><input type="text" ng-model="storedCredential.url"></div></div><div class="col-xs-12 col-md-6"><label>{{ \'notes\' | translate}}</label><div><textarea class="credential_textarea" ng-model="storedCredential.description"></textarea></div><label>{{ \'add.tag\' | translate}}</label><div class="tags_input"><tags-input ng-model="storedCredential.tags" replace-spaces-with-dashes="false"><auto-complete source="getTags($query)" min-length="0"></auto-complete></tags-input></div></div><div class="col-xs-12 col-md-6"><button class="compromised-button" ng-click="compromise()">{{ \'compromised.label\' | translate}}</button><div class="compromised-details" ng-show="storedCredential.compromised"><div class="icon-error-color icon"></div><div class="text">{{ \'compromised.warning\' | translate }}</div></div></div></div>');
}]),angular.module("views/partials/forms/edit_credential/custom_fields.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/custom_fields.html",'<div class="row"><div class="col-xs-12 col-md-4"><label>{{ \'field.label\' | translate}}</label><input type="text" ng-model="new_custom_field.label"></div><div class="col-xs-10 col-md-6 field-value"><div class="row"><div class="col-xs-12"><label>{{ \'field.value\' | translate}}</label></div></div><div class="row"><div class="col-xs-8 valueInput"><input type="text" ng-model="new_custom_field.value" ng-show="new_custom_field.field_type === \'text\'"><password-gen ng-model="new_custom_field.value" ng-show="new_custom_field.field_type ===\'password\'" settings="{generateOnCreate: false }"></password-gen><span ng-show="new_custom_field.field_type ===\'file\'"><input id="custom_field_file" class="inputfile" type="file" file-select success="addFileToCustomField" error="fileLoadError" progress="fileSelectProgress"><label for="custom_field_file"><i class="fa fa-upload" aria-hidden="true"></i> {{ new_custom_field.value.filename || \'select.file\' | translate}}</label></span></div><div class="col-xs-4 selectType"><select class="form-control" ng-model="new_custom_field.field_type"><option value="text">{{ \'text\' | translate}}</option><option value="password">{{ \'password\' | translate}}</option><option value="file">{{ \'file\' | translate}}</option></select></div></div><div class="row"><div class="col-xs-12"><ng-password-meter ng-if="new_custom_field.field_type ===\'password\'" password="new_custom_field.value"></ng-password-meter></div></div></div><div class="col-xs-2 col-md-2"><label class="invisible">{{\'add\' | translate}}</label><button ng-click="addCustomField()">+</button></div></div><div class="row custom_fields" ng-if="storedCredential.custom_fields.length > 0"><div class="col-xs-12 table"><table><thead><tr use-theme><td class="dragger"></td><th class="field_label">{{ \'label\' | translate}}</th><th class="field_value">{{ \'value\' | translate}}</th><th class="field_secret">{{ \'type\' | translate}}</th><th class="field_actions">{{ \'actions\' | translate}}</th></tr></thead><tbody ui-sortable ng-model="storedCredential.custom_fields"><tr ng-repeat="field in storedCredential.custom_fields"><td class="dragger"><i class="fa fa-arrows-v"></i></td><td><a href="#" editable-text="field.label">{{ field.label || "empty" }}</a></td><td><span ng-if="field.field_type === \'text\'"><a href="#" editable-text="field.value">{{ field.value || \'empty\' | translate }}</a></span> <span ng-if="field.field_type === \'password\'"><a href="#" editable-password="field.value"><span ng-repeat="n in [] | range:field.value.length">*</span></a></span> <span ng-if="field.field_type === \'file\'">{{field.value.filename}} ({{field.value.size | bytes}})</span></td><td>{{ field.field_type }}</td><td class="field_actions"><i class="fa fa-trash" ng-click="deleteCustomField(field)"></i></td></tr></tbody></table></div></div>')}]),angular.module("views/partials/forms/edit_credential/files.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/files.html",'<div class="row file_tab"><div class="col-xs-12 col-md-6"><input class="inputfile" id="file" type="file" file-select success="fileLoaded" error="fileLoadError" progress="fileSelectProgress"><label for="file"><i class="fa fa-upload" aria-hidden="true"></i> {{\'select.file\' | translate}}</label><span ng-if="fileprogress.file_percent > 0"><div progress-bar="fileprogress.file_percent"></div></span></div></div><div class="row files" ng-if="storedCredential.files.length > 0"><div class="col-xs-12 table"><table><thead use-theme><tr><th class="field_label">{{ \'file.name\' | translate }}</th><th class="field_value">{{ \'upload.date\' | translate}}</th><th class="field_secret">{{ \'size\' | translate}}</th><th class="field_actions">{{ \'actions\' | translate}}</th></tr></thead><tr ng-repeat="file in storedCredential.files"><td><a href="#" editable-text="file.filename">{{ file.filename || "empty" }}</a></td><td>{{file.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td><td>{{file.size | bytes}}</td><td class="field_actions"><i class="fa fa-trash" ng-click="deleteFile(file)"></i></td></tr></table></div></div>')}]),angular.module("views/partials/forms/edit_credential/otp.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/otp.html",'<div class="row"><div class="col-xs-12"><div class="col-xs-4 nopadding"><span class="otpText">{{ \'upload.qr\' | translate}}</span><select ng-model="otpType"><option value="qrcode">Upload QR code</option><option value="secret">Enter secret</option></select></div><div class="col-xs-6 nopadding"><input type="file" qrread on-read="parseQR(qrdata)" class="input_secret" on-read="parseQR(qrdata)" ng-show="otpType === \'qrcode\'"> <input type="text" ng-model="storedCredential.otp.secret" ng-show="otpType === \'secret\'"></div></div></div><div class="row"><div class="col-xs-12" ng-if="storedCredential.otp"><b>{{ \'current.qr\' | translate}}</b></div></div><div class="row"><div class="col-xs-5 col-sm-4 col-md-2" ng-if="storedCredential.otp.qr_uri"><img ng-src="{{storedCredential.otp.qr_uri.image}}"></div><div class="col-sm-4 col-sm-5 col-md-5"><table ng-show="storedCredential.otp"><tr ng-show="storedCredential.otp.type"><td>{{ \'type\' | translate}}:</td><td>{{storedCredential.otp.type}}</td></tr><tr ng-show="storedCredential.otp.label"><td>{{ \'label\' | translate}}:</td><td>{{storedCredential.otp.label}}</td></tr><tr ng-show="storedCredential.otp.issuer"><td>{{ \'issuer\' | translate}}:</td><td>{{storedCredential.otp.issuer}}</td></tr><tr ng-show="storedCredential.otp.secret"><td>{{ \'secret\' | translate}}:</td><td>{{storedCredential.otp.secret}}</td></tr><tr ng-show="storedCredential.otp.secret"><td>{{ \'otp\' | translate}}:</td><td><span otp-generator secret="storedCredential.otp.secret"></span></td></tr></table></div></div>')}]),angular.module("views/partials/forms/edit_credential/password.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/edit_credential/password.html",'<div class="row"><div class="col-xs-12 col-md-5 col-lg-5"><label>{{ \'password\' | translate}}</label><div><password-gen ng-model="storedCredential.password" settings="pwSettings" callback="pwGenerated"></password-gen><ng-password-meter password="storedCredential.password"></ng-password-meter></div><label>{{ \'password.r\' | translate}}</label><div><input type="password" ng-model="storedCredential.password_repeat"></div><label>{{ \'expire.date\' | translate}}</label><div><span datetime-picker ng-model="storedCredential.expire_time" class="link" future-only ng-show="storedCredential.expire_time == 0" close-on-select="false">{{\'no.expire.date\' | translate}}</span> <span datetime-picker ng-model="storedCredential.expire_time" class="link" future-only ng-show="storedCredential.expire_time != 0" close-on-select="false">{{ storedCredential.expire_time | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span></div><label>{{ \'renew.interval\' | translate}}</label><div><input type="number" ng-model="renewIntervalValue" min="0" ng-change="updateInterval(renewIntervalValue, renewIntervalModifier)"><select ng-model="renewIntervalModifier" ng-change="updateInterval(renewIntervalValue, renewIntervalModifier)"><option value="0">{{ \'disabled\' | translate}}</option><option value="86400">{{ \'days\' | translate }}</option><option value="604800">{{ \'weeks\' | translate}}</option><option value="2592000">{{ \'months\' | translate}}</option><option value="31622400">{{ \'years\' | translate}}</option></select></div></div><div class="col-xs-12 col-md-7 col-lg-7"><b>{{ \'generation.settings\' | translate}}</b><div class="row"><div class="password_settings"><div class="col-xs-12 col-sm-5 col-lg-4"><label><span class="label">{{ \'password.generation.length\' | translate}}</span><br><input type="number" ng-model="pwSettings.length" min="1"></label><label><span class="label">{{\'password.generation.min_digits\' | translate}}</span><br><input type="number" ng-model="pwSettings.minimumDigitCount" min="0"></label></div><div class="col-xs-12 col-sm-6 col-lg-6"><label><input type="checkbox" ng-model="pwSettings.useUppercase"> <span class="label sm">{{ \'password.generation.uppercase\' | translate}}</span></label><label><input ng-model="pwSettings.useLowercase" type="checkbox" id="lower"> <span class="label sm">{{ \'password.generation.lowercase\' | translate}}</span></label><label><input ng-model="pwSettings.useDigits" type="checkbox" id="digits"> <span class="label sm">{{ \'password.generation.digits\' | translate}}</span></label><label><input type="checkbox" id="special" ng-model="pwSettings.useSpecialChars"> <span class="label sm">{{ \'password.generation.special\' | translate}}</span></label><label><input type="checkbox" id="ambig" ng-model="pwSettings.avoidAmbiguousCharacters"> <span class="label sm">{{ \'password.generation.ambiguous\' | translate}}</span></label><label><input type="checkbox" ng-model="pwSettings.requireEveryCharType" id="reqevery"> <span class="label sm">{{ \'password.generation.require_same\' | translate}}</span></label></div></div></div></div></div>')}]),angular.module("views/partials/forms/settings/export.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/export.html",'<div ng-controller="ExportCtrl"><div class="row"><div class="col-xs-6"><label>{{ \'export.type\' | translate}}<select ng-init="raw" ng-model="raw" ng-change="setExporter(raw)"><option ng-repeat="exporter in available_exporters" value="{{exporter}}">{{exporter.name}}</option></select></label><div><b>{{selectedExporter.description}}</b></div><div ng-show="selectedExporter" class="nopadding"><label>{{ \'export.confirm.text\' | translate }}</label><input type="password" ng-model="confirm_key"><br><div class="alert alert-warning" ng-show="error">{{error}}</div></div><div class="clearfix"><button class="button" ng-click="startExport()" ng-if="selectedExporter">{{ \'export\' | translate}}</button></div></div><div class="col-xs-6"><div ng-if="log" class="import_log"><textarea id="import_log" auto-scroll="log">{{log.join(\'\\n\')}}</textarea></div></div></div></div>')}]),angular.module("views/partials/forms/settings/general_settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/general_settings.html",'<div class="row"><div class="col-xs-12 col-md-6"><h3>{{ \'rename.vault\' | translate}}</h3><label>{{ \'rename.vault.name\' | translate}}</label><input type="text" ng-model="$parent.new_vault_name"> <button ng-click="saveVaultSettings()">{{ \'change\' | translate}}</button><h3>{{ \'change.vault.key\' | translate}}</h3><label>{{ \'old.vault.password\' | translate}}</label><input type="password" ng-model="oldVaultPass"><label>{{ \'new.vault.password\' | translate}}</label><input type="password" ng-model="newVaultPass"><ng-password-meter password="newVaultPass" score="vault_key_score"></ng-password-meter><label>{{ \'new.vault.pw.r\' | translate}}</label><input type="password" ng-model="newVaultPass2"><div ng-show="error || vault_key_score.score < minimal_value_key_strength" class="error"><ul><li>{{error}}</li><li ng-show="vault_key_score.score < minimal_value_key_strength">{{\'min.vault.key.strength\' | translate:required_score}}</li></ul></div><button ng-click="changeVaultPassword(oldVaultPass,newVaultPass,newVaultPass2)" ng-disabled="vault_key_score.score < minimal_value_key_strength">{{ \'change\' | translate}}</button><div ng-show="change_pw.total > 0">{{\'warning.leave\' | translate}}<br>{{ \'processing\' | translate}} {{cur_state.process}}<div progress-bar="cur_state.calculated" index="cur_state.current" total="cur_state.total"></div>{{ \'total.progress\' | translate}}<div progress-bar="change_pw.percent" index="change_pw.done" total="change_pw.total"></div></div><h3>{{\'delete.vault\' | translate}}</h3><b>{{ \'vault.remove.notice\' | translate }}</b><label>{{\'vault.password\' | translate}}</label><input type="password" ng-model="$parent.delete_vault_password"> <input type="checkbox" ng-model="$parent.confirm_vault_delete"> {{\'delete.vault.checkbox\' | translate}}<br><button class="btn btn-danger" ng-click="delete_vault()">{{\'delete.vault.confirm\' | translate}}</button><div ng-show="remove_pw">{{\'deleting.pw\' | translate:translationData}}<div progress-bar="remove_pw.percent" index="remove_pw.done" total="remove_pw.total"></div></div></div><div class="col-xs-12 col-md-6"><h3>{{ \'about.passman\' | translate}}</h3><p>{{ \'version\' | translate}}: <b>{{passman_version}}</b><br><br><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=6YS8F97PETVU2" target="_blank" class="link">{{ \'donate.support\' | translate}}</a><br></p><h3>{{ \'bookmarklet\' | translate}}</h3><div><p>{{ \'bookmarklet.info1\' | translate}}<br>{{ \'bookmarklet.info2\' | translate}}<br></p></div><div><p ng-bind-html="bookmarklet" style="margin-top: 5px"></p></div></div></div>')}]),angular.module("views/partials/forms/settings/generic_csv_import.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/generic_csv_import.html",'<div ng-controller="GenericCsvImportCtrl"><div class="row"><div class="col-xs-12 col-md-3"><div>{{ \'select.csv\' | translate}} <input type="file" file-select accept=".csv" success="csvLoaded"></div><div ng-show="parsed_csv"><span translate="parsed.csv.rows" translate-value-rows="{{ parsed_csv.length }}"></span></div><div ng-show="parsed_csv"><input type="checkbox" ng-model="skipFirstRow" ng-checked="matched"> {{ \'skip.first.row\' | translate}}</div><div ng-show="import_fields.indexOf(\'label\') === -1 && parsed_csv"><b>{{ \'import.csv.label.req\' | translate}}</b></div><div ng-show="import_fields.indexOf(\'label\') !== -1 && parsed_csv"><button class="btn btn-success" ng-disabled="importing" ng-click="startCSVImport()"><i class="fa fa-spinner fa-spin" ng-show="importing"></i> {{ (importing) ? (\'import.importing\' | translate) : (\'import.start\' | translate) }}</button></div><div><div ng-if="import_progress.progress > 0">{{ \'upload.progress\' | translate}}<div progress-bar="import_progress.progress" index="import_progress.loaded" total="import_progress.total"></div></div></div><div><div ng-if="log" class="import_log"><textarea id="import_log" auto-scroll="log">{{log.join(\'\\n\')}}</textarea></div></div></div><div class="col-xs-12 col-md-9" ng-show="parsed_csv"><b>{{ \'first.five.lines\' | translate }}</b><br>{{ \'assign.column\' | translate }}<div class="import-table-outter"><table class="import-table"><tr ng-repeat="line in parsed_csv | limitTo:5"><td class="inspect"><i class="fa fa-search" ng-click="inspectCredential(line)" ng-if="($index > 0 && matched && import_fields.length > 0) || ($index >= 0 && !matched && import_fields.length > 0)"></i></td><td ng-repeat="prop in line track by $index">{{line[$index]}}</td></tr><tr ng-repeat="line in parsed_csv | limitTo:1"><td></td><td ng-repeat="prop in line track by $index"><select ng-model="import_fields[$index]" ng-change="updateExample()" ng-options="property.prop as property.label for property in credentialProperties"></select></td></tr></table></div><div ng-show="inspected_credential && import_fields.length > 0"><b>{{ \'example.credential\' | translate}}</b><div credential-template="inspected_credential" show-label></div></div></div></div></div>')}]),angular.module("views/partials/forms/settings/import.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/import.html",'<div><div ng-click="showGenericImport = !showGenericImport;" class="link"><span ng-show="!showGenericImport">{{\'missing.importer\' | translate}}</span> <span ng-show="showGenericImport">{{\'missing.importer.back\' | translate}}</span></div></div><div ng-controller="ImportCtrl" ng-show="!showGenericImport"><div class="row"><div class="col-xs-6"><div class="import-selection"><label>{{ \'import.type\' | translate}}<select ng-init="importerType" ng-model="importerType" ng-change="setImporter(importerType)"><option ng-repeat="importer in available_importers" value="{{importer}}">{{importer.name}}</option></select></label></div><div ng-show="selectedImporter"><b>{{ \'import.steps\' | translate }}</b><ul class="import-steps"><li ng-repeat="step in selectedImporter.exportSteps">{{step}}</li></ul></div><input ng-if="selectedImporter" type="file" file-select success="fileLoaded" error="fileLoadError" progress="fileSelectProgress"><br><button class="button" ng-click="startImport()" ng-if="selectedImporter">{{ \'import\' | translate}}</button><div ng-if="file_read_progress.percent > 0">{{ \'read.progress\' | translate}}<div progress-bar="file_read_progress.percent" index="file_read_progress.loaded" total="file_read_progress.total"></div></div><div ng-if="import_progress.progress > 0">{{ \'upload.progress\' | translate}}<div progress-bar="import_progress.progress" index="import_progress.loaded" total="import_progress.total"></div></div></div><div class="col-xs-6"><div ng-if="log" class="import_log"><textarea id="import_log" auto-scroll="log">{{log.join(\'\\n\')}}</textarea></div></div></div></div><div ng-include="\'views/partials/forms/settings/generic_csv_import.html\'" ng-show="showGenericImport"></div>')}]),angular.module("views/partials/forms/settings/password_settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/password_settings.html",'<div class="password_settings"><div class="col-xs-12 col-sm-5 col-lg-4 password-settings-padding-left-fix"><label><span class="label">{{ \'password.generation.length\' | translate}}</span><br><input type="number" ng-model="vault_settings.pwSettings.length" min="1"></label><label><span class="label">{{ \'password.generation.min_digits\' | translate}}</span><br><input type="number" ng-model="vault_settings.pwSettings.minimumDigitCount" min="0"></label><label><span class="label">Generate password on creation</span><br><input type="checkbox" ng-model="vault_settings.pwSettings.generateOnCreate" min="0"></label></div><div class="col-xs-12 col-sm-6 col-lg-6"><label><input type="checkbox" ng-model="vault_settings.pwSettings.useUppercase"> <span class="label sm">{{ \'password.generation.uppercase\' | translate}}</span></label><label><input ng-model="vault_settings.pwSettings.useLowercase" type="checkbox" id="lower"> <span class="label sm">{{ \'password.generation.lowercase\' | translate}}</span></label><label><input ng-model="vault_settings.pwSettings.useDigits" type="checkbox" id="digits"> <span class="label sm">{{ \'password.generation.digits\' | translate}}</span></label><label><input type="checkbox" id="special" ng-model="vault_settings.pwSettings.useSpecialChars"> <span class="label sm">{{ \'password.generation.special\' | translate}}</span></label><label><input type="checkbox" id="ambig" ng-model="vault_settings.pwSettings.avoidAmbiguousCharacters"> <span class="label sm">{{ \'password.generation.ambiguous\' | translate}}</span></label><label><input type="checkbox" ng-model="vault_settings.pwSettings.requireEveryCharType" id="reqevery"> <span class="label sm">{{ \'password.generation.require_same\' | translate}}</span></label></div></div><div class="row"><div class="col-xs-12"><button class="button" ng-click="saveVaultSettings()">{{ \'save\' | translate}}</button></div></div>')}]),angular.module("views/partials/forms/settings/sharing.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/sharing.html",'<div ng-controller="SharingSettingsCtrl"><div class="row"><div class="col-md-6"><label>{{ \'priv.key\' | translate}}</label><textarea class="col-md-12">{{sharing_keys.private_sharing_key}}</textarea></div><div class="col-md-6"><label>{{ \'pub.key\' | translate}}</label><textarea class="col-md-12">{{sharing_keys.public_sharing_key}}</textarea></div></div><div class="row"><div class="col-md-12"><label>{{ \'key.size\' | translate}}<select ng-model="key_size" ng-options="size.name for size in available_sizes"></select><button ng-click="updateSharingKeys()"><i class="fa fa-fa-floppy-o"></i> {{ \'save.keys\' | translate}}</button> <button ng-if="!generating" ng-click="generateKeys(key_size.size)">{{ \'gen.keys\' | translate}}</button> <button ng-if="generating"><i class="fa fa-spinner fa-spin"></i> {{ \'generating.keys\' | translate}} ({{progress}}/2)</button></label></div></div></div>')}]),angular.module("views/partials/forms/settings/tool.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/settings/tool.html",'<div class="row"><div class="col-xs-12"><p>{{ \'tool.intro\' | translate}}</p></div><div class="col-xs-12" ng-init="minStrength = 3;">{{ \'min.strength\' | translate}} <input type="number" min="1" max="4" value="3" ng-model="minStrength"> <button ng-click="startScan(minStrength)">{{ \'scan.start\' | translate}}</button></div></div><div class="row" ng-show="scan_result"><div class="col-xs-12"><p class="spacer-top-30"><b>{{ \'scan.result.msg\' | translate}}</b><br><span translate="scan.result" translate-values="{ scan_result: scan_result.length}"></span><br></p><table class="table scan-result-table spacer-top-30"><thead><tr><td><b>{{ \'label\' | translate}}</b></td><td><b>{{ \'score\' | translate}}</b></td><td><b>{{ \'password\' | translate}}</b></td><td><b>{{ \'action\' | translate}}</b></td></tr></thead><tbody><tr ng-repeat="result in scan_result | orderBy:\'password_zxcvbn_result.score\'"><td class="label-audit">{{result.label}}</td><td class="score"><ng-password-meter password="result.password"></ng-password-meter></td><td><span credential-field value="result.password" secret="\'true\'"></span></td><td><div><a href="#/vault/{{ active_vault.guid }}/edit/{{result.guid}}" class="link"><i class="fa fa-edit"></i></a></div></td></tr></tbody></table></div></div>')}]),angular.module("views/partials/forms/share_credential/basics.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/share_credential/basics.html",'<div class="row"><div class="col-xs-12 col-md-6"><div><table class="table sharing_table"><thead><tr><td><tags-input ng-model="inputSharedWith" replace-spaces-with-dashes="false" add-from-autocomplete-only="true" placeholder="{{ \'search.u.g\' | translate}}"><auto-complete source="searchUsers($query)" min-length="0" template="autocomplete-template"></auto-complete></tags-input></td><td><button class="button" ng-click="shareWith(inputSharedWith)">+</button></td></tr><tr><td colspan="2"><small>{{ \'search.result.missing\' | translate}}</small></td></tr></thead></table><div ng-if="share_settings.cypher_progress.done > 0">{{\'cyphering\' | translate}}...<div progress-bar="share_settings.cypher_progress.percent" index="share_settings.cypher_progress.done" total="share_settings.cypher_progress.total"></div></div><div ng-if="share_settings.upload_progress.done > 0">{{ \'uploading\' | translate}}...<div progress-bar="share_settings.upload_progress.percent" index="share_settings.upload_progress.done" total="share_settings.upload_progress.total"></div></div></div></div><div class="col-xs-12 col-md-6" ng-show="share_settings.cypher_progress.times.length > 0"><table class="table"><thead><tr><td>{{ \'user\' | translate}}</td><td>{{ \'crypto.time\' | translate}}</td></tr></thead><tr ng-repeat="user in share_settings.cypher_progress.times"><td><i class="fa fa-cogs"></i> {{user.user}}</td><td>{{user.time}} s</td></tr></table>{{ \'crypto.total.time\' | translate}}: {{ calculate_total_time() }}</div></div><div class="row"><div class="col-xs-12 col-md-6"><table class="table shared_table" ng-show="share_settings.credentialSharedWithUserAndGroup.length > 0"><thead><tr><td>{{\'user\' | translate}}</td><td>{{ \'perm.read\' | translate}}</td><td>{{ \'perm.write\' | translate}}</td><td>{{ \'perm.files\' | translate}}</td><td>{{ \'perm.revisions\' | translate}}</td><td></td></tr></thead><tr ng-repeat="user in share_settings.credentialSharedWithUserAndGroup"><td><i class="fa fa-user" ng-if="user.pending === false"></i> <i class="fa fa-user-times" ng-if="user.pending === true"></i> {{user.userId}} <small ng-if="user.pending === true" class="pull-right pending">{{ \'pending\' | translate}}</small></td><td><input type="checkbox" ng-click="setPermission(user.acl, default_permissions.permissions.READ)" ng-checked="hasPermission(user.acl, default_permissions.permissions.READ)"></td><td><input type="checkbox" ng-click="setPermission(user.acl, default_permissions.permissions.WRITE)" ng-checked="hasPermission(user.acl, default_permissions.permissions.WRITE)"></td><td><input type="checkbox" ng-click="setPermission(user.acl, default_permissions.permissions.FILES)" ng-checked="hasPermission(user.acl, default_permissions.permissions.FILES)"></td><td><input type="checkbox" ng-click="setPermission(user.acl, default_permissions.permissions.HISTORY)" ng-checked="hasPermission(user.acl, default_permissions.permissions.HISTORY)"></td><td><i class="fa fa-trash" ng-click="unshareUser(user)"></i></td></tr></table></div></div><script type="text/ng-template" id="autocomplete-template"><i class="fa fa-user" ng-if="data.type === \'user\'"></i>\n\t<i class="fa fa-group" ng-if="data.type === \'group\'"></i>\n\t{{data.text}}</script>')}]),angular.module("views/partials/forms/share_credential/link_sharing.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/forms/share_credential/link_sharing.html",'<div class="row"><div class="col-xs-12 col-md-6"><label><input type="checkbox" ng-model="share_settings.linkSharing.enabled"> {{ \'enable.link.sharing\' | translate}}.</label><br><div class="pull-left col-xs-6 nopadding"><span credential-field value="share_link" secret="false" use-input="true" input-placeholder="\'click.share\' | translate"></span></div><div ng-show="share_settings.linkSharing.enabled" class="clearfix">{{ \'share.until.date\' | translate}} <span datetime-picker ng-model="share_settings.linkSharing.settings.expire_time" class="link" future-only close-on-select="false" timestamp="true">{{ share_settings.linkSharing.settings.expire_time | date:\'dd-MM-yyyy @ HH:mm:ss\' }}</span></div><div ng-show="share_settings.linkSharing.enabled">{{ \'expire.views\' | translate}}<br><input type="number" ng-model="share_settings.linkSharing.settings.expire_views"></div><div ng-if="share_settings.linkSharing.enabled"><table><tr><td><input type="checkbox" ng-click="setPermission(share_settings.linkSharing.settings.acl, default_permissions.permissions.FILES)" ng-checked="hasPermission(share_settings.linkSharing.settings.acl, default_permissions.permissions.FILES)"></td><td>{{ \'show.files\' | translate}}</td></tr></table></div></div></div>')}]),angular.module("views/partials/icon-picker.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/icon-picker.html",'<div class="cell icon-category-auth" ng-if="!credential.url && !credential.icon"></div><div class="cell" ng-if="credential.url || credential.icon"><span class="icon"><credential-icon credential="credential"></credential-icon></span></div><div style="display: none" id="iconPicker" title="{{ \'pick.icon\' | translate }}"><div class="iconList"><div ng-repeat="(groupName, icons) in iconGroups"><div ng-click="expanded = !expanded" ng-init="expanded=true"><div class="icon-triangle-s arrow" ng-class="{ \'icon-triangle-e\': !expanded , \'icon-triangle-s\': expanded }"></div><div class="collapsible" id="{{groupName}}">{{groupName}}</div></div><div ng-class="{ \'content_show\': expanded , \'content\': !expanded }"><div class="icon" ng-repeat="icon in icons" ng-click="selectIcon(icon)"><img ng-src="{{icon.url}}" height="32"></div></div></div></div><div class="iconModifier"><input id="iconPicker-Search" class="iconSearch" type="text" placeholder="{{ \'pick.icon.search\' | translate }}"><label for="iconPicker-CustomIcon">{{ \'pick.icon.custom.label\' | translate }}</label><input id="iconPicker-CustomIcon" class="iconSearch" type="file"><div ng-if="selectedIcon || customIcon">{{ \'selected.icon\' | translate}}:<br><img ng-src="{{selectedIcon.url}}" height="32" ng-if="!customIcon"> <img src="{{customIcon.data}}" height="32" ng-if="customIcon"><br><button ng-click="useIcon()">{{ \'use.icon\' | translate}}</button></div><div><button ng-click="deleteIcon()" ng-if="credential.icon">{{ \'use.icon.delete\' | translate}}</button> <button ng-click="refreshUrlIcon()">{{ \'use.icon.refresh\' | translate}}</button></div></div></div>')}]),angular.module("views/partials/password-meter.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/partials/password-meter.html",'<div class="pass-meter {{masterClass}}" off-click="matchBreakdown = false;"><div class="{{colClass}} pass-meter-col {{first}}"><div class="indicator"></div></div><div class="{{colClass}} pass-meter-col {{second}}"><div class="indicator"></div></div><div class="{{colClass}} pass-meter-col {{third}}"><div class="indicator"></div></div><div class="{{colClass}} pass-meter-col {{fourth}}"><div class="indicator"></div></div><div class="details" ng-click="toggleScore()"><span ng-show="!scoreShown">{{ \'details\' | translate }}</span> <span ng-show="scoreShown">{{ \'hide.details\' | translate}}</span></div><div class="pass-meter-message">{{message}}</div><div class="detail_box" ng-show="scoreShown"><div class="row"><div class="col-xs-6">{{ \'password.score\' | translate}}:</div><div class="col-xs-6">{{score.score}}</div></div><div><b>{{ \'cracking.times\' | translate}}</b></div><div class="row"><div class="col-xs-6">{{ \'cracking.time.100h\' | translate}}<br><small>{{ \'cracking.time.100h.desc\' | translate}}</small></div><div class="col-xs-6">{{score.crack_times_display.online_throttling_100_per_hour}}</div></div><div class="row"><div class="col-xs-6">{{ \'cracking.time.10s\' | translate}}<br><small>{{ \'cracking.time.10s.desc\' | translate}}</small></div><div class="col-xs-6">{{score.crack_times_display.online_no_throttling_10_per_second}}</div></div><div class="row"><div class="col-xs-6">{{ \'cracking.time.10ks\' | translate}}<br><small>{{ \'cracking.time.10ks.desc\' | translate}}</small></div><div class="col-xs-6">{{score.crack_times_display.offline_slow_hashing_1e4_per_second}}</div></div><div class="row"><div class="col-xs-6">{{ \'cracking.time.10Bs\' | translate}}<br><small>{{ \'cracking.time.10Bs.desc\' | translate}}</small></div><div class="col-xs-6">{{score.crack_times_display.offline_fast_hashing_1e10_per_second}}</div></div><div class="row"><div class="col-xs-6">{{ \'match.sequence\' | translate}}:</div><div class="col-xs-6"><span class="link" ng-click="toggleMatchBreakdown()">{{ \'match.sequence.link\' | translate}}</span></div></div></div></div><div class="match-sequence"><div class="sequence_container" ng-style="{\'width\': score.sequence.length * 210 }"><div class="sequence" ng-repeat="sequence in score.sequence"><table><tr><td colspan="2" class="token"><code>{{sequence.token}}</code></td></tr><tr ng-if="sequence.pattern"><td>{{ \'pattern\' | translate}}</td><td>{{sequence.pattern}}</td></tr><tr ng-if="sequence.matched_word"><td>{{ \'matched.word\' | translate}}</td><td>{{sequence.matched_word}}</td></tr><tr ng-if="sequence.dictionary_name"><td>{{ \'dictionary.name\' | translate}}</td><td>{{sequence.dictionary_name}}</td></tr><tr ng-if="sequence.rank"><td>{{ \'rank\' | translate}}</td><td>{{sequence.rank}}</td></tr><tr ng-if="sequence.reversed"><td>{{ \'reversed\' | translate}}</td><td>{{sequence.reversed}}</td></tr><tr ng-if="sequence.guesses"><td>{{ \'guesses\' | translate}}</td><td>{{sequence.guesses}}</td></tr><tr ng-if="sequence.base_guesses"><td>{{ \'base.guesses\' | translate}}</td><td>{{sequence.base_guesses}}</td></tr><tr ng-if="sequence.uppercase_variations"><td>{{ \'uppercase.variations\' | translate}}</td><td>{{sequence.uppercase_variations}}</td></tr><tr ng-if="sequence.l33t_variations"><td>{{ \'leet.variations\' | translate}}</td><td>{{sequence.l33t_variations}}</td></tr></table></div></div></div>');
}]),angular.module("views/settings.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/settings.html",'<div id="passman-controls"><div class="breadcrumb"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg"><a ng-click="cancel()">{{active_vault.name}}</a></div><div class="crumb svg last"><a>{{ \'settings\' | translate}}</a></div></div></div></div><div><ul class="tab_header"><li ng-repeat="tab in tabs track by $index" class="tab" ng-class="isActiveTab(tab)? \'active\' : \'inactive\'" ng-click="onClickTab(tab)" use-theme color="\'true\'">{{tab.title | translate}}<div class="indicator" use-theme negative="\'true\'"></div></li></ul><div class="tab_container settings edit_credential" use-theme type="\'border-top-color\'"><div ng-include="currentTab.url"></div></div></div>')}]),angular.module("views/share_credential.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/share_credential.html",'<div class="main_list.share"><div id="passman-controls"><div class="actions creatable"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg" data-dir="/Test"><a ng-click="cancel()">{{active_vault.name}}</a></div><div class="crumb svg last" data-dir="/Test"><a ng-if="storedCredential.credential_id">{{ \'share.credential\' | translate}} {{storedCredential.label}}</a></div></div></div></div><ul class="tab_header"><li ng-repeat="tab in tabs track by $index" class="tab" ng-class="{active:isActiveTab(tab)}" ng-click="onClickTab(tab)" use-theme color="\'true\'">{{tab.title | translate}}<div class="indicator" use-theme negative="\'true\'"></div></li></ul><div class="tab_container share_credential" ng-show="currentTab"><div ng-include="currentTab.url"></div><button ng-click="applyShare()" ng-disabled="share_settings.linkSharing.enabled === false && share_settings.credentialSharedWithUserAndGroup.length === 0">{{ \'share\' | translate}}</button> <button ng-click="cancel()">{{ \'cancel\' | translate}}</button> <button class="btn btn-danger" ng-disabled="!storedCredential.shared_key" ng-click="unshareCredential(storedCredential)">{{ \'unshare\' | translate}}</button></div></div>')}]),angular.module("views/show_vault.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/show_vault.html",'<div class="main_list" off-click-filter="\'.download-js-link, .sidebar-shown, #app-sidebar\'"><div id="passman-controls" ng-class="{ \'sidebar-shown\': selectedCredential }"><div class="breadcrumb"><div class="breadcrumb"><div class="crumb svg ui-droppable" data-dir="/"><a ng-click="logout()"><i class="fa fa-home"></i></a></div><div class="crumb svg" ng-click="clearState()"><a>{{active_vault.name}}</a></div></div><div class="addCredential" ng-hide="delete_time>0"><button ng-click="addCredential()">+</button></div></div><div class="title" credential-counter="filtered_credentials" vault="active_vault" delete-time="delete_time" filters="filterOptions"></div><div class="searchboxContainer" ng-init="filterOptionShown = false;" off-click="filterOptionShown = false;"><input type="text" ng-model="filterOptions.filterText" class="searchbox" id="searchBox" placeholder="{{\'search.credential\' | translate}}" select-on-click clear-btn ng-click="filterOptionShown = true;"><div class="searchOptions" ng-show="filterOptionShown"><input type="checkbox" ng-model="filterOptions.useRegex"> {{ \'use.regex\' | translate }}</div></div><div class="viewModes"><div class="view-mode" ng-class="{\'active\': view_mode === \'list\' }" ng-click="switchViewMode(\'list\')"><i class="fa fa-list"></i></div><div class="view-mode" ng-class="{\'active\': view_mode === \'grid\' }" ng-click="switchViewMode(\'grid\')"><i class="fa fa-th-large"></i></div></div></div><div class="loaderContainer" ng-if="show_spinner"><div class="loader" use-theme type="\'border-bottom-color\'"></div></div><div ng-init="menuOpen = false;"><table class="credential-table" ng-if="view_mode === \'list\'"><tr ng-repeat="credential in filtered_credentials | orderBy:\'label\'" ng-if="showCredentialRow(credential)" ng-click="selectCredential(credential)" ng-dblclick="editCredential(credential)" ng-class="{\'selected\': selectedCredential.credential_id == credential.credential_id}"><td ng-class="{\'compromised\': credential.compromised }"><span class="tags"><span class="tag" ng-repeat="tag in credential.tags_raw">{{ ::tag.text}}</span></span> <span class="icon" ng-if="credential.url || credential.icon"><credential-icon credential="credential"></credential-icon></span> <span class="icon" ng-if="!credential.url && !credential.icon"><i class="fa fa-lock" ng-if="!credential.acl && !credential.shared_key"></i> <i class="fa fa-share-alt" ng-if="credential.acl"></i> <i class="fa fa-share-alt-square" ng-if="credential.shared_key"></i></span> <a class="label">{{ ::credential.label}}</a> <span ng-if="credential.compromised" class="compromised-list"><i class="icon-error icon"></i> <span class="text">{{ \'compromised.warning.list\' | translate}}</span></span></td></tr></table><ul class="grid-view" ng-if="view_mode === \'grid\'"><li class="credential" ng-repeat="credential in filtered_credentials | orderBy:\'label\'" ng-if="credential.hidden == 0 && showCredentialRow(credential)" ng-click="selectCredential(credential)" use-theme type="\'border-color\'"><div class="credential_content"><div><span class="icon" ng-if="credential.url"><credential-icon credential="credential"></credential-icon></span> <span class="icon" ng-if="!credential.url"><i class="fa fa-lock" ng-if="!credential.acl && !credential.shared_key"></i> <i class="fa fa-share-alt" ng-if="credential.acl"></i> <i class="fa fa-share-alt-square" ng-if="credential.shared_key"></i></span><div class="label">{{ ::credential.label}}</div></div><div class="tags"><div class="tag" ng-repeat="tag in credential.tags_raw">{{ ::tag.text}}</div></div></div></li></ul><div ng-if="getListSizes().listsize_wout_deleted==0 && no_credentials_label.all && !show_spinner && selectedtags.length==0 && filterOptions.filterText==\'\'" class="nopasswords" ng-hide="delete_time>0"><b>{{\'vault.hint.hello\' | translate}}</b><br><div>{{\'vault.hint.hello.add\' | translate}}</div><div class=""><button ng-click="addCredential()">+</button></div></div><div ng-if="getListSizes().listsize_wout_deleted==0 && no_credentials_label.all && !show_spinner && selectedtags.length>0" class="nopasswords" ng-hide="delete_time>0"><div>{{ \'vault.hint.list.notags\' | translate}}</div></div><div ng-if="getListSizes().listsize_wout_deleted==0 && no_credentials_label.all && !show_spinner && selectedtags.length==0 && filterOptions.filterText!=\'\'" class="nopasswords" ng-hide="delete_time>0"><div>{{ \'vault.hint.list.nosearch\' | translate}} <b>\'{{filterOptions.filterText}}\'</b></div></div><div class="nopasswords" ng-if="no_credentials_label.s_good" ng-hide="getListSizes().listsize_wout_deleted>0"><div>{{ \'vault.hint.list.nogood\' | translate}}</div></div><div class="nopasswords" ng-if="no_credentials_label.s_medium" ng-hide="getListSizes().listsize_wout_deleted>0"><div>{{ \'vault.hint.list.nomedium\' | translate}}</div></div><div class="nopasswords" ng-if="no_credentials_label.s_low" ng-hide="getListSizes().listsize_wout_deleted>0"><div>{{ \'vault.hint.list.nobad\' | translate}}</div></div><div class="nopasswords" ng-if="no_credentials_label.expired" ng-hide="getListSizes().listsize_wout_deleted>0"><div>{{ \'vault.hint.list.noexpired\' | translate}}</div></div><div class="nopasswords" ng-if="getListSizes().listsize_deleted==0" ng-hide="delete_time==0"><div>{{ \'vault.hint.list.nodeleted\' | translate}}</div></div></div></div><div id="app-sidebar" class="app_sidebar" ng-show="selectedCredential" off-click="closeSelected()"><span class="close icon-close" ng-click="closeSelected()" alt="Close"></span><div class="sidebar"><span class="icon sidebar-icon" ng-if="selectedCredential.url || credential.icon"><credential-icon credential="selectedCredential"></credential-icon></span> <span class="icon sidebar-icon" ng-if="!selectedCredential.url && !credential.icon"><credential-icon credential="selectedCredential"></credential-icon></span><h2 class="sidebar-label">{{selectedCredential.label}}</h2></div><div credential-template="selectedCredential"></div><div ng-show="selectedCredential"><div><button class="button" ng-click="editCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-edit"></span> {{ \'edit\' | translate}}</button> <button class="button" ng-click="deleteCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-trash"></span> {{ \'delete\' | translate}}</button> <button class="button" ng-click="shareCredential(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && selectedCredential.acl === undefined &&\n\t\t\t\t\t\t(settings.user_sharing_enabled === 1 || settings.user_sharing_enabled === \'1\' || settings.link_sharing_enabled === 1 || settings.link_sharing_enabled === \'1\')"><span class="fa fa-share"></span> {{ \'share\' | translate}}</button> <button class="button" ng-click="getRevisions(selectedCredential)" ng-if="selectedCredential.delete_time == 0 && hasPermission(selectedCredential.acl.permissions, permissions.permissions.HISTORY)"><span class="fa fa-undo"></span> {{ \'revisions\' | translate}}</button> <button class="button" ng-if="selectedCredential.delete_time > 0" ng-click="recoverCredential(selectedCredential) && hasPermission(selectedCredential.acl.permissions, permissions.permissions.WRITE)"><span class="fa fa-recycle"></span> {{\'recover\' | translate}}</button> <button class="button" ng-if="selectedCredential.delete_time > 0" ng-click="destroyCredential(selectedCredential)"><span class="fa fa-bomb"></span> {{\'destroy\' | translate}}</button></div></div></div><div class="share_popup" style="display: none" title="{{ \'sharereq.title\' | translate }}"><p>{{ \'sharereq.line1\' | translate}} {{ \'sharereq.line2\' | translate}}</p><br><table class="table"><thead><tr><td><b>{{ \'label\' | translate}}</b></td><td><b>{{ \'permissions\' | translate}}</b></td><td><b>{{ \'received.from\' | translate}}</b></td><td><b>{{ \'date\' | translate}}</b></td></tr></thead><tr ng-repeat="share_request in incoming_share_requests" ng-if="share_request.target_vault_id == active_vault.vault_id"><td>{{share_request.credential_label}}</td><td>{{share_request.permissions}}</td><td>{{share_request.from_user_id}}</td><td>{{share_request.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</td><td><span class="link" ng-click="acceptShareRequest(share_request)"><b>{{ \'accept\' | translate}}</b></span> | <span class="link" ng-click="declineShareRequest(share_request)">{{ \'decline\' | translate}}</span></td></tr></table></div>')}]),angular.module("views/vault_req_deletion.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/vault_req_deletion.html",'<div class="vault_wrapper"><div class="reset_form" ng-show="!pending_deletion">{{ \'req.intro1\' | translate }}<br>{{ \'req.intro2\' | translate }}<br>{{ \'req.intro3\' | translate }}<br><br><b>{{ \'request.deletion.warning\' | translate}}</b><label>{{ \'request.deletion.reason\' | translate }}</label><input type="text" ng-model="reason" class="form-control"> <button class="button button-red" ng-click="requestDeletion()">{{ \'request.deletion.accept\' | translate }}</button> <a class="pull-right button button-geen" ng-href="#/">{{ \'cancel\' | translate}}</a></div><div class="reset_form" ng-show="pending_deletion"><button class="button button-red" ng-click="removeRequestDeletion()">Cancel destruction request</button> <a class="pull-right button button-geen" ng-href="#/">Cancel</a></div></div>')}]),angular.module("views/vaults.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("views/vaults.html",'<div class="vault_wrapper"><div class="vaults" ng-if="!list_selected_vault && !creating_vault"><div class="ui-select-container ui-select-bootstrap vaultlist"><ul><li ng-click="newVault()">+ Create a new vault</li><li ng-repeat="vault in vaults" ng-class="{\'selected\': vault == list_selected_vault }" ng-click="selectVault(vault)"><div><span class="ui-select-choices-row-inner"><div class="ng-binding ng-scope">{{vault.name}} <span class="pull-right" style="color: #ce3702" ng-show="vault.delete_request_pending">{{ \'delete.request.pending\' | translate}}</span></div><small class="ng-binding ng-scope">{{ \'created\' | translate}}: {{vault.created * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}} | {{ \'last.access\' | translate}}: <span ng-if="vault.last_access > 0">{{vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span> <span ng-if="vault.last_access === 0">{{\'never\' | translate}}</span></small></span></div></li><li ng-if="vaults.length === 0">{{ \'no.vaults\' | translate}}</li></ul></div></div><div ng-if="creating_vault"><div class="login_form" ng-init="vault_name = \'\'; vault_key=\'\'; ">{{\'new.vault.name\' | translate}}<div><input type="text" ng-model="vault_name" required></div><div>{{ \'new.vault.pass\' | translate}} <input type="password" ng-model="vault_key" required><ng-password-meter password="vault_key" score="vault_key_score"></ng-password-meter></div><div>{{ \'new.vault.passr\' | translate}} <input type="password" ng-model="vault_key2" required></div><div ng-show="error || vault_key_score.score < minimal_value_key_strength" class="error"><ul><li ng-show="error">{{error}}</li><li ng-show="vault_key_score.score < minimal_value_key_strength">{{\'min.vault.key.strength\' | translate:required_score}}</li></ul></div><div><small>{{\'new.vault.sharing_key_notice\' | translate}}</small></div><div class="button_wrapper"><button class="button button-geen" ng-if="!creating_keys" click-disable ng-click="createVault(vault_name, vault_key, vault_key2)" ng-disabled="vault_key_score.score < minimal_value_key_strength || vault_key !== vault_key2 || vault_key === \'\'">{{ \'new.vault.create\' | translate }}</button><div class="button" ng-if="creating_keys"><span><i class="fa fa-spinner fa-spin"></i> {{creating_keys}}</span></div><div class="button button-red" ng-click="clearState()">{{ \'cancel\' | translate}}</div><div class="template-hidden">{{sharing_keys}}</div></div></div></div><div ng-if="list_selected_vault != false"><div class="vaultlist"><ul><li ng-click="clearState()">{{ \'go.back.vaults\' | translate }}</li></ul></div><div class="login_form"><div ng-show="error" class="error"><ul><li>{{error}}</li></ul></div>{{ \'input.vault.password\' | translate}} {{list_selected_vault.name}}<div class="pw-input"><input type="password" ng-model="vault_key" ng-enter="loginToVault(list_selected_vault, vault_key)"> <small class="last_access">{{\'last.access\' | translate}}: <span ng-if="list_selected_vault.last_access > 0">{{list_selected_vault.last_access * 1000 | date:\'dd-MM-yyyy @ HH:mm:ss\'}}</span> <span ng-if="list_selected_vault.last_access === 0">Never</span></small></div><div class="login_opts"><div><label><input type="checkbox" ng-checked="default_vault" ng-click="toggleDefaultVault()"> {{ \'vault.default\' | translate}}</label></div><div><label><input type="checkbox" ng-checked="remember_vault_password" ng-click="toggleRememberPassword()"> {{ \'vault.auto.login\' | translate}}</label></div><div><label><input type="checkbox" ng-checked="auto_logout_timer" ng-click="toggleAutoLogout()"> {{ \'auto.logout\' | translate}}</label><select ng-model="logout_timer" ng-change="selectLogoutTimer(logout_timer)"><option value="0">Never</option><option value="30">30 minutes</option><option value="60">60 minutes</option><option value="90">90 minutes</option><option value="180">3 hour</option><option value="480">8 hour</option></select></div></div><div class="alert alert-danger" ng-show="vault_tries[list_selected_vault.guid].timeout !== 0" translate="vault.locked" translate-value-tries="{{ vault_tries[list_selected_vault.guid].tries }}" translate-value-time="{{ vault_tries[list_selected_vault.guid].timeout | toHHMMSS }}"></div><button class="button button-geen" ng-click="loginToVault(list_selected_vault, vault_key)" ng-disabled="vault_tries[list_selected_vault.guid].timeout !== 0">{{ \'vault.decrypt\' | translate}}</button> <span ng-click="forgottenPassword = true;" style="margin-top: 10px; padding: 6px 12px" class="link pull-right" ng-show="!forgottenPassword">Forgot password?</span> <button ng-show="forgottenPassword" class="pull-right button button-red" ng-click="requestDeletion(list_selected_vault)"><span ng-show="list_selected_vault.delete_request_pending">{{ \'cancel.request.deletion\' | translate }}</span> <span ng-show="!list_selected_vault.delete_request_pending">{{ \'request.deletion\' | translate }}</span></button></div></div></div>')}]),$(document).ready(function(){function format_date(date){date=new Date(date);var month=date.getMonth(),year=date.getFullYear(),day=date.getDate(),hour=date.getHours(),minutes=date.getMinutes(),seconds=date.getSeconds();return month+=1,month<10&&(month="0"+month),hour<10&&(hour="0"+hour),minutes<10&&(minutes="0"+minutes),seconds<10&&(seconds="0"+seconds),day+"-"+month+"-"+year+" "+hour+":"+minutes+":"+seconds}function acceptDeleteRequest(el,req){confirm(OC.L10N.translate("passman","Are you really sure?\nThis will delete the vault and all credentials in it!"))&&$.post(OC.generateUrl("apps/passman/admin/accept-delete-request"),req,function(){$(el).parent().parent().remove()})}function ignoreDeleteRequest(el,req){$.ajax({url:OC.generateUrl("apps/passman/admin/request-deletion/"+req.vault_guid),type:"DELETE",success:function(){$(el).parent().parent().remove()}})}var Settings=function(baseUrl){this._baseUrl=baseUrl,this._settings=[]};Settings.prototype={load:function(){var deferred=$.Deferred(),self=this;return $.ajax({url:this._baseUrl,method:"GET",async:!1}).done(function(settings){self._settings=settings}).fail(function(){deferred.reject()}),deferred.promise()},setUserKey:function(key,value){var request=$.ajax({url:this._baseUrl+"/"+key+"/"+value,method:"POST"});request.done(function(){$(".msg-passwords").removeClass("msg_error"),$(".msg-passwords").text("")}),request.fail(function(){$(".msg-passwords").addClass("msg_error"),$(".msg-passwords").text(t("passwords","Error while saving field")+" "+key+"!")})},setAdminKey:function(key,value){var request=$.ajax({url:this._baseUrl+"/"+key+"/"+value+"/admin1/admin2",method:"POST"});request.done(function(){$(".msg-passwords").removeClass("msg_error"),$(".msg-passwords").text("")}),request.fail(function(){$(".msg-passwords").addClass("msg_error"),$(".msg-passwords").text(t("passwords","Error while saving field")+" "+key+"!")})},getKey:function(key){return!!this._settings.hasOwnProperty(key)&&this._settings[key]},getAll:function(){return this._settings}};var settings=new Settings(OC.generateUrl("apps/passman/api/v2/settings"));settings.load(),$("#passman_link_sharing_enabled").prop("checked","1"===settings.getKey("link_sharing_enabled").toString().toLowerCase()),$("#passman_sharing_enabled").prop("checked","1"===settings.getKey("user_sharing_enabled").toString().toLowerCase()),$("#passman_check_version").prop("checked","1"===settings.getKey("check_version").toString().toLowerCase()),$("#passman_https_check").prop("checked","1"===settings.getKey("https_check").toString().toLowerCase()),$("#passman_disable_contextmenu").prop("checked","1"===settings.getKey("disable_contextmenu").toString().toLowerCase()),$("#passman_disable_debugger").prop("checked","1"===settings.getKey("disable_debugger").toString().toLowerCase()),$("#vault_key_strength").val(settings.getKey("vault_key_strength")),$("#passman_check_version").change(function(){settings.setAdminKey("check_version",$(this).is(":checked")?1:0)}),$("#passman_https_check").change(function(){settings.setAdminKey("https_check",$(this).is(":checked")?1:0)}),$("#passman_disable_contextmenu").change(function(){settings.setAdminKey("disable_contextmenu",$(this).is(":checked")?1:0)}),$("#passman_disable_debugger").change(function(){settings.setAdminKey("disable_debugger",$(this).is(":checked")?1:0)}),$("#passman_sharing_enabled").change(function(){settings.setAdminKey("user_sharing_enabled",$(this).is(":checked")?1:0)}),$("#passman_link_sharing_enabled").change(function(){settings.setAdminKey("link_sharing_enabled",$(this).is(":checked")?1:0)}),$("#vault_key_strength").change(function(){settings.setAdminKey("vault_key_strength",$(this).val())}),2===$('form[name="passman_settings"]').length&&$('form[name="passman_settings"]')[1].remove();var accountMover={source_account:"",destination_account:""};$(".username-autocomplete").autocomplete({source:OC.generateUrl("apps/passman/admin/search"),minLength:1,select:function(event,ui){accountMover[$(this).attr("id")]=ui.item.value}}),$("#move_credentials").click(function(){var self=this;$("#moveStatus").hide(),$(self).attr("disabled","disabled"),$(self).html('<i class="fa fa-spinner fa-spin"></i> '+OC.L10N.translate("passman","Moving")+"..."),accountMover.source_account&&accountMover.destination_account&&$.post(OC.generateUrl("apps/passman/admin/move"),accountMover,function(data){data.success&&($(self).removeAttr("disabled"),$(self).html("Move"),$("#moveStatus").fadeIn(),setTimeout(function(){$("#moveStatus").fadeOut()},3500))})}),$.get(OC.generateUrl("apps/passman/admin/delete-requests"),function(requests){var table=$("#requests-table tbody");$.each(requests,function(k,request){var accept=$('<span class="link">[Accept]&nbsp;</span>');accept.click(function(){var _self=this;acceptDeleteRequest(_self,request)});var ignore=$('<span class="link">[Ignore]</span>');ignore.click(function(){var _self=this;ignoreDeleteRequest(_self,request)});var cols=$("<td>"+request.id+"</td><td>"+request.displayName+"</td><td>"+request.reason+"</td><td>"+format_date(1e3*request.created)+"</td>"),actions=$("<td></td>").append(accept).append(ignore);table.append($("<tr></tr>").append(cols).append(actions))})}),$("#passman-tabs").tabs()}); \ No newline at end of file
diff --git a/l10n/ca.js b/l10n/ca.js
index 72208165..891d65d7 100644
--- a/l10n/ca.js
+++ b/l10n/ca.js
@@ -77,6 +77,10 @@ OC.L10N.register(
"Search icons" : "Cerca icones",
"Upload a custom icon:" : "Carrega una icona personalitzada:",
"Use this icon" : "Fes servir aquesta icona",
+ "Delete current icon" : "Suprimeix la icona actual",
+ "Get icon from page" : "Obté la icona de la pàgina",
+ "This may take a few seconds…" : "Això podria trigar uns quants segons...",
+ "There was an error fetching the icon!" : "Hi ha hagut un error mentre s'obtenia la icona!",
"Selected icon" : "Selecciona una icona",
"Field label" : "Etiqueta del camp",
"Field value" : "Valor del camp",
@@ -290,6 +294,14 @@ OC.L10N.register(
"Click here to request it" : "Feu clic aquí per sol·licitar-lo",
"Loading…" : "S'està carregant...",
"Awwhh… credential not found. Maybe it expired" : "Oohh... no s'ha trobat cap credencial ... Potser ha caducat",
+ "Compromise!" : "Compromís!",
+ "Compromised!" : "Compromès!",
+ "This password is compromised. You can only remove this warning with changing the password." : "Aquesta contrasenya està compromesa. Només podreu suprimir aquest avís canviant la contrasenya.",
+ "email" : "correu electrònic",
+ "Description" : "Descripció",
+ "Url" : "Url",
+ "Custom Search:" : "Cerca Personalitzada:",
+ "Revert to defaults" : "Torna als valors per defecte",
"Error while saving field" : "S'ha produït un error mentre es desava el camp",
"A Passman item has been created, modified or deleted" : "S'ha creat, modificat o suprimit un element Passman",
"A Passman item has expired" : "Ha caducat un element Passman",
diff --git a/l10n/ca.json b/l10n/ca.json
index 298b4cf4..25d91b3d 100644
--- a/l10n/ca.json
+++ b/l10n/ca.json
@@ -75,6 +75,10 @@
"Search icons" : "Cerca icones",
"Upload a custom icon:" : "Carrega una icona personalitzada:",
"Use this icon" : "Fes servir aquesta icona",
+ "Delete current icon" : "Suprimeix la icona actual",
+ "Get icon from page" : "Obté la icona de la pàgina",
+ "This may take a few seconds…" : "Això podria trigar uns quants segons...",
+ "There was an error fetching the icon!" : "Hi ha hagut un error mentre s'obtenia la icona!",
"Selected icon" : "Selecciona una icona",
"Field label" : "Etiqueta del camp",
"Field value" : "Valor del camp",
@@ -288,6 +292,14 @@
"Click here to request it" : "Feu clic aquí per sol·licitar-lo",
"Loading…" : "S'està carregant...",
"Awwhh… credential not found. Maybe it expired" : "Oohh... no s'ha trobat cap credencial ... Potser ha caducat",
+ "Compromise!" : "Compromís!",
+ "Compromised!" : "Compromès!",
+ "This password is compromised. You can only remove this warning with changing the password." : "Aquesta contrasenya està compromesa. Només podreu suprimir aquest avís canviant la contrasenya.",
+ "email" : "correu electrònic",
+ "Description" : "Descripció",
+ "Url" : "Url",
+ "Custom Search:" : "Cerca Personalitzada:",
+ "Revert to defaults" : "Torna als valors per defecte",
"Error while saving field" : "S'ha produït un error mentre es desava el camp",
"A Passman item has been created, modified or deleted" : "S'ha creat, modificat o suprimit un element Passman",
"A Passman item has expired" : "Ha caducat un element Passman",
diff --git a/l10n/cs.js b/l10n/cs.js
index 02bbd7e2..13183e07 100644
--- a/l10n/cs.js
+++ b/l10n/cs.js
@@ -79,7 +79,7 @@ OC.L10N.register(
"Use this icon" : "Použít tuto ikonu",
"Delete current icon" : "Smazat stávající ikonu",
"Get icon from page" : "Získat ikonu ze stránky",
- "This may take a few seconds..." : "Může to pár sekund trvat…",
+ "This may take a few seconds…" : "Může to pár sekund trvat…",
"There was an error fetching the icon!" : "Při stahování ikony došlo k chybě!",
"Selected icon" : "Vybraná ikona",
"Field label" : "Popisek pole",
diff --git a/l10n/cs.json b/l10n/cs.json
index 4d5a52c7..575ec389 100644
--- a/l10n/cs.json
+++ b/l10n/cs.json
@@ -77,7 +77,7 @@
"Use this icon" : "Použít tuto ikonu",
"Delete current icon" : "Smazat stávající ikonu",
"Get icon from page" : "Získat ikonu ze stránky",
- "This may take a few seconds..." : "Může to pár sekund trvat…",
+ "This may take a few seconds…" : "Může to pár sekund trvat…",
"There was an error fetching the icon!" : "Při stahování ikony došlo k chybě!",
"Selected icon" : "Vybraná ikona",
"Field label" : "Popisek pole",
diff --git a/l10n/de.js b/l10n/de.js
index ef7b117f..5df7e3d5 100644
--- a/l10n/de.js
+++ b/l10n/de.js
@@ -79,7 +79,7 @@ OC.L10N.register(
"Use this icon" : "Dieses Icon verwenden",
"Delete current icon" : "Das aktuelle Symbol löschen",
"Get icon from page" : "Symbol von der Seite nutzen",
- "This may take a few seconds..." : "…",
+ "This may take a few seconds…" : "Das kann einige Sekunden daueren...",
"There was an error fetching the icon!" : "Fehler beim Laden desy Symbols!",
"Selected icon" : "Icon auswählen",
"Field label" : "Beschriftung des Feldes",
@@ -214,7 +214,7 @@ OC.L10N.register(
"Unshare" : "Freigabe aufheben",
"Showing deleted since" : "Anzeigen gelöscht seit",
"Beginning" : "Beginn",
- "Showing {{number_filtered}} of {{credential_number}} credentials" : "{{number_filtered}} of {{credential_number}} Anmeldeinformationen anzeigen",
+ "Showing {{number_filtered}} of {{credential_number}} credentials" : "{{number_filtered}} von {{credential_number}} Anmeldeinformationen anzeigen",
"Search for credential…" : "Zugangsdaten suchen…",
"Account" : "Konto",
"Password" : "Passwort",
diff --git a/l10n/de.json b/l10n/de.json
index 07ac52d3..0cba5a13 100644
--- a/l10n/de.json
+++ b/l10n/de.json
@@ -77,7 +77,7 @@
"Use this icon" : "Dieses Icon verwenden",
"Delete current icon" : "Das aktuelle Symbol löschen",
"Get icon from page" : "Symbol von der Seite nutzen",
- "This may take a few seconds..." : "…",
+ "This may take a few seconds…" : "Das kann einige Sekunden daueren...",
"There was an error fetching the icon!" : "Fehler beim Laden desy Symbols!",
"Selected icon" : "Icon auswählen",
"Field label" : "Beschriftung des Feldes",
@@ -212,7 +212,7 @@
"Unshare" : "Freigabe aufheben",
"Showing deleted since" : "Anzeigen gelöscht seit",
"Beginning" : "Beginn",
- "Showing {{number_filtered}} of {{credential_number}} credentials" : "{{number_filtered}} of {{credential_number}} Anmeldeinformationen anzeigen",
+ "Showing {{number_filtered}} of {{credential_number}} credentials" : "{{number_filtered}} von {{credential_number}} Anmeldeinformationen anzeigen",
"Search for credential…" : "Zugangsdaten suchen…",
"Account" : "Konto",
"Password" : "Passwort",
diff --git a/l10n/de_DE.js b/l10n/de_DE.js
index 35de108f..bb180228 100644
--- a/l10n/de_DE.js
+++ b/l10n/de_DE.js
@@ -79,7 +79,7 @@ OC.L10N.register(
"Use this icon" : "Dieses Icon verwenden",
"Delete current icon" : "Das aktuelle Symbol löschen",
"Get icon from page" : "Symbol von der Seite nutzen",
- "This may take a few seconds..." : "Dies kann ein paar Sekunden dauern…",
+ "This may take a few seconds…" : "Das kann einige Sekunden daueren...",
"There was an error fetching the icon!" : "Fehler beim Laden desy Symbols!",
"Selected icon" : "Icon auswählen",
"Field label" : "Beschriftung des Feldes",
@@ -214,7 +214,7 @@ OC.L10N.register(
"Unshare" : "Freigabe aufheben",
"Showing deleted since" : "Anzeigen gelöscht seit",
"Beginning" : "Beginn",
- "Showing {{number_filtered}} of {{credential_number}} credentials" : "{{number_filtered}} of {{credential_number}} Anmeldeinformationen anzeigen",
+ "Showing {{number_filtered}} of {{credential_number}} credentials" : "{{number_filtered}} von {{credential_number}} Anmeldeinformationen anzeigen",
"Search for credential…" : "Suche Anmeldeinformationen…",
"Account" : "Konto",
"Password" : "Passwort",
diff --git a/l10n/de_DE.json b/l10n/de_DE.json
index 9c999023..ab551a9c 100644
--- a/l10n/de_DE.json
+++ b/l10n/de_DE.json
@@ -77,7 +77,7 @@
"Use this icon" : "Dieses Icon verwenden",
"Delete current icon" : "Das aktuelle Symbol löschen",
"Get icon from page" : "Symbol von der Seite nutzen",
- "This may take a few seconds..." : "Dies kann ein paar Sekunden dauern…",
+ "This may take a few seconds…" : "Das kann einige Sekunden daueren...",
"There was an error fetching the icon!" : "Fehler beim Laden desy Symbols!",
"Selected icon" : "Icon auswählen",
"Field label" : "Beschriftung des Feldes",
@@ -212,7 +212,7 @@
"Unshare" : "Freigabe aufheben",
"Showing deleted since" : "Anzeigen gelöscht seit",
"Beginning" : "Beginn",
- "Showing {{number_filtered}} of {{credential_number}} credentials" : "{{number_filtered}} of {{credential_number}} Anmeldeinformationen anzeigen",
+ "Showing {{number_filtered}} of {{credential_number}} credentials" : "{{number_filtered}} von {{credential_number}} Anmeldeinformationen anzeigen",
"Search for credential…" : "Suche Anmeldeinformationen…",
"Account" : "Konto",
"Password" : "Passwort",
diff --git a/l10n/es.js b/l10n/es.js
index 2c657f8f..8c267216 100644
--- a/l10n/es.js
+++ b/l10n/es.js
@@ -79,7 +79,6 @@ OC.L10N.register(
"Use this icon" : "Usar este icono",
"Delete current icon" : "Eliminar icono actual",
"Get icon from page" : "Conseguir icono de la web",
- "This may take a few seconds..." : "Esto puede tardar unos segundos...",
"There was an error fetching the icon!" : "¡Ha habido un error al recuperar el icono!",
"Selected icon" : "Icono seleccionado",
"Field label" : "Llene etiqueta",
diff --git a/l10n/es.json b/l10n/es.json
index 72b0540c..96726aa9 100644
--- a/l10n/es.json
+++ b/l10n/es.json
@@ -77,7 +77,6 @@
"Use this icon" : "Usar este icono",
"Delete current icon" : "Eliminar icono actual",
"Get icon from page" : "Conseguir icono de la web",
- "This may take a few seconds..." : "Esto puede tardar unos segundos...",
"There was an error fetching the icon!" : "¡Ha habido un error al recuperar el icono!",
"Selected icon" : "Icono seleccionado",
"Field label" : "Llene etiqueta",
diff --git a/l10n/fr.js b/l10n/fr.js
index 7b366563..dd739fe6 100644
--- a/l10n/fr.js
+++ b/l10n/fr.js
@@ -78,7 +78,9 @@ OC.L10N.register(
"Upload a custom icon:" : "Téléverser une icône personnalisée :",
"Use this icon" : "Utiliser cette icône",
"Delete current icon" : "Supprimer l'icône actuel",
- "This may take a few seconds..." : "Cette opération devrait prendre quelques secondes…",
+ "Get icon from page" : "Obtenir l'icône à partir de la page",
+ "This may take a few seconds…" : "Cela ne devrait durer que quelques secondes …",
+ "There was an error fetching the icon!" : "Il y a eu une erreur lors de la récupération de l'icône !",
"Selected icon" : "Icône sélectionnée",
"Field label" : "Étiquette du champ",
"Field value" : "Valeur du champ",
@@ -203,7 +205,7 @@ OC.L10N.register(
"Label" : "Étiquette",
"Restore revision" : "Restaurer la révision",
"Delete revision" : "Supprimer la révision",
- "Edit credential" : "Éditer le rapport d'identification",
+ "Edit credential" : "Modifier la sécurité",
"Create new credential" : "Créer de nouvelles informations d'identification",
"Save" : "Sauvegarder",
"Cancel" : "Annuler",
@@ -223,7 +225,7 @@ OC.L10N.register(
"Expiry time" : "Heure d'expiration",
"Changed" : "Modifié",
"Created" : "Créé",
- "Edit" : "Éditer",
+ "Edit" : "Modifier",
"Delete" : "Supprimer",
"Share" : "Partager",
"Recover" : "Restaurer",
@@ -292,6 +294,9 @@ OC.L10N.register(
"Click here to request it" : "Cliquez ici pour le demander",
"Loading…" : "Chargement...",
"Awwhh… credential not found. Maybe it expired" : "Awwhh.... information d'identification non trouvée. Il est peut être expiré",
+ "Compromise!" : "Compromis !",
+ "Compromised!" : "Compromis !",
+ "This password is compromised. You can only remove this warning with changing the password." : "Ce mot de passe est compromis. Vous ne pouvez supprimer cet avertissement qu'en changeant le mot de passe.",
"email" : "email",
"Description" : "Description",
"Url" : "URL",
@@ -328,7 +333,7 @@ OC.L10N.register(
"%s has accepted your share request for \"%s\"." : "%s a accepté votre demande de partage pour \"%s\"",
"Passman" : "Passman",
"Passman is a full featured password manager." : "Passman est un gestionnaire de mot de passe complet.",
- "Passman is a full featured password manager.\nFeatures:\n- Vaults\n- Vault key is never sent to the server\n- Browser extension for easy access to passwords\n- Android app for on the road access\n- Credentials are client side encrypted with 256bit AES\n- Credentials are server side encrypted with 256bit AES\n- Ability to add custom fields to credentials\n- Built-in OTP (One Time Password) generator\n- Password analyzer\n- Share passwords internally and via link in a secure manner.\n- Import from various password managers (KeePass, LastPass, DashLane, ZOHO, Clipperz.is )\nFor an demo of this app visit [https://demo.passman.cc](https://demo.passman.cc)" : "Passman est un gestionnaire de mot de passe complet.\nCaractéristiques:\n- Coffres\n- La clé de coffre-fort n'est jamais envoyée au serveur\n- Extension du navigateur pour un accès facile aux mots de passe\n- Application Android pour l'accès mobile\n- Les informations d'identification sont cryptées côté client avec AES 256 bits \n- Les informations d'identification sont cryptées côté serveur avec AES 256 bits \n- Possibilité d'ajouter des champs personnalisés aux informations d'identification\n- Générateur OTP (One Time Password) intégré\n- Analyseur de mot de passe\n- Partager les mots de passe en interne et via un lien de manière sécurisée.\n- Importation à partir de différents gestionnaires de mots de passe (KeePass, LastPass, DashLane, ZOHO, Clipperz.is)\nPour une démo de cette application, visitez [https://demo.passman.cc] (https://demo.passman.cc)",
+ "Passman is a full featured password manager.\nFeatures:\n- Vaults\n- Vault key is never sent to the server\n- Browser extension for easy access to passwords\n- Android app for on the road access\n- Credentials are client side encrypted with 256bit AES\n- Credentials are server side encrypted with 256bit AES\n- Ability to add custom fields to credentials\n- Built-in OTP (One Time Password) generator\n- Password analyzer\n- Share passwords internally and via link in a secure manner.\n- Import from various password managers (KeePass, LastPass, DashLane, ZOHO, Clipperz.is )\nFor an demo of this app visit [https://demo.passman.cc](https://demo.passman.cc)" : "Passman est un gestionnaire de mot de passe complet.\nCaractéristiques:\n- Coffres\n- La clé de coffre-fort n'est jamais envoyée au serveur\n- Extension du navigateur pour un accès facile aux mots de passe\n- Application Android pour l'accès mobile\n- Les informations d'identification sont chiffrées côté client avec AES 256 bits \n- Les informations d'identification sont chiffrées côté serveur avec AES 256 bits \n- Possibilité d'ajouter des champs personnalisés aux informations d'identification\n- Générateur OTP (One Time Password) intégré\n- Analyseur de mot de passe\n- Partager les mots de passe en interne et via un lien de manière sécurisée.\n- Importation à partir de différents gestionnaires de mots de passe (KeePass, LastPass, DashLane, ZOHO, Clipperz.is)\nPour une démo de cette application, visitez [https://demo.passman.cc] (https://demo.passman.cc)",
"Unable to get version info" : "Impossible d'obtenir l'information de la version",
"Passman Settings" : "Paramètres de Passman",
"GitHub version:" : "Version GitHub :",
diff --git a/l10n/fr.json b/l10n/fr.json
index 23f93f75..019d43c9 100644
--- a/l10n/fr.json
+++ b/l10n/fr.json
@@ -76,7 +76,9 @@
"Upload a custom icon:" : "Téléverser une icône personnalisée :",
"Use this icon" : "Utiliser cette icône",
"Delete current icon" : "Supprimer l'icône actuel",
- "This may take a few seconds..." : "Cette opération devrait prendre quelques secondes…",
+ "Get icon from page" : "Obtenir l'icône à partir de la page",
+ "This may take a few seconds…" : "Cela ne devrait durer que quelques secondes …",
+ "There was an error fetching the icon!" : "Il y a eu une erreur lors de la récupération de l'icône !",
"Selected icon" : "Icône sélectionnée",
"Field label" : "Étiquette du champ",
"Field value" : "Valeur du champ",
@@ -201,7 +203,7 @@
"Label" : "Étiquette",
"Restore revision" : "Restaurer la révision",
"Delete revision" : "Supprimer la révision",
- "Edit credential" : "Éditer le rapport d'identification",
+ "Edit credential" : "Modifier la sécurité",
"Create new credential" : "Créer de nouvelles informations d'identification",
"Save" : "Sauvegarder",
"Cancel" : "Annuler",
@@ -221,7 +223,7 @@
"Expiry time" : "Heure d'expiration",
"Changed" : "Modifié",
"Created" : "Créé",
- "Edit" : "Éditer",
+ "Edit" : "Modifier",
"Delete" : "Supprimer",
"Share" : "Partager",
"Recover" : "Restaurer",
@@ -290,6 +292,9 @@
"Click here to request it" : "Cliquez ici pour le demander",
"Loading…" : "Chargement...",
"Awwhh… credential not found. Maybe it expired" : "Awwhh.... information d'identification non trouvée. Il est peut être expiré",
+ "Compromise!" : "Compromis !",
+ "Compromised!" : "Compromis !",
+ "This password is compromised. You can only remove this warning with changing the password." : "Ce mot de passe est compromis. Vous ne pouvez supprimer cet avertissement qu'en changeant le mot de passe.",
"email" : "email",
"Description" : "Description",
"Url" : "URL",
@@ -326,7 +331,7 @@
"%s has accepted your share request for \"%s\"." : "%s a accepté votre demande de partage pour \"%s\"",
"Passman" : "Passman",
"Passman is a full featured password manager." : "Passman est un gestionnaire de mot de passe complet.",
- "Passman is a full featured password manager.\nFeatures:\n- Vaults\n- Vault key is never sent to the server\n- Browser extension for easy access to passwords\n- Android app for on the road access\n- Credentials are client side encrypted with 256bit AES\n- Credentials are server side encrypted with 256bit AES\n- Ability to add custom fields to credentials\n- Built-in OTP (One Time Password) generator\n- Password analyzer\n- Share passwords internally and via link in a secure manner.\n- Import from various password managers (KeePass, LastPass, DashLane, ZOHO, Clipperz.is )\nFor an demo of this app visit [https://demo.passman.cc](https://demo.passman.cc)" : "Passman est un gestionnaire de mot de passe complet.\nCaractéristiques:\n- Coffres\n- La clé de coffre-fort n'est jamais envoyée au serveur\n- Extension du navigateur pour un accès facile aux mots de passe\n- Application Android pour l'accès mobile\n- Les informations d'identification sont cryptées côté client avec AES 256 bits \n- Les informations d'identification sont cryptées côté serveur avec AES 256 bits \n- Possibilité d'ajouter des champs personnalisés aux informations d'identification\n- Générateur OTP (One Time Password) intégré\n- Analyseur de mot de passe\n- Partager les mots de passe en interne et via un lien de manière sécurisée.\n- Importation à partir de différents gestionnaires de mots de passe (KeePass, LastPass, DashLane, ZOHO, Clipperz.is)\nPour une démo de cette application, visitez [https://demo.passman.cc] (https://demo.passman.cc)",
+ "Passman is a full featured password manager.\nFeatures:\n- Vaults\n- Vault key is never sent to the server\n- Browser extension for easy access to passwords\n- Android app for on the road access\n- Credentials are client side encrypted with 256bit AES\n- Credentials are server side encrypted with 256bit AES\n- Ability to add custom fields to credentials\n- Built-in OTP (One Time Password) generator\n- Password analyzer\n- Share passwords internally and via link in a secure manner.\n- Import from various password managers (KeePass, LastPass, DashLane, ZOHO, Clipperz.is )\nFor an demo of this app visit [https://demo.passman.cc](https://demo.passman.cc)" : "Passman est un gestionnaire de mot de passe complet.\nCaractéristiques:\n- Coffres\n- La clé de coffre-fort n'est jamais envoyée au serveur\n- Extension du navigateur pour un accès facile aux mots de passe\n- Application Android pour l'accès mobile\n- Les informations d'identification sont chiffrées côté client avec AES 256 bits \n- Les informations d'identification sont chiffrées côté serveur avec AES 256 bits \n- Possibilité d'ajouter des champs personnalisés aux informations d'identification\n- Générateur OTP (One Time Password) intégré\n- Analyseur de mot de passe\n- Partager les mots de passe en interne et via un lien de manière sécurisée.\n- Importation à partir de différents gestionnaires de mots de passe (KeePass, LastPass, DashLane, ZOHO, Clipperz.is)\nPour une démo de cette application, visitez [https://demo.passman.cc] (https://demo.passman.cc)",
"Unable to get version info" : "Impossible d'obtenir l'information de la version",
"Passman Settings" : "Paramètres de Passman",
"GitHub version:" : "Version GitHub :",
diff --git a/l10n/gl.js b/l10n/gl.js
index 1429a1df..d9167530 100644
--- a/l10n/gl.js
+++ b/l10n/gl.js
@@ -79,7 +79,7 @@ OC.L10N.register(
"Use this icon" : "Usar esta icona",
"Delete current icon" : "Eliminar a icona actual",
"Get icon from page" : "Obtér a icona da páxina",
- "This may take a few seconds..." : "Isto pode levar uns segundos…",
+ "This may take a few seconds…" : "Isto pode levar uns segundos…",
"There was an error fetching the icon!" : "Produciuse un erro ao obter a icona!",
"Selected icon" : "Icona seleccionada",
"Field label" : "Campo etiqueta",
@@ -121,7 +121,7 @@ OC.L10N.register(
"Enter vault password to confirm export." : "Introduza o contrasinal da bóveda para confirmar a exportación.",
"Rename vault" : "Renomear a bóveda",
"New vault name" : "Nome novo para a bóveda",
- "Change" : "Cambio",
+ "Change" : "Cambiar",
"Change vault key" : "Cambiar a chave da bóveda",
"Old vault password" : "Anterior contrasinal da bóveda",
"New vault password" : "Novo contrasinal da bóveda",
@@ -161,7 +161,7 @@ OC.L10N.register(
"Search users…" : "Buscar usuarios…",
"Missing users? Only users that have vaults are shown." : "Faltan usuarios? Só se amosan os usuarios que teñan bóvedas",
"Cyphering" : "Cifrado",
- "Uploading" : "Enviando…",
+ "Uploading" : "Enviando",
"User" : "Usuario",
"Crypto time" : "Tempo de cifrado",
"Total time spent encrypting" : "Tempo total usado no cifrado",
diff --git a/l10n/gl.json b/l10n/gl.json
index 9e16f8e0..eefcd26a 100644
--- a/l10n/gl.json
+++ b/l10n/gl.json
@@ -77,7 +77,7 @@
"Use this icon" : "Usar esta icona",
"Delete current icon" : "Eliminar a icona actual",
"Get icon from page" : "Obtér a icona da páxina",
- "This may take a few seconds..." : "Isto pode levar uns segundos…",
+ "This may take a few seconds…" : "Isto pode levar uns segundos…",
"There was an error fetching the icon!" : "Produciuse un erro ao obter a icona!",
"Selected icon" : "Icona seleccionada",
"Field label" : "Campo etiqueta",
@@ -119,7 +119,7 @@
"Enter vault password to confirm export." : "Introduza o contrasinal da bóveda para confirmar a exportación.",
"Rename vault" : "Renomear a bóveda",
"New vault name" : "Nome novo para a bóveda",
- "Change" : "Cambio",
+ "Change" : "Cambiar",
"Change vault key" : "Cambiar a chave da bóveda",
"Old vault password" : "Anterior contrasinal da bóveda",
"New vault password" : "Novo contrasinal da bóveda",
@@ -159,7 +159,7 @@
"Search users…" : "Buscar usuarios…",
"Missing users? Only users that have vaults are shown." : "Faltan usuarios? Só se amosan os usuarios que teñan bóvedas",
"Cyphering" : "Cifrado",
- "Uploading" : "Enviando…",
+ "Uploading" : "Enviando",
"User" : "Usuario",
"Crypto time" : "Tempo de cifrado",
"Total time spent encrypting" : "Tempo total usado no cifrado",
diff --git a/l10n/is.js b/l10n/is.js
index 05c5cc04..7c3752bd 100644
--- a/l10n/is.js
+++ b/l10n/is.js
@@ -77,6 +77,9 @@ OC.L10N.register(
"Search icons" : "Leita að táknmyndum",
"Upload a custom icon:" : "Senda inn sérsniðna táknmynd:",
"Use this icon" : "Nota þessa táknmynd",
+ "Delete current icon" : "Eyða núverandi táknmynd",
+ "Get icon from page" : "Velja táknmynd af síðu",
+ "There was an error fetching the icon!" : "Það kom upp villa við að ná í táknmyndina!",
"Selected icon" : "Valin táknmynd",
"Field label" : "Skýring gagnasviðs",
"Field value" : "Gildi gagnasviðs",
@@ -290,6 +293,14 @@ OC.L10N.register(
"Click here to request it" : "Smelltu hér til að biðja um það",
"Loading…" : "Hleð inn…",
"Awwhh… credential not found. Maybe it expired" : "Æjæjæ... auðkenni fundust ekki. Kannski þau séu útrunnin",
+ "Compromise!" : "Berskjaldað!",
+ "Compromised!" : "Berskjaldað!",
+ "This password is compromised. You can only remove this warning with changing the password." : "Þetta lykilorð er berskjaldað, og því ekki nothæft lengur. Þú getur aðeins losnað við þessa aðvörun með því að skipta um lykilorð.",
+ "email" : "tölvupóstur",
+ "Description" : "Lýsing",
+ "Url" : "Slóð (URL)",
+ "Custom Search:" : "Sérsniðin leit:",
+ "Revert to defaults" : "Frumstilla á sjálfgefin gildi",
"Error while saving field" : "Villa kom upp við að vista gagnasvið",
"A Passman item has been created, modified or deleted" : "Passman atriði hefur verið búið til, breytt eða eytt",
"A Passman item has expired" : "Passman atriði er útrunnið",
diff --git a/l10n/is.json b/l10n/is.json
index 4313a332..adb35b1f 100644
--- a/l10n/is.json
+++ b/l10n/is.json
@@ -75,6 +75,9 @@
"Search icons" : "Leita að táknmyndum",
"Upload a custom icon:" : "Senda inn sérsniðna táknmynd:",
"Use this icon" : "Nota þessa táknmynd",
+ "Delete current icon" : "Eyða núverandi táknmynd",
+ "Get icon from page" : "Velja táknmynd af síðu",
+ "There was an error fetching the icon!" : "Það kom upp villa við að ná í táknmyndina!",
"Selected icon" : "Valin táknmynd",
"Field label" : "Skýring gagnasviðs",
"Field value" : "Gildi gagnasviðs",
@@ -288,6 +291,14 @@
"Click here to request it" : "Smelltu hér til að biðja um það",
"Loading…" : "Hleð inn…",
"Awwhh… credential not found. Maybe it expired" : "Æjæjæ... auðkenni fundust ekki. Kannski þau séu útrunnin",
+ "Compromise!" : "Berskjaldað!",
+ "Compromised!" : "Berskjaldað!",
+ "This password is compromised. You can only remove this warning with changing the password." : "Þetta lykilorð er berskjaldað, og því ekki nothæft lengur. Þú getur aðeins losnað við þessa aðvörun með því að skipta um lykilorð.",
+ "email" : "tölvupóstur",
+ "Description" : "Lýsing",
+ "Url" : "Slóð (URL)",
+ "Custom Search:" : "Sérsniðin leit:",
+ "Revert to defaults" : "Frumstilla á sjálfgefin gildi",
"Error while saving field" : "Villa kom upp við að vista gagnasvið",
"A Passman item has been created, modified or deleted" : "Passman atriði hefur verið búið til, breytt eða eytt",
"A Passman item has expired" : "Passman atriði er útrunnið",
diff --git a/l10n/it.js b/l10n/it.js
index a48af068..376da1e6 100644
--- a/l10n/it.js
+++ b/l10n/it.js
@@ -79,7 +79,7 @@ OC.L10N.register(
"Use this icon" : "Utilizza questa icona",
"Delete current icon" : "Elimina icona attuale",
"Get icon from page" : "Ottieni icona da pagina",
- "This may take a few seconds..." : "Potrebbe richiedere alcuni secondi...",
+ "This may take a few seconds…" : "Potrebbe richiedere alcuni secondi...",
"There was an error fetching the icon!" : "Si è verificato un errore durante il recupero dell'icona.",
"Selected icon" : "Icona selezionata",
"Field label" : "Etichetta campo",
diff --git a/l10n/it.json b/l10n/it.json
index 2f531949..85cfde14 100644
--- a/l10n/it.json
+++ b/l10n/it.json
@@ -77,7 +77,7 @@
"Use this icon" : "Utilizza questa icona",
"Delete current icon" : "Elimina icona attuale",
"Get icon from page" : "Ottieni icona da pagina",
- "This may take a few seconds..." : "Potrebbe richiedere alcuni secondi...",
+ "This may take a few seconds…" : "Potrebbe richiedere alcuni secondi...",
"There was an error fetching the icon!" : "Si è verificato un errore durante il recupero dell'icona.",
"Selected icon" : "Icona selezionata",
"Field label" : "Etichetta campo",
diff --git a/l10n/lt_LT.js b/l10n/lt_LT.js
index 4df11d90..e78ae8e4 100644
--- a/l10n/lt_LT.js
+++ b/l10n/lt_LT.js
@@ -15,10 +15,14 @@ OC.L10N.register(
"Credential updated" : "Prisijungimo duomenys atnaujinti",
"Credential recovered" : "Prisijungimo duomenys atkurti",
"Credential destroyed" : "Prisijungimo duomenys sunaikinti",
+ "Error downloading file, you probably have insufficient permissions" : "Klaida atsisiunčiant failą. Jūs, tikriausiai, neturite pakankamai leidimų",
"Invalid QR code" : "Neteisingas QR kodas",
"Starting export" : "Pradedamas eksportavimas",
"Decrypting credentials" : "Iššifruojami prisijungimo duomenys",
"Done" : "Atlikta",
+ "File read." : "Failas perskaitytas.",
+ "Adding {{credential}}" : "Pridedama {{credential}}",
+ "Added {{credential}}" : "Pridėta {{credential}}",
"Parsed {{num}} credentials, starting to import" : "Prisijungimo duomenys patikrinti, pradedamas importas",
"Importing" : "Importuojama",
"Start import" : "Pradėti importą",
@@ -63,8 +67,9 @@ OC.L10N.register(
"Username" : "Naudotojo vardas",
"Repeat password" : "Pakartoti slaptažodį",
"Add tag" : "Pridėti žymę",
+ "Search icons" : "Ieškoti piktogramų",
"Use this icon" : "Naudoti šią piktogramą",
- "This may take a few seconds..." : "Tai gali šiek tiek užtrukti...",
+ "This may take a few seconds…" : "Tai gali šiek tiek užtrukti…",
"Field label" : "Laukelio pavadinimas",
"Field value" : "Laukelio vertė",
"Choose a file" : "Pasirinkti failą",
@@ -118,6 +123,7 @@ OC.L10N.register(
"Key size" : "Rakto dydis",
"Save keys" : "Įrašyti raktus",
"Action" : "Veiksmas",
+ "Search users…" : "Ieškoti naudotojų…",
"Missing users? Only users that have vaults are shown." : "Trūksta naudotojų? Yra rodomi tik naudotojai, turintys slėptuves.",
"Uploading" : "Įkeliama",
"User" : "Naudotojas",
diff --git a/l10n/lt_LT.json b/l10n/lt_LT.json
index b51fa276..6c0c0d27 100644
--- a/l10n/lt_LT.json
+++ b/l10n/lt_LT.json
@@ -13,10 +13,14 @@
"Credential updated" : "Prisijungimo duomenys atnaujinti",
"Credential recovered" : "Prisijungimo duomenys atkurti",
"Credential destroyed" : "Prisijungimo duomenys sunaikinti",
+ "Error downloading file, you probably have insufficient permissions" : "Klaida atsisiunčiant failą. Jūs, tikriausiai, neturite pakankamai leidimų",
"Invalid QR code" : "Neteisingas QR kodas",
"Starting export" : "Pradedamas eksportavimas",
"Decrypting credentials" : "Iššifruojami prisijungimo duomenys",
"Done" : "Atlikta",
+ "File read." : "Failas perskaitytas.",
+ "Adding {{credential}}" : "Pridedama {{credential}}",
+ "Added {{credential}}" : "Pridėta {{credential}}",
"Parsed {{num}} credentials, starting to import" : "Prisijungimo duomenys patikrinti, pradedamas importas",
"Importing" : "Importuojama",
"Start import" : "Pradėti importą",
@@ -61,8 +65,9 @@
"Username" : "Naudotojo vardas",
"Repeat password" : "Pakartoti slaptažodį",
"Add tag" : "Pridėti žymę",
+ "Search icons" : "Ieškoti piktogramų",
"Use this icon" : "Naudoti šią piktogramą",
- "This may take a few seconds..." : "Tai gali šiek tiek užtrukti...",
+ "This may take a few seconds…" : "Tai gali šiek tiek užtrukti…",
"Field label" : "Laukelio pavadinimas",
"Field value" : "Laukelio vertė",
"Choose a file" : "Pasirinkti failą",
@@ -116,6 +121,7 @@
"Key size" : "Rakto dydis",
"Save keys" : "Įrašyti raktus",
"Action" : "Veiksmas",
+ "Search users…" : "Ieškoti naudotojų…",
"Missing users? Only users that have vaults are shown." : "Trūksta naudotojų? Yra rodomi tik naudotojai, turintys slėptuves.",
"Uploading" : "Įkeliama",
"User" : "Naudotojas",
diff --git a/l10n/lv.js b/l10n/lv.js
index 1772ca08..295dbf26 100644
--- a/l10n/lv.js
+++ b/l10n/lv.js
@@ -130,6 +130,7 @@ OC.L10N.register(
"Logout" : "Atteikties",
"Donate" : "Ziedot",
"Click here to request it" : "Noklikšķiniet šeit, lai pieprasītu",
+ "Description" : "Apraksts",
"Error while saving field" : "Kļūda, saglabājot lauku",
"You created %1$s" : "Tu izveidoji %1$s",
"You updated %1$s" : "Tu atjaunināji %1$s",
diff --git a/l10n/lv.json b/l10n/lv.json
index a70f5ee2..5d37192c 100644
--- a/l10n/lv.json
+++ b/l10n/lv.json
@@ -128,6 +128,7 @@
"Logout" : "Atteikties",
"Donate" : "Ziedot",
"Click here to request it" : "Noklikšķiniet šeit, lai pieprasītu",
+ "Description" : "Apraksts",
"Error while saving field" : "Kļūda, saglabājot lauku",
"You created %1$s" : "Tu izveidoji %1$s",
"You updated %1$s" : "Tu atjaunināji %1$s",
diff --git a/l10n/nl.js b/l10n/nl.js
index 5b731d74..2d7ac4cc 100644
--- a/l10n/nl.js
+++ b/l10n/nl.js
@@ -77,6 +77,10 @@ OC.L10N.register(
"Search icons" : "Zoek in pictogrammen",
"Upload a custom icon:" : "Upload een eigen pictogram:",
"Use this icon" : "gebruik dit pictogram",
+ "Delete current icon" : "Verwijder huidige pictogram",
+ "Get icon from page" : "Gebruik pictogram van pagina",
+ "This may take a few seconds…" : "Dit kan enige tijd duren...",
+ "There was an error fetching the icon!" : "Er is een fout opgetreden tijdens het ophalen van het pictogram!",
"Selected icon" : "Geselecteerde pictogram",
"Field label" : "Veldlabel",
"Field value" : "Veldwaarde",
@@ -290,6 +294,14 @@ OC.L10N.register(
"Click here to request it" : "Klik hier om het aan te vragen",
"Loading…" : "Laden...",
"Awwhh… credential not found. Maybe it expired" : "Awwhh… inloggegevens niet gevonden. Misschien verliepen ze.",
+ "Compromise!" : "Datalek!",
+ "Compromised!" : "Uitgelekt!",
+ "This password is compromised. You can only remove this warning with changing the password." : "Dit wachtwoord is uitgelekt. Je kunt deze melding alleen verwijderen door je wachtwoord te wijzigen.",
+ "email" : "e-mailadres",
+ "Description" : "Beschrijving",
+ "Url" : "Url",
+ "Custom Search:" : "Maatwerk zoekopdracht:",
+ "Revert to defaults" : "Standaard instellingen herstellen",
"Error while saving field" : "Fout bij opslaan veld",
"A Passman item has been created, modified or deleted" : "Er is een Passman object gemaakt, gewijzigd of verwijderd",
"A Passman item has expired" : "Er is een Passman object vervallen",
diff --git a/l10n/nl.json b/l10n/nl.json
index 5f7434f0..f454c7fd 100644
--- a/l10n/nl.json
+++ b/l10n/nl.json
@@ -75,6 +75,10 @@
"Search icons" : "Zoek in pictogrammen",
"Upload a custom icon:" : "Upload een eigen pictogram:",
"Use this icon" : "gebruik dit pictogram",
+ "Delete current icon" : "Verwijder huidige pictogram",
+ "Get icon from page" : "Gebruik pictogram van pagina",
+ "This may take a few seconds…" : "Dit kan enige tijd duren...",
+ "There was an error fetching the icon!" : "Er is een fout opgetreden tijdens het ophalen van het pictogram!",
"Selected icon" : "Geselecteerde pictogram",
"Field label" : "Veldlabel",
"Field value" : "Veldwaarde",
@@ -288,6 +292,14 @@
"Click here to request it" : "Klik hier om het aan te vragen",
"Loading…" : "Laden...",
"Awwhh… credential not found. Maybe it expired" : "Awwhh… inloggegevens niet gevonden. Misschien verliepen ze.",
+ "Compromise!" : "Datalek!",
+ "Compromised!" : "Uitgelekt!",
+ "This password is compromised. You can only remove this warning with changing the password." : "Dit wachtwoord is uitgelekt. Je kunt deze melding alleen verwijderen door je wachtwoord te wijzigen.",
+ "email" : "e-mailadres",
+ "Description" : "Beschrijving",
+ "Url" : "Url",
+ "Custom Search:" : "Maatwerk zoekopdracht:",
+ "Revert to defaults" : "Standaard instellingen herstellen",
"Error while saving field" : "Fout bij opslaan veld",
"A Passman item has been created, modified or deleted" : "Er is een Passman object gemaakt, gewijzigd of verwijderd",
"A Passman item has expired" : "Er is een Passman object vervallen",
diff --git a/l10n/pl.js b/l10n/pl.js
index 51f345fb..848bbe8d 100644
--- a/l10n/pl.js
+++ b/l10n/pl.js
@@ -77,6 +77,10 @@ OC.L10N.register(
"Search icons" : "Wyszukaj ikony",
"Upload a custom icon:" : "Wyślij niestandardową ikonę:",
"Use this icon" : "Użyj tej ikony",
+ "Delete current icon" : "Usuń aktualną ikonę",
+ "Get icon from page" : "Pobierz ikonę ze strony",
+ "This may take a few seconds…" : "Może to potrwać kilka sekund…",
+ "There was an error fetching the icon!" : "Podczas pobierania ikony wystąpił błąd!",
"Selected icon" : "Wybierz ikonę",
"Field label" : "Pole etykiety",
"Field value" : "Pole wartości",
@@ -290,6 +294,14 @@ OC.L10N.register(
"Click here to request it" : "Kliknij to, aby zażądać tego",
"Loading…" : "Ładowanie…",
"Awwhh… credential not found. Maybe it expired" : "Ups… poświadczenie nie znalezione. Może wygasło.",
+ "Compromise!" : "Kompromis!",
+ "Compromised!" : "Zagrożone!",
+ "This password is compromised. You can only remove this warning with changing the password." : "To hasło jest zagrożone. Możesz usunąć to ostrzeżenie tylko po zmianie hasła.",
+ "email" : "e-mail",
+ "Description" : "Opis",
+ "Url" : "URL",
+ "Custom Search:" : "Niestandardowe wyszukiwanie:",
+ "Revert to defaults" : "Przywróć ustawienia domyślne",
"Error while saving field" : "Błąd podczas zapisywania pola",
"A Passman item has been created, modified or deleted" : "Pozycja Passman została utworzona, zmodyfikowana lub skasowana",
"A Passman item has expired" : "Pozycja Passman wygasła",
diff --git a/l10n/pl.json b/l10n/pl.json
index d548c27b..4fa220cf 100644
--- a/l10n/pl.json
+++ b/l10n/pl.json
@@ -75,6 +75,10 @@
"Search icons" : "Wyszukaj ikony",
"Upload a custom icon:" : "Wyślij niestandardową ikonę:",
"Use this icon" : "Użyj tej ikony",
+ "Delete current icon" : "Usuń aktualną ikonę",
+ "Get icon from page" : "Pobierz ikonę ze strony",
+ "This may take a few seconds…" : "Może to potrwać kilka sekund…",
+ "There was an error fetching the icon!" : "Podczas pobierania ikony wystąpił błąd!",
"Selected icon" : "Wybierz ikonę",
"Field label" : "Pole etykiety",
"Field value" : "Pole wartości",
@@ -288,6 +292,14 @@
"Click here to request it" : "Kliknij to, aby zażądać tego",
"Loading…" : "Ładowanie…",
"Awwhh… credential not found. Maybe it expired" : "Ups… poświadczenie nie znalezione. Może wygasło.",
+ "Compromise!" : "Kompromis!",
+ "Compromised!" : "Zagrożone!",
+ "This password is compromised. You can only remove this warning with changing the password." : "To hasło jest zagrożone. Możesz usunąć to ostrzeżenie tylko po zmianie hasła.",
+ "email" : "e-mail",
+ "Description" : "Opis",
+ "Url" : "URL",
+ "Custom Search:" : "Niestandardowe wyszukiwanie:",
+ "Revert to defaults" : "Przywróć ustawienia domyślne",
"Error while saving field" : "Błąd podczas zapisywania pola",
"A Passman item has been created, modified or deleted" : "Pozycja Passman została utworzona, zmodyfikowana lub skasowana",
"A Passman item has expired" : "Pozycja Passman wygasła",
diff --git a/l10n/pt_BR.js b/l10n/pt_BR.js
index 1397c9bf..0ca8b95a 100644
--- a/l10n/pt_BR.js
+++ b/l10n/pt_BR.js
@@ -79,7 +79,7 @@ OC.L10N.register(
"Use this icon" : "Usar este ícone",
"Delete current icon" : "Excluir o ícone atual",
"Get icon from page" : "Obter ícone da página",
- "This may take a few seconds..." : "Isso pode levar alguns segundos...",
+ "This may take a few seconds…" : "Isso pode levar alguns segundos...",
"There was an error fetching the icon!" : "Houve um erro ao buscar o ícone!",
"Selected icon" : "Ícone selecionado",
"Field label" : "Campo etiqueta",
diff --git a/l10n/pt_BR.json b/l10n/pt_BR.json
index ac11fe65..9011752e 100644
--- a/l10n/pt_BR.json
+++ b/l10n/pt_BR.json
@@ -77,7 +77,7 @@
"Use this icon" : "Usar este ícone",
"Delete current icon" : "Excluir o ícone atual",
"Get icon from page" : "Obter ícone da página",
- "This may take a few seconds..." : "Isso pode levar alguns segundos...",
+ "This may take a few seconds…" : "Isso pode levar alguns segundos...",
"There was an error fetching the icon!" : "Houve um erro ao buscar o ícone!",
"Selected icon" : "Ícone selecionado",
"Field label" : "Campo etiqueta",
diff --git a/l10n/sr.js b/l10n/sr.js
index a32064fd..cceed0a5 100644
--- a/l10n/sr.js
+++ b/l10n/sr.js
@@ -77,6 +77,10 @@ OC.L10N.register(
"Search icons" : "Иконице претраге",
"Upload a custom icon:" : "Отпреми произвољну иконицу:",
"Use this icon" : "Користи ову икону",
+ "Delete current icon" : "Обриши тренутну иконицу",
+ "Get icon from page" : "Узми иконицу са стране",
+ "This may take a few seconds…" : "Ово може потрајати пар секунди…",
+ "There was an error fetching the icon!" : "Грешка приликом дохватања иконице!",
"Selected icon" : "Одабрана икона",
"Field label" : "Поље ознаке",
"Field value" : "Поље вредности",
@@ -290,6 +294,14 @@ OC.L10N.register(
"Click here to request it" : "Кликните овде да их захтевате",
"Loading…" : "Учитавање…",
"Awwhh… credential not found. Maybe it expired" : "Аргхх… акредитиви нису нађени. Можда су истекли",
+ "Compromise!" : "Компромитована!",
+ "Compromised!" : "Компромитована!",
+ "This password is compromised. You can only remove this warning with changing the password." : "Ова лозинка је компромитована. Можете уклонити ово упозорење једино променом лозинке.",
+ "email" : "е-пошта",
+ "Description" : "Опис",
+ "Url" : "Адреса",
+ "Custom Search:" : "Прилагоћена претрага:",
+ "Revert to defaults" : "Ресетуј на подразумевано",
"Error while saving field" : "Грешка приликом чувања поља",
"A Passman item has been created, modified or deleted" : "Ставка Менаџера Лозинки је направљена, измењена или обрисана",
"A Passman item has expired" : "Ставка Менаџера Лозинки је истекла",
diff --git a/l10n/sr.json b/l10n/sr.json
index 07a22ff5..77a0df5f 100644
--- a/l10n/sr.json
+++ b/l10n/sr.json
@@ -75,6 +75,10 @@
"Search icons" : "Иконице претраге",
"Upload a custom icon:" : "Отпреми произвољну иконицу:",
"Use this icon" : "Користи ову икону",
+ "Delete current icon" : "Обриши тренутну иконицу",
+ "Get icon from page" : "Узми иконицу са стране",
+ "This may take a few seconds…" : "Ово може потрајати пар секунди…",
+ "There was an error fetching the icon!" : "Грешка приликом дохватања иконице!",
"Selected icon" : "Одабрана икона",
"Field label" : "Поље ознаке",
"Field value" : "Поље вредности",
@@ -288,6 +292,14 @@
"Click here to request it" : "Кликните овде да их захтевате",
"Loading…" : "Учитавање…",
"Awwhh… credential not found. Maybe it expired" : "Аргхх… акредитиви нису нађени. Можда су истекли",
+ "Compromise!" : "Компромитована!",
+ "Compromised!" : "Компромитована!",
+ "This password is compromised. You can only remove this warning with changing the password." : "Ова лозинка је компромитована. Можете уклонити ово упозорење једино променом лозинке.",
+ "email" : "е-пошта",
+ "Description" : "Опис",
+ "Url" : "Адреса",
+ "Custom Search:" : "Прилагоћена претрага:",
+ "Revert to defaults" : "Ресетуј на подразумевано",
"Error while saving field" : "Грешка приликом чувања поља",
"A Passman item has been created, modified or deleted" : "Ставка Менаџера Лозинки је направљена, измењена или обрисана",
"A Passman item has expired" : "Ставка Менаџера Лозинки је истекла",
diff --git a/l10n/tr.js b/l10n/tr.js
index 9ea671a8..7b84cfe3 100644
--- a/l10n/tr.js
+++ b/l10n/tr.js
@@ -79,7 +79,7 @@ OC.L10N.register(
"Use this icon" : "Bu simge kullanılsın",
"Delete current icon" : "Geçerli simgeyi sil",
"Get icon from page" : "Simge sayfadan alınsın",
- "This may take a few seconds..." : "Bu işlem bir kaç saniye sürebilir...",
+ "This may take a few seconds…" : "Bu işlem bir kaç saniye sürebilir…",
"There was an error fetching the icon!" : "Simge alınırken bir sorun çıktı!",
"Selected icon" : "Seçilmiş simge",
"Field label" : "Alan Etiketi",
diff --git a/l10n/tr.json b/l10n/tr.json
index e7422070..3cde3837 100644
--- a/l10n/tr.json
+++ b/l10n/tr.json
@@ -77,7 +77,7 @@
"Use this icon" : "Bu simge kullanılsın",
"Delete current icon" : "Geçerli simgeyi sil",
"Get icon from page" : "Simge sayfadan alınsın",
- "This may take a few seconds..." : "Bu işlem bir kaç saniye sürebilir...",
+ "This may take a few seconds…" : "Bu işlem bir kaç saniye sürebilir…",
"There was an error fetching the icon!" : "Simge alınırken bir sorun çıktı!",
"Selected icon" : "Seçilmiş simge",
"Field label" : "Alan Etiketi",
diff --git a/l10n/zh_CN.js b/l10n/zh_CN.js
index 594c1622..053e4867 100644
--- a/l10n/zh_CN.js
+++ b/l10n/zh_CN.js
@@ -79,7 +79,7 @@ OC.L10N.register(
"Use this icon" : "使用这个图标",
"Delete current icon" : "删除当前图标",
"Get icon from page" : "从页面获取图标",
- "This may take a few seconds..." : "此操作可能需要花费几秒钟 ...",
+ "This may take a few seconds…" : "此操作可能需要花费几秒钟 ...",
"There was an error fetching the icon!" : "获取图标出错",
"Selected icon" : "选定的图标",
"Field label" : "字段标签",
diff --git a/l10n/zh_CN.json b/l10n/zh_CN.json
index cd39da86..8cbe753b 100644
--- a/l10n/zh_CN.json
+++ b/l10n/zh_CN.json
@@ -77,7 +77,7 @@
"Use this icon" : "使用这个图标",
"Delete current icon" : "删除当前图标",
"Get icon from page" : "从页面获取图标",
- "This may take a few seconds..." : "此操作可能需要花费几秒钟 ...",
+ "This may take a few seconds…" : "此操作可能需要花费几秒钟 ...",
"There was an error fetching the icon!" : "获取图标出错",
"Selected icon" : "选定的图标",
"Field label" : "字段标签",