<!doctypehtml><html dir=ltr xmlns=http://www.w3.org/1999/xhtml><head lang=en><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta content="text/html; charset=utf-8"http-equiv=Content-Type><meta name=viewport content="user-scalable=1,initial-scale=1,minimum-scale=1,maximum-scale=1"><meta name=format-detection content="telephone=no"><meta name=robots content=noindex,nofollow><link rel=manifest href={{{domainurl}}}manifest.json><link rel="shortcut icon"href={{{domainurl}}}favicon.ico><link rel=icon type=image/png sizes=16x16 href={{{domainurl}}}favicon-16x16.png><link rel=icon type=image/png sizes=32x32 href={{{domainurl}}}favicon-32x32.png><link rel=apple-touch-icon href=/favicon-303x303.png><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-status-bar-style content=#ffffff><meta name=apple-mobile-web-app-title content={{{title}}}><script src=scripts/common-0.0.1{{min}}.js></script><script src=scripts/u2f-api{{min}}.js></script><meta name=msapplication-TileColor content=#00aba9><meta name=theme-color content=#ffffff><title>{{{title}}} - Login</title><style>a{color:#036;text-decoration:underline}#footer a{color:#fff;text-decoration:underline}#footer a:hover{color:#fff;text-decoration:none}</style><body onload='"undefined"!=typeof startup&&startup()'style="overflow-y:hidden;margin:0;padding:0;border:0;color:#000;font-size:13px;font-family:\'Trebuchet MS\',Arial,Helvetica,sans-serif"><div id=container><div id=mastheadx></div><div id=masthead style="background:url(logo.png) 0 0;background-size:341px 50px;background-color:#036;background-repeat:no-repeat;height:50px;width:100%;overflow:hidden"><div style=float:left;height:66px;color:#c8c8c8;padding-left:10px;padding-top:6px><strong><font style=font-size:36px;font-family:Arial,Helvetica,sans-serif>{{{title}}}</font></strong></div><div style=float:left;height:66px;color:#c8c8c8;padding-left:5px;padding-top:10px><strong><font style=font-size:12px;font-family:Arial,Helvetica,sans-serif>{{{title2}}}</font></strong></div></div><div id=page_content style=overflow-y:scroll;position:absolute;bottom:32px;top:50px;width:100%;display:flex;align-items:center><div id=column_l style=padding:10px;width:100%><table style=width:100%><tr><td align=center><div id=loginpanel style=background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;clear:both;display:none><form method=post><input type=hidden name=action value=login><div id=message1></div><div><b>Kirjaudu sisään</b></div><table><tr><td id=loginusername align=right width=100>Käyttäjätunnus:<td><input id=username autocomplete=username maxlength=64 name=username onchange=validateLogin(1) onkeyup=validateLogin(1,event)><tr><td align=right>Salasana:<td><input id=password type=password autocomplete=current-password maxlength=256 name=password onchange=validateLogin(2) onkeyup=validateLogin(2,event)><tr><td><div id=showPassHintLink style=display:none><a onclick=showPassHint() style=cursor:pointer>Näytä vihje</a></div><td align=right><input id=loginButton type=submit value="Kirjaudu sisään"disabled></table><div id=hrAccountDiv style=display:none><hr></div><div id=resetAccountDiv style=display:none;padding:2px><span id=resetAccountSpan>Unohditko käyttäjätunnuksen/salasanan?</span> <a onclick=xgo(3) style=cursor:pointer>Nollaa tili</a>.</div><div id=newAccountDiv style=display:none;padding:2px>Eikö sinulla ole tiliä? <a onclick=xgo(2) style=cursor:pointer>Luo yksi</a>.</div><input id=loginformargs name=urlargs type=hidden><div id=authStrategies style=display:none><hr><div style=margin-bottom:8px>Kirjaudu sisään käyttämällä olemassa olevaa tiliä</div><a id=auth-twitter href=auth-twitter style=display:none><img src=images/login/twitter32.png loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjautuminen Twitterillä"></a><a id=auth-google href=auth-google style=display:none><img src=images/login/google32.png loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjautuminen Googlella"></a><a id=auth-github href=auth-github style=display:none><img src=images/login/github32.png loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjautuminen GitHubilla"></a><a id=auth-reddit href=auth-reddit style=display:none><img src=images/login/reddit32.png loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjautuminen Redditin avulla"></a><a id=auth-azure href=auth-azure style=display:none><img src=images/login/azure32.png loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjautuminen Azuren avulla"></a><a id=auth-oidc href=auth-oidc style=display:none><img src=images/login/oidc32.png loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjaudu sisään OpenID Connectilla"></a><a id=auth-jumpcloud href=auth-jumpcloud style=display:none><img src=images/login/jumpcloud32.png loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjautuminen JumpCloudilla"></a><a id=auth-intel href=auth-intel style=display:none><img src=images/login/intel32.png loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title="Kirjautuminen Intelin avulla"></a><a id=auth-saml href=auth-saml style=display:none><img src=images/login/generic32.png loading=lazy width=32 height=32 style="margin-left:3px;margin-right:3px;border-radius:3px;box-shadow:2px 2px 5px #000;cursor:pointer"title=Kertakirjautuminen></a></div></form></div><div id=createpanel style=display:none><div style=background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;clear:both;position:relative><form method=post><input type=hidden name=action value=createaccount><div id=message2></div><div><b>Tilin luominen</b></div><div id=passwordPolicyCallout style="left:-5px;top:10px;width:100px;position:absolute;background-color:#ffc;border-radius:5px;padding:5px;box-shadow:0 0 15px #666;font-size:10px"></div><table><tr id=nuUserRow><td align=right width=100>Käyttäjätunnus:<td><input id=ausername autocomplete=username name=username onchange=validateCreate(1) maxlength=64 onkeydown=haltReturn(event) onkeyup=validateCreate(1,event)><tr><td align=right width=100>Sähköposti:<td><input id=aemail autocomplete=email inputmode=email name=email onchange=validateCreate(2) maxlength=256 onkeydown=haltReturn(event) onkeyup=validateCreate(2,event)><tr><td align=right>Salasana:<td><input id=apassword1 type=password autocomplete=current-password name=password1 maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(3) onkeyup=validateCreate(3,event)><tr><td align=right>Salasana:<td><input id=apassword2 type=password autocomplete=current-password name=password2 maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(4) onkeyup=validateCreate(4,event)><tr id=createPanelHint style=display:none><td align=right>Salasana vihje:<td><input id=apasswordhint name=apasswordhint autocomplete=off maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(5) onkeyup=validateCreate(5,event)><tr id=newAccountPass title="Anna tilin luontitunnus"><td align=right>Luontitunnus:<td><input id=anewaccountpass type=password name=anewaccountpass autocomplete=off maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(6) onkeyup=validateCreate(6,event)><tr id=newAccountCaptchaImg title="CAPTCHA image"><td><td colspan=2><img src={{{newAccountCaptchaImage}}} loading=lazy><tr id=newAccountCaptcha title="Security check"><td id=nuCaptcha align=right>Security Check:<td><input id=anewaccountcaptcha name=anewaccountcaptcha {{{autocomplete}}}=off maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(7,event) onkeyup=validateCreate(7,event)><tr><td colspan=2><div style=float:right><input id=createButton type=submit value="Luo käyttäjätunnus"disabled></div><div id=passWarning style=padding-top:6px></div></table><hr><a onclick=xgo(1) style=cursor:pointer>Takaisin sisäänkirjautumiseen</a> <input id=createformargs name=urlargs type=hidden> <input id=createformcaptcha name=captchaargs type=hidden value={{{newAccountCaptcha}}}></form></div></div><div id=resetpanel style=background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;display:none;clear:both><form method=post><input type=hidden name=action value=resetaccount><div id=message3></div><div><b>Tilin palautus</b></div><table><tr><td align=right width=100>Sähköposti:<td><input id=remail inputmode=email autocomplete=email name=email maxlength=256 onchange=validateReset() onkeyup=validateReset(event)><tr><td colspan=2><div style=float:right><input id=eresetButton type=submit value="Nollaa Tili"disabled></div><div id=passWarning style=padding-top:6px></div></table><hr><a onclick=xgo(1) style=cursor:pointer>Takaisin sisäänkirjautumiseen</a> <input id=resetformargs name=urlargs type=hidden></form></div><div id=tokenpanel style=background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;display:none;clear:both><form method=post autocomplete=off><input type=hidden name=action value=tokenlogin> <input type=hidden name=hwstate value={{{hwstate}}}><div id=message4></div><table><tr><td align=right width=100>Kirjautumistunnus:<td><input id=tokenInput autocomplete=one-time-code inputmode=numeric name=token maxlength=50 onchange=checkToken(event) onkeyup=checkToken(event) onkeydown=checkToken(event) onfocus=checkTokenTimer(1) onblur=checkTokenTimer(0)> <input id=hwtokenInput name=hwtoken style=display:none><tr><td colspan=2 style=align-content:center><label id=tokenInputRememberLabel><input id=tokenInputRemember name=remembertoken type=checkbox><span id=tokenInputRememberSpan></span></label><tr><td colspan=2><div style=float:right><input id=tokenOkButton type=submit value="Kirjaudu sisään"disabled></div><div style=float:right><input style=display:none;float:right id=securityKeyButton type=button value="Käytä suojausavainta"onclick=useSecurityKey()> <input style=display:none;float:right id=emailKeyButton type=button value=Sähköposti onclick=useEmailToken()> <input style=display:none;float:right id=smsKeyButton type=button value=Tekstiviesti onclick=useSMSToken()></div></table><hr><a onclick=xgo(1) style=cursor:pointer>Takaisin sisäänkirjautumiseen</a> <input id=tokenformargs name=urlargs type=hidden></form></div><div id=resettokenpanel style=background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;display:none;clear:both><form method=post autocomplete=off><input type=hidden name=action value=resetaccount><div id=message5></div><table><tr><td align=right width=100>Kirjautumistunnus:<td><input id=resetTokenInput name=token maxlength=50 onchange=resetCheckToken(event) onpaste=resetCheckToken(event) onkeyup=resetCheckToken(event) onkeydown=resetCheckToken(event)> <input id=resetHwtokenInput name=hwtoken style=display:none><tr><td colspan=2><div style=float:right><input id=resetTokenOkButton type=submit value="Kirjaudu sisään"disabled></div></table><hr><a onclick=xgo(1) style=cursor:pointer>Takaisin sisäänkirjautumiseen</a> <input id=resettokenformargs name=urlargs type=hidden></form></div><div id=resetpasswordpanel style=position:relative;background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none><form method=post><input type=hidden name=action value=resetpassword><div id=message6></div><div id=rpasswordPolicyCallout style="left:-10px;width:100px;display:none;position:absolute;background-color:#ffc;border-radius:5px;padding:5px;box-shadow:0 0 15px #666;font-size:10px"></div><table><tr><td id=rnuPass1 width=100 align=right>Salasana:<td><input id=rapassword1 type=password name=rpassword1 autocomplete=off maxlength=256 onkeydown=haltReturn(event) onchange=validatePassReset(3,event) onkeyup=validatePassReset(3,event)><tr><td id=rnuPass2 align=right>Salasana:<td><input id=rapassword2 type=password name=rpassword2 autocomplete=off maxlength=256 onkeydown=haltReturn(event) onchange=validatePassReset(4,event) onkeyup=validatePassReset(4,event)><tr id=resetpasswordpanelHint style=display:none><td id=rnuHint align=right>Salasana Vihje:<td><input id=rapasswordhint name=rpasswordhint autocomplete=off maxlength=256 onkeydown=haltReturn(event) onchange=validatePassReset(5,event) onkeyup=validatePassReset(5,event)><tr><td colspan=2><div style=float:right><input id=resetPassButton type=submit value="Nollaa Salasana"disabled></div><div id=rpassWarning style=padding-top:6px></div></table><hr><a onclick=xgo(1) style=cursor:pointer>Takaisin sisäänkirjautumiseen</a> <input id=resetpasswordformargs name=urlargs type=hidden></form></div><div id=checkemailpanel style=position:relative;background-color:#979797;border-radius:16px;width:300px;padding:16px;text-align:center;display:none><form method=post><input type=hidden name=action value=checkemail><div id=message7></div><table id=checkCheckOperations style=width:100%;display:none><tr><td><div id=unconfirmedEmail></div><br><tr><td><div><input id=changeEmailButton type=button value="Vaihda sähköpostiosoite"onclick=changeEmailAddress()> <input id=checkEmailButton2 type=button value="Lähetä vahvistussähköposti uudelleen"onclick=resentEmailConfirmation()> <input id=checkEmailButton type=submit style=display:none> <input id=checkEmailVal name=email type=hidden></div></table><hr><a onclick="return xgo(1,event)"href=# style=cursor:pointer>Takaisin sisäänkirjautumiseen</a> <input id=checkemailformargs name=urlargs type=hidden></form></div></table></div></div><div id=footer style=height:32px;width:100%;text-align:center;background-color:#113962;position:absolute;bottom:0><table cellpadding=0 cellspacing=6 style=width:100%><tr><td style=text-align:left;color:#fff>{{{footer}}}<td style=text-align:right>{{{rootCertLink}}}&nbsp;<a href=terms>Ehdot ja yksityisyys</a></table></div></div><div id=dialog style="z-index:1000;background-color:#eee;box-shadow:0 0 15px #666;font-family:Arial,Helvetica,sans-serif;border-radius:5px;position:fixed;top:180px;width:300px;display:none"><div style="width:100%;background-color:#036;color:#fff;border-radius:5px 5px 0 0"><div id=id_dialogclose style=float:right;padding:5px;cursor:pointer onclick=setDialogMode()><b>X</b></div><div id=id_dialogtitle style=padding:5px></div><div style=width:100%;margin:6px></div></div><div style=margin-right:16px;margin-left:8px><div id=dialog1 style=margin:auto;text-align:center;margin:3px><div id=id_dialogMessage style=padding:10px></div></div><div id=dialog2 style=margin:auto;margin:3px><div id=id_dialogOptions></div></div></div><div id=idx_dlgButtonBar style=padding:10px;margin-bottom:20px><input id=idx_dlgCancelButton type=button value=Peruuta style=float:right;width:80px;margin-left:5px onclick=dialogclose(0)> <input id=idx_dlgOkButton type=button value=OK style=float:right;width:80px onclick=dialogclose(1)></div></div><script>"use strict";var urlargs,random="{{{randomlength}}}",loginMode="{{{loginmode}}}",newAccount="{{{newAccount}}}",passhint="{{{passhint}}}",newAccountPass=parseInt("{{{newAccountPass}}}"),newAccountCaptcha="{{{newAccountCaptcha}}}",emailCheck="{{{emailcheck}}}",features=parseInt("{{{features}}}"),passRequirements="{{{passRequirements}}}",passRequirementsEx=null!=(passRequirements=""!=passRequirements?JSON.parse(decodeURIComponent(passRequirements)):{}).min||null!=passRequirements.max||null!=passRequirements.upper||null!=passRequirements.lower||null!=passRequirements.numeric||null!=passRequirements.nonalpha,hardwareKeyChallenge=decodeURIComponent("{{{hkey}}}"),publicKeyCredentialRequestOptions=null,currentpanel=0,otpemail=!1,otpsms=!1,autofido="true"===decodeURIComponent("{{{autofido}}}"),twoFactorCookieDays=parseInt("{{{twoFactorCookieDays}}}"),authStrategies="{{{authStrategies}}}".split(","),tokenTimeout=parseInt("{{{tokenTimeout}}}"),messageid=parseInt("{{{messageid}}}"),okmessages=["","Salasanan nollaus viesti lähetetty, jos sähköposti osoite on kelvollinen.","Sähköposti lähetetty.","Sähköposti vahvistus vaaditaan, tarkista postilaatikkosi ja napsauta vahvistuslinkkiä.","Tekstiviesti lähetetty."],failmessages=["Tiliä ei voitu luoda.","Tiliraja saavutettu.","Olemassa oleva tili tällä sähköpostiosoitteella.","Virheellinen tilin luontitunnus.","Käyttäjätunnus on jo olemassa.","Salasana hylätty, käytä toista salasanaa.","Virheellinen sähköpostiosoite.","Tiliä ei löytynyt.","Virheellinen tunnus, yritä uudelleen.","Sähköpostin lähettäminen epäonnistui.","Tili lukittu","Pääsy evätty.","Sisäänkirjautuminen epäonnistui, tarkista käyttäjänimi ja salasana.","Salasanan vaihtoa pyydetty.","IP-osoite estetty, yritä myöhemmin uudelleen.","Palvelinta ylläpidetään.","Laiteilmoituksen lähettäminen ei onnistu.","Invalid security check."];if(0<messageid){var msg="";if(messageid<100&&messageid<okmessages.length?msg=okmessages[messageid]:100<=messageid&&messageid-100<failmessages.length&&(msg=failmessages[messageid-100]),""!=msg)for(var msg=100<=messageid?'<span class="msg error"><b style=color:#8C001A>'+msg+"<b></span><br /><br />":'<span class="msg success"><b>'+msg+"</b></span><br /><br />",i=1;i<8;i++)QH("message"+i,msg)}function startup(){if(0==(32&features)){var e=null;try{e=top.location.toString().toLowerCase()}catch(e){}if(top!=self&&(null==e||0==top.active))return void(top.location=self.location)}if(2097152&features&&(QH("loginusername","Sähköposti:"),QH("resetAccountSpan","Unohtuiko salasana?"),QV("nuUserRow",!1)),QV("createPanelHint",!0===passRequirements.hint),QV("resetpasswordpanelHint",!0===passRequirements.hint),""!=authStrategies&&(QV("authStrategies",!0),0<=authStrategies.indexOf("twitter")&&QV("auth-twitter",!0),0<=authStrategies.indexOf("google")&&QV("auth-google",!0),0<=authStrategies.indexOf("github")&&QV("auth-github",!0),0<=authStrategies.indexOf("reddit")&&QV("auth-reddit",!0),0<=authStrategies.indexOf("azure")&&QV("auth-azure",!0),0<=authStrategies.indexOf("oidc")&&QV("auth-oidc",!0),0<=authStrategies.indexOf("jumpcloud")&&QV("auth-jumpcloud",!0),0<=authStrategies.indexOf("intel")&&QV("auth-intel",!0),0<=authStrategies.indexOf("saml"))&&QV("auth-saml",!0),(window.onresize=center)(),validateLogin(),validateCreate(),0!=loginMode.length?go(parseInt(loginMode)):go(1),QV("newAccountDiv","1"===newAccount||"true"===newAccount),!0===passRequirements.hint&&null!=passhint&&0<passhint.length&&QV("showPassHintLink",!0),QV("newAccountPass",1==newAccountPass),QV("newAccountCaptcha",""!=newAccountCaptcha),QV("newAccountCaptchaImg",""!=newAccountCaptcha),QV("resetAccountDiv","true"==emailCheck),QV("hrAccountDiv","true"==emailCheck||1==newAccountPass),"4"==loginMode){0<tokenTimeout&&setTimeout(function(){Q("hwtokenInput").value="**timeout**",QE("tokenOkButton",!0),Q("tokenOkButton").click()},tokenTimeout);try{hardwareKeyChallenge=0<hardwareKeyChallenge.length?JSON.parse(hardwareKeyChallenge):null}catch(e){hardwareKeyChallenge=null}var a=null!=hardwareKeyChallenge&&"webAuthn"==hardwareKeyChallenge.type;QV("securityKeyButton",a),QV("emailKeyButton",otpemail&&2!=messageid&&4!=messageid),QV("smsKeyButton",otpsms&&2!=messageid&&4!=messageid),autofido&&a&&setTimeout(function(){useSecurityKey(1)},300)}if("5"==loginMode){0<tokenTimeout&&setTimeout(function(){Q("hwtokenInput").value="**timeout**",QE("tokenOkButton",!0),Q("tokenOkButton").click()},tokenTimeout);try{hardwareKeyChallenge=0<hardwareKeyChallenge.length?JSON.parse(hardwareKeyChallenge):null}catch(e){hardwareKeyChallenge=null}if(a=null!=hardwareKeyChallenge&&"webAuthn"==hardwareKeyChallenge.type){"string"==typeof hardwareKeyChallenge.challenge&&(hardwareKeyChallenge.challenge=Uint8Array.from(atob(hardwareKeyChallenge.challenge),function(e){return e.charCodeAt(0)}).buffer),publicKeyCredentialRequestOptions={challenge:hardwareKeyChallenge.challenge,allowCredentials:[],timeout:hardwareKeyChallenge.timeout};for(var t=0;t<hardwareKeyChallenge.keyIds.length;t++)publicKeyCredentialRequestOptions.allowCredentials.push({id:Uint8Array.from(atob(hardwareKeyChallenge.keyIds[t]),function(e){return e.charCodeAt(0)}),type:"public-key",transports:["usb","ble","nfc","internal"]});navigator.credentials.get({publicKey:publicKeyCredentialRequestOptions}).then(function(e){e={id:btoa(String.fromCharCode.apply(null,new Uint8Array(e.rawId))),clientDataJSON:btoa(String.fromCharCode.apply(null,new Uint8Array(e.response.clientDataJSON))),userHandle:btoa(String.fromCharCode.apply(null,new Uint8Array(e.response.userHandle))),signature:btoa(String.fromCharCode.apply(null,new Uint8Array(e.response.signature))),authenticatorData:btoa(String.fromCharCode.apply(null,new Uint8Array(e.response.authenticatorData)))};Q("resetHwtokenInput").value=JSON.stringify(e),QE("resetTokenOkButton",!0),Q("resetTokenOkButton").click()},function(e){console.log("credentials-get error",e)})}}}function useSecurityKey(){if(!xxdialogMode&&null!=hardwareKeyChallenge&&"webAuthn"==hardwareKeyChallenge.type){"string"==typeof hardwareKeyChallenge.challenge&&(hardwareKeyChallenge.challenge=Uint8Array.from(atob(hardwareKeyChallenge.challenge),function(e){return e.charCodeAt(0)}).buffer),publicKeyCredentialRequestOptions={challenge:hardwareKeyChallenge.challenge,allowCredentials:[],timeout:hardwareKeyChallenge.timeout};for(var e=0;e<hardwareKeyChallenge.keyIds.length;e++)publicKeyCredentialRequestOptions.allowCredentials.push({id:Uint8Array.from(atob(hardwareKeyChallenge.keyIds[e]),function(e){return e.charCodeAt(0)}),type:"public-key",transports:["usb","ble","nfc","internal"]});navigator.credentials.get({publicKey:publicKeyCredentialRequestOptions}).then(function(e){e={id:btoa(String.fromCharCode.apply(null,new Uint8Array(e.rawId))),clientDataJSON:btoa(String.fromCharCode.apply(null,new Uint8Array(e.response.clientDataJSON))),userHandle:btoa(String.fromCharCode.apply(null,new Uint8Array(e.response.userHandle))),signature:btoa(String.fromCharCode.apply(null,new Uint8Array(e.response.signature))),authenticatorData:btoa(String.fromCharCode.apply(null,new Uint8Array(e.response.authenticatorData)))};Q("hwtokenInput").value=JSON.stringify(e),QE("tokenOkButton",!0),Q("tokenOkButton").click()},function(e){console.log("credentials-get error",e)})}}function useEmailToken(){xxdialogMode||1==otpemail&&setDialogMode(1,"Suojattu kirjautuminen",3,useEmailKeyEx,"Lähetetäänkö tunnus rekisteröityyn sähköpostiosoitteeseen?")}function useEmailKeyEx(){Q("hwtokenInput").value="**email**",QE("tokenOkButton",!0),Q("tokenOkButton").click()}function useSMSToken(){1==otpsms&&setDialogMode(1,"Suojattu kirjautuminen",3,useSMSTokenEx,"Lähetetäänkö tunnus rekisteröityyn puhelinnumeroon?")}function useSMSTokenEx(){Q("hwtokenInput").value="**sms**",QE("tokenOkButton",!0),Q("tokenOkButton").click()}function showPassHint(){!0===passRequirements.hint&&messagebox("Salasana Vihje",passhint)}function xgo(e){QV("message1",!1),QV("message2",!1),QV("message3",!1),QV("message4",!1),QV("message5",!1),QV("message6",!1),QV("message7",!1),go(e)}function go(e){currentpanel=e,setDialogMode(0),QV("showPassHintLink",!1),QV("loginpanel",1==e),QV("createpanel",2==e),QV("resetpanel",3==e),QV("tokenpanel",4==e),QV("resettokenpanel",5==e),QV("resetpasswordpanel",6==e),QV("checkemailpanel",7==e),1==e&&Q("username").focus(),2==e&&(2097152&features?Q("aemail"):Q("ausername")).focus(),3==e&&Q("remail").focus(),4==e&&Q("tokenInput").focus(),5==e&&Q("resetTokenInput").focus(),6==e&&Q("rapassword1").focus(),7==e&&(QH("unconfirmedEmail",passhint),QV("checkCheckOperations",""!=Q("unconfirmedEmail").innerHTML),QH("checkEmailVal",passhint))}function validateLogin(e,a){var t=0<Q("username").value.length&&-1==Q("username").value.indexOf(" ")&&0<Q("password").value.length;QE("loginButton",t),setDialogMode(0),null!=a&&13==a.keyCode&&(1==e?Q("password").focus():2==e&&Q("loginButton").click()),null!=a&&haltEvent(a)}function validateCreate(e,a){setDialogMode(0);var t,n=!1,n=!!(2097152&features)||0<Q("ausername").value.length&&-1==Q("ausername").value.indexOf(" ")&&-1==Q("ausername").value.indexOf('"')&&-1==Q("ausername").value.indexOf(",");n&=1==validateEmail(Q("aemail").value)&&0<Q("apassword1").value.length&&Q("apassword2").value==Q("apassword1").value,1==newAccountPass&&0==Q("anewaccountpass").value.length&&(n=!1),""==Q("apassword1").value?(QH("passWarning",""),QV("passwordPolicyCallout",!1)):passRequirementsEx?0==checkPasswordRequirements(Q("apassword1").value,passRequirements)?(n=!1,QH("passWarning","<span style=color:red><b>Salasana käytäntö</b><span>"),QV("passwordPolicyCallout",!0),QH("passwordPolicyCallout",passwordPolicyText(Q("apassword1").value))):(QH("passWarning",""),QV("passwordPolicyCallout",!1)):80<=(t=checkPasswordStrength(Q("apassword1").value))?QH("passWarning","<span style=color:green><b>Vahva Salasana</b><span>"):60<=t?QH("passWarning","<span style=color:blue><b>Hyvä salasana</b><span>"):QH("passWarning","<span style=color:red><b>Heikko Salasana</b><span>"),QE("createButton",n),null!=a&&13==a.keyCode&&(1==e&&Q("aemail").focus(),2==e&&Q("apassword1").focus(),3==e&&Q("apassword2").focus(),4==e&&Q("apasswordhint").focus(),5==e&&(1==newAccountPass?Q("anewaccountpass").focus():e=6),6==e&&(""!=newAccountCaptcha?Q("anewaccountcaptcha").focus():e=7),7==e)&&Q("createButton").click(),null!=a&&haltEvent(a)}function validatePassReset(e,a){setDialogMode(0);var t=0<Q("rapassword1").value.length,n=0<Q("rapassword2").value.length&&Q("rapassword2").value==Q("rapassword1").value,s=t&&n;QS("rnuPass1").color=t?"black":"#7b241c",QS("rnuPass2").color=n?"black":"#7b241c",""==Q("rapassword1").value?(QH("rpassWarning",""),QV("rpasswordPolicyCallout",!1)):passRequirementsEx?0==checkPasswordRequirements(Q("rapassword1").value,passRequirements)?(s=!1,QS("rnuPass1").color="#7b241c",QS("rnuPass2").color="#7b241c",QH("rpassWarning","<div style=color:red;cursor:pointer onclick=showPasswordPolicy()><b>Salasana käytäntö</b><div>"),QV("rpasswordPolicyCallout",!0),QH("rpasswordPolicyCallout",passwordPolicyText(Q("rapassword1").value))):(QH("rpassWarning",""),QV("rpasswordPolicyCallout",!1)):80<=(t=checkPasswordStrength(Q("rapassword1").value))?QH("rpassWarning","<span style=color:green><b>Vahva Salasana</b><span>"):60<=t?QH("rpassWarning","<span style=color:blue><b>Hyvä salasana</b><span>"):QH("rpassWarning","<span style=color:red><b>Heikko Salasana</b><span>"),null!=a&&13==a.keyCode&&(2==e&&Q("rapassword1").focus(),3==e&&Q("rapassword2").focus(),4==e&&Q("rapasswordhint").focus(),6==e)&&Q("resetPassButton").click(),null!=a&&haltEvent(a),QE("resetPassButton",s)}function validateReset(e){setDialogMode(0);var a=validateEmail(Q("remail").value);QE("eresetButton",a),null!=e&&13==e.keyCode&&1==a&&Q("eresetButton").click(),null!=e&&haltEvent(e)}function passwordPolicyText(e){var a="<div style=text-align:left>",t=strCount(e);return passRequirements.min&&(null==e||e.length<passRequirements.min)&&(a+=format("Vähimmäispituus {0}",passRequirements.min)+"<br />"),passRequirements.max&&(null==e||e.length>passRequirements.max)&&(a+=format("Enimmäispituus {0}",passRequirements.max)+"<br />"),passRequirements.upper&&(null==e||t.upper<passRequirements.upper)&&(a+=format("{0} isot kirjaimet",passRequirements.upper)+"<br />"),passRequirements.lower&&(null==e||t.lower<passRequirements.lower)&&(a+=format("{0} pienet kirjaimet",passRequirements.lower)+"<br />"),passRequirements.numeric&&(null==e||t.numeric<passRequirements.numeric)&&(a+=format("{0} numeerinen",passRequirements.numeric)+"<br />"),passRequirements.nonalpha&&(null==e||t.nonalpha<passRequirements.nonalpha)&&(a+=format("{0} ei-aakkosnumeerinen",passRequirements.nonalpha)+"<br />"),a+="</div>"}function checkPasswordStrength(e){var a=0,t={},n=0,s={digits:/\d/.test(e),lower:/[a-z]/.test(e),upper:/[A-Z]/.test(e),nonWords:/\W/.test(e)};if(!e)return 0;for(var o,l=0;l<e.length;l++)t[e[l]]=(t[e[l]]||0)+1,a+=5/t[e[l]];for(o in s)n+=1==s[o]?1:0;return parseInt(a+10*(n-1))}function checkPasswordRequirements(e,a){return null==a||""==a||"object"!=typeof a||!(a.min&&e.length<a.min||a.max&&e.length>a.max||(e=strCount(e),a.numeric&&e.numeric<a.numeric)||a.lower&&e.lower<a.lower||a.upper&&e.upper<a.upper||a.nonalpha&&e.nonalpha<a.nonalpha)}function strCount(e){var a={numeric:0,lower:0,upper:0,nonalpha:0};if("string"==typeof e)for(var t=0;t<e.length;t++)/\d/.test(e[t])&&a.numeric++,/[a-z]/.test(e[t])&&a.lower++,/[A-Z]/.test(e[t])&&a.upper++,/\W/.test(e[t])&&a.nonalpha++;return a}0<window.location.href.indexOf("?")&&(urlargs=window.location.href.substring(window.location.href.indexOf("?")),Q("loginformargs").value=urlargs,Q("createformargs").value=urlargs,Q("resetformargs").value=urlargs,Q("tokenformargs").value=urlargs,Q("resettokenformargs").value=urlargs,Q("resetpasswordformargs").value=urlargs),0<twoFactorCookieDays?(QV("tokenInputRememberLabel",!0),QH("tokenInputRememberSpan",format("Muista tämä laite {0} päivän ajan.",twoFactorCookieDays))):QV("tokenInputRememberLabel",!1);var xxdialogMode,xxdialogFunc,xxdialogButtons,xxdialogTag,xcheckTokenTimer=null;function checkTokenTimer(e){0==e&&null!=xcheckTokenTimer&&(clearInterval(xcheckTokenTimer),xcheckTokenTimer=null),1==e&&null==xcheckTokenTimer&&(xcheckTokenTimer=setInterval(checkToken,200))}function checkToken(){var e=Q("tokenInput").value,a=e.split(" ").join("");e!=a&&(Q("tokenInput").value=a),QE("tokenOkButton",6==Q("tokenInput").value.length||8==Q("tokenInput").value.length||44==Q("tokenInput").value.length)}function resetCheckToken(){var e=Q("resetTokenInput").value,a=e.split(" ").join("");e!=a&&(Q("resetTokenInput").value=a),QE("resetTokenOkButton",6==Q("resetTokenInput").value.length||8==Q("resetTokenInput").value.length||44==Q("resetTokenInput").value.length)}function changeEmailAddress(){setDialogMode(1,"Sähköpostivarmistus",3,changeEmailAddressEx,addHtmlValue("Sähköposti",'<input id=dp1email style=width:230px maxlength=256 value="'+Q("unconfirmedEmail").innerHTML+'" autocomplete=off onchange=validateEmailAddress() onkeyup=validateEmailAddress() />')),validateEmailAddress()}function validateEmailAddress(){QE("idx_dlgOkButton",1==validateEmail(Q("dp1email").value))}function changeEmailAddressEx(){Q("checkEmailVal").value=Q("dp1email").value,QH("unconfirmedEmail",Q("dp1email").value),Q("checkEmailButton").click()}function resentEmailConfirmation(){Q("checkEmailVal").value=Q("unconfirmedEmail").innerHTML,Q("checkEmailButton").click()}var xxcurrentView=0;function setDialogMode(e,a,t,n,s,o){xxdialogMode=e,xxdialogFunc=n,xxdialogButtons=t,xxdialogTag=o,QE("idx_dlgOkButton",!0),QV("idx_dlgOkButton",1&t),QV("idx_dlgCancelButton",2&t),QV("id_dialogclose",2&t||8&t),QV("idx_dlgButtonBar",7&t),a&&QH("id_dialogtitle",a);for(var l=1;l<24;l++)QV("dialog"+l,l==e);QV("dialog",e),s&&(2==e?QH("id_dialogOptions",s):QH("id_dialogMessage",s))}function dialogclose(e){var a=xxdialogFunc,t=xxdialogButtons,n=xxdialogTag;setDialogMode(),(8&t||e)&&a&&a(e,n)}function center(){QS("dialog").left=(getDocWidth()-300)/2+"px"}function messagebox(e,a){QH("id_dialogMessage",a),setDialogMode(1,e,1)}function statusbox(e,a){QH("id_dialogMessage",a),setDialogMode(1,e)}function getDocWidth(){return window.innerWidth||(document.documentElement&&document.documentElement.clientWidth&&0!=document.documentElement.clientWidth?document.documentElement:document.getElementsByTagName("body")[0]).clientWidth}function haltEvent(e){return e.preventDefault&&e.preventDefault(),e.stopPropagation&&e.stopPropagation(),!1}function haltReturn(e){13==e.keyCode&&haltEvent(e)}function validateEmail(e){return/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(e)}function format(e){var t=Array.prototype.slice.call(arguments,1);return e.replace(/{(\d+)}/g,function(e,a){return void 0!==t[a]?t[a]:e})}function addHtmlValue(e,a){return"<table><td style=text-align:left>"+e+"<td><b>"+a+"</b></table>"}</script>