diff --git a/src/actions/account.js b/src/actions/account.js index 39f2f76..9c46b6f 100644 --- a/src/actions/account.js +++ b/src/actions/account.js @@ -1,6 +1,5 @@ import { PrivateKey, key, Aes } from 'bitsharesjs'; import * as types from '../mutations'; -// import { getAccountIdByOwnerPubkey, getAccount } from '../services/wallet.js'; import API from '../services/api'; import PersistentStorage from '../services/persistent-storage'; @@ -60,6 +59,129 @@ export const lockWallet = ({ commit }) => { commit(types.ACCOUNT_LOCK_WALLET); }; +export const suggestPassword = API.Account.suggestPassword; + +export const loginWithPassword = async ({ commit }, { name, password }) => { + let {privKey: activeKey} = API.Account.generateKeyFromPassword( + name, + "owner", + password + ); + let {privKey: ownerKey} = API.Account.generateKeyFromPassword( + name, + "active", + password + ); + + const ownerPubkey = ownerKey.toPublicKey().toString(); + const userId = await API.Account.getAccountIdByOwnerPubkey(ownerPubkey); + + const id = userId && userId[0]; + if (id) { + const keys = { + active: activeKey, + owner: ownerKey + } + + const userType = 'password'; + PersistentStorage.saveUserData({ id, userType }); + + commit(types.ACCOUNT_PASSWORD_LOGIN_COMPLETE, { keys, userId: id }); + return { + success: true + }; + } + commit(types.ACCOUNT_LOGIN_ERROR, { error: 'Login error' }); + return { + success: false, + error: 'Invalid username or password' + }; +} + +export const restoreBackup = async ({ commit }, { backup, password }) => { + const restored = await API.Backup.restoreBackup({ backup, password }); + console.log('restored', restored); + if (!restored.success) { + commit(types.ACCOUNT_LOGIN_ERROR, { error: 'Login error' }); + return { success: false, error: restored.error}; + } + + console.log('Restored action', restored); + + const { + wallet: [wallet], + linked_accounts: [ { name }] + } = restored.wallet; + + const passwordAes = Aes.fromSeed(password); + const encryptionPlainbuffer = passwordAes.decryptHexToBuffer(wallet.encryption_key); + const aesPrivate = Aes.fromSeed(encryptionPlainbuffer); + + const brainkey = aesPrivate.decryptHexToText(wallet.encrypted_brainkey); + + const newWallet = createWallet({ password, brainkey }); + + const user = await API.Account.getUser(name) + if (user.success) { + const userType = 'wallet'; + PersistentStorage.saveUserData({ + id: user.data.account.id, + encryptedBrainkey: newWallet.encryptedBrainkey, + encryptionKey: newWallet.encryptionKey, + passwordPubkey: newWallet.passwordPubkey, + userType + }); + + commit(types.ACCOUNT_LOGIN_COMPLETE, { wallet: newWallet, userId: user.data.account.id }); + return { success: true }; + } else { + commit(types.ACCOUNT_LOGIN_ERROR, { error: 'Login error' }); + return { success: false, error: 'No such user' }; + } +} + +export const signupWithPassword = async ({ commit }, { name, password }) => { + let {privKey: activeKey} = API.Account.generateKeyFromPassword( + name, + "owner", + password + ); + let {privKey: ownerKey} = API.Account.generateKeyFromPassword( + name, + "active", + password + ); + + const result = await API.Account.createAccount({ + name, + activeKey, + ownerKey, + }); + + if (result.success) { + const userId = result.id; + const keys = { + active: activeKey, + owner: ownerKey + } + + const userType = 'password'; + PersistentStorage.saveUserData({ + id: userId, + userType + }); + + commit(types.ACCOUNT_PASSWORD_LOGIN_COMPLETE, { keys, userId }); + return { success: true }; + } + + commit(types.ACCOUNT_SIGNUP_ERROR, { error: result.error }); + return { + success: false, + error: result.error + }; +} + /** * Creates account & wallet for user * @param {string} name - user name @@ -81,11 +203,14 @@ export const signup = async (state, { name, password, dictionary, email }) => { const userId = result.id; const wallet = createWallet({ password, brainkey }); commit(types.ACCOUNT_SIGNUP_COMPLETE, { wallet, userId }); + + const userType = 'wallet'; PersistentStorage.saveUserData({ id: userId, encryptedBrainkey: wallet.encryptedBrainkey, encryptionKey: wallet.encryptionKey, - passwordPubkey: wallet.passwordPubkey + passwordPubkey: wallet.passwordPubkey, + userType }); return { success: true }; } @@ -122,11 +247,13 @@ export const login = async (state, { password, brainkey }) => { const userId = await API.Account.getAccountIdByOwnerPubkey(ownerPubkey); const id = userId && userId[0]; if (id) { + const userType = 'wallet'; PersistentStorage.saveUserData({ id, encryptedBrainkey: wallet.encryptedBrainkey, encryptionKey: wallet.encryptionKey, - passwordPubkey: wallet.passwordPubkey + passwordPubkey: wallet.passwordPubkey, + userType }); commit(types.ACCOUNT_LOGIN_COMPLETE, { wallet, userId: id }); return { @@ -179,7 +306,8 @@ export const checkCachedUserData = ({ commit }) => { encryptedBrainkey: data.encryptedBrainkey, encryptionKey: data.encryptionKey, backupDate, - passwordPubkey: data.passwordPubkey + passwordPubkey: data.passwordPubkey, + userType: data.userType }); } }; diff --git a/src/actions/assets.js b/src/actions/assets.js index 5b66f04..88eeba9 100644 --- a/src/actions/assets.js +++ b/src/actions/assets.js @@ -7,7 +7,7 @@ import config from '../../config'; * Fetches assets objects from bitsharesjs-ws * @param {Array} assets - list of assets ids/symbold to fetch */ -export const fetchAssets = async (store, { assets }) => { +export const fetchAssets = async (store, { assets, hidden = false }) => { const { commit, getters } = store; const currentAssetsIds = Object.keys(getters.getAssets); @@ -50,3 +50,11 @@ export const fetchDefaultAssets = async (store) => { commit(types.SAVE_DEFAULT_ASSETS_IDS, { ids }); } }; + +export const hideAsset = async ({ commit }, asset_id) => { + commit(types.HIDE_ASSET, asset_id ); +} + +export const showAsset = async ({ commit }, asset_id) => { + commit(types.SHOW_ASSET, asset_id); +} \ No newline at end of file diff --git a/src/getters/account.js b/src/getters/account.js index 1d5628e..73ae73d 100644 --- a/src/getters/account.js +++ b/src/getters/account.js @@ -9,6 +9,9 @@ export const getBrainkey = state => { }; export const getKeys = state => { + if (state.keys) { + return state.keys; + } const brainkey = getBrainkey(state); if (!brainkey) return null; return { @@ -26,7 +29,7 @@ export const isValidPassword = state => { }; export const isLocked = state => { - return !state.aesPrivate; + return !state.aesPrivate && !state.keys; }; export const getAccountError = state => { @@ -60,3 +63,5 @@ export const getCurrentUserBalances = state => { export const getCurrentUserData = state => { return state.userData; }; + +export const isPasswordLogin = state => state.userType === 'password'; diff --git a/src/getters/assets.js b/src/getters/assets.js index c25b34c..82d2b1c 100644 --- a/src/getters/assets.js +++ b/src/getters/assets.js @@ -21,3 +21,7 @@ export function getAssetById({ assets }) { precision: 1 }); } + +export function getHideList({ hiddenAssetsIds }) { + return hiddenAssetsIds; +} \ No newline at end of file diff --git a/src/modules/account.js b/src/modules/account.js index 1d56fed..222657c 100644 --- a/src/modules/account.js +++ b/src/modules/account.js @@ -8,6 +8,7 @@ const initialState = { encryptedBrainkey: null, brainkeyBackupDate: null, encryptionKey: null, + keys: null, created: null, aesPrivate: null, userId: null, @@ -15,7 +16,8 @@ const initialState = { pending: false, userData: null, userFetching: false, - userError: false + userError: false, + userType: 'wallet', }; const mutations = { @@ -32,6 +34,12 @@ const mutations = { state.created = new Date(); state.userId = userId; }, + [types.ACCOUNT_PASSWORD_LOGIN_COMPLETE]: (state, { keys, userId }) => { + state.pending = false; + state.userId = userId; + state.keys = keys; + state.userType = 'password'; + }, [types.ACCOUNT_SIGNUP_ERROR]: (state, { error }) => { state.pending = false; state.error = error; @@ -46,6 +54,7 @@ const mutations = { state.encryptedBrainkey = wallet.encryptedBrainkey; state.encryptionKey = wallet.encryptionKey; state.aesPrivate = wallet.aesPrivate; + state.userType = 'wallet'; }, [types.ACCOUNT_LOGIN_ERROR]: (state, { error }) => { state.pending = false; @@ -53,17 +62,20 @@ const mutations = { }, [types.ACCOUNT_LOCK_WALLET]: (state) => { state.aesPrivate = null; + state.keys = null; }, [types.ACCOUNT_UNLOCK_WALLET]: (state, aesPrivate) => { state.aesPrivate = aesPrivate; }, [types.SET_ACCOUNT_USER_DATA]: (state, { userId, encryptedBrainkey, - encryptionKey, backupDate, passwordPubkey }) => { + encryptionKey, backupDate, passwordPubkey, userType }) => { state.userId = userId; state.encryptedBrainkey = encryptedBrainkey; state.encryptionKey = encryptionKey; state.brainkeyBackupDate = backupDate; state.passwordPubkey = passwordPubkey; + state.userType = userType; + }, [types.ACCOUNT_LOGOUT]: (state) => { state.userId = null; diff --git a/src/modules/assets.js b/src/modules/assets.js index 1c23858..532f8a0 100644 --- a/src/modules/assets.js +++ b/src/modules/assets.js @@ -2,10 +2,12 @@ import Vue from 'vue'; import * as types from '../mutations'; import * as actions from '../actions/assets'; import * as getters from '../getters/assets'; +import PersistentStorage from '../services/persistent-storage.js'; const initialState = { defaultAssetsIds: [], assets: {}, + hiddenAssetsIds: [], pending: false }; @@ -17,6 +19,8 @@ const mutations = { Object.keys(assets).forEach(id => { Vue.set(state.assets, id, assets[id]); }); + state.hiddenAssetsIds = PersistentStorage.getJSON('hidden_assets') || []; + console.log(state.hiddenAssetsIds) state.pending = false; }, [types.FETCH_ASSETS_ERROR](state) { @@ -24,6 +28,17 @@ const mutations = { }, [types.SAVE_DEFAULT_ASSETS_IDS](state, { ids }) { state.defaultAssetsIds = ids; + }, + [types.HIDE_ASSET](state, id) { + state.hiddenAssetsIds.push(id); + PersistentStorage.set('hidden_assets', state.hiddenAssetsIds); + }, + [types.SHOW_ASSET](state, id) { + state.hiddenAssetsIds.splice( + state.hiddenAssetsIds.indexOf(id), + 1 + ); + PersistentStorage.set('hidden_assets', state.hiddenAssetsIds); } }; diff --git a/src/modules/transactions.js b/src/modules/transactions.js index b2efb80..667cada 100644 --- a/src/modules/transactions.js +++ b/src/modules/transactions.js @@ -37,10 +37,15 @@ const getters = { getTransferFee: state => state.fees.transfer.fee, getMemoPrice: (state) => { return (memo) => { - const byteLength = utils.getMemoSize(memo); const transferPrice = state.fees.transfer.fee; - const memoPrice = Math.floor((byteLength * state.fees.transfer.kbytePrice) / 1024); - return transferPrice + memoPrice; + if (memo) { + const byteLength = utils.getMemoSizeFast(memo); + const memoPrice = Math.floor((byteLength * state.fees.transfer.kbytePrice) / 1024); + return transferPrice + memoPrice; + } else { + return transferPrice; + } + }; } }; diff --git a/src/mutations.js b/src/mutations.js index d09fe2a..e8cabb0 100644 --- a/src/mutations.js +++ b/src/mutations.js @@ -10,6 +10,7 @@ export const FETCH_USER_ERROR = 'FETCH_USER_ERROR'; export const ACCOUNT_SIGNUP_REQUEST = 'ACCOUNT_SIGNUP_REQUEST'; export const ACCOUNT_SIGNUP_COMPLETE = 'ACCOUNT_SIGNUP_COMPLETE'; export const ACCOUNT_SIGNUP_ERROR = 'ACCOUNT_SIGNUP_ERROR'; +export const ACCOUNT_PASSWORD_LOGIN_COMPLETE = 'ACCOUNT_PASSWORD_LOGIN_COMPLETE'; export const ACCOUNT_LOGIN_REQUEST = 'ACCOUNT_LOGIN_REQUEST'; export const ACCOUNT_LOGIN_COMPLETE = 'ACCOUNT_LOGIN_COMPLETE'; export const ACCOUNT_LOGIN_ERROR = 'ACCOUNT_LOGIN_ERROR'; @@ -38,6 +39,8 @@ export const FETCH_ASSETS_ERROR = 'FETCH_ASSETS_ERROR'; export const FETCH_DEFAULT_ASSETS_REQUEST = 'FETCH_DEFAULT_ASSETS_REQUEST'; export const FETCH_DEFAULT_ASSETS_COMPLETE = 'FETCH_DEFAULT_ASSETS_COMPLETE'; export const FETCH_DEFAULT_ASSETS_ERROR = 'FETCH_DEFAULT_ASSETS_ERROR'; +export const HIDE_ASSET = 'HIDE_ASSET'; +export const SHOW_ASSET = 'SHOW_ASSET'; export const SAVE_DEFAULT_ASSETS_IDS = 'SAVE_DEFAULT_ASSETS_IDS'; diff --git a/src/services/api.js b/src/services/api.js index ad49e4b..7829723 100644 --- a/src/services/api.js +++ b/src/services/api.js @@ -7,6 +7,7 @@ import Market from './api/market'; import Operations from './api/operations'; import Openledger from './api/openledger'; import Parameters from './api/parameters'; +import Backup from './api/backup'; const API = { Connection, @@ -17,7 +18,8 @@ const API = { Market, Operations, Openledger, - Parameters + Parameters, + Backup }; export default API; diff --git a/src/services/api/account.js b/src/services/api/account.js index 53a4c12..af03758 100644 --- a/src/services/api/account.js +++ b/src/services/api/account.js @@ -1,4 +1,4 @@ -import { key } from 'bitsharesjs'; +import { key, PrivateKey } from 'bitsharesjs'; import { Apis } from 'bitsharesjs-ws'; import config from '../../../config'; @@ -6,6 +6,19 @@ export const suggestBrainkey = (dictionary) => { return key.suggest_brain_key(dictionary); }; +export const suggestPassword = () => { + console.log('inside') + return "P" + key.get_random_key().toWif().substr(0, 45); +}; + +export const generateKeyFromPassword = (accountName, role, password) => { + let seed = accountName + role + password; + let privKey = PrivateKey.fromSeed(seed); + let pubKey = privKey.toPublicKey().toString(); + + return {privKey, pubKey}; +} + export const getUser = async (nameOrId) => { try { const response = await Apis.instance().db_api().exec('get_full_accounts', [[nameOrId], false]); @@ -78,6 +91,8 @@ export const createAccount = async ({ name, activeKey, ownerKey, email }) => { export default { suggestBrainkey, + suggestPassword, + generateKeyFromPassword, getUser, getAccountIdByOwnerPubkey, createAccount diff --git a/src/services/api/backup.js b/src/services/api/backup.js new file mode 100644 index 0000000..308b969 --- /dev/null +++ b/src/services/api/backup.js @@ -0,0 +1,84 @@ +import { key, PrivateKey, PublicKey, Aes } from 'bitsharesjs'; +import { getAccountIdByOwnerPubkey } from './account'; +import lib from '../../utils/lzma/lzma_worker-min.js'; + + +const restoreBackup = async ({ password, backup }) => { + const privateKey = PrivateKey.fromSeed(password || ""); + const result = await restore(privateKey.toWif(), backup, 'test'); + return result; +} + +const restore = async (backup_wif, backup, wallet_name) => { + try { + const wallet = await decryptWalletBackup(backup_wif, backup); + console.log('Wallet restore', wallet); + if (!wallet.linked_accounts.length) { + const pubkey = wallet.private_keys[0].pubkey; + const id = await getAccountIdByOwnerPubkey(pubkey); + wallet.linked_accounts[0] = { name: id[0] }; + } + return { success: true, wallet }; + } catch (e) { + return { success: false, error: e } + } +} + +const decryptWalletBackup = (backup_wif, backup_buffer) => { + return new Promise((resolve, reject) => { + if (!Buffer.isBuffer(backup_buffer)) + backup_buffer = new Buffer(backup_buffer, "binary"); + + let private_key = PrivateKey.fromWif(backup_wif); + let public_key; + try { + public_key = PublicKey.fromBuffer(backup_buffer.slice(0, 33)); + } catch (e) { + console.error(e, e.stack); + throw new Error("Invalid backup file"); + } + + + console.log('restoreBackup', backup_buffer, backup_wif) + + backup_buffer = backup_buffer.slice(33); + try { + backup_buffer = Aes.decrypt_with_checksum( + private_key, + public_key, + null /*nonce*/, + backup_buffer + ); + } catch (error) { + reject("invalid_decryption_key"); + return; + } + + console.log('Decrypted', backup_buffer); + + try { + lib.LZMA_WORKER.decompress(backup_buffer, wallet_string => { + try { + let wallet_object = JSON.parse(wallet_string); + console.log('Wallet obj', wallet_object) + resolve(wallet_object); + } catch (error) { + if (!wallet_string) wallet_string = ""; + console.error( + "Error parsing wallet json", + wallet_string.substring(0, 10) + "..." + ); + reject("Error parsing wallet json"); + } + }); + } catch (error) { + console.error("Error decompressing wallet", error, error.stack); + reject("Error decompressing wallet"); + return; + } + }); +} + +export default { + restoreBackup +} \ No newline at end of file diff --git a/src/services/api/parameters.js b/src/services/api/parameters.js index c234d47..0041589 100644 --- a/src/services/api/parameters.js +++ b/src/services/api/parameters.js @@ -23,7 +23,6 @@ export const getComissions = async () => { } const { current_fees: { parameters: fees, scale } } = await getParameters(); - console.log('Service:', fees); return { fees, scale }; }; diff --git a/src/services/persistent-storage.js b/src/services/persistent-storage.js index 3e675e6..71a0b22 100644 --- a/src/services/persistent-storage.js +++ b/src/services/persistent-storage.js @@ -3,19 +3,23 @@ import Cookies from 'js-cookie'; // Persistent Storage for data cache management const PersistentStorage = { set(key, data) { - Cookies.set(key, data, { expires: 7 }); + Cookies.set(key, data, { expires: 365 }); }, get(key) { return Cookies.get(key); }, + getJSON(key) { + return Cookies.getJSON(key); + }, remove(key) { return Cookies.remove(key); }, - saveUserData: ({ id, encryptedBrainkey, encryptionKey, passwordPubkey }) => { + saveUserData: ({ id, encryptedBrainkey, encryptionKey, passwordPubkey, userType }) => { Cookies.set('BITSHARES_USER_ID', id, { expires: 365 }); Cookies.set('BITSHARES_USER_BRAINKEY', encryptedBrainkey, { expires: 365 }); Cookies.set('BITSHARES_ENCRYPTION_KEY', encryptionKey, { expires: 365 }); Cookies.set('BITSHARES_PASSWORD_PUBKEY', passwordPubkey, { expires: 365 }); + Cookies.set('BITSHARES_LOGIN_TYPE', userType, { expires: 365 }); }, getSavedUserData: () => { const userId = Cookies.get('BITSHARES_USER_ID'); @@ -23,6 +27,8 @@ const PersistentStorage = { const encryptionKey = Cookies.get('BITSHARES_ENCRYPTION_KEY'); const backupDate = Cookies.get('BACKUP_DATE'); const passwordPubkey = Cookies.get('BITSHARES_PASSWORD_PUBKEY'); + const userType = Cookies.get('BITSHARES_LOGIN_TYPE'); + if (!userId || !encryptedBrainkey || !encryptionKey || !passwordPubkey) return null; if (typeof (userId) !== 'string') return null; return { @@ -30,7 +36,8 @@ const PersistentStorage = { encryptedBrainkey, encryptionKey, backupDate, - passwordPubkey + passwordPubkey, + userType }; }, clearSavedUserData: () => { diff --git a/src/utils/index.js b/src/utils/index.js index a19cf73..f442aac 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -155,6 +155,22 @@ export const getMemoSize = (memo) => { return byteLength; }; +export const getMemoSizeFast = (memo) => { + const minimalLength = 92; + const step = 16; + + + if (memo.length < 12) { + return minimalLength; + } else { + let countSteps = 0; + for (let i = memo.length; i >= 12; i -= step) { + countSteps++; + } + return minimalLength + countSteps * step; + } +} + /** Calculates distribution 0..1 of total amount of assets expressed * in base asset diff --git a/src/utils/lzma/lzma-min.js b/src/utils/lzma/lzma-min.js new file mode 100644 index 0000000..c9464a0 --- /dev/null +++ b/src/utils/lzma/lzma-min.js @@ -0,0 +1,2 @@ +//! © 2015 Nathan Rugg | MIT +"undefined"==typeof Worker||"undefined"!=typeof location&&"file:"===location.protocol?"undefined"!=typeof global&&"undefined"!=typeof require?this.LZMA=function(n){return require(n||"./lzma_worker.js").LZMA}:"undefined"!=typeof window&&window.document?!function(){function n(n){var e;return r(n),e={compress:function(n,r,t,i){o.LZMA_WORKER?o.LZMA_WORKER.compress(n,r,t,i):setTimeout(function(){e.compress(n,r,t,i)},50)},decompress:function(n,r,t){o.LZMA_WORKER?o.LZMA_WORKER.decompress(n,r,t):setTimeout(function(){e.decompress(n,r,t)},50)},worker:function(){return null}}}var o,e=this,r=function(o){var r=document.createElement("script");r.type="text/javascript",r.src=o,r.onload=function(){e.LZMA=n},document.getElementsByTagName("head")[0].appendChild(r)};"undefined"!=typeof window?o=window:global&&(o=global),e.LZMA=n}():console.error("Can't load the worker. Sorry."):this.LZMA=function(n){var o=1,e=2,r=3,t={},i=new Worker(n||"./lzma_worker-min.js");return i.onmessage=function(n){n.data.action===r?t[n.data.cbn]&&"function"==typeof t[n.data.cbn].on_progress&&t[n.data.cbn].on_progress(n.data.result):t[n.data.cbn]&&"function"==typeof t[n.data.cbn].on_finish&&(t[n.data.cbn].on_finish(n.data.result,n.data.error),delete t[n.data.cbn])},i.onerror=function(n){var o=Error(n.message+" ("+n.filename+":"+n.lineno+")");for(var e in t)t[e].on_finish(null,o);console.error("Uncaught error in lzma_worker",o)},function(){function n(n,o,e,r,a){var c;do c=Math.floor(1e7*Math.random());while(void 0!==t[c]);t[c]={on_finish:r,on_progress:a},i.postMessage({action:n,cbn:c,data:o,mode:e})}return{compress:function(e,r,t,i){n(o,e,r,t,i)},decompress:function(o,r,t){n(e,o,!1,r,t)},worker:function(){return i}}}()}; \ No newline at end of file diff --git a/src/utils/lzma/lzma_worker-min.js b/src/utils/lzma/lzma_worker-min.js new file mode 100644 index 0000000..8aa7383 --- /dev/null +++ b/src/utils/lzma/lzma_worker-min.js @@ -0,0 +1,2 @@ +var e=function(){"use strict";function r(e,r){postMessage({action:xt,cbn:r,result:e})}function t(e){var r=[];return r[e-1]=void 0,r}function o(e,r){return i(e[0]+r[0],e[1]+r[1])}function n(e,r){return u(~~Math.max(Math.min(e[1]/Ot,2147483647),-2147483648)&~~Math.max(Math.min(r[1]/Ot,2147483647),-2147483648),c(e)&c(r))}function s(e,r){var t,o;return e[0]==r[0]&&e[1]==r[1]?0:(t=0>e[1],o=0>r[1],t&&!o?-1:!t&&o?1:h(e,r)[1]<0?-1:1)}function i(e,r){var t,o;for(r%=0x10000000000000000,e%=0x10000000000000000,t=r%Ot,o=Math.floor(e/Ot)*Ot,r=r-t+o,e=e-o+t;0>e;)e+=Ot,r-=Ot;for(;e>4294967295;)e-=Ot,r+=Ot;for(r%=0x10000000000000000;r>0x7fffffff00000000;)r-=0x10000000000000000;for(;-0x8000000000000000>r;)r+=0x10000000000000000;return[e,r]}function _(e,r){return e[0]==r[0]&&e[1]==r[1]}function a(e){return e>=0?[e,0]:[e+Ot,-Ot]}function c(e){return e[0]>=2147483648?~~Math.max(Math.min(e[0]-Ot,2147483647),-2147483648):~~Math.max(Math.min(e[0],2147483647),-2147483648)}function u(e,r){var t,o;return t=e*Ot,o=r,0>r&&(o+=Ot),[o,t]}function f(e){return 30>=e?1<e[1])throw Error("Neg");return s=f(r),o=e[1]*s%0x10000000000000000,n=e[0]*s,t=n-n%Ot,o+=t,n-=t,o>=0x8000000000000000&&(o-=0x10000000000000000),[n,o]}function d(e,r){var t;return r&=63,t=f(r),i(Math.floor(e[0]/t),e[1]/t)}function p(e,r){var t;return r&=63,t=d(e,r),0>e[1]&&(t=o(t,m([2,0],63-r))),t}function h(e,r){return i(e[0]-r[0],e[1]-r[1])}function P(e,r){return e.Mc=r,e.Lc=0,e.Yb=r.length,e}function l(e){return e.Lc>=e.Yb?-1:255&e.Mc[e.Lc++]}function v(e,r,t,o){return e.Lc>=e.Yb?-1:(o=Math.min(o,e.Yb-e.Lc),M(e.Mc,e.Lc,r,t,o),e.Lc+=o,o)}function B(e){return e.Mc=t(32),e.Yb=0,e}function S(e){var r=e.Mc;return r.length=e.Yb,r}function g(e,r){e.Mc[e.Yb++]=r<<24>>24}function k(e,r,t,o){M(r,t,e.Mc,e.Yb,o),e.Yb+=o}function R(e,r,t,o,n){var s;for(s=r;t>s;++s)o[n++]=e.charCodeAt(s)}function M(e,r,t,o,n){for(var s=0;n>s;++s)t[o+s]=e[r+s]}function D(e,r){Ar(r,1<a;a+=8)g(o,255&c(d(n,a)));r.yb=(_.W=0,_.oc=t,_.pc=0,Mr(_),_.d.Ab=o,Fr(_),wr(_),br(_),_.$.rb=_.n+1-2,Qr(_.$,1<<_.Y),_.i.rb=_.n+1-2,Qr(_.i,1<<_.Y),void(_.g=Gt),X({},_))}function w(e,r,t){return e.Nb=B({}),b(e,P({},r),e.Nb,a(r.length),t),e}function E(e,r,t){var o,n,s,i,_="",c=[];for(n=0;5>n;++n){if(s=l(r),-1==s)throw Error("truncated input");c[n]=s<<24>>24}if(o=ir({}),!ar(o,c))throw Error("corrupted input");for(n=0;64>n;n+=8){if(s=l(r),-1==s)throw Error("truncated input");s=s.toString(16),1==s.length&&(s="0"+s),_=s+""+_}/^0+$|^f+$/i.test(_)?e.Tb=At:(i=parseInt(_,16),e.Tb=i>4294967295?At:a(i)),e.yb=nr(o,r,t,e.Tb)}function L(e,r){return e.Nb=B({}),E(e,P({},r),e.Nb),e}function y(e,r,o,n){var s;e.Bc=r,e._b=o,s=r+o+n,(null==e.c||e.Kb!=s)&&(e.c=null,e.Kb=s,e.c=t(e.Kb)),e.H=e.Kb-o}function C(e,r){return e.c[e.f+e.o+r]}function z(e,r,t,o){var n,s;for(e.T&&e.o+r+o>e.h&&(o=e.h-(e.o+r)),++t,s=e.f+e.o+r,n=0;o>n&&e.c[s+n]==e.c[s+n-t];++n);return n}function F(e){return e.h-e.o}function I(e){var r,t,o;for(o=e.f+e.o-e.Bc,o>0&&--o,t=e.f+e.h-o,r=0;t>r;++r)e.c[r]=e.c[o+r];e.f-=o}function x(e){var r;++e.o,e.o>e.zb&&(r=e.f+e.o,r>e.H&&I(e),N(e))}function N(e){var r,t,o;if(!e.T)for(;;){if(o=-e.f+e.Kb-e.h,!o)return;if(r=v(e.cc,e.c,e.f+e.h,o),-1==r)return e.zb=e.h,t=e.f+e.zb,t>e.H&&(e.zb=e.H-e.f),void(e.T=1);e.h+=r,e.h>=e.o+e._b&&(e.zb=e.h-e._b)}}function O(e,r){e.f+=r,e.zb-=r,e.o-=r,e.h-=r}function A(e,r,o,n,s){var i,_,a;1073741567>r&&(e.Fc=16+(n>>1),a=~~((r+o+n+s)/2)+256,y(e,r+o,n+s,a),e.ob=n,i=r+1,e.p!=i&&(e.L=t(2*(e.p=i))),_=65536,e.qb&&(_=r-1,_|=_>>1,_|=_>>2,_|=_>>4,_|=_>>8,_>>=1,_|=65535,_>16777216&&(_>>=1),e.Ec=_,++_,_+=e.R),_!=e.rc&&(e.ub=t(e.rc=_)))}function H(e,r){var t,o,n,s,i,_,a,c,u,f,m,d,p,h,P,l,v,B,S,g,k;if(e.h>=e.o+e.ob)h=e.ob;else if(h=e.h-e.o,e.xb>h)return W(e),0;for(v=0,P=e.o>e.p?e.o-e.p:0,o=e.f+e.o,l=1,c=0,u=0,e.qb?(k=Tt[255&e.c[o]]^255&e.c[o+1],c=1023&k,k^=(255&e.c[o+2])<<8,u=65535&k,f=(k^Tt[255&e.c[o+3]]<<5)&e.Ec):f=255&e.c[o]^(255&e.c[o+1])<<8,n=e.ub[e.R+f]||0,e.qb&&(s=e.ub[c]||0,i=e.ub[1024+u]||0,e.ub[c]=e.o,e.ub[1024+u]=e.o,s>P&&e.c[e.f+s]==e.c[o]&&(r[v++]=l=2,r[v++]=e.o-s-1),i>P&&e.c[e.f+i]==e.c[o]&&(i==s&&(v-=2),r[v++]=l=3,r[v++]=e.o-i-1,s=i),0!=v&&s==n&&(v-=2,l=1)),e.ub[e.R+f]=e.o,S=(e.k<<1)+1,g=e.k<<1,d=p=e.w,0!=e.w&&n>P&&e.c[e.f+n+e.w]!=e.c[o+e.w]&&(r[v++]=l=e.w,r[v++]=e.o-n-1),t=e.Fc;;){if(P>=n||0==t--){e.L[S]=e.L[g]=0;break}if(a=e.o-n,_=(e.k>=a?e.k-a:e.k-a+e.p)<<1,B=e.f+n,m=p>d?d:p,e.c[B+m]==e.c[o+m]){for(;++m!=h&&e.c[B+m]==e.c[o+m];);if(m>l&&(r[v++]=l=m,r[v++]=a-1,m==h)){e.L[g]=e.L[_],e.L[S]=e.L[_+1];break}}(255&e.c[o+m])>(255&e.c[B+m])?(e.L[g]=n,g=_+1,n=e.L[g],p=m):(e.L[S]=n,S=_,n=e.L[S],d=m)}return W(e),v}function G(e){e.f=0,e.o=0,e.h=0,e.T=0,N(e),e.k=0,O(e,-1)}function W(e){var r;++e.k>=e.p&&(e.k=0),x(e),1073741823==e.o&&(r=e.o-e.p,T(e.L,2*e.p,r),T(e.ub,e.rc,r),O(e,r))}function T(e,r,t){var o,n;for(o=0;r>o;++o)n=e[o]||0,t>=n?n=0:n-=t,e[o]=n}function Z(e,r){e.qb=r>2,e.qb?(e.w=0,e.xb=4,e.R=66560):(e.w=2,e.xb=3,e.R=0)}function Y(e,r){var t,o,n,s,i,_,a,c,u,f,m,d,p,h,P,l,v;do{if(e.h>=e.o+e.ob)d=e.ob;else if(d=e.h-e.o,e.xb>d){W(e);continue}for(p=e.o>e.p?e.o-e.p:0,o=e.f+e.o,e.qb?(v=Tt[255&e.c[o]]^255&e.c[o+1],_=1023&v,e.ub[_]=e.o,v^=(255&e.c[o+2])<<8,a=65535&v,e.ub[1024+a]=e.o,c=(v^Tt[255&e.c[o+3]]<<5)&e.Ec):c=255&e.c[o]^(255&e.c[o+1])<<8,n=e.ub[e.R+c],e.ub[e.R+c]=e.o,P=(e.k<<1)+1,l=e.k<<1,f=m=e.w,t=e.Fc;;){if(p>=n||0==t--){e.L[P]=e.L[l]=0;break}if(i=e.o-n,s=(e.k>=i?e.k-i:e.k-i+e.p)<<1,h=e.f+n,u=m>f?f:m,e.c[h+u]==e.c[o+u]){for(;++u!=d&&e.c[h+u]==e.c[o+u];);if(u==d){e.L[l]=e.L[s],e.L[P]=e.L[s+1];break}}(255&e.c[o+u])>(255&e.c[h+u])?(e.L[l]=n,l=s+1,n=e.L[l],m=u):(e.L[P]=n,P=s,n=e.L[P],f=u)}W(e)}while(0!=--r)}function V(e,r,t){var o=e.o-r-1;for(0>o&&(o+=e.M);0!=t;--t)o>=e.M&&(o=0),e.Lb[e.o++]=e.Lb[o++],e.o>=e.M&&$(e)}function j(e,r){(null==e.Lb||e.M!=r)&&(e.Lb=t(r)),e.M=r,e.o=0,e.h=0}function $(e){var r=e.o-e.h;r&&(k(e.cc,e.Lb,e.h,r),e.o>=e.M&&(e.o=0),e.h=e.o)}function K(e,r){var t=e.o-r-1;return 0>t&&(t+=e.M),e.Lb[t]}function q(e,r){e.Lb[e.o++]=r,e.o>=e.M&&$(e)}function J(e){$(e),e.cc=null}function Q(e){return e-=2,4>e?e:3}function U(e){return 4>e?0:10>e?e-3:e-6}function X(e,r){return e.cb=r,e.Z=null,e.zc=1,e}function er(e,r){return e.Z=r,e.cb=null,e.zc=1,e}function rr(e){if(!e.zc)throw Error("bad state");return e.cb?or(e):tr(e),e.zc}function tr(e){var r=sr(e.Z);if(-1==r)throw Error("corrupted input");e.Pb=At,e.Pc=e.Z.g,(r||s(e.Z.Nc,Gt)>=0&&s(e.Z.g,e.Z.Nc)>=0)&&($(e.Z.B),J(e.Z.B),e.Z.e.Ab=null,e.zc=0)}function or(e){Rr(e.cb,e.cb.Xb,e.cb.uc,e.cb.Kc),e.Pb=e.cb.Xb[0],e.cb.Kc[0]&&(Or(e.cb),e.zc=0)}function nr(e,r,t,o){return e.e.Ab=r,J(e.B),e.B.cc=t,_r(e),e.U=0,e.ib=0,e.Jc=0,e.Ic=0,e.Qc=0,e.Nc=o,e.g=Gt,e.jc=0,er({},e)}function sr(e){var r,t,n,i,_,u;if(u=c(e.g)&e.Dc,vt(e.e,e.Gb,(e.U<<4)+u)){if(vt(e.e,e.Zb,e.U))n=0,vt(e.e,e.Cb,e.U)?(vt(e.e,e.Db,e.U)?(vt(e.e,e.Eb,e.U)?(t=e.Qc,e.Qc=e.Ic):t=e.Ic,e.Ic=e.Jc):t=e.Jc,e.Jc=e.ib,e.ib=t):vt(e.e,e.pb,(e.U<<4)+u)||(e.U=7>e.U?9:11,n=1),n||(n=mr(e.sb,e.e,u)+2,e.U=7>e.U?8:11);else if(e.Qc=e.Ic,e.Ic=e.Jc,e.Jc=e.ib,n=2+mr(e.Rb,e.e,u),e.U=7>e.U?7:10,_=at(e.kb[Q(n)],e.e),_>=4){if(i=(_>>1)-1,e.ib=(2|1&_)<_)e.ib+=ut(e.kc,e.ib-_-1,e.e,i);else if(e.ib+=Bt(e.e,i-4)<<4,e.ib+=ct(e.Fb,e.e),0>e.ib)return-1==e.ib?1:-1}else e.ib=_;if(s(a(e.ib),e.g)>=0||e.ib>=e.nb)return-1;V(e.B,e.ib,n),e.g=o(e.g,a(n)),e.jc=K(e.B,0)}else r=Pr(e.gb,c(e.g),e.jc),e.jc=7>e.U?vr(r,e.e):Br(r,e.e,K(e.B,e.ib)),q(e.B,e.jc),e.U=U(e.U),e.g=o(e.g,Wt);return 0}function ir(e){e.B={},e.e={},e.Gb=t(192),e.Zb=t(12),e.Cb=t(12),e.Db=t(12),e.Eb=t(12),e.pb=t(192),e.kb=t(4),e.kc=t(114),e.Fb=_t({},4),e.Rb=dr({}),e.sb=dr({}),e.gb={};for(var r=0;4>r;++r)e.kb[r]=_t({},6);return e}function _r(e){e.B.h=0,e.B.o=0,gt(e.Gb),gt(e.pb),gt(e.Zb),gt(e.Cb),gt(e.Db),gt(e.Eb),gt(e.kc),lr(e.gb);for(var r=0;4>r;++r)gt(e.kb[r].G);pr(e.Rb),pr(e.sb),gt(e.Fb.G),St(e.e)}function ar(e,r){var t,o,n,s,i,_,a;if(5>r.length)return 0;for(a=255&r[0],n=a%9,_=~~(a/9),s=_%5,i=~~(_/5),t=0,o=0;4>o;++o)t+=(255&r[1+o])<<8*o;return t>99999999||!ur(e,n,s,i)?0:cr(e,t)}function cr(e,r){return 0>r?0:(e.Ob!=r&&(e.Ob=r,e.nb=Math.max(e.Ob,1),j(e.B,Math.max(e.nb,4096))),1)}function ur(e,r,t,o){if(r>8||t>4||o>4)return 0;hr(e.gb,t,r);var n=1<e.O;++e.O)e.ec[e.O]=_t({},3),e.hc[e.O]=_t({},3)}function mr(e,r,t){if(!vt(r,e.wc,0))return at(e.ec[t],r);var o=8;return o+=vt(r,e.wc,1)?8+at(e.tc,r):at(e.hc[t],r)}function dr(e){return e.wc=t(2),e.ec=t(16),e.hc=t(16),e.tc=_t({},8),e.O=0,e}function pr(e){gt(e.wc);for(var r=0;e.O>r;++r)gt(e.ec[r].G),gt(e.hc[r].G);gt(e.tc.G)}function hr(e,r,o){var n,s;if(null==e.V||e.u!=o||e.I!=r)for(e.I=r,e.qc=(1<n;++n)e.V[n]=Sr({})}function Pr(e,r,t){return e.V[((r&e.qc)<>>8-e.u)]}function lr(e){var r,t;for(t=1<r;++r)gt(e.V[r].Ib)}function vr(e,r){var t=1;do t=t<<1|vt(r,e.Ib,t);while(256>t);return t<<24>>24}function Br(e,r,t){var o,n,s=1;do if(n=t>>7&1,t<<=1,o=vt(r,e.Ib,(1+n<<8)+s),s=s<<1|o,n!=o){for(;256>s;)s=s<<1|vt(r,e.Ib,s);break}while(256>s);return s<<24>>24}function Sr(e){return e.Ib=t(768),e}function gr(e,r){var t,o,n,s;e.jb=r,n=e.a[r].r,o=e.a[r].j;do e.a[r].t&&(st(e.a[n]),e.a[n].r=n-1,e.a[r].Ac&&(e.a[n-1].t=0,e.a[n-1].r=e.a[r].r2,e.a[n-1].j=e.a[r].j2)),s=n,t=o,o=e.a[s].j,n=e.a[s].r,e.a[s].j=t,e.a[s].r=r,r=s;while(r>0);return e.mb=e.a[0].j,e.q=e.a[0].r}function kr(e){e.l=0,e.J=0;for(var r=0;4>r;++r)e.v[r]=0}function Rr(e,r,t,n){var i,u,f,m,d,p,P,l,v,B,S,g,k,R,M;if(r[0]=Gt,t[0]=Gt,n[0]=1,e.oc&&(e.b.cc=e.oc,G(e.b),e.W=1,e.oc=null),!e.pc){if(e.pc=1,R=e.g,_(e.g,Gt)){if(!F(e.b))return void Er(e,c(e.g));xr(e),k=c(e.g)&e.y,kt(e.d,e.C,(e.l<<4)+k,0),e.l=U(e.l),f=C(e.b,-e.s),rt(Xr(e.A,c(e.g),e.J),e.d,f),e.J=f,--e.s,e.g=o(e.g,Wt)}if(!F(e.b))return void Er(e,c(e.g));for(;;){if(P=Lr(e,c(e.g)),B=e.mb,k=c(e.g)&e.y,u=(e.l<<4)+k,1==P&&-1==B)kt(e.d,e.C,u,0),f=C(e.b,-e.s),M=Xr(e.A,c(e.g),e.J),7>e.l?rt(M,e.d,f):(v=C(e.b,-e.v[0]-1-e.s),tt(M,e.d,v,f)),e.J=f,e.l=U(e.l);else{if(kt(e.d,e.C,u,1),4>B){if(kt(e.d,e.bb,e.l,1),B?(kt(e.d,e.hb,e.l,1),1==B?kt(e.d,e.Ub,e.l,0):(kt(e.d,e.Ub,e.l,1),kt(e.d,e.vc,e.l,B-2))):(kt(e.d,e.hb,e.l,0),1==P?kt(e.d,e._,u,0):kt(e.d,e._,u,1)),1==P?e.l=7>e.l?9:11:(Kr(e.i,e.d,P-2,k),e.l=7>e.l?8:11),m=e.v[B],0!=B){for(p=B;p>=1;--p)e.v[p]=e.v[p-1];e.v[0]=m}}else{for(kt(e.d,e.bb,e.l,0),e.l=7>e.l?7:10,Kr(e.$,e.d,P-2,k),B-=4,g=Tr(B),l=Q(P),mt(e.K[l],e.d,g),g>=4&&(d=(g>>1)-1,i=(2|1&g)<g?Pt(e.Sb,i-g-1,e.d,d,S):(Rt(e.d,S>>4,d-4),pt(e.S,e.d,15&S),++e.Qb)),m=B,p=3;p>=1;--p)e.v[p]=e.v[p-1];e.v[0]=m,++e.Mb}e.J=C(e.b,P-1-e.s)}if(e.s-=P,e.g=o(e.g,a(P)),!e.s){if(e.Mb>=128&&wr(e),e.Qb>=16&&br(e),r[0]=e.g,t[0]=Mt(e.d),!F(e.b))return void Er(e,c(e.g));if(s(h(e.g,R),[4096,0])>=0)return e.pc=0,void(n[0]=0)}}}}function Mr(e){var r,t;e.b||(r={},t=4,e.X||(t=2),Z(r,t),e.b=r),Ur(e.A,e.eb,e.fb),(e.ab!=e.wb||e.Hb!=e.n)&&(A(e.b,e.ab,4096,e.n,274),e.wb=e.ab,e.Hb=e.n)}function Dr(e){var r;for(e.v=t(4),e.a=[],e.d={},e.C=t(192),e.bb=t(12),e.hb=t(12),e.Ub=t(12),e.vc=t(12),e._=t(192),e.K=[],e.Sb=t(114),e.S=ft({},4),e.$=qr({}),e.i=qr({}),e.A={},e.m=[],e.P=[],e.lb=[],e.nc=t(16),e.x=t(4),e.Q=t(4),e.Xb=[Gt],e.uc=[Gt],e.Kc=[0],e.fc=t(5),e.yc=t(128),e.vb=0,e.X=1,e.D=0,e.Hb=-1,e.mb=0,r=0;4096>r;++r)e.a[r]={};for(r=0;4>r;++r)e.K[r]=ft({},6);return e}function br(e){for(var r=0;16>r;++r)e.nc[r]=ht(e.S,r);e.Qb=0}function wr(e){var r,t,o,n,s,i,_,a;for(n=4;128>n;++n)i=Tr(n),o=(i>>1)-1,r=(2|1&i)<s;++s){for(t=e.K[s],_=s<<6,i=0;e.$b>i;++i)e.P[_+i]=dt(t,i);for(i=14;e.$b>i;++i)e.P[_+i]+=(i>>1)-1-4<<6;for(a=128*s,n=0;4>n;++n)e.lb[a+n]=e.P[_+n];for(;128>n;++n)e.lb[a+n]=e.P[_+Tr(n)]+e.yc[n]}e.Mb=0}function Er(e,r){Nr(e),Wr(e,r&e.y);for(var t=0;5>t;++t)bt(e.d)}function Lr(e,r){var t,o,n,s,i,_,a,c,u,f,m,d,p,h,P,l,v,B,S,g,k,R,M,D,b,w,E,L,y,I,x,N,O,A,H,G,W,T,Z,Y,V,j,$,K,q,J,Q,X,er,rr;if(e.jb!=e.q)return p=e.a[e.q].r-e.q,e.mb=e.a[e.q].j,e.q=e.a[e.q].r,p;if(e.q=e.jb=0,e.N?(d=e.vb,e.N=0):d=xr(e),E=e.D,b=F(e.b)+1,2>b)return e.mb=-1,1;for(b>273&&(b=273),Y=0,u=0;4>u;++u)e.x[u]=e.v[u],e.Q[u]=z(e.b,-1,e.x[u],273),e.Q[u]>e.Q[Y]&&(Y=u);if(e.Q[Y]>=e.n)return e.mb=Y,p=e.Q[Y],Ir(e,p-1),p;if(d>=e.n)return e.mb=e.m[E-1]+4,Ir(e,d-1),d;if(a=C(e.b,-1),v=C(e.b,-e.v[0]-1-1),2>d&&a!=v&&2>e.Q[Y])return e.mb=-1,1;if(e.a[0].Hc=e.l,A=r&e.y,e.a[1].z=Yt[e.C[(e.l<<4)+A]>>>2]+nt(Xr(e.A,r,e.J),e.l>=7,v,a),st(e.a[1]),B=Yt[2048-e.C[(e.l<<4)+A]>>>2],Z=B+Yt[2048-e.bb[e.l]>>>2],v==a&&(V=Z+zr(e,e.l,A),e.a[1].z>V&&(e.a[1].z=V,it(e.a[1]))),m=d>=e.Q[Y]?d:e.Q[Y],2>m)return e.mb=e.a[1].j,1;e.a[1].r=0,e.a[0].bc=e.x[0],e.a[0].ac=e.x[1],e.a[0].dc=e.x[2],e.a[0].lc=e.x[3],f=m;do e.a[f--].z=268435455;while(f>=2);for(u=0;4>u;++u)if(T=e.Q[u],!(2>T)){G=Z+Cr(e,u,e.l,A);do s=G+Jr(e.i,T-2,A),x=e.a[T],x.z>s&&(x.z=s,x.r=0,x.j=u,x.t=0);while(--T>=2)}if(D=B+Yt[e.bb[e.l]>>>2],f=e.Q[0]>=2?e.Q[0]+1:2,d>=f){for(L=0;f>e.m[L];)L+=2;for(;c=e.m[L+1],s=D+yr(e,c,f,A),x=e.a[f],x.z>s&&(x.z=s,x.r=0,x.j=c+4,x.t=0),f!=e.m[L]||(L+=2,L!=E);++f);}for(t=0;;){if(++t,t==m)return gr(e,t);if(S=xr(e),E=e.D,S>=e.n)return e.vb=S,e.N=1,gr(e,t);if(++r,O=e.a[t].r,e.a[t].t?(--O,e.a[t].Ac?($=e.a[e.a[t].r2].Hc,$=4>e.a[t].j2?7>$?8:11:7>$?7:10):$=e.a[O].Hc,$=U($)):$=e.a[O].Hc,O==t-1?$=e.a[t].j?U($):7>$?9:11:(e.a[t].t&&e.a[t].Ac?(O=e.a[t].r2,N=e.a[t].j2,$=7>$?8:11):(N=e.a[t].j,$=4>N?7>$?8:11:7>$?7:10),I=e.a[O],4>N?N?1==N?(e.x[0]=I.ac,e.x[1]=I.bc,e.x[2]=I.dc,e.x[3]=I.lc):2==N?(e.x[0]=I.dc,e.x[1]=I.bc,e.x[2]=I.ac,e.x[3]=I.lc):(e.x[0]=I.lc,e.x[1]=I.bc,e.x[2]=I.ac,e.x[3]=I.dc):(e.x[0]=I.bc,e.x[1]=I.ac,e.x[2]=I.dc,e.x[3]=I.lc):(e.x[0]=N-4,e.x[1]=I.bc,e.x[2]=I.ac,e.x[3]=I.dc)),e.a[t].Hc=$,e.a[t].bc=e.x[0],e.a[t].ac=e.x[1],e.a[t].dc=e.x[2],e.a[t].lc=e.x[3],_=e.a[t].z,a=C(e.b,-1),v=C(e.b,-e.x[0]-1-1),A=r&e.y,o=_+Yt[e.C[($<<4)+A]>>>2]+nt(Xr(e.A,r,C(e.b,-2)),$>=7,v,a),R=e.a[t+1],g=0,R.z>o&&(R.z=o,R.r=t,R.j=-1,R.t=0,g=1),B=_+Yt[2048-e.C[($<<4)+A]>>>2],Z=B+Yt[2048-e.bb[$]>>>2],v!=a||t>R.r&&!R.j||(V=Z+(Yt[e.hb[$]>>>2]+Yt[e._[($<<4)+A]>>>2]),R.z>=V&&(R.z=V,R.r=t,R.j=0,R.t=0,g=1)),w=F(e.b)+1,w=w>4095-t?4095-t:w,b=w,!(2>b)){if(b>e.n&&(b=e.n),!g&&v!=a&&(q=Math.min(w-1,e.n),P=z(e.b,0,e.x[0],q),P>=2)){for(K=U($),H=r+1&e.y,M=o+Yt[2048-e.C[(K<<4)+H]>>>2]+Yt[2048-e.bb[K]>>>2],y=t+1+P;y>m;)e.a[++m].z=268435455;s=M+(J=Jr(e.i,P-2,H),J+Cr(e,0,K,H)),x=e.a[y],x.z>s&&(x.z=s,x.r=t+1,x.j=0,x.t=1,x.Ac=0)}for(j=2,W=0;4>W;++W)if(h=z(e.b,-1,e.x[W],b),!(2>h)){l=h;do{for(;t+h>m;)e.a[++m].z=268435455;s=Z+(Q=Jr(e.i,h-2,A),Q+Cr(e,W,$,A)),x=e.a[t+h],x.z>s&&(x.z=s,x.r=t,x.j=W,x.t=0)}while(--h>=2);if(h=l,W||(j=h+1),w>h&&(q=Math.min(w-1-h,e.n),P=z(e.b,h,e.x[W],q),P>=2)){for(K=7>$?8:11,H=r+h&e.y,n=Z+(X=Jr(e.i,h-2,A),X+Cr(e,W,$,A))+Yt[e.C[(K<<4)+H]>>>2]+nt(Xr(e.A,r+h,C(e.b,h-1-1)),1,C(e.b,h-1-(e.x[W]+1)),C(e.b,h-1)),K=U(K),H=r+h+1&e.y,k=n+Yt[2048-e.C[(K<<4)+H]>>>2],M=k+Yt[2048-e.bb[K]>>>2],y=h+1+P;t+y>m;)e.a[++m].z=268435455;s=M+(er=Jr(e.i,P-2,H),er+Cr(e,0,K,H)),x=e.a[t+y],x.z>s&&(x.z=s,x.r=t+h+1,x.j=0,x.t=1,x.Ac=1,x.r2=t,x.j2=W)}}if(S>b){for(S=b,E=0;S>e.m[E];E+=2);e.m[E]=S,E+=2}if(S>=j){for(D=B+Yt[e.bb[$]>>>2];t+S>m;)e.a[++m].z=268435455;for(L=0;j>e.m[L];)L+=2;for(h=j;;++h)if(i=e.m[L+1],s=D+yr(e,i,h,A),x=e.a[t+h],x.z>s&&(x.z=s,x.r=t,x.j=i+4,x.t=0),h==e.m[L]){if(w>h&&(q=Math.min(w-1-h,e.n),P=z(e.b,h,i,q),P>=2)){for(K=7>$?7:10,H=r+h&e.y,n=s+Yt[e.C[(K<<4)+H]>>>2]+nt(Xr(e.A,r+h,C(e.b,h-1-1)),1,C(e.b,h-(i+1)-1),C(e.b,h-1)),K=U(K),H=r+h+1&e.y,k=n+Yt[2048-e.C[(K<<4)+H]>>>2],M=k+Yt[2048-e.bb[K]>>>2],y=h+1+P;t+y>m;)e.a[++m].z=268435455;s=M+(rr=Jr(e.i,P-2,H),rr+Cr(e,0,K,H)),x=e.a[t+y],x.z>s&&(x.z=s,x.r=t+h+1,x.j=0,x.t=1,x.Ac=1,x.r2=t,x.j2=i+4)}if(L+=2,L==E)break}}}}}function yr(e,r,t,o){var n,s=Q(t);return n=128>r?e.lb[128*s+r]:e.P[(s<<6)+Zr(r)]+e.nc[15&r],n+Jr(e.$,t-2,o)}function Cr(e,r,t,o){var n;return r?(n=Yt[2048-e.hb[t]>>>2],1==r?n+=Yt[e.Ub[t]>>>2]:(n+=Yt[2048-e.Ub[t]>>>2],n+=wt(e.vc[t],r-2))):(n=Yt[e.hb[t]>>>2],n+=Yt[2048-e._[(t<<4)+o]>>>2]),n}function zr(e,r,t){return Yt[e.hb[r]>>>2]+Yt[e._[(r<<4)+t]>>>2]}function Fr(e){kr(e),Dt(e.d),gt(e.C),gt(e._),gt(e.bb),gt(e.hb),gt(e.Ub),gt(e.vc),gt(e.Sb),et(e.A);for(var r=0;4>r;++r)gt(e.K[r].G);jr(e.$,1<0&&(Y(e.b,r),e.s+=r)}function xr(e){var r=0;return e.D=H(e.b,e.m),e.D>0&&(r=e.m[e.D-2],r==e.n&&(r+=z(e.b,r-1,e.m[e.D-1],273-r))),++e.s,r}function Nr(e){e.b&&e.W&&(e.b.cc=null,e.W=0)}function Or(e){Nr(e),e.d.Ab=null}function Ar(e,r){e.ab=r;for(var t=0;r>1<>24;for(var t=0;4>t;++t)e.fc[1+t]=e.ab>>8*t<<24>>24;k(r,e.fc,0,5)}function Wr(e,r){if(e.Gc){kt(e.d,e.C,(e.l<<4)+r,1),kt(e.d,e.bb,e.l,0),e.l=7>e.l?7:10,Kr(e.$,e.d,0,r);var t=Q(2);mt(e.K[t],e.d,63),Rt(e.d,67108863,26),pt(e.S,e.d,15)}}function Tr(e){return 2048>e?Zt[e]:2097152>e?Zt[e>>10]+20:Zt[e>>20]+40}function Zr(e){return 131072>e?Zt[e>>6]+12:134217728>e?Zt[e>>16]+32:Zt[e>>26]+52}function Yr(e,r,t,o){8>t?(kt(r,e.db,0,0),mt(e.Vb[o],r,t)):(t-=8,kt(r,e.db,0,1),8>t?(kt(r,e.db,1,0),mt(e.Wb[o],r,t)):(kt(r,e.db,1,1),mt(e.ic,r,t-8)))}function Vr(e){e.db=t(2),e.Vb=t(16),e.Wb=t(16),e.ic=ft({},8);for(var r=0;16>r;++r)e.Vb[r]=ft({},3),e.Wb[r]=ft({},3);return e}function jr(e,r){gt(e.db);for(var t=0;r>t;++t)gt(e.Vb[t].G),gt(e.Wb[t].G);gt(e.ic.G)}function $r(e,r,t,o,n){var s,i,_,a,c;for(s=Yt[e.db[0]>>>2],i=Yt[2048-e.db[0]>>>2],_=i+Yt[e.db[1]>>>2],a=i+Yt[2048-e.db[1]>>>2],c=0,c=0;8>c;++c){if(c>=t)return;o[n+c]=s+dt(e.Vb[r],c)}for(;16>c;++c){if(c>=t)return;o[n+c]=_+dt(e.Wb[r],c-8)}for(;t>c;++c)o[n+c]=a+dt(e.ic,c-8-8)}function Kr(e,r,t,o){Yr(e,r,t,o),0==--e.sc[o]&&($r(e,o,e.rb,e.Cc,272*o),e.sc[o]=e.rb)}function qr(e){return Vr(e),e.Cc=[],e.sc=[],e}function Jr(e,r,t){return e.Cc[272*t+r]}function Qr(e,r){for(var t=0;r>t;++t)$r(e,t,e.rb,e.Cc,272*t),e.sc[t]=e.rb}function Ur(e,r,o){var n,s;if(null==e.V||e.u!=o||e.I!=r)for(e.I=r,e.qc=(1<n;++n)e.V[n]=ot({})}function Xr(e,r,t){return e.V[((r&e.qc)<>>8-e.u)]}function et(e){var r,t=1<r;++r)gt(e.V[r].tb)}function rt(e,r,t){var o,n,s=1;for(n=7;n>=0;--n)o=t>>n&1,kt(r,e.tb,s,o),s=s<<1|o}function tt(e,r,t,o){var n,s,i,_,a=1,c=1;for(s=7;s>=0;--s)n=o>>s&1,_=c,a&&(i=t>>s&1,_+=1+i<<8,a=i==n),kt(r,e.tb,_,n),c=c<<1|n}function ot(e){return e.tb=t(768),e}function nt(e,r,t,o){var n,s,i=1,_=7,a=0;if(r)for(;_>=0;--_)if(s=t>>_&1,n=o>>_&1,a+=wt(e.tb[(1+s<<8)+i],n),i=i<<1|n,s!=n){--_;break}for(;_>=0;--_)n=o>>_&1,a+=wt(e.tb[i],n),i=i<<1|n;return a}function st(e){e.j=-1,e.t=0}function it(e){e.j=0,e.t=0}function _t(e,r){return e.F=r,e.G=t(1<o;++o)t=vt(r,e.G,n),n<<=1,n+=t,s|=t<s;++s)n=vt(t,e,r+i),i<<=1,i+=n,_|=n<>>n&1,kt(r,e.G,s,o),s=s<<1|o}function dt(e,r){var t,o,n=1,s=0;for(o=e.F;0!=o;)--o,t=r>>>o&1,s+=wt(e.G[n],t),n=(n<<1)+t;return s}function pt(e,r,t){var o,n,s=1;for(n=0;e.F>n;++n)o=1&t,kt(r,e.G,s,o),s=s<<1|o,t>>=1}function ht(e,r){var t,o,n=1,s=0;for(o=e.F;0!=o;--o)t=1&r,r>>>=1,s+=wt(e.G[n],t),n=n<<1|t;return s}function Pt(e,r,t,o,n){var s,i,_=1;for(i=0;o>i;++i)s=1&n,kt(t,e,r+_,s),_=_<<1|s,n>>=1}function lt(e,r,t,o){var n,s,i=1,_=0;for(s=t;0!=s;--s)n=1&o,o>>>=1,_+=Yt[(2047&(e[r+i]-n^-n))>>>2],i=i<<1|n;return _}function vt(e,r,t){var o,n=r[t];return o=(e.E>>>11)*n,(-2147483648^o)>(-2147483648^e.Bb)?(e.E=o,r[t]=n+(2048-n>>>5)<<16>>16,-16777216&e.E||(e.Bb=e.Bb<<8|l(e.Ab),e.E<<=8),0):(e.E-=o,e.Bb-=o,r[t]=n-(n>>>5)<<16>>16,-16777216&e.E||(e.Bb=e.Bb<<8|l(e.Ab),e.E<<=8),1)}function Bt(e,r){var t,o,n=0;for(t=r;0!=t;--t)e.E>>>=1,o=e.Bb-e.E>>>31,e.Bb-=e.E&o-1,n=n<<1|1-o,-16777216&e.E||(e.Bb=e.Bb<<8|l(e.Ab),e.E<<=8);return n}function St(e){e.Bb=0,e.E=-1;for(var r=0;5>r;++r)e.Bb=e.Bb<<8|l(e.Ab)}function gt(e){for(var r=e.length-1;r>=0;--r)e[r]=1024}function kt(e,r,t,s){var i,_=r[t];i=(e.E>>>11)*_,s?(e.xc=o(e.xc,n(a(i),[4294967295,0])),e.E-=i,r[t]=_-(_>>>5)<<16>>16):(e.E=i,r[t]=_+(2048-_>>>5)<<16>>16),-16777216&e.E||(e.E<<=8,bt(e))}function Rt(e,r,t){for(var n=t-1;n>=0;--n)e.E>>>=1,1==(r>>>n&1)&&(e.xc=o(e.xc,a(e.E))),-16777216&e.E||(e.E<<=8,bt(e))}function Mt(e){return o(o(a(e.Jb),e.mc),[4,0])}function Dt(e){e.mc=Gt,e.xc=Gt,e.E=-1,e.Jb=1,e.Oc=0}function bt(e){var r,t=c(p(e.xc,32));if(0!=t||s(e.xc,[4278190080,0])<0){e.mc=o(e.mc,a(e.Jb)),r=e.Oc;do g(e.Ab,r+t),r=255;while(0!=--e.Jb);e.Oc=c(e.xc)>>>24}++e.Jb,e.xc=m(n(e.xc,[16777215,0]),8)}function wt(e,r){return Yt[(2047&(e-r^-r))>>>2]}function Et(e){for(var r,t,o,n=0,s=0,i=e.length,_=[],a=[];i>n;++n,++s){if(r=255&e[n],128&r)if(192==(224&r)){if(n+1>=i)return e;if(t=255&e[++n],128!=(192&t))return e;a[s]=(31&r)<<6|63&t}else{if(224!=(240&r))return e; +if(n+2>=i)return e;if(t=255&e[++n],128!=(192&t))return e;if(o=255&e[++n],128!=(192&o))return e;a[s]=(15&r)<<12|(63&t)<<6|63&o}else{if(!r)return e;a[s]=r}16383==s&&(_.push(String.fromCharCode.apply(String,a)),s=-1)}return s>0&&(a.length=s,_.push(String.fromCharCode.apply(String,a))),_.join("")}function Lt(e){var r,t,o,n=[],s=0,i=e.length;if("object"==typeof e)return e;for(R(e,0,i,n,0),o=0;i>o;++o)r=n[o],r>=1&&127>=r?++s:s+=!r||r>=128&&2047>=r?2:3;for(t=[],s=0,o=0;i>o;++o)r=n[o],r>=1&&127>=r?t[s++]=r<<24>>24:!r||r>=128&&2047>=r?(t[s++]=(192|r>>6&31)<<24>>24,t[s++]=(128|63&r)<<24>>24):(t[s++]=(224|r>>12&15)<<24>>24,t[s++]=(128|r>>6&63)<<24>>24,t[s++]=(128|63&r)<<24>>24);return t}function yt(e){return e[1]+e[0]}function Ct(e,t,o,n){function s(){try{for(var e,r=(new Date).getTime();rr(a.c.yb);)if(i=yt(a.c.yb.Pb)/yt(a.c.Tb),(new Date).getTime()-r>200)return n(i),Nt(s,0),0;n(1),e=S(a.c.Nb),Nt(o.bind(null,e),0)}catch(t){o(null,t)}}var i,_,a={},c=void 0===o&&void 0===n;if("function"!=typeof o&&(_=o,o=n=0),n=n||function(e){return void 0!==_?r(e,_):void 0},o=o||function(e,r){return void 0!==_?postMessage({action:Ft,cbn:_,result:e,error:r}):void 0},c){for(a.c=w({},Lt(e),Vt(t));rr(a.c.yb););return S(a.c.Nb)}try{a.c=w({},Lt(e),Vt(t)),n(0)}catch(u){return o(null,u)}Nt(s,0)}function zt(e,t,o){function n(){try{for(var e,r=0,i=(new Date).getTime();rr(c.d.yb);)if(++r%1e3==0&&(new Date).getTime()-i>200)return _&&(s=yt(c.d.yb.Z.g)/a,o(s)),Nt(n,0),0;o(1),e=Et(S(c.d.Nb)),Nt(t.bind(null,e),0)}catch(u){t(null,u)}}var s,i,_,a,c={},u=void 0===t&&void 0===o;if("function"!=typeof t&&(i=t,t=o=0),o=o||function(e){return void 0!==i?r(_?e:-1,i):void 0},t=t||function(e,r){return void 0!==i?postMessage({action:It,cbn:i,result:e,error:r}):void 0},u){for(c.d=L({},e);rr(c.d.yb););return Et(S(c.d.Nb))}try{c.d=L({},e),a=yt(c.d.Tb),_=a>-1,o(0)}catch(f){return t(null,f)}Nt(n,0)}var Ft=1,It=2,xt=3,Nt="function"==typeof setImmediate?setImmediate:setTimeout,Ot=4294967296,At=[4294967295,-Ot],Ht=[0,-0x8000000000000000],Gt=[0,0],Wt=[1,0],Tt=function(){var e,r,t,o=[];for(e=0;256>e;++e){for(t=e,r=0;8>r;++r)0!=(1&t)?t=t>>>1^-306674912:t>>>=1;o[e]=t}return o}(),Zt=function(){var e,r,t,o=2,n=[0,1];for(t=2;22>t;++t)for(r=1<<(t>>1)-1,e=0;r>e;++e,++o)n[o]=t<<24>>24;return n}(),Yt=function(){var e,r,t,o,n=[];for(r=8;r>=0;--r)for(o=1<<9-r-1,e=1<<9-r,t=o;e>t;++t)n[t]=(r<<6)+(e-t<<6>>>9-r-1);return n}(),Vt=function(){var e=[{s:16,f:64,m:0},{s:20,f:64,m:0},{s:19,f:64,m:1},{s:20,f:64,m:1},{s:21,f:128,m:1},{s:22,f:128,m:1},{s:23,f:128,m:1},{s:24,f:255,m:1},{s:25,f:255,m:1}];return function(r){return e[r-1]||e[6]}}();return"undefined"==typeof onmessage||"undefined"!=typeof window&&void 0!==window.document||!function(){onmessage=function(r){r&&r.gc&&(r.gc.action==It?e.decompress(r.gc.gc,r.gc.cbn):r.gc.action==Ft&&e.compress(r.gc.gc,r.gc.Rc,r.gc.cbn))}}(),{compress:Ct,decompress:zt}}();this.LZMA=this.LZMA_WORKER=e; \ No newline at end of file