-
Notifications
You must be signed in to change notification settings - Fork 0
/
sw.js
1 lines (1 loc) · 43.5 KB
/
sw.js
1
!function(){"use strict";var e={895:function(){try{self["workbox:cacheable-response:7.0.0"]&&_()}catch(e){}},913:function(){try{self["workbox:core:7.0.0"]&&_()}catch(e){}},550:function(){try{self["workbox:expiration:7.0.0"]&&_()}catch(e){}},977:function(){try{self["workbox:precaching:7.0.0"]&&_()}catch(e){}},80:function(){try{self["workbox:routing:7.0.0"]&&_()}catch(e){}},873:function(){try{self["workbox:strategies:7.0.0"]&&_()}catch(e){}}},t={};function s(n){var a=t[n];if(a!==undefined)return a.exports;var r=t[n]={exports:{}};return e[n](r,r.exports,s),r.exports}!function(){s(913);const e=(e,...t)=>{let s=e;return t.length>0&&(s+=` :: ${JSON.stringify(t)}`),s};class t extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}const n=new Set;const a={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},r=e=>[a.prefix,e,a.suffix].filter((e=>e&&e.length>0)).join("-"),i=e=>e||r(a.precache),c=e=>e||r(a.runtime);function o(e,t){const s=new URL(e);for(const n of t)s.searchParams["delete"](n);return s.href}let h;function l(e){e.then((()=>{}))}class u{constructor(){this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}const d=e=>new URL(String(e),location.href).href.replace(new RegExp(`^${location.origin}`),"");function f(e,t){const s=t();return e.waitUntil(s),s}async function p(e,s){let n=null;if(e.url){n=new URL(e.url).origin}if(n!==self.location.origin)throw new t("cross-origin-copy-response",{origin:n});const a=e.clone(),r={headers:new Headers(a.headers),status:a.status,statusText:a.statusText},i=s?s(r):r,c=function(){if(h===undefined){const t=new Response("");if("body"in t)try{new Response(t.body),h=!0}catch(e){h=!1}h=!1}return h}()?a.body:await a.blob();return new Response(c,i)}const g=(e,t)=>t.some((t=>e instanceof t));let w,m;const y=new WeakMap,_=new WeakMap,b=new WeakMap,R=new WeakMap,v=new WeakMap;let x={get(e,t,s){if(e instanceof IDBTransaction){if("done"===t)return _.get(e);if("objectStoreNames"===t)return e.objectStoreNames||b.get(e);if("store"===t)return s.objectStoreNames[1]?undefined:s.objectStore(s.objectStoreNames[0])}return L(e[t])},set(e,t,s){return e[t]=s,!0},has(e,t){return e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e}};function C(e){return e!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(m||(m=[IDBCursor.prototype.advance,IDBCursor.prototype["continue"],IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(q(this),t),L(y.get(this))}:function(...t){return L(e.apply(q(this),t))}:function(t,...s){const n=e.call(q(this),t,...s);return b.set(n,t.sort?t.sort():[t]),L(n)}}function E(e){return"function"==typeof e?C(e):(e instanceof IDBTransaction&&function(e){if(_.has(e))return;const t=new Promise(((t,s)=>{const n=()=>{e.removeEventListener("complete",a),e.removeEventListener("error",r),e.removeEventListener("abort",r)},a=()=>{t(),n()},r=()=>{s(e.error||new DOMException("AbortError","AbortError")),n()};e.addEventListener("complete",a),e.addEventListener("error",r),e.addEventListener("abort",r)}));_.set(e,t)}(e),g(e,w||(w=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(e,x):e)}function L(e){if(e instanceof IDBRequest)return function(e){const t=new Promise(((t,s)=>{const n=()=>{e.removeEventListener("success",a),e.removeEventListener("error",r)},a=()=>{t(L(e.result)),n()},r=()=>{s(e.error),n()};e.addEventListener("success",a),e.addEventListener("error",r)}));return t.then((t=>{t instanceof IDBCursor&&y.set(t,e)}))["catch"]((()=>{})),v.set(t,e),t}(e);if(R.has(e))return R.get(e);const t=E(e);return t!==e&&(R.set(e,t),v.set(t,e)),t}const q=e=>v.get(e);const D=["get","getKey","getAll","getAllKeys","count"],U=["put","add","delete","clear"],k=new Map;function N(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(k.get(t))return k.get(t);const s=t.replace(/FromIndex$/,""),n=t!==s,a=U.includes(s);if(!(s in(n?IDBIndex:IDBObjectStore).prototype)||!a&&!D.includes(s))return;const r=async function(e,...t){const r=this.transaction(e,a?"readwrite":"readonly");let i=r.store;return n&&(i=i.index(t.shift())),(await Promise.all([i[s](...t),a&&r.done]))[0]};return k.set(t,r),r}x=(e=>({...e,get:(t,s,n)=>N(t,s)||e.get(t,s,n),has:(t,s)=>!!N(t,s)||e.has(t,s)}))(x);s(550);const T="cache-entries",I=e=>{const t=new URL(e,location.href);return t.hash="",t.href};class K{constructor(e){this._db=null,this._cacheName=e}_upgradeDb(e){const t=e.createObjectStore(T,{keyPath:"id"});t.createIndex("cacheName","cacheName",{unique:!1}),t.createIndex("timestamp","timestamp",{unique:!1})}_upgradeDbAndDeleteOldDbs(e){this._upgradeDb(e),this._cacheName&&function(e,{blocked:t}={}){const s=indexedDB.deleteDatabase(e);t&&s.addEventListener("blocked",(e=>t(e.oldVersion,e))),L(s).then((()=>undefined))}(this._cacheName)}async setTimestamp(e,t){const s={url:e=I(e),timestamp:t,cacheName:this._cacheName,id:this._getId(e)},n=(await this.getDb()).transaction(T,"readwrite",{durability:"relaxed"});await n.store.put(s),await n.done}async getTimestamp(e){const t=await this.getDb(),s=await t.get(T,this._getId(e));return null==s?void 0:s.timestamp}async expireEntries(e,t){const s=await this.getDb();let n=await s.transaction(T).store.index("timestamp").openCursor(null,"prev");const a=[];let r=0;for(;n;){const s=n.value;s.cacheName===this._cacheName&&(e&&s.timestamp<e||t&&r>=t?a.push(n.value):r++),n=await n["continue"]()}const i=[];for(const c of a)await s["delete"](T,c.id),i.push(c.url);return i}_getId(e){return this._cacheName+"|"+I(e)}async getDb(){return this._db||(this._db=await function(e,t,{blocked:s,upgrade:n,blocking:a,terminated:r}={}){const i=indexedDB.open(e,t),c=L(i);return n&&i.addEventListener("upgradeneeded",(e=>{n(L(i.result),e.oldVersion,e.newVersion,L(i.transaction),e)})),s&&i.addEventListener("blocked",(e=>s(e.oldVersion,e.newVersion,e))),c.then((e=>{r&&e.addEventListener("close",(()=>r())),a&&e.addEventListener("versionchange",(e=>a(e.oldVersion,e.newVersion,e)))}))["catch"]((()=>{})),c}("workbox-expiration",1,{upgrade:this._upgradeDbAndDeleteOldDbs.bind(this)})),this._db}}class M{constructor(e,t={}){this._isRunning=!1,this._rerunRequested=!1,this._maxEntries=t.maxEntries,this._maxAgeSeconds=t.maxAgeSeconds,this._matchOptions=t.matchOptions,this._cacheName=e,this._timestampModel=new K(e)}async expireEntries(){if(this._isRunning)return void(this._rerunRequested=!0);this._isRunning=!0;const e=this._maxAgeSeconds?Date.now()-1e3*this._maxAgeSeconds:0,t=await this._timestampModel.expireEntries(e,this._maxEntries),s=await self.caches.open(this._cacheName);for(const n of t)await s["delete"](n,this._matchOptions);this._isRunning=!1,this._rerunRequested&&(this._rerunRequested=!1,l(this.expireEntries()))}async updateTimestamp(e){await this._timestampModel.setTimestamp(e,Date.now())}async isURLExpired(e){if(this._maxAgeSeconds){const t=await this._timestampModel.getTimestamp(e),s=Date.now()-1e3*this._maxAgeSeconds;return t===undefined||t<s}return!1}async"delete"(){this._rerunRequested=!1,await this._timestampModel.expireEntries(Infinity)}}class P{constructor(e={}){this.cachedResponseWillBeUsed=async({event:e,request:t,cacheName:s,cachedResponse:n})=>{if(!n)return null;const a=this._isResponseDateFresh(n),r=this._getCacheExpiration(s);l(r.expireEntries());const i=r.updateTimestamp(t.url);if(e)try{e.waitUntil(i)}catch(c){0}return a?n:null},this.cacheDidUpdate=async({cacheName:e,request:t})=>{const s=this._getCacheExpiration(e);await s.updateTimestamp(t.url),await s.expireEntries()},this._config=e,this._maxAgeSeconds=e.maxAgeSeconds,this._cacheExpirations=new Map,e.purgeOnQuotaError&&function(e){n.add(e)}((()=>this.deleteCacheAndMetadata()))}_getCacheExpiration(e){if(e===c())throw new t("expire-custom-caches-only");let s=this._cacheExpirations.get(e);return s||(s=new M(e,this._config),this._cacheExpirations.set(e,s)),s}_isResponseDateFresh(e){if(!this._maxAgeSeconds)return!0;const t=this._getDateHeaderTimestamp(e);if(null===t)return!0;return t>=Date.now()-1e3*this._maxAgeSeconds}_getDateHeaderTimestamp(e){if(!e.headers.has("date"))return null;const t=e.headers.get("date"),s=new Date(t).getTime();return isNaN(s)?null:s}async deleteCacheAndMetadata(){for(const[e,t]of this._cacheExpirations)await self.caches["delete"](e),await t["delete"]();this._cacheExpirations=new Map}}s(977);function A(e){if(!e)throw new t("add-to-cache-list-unexpected-type",{entry:e});if("string"==typeof e){const t=new URL(e,location.href);return{cacheKey:t.href,url:t.href}}const{revision:s,url:n}=e;if(!n)throw new t("add-to-cache-list-unexpected-type",{entry:e});if(!s){const e=new URL(n,location.href);return{cacheKey:e.href,url:e.href}}const a=new URL(n,location.href),r=new URL(n,location.href);return a.searchParams.set("__WB_REVISION__",s),{cacheKey:a.href,url:r.href}}class S{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)},this.cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:s})=>{if("install"===e.type&&t&&t.originalRequest&&t.originalRequest instanceof Request){const e=t.originalRequest.url;s?this.notUpdatedURLs.push(e):this.updatedURLs.push(e)}return s}}}class O{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:e,params:t})=>{const s=(null==t?void 0:t.cacheKey)||this._precacheController.getCacheKeyForURL(e.url);return s?new Request(s,{headers:e.headers}):e},this._precacheController=e}}s(873);function W(e){return"string"==typeof e?new Request(e):e}class B{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new u,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(const s of this._plugins)this._pluginStateMap.set(s,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){const{event:s}=this;let n=W(e);if("navigate"===n.mode&&s instanceof FetchEvent&&s.preloadResponse){const e=await s.preloadResponse;if(e)return e}const a=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const e of this.iterateCallbacks("requestWillFetch"))n=await e({request:n.clone(),event:s})}catch(i){if(i instanceof Error)throw new t("plugin-error-request-will-fetch",{thrownErrorMessage:i.message})}const r=n.clone();try{let e;e=await fetch(n,"navigate"===n.mode?undefined:this._strategy.fetchOptions);for(const t of this.iterateCallbacks("fetchDidSucceed"))e=await t({event:s,request:r,response:e});return e}catch(c){throw a&&await this.runCallbacks("fetchDidFail",{error:c,event:s,originalRequest:a.clone(),request:r.clone()}),c}}async fetchAndCachePut(e){const t=await this.fetch(e),s=t.clone();return this.waitUntil(this.cachePut(e,s)),t}async cacheMatch(e){const t=W(e);let s;const{cacheName:n,matchOptions:a}=this._strategy,r=await this.getCacheKey(t,"read"),i=Object.assign(Object.assign({},a),{cacheName:n});s=await caches.match(r,i);for(const c of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await c({cacheName:n,matchOptions:a,cachedResponse:s,request:r,event:this.event})||undefined;return s}async cachePut(e,s){const a=W(e);var r;await(r=0,new Promise((e=>setTimeout(e,r))));const i=await this.getCacheKey(a,"write");if(!s)throw new t("cache-put-with-no-response",{url:d(i.url)});const c=await this._ensureResponseSafeToCache(s);if(!c)return!1;const{cacheName:h,matchOptions:l}=this._strategy,u=await self.caches.open(h),f=this.hasCallback("cacheDidUpdate"),p=f?await async function(e,t,s,n){const a=o(t.url,s);if(t.url===a)return e.match(t,n);const r=Object.assign(Object.assign({},n),{ignoreSearch:!0}),i=await e.keys(t,r);for(const c of i)if(a===o(c.url,s))return e.match(c,n)}(u,i.clone(),["__WB_REVISION__"],l):null;try{await u.put(i,f?c.clone():c)}catch(g){if(g instanceof Error)throw"QuotaExceededError"===g.name&&await async function(){for(const e of n)await e()}(),g}for(const t of this.iterateCallbacks("cacheDidUpdate"))await t({cacheName:h,oldResponse:p,newResponse:c.clone(),request:i,event:this.event});return!0}async getCacheKey(e,t){const s=`${e.url} | ${t}`;if(!this._cacheKeys[s]){let n=e;for(const e of this.iterateCallbacks("cacheKeyWillBeUsed"))n=W(await e({mode:t,request:n,event:this.event,params:this.params}));this._cacheKeys[s]=n}return this._cacheKeys[s]}hasCallback(e){for(const t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(const s of this.iterateCallbacks(e))await s(t)}*iterateCallbacks(e){for(const t of this._strategy.plugins)if("function"==typeof t[e]){const s=this._pluginStateMap.get(t),n=n=>{const a=Object.assign(Object.assign({},n),{state:s});return t[e](a)};yield n}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){let e;for(;e=this._extendLifetimePromises.shift();)await e}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let t=e,s=!1;for(const n of this.iterateCallbacks("cacheWillUpdate"))if(t=await n({request:this.request,response:t,event:this.event})||undefined,s=!0,!t)break;return s||t&&200!==t.status&&(t=undefined),t}}class j{constructor(e={}){this.cacheName=c(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){const[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});const t=e.event,s="string"==typeof e.request?new Request(e.request):e.request,n="params"in e?e.params:undefined,a=new B(this,{event:t,request:s,params:n}),r=this._getResponse(a,s,t);return[r,this._awaitComplete(r,a,s,t)]}async _getResponse(e,s,n){await e.runCallbacks("handlerWillStart",{event:n,request:s});let a=undefined;try{if(a=await this._handle(s,e),!a||"error"===a.type)throw new t("no-response",{url:s.url})}catch(r){if(r instanceof Error)for(const t of e.iterateCallbacks("handlerDidError"))if(a=await t({error:r,event:n,request:s}),a)break;if(!a)throw r}for(const t of e.iterateCallbacks("handlerWillRespond"))a=await t({event:n,request:s,response:a});return a}async _awaitComplete(e,t,s,n){let a,r;try{a=await e}catch(r){}try{await t.runCallbacks("handlerDidRespond",{event:n,request:s,response:a}),await t.doneWaiting()}catch(i){i instanceof Error&&(r=i)}if(await t.runCallbacks("handlerDidComplete",{event:n,request:s,response:a,error:r}),t.destroy(),r)throw r}}class F extends j{constructor(e={}){e.cacheName=i(e.cacheName),super(e),this._fallbackToNetwork=!1!==e.fallbackToNetwork,this.plugins.push(F.copyRedirectedCacheableResponsesPlugin)}async _handle(e,t){const s=await t.cacheMatch(e);return s||(t.event&&"install"===t.event.type?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,s){let n;const a=s.params||{};if(!this._fallbackToNetwork)throw new t("missing-precache-entry",{cacheName:this.cacheName,url:e.url});{0;const t=a.integrity,r=e.integrity,i=!r||r===t;if(n=await s.fetch(new Request(e,{integrity:"no-cors"!==e.mode?r||t:undefined})),t&&i&&"no-cors"!==e.mode){this._useDefaultCacheabilityPluginIfNeeded();await s.cachePut(e,n.clone());0}}return n}async _handleInstall(e,s){this._useDefaultCacheabilityPluginIfNeeded();const n=await s.fetch(e);if(!(await s.cachePut(e,n.clone())))throw new t("bad-precaching-response",{url:e.url,status:n.status});return n}_useDefaultCacheabilityPluginIfNeeded(){let e=null,t=0;for(const[s,n]of this.plugins.entries())n!==F.copyRedirectedCacheableResponsesPlugin&&(n===F.defaultPrecacheCacheabilityPlugin&&(e=s),n.cacheWillUpdate&&t++);0===t?this.plugins.push(F.defaultPrecacheCacheabilityPlugin):t>1&&null!==e&&this.plugins.splice(e,1)}}F.defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:e}){return!e||e.status>=400?null:e}},F.copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:e}){return e.redirected?await p(e):e}};class H{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:s=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new F({cacheName:i(e),plugins:[...t,new O({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this._strategy}precache(e){this.addToCacheList(e),this._installAndActiveListenersAdded||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this._installAndActiveListenersAdded=!0)}addToCacheList(e){const s=[];for(const n of e){"string"==typeof n?s.push(n):n&&n.revision===undefined&&s.push(n.url);const{cacheKey:e,url:a}=A(n),r="string"!=typeof n&&n.revision?"reload":"default";if(this._urlsToCacheKeys.has(a)&&this._urlsToCacheKeys.get(a)!==e)throw new t("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(a),secondEntry:e});if("string"!=typeof n&&n.integrity){if(this._cacheKeysToIntegrities.has(e)&&this._cacheKeysToIntegrities.get(e)!==n.integrity)throw new t("add-to-cache-list-conflicting-integrities",{url:a});this._cacheKeysToIntegrities.set(e,n.integrity)}if(this._urlsToCacheKeys.set(a,e),this._urlsToCacheModes.set(a,r),s.length>0){const e=`Workbox is precaching URLs without revision info: ${s.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(e)}}}install(e){return f(e,(async()=>{const t=new S;this.strategy.plugins.push(t);for(const[a,r]of this._urlsToCacheKeys){const t=this._cacheKeysToIntegrities.get(r),s=this._urlsToCacheModes.get(a),n=new Request(a,{integrity:t,cache:s,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:r},request:n,event:e}))}const{updatedURLs:s,notUpdatedURLs:n}=t;return{updatedURLs:s,notUpdatedURLs:n}}))}activate(e){return f(e,(async()=>{const e=await self.caches.open(this.strategy.cacheName),t=await e.keys(),s=new Set(this._urlsToCacheKeys.values()),n=[];for(const a of t)s.has(a.url)||(await e["delete"](a),n.push(a.url));return{deletedURLs:n}}))}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){const t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){const t=e instanceof Request?e.url:e,s=this.getCacheKeyForURL(t);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}return undefined}createHandlerBoundToURL(e){const s=this.getCacheKeyForURL(e);if(!s)throw new t("non-precached-url",{url:e});return t=>(t.request=new Request(e),t.params=Object.assign({cacheKey:s},t.params),this.strategy.handle(t))}}let V;const $=()=>(V||(V=new H),V);s(80);const G=e=>e&&"object"==typeof e?e:{handle:e};class Q{constructor(e,t,s="GET"){this.handler=G(t),this.match=e,this.method=s}setCatchHandler(e){this.catchHandler=G(e)}}class J extends Q{constructor(e,t,s){super((({url:t})=>{const s=e.exec(t.href);if(s&&(t.origin===location.origin||0===s.index))return s.slice(1)}),t,s)}}class z{constructor(){this._routes=new Map,this._defaultHandlerMap=new Map}get routes(){return this._routes}addFetchListener(){self.addEventListener("fetch",(e=>{const{request:t}=e,s=this.handleRequest({request:t,event:e});s&&e.respondWith(s)}))}addCacheListener(){self.addEventListener("message",(e=>{if(e.data&&"CACHE_URLS"===e.data.type){const{payload:t}=e.data;0;const s=Promise.all(t.urlsToCache.map((t=>{"string"==typeof t&&(t=[t]);const s=new Request(...t);return this.handleRequest({request:s,event:e})})));e.waitUntil(s),e.ports&&e.ports[0]&&s.then((()=>e.ports[0].postMessage(!0)))}}))}handleRequest({request:e,event:t}){const s=new URL(e.url,location.href);if(!s.protocol.startsWith("http"))return void 0;const n=s.origin===location.origin,{params:a,route:r}=this.findMatchingRoute({event:t,request:e,sameOrigin:n,url:s});let i=r&&r.handler;const c=e.method;if(!i&&this._defaultHandlerMap.has(c)&&(i=this._defaultHandlerMap.get(c)),!i)return void 0;let o;try{o=i.handle({url:s,request:e,event:t,params:a})}catch(l){o=Promise.reject(l)}const h=r&&r.catchHandler;return o instanceof Promise&&(this._catchHandler||h)&&(o=o["catch"]((async n=>{if(h){0;try{return await h.handle({url:s,request:e,event:t,params:a})}catch(r){r instanceof Error&&(n=r)}}if(this._catchHandler)return this._catchHandler.handle({url:s,request:e,event:t});throw n}))),o}findMatchingRoute({url:e,sameOrigin:t,request:s,event:n}){const a=this._routes.get(s.method)||[];for(const r of a){let a;const i=r.match({url:e,sameOrigin:t,request:s,event:n});if(i)return a=i,(Array.isArray(a)&&0===a.length||i.constructor===Object&&0===Object.keys(i).length||"boolean"==typeof i)&&(a=undefined),{route:r,params:a}}return{}}setDefaultHandler(e,t="GET"){this._defaultHandlerMap.set(t,G(e))}setCatchHandler(e){this._catchHandler=G(e)}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new t("unregister-route-but-not-found-with-method",{method:e.method});const s=this._routes.get(e.method).indexOf(e);if(!(s>-1))throw new t("unregister-route-route-not-registered");this._routes.get(e.method).splice(s,1)}}let X;const Y=()=>(X||(X=new z,X.addFetchListener(),X.addCacheListener()),X);function Z(e,s,n){let a;if("string"==typeof e){const t=new URL(e,location.href);0;a=new Q((({url:e})=>e.href===t.href),s,n)}else if(e instanceof RegExp)a=new J(e,s,n);else if("function"==typeof e)a=new Q(e,s,n);else{if(!(e instanceof Q))throw new t("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});a=e}return Y().registerRoute(a),a}class ee extends Q{constructor(e,t){super((({request:s})=>{const n=e.getURLsToCacheKeys();for(const a of function*(e,{ignoreURLParametersMatching:t=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:a}={}){const r=new URL(e,location.href);r.hash="",yield r.href;const i=function(e,t=[]){for(const s of[...e.searchParams.keys()])t.some((e=>e.test(s)))&&e.searchParams["delete"](s);return e}(r,t);if(yield i.href,s&&i.pathname.endsWith("/")){const e=new URL(i.href);e.pathname+=s,yield e.href}if(n){const e=new URL(i.href);e.pathname+=".html",yield e.href}if(a){const e=a({url:r});for(const t of e)yield t.href}}(s.url,t)){const t=n.get(a);if(t){return{cacheKey:t,integrity:e.getIntegrityForCacheKey(t)}}}}),e.strategy)}}function te(e){$().precache(e)}class se extends j{async _handle(e,s){let n=await s.cacheMatch(e),a=undefined;if(n)0;else{0;try{n=await s.fetchAndCachePut(e)}catch(r){r instanceof Error&&(a=r)}0}if(!n)throw new t("no-response",{url:e.url,error:a});return n}}const ne={cacheWillUpdate:async({response:e})=>200===e.status||0===e.status?e:null};class ae extends j{constructor(e={}){super(e),this.plugins.some((e=>"cacheWillUpdate"in e))||this.plugins.unshift(ne)}async _handle(e,s){const n=s.fetchAndCachePut(e)["catch"]((()=>{}));s.waitUntil(n);let a,r=await s.cacheMatch(e);if(r)0;else{0;try{r=await n}catch(i){i instanceof Error&&(a=i)}}if(!r)throw new t("no-response",{url:e.url,error:a});return r}}var re;s(895);class ie{constructor(e={}){this._statuses=e.statuses,this._headers=e.headers}isResponseCacheable(e){let t=!0;return this._statuses&&(t=this._statuses.includes(e.status)),this._headers&&t&&(t=Object.keys(this._headers).some((t=>e.headers.get(t)===this._headers[t]))),t}}class ce{constructor(e){this.cacheWillUpdate=async({response:e})=>this._cacheableResponse.isResponseCacheable(e)?e:null,this._cacheableResponse=new ie(e)}}self.addEventListener("activate",(()=>self.clients.claim())),self.skipWaiting(),te([{'revision':'f457ca7e40f34454692d8282a19d0cb7','url':'404.html'},{'revision':'90cacae597639d9f87333c7660b2dfa8','url':'about.html'},{'revision':'3a9b712aaca32c3e9d5fac7088263e64','url':'app/calc/currency.html'},{'revision':'316db43f02f295f3b3dd80d6dffbae00','url':'app/calc/index.html'},{'revision':'66fb4ef72e2ec1029ef8741a29aad32c','url':'app/calc/percent.html'},{'revision':'7237fa27579070c468c2ab72e15cabe1','url':'app/calc/ratio.html'},{'revision':'374d9c65260ccbffee58ebca6f373c83','url':'app/index.html'},{'revision':'b25d928c400d72f5ec8f42c2ecf25984','url':'app/pw.html'},{'revision':'be00070bc961090ef59db9448fe3e65e','url':'app/qr/decode.html'},{'revision':'e7894273c4b622e8b9749bd7007742b2','url':'app/qr/gen.html'},{'revision':'62447180e33d9df99dd450a2af57441f','url':'app/qr/index.html'},{'revision':'2ea053269529f972bbf0f572e3e80557','url':'assets/css/client.css'},{'revision':'db9f4533754ce28129fbf9507c9b1240','url':'assets/fonts/lg.svg'},{'revision':'13e892a28dda2567a981344188df5567','url':'assets/fonts/lg.ttf'},{'revision':'ba38ec746a64d70d0a68e838664d3418','url':'assets/fonts/lg.woff'},{'revision':'6d51beed3e04fc77a601da05002367d5','url':'assets/fonts/lg.woff2'},{'revision':'52fe03d38cef5c86c0338dcb4043941a','url':'assets/js/chunk/102.js'},{'revision':'0353bd8e879199c3c241050ed5534c7d','url':'assets/js/chunk/134.js'},{'revision':'3556f41d0df11c0522651bce9beb0af1','url':'assets/js/chunk/141.js'},{'revision':'ef671a2bcb0b7c7621dec352e15664a7','url':'assets/js/chunk/16.js'},{'revision':'b4de5b5d23b42ffcfc2ce7e73f8580a4','url':'assets/js/chunk/161.js'},{'revision':'c24097a0711fc2c1cda92cbfe3799701','url':'assets/js/chunk/241.js'},{'revision':'6a89750a236afab89f38d163eca7b4e2','url':'assets/js/chunk/272.js'},{'revision':'72301d26014ce70fc48bc1296e113fa5','url':'assets/js/chunk/283.js'},{'revision':'66c6d865e1372d5451676ee72f8654ef','url':'assets/js/chunk/312.js'},{'revision':'397abd9fce41282837746bd4f38e32a0','url':'assets/js/chunk/313.js'},{'revision':'eba771b6ace7db41e2fd2311fe2f0cb8','url':'assets/js/chunk/328.js'},{'revision':'910995edd70e3bf980150a6db17d776d','url':'assets/js/chunk/379.js'},{'revision':'0dd6189acdc4449cabdee6dc073c6fe8','url':'assets/js/chunk/391.js'},{'revision':'308a78631e3549aab51d854a30ee40f9','url':'assets/js/chunk/402.js'},{'revision':'84e3be8c82f6d0ebf84198e1b31abe56','url':'assets/js/chunk/427.js'},{'revision':'9a654751313f6b633132da52b28faf0b','url':'assets/js/chunk/454.js'},{'revision':'af8cc210ef54a0612bff854b15a81241','url':'assets/js/chunk/462.js'},{'revision':'7370ee81f6c4d78b68c0e07dc257d706','url':'assets/js/chunk/519.js'},{'revision':'5bb015985dbb87b461fb9d23a1bbb1fb','url':'assets/js/chunk/631.js'},{'revision':'5135f106266e1dc25443dcdc4feb3963','url':'assets/js/chunk/660.js'},{'revision':'06ce283201bbd3498dbcac3ddce012bc','url':'assets/js/chunk/677.js'},{'revision':'44e55d2cb78bdf7db973cd692fc89608','url':'assets/js/chunk/691.js'},{'revision':'5b80ffa98accb416bb8c1cd9b757f80a','url':'assets/js/chunk/737.js'},{'revision':'c26f3a07f80fea1a218c0b5c1b4ce489','url':'assets/js/chunk/794.js'},{'revision':'740ad0f07a337434c5ded2a7a2724324','url':'assets/js/chunk/832.js'},{'revision':'5b88e7094633ef1e5fe2d15f83284ecc','url':'assets/js/chunk/834.js'},{'revision':'72e92dc91d08fdf6b8a590446ac65947','url':'assets/js/chunk/916.js'},{'revision':'0a7e670ffb1ac68c90bc2a3b4f4f650f','url':'assets/js/chunk/919.js'},{'revision':'d1b3d1d27174426b2f3cae5fafdfde10','url':'assets/js/chunk/935.js'},{'revision':'cf609d611494ab3450061b6ddee2ec8c','url':'assets/js/chunk/94.js'},{'revision':'fd5d5702ae97abdfa51a5f18081d2b5a','url':'assets/js/chunk/942.js'},{'revision':'8c68922feba2d83ffd0836f169b644ff','url':'assets/js/client.js'},{'revision':'cd846e7fc6fb1e97638439298ed4921d','url':'assets/js/legacy.js'},{'revision':'376a22ea4d0aaff6571557954c75bcc4','url':'assets/media/base/dark/favicon/100x100.png'},{'revision':'cb5c21f3779b3a0aa65e64238bee98ef','url':'assets/media/base/dark/favicon/1024x1024.png'},{'revision':'3e87a019e7a2f773ef314328f0ac9fe5','url':'assets/media/base/dark/favicon/107x107.png'},{'revision':'f81ab930ab7b390f407f5e65236524ef','url':'assets/media/base/dark/favicon/114x114.png'},{'revision':'ff229827c54b43c595fb89613de51cdf','url':'assets/media/base/dark/favicon/120x120.png'},{'revision':'c6ce5107b9cd22ddbba15696957e580a','url':'assets/media/base/dark/favicon/1240x1240.png'},{'revision':'c3ec146fcb9954847ad421d130ed9084','url':'assets/media/base/dark/favicon/1240x600.png'},{'revision':'bfbc87388f37c5f46f1c925e23e4f6ed','url':'assets/media/base/dark/favicon/128x128.png'},{'revision':'74bd89417c57edd52f964ec3ed241aa9','url':'assets/media/base/dark/favicon/142x142.png'},{'revision':'3472c763f0ead26feebf0b7e044c71b6','url':'assets/media/base/dark/favicon/144x144.png'},{'revision':'e7f0dd4910813e9e7ad892363f21b4d8','url':'assets/media/base/dark/favicon/150x150.png'},{'revision':'9bcca945dfea7a58f3a3ee8c0195599d','url':'assets/media/base/dark/favicon/152x152.png'},{'revision':'2ebfb3eab8493505d41c2f333d5a8246','url':'assets/media/base/dark/favicon/167x167.png'},{'revision':'c6297cd735eeb26fef6060c6135fb0d8','url':'assets/media/base/dark/favicon/16x16.png'},{'revision':'a9edd880719e7eedda8ee510654651de','url':'assets/media/base/dark/favicon/16x16.svg'},{'revision':'ab93616f924c03e2a00693864b386bc2','url':'assets/media/base/dark/favicon/176x176.png'},{'revision':'c10d47fafa1a9b283e19fab3dffbc48d','url':'assets/media/base/dark/favicon/180x180.png'},{'revision':'3b45662918a072dc5cab21f4288fa1dc','url':'assets/media/base/dark/favicon/188x188.png'},{'revision':'33e900227e344655adb8119b7d2ee6f6','url':'assets/media/base/dark/favicon/192x192.png'},{'revision':'dae95081e9c7f94b92d2fdbd4807e9ec','url':'assets/media/base/dark/favicon/200x200.png'},{'revision':'cb5e5c8769e6f2abd4eddd7f8c3584d4','url':'assets/media/base/dark/favicon/20x20.png'},{'revision':'060d4f2629a0b0c4ab16794f2b9c1e2b','url':'assets/media/base/dark/favicon/225x225.png'},{'revision':'bcaff5db85646ce9d78325eea61756fe','url':'assets/media/base/dark/favicon/2480x1200.png'},{'revision':'859b857ea818a7c443e181f734915364','url':'assets/media/base/dark/favicon/24x24.png'},{'revision':'3a50a2b88101f6494abc4038534054e0','url':'assets/media/base/dark/favicon/256x256.png'},{'revision':'ed24ebd35f0c3cbf38bd2393498a2d2b','url':'assets/media/base/dark/favicon/284x284.png'},{'revision':'07e375c5563b63a3dbee04e08186edcf','url':'assets/media/base/dark/favicon/29x29.png'},{'revision':'a04ee60c81441a6cdfef9cc071d45fcb','url':'assets/media/base/dark/favicon/300x300.png'},{'revision':'cb7ed9d630e795f9cd66461b078b2223','url':'assets/media/base/dark/favicon/30x30.png'},{'revision':'4a731e5abea363b6a4ed4165efee94ef','url':'assets/media/base/dark/favicon/310x150.png'},{'revision':'e2bf23caddf6d8d38a0c7744a60ccbf7','url':'assets/media/base/dark/favicon/310x310.png'},{'revision':'25c6f7012b1057d50ae6d5b22e968089','url':'assets/media/base/dark/favicon/32x32.png'},{'revision':'c53dbc019c053c2afd6c7bef07733449','url':'assets/media/base/dark/favicon/36x36.png'},{'revision':'47ed7c21b821f42bc6007b5d197c92c9','url':'assets/media/base/dark/favicon/384x384.png'},{'revision':'779967f8a1c4b99254c92025988f5c19','url':'assets/media/base/dark/favicon/388x188.png'},{'revision':'87ef22acfd6d8a60265ccc1baec31fe7','url':'assets/media/base/dark/favicon/388x388.png'},{'revision':'c93e2e995c9acc8d69b9df1360f5b65e','url':'assets/media/base/dark/favicon/40x40.png'},{'revision':'d57d4ad7ac1b9ee52933adf16add5ab6','url':'assets/media/base/dark/favicon/44x44.png'},{'revision':'1db65c0dd07629ebe8e96569f33e3927','url':'assets/media/base/dark/favicon/465x225.png'},{'revision':'94565c7c213a3aba8c6b0eeec253ff92','url':'assets/media/base/dark/favicon/465x465.png'},{'revision':'cde9c632f33883fc4c63efbf68e12c14','url':'assets/media/base/dark/favicon/48x48.png'},{'revision':'879c7d59614c70653695e012537a58a5','url':'assets/media/base/dark/favicon/50x50.png'},{'revision':'bbde59775f27a182cd6d572adc5980df','url':'assets/media/base/dark/favicon/512x512.png'},{'revision':'8422d3debc298ef0bf6a5b8edf7ead3d','url':'assets/media/base/dark/favicon/55x55.png'},{'revision':'369ec200e40c3d24d58278492607ce17','url':'assets/media/base/dark/favicon/57x57.png'},{'revision':'1f65943e0870afe7d63f9871a045f9de','url':'assets/media/base/dark/favicon/58x58.png'},{'revision':'545eaf434c916f1a2911990a7d103f4e','url':'assets/media/base/dark/favicon/600x600.png'},{'revision':'703b385134bbfdc9f3bace836c63f148','url':'assets/media/base/dark/favicon/60x60.png'},{'revision':'72b0cbe232c86d9d4dc3c25fe504d774','url':'assets/media/base/dark/favicon/620x300.png'},{'revision':'1ea0d6f1efbf3683d442a714f8de9b83','url':'assets/media/base/dark/favicon/620x620.png'},{'revision':'d92eac450943ed38bec5cdcf6cef6e98','url':'assets/media/base/dark/favicon/63x63.png'},{'revision':'21c7cb988170342a696714563ab19bfe','url':'assets/media/base/dark/favicon/64x64.png'},{'revision':'d0dc613e3c84a5df76037b2ecb0aae3b','url':'assets/media/base/dark/favicon/66x66.png'},{'revision':'35d88c58144641f22b94bad2f85e9954','url':'assets/media/base/dark/favicon/70x70.png'},{'revision':'f2f5ea998ab512f0d2beae00b091ea7a','url':'assets/media/base/dark/favicon/71x71.png'},{'revision':'5391b398319b6b7cc87028f17b8376f0','url':'assets/media/base/dark/favicon/72x72.png'},{'revision':'8d36158f702108b4ccc647d22570bd6a','url':'assets/media/base/dark/favicon/75x75.png'},{'revision':'d1d17a87fdd8eaa454e1ad37eb0bf5c6','url':'assets/media/base/dark/favicon/76x76.png'},{'revision':'c9395f34439422bc3bfe2737cfd71098','url':'assets/media/base/dark/favicon/775x375.png'},{'revision':'f5aa666fb7d5728517ed645f06d046c9','url':'assets/media/base/dark/favicon/80x80.png'},{'revision':'1aaeb2c2a9d665e2b117a88e05eb5470','url':'assets/media/base/dark/favicon/87x87.png'},{'revision':'3bfe6878a11ab783545e2702f7f8ca65','url':'assets/media/base/dark/favicon/88x88.png'},{'revision':'8e1b9ca9e1d83b0e74338aa50041ed8e','url':'assets/media/base/dark/favicon/89x89.png'},{'revision':'97c16948b0f33e66ed8db87f1ae69634','url':'assets/media/base/dark/favicon/930x450.png'},{'revision':'7bdafba87ed65288aac91e6be41bc557','url':'assets/media/base/dark/favicon/96x96.png'},{'revision':'3d5731735aacd685349f1042dfdd187b','url':'assets/media/base/dark/logo-wide.png'},{'revision':'8b9db7c00aaad30372a95956c78d90c0','url':'assets/media/base/dark/logo.png'},{'revision':'d7df805b88bdcfe8fce2e2f9c7ba1055','url':'assets/media/base/dark/og/default.png'},{'revision':'bf270d5f173c8349184abae3f81d36f2','url':'assets/media/base/dark/screenshot.jpeg'},{'revision':'ec7b521424c7030d8c262d4c123bfaa1','url':'assets/media/base/dark/shortcut/about.png'},{'revision':'4ee3556c17109c45333073bb6d80120c','url':'assets/media/base/dark/shortcut/app.png'},{'revision':'12894f6931b791b82f2709be56d89ccb','url':'assets/media/base/dark/shortcut/contact.png'},{'revision':'e503cc30db59d7c75f41888680657cfe','url':'assets/media/base/dark/shortcut/service.png'},{'revision':'4ca002e683693deacc6d6e38db0255a7','url':'assets/media/base/light/favicon/100x100.png'},{'revision':'297b82a1265f35f7dee6b6d8593c59e7','url':'assets/media/base/light/favicon/1024x1024.png'},{'revision':'3eed1c06d5019f61aa4fea8176924044','url':'assets/media/base/light/favicon/107x107.png'},{'revision':'42c07e682a540754559f6eec8b086ba1','url':'assets/media/base/light/favicon/114x114.png'},{'revision':'defa00dd442292a851fb23134c8060f5','url':'assets/media/base/light/favicon/120x120.png'},{'revision':'ba55bdb01bb5ba4faf1994708b9965f8','url':'assets/media/base/light/favicon/1240x1240.png'},{'revision':'d23bc5ae4c021674b8a97acf42fd330d','url':'assets/media/base/light/favicon/1240x600.png'},{'revision':'74dbae8c553821c58adca2cde712cc90','url':'assets/media/base/light/favicon/128x128.png'},{'revision':'1ed6bdfd97608aa3efd4e6171c1b9d30','url':'assets/media/base/light/favicon/142x142.png'},{'revision':'16f5058cbab6a7190b2dd4adc3bd6b0f','url':'assets/media/base/light/favicon/144x144.png'},{'revision':'abb44962e8b62e2332bff7e0873f6a25','url':'assets/media/base/light/favicon/150x150.png'},{'revision':'b2adc7cf7f58c187d94d8f220b58d49d','url':'assets/media/base/light/favicon/152x152.png'},{'revision':'080c66ef866ba19a07755bb2cb4b9506','url':'assets/media/base/light/favicon/167x167.png'},{'revision':'d9fc27935a6a8c1991eb61c2c7439e62','url':'assets/media/base/light/favicon/16x16.png'},{'revision':'7c36c800bc94f25aa504b01573827ff0','url':'assets/media/base/light/favicon/16x16.svg'},{'revision':'99544ec1e5054192c736b119e34e211f','url':'assets/media/base/light/favicon/176x176.png'},{'revision':'5f0712c45f61be40afb18f330630b6b5','url':'assets/media/base/light/favicon/180x180.png'},{'revision':'31a75217c1d96ca82a68942fc4fa15ce','url':'assets/media/base/light/favicon/188x188.png'},{'revision':'ddf48d41f265e2d99ce53d94ee003c64','url':'assets/media/base/light/favicon/192x192.png'},{'revision':'16ac1e25a867615d56b4dd18efb329a9','url':'assets/media/base/light/favicon/200x200.png'},{'revision':'31bfa489a02f6a3b484ad19548b2dc5b','url':'assets/media/base/light/favicon/20x20.png'},{'revision':'c33d0d1849d159a97d841b0ff1eb1468','url':'assets/media/base/light/favicon/225x225.png'},{'revision':'a213968595ea5fcf755eb2282b85a987','url':'assets/media/base/light/favicon/2480x1200.png'},{'revision':'1f18a0154d82ebb402e5902914311972','url':'assets/media/base/light/favicon/24x24.png'},{'revision':'8fd78c7293bdf92d68f156b0fbfb235a','url':'assets/media/base/light/favicon/256x256.png'},{'revision':'475e3a7602ed1757792b50c7edc57c01','url':'assets/media/base/light/favicon/284x284.png'},{'revision':'ebb4336786ef11726db675e9fb150ebd','url':'assets/media/base/light/favicon/29x29.png'},{'revision':'e89b96a71afbec3ea6412a5746e632ca','url':'assets/media/base/light/favicon/300x300.png'},{'revision':'d4774200eb8fe458a26dba93a5b71a20','url':'assets/media/base/light/favicon/30x30.png'},{'revision':'358d0defd2cfcfa36600477eb033ebeb','url':'assets/media/base/light/favicon/310x150.png'},{'revision':'013050597fdddef1058158a655456d57','url':'assets/media/base/light/favicon/310x310.png'},{'revision':'c41d38fb0cdd4650a00a489936a48b2e','url':'assets/media/base/light/favicon/32x32.png'},{'revision':'3c558485df0b4c11dcc1d7988701495d','url':'assets/media/base/light/favicon/36x36.png'},{'revision':'6e1be2331bedcc3133619d5025d2f532','url':'assets/media/base/light/favicon/384x384.png'},{'revision':'b0cd2cc8edb60c5ed347741378589e9e','url':'assets/media/base/light/favicon/388x188.png'},{'revision':'84d66a1bfbffc7d99248fe43f0e0cd77','url':'assets/media/base/light/favicon/388x388.png'},{'revision':'9e128ac848e956caa87607492778391c','url':'assets/media/base/light/favicon/40x40.png'},{'revision':'918927e8715acfda0aa0a702f445330a','url':'assets/media/base/light/favicon/44x44.png'},{'revision':'fe23fc6cb40d917920f9eb5f5354e692','url':'assets/media/base/light/favicon/465x225.png'},{'revision':'3add979ae180d04ab0cc89bc312af819','url':'assets/media/base/light/favicon/465x465.png'},{'revision':'4f78e3911d0d4d3e56a73d947157a165','url':'assets/media/base/light/favicon/48x48.png'},{'revision':'787d8437bd8bc17bba3fa1763a811399','url':'assets/media/base/light/favicon/50x50.png'},{'revision':'8605172c7656f1db47ca850686847109','url':'assets/media/base/light/favicon/512x512.png'},{'revision':'630909fcea8ce427d66ce99a0b0e5b64','url':'assets/media/base/light/favicon/55x55.png'},{'revision':'b7caf719a2e3680b41661846905fc17f','url':'assets/media/base/light/favicon/57x57.png'},{'revision':'a40b5b630f5bbbecdd4e1912317105f6','url':'assets/media/base/light/favicon/58x58.png'},{'revision':'d9bb05f6ccbd96cdd23f0552b9810e9f','url':'assets/media/base/light/favicon/600x600.png'},{'revision':'963ad99c0fb7641558d5d642a10df2d3','url':'assets/media/base/light/favicon/60x60.png'},{'revision':'ba11118ab78898f2ef29725b63f8b52b','url':'assets/media/base/light/favicon/620x300.png'},{'revision':'fdf0de297b05561bd80baef05b6f0170','url':'assets/media/base/light/favicon/620x620.png'},{'revision':'02c69066a1f452b0ca983e909ca22483','url':'assets/media/base/light/favicon/63x63.png'},{'revision':'892f857ea1a537cd8055ed5cb29cc8b9','url':'assets/media/base/light/favicon/64x64.png'},{'revision':'7d0b12470a9d1321398b99fa88c31083','url':'assets/media/base/light/favicon/66x66.png'},{'revision':'9a9982619ff2c646d72f508a9b71dfbd','url':'assets/media/base/light/favicon/70x70.png'},{'revision':'ef0f844b747ef2ef197a0f5c26662115','url':'assets/media/base/light/favicon/71x71.png'},{'revision':'79cf73f2f931e8ba848666ca29937c6a','url':'assets/media/base/light/favicon/72x72.png'},{'revision':'1e0375d0a1528ea29925a7fba0614516','url':'assets/media/base/light/favicon/75x75.png'},{'revision':'688ea42c115fb17f0be62ceae5868d9d','url':'assets/media/base/light/favicon/76x76.png'},{'revision':'20176ae4172daa0f0a0948ad4549244f','url':'assets/media/base/light/favicon/775x375.png'},{'revision':'1e18e622e1b803275674bfb105372da2','url':'assets/media/base/light/favicon/80x80.png'},{'revision':'e75d0d5253d4f09953a2f0f12c8adcc8','url':'assets/media/base/light/favicon/87x87.png'},{'revision':'73f7e8963ea60badbbb04edff36c2ea2','url':'assets/media/base/light/favicon/88x88.png'},{'revision':'1a53ec4d0f83b9900525dcac516ec467','url':'assets/media/base/light/favicon/89x89.png'},{'revision':'904ec92207acbdbdbaa39e84fa0ac776','url':'assets/media/base/light/favicon/930x450.png'},{'revision':'35b3499685298f84e1a6872b6156b8b8','url':'assets/media/base/light/favicon/96x96.png'},{'revision':'f9485f9b1401472a0f472d721853ae4d','url':'assets/media/base/light/logo-wide.png'},{'revision':'83508404def3300fe536e6dd35dae9f0','url':'assets/media/base/light/logo.png'},{'revision':'41edfabf3b20cdf9cc37c25aa4940258','url':'assets/media/base/light/og/default.png'},{'revision':'5ed0e6c8011eb6668a2e6732be7d9551','url':'assets/media/base/light/screenshot.jpeg'},{'revision':'2db43bca79ae97ad259130d32c73c2cc','url':'assets/media/base/light/shortcut/about.png'},{'revision':'66c006227d70723d68bd3ede134ff924','url':'assets/media/base/light/shortcut/app.png'},{'revision':'dd0b7446b893822c6e445953bfabce7e','url':'assets/media/base/light/shortcut/contact.png'},{'revision':'3980fc3a1fad8f10f29e8ed2aa5fc14b','url':'assets/media/base/light/shortcut/service.png'},{'revision':'00eb0e60a2a088ccc0f7ba2d0de27540','url':'assets/media/bg/01.jpg'},{'revision':'72aff43ef9b17f70ef200e012b23f266','url':'assets/media/bg/02.jpg'},{'revision':'85962969b725008ca7ca4488751a8a9e','url':'assets/media/photo/momo.jpg'},{'revision':'0ab3921d9b80975c5597432ab59f5d0a','url':'assets/webfonts/fa-brands-400.ttf'},{'revision':'8b0ddedbb27cbc9971c8667caa8a0cc1','url':'assets/webfonts/fa-brands-400.woff2'},{'revision':'20206738b2bffb741b00200d5d3d6d20','url':'assets/webfonts/fa-regular-400.ttf'},{'revision':'61f30b79daf5b31f0d254a31fba66158','url':'assets/webfonts/fa-regular-400.woff2'},{'revision':'e2ceb83946c9e5fc7eab24453a03bffb','url':'assets/webfonts/fa-solid-900.ttf'},{'revision':'c64278386c2bbb5e293e11b94ca2f6d1','url':'assets/webfonts/fa-solid-900.woff2'},{'revision':'d20cedd7e254d4b58b721b6995ca52b4','url':'assets/webfonts/fa-v4compatibility.ttf'},{'revision':'4bc58bc16bb05a05d3a47a4f7e143b75','url':'assets/webfonts/fa-v4compatibility.woff2'},{'revision':'434e70f0df2a704a4d3101cbdc6fffdc','url':'cart.html'},{'revision':'bf99b18183123cbf2bc946423e4a4531','url':'components.html'},{'revision':'869c2aea8bac6c6f802be43f89985586','url':'contact.html'},{'revision':'75230f1d2c4346f5935957119b7e203e','url':'credit.html'},{'revision':'c6e05abb4189b3b2a40f9f47ca22caa8','url':'index.html'},{'revision':'42300e61c910ffae3da70389d2f31687','url':'privacy.html'},{'revision':'3db505b6914ec2173c4d414aee6f6fb9','url':'service.html'},{'revision':'fb78fb8dcda4b09c03d1e199dc8de84d','url':'service/design.html'},{'revision':'658b6343e1831f272d0feeee336e7397','url':'service/digital.html'},{'revision':'3ad0898d7467d1607c28cebac2e6cd0a','url':'service/web.html'},{'revision':'57c0e96093a1530bf2ce6948a84a40d8','url':'sitemap.html'},{'revision':'b2f13579061a7d46e1f4ec3df02a622c','url':'sitemap.xml'},{'revision':'343dcf66008658baa867bcc98f55ac08','url':'terms.html'}]||[]),function(e){const t=$();Z(new ee(t,e))}(re);const oe=["vi","en"],he=["404","aaa","about","common","app-pw","app-qr","app-calc","app","client","components","contact","credit","form","privacy","service","cart","terms","sitemap"],le=[];for(const s of oe)for(const e of he)le.push({url:`i18n/${s}/${e}.json`});te(le),Z((({url:e})=>"https://fonts.googleapis.com"===e.origin),new ae({cacheName:"google-fonts-stylesheets"})),Z((({url:e})=>"https://fonts.gstatic.com"===e.origin),new se({cacheName:"google-fonts-webfonts",plugins:[new ce({statuses:[0,200]}),new P({maxAgeSeconds:31536e3,maxEntries:30})]})),Z((({request:e})=>"image"===e.destination),new se({cacheName:"images",plugins:[new ce({statuses:[0,200]}),new P({maxEntries:60,maxAgeSeconds:2592e3})]})),Z((({request:e})=>"script"===e.destination||"style"===e.destination),new ae({cacheName:"static-resources"}))}()}();