PageSourceSearch

https://petwellhk.com/assets/main-m_sUF2N4.js

js petwellhk.com collected 2026-10-06 05:22:39 UTC 611,426 bytes, 977 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Index-C4fgFbgp.js","assets/react-vendor-BDHNqS4B.js","assets/amplify-DYDcjoow.js","assets/Footer-CtylQEAH.js","assets/textarea-D7qsgB_p.js","assets/reportService-tEzofQZ6.js","assets/phone-B2rvvDkK.js","assets/type-CVgQCqWZ.js","assets/Header-BkbupWq-.js","assets/chevron-right-CpkQxGj-.js","assets/check-DS0-tR9o.js","assets/tag-D40gy_Nl.js","assets/query-7-WHkg5t.js","assets/skeleton-CDto_fTL.js","assets/flame-HVLv3H1b.js","assets/message-circle-B5m25ymx.js","assets/use-mobile-DOD0qs8p.js","assets/search-BSw3vufk.js","assets/usePriceReviewProducts-BeYKlbKA.js","assets/priceReviewApi-BFijUeFQ.js","assets/priceReviewPricing-BlvAWvXm.js","assets/ProductReviewRatingBadge-CyxkMrfM.js","assets/star-Dim9pf51.js","assets/store-DWI30bPC.js","assets/RestaurantImage-CN6NkWJn.js","assets/hongKongDistricts--r8_jlh4.js","assets/useRestaurants-DQ6cKGMa.js","assets/restaurantApi-J7TAaZ7f.js","assets/placeSearchConfig-BfT0dFXT.js","assets/distance-Bwcv1qLg.js","assets/calendar-KPQ2FJpt.js","assets/ClinicImage-CFSfW4FY.js","assets/clock-CRHi7pcr.js","assets/useClinics-BT6VP7AE.js","assets/serviceOfferings-40B0fv7X.js","assets/useSalons-CNBS-O3v.js","assets/useLodging-CMVGJT1Q.js","assets/eventApi-BIdg6rsX.js","assets/featuredActivities-HPTlYqPU.js","assets/festival-hero-banner-Bp0l-DUp.js","assets/useSEO-CoArDrdl.js","assets/Landing-CfOmy2Wf.js","assets/DirectAnswerBox-Bx52E2kD.js","assets/card-U4xgiZnN.js","assets/FAQSection-CoCzp6cx.js","assets/accordion-DxrqSPr2.js","assets/index-BZFL-brE.js","assets/usePetwellFaq-B_oM2g83.js","assets/heart-DRwCktcb.js","assets/arrow-up-right-Dc-ZTPFk.js","assets/About-CPALLb6L.js","assets/MediaLogoMarquee-DdHYs0C0.js","assets/ContactUsForm-DKn4JEAp.js","assets/checkbox-BkyFxaQM.js","assets/index-CFf87M6S.js","assets/types-CW8l682q.js","assets/ChristmasEventDetail-Cnl4qtwY.js","assets/NearbyRestaurants-Dk648Dmq.js","assets/RestaurantVerificationBadge-BvUGD2EG.js","assets/PetWellVerifiedBadge-DpC4-twT.js","assets/triangle-alert-1QSShUG6.js","assets/PremiumPartnerBadge-Vc4azdA6.js","assets/useNearbyRestaurants-DlbceyfQ.js","assets/chevron-up-Cb9C18fB.js","assets/badge-BYBBu8xB.js","assets/christmasEventData-CwZjPWpq.js","assets/share-2-CCPUIaWa.js","assets/external-link-BIpC4MGv.js","assets/ChristmasEvents-BHXWfm3C.js","assets/sparkles-BcmYxR0H.js","assets/Terms-Uet-mjcX.js","assets/Forum-qaUEpz2E.js","assets/popover-D22i846k.js","assets/image-BPGTiTmb.js","assets/useSearchQueryFromUrl-jHjzcbFS.js","assets/select-fZgDq8v8.js","assets/image-plus--WXlfpIC.js","assets/lock-CHPI1fFl.js","assets/chevron-left-Jw0Ezjn9.js","assets/plus-D0NAkfqS.js","assets/OwnerZone-BAOIr8ec.js","assets/blogData-yU9PE434.js","assets/blog-dog-trainer-licence-CLr68YZE.js","assets/blog-rainy-day-pets.jpg.asset-j2szsPEZ.js","assets/AppDownloadCTA-DAEixTy3.js","assets/BlogPost-DLd3O4g_.js","assets/FehdPetFriendlyDirectory-r9MKUtlq.js","assets/info-DIDAIaTg.js","assets/collapsible-XeBmzMPY.js","assets/mallParkingDetails-CAW0sDTT.js","assets/tram-front-BJQeNsZr.js","assets/paw-print-BtMm-KXX.js","assets/utensils-DXFnnphK.js","assets/midAutumnFestival2026-GVaMxjdF.js","assets/BlogAdSense-Dqmm3xft.js","assets/navigation-B9fVXvyH.js","assets/Clinics-CdZ5tld1.js","assets/useNearbyPlaceSearch-x_utv8ac.js","assets/DiscoverPlaceTabs-DPoC_wAS.js","assets/shield-check-we62WOC3.js","assets/sliders-horizontal-zztTPW4P.js","assets/ListInfiniteLoader-DVfWx7v3.js","assets/PlaceListCard-Bh6ohuV5.js","assets/availableHours-DsyGI15X.js","assets/ClinicDetail-BQs6r4l0.js","assets/PlaceDetailLayout-BNsti9P1.js","assets/BusinessReviewReply-DaaGODlp.js","assets/ReviewAuthorLink-IWaLqPnT.js","assets/userReviewApi-BPRYI5-q.js","assets/circle-check-DgLC__8_.js","assets/minus-xARKY3S7.js","assets/badge-check-CHAeghjg.js","assets/placeMaps-BMm8HyB6.js","assets/calendar-check-D9qQBLib.js","assets/NGOs-VvXc9Xw_.js","assets/useNGOs-CzWKW3M_.js","assets/users-DCdt65nH.js","assets/NGODetail-Dlz-EV7z.js","assets/PetTag-DKtKG5u8.js","assets/petApi-Co8Qo3h-.js","assets/ActivateTag-ytT0CDCB.js","assets/CheckTag-D5YoM0g5.js","assets/Download-8j9gf1JA.js","assets/DeleteAccount-DKVPodVd.js","assets/client-DdjVEhXX.js","assets/AdminForms-j5kduD0D.js","assets/MailGoogleForm-C
1Z71o7g9.js","assets/WhatsAppPetwellEng-LyxVrqk9.js","assets/WhatsAppPetwellChin-JU-YYZj6.js","assets/PetMatchmaker-B17f8swA.js","assets/dog-_P0n7k9m.js","assets/cat-DaUUuSL6.js","assets/ChristmasDogMbti-K2_cFKKM.js","assets/Restaurants-CCSpby6B.js","assets/RestaurantListInfiniteLoader-C6rlaODV.js","assets/coffee-DvdZrCo4.js","assets/door-open-DBssRldx.js","assets/RestaurantDetail-C3zGzeN0.js","assets/droplets-K-7uD6Hm.js","assets/camera-DiII9OQn.js","assets/RestaurantsByArea-DFQTWAH3.js","assets/Salons-DIqJzQqB.js","assets/SalonDetail-BNubpZ5h.js","assets/Lodging-D336hlDX.js","assets/LodgingDetail-B0iTx2uS.js","assets/Malls-DkfGqr2J.js","assets/useMalls-DzLp84e2.js","assets/MallDetail-mz2aiLZS.js","assets/link-2-BDESSCXG.js","assets/scale-B2l5za8q.js","assets/HomeVisits-BcNfXazu.js","assets/useHomeVisitProviders-BVHuzPdz.js","assets/HomeVisitDetail-Bj_YnBly.js","assets/PetActivities-D_Lj32Dm.js","assets/EventDetail-e8k_kFy_.js","assets/grid-3x3-AJB6zdOl.js","assets/PetwellMember-t9S4WEOu.js","assets/Nametag-Be1xBgyF.js","assets/smartphone-DDWx8wJ5.js","assets/VendorApplication-CRDuC8Ns.js","assets/radio-group-8WfHeakx.js","assets/vendor-event-cover-uGxUaVCe.js","assets/VendorApplicationThankYou-BpBZym3s.js","assets/MidAutumnFestivalRegistration-DISRv6al.js","assets/proxy-B801D4Tp.js","assets/midAutumnMetaPixel-CU7nfzNg.js","assets/MidAutumnFestivalPayment-B2DglGtG.js","assets/upload-B1g5jdtK.js","assets/MidAutumnFestivalConfirmed-DmCsid80.js","assets/SignUpLogin-DxESOCD-.js","assets/Register-BJuukmXR.js","assets/ForgotPassword-DkXRUTWn.js","assets/VerificationCode-bJASZq7f.js","assets/AuthCallback-CrJ_fqAW.js","assets/TestBooking-CS7MUhum.js","assets/NotFound-DTZI5L68.js","assets/BlogDogTrainerLicence-Dk6U-mqT.js","assets/Review-CZFB9g2T.js","assets/WishlistHeartButton-XMsXQ-jB.js","assets/CompareBar-D-l8D0iQ.js","assets/ReviewPriceDisplay-DfIoLGNY.js","assets/zap-CowlN_Ex.js","assets/ReviewProduct-D7E0kHyR.js","assets/trash-2-e__PZJrZ.js","assets/ReviewBrand-C_r99H9P.js","assets/Wishlist-DXDrxZcj.js","assets/Compare-CVOrncBD.js","assets/OtherServices-DYwm6Mn6.js","assets/AfcdPdfRedirect-nZ6Q1rlj.js","assets/RainyDayMalls-B9bStGvH.js","assets/NutritionScore-D5eItglQ.js","assets/nutritionTheme-ByeotiTj.js","assets/NutritionProduct-b9wBvcz6.js","assets/UserProfile-Duavc4Eg.js","assets/UserReviewList-BdFHL_bd.js","assets/MyReviews-BclwVe3U.js","assets/AccountHomeShell-BmqDkQJS.js","assets/AccountProfile-CAuVI5P3.js","assets/ContactUsWidget-DVNx2pEF.js","assets/HomePromoPopups-CvK0ytwZ.js"])))=>i.map(i=>d[i]);
2import{r as u,j as l,R as A,a as qr,v as zr,b as Kr,u as Is,c as Ds,o as Ws,s as Ls,f as Os,d as Fs,e as _s,h as Ms,l as js,g as Gr,B as Hs,i as $s,k as E,N as Te,m as Bs}from"./react-vendor-BDHNqS4B.js";import{Q as Vs,a as Us}from"./query-7-WHkg5t.js";import{b as qs,c as vt,f as Yr,d as zs,s as no,e as Wn,h as Qr,i as Ks,j as Gs,k as Ys,l as Qs,H as Xs,m as Qe,n as Xr,_ as Js,r as To,o as Zs,p as Ln,q as el,t as tl,u as ol,D as nl}from"./amplify-DYDcjoow.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))n(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const a of i.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function o(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(r){if(r.ep)return;r.ep=!0;const i=o(r);fetch(r.href,i)}})();const rl="modulepreload",il=function(e){return"/"+e},On={},R=function(t,o,n){let r=Promise.resolve();if(o&&o.length>0){document.getElementsByTagName("link");const a=document.querySelector("meta[property=csp-nonce]"),s=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute("nonce"));r=Promise.allSettled(o.map(d=>{if(d=il(d),d in On)return;On[d]=!0;const c=d.endsWith(".css"),p=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${d}"]${p}`))return;
2const m=document.createElement("link");if(m.rel=c?"stylesheet":rl,c||(m.as="script"),m.crossOrigin="",m.href=d,s&&m.setAttribute("nonce",s),document.head.appendChild(m),c)return new Promise((g,h)=>{m.addEventListener("load",g),m.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${d}`)))})}))}function i(a){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=a,window.dispatchEvent(s),!s.defaultPrevented)throw a}return r.then(a=>{for(const s of a||[])s.status==="rejected"&&i(s.reason);return t().catch(i)})},al=1,sl=3e3;let Ao=0;function ll(){return Ao=(Ao+1)%Number.MAX_SAFE_INTEGER,Ao.toString()}const Eo=new Map,Fn=e=>{if(Eo.has(e))return;const t=setTimeout(()=>{Eo.delete(e),Nt({type:"REMOVE_TOAST",toastId:e})},sl);Eo.set(e,t)},cl=(e,t)=>{switch(t.type){case"ADD_TOAST":return{...e,toasts:[t.toast,...e.toasts].slice(0,al)};case"UPDATE_TOAST":return{...e,toasts:e.toasts.map(o=>o.id===t.toast.id?{...o,...t.toast}:o)};case"DISMISS_TOAST":{const{toastId:o}=t;return o?Fn(o):e.toasts.forEach(n=>{Fn(n.id)}),{...e,toasts:e.toasts.map(n=>n.id===o||o===void 0?{...n,open:!1}:n)}}case"REMOVE_TOAST":return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(o=>o.id!==t.toastId)}}},Xt=[];let Jt={toasts:[]};function Nt(e){Jt=cl(Jt,e),Xt.forEach(t=>{t(Jt)})}function dl({...e}){const t=ll(),o=r=>Nt({type:"UPDATE_TOAST",toast:{...r,id:t}}),n=()=>Nt({type:"DISMISS_TOAST",toastId:t});return Nt({type:"ADD_TOAST",toast:{...e,id:t,open:!0,onOpenChange:r=>{r||n()}}}),{id:t,dismiss:n,update:o}}function ul(){const[e,t]=u.useState(Jt);return u.useEffect(()=>(Xt.push(t),()=>{const o=Xt.indexOf(t);o>-1&&Xt.splice(o,1)}),[e]),{...e,toast:dl,dismiss:o=>Nt({type:"DISMISS_TOAST",toastId:o})}}function oe(e,t,{checkForDefaultPrevented:o=!0}={}){return function(r){if(e==null||e(r),o===!1||!r.defaultPrevented)return t==null?void 0:t(r)}}function _n(e,t){if(typeof e=="function")return e(t);e!=null&&(e.current=t)}function Jr(...e){return t=>{let o=!1;const n=e.map(r=>{const i=_n(r,t);return!o&&typeof i=="function"&&(o=!0),i});if(o)return()=>{for(let r=0;r<n.length;r++){const i=n[r];typeof i=="function"?i():_n(e[r],null)}}}}function ue(...e){return u.useCallback(Jr(...e),e)}function pl(e,t){const o=u.createContext(t),n=i=>{const{children:a,...s}=i,d=u.useMemo(()=>s,Object.values(s));return l.jsx(o.Provider,{value:d,children:a})};n.displayName=e+"Provider";function r(i){const a=u.useContext(o);if(a)return a;if(t!==void 0)return t;throw new Error(`\`${i}\` must be used within \`${e}\``)}return[n,r]}function Ft(e,t=[]){let o=[];function n(i,a){const s=u.createContext(a),d=o.length;o=[...o,a];const c=m=>{var w;const{scope:g,children:h,...y}=m,f=((w=g==null?void 0:g[e])==null?void 0:w[d])||s,v=u.useMemo(()=>y,Object.values(y));return l.jsx(f.Provider,{value:v,children:h})};c.displayName=i+"Provider";function p(m,g){var f;const h=((f=g==null?void 0:g[e])==null?void 0:f[d])||s,y=u.useContext(h);if(y)return y;if(a!==void 0)return a;throw new Error(`\`${m}\` must be used within \`${i}\``)}return[c,p]}const r=()=>{const i=o.map(a=>u.createContext(a));return function(s){const d=(s==null?void 0:s[e])||i;return u.useMemo(()=>({[`__scope${e}`]:{...s,[e]:d}}),[s,d])}};return r.scopeName=e,[n,hl(r,...t)]}function hl(...e){const t=e[0];if(e.length===1)return t;const o=()=>{const n=e.map(r=>({useScope:r(),scopeName:r.scopeName}));return function(i){const a=n.reduce((s,{useScope:d,scopeName:c})=>{const m=d(i)[`__scope${c}`];return{...s,...m}},{});return u.useMemo(()=>({[`__scope${t.scopeName}`]:a}),[a])}};return o.scopeName=t.scopeName,o}function It(e){const t=fl(e),o=u.forwardRef((n,r)=>{const{children:i,...a}=n,s=u.Children.toArray(i),d=s.find(yl);if(d){const c=d.props.children,p=s.map(m=>m===d?u.Children.count(c)>1?u.Children.only(null):u.isValidElement(c)?c.props.children:null:m);return l.jsx(t,{...a,ref:r,children:u.isValidElement(c)?u.cloneElement(c,void 0,p):null})}return l.jsx(t,{...a,ref:r,children:i})});return o.displayName=`${e}.Slot`,o}var ml=It("Slot");function fl(e){const t=u.forwardRef((o,n)=>{const{children:r,...i}=o;if(u.isValidElement(r)){const a=wl(r),s=vl(i,r.props);return r.type!==u.Fragment&&(s.ref=n?Jr(n,a):a),u.cloneElement(r,s)}return u.Children.count(r)>1?u.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var Zr=Symbol("radix.slottable");function gl(e){const t=({children:o})=>l.jsx(l.Fragment,{children:o});return t.displayName=`${e}.Slottable`,t.__radixId=Zr,t}function yl(e){return u.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===Zr}function vl(e,t){const o={...t};for(const n in t){const r=e[n],i=t[n];/^on[A-Z]/.test(n)?r&&i?o[n]=(...s)=>{const d=i(...s);return r(...s),d}:r&&(o[n]=r):n==="style"?o[n]={...r,...i}
vendor: 9,308 bytes, line 2
2:n==="className"&&(o[n]=[r,i].filter(Boolean).join(" "))}return{...e,...o}}function wl(e){var n,r;let t=(n=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:n.get,o=t&&"isReactWarning"in t&&t.isReactWarning;return o?e.ref:(t=(r=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:r.get,o=t&&"isReactWarning"in t&&t.isReactWarning,o?e.props.ref:e.props.ref||e.ref)}function bl(e){const t=e+"CollectionProvider",[o,n]=Ft(t),[r,i]=o(t,{collectionRef:{current:null},itemMap:new Map}),a=f=>{const{scope:v,children:w}=f,x=A.useRef(null),b=A.useRef(new Map).current;return l.jsx(r,{scope:v,itemMap:b,collectionRef:x,children:w})};a.displayName=t;const s=e+"CollectionSlot",d=It(s),c=A.forwardRef((f,v)=>{const{scope:w,children:x}=f,b=i(s,w),T=ue(v,b.collectionRef);return l.jsx(d,{ref:T,children:x})});c.displayName=s;const p=e+"CollectionItemSlot",m="data-radix-collection-item",g=It(p),h=A.forwardRef((f,v)=>{const{scope:w,children:x,...b}=f,T=A.useRef(null),k=ue(v,T),S=i(p,w);return A.useEffect(()=>(S.itemMap.set(T,{ref:T,...b}),()=>void S.itemMap.delete(T))),l.jsx(g,{[m]:"",ref:k,children:x})});h.displayName=p;function y(f){const v=i(e+"CollectionConsumer",f);return A.useCallback(()=>{const x=v.collectionRef.current;if(!x)return[];const b=Array.from(x.querySelectorAll(`[${m}]`));return Array.from(v.itemMap.values()).sort((S,C)=>b.indexOf(S.ref.current)-b.indexOf(C.ref.current))},[v.collectionRef,v.itemMap])}return[{Provider:a,Slot:c,ItemSlot:h},y,n]}var Pl=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],ae=Pl.reduce((e,t)=>{const o=It(`Primitive.${t}`),n=u.forwardRef((r,i)=>{const{asChild:a,...s}=r,d=a?o:t;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),l.jsx(d,{...s,ref:i})});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{});function ei(e,t){e&&qr.flushSync(()=>e.dispatchEvent(t))}function We(e){const t=u.useRef(e);return u.useEffect(()=>{t.current=e}),u.useMemo(()=>(...o)=>{var n;return(n=t.current)==null?void 0:n.call(t,...o)},[])}function xl(e,t=globalThis==null?void 0:globalThis.document){const o=We(e);u.useEffect(()=>{const n=r=>{r.key==="Escape"&&o(r)};return t.addEventListener("keydown",n,{capture:!0}),()=>t.removeEventListener("keydown",n,{capture:!0})},[o,t])}var Sl="DismissableLayer",Vo="dismissableLayer.update",Tl="dismissableLayer.pointerDownOutside",Al="dismissableLayer.focusOutside",Mn,ti=u.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),uo=u.forwardRef((e,t)=>{const{disableOutsidePointerEvents:o=!1,onEscapeKeyDown:n,onPointerDownOutside:r,onFocusOutside:i,onInteractOutside:a,onDismiss:s,...d}=e,c=u.useContext(ti),[p,m]=u.useState(null),g=(p==null?void 0:p.ownerDocument)??(globalThis==null?void 0:globalThis.document),[,h]=u.useState({}),y=ue(t,C=>m(C)),f=Array.from(c.layers),[v]=[...c.layersWithOutsidePointerEventsDisabled].slice(-1),w=f.indexOf(v),x=p?f.indexOf(p):-1,b=c.layersWithOutsidePointerEventsDisabled.size>0,T=x>=w,k=kl(C=>{const L=C.target,O=[...c.branches].some(F=>F.contains(L));!T||O||(r==null||r(C),a==null||a(C),C.defaultPrevented||s==null||s())},g),S=Cl(C=>{const L=C.target;[...c.branches].some(F=>F.contains(L))||(i==null||i(C),a==null||a(C),C.defaultPrevented||s==null||s())},g);return xl(C=>{x===c.layers.size-1&&(n==null||n(C),!C.defaultPrevented&&s&&(C.preventDefault(),s()))},g),u.useEffect(()=>{if(p)return o&&(c.layersWithOutsidePointerEventsDisabled.size===0&&(Mn=g.body.style.pointerEvents,g.body.style.pointerEvents="none"),c.layersWithOutsidePointerEventsDisabled.add(p)),c.layers.add(p),jn(),()=>{o&&c.layersWithOutsidePointerEventsDisabled.size===1&&(g.body.style.pointerEvents=Mn)}},[p,g,o,c]),u.useEffect(()=>()=>{p&&(c.layers.delete(p),c.layersWithOutsidePointerEventsDisabled.delete(p),jn())},[p,c]),u.useEffect(()=>{const C=()=>h({});return document.addEventListener(Vo,C),()=>document.removeEventListener(Vo,C)},[]),l.jsx(ae.div,{...d,ref:y,style:{pointerEvents:b?T?"auto":"none":void 0,...e.style},onFocusCapture:oe(e.onFocusCapture,S.onFocusCapture),onBlurCapture:oe(e.onBlurCapture,S.onBlurCapture),onPointerDownCapture:oe(e.onPointerDownCapture,k.onPointerDownCapture)})});uo.displayName=Sl;var El="DismissableLayerBranch",oi=u.forwardRef((e,t)=>{const o=u.useContext(ti),n=u.useRef(null),r=ue(t,n);return u.useEffect(()=>{const i=n.current;if(i)return o.branches.add(i),()=>{o.branches.delete(i)}},[o.branches]),l.jsx(ae.div,{...e,ref:r})});oi.displayName=El;function kl(e,t=globalThis==null?void 0:globalThis.document){const o=We(e),n=u.useRef(!1),r=u.useRef(()=>{});return u.useEffect(()=>{const i=s=>{if(s.target&&!n.current){let d=function(){ni(Tl,o,c,{discrete:!0})};const c={originalEvent:s};s.pointerType==="touch"?(t.removeEventListener("click",r.current),r.current=d,t.addEventListener("click",r.current,{once:!0})):d()}else t.removeEventListener("click",r.current);n.current=!1},a=window.setTimeout(()=>{t.addEventListener("pointerdown",i)},0);return()=>{window.clearTimeout(a),t.removeEventListener("pointerdown",i),t.removeEventListener("click",r.current)}},[t,o]),{onPointerDownCapture:()=>n.current=!0}}function Cl(e,t=globalThis==null?void 0:globalThis.document){const o=We(e),n=u.useRef(!1);return u.useEffect(()=>{const r=i=>{i.target&&!n.current&&ni(Al,o,{originalEvent:i},{discrete:!1})};return t.addEventListener("focusin",r),()=>t.removeEventListener("focusin",r)},[t,o]),{onFocusCapture:()=>n.current=!0,onBlurCapture:()=>n.current=!1}}function jn(){const e=new CustomEvent(Vo);document.dispatchEvent(e)}function ni(e,t,o,{discrete:n}){const r=o.originalEvent.target,i=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:o});t&&r.addEventListener(e,t,{once:!0}),n?ei(r,i):r.dispatchEvent(i)}var Nl=uo,Rl=oi,je=globalThis!=null&&globalThis.document?u.useLayoutEffect:()=>{},Il="Portal",ln=u.forwardRef((e,t)=>{var s;const{container:o,...n}=e,[r,i]=u.useState(!1);je(()=>i(!0),[]);const a=o||r&&((s=globalThis==null?void 0:globalThis.document)==null?void 0:s.body);return a?zr.createPortal(l.jsx(ae.div,{...n,ref:t}),a):null});ln.displayName=Il;function Dl(e,t){return u.useReducer((o,n)=>t[o][n]??o,e)}var wt=e=>{const{present:t,children:o}=e,n=Wl(t),r=typeof o=="function"?o({present:n.isPresent}):u.Children.only(o),i=ue(n.ref,Ll(r));return typeof o=="function"||n.isPresent?u.cloneElement(r,{ref:i}):null};wt.displayName="Presence";function Wl(e){const[t,o]=u.useState(),n=u.useRef(null),r=u.useRef(e),i=u.useRef("none"),a=e?"mounted":"unmounted",[s,d]=Dl(a,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return u.useEffect(()=>{const c=Ht(n.current);i.current=s==="mounted"?c:"none"},[s]),je(()=>{const c=n.current,p=r.current;if(p!==e){const g=i.current,h=Ht(c);e?d("MOUNT"):h==="none"||(c==null?void 0:c.display)==="none"?d("UNMOUNT"):d(p&&g!==h?"ANIMATION_OUT":"UNMOUNT"),r.current=e}},[e,d]),je(()=>{if(t){let c;const p=t.ownerDocument.defaultView??window,m=h=>{const f=Ht(n.current).includes(h.animationName);if(h.target===t&&f&&(d("ANIMATION_END"),!r.current)){const v=t.style.animationFillMode;t.style.animationFillMode="forwards",c=p.setTimeout(()=>{t.style.animationFillMode==="forwards"&&(t.style.animationFillMode=v)})}},g=h=>{h.target===t&&(i.current=Ht(n.current))};return t.addEventListener("animationstart",g),t.addEventListener("animationcancel",m),t.addEventListener("animationend",m),()=>{p.clearTimeout(c),t.removeEventListener("animationstart",g),t.removeEventListener("animationcancel",m),t.removeEventListener("animationend",m)}}else d("ANIMATION_END")},[t,d]),{isPresent:["mounted","unmountSuspended"].includes(s),ref:u.useCallback(c=>{n.current=c?getComputedStyle(c):null,o(c)},[])}}function Ht(e){return(e==null?void 0:e.animationName)||"none"}function Ll(e){var n,r;let t=(n=Object.getOwnPropertyDescriptor(e.props,"ref"))==null?void 0:n.get,o=t&&"isReactWarning"in t&&t.isReactWarning;return o?e.ref:(t=(r=Object.getOwnPropertyDescriptor(e,"ref"))==null?void 0:r.get,o=t&&"isReactWarning"in t&&t.isReactWarning,o?e.props.ref:e.props.ref||e.ref)}var Ol=Kr[" useInsertionEffect ".trim().toString()]||je;function ri({prop:e,defaultProp:t,onChange:o=()=>{},caller:n}){const[r,i,a]=Fl({defaultProp:t,onChange:o}),s=e!==void 0,d=s?e:r;{const p=u.useRef(e!==void 0);u.useEffect(()=>{const m=p.current;m!==s&&console.warn(`${n} is changing from ${m?"controlled":"uncontrolled"} to ${s?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),p.current=s},[s,n])}const c=u.useCallback(p=>{var m;if(s){const g=_l(p)?p(e):p;g!==e&&((m=a.current)==null||m.call(a,g))}else i(p)},[s,e,i,a]);return[d,c]}function Fl({defaultProp:e,onChange:t}){const[o,n]=u.useState(e),r=u.useRef(o),i=u.useRef(t);return Ol(()=>{i.current=t},[t]),u.useEffect(()=>{var a;r.current!==o&&((a=i.current)==null||a.call(i,o),r.current=o)},[o,r]),[o,n,i]}function _l(e){return typeof e=="function"}var Ml=Object.freeze({position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}),jl="VisuallyHidden",po=u.forwardRef((e,t)=>
2l.jsx(ae.span,{...e,ref:t,style:{...Ml,...e.style}}));po.displayName=jl;var Hl=po,cn="ToastProvider",[dn,$l,Bl]=bl("Toast"),[ii,Xv]=Ft("Toast",[Bl]),[Vl,ho]=ii(cn),ai=e=>{const{__scopeToast:t,label:o="Notification",duration:n=5e3,swipeDirection:r="right",swipeThreshold:i=50,children:a}=e,[s,d]=u.useState(null),[c,p]=u.useState(0),m=u.useRef(!1),g=u.useRef(!1);return o.trim()||console.error(`Invalid prop \`label\` supplied to \`${cn}\`. Expected non-empty \`string\`.`),l.jsx(dn.Provider,{scope:t,children:l.jsx(Vl,{scope:t,label:o,duration:n,swipeDirection:r,swipeThreshold:i,toastCount:c,viewport:s,onViewportChange:d,onToastAdd:u.useCallback(()=>p(h=>h+1),[]),onToastRemove:u.useCallback(()=>p(h=>h-1),[]),isFocusedToastEscapeKeyDownRef:m,isClosePausedRef:g,children:a})})};ai.displayName=cn;var si="ToastViewport",Ul=["F8"],Uo="toast.viewportPause",qo="toast.viewportResume",li=u.forwardRef((e,t)=>{const{__scopeToast:o,hotkey:n=Ul,label:r="Notifications ({hotkey})",...i}=e,a=ho(si,o),s=$l(o),d=u.useRef(null),c=u.useRef(null),p=u.useRef(null),m=u.useRef(null),g=ue(t,m,a.onViewportChange),h=n.join("+").replace(/Key/g,"").replace(/Digit/g,""),y=a.toastCount>0;u.useEffect(()=>{const v=w=>{var b;n.length!==0&&n.every(T=>w[T]||w.code===T)&&((b=m.current)==null||b.focus())};return document.addEventListener("keydown",v),()=>document.removeEventListener("keydown",v)},[n]),u.useEffect(()=>{const v=d.current,w=m.current;if(y&&v&&w){const x=()=>{if(!a.isClosePausedRef.current){const S=new CustomEvent(Uo);w.dispatchEvent(S),a.isClosePausedRef.current=!0}},b=()=>{if(a.isClosePausedRef.current){const S=new CustomEvent(qo);w.dispatchEvent(S),a.isClosePausedRef.current=!1}},T=S=>{!v.contains(S.relatedTarget)&&b()},k=()=>{v.contains(document.activeElement)||b()};return v.addEventListener("focusin",x),v.addEventListener("focusout",T),v.addEventListener("pointermove",x),v.addEventListener("pointerleave",k),window.addEventListener("blur",x),window.addEventListener("focus",b),()=>{v.removeEventListener("focusin",x),v.removeEventListener("focusout",T),v.removeEventListener("pointermove",x),v.removeEventListener("pointerleave",k),window.removeEventListener("blur",x),window.removeEventListener("focus",b)}}},[y,a.isClosePausedRef]);const f=u.useCallback(({tabbingDirection:v})=>{const x=s().map(b=>{const T=b.ref.current,k=[T,...nc(T)];return v==="forwards"?k:k.reverse()});return(v==="forwards"?x.reverse():x).flat()},[s]);return u.useEffect(()=>{const v=m.current;if(v){const w=x=>{var k,S,C;const b=x.altKey||x.ctrlKey||x.metaKey;if(x.key==="Tab"&&!b){const L=document.activeElement,O=x.shiftKey;if(x.target===v&&O){(k=c.current)==null||k.focus();return}const W=f({tabbingDirection:O?"backwards":"forwards"}),z=W.findIndex(N=>N===L);ko(W.slice(z+1))?x.preventDefault():O?(S=c.current)==null||S.focus():(C=p.current)==null||C.focus()}};return v.addEventListener("keydown",w),()=>v.removeEventListener("keydown",w)}},[s,f]),l.jsxs(Rl,{ref:d,role:"region","aria-label":r.replace("{hotkey}",h),tabIndex:-1,style:{pointerEvents:y?void 0:"none"},children:[y&&l.jsx(zo,{ref:c,onFocusFromOutsideViewport:()=>{const v=f({tabbingDirection:"forwards"});ko(v)}}),l.jsx(dn.Slot,{scope:o,children:l.jsx(ae.ol,{tabIndex:-1,...i,ref:g})}),y&&l.jsx(zo,{ref:p,onFocusFromOutsideViewport:()=>{const v=f({tabbingDirection:"backwards"});ko(v)}})]})});li.displayName=si;var ci="ToastFocusProxy",zo=u.forwardRef((e,t)=>{const{__scopeToast:o,onFocusFromOutsideViewport:n,...r}=e,i=ho(ci,o);return l.jsx(po,{"aria-hidden":!0,tabIndex:0,...r,ref:t,style:{position:"fixed"},onFocus:a=>{var c;const s=a.relatedTarget;!((c=i.viewport)!=null&&c.contains(s))&&n()}})});zo.displayName=ci;var _t="Toast",ql="toast.swipeStart",zl="toast.swipeMove",Kl="toast.swipeCancel",Gl="toast.swipeEnd",di=u.forwardRef((e,t)=>{const{forceMount:o,open:n,defaultOpen:r,onOpenChange:i,...a}=e,[s,d]=ri({prop:n,defaultProp:r??!0,onChange:i,caller:_t});return l.jsx(wt,{present:o||s,children:l.jsx(Xl,{open:s,...a,ref:t,onClose:()=>d(!1),onPause:We(e.onPause),onResume:We(e.onResume),onSwipeStart:oe(e.onSwipeStart,c=>{c.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:oe(e.onSwipeMove,c=>{const{x:p,y:m}=c.detail.delta;c.currentTarget.setAttribute("data-swipe","move"),c.currentTarget.style.setProperty("--radix-toast-swipe-move-x",`${p}px`),c.currentTarget.style.setProperty("--radix-toast-swipe-move-y",`${m}px`)}),onSwipeCancel:oe(e.onSwipeCancel,c=>{c.currentTarget.setAttribute("data-swipe","cancel"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),c.currentTarget.style.removeProperty("--radix-toast-swipe-end-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:oe(e.onSwipeEnd,c=>{const{x:p,y:m}=c.detail.delta;c.currentTarget.setAttribute("data-swipe","end"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),c.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),c.currentTarget.style.setProperty("--radix-toast-swipe-end-x",`${p}px`),c.currentTarget.style.setProperty("--radix-toast-swipe-end-y",`${m}px`),d(!1)})})})});di.displayName=_t;var[Yl,Ql]=ii(_t,{onClose(){}}),Xl=u.forwardRef((e,t)=>
2{const{__scopeToast:o,type:n="foreground",duration:r,open:i,onClose:a,onEscapeKeyDown:s,onPause:d,onResume:c,onSwipeStart:p,onSwipeMove:m,onSwipeCancel:g,onSwipeEnd:h,...y}=e,f=ho(_t,o),[v,w]=u.useState(null),x=ue(t,N=>w(N)),b=u.useRef(null),T=u.useRef(null),k=r||f.duration,S=u.useRef(0),C=u.useRef(k),L=u.useRef(0),{onToastAdd:O,onToastRemove:F}=f,q=We(()=>{var Q;(v==null?void 0:v.contains(document.activeElement))&&((Q=f.viewport)==null||Q.focus()),a()}),W=u.useCallback(N=>{!N||N===1/0||(window.clearTimeout(L.current),S.current=new Date().getTime(),L.current=window.setTimeout(q,N))},[q]);u.useEffect(()=>{const N=f.viewport;if(N){const Q=()=>{W(C.current),c==null||c()},V=()=>{const U=new Date().getTime()-S.current;C.current=C.current-U,window.clearTimeout(L.current),d==null||d()};return N.addEventListener(Uo,V),N.addEventListener(qo,Q),()=>{N.removeEventListener(Uo,V),N.removeEventListener(qo,Q)}}},[f.viewport,k,d,c,W]),u.useEffect(()=>{i&&!f.isClosePausedRef.current&&W(k)},[i,k,f.isClosePausedRef,W]),u.useEffect(()=>(O(),()=>F()),[O,F]);const z=u.useMemo(()=>v?yi(v):null,[v]);return f.viewport?l.jsxs(l.Fragment,{children:[z&&l.jsx(Jl,{__scopeToast:o,role:"status","aria-live":n==="foreground"?"assertive":"polite","aria-atomic":!0,children:z}),l.jsx(Yl,{scope:o,onClose:q,children:qr.createPortal(l.jsx(dn.ItemSlot,{scope:o,children:l.jsx(Nl,{asChild:!0,onEscapeKeyDown:oe(s,()=>{f.isFocusedToastEscapeKeyDownRef.current||q(),f.isFocusedToastEscapeKeyDownRef.current=!1}),children:l.jsx(ae.li,{role:"status","aria-live":"off","aria-atomic":!0,tabIndex:0,"data-state":i?"open":"closed","data-swipe-direction":f.swipeDirection,...y,ref:x,style:{userSelect:"none",touchAction:"none",...e.style},onKeyDown:oe(e.onKeyDown,N=>{N.key==="Escape"&&(s==null||s(N.nativeEvent),N.nativeEvent.defaultPrevented||(f.isFocusedToastEscapeKeyDownRef.current=!0,q()))}),onPointerDown:oe(e.onPointerDown,N=>{N.button===0&&(b.current={x:N.clientX,y:N.clientY})}),onPointerMove:oe(e.onPointerMove,N=>{if(!b.current)return;const Q=N.clientX-b.current.x,V=N.clientY-b.current.y,U=!!T.current,Y=["left","right"].includes(f.swipeDirection),I=["left","up"].includes(f.swipeDirection)?Math.min:Math.max,J=Y?I(0,Q):0,j=Y?0:I(0,V),_=N.pointerType==="touch"?10:2,D={x:J,y:j},K={originalEvent:N,delta:D};U?(T.current=D,$t(zl,m,K,{discrete:!1})):Hn(D,f.swipeDirection,_)?(T.current=D,$t(ql,p,K,{discrete:!1}),N.target.setPointerCapture(N.pointerId)):(Math.abs(Q)>_||Math.abs(V)>_)&&(b.current=null)}),onPointerUp:oe(e.onPointerUp,N=>{const Q=T.current,V=N.target;if(V.hasPointerCapture(N.pointerId)&&V.releasePointerCapture(N.pointerId),T.current=null,b.current=null,Q){const U=N.currentTarget,Y={originalEvent:N,delta:Q};Hn(Q,f.swipeDirection,f.swipeThreshold)?$t(Gl,h,Y,{discrete:!0}):$t(Kl,g,Y,{discrete:!0}),U.addEventListener("click",I=>I.preventDefault(),{once:!0})}})})})}),f.viewport)})]}):null}),Jl=e=>{const{__scopeToast:t,children:o,...n}=e,r=ho(_t,t),[i,a]=u.useState(!1),[s,d]=u.useState(!1);return tc(()=>a(!0)),u.useEffect(()=>{const c=window.setTimeout(()=>d(!0),1e3);return()=>window.clearTimeout(c)},[]),s?null:l.jsx(ln,{asChild:!0,children:l.jsx(po,{...n,children:i&&l.jsxs(l.Fragment,{children:[r.label," ",o]})})})},Zl="ToastTitle",ui=u.forwardRef((e,t)=>{const{__scopeToast:o,...n}=e;return l.jsx(ae.div,{...n,ref:t})});ui.displayName=Zl;var ec="ToastDescription",pi=u.forwardRef((e,t)=>{const{__scopeToast:o,...n}=e;return l.jsx(ae.div,{...n,ref:t})});pi.displayName=ec;var hi="ToastAction",mi=u.forwardRef((e,t)=>{const{altText:o,...n}=e;return o.trim()?l.jsx(gi,{altText:o,asChild:!0,children:l.jsx(un,{...n,ref:t})}):(console.error(`Invalid prop \`altText\` supplied to \`${hi}\`. Expected non-empty \`string\`.`),null)});mi.displayName=hi;var fi="ToastClose",un=u.forwardRef((e,t)=>{const{__scopeToast:o,...n}=e,r=Ql(fi,o);return l.jsx(gi,{asChild:!0,children:l.jsx(ae.button,{type:"button",...n,ref:t,onClick:oe(e.onClick,r.onClose)})})});un.displayName=fi;var gi=u.forwardRef((e,t)=>{const{__scopeToast:o,altText:n,...r}=e;return l.jsx(ae.div,{"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":n||void 0,...r,ref:t})});function yi(e){const t=[];
vendor: 5,819 bytes, lines 2-52
2return Array.from(e.childNodes).forEach(n=>{if(n.nodeType===n.TEXT_NODE&&n.textContent&&t.push(n.textContent),oc(n)){const r=n.ariaHidden||n.hidden||n.style.display==="none",i=n.dataset.radixToastAnnounceExclude==="";if(!r)if(i){const a=n.dataset.radixToastAnnounceAlt;a&&t.push(a)}else t.push(...yi(n))}}),t}function $t(e,t,o,{discrete:n}){const r=o.originalEvent.currentTarget,i=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:o});t&&r.addEventListener(e,t,{once:!0}),n?ei(r,i):r.dispatchEvent(i)}var Hn=(e,t,o=0)=>{const n=Math.abs(e.x),r=Math.abs(e.y),i=n>r;return t==="left"||t==="right"?i&&n>o:!i&&r>o};function tc(e=()=>{}){const t=We(e);je(()=>{let o=0,n=0;return o=window.requestAnimationFrame(()=>n=window.requestAnimationFrame(t)),()=>{window.cancelAnimationFrame(o),window.cancelAnimationFrame(n)}},[t])}function oc(e){return e.nodeType===e.ELEMENT_NODE}function nc(e){const t=[],o=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const r=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||r?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;o.nextNode();)t.push(o.currentNode);return t}function ko(e){const t=document.activeElement;return e.some(o=>o===t?!0:(o.focus(),document.activeElement!==t))}var rc=ai,vi=li,wi=di,bi=ui,Pi=pi,xi=mi,Si=un;function Ti(e){var t,o,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var r=e.length;for(t=0;t<r;t++)e[t]&&(o=Ti(e[t]))&&(n&&(n+=" "),n+=o)}else for(o in e)e[o]&&(n&&(n+=" "),n+=o);return n}function Ai(){for(var e,t,o=0,n="",r=arguments.length;o<r;o++)(e=arguments[o])&&(t=Ti(e))&&(n&&(n+=" "),n+=t);return n}const $n=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,Bn=Ai,pn=(e,t)=>o=>{var n;if((t==null?void 0:t.variants)==null)return Bn(e,o==null?void 0:o.class,o==null?void 0:o.className);const{variants:r,defaultVariants:i}=t,a=Object.keys(r).map(c=>{const p=o==null?void 0:o[c],m=i==null?void 0:i[c];if(p===null)return null;const g=$n(p)||$n(m);return r[c][g]}),s=o&&Object.entries(o).reduce((c,p)=>{let[m,g]=p;return g===void 0||(c[m]=g),c},{}),d=t==null||(n=t.compoundVariants)===null||n===void 0?void 0:n.reduce((c,p)=>{let{class:m,className:g,...h}=p;return Object.entries(h).every(y=>{let[f,v]=y;return Array.isArray(v)?v.includes({...i,...s}[f]):{...i,...s}[f]===v})?[...c,m,g]:c},[]);return Bn(e,a,d,o==null?void 0:o.class,o==null?void 0:o.className)};/**
3 * @license lucide-react v0.462.0 - ISC
4 *
5 * This source code is licensed under the ISC license.
6 * See the LICENSE file in the root directory of this source tree.
7 */const ic=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Ei=(...e)=>e.filter((t,o,n)=>!!t&&t.trim()!==""&&n.indexOf(t)===o).join(" ").trim();/**
8 * @license lucide-react v0.462.0 - ISC
9 *
10 * This source code is licensed under the ISC license.
11 * See the LICENSE file in the root directory of this source tree.
12 */var ac={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
13 * @license lucide-react v0.462.0 - ISC
14 *
15 * This source code is licensed under the ISC license.
16 * See the LICENSE file in the root directory of this source tree.
17 */const sc=u.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:o=2,absoluteStrokeWidth:n,className:r="",children:i,iconNode:a,...s},d)=>u.createElement("svg",{ref:d,...ac,width:t,height:t,stroke:e,strokeWidth:n?Number(o)*24/Number(t):o,className:Ei("lucide",r),...s},[...a.map(([c,p])=>u.createElement(c,p)),...Array.isArray(i)?i:[i]]));/**
18 * @license lucide-react v0.462.0 - ISC
19 *
20 * This source code is licensed under the ISC license.
21 * See the LICENSE file in the root directory of this source tree.
22 */const bt=(e,t)=>{const o=u.forwardRef(({className:n,...r},i)=>u.createElement(sc,{ref:i,iconNode:t,className:Ei(`lucide-${ic(e)}`,n),...r}));return o.displayName=`${e}`,o};/**
23 * @license lucide-react v0.462.0 - ISC
24 *
25 * This source code is licensed under the ISC license.
26 * See the LICENSE file in the root directory of this source tree.
27 */const lc=bt("Apple",[["path",{d:"M12 20.94c1.5 0 2.75 1.06 4 1.06 3 0 6-8 6-12.22A4.91 4.91 0 0 0 17 5c-2.22 0-4 1.44-5 2-1-.56-2.78-2-5-2a4.9 4.9 0 0 0-5 4.78C2 14 5 22 8 22c1.25 0 2.5-1.06 4-1.06Z",key:"3s7exb"}],["path",{d:"M10 2c1 .5 2 2 2 5",key:"fcco2y"}]]);/**
28 * @license lucide-react v0.462.0 - ISC
29 *
30 * This source code is licensed under the ISC license.
31 * See the LICENSE file in the root directory of this source tree.
32 */const Bt=bt("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/**
33 * @license lucide-react v0.462.0 - ISC
34 *
35 * This source code is licensed under the ISC license.
36 * See the LICENSE file in the root directory of this source tree.
37 */const tt=bt("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);/**
38 * @license lucide-react v0.462.0 - ISC
39 *
40 * This source code is licensed under the ISC license.
41 * See the LICENSE file in the root directory of this source tree.
42 */const Vt=bt("Mail",[["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}],["path",{d:"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7",key:"1ocrg3"}]]);/**
43 * @license lucide-react v0.462.0 - ISC
44 *
45 * This source code is licensed under the ISC license.
46 * See the LICENSE file in the root directory of this source tree.
47 */const cc=bt("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);/**
48 * @license lucide-react v0.462.0 - ISC
49 *
50 * This source code is licensed under the ISC license.
51 * See the LICENSE file in the root directory of this source tree.
52 */const ki=bt("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}
vendor: 9,078 bytes, line 52
52],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),hn="-",dc=e=>{const t=pc(e),{conflictingClassGroups:o,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:a=>{const s=a.split(hn);return s[0]===""&&s.length!==1&&s.shift(),Ci(s,t)||uc(a)},getConflictingClassGroupIds:(a,s)=>{const d=o[a]||[];return s&&n[a]?[...d,...n[a]]:d}}},Ci=(e,t)=>{var a;if(e.length===0)return t.classGroupId;const o=e[0],n=t.nextPart.get(o),r=n?Ci(e.slice(1),n):void 0;if(r)return r;if(t.validators.length===0)return;const i=e.join(hn);return(a=t.validators.find(({validator:s})=>s(i)))==null?void 0:a.classGroupId},Vn=/^\[(.+)\]$/,uc=e=>{if(Vn.test(e)){const t=Vn.exec(e)[1],o=t==null?void 0:t.substring(0,t.indexOf(":"));if(o)return"arbitrary.."+o}},pc=e=>{const{theme:t,prefix:o}=e,n={nextPart:new Map,validators:[]};return mc(Object.entries(e.classGroups),o).forEach(([i,a])=>{Ko(a,n,i,t)}),n},Ko=(e,t,o,n)=>{e.forEach(r=>{if(typeof r=="string"){const i=r===""?t:Un(t,r);i.classGroupId=o;return}if(typeof r=="function"){if(hc(r)){Ko(r(n),t,o,n);return}t.validators.push({validator:r,classGroupId:o});return}Object.entries(r).forEach(([i,a])=>{Ko(a,Un(t,i),o,n)})})},Un=(e,t)=>{let o=e;return t.split(hn).forEach(n=>{o.nextPart.has(n)||o.nextPart.set(n,{nextPart:new Map,validators:[]}),o=o.nextPart.get(n)}),o},hc=e=>e.isThemeGetter,mc=(e,t)=>t?e.map(([o,n])=>{const r=n.map(i=>typeof i=="string"?t+i:typeof i=="object"?Object.fromEntries(Object.entries(i).map(([a,s])=>[t+a,s])):i);return[o,r]}):e,fc=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,o=new Map,n=new Map;const r=(i,a)=>{o.set(i,a),t++,t>e&&(t=0,n=o,o=new Map)};return{get(i){let a=o.get(i);if(a!==void 0)return a;if((a=n.get(i))!==void 0)return r(i,a),a},set(i,a){o.has(i)?o.set(i,a):r(i,a)}}},Ni="!",gc=e=>{const{separator:t,experimentalParseClassName:o}=e,n=t.length===1,r=t[0],i=t.length,a=s=>{const d=[];let c=0,p=0,m;for(let v=0;v<s.length;v++){let w=s[v];if(c===0){if(w===r&&(n||s.slice(v,v+i)===t)){d.push(s.slice(p,v)),p=v+i;continue}if(w==="/"){m=v;continue}}w==="["?c++:w==="]"&&c--}const g=d.length===0?s:s.substring(p),h=g.startsWith(Ni),y=h?g.substring(1):g,f=m&&m>p?m-p:void 0;return{modifiers:d,hasImportantModifier:h,baseClassName:y,maybePostfixModifierPosition:f}};return o?s=>o({className:s,parseClassName:a}):a},yc=e=>{if(e.length<=1)return e;const t=[];let o=[];return e.forEach(n=>{n[0]==="["?(t.push(...o.sort(),n),o=[]):o.push(n)}),t.push(...o.sort()),t},vc=e=>({cache:fc(e.cacheSize),parseClassName:gc(e),...dc(e)}),wc=/\s+/,bc=(e,t)=>{const{parseClassName:o,getClassGroupId:n,getConflictingClassGroupIds:r}=t,i=[],a=e.trim().split(wc);let s="";for(let d=a.length-1;d>=0;d-=1){const c=a[d],{modifiers:p,hasImportantModifier:m,baseClassName:g,maybePostfixModifierPosition:h}=o(c);let y=!!h,f=n(y?g.substring(0,h):g);if(!f){if(!y){s=c+(s.length>0?" "+s:s);continue}if(f=n(g),!f){s=c+(s.length>0?" "+s:s);continue}y=!1}const v=yc(p).join(":"),w=m?v+Ni:v,x=w+f;if(i.includes(x))continue;i.push(x);const b=r(f,y);for(let T=0;T<b.length;++T){const k=b[T];i.push(w+k)}s=c+(s.length>0?" "+s:s)}return s};function Pc(){let e=0,t,o,n="";for(;e<arguments.length;)(t=arguments[e++])&&(o=Ri(t))&&(n&&(n+=" "),n+=o);return n}const Ri=e=>{if(typeof e=="string")return e;let t,o="";for(let n=0;n<e.length;n++)e[n]&&(t=Ri(e[n]))&&(o&&(o+=" "),o+=t);return o};function xc(e,...t){let o,n,r,i=a;function a(d){const c=t.reduce((p,m)=>m(p),e());return o=vc(c),n=o.cache.get,r=o.cache.set,i=s,s(d)}function s(d){const c=n(d);if(c)return c;const p=bc(d,o);return r(d,p),p}return function(){return i(Pc.apply(null,arguments))}}const ee=e=>{const t=o=>o[e]||[];return t.isThemeGetter=!0,t},Ii=/^\[(?:([a-z-]+):)?(.+)\]$/i,Sc=/^\d+\/\d+$/,Tc=new Set(["px","full","screen"]),Ac=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Ec=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,kc=/^(rgba?|hsla?|hwb|(ok)?(lab|lch))\(.+\)$/,Cc=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Nc=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Me=e=>mt(e)||Tc.has(e)||Sc.test(e),Ke=e=>Pt(e,"length",_c),mt=e=>!!e&&!Number.isNaN(Number(e)),Co=e=>Pt(e,"number",mt),St=e=>!!e&&Number.isInteger(Number(e)),Rc=e=>e.endsWith("%")&&mt(e.slice(0,-1)),B=e=>Ii.test(e),Ge=e=>Ac.test(e),Ic=new Set(["length","size","percentage"]),Dc=e=>Pt(e,Ic,Di),Wc=e=>Pt(e,"position",Di),Lc=new Set(["image","url"]),Oc=e=>Pt(e,Lc,jc),Fc=e=>Pt(e,"",Mc),Tt=()=>!0,Pt=(e,t,o)=>{const n=Ii.exec(e);return n?n[1]?typeof t=="string"?n[1]===t:t.has(n[1]):o(n[2]):!1},_c=e=>Ec.test(e)&&!kc.test(e),Di=()=>!1,Mc=e=>Cc.test(e),jc=e=>Nc.test(e),Hc=()=>{const e=ee("colors"),t=ee("spacing"),o=ee("blur"),n=ee("brightness"),r=ee("borderColor"),i=ee("borderRadius"),a=ee("borderSpacing"),s=ee("borderWidth"),d=ee("contrast"),c=ee("grayscale"),p=ee("hueRotate"),m=ee("invert"),g=ee("gap"),h=ee("gradientColorStops"),y=ee("gradientColorStopPositions"),f=ee("inset"),v=ee("margin"),w=ee("opacity"),x=ee("padding"),b=ee("saturate"),T=ee("scale"),k=ee("sepia"),S=ee("skew"),C=ee("space"),L=ee("translate"),O=()=>["auto","contain","none"],F=()=>["auto","hidden","clip","visible","scroll"],q=()=>["auto",B,t],W=()=>[B,t],z=()=>["",Me,Ke],N=()=>["auto",mt,B],Q=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],V=()=>["solid","dashed","dotted","double","none"],U=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],Y=()=>["start","end","center","between","around","evenly","stretch"],I=()=>["","0",B],J=()=>["auto","avoid","all","avoid-page","page","left","right","column"],j=()=>[mt,B];return{cacheSize:500,separator:":",theme:{colors:[Tt],spacing:[Me,Ke],blur:["none","",Ge,B],brightness:j(),borderColor:[e],borderRadius:["none","","full",Ge,B],borderSpacing:W(),borderWidth:z(),contrast:j(),grayscale:I(),hueRotate:j(),invert:I(),gap:W(),gradientColorStops:[e],gradientColorStopPositions:[Rc,Ke],inset:q(),margin:q(),opacity:j(),padding:W(),saturate:j(),scale:j(),sepia:I(),skew:j(),space:W(),translate:W()},classGroups:{aspect:[{aspect:["auto","square","video",B]}],container:["container"],columns:[{columns:[Ge]}],"break-after":[{"break-after":J()}],"break-before":[{"break-before":J()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...Q(),B]}],overflow:[{overflow:F()}],"overflow-x":[{"overflow-x":F()}],"overflow-y":[{"overflow-y":F()}],overscroll:[{overscroll:O()}],"overscroll-x":[{"overscroll-x":O()}],"overscroll-y":[{"overscroll-y":O()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[f]}],"inset-x":[{"inset-x":[f]}],"inset-y":[{"inset-y":[f]}],start:[{start:[f]}],end:[{end:[f]}],top:[{top:[f]}],right:[{right:[f]}],bottom:[{bottom:[f]}],left:[{left:[f]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",St,B]}],basis:[{basis:q()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",B]}],grow:[{grow:I()}],shrink:[{shrink:I()}],order:[{order:["first","last","none",St,B]}],"grid-cols":[{"grid-cols":[Tt]}],"col-start-end":[{col:["auto",{span:["full",St,B]},B]}],"col-start":[{"col-start":N()}],"col-end":[{"col-end":N()}],"grid-rows":[{"grid-rows":[Tt]}],"row-start-end":[{row:["auto",{span:[St,B]},B]}],"row-start":[{"row-start":N()}],"row-end":[{"row-end":N()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",B]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",B]}],gap:[{gap:[g]}],"gap-x":[{"gap-x":[g]}],"gap-y":[{"gap-y":[g]}],"justify-content":[{justify:["normal",...Y()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...Y(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...Y(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[x]}],px:[{px:[x]}],py:[{py:[x]}],ps:[{ps:[x]}
vendor: 8,317 bytes, line 52
52],pe:[{pe:[x]}],pt:[{pt:[x]}],pr:[{pr:[x]}],pb:[{pb:[x]}],pl:[{pl:[x]}],m:[{m:[v]}],mx:[{mx:[v]}],my:[{my:[v]}],ms:[{ms:[v]}],me:[{me:[v]}],mt:[{mt:[v]}],mr:[{mr:[v]}],mb:[{mb:[v]}],ml:[{ml:[v]}],"space-x":[{"space-x":[C]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[C]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",B,t]}],"min-w":[{"min-w":[B,t,"min","max","fit"]}],"max-w":[{"max-w":[B,t,"none","full","min","max","fit","prose",{screen:[Ge]},Ge]}],h:[{h:[B,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[B,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[B,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[B,t,"auto","min","max","fit"]}],"font-size":[{text:["base",Ge,Ke]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Co]}],"font-family":[{font:[Tt]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",B]}],"line-clamp":[{"line-clamp":["none",mt,Co]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",Me,B]}],"list-image":[{"list-image":["none",B]}],"list-style-type":[{list:["none","disc","decimal",B]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[w]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[w]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...V(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",Me,Ke]}],"underline-offset":[{"underline-offset":["auto",Me,B]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:W()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",B]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",B]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[w]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...Q(),Wc]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",Dc]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Oc]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[y]}],"gradient-via-pos":[{via:[y]}],"gradient-to-pos":[{to:[y]}],"gradient-from":[{from:[h]}],"gradient-via":[{via:[h]}],"gradient-to":[{to:[h]}],rounded:[{rounded:[i]}],"rounded-s":[{"rounded-s":[i]}],"rounded-e":[{"rounded-e":[i]}],"rounded-t":[{"rounded-t":[i]}],"rounded-r":[{"rounded-r":[i]}],"rounded-b":[{"rounded-b":[i]}],"rounded-l":[{"rounded-l":[i]}],"rounded-ss":[{"rounded-ss":[i]}],"rounded-se":[{"rounded-se":[i]}],"rounded-ee":[{"rounded-ee":[i]}],"rounded-es":[{"rounded-es":[i]}],"rounded-tl":[{"rounded-tl":[i]}],"rounded-tr":[{"rounded-tr":[i]}],"rounded-br":[{"rounded-br":[i]}],"rounded-bl":[{"rounded-bl":[i]}],"border-w":[{border:[s]}],"border-w-x":[{"border-x":[s]}],"border-w-y":[{"border-y":[s]}],"border-w-s":[{"border-s":[s]}],"border-w-e":[{"border-e":[s]}],"border-w-t":[{"border-t":[s]}],"border-w-r":[{"border-r":[s]}],"border-w-b":[{"border-b":[s]}],"border-w-l":[{"border-l":[s]}],"border-opacity":[{"border-opacity":[w]}],"border-style":[{border:[...V(),"hidden"]}],"divide-x":[{"divide-x":[s]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[s]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[w]}],"divide-style":[{divide:V()}],"border-color":[{border:[r]}],"border-color-x":[{"border-x":[r]}],"border-color-y":[{"border-y":[r]}],"border-color-s":[{"border-s":[r]}],"border-color-e":[{"border-e":[r]}],"border-color-t":[{"border-t":[r]}],"border-color-r":[{"border-r":[r]}],"border-color-b":[{"border-b":[r]}],"border-color-l":[{"border-l":[r]}],"divide-color":[{divide:[r]}],"outline-style":[{outline:["",...V()]}],"outline-offset":[{"outline-offset":[Me,B]}],"outline-w":[{outline:[Me,Ke]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:z()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[w]}],"ring-offset-w":[{"ring-offset":[Me,Ke]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",Ge,Fc]}],"shadow-color":[{shadow:[Tt]}],opacity:[{opacity:[w]}],"mix-blend":[{"mix-blend":[...U(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":U()}],filter:[{filter:["","none"]}],blur:[{blur:[o]}],brightness:[{brightness:[n]}],contrast:[{contrast:[d]}],"drop-shadow":[{"drop-shadow":["","none",Ge,B]}],grayscale:[{grayscale:[c]}],"hue-rotate":[{"hue-rotate":[p]}],invert:[{invert:[m]}],saturate:[{saturate:[b]}],sepia:[{sepia:[k]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[o]}],"backdrop-brightness":[{"backdrop-brightness":[n]}],"backdrop-contrast":[{"backdrop-contrast":[d]}],"backdrop-grayscale":[{"backdrop-grayscale":[c]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[p]}],"backdrop-invert":[{"backdrop-invert":[m]}],"backdrop-opacity":[{"backdrop-opacity":[w]}],"backdrop-saturate":[{"backdrop-saturate":[b]}],"backdrop-sepia":[{"backdrop-sepia":[k]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[a]}],"border-spacing-x":[{"border-spacing-x":[a]}],"border-spacing-y":[{"border-spacing-y":[a]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",B]}],duration:[{duration:j()}],ease:[{ease:["linear","in","out","in-out",B]}],delay:[{delay:j()}],animate:[{animate:["none","spin","ping","pulse","bounce",B]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[T]}],"scale-x":[{"scale-x":[T]}],"scale-y":[{"scale-y":[T]}],rotate:[{rotate:[St,B]}],"translate-x":[{"translate-x":[L]}],"translate-y":[{"translate-y":[L]}],"skew-x":[{"skew-x":[S]}],"skew-y":[{"skew-y":[S]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",B]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",B]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":W()}],"scroll-mx":[{"scroll-mx":W()}],"scroll-my":[{"scroll-my":W()}],"scroll-ms":[{"scroll-ms":W()}],"scroll-me":[{"scroll-me":W()}],"scroll-mt":[{"scroll-mt":W()}],"scroll-mr":[{"scroll-mr":W()}],"scroll-mb":[{"scroll-mb":W()}],"scroll-ml":[{"scroll-ml":W()}],"scroll-p":[{"scroll-p":W()}],"scroll-px":[{"scroll-px":W()}],"scroll-py":[{"scroll-py":W()}],"scroll-ps":[{"scroll-ps":W()}],"scroll-pe":[{"scroll-pe":W()}],"scroll-pt":[{"scroll-pt":W()}],"scroll-pr":[{"scroll-pr":W()}],"scroll-pb":[{"scroll-pb":W()}],"scroll-pl":[{"scroll-pl":W()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}
52],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",B]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[Me,Ke,Co]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},$c=xc(Hc);function ce(...e){return $c(Ai(e))}const Bc=rc,Wi=u.forwardRef(({className:e,...t},o)=>l.jsx(vi,{ref:o,className:ce("fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",e),...t}));Wi.displayName=vi.displayName;const Vc=pn("group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",{variants:{variant:{default:"border bg-background text-foreground",destructive:"destructive group border-destructive bg-destructive text-destructive-foreground"}},defaultVariants:{variant:"default"}}),Li=u.forwardRef(({className:e,variant:t,...o},n)=>l.jsx(wi,{ref:n,className:ce(Vc({variant:t}),e),...o}));Li.displayName=wi.displayName;const Uc=u.forwardRef(({className:e,...t},o)=>l.jsx(xi,{ref:o,className:ce("inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors group-[.destructive]:border-muted/40 hover:bg-secondary group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 group-[.destructive]:focus:ring-destructive disabled:pointer-events-none disabled:opacity-50",e),...t}));Uc.displayName=xi.displayName;const Oi=u.forwardRef(({className:e,...t},o)=>l.jsx(Si,{ref:o,className:ce("absolute right-2 top-2 rounded-md p-1 text-foreground
52/50 opacity-0 transition-opacity group-hover:opacity-100 group-[.destructive]:text-red-300 hover:text-foreground group-[.destructive]:hover:text-red-50 focus:opacity-100 focus:outline-none focus:ring-2 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",e),"toast-close":"",...t,children:l.jsx(ki,{className:"h-4 w-4"})}));Oi.displayName=Si.displayName;const Fi=u.forwardRef(({className:e,...t},o)=>l.jsx(bi,{ref:o,className:ce("text-sm font-semibold",e),...t}));Fi.displayName=bi.displayName;const _i=u.forwardRef(({className:e,...t},o)=>l.jsx(Pi,{ref:o,className:ce("text-sm opacity-90",e),...t}));_i.displayName=Pi.displayName;function qc(){const{toasts:e}=ul();return l.jsxs(Bc,{duration:3e3,children:[e.map(function({id:t,title:o,description:n,action:r,...i}){return l.jsxs(Li,{...i,children:[l.jsxs("div",{className:"grid gap-1",children:[o&&l.jsx(Fi,{children:o}),n&&l.jsx(_i,{children:n})]}),r,l.jsx(Oi,{})]},t)}),l.jsx(Wi,{})]})}var qn=["light","dark"],zc="(prefers-color-scheme: dark)",Kc=u.createContext(void 0),Gc={setTheme:e=>{},themes:[]},Yc=()=>{var e;return(e=u.useContext(Kc))!=null?e:Gc};u.memo(({forcedTheme:e,storageKey:t,attribute:o,enableSystem:n,enableColorScheme:r,defaultTheme:i,value:a,attrs:s,nonce:d})=>{let c=i==="system",p=o==="class"?`var d=document.documentElement,c=d.classList;${`c.remove(${s.map(y=>`'${y}'`).join(",")})`};`:`var d=document.documentElement,n='${o}',s='setAttribute';`,m=r?qn.includes(i)&&i?`if(e==='light'||e==='dark'||!e)d.style.colorScheme=e||'${i}'`:"if(e==='light'||e==='dark')d.style.colorScheme=e":"",g=(y,f=!1,v=!0)=>{let w=a?a[y]:y,x=f?y+"|| ''":`'${w}'`,b="";return r&&v&&!f&&qn.includes(y)&&(b+=`d.style.colorScheme = '${y}';`),o==="class"?f||w?b+=`c.add(${x})`:b+="null":w&&(b+=`d[s](n,${x})`),b},h=e?`!function(){${p}${g(e)}}()`:n?`!function(){try{${p}var e=localStorage.getItem('${t}');if('system'===e||(!e&&${c})){var t='${zc}',m=window.matchMedia(t);if(m.media!==t||m.matches){${g("dark")}}else{${g("light")}}}else if(e){${a?`var x=${JSON.stringify(a)};`:""}${g(a?"x[e]":"e",!0)}}${c?"":"else{"+g(i,!1,!1)+"}"}${m}}catch(e){}}()`:`!function(){try{${p}var e=localStorage.getItem('${t}');if(e){${a?`var x=${JSON.stringify(a)};`:""}${g(a?"x[e]":"e",!0)}}else{${g(i,!1,!1)};}${m}}catch(t){}}();`;return u.createElement("script",{nonce:d,dangerouslySetInnerHTML:{__html:h}})});var Qc=e=>{switch(e){case"success":return Zc;case"info":return td;case"warning":return ed;case"error":return od;default:return null}},Xc=Array(12).fill(0),Jc=({visible:e,className:t})=>A.createElement("div",{className:["sonner-loading-wrapper",t].filter(Boolean).join(" "),"data-visible":e},A.createElement("div",{className:"sonner-spinner"},Xc.map((o,n)=>A.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${n}`})))),Zc=A.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},A.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),ed=A.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},A.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),td=A.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},A.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),od=A.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},A.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),nd=A.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},A.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),A.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),rd=()=>{let[e,t]=A.useState(document.hidden);return A.useEffect(()=>{let o=()=>{t(document.hidden)};return document.addEventListener("visibilitychange",o),()=>window.removeEventListener("visibilitychange",o)},[]),e},Go=1,id=class{constructor(){this.subscribe=e=>(this.subscribers.push(e),()=>{let t=this.subscribers.indexOf(e);this.subscribers.splice(t,1)}),this.publish=e=>
52{this.subscribers.forEach(t=>t(e))},this.addToast=e=>{this.publish(e),this.toasts=[...this.toasts,e]},this.create=e=>{var t;let{message:o,...n}=e,r=typeof(e==null?void 0:e.id)=="number"||((t=e.id)==null?void 0:t.length)>0?e.id:Go++,i=this.toasts.find(s=>s.id===r),a=e.dismissible===void 0?!0:e.dismissible;return this.dismissedToasts.has(r)&&this.dismissedToasts.delete(r),i?this.toasts=this.toasts.map(s=>s.id===r?(this.publish({...s,...e,id:r,title:o}),{...s,...e,id:r,dismissible:a,title:o}):s):this.addToast({title:o,...n,dismissible:a,id:r}),r},this.dismiss=e=>(this.dismissedToasts.add(e),e||this.toasts.forEach(t=>{this.subscribers.forEach(o=>o({id:t.id,dismiss:!0}))}),this.subscribers.forEach(t=>t({id:e,dismiss:!0})),e),this.message=(e,t)=>this.create({...t,message:e}),this.error=(e,t)=>this.create({...t,message:e,type:"error"}),this.success=(e,t)=>this.create({...t,type:"success",message:e}),this.info=(e,t)=>this.create({...t,type:"info",message:e}),this.warning=(e,t)=>this.create({...t,type:"warning",message:e}),this.loading=(e,t)=>
52this.create({...t,type:"loading",message:e}),this.promise=(e,t)=>{if(!t)return;let o;t.loading!==void 0&&(o=this.create({...t,promise:e,type:"loading",message:t.loading,description:typeof t.description!="function"?t.description:void 0}));let n=e instanceof Promise?e:e(),r=o!==void 0,i,a=n.then(async d=>{if(i=["resolve",d],A.isValidElement(d))r=!1,this.create({id:o,type:"default",message:d});else if(sd(d)&&!d.ok){r=!1;let c=typeof t.error=="function"?await t.error(`HTTP error! status: ${d.status}`):t.error,p=typeof t.description=="function"?await t.description(`HTTP error! status: ${d.status}`):t.description;this.create({id:o,type:"error",message:c,description:p})}else if(t.success!==void 0){r=!1;let c=typeof t.success=="function"?await t.success(d):t.success,p=typeof t.description=="function"?await t.description(d):t.description;this.create({id:o,type:"success",message:c,description:p})}}).catch(async d=>{if(i=["reject",d],t.error!==void 0){r=!1;let c=typeof t.error=="function"?await t.error(d):t.error,p=typeof t.description=="function"?await t.description(d):t.description;this.create({id:o,type:"error",message:c,description:p})}}).finally(()=>{var d;r&&(this.dismiss(o),o=void 0),(d=t.finally)==null||d.call(t)}),s=()=>new Promise((d,c)=>a.then(()=>i[0]==="reject"?c(i[1]):d(i[1])).catch(c));return typeof o!="string"&&typeof o!="number"?{unwrap:s}:Object.assign(o,{unwrap:s})},this.custom=(e,t)=>{let o=(t==null?void 0:t.id)||Go++;return this.create({jsx:e(o),id:o,...t}),o},this.getActiveToasts=()=>this.toasts.filter(e=>!this.dismissedToasts.has(e.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}},he=new id,ad=(e,t)=>{let o=(t==null?void 0:t.id)||Go++;return he.addToast({title:e,...t,id:o}),o},sd=e=>e&&typeof e=="object"&&"ok"in e&&typeof e.ok=="boolean"&&"status"in e&&typeof e.status=="number",ld=ad,cd=()=>he.toasts,dd=()=>he.getActiveToasts(),Jv=Object.assign(ld,{success:he.success,info:he.info,warning:he.warning,error:he.error,custom:he.custom,message:he.message,promise:he.promise,dismiss:he.dismiss,loading:he.loading},{getHistory:cd,getToasts:dd});function ud(e,{insertAt:t}={}){if(typeof document>"u")return;let o=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",t==="top"&&o.firstChild?o.insertBefore(n,o.firstChild):o.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}ud(`:where(html[dir="ltr"]),:where([data-sonner-toaster][dir="ltr"]){--toast-icon-margin-start: -3px;--toast-icon-margin-end: 4px;--toast-svg-margin-start: -1px;--toast-svg-margin-end: 0px;--toast-button-margin-start: auto;--toast-button-margin-end: 0;--toast-close-button-start: 0;--toast-close-button-end: unset;--toast-close-button-transform: translate(-35%, -35%)}:where(html[dir="rtl"]),:where([data-sonner-toaster][dir="rtl"]){--toast-icon-margin-start: 4px;--toast-icon-margin-end: -3px;--toast-svg-margin-start: 0px;--toast-svg-margin-end: -1px;--toast-button-margin-start: 0;--toast-button-margin-end: auto;--toast-close-button-start: unset;--toast-close-button-end: 0;--toast-close-button-transform: translate(35%, -35%)}:where([data-sonner-toaster]){position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1: hsl(0, 0%, 99%);--gray2: hsl(0, 0%, 97.3%);--gray3: hsl(0, 0%, 95.1%);--gray4: hsl(0, 0%, 93%);--gray5: hsl(0, 0%, 90.9%);--gray6: hsl(0, 0%, 88.7%);--gray7: hsl(0, 0%, 85.8%);--gray8: hsl(0, 0%, 78%);--gray9: hsl(0, 0%, 56.1%);--gray10: hsl(0, 0%, 52.3%);--gray11: hsl(0, 0%, 43.5%);--gray12: hsl(0, 0%, 9%);--border-radius: 8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:none;z-index:999999999;transition:transform .4s ease}:where([data-sonner-toaster][data-lifted="true"]){transform:translateY(-10px)}@media (hover: none) and (pointer: coarse){:where([data-sonner-toaster][data-lifted="true"]){transform:none}}:where([data-sonner-toaster][data-x-position="right"]){right:var(--offset-right)}:where([data-sonner-toaster][data-x-position="left"]){left:var(--offset-left)}:where([data-sonner-toaster][data-x-position="center"]){left:50%;transform:translate(-50%)}:where([data-sonner-toaster][data-y-position="top"]){top:var(--offset-top)}:where([data-sonner-toaster][data-y-position="bottom"]){bottom:var(--offset-bottom)}:where([data-sonner-toast]){--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);filter:blur(0);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:none;overflow-wrap:anywhere}:where([data-sonner-toast][data-styled="true"]){padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px #0000001a;width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}:where([data-sonner-toast]:focus-visible){box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast][data-y-position="top"]){top:0;--y: translateY(-100%);--lift: 1;--lift-amount: calc(1 * var(--gap))}:where([data-sonner-toast][data-y-position="bottom"]){bottom:0;--y: translateY(100%);--lift: -1;--lift-amount: calc(var(--lift) * var(--gap))}:where([data-sonner-toast]) :where([data-description]){font-weight:400;line-height:1.4;color:inherit}:where([data-sonner-toast]) :where([data-title]){font-weight:500;line-height:1.5;color:inherit}:where([data-sonner-toast]) :where([data-icon]){display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}:where([data-sonner-toast][data-promise="true"]) :where([data-icon])>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}:where([data-sonner-toast]) :where([data-icon])>*{flex-shrink:0}:where([data-sonner-toast]) :where([data-icon]) svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}:where([data-sonner-toast]) :where([data-content]){display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;cursor:pointer;outline:none;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}:where([data-sonner-toast]) :where([data-button]):focus-visible{box-shadow:0 0 0 2px #0006}:where([data-sonner-toast]) :where([data-button]):first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}:where([data-sonner-toast]) :where([data-cancel]){color:var(--normal-text);background:rgba(0,0,0,.08)}:where([data-sonner-toast][data-theme="dark"]) :where([data-cancel]){background:rgba(255,255,255,.3)}:where([data-sonner-toast]) :where([data-close-button]){position:absolute;
52left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast] [data-close-button]{background:var(--gray1)}:where([data-sonner-toast]) :where([data-close-button]):focus-visible{box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast]) :where([data-disabled="true"]){cursor:not-allowed}:where([data-sonner-toast]):hover :where([data-close-button]):hover{background:var(--gray2);border-color:var(--gray5)}:where([data-sonner-toast][data-swiping="true"]):before{content:"";position:absolute;left:-50%;right:-50%;height:100%;z-index:-1}:where([data-sonner-toast][data-y-position="top"][data-swiping="true"]):before{bottom:50%;transform:scaleY(3) translateY(50%)}:where([data-sonner-toast][data-y-position="bottom"][data-swiping="true"]):before{top:50%;transform:scaleY(3) translateY(-50%)}:where([data-sonner-toast][data-swiping="false"][data-removed="true"]):before{content:"";position:absolute;inset:0;transform:scaleY(2)}:where([data-sonner-toast]):after{content:"";position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}:where([data-sonner-toast][data-mounted="true"]){--y: translateY(0);opacity:1}:where([data-sonner-toast][data-expanded="false"][data-front="false"]){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}:where([data-sonner-toast])>*{transition:opacity .4s}:where([data-sonner-toast][data-expanded="false"][data-front="false"][data-styled="true"])>*{opacity:0}
52:where([data-sonner-toast][data-visible="false"]){opacity:0;pointer-events:none}:where([data-sonner-toast][data-mounted="true"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}:where([data-sonner-toast][data-removed="true"][data-front="true"][data-swipe-out="false"]){--y: translateY(calc(var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="false"]){--y: translateY(40%);opacity:0;transition:transform .5s,opacity .2s}:where([data-sonner-toast][data-removed="true"][data-front="false"]):before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y, 0px)) translate(var(--swipe-amount-x, 0px));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width: 600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-theme=light]{--normal-bg: #fff;--normal-border: var(--gray4);--normal-text: var(--gray12);--success-bg: hsl(143, 85%, 96%);--success-border: hsl(145, 92%, 91%);--success-text: hsl(140, 100%, 27%);--info-bg: hsl(208, 100%, 97%);--info-border: hsl(221, 91%, 91%);--info-text: hsl(210, 92%, 45%);--warning-bg: hsl(49, 100%, 97%);--warning-border: hsl(49, 91%, 91%);--warning-text: hsl(31, 92%, 45%);--error-bg: hsl(359, 100%, 97%);--error-border: hsl(359, 100%, 94%);--error-text: hsl(360, 100%, 45%)}[data-sonner-toaster][data-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg: #000;--normal-border: hsl(0, 0%, 20%);--normal-text: var(--gray1)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg: #fff;--normal-border: var(--gray3);--normal-text: var(--gray12)}[data-sonner-toaster][data-theme=dark]{--normal-bg: #000;--normal-bg-hover: hsl(0, 0%, 12%);--normal-border: hsl(0, 0%, 20%);--normal-border-hover: hsl(0, 0%, 25%);--normal-text: var(--gray1);--success-bg: hsl(150, 100%, 6%);--success-border: hsl(147, 100%, 12%);--success-text: hsl(150, 86%, 65%);--info-bg: hsl(215, 100%, 6%);--info-border: hsl(223, 100%, 12%);--info-text: hsl(216, 87%, 65%);--warning-bg: hsl(64, 100%, 6%);--warning-border: hsl(60, 100%, 12%);--warning-text: hsl(46, 87%, 65%);--error-bg: hsl(358, 76%, 10%);--error-border: hsl(357, 89%, 16%);
52--error-text: hsl(358, 100%, 81%)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success],[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info],[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning],[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error],[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size: 16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:nth-child(1){animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}to{opacity:.15}}@media (prefers-reduced-motion){[data-sonner-toast],[data-sonner-toast]>*,.sonner-loading-bar{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}
53`);function Ut(e){return e.label!==void 0}var pd=3,hd="32px",md="16px",zn=4e3,fd=356,gd=14,yd=20,vd=200;function Ae(...e){return e.filter(Boolean).join(" ")}function wd(e){let[t,o]=e.split("-"),n=[];return t&&n.push(t),o&&n.push(o),n}var bd=e=>{var t,o,n,r,i,a,s,d,c,p,m;let{invert:g,toast:h,unstyled:y,interacting:f,setHeights:v,visibleToasts:w,heights:x,index:b,toasts:T,expanded:k,removeToast:S,defaultRichColors:C,closeButton:L,style:O,cancelButtonStyle:F,actionButtonStyle:q,className:W="",descriptionClassName:z="",duration:N,position:Q,gap:V,loadingIcon:U,expandByDefault:Y,classNames:I,icons:J,closeButtonAriaLabel:j="Close toast",pauseWhenPageIsHidden:_}=e,[D,K]=A.useState(null),[re,de]=A.useState(null),[X,He]=A.useState(!1),[Ne,Oe]=A.useState(!1),[ve,fe]=A.useState(!1),[we,$e]=A.useState(!1),[rt,Xe]=A.useState(!1),[Je,Ze]=A.useState(0),[Fe,xt]=A.useState(0),ge=A.useRef(h.duration||N||zn),be=A.useRef(null),_e=A.useRef(null),Po=b===0,xo=b+1<=w,pe=h.type,P=h.dismissible!==!1,$=h.className||"",G=h.descriptionClassName||"",ie=A.useMemo(()=>x.findIndex(H=>H.toastId===h.id)||0,[x,h.id]),it=A.useMemo(()=>{var H;return(H=h.closeButton)!=null?H:L},[h.closeButton,L]),Be=A.useMemo(()=>h.duration||N||zn,[h.duration,N]),ye=A.useRef(0),Ve=A.useRef(0),jt=A.useRef(0),at=A.useRef(null),[ks,Cs]=Q.split("-"),In=A.useMemo(()=>x.reduce((H,Z,te)=>te>=ie?H:H+Z.height,0),[x,ie]),Dn=rd(),Ns=h.invert||g,So=pe==="loading";Ve.current=A.useMemo(()=>ie*V+In,[ie,In]),A.useEffect(()=>{ge.current=Be},[Be]),A.useEffect(()=>{He(!0)},[]),A.useEffect(()=>{let H=_e.current;if(H){let Z=H.getBoundingClientRect().height;return xt(Z),v(te=>[{toastId:h.id,height:Z,position:h.position},...te]),()=>v(te=>te.filter(Pe=>Pe.toastId!==h.id))}},[v,h.id]),A.useLayoutEffect(()=>{if(!X)return;let H=_e.current,Z=H.style.height;H.style.height="auto";let te=H.getBoundingClientRect().height;H.style.height=Z,xt(te),v(Pe=>Pe.find(xe=>xe.toastId===h.id)?Pe.map(xe=>xe.toastId===h.id?{...xe,height:te}:xe):[{toastId:h.id,height:te,position:h.position},...Pe])},[X,h.title,h.description,v,h.id]);let Ue=A.useCallback(()=>{Oe(!0),Ze(Ve.current),v(H=>H.filter(Z=>Z.toastId!==h.id)),setTimeout(()=>{S(h)},vd)},[h,S,v,Ve]);A.useEffect(()=>{if(h.promise&&pe==="loading"||h.duration===1/0||h.type==="loading")return;let H;return k||f||_&&Dn?(()=>{if(jt.current<ye.current){let Z=new Date().getTime()-ye.current;ge.current=ge.current-Z}
53jt.current=new Date().getTime()})():ge.current!==1/0&&(ye.current=new Date().getTime(),H=setTimeout(()=>{var Z;(Z=h.onAutoClose)==null||Z.call(h,h),Ue()},ge.current)),()=>clearTimeout(H)},[k,f,h,pe,_,Dn,Ue]),A.useEffect(()=>{h.delete&&Ue()},[Ue,h.delete]);function Rs(){var H,Z,te;return J!=null&&J.loading?A.createElement("div",{className:Ae(I==null?void 0:I.loader,(H=h==null?void 0:h.classNames)==null?void 0:H.loader,"sonner-loader"),"data-visible":pe==="loading"},J.loading):U?A.createElement("div",{className:Ae(I==null?void 0:I.loader,(Z=h==null?void 0:h.classNames)==null?void 0:Z.loader,"sonner-loader"),"data-visible":pe==="loading"},U):A.createElement(Jc,{className:Ae(I==null?void 0:I.loader,(te=h==null?void 0:h.classNames)==null?void 0:te.loader),visible:pe==="loading"})}return A.createElement("li",{tabIndex:0,ref:_e,className:Ae(W,$,I==null?void 0:I.toast,(t=h==null?void 0:h.classNames)==null?void 0:t.toast,I==null?void 0:I.default,I==null?void 0:I[pe],(o=h==null?void 0:h.classNames)==null?void 0:o[pe]),"data-sonner-toast":"","data-rich-colors":(n=h.richColors)!=null?n:C,"data-styled":!(h.jsx||h.unstyled||y),"data-mounted":X,"data-promise":!!h.promise,"data-swiped":rt,"data-removed":Ne,"data-visible":xo,"data-y-position":ks,"data-x-position":Cs,"data-index":b,"data-front":Po,"data-swiping":ve,"data-dismissible":P,"data-type":pe,"data-invert":Ns,"data-swipe-out":we,"data-swipe-direction":re,"data-expanded":!!(k||Y&&X),style:{"--index":b,"--toasts-before":b,"--z-index":T.length-b,"--offset":`${Ne?Je:Ve.current}px`,"--initial-height":Y?"auto":`${Fe}px`,...O,...h.style},onDragEnd:()=>{fe(!1),K(null),at.current=null},onPointerDown:H=>{So||!P||(be.current=new Date,Ze(Ve.current),H.target.setPointerCapture(H.pointerId),H.target.tagName!=="BUTTON"&&(fe(!0),at.current={x:H.clientX,y:H.clientY}))},onPointerUp:()=>{var H,Z,te,Pe;if(we||!P)return;at.current=null;let xe=Number(((H=_e.current)==null?void 0:H.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),qe=Number(((Z=_e.current)==null?void 0:Z.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),et=new Date().getTime()-((te=be.current)==null?void 0:te.getTime()),Se=D==="x"?xe:qe,ze=Math.abs(Se)/et;if(Math.abs(Se)>=yd||ze>.11){Ze(Ve.current),(Pe=h.onDismiss)==null||Pe.call(h,h),de(D==="x"?xe>0?"right":"left":qe>0?"down":"up"),Ue(),$e(!0),Xe(!1);return}fe(!1),K(null)},onPointerMove:H=>{var Z,te,Pe,xe;if(!at.current||!P||((Z=window.getSelection())==null?void 0:Z.toString().length)>0)return;let qe=H.clientY-at.current.y,et=H.clientX-at.current.x,Se=(te=e.swipeDirections)!=null?te:wd(Q);!D&&(Math.abs(et)>1||Math.abs(qe)>1)&&K(Math.abs(et)>Math.abs(qe)?"x":"y");let ze={x:0,y:0};D==="y"?(Se.includes("top")||Se.includes("bottom"))&&(Se.includes("top")&&qe<0||Se.includes("bottom")&&qe>0)&&(ze.y=qe):D==="x"&&(Se.includes("left")||Se.includes("right"))&&(Se.includes("left")&&et<0||Se.includes("right")&&et>0)&&(ze.x=et),(Math.abs(ze.x)>0||Math.abs(ze.y)>0)&&Xe(!0),(Pe=_e.current)==null||Pe.style.setProperty("--swipe-amount-x",`${ze.x}px`),(xe=_e.current)==null||xe.style.setProperty("--swipe-amount-y",`${ze.y}px`)}},it&&!h.jsx?A.createElement("button",{"aria-label":j,"data-disabled":So,"data-close-button":!0,onClick:So||!P?()=>{}:()=>{var H;Ue(),(H=h.onDismiss)==null||H.call(h,h)},className:Ae(I==null?void 0:I.closeButton,(r=h==null?void 0:h.classNames)==null?void 0:r.closeButton)},(i=J==null?void 0:J.close)!=null?i:nd):null,h.jsx||u.isValidElement(h.title)?h.jsx?h.jsx:typeof h.title=="function"?h.title():h.title:A.createElement(A.Fragment,null,pe||h.icon||h.promise?A.createElement("div",{"data-icon":"",className:Ae(I==null?void 0:I.icon,(a=h==null?void 0:h.classNames)==null?void 0:a.icon)},h.promise||h.type==="loading"&&!h.icon?h.icon||Rs():null,h.type!=="loading"?h.icon||(J==null?void 0:J[pe])||Qc(pe):null):null,A.createElement("div",{"data-content":"",className:Ae(I==null?void 0:I.content,(s=h==null?void 0:h.classNames)==null?void 0:s.content)},A.createElement("div",{"data-title":"",className:Ae(I==null?void 0:I.title,(d=h==null?void 0:h.classNames)==null?void 0:d.title)},typeof h.title=="function"?h.title():h.title),h.description?A.createElement("div",{"data-description":"",className:Ae(z,G,I==null?void 0:I.description,(c=h==null?void 0:h.classNames)==null?void 0:c.description)},typeof h.description=="function"?h.description():h.description):null),u.isValidElement(h.cancel)?h.cancel:h.cancel&&Ut(h.cancel)?A.createElement("button",{"data-button":!0,"data-cancel":!0,style:h.cancelButtonStyle||F,onClick:H=>{var Z,te;Ut(h.cancel)&&P&&((te=(Z=h.cancel).onClick)==null||te.call(Z,H),Ue())},className:Ae(I==null?void 0:I.cancelButton,(p=h==null?void 0:h.classNames)==null?void 0:p.cancelButton)},h.cancel.label):null,u.isValidElement(h.action)?h.action:h.action&&Ut(h.action)?A.createElement("button",{"data-button":!0,"data-action":!0,style:h.actionButtonStyle||q,onClick:H=>{var Z,te;Ut(h.action)&&((te=(Z=h.action).onClick)==null||te.call(Z,H),!H.defaultPrevented&&Ue())},className:Ae(I==null?void 0:I.actionButton,(m=h==null?void 0:h.classNames)==null?void 0:m.actionButton)},h.action.label):null))};function Kn(){if(typeof window>"u"||typeof document>"u")return"ltr";let e=document.documentElement.getAttribute("dir");return e==="auto"||!e?window.getComputedStyle(document.documentElement).direction:e}function Pd(e,t){let o={};return[e,t].forEach((n,r)=>{let i=r===1,a=i?"--mobile-offset":"--offset",s=i?md:hd;function d(c){["top","right","bottom","left"].forEach(p=>{o[`${a}-${p}`]=typeof c=="number"?`${c}px`:c})}typeof n=="number"||typeof n=="string"?d(n):typeof n=="object"?["top","right","bottom","left"].forEach(c=>{n[c]===void 0?o[`${a}-${c}`]=s:o[`${a}-${c}`]=typeof n[c]=="number"?`${n[c]}px`:n[c]}):d(s)}),o}var xd=u.forwardRef(function(e,t){let{invert:o,position:n="bottom-right",hotkey:r=["altKey","KeyT"],expand:i,closeButton:a,className:s,offset:d,mobileOffset:c,theme:p="light",richColors:m,duration:g,style:h,visibleToasts:y=pd,toastOptions:f,dir:v=Kn(),gap:w=gd,loadingIcon:x,icons:b,containerAriaLabel:T="Notifications",pauseWhenPageIsHidden:k}=e,[S,C]=A.useState([]),L=A.useMemo(()=>Array.from(new Set([n].concat(S.filter(_=>_.position).map(_=>_.position)))),[S,n]),[O,F]=A.useState([]),[q,W]=A.useState(!1),[z,N]=A.useState(!1),[Q,V]=A.useState(p!=="system"?p:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dar
53k":"light"),U=A.useRef(null),Y=r.join("+").replace(/Key/g,"").replace(/Digit/g,""),I=A.useRef(null),J=A.useRef(!1),j=A.useCallback(_=>{C(D=>{var K;return(K=D.find(re=>re.id===_.id))!=null&&K.delete||he.dismiss(_.id),D.filter(({id:re})=>re!==_.id)})},[]);return A.useEffect(()=>he.subscribe(_=>{if(_.dismiss){C(D=>D.map(K=>K.id===_.id?{...K,delete:!0}:K));return}setTimeout(()=>{zr.flushSync(()=>{C(D=>{let K=D.findIndex(re=>re.id===_.id);return K!==-1?[...D.slice(0,K),{...D[K],..._},...D.slice(K+1)]:[_,...D]})})})}),[]),A.useEffect(()=>{if(p!=="system"){V(p);return}if(p==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?V("dark"):V("light")),typeof window>"u")return;let _=window.matchMedia("(prefers-color-scheme: dark)");try{_.addEventListener("change",({matches:D})=>{V(D?"dark":"light")})}catch{_.addListener(({matches:K})=>{try{V(K?"dark":"light")}catch(re){console.error(re)}})}},[p]),A.useEffect(()=>{S.length<=1&&W(!1)},[S]),A.useEffect(()=>{let _=D=>{var K,re;r.every(de=>D[de]||D.code===de)&&(W(!0),(K=U.current)==null||K.focus()),D.code==="Escape"&&(document.activeElement===U.current||(re=U.current)!=null&&re.contains(document.activeElement))&&W(!1)};return document.addEventListener("keydown",_),()=>document.removeEventListener("keydown",_)},[r]),A.useEffect(()=>{if(U.current)return()=>{I.current&&(I.current.focus({preventScroll:!0}),I.current=null,J.current=!1)}},[U.current]),A.createElement("section",{ref:t,"aria-label":`${T} ${Y}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0},L.map((_,D)=>{var K;let[re,de]=_.split("-");return S.length?A.createElement("ol",{key:_,dir:v==="auto"?Kn():v,tabIndex:-1,ref:U,className:s,"data-sonner-toaster":!0,"data-theme":Q,"data-y-position":re,"data-lifted":q&&S.length>1&&!i,"data-x-position":de,style:{"--front-toast-height":`${((K=O[0])==null?void 0:K.height)||0}px`,"--width":`${fd}px`,"--gap":`${w}px`,...h,...Pd(d,c)},onBlur:X=>{J.current&&!X.currentTarget.contains(X.relatedTarget)&&(J.current=!1,I.current&&(I.current.focus({preventScroll:!0}),I.current=null))},onFocus:X=>{X.target instanceof HTMLElement&&X.target.dataset.dismissible==="false"||J.current||(J.current=!0,I.current=X.relatedTarget)},onMouseEnter:()=>W(!0),onMouseMove:()=>W(!0),onMouseLeave:()=>{z||W(!1)},onDragEnd:()=>W(!1),onPointerDown:X=>{X.target instanceof HTMLElement&&X.target.dataset.dismissible==="false"||N(!0)},onPointerUp:()=>N(!1)},S.filter(X=>!X.position&&D===0||X.position===_).map((X,He)=>{var Ne,Oe;return A.createElement(bd,{key:X.id,icons:b,index:He,toast:X,defaultRichColors:m,duration:(Ne=f==null?void 0:f.duration)!=null?Ne:g,className:f==null?void 0:f.className,descriptionClassName:f==null?void 0:f.descriptionClassName,invert:o,visibleToasts:y,closeButton:(Oe=f==null?void 0:f.closeButton)!=null?Oe:a,interacting:z,position:_,style:f==null?void 0:f.style,unstyled:f==null?void 0:f.unstyled,classNames:f==null?void 0:f.classNames,cancelButtonStyle:f==null?void 0:f.cancelButtonStyle,actionButtonStyle:f==null?void 0:f.actionButtonStyle,removeToast:j,toasts:S.filter(ve=>ve.position==X.position),heights:O.filter(ve=>ve.position==X.position),setHeights:F,expandByDefault:i,gap:w,loadingIcon:x,expanded:q,pauseWhenPageIsHidden:k,swipeDirections:e.swipeDirections})})):null}))});const Sd=({...e})=>{const{theme:t="system"}=Yc();return l.jsx(xd,{theme:t,className:"toaster group",toastOptions:{classNames:{toast:"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",description:"group-[.toast]:text-muted-foreground",actionButton:"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",cancelButton:"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"}},...e})};var Td=Kr[" useId ".trim().toString()]||(()=>{}),Ad=0;function No(e){const[t,o]=u.useState(Td());return je(()=>{o(n=>n??String(Ad++))},[e]),t?`radix-${t}`:""}var Ed="Arrow",Mi=u.forwardRef((e,t)=>{const{children:o,width:n=10,height:r=5,...i}=e;return l.jsx(ae.svg,{...i,ref:t,width:n,height:r,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:e.asChild?o:l.jsx("polygon",{points:"0,0 30,0 15,10"})})});Mi.displayName=Ed;var kd=Mi;
vendor: 4,824 bytes, line 53
53function Cd(e){const[t,o]=u.useState(void 0);return je(()=>{if(e){o({width:e.offsetWidth,height:e.offsetHeight});const n=new ResizeObserver(r=>{if(!Array.isArray(r)||!r.length)return;const i=r[0];let a,s;if("borderBoxSize"in i){const d=i.borderBoxSize,c=Array.isArray(d)?d[0]:d;a=c.inlineSize,s=c.blockSize}else a=e.offsetWidth,s=e.offsetHeight;o({width:a,height:s})});return n.observe(e,{box:"border-box"}),()=>n.unobserve(e)}else o(void 0)},[e]),t}var mn="Popper",[ji,Hi]=Ft(mn),[Nd,$i]=ji(mn),Bi=e=>{const{__scopePopper:t,children:o}=e,[n,r]=u.useState(null);return l.jsx(Nd,{scope:t,anchor:n,onAnchorChange:r,children:o})};Bi.displayName=mn;var Vi="PopperAnchor",Ui=u.forwardRef((e,t)=>{const{__scopePopper:o,virtualRef:n,...r}=e,i=$i(Vi,o),a=u.useRef(null),s=ue(t,a);return u.useEffect(()=>{i.onAnchorChange((n==null?void 0:n.current)||a.current)}),n?null:l.jsx(ae.div,{...r,ref:s})});Ui.displayName=Vi;var fn="PopperContent",[Rd,Id]=ji(fn),qi=u.forwardRef((e,t)=>{var X,He,Ne,Oe,ve,fe;const{__scopePopper:o,side:n="bottom",sideOffset:r=0,align:i="center",alignOffset:a=0,arrowPadding:s=0,avoidCollisions:d=!0,collisionBoundary:c=[],collisionPadding:p=0,sticky:m="partial",hideWhenDetached:g=!1,updatePositionStrategy:h="optimized",onPlaced:y,...f}=e,v=$i(fn,o),[w,x]=u.useState(null),b=ue(t,we=>x(we)),[T,k]=u.useState(null),S=Cd(T),C=(S==null?void 0:S.width)??0,L=(S==null?void 0:S.height)??0,O=n+(i!=="center"?"-"+i:""),F=typeof p=="number"?p:{top:0,right:0,bottom:0,left:0,...p},q=Array.isArray(c)?c:[c],W=q.length>0,z={padding:F,boundary:q.filter(Wd),altBoundary:W},{refs:N,floatingStyles:Q,placement:V,isPositioned:U,middlewareData:Y}=Is({strategy:"fixed",placement:O,whileElementsMounted:(...we)=>Ds(...we,{animationFrame:h==="always"}),elements:{reference:v.anchor},middleware:[Ws({mainAxis:r+L,alignmentAxis:a}),d&&Ls({mainAxis:!0,crossAxis:!1,limiter:m==="partial"?js():void 0,...z}),d&&Os({...z}),Fs({...z,apply:({elements:we,rects:$e,availableWidth:rt,availableHeight:Xe})=>{const{width:Je,height:Ze}=$e.reference,Fe=we.floating.style;Fe.setProperty("--radix-popper-available-width",`${rt}px`),Fe.setProperty("--radix-popper-available-height",`${Xe}px`),Fe.setProperty("--radix-popper-anchor-width",`${Je}px`),Fe.setProperty("--radix-popper-anchor-height",`${Ze}px`)}}),T&&_s({element:T,padding:s}),Ld({arrowWidth:C,arrowHeight:L}),g&&Ms({strategy:"referenceHidden",...z})]}),[I,J]=Gi(V),j=We(y);je(()=>{U&&(j==null||j())},[U,j]);const _=(X=Y.arrow)==null?void 0:X.x,D=(He=Y.arrow)==null?void 0:He.y,K=((Ne=Y.arrow)==null?void 0:Ne.centerOffset)!==0,[re,de]=u.useState();return je(()=>{w&&de(window.getComputedStyle(w).zIndex)},[w]),l.jsx("div",{ref:N.setFloating,"data-radix-popper-content-wrapper":"",style:{...Q,transform:U?Q.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:re,"--radix-popper-transform-origin":[(Oe=Y.transformOrigin)==null?void 0:Oe.x,(ve=Y.transformOrigin)==null?void 0:ve.y].join(" "),...((fe=Y.hide)==null?void 0:fe.referenceHidden)&&{visibility:"hidden",pointerEvents:"none"}},dir:e.dir,children:l.jsx(Rd,{scope:o,placedSide:I,onArrowChange:k,arrowX:_,arrowY:D,shouldHideArrow:K,children:l.jsx(ae.div,{"data-side":I,"data-align":J,...f,ref:b,style:{...f.style,animation:U?void 0:"none"}})})})});qi.displayName=fn;var zi="PopperArrow",Dd={top:"bottom",right:"left",bottom:"top",left:"right"},Ki=u.forwardRef(function(t,o){const{__scopePopper:n,...r}=t,i=Id(zi,n),a=Dd[i.placedSide];return l.jsx("span",{ref:i.onArrowChange,style:{position:"absolute",left:i.arrowX,top:i.arrowY,[a]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[i.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[i.placedSide],visibility:i.shouldHideArrow?"hidden":void 0},children:l.jsx(kd,{...r,ref:o,style:{...r.style,display:"block"}})})});Ki.displayName=zi;function Wd(e){return e!==null}var Ld=e=>({name:"transformOrigin",options:e,fn(t){var v,w,x;const{placement:o,rects:n,middlewareData:r}=t,a=((v=r.arrow)==null?void 0:v.centerOffset)!==0,s=a?0:e.arrowWidth,d=a?0:e.arrowHeight,[c,p]=Gi(o),m={start:"0%",center:"50%",end:"100%"}[p],g=(((w=r.arrow)==null?void 0:w.x)??0)+s/2,h=(((x=r.arrow)==null?void 0:x.y)??0)+d/2;let y="",f="";return c==="bottom"?(y=a?m:`${g}px`,f=`${-d}px`):c==="top"?(y=a?m:`${g}px`,f=`${n.floating.height+d}px`):c==="right"?(y=`${-d}px`,f=a?m:`${h}px`):c==="left"&&(y=`${n.floating.width+d}px`,f=a?m:`${h}px`),{data:{x:y,y:f}}}});function Gi(e){const[t,o="center"]=e.split("-");return[t,o]}var Zv=Bi,Od=Ui,Fd=qi,_d=Ki,[mo,ew]=Ft("Tooltip",[Hi]),gn=Hi(),Yi="TooltipProvider",Md=700,Gn="tooltip.open",[jd,Qi]=mo(Yi),Xi=e=>{const{__scopeTooltip:t,delayDuration:o=Md,skipDelayDuration:n=300,disableHoverableContent:r=!1,
vendor: 4,160 bytes, line 53
53children:i}=e,a=u.useRef(!0),s=u.useRef(!1),d=u.useRef(0);return u.useEffect(()=>{const c=d.current;return()=>window.clearTimeout(c)},[]),l.jsx(jd,{scope:t,isOpenDelayedRef:a,delayDuration:o,onOpen:u.useCallback(()=>{window.clearTimeout(d.current),a.current=!1},[]),onClose:u.useCallback(()=>{window.clearTimeout(d.current),d.current=window.setTimeout(()=>a.current=!0,n)},[n]),isPointerInTransitRef:s,onPointerInTransitChange:u.useCallback(c=>{s.current=c},[]),disableHoverableContent:r,children:i})};Xi.displayName=Yi;var Ji="Tooltip",[tw,fo]=mo(Ji),Yo="TooltipTrigger",Hd=u.forwardRef((e,t)=>{const{__scopeTooltip:o,...n}=e,r=fo(Yo,o),i=Qi(Yo,o),a=gn(o),s=u.useRef(null),d=ue(t,s,r.onTriggerChange),c=u.useRef(!1),p=u.useRef(!1),m=u.useCallback(()=>c.current=!1,[]);return u.useEffect(()=>()=>document.removeEventListener("pointerup",m),[m]),l.jsx(Od,{asChild:!0,...a,children:l.jsx(ae.button,{"aria-describedby":r.open?r.contentId:void 0,"data-state":r.stateAttribute,...n,ref:d,onPointerMove:oe(e.onPointerMove,g=>{g.pointerType!=="touch"&&!p.current&&!i.isPointerInTransitRef.current&&(r.onTriggerEnter(),p.current=!0)}),onPointerLeave:oe(e.onPointerLeave,()=>{r.onTriggerLeave(),p.current=!1}),onPointerDown:oe(e.onPointerDown,()=>{r.open&&r.onClose(),c.current=!0,document.addEventListener("pointerup",m,{once:!0})}),onFocus:oe(e.onFocus,()=>{c.current||r.onOpen()}),onBlur:oe(e.onBlur,r.onClose),onClick:oe(e.onClick,r.onClose)})})});Hd.displayName=Yo;var $d="TooltipPortal",[ow,Bd]=mo($d,{forceMount:void 0}),yt="TooltipContent",Zi=u.forwardRef((e,t)=>{const o=Bd(yt,e.__scopeTooltip),{forceMount:n=o.forceMount,side:r="top",...i}=e,a=fo(yt,e.__scopeTooltip);return l.jsx(wt,{present:n||a.open,children:a.disableHoverableContent?l.jsx(ea,{side:r,...i,ref:t}):l.jsx(Vd,{side:r,...i,ref:t})})}),Vd=u.forwardRef((e,t)=>{const o=fo(yt,e.__scopeTooltip),n=Qi(yt,e.__scopeTooltip),r=u.useRef(null),i=ue(t,r),[a,s]=u.useState(null),{trigger:d,onClose:c}=o,p=r.current,{onPointerInTransitChange:m}=n,g=u.useCallback(()=>{s(null),m(!1)},[m]),h=u.useCallback((y,f)=>{const v=y.currentTarget,w={x:y.clientX,y:y.clientY},x=Gd(w,v.getBoundingClientRect()),b=Yd(w,x),T=Qd(f.getBoundingClientRect()),k=Jd([...b,...T]);s(k),m(!0)},[m]);return u.useEffect(()=>()=>g(),[g]),u.useEffect(()=>{if(d&&p){const y=v=>h(v,p),f=v=>h(v,d);return d.addEventListener("pointerleave",y),p.addEventListener("pointerleave",f),()=>{d.removeEventListener("pointerleave",y),p.removeEventListener("pointerleave",f)}}},[d,p,h,g]),u.useEffect(()=>{if(a){const y=f=>{const v=f.target,w={x:f.clientX,y:f.clientY},x=(d==null?void 0:d.contains(v))||(p==null?void 0:p.contains(v)),b=!Xd(w,a);x?g():b&&(g(),c())};return document.addEventListener("pointermove",y),()=>document.removeEventListener("pointermove",y)}},[d,p,a,c,g]),l.jsx(ea,{...e,ref:i})}),[Ud,qd]=mo(Ji,{isInside:!1}),zd=gl("TooltipContent"),ea=u.forwardRef((e,t)=>{const{__scopeTooltip:o,children:n,"aria-label":r,onEscapeKeyDown:i,onPointerDownOutside:a,...s}=e,d=fo(yt,o),c=gn(o),{onClose:p}=d;return u.useEffect(()=>(document.addEventListener(Gn,p),()=>document.removeEventListener(Gn,p)),[p]),u.useEffect(()=>{if(d.trigger){const m=g=>{const h=g.target;h!=null&&h.contains(d.trigger)&&p()};return window.addEventListener("scroll",m,{capture:!0}),()=>window.removeEventListener("scroll",m,{capture:!0})}},[d.trigger,p]),l.jsx(uo,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:i,onPointerDownOutside:a,onFocusOutside:m=>m.preventDefault(),onDismiss:p,children:l.jsxs(Fd,{"data-state":d.stateAttribute,...c,...s,ref:t,style:{...s.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[l.jsx(zd,{children:n}),l.jsx(Ud,{scope:o,isInside:!0,children:l.jsx(Hl,{id:d.contentId,role:"tooltip",children:r||n})})]})})});Zi.displayName=yt;var ta="TooltipArrow",Kd=u.forwardRef((e,t)=>
53{const{__scopeTooltip:o,...n}=e,r=gn(o);return qd(ta,o).isInside?null:l.jsx(_d,{...r,...n,ref:t})});Kd.displayName=ta;function Gd(e,t){const o=Math.abs(t.top-e.y),n=Math.abs(t.bottom-e.y),r=Math.abs(t.right-e.x),i=Math.abs(t.left-e.x);switch(Math.min(o,n,r,i)){case i:return"left";case r:return"right";case o:return"top";case n:return"bottom";default:throw new Error("unreachable")}}function Yd(e,t,o=5){const n=[];switch(t){case"top":n.push({x:e.x-o,y:e.y+o},{x:e.x+o,y:e.y+o});break;case"bottom":n.push({x:e.x-o,y:e.y-o},{x:e.x+o,y:e.y-o});break;case"left":n.push({x:e.x+o,y:e.y-o},{x:e.x+o,y:e.y+o});break;case"right":n.push({x:e.x-o,y:e.y-o},{x:e.x-o,y:e.y+o});break}return n}function Qd(e){const{top:t,right:o,bottom:n,left:r}=e;return[{x:r,y:t},{x:o,y:t},{x:o,y:n},{x:r,y:n}]}function Xd(e,t){const{x:o,y:n}=e;let r=!1;for(let i=0,a=t.length-1;i<t.length;a=i++){const s=t[i],d=t[a],c=s.x,p=s.y,m=d.x,g=d.y;p>n!=g>n&&o<(m-c)*(n-p)/(g-p)+c&&(r=!r)}return r}function Jd(e){const t=e.slice();return t.sort((o,n)=>o.x<n.x?-1:o.x>n.x?1:o.y<n.y?-1:o.y>n.y?1:0),Zd(t)}function Zd(e){if(e.length<=1)return e.slice();const t=[];for(let n=0;n<e.length;n++){const r=e[n];for(;t.length>=2;){const i=t[t.length-1],a=t[t.length-2];if((i.x-a.x)*(r.y-a.y)>=(i.y-a.y)*(r.x-a.x))t.pop();else break}t.push(r)}t.pop();const o=[];for(let n=e.length-1;n>=0;n--){const r=e[n];for(;o.length>=2;){const i=o[o.length-1],a=o[o.length-2];if((i.x-a.x)*(r.y-a.y)>=(i.y-a.y)*(r.x-a.x))o.pop();else break}o.push(r)}return o.pop(),t.length===1&&o.length===1&&t[0].x===o[0].x&&t[0].y===o[0].y?t:t.concat(o)}var eu=Xi,oa=Zi;const tu=eu,ou=u.forwardRef(({className:e,sideOffset:t=4,...o},n)=>l.jsx(oa,{ref:n,sideOffset:t,className:ce("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...o}));ou.displayName=oa.displayName;const nu=()=>{const{pathname:e}=Gr();return u.useEffect(()=>{window.scrollTo(0,0)},[e]),null},ru=["googlebot","googlebot-image","bingbot","duckduckbot","slurp","baiduspider","yandexbot","oai-searchbot","chatgpt-user","perplexitybot","perplexity-user","claude-searchbot","claude-user"],iu=["facebookexternalhit","twitterbot","linkedinbot","whatsapp"],au=["gptbot","ccbot","anthropic-ai","claudebot","claude-web","google-extended","bytespider","amazonbot","applebot-extended","cohere-ai","meta-externalagent","diffbot","ahrefsbot","semrushbot","dotbot","mj12bot","blexbot","dataforseobot","petalbot","scrapy","python-requests","curl","wget"],na=e=>(e||"").toLowerCase(),su=e=>{const t=na(e);return[...ru,...iu].some(o=>t.includes(o))},lu=e=>{const t=na(e);return!t||su(t)?!1:au.some(o=>t.includes(o))},ra=()=>{if(typeof navigator>"u")return{isBlocked:!1,userAgent:""};const e=navigator.userAgent||"";return{isBlocked:lu(e),userAgent:e}},cu=()=>(u.useEffect(()=>{console.log("%cPetWell HK - automated scraping, republication, or bulk extraction is prohibited.","color:#FF6B35;font-size:14px;font-weight:bold;"),ra().isBlocked&&console.warn("This crawler is not permitted to access PetWell public data APIs.")},[]),null),du="293361725081750",Yn="https://connect.facebook.net/en_US/fbevents.js",uu="meta-pixel-inline";let Ro=!1,Qn=!1,Io=!1;const At=new Set,pu="petwell.metaPixel.once.";function hu(){return du}function mu(){return typeof document<"u"&&!!document.getElementById(uu)}function fu(){var n;if(typeof window>"u"||Ro||typeof window.fbq=="function"){Ro=!0;return}const e=function(...r){e.callMethod?e.callMethod(...r):e.queue.push(r)};if(e.queue=[],e.loaded=!0,e.version="2.0",e.push=e,window.fbq=e,window._fbq||(window._fbq=e),Ro=!0,typeof document>"u"||document.querySelector(`script[src="${Yn}"]`))return;const t=document.createElement("script");t.async=!0,t.src=Yn;const o=document.getElementsByTagName("script")[0];(n=o==null?void 0:o.parentNode)==null||n.insertBefore(t,o)}function yn(e=hu()){var t;typeof window>"u"||(fu(),!Qn&&((t=window.fbq)==null||t.call(window,"init",e),Qn=!0))}function gu(){var e;if(yn(),mu()&&!Io){Io=!0;return}Io=!0,(e=window.fbq)==null||e.call(window,"track","PageView")}function yu(e,t,o){var r,i,a;yn();const n=t?vu(t):void 0;if(o!=null&&o.eventID){(r=window.fbq)==null||r.call(window,"track",e,n??{},{eventID:o.eventID});return}if(n){(i=window.fbq)==null||i.call(window,"track",e,n);return}(a=window.fbq)==null||a.call(window,"track",e)}function nw(e,t,o,n){if(!e||At.has(e))return!1;if(typeof sessionStorage<"u")try{const r=`${pu}${e}`;if(sessionStorage.getItem(r))return At.add(e),!1;At.add(e),sessionStorage.setItem(r,"1")}catch{At.add(e)}else At.add(e);return yu(t,o,n),!0}function vu(e){const t={};for(const[o,n]of Object.entries(e))n!==void 0&&(t[o]=n);return t}function wu(){const{pathname:e}=Gr();u.useEffect(()=>{yn(),gu()},[e])}const bu=qs();async function Pu(){try{return await vt(),!0}catch{return!1}}async function Le(e,t,o){try{const n=e.trim().replace(/\s+/g," "),r=/^\s*mutation\s+/i.test(n);let i=!1;if(r&&(o==null?void 0:o.authMode)!=="apiKey"&&(i=await Pu()),r&&!i&&(o==null?void 0:o.authMode)!=="apiKey")throw new Error("Authentication required for mutations. Please log in.");let a;o!=null&&o.authMode?a=o.authMode:r&&i?a="userPool":a="apiKey";
53const s=ra();if(a==="apiKey"&&s.isBlocked)throw new Error("Automated access is not allowed for this public API.");const d=await bu.graphql({query:e,variables:t||{},authMode:a});if(d&&"errors"in d&&d.errors&&d.errors.length>0){if((d.data?Object.values(d.data):[]).some(g=>g!=null))return console.warn("GraphQL query returned errors but has partial data:",{errorCount:d.errors.length,errors:d.errors.map(g=>({message:g.message,path:g.path}))}),d.data;const m=d.errors.map(g=>g.message||JSON.stringify(g)).join(", ");throw new Error(`GraphQL errors: ${m}`)}return d&&"data"in d?d.data||{}:d}catch(n){throw console.error("GraphQL query error:",n),xu(n)}}function xu(e){var o,n,r;let t="Unknown error";if((o=e==null?void 0:e.message)!=null&&o.includes("ERR_NAME_NOT_RESOLVED")||(n=e==null?void 0:e.message)!=null&&n.includes("Failed to fetch")||(r=e==null?void 0:e.message)!=null&&r.includes("network error"))t=`Network error: Cannot resolve AppSync endpoint. Please check:
541. Your internet connection
552. If the AppSync API exists in AWS Console
563. DNS settings or firewall blocking the connection
57Original error: ${(e==null?void 0:e.message)||"ERR_NAME_NOT_RESOLVED"}`;else if(e.errors&&Array.isArray(e.errors))t=e.errors.map(i=>i.message||JSON.stringify(i)).join(", ");else if(e.message)t=e.message;else if(typeof e=="string")t=e;else try{t=JSON.stringify(e)}catch{t=String(e)}return t.includes("GraphQL errors")?e:new Error(`GraphQL request failed: ${t}`)}const Su="https://api.petwellhk.com";function Tu(e){return String(e).trim().replace(/\/$/,"")}function Au(e){return/localhost|127\.0\.0\.1|10\.0\.2\.2/i.test(e)}function Eu(){const e=Tu("https://api.petwellhk.com");return e&&!Au(e)?e:Su}async function ku(){return Eu()}async function me(e,{method:t="GET",body:o,auth:n=!1}={}){var s,d;const r={Accept:"application/json"};if(o!==void 0&&(r["Content-Type"]="application/json"),n)try{const p=(d=(s=(await Yr()).tokens)==null?void 0:s.idToken)==null?void 0:d.toString();if(p)r.Authorization=`Bearer ${p}`;else if(n===!0)throw new Error("Authentication required. Please log in.")}catch(c){if(n===!0)throw c}const i=await fetch(`${await ku()}${e}`,{method:t,headers:r,body:o!==void 0?JSON.stringify(o):void 0}),a=await i.json().catch(()=>({}));if(!i.ok)throw new Error(a.error||`Forum API ${i.status}`);return a}async function Mt(e){var r,i;const t=new URLSearchParams;(r=e==null?void 0:e.postIds)!=null&&r.length&&t.set("postIds",e.postIds.slice(0,100).join(",")),(i=e==null?void 0:e.replyIds)!=null&&i.length&&t.set("replyIds",e.replyIds.slice(0,100).join(","));const o=t.toString(),n=await me(`/api/forum/me/votes${o?`?${o}`:""}`,{auth:!0});return{postVotes:n.postVotes||n.votes||{},replyVotes:n.replyVotes||{}}}const rw="ask-vet",iw="vet-queue",aw="my-vet",Xn="vet-team",ia="PetWell 獸醫/護士團隊",aa="PetWell Vet/Nurse Team";function Jn(e){var o,n;if(!e)return!1;if(e.isVetTeamReply||e.authorId===Xn||((o=e.author)==null?void 0:o.id)===Xn)return!0;const t=((n=e.author)==null?void 0:n.displayName)||"";return t===ia||t===aa||t==="PetWell 獸醫團隊"||t==="PetWell Vet Team"}function Cu(e){return e!=null&&e.startsWith("zh")?ia:aa}function sw(e,t){const o=t==null?void 0:t.startsWith("zh");switch(e){case"PENDING":return o?"等候獸醫/護士團隊":"Waiting for the vet/nurse team";case"ANSWERED":return o?"獸醫/護士團隊已回覆":"Vet/nurse team replied";case"FOLLOW_UP":return o?"跟進中":"Follow-up";default:return o?"問獸醫/護士":"Ask a vet/nurse"}}function se(e){const t=Object.prototype.toString.call(e);return e instanceof Date||typeof e=="object"&&t==="[object Date]"?new e.constructor(+e):typeof e=="number"||t==="[object Number]"||typeof e=="string"||t==="[object String]"?new Date(e):new Date(NaN)}function Nu(e,t){return e instanceof Date?new e.constructor(t):new Date(t)}const lw=6048e5,cw=864e5,qt=43200,Zn=1440;let Ru={};function Iu(){return Ru}function er(e){const t=se(e),o=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return o.setUTCFullYear(t.getFullYear()),+e-+o}function Zt(e,t){const o=se(e),n=se(t),r=o.getTime()-n.getTime();return r<0?-1:r>0?1:r}function Du(e){return Nu(e,Date.now())}function Wu(e,t){const o=se(e),n=se(t),r=o.getFullYear()-n.getFullYear(),i=o.getMonth()-n.getMonth();return r*12+i}function Lu(e){return t=>{const n=(e?Math[e]:Math.trunc)(t);return n===0?0:n}}function Ou(e,t){return+se(e)-+se(t)}function Fu(e){const t=se(e);return t.setHours(23,59,59,999),t}function _u(e){const t=se(e),o=t.getMonth();return t.setFullYear(t.getFullYear(),o+1,0),t.setHours(23,59,59,999),t}function Mu(e){const t=se(e);return+Fu(t)==+_u(t)}function ju(e,t){const o=se(e),n=se(t),r=Zt(o,n),i=Math.abs(Wu(o,n));let a;if(i<1)a=0;else{o.getMonth()===1&&o.getDate()>27&&o.setDate(30),o.setMonth(o.getMonth()-r*i);let s=Zt(o,n)===-r;Mu(se(e))&&i===1&&Zt(e,n)===1&&(s=!1),a=r*(i-Number(s))}return a===0?0:a}function Hu(e,t,o){const n=Ou(e,t)/1e3;
vendor: 7,425 bytes, line 57
57return Lu(o==null?void 0:o.roundingMethod)(n)}const $u={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},Bu=(e,t,o)=>{let n;const r=$u[e];return typeof r=="string"?n=r:t===1?n=r.one:n=r.other.replace("{{count}}",t.toString()),o!=null&&o.addSuffix?o.comparison&&o.comparison>0?"in "+n:n+" ago":n};function ft(e){return(t={})=>{const o=t.width?String(t.width):e.defaultWidth;return e.formats[o]||e.formats[e.defaultWidth]}}const Vu={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},Uu={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},qu={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},zu={date:ft({formats:Vu,defaultWidth:"full"}),time:ft({formats:Uu,defaultWidth:"full"}),dateTime:ft({formats:qu,defaultWidth:"full"})},Ku={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Gu=(e,t,o,n)=>Ku[e];function Re(e){return(t,o)=>{const n=o!=null&&o.context?String(o.context):"standalone";let r;if(n==="formatting"&&e.formattingValues){const a=e.defaultFormattingWidth||e.defaultWidth,s=o!=null&&o.width?String(o.width):a;r=e.formattingValues[s]||e.formattingValues[a]}else{const a=e.defaultWidth,s=o!=null&&o.width?String(o.width):e.defaultWidth;r=e.values[s]||e.values[a]}const i=e.argumentCallback?e.argumentCallback(t):t;return r[i]}}const Yu={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},Qu={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},Xu={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},Ju={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},Zu={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},ep={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},tp=(e,t)=>{const o=Number(e),n=o%100;if(n>20||n<10)switch(n%10){case 1:return o+"st";case 2:return o+"nd";case 3:return o+"rd"}return o+"th"},op={ordinalNumber:tp,era:Re({values:Yu,defaultWidth:"wide"}),quarter:Re({values:Qu,defaultWidth:"wide",argumentCallback:e=>e-1}),month:Re({values:Xu,defaultWidth:"wide"}),day:Re({values:Ju,defaultWidth:"wide"}),dayPeriod:Re({values:Zu,defaultWidth:"wide",formattingValues:ep,defaultFormattingWidth:"wide"})};function Ie(e){return(t,o={})=>{const n=o.width,r=n&&e.matchPatterns[n]||e.matchPatterns[e.defaultMatchWidth],i=t.match(r);if(!i)return null;const a=i[0],s=n&&e.parsePatterns[n]||e.parsePatterns[e.defaultParseWidth],d=Array.isArray(s)?rp(s,m=>m.test(a)):np(s,m=>m.test(a));let c;c=e.valueCallback?e.valueCallback(d):d,c=o.valueCallback?o.valueCallback(c):c;const p=t.slice(a.length);return{value:c,rest:p}}}function np(e,t){for(const o in e)if(Object.prototype.hasOwnProperty.call(e,o)&&t(e[o]))return o}function rp(e,t){for(let o=0;o<e.length;o++)if(t(e[o]))return o}function sa(e){return(t,o={})=>{const n=t.match(e.matchPattern);if(!n)return null;const r=n[0],i=t.match(e.parsePattern);if(!i)return null;let a=e.valueCallback?e.valueCallback(i[0]):i[0];a=o.valueCallback?o.valueCallback(a):a;const s=t.slice(r.length);return{value:a,rest:s}}}const ip=/^(\d+)(th|st|nd|rd)?/i,ap=/\d+/i,sp={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},lp={any:[/^b/i,/^(a|c)/i]},cp={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},dp={any:[/1/i,/2/i,/3/i,/4/i]},up={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},pp={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},hp={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},mp={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},fp={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},gp={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},yp={ordinalNumber:sa({matchPattern:ip,parsePattern:ap,valueCallback:e=>parseInt(e,10)}),era:Ie({matchPatterns:sp,defaultMatchWidth:"wide",parsePatterns:lp,defaultParseWidth:"any"}),quarter:Ie({matchPatterns:cp,defaultMatchWidth:"wide",parsePatterns:dp,defaultParseWidth:"any",valueCallback:e=>e+1}),month:Ie({matchPatterns:up,defaultMatchWidth:"wide",parsePatterns:pp,defaultParseWidth:"any"}),day:Ie({matchPatterns:hp,defaultMatchWidth:"wide",parsePatterns:mp,defaultParseWidth:"any"}),dayPeriod:Ie({matchPatterns:fp,defaultMatchWidth:"any",parsePatterns:gp,defaultParseWidth:"any"})},Qo={code:"en-US",formatDistance:Bu,formatLong:zu,formatRelative:Gu,localize:op,match:yp,options:{weekStartsOn:0,firstWeekContainsDate:1}};function vp(e,t,o){const n=Iu(),r=(o==null?void 0:o.locale)??n.locale??Qo,i=2520,a=Zt(e,t);if(isNaN(a))throw new RangeError("Invalid time value");const s=Object.assign({},o,{addSuffix:o==null?void 0:o.addSuffix,comparison:a});let d,c;a>0?(d=se(t),c=se(e)):(d=se(e),c=se(t));
57const p=Hu(c,d),m=(er(c)-er(d))/1e3,g=Math.round((p-m)/60);let h;if(g<2)return o!=null&&o.includeSeconds?p<5?r.formatDistance("lessThanXSeconds",5,s):p<10?r.formatDistance("lessThanXSeconds",10,s):p<20?r.formatDistance("lessThanXSeconds",20,s):p<40?r.formatDistance("halfAMinute",0,s):p<60?r.formatDistance("lessThanXMinutes",1,s):r.formatDistance("xMinutes",1,s):g===0?r.formatDistance("lessThanXMinutes",1,s):r.formatDistance("xMinutes",g,s);if(g<45)return r.formatDistance("xMinutes",g,s);if(g<90)return r.formatDistance("aboutXHours",1,s);if(g<Zn){const y=Math.round(g/60);return r.formatDistance("aboutXHours",y,s)}else{if(g<i)return r.formatDistance("xDays",1,s);if(g<qt){const y=Math.round(g/Zn);return r.formatDistance("xDays",y,s)}else if(g<qt*2)return h=Math.round(g/qt),r.formatDistance("aboutXMonths",h,s)}if(h=ju(c,d),h<12){const y=Math.round(g/qt);return r.formatDistance("xMonths",y,s)}else{const y=h%12,f=Math.trunc(h/12);return y<3?r.formatDistance("aboutXYears",f,s):y<9?r.formatDistance("overXYears",f,s):r.formatDistance("almostXYears",f+1,s)}}function tr(e,t){return vp(e,Du(e),t)}const wp={lessThanXSeconds:{one:"少於 1 秒",other:"少於 {{count}} 秒"},xSeconds:{one:"1 秒",other:"{{count}} 秒"},halfAMinute:"半分鐘",lessThanXMinutes:{one:"少於 1 分鐘",other:"少於 {{count}} 分鐘"},xMinutes:{one:"1 分鐘",other:"{{count}} 分鐘"},xHours:{one:"1 小時",other:"{{count}} 小時"},aboutXHours:{one:"大約 1 小時",other:"大約 {{count}} 小時"},xDays:{one:"1 天",other:"{{count}} 天"},aboutXWeeks:{one:"大約 1 個星期",other:"大約 {{count}} 個星期"},xWeeks:{one:"1 個星期",other:"{{count}} 個星期"},aboutXMonths:{one:"大約 1 個月",other:"大約 {{count}} 個月"},xMonths:{one:"1 個月",other:"{{count}} 個月"},aboutXYears:{one:"大約 1 年",other:"大約 {{count}} 年"},xYears:{one:"1 年",other:"{{count}} 年"},overXYears:{one:"超過 1 年",other:"超過 {{count}} 年"},almostXYears:{one:"將近 1 年",other:"將近 {{count}} 年"}},bp=(e,t,o)=>{let n;const r=wp[e];return typeof r=="string"?n=r:t===1?n=r.one:n=r.other.replace("{{count}}",String(t)),o!=null&&o.addSuffix?o.comparison&&o.comparison>0?n+"內":n+"前":n},Pp={full:"y'年'M'月'd'日' EEEE",long:"y'年'M'月'd'日'",medium:"yyyy-MM-dd",short:"yy-MM-dd"},xp={full:"zzzz a h:mm:ss",long:"z a h:mm:ss",medium:"a h:mm:ss",short:"a h:mm"},Sp={full:"{{date}} {{time}}",long:"{{date}} {{time}}",medium:"{{date}} {{time}}",short:"{{date}} {{time}}"},Tp={date:ft({formats:Pp,defaultWidth:"full"}),time:ft({formats:xp,defaultWidth:"full"}),dateTime:ft({formats:Sp,defaultWidth:"full"})},Ap={lastWeek:"'上個'eeee p",yesterday:"'昨天' p",today:"'今天' p",tomorrow:"'明天' p",nextWeek:"'下個'eeee p",other:"P"},Ep=(e,t,o,n)=>Ap[e],kp={narrow:["前","公元"],abbreviated:["前","公元"],wide:["公元前","公元"]},Cp={narrow:["1","2","3","4"],abbreviated:["第一刻","第二刻","第三刻","第四刻"],wide:["第一刻鐘","第二刻鐘","第三刻鐘","第四刻鐘"]},Np={narrow:["一","二","三","四","五","六","七","八","九","十","十一","十二"],abbreviated:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],wide:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},Rp={narrow:["日","一","二","三","四","五","六"],short:["日","一","二","三","四","五","六"],abbreviated:["週日","週一","週二","週三","週四","週五","週六"],wide:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]},Ip={narrow:{am:"上",pm:"下",midnight:"凌晨",noon:"午",morning:"早",afternoon:"下午",evening:"晚",night:"夜"},abbreviated:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜間"},wide:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜間"}},Dp={narrow:{am:"上",pm:"下",midnight:"凌晨",noon:"午",morning:"早",afternoon:"下午",evening:"晚",night:"夜"},abbreviated:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜間"},wide:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜間"}},Wp=(e,t)=>{const o=Number(e);switch(t==null?void 0:t.unit){case"date":return o+"日";case"hour":return o+"時";case"minute":return o+"分";case"second":return o+"秒";default:return"第 "+o}},Lp={ordinalNumber:Wp,era:Re({values:kp,defaultWidth:"wide"}),quarter:Re({values:Cp,defaultWidth:"wide",argumentCallback:e=>e-1}),month:Re({values:Np,defaultWidth:"wide"}),day:Re({values:Rp,defaultWidth:"wide"}),dayPeriod:Re({values:Ip,defaultWidth:"wide",formattingValues:Dp,defaultFormattingWidth:"wide"})}
vendor: 8,079 bytes, line 57
57,Op=/^(第\s*)?\d+(日|時|分|秒)?/i,Fp=/\d+/i,_p={narrow:/^(前)/i,abbreviated:/^(前)/i,wide:/^(公元前|公元)/i},Mp={any:[/^(前)/i,/^(公元)/i]},jp={narrow:/^[1234]/i,abbreviated:/^第[一二三四]刻/i,wide:/^第[一二三四]刻鐘/i},Hp={any:[/(1|一)/i,/(2|二)/i,/(3|三)/i,/(4|四)/i]},$p={narrow:/^(一|二|三|四|五|六|七|八|九|十[二一])/i,abbreviated:/^(一|二|三|四|五|六|七|八|九|十[二一]|\d|1[12])月/i,wide:/^(一|二|三|四|五|六|七|八|九|十[二一])月/i},Bp={narrow:[/^一/i,/^二/i,/^三/i,/^四/i,/^五/i,/^六/i,/^七/i,/^八/i,/^九/i,/^十(?!(一|二))/i,/^十一/i,/^十二/i],any:[/^一|1/i,/^二|2/i,/^三|3/i,/^四|4/i,/^五|5/i,/^六|6/i,/^七|7/i,/^八|8/i,/^九|9/i,/^十(?!(一|二))|10/i,/^十一|11/i,/^十二|12/i]},Vp={narrow:/^[一二三四五六日]/i,short:/^[一二三四五六日]/i,abbreviated:/^週[一二三四五六日]/i,wide:/^星期[一二三四五六日]/i},Up={any:[/日/i,/一/i,/二/i,/三/i,/四/i,/五/i,/六/i]},qp={any:/^(上午?|下午?|午夜|[中正]午|早上?|下午|晚上?|凌晨)/i},zp={any:{am:/^上午?/i,pm:/^下午?/i,midnight:/^午夜/i,noon:/^[中正]午/i,morning:/^早上/i,afternoon:/^下午/i,evening:/^晚上?/i,night:/^凌晨/i}},Kp={ordinalNumber:sa({matchPattern:Op,parsePattern:Fp,valueCallback:e=>parseInt(e,10)}),era:Ie({matchPatterns:_p,defaultMatchWidth:"wide",parsePatterns:Mp,defaultParseWidth:"any"}),quarter:Ie({matchPatterns:jp,defaultMatchWidth:"wide",parsePatterns:Hp,defaultParseWidth:"any",valueCallback:e=>e+1}),month:Ie({matchPatterns:$p,defaultMatchWidth:"wide",parsePatterns:Bp,defaultParseWidth:"any"}),day:Ie({matchPatterns:Vp,defaultMatchWidth:"wide",parsePatterns:Up,defaultParseWidth:"any"}),dayPeriod:Ie({matchPatterns:qp,defaultMatchWidth:"any",parsePatterns:zp,defaultParseWidth:"any"})},or={code:"zh-TW",formatDistance:bp,formatLong:Tp,formatRelative:Ep,localize:Lp,match:Kp,options:{weekStartsOn:1,firstWeekContainsDate:4}},M=e=>typeof e=="string",Et=()=>{let e,t;const o=new Promise((n,r)=>{e=n,t=r});return o.resolve=e,o.reject=t,o},nr=e=>e==null?"":""+e,Gp=(e,t,o)=>{e.forEach(n=>{t[n]&&(o[n]=t[n])})},Yp=/###/g,rr=e=>e&&e.indexOf("###")>-1?e.replace(Yp,"."):e,ir=e=>!e||M(e),Rt=(e,t,o)=>{const n=M(t)?t.split("."):t;let r=0;for(;r<n.length-1;){if(ir(e))return{};const i=rr(n[r]);!e[i]&&o&&(e[i]=new o),Object.prototype.hasOwnProperty.call(e,i)?e=e[i]:e={},++r}return ir(e)?{}:{obj:e,k:rr(n[r])}},ar=(e,t,o)=>{const{obj:n,k:r}=Rt(e,t,Object);if(n!==void 0||t.length===1){n[r]=o;return}let i=t[t.length-1],a=t.slice(0,t.length-1),s=Rt(e,a,Object);for(;s.obj===void 0&&a.length;)i=`${a[a.length-1]}.${i}`,a=a.slice(0,a.length-1),s=Rt(e,a,Object),s!=null&&s.obj&&typeof s.obj[`${s.k}.${i}`]<"u"&&(s.obj=void 0);s.obj[`${s.k}.${i}`]=o},Qp=(e,t,o,n)=>{const{obj:r,k:i}=Rt(e,t,Object);r[i]=r[i]||[],r[i].push(o)},ro=(e,t)=>{const{obj:o,k:n}=Rt(e,t);if(o&&Object.prototype.hasOwnProperty.call(o,n))return o[n]},Xp=(e,t,o)=>{const n=ro(e,o);return n!==void 0?n:ro(t,o)},la=(e,t,o)=>{for(const n in t)n!=="__proto__"&&n!=="constructor"&&(n in e?M(e[n])||e[n]instanceof String||M(t[n])||t[n]instanceof String?o&&(e[n]=t[n]):la(e[n],t[n],o):e[n]=t[n]);return e},st=e=>e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var Jp={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"};const Zp=e=>M(e)?e.replace(/[&<>"'\/]/g,t=>Jp[t]):e;class eh{constructor(t){this.capacity=t,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(t){const o=this.regExpMap.get(t);if(o!==void 0)return o;const n=new RegExp(t);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(t,n),this.regExpQueue.push(t),n}}const th=[" ",",","?","!",";"],oh=new eh(20),nh=(e,t,o)=>{t=t||"",o=o||"";const n=th.filter(a=>t.indexOf(a)<0&&o.indexOf(a)<0);if(n.length===0)return!0;const r=oh.getRegExp(`(${n.map(a=>a==="?"?"\\?":a).join("|")})`);let i=!r.test(e);if(!i){const a=e.indexOf(o);a>0&&!r.test(e.substring(0,a))&&(i=!0)}return i},Xo=(e,t,o=".")=>{if(!e)return;if(e[t])return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;const n=t.split(o);let r=e;for(let i=0;i<n.length;){if(!r||typeof r!="object")return;let a,s="";for(let d=i;d<n.length;++d)if(d!==i&&(s+=o),s+=n[d],a=r[s],a!==void 0){if(["string","number","boolean"].indexOf(typeof a)>-1&&d<n.length-1)continue;i+=d-i+1;break}r=a}return r},Dt=e=>e==null?void 0:e.replace("_","-"),rh={type:"logger",log(e){this.output("log",e)},warn(e){this.output("warn",e)},error(e){this.output("error",e)},output(e,t){var o,n;(n=(o=console==null?void 0:console[e])==null?void 0:o.apply)==null||n.call(o,console,t)}};class io{constructor(t,o={}){this.init(t,o)}init(t,o={}){this.prefix=o.prefix||"i18next:",this.logger=t||rh,this.options=o,this.debug=o.debug}log(...t){return this.forward(t,"log","",!0)}warn(...t){return this.forward(t,"warn","",!0)}error(...t){return this.forward(t,"error","")}deprecate(...t){return this.forward(t,"warn","WARNING DEPRECATED: ",!0)}forward(t,o,n,r){return r&&!this.debug?null:(M(t[0])&&(t[0]=`${n}${this.prefix} ${t[0]}`),this.logger[o](t))}create(t){return new io(this.logger,{prefix:`${this.prefix}:${t}:`,...this.options})}clone(t){return t=t||this.options,t.prefix=t.prefix||this.prefix,new io(this.logger,t)}}var De=new io;class go{constructor(){this.observers={}}on(t,o){return t.split(" ").forEach(n=>{this.observers[n]||(this.observers[n]=new Map);const r=this.observers[n].get(o)||0;this.observers[n].set(o,r+1)}),this}off(t,o){if(this.observers[t]){if(!o){delete this.observers[t];return}this.observers[t].delete(o)}}emit(t,...o){this.observers[t]&&Array.from(this.observers[t].entries()).forEach(([r,i])=>{for(let a=0;a<i;a++)r(...o)}),this.observers["*"]&&Array.from(this.observers["*"].entries()).forEach(([r,i])=>{for(let a=0;a<i;a++)r.apply(r,[t,...o])})}}class sr extends go{constructor(t,o={ns:["translation"],defaultNS:"translation"}){super(),this.data=t||{},this.options=o,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}removeNamespaces(t){const o=this.options.ns.indexOf(t);o>-1&&this.options.ns.splice(o,1)}getResource(t,o,n,r={}){var c,p;const i=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator,a=r.ignoreJSONStructure!==void 0?r.ignoreJSONStructure:this.options.ignoreJSONStructure;let s;t.indexOf(".")>-1?s=t.split("."):(s=[t,o],n&&(Array.isArray(n)?s.push(...n):M(n)&&i?s.push(...n.split(i)):s.push(n)));const d=ro(this.data,s);return!d&&!o&&!n&&t.indexOf(".")>-1&&(t=s[0],o=s[1],n=s.slice(2).join(".")),d||!a||!M(n)?d:Xo((p=(c=this.data)==null?void 0:c[t])==null?void 0:p[o],n,i)}addResource(t,o,n,r,i={silent:!1}){const a=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator;let s=[t,o];n&&(s=s.concat(a?n.split(a):n)),t.indexOf(".")>-1&&(s=t.split("."),r=o,o=s[1]),this.addNamespaces(o),ar(this.data,s,r),i.silent||this.emit("added",t,o,n,r)}addResources(t,o,n,r={silent:!1}){for(const i in n)(M(n[i])||Array.isArray(n[i]))&&this.addResource(t,o,i,n[i],{silent:!0});r.silent||this.emit("added",t,o,n)}addResourceBundle(t,o,n,r,i,a={silent:!1,skipCopy:!1}){let s=[t,o];t.indexOf(".")>-1&&(s=t.split("."),r=n,n=o,o=s[1]),this.addNamespaces(o);let d=ro(this.data,s)||{};a.skipCopy||(n=JSON.parse(JSON.stringify(n))),r?la(d,n,i):d={...d,...n},ar(this.data,s,d),a.silent||this.emit("added",t,o,n)}removeResourceBundle(t,o){this.hasResourceBundle(t,o)&&delete this.data[t][o],this.removeNamespaces(o),this.emit("removed",t,o)}hasResourceBundle(t,o){return this.getResource(t,o)!==void 0}getResourceBundle(t,o){return o||(o=this.options.defaultNS),this.getResource(t,o)}getDataByLanguage(t){return this.data[t]}hasLanguageSomeTranslations(t){const o=this.getDataByLanguage(t);return!!(o&&Object.keys(o)||[]).find(r=>o[r]&&Object.keys(o[r]).length>0)}toJSON(){return this.data}}var ca={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,o,n,r){return e.forEach(i=>
vendor: 4,334 bytes, line 57
57{var a;t=((a=this.processors[i])==null?void 0:a.process(t,o,n,r))??t}),t}};const da=Symbol("i18next/PATH_KEY");function ih(){const e=[],t=Object.create(null);let o;return t.get=(n,r)=>{var i;return(i=o==null?void 0:o.revoke)==null||i.call(o),r===da?e:(e.push(r),o=Proxy.revocable(n,t),o.proxy)},Proxy.revocable(Object.create(null),t).proxy}function Jo(e,t){const{[da]:o}=e(ih());return o.join((t==null?void 0:t.keySeparator)??".")}const lr={},cr=e=>!M(e)&&typeof e!="boolean"&&typeof e!="number";class ao extends go{constructor(t,o={}){super(),Gp(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],t,this),this.options=o,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=De.create("translator")}changeLanguage(t){t&&(this.language=t)}exists(t,o={interpolation:{}}){const n={...o};if(t==null)return!1;const r=this.resolve(t,n);return(r==null?void 0:r.res)!==void 0}extractFromKey(t,o){let n=o.nsSeparator!==void 0?o.nsSeparator:this.options.nsSeparator;n===void 0&&(n=":");const r=o.keySeparator!==void 0?o.keySeparator:this.options.keySeparator;let i=o.ns||this.options.defaultNS||[];const a=n&&t.indexOf(n)>-1,s=!this.options.userDefinedKeySeparator&&!o.keySeparator&&!this.options.userDefinedNsSeparator&&!o.nsSeparator&&!nh(t,n,r);if(a&&!s){const d=t.match(this.interpolator.nestingRegexp);if(d&&d.length>0)return{key:t,namespaces:M(i)?[i]:i};const c=t.split(n);(n!==r||n===r&&this.options.ns.indexOf(c[0])>-1)&&(i=c.shift()),t=c.join(r)}return{key:t,namespaces:M(i)?[i]:i}}translate(t,o,n){let r=typeof o=="object"?{...o}:o;if(typeof r!="object"&&this.options.overloadTranslationOptionHandler&&(r=this.options.overloadTranslationOptionHandler(arguments)),typeof r=="object"&&(r={...r}),r||(r={}),t==null)return"";typeof t=="function"&&(t=Jo(t,{...this.options,...r})),Array.isArray(t)||(t=[String(t)]);const i=r.returnDetails!==void 0?r.returnDetails:this.options.returnDetails,a=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator,{key:s,namespaces:d}=this.extractFromKey(t[t.length-1],r),c=d[d.length-1];let p=r.nsSeparator!==void 0?r.nsSeparator:this.options.nsSeparator;p===void 0&&(p=":");const m=r.lng||this.language,g=r.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if((m==null?void 0:m.toLowerCase())==="cimode")return g?i?{res:`${c}${p}${s}`,usedKey:s,exactUsedKey:s,usedLng:m,usedNS:c,usedParams:this.getUsedParamsDetails(r)}:`${c}${p}${s}`:i?{res:s,usedKey:s,exactUsedKey:s,usedLng:m,usedNS:c,usedParams:this.getUsedParamsDetails(r)}:s;const h=this.resolve(t,r);let y=h==null?void 0:h.res;const f=(h==null?void 0:h.usedKey)||s,v=(h==null?void 0:h.exactUsedKey)||s,w=["[object Number]","[object Function]","[object RegExp]"],x=r.joinArrays!==void 0?r.joinArrays:this.options.joinArrays,b=!this.i18nFormat||this.i18nFormat.handleAsObject,T=r.count!==void 0&&!M(r.count),k=ao.hasDefaultValue(r),S=T?this.pluralResolver.getSuffix(m,r.count,r):"",C=r.ordinal&&T?this.pluralResolver.getSuffix(m,r.count,{ordinal:!1}):"",L=T&&!r.ordinal&&r.count===0,O=L&&r[`defaultValue${this.options.pluralSeparator}zero`]||r[`defaultValue${S}`]||r[`defaultValue${C}`]||r.defaultValue;let F=y;b&&!y&&k&&(F=O);const q=cr(F),W=Object.prototype.toString.apply(F);if(b&&F&&q&&w.indexOf(W)<0&&!(M(x)&&Array.isArray(F))){if(!r.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const z=this.options.returnedObjectHandler?this.options.returnedObjectHandler(f,F,{...r,ns:d}):`key '${s} (${this.language})' returned an object instead of string.`;return i?(h.res=z,h.usedParams=this.getUsedParamsDetails(r),h):z}if(a){const z=Array.isArray(F),N=z?[]:{},Q=z?v:f;for(const V in F)if(Object.prototype.hasOwnProperty.call(F,V)){const U=`${Q}${a}${V}`;k&&!y?N[V]=this.translate(U,{...r,defaultValue:cr(O)?O[V]:void 0,joinArrays:!1,ns:d}):N[V]=this.translate(U,{...r,joinArrays:!1,ns:d}),N[V]===U&&(N[V]=F[V])}y=N}}else if(b&&M(x)&&Array.isArray(y))y=y.join(x),y&&(y=this.extendTranslation(y,t,r,n));else{let z=!1,N=!1;!this.isValidLookup(y)&&k&&(z=!0,y=O),this.isValidLookup(y)||(N=!0,y=s);const V=(r.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&N?void 0:y,U=k&&O!==y&&this.options.updateMissing;
vendor: 33,766 bytes, line 57
57if(N||z||U){if(this.logger.log(U?"updateKey":"missingKey",m,c,s,U?O:y),a){const j=this.resolve(s,{...r,keySeparator:!1});j&&j.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let Y=[];const I=this.languageUtils.getFallbackCodes(this.options.fallbackLng,r.lng||this.language);if(this.options.saveMissingTo==="fallback"&&I&&I[0])for(let j=0;j<I.length;j++)Y.push(I[j]);else this.options.saveMissingTo==="all"?Y=this.languageUtils.toResolveHierarchy(r.lng||this.language):Y.push(r.lng||this.language);const J=(j,_,D)=>{var re;const K=k&&D!==y?D:V;this.options.missingKeyHandler?this.options.missingKeyHandler(j,c,_,K,U,r):(re=this.backendConnector)!=null&&re.saveMissing&&this.backendConnector.saveMissing(j,c,_,K,U,r),this.emit("missingKey",j,c,_,y)};this.options.saveMissing&&(this.options.saveMissingPlurals&&T?Y.forEach(j=>{const _=this.pluralResolver.getSuffixes(j,r);L&&r[`defaultValue${this.options.pluralSeparator}zero`]&&_.indexOf(`${this.options.pluralSeparator}zero`)<0&&_.push(`${this.options.pluralSeparator}zero`),_.forEach(D=>{J([j],s+D,r[`defaultValue${D}`]||O)})}):J(Y,s,O))}y=this.extendTranslation(y,t,r,h,n),N&&y===s&&this.options.appendNamespaceToMissingKey&&(y=`${c}${p}${s}`),(N||z)&&this.options.parseMissingKeyHandler&&(y=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${c}${p}${s}`:s,z?y:void 0,r))}return i?(h.res=y,h.usedParams=this.getUsedParamsDetails(r),h):y}extendTranslation(t,o,n,r,i){var d,c;if((d=this.i18nFormat)!=null&&d.parse)t=this.i18nFormat.parse(t,{...this.options.interpolation.defaultVariables,...n},n.lng||this.language||r.usedLng,r.usedNS,r.usedKey,{resolved:r});else if(!n.skipInterpolation){n.interpolation&&this.interpolator.init({...n,interpolation:{...this.options.interpolation,...n.interpolation}});const p=M(t)&&(((c=n==null?void 0:n.interpolation)==null?void 0:c.skipOnVariables)!==void 0?n.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let m;if(p){const h=t.match(this.interpolator.nestingRegexp);m=h&&h.length}let g=n.replace&&!M(n.replace)?n.replace:n;if(this.options.interpolation.defaultVariables&&(g={...this.options.interpolation.defaultVariables,...g}),t=this.interpolator.interpolate(t,g,n.lng||this.language||r.usedLng,n),p){const h=t.match(this.interpolator.nestingRegexp),y=h&&h.length;m<y&&(n.nest=!1)}!n.lng&&r&&r.res&&(n.lng=this.language||r.usedLng),n.nest!==!1&&(t=this.interpolator.nest(t,(...h)=>(i==null?void 0:i[0])===h[0]&&!n.context?(this.logger.warn(`It seems you are nesting recursively key: ${h[0]} in key: ${o[0]}`),null):this.translate(...h,o),n)),n.interpolation&&this.interpolator.reset()}const a=n.postProcess||this.options.postProcess,s=M(a)?[a]:a;return t!=null&&(s!=null&&s.length)&&n.applyPostProcessor!==!1&&(t=ca.handle(s,t,o,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...r,usedParams:this.getUsedParamsDetails(n)},...n}:n,this)),t}resolve(t,o={}){let n,r,i,a,s;return M(t)&&(t=[t]),t.forEach(d=>{if(this.isValidLookup(n))return;const c=this.extractFromKey(d,o),p=c.key;r=p;let m=c.namespaces;this.options.fallbackNS&&(m=m.concat(this.options.fallbackNS));const g=o.count!==void 0&&!M(o.count),h=g&&!o.ordinal&&o.count===0,y=o.context!==void 0&&(M(o.context)||typeof o.context=="number")&&o.context!=="",f=o.lngs?o.lngs:this.languageUtils.toResolveHierarchy(o.lng||this.language,o.fallbackLng);m.forEach(v=>{var w,x;this.isValidLookup(n)||(s=v,!lr[`${f[0]}-${v}`]&&((w=this.utils)!=null&&w.hasLoadedNamespace)&&!((x=this.utils)!=null&&x.hasLoadedNamespace(s))&&(lr[`${f[0]}-${v}`]=!0,this.logger.warn(`key "${r}" for languages "${f.join(", ")}" won't get resolved as namespace "${s}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),f.forEach(b=>{var S;if(this.isValidLookup(n))return;a=b;const T=[p];if((S=this.i18nFormat)!=null&&S.addLookupKeys)this.i18nFormat.addLookupKeys(T,p,b,v,o);else{let C;g&&(C=this.pluralResolver.getSuffix(b,o.count,o));const L=`${this.options.pluralSeparator}zero`,O=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(g&&(o.ordinal&&C.indexOf(O)===0&&T.push(p+C.replace(O,this.options.pluralSeparator)),T.push(p+C),h&&T.push(p+L)),y){const F=`${p}${this.options.contextSeparator||"_"}${o.context}`;T.push(F),g&&(o.ordinal&&C.indexOf(O)===0&&T.push(F+C.replace(O,this.options.pluralSeparator)),T.push(F+C),h&&T.push(F+L))}}let k;for(;k=T.pop();)this.isValidLookup(n)||(i=k,n=this.getResource(b,v,k,o))}))})}),{res:n,usedKey:r,exactUsedKey:i,usedLng:a,usedNS:s}}isValidLookup(t){return t!==void 0&&!(!this.options.returnNull&&t===null)&&!(!this.options.returnEmptyString&&t==="")}getResource(t,o,n,r={}){var i;return(i=this.i18nFormat)!=null&&i.getResource?this.i18nFormat.getResource(t,o,n,r):this.resourceStore.getResource(t,o,n,r)}getUsedParamsDetails(t={}){const o=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],n=t.replace&&!M(t.replace);let r=n?t.replace:t;if(n&&typeof t.count<"u"&&(r.count=t.count),this.options.interpolation.defaultVariables&&(r={...this.options.interpolation.defaultVariables,...r}),!n){r={...r};for(const i of o)delete r[i]}return r}static hasDefaultValue(t){const o="defaultValue";for(const n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&o===n.substring(0,o.length)&&t[n]!==void 0)return!0;return!1}}class dr{constructor(t){this.options=t,this.supportedLngs=this.options.supportedLngs||!1,this.logger=De.create("languageUtils")}getScriptPartFromCode(t){if(t=Dt(t),!t||t.indexOf("-")<0)return null;const o=t.split("-");return o.length===2||(o.pop(),o[o.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(o.join("-"))}getLanguagePartFromCode(t){if(t=Dt(t),!t||t.indexOf("-")<0)return t;const o=t.split("-");return this.formatLanguageCode(o[0])}formatLanguageCode(t){if(M(t)&&t.indexOf("-")>-1){let o;try{o=Intl.getCanonicalLocales(t)[0]}catch{}return o&&this.options.lowerCaseLng&&(o=o.toLowerCase()),o||(this.options.lowerCaseLng?t.toLowerCase():t)}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}isSupportedCode(t){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}getBestMatchFromCodes(t){if(!t)return null;let o;return t.forEach(n=>{if(o)return;const r=this.formatLanguageCode(n);(!this.options.supportedLngs||this.isSupportedCode(r))&&(o=r)}),!o&&this.options.supportedLngs&&t.forEach(n=>{if(o)return;const r=this.getScriptPartFromCode(n);if(this.isSupportedCode(r))return o=r;const i=this.getLanguagePartFromCode(n);if(this.isSupportedCode(i))return o=i;o=this.options.supportedLngs.find(a=>{if(a===i)return a;if(!(a.indexOf("-")<0&&i.indexOf("-")<0)&&(a.indexOf("-")>0&&i.indexOf("-")<0&&a.substring(0,a.indexOf("-"))===i||a.indexOf(i)===0&&i.length>1))return a})}),o||(o=this.getFallbackCodes(this.options.fallbackLng)[0]),o}getFallbackCodes(t,o){if(!t)return[];if(typeof t=="function"&&(t=t(o)),M(t)&&(t=[t]),Array.isArray(t))return t;if(!o)return t.default||[];let n=t[o];return n||(n=t[this.getScriptPartFromCode(o)]),n||(n=t[this.formatLanguageCode(o)]),n||(n=t[this.getLanguagePartFromCode(o)]),n||(n=t.default),n||[]}toResolveHierarchy(t,o){const n=this.getFallbackCodes((o===!1?[]:o)||this.options.fallbackLng||[],t),r=[],i=a=>{a&&(this.isSupportedCode(a)?r.push(a):this.logger.warn(`rejecting language code not found in supportedLngs: ${a}`))};return M(t)&&(t.indexOf("-")>-1||t.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&i(this.formatLanguageCode(t)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&i(this.getScriptPartFromCode(t)),this.options.load!=="currentOnly"&&i(this.getLanguagePartFromCode(t))):M(t)&&i(this.formatLanguageCode(t)),n.forEach(a=>{r.indexOf(a)<0&&i(this.formatLanguageCode(a))}),r}}const ur={zero:0,one:1,two:2,few:3,many:4,other:5},pr={select:e=>e===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class ah{constructor(t,o={}){this.languageUtils=t,this.options=o,this.logger=De.create("pluralResolver"),this.pluralRulesCache={}}addRule(t,o){this.rules[t]=o}clearCache(){this.pluralRulesCache={}}getRule(t,o={}){const n=Dt(t==="dev"?"en":t),r=o.ordinal?"ordinal":"cardinal",i=JSON.stringify({cleanedCode:n,type:r});if(i in this.pluralRulesCache)return this.pluralRulesCache[i];let a;try{a=new Intl.PluralRules(n,{type:r})}catch{if(!Intl)return this.logger.error("No Intl support, please use an Intl polyfill!"),pr;if(!t.match(/-|_/))return pr;const d=this.languageUtils.getLanguagePartFromCode(t);a=this.getRule(d,o)}return this.pluralRulesCache[i]=a,a}needsPlural(t,o={}){let n=this.getRule(t,o);return n||(n=this.getRule("dev",o)),(n==null?void 0:n.resolvedOptions().pluralCategories.length)>1}getPluralFormsOfKey(t,o,n={}){return this.getSuffixes(t,n).map(r=>`${o}${r}`)}getSuffixes(t,o={}){let n=this.getRule(t,o);return n||(n=this.getRule("dev",o)),n?n.resolvedOptions().pluralCategories.sort((r,i)=>ur[r]-ur[i]).map(r=>`${this.options.prepend}${o.ordinal?`ordinal${this.options.prepend}`:""}${r}`):[]}getSuffix(t,o,n={}){const r=this.getRule(t,n);return r?`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:""}${r.select(o)}`:(this.logger.warn(`no plural rule found for: ${t}`),this.getSuffix("dev",o,n))}}const hr=(e,t,o,n=".",r=!0)=>{let i=Xp(e,t,o);return!i&&r&&M(o)&&(i=Xo(e,o,n),i===void 0&&(i=Xo(t,o,n))),i},Do=e=>e.replace(/\$/g,"$$$$");class sh{constructor(t={}){var o;this.logger=De.create("interpolator"),this.options=t,this.format=((o=t==null?void 0:t.interpolation)==null?void 0:o.format)||(n=>n),this.init(t)}init(t={}){t.interpolation||(t.interpolation={escapeValue:!0});const{escape:o,escapeValue:n,useRawValueToEscape:r,prefix:i,prefixEscaped:a,suffix:s,suffixEscaped:d,formatSeparator:c,unescapeSuffix:p,unescapePrefix:m,nestingPrefix:g,nestingPrefixEscaped:h,nestingSuffix:y,nestingSuffixEscaped:f,nestingOptionsSeparator:v,maxReplaces:w,alwaysFormat:x}=t.interpolation;this.escape=o!==void 0?o:Zp,this.escapeValue=n!==void 0?n:!0,this.useRawValueToEscape=r!==void 0?r:!1,this.prefix=i?st(i):a||"{{",this.suffix=s?st(s):d||"}}",this.formatSeparator=c||",",this.unescapePrefix=p?"":m||"-",this.unescapeSuffix=this.unescapePrefix?"":p||"",this.nestingPrefix=g?st(g):h||st("$t("),this.nestingSuffix=y?st(y):f||st(")"),this.nestingOptionsSeparator=v||",",this.maxReplaces=w||1e3,this.alwaysFormat=x!==void 0?x:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const t=(o,n)=>(o==null?void 0:o.source)===n?(o.lastIndex=0,o):new RegExp(n,"g");this.regexp=t(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=t(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=t(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(t,o,n,r){var h;let i,a,s;const d=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},c=y=>{if(y.indexOf(this.formatSeparator)<0){const x=hr(o,d,y,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(x,void 0,n,{...r,...o,interpolationkey:y}):x}const f=y.split(this.formatSeparator),v=f.shift().trim(),w=f.join(this.formatSeparator).trim();return this.format(hr(o,d,v,this.options.keySeparator,this.options.ignoreJSONStructure),w,n,{...r,...o,interpolationkey:v})};this.resetRegExp();const p=(r==null?void 0:r.missingInterpolationHandler)||this.options.missingInterpolationHandler,m=((h=r==null?void 0:r.interpolation)==null?void 0:h.skipOnVariables)!==void 0?r.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:y=>Do(y)},{regex:this.regexp,safeValue:y=>this.escapeValue?Do(this.escape(y)):Do(y)}].forEach(y=>{for(s=0;i=y.regex.exec(t);){const f=i[1].trim();if(a=c(f),a===void 0)if(typeof p=="function"){const w=p(t,i,r);a=M(w)?w:""}else if(r&&Object.prototype.hasOwnProperty.call(r,f))a="";else if(m){a=i[0];continue}else this.logger.warn(`missed to pass in variable ${f} for interpolating ${t}`),a="";else!M(a)&&!this.useRawValueToEscape&&(a=nr(a));const v=y.safeValue(a);if(t=t.replace(i[0],v),m?(y.regex.lastIndex+=a.length,y.regex.lastIndex-=i[0].length):y.regex.lastIndex=0,s++,s>=this.maxReplaces)break}}),t}nest(t,o,n={}){let r,i,a;const s=(d,c)=>{const p=this.nestingOptionsSeparator;if(d.indexOf(p)<0)return d;const m=d.split(new RegExp(`${p}[ ]*{`));let g=`{${m[1]}`;d=m[0],g=this.interpolate(g,a);const h=g.match(/'/g),y=g.match(/"/g);(((h==null?void 0:h.length)??0)%2===0&&!y||y.length%2!==0)&&(g=g.replace(/'/g,'"'));try{a=JSON.parse(g),c&&(a={...c,...a})}catch(f){return this.logger.warn(`failed parsing options string in nesting for key ${d}`,f),`${d}${p}${g}`}return a.defaultValue&&a.defaultValue.indexOf(this.prefix)>-1&&delete a.defaultValue,d};for(;r=this.nestingRegexp.exec(t);){let d=[];a={...n},a=a.replace&&!M(a.replace)?a.replace:a,a.applyPostProcessor=!1,delete a.defaultValue;const c=/{.*}/.test(r[1])?r[1].lastIndexOf("}")+1:r[1].indexOf(this.formatSeparator);if(c!==-1&&(d=r[1].slice(c).split(this.formatSeparator).map(p=>p.trim()).filter(Boolean),r[1]=r[1].slice(0,c)),i=o(s.call(this,r[1].trim(),a),a),i&&r[0]===t&&!M(i))return i;M(i)||(i=nr(i)),i||(this.logger.warn(`missed to resolve ${r[1]} for nesting ${t}`),i=""),d.length&&(i=d.reduce((p,m)=>this.format(p,m,n.lng,{...n,interpolationkey:r[1].trim()}),i.trim())),t=t.replace(r[0],i),this.regexp.lastIndex=0}return t}}const lh=e=>{let t=e.toLowerCase().trim();const o={};if(e.indexOf("(")>-1){const n=e.split("(");t=n[0].toLowerCase().trim();const r=n[1].substring(0,n[1].length-1);t==="currency"&&r.indexOf(":")<0?o.currency||(o.currency=r.trim()):t==="relativetime"&&r.indexOf(":")<0?o.range||(o.range=r.trim()):r.split(";").forEach(a=>{if(a){const[s,...d]=a.split(":"),c=d.join(":").trim().replace(/^'+|'+$/g,""),p=s.trim();o[p]||(o[p]=c),c==="false"&&(o[p]=!1),c==="true"&&(o[p]=!0),isNaN(c)||(o[p]=parseInt(c,10))}})}return{formatName:t,formatOptions:o}},mr=e=>{const t={};return(o,n,r)=>{let i=r;r&&r.interpolationkey&&r.formatParams&&r.formatParams[r.interpolationkey]&&r[r.interpolationkey]&&(i={...i,[r.interpolationkey]:void 0});const a=n+JSON.stringify(i);let s=t[a];return s||(s=e(Dt(n),r),t[a]=s),s(o)}},ch=e=>(t,o,n)=>e(Dt(o),n)(t);class dh{constructor(t={}){this.logger=De.create("formatter"),this.options=t,this.init(t)}init(t,o={interpolation:{}}){this.formatSeparator=o.interpolation.formatSeparator||",";const n=o.cacheInBuiltFormats?mr:ch;this.formats={number:n((r,i)=>{const a=new Intl.NumberFormat(r,{...i});return s=>a.format(s)}),currency:n((r,i)=>{const a=new Intl.NumberFormat(r,{...i,style:"currency"});return s=>a.format(s)}),datetime:n((r,i)=>{const a=new Intl.DateTimeFormat(r,{...i});return s=>a.format(s)}),relativetime:n((r,i)=>{const a=new Intl.RelativeTimeFormat(r,{...i});return s=>a.format(s,i.range||"day")}),list:n((r,i)=>{const a=new Intl.ListFormat(r,{...i});return s=>a.format(s)})}}add(t,o){this.formats[t.toLowerCase().trim()]=o}addCached(t,o){this.formats[t.toLowerCase().trim()]=mr(o)}format(t,o,n,r={}){const i=o.split(this.formatSeparator);if(i.length>1&&i[0].indexOf("(")>1&&i[0].indexOf(")")<0&&i.find(s=>s.indexOf(")")>-1)){const s=i.findIndex(d=>d.indexOf(")")>-1);i[0]=[i[0],...i.splice(1,s)].join(this.formatSeparator)}return i.reduce((s,d)=>{var m;const{formatName:c,formatOptions:p}=lh(d);if(this.formats[c]){let g=s;try{const h=((m=r==null?void 0:r.formatParams)==null?void 0:m[r.interpolationkey])||{},y=h.locale||h.lng||r.locale||r.lng||n;g=this.formats[c](s,y,{...p,...r,...h})}catch(h){this.logger.warn(h)}return g}else this.logger.warn(`there was no format function for ${c}`);return s},t)}}const uh=(e,t)=>{e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)};class ph extends go{constructor(t,o,n,r={}){var i,a;super(),this.backend=t,this.store=o,this.services=n,this.languageUtils=n.languageUtils,this.options=r,this.logger=De.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=r.maxParallelReads||10,this.readingCalls=0,this.maxRetries=r.maxRetries>=0?r.maxRetries:5,this.retryTimeout=r.retryTimeout>=1?r.retryTimeout:350,this.state={},this.queue=[],(a=(i=this.backend)==null?void 0:i.init)==null||a.call(i,n,r.backend,r)}queueLoad(t,o,n,r){const i={},a={},s={},d={};return t.forEach(c=>{let p=!0;o.forEach(m=>{const g=`${c}|${m}`;!n.reload&&this.store.hasResourceBundle(c,m)?this.state[g]=2:this.state[g]<0||(this.state[g]===1?a[g]===void 0&&(a[g]=!0):(this.state[g]=1,p=!1,a[g]===void 0&&(a[g]=!0),i[g]===void 0&&(i[g]=!0),d[m]===void 0&&(d[m]=!0)))}),p||(s[c]=!0)}),(Object.keys(i).length||Object.keys(a).length)&&this.queue.push({pending:a,pendingCount:Object.keys(a).length,loaded:{},errors:[],callback:r}),{toLoad:Object.keys(i),pending:Object.keys(a),toLoadLanguages:Object.keys(s),toLoadNamespaces:Object.keys(d)}}loaded(t,o,n){const r=t.split("|"),i=r[0],a=r[1];o&&this.emit("failedLoading",i,a,o),!o&&n&&this.store.addResourceBundle(i,a,n,void 0,void 0,{skipCopy:!0}),this.state[t]=o?-1:2,o&&n&&(this.state[t]=0);const s={};this.queue.forEach(d=>{Qp(d.loaded,[i],a),uh(d,t),o&&d.errors.push(o),d.pendingCount===0&&!d.done&&(Object.keys(d.loaded).forEach(c=>{s[c]||(s[c]={});const p=d.loaded[c];p.length&&p.forEach(m=>{s[c][m]===void 0&&(s[c][m]=!0)})}),d.done=!0,d.errors.length?d.callback(d.errors):d.callback())}),this.emit("loaded",s),this.queue=this.queue.filter(d=>!d.done)}read(t,o,n,r=0,i=this.retryTimeout,a){if(!t.length)return a(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:t,ns:o,fcName:n,tried:r,wait:i,callback:a});return}this.readingCalls++;const s=(c,p)=>{if(this.readingCalls--,this.waitingReads.length>0){const m=this.waitingReads.shift();this.read(m.lng,m.ns,m.fcName,m.tried,m.wait,m.callback)}if(c&&p&&r<this.maxRetries){setTimeout(()=>{this.read.call(this,t,o,n,r+1,i*2,a)},i);return}a(c,p)},d=this.backend[n].bind(this.backend);if(d.length===2){try{const c=d(t,o);c&&typeof c.then=="function"?c.then(p=>s(null,p)).catch(s):s(null,c)}catch(c){s(c)}return}return d(t,o,s)}prepareLoading(t,o,n={},r){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),r&&r();M(t)&&(t=this.languageUtils.toResolveHierarchy(t)),M(o)&&(o=[o]);const i=this.queueLoad(t,o,n,r);if(!i.toLoad.length)return i.pending.length||r(),null;i.toLoad.forEach(a=>{this.loadOne(a)})}load(t,o,n){this.prepareLoading(t,o,{},n)}reload(t,o,n){this.prepareLoading(t,o,{reload:!0},n)}loadOne(t,o=""){const n=t.split("|"),r=n[0],i=n[1];this.read(r,i,"read",void 0,void 0,(a,s)=>{a&&this.logger.warn(`${o}loading namespace ${i} for language ${r} failed`,a),!a&&s&&this.logger.log(`${o}loaded namespace ${i} for language ${r}`,s),this.loaded(t,a,s)})}saveMissing(t,o,n,r,i,a={},s=()=>{}){var d,c,p,m,g;if((c=(d=this.services)==null?void 0:d.utils)!=null&&c.hasLoadedNamespace&&!((m=(p=this.services)==null?void 0:p.utils)!=null&&m.hasLoadedNamespace(o))){this.logger.warn(`did not save key "${n}" as the namespace "${o}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(n==null||n==="")){if((g=this.backend)!=null&&g.create){const h={...a,isUpdate:i},y=this.backend.create.bind(this.backend);if(y.length<6)try{let f;y.length===5?f=y(t,o,n,r,h):f=y(t,o,n,r),f&&typeof f.then=="function"?f.then(v=>s(null,v)).catch(s):s(null,f)}catch(f){s(f)}else y(t,o,n,r,s,h)}!t||!t[0]||this.store.addResource(t[0],o,n,r)}}}const fr=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:e=>{let t={};if(typeof e[1]=="object"&&(t=e[1]),M(e[1])&&(t.defaultValue=e[1]),M(e[2])&&(t.tDescription=e[2]),typeof e[2]=="object"||typeof e[3]=="object"){const o=e[3]||e[2];Object.keys(o).forEach(n=>{t[n]=o[n]})}return t},interpolation:{escapeValue:!0,format:e=>e,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),gr=e=>{var t,o;return M(e.ns)&&(e.ns=[e.ns]),M(e.fallbackLng)&&(e.fallbackLng=[e.fallbackLng]),M(e.fallbackNS)&&(e.fallbackNS=[e.fallbackNS]),((o=(t=e.supportedLngs)==null?void 0:t.indexOf)==null?void 0:o.call(t,"cimode"))<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),typeof e.initImmediate=="boolean"&&(e.initAsync=e.initImmediate),e},zt=()=>{},hh=e=>{Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(o=>{typeof e[o]=="function"&&(e[o]=e[o].bind(e))})};class Wt extends go{constructor(t={},o){if(super(),this.options=gr(t),this.services={},this.logger=De,this.modules={external:[]},hh(this),o&&!this.isInitialized&&!t.isClone){if(!this.options.initAsync)return this.init(t,o),this;setTimeout(()=>{this.init(t,o)},0)}}init(t={},o){this.isInitializing=!0,typeof t=="function"&&(o=t,t={}),t.defaultNS==null&&t.ns&&(M(t.ns)?t.defaultNS=t.ns:t.ns.indexOf("translation")<0&&(t.defaultNS=t.ns[0]));const n=fr();this.options={...n,...this.options,...gr(t)},this.options.interpolation={...n.interpolation,...this.options.interpolation},t.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=t.keySeparator),t.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=t.nsSeparator);const r=c=>c?typeof c=="function"?new c:c:null;if(!this.options.isClone){this.modules.logger?De.init(r(this.modules.logger),this.options):De.init(null,this.options);let c;this.modules.formatter?c=this.modules.formatter:c=dh;const p=new dr(this.options);this.store=new sr(this.options.resources,this.options);const m=this.services;m.logger=De,m.resourceStore=this.store,m.languageUtils=p,m.pluralResolver=new ah(p,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==n.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),c&&(!this.options.interpolation.format||this.options.interpolation.format===n.interpolation.format)&&(m.formatter=r(c),m.formatter.init&&m.formatter.init(m,this.options),this.options.interpolation.format=m.formatter.format.bind(m.formatter)),m.interpolator=new sh(this.options),m.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},m.backendConnector=new ph(r(this.modules.backend),m.resourceStore,m,this.options),m.backendConnector.on("*",(h,...y)=>{this.emit(h,...y)}),this.modules.languageDetector&&(m.languageDetector=r(this.modules.languageDetector),m.languageDetector.init&&m.languageDetector.init(m,this.options.detection,this.options)),this.modules.i18nFormat&&(m.i18nFormat=r(this.modules.i18nFormat),m.i18nFormat.init&&m.i18nFormat.init(this)),this.translator=new ao(this.services,this.options),this.translator.on("*",(h,...y)=>{this.emit(h,...y)}),this.modules.external.forEach(h=>{h.init&&h.init(this)})}if(this.format=this.options.interpolation.format,o||(o=zt),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const c=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);c.length>0&&c[0]!=="dev"&&(this.options.lng=c[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(c=>{this[c]=(...p)=>this.store[c](...p)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(c=>{this[c]=(...p)=>(this.store[c](...p),this)});const s=Et(),d=()=>{const c=(p,m)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),s.resolve(m),o(p,m)};if(this.languages&&!this.isInitialized)return c(null,this.t.bind(this));this.changeLanguage(this.options.lng,c)};return this.options.resources||!this.options.initAsync?d():setTimeout(d,0),s}loadResources(t,o=zt){var i,a;let n=o;const r=M(t)?t:this.language;if(typeof t=="function"&&(n=t),!this.options.resources||this.options.partialBundledLanguages){if((r==null?void 0:r.toLowerCase())==="cimode"&&(!this.options.preload||this.options.preload.length===0))return n();const s=[],d=c=>{if(!c||c==="cimode")return;this.services.languageUtils.toResolveHierarchy(c).forEach(m=>{m!=="cimode"&&s.indexOf(m)<0&&s.push(m)})};r?d(r):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(p=>d(p)),(a=(i=this.options.preload)==null?void 0:i.forEach)==null||a.call(i,c=>d(c)),this.services.backendConnector.load(s,this.options.ns,c=>{!c&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),n(c)})}else n(null)}reloadResources(t,o,n){const r=Et();return typeof t=="function"&&(n=t,t=void 0),typeof o=="function"&&(n=o,o=void 0),t||(t=this.languages),o||(o=this.options.ns),n||(n=zt),this.services.backendConnector.reload(t,o,i=>{r.resolve(),n(i)}),r}use(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return t.type==="backend"&&(this.modules.backend=t),(t.type==="logger"||t.log&&t.warn&&t.error)&&(this.modules.logger=t),t.type==="languageDetector"&&(this.modules.languageDetector=t),t.type==="i18nFormat"&&(this.modules.i18nFormat=t),t.type==="postProcessor"&&ca.addPostProcessor(t),t.type==="formatter"&&(this.modules.formatter=t),t.type==="3rdParty"&&this.modules.external.push(t),this}setResolvedLanguage(t){if(!(!t||!this.languages)&&!(["cimode","dev"].indexOf(t)>-1)){for(let o=0;o<this.languages.length;o++){const n=this.languages[o];if(!(["cimode","dev"].indexOf(n)>-1)&&this.store.hasLanguageSomeTranslations(n)){this.resolvedLanguage=n;break}}!this.resolvedLanguage&&this.languages.indexOf(t)<0&&this.store.hasLanguageSomeTranslations(t)&&(this.resolvedLanguage=t,this.languages.unshift(t))}}changeLanguage(t,o){this.isLanguageChangingTo=t;const n=Et();this.emit("languageChanging",t);const r=s=>{this.language=s,this.languages=this.services.languageUtils.toResolveHierarchy(s),this.resolvedLanguage=void 0,this.setResolvedLanguage(s)},i=(s,d)=>{d?this.isLanguageChangingTo===t&&(r(d),this.translator.changeLanguage(d),this.isLanguageChangingTo=void 0,this.emit("languageChanged",d),this.logger.log("languageChanged",d)):this.isLanguageChangingTo=void 0,n.resolve((...c)=>this.t(...c)),o&&o(s,(...c)=>this.t(...c))},a=s=>{var p,m;!t&&!s&&this.services.languageDetector&&(s=[]);const d=M(s)?s:s&&s[0],c=this.store.hasLanguageSomeTranslations(d)?d:this.services.languageUtils.getBestMatchFromCodes(M(s)?[s]:s);c&&(this.language||r(c),this.translator.language||this.translator.changeLanguage(c),(m=(p=this.services.languageDetector)==null?void 0:p.cacheUserLanguage)==null||m.call(p,c)),this.loadResources(c,g=>{i(g,c)})};return!t&&this.services.languageDetector&&!this.services.languageDetector.async?a(this.services.languageDetector.detect()):!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(a):this.services.languageDetector.detect(a):a(t),n}getFixedT(t,o,n){const r=(i,a,...s)=>{let d;typeof a!="object"?d=this.options.overloadTranslationOptionHandler([i,a].concat(s)):d={...a},d.lng=d.lng||r.lng,d.lngs=d.lngs||r.lngs,d.ns=d.ns||r.ns,d.keyPrefix!==""&&(d.keyPrefix=d.keyPrefix||n||r.keyPrefix);const c=this.options.keySeparator||".";let p;return d.keyPrefix&&Array.isArray(i)?p=i.map(m=>(typeof m=="function"&&(m=Jo(m,{...this.options,...a})),`${d.keyPrefix}${c}${m}`)):(typeof i=="function"&&(i=Jo(i,{...this.options,...a})),p=d.keyPrefix?`${d.keyPrefix}${c}${i}`:i),this.t(p,d)};return M(t)?r.lng=t:r.lngs=t,r.ns=o,r.keyPrefix=n,r}t(...t){var o;return(o=this.translator)==null?void 0:o.translate(...t)}exists(...t){var o;return(o=this.translator)==null?void 0:o.exists(...t)}setDefaultNamespace(t){this.options.defaultNS=t}hasLoadedNamespace(t,o={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const n=o.lng||this.resolvedLanguage||this.languages[0],r=this.options?this.options.fallbackLng:!1,i=this.languages[this.languages.length-1];if(n.toLowerCase()==="cimode")return!0;const a=(s,d)=>{const c=this.services.backendConnector.state[`${s}|${d}`];return c===-1||c===0||c===2};if(o.precheck){const s=o.precheck(this,a);if(s!==void 0)return s}return!!(this.hasResourceBundle(n,t)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||a(n,t)&&(!r||a(i,t)))}loadNamespaces(t,o){const n=Et();return this.options.ns?(M(t)&&(t=[t]),t.forEach(r=>{this.options.ns.indexOf(r)<0&&this.options.ns.push(r)}),this.loadResources(r=>{n.resolve(),o&&o(r)}),n):(o&&o(),Promise.resolve())}loadLanguages(t,o){const n=Et();M(t)&&(t=[t]);const r=this.options.preload||[],i=t.filter(a=>r.indexOf(a)<0&&this.services.languageUtils.isSupportedCode(a));return i.length?(this.options.preload=r.concat(i),this.loadResources(a=>{n.resolve(),o&&o(a)}),n):(o&&o(),Promise.resolve())}dir(t){var r,i;if(t||(t=this.resolvedLanguage||(((r=this.languages)==null?void 0:r.length)>0?this.languages[0]:this.language)),!t)return"rtl";try{const a=new Intl.Locale(t);if(a&&a.getTextInfo){const s=a.getTextInfo();if(s&&s.direction)return s.direction}}catch{}const o=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],n=((i=this.services)==null?void 0:i.languageUtils)||new dr(fr());return t.toLowerCase().indexOf("-latn")>1?"ltr":o.indexOf(n.getLanguagePartFromCode(t))>-1||t.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(t={},o){return new Wt(t,o)}cloneInstance(t={},o=zt){const n=t.forkResourceStore;n&&delete t.forkResourceStore;const r={...this.options,...t,isClone:!0},i=new Wt(r);if((t.debug!==void 0||t.prefix!==void 0)&&(i.logger=i.logger.clone(t)),["store","services","language"].forEach(s=>{i[s]=this[s]}),i.services={...this.services},i.services.utils={hasLoadedNamespace:i.hasLoadedNamespace.bind(i)},n){const s=Object.keys(this.store.data).reduce((d,c)=>(d[c]={...this.store.data[c]},d[c]=Object.keys(d[c]).reduce((p,m)=>(p[m]={...d[c][m]},p),d[c]),d),{});i.store=new sr(s,r),i.services.resourceStore=i.store}return i.translator=new ao(i.services,r),i.translator.on("*",(s,...d)=>{i.emit(s,...d)}),i.init(r,o),i.translator.options=r,i.translator.backendConnector.services.utils={hasLoadedNamespace:i.hasLoadedNamespace.bind(i)},i}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const ne=Wt.createInstance();ne.createInstance=Wt.createInstance;ne.createInstance;ne.dir;ne.init;ne.loadResources;ne.reloadResources;ne.use;ne.changeLanguage;ne.getFixedT;ne.t;ne.exists;ne.setDefaultNamespace;ne.hasLoadedNamespace;ne.loadNamespaces;ne.loadLanguages;const mh=(e,t,o,n)=>{var i,a,s,d;const r=[o,{code:t,...n||{}}];if((a=(i=e==null?void 0:e.services)==null?void 0:i.logger)!=null&&a.forward)return e.services.logger.forward(r,"warn","react-i18next::",!0);ot(r[0])&&(r[0]=`react-i18next:: ${r[0]}`),(d=(s=e==null?void 0:e.services)==null?void 0:s.logger)!=null&&d.warn?e.services.logger.warn(...r):console!=null&&console.warn&&console.warn(...r)},yr={},Zo=(e,t,o,n)=>{ot(o)&&yr[o]||(ot(o)&&(yr[o]=new Date),mh(e,t,o,n))},ua=(e,t)=>()=>{if(e.isInitialized)t();else{const o=()=>{setTimeout(()=>{e.off("initialized",o)},0),t()};e.on("initialized",o)}},en=(e,t,o)=>{e.loadNamespaces(t,ua(e,o))},vr=(e,t,o,n)=>{if(ot(o)&&(o=[o]),e.options.preload&&e.options.preload.indexOf(t)>-1)return en(e,o,n);o.forEach(r=>{e.options.ns.indexOf(r)<0&&e.options.ns.push(r)}),e.loadLanguages(t,ua(e,n))},fh=(e,t,o={})=>
57!t.languages||!t.languages.length?(Zo(t,"NO_LANGUAGES","i18n.languages were undefined or empty",{languages:t.languages}),!0):t.hasLoadedNamespace(e,{lng:o.lng,precheck:(n,r)=>{if(o.bindI18n&&o.bindI18n.indexOf("languageChanging")>-1&&n.services.backendConnector.backend&&n.isLanguageChangingTo&&!r(n.isLanguageChangingTo,e))return!1}}),ot=e=>typeof e=="string",gh=e=>typeof e=="object"&&e!==null,yh=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,vh={"&amp;":"&","&#38;":"&","&lt;":"<","&#60;":"<","&gt;":">","&#62;":">","&apos;":"'","&#39;":"'","&quot;":'"',"&#34;":'"',"&nbsp;":" ","&#160;":" ","&copy;":"©","&#169;":"©","&reg;":"®","&#174;":"®","&hellip;":"…","&#8230;":"…","&#x2F;":"/","&#47;":"/"},wh=e=>vh[e],bh=e=>e.replace(yh,wh);let tn={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:bh};const Ph=(e={})=>{tn={...tn,...e}},xh=()=>tn;let pa;const Sh=e=>{pa=e},Th=()=>pa,Ah={type:"3rdParty",init(e){Ph(e.options.react),Sh(e)}},Eh=u.createContext();class kh{constructor(){this.usedNamespaces={}}addUsedNamespaces(t){t.forEach(o=>{this.usedNamespaces[o]||(this.usedNamespaces[o]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}const Ch=(e,t)=>{const o=u.useRef();return u.useEffect(()=>{o.current=e},[e,t]),o.current},ha=(e,t,o,n)=>e.getFixedT(t,o,n),Nh=(e,t,o,n)=>u.useCallback(ha(e,t,o,n),[e,t,o,n]),Rh=(e,t={})=>{var T,k,S,C;const{i18n:o}=t,{i18n:n,defaultNS:r}=u.useContext(Eh)||{},i=o||n||Th();if(i&&!i.reportNamespaces&&(i.reportNamespaces=new kh),!i){Zo(i,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const L=(F,q)=>ot(q)?q:gh(q)&&ot(q.defaultValue)?q.defaultValue:Array.isArray(F)?F[F.length-1]:F,O=[L,{},!1];return O.t=L,O.i18n={},O.ready=!1,O}(T=i.options.react)!=null&&T.wait&&Zo(i,"DEPRECATED_OPTION","useTranslation: It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");const a={...xh(),...i.options.react,...t},{useSuspense:s,keyPrefix:d}=a;let c=r||((k=i.options)==null?void 0:k.defaultNS);c=ot(c)?[c]:c||["translation"],(C=(S=i.reportNamespaces).addUsedNamespaces)==null||C.call(S,c);const p=(i.isInitialized||i.initializedStoreOnce)&&c.every(L=>fh(L,i,a)),m=Nh(i,t.lng||null,a.nsMode==="fallback"?c:c[0],d),g=()=>m,h=()=>ha(i,t.lng||null,a.nsMode==="fallback"?c:c[0],d),[y,f]=u.useState(g);let v=c.join();t.lng&&(v=`${t.lng}${v}`);const w=Ch(v),x=u.useRef(!0);u.useEffect(()=>{const{bindI18n:L,bindI18nStore:O}=a;x.current=!0,!p&&!s&&(t.lng?vr(i,t.lng,c,()=>{x.current&&f(h)}):en(i,c,()=>{x.current&&f(h)})),p&&w&&w!==v&&x.current&&f(h);const F=()=>{x.current&&f(h)};return L&&(i==null||i.on(L,F)),O&&(i==null||i.store.on(O,F)),()=>{x.current=!1,i&&L&&(L==null||L.split(" ").forEach(q=>i.off(q,F))),O&&i&&O.split(" ").forEach(q=>i.store.off(q,F))}},[i,v]),u.useEffect(()=>{x.current&&p&&f(g)},[i,d,p]);const b=[y,i,p];if(b.t=y,b.i18n=i,b.ready=p,p||!p&&!s)return b;throw new Promise(L=>{t.lng?vr(i,t.lng,c,()=>L()):en(i,c,()=>L())})},{slice:Ih,forEach:Dh}=[];function Wh(e){return Dh.call(Ih.call(arguments,1),t=>{if(t)for(const o in t)e[o]===void 0&&(e[o]=t[o])}),e}
57function Lh(e){return typeof e!="string"?!1:[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(o=>o.test(e))}const wr=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,Oh=function(e,t){const n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{path:"/"},r=encodeURIComponent(t);let i=`${e}=${r}`;if(n.maxAge>0){const a=n.maxAge-0;if(Number.isNaN(a))throw new Error("maxAge should be a Number");i+=`; Max-Age=${Math.floor(a)}`}if(n.domain){if(!wr.test(n.domain))throw new TypeError("option domain is invalid");i+=`; Domain=${n.domain}`}if(n.path){if(!wr.test(n.path))throw new TypeError("option path is invalid");i+=`; Path=${n.path}`}if(n.expires){if(typeof n.expires.toUTCString!="function")throw new TypeError("option expires is invalid");i+=`; Expires=${n.expires.toUTCString()}`}if(n.httpOnly&&(i+="; HttpOnly"),n.secure&&(i+="; Secure"),n.sameSite)switch(typeof n.sameSite=="string"?n.sameSite.toLowerCase():n.sameSite){case!0:i+="; SameSite=Strict";break;case"lax":i+="; SameSite=Lax";break;case"strict":i+="; SameSite=Strict";break;case"none":i+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return n.partitioned&&(i+="; Partitioned"),i},br={create(e,t,o,n){let r=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:"/",sameSite:"strict"};o&&(r.expires=new Date,r.expires.setTime(r.expires.getTime()+o*60*1e3)),n&&(r.domain=n),document.cookie=Oh(e,t,r)},read(e){const t=`${e}=`,o=document.cookie.split(";");for(let n=0;n<o.length;n++){let r=o[n];for(;r.charAt(0)===" ";)r=r.substring(1,r.length);if(r.indexOf(t)===0)return r.substring(t.length,r.length)}return null},remove(e,t){this.create(e,"",-1,t)}};var Fh={name:"cookie",lookup(e){let{lookupCookie:t}=e;if(t&&typeof document<"u")return br.read(t)||void 0},cacheUserLanguage(e,t){let{lookupCookie:o,cookieMinutes:n,cookieDomain:r,cookieOptions:i}=t;o&&typeof document<"u"&&br.create(o,e,n,r,i)}},_h={name:"querystring",lookup(e){var n;let{lookupQuerystring:t}=e,o;if(typeof window<"u"){let{search:r}=window.location;!window.location.search&&((n=window.location.hash)==null?void 0:n.indexOf("?"))>-1&&(r=window.location.hash.substring(window.location.hash.indexOf("?")));const a=r.substring(1).split("&");for(let s=0;s<a.length;s++){const d=a[s].indexOf("=");d>0&&a[s].substring(0,d)===t&&(o=a[s].substring(d+1))}}return o}},Mh={name:"hash",lookup(e){var r;let{lookupHash:t,lookupFromHashIndex:o}=e,n;if(typeof window<"u"){const{hash:i}=window.location;if(i&&i.length>2){const a=i.substring(1);if(t){const s=a.split("&");for(let d=0;d<s.length;d++){const c=s[d].indexOf("=");c>0&&s[d].substring(0,c)===t&&(n=s[d].substring(c+1))}}if(n)return n;if(!n&&o>-1){const s=i.match(/\/([a-zA-Z-]*)/g);return Array.isArray(s)?(r=s[typeof o=="number"?o:0])==null?void 0:r.replace("/",""):void 0}}}return n}};let lt=null;const Pr=()=>{if(lt!==null)return lt;try{if(lt=typeof window<"u"&&window.localStorage!==null,!lt)return!1;const e="i18next.translate.boo";window.localStorage.setItem(e,"foo"),window.localStorage.removeItem(e)}catch{lt=!1}return lt};var jh={name:"localStorage",lookup(e){let{lookupLocalStorage:t}=e;if(t&&Pr())return window.localStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupLocalStorage:o}=t;o&&Pr()&&window.localStorage.setItem(o,e)}};let ct=null;const xr=()=>{if(ct!==null)return ct;try{if(ct=typeof window<"u"&&window.sessionStorage!==null,!ct)return!1;const e="i18next.translate.boo";window.sessionStorage.setItem(e,"foo"),window.sessionStorage.removeItem(e)}catch{ct=!1}return ct};var Hh={name:"sessionStorage",lookup(e){let{lookupSessionStorage:t}=e;if(t&&xr())return window.sessionStorage.getItem(t)||void 0},cacheUserLanguage(e,t){let{lookupSessionStorage:o}=t;o&&xr()&&window.sessionStorage.setItem(o,e)}},$h={name:"navigator",lookup(e){const t=[];if(typeof navigator<"u"){const{languages:o,userLanguage:n,language:r}=navigator;if(o)for(let i=0;i<o.length;i++)t.push(o[i]);
vendor: 4,972 bytes, line 57
57n&&t.push(n),r&&t.push(r)}return t.length>0?t:void 0}},Bh={name:"htmlTag",lookup(e){let{htmlTag:t}=e,o;const n=t||(typeof document<"u"?document.documentElement:null);return n&&typeof n.getAttribute=="function"&&(o=n.getAttribute("lang")),o}},Vh={name:"path",lookup(e){var r;let{lookupFromPathIndex:t}=e;if(typeof window>"u")return;const o=window.location.pathname.match(/\/([a-zA-Z-]*)/g);return Array.isArray(o)?(r=o[typeof t=="number"?t:0])==null?void 0:r.replace("/",""):void 0}},Uh={name:"subdomain",lookup(e){var r,i;let{lookupFromSubdomainIndex:t}=e;const o=typeof t=="number"?t+1:1,n=typeof window<"u"&&((i=(r=window.location)==null?void 0:r.hostname)==null?void 0:i.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i));if(n)return n[o]}};let ma=!1;try{document.cookie,ma=!0}catch{}const fa=["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"];ma||fa.splice(1,1);const qh=()=>({order:fa,lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:e=>e});class ga{constructor(t){let o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(t,o)}init(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{languageUtils:{}},o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=t,this.options=Wh(o,this.options||{},qh()),typeof this.options.convertDetectedLanguage=="string"&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=r=>r.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=n,this.addDetector(Fh),this.addDetector(_h),this.addDetector(jh),this.addDetector(Hh),this.addDetector($h),this.addDetector(Bh),this.addDetector(Vh),this.addDetector(Uh),this.addDetector(Mh)}addDetector(t){return this.detectors[t.name]=t,this}detect(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.order,o=[];return t.forEach(n=>{if(this.detectors[n]){let r=this.detectors[n].lookup(this.options);r&&typeof r=="string"&&(r=[r]),r&&(o=o.concat(r))}}),o=o.filter(n=>n!=null&&!Lh(n)).map(n=>this.options.convertDetectedLanguage(n)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes?o:o.length>0?o[0]:null}cacheUserLanguage(t){let o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.caches;o&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(t)>-1||o.forEach(n=>{this.detectors[n]&&this.detectors[n].cacheUserLanguage(t,this.options)}))}}ga.type="languageDetector";const zh={home:"主頁",openMenu:"開啟選單",logoAlt:"PetWell 香港寵物健康 App 標誌 - 獸醫診所評價與寵物健康管理平台",petFriendly:"寵物友善",clinics:"診所評價",salons:"寵物美容",lodging:"寵物寄養",malls:"寵物友善商場",homeVisits:"寵物上門服務",restaurants:"寵物友善餐廳",restaurantsByDistrict:"按18區搵餐廳",ngos:"動物組織",about:"關於我們",forum:"討論區",blog:"資訊",ownerZone:"主人專區",tests:"趣味測試",petMatchmaker:"寵物配對測試",petActivities:"活動",testBooking:"檢測服務",nutritionScore:"糧食評分",otherServices:"商戶合作",review:"用品格價",download:"下載 App",partnershipMenu:{merchant:"商戶合作",merchantHint:"媒體推廣與平台刊登",events:"活動策劃",eventsHint:"寵物市集與嘉年華"},petFriendlyMenu:{goOut:"帶毛孩出街",care:"搵醫生",services:"美容同寄養",restaurants:"餐廳",malls:"商場",clinics:"診所",homeVisits:"上門服務",salons:"美容",lodging:"寄養"}},Kh={searchNearby:"搜尋附近",nearby:"附近",sortedByDistance:"由近到遠",locationDenied:"未能取得你嘅位置。請允許定位,再撳「搜尋附近」。",locationBlockedTitle:"未能開啟定位",locationBlockedBody:"之前拒絕咗定位,所以要喺瀏覽器設定開返。",locationBlockedStep1:"撳網址列左邊嘅鎖頭",locationBlockedStep2:"將「位置」改成「允許」",locationBlockedStep3:"返嚟撳「再試一次」",locationBlockedIos:"請去 iPhone「設定」→ Safari 或 Chrome → 位置,允許呢個網站,然後返嚟撳「再試一次」。",locationTimeoutTitle:"搵唔到位置",locationTimeoutBody:"請確認定位已開,再試一次。",locationUnavailableTitle:"搵唔到位置",locationUnavailable:"呢個瀏覽器未能提供位置。",locationRetry:"再試一次",locationDismiss:"暫時唔使",distanceM:"{{m}} ç±³",distanceKm:"{{km}} 公里"},Gh={cta:"預約訂座",ctaShort:"訂座",title:"預約訂座",subtitle:"{{restaurantName}} · 送出後待餐廳確認",when:"日期與時間",moreDates:"其他日期",contact:"聯絡資料",customerName:"姓名",customerNamePlaceholder:"ä¾
57‹å¦‚:陳大文",customerPhone:"電話",customerPhonePlaceholder:"例如:9123 4567",customerEmail:"電郵",customerEmailPlaceholder:"[email protected]",reservationAt:"預約日期及時間",reservationDate:"日期",reservationDatePlaceholder:"選擇日期",reservationTime:"時間",partySize:"人數",petCount:"寵物",maxPetsHint:"最多 {{count}} 隻",fewer:"減少",more:"增加",petSummary:"寵物資料(選填)",petSummaryPlaceholder:"例如:1 隻小型犬、需戶外位",specialRequest:"特別要求(選填)",specialRequestPlaceholder:"座位偏好、慶祝安排等",addExtras:"加入電郵或備註",editExtras:"編輯電郵或備註",termsTitle:"訂座條款",termsAccept:"我同意訂座條款",viewTerms:"查看條款",hideTerms:"收起條款",depositNotice:"帶 {{count}} 隻或以上寵物時,餐廳可能要求訂金。",noAvailableDates:"暫時沒有可預約日期。",noAvailableTimes:"這天沒有可預約時段。",pickDateFirst:"請先選擇日期。",notice:"提交後待確認,餐廳可能會聯絡你。",submit:"送出訂座",submitting:"送出中…",cancel:"取消",close:"關閉",successTitle:"已送出",successDesc:"已收到你對「{{restaurantName}}」的訂座要求,餐廳確認後會通知你。",errorDesc:"暫時未能送出,請稍後再試。",validation:{required:"請填寫此欄。",email:"請輸入有效電郵。",future:"請選擇可接受的較後時間。",unavailableDate:"此日期不接受訂座。",unavailableTime:"此時段不接受訂座。",maxPets:"最多可帶 {{count}} 隻寵物。",partySize:"請至少選擇 1 人。",petCount:"寵物數量不可少於 0。",terms:"請先同意訂座條款。"}},Yh={title:"趣味寵物測試",subtitle:"發掘關於你同你寵物嘅有趣測試!",petMatchmakerDesc:"搵出邊種寵物最啱你嘅性格同生活方式。",startTest:"開始測試"},Qh={title:"全港首個",titleHighlight:"寵物健康App",titleEnd:"",subtitle:"最詳盡獸醫,寵物美容資訊 盡在一App",cta:"立即下載"},Xh={eyebrow:"香港首個一站式寵物健康平台",summary:"寵物香港首選平台 — 獸醫診所評價、寵物友善餐廳、寵物美容寄養、寵物活動與論壇",explorePlatform:"探索平台",stats:{clinicsValue:"200+",clinicsLabel:"獸醫診所",restaurantsValue:"1500+",restaurantsLabel:"友善餐廳",freeValue:"100%",freeLabel:"完全免費"},features:{eyebrow:"核心能力",title:"為毛孩主人而設",subtitle:"整合評價、資訊與健康紀錄,讓照顧毛孩更透明、更簡單。",saveTime:{title:"節省資料蒐尋時間",description:"PetWell 已合併所有評價*,一個平台搵晒所需資訊。"},advocacy:{title:"推動動物權益",description:"分享好與壞的經歷,共同創建人寵共融的社會。"},records:{title:"永久儲存寵物健康紀錄",description:"詳盡保留寵物一生的紀錄,轉醫生都唔驚漏資料。"},free:{title:"完全免費",description:"我們希望所有動物都得到優質的服務。"}},platform:{eyebrow:"產品生態",title:"一站式寵物生活服務",subtitle:"從醫療到日常,PetWell 覆蓋香港寵物主人的每個重要決策。",clinics:{title:"獸醫診所",description:"全港真實評價、收費參考與 24 小時急症篩選。",cta:"瀏覽診所"},restaurants:{title:"友善餐廳",description:"經團隊致電確認的寵物友善餐廳,分佈港九新界。",cta:"瀏覽餐廳"},activities:{title:"寵物活動",description:"市集、派對、嘉年華 — 為毛孩安排周末好節目。",cta:"瀏覽活動"}},testimonials:{eyebrow:"用戶評價",title:"香港主人嘅真實分享",minnie:{text:"之前睇親獸醫都係一直都依賴朋友介紹,所以都要去好遠睇,現加有咗PetWell大家多咗個地方分享就可以揀返間近自己嘅獸醫啦!",author:"Minnie Leung"},elaine:{text:"養咗動物咁多年,我成日都會唔見佢哋啲針卡同有時候唔記得佢哋入過急診,現加係到可以好詳細咁紀錄每次獸醫講過同幫寵物做咗咩,之後轉醫生都唔驚講漏野。",author:"Elaine Yeung"},matthew:{text:"我隻狗一向都好驚去美容院,因為佢細個有次比啲姐姐打,但上門寵物美容師太多,都唔知邊個性價比高,現加係 PetWell可以一次過比較同睇到最快可約時間,幾方便!",author:"Matthew Chan"}},appPreviewAlt:"PetWell寵物健康App手機界面展示 - 獸醫診所搜尋、寵物健康紀錄、散步追蹤功能"},Jh={hero:{eyebrow:"香港寵物一站式平台",title:"讓寵物生活更簡單",subtitle:"格價、診所、美容、寄養、友善餐廳、活動同論壇 — 一個搜尋搞掂",subtitleMobile:"格價、診所、餐廳、活動 — 一搜即搵"},tabs:{all:"全部",review:"用品格價"},search:{categoryLabel:"搜尋分類",placeholder:"搜尋產品、診所、美容、餐廳、活動…",placeholderMobile:"搜尋產品、診所、餐廳…",placeholders:{review:"搜尋品牌、產品名稱…",activities:"搜尋活動名稱、地點…"},submit:"搜尋"},quickNav:{label:"快速入口",review:"用品格價"}
57,promos:{title:"精選優惠",cta:"立即查看",member:{title:"PetWell 會員專享",subtitle:"會員享 9 折優惠"},activities:{title:"2026 寵物好去處",subtitle:"週末活動同戶外推介"},review:{title:"寵物用品格價",subtitle:"比較全港寵物店價錢"}},suggestions:{title:"探索 PetWell",explore:"前往",clinicsSub:"真實評價同收費參考",salonsSub:"全港美容店資訊",lodgingSub:"寄養場所推介",restaurantsSub:"經確認嘅友善餐廳",districtsLink:"按18區搵寵物友善餐廳",activities:"香港寵物好去處",activitiesSub:"活動、市集同戶外推介",ownerZoneSub:"照護知識同實用貼士"},featured:{title:"精選推介",subtitle:"為毛孩主人精心挑選嘅熱門分類",review:{title:"寵物用品格價",subtitle:"比較全港寵物店真實價錢,慳到盡"}},sectors:{viewAll:"睇全部",verified:"已確認",review:{title:"今日最抵 · 寵物用品格價",subtitle:"比較全港店舖報價,搵到最抵買"},restaurants:{title:"寵物友善餐廳",subtitle:"團隊致電確認,帶毛孩食飯更安心"},events:{title:"寵物活動同好去處",subtitle:"週末市集、派對同戶外推介"},clinics:{title:"獸醫診所評價",subtitle:"真實用戶評分同收費參考"},salons:{title:"寵物美容"},lodging:{title:"寵物寄養"},homeVisits:{title:"寵物上門服務",subtitle:"上門診症、疫苗同急症支援"}},cards:{stores:"{{count}} 間店舖",savePercent:"慳{{pct}}%",newListing:"新登場",freeEntry:"免費入場",priceFrom:"HK$ {{price}} 起",rank:"第 {{rank}} 名"},forum:{title:"論壇熱門",subtitle:"主人社群最新討論",viewAll:"睇更多",hot:"熱門",replies:"{{count}} 則回覆"}},Zh={pageTitle:"香港獸醫診所搜尋及評價",subtitle:"發掘最適合你寵物的獸醫診所 - 九龍、香港島、新界全覆蓋",description:"全港超過200間獸醫診所資訊、真實用戶評價、即時預約",searchPlaceholder:"搜尋診所名稱或地址...",filterByRegion:"按地區篩選",regions:{all:"全部地區",kowloon:"九龍",hongKong:"香港島",newTerritories:"新界",others:"其他"},loading:"載入中...",error:"載入診所資料時發生錯誤",errorSubtitle:"請稍後再試或聯絡客服",noResults:"暫時未有此地區的診所資料",services:"服務",reviews:"個用戶評論",ctaTitle:"需要搜尋更多診所?",ctaDescription:"下載 PetWell App 查看全港超過 200 間獸醫診所,享受更多進階搜尋功能",ctaButton:"立即下載 App",filter24Hour:"只顯示 24 小時診所",filtersLabel:"篩選",clearFilters:"清除篩選",resultsCount:"{{count}} 間診所",loadMore:"載入更多",noResultsHint:"試下調整搜尋關鍵字或篩選條件。",trustBadge:"真實用戶評價",backToList:"返回診所列表",address:"地址",phone:"電話",website:"網站",openingHours:"營業時間",closed:"休息",gallery:"相片",detail:{notFound:"診所未找到",servicesOverview:"服務重點一覽",servicesOverviewSubtitle:"出發前先了解診所提供嘅主要服務",callNow:"致電診所",getDirections:"導航前往",email:"電郵",todayHours:"今日營業",viewFullHours:"查看完整營業時間",hideFullHours:"收起營業時間",reviewsTitle:"用家評論",reviewsSubtitle:"其他毛孩家長嘅就診體驗",planVisit:"實用資訊",noHoursToday:"今日休息或未提供營業時間",suggestEdit:"建議修改",suggestEditPrompt:"診所資料有誤?",reviewsEmpty:"暫無評論",businessReply:"店家回覆",reviewsMoreTitle:"想睇更多評論?",reviewsMoreDescription:"下載 PetWell App 睇曬全部評論",businessReplyFrom:"來自「{{placeName}}」的回覆",businessReplyOfficial:"店家官方",registeredVetsTitle:"註冊獸醫",registeredVetsSubtitle:"配對到 {{count}} 位持有有效執業證明書的獸醫",registeredVetsSource:"資料來源:",registeredVetsSourceName:"香港獸醫管理局註冊獸醫名單"}},em={pageTitle:"寵物美容",subtitle:"發掘香港寵物美容店 - 九龍、港島、新界全覆蓋",description:"寵物美容店搜尋、用戶評價、服務項目與收費參考",searchPlaceholder:"搜尋美容店名稱或地址...",filterByRegion:"按地區篩選",regions:{all:"全部地區",kowloon:"九龍",hongKong:"香港島",newTerritories:"新界",others:"其他"},loading:"載入中...",error:"載入寵物美容資料時發生錯誤",errorSubtitle:"請稍後再試或聯絡客服",noResults:"暫時未有此地區的寵物美容店資料",services:"服務",reviews:"個用戶評論",ctaTitle:"需要搜尋更多寵物美容店?",ctaDescription:"下載 PetWell App 查看更多寵物美容店,享受更多進階搜尋功能",ctaButton:"立即下載 App",filter24Hour:"只顯示 24 小時",filtersLabel:"篩選",clearFilters:"清除篩選",resultsCount:"{{count}} 間美容店",loadMore:"載入更多",noResultsHint:"試下調整搜尋關鍵字或篩選條件。",trustBadge:"真實用戶評價",backToList:"返回寵物美容列表",address:"地址",phone:"電話",website:"網站",openingHours:"營業時間",closed:"休息",gallery:"相片",detail
57:{notFound:"寵物美容店未找到",servicesOverview:"服務重點一覽",servicesOverviewSubtitle:"出發前先了解美容店提供嘅主要服務",callNow:"致電美容店",getDirections:"導航前往",email:"電郵",todayHours:"今日營業",viewFullHours:"查看完整營業時間",hideFullHours:"收起營業時間",reviewsTitle:"用家評論",reviewsSubtitle:"其他毛孩家長嘅美容體驗",planVisit:"實用資訊",noHoursToday:"今日休息或未提供營業時間",suggestEdit:"建議修改",suggestEditPrompt:"美容店資料有誤?",reviewsEmpty:"暫無評論",businessReply:"店家回覆",reviewsMoreTitle:"想睇更多評論?",reviewsMoreDescription:"下載 PetWell App 睇曬全部評論",businessReplyFrom:"來自「{{placeName}}」的回覆",businessReplyOfficial:"店家官方"}},tm={pageTitle:"寵物寄養",subtitle:"發掘香港寵物寄養、寵物酒店 - 九龍、港島、新界全覆蓋",description:"寵物寄養場所搜尋、用戶評價、設施與收費參考",searchPlaceholder:"搜尋寄養場所名稱或地址...",filterByRegion:"按地區篩選",regions:{all:"全部地區",kowloon:"九龍",hongKong:"香港島",newTerritories:"新界",others:"其他"},loading:"載入中...",error:"載入寵物寄養資料時發生錯誤",errorSubtitle:"請稍後再試或聯絡客服",noResults:"暫時未有此地區的寵物寄養場所資料",services:"服務",reviews:"個用戶評論",ctaTitle:"需要搜尋更多寵物寄養場所?",ctaDescription:"下載 PetWell App 查看更多寵物寄養、寵物酒店,享受更多進階搜尋功能",ctaButton:"立即下載 App",filter24Hour:"只顯示 24 小時",filtersLabel:"篩選",clearFilters:"清除篩選",resultsCount:"{{count}} 間寄養場所",loadMore:"載入更多",noResultsHint:"試下調整搜尋關鍵字或篩選條件。",trustBadge:"真實用戶評價",backToList:"返回寵物寄養列表",address:"地址",phone:"電話",website:"網站",openingHours:"營業時間",closed:"休息",gallery:"相片",detail:{notFound:"寵物寄養場所未找到",servicesOverview:"設施重點一覽",servicesOverviewSubtitle:"出發前先了解寄養場所提供嘅主要服務同設施",callNow:"致電寄養場所",getDirections:"導航前往",email:"電郵",todayHours:"今日營業",viewFullHours:"查看完整營業時間",hideFullHours:"收起營業時間",reviewsTitle:"用家評論",reviewsSubtitle:"其他毛孩家長嘅寄養體驗",planVisit:"實用資訊",noHoursToday:"今日休息或未提供營業時間",suggestEdit:"建議修改",suggestEditPrompt:"寄養場所資料有誤?",reviewsEmpty:"暫無評論",businessReply:"店家回覆",reviewsMoreTitle:"想睇更多評論?",reviewsMoreDescription:"下載 PetWell App 睇曬全部評論",businessReplyFrom:"來自「{{placeName}}」的回覆",businessReplyOfficial:"店家官方"}},om={pageTitle:"香港寵物友善餐廳指南",subtitle:"1000+間真實寵主一齊寫評價,幫你篩走中伏位",description:"最詳盡資料 |PetWell 由真實寵主一齊寫評價,幫你篩走中伏位,搵到真・寵物友善嘅香港餐廳。",seoTitle:"香港寵物友善餐廳2026|食環署獲批+真實寵主評價|PetWell",seoDescription:"2026å¹´7月9日起食環署約989–1000間狗隻友善食肆生效。PetWell 另有致電確認嘅真・寵物友善餐廳,按18區、室內入座、即場入座篩選,帶狗食飯唔使中伏。",seoKeywords:"寵物友善餐廳,香港寵物友善餐廳,2026寵物友善餐廳,食環署寵物友善餐廳,狗隻友善食肆,狗隻入食肆,帶狗食飯,帶狗餐廳,狗狗友善餐廳,寵物友善cafe,可入室內餐廳,即場入座,pet friendly restaurant hong kong",seoStructuredDataName:"香港寵物友善餐廳推薦名單",enAliasPageTitle:"Pet-Friendly Restaurants in Hong Kong",enAliasSubtitle:"Team-verified restaurants where pets are welcome",enAliasDescription:"Browse Hong Kong pet-friendly restaurants verified by PetWell, with indoor access and walk-in filters.",enAliasSeoTitle:"Pet-Friendly Restaurants Hong Kong 2026 | Verified Dog-Friendly Dining | PetWell",enAliasSeoDescription:"Find verified pet-friendly restaurants in Hong Kong. Filter by district, indoor access, and walk-in policy — beyond the FEHD lottery list.",searchIntent:"PetWell 由真實寵主一齊寫評價,幫ä
57½ ç¯©èµ°ä¸­ä¼ä½ï¼Œæµåˆ°çœŸãƒ»å¯µç‰©å‹å–„嘅香港餐廳。",directQuestion:"香港有邊啲餐廳真係可以放心帶寵物去?",directAnswer:"2026å¹´7月9日起,食環署約989–1000間狗隻友善食肆可合法帶狗入內。PetWell 再進一步:團隊致電確認可唔可以入室內、要唔要預約,再加真實寵主評價同相片,等你出發前知道間餐廳係咪真・寵物友善。",faqTitle:"寵物友善餐廳常見問題",faq:{q1:"香港邊度有寵物友善餐廳?",a1:"港島、九龍、新界都有寵物友善餐廳。你可以按18區或地區篩選,快速搵到附近可帶毛孩用餐嘅 restaurant。",q2:"帶狗去 restaurant 食飯要注意咩?",a2:"建議先確認是否可帶寵物入內、是否需要預約、是否只限室外。到店時記得繫好狗帶及保持禮儀。",q3:"點樣判斷一間餐廳是否真正寵物友善?",a3:"可參考 PetWell 認證標記、用家評分、寵物政策標籤(室內/室外、即場入座/預約)同真實評論內容。",q4:"可唔可以即場去,定一定要預約?",a4:"視乎餐廳政策。你可以用「可即場入座」篩選,或者查看該餐廳標示嘅入座方式。",q5:"食環署寵物友善餐廳名單同 PetWell 認證有咩分別?",a5:"食環署名單係獲批「容許狗隻進入」嘅食肆牌照結果;PetWell 認證則係團隊致電確認寵物政策(室內/室外、預約/walk-in 等),兩者可以互相參考。",q6:"帶狗去食環署獲批餐廳要遵守咩規矩?",a6:"一般要求包括:狗隻須繫牽繩、不可上枱、不可接觸餐具、不可進入廚房或食物製造區等。詳情請參考食環署公佈。",q7:"貓咪可唔可以入寵物友善餐廳?",a7:"視乎餐廳政策。PetWell 標示主要針對狗隻,建議出發前致電餐廳確認是否歡迎貓咪。",q8:"邊區寵物友善餐廳最多?",a8:"港島(尤其中環、灣仔、東區)同九龍(油尖旺、觀塘)選擇較多。你可以按18區頁面查看各區已認證餐廳數量。",q9:"2026å¹´7月9日起狗隻入食肆有咩改變?",a9:"食環署「容許狗隻進入食物業處所」計劃已於2026å¹´7月9日生效,約989–1000間獲批狗隻友善食肆可合法帶狗。牌照唔等於真・寵物友善:有啲淨係室外、有啲要預約,計劃亦不包括貓。PetWell 會致電確認室內/walk-in 政策。"},howTo:{name:"點樣揀寵物友善餐廳",description:"用 PetWell 快速揀到適合你同毛孩嘅香港寵物友善餐廳。",step1Name:"揀地區",step1Text:"按18區或港島/九龍/新界篩選,或者搜尋餐廳名稱同地址。",step2Name:"睇寵物政策",step2Text:"留意可入室內、可即場入座等標籤,同 PetWell 認證狀態。",step3Name:"比較評分同營業時間",step3Text:"查看用家評分、今日營業時間,同埋有冇 Puppuccino 等額外資訊。",step4Name:"出發前再確認",step4Text:"建議出發前致電餐廳確認最新寵物政策,尤其繁忙時段或大型狗隻。"},hubSeo:{title:"全港唯一寵物友善餐廳評價網——由寵主寫俾寵主",body:"而家好多餐廳都話自己 pet-friendly,但真係去到先發現:淨係限室外、要提早預約、狗狗仲要坐推車入內⋯⋯唔想其他寵主中伏?幫手上嚟留低你嘅真實評價啦!你可以匿名留言、分享實地相片,講真話都唔驚。每一則評價都幫緊下一個帶毛孩出街嘅家長,一齊令香港真正變得寵物友善。",fehdTitle:"2026 食環署狗隻入食肆:牌照名單 vs 真・寵物友善",fehdBody:"食環署計劃已於2026å¹´7月9日生效,約989–1000間狗隻友善食肆可合法帶狗入內。官方名單只代表牌照,唔代表員工真係歡迎毛孩、可入室內、或者接受即場入座。PetWell 認證餐廳會致電確認寵物政策,再用寵主評價同相片補完「去到先知」嘅部分。帶狗去食環署獲批食肆時,一般要守牽繩不超過1.5米、不可上枱、不可接觸餐具、成人全程看管。想對照官方名單,可開「食環署許可餐廳」篩選,或睇我哋整合嘅獲批食肆名單。"},communityReviewsTitle:"點解要留評價?",communityReviewsBody:"PetWell 唔止係名單,而係香港寵主嘅共享地圖。你嘅一則評論——好定唔好——都會幫下一位家長避開中伏餐廳,或者發掘到隱世好去處。可以匿名、可以貼相、可以講真話,全部免費。",districtPage:{indexTitle:"香港18區寵物友善餐廳",indexSubtitle:"按官方18區搵已認證寵物友善餐廳,覆蓋港島、九龍、新界同離島。",indexSeoTitle:"香港18區寵物友善餐廳2026 | 按區搵帶狗食飯・狗隻友善食肆 | PetWell",indexSeoDescription:"按香港18區搵寵物友善餐廳同狗隻友善食肆。PetWell 提供每區已認證餐廳,另可對照2026食環署獲批名單。",indexSeoKeywords:"18區寵物友善餐廳,香港寵物友善餐廳,按區搵餐廳,帶狗食飯,狗隻友善食肆",pageTitle:"{{district}}寵物友善餐廳",subtitle:"搵{{district}}({{region}})已認證可帶寵物用餐嘅 restaurant",seoTitle:"{{district}}寵物友善餐廳2026 | 帶狗食飯好去處 | PetWell",seoDescription:"{{district}}有 {{count}} 間 PetWell 認證寵物友善餐廳。按室內入座、即場入座篩選,同時可參考食環署{{district}}狗隻友善食肆名單。",seoKeywords:"{{district}}寵物友善餐廳,{{district}}帶狗餐廳,{{district}}帶狗食飯,{{region}}
57寵物友善餐廳,狗隻友善食肆",searchIntent:"想搵{{district}}可以帶寵物嘅 restaurant?以下係 PetWell 認證名單。",directQuestion:"{{district}}邊度有寵物友善餐廳?",directAnswer:"{{district}}目前有 {{count}} 間 PetWell 認證餐廳,其中 {{indoorCount}} 間可入室內、{{walkInCount}} 間可即場入座。",faqTitle:"{{district}}寵物友善餐廳常見問題",faq:{q1:"{{district}}有幾多間寵物友善餐廳?",a1:"PetWell 目前收錄 {{count}} 間{{district}}已認證寵物友善餐廳。如數量較少,可參考頁內食環署獲批名單。",q2:"{{district}}邊間餐廳可以帶狗入室內?",a2:"你可以用「可入室內」篩選{{district}}餐廳,或查看每間餐廳嘅寵物政策標籤。"},indexFaq:{q1:"點樣按18區搵寵物友善餐廳?",a1:"揀你所在或想去的18區,即可查看該區 PetWell 認證餐廳同食環署獲批食肆參考。",q2:"18區頁面同主列表有咩分別?",a2:"18區頁面預設只顯示該區餐廳,SEO 同 FAQ 內容針對該區搜尋優化,方便你快速搵到附近選擇。"},statsTitle:"{{district}}有幾多間寵物友善餐廳?",statsBody:"{{district}}目前有 {{count}} 間 PetWell 認證餐廳({{indoorCount}} 間可入室內、{{walkInCount}} 間可即場入座)。",fehdCompare:"PetWell 真・寵物友善餐廳經團隊致電確認政策;食環署名單係獲批「容許狗隻進入」食肆,
57兩者可以互相參考。",hubLink:"查看全港寵物友善餐廳",fehdLink:"食環署 1,000 間獲批名單",allDistricts:"18區完整列表",districtNavTitle:"按18區搵寵物友善餐廳",districtNavDescription:"揀選香港18區,查看各區已認證寵物友善餐廳。",noResults:"{{district}}暫時未有符合條件嘅 PetWell 認證餐廳",noResultsHint:"你可以參考下方食環署獲批名單,或瀏覽鄰近18區。",listAriaLabel:"{{district}}寵物友善餐廳列表"},regionPage:{pageTitle:"{{region}}寵物友善餐廳",subtitle:"搵{{region}}已認證可帶寵物用餐嘅 restaurant",seoTitle:"{{region}}寵物友善餐廳2026 | 帶狗食飯好去處 | PetWell",seoDescription:"{{region}}有 {{count}} 間 PetWell 認證寵物友善餐廳。按室內入座、即場入座篩選,覆蓋{{region}}各區狗隻友善食肆。",seoKeywords:"{{region}}寵物友善餐廳,{{region}}帶狗餐廳,{{region}}帶狗食飯,狗隻友善食肆"},searchPlaceholder:"搜尋餐廳名稱或地址...",filterByRegion:"按地區篩選",filterWalkIn:"可即場入座",filterFehdLicensed:"食環署許可餐廳",filtersLabel:"餐廳篩選",heroEyebrow:"已認證用餐指南",verifiedPanelTitle:"每間餐廳都經 PetWell 認證",verifiedPanelDescription:"我哋會先核實寵物政策,先至會收錄喺呢度 — 出發前就知道可唔可以帶毛孩入內。",resultsCount:"{{count}} 間已認證餐廳",showingCount:"顯示 {{shown}} / {{total}} 間",loadMore:"載入更多",clearFilters:"清除篩選",regions:{all:"全部地區",kowloon:"九龍",hongKong:"香港島",newTerritories:"新界",others:"其他"},loading:"載入中...",error:"載入餐廳資料時發生錯誤",errorSubtitle:"請稍後再試或聯絡客服",noResults:"暫時未有符合條件嘅寵物友善餐廳",noResultsHint:"試下調整搜尋關鍵字或篩選條件。",searchingMore:"正在搜尋更多符合篩選嘅餐廳…",backToList:"返回餐廳列表",petPolicy:"寵物政策",contactInfo:"聯絡資訊",address:"地址",phone:"電話",website:"網站",openingHours:"營業時間",closed:"休息",gallery:"相片",ctaTitle:"去完餐廳?幫手留低你嘅評價!",ctaDescription:"全港唯一寵物友善餐廳評價網,等下一位寵主唔使中伏。可以匿名留言、分享實地相片,講真話都唔驚。",ctaButton:"立即下載 App",detail:{notFound:"餐廳未找到",decisionTitle:"帶毛孩去食飯 · 重點一覽",decisionSubtitle:"出發前先確認寵物政策,避免白跑一趟",callNow:"致電餐廳",getDirections:"導航前往",visitWebsite:"官網",todayHours:"今日營業",viewFullHours:"查看完整營業時間",hideFullHours:"收起營業時間",reviewsTitle:"用家評論",reviewsSubtitle:"其他毛孩家長嘅用餐體驗",planVisit:"實用資訊",noHoursToday:"今日休息或未提供營業時間",nearbyTitle:"同區其他寵物友善餐廳",nearbySubtitle:"距離 {{district}} 3 公里內嘅其他已認證餐廳",nearbySubtitleDefault:"方圓 {{radius}} 公里內嘅其他已認證餐廳",nearbyCount:"{{count}} 間",nearbyEmpty:"附近暫時未有其他已認證寵物友善餐廳",nearbyShowMore:"顯示多 {{count}} 間",nearbyShowLess:"收起",nearbyDistanceM:"{{m}} 米",nearbyDistanceKm:"{{km}} 公里",reviewsEmpty:"暫無評論",businessReply:"店家回覆",suggestEdit:"建議修改",suggestEditPrompt:"餐廳資料有誤?",sections:{overview:"餐廳資料",petPolicy:"寵物政策",reviews:"評論",info:"位置及聯絡"},faq:{q1:"{{name}}可唔可以帶狗?",a1:"{{name}}係 PetWell 認證寵物友善餐廳,目前標示為{{policy}}。",q2:"去 {{name}} 需要預約嗎?",a2:"請查看餐廳頁面嘅入座政策標籤(可即場入座/需要預約),出發前建議致電確認。",q3:"帶狗去 {{name}} 有咩規矩?",a3:"一般要求繫好牽繩、保持禮儀,並遵守餐廳指示。如屬食環署獲批食肆,須遵守不上枱、不接觸餐具等規定。"},businessReplyFrom:"來自「{{placeName}}」的回覆",businessReplyOfficial:"店家官方"}},nm={seoTitle:"寵物過敏及病原檢測預約 | PetWell",seoDescription:"預約專業寵物診斷檢測,包括 IgE 過敏篩查及 PCR 病原檢測,提供臨床相關報告供獸醫跟進。",seoKeywords:"pet test booking,寵物檢測,allergen test,pcr test,petwell payment",structuredDataName:"PetWell 寵物檢測預約",structuredDataSpecialty:"獸醫醫學",badge:"獸醫診斷檢測",title:"寵物檢測服務預約",subtitle:"選擇專業診斷服務,針對過敏調查或病原篩查提交預約資料,由診所跟進。",testPriceNotice:"預約價格:每項 HKD {{price}}",buyerInfoTitle:"預約人資料",buyerInfoDesc:"用於預約確認及診所跟進。",checkoutModalTitle:"完成預約資料",checkoutModalDesc:"你正在預約 {{productName}}。可先登入繼續,或直接填寫下方個人資料。",authChoiceTitle:"已有 PetWell 帳戶?",authChoiceDesc:"你可以先登入繼續,或直接在下方填寫個人資料並使用此電郵繼續。",loginToContinue:"登入後繼續",heroPrimaryCta:"預約 IgE 致敏原測試",heroSecondaryCta:"預約 PCR 病原篩查",heroKeywords:{igeAllergy:"IgE 過敏測試",pcrPathogen:"PCR 病原篩查",rastClass:"RAST 0-3 等級",serumSample:"血清樣本",veterinaryDiagnostics:"獸醫診斷"},keywords:{ige:"IgE",rast:"RAST 0-3",auMl:"AU/mL",serum:"血清",enzymeImmunoblot:"Enzyme immunoblot",pcr:"PCR",respiratory:"呼吸道",gastrointestinal:"腸胃道",zoonotic:"人畜共通病原",pcrTargets:"100+ 項目"},labCardLabel:"獸醫診斷檢測服務",labCardTitle:"寵物過敏 + 病原檢測",labCardDesc:"為獸醫判斷而設:量化結果、配合臨床情況解讀,並提供清晰報告予主人及診所跟進。",stats:{allergens:"致敏原項目",pcrTargets:"PCR 篩查",sample:"血清樣本",rast:"RAST 等級"},valueProps:{quantitativeTitle:"量化檢測",quantitativeDesc:"特異性 IgE 以 AU/mL 呈現,並對應 RAST 0-3 等級,方便理解敏感程度。",clinicalTitle:"臨床相關",clinicalDesc:"適用於皮膚、呼吸道、腸胃不適或疑似過敏/感染個案的進一步評估。",reportTitle:"專業報告",reportDesc:"報告包含樣本編號、樣本類別、檢測方法、結果等級及解讀備註。",workflowTitle:"簡單預約流程",workflowDesc:"選擇檢測、填寫預約資料、網上付款,診所/化驗所即可跟進。"},productSectionBadge:"檢測選項",productSectionTitle:"按毛孩症狀選擇合適檢測",productSectionDesc:"兩項獸醫診斷檢測,分別針對過敏調查及病原篩查。",productMeta:{bestFor:"適合",method:"方法",sample:"樣本",turnaround:"報告重點"},methodology:{badge:"醫學方法",title:"CANINE PRO 過敏報告如何解讀",desc1:"CANINE PRO 過敏報告以血清樣本檢測特異性 IgE 抗體,使用量化 enzyme immunoblot assay。反應強度會經光學掃描及軟件分析,換算成每項致敏原的 IgE 濃度。",desc2:"結果以 AU/mL 顯示,並對應 RAST 0 至 3 級:未有發現、中等、嚴重、極嚴重。項目涵蓋塵蟎及黴菌、植物及花粉、食物、昆蟲及其他致敏原。"},workflow:{step1Title:"選擇檢測服務",step1Desc:"按臨床疑慮選擇 IgE 過敏測試或 PCR 病原篩查。",step2Title:"填寫預約資料",step2Desc:"提供主人聯絡、寵物名稱、診所、備註及預約時間。",step3Title:"完成網上付款",step3Desc:"完成網上付款並提交預約,方便診所後續跟進。",step4Title:"診所/化驗所跟進",step4Desc:"預約記錄會交予營運團隊作後續安排、報告及化
57驗協調。"},medicalDisclaimer:"本服務用於輔助獸醫評估,結果應配合臨床症狀及專業意見解讀,不能單獨作為診斷或治療方案。",faq:{q1:"過敏測試檢測甚麼?",a1:"測試會以血清檢測特異性 IgE 抗體,結果以 AU/mL 及 RAST 0-3 等級呈現。",q2:"甚麼寵物適合做檢測?",a2:"如有疑似過敏、反覆皮膚問題、呼吸道或腸胃症狀,經獸醫評估後可考慮檢測。",q3:"PCR 同過敏測試一樣嗎?",a3:"不一樣。PCR 主要篩查病原基因物質,而 IgE 過敏測試評估身體對致敏原的免疫反應。"},form:{firstName:"名字",firstNamePlaceholder:"例如:Wing",lastName:"姓氏",lastNamePlaceholder:"例如:Chan",email:"電郵",emailPlaceholder:"[email protected]",phone:"電話",phonePlaceholder:"+852 9123 4567",petName:"寵物名稱",petNamePlaceholder:"例如:Cocoa",bookingClinic:"診所",bookingClinicPlaceholder:"請選擇診所",bookingTimeContactPrompt:"付款後,所選診所會直接聯絡你確認預約時間、採樣安排及後續詳情。",bookingTimeContactRecord:"診所將直接聯絡客人安排預約",notes:"備註",notesPlaceholder:"可選填"},clinicInfo:{phone:"電話",address:"地址",hours:"營業時間"},clinics:{fairview:{name:"錦绣動物診所 Fairview Veterinary Clinic",phone:"24718980",address:"新界元朗馬田村201號 201 Ma Tin Tsuen, Yuen Long, NT",hours:"10:00 - 13:00, 15:00 - 19:00"},ivet:{name:"iPet Animal Clinic",phone:"2561 1116",address:"太子基隆街46號地下",hours:"逢星期三、四、五、六及日 11:00 - 20:00"},parkIsland:{name:"珀麗灣獸醫診所 Pets Central (Park Island)",phone:"67383280",address:"香港馬灣珀麗路8號 G/F, 322 Ma Wan Main Street Village North, Ma Wan, NT",hours:"沒有固定應診時間,診所會按個別情況安排並直接聯絡你。"}},products:{allergen:{name:"Feline/Canine PRO 125 - Allergen IgE Allergy Test",shortName:"PRO 125 IgE",description:"一次測試涵蓋 125 項臨床相關致敏原,適合懷疑皮膚、呼吸或腸胃過敏的毛孩。",h1:"環境及蟎蟲致敏原檢測",h2:"花粉及植物致敏原檢測",h3:"食物 + 昆蟲等致敏原覆蓋",bestFor:"過敏調查",method:"量化 enzyme immunoblot assay",sample:"血清樣本",turnaround:"IgE AU/mL + RAST 等級"},pcr:{name:"Feline/Canine 100+ PCR Test",shortName:"100+ PCR",description:"超快速 PCR,覆蓋呼吸道、腸胃道與人畜共通病原篩查,適合進階健康檢測。",h1:"呼吸道與腸胃道綜合篩查",h2:"人畜共通病原項目",h3:"貓犬常見病原多項檢測",bestFor:"病原篩查",method:"PCR 擴增檢測",sample:"診所採集樣本",turnaround:"呼吸道/腸胃道病原 panel"}},priceLabel:"測試價",offer:{label:"會員專屬",title:"早鳥預約優惠",off:"OFF",originalPrice:"原價",todayPrice:"今日價",savings:"今次預約即慳 {{currency}} {{amount}}。"},comingSoon:{badge:"即將開放",title:"PCR 檢測預約即將開放",desc:"我們正在確認下一輪診所檢測時段。待服務時段確認後,將會開放預約及付款。",button:"即將開放"},buyNow:"立即付款預約",processing:"準備付款中...",footnote:"預約價格:{{currency}} {{price}}。",todoNotice:"預約記錄會保存作診所及營運跟進。",toast:{loginRequiredTitle:"請先登入",loginRequiredDesc:"建立付款連結需要先登入 PetWell 帳戶。",missingFieldsTitle:"請填寫必填資料",missingFieldsDesc:"請填寫名字、姓氏、電郵、電話、寵物名稱及診所。",paymentFailedTitle:"建立付款失敗",paymentFailedDesc:"請稍後再試。"}},rm={verifiedTrue:"寵物友善(已驗證)",petWellVerified:"寵物友善認證",fehdLicensed:"香港食環署許可",premiumPartner:"Premium 合作商戶",listingAlertTitle:"注意",listingAlertChip:"非寵物友善",notPetFriendly:"非寵物友善",petEntryPolicy:{walkInOnly:"可即場入座",reservationRequired:"需要預約",both:"可即場或預約"},petAccessArea:{indoorAllowed:"可入室內",outdoorOnly:"只限室外"},import:{title:"餐廳資訊",subtitle:"餐廳類型、價位、設施同評分參考",types:"餐廳類型",cuisines:"菜式",dishStyles:"菜式風格",priceRange:"人均價位",amenitiesTitle:"寵物友善設施",amenities:{waterBowl:"飲水碗",dogMenu:"狗狗餐單",petTreats:"寵物小食",groomingServices:"美容服務",petStore:"寵物用品",sanitationKits:"清潔用品",photoArea:"打卡位",petFirstAidKit:"寵物急救箱",employeePetTraining:"員工寵物培訓",nutritionLabelsProvi
57ded:"營養標籤"}}},im={pageTitle:"香港動物保護組織",subtitle:"支持動物福利 - 捐款、義工、為動物發聲",description:"發掘本地動物保護組織,共同為有需要的動物出一分力",searchPlaceholder:"搜尋組織名稱或簡介...",filterByRegion:"按地區篩選",regions:{all:"全部地區",kowloon:"九龍",hongKong:"香港島",newTerritories:"新界"},noResults:"暫時未有相關組織資料",established:"成立於",activeCampaigns:"個籌款項目",volunteerEvents:"個義工活動",backToList:"返回組織列表",notFound:"找不到此組織",address:"地址",phone:"電話",email:"電郵",website:"網站",mission:"我們的使命",services:"我們提供的服務",donationCampaigns:"籌款項目",donationDescription:"支持我們的籌款項目,為有需要的動物出一分力",progress:"進度",donors:"位捐款者",endDate:"截止日期",donate:"立即捐款",volunteerDescription:"加入我們,親身參與動物福利工作",requirements:"要求",spotsLeft:"個名額",fullBooked:"已滿額",enroll:"報名參加"},am={quickLinks:"快速連結",legal:"法律資訊",explore:"帶毛孩出街",care:"照顧毛孩",community:"社群",company:"PetWell",follow:"追蹤我們",terms:"使用條款及私隱政策",privacy:"私隱政策",copyright:"© 2026 PetWell HK Limited. All rights reserved",tagline:"香港首個一站式寵物健康管理平台",suggestPlace:"建議新增地點",feedback:"意見回報"},sm={suggestTitle:"建議新增地點",suggestDesc:"話俾我哋知未收錄嘅寵物友善地點。",suggestTab:"建議新增",suggestCategory:"地點類型",suggestName:"地點名稱",suggestNamePlaceholder:"輸入地點名稱…",suggestAddressOptional:"地址(可選)",suggestAddressPlaceholder:"街道、地區或地標…",suggestNotesOptional:"補充說明(可選)",suggestNotesPlaceholder:"例如寵物政策、營業時間、網站等…",suggestSubmit:"提交建議",suggestEmptyCta:"搵唔到?建議新增一個地點",successTitle:"已提交",successDesc:"多謝你,我哋會盡快跟進。",suggestSuccessDesc:"多謝你,我哋已收到你嘅建議,會跟進審核。"},lm={learnMore:"了解更多",downloadApp:"立即下載 PetWell",rating:"評分",outOf5:"/5",loading:"載入中...",cancel:"取消"},cm={open247:"24小時營業",mon:"星期一",tue:"星期二",wed:"星期三",thu:"星期四",fri:"星期五",sat:"星期六",sun:"星期日",noInfo:"暫無資料"},dm={title:"寵物主人討論區",subtitle:"分享經驗 · 互相幫助 · 共建人寵共融社會",loading:"載入中...",error:"無法載入討論區內容,請稍後再試",noContent:"暫時沒有討論內容",retry:"重新載入",backToForum:"返回討論區",replies:"留言",noReplies:"暫時沒有留言",postNotFound:"找不到帖文",invalidPostId:"無效的帖文ID",searchPlaceholder:"搜尋帖文...",filterCategory:"分類",filterTag:"標籤",allCategories:"全部分類",allTags:"全部標籤",sortRecent:"最新",sortPopular:"熱門",sortReplies:"最多回覆",tableTitle:"標題",tableAuthor:"作者",tableDate:"日期",tableViews:"瀏覽/回覆",tableLastReply:"最後回覆",showingResults:"顯示 {{count}} 個結果",pagination:{previous:"上一頁",next:"下一頁"},time:{hoursAgo:"小時前",daysAgo:"天前"},forumListCta:{title:"想查看更多討論?",description:"下載 PetWell App,瀏覽更多帖文、發表意見、與其他寵物主人交流互動!",button:"立即下載 PetWell"},postDetailCta:{title:"想發表您的意見?",description:"下載 PetWell App,加入討論、發表留言,與其他寵物主人分享經驗和建議!",button:"立即下載 PetWell"},createPost:{button:"發佈帖文",title:"發佈新帖文",description:"分享您的想法、提出問題,或與社群展開討論",loginRequired:"需要登入",loginRequiredDesc:"請先登入以發佈帖文",titleLabel:"標題",titlePlaceholder:"輸入帖文標題",contentLabel:"內容",contentPlaceholder:"在此輸入您的帖文內容...",tagsLabel:"標籤",tagsPlaceholder:"例如:診所、走失寵物、建議",tagsHint:"用逗號分隔標籤(最多10個標籤)",categoryLabel:"分類",categoryPlaceholder:"選擇分類",locationLabel:"地點",locationPlaceholder:"ä¾
57‹å¦‚:香港島、九龍",characters:"字元",creating:"發佈中...",submit:"發佈帖文",error:"發佈帖文失敗,請稍後再試。",anonymousLabel:"匿名發佈",anonymousHint:"您的身份將被隱藏",editor:{bold:"粗體",underline:"底線",strikethrough:"刪除線",fontSize:"字體大小",small:"小 (12px)",medium:"中 (24px)",large:"大 (36px)",textColor:"文字顏色",insertLink:"插入連結",urlLabel:"網址",urlPlaceholder:"https://example.com",linkTextLabel:"連結文字 (選填)",linkTextPlaceholder:"點擊這裡",alignLeft:"靠左對齊",alignCenter:"置中對齊",alignRight:"靠右對齊"}},askVet:{cta:"問獸醫/護士",feed:"問獸醫/護士",queue:"待回覆",myQuestions:"我的提問",composeTitle:"問獸醫/護士",composeSubtitle:"寫低問題就得。急症請即去診所。",contentPlaceholder:"毛孩點呀?品種、年紀、症狀、幾時開始。有相更好。",addPhoto:"加相片",questionRequired:"請先寫你嘅問題。",visibilityLabel:"邊個睇到",public:"公開",private:"私人",publicHint:"其他人睇到,方便之後參考。",privateHint:"只有你同團隊睇到。",disclaimer:"我明白呢唔係面診、處方或急症服務。",disclaimerRequired:"請先同意免責聲明。",submit:"送出",teamReplyHint:"將以 PetWell 獸醫/護士團隊身份回覆",bannerTitle:"問獸醫/護士",bannerBody:"由 PetWell 獸醫/護士團隊回覆。一般問題通常 24 小時內答,可以公開或私人問。"},sortBy:"排序",sortHot:"為你推薦",untitled:"無標題",desktop:{navLabel:"討論區導覽",discoverLabel:"搜尋與熱門",home:"首頁",post:"發佈",topics:"話題",buzzing:"正熱門",replyPlaceholder:"寫下你的留言",reply:"留言",photo:"相片",clearReplyTo:"取消回覆"},advancedSearch:"進階搜尋",hideAdvancedSearch:"隱藏",showAdvancedSearch:"進階搜尋",dateFrom:"開始日期",dateTo:"結束日期",selectedTags:"已選標籤",clearFilters:"清除篩選",pages:"頁",anonymousUser:"匿名用戶",genericUser:"用戶",anonymous:"匿名",pinned:"置頂",loadingMore:"載入更多...",selectPost:"選擇左側的帖文以查看內容",categories:{DOG:"狗狗",CAT:"貓貓",SMALL_ANIMAL:"小動物",LIFE_SHARING:"生活分享",EVENTS:"活動",ADOPTION:"領養",HEALTH:"健康",GROOMING:"美容",DIET:"飲食",TRAINING:"訓練",BEHAVIOR:"行為問題",PRODUCT_REVIEW:"用品評價",TRADING:"交易",TRAVEL:"旅遊",LODGING:"住宿",LOST_FOUND:"走失協尋",EMERGENCY:"緊急求助"}},um={title:"刪除帳戶",warning:"此操作無法撤銷。刪除帳戶後,您的所有資料將被永久移除。",whatHappens:"刪除帳戶後會發生什麼?",consequence1:"您的個人資料及帳戶資訊將被永久刪除",consequence2:"您的所有寵物健康記錄將被移除",consequence3:"您將無法再使用此電郵地址註冊",consequence4:"此操作無法復原",confirmTitle:"確認刪除",emailLabel:"確認電郵地址",emailPlaceholder:"請輸入您的電郵地址",emailHint:"請輸入您註冊帳戶時使用的電郵地址",typeDelete:"請輸入「刪除」以確認",deletePlaceholder:"刪除",understand:"我明白此操作無法撤銷,並確認要刪除我的帳戶",cancel:"取消",deleteButton:"刪除帳戶",finalWarning:"最後確認",finalWarningMessage:"您確定要永久刪除您的帳戶嗎?此操作無法撤銷。",confirmDelete:"確認刪除",deleting:"刪除中...",success:"帳戶已刪除",successMessage:"您的帳戶已成功刪除。",error:"錯誤",errorMessage:"刪除帳戶時發生錯誤,請稍後再試或聯絡客服。",confirmError:"請輸入「刪除」以確認",checkboxError:"請確認您已了解此操作的後果",emailMismatch:"電郵地址不符,請輸入您註冊時使用的電郵地址"},pm={needsActivation:"此標籤需要啟動",activationDescription:"要查看寵物資料和主人聯絡方式,請下載 PetWell App 並啟動此標籤。",downloadPetWell:"立即下載 PetWell",alreadyActivated:"已啟動?請登入 App 查看",foundLostPet:"您發現了走失的寵物!",thankYouMessage:"感謝您幫助這隻寵物。以下是主人的聯絡資料,請儘快聯絡他們。",age:"年齡",yearsOld:"æ­²",species:"品種",speciesValues:{dog:"狗狗",dogs:"狗狗",cat:"貓咪",cats:"貓咪"},breed:"種類",weight:"體重",birthday:"生日",microchipId:"晶片編號",contactOwner:"聯絡主人",callOwnerNow:"立即致電主人",phoneNotAvailable:"電話號碼不可用",footer:"由 PetWell 提供 · 守護每一隻寵物",notActivated:{title:"寵物尚未啟動",description:"此寵物名牌尚未啟動。立即啟動,幫助保護您的毛孩免於走失。",cta:"立即啟動"}},hm={externalUserFrom:"外部用戶來源:{{source}}",fromGoogle:"Google 評論"},mm={alreadyActivated:{title:"寵物已經啟動",description:"此寵物名牌已經啟動。您可以查看寵物的資料。",cta:"查看寵物資料"}},fm={seo:{title:"下載 PetWell App | 香港寵物健康管理",description:"免費下載 PetWell。香港獸醫診所評價、寵物友善餐廳、健康紀錄與價格提醒,iOS 與 Android 均適用。",keywords:"PetWell App,下載寵物App,香港寵物健康,獸醫診所App,寵物友善餐廳App"},eyebrow:"免費 · iOS 與 Android",title:"香港寵物生活",titleHighlight:"放進口袋。",subtitle:"免費下載,iPhone 同 Android 都用得。",aboutCta:"想了解更多,前往關於我們",subtitle1:"全港首個寵物健康管理平台",subt
57itle2:"一站式照顧您的毛孩健康",primaryIos:"在 App Store 下載",primaryAndroid:"在 Google Play 下載",openStore:"開啟應用商店",scanLabel:"手機掃描下載",scanHint:"用相機對準 QR Code,會開啟對應的 App Store 或 Google Play。",storesLabel:"選擇你的商店",recommended:"建議",appStoreAlt:"在 App Store 下載 PetWell",playStoreAlt:"在 Google Play 下載 PetWell",previewAlt:"PetWell App 介面:診所搜尋、用品格價與寵物友善餐廳",whyEyebrow:"用 App 更好",whyTitle:"網站能睇,App 更跟得貼",reasons:{alerts:{title:"價格與急症提醒",description:"減價、追蹤清單同 24 小時診所資訊,第一時間喺手機收到。"},records:{title:"健康紀錄隨身",description:"針卡、急診、用藥紀錄永久保存,轉醫生都唔使翻箱倒櫃。"},places:{title:"全港場所一搜即到",description:"200+ 診所、1500+ 友善餐廳,地圖、電話、評價一次過。"},free:{title:"完全免費",description:"下載、查評價、記健康紀錄都唔使畀錢。"}},ctaTitle:"限時專屬優惠",ctaDescription:"下載 App 後,可預約免費領取防走失智能名牌。",feature1:"即時定位追蹤功能",feature2:"一鍵聯絡主人",feature3:"終身保固服務",ctaButton:"免費領取防走失名牌",disclaimer:"數量有限,送完即止。",faqTitle:"下載常見問題",faq:{platforms:{question:"支援邊啲手機?",answer:"iPhone 經 App Store、Android 經 Google Play 免費下載。搜尋「PetWell HK」即可。"},needApp:{question:"一定要下載先用到?",answer:"網站都可以搜尋餐廳同診所。App 適合需要推播提醒、健康紀錄同隨身查急症嘅主人。"},desktop:{question:"電腦點樣下載?",answer:"用手機掃描本頁 QR Code,或喺手機打開 App Store / Google Play 搜尋 PetWell HK。"}}},gm={status:{startingSoon:"即將開始",upcoming:"即將舉行",ongoing:"進行中",completed:"已結束",cancelled:"已取消"},featured:"精選活動",featuredBadge:"精選",filters:{allStatuses:"全部狀態"},categories:{ADOPTION:"領養活動",MARKET:"寵物市集",EXPO:"寵物展覽",WORKSHOP:"工作坊 / 課程",CHARITY:"慈善活動",MEETUP:"寵物聚會",PET_FRIENDLY:"寵物友善活動",OTHER:"其他活動"},detail:{invalidId:"活動 ID 無效",notFound:"找不到活動",loadFailed:"載入活動失敗",backToEvents:"返回活動列表",defaultSeoDescription:"香港寵物活動資訊",unknownOrganizer:"主辦單位未提供",officialInfo:"官方資訊",date:"日期",location:"地點",organizer:"主辦單位",price:"價格",notProvided:"未提供",free:"免費",aboutEvent:"活動簡介",remark:"備註",allFields:"活動資料",category:"分類",statusLabel:"狀態",organizerEmail:"主辦單位電郵",dateTime:"開始時間",deadline:"截止 / 結束時間",openTime:"開放時間",closeTime:"結束時間",address:"地址",district:"地區",capacity:"名額",attendees:"已報名",paymentRequired:"需要付款",redirection:"外部連結",redirectedUrl:"官方 / 報名連結",photoCount:"相片數量",createdAt:"建立時間",updatedAt:"更新時間",unlimited:"無限制",yes:"是",no:"否",photos:"活動相片",endDate:"結束時間",hours:"開放時段",where:"位置",availability:"名額狀態",spotsLeft:"尚餘 {{count}} 個名額",openOfficialLink:"前往官方 / 報名頁",noOfficialLink:"未提供官方連結",quickInfo:"快速資訊",hasOfficialLink:"已提供官方連結",hasI18n:"提供中英文內容"}},ym={title:"管理表格",redirecting:"正在跳轉到 Google 表格..."},vm={ariaLabel:"防走失智能名牌推廣",badge:"免費",title:"防走失智能名牌",subtitle:"好似八達通一嘟即讀,協助毛孩更快回家",progressLabel:"登記進度",cta:"立即登記"},wm={eyebrow:"限量免費",title:"免費拎 PETWELL防走失名牌",tagline:"好似八達通 · 一嘟即show你寵物專屬網站",time:"只需1 分鐘就搞掂",urgency:"名額有限,先到先得。",cta:"立即免費領取",imageAlt:"PetWell 防走失名牌 Paws Port 宣傳圖"},bm={title:"毛孩沉浸式台灣中秋祭",description:"2026年9月25–27日於觀塘海濱 AquaBeat,免費入場,歡迎帶毛孩。左右滑動睇活動詳情。",page1Alt:"毛孩沉浸式台灣中秋祭宣傳海報",page2Alt:"毛孩沉浸式台灣中秋祭活動詳情"},Pm={allProducts:"所有商品",cart:"購物車",backToList:"返回商品列表",productNotFound:"找不到商品",productNotFoundDesc:"此商品可能不存在或已下架",customizable:"可客製化",selectOption:"選擇規格:",uploadPhoto:"上傳寵物照片:",chooseFile:"選擇檔案",noFileChosen:"尚未選擇檔案",uploadedPreview:"已上傳的寵物照片預覽:",selected:"已選擇:",dimensions:"尺寸:",dimensionsLabel:"尺寸",material:"材質:",selectOptionForPrice:"(請選擇規格查看價格)",quantity:"數量",quantityLabel:"數量:",addToCart:"加入購物車",buyNow:"立即購買",productDetails:"商品詳情",shippingPayment:"送貨及付款方式",shippingInfo:"香港免費送貨(滿HK$300)",paymentMethods:"付款方式:PayMe / 銀行轉帳 / FPS",processingTime:"處理時間:3-5個工作天",selectOptionError:"請選擇規格",selectOptionErrorDesc:"請先選擇產品規格後再加入購物車",uploadPhotoError:"請上傳照片",uploadPhotoErrorDesc:"此產品需要上傳寵物照片",addedToCart:"已加入購物車",addedToCartDesc:"已成功加入購物車",priceViewHint:"請選擇款式以查看總價",items:"件",specs:{redPocketPa
57per:"200g 啞膜銅版紙",petBackpackMaterial:"毛絨",rectangle:"長方形",diamond:"菱形",rectangleSpecs:"10.5 × 29.7 cm · 128g 光粉紙",diamondSpecs:"21 × 21 cm · 128g 光粉紙"},shippingInfoDetails:{freeShippingThreshold:"滿 HK$200 免運",sfExpress:"順豐 +$30",regularMail:"平郵 +$15",paymentMethods:"付款:FPS / 銀行轉帳 / PayMe / 支付寶",emailNotification:"訂單確認後以電郵通知付款詳情",shippingDeadline:"所有商品於 2 月 12 日前寄出",imageDisclaimer:"圖片只供參考,一切以實物為準",inquiry:"查詢:",whatsapp:"WhatsApp"},priceViewDetails:"價格請查看詳情",categories:{accessory:"配件",decoration:"裝飾",toy:"玩具",gift:"禮品"},discountBanner:{title:"PetWell 會員專享 10% 折扣!",description:"使用 PetWell App 註冊用戶的電郵地址結帳,即可自動享受 10% 折扣優惠",cta:"立即下載 App"}},xm={title:"填寫訂單資料",name:"姓名",namePlaceholder:"請輸入您的姓名",email:"電子郵件",emailPlaceholder:"[email protected]",phone:"手機號碼",phonePlaceholder:"12345678",phoneHint:"請輸入8位數字的手機號碼",shippingAddress:"送貨地址",shippingAddressPlaceholder:"請輸入完整的送貨地址",remark:"備註(選填)",remarkPlaceholder:"如有特殊要求或備註,請在此填寫",submit:"前往付款",backToCart:"返回購物車",emptyCart:"購物車是空的",emptyCartDesc:"請先選擇商品後再結帳",browseProducts:"瀏覽商品",orderSummary:"訂單摘要",total:"總計",deliveryOption:"配送方式",sfExpress:"順豐 (SF Express)",regularMail:"平郵 (Regular Mail)",freeShipping:"免費",freeShippingThreshold:"滿 HK$200 免運費",shippingFee:"運費",contactInfoReminder:"重要提示",contactInfoReminderDesc:"為確保我們能順利與您聯絡,請務必準確填寫電郵及電話等聯絡資料。",nameError:"請輸入姓名",emailError:"請輸入電子郵件",emailInvalid:"請輸入有效的電子郵件地址",phoneError:"請輸入手機號碼",phoneInvalid:"請輸入有效的手機號碼(8位數字)",shippingAddressError:"請輸入送貨地址",validationError:"請檢查輸入",validationErrorDesc:"請填寫所有必填欄位",subtotal:"小計",discount:"折扣",memberDiscount:"會員折扣 {{percent}}%",discountApplied:"已應用 {{percent}}% 會員折扣!",discountInfo:"使用 PetWell 用戶的電郵地址可享 10% 折扣。",downloadAppLink:"立即下載 PetWell App"},Sm={title:"上傳付款證明",backToCheckout:"返回結帳",paymentMethod:"付款方式",paymentMethodDesc:"請完成付款後,上傳付款截圖作為證明。我們會在確認付款後處理您的訂單。",paymentInfo:"付款資訊:",paymentInfoDetails:"銀行轉帳 / 轉數快 / 其他付款方式",paymentInfoNote:"(付款詳情將在提交訂單後透過電郵發送)",paymentProof:"付款證明截圖",uploadPaymentProof:"點擊上傳付款截圖",uploadPaymentProofHint:"支援 JPG、PNG 格式,檔案大小不超過 5MB",paymentProofPreview:"付款證明預覽",submitOrder:"提交訂單",processing:"處理中...",orderSummary:"訂單摘要",name:"姓名",email:"電子郵件",phone:"手機號碼",shippingAddress:"送貨地址",deliveryMethod:"配送方式",sfExpress:"順豐 (SF Express)",regularMail:"平郵 (Regular Mail)",shippingFee:"運費",freeShipping:"免費",remark:"備註",total:"總計",uploadPaymentProofError:"請上傳付款證明",uploadPaymentProofErrorDesc:"請上傳付款截圖後再提交訂單",fileTooLarge:"檔案太大",fileTooLargeDesc:"請上傳小於 5MB 的圖片",invali
57dFileType:"檔案格式錯誤",invalidFileTypeDesc:"請上傳圖片檔案",invalidFileTypeDetailed:"不支援的檔案格式:{{fileType}}。請上傳 JPG、PNG、WEBP 或 HEIC 格式的圖片檔案。",supportedFormats:"支援的格式:JPG、PNG、WEBP、HEIC",unknownFormat:"未知格式",orderSuccess:"訂單提交成功!",orderSuccessDesc:"我們已收到您的訂單,將盡快處理。",orderError:"提交失敗",orderErrorDesc:"訂單提交時發生錯誤,請稍後再試或聯絡我們。",cannotContinue:"無法繼續",cannotContinueDesc:"請先完成訂單資料填寫",petPhotoUpload:{title:"上傳寵物照片",description:"您購買的商品包含可客製化產品,請上傳寵物照片以完成訂單。",uploadNow:"立即上傳",uploadLater:"稍後上傳",uploadLaterDesc:"如選擇「稍後上載」,我們會透過您提供的聯絡方式與您聯繫,並邀請您上載寵物照片。",uploadNowDesc:"請為每個可客製化產品上傳寵物照片",noCustomizableProducts:"您的訂單中沒有可客製化產品,無需上傳寵物照片。",missingPhotos:"請為以下產品上傳照片: {{products}}",changeMind:"更改選擇",edit:"編輯",reset:"重置",resetSuccess:"已重置",resetSuccessDesc:"已移除照片,請重新上傳",uploadPhoto:"上傳照片",changePhoto:"更換照片"},productImageEditor:{title:"編輯產品設計",uploadPhoto:"上傳照片",processing:"處理中",processingDesc:"AI 正在處理,需要一些時間,請耐心等候,請勿離開頁面",processingText:"處理中,請稍候...",waitReminder:"⏱️ AI 處理需時,請耐心等候,請勿離開頁面",addDecoration:"添加賀年裝飾",confirm:"確認",confirmDesign:"確認設計",cancel:"取消",uploadHint:"🤖 AI 自動偵測寵物頭部,可拖動調整位置和大小",photoGuidance:"📷 請上傳清晰的寵物照片,以便 AI 準確偵測。如有問題,歡迎",whatsappUs:"WhatsApp 聯絡我們",aiMode:"",front:"正面",back:"背面",emptyState:"上傳寵物照片開始設計",instructions:{click:"",resize:"",rotate:"",scale:"",multiple:""},controls:{rotateLeft:"向左旋轉",rotateRight:"向右旋轉",zoomIn:"放大",zoomOut:"縮小",delete:"刪除"},viewControls:{locked:"鎖定",unlocked:"拖曳",lockTitle:"解鎖拖曳移動",unlockTitle:"鎖定拖曳移動",altDragTip:"Alt+拖曳移動"},longProcessing:{title:"處理時間較長",description:"上傳的照片可能較大,需要更多時間處理,請耐心等候..."},error:{title:"錯誤",generic:"AI 偵測失敗,請稍後再試",timeout:"AI 處理超時,請嘗試上傳較小的圖片或稍後再試",memory:"AI 處理記憶體不足,請嘗試上傳較小的圖片或稍後再試",server:"AI 服務暫時無法使用,請嘗試上傳較小的圖片或稍後再試",network:"網路連線錯誤,請檢查您的網路連線後再試"}},uploadPayment:{title:"訂單詳情及上傳",description:"查看您的訂單詳情並上傳付款證明或客製化商品圖片。",loading:"載入訂單資料中...",orderNotFound:"訂單不存在",orderNotFoundDesc:"找不到此訂單,請確認訂單編號是否正確。",alreadyUploaded:"付款證明已上傳",alreadyUploadedTitle:"付款證明已上傳",alreadyUploadedDesc:"此訂單的付款證明已經上傳。如需重新上傳,請聯絡我們。",contactWhatsApp:"聯絡 WhatsApp {{number}}",backToProducts:"返回商品頁面",orderId:"訂單編號",customerName:"客戶姓名",customerEmail:"客戶電郵",customerPhone:"客戶電話",shippingAddress:"運送地址",deliveryOption:"運送方式",shippingFee:"運費",totalPrice:"總金額",orderDate:"訂單日期",orderItems:"訂單商品",noItems:"找不到相關商品",customProduct:"客製化商品",uploadCustomProduct:"上傳客製化商品圖片",customProductUploaded:"已上傳客製化商品圖片",uploadCustomProductDesc:"為此商品上傳您的客製化圖片。您可以使用 AI 頭部偵測或手動上傳。",noCustomImage:"尚未上傳客製化圖片",uploading:"上傳中...",submit:"提交付款證明",uploadCustomImage:"上傳客製化圖片",updateCustomImage:"更新客è£
57½åŒ–圖片",customImageSuccess:"客製化圖片上傳成功!",customImageSuccessDesc:"您的客製化商品圖片已成功上傳。",customImageError:"上傳失敗",customImageErrorDesc:"上傳客製化圖片時發生錯誤,請稍後再試。",success:"付款證明上傳成功!",successDesc:"您的付款證明已成功上傳,我們將盡快處理您的訂單。",error:"上傳失敗",errorDesc:"上傳付款證明時發生錯誤,請稍後再試或聯絡我們。",orderDetails:"訂單詳情",contactInfo:"聯絡資料",needHelp:"需要協助?",contactUsDesc:"如對訂單有任何問題,請透過 WhatsApp 聯絡我們。"}},Tm={emptyCart:"購物車是空的",emptyCartDesc:"快去選購您喜歡的商品吧!",browseProducts:"瀏覽商品",orderConfirmation:"訂單確認",orderConfirmationDesc:"請確認您的訂單內容,確認無誤後前往結帳",orderItems:"訂單商品",itemsCount:"項商品",spec:"規格:",customImageUploaded:"已上傳客製化照片",removed:"已移除",removedDesc:"商品已從購物車移除",clearCart:"清空購物車",cleared:"已清空",clearedDesc:"購物車已清空",orderSummary:"訂單摘要",totalItems:"商品總數",itemsUnit:"ä»¶",total:"總計",proceedToCheckout:"前往結帳",continueShopping:"繼續購物",shippingInfo:"• 滿 HK$200 免運費<br />• 順豐速運 +HK$30 | 平郵 +HK$15",freeShippingPrompt:"再買 HK${{amount}} 即可享免運費!",freeShippingQualified:"您已符合免運費資格!"},Am={title:"終極寵物配對:毛孩、羽毛定鱗片?",intro:"養啱寵物唔係淨係睇樣咁簡單,要睇下佢哋嘅生活模式啱唔啱你。由好精力旺盛嘅雀仔,到靜靜地跳嚟跳去嘅兔仔,即刻嚟睇下邊種寵物最啱你!答埋呢5條問題就知啦!",question:"問題",of:"共",restart:"再玩多次",outcomes:{dog:{title:"你啱養狗!",description:"你好active,又有好多愛心!你想要個好拍檔陪你出街、一見到你就好興奮咁歡迎你,仲會融入你嘅日常生活。你唔介意少少嘈或者污糟。"},cat:{title:"你啱養貓!",description:"你想要個又親密又獨立嘅伴侶。你鍾意啲唔使成日照住、可以融入你現有生活嘅寵物。你鍾意靜靜地嘅夜晚,同埋喺梳化度暖笠笠咁hea。"},bird:{title:"你啱養雀仔!",description:"你好聰明、好social,又可能有啲與別不同!你唔介意嘈(其實你可能仲鍾意聽佢哋唱歌或者講嘢),你想要隻醒目又互動性強嘅寵物。你唔介意執下啲種子同羽毛。"},rabbit:{title:"你啱養兔仔!",description:"你想養啲比狗仔安靜soft啲,但又比倉鼠更加互動嘅動物。你有空間畀佢哋跳跳下,又唔介意執好啲電線。你鍾意溫柔、愛social、食素嘅朋友仔。"},reptile:{title:"你啱養爬蟲類或者魚!",description:"你鍾意低壓力、用嚟睇嘅寵物。你可能有敏感症,又或者你就係鍾意靜靜哋嘅屋企。你enjoy打理個魚缸或者飼養箱,欣賞啲唔使成日摸嘅寵物。"}},questions:{q1:{question:"講下聲浪先。你頂唔頂到嘈?",a:"我唔介意狗吠或者好多聲;屋企靜晒好悶㗎!",b:"我鍾意靜啲,偶爾喵喵聲或者呼嚕聲都ok。",c:"我鍾意好熱鬧、吹口哨、甚至大聲啲都得——幾好玩!",d:"我寧願靜啲,最多聽到佢哋輕輕地咬嘢食。",e:"我想完全無聲,一啲聲都唔好有。"},q2:{question:"你有幾多空間畀寵物?",a:"我有後花園或者可以帶佢去公園,好多位。",b:"我間屋/apartment就係佢哋嘅地盤,周圍行得。",c:"我有位擺個大籠,夠空間畀佢哋安全咁飛。",d:"我有個指定嘅圍欄位或者一間房畀佢哋跳。",e:"我有個穩陣嘅枱或者架擺魚缸/飼養箱,但地方唔算多。"},q3:{question:"你接唔接受到咩「污糟嘢」?",a:"污糟腳印、甩毛、口水。",b:"貓砂盆同埋間唔中抓爛啲傢俬。",c:"種子、殼、羽毛周圍飛。",d:"乾草...成堆乾草。同埋日日清理便盆。",e:"一個星期清一次青苔或者換水/墊料。"},q4:{question:"你想點同寵物玩?",a:"摔跤、跑步、玩到好癲咁。",b:"睇電視時摸下佢,或者用laser pointer玩下。",c:"教佢做技巧、吹歌仔、或者畀佢企喺膊頭。",d:"坐低陪佢、畀零食佢食。",e:"靜靜地睇住佢游水或者行;唔使掂。"},q5:{question:"如果你出咗街8個鐘,寵物會做緊乜?",a:"喺門口等我(或者搵人遛佢)。",b:"喺陽光底下瞓覺,完全無所謂。",c:"喺籠度玩玩具,可能聽ç
57·Šæˆ‘開住嘅收音機。",d:"喺兔窩或者圍欄度瞓,有堆乾草陪住。",e:"游水或者喺熱燈底下曬。"}}},Em={learnMore:"洽談媒體合作",hero:{badge:"商業合作 · 數據驅動",title:"觸達香港寵物主人",subtitle:"香港首個 AI 賦能寵物健康科技平台 — 以真實數據驅動媒體推廣與商戶合作,曾獲主流媒體報導,App Store 生活類 Top 9。",trust:{media:"ViuTV · Now TV · AM730 · Yahoo 報導",appStore:"App Store Top 9",platform:"AI · 數據驗證"},eventsCta:"前往活動網站",kolCaption:"KOL 合作案例",kolVisualLabel:"KOL 合作寵物內容示例",showcaseHint:"移動滑鼠探索服務 · 移上圖片查看賣點"},sections:{marketing:{eyebrow:"宣傳推廣",title:"多渠道媒體推廣",subtitle:"由官方渠道到 KOL 合作,每項服務均有可量化的觸及數據。"},platform:{eyebrow:"平台刊登",title:"在 PetWell 上架你的服務",subtitle:"活動、餐廳、店舖價格 — 經核實後發佈,直接觸達全港寵物主人。"}},audiences:{intro:{title:"我們提供的服務",subtitle:"選擇你的合作方向,了解適合的服務內容"},viewMore:"查看更多",enterprise:{eyebrow:"品牌 · 大型活動",title:"媒體推廣",subtitle:"網站、App、Instagram、KOL 合作及活動策劃。",cardTagline:"多渠道曝光、KOL 與活動策劃,放大品牌聲量",imageAlt:"PetWell 寵物活動現場",cta:"洽談媒體合作"},smallBusiness:{eyebrow:"小型商戶",title:"平台刊登",subtitle:"刊登活動、餐廳或店舖價格,免費觸達全港寵物主人。",cardTagline:"免費刊登、自行更新,直接觸達全港寵主",imageAlt:"商戶於 PetWell 活動現場接觸寵物主人",cta:"洽談媒體合作"}},gallery:{eyebrow:"合作案例",title:"近期活動與 KOL 合作",subtitle:"商場快閃、品牌聯乘、KOL 試用與活動現場 — 真實合作紀錄。",imageCount:"{{count}} 張合作素材",viewHint:"滑鼠移上可暫停 · 點擊圖片放大瀏覽",openImage:"查看第 {{index}} 張合作案例",lightboxTitle:"合作案例 {{current}} / {{total}}",prev:"上一張",next:"下一張"},channels:{websiteAds:{title:"網站廣告",summary:"於 PetWell 網站及 SEO 博客投放橫幅或專題內容,觸及搜尋寵物資訊的用戶。",imageAlt:"PetWell 網站平台介面",kpis:{a:{value:"3,000",label:"日均瀏覽"},b:{value:"14,700+",label:"單日高峰"},c:{value:"SEO",label:"博客自然流量"}}}
57,appAds:{title:"App 廣告",summary:"橫幅廣告、推播通知及活動專區,直達已認證寵主。",imageAlt:"PetWell App 活動頁面",kpis:{a:{value:"7,500+",label:"認證用戶"},b:{value:"Top 9",label:"生活類 App 排名"},c:{value:"Push",label:"精準推播"}}},igAds:{title:"Instagram 推廣",summary:"由 PetWell 團隊製作及發佈 Post、Story、Reel,接觸寵物社群。",imageAlt:"PetWell Instagram Reels 內容",kpis:{a:{value:"4,000+",label:"IG 追蹤"},b:{value:"10%+",label:"平均互動率"},c:{value:"全格式",label:"Post / Story / Reel"}}},edm:{title:"電郵直銷 EDM",summary:"向已驗證電郵用戶發送活動邀請,不依賴社交媒體算法。",imageAlt:"PetWell 社群內容範例",kpis:{a:{value:"3,000+",label:"驗證電郵"},b:{value:"100%",label:"寵物相關用戶"},c:{value:"必達",label:"直達收件箱"}}},kol:{title:"KOL 合作推廣",summary:"連結 80+ 香港寵物 KOL — 由產品試用到活動打卡,以真實寵物帳號為品牌帶來口碑與曝光。",imageAlt:"PetWell 品牌合作禮品",kpis:{a:{value:"80+",label:"KOL 夥伴"},b:{value:"~60K",label:"Reels 觀看"},c:{value:"精準",label:"寵物帳號受眾"}}},eventPlanning:{title:"活動策劃及現場服務",summary:"市集、快閃、商場活動 — 由宣傳到現場攝影、設施顧問一站式支援。",imageAlt:"寵物活動現場",kpis:{a:{value:"全渠道",label:"線上線下同步"},b:{value:"現場",label:"攝影及錄影"},c:{value:"AI",label:"短片製作"}}},listEvent:{title:"刊登活動",summary:"活動上架至 PetWell 活動專區,支援 App 內報名及會員優惠。",imageAlt:"PetWell App 活動列表",kpis:{a:{value:"App",label:"內建報名"},b:{value:"全港",label:"活動曝光"},c:{value:"會員",label:"專屬折扣"}}},listRestaurant:{title:"加入餐廳",summary:"寵物友善餐廳經團隊電話確認後刊登,吸引帶狗用餐客人。",imageAlt:"寵物友善餐廳推廣內容",kpis:{a:{value:"1,500+",label:"平台餐廳"},b:{value:"18區",label:"覆蓋全港"},c:{value:"核實",label:"團隊確認"}}},updatePrices:{title:"更新店舖價格",summary:"認證商家可隨時自助更新產品價格及特價。",imageAlt:"",kpis:{a:{value:"即時",label:"價格更新"},b:{value:"Push",label:"特價通知"},c:{value:"免費",label:"商家登記"}}},openAccount:{title:"開設商家帳戶",summary:"申請成為認證夥伴,管理店舖資料並獲得「已認證」標記。",imageAlt:"",kpis:{a:{value:"認證",label:"信任標記"},b:{value:"自助",label:"後台管理"},c:{value:"曝光",label:"平台推薦"}}}},results:{eyebrow:"平台數據",title:"平台成效數據",subtitle:"來自我們的日常營運。",groups:{reach:{title:"平台觸及",subtitle:"多渠道覆蓋香港寵物主人"},engagement:{title:"互動數據",subtitle:"社群內容的真實互動表現"},scale:{title:"合作規模",subtitle:"夥伴網絡與合作深度"}},appUsers:{value:"7,500+",label:"認證 App 用戶"},igFollowers:{value:"4,000+",label:"IG 追蹤者"},dailyViews:{value:"3,000",label:"網站日均瀏覽"},kolPartners:{value:"80+",label:"KOL 合作夥伴"},peakViews:{value:"14,700+",label:"單日高峰瀏覽"},igEngagement:{value:"10%+",label:"IG 平均互動率"},reelsViews:{value:"60K+",label:"Reels 觀看"},restaurants:{value:"1,500+",label:"平台餐廳"},appStoreTop:{value:"Top 9",label:"生活類下載排名"}},trust:{eyebrow:"媒體報導",subtitle:"曾獲 ViuTV、Now TV、AM730、Yahoo、星島日報等主流媒體報導"},partnership:{highlight:{title:"成為 PetWell 認證合作夥伴",desc:"適合寵物店、品牌或長期合作商家 — 自行管理價格,獲得平台信任背書。",item1:"自助更新產品價格及特價",item2:"獲得「已認證」標記",item3:"特價推送已追蹤用戶",cta:"洽談媒體合作",asideLabel:"適合你嗎?",asideTitle:"如果你是寵物店或品牌",asideDesc:"免費登記,自行更新價格,直接觸達全港寵物主人。點擊下方按鈕查看詳情及申請。"}},seo:{title:"其他服務 | PetWell 廣告合作與平台夥伴計劃",description:"PetWell 提供商業合作服務:網站及 App 廣告、Instagram 推廣、活動策劃,以及刊登活動、加入餐廳、更新價格與開設商家帳戶ã€
57‚",keywords:"PetWell廣告,寵物App廣告,香港寵物活動策劃,PetWell合作,商家合作,寵物友善餐廳刊登",structuredName:"PetWell 其他服務"}},km={sendMessage:"發送訊息",submitting:"提交中...",faqTitle:"關於 PetWell 常見問題",directAnswer:{question:"香港有咩寵物App推薦?",answer:"PetWell係香港首個一站式寵物健康管理App,免費提供獸醫診所評價比較、寵物友善餐廳推薦、寵物活動資訊。用戶可以瀏覽全港200+間獸醫診所嘅真實評價,搵到最適合毛孩嘅服務。"},media:{eyebrow:"媒體報導",ariaLabel:"曾報導 PetWell 的媒體及機構"},mission:{eyebrow:"我們的故事",title:"點解有 PetWell",paragraph1:"在養寵物期間,PetWell 發現現時香港動物界充滿不同種類的問題,其最為嚴重的便是 – 低透明度。而寵物是我們的家人,好朋友,我們有責任為牠們提供最好的服務。",paragraph2:"可是現時主人並沒有平台幫助集中收集獸醫/美容/行為矯正等等評價,讓寵物的生命安全落在第三方,就如賭博一樣,下一秒,愛寵的生命便斷送。我們希望透過 PetWell,不單讓寵物主人不再感到無助和迷茫,並且簡化照顧寵物的流程,從而使寵物主人能夠更輕鬆地照顧他們的寵物。我們相信,有你們的支持,PetWell將能夠為寵物行業帶來積極的影響和改變,讓更多的毛小孩和主人能夠共同享受更美好的生活。"},contact:{title:"聯絡我們",description:"如資料有誤或需要更新,請於下面直接將您的問題或意見留下,完成後請提交表格,我們會盡快回覆你。"},faq:{q1:"PetWell App係咩嚟?有咩功能?",a1:"PetWell係香港首個一站式寵物健康管理App,提供獸醫診所評價比較、寵物友善餐廳推薦、寵物活動資訊、健康紀錄管理等功能。完全免費下載使用。",q2:"點樣搵到好嘅獸醫診所?",a2:"喺PetWell App入面,你可以瀏覽全港200+間獸醫診所嘅真實用戶評價、收費參考、服務項目,仲可以篩選24小時急症獸醫,幫你搵到最適合毛孩嘅獸醫。",q3:"香港邊度有寵物友善餐廳?",a3:"PetWell收錄1500+間經認證嘅寵物友善餐廳,分佈港島、九龍、新界各區。每間都經PetWell團隊致電確認可以帶寵物入內,仲有埋室內/室外、Walk-in/預約等資訊。",q4:"有咩寵物活動適合帶狗去?",a4:"PetWell定期更新香港各區嘅寵物活動資訊,包括寵物市集、寵物派對、狗狗嘉年華、寵物友善商場活動等。你可以喺App入面查看最新活動,幫毛孩安排周末好節目!"},form:{firstName:"名字 *",firstNamePlaceholder:"請輸入名字",firstNameRequired:"請輸入名字",lastName:"姓氏 *",lastNamePlaceholder:"請輸入姓氏",lastNameRequired:"請輸入姓氏",email:"電郵 *",emailPlaceholder:"[email protected]",emailInvalid:"請輸入有效的電郵地址",phone:"聯絡電話 *",phonePlaceholder:"請輸入聯絡電話",phoneRequired:"請輸入聯絡電話",message:"評論/訊息 *",messagePlaceholder:"請輸入您的訊息",messageRequired:"請輸入訊息",privacyLabel:"我確認我已知悉所有向 PetWell HK 提交的個人資料將會根據 PetWell HK 隱私聲明所述般使用。*",privacyRequired:"請確認您已知悉私隱聲明",successTitle:"訊息已成功提交",successDescription:"我們會盡快回覆您的查詢。",errorTitle:"提交失敗",errorDescription:"請稍後再試或直接聯絡我們。"},seo:{title:"關於PetWell | 香港寵物健康管理App | 聯絡我們",description:"PetWell係香港首個一站式寵物健康管理App。我哋嘅使命係提高寵物行業透明度,幫助主人更好照顧毛孩。歡迎聯絡我們。",keywords:"PetWell,香港寵物App,寵物健康管理,寵物行業透明度,關於PetWell,聯絡PetWell",structuredName:"關於 PetWell",structuredDescription:"香港首個一站式寵物健康管理App",orgDescription:"提高寵物行業透明度,幫助主人更好照顧毛孩"}},Cm={label:"聯絡我們",close:"關閉"},Nm={seo:{title:"PetWell HK | 香港寵物健康App | 獸醫診所、寵物友善餐廳、寵物論壇",description:"PetWell 香港首個一站式寵物健康App。全港獸醫診所評價、寵物友善餐廳、寵物美容與寄養、寵物活動及論壇。免費下載。",keywords:"PetWell,寵物香港,寵物健康App,獸醫診所評價,寵物友善餐廳,狗隻友善食肆,帶狗食飯,寵物美容,寵物寄養,寵物論壇,寵物活動",structuredName:"PetWell HK - 寵物香港首選平台",structuredDescription:"PetWell HK 香港首個一站式寵物健康App。獸醫診所評價、寵物友善餐廳、寵物美容寄養、寵物活動及論壇。"}},Rm={back:"返回",email:"電郵",emailPlaceholder:"[email protected]",emailInvalid:"請輸入有效的電子郵件地址",submit:"提交",changeEmail:"更改電郵",verifyEmail:"驗證電郵",verificationCode:"驗證碼",noRecieveCode:"沒有收到驗證碼?",wait:"等待",getNewCode:"秒後可重新發送",resendCode:"重新發送驗證碼",fillConfirmationCode:"請輸入驗證碼",unknownError:"發生未知錯誤",failedToResendCode:"重新發送驗證碼失敗",login:"登入",logout:"登出",welcomeBack:"歡迎使用 PetWell",enterYourEmailToContinue:"輸入電郵以登入或建立帳戶",orContinueWith:"或使用以下方式登入",continueWithGoogle:"使用 Google 繼續",continueWithApple:"使用 Apple 繼續",redirectingToProvider:"正在跳轉...",getCode:"使用電郵繼續",otpSentTo:"我們已將驗證碼發送至",otpExplanation:"已使用 Google 或 Apple 註冊?請使用原本的登å
57…¥æ–¹å¼ã€‚",verifyAndLogin:"驗證並登入",verifying:"驗證中...",finishingSocialLogin:"正在完成登入",socialLoginFailed:"社交登入失敗,請再試一次。",returnHome:"返回首頁",completeProfile:"完成帳戶資料",completeProfileDesc:"請填寫以下資料以完成建立帳戶",profileFormHint:"請填寫真實資料。香港電話會固定加上 +852,而體重會以 kg 記錄。",firstName:"名字",firstNamePlaceholder:"例如:小明",firstNameRequired:"請輸入名字",lastName:"姓氏",lastNamePlaceholder:"例如:陳",lastNameRequired:"請輸入姓氏",phone:"電話號碼",phonePlaceholder:"12345678",phoneHint:"請輸入 8 位香港電話號碼,系統會自動加上 +852。",phoneInvalid:"請輸入有效的 8 位香港電話號碼",weight:"體重",weightPlaceholder:"例如:60",weightHint:"請輸入以公斤(kg)為單位的體重。",weightInvalid:"請輸入有效的 kg 體重",password:"建立密碼",loginPassword:"密碼",passwordPlaceholder:"請輸入密碼",passwordRequired:"請輸入密碼",passwordHint:"最少 8 個字元,並包含英文字母及數字。",passwordInvalid:"密碼必須最少 8 個字元,並同時包含英文字母及數字",invalidCredentials:"電郵或密碼錯誤,請重新輸入。",enterPasswordToContinue:"此電郵已註冊,請輸入密碼登入",forgotPassword:"忘記密碼?",confirmPassword:"確認密碼",confirmPasswordPlaceholder:"請再次輸入密碼",passwordsDoNotMatch:"兩次輸入的密碼不一致",creatingAccount:"建立帳戶中...",completeSignup:"建立帳戶",continueBtn:"繼續",skipBtn:"稍後再說",tooManyRequests:"請求過多。請稍候幾分鐘。",accountLocked:"帳戶暫時被鎖定",accountTemporarilyLocked:"帳戶暫時被鎖定。請稍後再試。",failedToLogin:"登入失敗",setNewPassword:"設定新密碼",newPasswordRequiredDesc:"此帳戶需要設定新密碼才能完成登入。",savingPassword:"儲存中..."},Im={signInMethodHint:"請使用您註冊時的登入方式。電郵/密碼與 Google 在連結前視為不同帳戶。",socialOnlyGoogle:"此帳戶使用 Google 登入,請點擊「使用 Google 繼續」。",socialOnlyApple:"此帳戶使用 Apple 登入,請點擊「使用 Apple 繼續」。",socialOnlyBoth:"此帳戶使用 Google 或 Apple 登入,請使用您的社交登入方式。",socialOnlyGeneric:"此帳戶未設定電郵密碼登入,請使用原本的登入方式。",useExistingLogin:"此電郵已有帳戶,請登入而非重新註冊。",finishSetupFailed:"已登入,但未能完成設定,請再試一次。",linkAccountTitle:"連結帳戶",linkAccountDescription:"此電郵已有電郵/密碼帳戶。請輸入密碼以連結您的社交登入。",linkAccountPassword:"帳戶密碼",linkAccountSubmit:"連結帳戶",linkAccountSuccess:"帳戶已連結。請再次使用 Google 登入,即可看到原有寵物與資料。",linkAccountInvalidPassword:"密碼不正確,請再試一次。",linkAccountTempPasswordRequired:"此帳戶需先完成電郵登入。請先用電郵登入並設定永久密碼,然後再試 Google。",linkAccountTempPasswordHint:"狗牌/郵寄登入用戶:請先完成電郵登入並更改臨時密碼,再連結 Google。",linkAccountAuthFlowError:"伺服器暫時無法連結帳戶。請於更新後再試,或聯絡支援。",linkAccountServerError:"暫時無法連結帳戶,請稍後再試。",linkAccountMergeError:"無法連結此 Google 登入,請再試一次,或聯絡支援。",linkAccountNativeMissing:"找不到此電郵的密碼帳戶。請先用電郵登入,或聯絡支援。",setPasswordTitle:"設定密碼",setPasswordDescription:"設定密碼後,您也可以使用電郵和密碼登入。",setPasswordSubmit:"儲存密碼",setPasswordSuccess:"密碼已儲存,您現在可以使用電郵和密碼登入。",federatedOnlyGoogle:"此帳戶使用 Google 登入,無法重設密碼 — 請使用 Google 登入。",federatedOnlyApple:"此帳戶使用 Apple 登入,無法重設密碼 — 請使用 Apple 登入。",federatedOnlyBoth:"此帳戶使用 Google 或 Apple 登入,請使用社交登入方式。"},Dm={hero:{badge:"限量免費登記",title:"免費拎 PETWELL",titleHighlight:"防走失名牌",line1:"智能防走失名牌",tapBadge:"好似八達通 · 一嘟即讀",line2:"手機輕觸即可查看寵物緊急資料",summaryPrimary:"名額有限,先到先得。約 2 分鐘完成登記,即可為毛孩建立防走失名牌。",summarySecondary:"無需充電,手機一嘟即可幫助好心人快速聯絡主人,提高走失後尋回機會。",searchIntent:"防患於未然——在走失意外發生前,為毛孩提早建立防走失名牌,多一分安心。"},benefits:{one:{title:"防走失保障",desc:"好心人一掃即可聯絡主人"},two:{title:"一嘟即讀",desc:"好似八達通拍卡咁簡單,手機輕觸即讀"},three:{title:"免費登記",desc:"限量名額,送完即止"}},socialProof:{eyebrow:"真實用家分享",title:"已有過千毛孩家長拎到名牌",subtitle:"來自 Instagram 的實際收貨與使用分享 — 見證 PetWell 防走失名牌如何幫助毛孩多一分安心。",ariaLabel:"寵主收貨分享相片輪播"},seo:{title:"防走失狗牌免費登記(香港)| NFC 防走失狗牌 | PetWell HK",de
57scription:"想搵防走失狗牌?立即登記 PetWell 免費 NFC 防走失狗牌/寵物名牌,手機一嘟即可讀取聯絡資料,幫助走失毛孩更快返到主人身邊。",keywords:"防走失狗牌,防走失狗牌香港,NFC防走失狗牌,寵物防走失名牌,狗狗防走失牌,防走失貓牌,香港寵物名牌,免費寵物名牌登記,PetWell 名牌",structuredDataName:"PetWell 防走失狗牌免費登記",intentTitle:"防走失狗牌係咩?點解要用 NFC?",intentDesc:"防走失狗牌係為走失情況而設計的寵物識別牌。PetWell NFC 防走失狗牌可讓拾獲者用手機輕觸即讀,快速聯絡主人。",intentPoint1:"手機一嘟即讀,不需安裝 App。",intentPoint2:"可顯示寵物基本資料及緊急聯絡方式。",intentPoint3:"適合狗狗與貓貓,作為日常外出防走失保障。",faqTitle:"防走失狗牌常見問題",faq:{q1:"如何喺香港登記防走失狗牌?",a1:"填寫此頁表格,提交主人及寵物資料並上傳清晰寵物照片,完成後即可建立毛孩的防走失狗牌(NFC 名牌)資料。",q2:"我已經有 PetWell 帳戶,仲需要喺網頁登記嗎?",a2:"可以。即使已有 PetWell 帳戶或已安裝 App,仍需在此頁填寫表格完成名牌登記。",q3:"登記防走失名牌需要咩資料?",a3:"必填資料包括姓名、電郵、電話、寵物名稱及寵物照片;品種、晶片號碼、生日、體重為選填。",q4:"防走失狗牌同一般狗牌有咩分別?",a4:"一般狗牌多數只刻文字;NFC 防走失狗牌可透過手機輕觸讀取更多資料,提升尋回效率。",q5:"防走失狗牌是否只適用於狗狗?",a5:"唔係,貓貓同其他寵物都可以使用。你可按寵物實際資料填寫登記。"},howTo:{name:"如何登記 PetWell 免費防走失名牌",description:"幾分鐘完成網上寵物名牌登記。",step1Name:"選擇帳戶狀態",step1Text:"選擇你是否已有 PetWell 帳戶;不論哪一項,都請繼續填寫下方表格。",step2Name:"填寫主人及寵物資料",step2Text:"輸入必填聯絡資料與寵物資料,並上傳清晰寵物照片。",step3Name:"提交表格完成登記",step3Text:"提交後即可完成網上登記,名牌支援 NFC 手機輕觸讀取。"}},form:{title:"名牌登記資料",subtitle:"請填寫資料製作寵物名牌。標示 * 為必填欄位。",firstNameLabel:"名字 *",firstNamePlaceholder:"例如:小明",lastNameLabel:"姓氏 *",lastNamePlaceholder:"例如:陳",emailLabel:"電郵 *",phoneLabel:"電話號碼 *",phonePlaceholder:"WhatsApp 聯絡電話",petNameLabel:"寵物名字 *",petNamePlaceholder:"例如:Mochi",microchipLabel:"晶片號碼(選填)",microchipPlaceholder:"選填",sfAddressLabel:"SF 收件地址 *",sfAddressPlaceholder:"例如:SF 智能櫃編號 / 順豐站地址",deliveryMethodLabel:"領取方式",deliveryMethodValue:"郵寄",deliveryMethodHint:"所有名牌均以郵寄方式寄出。",specialRequirementLabel:"特別要求(選填)",specialRequirementPlaceholder:"選填,例如:地址補充、備註",groupShippingPhoneLabel:"如需合併寄送,請填對方登記電話(選填)",groupShippingPhonePlaceholder:"選填:請輸入對方登記名牌時使用的電話號碼",petBirthdayLabel:"寵物生日(選填)",petWeightLabel:"寵物體重 (kg)(選填)",petWeightPlaceholder:"例如:5.5",disclaimer:"提交即代表你同意 PetWell 使用以上資料建立帳戶、寵物檔案及處理防走失名牌登記。",submitting:"提交中...",submit:"立即免費登記"},accountPrompt:{step:"01",title:"你是否已經有 PetWell 帳戶?",hint:"不論是否已有帳戶或 App,請在此填寫以下表格完成名牌登記。",hasAccount:"是,我已有帳戶",noAccount:"否,我未有帳戶",cardTitle:"請到 PetWell App 內登記",cardDesc:"你已經有帳戶,建議下載 App 並於 App 內完成名牌登記,流程更快、資料同步更完整。",downloadCta:"下載 App 並前往登記"},photo:{label:"寵物照片 *",previewAlt:"寵物照片預覽",replaceHint:"點擊或拖放新圖片以更換",uploadPrompt:"點擊上傳或拖放寵物照片",uploadHint:"支援 JPG、PNG、WebP",supportText:"支援 JPG、PNG、WebP,最大 5MB。圖片會安全上傳到 PetWell 儲存系統。",remove:"移除"},success:{title:"登記成功!",desc:"我們已收到你的資料。此名牌支援手機一嘟即讀,一般手機輕觸即可查看寵物資料。",newAccountDesc:"請下載 PetWell App。登入資料會隨名牌一併寄出。收到後以電郵登入,首次登入後名牌會自動啟用。",existingAccountDesc:"你已有 PetWell 帳戶,請使用你原本的密碼登入 App。首次登入後,名牌會自動啟用。",downloadCta:"下載 App",submitAnother:"提交另一隻寵物"},toast:{alreadyRegisteredTitle:"你已經登記過",successTitle:"登記成功",successDescNewAccount:"登入資料會隨名牌寄出。收到後下載 App 並以電郵登入,首次登入後名牌會啟用。",successDescExistingAccount:"你已有 PetWell 帳戶,請以原有密碼登入 App。",successDesc:"我們已收到你的登記。名牌支援手機一嘟即讀,輕觸即可查看資料。",errorTitle:"提交失敗",errorDesc:"請稍後再試或聯絡我們。"}
57,validation:{requiredTitle:"請填寫所有必填資料",requiredDesc:"請填寫所有必填欄位。",invalidEmailTitle:"請輸入有效電郵",invalidEmailDesc:"請輸入有效電郵地址。",photoRequiredTitle:"請上傳寵物照片",photoRequiredDesc:"寵物照片為名牌登記必填資料。",invalidPhotoTitle:"圖片格式不正確",invalidPhotoDesc:"請上傳圖片檔案。",photoTooLargeTitle:"圖片太大",photoTooLargeDesc:"請上傳 5MB 或以下的圖片。",notConfiguredTitle:"表格尚未完成設定",notConfiguredDesc:"缺少 nametag Lambda URL 或 API token。"}},Wm={title:"使用條款與細則及私隱政策",lastUpdated:"最後更新:2026年4月25日",sections:{1:{title:"同意我們的法律條款",content:`PetWell HK Limited(「PetWell」、「本公司」、「我們」或「我們的」),一家在香港註冊的公司。
58
59這些法律條款(「法律條款」)規管您存取及使用 PetWell 提供的應用程式、網站、內容、產品及服務(以下統稱為「服務」)。
60
61這些法律條款是您(作為個人或代表實體,「您」、「您的」)與 PetWell HK Limited 之間具有法律約束力的合約。這些條款具體說明了您在使用及參與服務時的限制、合法權利及義務。
62
63「您」及「您的」指任何以任何方式存取、使用或參與服務的人士。如果您代表企業參與服務或建立帳戶,即確認您獲授權使該企業受這些條款約束。因此,您同意這些法律條款將被視為您所代表的企業的同意,在此情況下「您」及「您的」將適用於該企業。
64
65透過存取及使用服務,您確認已閱讀、理解並同意受這些法律條款約束,從而在您與 PetWell HK Limited 之間建立合約關係。如果您不同意這些法律條款,則明確禁止您使用服務,並必須立即停止使用。這些條款取代任何先前與您達成的協議或安排。PetWell HK Limited 保留隨時以任何理由終止這些條款或任何服務,或一般停止提供或拒絕存取服務或其任何部分的權利。
66
67補充條款可能適用於某些服務,例如特定活動或促銷的政策,這些將在適用服務中披露。這些補充條款是法律條款的補充,並應視為適用服務法律條款的一部分。如有衝突,補充條款將優先於這些法律條款。
68
69您確認 PetWell 作為一個數碼平台,促進寵物主人(「服務使用者」)與寵物相關服務提供者(「服務提供者」)之間交換及分享資訊,包括來自第三方的內容。透過參與 PetWell——透過使用、註冊或與平台上展示、推廣及運作的服務互動——您確認:
70
71您符合服務提供者或潛在服務使用者的資格。
72您擁有使自己受這些使用條款約束的必要法律權限。
73您同意處理透過 PetWell 使用服務所需的金融交易。
74您承諾遵守這些法律條款及此處引用的任何相關文件中概述的全面條款及細則。
75
76如果您不同意這些條款的任何部分,您必須避免同意它們並立即停止所有使用及存取 PetWell。重要的是要注意,PetWell 對我們平台促成的用戶之間的互動或交易所可能引起的損失、損害或錯失機會不承擔任何責任。
77
78PetWell HK Limited 可能會不時修訂這些法律條款。修訂將在 https://petwellhk.wpcomstaging.com/terms-and-conditions/ 網域上發佈更新的法律條款或在適用服務上發佈修訂的政策或補充條款後生效。不時發佈的補充條款及細則或文件特此明確納入本條款。我們保留全權酌情決定隨時以任何理由對這些法律條款進行更改或修改的權利。您有責任定期檢閱這些法律條款以了解更新。在發佈此類修訂後您繼續存取或使用服務即表示您同意受修訂後的法律條款約束。如果您不同意遵守這些或任何未來的法律條款,請勿使用或存取服務。`},2:{title:"私隱政策",content:`本節解釋我們在服務中收集哪些個人資料以及我們如何使用這些資料。透過使用本平台,您同意我們按以下說明收集和使用您的資訊。本私隱政策部分已納入並構成這些法律條款的一部分。
79
80我們收集的資訊
81當您使用本平台或與我們互動時,我們會收集以下類別的個人資料:
82
83身份與聯絡方式:姓名、電郵地址、電話號碼、郵寄或帳單地址。
84帳戶與認證:用戶名稱、個人檔案詳情、雜湊密碼、安全及登入活動。
85裝置與使用情況:IP 位址、裝置識別碼、作業系統、瀏覽器/應用程式版本、Cookie/SDK ID、瀏覽的頁面/畫面、點擊、時間戳記、崩潰日誌及診斷資訊。
86通訊與內容:您發送給我們的訊息、Q&A/FAQ 提交、支援請求、評論、論壇帖文,以及您上傳的任何照片/檔案。
87寵物檔案與健康資訊:寵物名稱、物種/品種、性別、年齡、體重、病歷、疫苗接種、處方、化驗結果、預約紀錄、護理筆記,以及您選擇儲存的相關媒體。
88交易:購買、訂閱、預訂詳情及付款元數據。信用卡詳情由我們的付款供應商處理;我們不儲存完整的信用卡號碼。
89行銷偏好:您的選擇加入/退出選擇以及與我們通訊的互動。
90第三方整合(如果您連接它們):來自連接服務的有限數據(例如 Apple Health/Google Fit 的活動/步數/距離;社交登入的基本個人檔案),僅在您允許的情況下取得。
91位置數據:當您明確授予我們權限時,收集大約位置(例如透過 IP 位址)及精確位置(例如透過 GPS、Wi-Fi 或藍牙)。
92
93位置數據及背景位置政策
94PetWell HK Limited 致力於保護您的私隱,並對我們如何使用您的位置數據保持透明。
951. 收集位置數據:我們的應用程式僅在您透過裝置設定明確授予我們權限時,才會收集並存取您的位置數據,包括大約位置(例如透過 IP 位址)及精確位置(例如透過 GPS、Wi-Fi 或藍牙)。
962. 使用位置數據:我們使用您的位置數據來提供應用程式的核心功能,其中包括尋找附近的獸醫診所、寵物美容店及寵物友善餐廳,根據您目前的位置提供緊急及 24 小時診所搜尋服務,以及啟用 PetFit/散步追蹤功能來記錄您寵物的散步路線、距離及時間。
973. 背景位置存取:如果您使用 PetFit/散步追蹤功能,我們的應用程式需要在背景存取您的位置。這意味著即使應用程式已關閉或未使用,也會收集位置數據,確保準確不間斷地追蹤您寵物的散步。在啟用此功能之前,我們將要求明確的背景位置存取權限。
984. 分享位置數據:我們不會將您的位置數據出售給第三方。您的位置數據僅與受信任的服務供應商分享,嚴格用於運作應用程式的功能(例如地圖渲染服務)。
995. 您的控制權:您對自己的位置數據擁有完全控制權。您可以隨時透過裝置的作業系統設定啟用或停用精確位置存取及背景位置存取。停用位置存取可能會限制您使用應用程式的某些功能,例如附近診所搜尋及散步追蹤。
100
101兒童私隱
102我們的服務不針對且無意吸引 13 歲以下的兒童。我們不會故意向 13 歲以下的兒童索取個人資訊或向他們發送個人資訊請求。如果我們發現我們在未經父母同意的情況下收集了 13 歲以下兒童的個人資訊,我們將採取措施從我們的伺服器中刪除該資訊。
103
104我們如何使用您的資訊
105我們使用您的資訊來:
106
107提供、運作及改善服務和平台功能;
108建立及管理帳戶、處理預訂及付款,並提供客戶支援;
109個人化內容、測量效能及進行分析;
110維持安全、保安及完整性(包括預防欺詐及除錯);
111發送服務通訊(例如確認、更新);在需要時徵得您同意發送行銷資訊;
112遵守法律義務及執行我們的協議。
113
114分享您的資訊
115我們僅在提供服務需要或法律要求時分享資訊,包括與:
116
117服務供應商(例如主機、分析、客戶支援、付款);
118當您要求或使用其服務時的診所及獸醫專業人員;
119當您選擇發佈其他人可見的評論或內容時的其他用戶;
120如果涉及您與第三方供應商的投訴、爭議或衝突,且分享是解決問題所必需的,則與索賠處理者或保險公司分享;
121在法律要求或為保護權利及安全時,與當局或法律顧問分享;
122在適當的保障措施下,進行企業交易(例如合併、收購、融資)。
123
124我們不會出售您的個人資料。我們可能會分享無法合理識別您身份的匯總或去識別化資訊。
125
126保留、安全及國際轉移
127我們僅在上述目的需要或法律要求的情況下保留個人資料。我們使用適當的技術及組織措施來保護您的數據,但沒有任何方法是 100% 安全的。您的資訊可能會在您所在國家/地區以外的國家/地區進行處理;當我們在國際間轉移數據時,我們會使用適當的保障措施。
128
129您的選擇與權利
130您可以在帳戶中更新某些詳情,並在裝置設定中管理權限(包括精確位置)。根據適用法律,您可以要求存取、更正、刪除、限制、反對處理或轉移您的個人資料,並且您可以隨時選擇退出行銷。要行使您的權利或提出問題,請透過 [email protected] 聯絡我們。`},3:{title:"服務內容",content:`PETWELL 服務的性質
131
132PetWell 提供全面的套件,包括桌面網絡應用程式、流動應用程式,以及其他相關工具、支援和服務。這些資源讓服務使用者和服務提供者能夠尋找、溝通並與彼此互動。PetWell 的服務包括服務提供者配對平台、意見回饋門戶、服務使用者的寵物健康文件系統,以及其他服務。
133
134PETWELL 不直接提供寵物護理服務
135
136PetWell 作為一個中立的平台,連接服務提供者和服務使用者。雖然 PetWell 促進這些連接,但它不直接提供寵物護理服務,也不參與服務的實際交易。我們不僱用、推薦或認可任何服務提供者或服務使用者,也不對他們提供的寵物護理服務(如美容、寄養或服務提供者提供的其他服務)的質素,或您與服務使用者的互動和關係作出任何陳述或保證。
137
138PetWell 上的服務提供者獨立運作,既不是 PetWell 的員工也不是承包商。他們有權決定如何向客戶提供服務。雖然我們在平台上提供關於服務提供者的安全和寵物護理指南,以及服務使用者選擇提供者的提示,但 PetWell 對任何服務提供者或服務使用者的表現或行為(無論是在線還是離線)概不負責。
139
140我們會對服務提供者的個人檔案進行初步審查,並協助進行基本的身份驗證。然而,除非明確聲明,否則我們不會進行徹底的背景調查。PetWell 不保證任何服務提供者和服務使用者的準確性、質素或適合性,建議服務使用者自行進行盡職調查。服務使用者在與平台上的其他用戶互動之前,應謹慎行事並運用獨立判斷。服務使用者和服務提供者均須自行負責作出最符合其利益及其寵物利益的決定。建議您在與服務提供者互動、提供寵物護理服務或與 PetWell 平台上的其他用戶互動之前,謹慎行事並運用獨立判斷。例如,每位用戶都有責任確保其寵物的醫療(如防跳蚤和牛蜱)是最新的。PetWell 對用戶在此類治療中的任何疏忽概不負責。
141
142用戶生成的內容、評論和外部來源的內容
143
144用戶生成的內容和評論
145
146PetWell 為服務使用者提供一個平台,讓他們發佈關於從服務提供者獲得的服務的評論和分享經驗。這些評論和任何其他用戶生成的內容中表達的意見僅代表個別用戶的觀點,並不反映 PetWell HK Limited 的觀點。PetWell 不認可或保證任何用戶發佈的內容的準確性、完整性、真實性或可靠性。作為平台供應商,PetWell 對用戶提供的任何聲明、陳述或內容概不負責。每位用戶對其內容及發佈內容的後果負全部責任,並應意識到其發佈是公開的而非機密的。服務使用者還必須就其內容引起的任何索賠,以及因 PetWell 或執法部門調查而採取的任何行動,對 PetWell 進行賠償。
147
148PetWell 提供一個平台,讓服務使用者可以存取有關各種寵物護理服務(包括獸醫診所)的詳細資訊,例如地址、電話號碼和營業時間。雖然我們鼓勵服務使用者根據他們的經驗發佈評論,但 PetWell 不會核實用戶到訪這些服務的準確性。我們為服務使用者提供一個分享個人經驗的空間,但重要的是要注意,PetWell 不能保證所有評論都是基於實際到訪。服務使用者在閱讀評論和根據發佈的經驗作出決定時,應行使酌情權並考慮這一點。
149
150您確認並同意您將遵守以下指南(「評論指南」)
151
152PetWell 致力於培育一個充滿活力的網上社群,讓寵物主人可以分享和存取有關寵物護理服務的可靠資訊。為確保我們的平台保持實用且沒有商業偏見、仇恨言論或不相關的內容,我們鼓勵服務使用者在提交評論時遵守以下指南:
153
154評論必須是真實和個人的,基於第一手經驗。如果您是服務提供者的擁有者、員工或代理人,或者是直接競爭對手,請勿提交評論。
155評論不應受服務提供者或其代理人提供的補償或激勵影響。
156每次服務體驗只允許發表一篇評論;不允許對同一服務重複提交。
157避免提交包含侮辱、誹謗或挑釁內容的評論。
158請勿進行誹謗或人身攻擊。
159確保您的評論是原創的;未經許可禁止複製或抄襲他人的內容。
160避免發佈重複的內容或使用多個帳戶提交類似的評論。
161評論應基於第一手經驗,而不是道聽途說或二手資訊。
162確保您的評論是真實的,既不具誹謗性也不具誤導性;避免毫無根據的指控、猜測或抄襲內容。
163請勿包含商業訊息、促銷連結或不當語言。
164評論應集中在您自己的寵物護理經驗,提供所接受服務的詳細描述。
165如果您有嚴重的投訴,請提供照片等證據來支持您的說法。
166評論不應直接回應其他評論或僅包含照片。
167提供的評分應與您的評論內容一致。
168請勿包含服務提供者或員工的敏感個人資料。
169提交您的評論,即表示您授予 PetWell 非獨家許可,以使用您的內容來推廣平台。
170確保遵守所有適用法律,包括與私隱和內容合法性相關的法律。
171
172重要注意事項:
173
174如果您的評論與促銷活動(例如免費美容)相關,則必須清楚披露。未能這樣做可能會違反《商品說明條例》或您或服務提供者所在司法管轄區適用的類似法規。
175如果您提交包含嚴重指控的評論,您必須在發佈前核實內容是真實的,並同意對所作的聲明承擔法律責任。在帶有嚴重指控的評論中ä
175½œå‡ºå¤±å¯¦é™³è¿°å¯èƒ½æœƒå°Žè‡´æ ¹æ“šã€Šèª¹è¬—條例》和其他適用法律承擔法律後果。
176
177PetWell 保留拒絕、重新安置或刪除任何不遵守這些指南的評論的權利,由我們全權酌情決定,恕不另行通知。PetWell 進一步保留權利(但無義務)監控、編輯或刪除包含被視為非法、具冒犯性、誹謗性、淫褻或以其他方式令人反感或違反任何一方知識產權或本條款的內容的用戶生成內容或帳戶。如需舉報不當使用評論,您可以透過電郵 [email protected] 聯絡 PetWell。
178
179此列表並非詳盡無遺,僅提供被禁止行為的例子。PetWell 保留隨時終止您存取帳戶及在我們服務上發佈內容能力的權利,無論是否發出通知,也無論出於何種原因或沒有原因,特別是如果您的行為被認為是不當或具破壞性的。此外,PetWell 可能會全權酌情決定限制您發送給其他用戶的訊息數量。如果在我們的服務上進行非法活動,PetWell 可能會讓執法部門介入,並將在必要或認為適當時與當局合作。雖然我們不承諾審查用戶發佈的所有內容,但我們保留隨時刪除、編輯、移動或拒絕任何內容的權利,恕不另行通知。
180
181來自外部平台的內容
182
183PetWell 可能會顯示來自外部平台或網站的內容,包括評論。PetWell 不擁有這些外部來源的內容,也不對其版權所有權提出任何要求。PetWell 不負責取得使用任何外部來源內容的權利,也不保證此類內容的準確性、合法性或是否符合版權法。我們依賴我們的用戶和外部內容供應商合法地提供內容,並鼓勵用戶在從我們的平台使用任何內容之前核實其真實性和所有權。如果 PetWell 收到有效的版權侵權通知,我們承諾採取適當行動,包括盡快從我們的平台刪除侵權內容以遵守版權法。用戶在依賴來自外部平台的內容之前應謹慎行事並進行盡職調查。PetWell 對用戶依賴此類內容而引起的任何錯誤資訊、版權侵權或其他問題概不負責。
184
185知識產權和版權
186
187服務提供者在 PetWell 上創建和發佈的內容、標誌和其他視覺媒體仍為各自版權持有人的知識產權。服務提供者同意不發佈內容,除非他們持有版權或已獲得適當的許可,或涵蓋在合理使用範圍內。PetWell 對用戶發佈的內容或外部來源的內容造成的任何版權侵權概不負責,但如果內容違反任何法律標準或權利,將刪除此類內容。
188
189透過在 PetWell 上發佈內容,服務提供者同意允許其在平台上顯示,並用於與推廣平台及其服務相關的用途,而無需任何補償。PetWell 保留權利(但無義務)監控、編輯或刪除包含被視為非法、具冒犯性、誹謗性、淫褻或以其他方式令人反感或違反任何一方知識產權或本條款的內容的帳戶。
190
191第三方服務和內容
192
193PetWell 可能會與 PetWell 無法控制的第三方服務和內容一起使用。您確認不同的法律條款和私隱政策可能適用於您使用此類第三方服務和內容。PetWell 不認可且不對任何第三方供應商提供的產品或服務負責或承擔責任。
194
195所有權
196
197服務及其中的所有權利是且將繼續是 PetWell HK Limited 或其許可人的財產。本條款中的任何內容均不授予您任何與服務相關的權利,或使用或參考 PetWell 的公司名稱、標誌、產品和服務名稱、商標或服務標記的能力。
198
199寵物健康文件系統
200
201PetWell 提供一個安全的數碼檔案庫——寵物健康文件系統,讓我們的平台用戶能夠有效地存取、儲存和管理他們寵物的健康記錄和其他重要文件。該系統旨在促進輕鬆存取和管理寵物健康數據,讓我們的平台用戶在獲得適當同意的情況下,與服務提供者一起加強寵物健康的護理和管理。
202
203儲存在寵物健康文件系統中的資訊可能包括但不限於獸醫記錄、疫苗接種記錄和病歷。收集的資訊專門用於加強 PetWell 提供的服務,旨在改善服務使用者及其授權服務提供者對寵物健康的整體管理和護理。透過使用此系統上傳寵物健康文件,即表示您同意按照我們的法律條款和私隱政策中概述的方式儲存和使用這些數據。PetWell 致力於以行業標準的安全措施和協
203議保護您寵物的健康資訊。
204
205服務使用者有責任確保他們輸入系統的寵物健康資訊的準確性和完整性。提供的所有數據必須是最新的和正確的,這一點至關重要。PetWell 對服務使用者提供的資訊中的任何錯誤,或其他服務使用者或服務提供者對這些資訊的任何依賴概不負責。
206
207所有上傳的數據仍為服務使用者或合法擁有者的知識產權。PetWell 不對上傳到寵物健康文件系統的任何內容提出所有權要求。關於數據使用,除非提供所要求的服務或法律要求,否則 PetWell 不會存取儲存在雲端硬碟中的詳細健康資訊。關於寵物的基本資訊,如名稱、品種、體重和性情,可能會與服務提供者或任何第三方分享,以促進服務的提供。這種資訊分享嚴格基於服務使用者控制的設定,他們可以選擇與自由工作者分享哪些額外資訊(如果有)。
208
209PetWell 確保服務使用者保持對其內容的控制權。您可以管理誰可以查看或與您的數據互動,並透過系統設定永久移除或刪除數據。服務使用者決定其檔案的私隱級別,預設為私人。除非在我們的私隱政策中明確描述或法律要求,否則 PetWell 不會向其他人披露您的檔案或數據。`},4:{title:"會員資格及服務存取",content:`用戶帳戶
210
211要存取 PetWell 的大部分功能,您必須註冊並維持一個活躍的個人用戶服務帳戶(「帳戶」)。您必須年滿 18 歲或達到您所在司法管轄區的法定成年年齡(以較高者為準),才能建立帳戶。註冊需要您提供個人資訊,例如您的姓名、手提電話號碼和電郵地址。在註冊過程中,您可以選擇提供不é
211œ€è¦çš„額外詳情,但這有助於個人化您在 PetWell 上的體驗。您對透過您的帳戶進行的所有活動負全部責任,並必須保持您的 PetWell 密碼和任何第三方網站密碼的機密性和安全性。您有責任確保這些密碼隨時受到保護,以防止未經授權使用您的帳戶。您有責任保持帳戶資訊的準確性和完整性。如果您的帳戶出現任何安全漏洞或未經授權的存取,您必須立即通知 PetWell。此外,明確禁止您在未經他人明確許可的情況下存取他人的帳戶。嚴禁在平台上冒充其他用戶或以虛假藉口使用服務。您確認 PetWell 對您因未經授權使用您的帳戶而遭受的任何損失概不負責。然而,您可能需要對因這種未經授權的活動而導致 PetWell 或其他人遭受的任何損失負責。
212
213促銷代碼
214
215PetWell 可以全權酌情決定創建促銷代碼,這些代碼可以兌換為帳戶餘額,或與我們服務相關的其他功能或好處,並受 PetWell 為每個促銷代碼建立的任何附加條款(「促銷代碼」)約束。您同意促銷代碼:
216
217必須用於指定的受眾和目的,並以合法的方式使用。
218除非 PetWell 明確允許,否則不得複製、出售、轉讓或向公眾提供。
219PetWell 可以隨時以任何理由停用,且不承擔任何責任。
220必須根據 PetWell 為該促銷代碼設定的具體條款使用。
221不可兌換現金。
222可能會在您使用之前過期。如果 PetWell 確定或認為促銷代碼的使用或兌換是錯誤的、欺詐的、非法的,或違反了適用的促銷代碼條款或這些法律條款,PetWell 保留扣留或扣除透過使用促銷代碼獲得的餘額或其他功能或好處的權利。
223
224網絡存取和設備
225
226您有責任獲取使用我們平台所需的數據網絡存取權限。如果您從支援無線網絡的設備存取或使用我們的服務,您的流動網絡供應商可能會收取數據和訊息費用,您需自行承擔這些費用。您還有責任獲取和更新存取和使用我們服務及其任何更新所需的兼容硬件或設備。PetWell 不保證服務或其任何部分將在任何特定硬件或設備上運作。此外,我們的服務可能會受到互聯網和電子通訊使用中固有的故障和延遲的影響。`},5:{title:"帳戶持有人行為",content:`禁止上傳內容
227
228您不得在平台上的任何地方上傳、發佈、傳輸或分發任何內容——包括文字、圖像、影片、聲音、數據、資訊或軟件——無論是到您的個人檔案、服務列表、服務請求,還是作為與平台、服務、服務提供者或服務使用者相關的任何意見回饋的一部分。
229
230禁止您發佈歪曲來源的內容,包括冒充其他個人或實體,或發佈關於服務提供者的任何虛假或不準確的傳記資訊。
231
232請勿發佈或創建連結到違反這些法律條款的外部網站。
233
234您不得參與任何旨在以任何方式傷害或剝削 18 歲以下任何個人(「未成年人」)的活動,或在未經適當同意的情況下向未成年人索取個人資訊。
235
236您應避免侵犯私隱的活動,例如在未經他人知情和自願同意的情況下,未經授權收集、儲存或分發個人資訊,包括姓名、電郵地址、電話號碼和家庭地址。
237
238您不得分發包含可能損害 PetWell 或任何第三方利益的虛假或失實陳述的內容。
239
240您不得發佈色情、騷擾、仇恨、非法、淫褻、誹謗、中傷、威脅、歧視,或在種族、文化或民族上令人反感的內容。嚴禁鼓勵可能構成刑事犯罪、導致民事責任或以其他方式違反任何適用法律的行為的內容。
241
242您不得發佈任何宣揚種族主義、仇恨或對任何個人或群體造成身體傷害的內容。避免發佈任何包含裸體、過度暴力或其他可能被認為是不當或具冒犯性內容的材料。
243
244禁止您上傳受版權或商業機密保護的內容,除非您擁有這些權利或已獲得合法權利持有人的許可,在我們的服務上使用和分享此內容。
245
246您不得上傳、發佈或分發侵犯他人版權或專有權利的內容,例如未經授權複製受版權保護的作品,包括但不限於盜版電腦程式、音樂檔案和藝術品。避免發佈有助於規避製造商防拷貝裝置或其他保護措施的資訊或連結。禁止您發佈基於年齡、性別、殘疾、種族、性取向或宗教而威脅、跟蹤、誹謗、欺詐、貶低、迫害或恐嚇個人或群體的內容。請勿發佈煽動或鼓勵他人作出可能導致對個人或群體造成傷害或歧視的行為的內容。
247
248您不得參與旨在損害或破壞其他用戶電腦系統的活動,或允許他人非法存取軟件或繞過網站或伺服器上的安全措施。這包括任何形式的垃圾郵件。禁止冒充或使用 PetWell 員工、代理人、經理、服務提供者、其他用戶或任何其他人的身份。禁止宣傳或招攬與我們服務無關或被 PetWell 認為不當的業務(由 PetWell 全權酌情決定)。
249
250不應發佈被視為「垃圾郵件」、「連鎖信」、「層壓式推銷」或未經請求的商業廣告的內容。避免發佈未經明確批准的服務的未經授權商業訊息或廣告,例如龐氏騙局、折扣卡、網上比賽等。
251
252您不得分發或上傳可能損害 PetWell 或 PetWell 用戶財產和利益的病毒或任何技術。
253
254除非我們的法律條款明確允許,否則禁止發佈指向商業服務或網站的連結。內容必須與我們的服務和用戶相關。避免發佈非本地或不相關的材料。請勿重新發佈以前已提交給 PetWell 的內容。嚴禁在未經 PetWell 明確書面同意的情況下使用任何自動化工具或軟件提交內容。
255
256通訊禁令
257
258請勿發送涉及超過服務標價的國家或國際匯款的訊息,特別是如æž
258œå®ƒå€‘包含退款請求。
259
260避免發送關於我們服務或外部網站未提供的服務的未經請求的廣告或促銷。
261
262避免分享個人聯絡資訊,例如電話號碼、社交媒體帳號、電郵地址等。
263
264請勿鼓勵或協助使用其他服務或平台進行我們服務以外的訊息傳遞或業務招攬。
265
266禁止行為
267
268服務使用者被禁止參與以下任何行為:承諾服務但無意付款;註冊、協商價格、使用或招攬服務但無意完成交易;同意購買服務但不符合服務提供者聲明的條款,或意圖破壞列表;或濫用 PetWell 提供的任何與使用或購買服務相關的功能。這些行為違反了服務條款,可能會導致帳戶權限受到限制。
269
270競業禁止條款
271
272在透過我們服務與服務提供者最後一次接觸後的 12 個月內,服務使用者同意遵守以下條件:
273
274服務使用者不得直接或間接向透過我們服務遇到的任何服務提供者或服務使用者招攬或接受類似服務,也不得在我們服務定義的同一服務區域內提供類似服務。
275服務使用者禁止為任何個人或專業目的聘用或試圖聘用透過我們服務介紹的任何服務提供者或其他服務使用者。
276服務使用者必須避免為在他們使用我們服務期間介紹給他們的任何服務提供者或其他服務使用者提供服務,或向他們招攬服務,無論服務的性質如何。
277服務使用者不得直接或間接說服或影響其他服務使用者或服務提供者終止或減少他們對我們服務的使用。
278服務使用者必須避免誘使或鼓勵任何服務提供者或其他服務使用者在競爭服務上提供或使用類似服務。
279服務使用者不得干擾、破壞或試圖破壞我們服務與其服務提供者或服務使用者之間任何已建立的關係、合約或安排。
280服務使用者不允許協助、鼓勵或促進任何服務提供者或其他服務使用者違反這些條款。
281
282不歧視
283
284我們的服務遵守所有禁止在就業發佈中歧視的聯邦、州和地方法律。這包括但不限於基於種族、膚色、宗教、性別、國籍、年齡、殘疾或任何其他受法律保護的階層的歧視。我們不接受任何包含歧視性偏好或限制的內容。我們保留權利,在不事先通知的情況下,刪除我們確定違反這些反歧視法律的任何內容。
285
286關於使用服務的禁令
287
288您被禁止將內容或項目上傳到我們服務中不合適的類別或區域;在任何圖像或內容列表中顯示個人聯絡或社交媒體詳情;違反法律、第三方權利、我們的帳戶政策,或法律條款中概述的任何條款;拒絕為服務付款,除非服務提供者提供的描述在達成協議後發生重大變化,如果存在明顯的排版錯誤,或者如果無法核實服務提供者的身份;未能履行已付款的服務,除非服務使用者大幅偏離商定的條款、拒絕付款、發生重大排版錯誤,或者無法驗證服務使用者的身份;操縱服務價格或干擾其他用戶的發佈;規避或篡改我們的收費結構、計費過程或應付費用;發佈虛假、不準確、誤導、誹謗或中傷的內容,包括關於任何服務使用者的個人詳情;可能破壞我們意見回饋或評分系統完整性的行為,例如濫用意見回饋資訊或將其應用於我們服務的預期背景之外。
289
290如果服務使用者違反了與其發佈相關的任何規則,PetWell 可全權酌情決定採取行動,包括取消發佈、限制服務使用者的帳戶權限、暫停帳戶,或降低服務使用者透過意見回饋獲得的狀態。透過同意這些條款,您承諾維護我們服務中內容和互動的完整性。PetWell 嚴格執行這些指南,並保留在認為必要時修改、拒絕或刪除內容或帳戶的權利。`},6:{title:"提交內容的使用及權利",content:`用戶內容的非機密性
291
292透過提交、託管、分享和發佈用戶內容(可能包括影片、個人檔案、優惠、請求、意見回饋和其他形式的通訊)來使用我們的服務,您確認您提交的任何內容可能可供其他註冊用戶存取,並且我們不保證任何此類內容的機密性,無論其是否已發佈。
293
294透過提交內容,您同意在非專有和非機密的基礎上提供它。您授予我們自由使用、分發和公開展示此內容的權限,使我們能夠有效地提供和增強我們的服務。此內容可能會被設置為可搜尋,並可供所有有權存取我們服務的用戶使用。
295
296
297用戶內容責任
298
299您對您提交的內容以及在我們服務上發佈或出版它的後果負全部責任。透過提交內容,您確認並保證:
300
301您擁有或已獲得必要的許可、權利、同意和權限來使用此類內容,並授權我們以服務和這些法律條款預期的方式使用它。
302您已獲得提交內容中每個可識別個人的書面同意、免責聲明和許可,以使用他們的姓名或肖像,從而能夠以服務和這些法律條款預期的方式包含和使用他們。
303您將支付因您在服務上或透過服務發佈的內容而欠任何人的任何版稅、費用或其他款項。
304
305內容權利和許可協議
306
307您保留您提交給 PetWell 的任何內容的所有權。透過提交內容,您授予 PetWell 一項永久的、全球性的、非獨家的、免版稅的許可,該許可可轉授權和轉讓。此許可允許我們在與 PetWell 的服務及其業務活動(包括跨各種媒體推廣和重新分發部分或全部服務及其衍生作品)相關的情況下,使用、複製、分發、重新格式化、翻譯、創建衍生作品、展示和執行您的內容。此外,我們服務的每個用戶都會獲得一項非獨家許可,透過我們的服務存取您的內容,並在我們服務的功能和這些法律條款允許的情況下,使用、複製、分發、創建衍生作品、展示和執行您的內容。當您從我們的服務中刪除您的內容時,此許可即告終止。
308
309您確認我們服務的管理可能涉及:
310
311透過各種網絡傳輸。
312修改您的內容以符合連接網絡或設備的技術要求。
313
314PetWell 可能會在網誌、目錄、電郵和其他促銷材料中使用您的內容。您可以隨時刪除您的內容。要刪除內容,請透過電郵通知我們,除非它已作為我們服務的一部分與第三方分享,否則我們將刪除它。如果您不要求刪除轉發的內容,將被視為同意我們保留它。
315
316內容責任和刪除權利
317
318PetWell 不認可任何用戶生成的內容或其中表達的任何意見、建議或建議,並明確否認與此類內容相關的所有責任。PetWell 不允許在我們的服務中進行侵犯版權或知識產權的活動,並將根據我們既定的下架程序刪除任何被舉報並核實為侵權的數據或內容。PetWell 保留權利,在不事先通知的情況下刪除任何數據或內容,並可能終止任何被確定為重複侵權者的用戶的存取權限——重複侵權者定義為被通知侵權活動超過兩次或被刪除內容超過兩次的用戶。此外,PetWell 保留全權酌情決定提交給服務的所有內容是否合適的權利,包括但不限於刪除具冒犯性、不雅或以其他方式令人反感或違反我們條款的材料。
319
320使用我們的服務時,您可能會遇到來自不同來源的內容,這些內容不受 PetWell 控制。您可能會發現某些內容具冒犯性、有害、不準確或具欺騙性。透過使用我們的服務,您放棄對 PetWell 關於此類內容的任何法律或衡平法權利或補救措施,並同意就您使用的相關所有索賠對 PetWell 及其附屬公司進行賠償並使其免受損害。
321
322您對您透過我們的服務發佈、展示或傳輸的內容負全部責任。PetWell 可以全權酌情決定且不承擔任何責任,審查和刪除任何違反本協議或可能有害或非法的內容。
323
324建議和改進。您發送給 PetWell 關於修改或增強我們服務的任何建議、評論或通訊都被視為非機密和非專有的。PetWell 可以自由地將此類建議中包含的任何想法、概念、專有技術或技術用於任何目的,包括但不限於開發和營銷包含此類資訊的產品和服務,而無需向您提供任何補償或歸屬。您確認 PetWell 沒有義務採用、展示、複製或分發任何此類想法,您也不能要求採取此類行動。`},7:{title:"必需的第三方驗證服務",content:`PetWell 致力於為服務使用者和服務提供者維持一個安全的環境。作為此承諾的一部分,我們利用各種安全措施,包括背景調查和對照國家數據庫的身份驗證。如果您對 PetWell 進行這些搜索感到不舒服,請避免註冊為服務提供者。
325
326透過在 PetWell 上註冊,您同意使用您提供的資訊進行背景調查。PetWell 可能會審查從第三方驗證服務獲得的結æž
326œï¼Œä¸¦æ ¹æ“šé€™äº›ç™¼ç¾æŽ¡å–適當的行動。您授權 PetWell 核實您提供的詳情的準確性,並同意就這些調查可能引起的任何損失或責任對 PetWell 進行賠償。
327
328服務使用者自行評估服務提供者非常重要。請注意我們背景調查的以下限制:
329
330除非在這些法律條款中明確聲明,否則 PetWell 不會自動對所有用戶進行背景調查。
331並非所有類型的記錄都可以被第三方背景調查機構存取,有些記錄可能不是最新的。
332少年記錄、被駁回的案件、外國定罪和交通違規(除非在某些司法管轄區被歸類為刑事犯罪)等資訊通常不包含在背景調查報告中。
333
334PetWell 保留根據第三方驗證服務的發現終止會員資格的權利。請記住,您有責任確保從我們服務中使用的任何資訊都是準確和可靠的。
335
336PetWell 致力於為服務提供者和服務使用者維持一個安全的環境。為了支持這一承諾,我們提供一系列可選的驗證工具,包括姓名和地址驗證、社會安全號碼驗證、身份證、護照和犯罪背景調查,特別是針對服務提供者。我們使用 Airwallex 來促進這些驗證,作為我們付款解決方案的一部分。
337
338服務提供者和服務使用者可以選擇使用我們服務提供的第三方驗證服務來驗證各種詳情,如姓名、地址、國民身份證號碼、犯罪背景和專業執照憑證。透過使用我們的服務,您確認您或您家庭中的任何人都沒有捲入涉及暴力、虐待、忽視、欺詐、盜竊或任何對他人構成威脅的犯罪的法律行動。您同意 PetWell 核實這些聲明,並理解 PetWell 可以根據其酌情權根據發現採取適當的行動。
339
340使用透過 PetWell 提供的第三方驗證服務完全由您自行決定。您確認提供這些服務是為了方便,PetWell 不控制或認可驗證服務或其提供的資訊的準確性或可靠性。PetWell 可能會審查來自這些第三方服務的數據,並可能根據這些資訊終止您的帳戶。
341
342您可以選擇在您的 PetWell 個人檔案中公開第三方驗證服務的結果。如果您選擇分享這些資訊,請注意它可能會影響其他人聘用您服務的決定。您還同意就公開此類詳情可能引起的任何損害對 PetWell 進行賠償並使其免受損害。`},8:{title:"附加驗證選項",content:`PetWell 致力於為服務提供者和服務使用者維持一個安全的環境。為了支持這一承諾,我們提供一系列可選的驗證工具,包括姓名和地址驗證、社會安全號碼驗證、身份證、護照和犯罪背景調查。
343
344特別是針對服務提供者。我們使用 Airwallex 來促進這些驗證,作為我們付款解決方案的一部分。
345
346服務提供者和服務使用者可以選擇使用我們服務提供的第三方驗證服務來驗證各種詳情,如姓名、地址、國民身份證號碼、犯罪背景和專業執照憑證。透過使用我們的服務,您確認您或您家庭中的任何人都沒有捲入涉及暴力、虐待、忽視、欺詐、盜竊或任何對他人構成威脅的犯罪的法律行動。您同意 PetWell 核實這些聲明,並理解 PetWell 可以根據其酌情權根據發現採取適當的行動。
347
348使用透過 PetWell 提供的第三方驗證服務完全由您自行決定。您確認提供這些服務是為了方便,PetWell 不控制或認可驗證服務或其提供的資訊的準確性或可靠性。PetWell 可能會審查來自這些第三方服務的數據,並可能根據這些資訊終止您的帳戶。您可以選擇在您的 PetWell 個人檔案中公開第三方驗證服務的結果。如果您選擇分享這些資訊,請注意它可能會影響其他人聘用您服務的決定。您還同意就公開此類詳情可能引起的任何損害對 PetWell 進行賠償並使其免受損害。
349
350PetWell 通知您,在您使用第三方驗證服務時,我們可能會從消費者報告機構獲取消費者報告。這些消費者報告可能包含關於您的品格、聲譽、個人特徵和生活方式的詳細資訊,這可能包括消費者信用、犯罪記錄、工人賠償、駕駛記錄、就業歷史、服役、民事記錄和教育背景。
351
352透過選擇使用、存取或透過我們的服務分享來自第三方驗證服務的資訊,您確認您將遵守所有相關的消費者報告法律。如果您選擇透過本服務或在外部與其他方分享這些資訊,您同意在法律範圍內行事,並承諾就此類行為引起的任何損失、責任、損害或費用(無論原因為何)對 PetWell 進行賠償並免除其責任。PetWell 明確否認對使用第三方驗證服務提供的資訊可能導致的損失承擔任何責任。`}
352,9:{title:"遵守公平信用報告法",content:`PetWell 通知您,在您使用第三方驗證服務時,我們可能會從消費者報告機構獲取消費者報告。這些消費者報告可能包含關於您的品格、聲譽、個人特徵和生活方式的詳細資訊,這可能包括消費者信用、犯罪記錄、工人賠償、駕駛記錄、就業歷史、服役、民事記錄和教育背景。
353
354透過選擇使用、存取或透過我們的服務分享來自第三方驗證服務的資訊,您確認您將遵守所有相關的消費者報告法律。如果您選擇透過本服務或在外部與其他方分享這些資訊,您同意在法律範圍內行事,並承諾就此類行為引起的任何損失、責任、損害或費用(無論原因為何)對 PetWell 進行賠償並免除其責任。PetWell 明確否認對使用第三方驗證服務提供的資訊可能導致的損失承擔任何責任。
355
356PetWell 已實施處理涉嫌和實際版權和商標侵權的程序。如果您懷疑您的知識產權被複製並以構成侵權的方式在我們的服務上提供,請向 [email protected] 提供以下詳情:
357
358您聲稱被侵權的知識產權列表。如果您的索賠涉及我們網站上的多個作品,請提供受影響作品的代表性列表。
359您聲稱侵權的材料在我們服務上的準確位置描述,足以讓 PetWell 找到該材料。
360一份聲明,表明您真誠地相信有爭議的使用未經知識產權擁有者、其代理人或法律授權。
361足夠的資訊讓我們能夠聯絡您,包括您的地址、電話號碼,以及(如果有)電郵地址。
362獲授權代表涉嫌被侵權的專有權利擁有者行事的人的實體或電子簽名。
363一份根據偽證處罰規定作出的聲明,表明通知中提供的資訊是準確的,並且您是知識產權擁有者或獲授權代表其權利涉嫌被侵權的知識產權擁有者行事。
364
365此通知被稱為「通知」。
366
367請注意,為了使通知有效,您必須遵守所有概述的要求。PetWell 承諾根據版權法規定從我們的服務中刪除任何侵權內容。然而,您有責任確保您的通知符合所有法律標準。
368
369請注意,根據版權法,任何故意對版權侵權作出虛假聲明的人可能會面臨法律責任。只有知識產權權利持有人才有資格透過 PetWell 既定的舉報程序舉報侵權材料。如果您不是權利持有人,您應該建議擁有者如果他們希望追究此事,請聯絡我們。`},10:{title:"處理版權侵權索賠的程序",content:`PetWell 已實施處理涉嫌和實際版權和商標侵權的程序。如果您懷疑您的知識產權被複製並以構成侵權的方式在我們的服務上提供,請向 [email protected] 提供以下詳情:
370
371您聲稱被侵權的知識產權列表。如果您的索賠涉及我們網站上的多個作品,請提供受影響作品的代表性列表。
372您聲稱侵權的材料在我們服務上的準確位置描述,足以讓 PetWell 找到該材料。
373一份聲明,表明您真誠地相信有爭議的使用未經知識產權擁有者、其代理人或法律授權。
374足夠的資訊讓我們能夠聯絡您,包括您的地址、電話號碼,以及(如果有)電郵地址。
375獲授權代表涉嫌被侵權的專有權利擁有者行事的人的實體或電子簽名。
376一份根據偽證處罰規定作出的聲明,表明通知中提供的資訊是準確的,並且您是知識產權擁有者或獲授權代表其權利涉嫌被侵權的知識產權擁有者行事。
377
378此通知被稱為「通知」。
379
380請注意,為了使通知有效,您必須遵守所有概述的要求。PetWell 承諾根據版權法規定從我們的服務中刪除任何侵權內容。然而,您有責任確保您的通知符合所有法律標準。
381
382請注意,根據版權法,任何故意對版權侵權作出虛假聲明的人可能會面臨法律責任。只有知識產權權利持有人才有資格透過 PetWell 既定的舉報程序舉報侵權材料。如果您不是權利持有人,您應該建議擁有者如果他們希望追究此事,請聯絡我們。
383
384服務的變更
385
386PetWell 保留隨時暫時或永久修改或中止服務(或其任何部分)的權利。PetWell 可以全權酌情決定在有或沒有通知的情況下這樣做。您同意 PetWell 不會對您或任何第三方因服務的任何變更、暫停或終止而承擔責ä
386»»ã€‚
387
388服務終止政策
389
390PetBacker 保留隨時和不時修改或中止平台(或其任何部分)的權利,無論是暫時還是永久,無論是否有通知,並由其全權酌情決定。您同意 PetBacker 不會對您或任何第三方因 PetBacker 服務的任何修改、暫停或中止而承擔責任。
391PetWell 保留其全權酌情決定的權利,在不事先通知的情況下終止或暫停您對我們服務的存取、停用您的帳戶、封鎖您的電郵或 IP 位址,或以其他方式限制您對我們服務的存取。PetWell 可以出於認為合適的任何原因採取此行動,包括但不限於違反我們的法律條款、帳戶不活躍,或任何被認為侵犯我們服務運作或使用的行為。此外,如果 PetWell 認為您提交的任何內容違反了我們的政策,可能會將其刪除。這種終止或暫停可能在任何時候發生,恕不另行通知,以確保我們服務的完整性和正常運作。
392
393
394您有權隨時停止使用我們的服務。要取消您的帳戶,只需轉到您帳戶設定中「個人檔案 > 幫助中心」下的「停用帳戶」選項。這可以在有或沒有特定原因的情況下完成。
395在您的帳戶終止後,您立即失去對服務的所有存取權限以及任何未付的款項或權利,包括但不限於推薦折扣、獎金或獎勵。終止是由於您未能遵守法律條款、維持積極參與或妥善管理您的帳戶。如果您的帳戶被終止,您將失去對所有帳戶數據的存取權限,儘管殘留數據可能保留在我們的系統中。
396
397如果您的帳戶被終止,您必須立即刪除您擁有的所有數據副本、商標和任何與我們服務相關的內容。我們對您存取權限終止後的任何損失或損害概不負責,並保留將從您使用服務中收集的數據用於內部目的的權利。授予我們關於您數據的所有許可將繼續有效以用於這些目的。
398
399如果您在註冊期間提供了一個有效的電郵地址,您將收到電郵通知,除非您的使用之前已被我們終止或取消,這使得進一步的通知變得不必要。
400
401即使在您的帳戶或服務被終止後,我們法律條款的某些部分將繼續適用。您還需要就因您的服務終止而引起的任何索賠或要求(包括法律費用和成本),對我們公司及其附屬公司進行賠償並使其免受損害。`},11:{title:"服務的修改及終止",content:`服務的變更
402
403PetWell 保留隨時暫時或永久修改或中止服務(或其任何部分)的權利。PetWell 可以全權酌情決定在有或沒有通知的情況下這樣做。您同意 PetWell 不會對您或任何第三方因服務的任何變更、暫停或終止而承擔責任。
404
405服務終止政策
406
407PetBacker 保留隨時和不時修改或中止平台(或其任何部分)的權利,無論是暫時還是永久,無論是否有通知,並由其全權酌情決定。您同意 PetBacker 不會對您或任何第三方因 PetBacker 服務的任何修改、暫停或中止而承擔責任。
408PetWell 保留其全權酌情決定的權利,在不事先通知的情況下終止或暫停您對我們服務的存取、停用您的帳戶、封鎖您的電郵或 IP 位址,或以其他方式限制您對我們服務的存取。PetWell 可以出於認為合適的任何原因採取此行動,包括但不限於違反我們的法律條款、帳戶不活躍,或任何被認為侵犯我們服務運作或使用的行為。此外,如果 PetWell 認為您提交的任何內容違反了我們的政策,可能會將其刪除。這種終止或暫停可能在任何時候發生,恕不另行通知,以確保我們服務的完整性和正常運作。
409
410
411您有權隨時停止使用我們的服務。要取消您的帳戶,只需轉到您帳戶設定中「個人檔案 > 幫助中心」下的「停用帳戶」選項。這可以在有或沒有特定原因的情況下完成。
412在您的帳戶終止後,您立即失去對服務的所有存取權限以及任何未付的款項或權利,包括但不限於推薦折扣、獎金或獎勵。終止是由於您未能遵守法律條款、維持積極參與或妥善管理您的帳戶ã€
412‚如果您的帳戶被終止,您將失去對所有帳戶數據的存取權限,儘管殘留數據可能保留在我們的系統中。
413
414如果您的帳戶被終止,您必須立即刪除您擁有的所有數據副本、商標和任何與我們服務相關的內容。我們對您存取權限終止後的任何損失或損害概不負責,並保留將從您使用服務中收集的數據用於內部目的的權利。授予我們關於您數據的所有許可將繼續有效以用於這些目的。
415
416如果您在註冊期間提供了一個有效的電郵地址,您將收到電郵通知,除非您的使用之前已被我們終止或取消,這使得進一步的通知變得不必要。
417
418即使在您的帳戶或服務被終止後,我們法律條款的某些部分將繼續適用。您還需要就因您的服務終止而引起的任何索賠或要求(包括法律費用和成本),對我們公司及其附屬公司進行賠償並使其免受損害。`},12:{title:"知識產權所有權",content:`PetWell 保留我們服務上內容的所有權利,用戶上傳的內容除外。這包括但不限於文字、軟件、腳本、圖形、照片、聲音、音樂、影片和互動功能(「內容」),以及商標、服務標記和標誌(「標記」)。這些受當地和國際版權及知識產權法保護。我們服務上屬於其他方的標記和名稱仍為其各自擁有者的財產。
419
420我們服務上提供的內容僅供您參考和個人使用。未經合法擁有者明確事先書面同意,不得將其用於、複製、重製、分發、傳輸、廣播、展示、出售、授權或以其他方式用於任何其他目的。PetWell 保留所有未明確授予用戶的權利。未經適當許可,禁止您使用、複製或分發任何內容,特別是用於商業目的。如果您下載或列印任何內容供個人使用,您必須保留所有版權和專有聲明。此外,您必須尊重服務的安全功能,並避免任何會規避或停用安全措施的行為,或允許或協助任何未經授權使用或複製內容的行為,或強制限制使用我們的服務和其中內容的行為。
421
422PetWell 保留其數據和商標的所有權利,受各種知識產權法保護。我們授予您有限的、可撤銷的、不可轉讓的、不可轉授權的許可,僅供個人在參與我們服務時使用 PetWell 數據(不包æ
422‹¬ä»»ä½•軟件源代碼)。您不得複製、修改、發佈、傳輸、分發、執行、展示或出售 PetWell 擁有或由其他用戶或許可人提供的任何數據。
423
424雖然 PetWell 可能允許使用某些功能(如可嵌入播放器)將材料整合到您的個人、非商業網站中,但不得包括直接推廣或連結到服務提供者的個人業務渠道或提供類似服務的外部平台。任何使用 PetWell 可嵌入播放器的行為都必須包含返回我們服務的連結,以確認內容的來源。我們保留隨時停止任何服務功能的權利,恕不另行通知。`},13:{title:"廣告及促銷",content:"PetWell 提供的服務可能部分透過廣告收入提供資金。因此,PetWell 可能會展示廣告和促銷。服務上廣告的形式、頻率和範圍可能會發生變化。廣告的存在並不意味著 PetWell 認可所廣告的產品或服務。您確認 PetWell 對您因與服務上的廣告互動或其存在而遭受的任何損失或損害概不負責。"},14:{title:"外部連結、表格及聯絡號碼",content:`服務可能包含指向第三方網站和資源的連結,例如社交媒體平台和外部網站,包括獸醫診所網頁。您可以選擇使用您在這些第三方網站的帳戶登入服務,與它們互動,進行交易,並調整您的私隱設定以與這些網站的聯絡人分享您在服務上的活動。PetWell 不控制這些第三方網站和資源,因此對其可用性不承擔責任。PetWell 不認可且不對此類網站或資源上或可從其獲得的任何內容、廣告、產品或服務負責。
425
426指向任何第三方網站的連結並不構成對這些網站或透過它們提供的任何產品或服務的認可。PetWell 對因使用或依賴透過這些網站或資源獲得的任何第三方內容、商品或服務而造成的任何損害或損失概不負責。第三方網站可能在與 PetWell 不同的私隱政策、條款及細則和商業慣例下運作。有時,您可能看起來仍在與 PetWell 互動,但實際上您可能已被重定向到第三方網站。在這種情況下,適用第三方的條款及細則和私隱政策。
427
428您與透過服務找到的任何第三方的互動和交易僅在您和第三方之間進行。PetWell 不參與這些互動或交易。如果您對第三方提供的材料有任何投訴、疑慮或問題,您應該直接聯絡第三方。
429
430無第三方受益人
431
432您同意,除非這些法律條款中另有明確規定,否則這些法律條款沒有第三方受益人。`},15:{title:"免責聲明",content:`您確認並同意您使用服務的風險由您自行承擔。PetWell 及其高級職員、董事、員工、附屬公司和代理人否認所有任何形式的保證,無論是明示還是暗示。這包括與透過服務提供的任何資訊、數據或材料的質素、適用性、真實性、準確性或完整性相關的任何保證。服務和提供的所有數據、材料和內容均按「現狀」、「可用」和「原樣」的基礎提供給您,不作任何適銷性、特定用途的適用性或不侵犯第三方權利的保證。
433
434PetWell 不保證沒有錯誤、不準確,或儲存個人和財務資訊的伺服器的安全性。PetWell 也不對第三方透過服務傳輸的任何錯誤、病毒或其他有害組件負責。我們不認可或承擔第三方透過服務或任何超連結網站廣告的任何產品或服務的責任。
435
436您與其他服務使用者或服務提供者的互動和交易完全由您承擔風險。PetWell 不對服務提供者或用戶進行背景調查。服務以基於聲譽的系統運作,鼓勵您在作出決定時考慮其他用戶的意見回饋和第三方推薦。
437
438所有服務均在沒有 PetWell 保證的情況下提供。我們特別否認任何關於所有權、適銷性、特定用途的適用性和不侵權的暗示保證。某些司法管轄區不允許免除暗示保證,因此上述免責聲明可能不適用於您。您還可能擁有因司法管轄區而異的其他合法權利。`},16:{title:"責任限制",content:`PetWell 及其附屬公司,包括高級職員、董事、員工、代理人、繼任者和受讓人,對因您使用我們的服務或服務上提供的任何內容而引起的任何直接、間接、附帶、特殊、懲罰性或後果性損害概不負責。這包括因以下原因引起的損害:(i) 存取或使用服務,無論是透過服務還是獨立形成服務協議;(ii) 任何內容的錯誤或不準確;(iii) 未經授權存取安全伺服器或其中儲存的個人和財務資訊;(iv) 任何第三方透過服務傳輸的任何錯誤、病毒或類似問題;(v) 傳輸到或從服務傳輸的中斷或停止;(vi) 任何內容的錯誤或遺漏;(vii) 協商服務期間或之後的任何爭議,或用戶之間發生的任何其他爭議;(viii) 任何第三方的任何具冒犯性、非法或誹謗性行為;或 (ix) 任何使用透過服務發佈、電郵、傳輸或以其他方式提供的內容。即使 PetWell 已被告知發生此類損害的可能性,並且儘管任何有限補救措施未能達到其基本目的,這些限制仍然適用。
439
440此外,PetWell 因服務引起或與之相關的總責任不應超過您支付給 PetWell 的費用總額。您確認 PetWell 對用戶生成的內容或任何第三方行為不承擔責ä
440»»ï¼Œä¸¦ä¸”由此造成的傷害或損害風險完全由您承擔。
441
442服務可能包含指向非 PetWell 擁有或控制的第三方網站的連結。PetWell 對任何第三方網站的內容、政策或慣例沒有控制權,也不承擔任何責任。因此,您免除 PetWell 因您使用任何第三方網站而引起的任何責任。
443
444我們對因使用我們的服務而引起的任何損害概不負責,包括但不限於直接、附帶或後果性損害,即使已被告知此類可能性。這延伸到因未經授權存取或更改您的傳輸或數據以及任何第三方在服務上的行為或聲明而導致的損害。每個旨在限制責任的條款在確定我們與您簽訂這些法律條款的意願時都是必不可少的,並且即使有限補救措施未能達到其基本目的也應強制執行。無論如何,在任何情況下,如果對 PetWell 施加任何損害賠償,一次場合任何損害賠償的最高補償將不超過一萬港元(HKD$10000)。`},17:{title:"不可抗力",content:"PetWell 或您都不會對因合理控制之外且沒有任何一方過錯或疏忽的原因造成的任何延遲或履行失敗(付款義務除外)負責。這些原因可能包括但不限於火災、洪水和地震等自然災害、勞資糾紛、公用事業故障、停電、天災、戰爭(無論是否宣戰)、監管機構的行動,或我們無法控制的其他重大事件。"},18:{title:"免責及賠償",content:`您同意就因您使用和參與我們的服務而引起的任何責任、索賠、費用、損害和成本(包括法律費用),為 PetWell(包括其高級職員、董事、員工、代理人、附屬公司和服務供應商)辯護、進行賠償並使其免受損害。這包括任何違反我們的法律條款和私隱政策、侵犯任何第三方權利(如知識產權或私隱權),或由您提交的內容造成的任何損害。此辯護和賠償義務將在這些條款和您使用我們服務終止後繼續有效。
445
446如果您與其他用戶發生爭議,您免除 PetWell 及其相關人員與此類爭議或您使用我們服務相關的所有種類的索賠、要求和損害(已知或未知)。
447
448您確認任何與其他用戶的作為或不作為相關的法律行動將限於針對這些特定個人的索賠。您同意不追究 PetWell 的責任或尋求其法律補救。PetWell 免於承擔因您與其他用戶互動或由於您在我們服務內的活動而引起的所有索賠、損害和要求。
449
450您不得轉讓或指派您在這些條款下的權利和許可,但 PetWell 可以不受限制地指派它們。`},19:{title:"通知",content:"您確認 PetWell 可能會透過電郵、SMS、郵寄或在我們的服務上發佈,發送通知和更新,包括對法律條款的更改。這是為了確保您隨時了解有關您使用 PetWell 的任何更改或重要資訊。"},20:{title:"一般資訊",content:`法律條款,結合私隱政策和 PetWell 發佈的任何其他法律通知或政策,構成您與 PetWell 之間關於服務的完整協議。如果這些法律條款的任何規定被具有適當管轄權的法院視為無效,此類無效不應影響其餘規定的有效性,其餘規定將保持完全效力。
451
452PetWell 未能執行法律條款的任何權利或規定不應被視為放棄此類權利或規定。放棄任何規定並不構成對任何其他規定的放棄,也不是持續的放棄,PetWell 執行此類權利和規定的權利保持完全效力。
453
454與服務相關的訴訟必須在訴訟因由產生後一年內開始;否則,它們將被永久禁止,從而阻止此後提起此類訴訟。這些法律條款中使用的標題僅為方便起見,不具任何法律或合約意義。`}}},Lm={mallParking:"商場停車場",nearbyParking:"附近車位",evCharging:"EV 充電",carParkName:"車場名稱",walk:"步行",heightLimit:"限高"},Om={pageTitle:"【2026 最新】香港寵物友善商場|最詳盡政策及商場列表",subtitle:"2026 年最新更新:九龍、港島、新界寵物友善商場一覽,帶狗入商場政策、牽繩/推車規定、指定步行區、開放時間同交通提示",description:"全港最詳盡寵物友善商場資料庫,涵蓋各區商場寵物政策、落地規定、開放時間、泊車資訊與真實用家提示",searchPlaceholder:"搜尋商場名稱或地址...",filterByRegion:"按地區篩選",regions:{all:"全部地區",kowloon:"九龍",hongKong:"香港島",newTerritories:"新界",others:"其他"},loading:"載入中...",error:"載入商場資料時發生錯誤",errorSubtitle:"請稍後再試或聯絡客服",noResults:"暫時未有此地區的寵物友善商場資料",noResultsHint:"試下調整搜尋關鍵字或篩選條件。",ctaTitle:"想搵更多寵物友善去處?",ctaDescription:"下載 PetWell App 睇餐廳、診所、美容寄養同更多寵物友善地點",filterPetsYes:"歡迎寵物",filterLeashWalk:"可牽繩步行",filtersLabel:"篩選",clearFilters:"清除篩選",resultsCount:"{{count}} 間商場",trustBadge:"2026 最新政策資訊",backToList:"返回商場列表",address:"地址",phone:"電話",website:"網站",openingHours:"營業時間",closed:"休息",gallery:"相片",mtrAccess:"港鐵交通",detail:{notFound:"商場未找到",policyTitle:"寵物政策",callNow:"致電商場",getDirections:"導航前往",visitWebsite:"官方網站",dining:"商場餐飲",diningWebsite:"商場餐飲頁",diningVenues:"寵物友善餐廳",browseRestaurants:"瀏覽寵物友善餐廳",parking:"泊車",parkingWebsite:"泊車資訊頁",parkingDetails:"泊車",weekdayRate:"平日",weekendRate:"週末",heightLimit:"車高限制",todayHours:"今日營業",viewFullHours:"查看完整營業時間",hideFullHours:"收起營業時間",planVisit:"實用資訊",visitGuideTitle:"帶寵到訪",rulesTitle:"出門前要知",tagStroller
454:"可借推車",tagStrollerNo:"無推車借用",tagWalkZones:"指定步行區",tagPetToilet:"寵物廁所",tagPetToiletNo:"無寵物廁所",tagPetPark:"寵物公園",tagPetParkAt:"寵物公園 · {{place}}",tagParking:"設有泊車",tagDiningYes:"有寵物餐廳",tagDiningNo:"暫無寵物餐廳",policySubtitle:"先睇重點規則,備註只補充細節",facilitiesTitle:"設施一覽",walkZonesTitle:"可以去邊度",restrictedTitle:"限制區域",floors:"樓層",floorGround:"地下",floorN:"{{n}}樓",strollerTitle:"寵物推車借用",membership:"會員",membershipRequired:"需要",membershipWithName:"會員:{{name}}",depositAmount:"按金 HK${{amount}}",depositLabel:"按金",notesTitle:"備註",notePrefix:"備註:",venueWithFloor:"{{name}} · {{floor}}",venueCount:"{{count}} 間",zoneCount:"{{count}} 區",gettingThere:"點去",showMore:"查看更多",showLess:"收起",amenityPark:"寵物公園",amenityDining:"食肆",amenityStroller:"推車",amenityToilet:"寵物廁所",amenityParking:"泊車",perHour:"/小時",ratePerHour:"每小時 HK${{amount}}",rateAmount:"HK${{amount}}",heightLimitValue:"車高限制:{{meters}} ç±³",ruleLeash:"需牽繩",ruleCarrier:"需推車/抱住/入袋",ruleNoCarrier:"公共空間無需推車",ruleMuzzle:"大狗建議戴口罩",ruleMaxWeight:"上限 {{kg}} 公斤",zoneType:{OUTDOOR:"戶外",INDOOR:"室內",MIXED:"室內外"}}},Fm={pageTitle:"香港寵物上門服務",subtitle:"揀地區,搵會嚟你屋企嘅服務",description:"對比上門獸醫、護士、美容同相關服務。先睇覆蓋範圍同收費,再直接聯絡。",searchPlaceholder:"地區、寵物或名稱",filterByRegion:"按地區篩選",regions:{all:"全部地區",kowloon:"九龍",hongKong:"香港島",newTerritories:"新界",others:"其他"},loading:"載入中...",error:"載入上門服務資料時發生錯誤",errorSubtitle:"請稍後再試或聯絡客服",noResults:"暫時未有符合條件的上門服務",noResultsHint:"試下改地區,或搜尋寵物種類/服務名稱。",ctaTitle:"想搵更多寵物服務?",ctaDescription:"下載 PetWell App 睇診所、美容、寄養同更多寵物友善地點",filter24Hour:"24小時",filtersLabel:"篩選",clearFilters:"清除篩選",resultsCount:"{{count}} 間上門服務",trustBadge:"先睇覆蓋範圍同收費",moreServices:"仲有 {{count}} 項",backToList:"返回上門服務列表",address:"地址",phone:"電話",website:"網站",openingHours:"服務時間",closed:"休息",detail:{notFound:"找不到此上門服務",homeVisitConfirmed:"確認提供上門",coverage:"服務範圍",travelFee:"交通/路程費",about:"關於",services:"服務項目",pricing:"收費參考",referenceDisclaimer:"服務內容同收費以服務商官方為準,此處只供參考。",pricingEmpty:"暫未公開收費,建議用 WhatsApp 或電話查詢最新報價。",pricingService:"項目",pricingAmount:"收費",pricingNotes:"備註",includesTravel:"已含路程",species:"服務寵物",contact:"聯絡方式",whatsapp:"WhatsApp",call:"致電",bookOnline:"網上預約",report:"資料有誤?回報",reviews:"{{count}} 則評價",viewFullHours:"查看完整時間",hideFullHours:"收起時間"}},_m={myReviews:"我的評論",mySubtitle:"你帶毛孩去過、寫下來的地方。",myEmpty:"你尚未撰寫任何評論。",myEmptyTitle:"還沒寫過評論",myEmptyBody:"帶毛孩去過的餐廳、診所,寫下來可以幫其他家長。",emptyCtaRestaurants:"搵餐廳",emptyCtaClinics:"搵診所",searchPlaceholder:"搜尋場所或產品名稱",mySeoDescription:"查看你在 PetWell 寫過的所有評論。",publicEmpty:"此用戶尚未公開任何評論。",publicSeoDescription:"查看此 PetWell 會員的公開場所及產品評論ã€
454‚",publicSubtitle:"PetWell 會員的公開評論 — 他們與寵物一齊試過的場所與產品。",memberBadge:"PetWell 會員",reviewsCount:"{{count}} 則評論",reviewsCount_one:"{{count}} 則評論",avgRating:"平均 {{rating}} 分",filterAll:"全部",filterLabel:"篩選評論",viewPlace:"查看場所",loading:"載入評論中…",loadFailed:"暫時無法載入此用戶資料,請稍後再試。",empty:"暫時未有評論。",emptyFiltered:"此分類暫時未有評論。",anonymousBadge:"匿名",anonymousUser:"PetWell 用戶",externalUser:"外部用戶",unknownUser:"未知用戶",loginRequiredTitle:"登入後查看你的評論",loginRequiredBody:"登入後即可看到你寫過的場所與產品評論。",types:{clinic:"診所",salon:"美容院",lodging:"住宿",restaurant:"餐廳",product:"產品"}},Mm={title:"個人檔案",subtitle:"你同毛孩喺 PetWell 的家。",seoDescription:"查看及編輯你的 PetWell 個人檔案。",breadcrumb:"個人檔案",sections:"帳戶分頁",loginRequiredTitle:"登入後回到你的檔案",loginRequiredBody:"登入後即可看到你的資料、毛孩,以及你寫過的評論。",loading:"載入個人檔案中…",loadFailed:"暫時無法載入個人檔案,請稍後再試。",personalInfo:"個人資料",edit:"編輯檔案",editProfile:"編輯檔案",editProfileDesc:"更新你的姓名、電話、地址及頭像。",firstName:"名字",lastName:"姓氏",email:"電郵",phone:"電話",address:"地址",emailReadOnly:"電郵無法在此更改。",phoneHint:"8 位香港流動電話號碼",notSet:"未設定",save:"儲存",saving:"儲存中…",cancel:"取消",changePhoto:"更換照片",saveSuccess:"個人資料已更新",saveFailed:"無法儲存個人資料,請再試一次。",firstNameRequired:"請輸入名字。",lastNameRequired:"請輸入姓氏。",phoneInvalid:"請輸入有效的 8 位香港電話號碼。",myPets:"我的毛孩",petCount:"{{count}}/{{max}}",sharedBadge:"共享",sharingBadge:"分享中",noPets:"還沒有毛孩檔案",noPetsHint:"在 App 為牠建立檔案,健康紀錄同針卡都會跟住你。",manageInApp:"在 App 管理",managePetInApp:"在 App 管理 {{name}}",addPet:"新增毛孩",appHint:"新增或編輯毛孩請使用 PetWell App。",downloadGateTitle:"請在 PetWell App 管理毛孩",downloadGateBody:"新增、編輯、分享寵物及電子針卡只可在 PetWell App 完成。",reviewsTeaser:"你寫過的評論",reviewsTeaserCta:"查看全部",reviewsTeaserEmpty:"寫第一則評論,幫其他毛孩家長。",ageYears:"{{count}} æ­²",ageMonths:"{{count}} 個月",activity:"動態",account:"帳號",deleteAccount:"刪除帳戶",weightKg:"{{weight}} kg"},jm={nav:zh,placeListing:Kh,restaurantReservation:Gh,tests:Yh,hero:Qh,home:Xh,homePortal:Jh,clinics:Zh,salons:em,lodging:tm,restaurants:om,testBooking:nm,restaurant:rm,ngos:im,footer:am,report:sm,common:lm,hours:cm,forum:dm,deleteAccount:um,petTag:pm,reviews:hm,activateTag:mm,download:fm,event:gm,adminForms:ym,nameTagBanner:vm,nametagDailyPopup:wm,midAutumnDailyPopup:bm,cnyProducts:Pm,checkout:xm,payment:Sm,cart:Tm,petMatchmaker:Am,otherServices:Em,about:km,contactWidget:Cm,landing:Nm,auth:Rm,authLinking:Im,nametagPage:Dm,terms:Wm,malls:Lm,mallPlaces:Om,homeVisitPlaces:Fm,userReviews:_m,accountProfile:Mm},Hm={home:"Home",openMenu:"Open menu",logoAlt:"PetWell Hong Kong pet health app logo - veterinary reviews and pet health management platform",petFriendly:"Pet-friendly",clinics:"Clinics",salons:"Pet Grooming",lodging:"Pet Lodging",malls:"Pet-friendly Malls",homeVisits:"Home Visits",restaurants:"Restaurants",restaurantsByDistrict:"By district (18)",ngos:"Animal NGOs",about:"About Us",forum:"Pet Forum",blog:"Pet Info",ownerZone:"Owner Zone",tests:"Fun Tests",petMatchmaker:"Pet Matchmaker",petActivities:"Pet Activities",testBooking:"Testing Services",nutritionScore:"Food Score",otherServices:"Merchant Partnership",review:"Price reviews",download:"Download the app",partnershipMenu:{merchant:"Media & merchants",merchantHint:"Ads, KOL and listings",events:"Events",eventsHint:"Pet markets and festivals"},petFriendlyMenu:{goOut:"Go out together",care:"Get care",services:"Grooming & stay",restaurants:"Restaurants",malls:"Malls",clinics:"Clinics",homeVisits:"Home visits",salons:"Grooming",lodging:"Lodging"}},$m={searchNearby:"Search nearby",nearby:"Nearby",sortedByDistance:"Closest first",locationDenied:"Couldn't get your location. Allow location access, then tap Search nearby again.",locationBlockedTitle:"Location is off",locationBlockedBody:"You blocked location before, so allow it in browser settings.",locationBlockedStep1:"Tap the lock icon in the address bar",locationBlockedStep2:"Set Location to Allow",locationBlockedStep3:"Come back and tap Try again",locationBlockedIos:"Go to iPhone Settings → Safari or Chrome → Location, allow this site, then tap Try again.",locationTimeoutTitle:"Can't find your location",locationTimeoutBody:"Make sure Location is on, then try again.",locationUnavailableTitle:"Can't find your location",locationUnavailable:"This browser can't provide a location.",locationRetry:"Try again",locationDismiss:"Not now",distanceM:"{{m}} m",distanceKm:"{{km}} km"},Bm={cta:"Reserve a table",ctaShort:"Reserve",title:"Reserve a table",subt
454itle:"{{restaurantName}} · Pending confirmation after you send",when:"Date & time",moreDates:"More dates",contact:"Your details",customerName:"Name",customerNamePlaceholder:"e.g. Chan Tai Man",customerPhone:"Phone",customerPhonePlaceholder:"e.g. 9123 4567",customerEmail:"Email",customerEmailPlaceholder:"[email protected]",reservationAt:"Reservation date and time",reservationDate:"Date",reservationDatePlaceholder:"Choose a date",reservationTime:"Time",partySize:"Guests",petCount:"Pets",maxPetsHint:"Up to {{count}}",fewer:"Fewer",more:"More",petSummary:"Pet details (optional)",petSummaryPlaceholder:"e.g. 1 small dog, outdoor seat",specialRequest:"Special request (optional)",specialRequestPlaceholder:"Seating preference, celebration, etc.",addExtras:"Add email or notes",editExtras:"Edit email or notes",termsTitle:"Booking terms",termsAccept:"I agree to the booking terms",viewTerms:"View terms",hideTerms:"Hide terms",depositNotice:"A deposit may be required for {{count}}+ pets.",noAvailableDates:"No dates available right now.",noAvailableTimes:"No times on this date.",pickDateFirst:"Choose a date first.",notice:"Pending confirmation — the restaurant may contact you.",submit:"Send request",submitting:"Sending…",cancel:"Cancel",close:"Close",successTitle:"Request sent",successDesc:"Your request for {{restaurantName}} is pending confirmation.",errorDesc:"Couldn't send your request. Please try again.",validation:{required:"Please fill this in.",email:"Enter a valid email.",future:"Choose a time that meets the notice period.",unavailableDate:"This date isn't available.",unavailableTime:"This time isn't available.",maxPets:"Up to {{count}} pets for this slot.",partySize:"Select at least 1 guest.",petCount:"Pet count can't be negative.",terms:"Please agree to the booking terms."}},Vm={title:"Fun Pet Tests",subtitle:"Discover fun and insightful tests about you and your pets!",petMatchmakerDesc:"Find out which pet matches your personality and lifestyle perfectly.",startTest:"Start Test"},Um={title:"Hong Kong's First",titleHighlight:"Pet Health App",titleEnd:"",subtitle:"Complete veterinary and pet grooming information in one app",cta:"Download Now"},qm={eyebrow:"Hong Kong's first all-in-one pet health platform",summary:"Hong Kong's go-to platform — clinic reviews, pet-friendly restaurants, grooming, lodging, activities and forum",explorePlatform:"Explore platform",stats:{clinicsValue:"200+",clinicsLabel:"Vet clinics",restaurantsValue:"1500+",restaurantsLabel:"Pet-friendly spots",freeValue:"100%",freeLabel:"Free to use"},features:{eyebrow:"Core capabilities",title:"Built for pet parents",subtitle:"Reviews, discovery, and health records — making pet care clearer and simpler.",saveTime:{title:"Save research time",description:"PetWell consolidates reviews* so you find what you need in one place."},advocacy:{title:"Advocate for animals",description:"Share good and bad experiences to build a more pet-inclusive city."},records:{title:"Lifetime health records",description:"Keep a detailed history of your pet's care — nothing gets lost when you switch vets."},free:{title:"Completely free",description:"We believe every animal deserves access to quality services."}},platform:{eyebrow:"Product ecosystem",title:"Everything in one platform",subtitle:"From medical decisions to everyday outings — PetWell covers what Hong Kong pet owners need.",clinics:{title:"Vet clinics",description:"Real reviews, fee references, and 24-hour emergency filtering.",cta:"Browse clinics"},restaurants:{title:"Pet-friendly dining",description:"Team-verified restaurants across Hong Kong Island, Kowloon, and NT.",cta:"Browse restaurants"},activities:{title:"Pet activities",description:"Markets, parties, carnivals — plan great weekends for your pet.",cta:"Browse activities"}},testimonials:{eyebrow:"User stories",title:"What Hong Kong pet owners say",minnie:{text:"I used to rely on friends for vet recommendations and travel far for appointments. With PetWell, everyone can share reviews — I can finally pick a clinic near me!",author:"Minnie Leung"},elaine:{text:"After years of pet ownership, I'd often lose vaccination cards or forget emergency visits. Now I can record every vet visit in detail — switching vets without missing anything.",author:"Elaine Yeung"},matthew:{text:"My dog hates groomers after a bad experience as a puppy. With so many mobile groomers, it's hard to compare value — PetWell lets me compare options and see the earliest booking slots at once!",author:"Matthew Chan"}},appPreviewAlt:"PetWell pet health app on mobile — vet clinic search, health records, and walk tracking"},zm={hero:{eyebrow:"Hong Kong pet platform",title:"Making pet life simpler",subtitle:"Price compare, clinics, grooming, boarding, restaurants, events & forum — one search",subtitleMobile:"Compare prices, clinics, restaurants & more — one search"},tabs:{all:"All",review:"Price compare"},search:{categoryLabel:"Search category",placeholder:"Search products, clinics, salons, restaurants, events…",placeholderMobile:"Search products, clinics…",placeholders:{review:"Search brand or product name…",activities:"Search event name or location…"},submit:"Search"},quickNav:{label:"Quick access",review:"Price compare"},promos:{title:"Featured offers",cta:"View now",member:{title:"PetWell Member perks",subtitle:"Members enjoy 10% off"},activities:{title:"2026 pet hotspots",subtitle:"Weekend activities & outings"}
454,review:{title:"Pet product price compare",subtitle:"Compare prices across Hong Kong"}},suggestions:{title:"Explore PetWell",explore:"Go",clinicsSub:"Real reviews & fee references",salonsSub:"Grooming salons across HK",lodgingSub:"Boarding & pet hotels",restaurantsSub:"Team-verified pet-friendly dining",districtsLink:"Browse by 18 districts",activities:"Hong Kong pet hotspots",activitiesSub:"Events, markets & outdoor picks",ownerZoneSub:"Care guides & practical tips"},featured:{title:"Featured picks",subtitle:"Popular categories curated for pet owners",review:{title:"Pet product price compare",subtitle:"Compare real prices across Hong Kong stores"}},sectors:{viewAll:"View all",verified:"Verified",review:{title:"Best deals · Pet price compare",subtitle:"Compare store prices and find the best buy"},restaurants:{title:"Pet-friendly restaurants",subtitle:"Team-verified — dine with your pet confidently"},events:{title:"Pet events & outings",subtitle:"Weekend markets, parties & outdoor picks"},clinics:{title:"Vet clinic reviews",subtitle:"Real user ratings & fee references"},salons:{title:"Pet grooming"},lodging:{title:"Pet boarding"},homeVisits:{title:"Home visit services",subtitle:"In-home consults, vaccines & urgent care"}},cards:{stores:"{{count}} stores",savePercent:"Save {{pct}}%",newListing:"New",freeEntry:"Free entry",priceFrom:"From HK$ {{price}}",rank:"Rank #{{rank}}"},forum:{title:"Trending in forum",subtitle:"Latest discussions from the community",viewAll:"View more",hot:"Hot",replies:"{{count}} replies"}},Km={pageTitle:"Hong Kong Veterinary Clinic Search & Reviews",subtitle:"Discover the Best Veterinary Clinics for Your Pet - Kowloon, Hong Kong Island & New Territories",description:"Over 200 veterinary clinics across Hong Kong with real user reviews and instant booking",searchPlaceholder:"Search clinic name or address...",filterByRegion:"Filter by Region",regions:{all:"All Regions",kowloon:"Kowloon",hongKong:"Hong Kong Island",newTerritories:"New Territories",others:"Others"},loading:"Loading...",error:"Error loading clinic data",errorSubtitle:"Please try again later or contact support",noResults:"No clinics found in this region",services:"Services",reviews:"user reviews",ctaTitle:"Need to Find More Clinics?",ctaDescription:"Download PetWell App to browse over 200 veterinary clinics in Hong Kong with advanced search features",ctaButton:"Download App Now",filter24Hour:"Show 24-hour clinics only",filtersLabel:"Filters",clearFilters:"Clear filters",resultsCount:"{{count}} clinics",loadMore:"Load more",noResultsHint:"Try adjusting your search or filters to see more results.",trustBadge:"Real user reviews",backToList:"Back to Clinics",address:"Address",phone:"Phone",website:"Website",openingHours:"Opening Hours",closed:"Closed",gallery:"Photos",detail:{notFound:"Clinic not found",servicesOverview:"Services at a glance",servicesOverviewSubtitle:"Key services offered at this clinic",callNow:"Call clinic",getDirections:"Get directions",email:"Email",todayHours:"Open today",viewFullHours:"View full opening hours",hideFullHours:"Hide opening hours",reviewsTitle:"Reviews",reviewsSubtitle:"What other pet owners say",planVisit:"Visit details",noHoursToday:"Closed today or hours unavailable",suggestEdit:"Suggest edit",suggestEditPrompt:"Info outdated?",reviewsEmpty:"No reviews yet",businessReply:"Reply from this place",reviewsMoreTitle:"Want more reviews?",reviewsMoreDescription:"Download PetWell to read all reviews",businessReplyFrom:"Reply from {{placeName}}",businessReplyOfficial:"Official",registeredVetsTitle:"Registered veterinary surgeons",registeredVetsSubtitle:"{{count}} surgeons with a valid practising certificate matched to this clinic",registeredVetsSource:"Source:",registeredVetsSourceName:"Veterinary Surgeons Board of Hong Kong register"}},Gm={pageTitle:"Pet Grooming",subtitle:"Discover pet grooming salons in Hong Kong - Kowloon, Hong Kong Island & New Territories",description:"Pet salon search, user reviews, services and pricing reference",searchPlaceholder:"Search salon name or address...",filterByRegion:"Filter by Region",regions:{all:"All Regions",kowloon:"Kowloon",hongKong:"Hong Kong Island",newTerritories:"New Territories",others:"Others"},loading:"Loading...",error:"Error loading pet grooming data",errorSubtitle:"Please try again later or contact support",noResults:"No pet grooming salons found in this region",services:"Services",reviews:"user reviews",ctaTitle:"Need to Find More Pet Grooming Salons?",ctaDescription:"Download PetWell App to browse more pet salons with advanced search",ctaButton:"Download App Now",filter24Hour:"24-hour only",filtersLabel:"Filters",clearFilters:"Clear filters",resultsCount:"{{count}} salons",loadMore:"Load more",noResultsHint:"Try adjusting your search or filters to 
454see more results.",trustBadge:"Real user reviews",backToList:"Back to Salons",address:"Address",phone:"Phone",website:"Website",openingHours:"Opening Hours",closed:"Closed",gallery:"Photos",detail:{notFound:"Salon not found",servicesOverview:"Services at a glance",servicesOverviewSubtitle:"Key grooming services available here",callNow:"Call salon",getDirections:"Get directions",email:"Email",todayHours:"Open today",viewFullHours:"View full opening hours",hideFullHours:"Hide opening hours",reviewsTitle:"Reviews",reviewsSubtitle:"What other pet owners say",planVisit:"Visit details",noHoursToday:"Closed today or hours unavailable",suggestEdit:"Suggest edit",suggestEditPrompt:"Info outdated?",reviewsEmpty:"No reviews yet",businessReply:"Reply from this place",reviewsMoreTitle:"Want more reviews?",reviewsMoreDescription:"Download PetWell to read all reviews",businessReplyFrom:"Reply from {{placeName}}",businessReplyOfficial:"Official"}},Ym={pageTitle:"Pet Lodging",subtitle:"Discover pet lodging and pet hotels in Hong Kong - Kowloon, Hong Kong Island & New Territories",description:"Pet lodging search, user reviews, facilities and pricing reference",searchPlaceholder:"Search lodging name or address...",filterByRegion:"Filter by Region",regions:{all:"All Regions",kowloon:"Kowloon",hongKong:"Hong Kong Island",newTerritories:"New Territories",others:"Others"},loading:"Loading...",error:"Error loading pet lodging data",errorSubtitle:"Please try again later or contact support",noResults:"No pet lodging found in this region",services:"Services",reviews:"user reviews",ctaTitle:"Need to Find More Pet Lodging?",ctaDescription:"Download PetWell App to browse more pet lodging and pet hotels with advanced search",ctaButton:"Download App Now",filter24Hour:"24-hour only",filtersLabel:"Filters",clearFilters:"Clear filters",resultsCount:"{{count}} lodging options",loadMore:"Load more",noResultsHint:"Try adjusting your search or filters to see more results.",trustBadge:"Real user reviews",backToList:"Back to Lodging",address:"Address",phone:"Phone",website:"Website",openingHours:"Opening Hours",closed:"Closed",gallery:"Photos",detail:{notFound:"Lodging not found",servicesOverview:"Facilities at a glance",servicesOverviewSubtitle:"Key services and facilities available",callNow:"Call lodging",getDirections:"Get directions",email:"Email",todayHours:"Open today",viewFullHours:"View full opening hours",hideFullHours:"Hide opening hours",reviewsTitle:"Reviews",reviewsSubtitle:"What other pet owners say",planVisit:"Visit details",noHoursToday:"Closed today or hours unavailable",suggestEdit:"Suggest edit",suggestEditPrompt:"Info outdated?",reviewsEmpty:"No reviews yet",businessReply:"Reply from this place",reviewsMoreTitle:"Want more reviews?",reviewsMoreDescription:"Download PetWell to read all reviews",businessReplyFrom:"Reply from {{placeName}}",businessReplyOfficial:"Official"}},Qm={pageTitle:"Hong Kong Pet-Friendly Restaurant Guide",subtitle:"1,000+ real pet owner reviews to help you avoid the pitfalls",description:"The most comprehensive guide | PetWell is written by real Hong Kong pet owners to help you avoid traps and find truly pet-friendly restaurants.",seoTitle:"Hong Kong Pet-Friendly Restaurants 2026 | FEHD List + Owner Reviews | PetWell",seoDescription:"From 9 July 2026, about 989–1,000 FEHD-licensed dog-friendly restaurants may admit dogs. PetWell also phone-verifies indoor access and walk-in policy, plus real owner reviews.",seoKeywords:"pet friendly restaurant hong kong,dog friendly restaurant hong kong 2026,FEHD pet friendly restaurants,dog friendly dining hong kong,where to eat with dog hong kong,indoor pet friendly cafe hk,walk in dog restaurant,帶狗餐廳,香港寵物友善餐廳,狗隻友善食肆",seoStructuredDataName:"Hong Kong Pet-Friendly Restaurant Directory",enAliasPageTitle:"Pet-Friendly Restaurants in Hong Kong",enAliasSubtitle:"Team-verified restaurants where pets are welcome",enAliasDescription:"Browse Hong Kong pet-friendly restaurants verified by PetWell, with indoor access and walk-in filters.",enAliasSeoTitle:"Pet-Friendly Restaurants Hong Kong 2026 | Verified Dog-Friendly Dining | PetWell",enAliasSeoDescription:"Find verified pet-friendly restaurants in Hong Kong. Filter by district, indoor access, and walk-in policy — beyond the FEHD lottery list.",searchIntent:"PetWell is written by real Hong Kong pet owners to help you avoid traps and find truly pet-friendly restaurants.",directQuestion:"Which Hong Kong restaurants are actually safe to visit with your pet?",directAnswer:"From 9 July 2026, about 989–1,000 FEHD-licensed venues may legally admit dogs. PetWell goes further: we phone-verify indoor vs outdoor access and walk-in vs reservation, then add owner reviews and photos so you know if a place is truly pet-friendly before you go.",faqTitle:"Pet-Friendly Restaurant FAQ",faq:{q1:"Where can I find pet-friendly restaurants in Hong Kong?",a1:"You can find them across Hong Kong Island, Kowloon, and the New Territories, and filter by district to find nearby options.",q2:"What should I check before bringing my dog to a restaurant?",a2:"Check whether pets are allowed indoors, whether reservations are required, and if walk-ins are accepted before visiting.",q3:"How can I tell if a restaurant is truly pet-friendly?",a3:"Look for verification badges, policy tags, ratings, and real user feedback on pet access and dining experience.",q4:"Can I walk in, or do I need a reservation?",a4:"It depends on the venue policy. Use the walk-in filter or check each restaurant's entry policy label.",q5:"What's the difference between the FEHD list and PetWell verified restaurants?",a5:"The FEHD list shows licence-approved premises allowing dogs. PetWell verification means our team called to confirm pet policies including indoor access and walk-in rules.",q6:"What rules apply at FEHD-approved restaurants?",a6:"Typical rules include leashing, no dogs on tables, no contact with utensils, and no access to kitchen areas. See FEHD for full details.",q7:"Can I bring my cat to pet-friendly restaurants?",a7:"Policies vary. PetWell listings focus on dog-friendly venues — call ahead to confirm if cats are welcome.",q8:"Which areas have the most pet-friendly restaurants?",a8:"Hong Kong Island (Central, Wan Chai, Eastern) and Kowloon (Yau Tsim Mong, Kwun Tong) tend to have more options. Browse our 18-district pages for counts.",q9:"What changed on 9 July 2026 for dogs in restaurants?",a9:"FEHD's sc
454heme allowing dogs on licensed food premises took effect on 9 July 2026, covering about 989–1,000 venues. A licence is not the same as being truly pet-friendly: some are outdoor-only, some require reservations, and cats are not covered. PetWell confirms indoor and walk-in policy by phone."},howTo:{name:"How to choose a pet-friendly restaurant",description:"Use PetWell to quickly find a Hong Kong restaurant that welcomes your pet.",step1Name:"Pick an area",step1Text:"Filter by 18 districts or Hong Kong Island / Kowloon / New Territories, or search by name and address.",step2Name:"Check pet policies",step2Text:"Look for indoor access, walk-in, and PetWell verification badges.",step3Name:"Compare ratings and hours",step3Text:"Review user ratings, today's opening hours, and extras like Puppuccino.",step4Name:"Confirm before you go",step4Text:"Call ahead to confirm the latest policy, especially during peak hours or for large dogs."},hubSeo:{title:"Hong Kong's only pet-friendly restaurant review site — by owners, for owners",body:"Plenty of restaurants say they're pet-friendly, but the reality is often different: outdoor seating only, advance booking required, or dogs kept in strollers indoors. Don't let another owner get caught out — share your real experience here. You can post anonymously, upload photos, and speak your mind. Every review helps the next family bringing a pet out, and makes Hong Kong genuinely more pet-friendly.",fehdTitle:"2026 FEHD dog-in-restaurant scheme: licence vs truly pet-friendly",fehdBody:"FEHD's scheme took effect on 9 July 2026. About 989–1,000 licensed dog-friendly restaurants may legally admit dogs. A licence only means dogs are allowed — not that staff welcome pets indoors or accept walk-ins. PetWell verifies those policies by phone and adds owner reviews. Typical FEHD rules: leash no longer than 1.5m, no dogs on tables, no contact with utensils, and adult supervision. Use the FEHD-licensed filter or our searchable approved list to cross-check."},communityReviewsTitle:"Why leave a review?",communityReviewsBody:"PetWell isn't just a directory — it's a shared map built by Hong Kong pet owners. One honest comment, good or bad, helps the next family avoid a bad experience or discover a hidden gem. Post anonymously, add photos, tell the truth. All free.",districtPage:{indexTitle:"Pet-friendly restaurants by Hong Kong's 18 districts",indexSubtitle:"Find verified pet-friendly restaurants in every official district across HK Island, Kowloon, NT, and Islands.",indexSeoTitle:"Hong Kong 18 Districts Pet-Friendly Restaurants 2026 | PetWell",indexSeoDescription:"Browse pet-friendly restaurants and FEHD dog-friendly dining by Hong Kong's 18 districts. PetWell verified listings plus the 2026 licensed list.",indexSeoKeywords:"pet friendly restaurant by district hong kong,18 districts dog friendly dining,FEHD dog restaurant",pageTitle:"Pet-friendly restaurants in {{district}}",subtitle:"Verified pet-friendly dining in {{district}} ({{region}})",seoTitle:"{{district}} Pet-Friendly Restaurants 2026 | Dog-Friendly Dining | PetWell",seoDescription:"{{district}} has {{count}} PetWell verified pet-friendly restaurants. Filter by indoor access and walk-in, plus FEHD-licensed dog-friendly venues in the area.",seoKeywords:"{{district}} pet friendly restaurant,{{district}} dog friendly restaurant,{{district}} eat with dog,{{region}} pet dining",searchIntent:"Looking for pet-friendly restaurants in {{district}}? Here are PetWell verified options.",directQuestion:"Where are pet-friendly restaurants in {{district}}?",directAnswer:"{{district}} currently has {{count}} PetWell verified restaurants — {{indoorCount}} allow indoor access and {{walkInCount}} accept walk-ins.",faqTitle:"{{district}} pet-friendly restaurant FAQ",faq:{q1:"How many pet-friendly restaurants are in {{district}}?",a1:"PetWell lists {{count}} verified pet-friendly restaurants in {{district}}. If the count is low, see the FEHD directory on this page.",q2:"Which {{district}} restaurants allow indoor pet access?",a2:"Use the indoor access filter or check each listing's pet policy tags."},indexFaq:{q1:"How do I search by Hong Kong's 18 districts?",a1:"Pick your district to see PetWell verified restaurants and FEHD reference listings for that area.",q2:"How is this different from the main restaurant list?",a2:"District pages pre-filter to one area with localized SEO and FAQ content for faster discovery."},statsTitle:"How many pet-friendly restaurants in {{district}}?",statsBody:"{{district}} has {{count}} PetWell verified restaurants ({{indoorCount}} indoor, {{walkInCount}}
454 walk-in).",fehdCompare:"PetWell verified restaurants are phone-confirmed for pet policies. The FEHD list shows licence-approved dog-access premises — use both for reference.",hubLink:"All Hong Kong pet-friendly restaurants",fehdLink:"FEHD 1,000 approved list",allDistricts:"All 18 districts",districtNavTitle:"Browse by Hong Kong's 18 districts",districtNavDescription:"Select a district to see verified pet-friendly restaurants in that area.",noResults:"No PetWell verified restaurants match in {{district}} yet",noResultsHint:"Try the FEHD directory below or browse nearby districts.",listAriaLabel:"Pet-friendly restaurants in {{district}}"},regionPage:{pageTitle:"Pet-friendly restaurants in {{region}}",subtitle:"Verified pet-friendly dining across {{region}}",seoTitle:"{{region}} Pet-Friendly Restaurants 2026 | Dog-Friendly Dining | PetWell",seoDescription:"{{region}} has {{count}} PetWell verified pet-friendly restaurants. Filter by indoor access and walk-in across FEHD-licensed venues in the region.",seoKeywords:"{{region}} pet friendly restaurant,{{region}} dog friendly dining,{{region}} eat with dog"},searchPlaceholder:"Search restaurant name or address...",filterByRegion:"Filter by Region",filterWalkIn:"Walk-in allowed",filterFehdLicensed:"FEHD licensed",filtersLabel:"Restaurant filters",heroEyebrow:"Verified dining guide",verifiedPanelTitle:"Every listing is PetWell verified",verifiedPanelDescription:"We confirm pet policies before a restaurant appears here — so you know what's allowed before you go.",resultsCount:"{{count}} verified restaurants",showingCount:"Showing {{shown}} of {{total}}",loadMore:"Load more",clearFilters:"Clear filters",regions:{all:"All Regions",kowloon:"Kowloon",hongKong:"Hong Kong Island",newTerritories:"New Territories",others:"Others"},loading:"Loading...",error:"Error loading restaurant data",errorSubtitle:"Please try again later or contact support",noResults:"No pet-friendly restaurants found",noResultsHint:"Try adjusting your search or filters to see more results.",searchingMore:"Searching more restaurants that match your filters…",backToList:"Back to Restaurants",petPolicy:"Pet Policy",contactInfo:"Contact Information",address:"Address",phone:"Phone",website:"Website",openingHours:"Opening Hours",closed:"Closed",gallery:"Photos",ctaTitle:"Just visited a restaurant? Leave a review!",ctaDescription:"Hong Kong's only pet-friendly restaurant review site. Help the next owner avoid a bad experience — post anonymously, add photos, tell the truth.",ctaButton:"Download App Now",detail:{notFound:"Restaurant not found",decisionTitle:"Dining with your pet · essentials",decisionSubtitle:"Confirm pet policy before you go",callNow:"Call",getDirections:"Directions",visitWebsite:"Website",todayHours:"Open today",viewFullHours:"View full opening hours",hideFullHours:"Hide opening hours",reviewsTitle:"Reviews",reviewsSubtitle:"What other pet owners say",planVisit:"Visit details",noHoursToday:"Closed today or hours unavailable",nearbyTitle:"Other pet-friendly restaurants nearby",nearbySubtitle:"More verified restaurants within 3 km of {{district}}",nearbySubtitleDefault:"Other verified restaurants within {{radius}} km",nearbyCount:"{{count}} places",nearbyEmpty:"No other verified pet-friendly restaurants found nearby",nearbyShowMore:"Show {{count}} more",nearbyShowLess:"Show less",nearbyDistanceM:"{{m}} m",nearbyDistanceKm:"{{km}} km",reviewsEmpty:"No reviews yet",businessReply:"Reply from this place",suggestEdit:"Suggest edit",suggestEditPrompt:"Info outdated?",sections:{overview:"About",petPolicy:"Pet policy",reviews:"Reviews",info:"Location & contact"},faq:{q1:"Can I bring my dog to {{name}}?",a1:"{{name}} is a PetWell verified pet-friendly restaurant, currently listed as {{policy}}.",q2:"Do I need a reservation for {{name}}?",a2:"Check the entry policy tag (walk-in / reservation required) and call ahead to confirm.",q3:"What rules apply when bringing a dog to {{name}}?",a3:"Keep your dog leashed and follow venue rules. At FEHD-approved premises, dogs must not go on tables or contact utensils."},businessReplyFrom:"Reply from {{placeName}}",businessReplyOfficial:"Official"}},Xm={seoTitle:"Pet Allergy and Pathogen Test Booking | PetWell",seoDescription:"Book professional pet diagnostic testing for allergy IgE screening and PCR pathogen detection, with clinically relevant reporting for veterinary follow-up.",seoKeywords:"pet test booking,allergen test,pcr test,pet diagnostics,petwell payment",structuredDataName:"PetWell Pet Testing Booking",structuredDataSpecialty:"Veterinary medicine",badge:"Veterinary diagnostics",title:"Pet Diagnostic Test Booking",subt
454itle:"Choose a professional diagnostic service for allergy investigation or pathogen screening, then submit your booking details for clinic follow-up.",testPriceNotice:"Booking price: HKD {{price}} per service",buyerInfoTitle:"Buyer Information",buyerInfoDesc:"Used for booking confirmation and clinic follow-up.",checkoutModalTitle:"Complete Your Booking",checkoutModalDesc:"You are booking {{productName}}. Log in to continue, or fill in your personal info below.",authChoiceTitle:"Already have a PetWell account?",authChoiceDesc:"You can log in to continue, or fill in your personal info below to proceed with this email.",loginToContinue:"Login to continue",heroPrimaryCta:"Book Allergen IgE Test",heroSecondaryCta:"Book PCR Screening",heroKeywords:{igeAllergy:"IgE allergy test",pcrPathogen:"PCR pathogen screening",rastClass:"RAST class 0-3",serumSample:"Serum sample",veterinaryDiagnostics:"Veterinary diagnostics"},keywords:{ige:"IgE",rast:"RAST 0-3",auMl:"AU/mL",serum:"Serum",enzymeImmunoblot:"Enzyme immunoblot",pcr:"PCR",respiratory:"Respiratory",gastrointestinal:"Gastrointestinal",zoonotic:"Zoonotic pathogens",pcrTargets:"100+ targets"},labCardLabel:"Veterinary diagnostic service",labCardTitle:"Pet allergy + pathogen testing",labCardDesc:"Built for veterinary-led decisions: quantitative results, clinical correlation, and clear reporting for owners and clinics.",stats:{allergens:"Allergen panel",pcrTargets:"PCR screening",sample:"Serum sample",rast:"RAST class"},valueProps:{quantitativeTitle:"Quantitative detection",quantitativeDesc:"Allergen-specific IgE values are reported in AU/mL and mapped to RAST classes for clearer interpretation.",clinicalTitle:"Clinical relevance",clinicalDesc:"Designed for allergy, respiratory, and gastrointestinal workups when symptoms need deeper investigation.",reportTitle:"Professional report",reportDesc:"Structured report fields include sample ID, specimen type, test method, result class, and interpretation notes.",workflowTitle:"Simple booking flow",workflowDesc:"Choose the test, submit booking details, pay online, and let the clinic/lab proceed with fulfilment."},productSectionBadge:"Diagnostic options",productSectionTitle:"Choose the right test for your pet's symptoms",productSectionDesc:"Two focused veterinary diagnostic services for allergy investigation and pathogen screening.",productMeta:{bestFor:"Best for",method:"Method",sample:"Sample",turnaround:"Report focus"},methodology:{badge:"Medical method",title:"How the CANINE PRO allergy report is interpreted",desc1:"The CANINE PRO allergy report detects specific IgE antibodies from serum using a quantitative enzyme immunoblot assay. Reaction intensity is scanned optically and converted into allergen-specific IgE titers.",desc2:"Results are expressed in AU/mL and attributed to RAST class 0 to 3: not found, moderate, serious, and severe. The report covers mites and mould, plants and pollens, food allergens, insects, and miscellaneous allergens."},workflow:{step1Title:"Select a diagnostic service",step1Desc:"Choose IgE allergy testing or PCR pathogen screening based on the clinical concern.",step2Title:"Enter booking details",step2Desc:"Provide owner contact, pet name, clinic, notes, and preferred booking time.",step3Title:"Complete payment online",step3Desc:"Complete payment online and submit the booking for clinic follow-up.",step4Title:"Clinic/lab fulfilment",step4Desc:"The booking record is sent to operations for follow-up, reporting, and lab coordination."},medicalDisclaimer:"This service supports veterinary assessment and should be interpreted together with clinical signs and professional advice. It is not a standalone diagnosis or treatment plan.",faq:{q1:"What does the allergy test measure?",a1:"It measures allergen-specific IgE antibody levels from serum and reports them as AU/mL with RAST class 0 to 3.",q2:"Which pets may benefit from testing?",a2:"Pets with suspected allergy, recurring skin irritation, respiratory signs, gastrointestinal signs, or unexplained sensitivity may be candidates after veterinary assessment.",q3:"Is PCR the same as an allergy test?",a3:"No. PCR screening looks for pathogen genetic material, while IgE allergy testing evaluates immune response to allergens."},form:{firstName:"First Name",firstNamePlaceholder:"e.g. Wing",lastName:"Last Name",lastNamePlaceholder:"e.g. Chan",email:"Email",emailPlaceholder:"[email protected]",phone:"Phone",phonePlaceholder:"+852 9123 4567",petName:"Pet Name",petNamePlaceholder:"e.g. Cocoa",bookingClinic:"Clinic",bookingClinicPlaceholder:"Select a clinic",bookingTimeContactPrompt:"After payment, the selected clinic will contact you directly to confirm the appointment time, sample arrangement, and any follow-up details.",bookingTimeContactRecord:"Clinic will contact customer directly",notes:"Notes",notesPlaceholder:"Optional notes"},clinicInfo:{phone:"Phone",address:"Address",hours:"Opening hours"},clinics:{fairview:{name:"錦绣動物診所 Fairview Veterinary Clinic",phone:"24718980",address:"新界元朗馬田村201號 201 Ma Tin Tsuen, Yuen Long, NT",hours:"10:00 - 13:00, 15:00 - 19:00"}
454,ivet:{name:"iPet Animal Clinic",phone:"2561 1116",address:"太子基隆街46號地下",hours:"Wed, Thu, Fri, Sat and Sun 11:00 - 20:00"},parkIsland:{name:"珀麗灣獸醫診所 Pets Central (Park Island)",phone:"67383280",address:"香港馬灣珀麗路8號 G/F, 322 Ma Wan Main Street Village North, Ma Wan, NT",hours:"No fixed office hours. The clinic will tailor the arrangement and contact you directly."}},products:{allergen:{name:"Feline/Canine PRO 125 - Allergen IgE Allergy Test",shortName:"PRO 125 IgE",description:"One complete panel covering 125 clinically relevant allergens for pets with potential skin, respiratory, or GI allergy concerns.",h1:"Environmental and mite allergen coverage",h2:"Pollens and plant allergen coverage",h3:"Food + insect and miscellaneous allergen coverage",bestFor:"Allergy investigation",method:"Quantitative enzyme immunoblot assay",sample:"Serum specimen",turnaround:"IgE AU/mL + RAST class"},pcr:{name:"Feline/Canine 100+ PCR Test",shortName:"100+ PCR",description:"Ultra-fast PCR panel for respiratory, gastrointestinal, and zoonotic pathogen screening in cats and dogs.",h1:"Respiratory and gastrointestinal panel",h2:"Zoonotic pathogen screening items",h3:"Broad feline and canine pathogen coverage",bestFor:"Pathogen screening",method:"PCR amplification",sample:"Clinic-collected specimen",turnaround:"Respiratory/GI pathogen panel"}},priceLabel:"Test Price",offer:{label:"Member exclusive",title:"Early booking discount",off:"OFF",originalPrice:"Original price",todayPrice:"Today",savings:"You save {{currency}} {{amount}} with this booking."},comingSoon:{badge:"Coming soon",title:"PCR booking opens soon",desc:"We are preparing clinic availability for this PCR panel. Booking and payment will be available once the next service window is confirmed.",button:"Coming Soon"},buyNow:"Pay and Book Now",processing:"Preparing checkout...",footnote:"Booking price: {{currency}} {{price}}.",todoNotice:"Booking records are saved for clinic and operations follow-up.",toast:{loginRequiredTitle:"Login required",loginRequiredDesc:"Please log in to create a payment link.",missingFieldsTitle:"Required fields missing",missingFieldsDesc:"Please fill first name, last name, email, phone, pet name, and clinic.",paymentFailedTitle:"Failed to create payment link",paymentFailedDesc:"Please try again later."}},Jm={verifiedTrue:"Pet-friendly verified",petWellVerified:"PetWell Verified",fehdLicensed:"FEHD Licensed",premiumPartner:"Premium Partner",listingAlertTitle:"Notice",listingAlertChip:"Not pet-friendly",notPetFriendly:"Not pet-friendly",petEntryPolicy:{walkInOnly:"Walk-in only",reservationRequired:"Reservation required",both:"Walk-in or reservation"},petAccessArea:{indoorAllowed:"Indoor allowed",outdoorOnly:"Outdoor only"},import:{title:"Restaurant insights",subtitle:"Type, price range, amenities and ratings",types:"Venue type",cuisines:"Cuisine",dishStyles:"Dish style",priceRange:"Price range",amenitiesTitle:"Pet-friendly amenities",amenities:{waterBowl:"Water bowl",dogMenu:"Dog menu",petTreats:"Pet treats",groomingServices:"Grooming",petStore:"Pet store",sanitationKits:"Sanitation kits",photoArea:"Photo spot",petFirstAidKit:"Pet first aid",employeePetTraining:"Staff pet training",nutritionLabelsProvided:"Nutrition labels"}}},Zm={pageTitle:"Animal Welfare Organizations in Hong Kong",subtitle:"Support Animal Welfare - Donate, Volunteer, Make a Difference",description:"Discover local animal NGOs working to protect and care for animals in need",searchPlaceholder:"Search organization name or description...",filterByRegion:"Filter by Region",regions:{all:"All Regions",kowloon:"Kowloon",hongKong:"Hong Kong Island",newTerritories:"New Territories"},noResults:"No organizations found",established:"Established",activeCampaigns:"active campaigns",volunteerEvents:"volunteer events",backToList:"Back to Organizations",notFound:"Organization not found",address:"Address",phone:"Phone",email:"Email",website:"Website",mission:"Our Mission",services:"Services We Provide",donationCampaigns:"Donation Campaigns",donationDescription:"Support our campaigns to make a difference for animals in need",progress:"Progress",donors:"donors",endDate:"End Date",donate:"Donate Now",volunteerDescription:"Join us and make a hands-on difference in animal welfare",requirements:"Requirements",spotsLeft:"spots left",fullBooked:"Full",enroll:"Enroll"},ef={quickLinks:"Quick Links",legal:"Legal",explore:"Go out together",care:"Get care",community:"Community",company:"PetWell",follow:"Follow us",terms:"Terms & Privacy Policy",privacy:"Privacy Policy",copyright:"© 2026 PetWell HK Limited. All rights reserved",tagline:"Hong Kong's first all-in-one pet health management platform",suggestPlace:"Suggest a place",feedback:"Feedback"},tf={suggestTitle:"Suggest a new place",suggestDesc:"Tell us about a pet-friendly place we don't have yet.",suggestTab:"Suggest place",suggestCategory:"Place type",suggestName:"Place name",suggestNamePlaceholder:"Enter place name…",suggestAddressOptional:"Address (optional)",suggestAddressPlaceholder:"Street, district, or landmark…",suggestNotesOptional:"Notes (optional)",suggestNotesPlaceholder:"Anything helpful — pet policy, hours, website…",suggestSubmit:"Submit suggestion",suggestEmptyCta:"Can't find it? Suggest a new place",successTitle:"Submitted",successDesc:"Thanks. We will follow up soon.",suggestSuccessDesc:"Thank y
454ou. We've received your suggestion and will review it."},of={learnMore:"Learn More",downloadApp:"Download PetWell Now",rating:"Rating",outOf5:"/5",loading:"Loading...",cancel:"Cancel"},nf={open247:"Open 24/7",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday",sun:"Sunday",noInfo:"No information available"},rf={title:"Pet Owners Forum",subtitle:"Share Experiences · Help Each Other · Build a Pet-Friendly Community",loading:"Loading...",error:"Unable to load forum content. Please try again later",noContent:"No discussions yet",retry:"Retry",backToForum:"Back to Forum",replies:"Replies",noReplies:"No replies yet",postNotFound:"Post not found",invalidPostId:"Invalid post ID",searchPlaceholder:"Search posts...",filterCategory:"Category",filterTag:"Tag",allCategories:"All Categories",allTags:"All Tags",sortRecent:"Recent",sortPopular:"Popular",sortReplies:"Most Replies",tableTitle:"Title",tableAuthor:"Author",tableDate:"Date",tableViews:"Views/Replies",tableLastReply:"Last Reply",showingResults:"Showing {{count}} results",pagination:{previous:"Previous",next:"Next"},time:{hoursAgo:"hours ago",daysAgo:"days ago"},forumListCta:{title:"Want to See More Discussions?",description:"Download PetWell App to browse more posts, share your opinions, and interact with other pet owners!",button:"Download PetWell Now"},postDetailCta:{title:"Want to Share Your Opinion?",description:"Download PetWell App to join discussions, leave comments, and share experiences and advice with other pet owners!",button:"Download PetWell Now"},createPost:{button:"Create Post",title:"Create New Post",description:"Share your thoughts, ask questions, or start a discussion with the community",loginRequired:"Login Required",loginRequiredDesc:"Please log in to create a post",titleLabel:"Title",titlePlaceholder:"Enter post title",contentLabel:"Content",contentPlaceholder:"Write your post content here...",tagsLabel:"Tags",tagsPlaceholder:"e.g., clinic, lost pet, advice",tagsHint:"Separate tags with commas (max 10 tags)",categoryLabel:"Category",categoryPlaceholder:"Select category",locationLabel:"Location",locationPlaceholder:"e.g., Hong Kong Island, Kowloon",characters:"characters",creating:"Creating...",submit:"Create Post",error:"Failed to create post. Please try again.",anonymousLabel:"Post Anonymously",anonymousHint:"Your identity will be hidden",editor:{bold:"Bold",underline:"Underline",strikethrough:"Strikethrough",fontSize:"Font Size",small:"Small (12px)",medium:"Medium (24px)",large:"Large (36px)",textColor:"Text Color",insertLink:"Insert Link",urlLabel:"URL",urlPlaceholder:"https://example.com",linkTextLabel:"Link Text (optional)",linkTextPlaceholder:"Click here",alignLeft:"Align Left",alignCenter:"Align Center",alignRight:"Align Right"}},askVet:{cta:"Ask a vet/nurse",feed:"Ask a vet/nurse",queue:"Needs reply",myQuestions:"My questions",composeTitle:"Ask a vet/nurse",composeSubtitle:"Just write the question. Go to a clinic in an emergency.",contentPlaceholder:"What’s going on? Species, age, symptoms, and when it started. Photos help.",addPhoto:"Add photos",questionRequired:"Please write your question first.",visibilityLabel:"Who can see this",public:"Public",private:"Private",publicHint:"Others can read this later.",privateHint:"Only you and the team can see this.",disclaimer:"I understand this is not a diagnosis, prescription, or emergency care.",disclaimerRequired:"Please accept the disclaimer first.",submit:"Send",teamReplyHint:"You will reply as the PetWell vet/nurse team",bannerTitle:"Ask a vet/nurse",bannerBody:"Answered by the PetWell vet/nurse team, usually within 24 hours. Ask in public or privately."},sortBy:"Sort By",sortHot:"For you",untitled:"Untitled",desktop:{navLabel:"Forum navigation",discoverLabel:"Search and trending",home:"Home",post:"Post",topics:"Topics",buzzing:"What's happening",replyPlaceholder:"Post your reply",reply:"Reply",photo:"Photo",clearReplyTo:"Cancel reply"},advancedSearch:"Advanced Search",hideAdvancedSearch:"Hide",showAdvancedSearch:"Advanced Search",dateFrom:"Start Date",dateTo:"End Date",selectedTags:"Selected Tags",clearFilters:"Clear Filters",pages:"pages",anonymousUser:"Anonymous User",genericUser:"User",anonymous:"Anonymous",pinned:"Pinned",loadingMore:"Loading more...",selectPost:"Select a post from the left to view content",categories:{DOG:"Dogs",CAT:"Cats",SMALL_ANIMAL:"Small Animals",LIFE_SHARING:"Life Sharing",EVENTS:"Events",ADOPTION:"Adoption",HEALTH:"Health",GROOMING:"Grooming",DIET:"Diet",TRAINING:"Training",BEHAVIOR:"Behavior Issues",PRODUCT_REVIEW:"Product Reviews",TRADING:"Trading",TRAVEL:"Travel",LODGING:"Lodging",LOST_FOUND:"Lost & Found",EMERGENCY:"Emergency"}},af={title:"Delete Account",warning:"This action cannot be undone. Once you delete your account, all your data will be permanently removed.",whatHappens:"What happens when you delete your account?",consequence1:"Your personal information and account details will be permanently deleted",consequence2:"All your pet health records will be removed",consequence3:"You will not be able to register with this email address again",consequence4:"This action cannot be reversed",confirmTitle:"Confirm Deletion",emailLabel:"Confirm Email Address",emailPlaceholder:"Enter your email address",emailHint:"Please enter the email address you used to register your account",typeDelete:"Type 'DELET
454E' to confirm",deletePlaceholder:"DELETE",understand:"I understand this action is irreversible and confirm I want to delete my account",cancel:"Cancel",deleteButton:"Delete Account",finalWarning:"Final Confirmation",finalWarningMessage:"Are you absolutely sure you want to permanently delete your account? This action cannot be undone.",confirmDelete:"Confirm Delete",deleting:"Deleting...",success:"Account Deleted",successMessage:"Your account has been successfully deleted.",error:"Error",errorMessage:"An error occurred while deleting your account. Please try again later or contact support.",confirmError:"Please type 'DELETE' to confirm",checkboxError:"Please confirm you understand the consequences",emailMismatch:"Email address does not match. Please enter the email you used to register"},sf={needsActivation:"This tag needs to be activated",activationDescription:"To view pet information and owner contact details, please download the PetWell App and activate this tag.",downloadPetWell:"Download PetWell Now",alreadyActivated:"Already activated? Please log in to the App to view",foundLostPet:"You found a lost pet!",thankYouMessage:"Thank you for helping this pet. Below is the owner's contact information, please contact them as soon as possible.",age:"Age",yearsOld:"years old",species:"Species",speciesValues:{dog:"Dog",dogs:"Dogs",cat:"Cat",cats:"Cats"},breed:"Breed",weight:"Weight",birthday:"Birthday",microchipId:"Microchip ID",contactOwner:"Contact Owner",callOwnerNow:"Call Owner Now",phoneNotAvailable:"Phone number not available",footer:"Powered by PetWell · Protecting every pet",notActivated:{title:"Pet is Not Activated",description:"This pet tag hasn't been activated yet. Activate it now to help protect your pet from getting lost.",cta:"Activate Now"}},lf={externalUserFrom:"External User from {{source}}",fromGoogle:"Google review"},cf={alreadyActivated:{title:"Pet is Already Activated",description:"This pet tag has already been activated. You can view the pet's information.",cta:"View Pet Info"}},df={seo:{title:"Download PetWell App | Hong Kong Pet Health",description:"Free download of PetWell — Hong Kong vet clinic reviews, pet-friendly restaurants, health records and price alerts. Available on iOS and Android.",keywords:"PetWell App, download pet app, Hong Kong pet health, vet clinic app, pet-friendly restaurants app"},eyebrow:"Free · iOS and Android",title:"Hong Kong pet life",titleHighlight:"in your pocket.",subtitle:"Free on iPhone and Android.",aboutCta:"Want to know more? About us",subtitle1:"Hong Kong's First Pet Health Management Platform",subtitle2:"All-in-One Care for Your Furry Friend",primaryIos:"Download on the App Store",primaryAndroid:"Get it on Google Play",openStore:"Open the app store",scanLabel:"Scan to download",scanHint:"Point your camera at the QR code to open the matching store.",storesLabel:"Choose your store",recommended:"Recommended",appStoreAlt:"Download PetWell on the App Store",playStoreAlt:"Get PetWell on Google Play",previewAlt:"PetWell app screens: clinic search, price comparison, and pet-friendly restaurants",whyEyebrow:"Why the app",whyTitle:"The web is for browsing. The app is for keeping up.",reasons:{alerts:{title:"Price and emergency alerts",description:"Deals, wishlists, and 24-hour clinic info reach your phone first."},records:{title:"Health records with you",description:"Vaccines, ER visits, and medications stay on file when you switch vets."},places:{title:"Hong Kong, searchable",description:"200+ clinics and 1,500+ pet-friendly restaurants — maps, phone, reviews."},free:{title:"Completely free",description:"Download, reviews, and health records cost nothing."}},ctaTitle:"Limited-time offer",ctaDescription:"After you install the app, reserve a free anti-lost smart pet tag.",feature1:"Real-time GPS tracking",feature2:"One-tap owner contact",feature3:"Lifetime warranty service",ctaButton:"Claim a free smart pet tag",disclaimer:"Limited quantity, while supplies last.",faqTitle:"Download questions",faq:{platforms:{question:"Which phones are supported?",answer:"iPhone via the App Store and Android via Google Play. Search “PetWell HK” — it’s free."},needApp:{question:"Do I have to download the app?",answer:"The website is enough for browsing restaurants and clinics. The app is for alerts, health records, and checking emergency clinics on the go."},desktop:{question:"How do I download from a computer?",answer:"Scan the QR code on this page with your phone, or open the App Store / Google Play and search PetWell HK."}}},uf={status:{startingSoon:"Starting Soon",upcoming:"Upcoming",ongoing:"Ongoing",completed:"Finished",cancelled:"Cancelled"},featured:"Featured activity",featuredBadge:"Featured",filters:{allStatuses:"All Statuses"},categories:{ADOPTION:"Adoption",MARKET:"Pet Market",EXPO:"Pet Expo",WORKSHOP:"Workshop / Class",CHARITY:"Charity",MEETUP:"Pet Meetup",PET_FRIENDLY:"Pet-fr
454iendly Event",OTHER:"Other Event"},detail:{invalidId:"Invalid event ID",notFound:"Event not found",loadFailed:"Failed to load event",backToEvents:"Back to events",defaultSeoDescription:"Hong Kong pet event information",unknownOrganizer:"Organizer not provided",officialInfo:"Official info",date:"Date",location:"Location",organizer:"Organizer",price:"Price",notProvided:"Not provided",free:"Free",aboutEvent:"About This Event",remark:"Remark",allFields:"Event Data",category:"Category",statusLabel:"Status",organizerEmail:"Organizer email",dateTime:"Start time",deadline:"Deadline / end time",openTime:"Open time",closeTime:"Close time",address:"Address",district:"District",capacity:"Capacity",attendees:"Attendees",paymentRequired:"Payment required",redirection:"External link",redirectedUrl:"Official / registration link",photoCount:"Photo count",createdAt:"Created at",updatedAt:"Updated at",unlimited:"Unlimited",yes:"Yes",no:"No",photos:"Event Photos",endDate:"End time",hours:"Opening hours",where:"Where",availability:"Availability",spotsLeft:"{{count}} spots left",openOfficialLink:"Open official / registration page",noOfficialLink:"No official link provided",quickInfo:"Quick Info",hasOfficialLink:"Official link available",hasI18n:"Chinese and English content available"}},pf={title:"Admin Forms",redirecting:"Redirecting to Google Form..."},hf={ariaLabel:"Anti-lost smart tag promotion",badge:"Free",title:"Smart Anti-Lost Tag",subtitle:"NFC tap-to-read — help reunite lost pets faster",progressLabel:"Registration",cta:"Register"},mf={eyebrow:"Limited free offer",title:"Get a free PetWell anti-lost name tag",tagline:"Like Octopus — one tap shows your pet’s private page",time:"Done in about 1 minute",urgency:"Limited spots — first come, first served.",cta:"Claim for free",imageAlt:"PetWell Paws Port anti-lost name tag promo"},ff={title:"Furkid Immersive Taiwan Mid-Autumn Festival",description:"25–27 Sep 2026 at AquaBeat, Kwun Tong Promenade. Free entry, pets welcome. Swipe for event details.",page1Alt:"Furkid Immersive Taiwan Mid-Autumn Festival poster",page2Alt:"Furkid Immersive Taiwan Mid-Autumn Festival activity details"},gf={allProducts:"All Products",cart:"Cart",backToList:"Back to Products",productNotFound:"Product Not Found",productNotFoundDesc:"This product may not exist or has been removed",customizable:"Customizable",selectOption:"Select Option:",uploadPhoto:"Upload Pet Photo:",chooseFile:"Choose File",noFileChosen:"No file chosen",uploadedPreview:"Uploaded pet photo preview:",selected:"Selected:",dimensions:"Dimensions:",dimensionsLabel:"Dimensions",material:"Material:",selectOptionForPrice:"(Select option to see price)",quantity:"Quantity",quantityLabel:"Quantity:",addToCart:"Add to Cart",buyNow:"Buy Now",productDetails:"Product Details",shippingPayment:"Shipping & Payment",shippingInfo:"Free shipping in HK (orders over HK$300)",paymentMethods:"Payment: PayMe / Bank Transfer / FPS",processingTime:"Processing time: 3-5 business days",selectOptionError:"Please select an option",selectOptionErrorDesc:"Please select a product option before adding to cart",uploadPhotoError:"Please upload a photo",uploadPhotoErrorDesc:"This product requires a pet photo",addedToCart:"Added to Cart",addedToCartDesc:"has been added to your cart",priceViewHint:"Please select style to view total price",items:"items",specs:{redPocketPaper:"200g Matte Coated Pa
454per",petBackpackMaterial:"Plush",rectangle:"Rectangle",diamond:"Diamond",rectangleSpecs:"10.5 × 29.7 cm · 128g Glossy Paper",diamondSpecs:"21 × 21 cm · 128g Glossy Paper"},shippingInfoDetails:{freeShippingThreshold:"Free shipping for orders over HK$200",sfExpress:"SF Express +$30",regularMail:"Regular Mail +$15",paymentMethods:"Payment: FPS / Bank Transfer / PayMe / Alipay",emailNotification:"Payment details will be sent via email after order confirmation",shippingDeadline:"All products will be shipped before February 12",imageDisclaimer:"Images are for reference only, actual products may vary",inquiry:"Inquiry:",whatsapp:"WhatsApp"},priceViewDetails:"Please check details for price",categories:{accessory:"Accessory",decoration:"Decoration",toy:"Toy",gift:"Gift"},discountBanner:{title:"PetWell Members Get 10% Off!",description:"Use your registered PetWell App email at checkout to automatically receive 10% discount",cta:"Download App Now"}},yf={title:"Fill Order Information",name:"Name",namePlaceholder:"Enter your name",email:"Email",emailPlaceholder:"[email protected]",phone:"Phone Number",phonePlaceholder:"12345678",phoneHint:"Please enter an 8-digit phone number",shippingAddress:"Shipping Address",shippingAddressPlaceholder:"Enter your complete shipping address",remark:"Remark (Optional)",remarkPlaceholder:"If you have special requirements or remarks, please enter them here",submit:"Proceed to Payment",backToCart:"Back to Cart",emptyCart:"Cart is Empty",emptyCartDesc:"Please select products before checkout",browseProducts:"Browse Products",orderSummary:"Order Summary",total:"Total",deliveryOption:"Delivery Option",sfExpress:"SF Express",regularMail:"Regular Mail",freeShipping:"Free",freeShippingThreshold:"Free shipping for orders over HK$200",shippingFee:"Shipping Fee",contactInfoReminder:"Important Notice",contactInfoReminderDesc:"Please ensure the contact information you provide is accurate so we can reach you. If you choose to upload pet photos later, we will contact you via the email or phone number you provided.",nameError:"Please enter your name",emailError:"Please enter your email",emailInvalid:"Please enter a valid email address",phoneError:"Please enter your phone number",phoneInvalid:"Please enter a valid phone number (8 digits)",shippingAddressError:"Please enter shipping address",validationError:"Please check your input",validationErrorDesc:"Please fill in all required fields",subtotal:"Subtotal",discount:"Discount",memberDiscount:"Member Discount {{percent}}%",discountApplied:"{{percent}}% member discount applied!",discountInfo:"PetWell users get 10% off! Use your registered email address.",downloadAppLink:"Download PetWell App now"},vf={title:"Upload Payment Proof",backToCheckout:"Back to Checkout",paymentMethod:"Payment Method",paymentMethodDesc:"Please complete payment and upload a screenshot as proof. We will process your order after confirming payment.",paymentInfo:"Payment Information:",paymentInfoDetails:"Bank Transfer / FPS / Other Payment Methods",paymentInfoNote:"(Payment details will be sent via email after order submission)",paymentProof:"Payment Proof Screenshot",uploadPaymentProof:"Click to upload payment screenshot",uploadPaymentProofHint:"Supports JPG, PNG formats, file size not exceeding 5MB",paymentProofPreview:"Payment Proof Preview",submitOrder:"Submit Order",processing:"Processing...",orderSummary:"Order Summary",name:"Name",email:"Email",phone:"Phone Number",shippingAddress:"Shipping Address",deliveryMethod:"Delivery Method",sfExpress:"SF Express",regularMail:"Regular Mail",shippingFee:"Shipping Fee",freeShipping:"Free",remark:"Remark",total:"Total",uploadPaymentProofError:"Please upload payment proof",uploadPaymentProofErrorDesc:"Please upload payment screenshot before submitting order",fileTooLarge:"File Too Large",fileTooLargeDesc:"Please upload an image smaller than 5MB",invalidFileType:"Invalid File Type",invalidFileTypeDesc:"Please upload an image file",invalidFileTypeDetailed:"Unsupported file format: {{fileType}}. Please upload an image file in JPG, PNG, WEBP, or HEIC format.",supportedFormats:"Supported formats: JPG, PNG, WEBP, HEIC",unknownFormat:"Unknown Format",orderSuccess:"Order Submitted Successfully!",orderSuccessDesc:"We have received your order and will process it as soon as possible.",orderError:"Submission Failed",orderErrorDesc:"An error occurred while submitting the order. Please try again later or contact us.",cannotContinue:"Cannot Continue",cannotContinueDesc:"Please complete order information first",petPhotoUpload:{title:"Upload Pet Photos",description:"Your order 
454contains customizable products. Please upload pet photos to complete your order.",uploadNow:"Upload Now",uploadLater:"Upload Later",uploadLaterDesc:"If you choose to upload later, we will contact you via the contact information you provided to request pet photo upload.",uploadNowDesc:"Please upload pet photos for each customizable product",noCustomizableProducts:"Your order does not contain customizable products. No pet photo upload is required.",missingPhotos:"Please upload photos for the following products: {{products}}",changeMind:"Change Selection",edit:"Edit",reset:"Reset",resetSuccess:"Reset",resetSuccessDesc:"Photo removed, please upload again",uploadPhoto:"Upload Photo",changePhoto:"Change Photo"},productImageEditor:{title:"Edit Product Design",uploadPhoto:"Upload Photo",processing:"Processing",processingDesc:"AI processing takes time, please be patient and don't leave the page",processingText:"Processing, please wait...",waitReminder:"⏱️ AI processing takes time, please be patient and don't leave the page",addDecoration:"Add Festive Decoration",confirm:"Confirm",confirmDesign:"Confirm Design",cancel:"Cancel",uploadHint:"🤖 AI auto-detects pet head, drag to adjust position and size",photoGuidance:"📷 Please upload a clear pet photo for accurate AI detection. For any issues,",whatsappUs:"WhatsApp us",aiMode:"",front:"Front",back:"Back",emptyState:"Upload pet photos to start designing",instructions:{click:"",resize:"",rotate:"",scale:"",multiple:""},controls:{rotateLeft:"Rotate Left",rotateRight:"Rotate Right",zoomIn:"Zoom In",zoomOut:"Zoom Out",delete:"Delete"},viewControls:{locked:"Locked",unlocked:"Drag",lockTitle:"Unlock drag to move",unlockTitle:"Lock drag to move",altDragTip:"Alt+Drag to move"},longProcessing:{title:"Processing Taking Longer",description:"The uploaded photo may be large and requires more time to process, please be patient..."},error:{title:"Error",generic:"AI detection failed, please try again later",timeout:"AI processing timeout, please try uploading a smaller image or try again later",memory:"AI processing out of memory, please try uploading a smaller image or try again later",server:"AI service temporarily unavailable, please try uploading a smaller image or try again later",network:"Network connection error, please check your internet connection and try again"}},uploadPayment:{title:"Order Details & Upload",description:"View your order details and upload payment proof or custom product images.",loading:"Loading order information...",orderNotFound:"Order Not Found",orderNotFoundDesc:"This order could not be found. Please verify the order ID is correct.",alreadyUploaded:"Payment Proof Already Uploaded",alreadyUploadedTitle:"Payment Proof Already Uploaded",alreadyUploadedDesc:"Payment proof for this order has already been uploaded. If you need to upload again, please contact us.",contactWhatsApp:"Contact WhatsApp {{number}}",backToProducts:"Back to Products",orderId:"Order ID",customerName:"Customer Name",customerEmail:"Customer Email",customerPhone:"Customer Phone",shippingAddress:"Shipping Address",deliveryOption:"Delivery Option",shippingFee:"Shipping Fee",totalPrice:"Total Price",orderDate:"Order Date",orderItems:"Order Items",noItems:"No items found",customProduct:"Custom Product",uploadCustomProduct:"Upload Custom Product Image",customProductUploaded:"Custom Product Image Uploaded",uploadCustomProductDesc:"Upload your custom product image for this item. You can use AI head detection or upload manually.",noCustomImage:"No custom image uploaded yet",uploading:"Uploading...",submit:"Submit Payment Proof",uploadCustomImage:"Upload Custom Image",updateCustomImage:"Update Custom Image",customImageSuccess:"Custom Image Uploaded Successfully!",customImageSuccessDesc:"Your custom product image has been uploaded successfully.",customImageError:"Upload Failed",customImageErrorDesc:"An error occurred while uploading custom image. Please try again later.",success:"Payment Proof Uploaded Successfully!",successDesc:"Your payment proof has been uploaded successfully. We will process your order as soon as possible.",error:"Upload Failed",errorDesc:"An error occurred while uploading payment proof. Please try again later or contact us.",orderDetails:"Order Details",contactInfo:"Contact Information",needHelp:"Need Help?",contactUsDesc:"If you have any questions about your order, please contact us via WhatsApp."}},wf={emptyCart:"Cart is Empty",emptyCartDesc:"Go shop for your favorite products!",browseProducts:"Browse Products",orderConfirmation:"Order Confirmation",orderConfirmationDesc:"Please confirm your order details, then proceed to checkout",orderItems:"Order Items",itemsCount:"items",spec:"Spec:",customImageUploaded:"Custom Image Uploaded",removed:"Removed",removedDesc:"Item has been removed from cart",clearCart:"Clear Cart",cleared:"Cleared",clearedDesc:"Cart has been cleared",orderSummary:"Order Summary",totalItems:"Total Items",itemsUnit:"items",total:"Total",proceedToCheckout:"Proceed to Checkout",continueShopping:"Continue Shopping",shippingInfo:"• Free shipping for orders over HK$200<br />• SF Express +HK$30 | Regular Mail +HK$15",freeShippingPrompt:"Spend HK${{amount}} more to get free shipping!",freeShippingQualified:"You qualify for free shipping!"},bf={title:"The Ultimate Pet Matchmaker: Fur, Feathers, or Scales?",intro:"Finding the right pet isn't just about what's cute—it's about matching their lifestyle to yours. From the chirpy energy of a bird to the quiet hops of a rabbit, let's find out who your soul-pet actually is. Answer these 5 questions!",question:"Question",of:"of",restart:"Take Quiz Again",outcomes:{dog:{title:"You should get a Dog!",description:"You have an active lifestyle and plenty of love to give. You want a partner in crime who will go outside with you, greet you enthusiastically, and participate in y
454our daily routine. You don't mind a little noise or mud."},cat:{title:"You should get a Cat!",description:"You want a companion who is affectionate but independent. You appreciate a pet that fits into your current routine without needing constant supervision. You like quiet evenings and warm snuggles on the sofa."},bird:{title:"You should get a Bird!",description:"You are smart, social, and maybe a little quirky! You don't mind noise (in fact, you might like the singing or talking) and you want a pet that is highly intelligent and interactive. You are okay with cleaning up seeds and feathers."},rabbit:{title:"You should get a Rabbit!",description:"You want something softer and quieter than a dog, but more interactive than a hamster. You have space for them to hop around safely and you don't mind pet-proofing your cords. You love the idea of a gentle, social vegetarian friend."},reptile:{title:"You should get a Reptile or Fish!",description:"You prefer a low-pressure pet that is fascinating to observe. You might have allergies, or you simply prefer a quiet home. You enjoy curating a habitat (tank or terrarium) and appreciate the aesthetic of a pet that doesn't demand constant physical affection."}},questions:{q1:{question:"Let's talk about noise. What is your tolerance level?",a:"I don't mind barking or active noise; a quiet house feels empty!",b:"I like it mostly quiet, just some occasional meows or purring.",c:"I love chatter, whistling, or even some loud squawking—it's festive!",d:"I prefer almost total silence, maybe just some gentle chewing sounds.",e:"I want zero noise from my pet."},q2:{question:"How much space can you dedicate to a pet?",a:"I have a yard or access to parks and plenty of floor space.",b:"My apartment/house is their kingdom; they can roam everywhere.",c:"I have space for a large vertical cage and room for them to fly safely.",d:'I have a designated "pen" area or a room where they can hop freely.',e:"I have a sturdy table or shelf for a tank/enclosure, but limited floor space."},q3:{question:'What kind of "mess" are you willing to deal with?',a:"Muddy paws, shed hair, and slobber.",b:"Dealing with a litter box and occasional scratched furniture.",c:"Seeds, hulls, and feathers scattered around a cage.",d:"Hay... lots of hay. And cleaning a litter tray daily.",e:"Cleaning algae or changing bedding/water once a week."},q4:{question:"How do you want to interact with your pet?",a:"Wrestling, running, and high-energy play.",b:"Petting them while I watch TV, or playing with a laser pointer.",c:"Teaching them tricks, whistling tunes, or having them sit on my shoulder.",d:"Sitting on the floor with them and letting them nudge me for treats.",e:"Watching them explore their tank; looking but not touching."},q5:{question:"If you leave the house for 8 hours, what is your pet doing?",a:"Waiting by the door (or maybe needing a dog walker).",b:"Sleeping in a sunbeam, completely unbothered.",c:"Playing with toys in their cage, possibly listening to the radio I left on.",d:"Sleeping in their hutch or safe pen area with plenty of hay.",e:"Just swimming or basking under their heat lamp."}}},Pf={learnMore:"Discuss media partnership",hero:{badge:"Business · Data-driven",title:"Reach Hong Kong pet owners",subtitle:"Hong Kong's first AI-powered pet health tech platform — media promotion and merchant partnerships backed by verified data. Featured in major press; App Store Lifestyle Top 9.",trust:{media:"ViuTV · Now TV · AM730 · Yahoo",appStore:"App Store Top 9",platform:"AI-powered · Data verified"},eventsCta:"Visit events site",kolCaption:"KOL campaign examples",kolVisualLabel:"Sample KOL pet collaboration content",showcaseHint:"Move your mouse to explore · hover a card for service highlights"},sections:{marketing:{eyebrow:"Promotion",title:"Multi-channel media services",subtitle:"From owned channels to KOL partnerships — every service comes with measurable reach."},platform:{eyebrow:"Platform listing",title:"Publish on PetWell",subtitle:"Events, restaurants, shop prices — verified and live to pet owners across Hong Kong."}}
454,audiences:{intro:{title:"What we offer",subtitle:"Choose your path and explore the services that fit"},viewMore:"View services",enterprise:{eyebrow:"Brands · Large events",title:"Media promotion",subtitle:"Website, app, Instagram, KOL partnerships, and event planning.",cardTagline:"Multi-channel reach, KOL collabs, and event planning at scale",imageAlt:"PetWell pet event on-site",cta:"Discuss media partnership"},smallBusiness:{eyebrow:"Small business",title:"Platform listings",subtitle:"List events, restaurants, or shop prices — reach pet owners across Hong Kong.",cardTagline:"Free listings, self-service updates, direct reach to pet owners",imageAlt:"Merchant engaging pet owners at a PetWell event",cta:"Discuss media partnership"}},gallery:{eyebrow:"Case studies",title:"Recent events & KOL work",subtitle:"Mall pop-ups, brand collabs, KOL trials, and on-site events — real campaign footage.",imageCount:"{{count}} campaign assets",viewHint:"Hover to pause · click any image to enlarge",openImage:"View campaign image {{index}}",lightboxTitle:"Case study {{current}} of {{total}}",prev:"Previous",next:"Next"},channels:{websiteAds:{title:"Website advertising",summary:"Banner or featured content on PetWell's website and SEO blog — reaching users searching for pet info.",imageAlt:"PetWell website platform",kpis:{a:{value:"3,000",label:"Daily page views"},b:{value:"14,700+",label:"Peak single day"},c:{value:"SEO",label:"Organic blog traffic"}}},appAds:{title:"In-app advertising",summary:"Banners, push notifications, and activity sections — reaching verified pet owners directly.",imageAlt:"PetWell app activities screen",kpis:{a:{value:"7,500+",label:"Verified users"},b:{value:"Top 9",label:"Lifestyle app rank"},c:{value:"Push",label:"Targeted alerts"}}},igAds:{title:"Instagram promotion",summary:"Posts, Stories, and Reels produced and published by the PetWell team.",imageAlt:"PetWell Instagram Reels content",kpis:{a:{value:"4,000+",label:"IG followers"},b:{value:"10%+",label:"Avg. engagement"},c:{value:"All formats",label:"Post / Story / Reel"}}},edm:{title:"Email (EDM)",summary:"Send event invites to verified email users — not dependent on social algorithms.",imageAlt:"PetWell community content example",kpis:{a:{value:"3,000+",label:"Verified emails"},b:{value:"100%",label:"Pet-related users"},c:{value:"Direct",label:"Inbox delivery"}}},kol:{title:"KOL partnerships",summary:"80+ Hong Kong pet KOLs — from product trials to event check-ins, real pet accounts drive word-of-mouth and reach.",imageAlt:"PetWell brand collaboration gift set",kpis:{a:{value:"80+",label:"KOL partners"},b:{value:"~60K",label:"Reels views"},c:{value:"Targeted",label:"Pet account audience"}}},eventPlanning:{title:"Event planning & on-site",summary:"Markets, pop-ups, mall activations — from promotion to on-site photo/video and consulting.",imageAlt:"Pet event scene",kpis:{a:{value:"Omni",label:"Online + offline"},b:{value:"On-site",label:"Photo & video"},c:{value:"AI",label:"Short-form video"}}},listEvent:{title:"List your event",summary:"Publish on PetWell's activities section with in-app registration and member perks.",imageAlt:"PetWell app event listing",kpis:{a:{value:"In-app",label:"Registration"},b:{value:"HK-wide",label:"Event exposure"},c:{value:"Members",label:"Exclusive deals"}}},listRestaurant:{title:"Add your restaurant",summary:"Pet-friendly restaurants verified by phone before publishing — attracting diners with pets.",imageAlt:"Pet-friendly restaurant promotion",kpis:{a:{value:"1,500+",label:"Listed restaurants"},b:{value:"18",label:"HK districts"},c:{value:"Verified",label:"Team confirmed"}}},updatePrices:{title:"Update shop prices",summary:"Verified merchants can self-update product prices and promotions anytime.",imageAlt:"",kpis:{a:{value:"Live",label:"Price updates"},b:{value:"Push",label:"Sale alerts"},c:{value:"Free",label:"Merchant signup"}}},openAccount:{title:"Open merchant account",summary:"Apply as a verified partner — manage your shop and earn the verified badge.",imageAlt:"",kpis:{a:{value:"Verified",label:"Trust badge"}
454,b:{value:"Self-serve",label:"Dashboard"},c:{value:"Exposure",label:"Platform listing"}}}},results:{eyebrow:"Platform data",title:"Platform performance",subtitle:"Real operational data — not estimates.",groups:{reach:{title:"Platform reach",subtitle:"Multi-channel coverage across Hong Kong pet owners"},engagement:{title:"Engagement",subtitle:"How our community interacts with content"},scale:{title:"Partnership scale",subtitle:"Network depth and collaboration volume"}},appUsers:{value:"7,500+",label:"Verified app users"},igFollowers:{value:"4,000+",label:"IG followers"},dailyViews:{value:"3,000",label:"Daily site views"},kolPartners:{value:"80+",label:"KOL partners"},peakViews:{value:"14,700+",label:"Peak daily views"},igEngagement:{value:"10%+",label:"Avg. IG engagement"},reelsViews:{value:"60K+",label:"Reels views"},restaurants:{value:"1,500+",label:"Listed restaurants"},appStoreTop:{value:"Top 9",label:"Lifestyle downloads"}},trust:{eyebrow:"In the press",subtitle:"Featured by ViuTV, Now TV, AM730, Yahoo, Sing Tao, and more"},partnership:{highlight:{title:"Become a PetWell verified partner",desc:"For pet shops, brands, or long-term merchants — manage your own prices with platform trust.",item1:"Self-service price and promotion updates",item2:"Verified badge on your listing",item3:"Push alerts to tracking users",cta:"Discuss media partnership",asideLabel:"Is this for you?",asideTitle:"If you're a pet shop or brand",asideDesc:"Free to register, update prices yourself, and reach pet owners across Hong Kong. Tap below for details and application."}},seo:{title:"Other Services | PetWell Advertising & Partnership Programme",description:"PetWell offers business services: website and app ads, Instagram promotion, event planning, plus event listings, restaurant onboarding, price updates, and merchant accounts.",keywords:"PetWell advertising,pet app ads Hong Kong,pet event planning,PetWell partnership,merchant programme,pet-friendly restaurant listing",structuredName:"PetWell Other Services"}},xf={sendMessage:"Send Message",submitting:"Submitting...",faqTitle:"PetWell FAQ",directAnswer:{question:"What pet app do you recommend in Hong Kong?",answer:"PetWell is Hong Kong's first all-in-one pet health management app, offering free clinic reviews, pet-friendly restaurant recommendations, and pet activity listings. Browse 200+ vet clinics with real user reviews to find the best care for your pet."},media:{eyebrow:"In the press",ariaLabel:"Media and organisations that have featured PetWell"},mission:{eyebrow:"Our story",title:"Why PetWell exists",paragraph1:"While caring for pets, PetWell saw serious problems in Hong Kong's pet industry — above all, a lack of transparency. Our pets are family, and we have a responsibility to give them the best care.",paragraph2:"Until now, pet owners had no central platform to collect reviews for vets, groomers, behaviourists, and more — leav
454ing their pets' wellbeing to chance. Through PetWell, we want owners to feel less helpless, simplify pet care, and bring positive change to the industry so more pets and owners can enjoy better lives together."},contact:{title:"Contact us",description:"If any information is incorrect or needs updating, leave your question or feedback below and we'll get back to you as soon as possible."},faq:{q1:"What is the PetWell app and what does it do?",a1:"PetWell is Hong Kong's first all-in-one pet health management app — clinic reviews, pet-friendly restaurants, activity listings, and health records. Completely free to download and use.",q2:"How do I find a good vet clinic?",a2:"In the PetWell app, browse 200+ vet clinics with real user reviews, fee references, and services. Filter for 24-hour emergency vets to find the best fit for your pet.",q3:"Where are pet-friendly restaurants in Hong Kong?",a3:"PetWell lists 1500+ verified pet-friendly restaurants across Hong Kong Island, Kowloon, and the New Territories. Each is phone-verified by our team, with indoor/outdoor and walk-in/booking details.",q4:"What pet activities are good for dogs?",a4:"PetWell regularly updates pet events across Hong Kong — markets, parties, dog carnivals, and pet-friendly mall activities. Check the app for the latest and plan great weekends for your pet!"},form:{firstName:"First name *",firstNamePlaceholder:"Enter first name",firstNameRequired:"Please enter your first name",lastName:"Last name *",lastNamePlaceholder:"Enter last name",lastNameRequired:"Please enter your last name",email:"Email *",emailPlaceholder:"[email protected]",emailInvalid:"Please enter a valid email address",phone:"Contact number *",phonePlaceholder:"Enter contact number",phoneRequired:"Please enter your contact number",message:"Comment or message *",messagePlaceholder:"Enter your message",messageRequired:"Please enter your message",privacyLabel:"I confirm that personal data I submit to PetWell HK will be used in accordance with the PetWell HK Privacy Statement. *",privacyRequired:"Please confirm you have read the privacy statement",successTitle:"Message sent",successDescription:"We'll reply to your enquiry as soon as possible.",errorTitle:"Submission failed",errorDescription:"Please try again later or contact us directly."},seo:{title:"About PetWell | Hong Kong Pet Health App | Contact Us",description:"PetWell is Hong Kong's first all-in-one pet health management app. Our mission is to improve transparency in the pet industry and help owners care for their pets. Contact us.",keywords:"PetWell,Hong Kong pet app,pet health management,pet industry transparency,about PetWell,contact PetWell",structuredName:"About PetWell",structuredDescription:"Hong Kong's first all-in-one pet health management app",orgDescription:"Improving pet industry transparency and helping owners care for their pets"}},Sf={label:"Contact Us",close:"Close"},Tf={seo:{title:"PetWell HK | Hong Kong Pet Health App | Clinics, Restaurants, Forum",description:"PetWell — Hong Kong's first all-in-one pet health app. Vet clinic reviews, pet-friendly restaurants, grooming, lodging, activities and forum. Free download.",keywords:"PetWell,Hong Kong pets,pet health app,vet clinic reviews,pet-friendly restaurants,pet grooming,pet lodging,pet forum,pet activities",structuredName:"PetWell HK - Hong Kong's go-to pet platform",structuredDescription:"PetWell HK — Hong Kong's first all-in-one pet health app. Vet reviews, pet-friendly restaurants, grooming, lodging, activities and forum."}},Af={back:"Back",email:"Email",emailPlaceholder:"[email protected]",emailInvalid:"Please enter a valid email address",submit:"Submit",changeEmail:"Change",verifyEmail:"Verify Email",verificationCode:"Verification Code",noRecieveCode:"Didn't receive code?",wait:"Wait",getNewCode:"seconds to resend",resendCode:"Resend Code",fillConfirmationCode:"Please enter the verification code",unknownError:"An unknown error occurred",failedToResendCode:"Failed to resend code",login:"Login",logout:"Logout",welcomeBack:"Welcome to PetWell",enterYourEmailToContinue:"Enter your email to sign in or create an account",orContinueWith:"Or continue with",continueWithGoogle:"Continue with Google",continueWithApple:"Continue with Apple",redirectingToProvider:"Redirecting...",getCode:"Continue with Email",otpSentTo:"We sent a verification code to",otpExplanation:"Already use Google or Apple? Sign in with the same method you registered with.",verifyAndLogin:"Verify & Login",verifying:"Verifying...",finishingSocialLogin:"Finishing your sign-in",socialLoginFailed:"Social login failed. Please try again.",returnHome:"Return Home",completeProfile:"Complete Your Profile",completeProfileDesc:"Tell us a little about you so we can finish creating your account",profileFormHint:"Please use your real details. Hong Kong phone numbers use a fixed +852 prefix, and weight is recorded in kg.",firstName:"First Name",firstNamePlaceholder:"e.g. Chris",firstNameRequired:"Please enter your first name",lastName:"Last Name",lastNamePlaceholder:"e.g. Wong",lastNameRequired:"Please enter your last name",phone:"Phone Number",phonePlaceholder:"12345678",phoneHint:"Enter your 8-digit Hong Kong phone number. We will add +852 automatically.",phoneInvalid:"Please enter a valid 8-digit Hong Kong phone number",weight:"Weight",weightPlaceholder:"e.g. 60",weightHint:"Please enter your weight in kilograms (kg).",weightInvalid:"Please enter a valid weight in kg",password:"Create Password",loginPassword:"Password",passwordPlaceholder:"Enter your password",passwordRequired:"Please enter your password",passwordHint:"At least 8 characters, including letters and numbers.",passwordInvalid:"Password must be at least 8 characters and include both letters and numbers",
454invalidCredentials:"Incorrect email or password. Please try again.",enterPasswordToContinue:"This email is already registered. Enter your password to continue",forgotPassword:"Forgot password?",confirmPassword:"Confirm Password",confirmPasswordPlaceholder:"Re-enter your password",passwordsDoNotMatch:"Passwords do not match",creatingAccount:"Creating Account...",completeSignup:"Create Account",continueBtn:"Continue",skipBtn:"Skip for now",tooManyRequests:"Too many requests. Please wait a few minutes.",accountLocked:"Account temporarily locked",accountTemporarilyLocked:"Account temporarily locked. Please try again later.",failedToLogin:"Failed to login",setNewPassword:"Set a new password",newPasswordRequiredDesc:"This account needs a new password before you can sign in.",savingPassword:"Saving..."},Ef={signInMethodHint:"Use the same sign-in method you registered with. Email/password and Google are separate until linked.",socialOnlyGoogle:"This account uses Google sign-in. Please tap Continue with Google.",socialOnlyApple:"This account uses Apple sign-in. Please tap Continue with Apple.",socialOnlyBoth:"This account uses Google or Apple sign-in. Please use your social sign-in method.",socialOnlyGeneric:"This account does not use email and password. Please use your original sign-in method.",useExistingLogin:"An account already exists for this email. Please sign in instead of creating a new account.",finishSetupFailed:"Signed in, but we couldn't finish setup. Please try again.",linkAccountTitle:"Link your account",linkAccountDescription:"An email/password account already exists for this address. Enter your password to link your social sign-in.",linkAccountPassword:"Account password",linkAccountSubmit:"Link account",linkAccountSuccess:"Account linked. Continue with Google again to open your existing pets and profile.",linkAccountInvalidPassword:"Incorrect password. Please try again.",linkAccountTempPasswordRequired:"This account still needs an email login first. Sign in with email, set your permanent password, then try Google again.",linkAccountTempPasswordHint:"Nametag / mailed login users: finish email sign-in and change the temporary password before linking Google.",linkAccountAuthFlowError:"Account linking is temporarily unavailable on the server. Please try again after the next update, or contact support.",linkAccountServerError:"Could not link accounts right now. Please try again in a moment.",linkAccountMergeError:"Could not link this Google login. Please try again, or contact support.",linkAccountNativeMissing:"No email/password account was found for this address. Sign in with email first, or contact support.",setPasswordTitle:"Set a password",setPasswordDescription:"Add a password so you can also sign in with email.",setPasswordSubmit:"Save password",setPasswordSuccess:"Password saved. You can now sign in with email and password.",federatedOnlyGoogle:"This account uses Google sign-in. Password reset is not available — please continue with Google.",federatedOnlyApple:"This account uses Apple sign-in. Password reset is not available — please continue with Apple.",federatedOnlyBoth:"This account uses Google or Apple sign-in. Please use your social sign-in method."},kf={hero:{badge:"Limited Free Giveaway",title:"Get Your Free PETWELL",titleHighlight:"Anti-Lost Pet Tag",line1:"Smart anti-lost pet tag",tapBadge:"Like Octopus · tap to read",line2:"Tap with a phone to view key pet details",summaryPrimary:"Limited quota, first come first served. Complete registration in around 2 minutes to set up your pet's anti-lost tag.",summarySecondary:"No charging needed. A simple phone touch helps good samaritans quickly access info and contact the owner.",searchIntent:"Prepare before it happens — set up your pet's anti-lost tag early for extra peace of mind."},benefits:{one:{title:"Anti-Lost Protection",desc:"Quick scan to help people contact the owner"},two:{title:"Tap to Read",desc:"As simple as tapping Octopus — phone touch to read"},three:{title:"Free Registration",desc:"Limited quantity available"}},socialProof:{eyebrow:"Real pet parents",title:"Thousands of owners already received their tags",subtitle:"Actual delivery and unboxing moments from Instagram — see how PetWell anti-lost tags give pets an extra layer of safety.",ariaLabel:"Scrolling gallery of pet owners receiving name tags"},seo:{title:"Anti-Lost Dog Tag Hong Kong | 防走失狗牌 Free Registration | PetWell HK",de
454scription:"Looking for 防走失狗牌? Register a free PetWell NFC anti-lost dog tag / pet tag in Hong Kong. A simple phone touch can show contact details and help lost pets reunite faster.",keywords:"防走失狗牌,anti-lost dog tag hong kong,NFC anti-lost dog tag,pet anti-lost tag hong kong,free pet tag registration,phone touch pet tag,petwell nametag",structuredDataName:"PetWell Anti-Lost Dog Tag Registration",intentTitle:"What is an anti-lost dog tag?",intentDesc:"An anti-lost dog tag helps lost pets reunite faster. PetWell's NFC anti-lost dog tag lets finders tap with a phone to access key details and contact the owner quickly.",intentPoint1:"Phone tap to read. No extra app required.",intentPoint2:"Shows key pet details and emergency contact info.",intentPoint3:"Works for dogs and cats as daily anti-lost protection.",faqTitle:"Anti-Lost Dog Tag FAQ",faq:{q1:"How do I register for an anti-lost dog tag in Hong Kong?",a1:"Fill in this PetWell registration form with owner and pet details, upload a clear pet photo, and submit to set up your NFC anti-lost dog tag profile.",q2:"Can existing PetWell users register here?",a2:"Yes. Even if you already have a PetWell account or the app installed, you still need to complete this form to register for your tag.",q3:"What information is required for pet tag registration?",a3:"Required fields include name, email, phone number, pet name, and a pet photo. Optional fields include breed, microchip number, birthday, and weight.",q4:"How is an NFC anti-lost dog tag different from a normal dog tag?",a4:"A normal dog tag usually only shows engraved text. An NFC anti-lost dog tag can provide richer info through phone tap, helping faster owner contact.",q5:"Is this only for dogs?",a5:"No. Cats and other pets can also use this anti-lost tag registration flow."},howTo:{name:"How to register a free PetWell anti-lost pet tag",description:"Complete online pet tag registration in a few minutes.",step1Name:"Choose account status",step1Text:"Select whether you already have a PetWell account. Either way, continue with the form below.",step2Name:"Fill in owner and pet details",step2Text:"Provide required contact and pet information, then upload a clear pet photo.",step3Name:"Submit to complete registration",step3Text:"Submit the form to complete online setup. The nametag supports NFC phone touch for fast access."}},form:{title:"Nametag Registration Details",subtitle:"Please complete the form to make your pet tag. Fields marked with * are required.",firstNameLabel:"First Name *",firstNamePlaceholder:"e.g. Ming",lastNameLabel:"Last Name *",lastNamePlaceholder:"e.g. Chan",emailLabel:"Email *",phoneLabel:"Phone Number *",phonePlaceholder:"WhatsApp contact number",petNameLabel:"Pet Name *",petNamePlaceholder:"e.g. Mochi",microchipLabel:"Microchip Number (optional)",microchipPlaceholder:"Optional",sfAddressLabel:"SF Delivery Address *",sfAddressPlaceholder:"e.g. SF locker code / SF store address",deliveryMethodLabel:"Delivery Method",deliveryMethodValue:"By Mail",deliveryMethodHint:"All nametags are delivered by mail.",specialRequirementLabel:"Special Requirement (optional)",specialRequirementPlaceholder:"Optional, e.g. address notes",groupShippingPhoneLabel:"If you would like to send this along with someone else's name tag, please specify the phone number they used when registering it (optional)",groupShippingPhonePlaceholder:"Optional: phone number used in their nametag registration",petBirthdayLabel:"Pet Birthday (optional)",petWeightLabel:"Pet Weight (kg) (optional)",petWeightPlaceholder:"e.g. 5.5",disclaimer:"By submitting, you agree that PetWell can use this data to create account and pet profile records and process anti-lost tag registration.",submitting:"Submitting...",submit:"Register For Free Now"},accountPrompt:{step:"01",title:"Do you already have a PetWell account?",hint:"Whether or not you already have an account or the app, please complete the form below to register for your tag.",hasAccount:"Yes, I have one",noAccount:"No, I don't have one",cardTitle:"Please register in the PetWell App",cardDesc:"You already have an account. For faster processing and better data sync, please download the app and complete tag registration there.",downloadCta:"Download App & Register"},photo:{label:"Pet Photo *",previewAlt:"Pet photo preview",replaceHint:"Click or drag a new image to replace",uploadPrompt:"Click to upload or drag and drop pet photo",uploadHint:"Supports JPG, PNG, WebP",supportText:"Supports JPG, PNG, WebP up to 5MB. Photos are uploaded to PetWell secure storage.",remove:"Remove"},success:{title:"Registration Submitted!",desc:"We have received your details. This nametag supports NFC phone touch for quick pet info access.",newAccountDesc:"Download the PetWell app. Login details will be sent with your nametag. Sign in with your email after you receive it — your tag activates on first login.",existingAccountDesc:"You already have a PetWell account — sign in with your existing password. Your tag activates after your first login.",downloadCta:"Download App",submitAnother:"Submit Another Pet"}
454,toast:{alreadyRegisteredTitle:"You are already registered",successTitle:"Registration successful",successDescNewAccount:"Login details will be sent with your nametag. Download the app and sign in with your email after you receive it — your tag activates on first login.",successDescExistingAccount:"You already have a PetWell account — sign in with your existing password.",successDesc:"Your registration is received. This nametag supports NFC and phone touch reading.",errorTitle:"Submission failed",errorDesc:"Please try again later or contact us."},validation:{requiredTitle:"Please complete required fields",requiredDesc:"Please fill in all required fields.",invalidEmailTitle:"Please enter a valid email",invalidEmailDesc:"Please enter a valid email address.",photoRequiredTitle:"Please upload pet photo",photoRequiredDesc:"Pet photo is required for nametag registration.",invalidPhotoTitle:"Invalid image file",invalidPhotoDesc:"Please upload an image file.",photoTooLargeTitle:"Image too large",photoTooLargeDesc:"Please upload an image under 5MB.",notConfiguredTitle:"Form is not fully configured",notConfiguredDesc:"Missing nametag Lambda URL or API token."}},Cf={title:"TERMS AND CONDITIONS & PRIVACY POLICY",lastUpdated:"Last Updated: April 25, 2026",sections:{1:{title:"AGREEMENT TO OUR LEGAL TERMS",content:`PetWell HK Limited ("PetWell", "Company", "we", "us", "our"), a company registered in Hong Kong. 
455
456These Legal Terms (the "Legal Terms") govern your access to and use of applications, websites, content, products and services provided by PetWell (hereafter collectively referred to as the "Services"). 
457
458These Legal Terms are legally binding contracts between you, either as an individual or on behalf of an entity ("you", "your"), and PetWell HK Limited. These Terms specify your limitations, legal rights, and obligations concerning your use and participation in the Services. 
459
460The terms "you" and "your" refer to any person who accesses, uses, or participates in the Services in any manner. If you engage with the Services or establish an account representing a business, you confirm that you are authorized to bind that business to these terms. Consequently, your agreement to these Legal Terms will be considered an agreement by the business you represent, and references to "you" and "your" in this context will apply to that business.
461
462By accessing and using the Services, you acknowledge that you have read, understood, and agreed to be bound by these Legal Terms, thereby establishing a contractual relationship between you and PetWell HK Limited. If you do not agree to these Legal Terms, you are expressly prohibited from using the Services and must discontinue use immediately. These Terms supersede any prior agreements or arrangements with you. PetWell HK Limited reserves the right to terminate these Terms or any Services with respect to you, or generally cease offering or deny access to the Services or any portion thereof, at any time for any reason.
463
464Supplemental terms may apply to certain Services, such as policies for specific events, activities, or promotions, and these will be disclosed in connection with the applicable Services. These supplemental terms are in addition to, and shall be considered part of, the Legal Terms for the purposes of the applicable Services. In the event of a conflict, supplemental terms shall prevail over these Legal Terms with respect to the applicable Services.
465
466You acknowledge that PetWell serves as a digital platform facilitating the exchange and sharing of information between pet owners ("Service Users") and providers of pet-related services ("Service Providers"), including content sourced from third parties. By engaging with PetWell—through use, registration, or interaction with the services showcased, promoted, and operational on the platform—you affirm that:
467
468You qualify as either a Service Providers or a prospective Service User.
469You hold the necessary legal authority to bind yourself to these Terms of Use.
470You consent to the processing of financial transactions required for utilizing services via PetWell.
471You commit to adhere to the comprehensive terms and conditions outlined in these Legal Terms and any related documents referenced herein.
472
473Should you disagree with any part of these terms, you must refrain from agreeing to them and immediately cease all use and access of PetWell. It is important to note that PetWell disclaims any liability for losses, damages, or missed opportunities that may arise from interactions or transactions between users facilitated by our platform.
474
475PetWell HK Limited may amend these Legal Terms from time to time. Amendments will be effective upon posting of the updated Legal Terms at the domain of https://petwellhk.wpcomstaging.com/terms-and-conditions/ or the amended policies or supplemental terms on the applicable Service. Supplemental terms and conditions or documents that may be posted from time to time are hereby expressly incorporated herein by reference. We reserve the right, in our sole discretion, to make changes or modifications to these Legal Terms at any time and for any reason. It is y
475our responsibility to periodically review these Legal Terms to stay informed of updates. Your continued access or use of the Services after such revisions are posted signifies your agreement to be bound by the revised Legal Terms. If you do not agree to abide by these or any future Legal Terms, please do not use or access the Services.`},2:{title:"PRIVACY POLICY",content:`This section explains what personal data we collect and how we use it in connection with the Services. By using the Platform, you agree to the collection and use of your information as described below. This Privacy Policy section is incorporated into and forms part of these Legal Terms.
476
477Information we collect
478We collect the following categories of personal data when you use the Platform or interact with us:
479
480Identity & contact: name, email address, phone number, postal or billing address.
481Account & authentication: username, profile details, hashed passwords, security and login activity.
482Device & usage: IP address, device identifiers, operating system, browser/app version, cookie/SDK IDs, pages/screens viewed, taps/clicks, time stamps, crash logs, and diagnostics.
483Communications & content: messages you send to us, Q&A/FAQ submissions, support requests, reviews, forum posts, and any photos/files you upload.
484Pet profile & health information: pet name, species/breed, sex, age, weight, medical history, vaccinations, prescriptions, lab results, appointment history, care notes, and related media you choose to store.
485Transactions: purchases, subscriptions, booking details, and payment metadata. Card details are processed by our payment provider; we do not store full card numbers.
486Marketing preferences: your opt-in/opt-out choices and interaction with our communications.
487Third-party integrations (if you connect them): limited data from connected services (e.g., activity/steps/distance from Apple Health/Google Fit; basic profile from social sign-in), obtained only with your permission.
488Location Data: approximate location (e.g., via IP address) and precise location (e.g., via GPS, Wi-Fi, or Bluetooth) when you grant us explicit permission.
489
490LOCATION DATA AND BACKGROUND LOCATION POLICY
491PetWell HK Limited is committed to protecting your privacy and being transparent about how we use your location data.
4921. Collection of Location Data: Our app collects and accesses your location data, including approximate location (e.g., via IP address) and precise location (e.g., via GPS, Wi-Fi, or Bluetooth), only when you grant us explicit permission through your device settings.
4932. Use of Location Data: We use your location data to provide core functionalities of the app, which include finding nearby vet clinics, pet salons, and pet-friendly restaurants, providing emergency and 24/7 clinic lookup services based on your current location, and enabling the PetFit/walk tracking feature to record your pet's walking routes, distance, and duration.
4943. Background Location Access: If you use the PetFit/walk tracking feature, our app requires access to your location in the background. This means that location data is collected even when the app is closed or not in use, ensuring that your pet's walks are accurately tracked without interruption. We will request explicit permission for background location access before enabling this feature.
4954. Sharing of Location Data: We do not sell your location data to third parties. Your location data is only shared with trusted service providers strictly for the purpose of operating the app's features (e.g., map rendering services).
4965. Your Control: You have full control over your location data. You can enable or disable precise location access and background location access at any time through your device's operating system settings. Disabling location access may limit your ability to use certain features of the app, such as nearby clinic lookup and walk tracking.
497
498CHILDREN'S PRIVACY
499Our Services do not target and are not intended to attract children under the age of 13. We do not knowingly solicit personal information from children under the age of 13 or send them requests for personal information. If we become aware that we have collected personal information from a child under 13 without verification of parental consent, we will take steps to remove that information from our servers.
500
501How we use your information
502We use your information to:
503
504provide, operate, and improve the Services and Platform features;
505create and manage accounts, process bookings and payments, and deliver customer support;
506personalise content, measure performance, and perform analytics;
507maintain safety, security, and integrity (including fraud prevention and debugging);
508send service communications (e.g., confirmations, updates); send marketing with your consent where required;
509comply with legal obligations and enforce our agreements.
510
511Sharing your information
512We share information only as needed to provide the Services or as required by law, including with:
513
514Service providers (e.g., hosting, analytics, customer support, payments);
515Clinics and veterinary professionals when you request or engage their services;
516Other users where you choose to post reviews or content visible to others;
517A claims processor or insurer if there is a complaint, dispute, or conflict involving you and a third-party provider and sharing is necessary to resolve the issue;
518Authorities or legal advisers where required by law or to protect rights and safety;
519Corporate transactions (e.g., merger, acquisition, financing) subject to appropriate safeguards.
520
521We do not sell your personal data. We may share aggregated or de-identified information that cannot reasonably identify you.
522
523Retention, security, and international transfers
524We keep personal data only as long as necessary for the purposes above or as required by law. We use appropriate technical and organisational measures to protect your data, but no method is 100% secure. Your information may be processed in countries outside your own; where we transfer data internationally, we use appropriate safeguards.
525
526Your choices & rights
527You can update certain details in your account and manage permissions (including precise location) in your device settings. Subject to applicable law, you may request access, correction, deleti
527on, restriction, objection to processing, or portability of your personal data, and you may opt out of marketing at any time. To exercise your rights or ask questions, contact us at [email protected].`},3:{title:"THE SERVICES",content:`NATURE OF THE PETWELL SERVICE
528
529PetWell offers a comprehensive suite comprising a desktop web application, mobile applications, and other related tools, support, and services. These resources enable Service Users and Service Providers to find, communicate with, and interact with each other. Included in the PetWell services are Service Providers matchmaking platform, feedback portal, Service Users' pet health documentation system, and other services.
530
531PETWELL DOES NOT PROVIDE DIRECT PET CARE SERVICES
532
533PetWell serves as a neutral platform connecting Service Providers and Service Users. While PetWell facilitates these connections, it does not directly offer pet care services and is not involved in the actual transaction of services. We do not employ, recommend, or endorse any Service Providers or Service Users, nor do we make any representations or warranties regarding the quality of the pet care services they provide, such as grooming, sitting, or other services provided by Service Providers, or regarding your interactions and relationships with Service Users.
534
535Service Providers on PetWell operate independently and are neither employees nor contractors of PetWell. They have the discretion to determine how they provide services to their clients. Although we offer guidelines on our platform about safety and pet care for Service Providers and tips for Service Users on selecting providers, PetWell is not responsible for the performance or conduct of any Service Providers or Service Users, whether online or offline.
536
537We perform an initial review of Service Providers profiles and facilitate basic identity verifications. However, except as explicitly stated, we do not conduct thorough background checks. PetWell does not guarantee the  accuracy, quality or suitability of any Service Providers and Service Users are advised to conduct their own due diligence. Service Users should exercise caution and use their independent judgment before engaging with other users on the platform. Both Service Users and Service Providers are solely responsible for making decisions that best serve their interests and those of their pets. You are advised to exercise caution and apply your independent judgment before engaging with a Service Provider, offering Pet Care Services, or interacting with other users on the PetWell platform. For instance, it is each user's responsibility to ensure their pet's medical treatments, such as flea and tick prevention, are up to date. PetWell will not be held liable for any lapses in such treatments by users
538
539USER-GENERATED CONTENT, REVIEWS, AND EXTERNALLY SOURCED CONTENT
540
541User-Generated Content and Reviews
542
543PetWell provides a platform for Service Users to post reviews and share experiences regarding the services received from Service Providers. The opinions expressed in these reviews and any other user-generated content are solely those of the individual users and do not reflect the views of PetWell HK Limited. PetWell does not endorse or guarantee the accuracy, completeness, truthfulness, or reliability of any user-posted content. As a platform provider, PetWell is not liable for any statements, representations, or content provided by users. Each user is solely responsible for their content and the consequences of posting it, and should be aware that their postings are public and not confidential. Service Users must also indemnify PetWell from any claims arising from their content, as well as from any actions taken as a result of investigations by PetWell or law enforcement.
544
545PetWell offers a platform where Service Users can access detailed information about various pet care services, including vet clinics, such as addresses, phone numbers, and operating hours. While Service Users are encouraged to post reviews based on their experiences, PetWell does not verify the accuracy of user visits to these services. We provide a space for Service Users to share their personal experiences, but it is important to note that PetWell cannot guarantee that all reviews are based on actual visits. Service Users should exercise discretion and consider this when reading reviews and making decisions based on posted experiences.
546
547You acknowledge and agree that you shall comply with the following guidelines (the "Review Guidelines")
548
549PetWell is committed to fostering a vibrant online community where pet owners can share and access reliable information about pet care services. To ensure our platform remains useful and free from commercial bias, hate speech, or irrelevant content, Service Users are encouraged to adhere to the following guidelines when submitting reviews:
550
551Reviews must be authentic and personal, based on firsthand experiences. Do not submit reviews if you are the owner, employee, or an agent of the service provider, or a direct competitor.
552Reviews should not be influenced by compensation or incentives offered by a Service Providers or their agents.
553Only one review per service experience is allowed; repetitive submissions for the same service are not permitted.
554Avoid submitting reviews that contain insults, defamation, or provocative content.
555Do not engage in libel or personal attacks.
556Ensure your review is original; copying or plagiarizing content from others without permission is prohibited.
557Avoid posting duplicate content or using multiple accounts to submit similar reviews.
558Reviews should be based on first-hand experiences, not hearsay or second-hand information.
559Ensure that your reviews are truthful and neither defamatory nor misleading; avoid baseless allegations, speculations or plagiarized content.
560Do not include commercial messages, promotional links, or inappropriate language.
561Reviews should focus on your own pet care experience, providing a detailed description of the service received.
562If you have a serious complaint, provide evidence such as photos to support your claim.
563Reviews should not respond directly to other reviews or contain only photos.
564Ratings provided should be consistent with the content of your review.
565Do not include sensitive personal details of service providers or staff.
566By submitting your reviews, you are granting PetWell a non-exclusive license to use your content for promoting the platform.
567Ensure compliance with all applicable laws, including those related to privacy and content legality.
568
569Important Notes:
570
571If your review is associated with a promotional event, such as a free grooming session, this must be clearly disclosed. Failure to do so may violate the Trade Descriptions Ordinance or similar regulations applicable in your or the service provider's jurisdiction.
572If you submit a review containing serious allegations, you must verify that the content is truthful and agree to accept legal responsibility for the claims made prior to publication. Misrepresentation in reviews with serious allegations can lead to legal consequences under the Defamation Ordinance and other applicable laws.
573
574PetWell reserves the right to reject, relocate, or remove any reviews that fail to adhere to these guidelines, at our discretion, without prior notice. PetWell further reserves the right, but is not obligated, to monitor, edit, or remove user-generated content or accounts that contain content deemed unlawful, offensive, defamatory, obscene, or otherwise objectionable or that violates any party's intellectual property or these Terms. For reporting inappropriate use of review, you may contact PetWell via email at [email protected]. 
575
576This list is not exhaustive and merely provides examples of prohibited actions. PetWell reserves the right to terminate your access to your account, and your ability to post to our services, at any time, with or without notice, and for any reason or no reason, particularly if your actions are deemed inappropriate or disruptive. Additionally, PetWell may limit the number of messages you can send to other users, at our sole discretion. PetWell may involve law enforcement if illegal activities are conducted on our services and will cooperate with authorities as necessary or when deemed appropriate. While we do not undertake to review all content posted by users, we reserve the right to remove, edit, move, or refuse any content at any time, without notice.
577
578Content Sourced from External Platforms
579
580PetWell may display content, including reviews, sourced from external platforms or websites. PetWell does not own this externally sourced content and makes no claim to its copyright ownership. PetWell is not responsible for obtaining the rights to use any externally sourced content and does not guarantee the accuracy, legality, or compliance of such content with copyright laws. We rely on our users and external content providers to provide content lawfully and encourage users to verify the authenticity and ownership of any content they utilize from our platform. If PetWell receives a valid notification of copyright infringement, we are committed to taking appropriate action, including removing the infringing content from our platform as quickly as possible to comply with copyright laws. Users should exercise caution and perform due diligence before relying on content sourced from external platforms. PetWell will not be liable for any misinformation, copyright infringement, or other issues that arise from user reliance on such content.
581
582Intellectual Property and Copyright
583
584Content, logos, and other visual media created and posted by Service Providers on PetWell remain the intellectual property of the respective copyright holders. Service Providers agree not to post content unless they hold the copyright or have obtained proper licensing or are covered under fair use. PetWell is not liable for any copyright infringement resulting from user-posted content or externally sourced content but will remove such content if it violates any legal standards or rights.
585
586By posting content on PetWell, Service Providers agree to allow it to be displayed on the platform and used in connection with the promotion of the platform and its services, without any compensation. PetWell reserves the right, but not the obligation, to monitor, edit, or remove content or accounts containing content that is deemed unlawful, offensive, defamatory, obscene, or otherwise objectionable or which violates any party's intellectual property or these Terms.
587
588Third Party Services and Content
589
590PetWell may be used in connection with third-party services and content that PetWell does not control. You acknowledge that different legal terms and privacy policies may apply to your use of such third-party services and content. PetWell does not endorse and is not responsible or liable for the products or services provided by any third-party providers.
591
592Ownership
593
594The Services and all rights therein are and shall remain the property of PetWell HK Limited or its licensors. Nothing in these Terms grants you any rights in or related to the Services or the ability to use or reference PetWell's company names, logos, product and service names, trademarks, or service marks.
595
596Pet Health Documentation System
597
598PetWell offers a secure digital archive, the Pet Health Documentation System, enabling our platform users to efficie
598ntly upload, store, and manage their pets' health records and other essential documentation. This system is designed to facilitate easy access and management of pet health data, allowing our platform users and, with proper consent, Service Providers to enhance the care and management of pet health.
599
600Information stored within the Pet Health Documentation System may include, but is not limited to, veterinary records, vaccination records, and medical histories. The collected information is used exclusively to enhance the services provided by PetWell, aimed at improving the overall management and care of pet health by service users and their authorized service providers. By utilizing this system to upload pet health documents, you agree to the storage and use of this data as outlined in our Legal Terms and Privacy Policy. PetWell is committed to safeguarding your pet's health information with industry-standard security measures and protocols.
601
602Service Users are responsible for ensuring the accuracy and completeness of the pet health information they input into the system. It is crucial that all data provided is current and correct. PetWell is not liable for any errors in the information provided by Service Users or for any reliance placed on this information by other Service Users or Service Providers.
603
604All data uploaded remains the intellectual property of the Service Users or rightful owner. PetWell does not claim ownership of any content uploaded to the Pet Health Documentation System. Regarding data usage, PetWell does not access the detailed health information stored in the drive unless necessary to provide requested services or as mandated by law. Basic information about the pets, such as name, breed, weight, and temperament, may be shared with Service Providers or any third party to facilitate service provision. This sharing of information is based strictly on the settings controlled by the Service Users, who can choose what additional information, if any, is shared with freelancers.
605
606PetWell ensures that Service Users maintain control over their content. You can manage who views or interacts with your data and remove or delete the data permanently through the system's settings. Service Users decide the privacy level of their files, which are private by default. PetWell will not disclose your files or data to others except as explicitly described in our Privacy Policy or as required by law.`},4:{title:"MEMBERSHIP AND ACCESS TO SERVICE",content:`User Accounts
607
608To access most features of PetWell, you must register for and maintain an active personal user services account ("Account"). You must be at least 18 years of age or the age of legal majority in your jurisdiction, whichever is higher, to create an Account. Registration requires you to provide personal information such as your name, mobile phone number and email address. During the registration process, you have the option to supply extra details that are not required but can help personalize your experience on PetWell. You are solely responsible for all activities conducted through your Account and must maintain the confidentiality and security of your PetWell password and any Third-Party Site Password. It is your responsibility to ensure these passwords are safeguarded at all times to prevent unauthorized use of your account. You are responsible for maintaining the accuracy and completeness of your Account information. If there are any security breaches or unauthorized access to your Account you must promptly inform PetWell. Additionally, you are prohibited from accessing another person's Account without their explicit permission. Misrepresenting yourself as another user of the Platform or using the Services under false pretenses is strictly forbidden. You acknowledge that PetWell is not liable for any losses you incur from unauthorized use of your Account. However, you may be held accountable for any losses incurred by PetWell or others due to such unauthorized activities.
609
610Promotional Codes
611
612PetWell may, at its sole discretion, create promotional codes that can be redeemed for account credit, or other features or benef
612its related to our services, subject to any additional terms PetWell establishes for each promotional code ("Promo Codes"). You agree that Promo Codes:
613
614Must be used for the designated audience and purpose, and in a lawful manner.
615Cannot be duplicated, sold, transferred, or made available to the general public unless explicitly permitted by PetWell.
616May be disabled by PetWell at any time for any reason without liability.
617Must be used according to the specific terms that PetWell sets for such Promo Code.
618Are not redeemable for cash.
619May expire before you use them. PetWell reserves the right to withhold or deduct credits or other features or benefits obtained through the use of Promo Codes in the event that PetWell determines or believes that the use or redemption of the Promo Code was in error, fraudulent, illegal, or in violation of the applicable Promo Code terms or these Legal Terms.
620
621Network Access and Devices
622
623You are responsible for obtaining the data network access necessary to use our platform. Data and messaging rates and fees from your mobile network provider may apply if you access or use our services from a wireless-enabled device, and you are responsible for such charges. You are also responsible for acquiring and updating compatible hardware or devices necessary to access and use our services and any updates thereto. PetWell does not guarantee that the services, or any portion thereof, will function on any particular hardware or devices. Additionally, our services may be subject to malfunctions and delays inherent in the use of the Internet and electronic communications.`},5:{title:"ACCOUNT HOLDER CONDUCT",content:`Prohibitions on content upload
624
625You must not upload, post, transmit, or distribute any content — including text, images, videos, sound, data, information, or software — anywhere on the platform, whether to your profile, service listings, service requests, or as part of any feedback related to the platform, services, service providers, or service users. 
626
627You are prohibited from posting content that misrepresents the source, including impersonating another individual or entity, or posting any false or inaccurate biographical information about Service Providers.
628
629Do not post or create links to external sites that violate these Legal Terms.
630
631You must not engage in any activity intended to harm or exploit any individual under the age of 18 ("Minors") in any way or solicit personal information from Minors without appropriate consent.
632
633You should avoid activities that invade privacy, such as unauthorized collection, storage, or distribution of personal information including names, email addresses, phone numbers, and home addresses without their knowledge and willing consent.
634
635You must not distribute content containing falsehoods or misrepresentations that could damage PetWell or any third party.
636
637You are refrained from posting content that is pornographic, harassing, hateful, illegal, obscene, defamatory, libelous, slanderous, threatening, discriminatory, or racially, culturally, or ethnically offensive. Content that encourages behavior that could constitute a criminal offense, result in civil liability, or otherwise violate any applicable laws is strictly prohibited. 
638
639You must not post any content that promotes racism, hatred, or physical harm against any individual or group. Avoid posting any content that includes nudity, undue violence, or other matter that could be deemed inappropriate or offensive.
640
641You are forbidden from uploading content that is copyrighted or protected by trade secrets unless you own these rights or have obtained permission from the legitimate rights holder to use and share this content on our service.
642
643You must not upload, post, or distribute content that infringes on the copyright or proprietary rights of others, such as unauthorized copies of copyrighted works, including but not limited to, pirated computer programs, music files, and artwork. Avoid posting information or links that facilitate the circumvention of manufacturers' copy-protection devices or other protective measures. You are prohibited from posting content that threatens, stalks, defames, defrauds, degrades, victimizes, or intimidates an individual or group on the basis of age, gender, disability, ethnicity, sexual orientation, race, or religion. Do not post content that incites or encourages others to commit acts that could result in harm or discrimination against individuals or groups.
644
645You must not engage in activities intended to harm or disrupt another user's computer system or allow others to illegally access software or bypass security on websites or servers. This includes any form of spamming. It is prohibited to impersonate or use the identity of a PetWell employee, agent, manager, service provider, another user, or any other person. Advertising or soliciting business not related to or deemed inappropriate for our services by PetWell is forbidden (at the sole discretion of PetWell). 
646
647Content considered as "junk mail", "spam", "chain letters", "pyramid schemes", or unsolicited commercial advertisement should not be posted. Avoid posting unauthorized commercial messages or advertisements for services not explicitly approved, such as ponzi schemes, discount cards, online contests, etc. 
648
649You must not distribute or upload viruses or any technology that may damage PetWell or the property and interests of PetWell users.
650
651Posting links to commercial services or websites is prohibited unless explicitly permitted under our Legal Terms. Content must be relevant to our services and users. Avoid posting non-local or irrelevant material. Do not repost content that has been previously submitted to PetWell. The use of any automated tools or software to submit c
651ontent without PetWell's express written consent is strictly prohibited.
652
653Prohibitions on communication
654
655Do not send messages that involve national or international money transfers exceeding the service's listed price, especially if they include requests for refunds.
656
657Refrain from sending unsolicited advertisements or promotions for services not available through our services or from external websites.
658
659Avoid sharing personal contact information, such as phone numbers, social media handles, email addresses, etc. .
660
661Do not encourage or facilitate the use of other services or platforms for messaging or business solicitation external to our services.
662
663Prohibited actions
664
665Service users are prohibited from engaging in any of the following behaviors: committing to a service without intent to pay; registering for, negotiating a price for, using, or soliciting a service without plans to complete the transaction; agreeing to purchase a service without meeting the service provider's stated terms, or doing so with the intent to disrupt the listing; or misusing any features provided by PetWell related to the use or purchase of services. These actions violate the terms of service and may lead to restrictions on account privileges.
666
667Non-compete clause
668
669For a period of 12 months following the last engagement with a Service Providers via our services, Service Users agree to adhere to the following conditions:
670
671Service Users shall not directly or indirectly solicit or accept similar services from any Service Providers or Service Users encountered through our services, nor shall they engage in providing similar services within the same service area as defined by our services.
672Service Users are prohibited from hiring or attempting to hire any Service Providers or other Service Users introduced via our services for any personal or professional purpose.
673Service Users must refrain from performing services for, or soliciting services from, any Service Providers or other Service Users introduced to them during their use of our services, regardless of the nature of the service.
674Service Users shall not, directly or indirectly, persuade or influence other Service Users or Service Providers to terminate or reduce their use of our services.
675Service Users must avoid inducing or encouraging any Service Providers or other Service Users to provide or utilize similar services on competing services.
676Service Users must not interfere with, disrupt, or attempt to disrupt any established relationship, contract, or arrangement between our services and its Service Providers or Service Users.
677Service Users are not permitted to assist, encourage, or facilitate any Service Providers or other Service Users in violating these terms.
678
679No Discrimination
680
681Our services adhere to all federal, state, and local laws prohibiting discrimination in employment postings. This includes, but is not limited to, discrimination based on race, color, religion, sex, national origin, age, disability, or any other legally protected class. We do not accept any content that includes discriminatory preferences or limitations. We reserve the right to remove, without prior notice, any content that we determine violates these anti-discrimination laws.
682
683Prohibitions regarding the use of services
684
685You are prohibited from uploading content or items to unsuitable categories or areas within our services; Displaying personal contact or social media details in any images or content listings; Breaching laws, third-party rights, our account policies, or any terms outlined in the Legal Terms; Withholding payment for services unless the description provided by the Service Providers materially changes after an agreement is reached, if there is an evident typographical error, or if the service provider's identity cannot be verified; Failing to fulfill services that have been paid for, unless the Service Users substantially deviates from the agreed-upon terms, refuses to pay, a significant typographical error occurs, or the service user's identity cannot be authenticated;
685 Manipulating service prices or interfering with other users' posts; circumventing or tampering with our fee structure, the billing process, or fees due; Posting false, inaccurate, misleading, defamatory, or libelous content, including personal details about any service user; Actions that could undermine the integrity of our feedback or ratings systems, such as misusing feedback information or applying it outside the intended context of our services.
686
687If a Service Users violates any of the rules associated with their postings, PetWell, at its sole discretion, may take actions including cancelling the posting, limiting the Service User's account privileges, suspending the account, or decreasing the Service User's status earned through feedback. By agreeing to these terms, you commit to upholding the integrity of content and interactions within our services. PetWell enforces these guidelines strictly and reserves the right to modify, refuse, or remove content or accounts as deemed necessary.`},6:{title:"USAGE AND RIGHTS OF SUBMITTED CONTENT",content:`Non-Confidentiality of User Content
688
689By engaging our service by submission, hosting, sharing, and publishing of user content, which may include videos, profiles, offers, requests, feedback, and other forms of communication, you acknowledge that any content you submit may be accessible to other registered users and that we do not guarantee confidentiality for any such content, regardless of whether it is published.
690
691By submitting content, you agree to provide it on a non-proprietary and non-confidential basis. You grant us the permission to use, distribute, and publicly display this content freely, enabling us to effectively offer and enhance our services. This content may be made searchable and available to all users who have access to our services.
692
693
694User Content Responsibilities
695
696You are solely responsible for the content you submit and the consequences of posting or publishing it on our service. By submitting content, you affirm and warrant that:
697
698You possess or have obtained the necessary licenses, rights, consents, and permissions to use such content and to authorize us to use it in the ways contemplated by the service and these Legal Terms.
699You have obtained the written consent, release, and permission of every identifiable individual in the submitted content to use their name or likeness, enabling their inclusion and use in the ways contemplated by the service and these Legal Terms.
700You will cover any royalties, fees, or other monies owed to any person due to the content you post on or through the service.
701
702Content Rights and Licensing Agreement
703
704You maintain ownership of any content you submit to PetWell. By submitting content, you grant PetWell a perpetual, worldwide, non-exclusive, royalty-free license that is sublicenseable and transferable. This license allows us to use, reproduce, distribute, reformat, translate, create derivative works from, display, and perform your content in connection with PetWell's services and its business activities, including promoting and redistributing part or all of the services, and derivative works thereof, across various media. Furthermore, each user of our services receives a non-exclusive license to access your content through our services, and to use, reproduce, distribute, create derivative works from, display, and perform your content as enabled by the functionality of our services and under these Legal Terms. This license ends when you delete your content from our services.
705
706You acknowledge that the management of our services may involve:
707
708Transmissions over various networks.
709Modifications to your content to conform to technical requirements of connecting networks or devices.
710
711Your content may be used by PetWell in blogs, directories, emails, and other promotional materials. You can remove your content at any time. To remove content, notify us by email, and we will delete it unless it has been shared with third parties as part of our service. If you do not request the removal of reposted content, it will be considered as consent for us to keep it posted.
712
713Content Responsibility and Removal Rights
714
715PetWell does not endorse any user-generated content or any opinion, recommendation, or advice expressed therein, and explicitly disclaims all liability associated with such content. PetWell does not allow activities that infringe on copyright or intellectual property rights within our services, and will remove any data or content that is reported and verified as infringing according to our established takedown procedures. PetWell reserves the right to remove any data or content without prior notice and may terminate access to any user identified as a repeat infringer—defined as a user who has been notified of infringing activity more than twice or has had content removed more than twice. Furthermore, PetWell retains the full discretion to determine the appropriateness of all content submitted to the services, including but not limited to the removal of offensive, indecent, or otherwise objectionable material or material in violation of our terms.
716
717When using our services, you may encounter content from diverse sources, which PetWell does not control. You might find some content offensive, harmful, inaccurate, or deceptive. By using our services, you waive any legal or equitable rights or remedies you have or may have against PetWell concerning such content and agree to indemnify and hold harmless PetWell and its affiliates against all claims related to your use.
718
719You are solely responsible for the content that you publish, display, or transmit through our services. PetWell may, at its sole discretion and without liability, review and delete any content that breaches this agreement or is potentially harmful or illegal.
720
721Suggestions and Improvements. Any suggestions, comments, or communications you send to PetWell regarding modifications or enhancements to our services are considered non-confidential and n
721on-proprietary. PetWell is free to utilize any ideas, concepts, know-how, or techniques contained in such suggestions for any purpose, including but not limited to the development and marketing of products and services incorporating such information without any compensation or attribution to you. You acknowledge that PetWell is under no obligation to employ, display, reproduce, or distribute any such ideas and you cannot demand such actions.`},7:{title:"REQUIRED THIRD-PARTY VERIFICATION SERVICES",content:`PetWell is committed to maintaining a safe environment for both Service Users and Service Providers. As part of this commitment, we utilize various safety measures, including background checks and identification verifications against national databases. If you are not comfortable with PetWell conducting these searches, please refrain from registering as a Service Provider.
722
723By registering on PetWell, you consent to undergo background checks using the information you provide. PetWell may review the results obtained from third-party verification services and take appropriate actions based on these findings. You authorize PetWell to verify the accuracy of your provided details and agree to indemnify PetWell against any losses or liabilities that may arise from these checks.
724
725It is important for Service Users to conduct their own evaluations of Service Providers. Please note the following limitations of our background checks:
726
727PetWell does not automatically conduct background checks on all Users unless explicitly stated in these Legal Terms.
728Not all types of records are accessible to third-party background checking agencies, and some records may not be current.
729Information such as juvenile records, dismissed cases, foreign convictions, and traffic violations (unless categorized as criminal offenses in certain jurisdictions) are generally not included in background check reports.
730
731PetWell reserves the right to terminate a membership based on the findings from third-party verification services. Remember, it is your responsibility to ensure that any information used from our services is accurate and reliable.
732
733PetWell is committed to maintaining a safe environment for both Service Providers and Service Users. To support this commitment, we offer a range of optional verification tools, including name and address verification, social security number verification, IC, passport, and criminal background checks, particularly for Service Providers. We utilize Airwallex to facilitate these verifications as part of our payment solution.
734
735Service Providers and Service Users have the option to verify various details such as name, address, national ID number, criminal background, and professional license credentials using third-party verification services available through our service. By engaging with our service, you affirm that neither you nor anyone in your household has been involved in legal actions concerning violence, abuse, neglect, fraud, larceny, or any crime that poses a threat to others. You consent to PetWell verifying these declarations and understand that PetWell may take appropriate actions based on the findings at its discretion.
736
737Utilizing third-party verification services provided through PetWell is entirely at your discretion. You acknowledge that these services are provided for convenience and that PetWell does not control or endorse the accuracy or reliability of the verification service or the information it offers. PetWell may review data from these third-party services and may terminate your account based on this information.
738
739It's your choice to make the results from third-party verification services public on your PetWell profile. Should you choose to share this information, be aware that it might influence others' decisions to engage your services. You also agree to indemnify and hold PetWell harmless from any damages that may arise from making such details public.`},8:{title:"ADDITIONAL VERIFICATION OPTIONS",content:`PetWell is committed to maintaining a safe environment for both Service Providers and Service Users. To support this commitment, we offer a range of optional verification tools, including name and address verification, social security number verification, IC, passport, and criminal background checks.
740
741particularly for Service Providers. We utilize Airwallex to facilitate these verifications as part of our payment solution.
742
743Service Providers and Service Users have the option to verify various details such as name, address, national ID number, 
743criminal background, and professional license credentials using third-party verification services available through our service. By engaging with our service, you affirm that neither you nor anyone in your household has been involved in legal actions concerning violence, abuse, neglect, fraud, larceny, or any crime that poses a threat to others. You consent to PetWell verifying these declarations and understand that PetWell may take appropriate actions based on the findings at its discretion.
744
745Utilizing third-party verification services provided through PetWell is entirely at your discretion. You acknowledge that these services are provided for convenience and that PetWell does not control or endorse the accuracy or reliability of the verification service or the information it offers. PetWell may review data from these third-party services and may terminate your account based on this information. It's your choice to make the results from third-party verification services public on your PetWell profile. Should you choose to share this information, be aware that it might influence others' decisions to engage your services. You also agree to indemnify and hold PetWell harmless from any damages that may arise from making such details public.
746
747PetWell informs you that in connection with your use of a third-party verification service, we may acquire a consumer report from a consumer reporting agency. These consumer reports may include detailed information about your character, reputation, personal characteristics, and lifestyle, which could encompass consumer credit, criminal history, workers' compensation, driving records, employment history, military service, civil records, and educational background.
748
749By choosing to use, access, or share information from a third-party verification service through our service, you affirm that you will adhere to all relevant consumer reporting laws. Should you opt to share this information with other parties, either via this service or externally, you agree to act within legal boundaries and commit to indemnifying and absolving PetWell of any losses, liabilities, damages, or costs arising from such actions, regardless of cause. PetWell explicitly disclaims any liability for losses that may result from using information provided by third-party verification services.`},9:{title:"COMPLIANCE WITH THE FAIR CREDIT REPORTING ACT",content:`PetWell informs you that in connection with your use of a third-party verification service, we may acquire a consumer report from a consumer reporting agency. These consumer reports may include detailed information about your character, reputation, personal characteristics, and lifestyle, which could encompass consumer credit, criminal history, workers' compensation, driving records, employment history, military service, civil records, and educational background.
750
751By choosing to use, access, or share information from a third-party verification service through our service, you affirm that you will adhere to all relevant consumer reporting laws. Should you opt to share this information with other parties, either via this service or externally, you agree to act within legal boundaries and commit to indemnifying and absolving PetWell of any losses, liabilities, damages, or costs arising from such actions, regardless of cause. PetWell explicitly disclaims any liability for losses that may result from using information provided by third-party verification services.
752
753PetWell has implemented procedures for addressing alleged and actual copyright and trademark infringements. If you suspect that your intellectual property has been copied and made available on our services in a manner that constitutes infringement, please provide the following details to [email protected] :
754
755A list of the intellectual property that you claim has been infringed upon. If your claim involves multiple works on our website, please provide a representative list of the affected works.
756A precise description of where the material you claim is infringing is located on our service, sufficient for PetWell to locate the material.
757A statement indicating that you believe in good faith that the disputed use has not been authorized by the intellectual property owner, its agent, or the law.
758Adequate information for us to be able to contact you, including your address, telephone number, and, if available, an email address.
759A physical or electronic signature of the person authorized to act on behalf of the owner of the exclusive right that is allegedly infringed.
760A declaration under penalty of perjury that the information provided in the notification is accurate and that you are the intellectual property owner or authorized to act on behalf of the intellectual property owner whose right is allegedly infringed.
761
762This notification is referred to as the "Notice."
763
764Please note that for the Notice to be valid, you must comply with all the outlined requirements. PetWell commits to removing any infringing content from our services in accordance with copyright law provisions. However, you are responsible for ensuring that your Notice meets all legal standards.
765
766Be aware that under copyright law, any person who knowingly makes false claims concerning copyright infringement may face legal liabilities. Only the intellectual property rights holder is eligible to report infringing materials through PetWell's established reporting procedures. If you are not the rights holder, you should advise the owner to contact us if they wish to pursue this matter.`},10:{title:"PROCEDURE FOR ADDRESSING COPYRIGHT INFRINGEMENT CLAIMS",content:`PetWell has implemented procedures for addressing alleged and actual copyright and trademark infringements. If you suspect that your intellectual property has been copied and made available on our services in a manner that constitutes infringement, please provide the following details to [email protected] :
767
768A list of the intellectual property that you claim has been infringed upon. If your claim involves multiple works on our website, please provide a representative list of the affected works.
769A precise description of where the material you claim is infringing is located on our service, sufficient for PetWell to locate the material.
770A statement indicating that you believe in good faith that the disputed use has not been authorized by the intellectual property owner, its agent, or the law.
771Adequate information for us to be able to contact you, including your address, telephone number, and, if available, an email address.
772A physical or electronic signature of the person authorized to act on behalf of the owner of the exclusive right that is allegedly infringed.
773A declaration under penalty of perjury that the information provided in the notification is accurate and that you are the intellectual property owner or authorized to act on behalf of the intellectual property owner whose right is allegedly infringed.
774
775This notification is referred to as the "Notice."
776
777Please note that for the Notice to be valid, you must comply with all the outlined requirements. PetWell commits to removing any infringing content from our services in accordance with copyright law provisions. However, you are responsible for ensuring that your Notice meets all legal standards.
778
779Be aware that under copyright law, any person who knowingly makes false claims concerning copyright infringement may face legal liabilities. Only the intellectual property rights holder is eligible to report infringing materials through PetWell's established reporting procedures. If you are not the rights holder, you should advise the owner to contact us if they wish to pursue this matter.
780
781Changes to the Service
782
783PetWell reserves the right to modify or discontinue the Service (or any part of it) temporarily or permanently at any time. PetWell may do so with or without notice, at its sole discretion. You agree that PetWell will not be liable to you or any third party for any changes, suspension, or termination of the Service.
784
785Service Termination Policy
786
787PetBacker reserves the right at any time and from time to time to modify or discontinue, temporarily or permanently, the Platform (or any part thereof) with or without notice and in its sole discretion. You agree that PetBacker shall not be liable to you or to any third party for any modification, suspension or discontinuance of PetBacker services.
788PetWell reserves the right, at its sole discretion, to terminate or suspend your access to our services, deactivate your account, block your email or IP address, or otherwise restrict your access to our services without notice. This action can be taken for any reason deemed appropriate by PetWell, including but not limited to violations of our Legal Terms, account inactivity, or any behavior believed to infringe on the operation or use of our services. Additionally, PetWell may remove any content you have submitted if it is considered a violation of our policies. This termination or suspension can occur at any moment and without prior notice to ensure the integrity and proper functioning of our services.
789
790
791You have the right to discontinue using our services at any time. To cancel your account, simply go to the "Deactivate Account" option located under "Profile > Help Center" in your account settings. This can be done with or without specific reason.
792Upon termination of your account, you immediately lose all access to the services and any outstanding payments or entitlements, including but not limited to referral discounts, bonuses, or rewards. Termination results from your failure to comply with the Legal Terms, maintain active participation, or properly manage your account. Should your account be terminated, you will lose access to all account data, though residual data may remain in our systems.
793
794If your account is terminated, you must promptly delete all copies of data, trademarks, and any content related to our services that you possess. We are not liable for any loss or damage following your access termination and retain the right to use the data collected from your use of the services for internal purposes. All licenses granted to us regarding your data will remain in effect for these purposes.
795
796You will receive notification via email if you provided a valid one during registration unless your use was previously terminated or canceled by us, making further notice unnecessary.
797
798Certain sections of our Legal Terms will continue to apply even after your account or services are terminated. You are also required to indemnify and hold harmless our company and its affiliates from any claims or demands, including legal fees and costs, arising out of the termination of your services.`},11:{title:"MODIFICATIONS AND TERMINATION OF SERVICES",content:`Changes to the Service
799
800PetWell reserves the right to modify or discontinue the Service (or any part of it) temporarily or permanently at any time. PetWell may do so with or without notice, at its sole discretion. You agree that PetWell will not be liable to you or any third party for any changes, suspension, or termination of the Service.
801
802Service Termination Policy
803
804PetBacker reserves the right at any time and from time to time to modify or discontinue, temporarily or permanently, the Platform (or any part thereof) with or without notice and in its sole discretion. You agree that PetBacker shall not be liable to you or to any third party for any modification, suspension or discontinuance of PetBacker services.
805PetWell reserves the right, at its sole discretion, to terminate or suspend your access to our services, deactivate your account, block your email or IP address, or otherwise restrict your access to our services without notice. This action can be taken for any reason deemed appropriate by PetWell, including but not limited to violations of our Legal Terms, account inactivity, or any behavior believed to infringe on the operation or use of our services. Additionally, PetWell may remove any content you have submitted if it is considered a violation of our policies. This termination or suspension can occur at any moment and without prior notice to ensure the integrity and proper functioning of our services.
806
807
808You have the right to discontinue using our services at any time. To cancel your account, simply go to the "Deactivate Account" option located under "Profile > Help Center" in your account settings. This can be done with or without specific reason.
809Upon termination of your account, you immediately lose all access to the services and any outstanding payments or entitlements, including but not limited to referral discounts, bonuses, or rewards. Termination results from your failure to comply with the Legal Terms, maintain active participation, or properly manage your account. Should your account be terminated, you will lose access to all account data, though residual data may remain in our systems.
810
811If your account is terminated, you must promptly delete all copies of data, trademarks, and any content related to our services that you possess. We are not liable for any loss or damage following your access termination and retain the right to use the data collected from your use of the services for internal purposes. All licenses granted to us regarding your data will remain in effect for these purposes.
812
813You will receive notification via email if you provided a valid one during registration unless your use was previously terminated or canceled by us, making further notice unnecessary.
814
815Certain sections of our Legal Terms will continue to apply even after your account or services are terminated. You are also required to indemnify and hold harmless our company and its affiliates from any claims or demands, including legal fees and costs, arising out of the termination of your services.`},12:{title:"INTELLECTUAL PROPERTY OWNERSHIP",content:`PetWell retains all rights to the content on our services, except for content uploaded by users. This includes, but is not limited to, texts, software, scripts, graphics, photos, sounds, music, videos, and interactive features ("Content"), as well as trademarks, service marks, and logos ("Marks"). These are protected under local and international copyright and intellectual property laws. Marks and names on our services that belong to other parties remain the property of their respective owners.
816
817The Content provided on our services is for your information and personal use only. It may not be used, copied, reproduced, distributed, transmitted, broadcast, displayed, sold, licensed, or otherwise exploited for any other purposes without the explicit prior written consent of the rightful owners. PetWell reserves all rights not specifically granted to the users. You are prohibited from using, copying, or distributing any of the Content, especially for commercial purposes, without the appropriate permissions. If you download or print any Content for personal use, you must maintain all copyright and proprietary notices. Additionally, you are required to respect the security features of the service and refrain from any actions that would circumvent or disable security measures, or that would allow or assist any unauthorized use or copying of Content, or that would enforce limitations on the use of our services and the Content within.
818
819PetWell retains all rights to its data and trademarks, protected by various intellectual property laws. We grant you a limited, revocable, non-transferable, and non-sublicensable license to use PetWell data (excluding any software source code) solely for personal use in engaging with our services. You must not copy, modify, publish, transmit, distribute, perform, display, or sell any data owned by PetWell or provided by other users or licensors.
820
821While PetWell may allow the use of certain features like an embeddable player for incorporating materials into your personal, non-commercial websites, it must not include direct promotions or links to service providers' personal business channels or external platforms offering similar services. Any use of PetWell's embeddable player must include a link back to our service, acknowledging the source of the content. We reserve the right to discontinue any service feature at any time without notice.`},13:{title:"ADVERTISEMENTS AND PROMOTIONS",content:"The services provided by PetWell may be partially funded through advertising revenue. Consequently, PetWell may display advertisements and promotions. The form, frequency, and scope of advertising on the service are subject to change. The presence of advertisements does not imply PetWell's endorsement of the advertised products or services. You acknowledge that PetWell is not liable for any loss or damage incurred by you arising from your interactions with or presence of advertisements on the service."},14:{title:"EXTERNAL LINKS, FORMS, AND CONTACT NUMBERS",content:`The Service may include links to third-party websites and resources, such as social media platforms and external websites, including vet clinic webpages. You may have the option to log into the Service using your accounts from these third-party sites, interact with them, conduct transactions, and adjust your privacy settings to share your activities on the Service with your contacts from these sites. PetWell does not control these third-party sites and resources, and therefore, is not responsible for their availability. PetWell does not endorse and is not liable for any content, advertising, products, or services on or available from such sites or resources.
822
823Links to any third-party site are not endorsements of those sites or any products or services offered through them. PetWell is not liable for any harm or losses caused by the use or reliance on any third-party content, goods, or services available through these websites or resources. The third-party sites may operate under different privacy policies, terms and conditions, and business practices than PetWell. Sometimes, it may appear that you are still interacting with PetWell when, in fact, you may have been redirected to a third-party site. In such cases, the third-party's terms and conditions and privacy policies apply.
824
825Your interactions and transactions with any third party found through the Service are solely between you and the third party. PetWell is not involved in these interactions or transactions. If you have any complaints, concerns, or questions about materials provided by third parties, you should contact the third party directly.
826
827No third party beneficiaries 
828
829You agree that, unless explicitly stated otherwise in these Legal Terms, there are no third-party beneficiaries to these Legal Terms.`},15:{title:"WARRANTY DISCLAIMER",content:`You acknowledge and agree that your use of the service is at your own risk. PetWell, along with its officers, directors, employees, affiliates, and agents, disclaims all warranties of any kind, whether express or implied. This includes any warranties relating to the quality, suitability, truth, accuracy, or completeness of any information, data, or materials provided through the service. The service and all data, materials, and content provided are available to you on an "as is," "as available," and "where-is" basis without any warranties of merchantability, fitness for a particular purpose, or non-infringement of third-party rights.
830
831PetWell does not guarantee the absence of errors, inaccuracies, or the security of the servers where personal and financial information is stored. PetWell is also not responsible for any bugs, viruses, or other harmful components transmitted through the service by third parties. We do not endorse or assume responsibility for any product or service advertised by third parties through the service or any hyperlinked website.
832
833Your interactions and dealings with other service users or service providers are solely at your risk. PetWell does not conduct background checks on service providers or users. The service operates on a reputation-based system, encouraging you to consider other users' feedback and third-party referrals when making decisions.
834
835All services are provided without warranty from PetWell. We specifically disclaim any implied warranties of title, merchantability, fitness for a particular purpose, and n
835on-infringement. Some jurisdictions do not allow the disclaimer of implied warranties, so the foregoing disclaimer may not apply to you. You may also have other legal rights that vary by jurisdiction.`},16:{title:"LIABILITY LIMITATIONS",content:`PetWell and its affiliates, including officers, directors, employees, agents, successors, and assigns, shall not be liable for any direct, indirect, incidental, special, punitive, or consequential damages arising from your use of our services or any content provided on the service. This includes damages arising from (i) access to or use of the service, regardless of whether a service agreement was formed through the service or independently; (ii) errors or inaccuracies in any content; (iii) unauthorized access to secure servers or personal and financial information stored therein; (iv) any bugs, viruses, or similar issues transmitted through the service by any third party; (v) interruption or cessation of transmission to or from the service; (vi) errors or omissions in any content; (vii) any disputes during or after the negotiation of a service, or any other disputes arising between users; (viii) any offensive, illegal, or defamatory conduct of any third party; or (ix) any use of content posted, emailed, transmitted, or otherwise made available through the service. The
835se limitations apply even if PetWell is advised of the possibility of such damages and notwithstanding any failure of essential purpose of any limited remedy.
836
837Furthermore, PetWell's aggregate liability arising from or relating to the service shall not exceed the total amount of fees you have paid to PetWell. You acknowledge that PetWell is not liable for user-generated content or any third-party conduct and that the risk of harm or damage from the foregoing rests entirely with you.
838
839The service may contain links to third-party websites not owned or controlled by PetWell. PetWell has no control over, and assumes no responsibility for the content, policies, or practices of any third-party websites. You therefore relieve PetWell from any liability arising from your use of any third-party website.
840
841We are not liable for any damages arising from the use of our services, including but not limited to direct, incidental, or consequential damages, even if advised of such possibilities. This extends to damages resulting from unauthorized access to or alteration of your transmissions or data and the conduct or statements of any third party on the service. Each clause intended to limit liability is essential in determining our willingness to enter into these Legal Terms with you and shall be enforced even if limited remedies fail in their essential purpose. No matter what, in any event that any damages are imposed against PetWell, the maximum compensation for any damages in one occasion will not exceed ten thousand Hong Kong dollars (HKD$10000).`},17:{title:"FORCE MAJEURE",content:"Neither PetWell nor you will be held liable for any delays or failures in performance, except for payment obligations, that stem from causes beyond reasonable control and without the fault or negligence of either party. These causes may include, but are not limited to, natural disasters like fires, floods, and earthquakes, labor disputes, utility failures, blackouts, acts of God, war (whether declared or undeclared), actions by regulatory authorities, or other major events beyond our control."},18:{title:"RELEASE AND INDEMNIFICATION",content:`You agree to defend, indemnify, and hold harmless PetWell, including its officers, directors, employees, agents, affiliates, and service providers, from any liabilities, claims, expenses, damages, and costs, including legal fees, arising from your use of and participation in our services. This includes any violations of our Legal Terms and Privacy Policy, infringement of any third-party rights such as intellectual property or privacy rights, or any damage caused by content you have submitted. This obligation to defend and indemnify will survive the termination of these terms and your use of our services.
842
843If you encounter disputes with other users, you release PetWell and its associates from all claims, demands, and damages of every kind, known or unknown, related to such disputes or your use of our services.
844
845You acknowledge that any legal actions related to other users' actions or omissions will be limited to claims against those specific individuals. You agree not to hold PetWell liable or seek legal remedies from it. PetWell is released from all claims, damages, and demands arising from your interactions with other users or as a result of your activities within our services.
846
847You may not transfer or assign your rights and licenses under these terms, but PetWell may assign them without restriction.`},19:{title:"NOTICE",content:"You acknowledge that PetWell may send notifications and updates, including changes to the Legal Terms, via email, SMS, postal mail, or by posting them on our services. This is to ensure you are always well-informed about any changes or important information regarding your use of PetWell."},20:{title:"GENERAL INFORMATION",content:`The Legal Terms, combined with the Privacy Policy and any additional legal notices or policies published by PetWell, constitute the complete agreement between you and PetWell regarding the service. Should any provision of these Legal Terms be deemed invalid by a court with appropriate jurisdiction, such invalidity will not affect the validity of the remaining provisions, which will remain in full effect.
848
849A failure by PetWell to enforce any rights or provisions of the Legal Terms should not be deemed a waiver of such rights or provisions. No waiver of any provision is a waiver of any other provision, nor is it a continuing waiver, and PetWell's right to enforce such rights and provisions remains in full force.
850
851Actions related to the service must commence within one year after the cause of action accrues; otherwise, they are permanently barred, precluding the initiation of such actions thereafter. Headings used in these Legal Terms are for convenience only and hold no legal or contractual significance.`}}},Nf={mallParking:"Mall Parking",nearbyParking:"Nearby Parking",evCharging:"EV Charging",carParkName:"Car Park Name",walk:"Walk",heightLimit:"Height Limit"},Rf={pageTitle:"[2026 Latest] Pet-friendly Malls in Hong Kong",subt
851itle:"2026 updated guide to Hong Kong pet-friendly shopping malls across Kowloon, Hong Kong Island, and the New Territories",description:"The most detailed directory of pet-friendly malls in Hong Kong, covering pet policies, leash/carrier rules, hours, parking, and transport tips",searchPlaceholder:"Search mall name or address...",filterByRegion:"Filter by region",regions:{all:"All regions",kowloon:"Kowloon",hongKong:"Hong Kong Island",newTerritories:"New Territories",others:"Others"},loading:"Loading...",error:"Failed to load malls",errorSubtitle:"Please try again later or contact support",noResults:"No pet-friendly malls found for this area",noResultsHint:"Try adjusting your search or filters.",ctaTitle:"Looking for more pet-friendly spots?",ctaDescription:"Download the PetWell app for restaurants, clinics, grooming, lodging, and more",filterPetsYes:"Pets welcome",filterLeashWalk:"Leash walk OK",filtersLabel:"Filters",clearFilters:"Clear filters",resultsCount:"{{count}} malls",trustBadge:"2026 latest policy info",backToList:"Back to malls",address:"Address",phone:"Phone",website:"Website",openingHours:"Opening hours",closed:"Closed",gallery:"Photos",mtrAccess:"MTR access",detail:{notFound:"Mall not found",policyTitle:"Pet policy",callNow:"Call mall",getDirections:"Get directions",visitWebsite:"Official website",dining:"Dining",diningWebsite:"Mall dining page",diningVenues:"Pet-friendly dining",browseRestaurants:"Browse restaurants",parking:"Parking",parkingWebsite:"Parking page",parkingDetails:"Parking",weekdayRate:"Weekday",weekendRate:"Weekend",heightLimit:"Height limit",todayHours:"Today",viewFullHours:"View full hours",hideFullHours:"Hide hours",planVisit:"Plan your visit",visitGuideTitle:"Visit with pets",rulesTitle:"Before you go",tagStroller:"Stroller loan",tagStrollerNo:"No stroller loan",tagWalkZones:"Walk zones",tagPetToilet:"Pet toilet",tagPetToiletNo:"No pet toilet",tagPetPark:"Pet park",tagPetParkAt:"Pet park · {{place}}",tagParking:"Parking",tagDiningYes:"Pet-friendly dining",tagDiningNo:"No pet dining yet",policySubtitle:"Key rules first; notes only when useful",facilitiesTitle:"At a glance",walkZonesTitle:"Where you can go",restrictedTitle:"Restricted areas",floors:"Floors",floorGround:"G/F",floorN:"{{n}}/F",strollerTitle:"Pet stroller loan",membership:"Membership",membershipRequired:"Required",membershipWithName:"Membership: {{name}}",depositAmount:"Deposit HK${{amount}}",depositLabel:"Deposit",notesTitle:"Notes",notePrefix:"Note: ",venueWithFloor:"{{name}} · {{floor}}",venueCount:"{{count}} spots",zoneCount:"{{count}} zones",gettingThere:"Getting there",showMore:"Show more",showLess:"Show less",amenityPark:"Pet park",amenityDining:"Dining",amenityStroller:"Stroller",amenityToilet:"Pet toilet",amenityParking:"Parking",perHour:"/hr",ratePerHour:"HK${{amount}}/hr",rateAmount:"HK${{amount}}",heightLimitValue:"Height limit: {{meters}} m",ruleLeash:"Leash required",ruleCarrier:"Carrier / held / stroller required",ruleNoCarrier:"No carrier needed in common areas",ruleMuzzle:"Muzzle suggested for large dogs",ruleMaxWeight:"Max {{kg}} kg",zoneType:{OUTDOOR:"Outdoor",INDOOR:"Indoor",MIXED:"Indoor & outdoor"}}},If={pageTitle:"Pet Home Visit Services in Hong Kong",subtitle:"Pick an area to see who can come to you",description:"Compare home-visit vets, nurses, groomers and related services. Check coverage and prices, then contact directly.",searchPlaceholder:"Area, pet or name",filterByRegion:"Filter by region",regions:{all:"All regions",kowloon:"Kowloon",hongKong:"Hong Kong Island",newTerritories:"New Territories",others:"Others"},loading:"Loading...",error:"Failed to load home visit providers",errorSubtitle:"Please try again later or contact support",noResults:"No home visit providers match these filters",noResultsHint:"Try another area, or search for a pet type or service.",ctaTitle:"Looking for more pet services?",ctaDescription:"Download the PetWell app for clinics, grooming, lodging and more",filter24Hour:"24 hours",filtersLabel:"Filters",clearFilters:"Clear filters",resultsCount:"{{count}} providers",trustBadge:"Coverage and prices first",moreServices:"{{count}} more services",backToList:"Back to home visits",address:"Address",phone:"Phone",website:"Website",openingHours:"Hours",closed:"Closed",detail
851:{notFound:"Home visit provider not found",homeVisitConfirmed:"Home visit confirmed",coverage:"Service coverage",travelFee:"Travel fee",about:"About",services:"Services",pricing:"Pricing",referenceDisclaimer:"For reference only. Confirm services and prices with the provider.",pricingEmpty:"Pricing is not listed yet — WhatsApp or call for the latest quote.",pricingService:"Service",pricingAmount:"Price",pricingNotes:"Notes",includesTravel:"Travel included",species:"Pets served",contact:"Contact",whatsapp:"WhatsApp",call:"Call",bookOnline:"Book online",report:"Report incorrect info",reviews:"{{count}} reviews",viewFullHours:"View full hours",hideFullHours:"Hide hours"}},Df={myReviews:"My Reviews",mySubtitle:"Places you have been with your pet, written down.",myEmpty:"You have not written any reviews yet.",myEmptyTitle:"No reviews yet",myEmptyBody:"Write about a restaurant or clinic you visited with your pet — it helps other owners.",emptyCtaRestaurants:"Find restaurants",emptyCtaClinics:"Find clinics",searchPlaceholder:"Search a place or product",mySeoDescription:"View all reviews you have written on PetWell.",publicEmpty:"This user has not shared any reviews yet.",publicSeoDescription:"View public place and product reviews from this PetWell member.",publicSubtitle:"Public reviews from a PetWell member — places and products they have tried with their pets.",memberBadge:"PetWell member",reviewsCount:"{{count}} reviews",reviewsCount_one:"{{count}} review",avgRating:"{{rating}} avg",filterAll:"All",filterLabel:"Filter reviews",viewPlace:"View place",loading:"Loading reviews…",loadFailed:"Could not load this profile right now. Please try again later.",empty:"No reviews yet.",emptyFiltered:"No reviews in this category yet.",anonymousBadge:"Anonymous",anonymousUser:"PetWell user",externalUser:"External user",unknownUser:"Unknown user",loginRequiredTitle:"Sign in to view your reviews",loginRequiredBody:"Log in to your PetWell account to see the reviews you have written.",types:{clinic:"Clinic",salon:"Salon",lodging:"Lodging",restaurant:"Restaurant",product:"Product"}},Wf={title:"Profile",subtitle:"You and your pets on PetWell.",seoDescription:"View and edit your PetWell profile.",breadcrumb:"Profile",sections:"Account sections",loginRequiredTitle:"Sign in to open your profile",loginRequiredBody:"Log in to see your details, your pets, and the reviews you have written.",loading:"Loading profile…",loadFailed:"Could not load your profile right now. Please try again later.",personalInfo:"Personal info",edit:"Edit profile",editProfile:"Edit profile",editProfileDesc:"Update your name, phone, address, and photo.",firstName:"First name",lastName:"Last name",email:"Email",phone:"Phone",address:"Address",emailReadOnly:"Email cannot be changed here.",phoneHint:"8-digit Hong Kong mobile number",notSet:"Not set",save:"Save",saving:"Saving…",cancel:"Cancel",changePhoto:"Change photo",saveSuccess:"Profile updated",saveFailed:"Could not save your profile. Please try again.",firstNameRequired:"Please enter your first name.",lastNameRequired:"Please enter your last name.",phoneInvalid:"Please enter a valid 8-digit Hong Kong phone number.",myPets:"My pets",petCount:"{{count}}/{{max}}",sharedBadge:"Shared",sharingBadge:"Sharing",noPets:"No pets on this profile yet",noPetsHint:"Create their profile in the app so health records stay with you.",manageInApp:"Manage in the app",managePetInApp:"Manage {{name}} in the app",addPet:"Add a pet",appHint:"Add or edit pets in the PetWell app.",downloadGateTitle:"Manage pets in the PetWell app",downloadGateBody:"Adding, editing, sharing, and vaccine records are available in the PetWell app.",reviewsTeaser:"Your reviews",reviewsTeaserCta:"See all",reviewsTeaserEmpty:"Write your first review to help other pet owners.",ageYears:"{{count}} years old",ageMonths:"{{count}} months old",activity:"Activity",account:"Account",deleteAccount:"Delete account",weightKg:"{{weight}} kg"},Lf={nav:Hm,placeListing:$m,restaurantReservation:Bm,tests:Vm,hero:Um,home:qm,homePortal:zm,clinics:Km,salons:Gm,lodging:Ym,restaurants:Qm,testBooking:Xm,restaurant:Jm,ngos:Zm,footer:ef,report:tf,common:of,hours:nf,forum:rf,deleteAccount:af,petTag:sf,reviews:lf,activateTag:cf,download:df,event:uf,adminForms:pf,nameTagBanner:hf,nametagDailyPopup:mf,midAutumnDailyPopup:ff,cnyProducts:gf,checkout:yf,payment:vf,cart:wf,petMatchmaker:bf,otherServices:Pf,about:xf,contactWidget:Sf,landing:Tf,auth:Af,authLinking:Ef,
851nametagPage:kf,terms:Cf,malls:Nf,mallPlaces:Rf,homeVisitPlaces:If,userReviews:Df,accountProfile:Wf};ne.use(ga).use(Ah).init({resources:{zh:{translation:jm},en:{translation:Lf}},lng:"zh",fallbackLng:"zh",detection:{order:["localStorage"],caches:["localStorage"]},debug:!1,interpolation:{escapeValue:!1}});var Vr;const ya=typeof window<"u"&&((Vr=window.location)!=null&&Vr.origin)?window.location.origin:"http://localhost:5173",Of=`${ya}/auth/callback/`,Ff=`${ya}/`,va={aws_project_region:"ap-southeast-1",aws_appsync_graphqlEndpoint:"https://zzqlfjlslncu7kjjqkdedp7uwu.appsync-api.ap-southeast-1.amazonaws.com/graphql",aws_appsync_region:"ap-southeast-1",aws_appsync_authenticationType:"API_KEY",aws_appsync_apiKey:"da2-pq3dyfbcuncunjstmawmtz3req",aws_cognito_region:"ap-southeast-1",aws_cognito_identity_pool_id:"ap-southeast-1:827a8b5e-155c-448e-a2e6-c9e75e98789d",aws_user_pools_id:"ap-southeast-1_vC1Zugxkg",aws_user_pools_web_client_id:"mm6ek73uv5ikh82iidgm0fv0j",oauth:{domain:"petwell-auth-prod.auth.ap-southeast-1.amazoncognito.com",scope:["email","openid","profile"],redirectSignIn:Of,redirectSignOut:Ff,responseType:"code"},aws_cognito_username_attributes:["EMAIL","PHONE_NUMBER"],aws_cognito_social_providers:["GOOGLE","APPLE"],aws_cognito_signup_attributes:["EMAIL"],aws_cognito_mfa_configuration:"OFF",aws_cognito_mfa_types:["SMS"],aws_cognito_password_protection_settings:{passwordPolicyMinLength:8,passwordPolicyCharacters:[]},aws_cognito_verification_mechanisms:["EMAIL"],aws_user_files_s3_bucket:"petwellclientstoragee8eec-prod",aws_user_files_s3_bucket_region:"ap-southeast-1"},_f=va.aws_user_files_s3_bucket,Mf=va.aws_user_files_s3_bucket_region,jf="forum-images/",wa=e=>{const t=e.replace(/^\/+/,"").replace(/^public\//,"");return`https://${_f}.s3.${Mf}.amazonaws.com/public/${t}`},Hf=e=>wa(e),ba=e=>{const t=decodeURIComponent(e);if(t.includes("/public/"))return t.slice(t.indexOf("/public/")+8);const n=["/forum-images/","/posts/","/reply-images/"];for(const r of n)if(t.includes(r))return t.slice(t.indexOf(r)+1);return null},$f=e=>{const t=e.trim().replace(/&amp;/g,"&");if(!t)return"";if(!t.startsWith("http"))return t;try{const o=new URL(t),n=ba(o.pathname);return n!=null&&n.startsWith(jf)?Hf(n):t}catch{return t}},dw=async e=>{const t=e.trim().replace(/&amp;/g,"&");if(!t)return"";let o=null;if(t.startsWith("http"))try{const n=new URL(t);o=ba(n.pathname)}catch{o=null}else o=t.replace(/^\/+/,"").replace(/^public\//,"");if(!o)return t;try{const{url:n}=await zs({key:o,options:{accessLevel:"guest"}});return n.toString()}catch{return wa(o)}},Lt=e=>e==null?"":String(e).replace(/\uFFFC/g,"").replace(/\uFFFD/g,"").replace(/[\u200B-\u200D\uFEFF]/g,""),Pa=/^(javascript|data|vbscript):/i,xa=/^[a-z][a-z0-9+.-]*:/i,dt=e=>e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),Sr=e=>{const t=$f(e).trim().replace(/&amp;/g,"&");if(!t||Pa.test(t))return"";if(!xa.test(t))return t;try{const o=new URL(t);return o.protocol==="http:"||o.protocol==="https:"?o.toString():""}catch{return""}},Tr=e=>{const t=e.trim().replace(/&amp;/g,"&");if(!t||Pa.test(t))return"";const o=xa.test(t)?t:`https://${t}`;try{const n=new URL(o);return n.protocol!=="http:"&&n.protocol!=="https:"?"":n.toString()}catch{return""}},uw=e=>{if(!e)return"";let t=Lt(e);return t=t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=t.replace(/\n/g,"<br>"),t=t.replace(/\[img=([^\]]+)\](.*?)\[\/img\]/gi,(o,n,r)=>{const i=Sr(n);if(!i)return"";const a=dt(i),s=dt(r.trim());return`<img src="${a}" alt="${s}" data-image-url="${a}" class="forum-image max-w-full h-auto rounded-lg my-2 cursor-pointer transition-transform hover:scale-[1.02]" style="max-width: 600px; max-height: 400px; width: auto; height: auto; object-fit: contain; display: inline-block; margin: 0.5rem 0; vertical-align: middle;" loading="lazy" />`}),t=t.replace(/\[img\](.*?)\[\/img\]/gi,(o,n)=>{const r=Sr(n);if(!r)return"";const i=dt(r);return`<img src="${i}" alt="" data-image-url="${i}" class="forum-image max-w-full h-auto rounded-lg my-2 cursor-pointer transition-transform hover:scale-[1.02]" style="max-width: 600px; max-height: 400px; width: auto; height: auto; object-fit: contain; display: inline-block; margin: 0.5rem 0; vertical-align: middle;" loading="lazy" />`}),t=t.replace(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,(o,n,r)=>{const i=Tr(n);return i?`<a href="${dt(i)}" target="_blank" rel="noopener noreferrer" class="text-[#FF902A] hover:underline">${r}</a>`:r}),t=t.replace(/\[url\](.*?)\[\/url\]/gi,(o,n)=>{const r=Tr(n);if(!r)return n;const i=dt(n.trim().replace(/&amp;/g,"&"))||r;return`<a href="${dt(r)}" target="_blank" rel="noopener noreferrer" class="text-[#FF902A] hover:underline">${i}</a>`}),t=t.replace(/\[left\](.*?)\[\/left\]/gi,'<div style="text-align: left; display: block;">$1</div>'),t=t.replace(/\[center\](.*?)\[\/center\]/gi,'<div style="text-align: center; display: block;">$1</div>'),t=t.replace(/\[right\](.*?)\[\/right\]/gi,'<div style="text-align: right; display: block;">$1</div>'),t=t.replace(/\[align=left\](.*?)\[\/align\]/gi,'<div style="text-align: left;">$1</div>'),t=t.replace(/\[align=center\](.*?)\[\/align\]/gi,'<div style="text-align: center;">$1</div>'),t=t.replace(/\[align=right\](.*?)\[\/align\]/gi,'<div style="text-align: right;">$1</div>'),t=t.replace(/\[small\](.*?)\[\/small\]/gi,'<span style="font-size: 12px;">$1</span>'),t=t.replace(/\[medium\](.*?)\[\/medium\]/gi,'<span style="font-size: 24px;">$1</span>'),t=t.replace(/\[large\](.*?)\[\/large\]/gi,'<span style="font-size: 36px;">$1</span>'),t=t.replace(/\[size=(\d+)\](.*?)\[\/size\]/gi,'<span style="font-size: $1px;">$2</span>'),t=t.replace(/\[color=([^\]]+)\](.*?)\[\/color\]/gi,(o,n,r)=>{const i=String(n).trim();return`<span style="color: ${/^(#[0-9a-fA-F]{3,8}|[a-zA-Z]+|rgb\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*\)|rgba\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*(?:0|1|0?\.\d+)\s*\))$/.test(i)?i:"inherit"};">${r}</span>`}),t=t.replace(/\[b\](.*?)\[\/b\]/gi,"<strong>$1</strong>"),t=t.replace(/\[u\](.*?)\[\/u\]/gi,"<u>$1</u>"),t=t.replace(/\[s\](.*?)\[\/s\]/gi,"<s>$1</s>"),t}
851,pw=e=>e?Lt(e).replace(/\[img=([^\]]+)\](.*?)\[\/img\]/gi,"$2").replace(/\[img\](.*?)\[\/img\]/gi,"").replace(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"$2").replace(/\[url\](.*?)\[\/url\]/gi,"$1").replace(/\[left\](.*?)\[\/left\]/gi,"$1").replace(/\[center\](.*?)\[\/center\]/gi,"$1").replace(/\[right\](.*?)\[\/right\]/gi,"$1").replace(/\[align=[^\]]+\](.*?)\[\/align\]/gi,"$1").replace(/\[small\](.*?)\[\/small\]/gi,"$1").replace(/\[medium\](.*?)\[\/medium\]/gi,"$1").replace(/\[large\](.*?)\[\/large\]/gi,"$1").replace(/\[size=\d+\](.*?)\[\/size\]/gi,"$1").replace(/\[color=[^\]]+\](.*?)\[\/color\]/gi,"$1").replace(/\[b\](.*?)\[\/b\]/gi,"$1").replace(/\[u\](.*?)\[\/u\]/gi,"$1").replace(/\[s\](.*?)\[\/s\]/gi,"$1"):"",Sa=`
852  query ClientsByEmail($email: ID!, $limit: Int) {
853    clientsByEmail(email: $email, limit: $limit) {
854      items {
855        id
856        email
857        phone
858        firstName
859        lastName
860        displayName
861      }
862    }
863  }
864`,Ta=`
865  query GetClientByEmail($email: ID!, $limit: Int) {
866    listClients(filter: { email: { eq: $email } }, limit: $limit) {
867      items {
868        id
869        email
870        phone
871        firstName
872        lastName
873        displayName
874      }
875    }
876  }
877`,Bf=`
878  query ListClientsPage($limit: Int, $nextToken: String) {
879    listClients(limit: $limit, nextToken: $nextToken) {
880      items {
881        id
882        email
883        phone
884        firstName
885        lastName
886        displayName
887      }
888      nextToken
889    }
890  }
891`,Vf=`
892  mutation CreateClient($input: CreateClientInput!) {
893    createClient(input: $input) {
894      id
895      email
896      phone
897      firstName
898      lastName
899      displayName
900    }
901  }
902`,Aa=`
903  mutation UpdateClient($input: UpdateClientInput!) {
904    updateClient(input: $input) {
905      id
906      email
907      phone
908      firstName
909      lastName
910      displayName
911    }
912  }
913`,so=new Map,vn=5*60*1e3,wn=e=>{const t=e==null?void 0:e.trim();return t||void 0},bn=e=>{if(!e)return;const t=e.replace(/\D/g,"");return t?`+852${t}`:void 0},Pn=e=>{if(!(typeof e!="number"||Number.isNaN(e)||e<=0))return Math.round(e*10)/10},on=e=>{const t=new Map;for(const o of e)o!=null&&o.id&&!t.has(o.id)&&t.set(o.id,o);return Array.from(t.values())},Uf=async e=>{var o,n;const t=[];try{const r=await Le(Sa,{email:e,limit:50},{authMode:"userPool"});t.push(...((o=r.clientsByEmail)==null?void 0:o.items)||[])}catch{}try{const r=await Le(Ta,{email:e,limit:50},{authMode:"userPool"});t.push(...((n=r.listClients)==null?void 0:n.items)||[])}catch{}return on(t)},xn=async e=>{var d,c;const t=e.trim();if(!t)return[];const o=Array.from(new Set([t,t.toLowerCase()])),n=o.map(p=>p.trim().toLowerCase()),r=[];for(const p of o){const m=await Uf(p);r.push(...m)}let i=on(r);if(i.length>0)return i;let a,s=0;do{const p=await Le(Bf,{limit:100,nextToken:a},{authMode:"userPool"}),g=(((d=p.listClients)==null?void 0:d.items)||[]).filter(h=>{var f;const y=(f=h==null?void 0:h.email)==null?void 0:f.trim().toLowerCase();return!!(y&&n.includes(y))});i=on([...i,...g]),a=((c=p.listClients)==null?void 0:c.nextToken)||void 0,s+=1}while(a&&s<10);return i},Wo=async e=>{var n,r;const t=i=>{const a=(i||[]).filter(Boolean);return a.find(s=>Sn(s))||a[0]};try{const i=await Le(Sa,{email:e,limit:20},{authMode:"userPool"}),a=t((n=i.clientsByEmail)==null?void 0:n.items);if(a)return a}catch{}const o=await Le(Ta,{email:e,limit:20},{authMode:"userPool"});return t((r=o.listClients)==null?void 0:r.items)},Ea=async e=>{const t=await xn(e);return t.find(o=>Sn(o))||t[0]},nn=async e=>{const t=await xn(e);return t.length===0?!1:t.some(o=>Sn(o))},Sn=e=>{var r,i,a;if(!e)return!1;const t=!!((r=e.firstName)!=null&&r.trim()),o=!!((i=e.lastName)!=null&&i.trim()),n=!!((a=e.phone)!=null&&a.trim());return t&&o&&n},rn=async(e,t,o)=>{var f,v;const n=e.trim().toLowerCase(),r=t==null?void 0:t.trim().toLowerCase(),i=(f=o==null?void 0:o.firstName)==null?void 0:f.trim(),a=(v=o==null?void 0:o.lastName)==null?void 0:v.trim(),s=wn((o==null?void 0:o.displayName)||[i,a].filter(Boolean).join(" ")),d=bn(o==null?void 0:o.phone),c=Pn(o==null?void 0:o.weightKg);if(r&&n!==r)throw new Error(`Security violation: Cannot create Client with email ${e}. You are authenticated as ${t}.`);const p=await vt(),m=p.userId||p.username;if(!m)throw new Error("Cannot create Client without an authenticated Cognito user id.");const g={id:m,email:n,firstName:(i||s||"User").trim(),lastName:a||""};s&&(g.displayName=s),d&&(g.phone=d),c!==void 0&&(g.weight=c);const y=(await Le(Vf,{input:g},{authMode:"userPool"})).createClient;if(!(y!=null&&y.id))throw new Error(`Client creation returned no id for email: ${e}`);return so.set(n,{clientId:y.id,expiresAt:Date.now()+vn}),y.id},ka=async(e,t,o)=>{var n,r;try{const i=e.trim().toLowerCase(),a=t==null?void 0:t.trim().toLowerCase(),s=(n=o==null?void 0:o.firstName)==null?void 0:n.trim(),d=(r=o==null?void 0:o.lastName)==null?void 0:r.trim(),c=wn((o==null?void 0:o.displayName)||[s,d].filter(
913Boolean).join(" ")),p=bn(o==null?void 0:o.phone),m=Pn(o==null?void 0:o.weightKg),g=!!(s||d||c||p||m!==void 0);if(a&&i!==a)throw new Error(`Security violation: Cannot create Client with email ${e}. You are authenticated as ${t}. You can only create posts with your own email.`);const h=so.get(i);if(!g&&h&&h.expiresAt>Date.now())return h.clientId;let y=await Wo(i);const f=!!y;if(!y)try{if(y={id:await rn(i,a,o),email:i,firstName:s||c||"User",lastName:d||""},!y&&(await new Promise(w=>setTimeout(w,500)),y=await Wo(i),!y))throw new Error(`Client creation returned null for email: ${e}. This might be due to authentication permissions. Please ensure you are logged in.`);if(!y.id)throw new Error(`Client creation returned a Client without an id for email: ${e}`)}catch(v){if(console.error("Error creating Client:",v),y=await Wo(i),!y){const w=v.message||v.toString();let x=`Failed to create or find Client for email: ${e}.`;throw w.includes("Unauthorized")||w.includes("email")?x+=" You must be logged in to create a forum post. Please ensure you are authenticated with the correct email address.":x+=` ${w}`,new Error(x)}}if(!y||!y.id)throw new Error(`Client record is missing required 'id' field for email: ${e}`);if(f&&g){const v={id:y.id};s&&y.firstName!==s&&(v.firstName=s),d&&y.lastName!==d&&(v.lastName=d),c&&y.displayName!==c&&(v.displayName=c),p&&y.phone!==p&&(v.phone=p),m!==void 0&&y.weight!==m&&(v.weight=m),Object.keys(v).length>1&&(y=(await Le(Aa,{input:v},{authMode:"userPool"})).updateClient||y)}return so.set(i,{clientId:y.id,expiresAt:Date.now()+vn}),y.id}catch(i){throw console.error("Error getting or creating Client:",i),i}},Ca=async(e,t,o)=>{var g,h;const n=e.trim().toLowerCase(),r=t==null?void 0:t.trim().toLowerCase(),i=(g=o==null?void 0:o.firstName)==null?void 0:g.trim(),a=(h=o==null?void 0:o.lastName)==null?void 0:h.trim(),s=wn((o==null?void 0:o.displayName)||[i,a].filter(Boolean).join(" ")),d=bn(o==null?void 0:o.phone),c=Pn(o==null?void 0:o.weightKg);if(r&&n!==r)throw new Error(`Security violation: Cannot update Client with email ${e}. You are authenticated as ${t}.`);const p=await xn(n);if(p.length===0)throw new Error(`Client profile not found for ${n}. Please contact support instead of creating a duplicate profile.`);let m=p[0].id;for(const y of p){const f={id:y.id};i&&y.firstName!==i&&(f.firstName=i),a&&y.lastName!==a&&(f.lastName=a),s&&y.displayName!==s&&(f.displayName=s),d&&y.phone!==d&&(f.phone=d),c!==void 0&&y.weight!==c&&(f.weight=c),Object.keys(f).length>1&&await Le(Aa,{input:f},{authMode:"userPool"})}return so.set(n,{clientId:m,expiresAt:Date.now()+vn}),m},Na=[{value:"DOG",label:"狗狗"},{value:"CAT",label:"貓貓"},{value:"SMALL_ANIMAL",label:"小動物"},{value:"LIFE_SHARING",label:"生活分享"},{value:"EVENTS",label:"活動"},{value:"ADOPTION",label:"領養"},{value:"HEALTH",label:"健康"},{value:"GROOMING",label:"美容"},{value:"DIET",label:"飲食"},{value:"TRAINING",label:"訓練"},{value:"BEHAVIOR",label:"行為問題"},{value:"PRODUCT_REVIEW",label:"用品評價"},{value:"TRADING",label:"交易"},{value:"TRAVEL",label:"旅遊"},{value:"LODGING",label:"住宿"},{value:"LOST_FOUND",label:"走失協尋"},{value:"EMERGENCY",label:"緊急求助"}],qf=(e,t)=>{const o=t||ne.language||"zh",n=`forum.categories.${e}`,r=ne.t(n,{lng:o});if(r&&r!==n)return r;const i=Na.find(a=>a.value===e);return(i==null?void 0:i.label)||e},zf=`
914  query GetClient($id: ID!) {
915    getClient(id: $id) {
916      id
917      firstName
918      lastName
919      displayName
920    }
921  }
922`,Kf=`
923  query ListTags($filter: ModelForumTagFilterInput, $limit: Int) {
924    listForumTags(filter: $filter, limit: $limit) {
925      items {
926        id
927        name
928        createdAt
929        updatedAt
930      }
931    }
932  }
933`;const Ar=new Map,Gf=10*60*1e3,Ra=async e=>{try{const t=Ar.get(e);if(t&&t.expiresAt>Date.now())return t.data;const o=await Le(zf,{id:e});return o.getClient&&Ar.set(e,{data:o.getClient,expiresAt:Date.now()+Gf}),o.getClient}catch(t){return console.error(`Error fetching Client ${e}:`,t),null}},Ia=(e,t)=>{const o=`${e}-${t}`;let n=0;for(let i=0;i<o.length;
933i++){const a=o.charCodeAt(i);n=(n<<5)-n+a,n=n&n}return Math.abs(n).toString(16).padStart(4,"0").slice(-4).toUpperCase()},lo=(e,t,o=0,n,r,i)=>{const a=Date.now();let s=0;if(s+=t*.5,s-=o*.25,i){const d=new Date(i).getTime(),c=(a-d)/(1e3*60*60);let p=1;c<=24?p=1:c<=168?p=.5+.5*(1-(c-24)/144):p=Math.max(.2,.5*Math.exp(-(c-168)/720)),s+=e*2*p}else s+=e*2;return Math.max(0,s)},hw=e=>{const t=e||ne.language||"zh";return Na.map(o=>({value:o.value,label:qf(o.value,t)}))},mw=async(e,t=100)=>{var o;try{if(!(e&&e.trim()))return((o=(await Le(Kf,{limit:t})).listForumTags)==null?void 0:o.items)||[]}catch(n){throw console.error("Error fetching forum tags:",n),n}},Yf=async e=>{var i;const t=Math.min(Math.max((e==null?void 0:e.limit)||50,1),100);if((i=e==null?void 0:e.searchQuery)!=null&&i.trim()){const a=new URLSearchParams({q:e.searchQuery.trim(),limit:String(t)}),s=await me(`/api/forum/search?${a.toString()}`);return Er(s.items||[],e)}const o=(e==null?void 0:e.sortBy)==="hot"||(e==null?void 0:e.sortBy)==="popular"?e.sortBy:"recent",n=new URLSearchParams({sort:o,limit:String(t)});e!=null&&e.asksVet?n.set("asksVet","1"):e!=null&&e.category&&n.set("category",e.category);const r=await me(`/api/forum/posts?${n.toString()}`);return Er(r.items||[],e)},Qf=e=>({...e,isHot:e.isHot??!1}),Er=(e,t)=>{let o=e.filter(n=>!!n).map(Qf).filter(n=>!n.isDeleted);return t!=null&&t.tags&&t.tags.length>0&&(o=o.filter(n=>n.tags&&n.tags.some(r=>t.tags.some(i=>r.toLowerCase().includes(i.toLowerCase()))))),(t!=null&&t.dateFrom||t!=null&&t.dateTo)&&(o=o.filter(n=>{const r=n.createdAt?new Date(n.createdAt).getTime():0;return!(t.dateFrom&&r<new Date(t.dateFrom).getTime()||t.dateTo&&r>new Date(t.dateTo).getTime())})),o.sort((n,r)=>{if(n.isPinned&&!r.isPinned)return-1;if(!n.isPinned&&r.isPinned)return 1;if((t==null?void 0:t.sortBy)==="hot"){const i=n.hotScore??lo(n.replies,n.likes,n.dislikes||0,void 0,n.createdAt,n.lastReplyAt),a=r.hotScore??lo(r.replies,r.likes,r.dislikes||0,void 0,r.createdAt,r.lastReplyAt);if(a!==i)return a-i;const s=n.lastReplyAt||n.createdAt,d=r.lastReplyAt||r.createdAt;return s&&d?new Date(d).getTime()-new Date(s).getTime():0}else{if((t==null?void 0:t.sortBy)==="popular")return r.likes!==n.likes?r.likes-n.likes:r.replies!==n.replies?r.replies-n.replies:r.views-n.views;if((t==null?void 0:t.sortBy)==="replies")return r.replies!==n.replies?r.replies-n.replies:r.lastReplyAt&&n.lastReplyAt?new Date(r.lastReplyAt).getTime()-new Date(n.lastReplyAt).getTime():0;{const i=n.lastReplyAt||n.createdAt,a=r.lastReplyAt||r.createdAt;return i&&a?new Date(a).getTime()-new Date(i).getTime():0}}}),o},fw=async(e=10)=>{try{const t=await Yf({sortBy:"hot",limit:e*3}),n=Date.now()-7*24*60*60*1e3;return t.filter(i=>{if(i.isDeleted||i.replies===0)return!1;const a=i.lastReplyAt&&new Date(i.lastReplyAt).getTime()>n,s=i.replies>=5||i.likes>=10;return a||s}).sort((i,a)=>{const s=i.hotScore??lo(i.replies,i.likes,i.dislikes||0,void 0,i.createdAt,i.lastReplyAt);return(a.hotScore??lo(a.replies,a.likes,a.dislikes||0,void 0,a.createdAt,a.lastReplyAt))-s}).slice(0,e)}catch(t){throw console.error("Error fetching hot topics:",t),t}},gw=(e,t,o,n)=>{const r=n||ne.language||"zh";if(Jn(e)||Jn({author:t,authorId:o}))return Cu(r);if(e!=null&&e.isAnonymous){const a=("anonHash"in e?e.anonHash:void 0)||(e.id&&o?Ia(e.id,o):"0000");return`${ne.t("forum.anonymousUser",{lng:r})} #${a}`}if(e!=null&&e.authorName&&e.authorName.trim())return e.authorName.trim();if(t!=null&&t.displayName){const i=t.displayName.trim();if(i&&!i.includes("@"))return i}if(t){const{firstName:i,lastName:a}=t,s=(i||"").trim(),d=(a||"").trim();if(s.includes("@")||d.includes("@"))console.error(`❌ Rejecting email-like value in firstName/lastName: firstName="${s}", lastName="${d}", authorId="${o||"unknown"}"`);else if(s||d){if(s&&d)return`${s} ${d}`.trim();if(s)return s;if(d)return d}}return o&&!t&&console.warn(`⚠️ No author data for authorId: ${o}. Client data should be fetched before display.`),o?ne.t("forum.genericUser",{lng:r}):ne.t("forum.anonymous",{lng:r})},Da=async e=>{const o=(await me(`/api/forum/posts/${encodeURIComponent(e)}`,{auth:"optional"})).post;if(!o||o.isDeleted)throw new Error("Post not found or has been deleted");return o.isHot=o.isHot??!1,o.isAnonymous?(!o.anonHash&&o.id&&o.authorId&&(o.anonHash=Ia(o.id,o.authorId)),o.authorId="",o.author=void 0,o):(o.author&&(o.author={firstName:o.author.firstName||"",lastName:o.author.lastName||"",displayName:o.author.displayName}),o)},yw=async(e,t=100)=>{const n=((await me(`/api/forum/posts/${encodeURIComponent(e)}/replies?limit=${Math.min(Math.max(t,1),500)}`,{auth:"optional"})).items||[]).filter(r=>!!r).filter(r=>!r.isDeleted).map(r=>({...r,author:r.author?{firstName:r.author.firstName||"",lastName:r.author.lastName||"",displayName:r.author.displayName}:void 0}));return n.sort((r,i)=>!r.createdAt&&!i.createdAt?0:r.createdAt?i.createdAt?new Date(r.createdAt).getTime()-new Date(i.createdAt).getTime():-1:1),n},vw=async()=>me("/api/forum/me",{auth:!0}),ww=async e=>{const o=new URLSearchParams().toString();return me(`/api/forum/vet/queue${o?`?${o}`:""}`,{auth:!0})},bw=async()=>me("/api/forum/me/vet-questions",{auth:!0}),Pw=(e,t="zh")=>{if(!e)return null;try{let o=e;o=e.replace(/(\.\d{3})\d+/,"$1");const n=new Date(o);if(isNaN(n.getTime())){const i=new Date(e);if(isNaN(i.getTime()))throw new Error("Invalid date");return tr(i,{addSuffix:!0,locale:t==="en"?Qo:or})}return tr(n,{addSuffix:!0,locale:t==="en"?Qo:or})}catch(o){return console.error("Error parsing timestamp:",e,o),null}},xw=async e=>{var n,r;if(!e.title||!e.content||!e.authorId)throw new Error("Title, content, and authorId are required");if(e.title.length<1||e.title.length>200)throw new Error("Title must be between 1 and 200 characters");if(e.content.length<1||e.content.length>1e4)throw new Error("Content must be between 1 and 10000 characters");if(e.tags&&e.tags.length>10)throw new Error("Maximum 10 tags allowed");let t=e.authorName;if(!e.isAnonymous&&!t&&e.authorId)try{const i=await Ra(e.authorId);if(i){const a=((n=i.firstName)==null?void 0:n.trim())||"",s=((r=i.lastName)==null?void 0:r.trim())||"";a&&s?t=`${a} ${s}`.trim():a?t=a:s&&(t=s)}}catch(i){console.warn("Could not fetch Client for authorName:",i)}const o=await me("/api/forum/posts",{method:"POST",auth:!0,body:{title:Lt(e.title).trim(),content:Lt(e.content).trim(),category:e.category||"DOG",tags:e.tags,attachments:e.attachments,location:e.location,isAnonymous:e.isAnonymous??!1,authorName:e.isAnonymous?void 0:t,asksVet:e.asksVet,visibility:e.visibility,acceptedVetDisclaimer:e.acceptedVetDisclaimer}});if(o.blocked||o.pendingReview)return{pendingReview:!0,filteredContentId:o.filteredContentId,moderationStatus:o.status,riskScore:o.riskScore,riskReasons:o.riskReasons,matchedTerms:o.matchedTerms};if(!o.post)throw new Error("Failed to create post");return o.post},Sw=async(e,t)=>{try{const{postVotes:o}=await Mt({postIds:[e]});return o[e]===1}catch(o){return console.error("Error checking if user liked post:",o),!1}},Tw=async(e,t,o,n,r)=>
933{const{postVotes:i}=await Mt({postIds:[e]}),a=i[e]!==1;await me(`/api/forum/posts/${encodeURIComponent(e)}/vote`,{method:"POST",auth:!0,body:{value:a?1:0}});const s=await Da(e);return{liked:a,newLikesCount:s.likes??0,newDislikesCount:s.dislikes??0}},Aw=async(e,t,o,n,r)=>{const{postVotes:i}=await Mt({postIds:[e]}),a=i[e]!==-1;await me(`/api/forum/posts/${encodeURIComponent(e)}/vote`,{method:"POST",auth:!0,body:{value:a?-1:0}});const s=await Da(e);return{disliked:a,newLikesCount:s.likes??0,newDislikesCount:s.dislikes??0}},Ew=async(e,t,o,n)=>{var s,d;const{replyVotes:r}=await Mt({replyIds:[e]}),i=r[e]!==1,a=await me(`/api/forum/replies/${encodeURIComponent(e)}/vote`,{method:"POST",auth:!0,body:{value:i?1:0}});return{liked:i,newLikesCount:((s=a.reply)==null?void 0:s.likes)??0,newDislikesCount:((d=a.reply)==null?void 0:d.dislikes)??0}},kw=async(e,t)=>{if(!e.content||e.content.trim()==="")throw new Error("Reply content is required");if(!e.postId)throw new Error("Post ID is required");if(!e.authorId)throw new Error("Author ID is required");if(await ka(t,t)!==e.authorId)throw new Error("Author ID must match authenticated user");const n=await me(`/api/forum/posts/${encodeURIComponent(e.postId)}/replies`,{method:"POST",auth:!0,body:{content:Lt(e.content).trim(),parentReplyId:e.parentReplyId||void 0,attachments:e.attachments}});if(n.blocked||n.pendingReview)return{pendingReview:!0,filteredContentId:n.filteredContentId,moderationStatus:n.status,riskScore:n.riskScore,riskReasons:n.riskReasons,matchedTerms:n.matchedTerms};const r=n.reply;if(!r)throw new Error("Failed to create reply");try{const i=await Ra(e.authorId);i&&(r.author={firstName:i.firstName,lastName:i.lastName})}catch(i){console.warn("Error fetching reply author:",i)}return r},Cw=async(e,t)=>{const o={likedPostIds:new Set,dislikedPostIds:new Set,likedReplyIds:new Set,dislikedReplyIds:new Set};try{const n=(t==null?void 0:t.postIds)||[],r=(t==null?void 0:t.replyIds)||[];if(!n.length&&!r.length)return o;const{postVotes:i,replyVotes:a}=await Mt({postIds:n,replyIds:r});for(const[s,d]of Object.entries(i))d===1&&o.likedPostIds.add(s),d===-1&&o.dislikedPostIds.add(s);for(const[s,d]of Object.entries(a))d===1&&o.likedReplyIds.add(s),d===-1&&o.dislikedReplyIds.add(s);return o}catch(n){return console.error("Error getting user interactions:",n),o}};var Ur;const Wa=typeof window<"u"&&((Ur=window.location)!=null&&Ur.origin)?window.location.origin:"http://localhost:5173",yo="petwell-auth-prod.auth.ap-southeast-1.amazoncognito.com",Xf="ap-southeast-1_vC1Zugxkg",vo="mm6ek73uv5ikh82iidgm0fv0j",Jf="ap-southeast-1:827a8b5e-155c-448e-a2e6-c9e75e98789d",La=["email","openid","profile"],Tn=`${Wa}/auth/callback/`,Oa=`${Wa}/`,Zf={Auth:{Cognito:{userPoolId:Xf,userPoolClientId:vo,identityPoolId:Jf,allowGuestAccess:!0,loginWith:{email:!0,oauth:{domain:yo,scopes:[...La],redirectSignIn:[Tn],redirectSignOut:[Oa],responseType:"code",providers:["Google","Apple"]}}}},API:{GraphQL:{endpoint:"https://zzqlfjlslncu7kjjqkdedp7uwu.appsync-api.ap-southeast-1.amazonaws.com/graphql",region:"ap-southeast-1",defaultAuthMode:"apiKey",apiKey:"da2-pq3dyfbcuncunjstmawmtz3req"}},Storage:{S3:{bucket:"petwellclientstoragee8eec-prod",region:"ap-southeast-1"}}},eg=e=>new Promise(t=>setTimeout(t,e)),An="petwell.oauth.state",En="petwell.oauth.verifier",kt=async(e,t=1)=>{var r,i,a,s,d;let o=null;const n={...e,options:{...e==null?void 0:e.options,authFlowType:((r=e==null?void 0:e.options)==null?void 0:r.authFlowType)==="USER_PASSWORD_AUTH"?"USER_SRP_AUTH":(i=e==null?void 0:e.options)==null?void 0:i.authFlowType}};for(let c=0;c<=t;c++)try{return await Gs(n)}catch(p){if(o=p,(((a=p.message)==null?void 0:a.includes("already signed in"))||((s=p.message)==null?void 0:s.includes("already authenticated"))||((d=p.message)==null?void 0:d.includes("User is already signed in"))||p.name==="UserAlreadySignedInException"||p.name==="UserAlreadyAuthenticatedException")&&c<t){try{await no({global:!0})}catch{try{await no()}catch{try{throw await vt(),p}catch{}}}await eg(500);continue}throw p}throw o},Fa=e=>{var r,i,a,s;const t=(r=e.name)==null?void 0:r.trim(),o=((i=e.given_name)==null?void 0:i.trim())||((a=t==null?void 0:t.split(" ")[0])==null?void 0:a.trim()),n=((s=e.family_name)==null?void 0:s.trim())||"";
933return{firstName:o,lastName:n,displayName:t||[o,n].filter(Boolean).join(" ")||void 0}},tg=e=>{var t,o;return{userId:e.userId,username:e.username,email:(t=e.username)!=null&&t.includes("@")?e.username.trim().toLowerCase():"",rawEmail:(o=e.username)!=null&&o.includes("@")?e.username.trim():"",isAdmin:!1}},_a=async()=>{var s;const e=await Qr.authTokenStore.loadTokens();if(!(e!=null&&e.accessToken))return null;const t=((s=e.idToken)==null?void 0:s.payload)??{},o=e.accessToken.payload??{},n=String(t.email||o.username||e.username||"").trim().toLowerCase(),r=String(t.name||t["cognito:username"]||o.username||e.username||n||"User").trim(),i=String(t.sub||o.sub||e.username||"").trim(),a={email:n||void 0,name:typeof t.name=="string"?t.name:void 0,given_name:typeof t.given_name=="string"?t.given_name:void 0,family_name:typeof t.family_name=="string"?t.family_name:void 0};return{userInfo:{userId:i,username:r,email:n,rawEmail:String(t.email||o.username||e.username||n||"").trim(),isAdmin:!1},attributes:a}},an=async(e,t)=>{try{if(!await Ea(e))return;await Ca(e,e,Fa(t))}catch(o){console.warn("Unable to ensure client profile for authenticated user:",o)}},og=async e=>!await nn(e),ng=({provider:e,state:t,codeChallenge:o})=>{const n=new URLSearchParams({redirect_uri:Tn,response_type:"code",client_id:vo,identity_provider:e,scope:La.join(" "),state:t,code_challenge:o,code_challenge_method:"S256"});return e==="Google"&&n.set("prompt","select_account consent"),`https://${yo}/oauth2/authorize?${n.toString()}`},rg=()=>{const e=new URLSearchParams({client_id:vo,logout_uri:Oa});return`https://${yo}/logout?${e.toString()}`},Ma=async e=>{const t=Ys(128),o=Qs(),n=t.value,r=t.toCodeChallenge();window.sessionStorage.setItem(An,o),window.sessionStorage.setItem(En,n),window.location.assign(ng({provider:e,state:o,codeChallenge:r}))},eo=()=>{typeof window>"u"||(window.sessionStorage.removeItem(An),window.sessionStorage.removeItem(En))},ja=async()=>{try{console.log("Signing out user"),await no(),eo(),console.log("User signed out successfully"),typeof window<"u"&&window.location.assign(rg())}catch(e){throw console.error("Error signing out user:",e),e}},ig=async()=>{await Ma("Google")},ag=async()=>{await Ma("SignInWithApple")},Ot=async()=>{var e,t;try{const o=await vt();try{const n=await Ks(),r=!1,i=(n.email||o.username||"").trim(),a=i.toLowerCase(),s=Fa(n);a&&await an(a,n);const d={userId:o.userId,username:s.displayName||o.username,email:a,rawEmail:i,isAdmin:r};return console.log("Current user info:",d),d}catch(n){if((e=n.message)!=null&&e.includes("revoked")||(t=n.message)!=null&&t.includes("expired")){console.warn("Token revoked or expired, signing out user");try{await ja()}catch(i){console.error("Error signing out:",i)}throw new Error("Session expired. Please log in again.")}const r=await _a();return r?(r.userInfo.email&&await an(r.userInfo.email,r.attributes),console.warn("Falling back to token-derived user info because attributes could not be loaded:",n),r.userInfo):(console.warn("Falling back to basic user info because attributes could not be loaded:",n),tg(o))}}catch(o){throw o.name==="UserUnAuthenticatedException"?new Error("User not authenticated"):(console.error("Error getting current user info:",o),o)}},Nw=async(e,t)=>{const o=typeof window<"u"?window.sessionStorage.getItem(An):null,n=typeof window<"u"?window.sessionStorage.getItem(En):null;if(!o||!n)throw new Error("Social login session expired. Please try again.");if(t!==o)throw eo(),new Error("Social login state mismatch. Please try again.");const r=new URLSearchParams({grant_type:"authorization_code",client_id:vo,code:e,redirect_uri:Tn,code_verifier:n}),i=await fetch(`https://${yo}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:r});if(!i.ok)throw eo(),new Error("Failed to exchange social login code for tokens.");const a=await i.json(),s=Wn(a.access_token),d=a.id_token?Wn(a.id_token):void 0,c=(s.payload.iat||0)*1e3,p=new Date().getTime(),m=c>0?c-p:0,g=String((d==null?void 0:d.payload["cognito:username"])||s.payload.username||(d==null?void 0:d.payload.email)||s.payload.sub||"");await Qr.tokenOrchestrator.setTokens({tokens:{accessToken:s,idToken:d,refreshToken:a.refresh_token,clockDrift:m,username:g}}),eo();const h=await _a(),y=(h==null?void 0:h.userInfo)??await Ot();h!=null&&h.userInfo.email&&await an(h.userInfo.email,h.attributes);const f=y.email?await og(y.email):!1;return{userInfo:y,requiresProfileCompletion:f}},Ha=u.createContext(void 0),sg=({children:e})=>
933{const[t,o]=u.useState(null),[n,r]=u.useState(!1),[i,a]=u.useState(null);return u.useEffect(()=>{const s=async()=>{var c;try{const p=await vt();console.log("[AuthContext] getCurrentUser success",p),o(!0);const m=await Ot();console.log("[AuthContext] resolved user info",m);const g=(m==null?void 0:m.rawEmail)||(m==null?void 0:m.email);let h=!1;if(g)try{h=!await nn(g)}catch(y){console.warn("[AuthContext] profile completeness check failed, keep user signed in",y)}o(!0),r(h),a(m)}catch(p){console.log("[AuthContext] syncAuthState failed",p),(c=p.message)!=null&&c.includes("Session expired")||p.name==="NotAuthorizedException"?(o(!1),r(!1),a(null),console.log("Session expired, user needs to log in again")):(o(!1),r(!1),a(null))}};return s(),Xs.listen("auth",({payload:c})=>{const p=c==null?void 0:c.event;if(console.log("[AuthContext] Hub auth event",p,c),p==="signedIn"||p==="tokenRefresh"){s();return}(p==="signedOut"||p==="tokenRefresh_failure"||p==="signInWithRedirect_failure")&&(o(!1),r(!1),a(null))})},[]),u.useEffect(()=>{(async()=>{var d;if(t===!0&&!i)try{const c=await Ot(),p=(c==null?void 0:c.rawEmail)||(c==null?void 0:c.email);let m=!0;if(p)try{m=await nn(p)}catch(g){console.warn("[AuthContext] refresh profile completeness check failed, keep session",g)}a(c),r(!m)}catch(c){console.error("Error refreshing user info:",c),((d=c.message)!=null&&d.includes("Session expired")||c.name==="NotAuthorizedException")&&(o(!1),r(!1),a(null))}})()},[t,i]),l.jsx(Ha.Provider,{value:{isAuthenticated:t,setIsAuthenticated:o,requiresProfileCompletion:n,setRequiresProfileCompletion:r,userInfo:i,setUserInfo:a},children:e})},lg=()=>{const e=u.useContext(Ha);if(e===void 0)throw new Error("useAuth must be used within an AuthProvider");return e},$a=u.createContext(void 0),cg=({children:e})=>{const[t,o]=u.useState(!1),[n,r]=u.useState("LANDING"),[i,a]=u.useState(""),s=u.useRef(null),d=(y="LANDING",f="")=>{r(y),a(f),o(!0)},c=()=>{o(!1)},p=y=>{r(y)},m=y=>{a(y)},g=u.useCallback(y=>{s.current=y},[]),h=u.useCallback(()=>{if(s.current){const y=s.current;s.current=null,y()}},[]);return l.jsx($a.Provider,{value:{isOpen:t,currentView:n,email:i,openPanel:d,closePanel:c,setView:p,setEmail:m,onAuthSuccess:g,triggerAuthSuccess:h},children:e})},dg=()=>{const e=u.useContext($a);if(e===void 0)throw new Error("useAuthPanel must be used within an AuthPanelProvider");return e},Ba=u.createContext(void 0),kr="petwell:wishlist:v1",ug=({children:e})=>{const[t,o]=u.useState([]);u.useEffect(()=>{try{const c=localStorage.getItem(kr);c&&o(JSON.parse(c))}catch{}},[]);const n=c=>{o(c);try{localStorage.setItem(kr,JSON.stringify(c))}catch{}},r=u.useCallback(c=>t.some(p=>p.productId===c),[t]),i=u.useCallback((c,p)=>{t.some(m=>m.productId===c)||n([...t,{productId:c,addedAt:new Date().toISOString(),priceAtAdd:p}])},[t]),a=u.useCallback(c=>{n(t.filter(p=>p.productId!==c))},[t]),s=u.useCallback((c,p)=>t.some(m=>m.productId===c)?(n(t.filter(m=>m.productId!==c)),!1):(n([...t,{productId:c,addedAt:new Date().toISOString(),priceAtAdd:p}]),!0),[t]),d=u.useCallback(()=>n([]),[]);return l.jsx(Ba.Provider,{value:{items:t,isInWishlist:r,add:i,remove:a,toggle:s,clear:d},children:e})},Rw=()=>{const e=u.useContext(Ba);if(!e)throw new Error("useWishlist must be used within WishlistProvider");return e},Lo=4,Cr="petwell:compare:v1",Va=u.createContext(void 0),pg=({children:e})=>{const[t,o]=u.useState([]);u.useEffect(()=>{try{const d=localStorage.getItem(Cr);d&&o(JSON.parse(d))}catch{}},[]);const n=d=>{o(d);try{localStorage.setItem(Cr,JSON.stringify(d))}catch{}},r=u.useCallback(d=>t.includes(d),[t]),i=u.useCallback(d=>t.includes(d)?(n(t.filter(c=>c!==d)),{ok:!0}):t.length>=Lo?{ok:!1,reason:`最多只可同時比較 ${Lo} 件產品`}:(n([...t,d]),{ok:!0}),[t]),a=u.useCallback(d=>{n(t.filter(c=>c!==d))},[t]),s=u.useCallback(()=>n([]),[]);return l.jsx(Va.Provider,{value:{ids:t,isSelected:r,toggle:i,remove:a,clear:s,max:Lo},children:e})},Iw=()=>{const e=u.useContext(Va);if(!e)throw new Error("useCompare must be used within CompareProvider");return e},hg=pn("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10"}},defaultVariants:{variant:"default",size:"default"}}),le=u.forwardRef(({className:e,variant:t,size:o,asChild:n=!1,...r},i)=>{const a=n?ml:"button";return l.jsx(a,{className:ce(hg({variant:t,size:o,className:e})),ref:i,...r})});le.displayName="Button";const Ee=u.forwardRef(({className:e,type:t,...o},n)=>l.jsx("input",{type:t,className:ce("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",e),ref:n,...o}));
vendor: 4,197 bytes, line 933
933Ee.displayName="Input";var mg="Label",Ua=u.forwardRef((e,t)=>l.jsx(ae.label,{...e,ref:t,onMouseDown:o=>{var r;o.target.closest("button, input, select, textarea")||((r=e.onMouseDown)==null||r.call(e,o),!o.defaultPrevented&&o.detail>1&&o.preventDefault())}}));Ua.displayName=mg;var qa=Ua;const fg=pn("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),ke=u.forwardRef(({className:e,...t},o)=>l.jsx(qa,{ref:o,className:ce(fg(),e),...t}));ke.displayName=qa.displayName;var Oo="focusScope.autoFocusOnMount",Fo="focusScope.autoFocusOnUnmount",Nr={bubbles:!1,cancelable:!0},gg="FocusScope",za=u.forwardRef((e,t)=>{const{loop:o=!1,trapped:n=!1,onMountAutoFocus:r,onUnmountAutoFocus:i,...a}=e,[s,d]=u.useState(null),c=We(r),p=We(i),m=u.useRef(null),g=ue(t,f=>d(f)),h=u.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;u.useEffect(()=>{if(n){let f=function(b){if(h.paused||!s)return;const T=b.target;s.contains(T)?m.current=T:Ye(m.current,{select:!0})},v=function(b){if(h.paused||!s)return;const T=b.relatedTarget;T!==null&&(s.contains(T)||Ye(m.current,{select:!0}))},w=function(b){if(document.activeElement===document.body)for(const k of b)k.removedNodes.length>0&&Ye(s)};document.addEventListener("focusin",f),document.addEventListener("focusout",v);const x=new MutationObserver(w);return s&&x.observe(s,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",f),document.removeEventListener("focusout",v),x.disconnect()}}},[n,s,h.paused]),u.useEffect(()=>{if(s){Ir.add(h);const f=document.activeElement;if(!s.contains(f)){const w=new CustomEvent(Oo,Nr);s.addEventListener(Oo,c),s.dispatchEvent(w),w.defaultPrevented||(yg(xg(Ka(s)),{select:!0}),document.activeElement===f&&Ye(s))}return()=>{s.removeEventListener(Oo,c),setTimeout(()=>{const w=new CustomEvent(Fo,Nr);s.addEventListener(Fo,p),s.dispatchEvent(w),w.defaultPrevented||Ye(f??document.body,{select:!0}),s.removeEventListener(Fo,p),Ir.remove(h)},0)}}},[s,c,p,h]);const y=u.useCallback(f=>{if(!o&&!n||h.paused)return;const v=f.key==="Tab"&&!f.altKey&&!f.ctrlKey&&!f.metaKey,w=document.activeElement;if(v&&w){const x=f.currentTarget,[b,T]=vg(x);b&&T?!f.shiftKey&&w===T?(f.preventDefault(),o&&Ye(b,{select:!0})):f.shiftKey&&w===b&&(f.preventDefault(),o&&Ye(T,{select:!0})):w===x&&f.preventDefault()}},[o,n,h.paused]);return l.jsx(ae.div,{tabIndex:-1,...a,ref:g,onKeyDown:y})});za.displayName=gg;function yg(e,{select:t=!1}={}){const o=document.activeElement;for(const n of e)if(Ye(n,{select:t}),document.activeElement!==o)return}function vg(e){const t=Ka(e),o=Rr(t,e),n=Rr(t.reverse(),e);return[o,n]}function Ka(e){const t=[],o=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const r=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||r?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;o.nextNode();)t.push(o.currentNode);return t}function Rr(e,t){for(const o of e)if(!wg(o,{upTo:t}))return o}function wg(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t!==void 0&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1}function bg(e){return e instanceof HTMLInputElement&&"select"in e}function Ye(e,{select:t=!1}={}){if(e&&e.focus){const o=document.activeElement;e.focus({preventScroll:!0}),e!==o&&bg(e)&&t&&e.select()}}var Ir=Pg();function Pg(){let e=[];return{add(t){const o=e[0];t!==o&&(o==null||o.pause()),e=Dr(e,t),e.unshift(t)},remove(t){var o;e=Dr(e,t),(o=e[0])==null||o.resume()}}}function Dr(e,t){const o=[...e],n=o.indexOf(t);return n!==-1&&o.splice(n,1),o}function xg(e){return e.filter(t=>t.tagName!=="A")}var _o=0;function Sg(){u.useEffect(()=>{const e=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",e[0]??Wr()),document.body.insertAdjacentElement("beforeend",e[1]??Wr()),_o++,()=>{_o===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(t=>t.remove()),_o--}},[])}function Wr(){const e=document.createElement("span");return e.setAttribute("data-radix-focus-guard",""),e.tabIndex=0,e.style.outline="none",e.style.opacity="0",e.
vendor: 4,904 bytes, lines 933-948
933style.position="fixed",e.style.pointerEvents="none",e}var to="right-scroll-bar-position",oo="width-before-scroll-bar",Tg="with-scroll-bars-hidden",Ag="--removed-body-scroll-bar-size";function Mo(e,t){return typeof e=="function"?e(t):e&&(e.current=t),e}function Eg(e,t){var o=u.useState(function(){return{value:e,callback:t,facade:{get current(){return o.value},set current(n){var r=o.value;r!==n&&(o.value=n,o.callback(n,r))}}}})[0];return o.callback=t,o.facade}var kg=typeof window<"u"?u.useLayoutEffect:u.useEffect,Lr=new WeakMap;function Cg(e,t){var o=Eg(null,function(n){return e.forEach(function(r){return Mo(r,n)})});return kg(function(){var n=Lr.get(o);if(n){var r=new Set(n),i=new Set(e),a=o.current;r.forEach(function(s){i.has(s)||Mo(s,null)}),i.forEach(function(s){r.has(s)||Mo(s,a)})}Lr.set(o,e)},[e]),o}function Ng(e){return e}function Rg(e,t){t===void 0&&(t=Ng);var o=[],n=!1,r={read:function(){if(n)throw new Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.");return o.length?o[o.length-1]:e},useMedium:function(i){var a=t(i,n);return o.push(a),function(){o=o.filter(function(s){return s!==a})}},assignSyncMedium:function(i){for(n=!0;o.length;){var a=o;o=[],a.forEach(i)}o={push:function(s){return i(s)},filter:function(){return o}}},assignMedium:function(i){n=!0;var a=[];if(o.length){var s=o;o=[],s.forEach(i),a=o}var d=function(){var p=a;a=[],p.forEach(i)},c=function(){return Promise.resolve().then(d)};c(),o={push:function(p){a.push(p),c()},filter:function(p){return a=a.filter(p),o}}}};return r}function Ig(e){e===void 0&&(e={});var t=Rg(null);return t.options=Qe({async:!0,ssr:!1},e),t}var Ga=function(e){var t=e.sideCar,o=Xr(e,["sideCar"]);if(!t)throw new Error("Sidecar: please provide `sideCar` property to import the right car");var n=t.read();if(!n)throw new Error("Sidecar medium not found");return u.createElement(n,Qe({},o))};Ga.isSideCarExport=!0;function Dg(e,t){return e.useMedium(t),Ga}var Ya=Ig(),jo=function(){},wo=u.forwardRef(function(e,t){var o=u.useRef(null),n=u.useState({onScrollCapture:jo,onWheelCapture:jo,onTouchMoveCapture:jo}),r=n[0],i=n[1],a=e.forwardProps,s=e.children,d=e.className,c=e.removeScrollBar,p=e.enabled,m=e.shards,g=e.sideCar,h=e.noRelative,y=e.noIsolation,f=e.inert,v=e.allowPinchZoom,w=e.as,x=w===void 0?"div":w,b=e.gapMode,T=Xr(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noRelative","noIsolation","inert","allowPinchZoom","as","gapMode"]),k=g,S=Cg([o,t]),C=Qe(Qe({},T),r);return u.createElement(u.Fragment,null,p&&u.createElement(k,{sideCar:Ya,removeScrollBar:c,shards:m,noRelative:h,noIsolation:y,inert:f,setCallbacks:i,allowPinchZoom:!!v,lockRef:o,gapMode:b}),a?u.cloneElement(u.Children.only(s),Qe(Qe({},C),{ref:S})):u.createElement(x,Qe({},C,{className:d,ref:S}),s))});wo.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};wo.classNames={fullWidth:oo,zeroRight:to};var Wg=function(){if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function Lg(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var t=Wg();return t&&e.setAttribute("nonce",t),e}function Og(e,t){e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}function Fg(e){var t=document.head||document.getElementsByTagName("head")[0];t.appendChild(e)}var _g=function(){var e=0,t=null;return{add:function(o){e==0&&(t=Lg())&&(Og(t,o),Fg(t)),e++},remove:function(){e--,!e&&t&&(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},Mg=function(){var e=_g();return function(t,o){u.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&o])}},Qa=function(){var e=Mg(),t=function(o){var n=o.styles,r=o.dynamic;return e(n,r),null};return t},jg={left:0,top:0,right:0,gap:0},Ho=function(e){return parseInt(e||"",10)||0},Hg=function(e){var t=window.getComputedStyle(document.body),o=t[e==="padding"?"paddingLeft":"marginLeft"],n=t[e==="padding"?"paddingTop":"marginTop"],r=t[e==="padding"?"paddingRight":"marginRight"];return[Ho(o),Ho(n),Ho(r)]},$g=function(e){if(e===void 0&&(e="margin"),typeof window>"u")return jg;var t=Hg(e),o=document.documentElement.clientWidth,n=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,n-o+t[2]-t[0])}},Bg=Qa(),gt="data-scroll-locked",Vg=function(e,t,o,n){var r=e.left,i=e.top,a=e.right,s=e.gap;return o===void 0&&(o="margin"),`
934  .`.concat(Tg,` {
935   overflow: hidden `).concat(n,`;
936   padding-right: `).concat(s,"px ").concat(n,`;
937  }
938  body[`).concat(gt,`] {
939    overflow: hidden `).concat(n,`;
940    overscroll-behavior: contain;
941    `).concat([t&&"position: relative ".concat(n,";"),o==="margin"&&`
942    padding-left: `.concat(r,`px;
943    padding-top: `).concat(i,`px;
944    padding-right: `).concat(a,`px;
945    margin-left:0;
946    margin-top:0;
947    margin-right: `).concat(s,"px ").concat(n,`;
948    `),o==="padding"&&"padding-right: ".concat(s,"px ").concat(n,";
948")].filter(Boolean).join(""),`
949  }
950  
951  .`).concat(to,` {
952    right: `).concat(s,"px ").concat(n,`;
953  }
954  
955  .`).concat(oo,` {
956    margin-right: `).concat(s,"px ").concat(n,`;
957  }
958  
959  .`).concat(to," .").concat(to,` {
960    right: 0 `).concat(n,`;
961  }
962  
963  .`).concat(oo," .").concat(oo,` {
964    margin-right: 0 `).concat(n,`;
965  }
966  
967  body[`).concat(gt,`] {
968    `).concat(Ag,": ").concat(s,`px;
969  }
970`)},Or=function(){var e=parseInt(document.body.getAttribute(gt)||"0",10);return isFinite(e)?e:0},Ug=function(){u.useEffect(function(){return document.body.setAttribute(gt,(Or()+1).toString()),function(){var e=Or()-1;e<=0?document.body.removeAttribute(gt):document.body.setAttribute(gt,e.toString())}},[])},qg=function(e){var t=e.noRelative,o=e.noImportant,n=e.gapMode,r=n===void 0?"margin":n;Ug();var i=u.useMemo(function(){return $g(r)},[r]);return u.createElement(Bg,{styles:Vg(i,!t,r,o?"":"!important")})},sn=!1;if(typeof window<"u")try{var Kt=Object.defineProperty({},"passive",{get:function(){return sn=!0,!0}});window.addEventListener("test",Kt,Kt),window.removeEventListener("test",Kt,Kt)}catch{sn=!1}var ut=sn?{passive:!1}:!1,zg=function(e){return e.tagName==="TEXTAREA"},Xa=function(e,t){if(!(e instanceof Element))return!1;var o=window.getComputedStyle(e);return o[t]!=="hidden"&&!(o.overflowY===o.overflowX&&!zg(e)&&o[t]==="visible")},Kg=function(e){return Xa(e,"overflowY")},Gg=function(e){return Xa(e,"overflowX")},Fr=function(e,t){var o=t.ownerDocument,n=t;do{typeof ShadowRoot<"u"&&n instanceof ShadowRoot&&(n=n.host);var r=Ja(e,n);if(r){var i=Za(e,n),a=i[1],s=i[2];if(a>s)return!0}n=n.parentNode}while(n&&n!==o.body);return!1},Yg=function(e){var t=e.scrollTop,o=e.scrollHeight,n=e.clientHeight;return[t,o,n]},Qg=function(e){var t=e.scrollLeft,o=e.scrollWidth,n=e.clientWidth;return[t,o,n]},Ja=function(e,t){return e==="v"?Kg(t):Gg(t)},Za=function(e,t){return e==="v"?Yg(t):Qg(t)},Xg=function(e,t){return e==="h"&&t==="rtl"?-1:1},Jg=function(e,t,o,n,r){var i=Xg(e,window.getComputedStyle(t).direction),a=i*n,s=o.target,d=t.contains(s),c=!1,p=a>0,m=0,g=0;do{if(!s)break;var h=Za(e,s),y=h[0],f=h[1],v=h[2],w=f-v-i*y;(y||w)&&Ja(e,s)&&(m+=w,g+=y);var x=s.parentNode;s=x&&x.nodeType===Node.DOCUMENT_FRAGMENT_NODE?x.host:x}while(!d&&s!==document.body||d&&(t.contains(s)||t===s));return(p&&(Math.abs(m)<1||!r)||!p&&(Math.abs(g)<1||!r))&&(c=!0),c},Gt=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},_r=function(e){return[e.deltaX,e.deltaY]},Mr=function(e){return e&&"current"in e?e.current:e},Zg=function(e,t){return e[0]===t[0]&&e[1]===t[1]},ey=function(e){return`
971  .block-interactivity-`.concat(e,` {pointer-events: none;}
972  .allow-interactivity-`).concat(e,` {pointer-events: all;}
973`)},ty=0,pt=[];function oy(e){var t=u.useRef([]),o=u.useRef([0,0]),n=u.useRef(),r=u.useState(ty++)[0],i=u.useState(Qa)[0],a=u.useRef(e);u.useEffect(function(){a.current=e},[e]),u.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(r));var f=Js([e.lockRef.current],(e.shards||[]).map(Mr),!0).filter(Boolean);return f.forEach(function(v){return v.classList.add("allow-interactivity-".concat(r))}),function(){document.body.classList.remove("block-interactivity-".concat(r)),f.forEach(function(v){return v.classList.remove("allow-interactivity-".concat(r))})}}},[e.inert,e.lockRef.current,e.shards]);var s=u.useCallback(function(f,v){if("touches"in f&&f.touches.length===2||f.type==="wheel"&&f.ctrlKey)return!a.current.allowPinchZoom;var w=Gt(f),x=o.current,b="deltaX"in f?f.deltaX:x[0]-w[0],T="deltaY"in f?f.deltaY:x[1]-w[1],k,S=f.target,C=Math.abs(b)>Math.abs(T)?"h":"v";if("touches"in f&&C==="h"&&S.type==="range")return!1;var L=Fr(C,S);if(!L)return!0;if(L?k=C:(k=C==="v"?"h":"v",L=Fr(C,S)),!L)return!1;if(!n.current&&"changedTouches"in f&&(b||T)&&(n.current=k),!k)return!0;var O=n.current||k;return Jg(O,v,f,O==="h"?b:T,!0)},[]),d=u.useCallback(function(f){var v=f;if(!(!pt.length||pt[pt.length-1]!==i)){var w="deltaY"in v?_r(v):Gt(v),x=t.current.filter(function(k){return k.name===v.type&&(k.target===v.target||v.target===k.shadowParent)&&Zg(k.delta,w)})[0];if(x&&x.should){v.cancelable&&v.preventDefault();return}
vendor: 4,333 bytes, line 973
973if(!x){var b=(a.current.shards||[]).map(Mr).filter(Boolean).filter(function(k){return k.contains(v.target)}),T=b.length>0?s(v,b[0]):!a.current.noIsolation;T&&v.cancelable&&v.preventDefault()}}},[]),c=u.useCallback(function(f,v,w,x){var b={name:f,delta:v,target:w,should:x,shadowParent:ny(w)};t.current.push(b),setTimeout(function(){t.current=t.current.filter(function(T){return T!==b})},1)},[]),p=u.useCallback(function(f){o.current=Gt(f),n.current=void 0},[]),m=u.useCallback(function(f){c(f.type,_r(f),f.target,s(f,e.lockRef.current))},[]),g=u.useCallback(function(f){c(f.type,Gt(f),f.target,s(f,e.lockRef.current))},[]);u.useEffect(function(){return pt.push(i),e.setCallbacks({onScrollCapture:m,onWheelCapture:m,onTouchMoveCapture:g}),document.addEventListener("wheel",d,ut),document.addEventListener("touchmove",d,ut),document.addEventListener("touchstart",p,ut),function(){pt=pt.filter(function(f){return f!==i}),document.removeEventListener("wheel",d,ut),document.removeEventListener("touchmove",d,ut),document.removeEventListener("touchstart",p,ut)}},[]);var h=e.removeScrollBar,y=e.inert;return u.createElement(u.Fragment,null,y?u.createElement(i,{styles:ey(r)}):null,h?u.createElement(qg,{noRelative:e.noRelative,gapMode:e.gapMode}):null)}function ny(e){for(var t=null;e!==null;)e instanceof ShadowRoot&&(t=e.host,e=e.host),e=e.parentNode;return t}const ry=Dg(Ya,oy);var es=u.forwardRef(function(e,t){return u.createElement(wo,Qe({},e,{ref:t,sideCar:ry}))});es.classNames=wo.classNames;var iy=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},ht=new WeakMap,Yt=new WeakMap,Qt={},$o=0,ts=function(e){return e&&(e.host||ts(e.parentNode))},ay=function(e,t){return t.map(function(o){if(e.contains(o))return o;var n=ts(o);return n&&e.contains(n)?n:(console.error("aria-hidden",o,"in not contained inside",e,". Doing nothing"),null)}).filter(function(o){return!!o})},sy=function(e,t,o,n){var r=ay(t,Array.isArray(e)?e:[e]);Qt[o]||(Qt[o]=new WeakMap);var i=Qt[o],a=[],s=new Set,d=new Set(r),c=function(m){!m||s.has(m)||(s.add(m),c(m.parentNode))};r.forEach(c);var p=function(m){!m||d.has(m)||Array.prototype.forEach.call(m.children,function(g){if(s.has(g))p(g);else try{var h=g.getAttribute(n),y=h!==null&&h!=="false",f=(ht.get(g)||0)+1,v=(i.get(g)||0)+1;ht.set(g,f),i.set(g,v),a.push(g),f===1&&y&&Yt.set(g,!0),v===1&&g.setAttribute(o,"true"),y||g.setAttribute(n,"true")}catch(w){console.error("aria-hidden: cannot operate on ",g,w)}})};return p(t),s.clear(),$o++,function(){a.forEach(function(m){var g=ht.get(m)-1,h=i.get(m)-1;ht.set(m,g),i.set(m,h),g||(Yt.has(m)||m.removeAttribute(n),Yt.delete(m)),h||m.removeAttribute(o)}),$o--,$o||(ht=new WeakMap,ht=new WeakMap,Yt=new WeakMap,Qt={})}},ly=function(e,t,o){o===void 0&&(o="data-aria-hidden");var n=Array.from(Array.isArray(e)?e:[e]),r=iy(e);return r?(n.push.apply(n,Array.from(r.querySelectorAll("[aria-live]"))),sy(n,r,o,"aria-hidden")):function(){return null}},bo="Dialog",[os,Dw]=Ft(bo),[cy,Ce]=os(bo),ns=e=>{const{__scopeDialog:t,children:o,open:n,defaultOpen:r,onOpenChange:i,modal:a=!0}=e,s=u.useRef(null),d=u.useRef(null),[c,p]=ri({prop:n,defaultProp:r??!1,onChange:i,caller:bo});return l.jsx(cy,{scope:t,triggerRef:s,contentRef:d,contentId:No(),titleId:No(),descriptionId:No(),open:c,onOpenChange:p,onOpenToggle:u.useCallback(()=>p(m=>!m),[p]),modal:a,children:o})};ns.displayName=bo;var rs="DialogTrigger",is=u.forwardRef((e,t)=>{const{__scopeDialog:o,...n}=e,r=Ce(rs,o),i=ue(t,r.triggerRef);return l.jsx(ae.button,{type:"button","aria-haspopup":"dialog","aria-expanded":r.open,"aria-controls":r.contentId,"data-state":Nn(r.open),...n,ref:i,onClick:oe(e.onClick,r.onOpenToggle)})});is.displayName=rs;var kn="DialogPortal",[dy,as]=os(kn,{forceMount:void 0}),ss=e=>{const{__scopeDialog:t,forceMount:o,children:n,container:r}=e,i=Ce(kn,t);return l.jsx(dy,{scope:t,forceMount:o,children:u.Children.map(n,a=>l.jsx(wt,{present:o||i.open,children:l.jsx(ln,{asChild:!0,container:r,children:a})}))})};ss.displayName=kn;var co="DialogOverlay",ls=u.forwardRef((e,t)=>{const o=as(co,e.__scopeDialog),{forceMount:n=o.forceMount,...r}=e,i=Ce(co,e.__scopeDialog);return i.modal?l.jsx(wt,{present:n||i.open,children:l.jsx(py,{...r,ref:t})}):null});ls.displayName=co;var uy=It("DialogOverlay.RemoveScroll"),py=u.forwardRef((e,t)=>
vendor: 4,634 bytes, lines 973-977
973{const{__scopeDialog:o,...n}=e,r=Ce(co,o);return l.jsx(es,{as:uy,allowPinchZoom:!0,shards:[r.contentRef],children:l.jsx(ae.div,{"data-state":Nn(r.open),...n,ref:t,style:{pointerEvents:"auto",...n.style}})})}),nt="DialogContent",cs=u.forwardRef((e,t)=>{const o=as(nt,e.__scopeDialog),{forceMount:n=o.forceMount,...r}=e,i=Ce(nt,e.__scopeDialog);return l.jsx(wt,{present:n||i.open,children:i.modal?l.jsx(hy,{...r,ref:t}):l.jsx(my,{...r,ref:t})})});cs.displayName=nt;var hy=u.forwardRef((e,t)=>{const o=Ce(nt,e.__scopeDialog),n=u.useRef(null),r=ue(t,o.contentRef,n);return u.useEffect(()=>{const i=n.current;if(i)return ly(i)},[]),l.jsx(ds,{...e,ref:r,trapFocus:o.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:oe(e.onCloseAutoFocus,i=>{var a;i.preventDefault(),(a=o.triggerRef.current)==null||a.focus()}),onPointerDownOutside:oe(e.onPointerDownOutside,i=>{const a=i.detail.originalEvent,s=a.button===0&&a.ctrlKey===!0;(a.button===2||s)&&i.preventDefault()}),onFocusOutside:oe(e.onFocusOutside,i=>i.preventDefault())})}),my=u.forwardRef((e,t)=>{const o=Ce(nt,e.__scopeDialog),n=u.useRef(!1),r=u.useRef(!1);return l.jsx(ds,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:i=>{var a,s;(a=e.onCloseAutoFocus)==null||a.call(e,i),i.defaultPrevented||(n.current||(s=o.triggerRef.current)==null||s.focus(),i.preventDefault()),n.current=!1,r.current=!1},onInteractOutside:i=>{var d,c;(d=e.onInteractOutside)==null||d.call(e,i),i.defaultPrevented||(n.current=!0,i.detail.originalEvent.type==="pointerdown"&&(r.current=!0));const a=i.target;((c=o.triggerRef.current)==null?void 0:c.contains(a))&&i.preventDefault(),i.detail.originalEvent.type==="focusin"&&r.current&&i.preventDefault()}})}),ds=u.forwardRef((e,t)=>{const{__scopeDialog:o,trapFocus:n,onOpenAutoFocus:r,onCloseAutoFocus:i,...a}=e,s=Ce(nt,o),d=u.useRef(null),c=ue(t,d);return Sg(),l.jsxs(l.Fragment,{children:[l.jsx(za,{asChild:!0,loop:!0,trapped:n,onMountAutoFocus:r,onUnmountAutoFocus:i,children:l.jsx(uo,{role:"dialog",id:s.contentId,"aria-describedby":s.descriptionId,"aria-labelledby":s.titleId,"data-state":Nn(s.open),...a,ref:c,onDismiss:()=>s.onOpenChange(!1)})}),l.jsxs(l.Fragment,{children:[l.jsx(fy,{titleId:s.titleId}),l.jsx(yy,{contentRef:d,descriptionId:s.descriptionId})]})]})}),Cn="DialogTitle",us=u.forwardRef((e,t)=>{const{__scopeDialog:o,...n}=e,r=Ce(Cn,o);return l.jsx(ae.h2,{id:r.titleId,...n,ref:t})});us.displayName=Cn;var ps="DialogDescription",hs=u.forwardRef((e,t)=>{const{__scopeDialog:o,...n}=e,r=Ce(ps,o);return l.jsx(ae.p,{id:r.descriptionId,...n,ref:t})});hs.displayName=ps;var ms="DialogClose",fs=u.forwardRef((e,t)=>{const{__scopeDialog:o,...n}=e,r=Ce(ms,o);return l.jsx(ae.button,{type:"button",...n,ref:t,onClick:oe(e.onClick,()=>r.onOpenChange(!1))})});fs.displayName=ms;function Nn(e){return e?"open":"closed"}var gs="DialogTitleWarning",[Ww,ys]=pl(gs,{contentName:nt,titleName:Cn,docsSlug:"dialog"}),fy=({titleId:e})=>{const t=ys(gs),o=`\`${t.contentName}\` requires a \`${t.titleName}\` for the component to be accessible for screen reader users.
974
975If you want to hide the \`${t.titleName}\`, you can wrap it with our VisuallyHidden component.
976
977For more information, see https://radix-ui.com/primitives/docs/components/${t.docsSlug}`;return u.useEffect(()=>{e&&(document.getElementById(e)||console.error(o))},[o,e]),null},gy="DialogDescriptionWarning",yy=({contentRef:e,descriptionId:t})=>{const n=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${ys(gy).contentName}}.`;return u.useEffect(()=>{var i;const r=(i=e.current)==null?void 0:i.getAttribute("aria-describedby");t&&r&&(document.getElementById(t)||console.warn(n))},[n,e,t]),null},vy=ns,Lw=is,wy=ss,vs=ls,ws=cs,bs=us,Ps=hs,by=fs;const Py=vy,xy=wy,xs=u.forwardRef(({className:e,...t},o)=>l.jsx(vs,{ref:o,className:ce("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",e),...t}));xs.displayName=vs.displayName;const Ss=u.forwardRef(({className:e,children:t,...o},n)=>l.jsxs(xy,{children:[l.jsx(xs,{}),l.jsxs(ws,{ref:n,className:ce("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rou
977nded-lg",e),...o,children:[t,l.jsxs(by,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-accent data-[state=open]:text-muted-foreground hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none",children:[l.jsx(ki,{className:"h-4 w-4"}),l.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));Ss.displayName=ws.displayName;const Ts=({className:e,...t})=>l.jsx("div",{className:ce("flex flex-col space-y-1.5 text-center sm:text-left",e),...t});Ts.displayName="DialogHeader";const Sy=({className:e,...t})=>l.jsx("div",{className:ce("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",e),...t});Sy.displayName="DialogFooter";const As=u.forwardRef(({className:e,...t},o)=>l.jsx(bs,{ref:o,className:ce("text-lg font-semibold leading-none tracking-tight",e),...t}));As.displayName=bs.displayName;const Es=u.forwardRef(({className:e,...t},o)=>l.jsx(Ps,{ref:o,className:ce("text-sm text-muted-foreground",e),...t}));Es.displayName=Ps.displayName;const Ty="https://k4vkypglgsndbrrvq4cgtl7ame0bntdu.lambda-url.ap-southeast-1.on.aws/";async function Ay(){var o,n;const e=await Yr(),t=(n=(o=e==null?void 0:e.tokens)==null?void 0:o.idToken)==null?void 0:n.toString();if(!t)throw new Error("Not authenticated");return t}async function Rn(e,t=!1){const o={"Content-Type":"application/json"};t&&(o.Authorization=`Bearer ${await Ay()}`);const r=await(await fetch(Ty,{method:"POST",headers:o,body:JSON.stringify(e)})).json();if(r.error)throw new Error(r.error);return r}async function Ct(e){return Rn({action:"check_auth_methods",email:e.trim().toLowerCase()})}async function Ow({email:e,password:t,provider:o="Google"}){return Rn({action:"link_provider",email:e.trim().toLowerCase(),password:t,provider:o},!0)}async function Fw(e){return Rn({action:"set_password",newPassword:e},!0)}async function _w(e,t={}){const o=await Ct(e);if(!o.exists)return{summary:o,canSetPassword:!1,needsAccountLink:!1,linkProvider:null};const n=String(t.currentSub||"").trim(),r=String(o.nativeSub||"").trim(),i=Array.isArray(o.federatedSubs)?o.federatedSubs:[],a=!!(n&&r&&n!==r&&(i.includes(n)||o.needsLinking)),s=!!(r&&n&&n!==r&&(a||o.needsLinking||o.canResetPassword)),d=!s&&!!(o.federatedOnly||o.socialProviders.length>0&&!o.canResetPassword);let c=null;return s&&(o.socialProviders.includes("Google")?c="Google":o.socialProviders.includes("SignInWithApple")?c="SignInWithApple":c="Google"),{summary:o,canSetPassword:d,needsAccountLink:s,linkProvider:c}}function Ey(e,t){return e.socialProviders.includes("Google")&&e.socialProviders.includes("SignInWithApple")?t("authLinking.federatedOnlyBoth"):e.socialProviders.includes("Apple")||e.socialProviders.includes("SignInWithApple")?t("authLinking.federatedOnlyApple"):e.socialProviders.includes("Google")?t("authLinking.federatedOnlyGoogle"):t("authLinking.socialOnlyGeneric")}function Bo(e,t){return e.socialProviders.includes("Google")&&e.socialProviders.includes("SignInWithApple")?t("authLinking.socialOnlyBoth"):e.socialProviders.includes("Apple")||e.socialProviders.includes("SignInWithApple")?t("authLinking.socialOnlyApple"):e.socialProviders.includes("Google")?t("authLinking.socialOnlyGoogle"):t("authLinking.socialOnlyGeneric")}function jr(e){return!!(e.federatedOnly||e.socialProviders.length>0&&!e.canResetPassword)}const ky="/assets/logo-ByOm-oSd.png",Cy=()=>{const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*";let t="";for(let o=0;o<16;o++)t+=e.charAt(Math.floor(Math.random()*e.length));return"Aa1!"+t},Hr={firstName:"",lastName:"",phone:"",password:"",confirmPassword:""},Ny="petwell.social.redirect",Ry=()=>l.jsxs("svg",{viewBox:"0 0 24 24",className:"h-4 w-4","aria-hidden":"true",children:[l.jsx("path",{fill:"#4285F4",d:"M21.64 12.2c0-.64-.06-1.25-.16-1.84H12v3.48h5.41a4.63 4.63 0 0 1-2.01 3.04v2.52h3.24c1.89-1.74 3-4.3 3-7.2Z"}),l.jsx("path",{fill:"#34A853",d:"M12 22c2.7 0 4.96-.9 6.61-2.44l-3.24-2.52c-.9.6-2.04.96-3.37.96-2.59 0-4.77-1.75-5.56-4.1H3.09v2.58A9.99 9.99 0 0 0 12 22Z"}),l.jsx("path",{fill:"#FBBC05",d:"M6.44 13.9A5.98 5.98 0 0 1 6.13 
97712c0-.66.11-1.3.31-1.9V7.52H3.09A9.99 9.99 0 0 0 2 12c0 1.61.39 3.13 1.09 4.48l3.35-2.58Z"}),l.jsx("path",{fill:"#EA4335",d:"M12 5.98c1.47 0 2.78.5 3.82 1.48l2.86-2.86C16.95 2.98 14.69 2 12 2A9.99 9.99 0 0 0 3.09 7.52l3.35 2.58c.79-2.35 2.97-4.12 5.56-4.12Z"})]}),Iy=()=>{const{t:e}=Rh(),{isAuthenticated:t,requiresProfileCompletion:o,setIsAuthenticated:n,setRequiresProfileCompletion:r,setUserInfo:i,userInfo:a}=lg(),{isOpen:s,currentView:d,email:c,closePanel:p,openPanel:m,setView:g,setEmail:h,triggerAuthSuccess:y}=dg(),f=d,v=f==="PROFILE"&&o,[w,x]=u.useState(c),[b,T]=u.useState(!1),[k,S]=u.useState(null),[C,L]=u.useState(null),[O,F]=u.useState(!1),[q,W]=u.useState(60),[z,N]=u.useState(""),[Q,V]=u.useState(""),[U,Y]=u.useState(""),[I,J]=u.useState(""),[j,_]=u.useState(null),[D,K]=u.useState(Hr),[re,de]=u.useState(!1),X=u.useRef("");u.useEffect(()=>{s&&x(c)},[s,c]);const He=P=>{x(P),h(P),S(null)};u.useEffect(()=>{s&&(S(null),N(""),V(""),Y(""),J(""),L(null),F(!1),W(60),_(null),K(Hr),de(!1),X.current="")},[s]),u.useEffect(()=>{t&&o&&(a!=null&&a.email)&&!s&&m("PROFILE",a.email)},[t,s,m,o,a==null?void 0:a.email]),u.useEffect(()=>{if(O){const P=setInterval(()=>{q<=0?(W(60),F(!1)):W($=>$-1)},1e3);return()=>clearInterval(P)}},[O,q]);const Ne=P=>P.toLowerCase().match(/^(([^<>()[\]\\.,;:\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,}))$/),Oe=P=>/^\d{8}$/.test(P),ve=P=>P.length>=8&&/[A-Za-z]/.test(P)&&/\d/.test(P),fe=(P,$)=>{K(G=>({...G,[P]:$})),S(null)},we=async P=>{S(null),L(P);try{if(typeof window<"u"){const $=`${window.location.pathname}${window.location.search}${window.location.hash}`;window.sessionStorage.setItem(Ny,$||"/")}if(P==="google"){await ig();return}await ag()}catch($){console.error("Social login error:",$),S(($==null?void 0:$.message)||e("auth.socialLoginFailed")),L(null)}},$e=()=>{const P=D.firstName.trim(),$=D.lastName.trim();return{firstName:P,lastName:$,phone:D.phone.replace(/\D/g,""),displayName:`${P} ${$}`.trim()}},rt=async()=>{if(!Q){S(e("auth.passwordRequired"));return}T(!0),S(null);try{const{isSignedIn:P,nextStep:$}=await kt({username:w,password:Q,options:{authFlowType:"USER_PASSWORD_AUTH"}});if(P){await be();return}if(($==null?void 0:$.signInStep)==="CONFIRM_SIGN_IN_WITH_NEW_PASSWORD_REQUIRED"){Y(""),J(""),g("NEW_PASSWORD"),T(!1);return}S(e("auth.unknownError")),T(!1)}catch(P){if(console.error("Existing user login error:",P),P.name==="UserNotConfirmedException"){_("NEW"),de(!0);try{await To({username:w})}catch{}F(!0),W(60),g("OTP");return}if(P.name==="NotAuthorizedException"){S(e("auth.invalidCredentials")),T(!1);return}S(P.message||e("auth.unknownError")),T(!1)}},Xe=async()=>{try{await no()}catch{}},Je=async()=>{if(!U){S(e("auth.passwordRequired"));return}if(!ve(U)){S(e("auth.passwordInvalid"));return}if(U!==I){S(e("auth.passwordsDoNotMatch"));return}T(!0),S(null);try{const{isSignedIn:P}=await Zs({challengeResponse:U});if(P){await be();return}S(e("auth.unknownError")),T(!1)}catch(P){console.error("Confirm new password error:",P),S(P.message||e("auth.unknownError")),T(!1)}},Ze=async()=>{T(!0),S(null);try{const P=await Ct(w);if(P.exists&&P.federatedOnly){S(Ey(P,e));return}_("EXISTING"),await Ln({username:w}),F(!0),W(60),N(""),g("OTP")}catch(P){console.error("Forgot password error:",P),S(P.message||e("auth.unknownError"))}finally{T(!1)}},Fe=async()=>{if(S(null),T(!0),!w||!Ne(w)){S(e("auth.emailInvalid")),T(!1);return}try{try{if(await vt()){const G=await Ot();n(!0),i(G),y(),p(),T(!1);return}}catch{}let P=!1;try{await kt({username:w,password:"X7p!wqLz2#__dummy__",options:{authFlowType:"USER_PASSWORD_AUTH"}}),P=!1}catch($){if($.name==="UserNotFoundException")try{const G=await Ct(w);if(!G.exists)P=!0;else if(jr(G)){S(Bo(G,e)),g("LANDING");return}else P=!1}catch(G){console.warn("checkAuthMethods failed during email probe:",G),S(e("auth.unknownError")),g("LANDING");return}else if($.name==="NotAuthorizedException")P=!1;else if($.name==="UserNotConfirmedException"){try{const G=await Ct(w);if(G.exists&&jr(G)){S(Bo(G,e)),g("LANDING");return}}catch(G){console.warn("checkAuthMethods failed for unconfirmed user:",G)}_("NEW"),de(!0);try{await To({username:w})}catch{}F(!0),W(60),g("PROFILE");return}else throw $}if(P){_("NEW"),de(!1),g("PROFILE");return}else{_("EXISTING"),V(""),g("PASSWORD");return}}catch(P){console.error("Email submit error:",P),S(P.message||e("auth.unknownError"))}finally{T(!1)}},xt=async()=>{var P,$;if(z.length===0){S(e("auth.fillConfirmationCode"));return}T(!0),S(null);try{if(j==="NEW"){const{isSignUpComplete:G}=await el({username:w,confirmationCode:z});if(G){const{isSignedIn:ie}=await kt({username:w,password:X.current,options:{authFlowType:"USER_PASSWORD_AUTH"}});if(ie){await be($e());return}}}else{const G=Cy();await tl({username:w,confirmationCode:z,newPassword:G});const{isSignedIn:ie}=await kt({username:w,password:G,options:{authFlowType:"USER_PASSWORD_AUTH"}});if(ie){await be();return}}T(!1)}catch(G){if(console.error("OTP verification error:",G),(P=G.message)!=null&&P.includes("Current status is CONFIRMED")&&j==="NEW")try{const{isSignedIn:ie}=await kt({username:w,password:X.current,options:{authFlowType:"USER_PASSWORD_AUTH"}});if(ie){await be($e());return}}catch{}if(($=G.message)!=null&&$.includes("already signed in")||G.name==="UserAlreadySignedInException"){if(j==="NEW"){await be($e());return}await be();return}T(!1),S(G.message||e("auth.unknownError"))}},ge=async()=>{const P=D.firstName.trim(),$=D.lastName.trim(),G=D.phone.replace(/\D/g,""),ie=D.password,it=D.confirmPassword;if(!P){S(e("auth.firstNameRequired"));return}if(!$){S(e("auth.lastNameRequired"));return}if(!Oe(G)){S(e("auth.phoneInvalid"));return}if(j==="NEW"){if(!ve(ie)){S(e("auth.passwordInvalid"));return}if(ie!==it){S(e("auth.passwordsDoNotMatch"));return}}T(!0),S(null);try{const Be={firstName:P,lastName:$,phone:G,displayName:`${P} ${$}`.trim()};if(j==="NEW"){try{const ye=await Ct(w),Ve=ye.socialProviders.length>0;if(ye.exists&&(ye.federatedOnly||Ve)){const jt=ye.federatedOnly||!ye.canResetPassword?Bo(ye,e):e("authLinking.useExistingLogin");S(jt),de(!1),g("LANDING"),T(!1);return}}catch(ye){console.warn("checkAuthMethods failed before signUp:",ye)}X.current=ie,re||(await ol({username:w,password:ie,options:{userAttributes:{email:w}}}),de(!0)),F(!0),W(60),g("OTP"),T(!1);return}await be(Be)}catch(Be){console.error("Error completing profile:",Be),S(Be instanceof Error?Be.message:e("auth.unknownError")),T(!1)}},be=async P=>{try{if(j==="NEW")await ka(w,w,P);else if(P&&o)if(await Ea(w))try{await Ca(w,w,P)}catch(ie){const it=(ie==null?void 0:ie.message)||"";if(!it.includes("Not Authorized")&&!it.includes("Unauthorized"))throw ie;await rn(w,w,P)}else await rn(w,w,P);const $=await Ot();i($)}catch($){console.error("Error completing login:",$),S(($==null?void 0:$.message)||e("auth.unknownError")),T(!1);return}n(!0),r(!1),y(),p(),T(!1)},_e=async()=>{try{j==="NEW"?await To({username:w}):await Ln({username:w}),F(!0),W(60),S(null)}catch(P){S(P.message||e("auth.failedToResendCode"))}},Po=async()=>{try{await ja()}catch(P){console.error("Forced profile completion logout error:",P)}finally{n(!1),r(!1),i(null),S(null),p()}},xo=()=>{switch(f){case"LANDING":return e("auth.welcomeBack");case"PASSWORD":return e("auth.login");case"OTP":return e("auth.verifyEmail");case"PROFILE":return e("auth.completeProfile");case"NEW_PASSWORD":return e("auth.setNewPassword");default:return f}},pe=()=>{switch(f){case"LANDING":return e("auth.enterYourEmailToContinue");case"PASSWORD":return e("auth.enterPasswordToContinue");case"OTP":return`${e("auth.otpSentTo")} ${w}`;case"PROFILE":return e("auth.completeProfileDesc");case"NEW_PASSWORD":return e("auth.newPasswordRequiredDesc");default:return f}};return l.jsx(Py,{open:s,onOpenChange:P=>{if(!P){if(v){Po();return}f==="NEW_PASSWORD"&&Xe(),p()}},children:l.jsxs(Ss,{className:"sm:max-w-md",onEscapeKeyDown:P=>{v&&P.preventDefault()},onInteractOutside:P=>{v&&P.preventDefault()},children:[l.jsxs(Ts,{children:[l.jsx("div",{className:"flex justify-center mb-4",children:l.jsx("img",{src:ky,alt:"PetWell Logo",className:"h-10 w-auto"})}),l.jsx(As,{className:"text-2xl text-center",children:xo()}),l.jsx(Es,{className:"text-base text-center",children:pe()})]}),l.jsxs("div",{className:"space-y-4",children:[k&&l.jsx("div",{className:"bg-destructive/10 text-destructive text-sm p-3 rounded-md border border-destructive/20",children:k}),f==="LANDING"&&l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx(ke,{htmlFor:"email",children:e("auth.email")}),l.jsx(Ee,{id:"email",type:"email",value:w,onChange:P=>He(P.target.value),placeholder:e("auth.emailPlaceholder"),disabled:b,onKeyDown:P=>{P.key==="Enter"&&!b&&Fe()}})]}),l.jsx(le,{onClick:Fe,disabled:b||C!==null,className:"w-full bg-[#FF902A] hover:bg-[#FF7A1A] text-white",size:"lg",children:b?l.jsxs(l.Fragment,{children:[l.jsx(tt,{className:"h-4 w-4 mr-2 animate-spin"}),e("auth.submit")]}):l.jsxs(l.Fragment,{children:[l.jsx(Vt,{className:"h-4 w-4 mr-2"}),e("auth.getCode")]})}),l.jsxs("div",{className:"relative py-1",children:[l.jsx("div",{className:"absolute inset-0 flex items-center",children:l.jsx("span",{className:"w-full border-t border-border"})}),l.jsx("div",{className:"relative flex justify-center text-xs uppercase tracking-wide text-muted-foreground",children:l.jsx("span",{className:"bg-background px-2",children:e("auth.orContinueWith")})})]}),l.jsxs("div",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2",children:[l.jsx(le,{type:"button",variant:"outline",size:"lg",disabled:b||C!==null,onClick:()=>we("google"),className:"w-full",children:C==="google"?l.jsxs(l.Fragment,{children:[l.jsx(tt,{className:"mr-2 h-4 w-4 animate-spin"}),e("auth.redirectingToProvider")]}):l.jsxs(l.Fragment,{children:[l.jsx(Ry,{}),l.jsx("span",{className:"ml-2",children:e("auth.continueWithGoogle")})]})}),l.jsx(le,{type:"button",variant:"outline",size:"lg",disabled:b||C!==null,onClick:()=>we("apple"),className:"w-full",children:C==="apple"?l.jsxs(l.Fragment,{children:[l.jsx(tt,{className:"mr-2 h-4 w-4 animate-spin"}),e("auth.redirectingToProvider")]}):l.jsxs(l.Fragment,{children:[l.jsx(lc,{className:"h-4 w-4"}),l.jsx("span",{className:"ml-2",children:e("auth.continueWithApple")})]})})]}),l.jsx("div",{className:"text-xs text-muted-foreground text-center pt-2 border-t",children:e("auth.otpExplanation")}),l.jsx("p",{className:"text-xs text-muted-foreground text-center",children:e("authLinking.signInMethodHint")})]}),f==="PASSWORD"&&l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex items-center gap-2 p-3 rounded-md bg-muted/50 border",children:[l.jsx(Vt,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsx("span",{className:"text-sm text-muted-foreground truncate",children:w}),l.jsx(le,{variant:"link",className:"p-0 h-auto text-xs text-[#FF902A] shrink-0",onClick:()=>{g("LANDING"),V(""),S(null)},children:e("auth.changeEmail")})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsx(ke,{htmlFor:"password-login",children:e("auth.loginPassword")}),l.jsx(Ee,{id:"password-login",type:"password",value:Q,onChange:P=>{V(P.target.value),S(null)},placeholder:e("auth.passwordPlaceholder"),disabled:b,autoFocus:!0,autoComplete:"current-password",onKeyDown:P=>{P.key==="Enter"&&!b&&rt()}})]}),l.jsx(le,{onClick:rt,disabled:b||!Q,className:"w-full bg-[#FF902A] hover:bg-[#FF7A1A] text-white",size:"lg",children:b?l.jsxs(l.Fragment,{children:[l.jsx(tt,{className:"h-4 w-4 mr-2 animate-spin"}),e("auth.verifying")]}):e("auth.login")}),l.jsx("div",{className:"text-center",children:l.jsx(le,{variant:"link",className:"p-0 h-auto text-sm text-[#FF902A] font-semibold",onClick:Ze,disabled:b,children:e("auth.forgotPassword")})}),l.jsx("p",{className:"text-xs text-muted-foreground text-center",children:e("authLinking.signInMethodHint")}),l.jsx("div",{className:"text-center",children:l.jsxs(le,{variant:"link",className:"text-sm",onClick:()=>{g("LANDING"),V(""),S(null)},disabled:b,children:[l.jsx(Bt,{className:"h-4 w-4 mr-1"}),e("auth.back")]})})]}),f==="NEW_PASSWORD"&&l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex items-center gap-2 p-3 rounded-md bg-muted/50 border",children:[l.jsx(Vt,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsx("span",{className:"text-sm text-muted-foreground truncate",children:w})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsx(ke,{htmlFor:"new-password",children:e("auth.password")}),l.jsx(Ee,{id:"new-password",type:"password",value:U,onChange:P=>{Y(P.target.value),S(null)},placeholder:e("auth.passwordPlaceholder"),disabled:b,autoFocus:!0,autoComplete:"new-password",onKeyDown:P=>{P.key==="Enter"&&!b&&Je()}}),l.jsx("div",{className:"text-xs text-muted-foreground",children:e("auth.passwordHint")})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsx(ke,{htmlFor:"confirm-new-password",children:e("auth.confirmPassword")}),l.jsx(Ee,{id:"confirm-new-password",type:"password",value:I,onChange:P=>{J(P.target.value),S(null)},placeholder:e("auth.confirmPasswordPlaceholder"),disabled:b,autoComplete:"new-password",onKeyDown:P=>{P.key==="Enter"&&!b&&Je()}})]}),l.jsx(le,{onClick:Je,disabled:b||!U||!I,className:"w-full bg-[#FF902A] hover:bg-[#FF7A1A] text-white",size:"lg",children:b?l.jsxs(l.Fragment,{children:[l.jsx(tt,{className:"h-4 w-4 mr-2 animate-spin"}),e("auth.savingPassword")]}):e("auth.setNewPassword")}),l.jsx("div",{className:"text-center",children:l.jsxs(le,{variant:"link",className:"text-sm",onClick:()=>{Xe(),g("PASSWORD"),Y(""),J(""),S(null)},disabled:b,children:[l.jsx(Bt,{className:"h-4 w-4 mr-1"}),e("auth.back")]})})]}),f==="OTP"&&l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex items-center gap-2 p-3 rounded-md bg-muted/50 border",children:[l.jsx(Vt,{className:"h-4 w-4 text-muted-foreground shrink-0"}),l.jsx("span",{className:"text-sm text-muted-foreground truncate",children:w}),l.jsx(le,{variant:"link",className:"p-0 h-auto text-xs text-[#FF902A] shrink-0",onClick:()=>{g("LANDING"),N(""),S(null)},children:e("auth.changeEmail")})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsx(ke,{htmlFor:"otp-code",children:e("auth.verificationCode")}),l.jsx(Ee,{id:"otp-code",type:"text",inputMode:"numeric",value:z,onChange:P=>{N(P.target.value.replace(/\D/g,"").slice(0,6)),S(null)},placeholder:"000000",className:"text-center text-2xl tracking-[0.5em] font-mono",autoF
977ocus:!0,onKeyDown:P=>{P.key==="Enter"&&xt()}})]}),l.jsxs("div",{className:"text-center text-sm text-muted-foreground",children:[e("auth.noRecieveCode")," ",O?l.jsxs("span",{className:"text-foreground font-medium",children:[e("auth.wait")," ",q," ",e("auth.getNewCode")]}):l.jsx(le,{variant:"link",className:"p-0 h-auto text-[#FF902A] font-semibold",onClick:_e,children:e("auth.resendCode")})]}),l.jsx(le,{onClick:xt,disabled:b||z.length<6,className:"w-full bg-[#FF902A] hover:bg-[#FF7A1A] text-white",size:"lg",children:b?l.jsxs(l.Fragment,{children:[l.jsx(tt,{className:"h-4 w-4 mr-2 animate-spin"}),e("auth.verifying")]}):e("auth.verifyAndLogin")}),l.jsx("div",{className:"text-center",children:l.jsxs(le,{variant:"link",className:"text-sm",onClick:()=>{g("LANDING"),N(""),S(null)},children:[l.jsx(Bt,{className:"h-4 w-4 mr-1"}),e("auth.back")]})})]}),f==="PROFILE"&&l.jsxs(l.Fragment,{children:[l.jsx("div",{className:"rounded-xl border bg-muted/30 p-4",children:l.jsx("div",{className:"text-sm font-medium text-foreground",children:w})}),l.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx(ke,{htmlFor:"firstName",children:e("auth.firstName")}),l.jsx(Ee,{id:"firstName",type:"text",value:D.firstName,onChange:P=>fe("firstName",P.target.value),placeholder:e("auth.firstNamePlaceholder"),disabled:b,autoFocus:!0,maxLength:40,onKeyDown:P=>{P.key==="Enter"&&!b&&ge()}})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsx(ke,{htmlFor:"lastName",children:e("auth.lastName")}),l.jsx(Ee,{id:"lastName",type:"text",value:D.lastName,onChange:P=>fe("lastName",P.target.value),placeholder:e("auth.lastNamePlaceholder"),disabled:b,maxLength:40,onKeyDown:P=>{P.key==="Enter"&&!b&&ge()}})]})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsx(ke,{htmlFor:"phone",children:e("auth.phone")}),l.jsxs("div",{className:"flex items-center rounded-md border border-input bg-background focus-within:ring-2 focus-within:ring-ring/20",children:[l.jsx("div",{className:"border-r px-3 py-2 text-sm font-medium text-muted-foreground",children:"+852"}),l.jsx(Ee,{id:"phone",type:"tel",inputMode:"numeric",value:D.phone,onChange:P=>fe("phone",P.target.value.replace(/\D/g,"").slice(0,8)),placeholder:e("auth.phonePlaceholder"),disabled:b,className:"border-0 focus-visible:ring-0 focus-visible:ring-offset-0",onKeyDown:P=>{P.key==="Enter"&&!b&&ge()}})]}),l.jsx("div",{className:"text-xs text-muted-foreground",children:e("auth.phoneHint")})]}),j==="NEW"&&l.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:[l.jsxs("div",{className:"space-y-2",children:[l.jsx(ke,{htmlFor:"password",children:e("auth.password")}),l.jsx(Ee,{id:"password",type:"password",value:D.password,onChange:P=>fe("password",P.target.value),placeholder:e("auth.passwordPlaceholder"),disabled:b,autoComplete:"new-password",onKeyDown:P=>{P.key==="Enter"&&!b&&ge()}}),l.jsx("div",{className:"text-xs text-muted-foreground",children:e("auth.passwordHint")})]}),l.jsxs("div",{className:"space-y-2",children:[l.jsx(ke,{htmlFor:"confirmPassword",children:e("auth.confirmPassword")}),l.jsx(Ee,{id:"confirmPassword",type:"password",value:D.confirmPassword,onChange:P=>fe("confirmPassword",P.target.value),placeholder:e("auth.confirmPasswordPlaceholder"),disabled:b,autoComplete:"new-password",onKeyDown:P=>{P.key==="Enter"&&!b&&ge()}})]})]}),l.jsx(le,{onClick:ge,disabled:b||!D.firstName.trim()||!D.lastName.trim()||!D.phone.trim()||j==="NEW"&&(!D.password||!D.confirmPassword),className:"w-full bg-[#FF902A] hover:bg-[#FF7A1A] text-white",size:"lg",children:b?l.jsxs(l.Fragment,{children:[l.jsx(tt,{className:"h-4 w-4 mr-2 animate-spin"}),e("auth.creatingAccount")]}):l.jsxs(l.Fragment,{children:[l.jsx(cc,{className:"h-4 w-4 mr-2"}),e("auth.completeSignup")]})}),l.jsx("div",{className:"text-center",children:!v&&l.jsxs(le,{variant:"link",className:"text-sm",onClick:()=>{g("LANDING"),S(null)},disabled:b,children:[l.jsx(Bt,{className:"h-4 w-4 mr-1"}),e("auth.back")]})})]})]})]})})},Dy=u.lazy(()=>R(()=>import("./Index-C4fgFbgp.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]))),Wy=u.lazy(()=>R(()=>import("./Landing-CfOmy2Wf.js"),__vite__mapDeps([41,1,2,42,43,44,45,46,8,9,10,11,12,47,32,48,49,3,4,5,6,7,40]))),Ly=u.lazy(()=>R(()=>import("./About-CPALLb6L.js"),__vite__mapDeps([50,1,2,42,43,44,45,46,8,9,10,11,12,47,32,48,49,3,4,5,6,7,51,52,53,54,55,40]))),Oy=u.lazy(()=>R(()=>import("./ChristmasEventDetail-Cnl4qtwY.js"),__vite__mapDeps([56,1,2,8,9,10,11,12,3,4,5,6,7,57,13,24,25,58,59,60,27,28,61,22,62,63,43,64,65,66,30,32,67]))),Fy=u.lazy(()=>R(()=>import("./ChristmasEvents-BHXWfm3C.js"),__vite__mapDeps([68,1,2,43,64,8,9,10,11,12,3,4,5,6,7,
97765,69,30]))),$r=u.lazy(()=>R(()=>import("./Terms-Uet-mjcX.js"),__vite__mapDeps([70,1,2,8,9,10,11,12,3,4,5,6,7,40]))),_y=u.lazy(()=>R(()=>import("./Forum-qaUEpz2E.js"),__vite__mapDeps([71,1,2,8,9,10,11,12,13,4,72,7,73,40,74,75,54,63,53,76,77,14,15,48,66,17,78,79,60]))),My=u.lazy(()=>R(()=>import("./OwnerZone-BAOIr8ec.js"),__vite__mapDeps([80,1,2,8,9,10,11,12,3,4,5,6,7,81,39,82,83,40,74,84,17]))),Br=u.lazy(()=>R(()=>import("./BlogPost-DLd3O4g_.js"),__vite__mapDeps([85,1,2,8,9,10,11,12,3,4,5,6,7,44,45,46,86,64,75,54,63,87,17,43,88,89,57,13,24,25,58,59,60,27,28,61,22,62,90,91,67,92,93,81,39,82,83,40,94,30,69,95,32]))),jy=u.lazy(()=>R(()=>import("./Clinics-CdZ5tld1.js"),__vite__mapDeps([96,1,2,97,8,9,10,11,12,3,4,5,6,7,44,45,46,42,43,77,98,84,99,17,100,29,101,102,64,31,25,13,59,61,32,22,15,33,28,34,74,40,103]))),Hy=u.lazy(()=>R(()=>import("./ClinicDetail-BQs6r4l0.js"),__vite__mapDeps([104,1,2,8,9,10,11,12,3,4,5,6,7,33,25,28,34,40,105,43,64,88,46,103,106,107,54,108,19,22,76,78,53,72,75,63,109,110,79,23,111,84,59,61,69,112,32,113,95,31,13]))),$y=u.lazy(()=>R(()=>import("./NGOs-VvXc9Xw_.js"),__vite__mapDeps([114,1,2,8,9,10,11,12,3,4,5,6,7,43,115,16,40,17,48,116]))),By=u.lazy(()=>R(()=>import("./NGODetail-Dlz-EV7z.js"),__vite__mapDeps([117,1,2,8,9,10,11,12,3,4,5,6,7,43,64,115,40,109,48,116,30,32]))),Vy=u.lazy(()=>R(()=>import("./PetTag-DKtKG5u8.js"),__vite__mapDeps([118,1,2,12,43,119,48,30,6]))),Uy=u.lazy(()=>R(()=>import("./ActivateTag-ytT0CDCB.js"),__vite__mapDeps([120,1,2,12,119,11,91,77]))),qy=u.lazy(()=>R(()=>import("./CheckTag-D5YoM0g5.js"),__vite__mapDeps([121,1,2,12,119]))),zy=u.lazy(()=>R(()=>import("./Download-8j9gf1JA.js"),__vite__mapDeps([122,1,2,8,9,10,11,12,3,4,5,6,7,84,40]))),Ky=u.lazy(()=>R(()=>import("./DeleteAccount-DKVPodVd.js"),__vite__mapDeps([123,1,2,8,9,10,11,12,3,4,5,6,7,53,54,124,60]))),Gy=u.lazy(()=>R(()=>import("./AdminForms-j5kduD0D.js"),__vite__mapDeps([125,1,2,12]))),Yy=u.lazy(()=>R(()=>import("./MailGoogleForm-CZ71o7g9.js"),__vite__mapDeps([126,1,2,12]))),Qy=u.lazy(()=>R(()=>import("./WhatsAppPetwellEng-LyxVrqk9.js"),__vite__mapDeps([127,1,2,40,12]))),Xy=u.lazy(()=>R(()=>import("./WhatsAppPetwellChin-JU-YYZj6.js"),__vite__mapDeps([128,1,2,40,12]))),Jy=u.lazy(()=>R(()=>import("./PetMatchmaker-B17f8swA.js"),__vite__mapDeps([129,1,2,43,130,131,8,9,10,11,12,3,4,5,6,7,40]))),Zy=u.lazy(()=>R(()=>import("./ChristmasDogMbti-K2_cFKKM.js"),__vite__mapDeps([132,1,2,8,9,10,11,12,3,4,5,6,7,43,124,64,65,22,30,32,130,69,40]))),ev=u.lazy(()=>R(()=>import("./Restaurants-CCSpby6B.js"),__vite__mapDeps([133,1,2,97,8,9,10,11,12,3,4,5,6,7,44,45,46,42,43,77,98,84,99,17,100,29,134,64,24,25,58,59,60,27,28,61,26,135,136,113,22,32,74,40,103]))),tv=u.lazy(()=>R(()=>import("./RestaurantDetail-C3zGzeN0.js"),__vite__mapDeps([137,1,2,8,9,10,11,12,3,4,5,6,7,88,46,26,27,25,28,29,103,40,106,107,54,108,19,22,76,78,53,72,75,63,109,110,79,23,111,84,24,57,13,58,59,60,61,62,43,64,69,91,138,139,48,32,95,112,136,113,135]))),ov=u.lazy(()=>R(()=>import("./RestaurantsByArea-DFQTWAH3.js"),__vite__mapDeps([140,1,2,8,9,10,11,12,3,4,5,6,7,97,44,45,46,42,43,77,98,84,99,17,100,29,86,64,75,54,63,87,134,24,25,58,59,60,27,28,61,26,135,136,113,22,32,74,40,103]))),nv=u.lazy(()=>R(()=>import("./Salons-DIqJzQqB.js"),__vite__mapDeps([141,1,2,97,8,9,10,11,12,3,4,5,6,7,44,45,46,42,43,77,98,84,99,17,100,29,101,102,64,31,25,13,59,61,32,22,15,35,28,34,74,40,103]))),rv=u.lazy(()=>R(()=>import("./SalonDetail-BNubpZ5h.js"),__vite__mapDeps([142,1,2,8,9,10,11,12,3,4,5,6,7,35,25,28,34,40,105,43,64,88,46,103,106,107,54,108,19,22,76,78,53,72,75,63,109,110,79,23,111,84,59,61,69,112,32,113,95,13]))),iv=u.lazy(()=>R(()=>import("./Lodging-D336hlDX.js"),__vite__mapDeps([143,1,2,97,8,9,10,11,12,3,4,5,6,7,44,45,46,42,43,77,98,84,99,17,100,29,101,102,64,31,25,13,59,61,32,22,15,36,28,34,74,40,103]))),av=u.lazy(()=>R(()=>import("./LodgingDetail-B0iTx2uS.js"),__vite__mapDeps([144,1,2,8,9,10,11,12,3,4,5,6,7,36,25,28,34,40,105,43,64,88,46,103,106,107,54,108,19,22,76,78,53,72,75,63,109,110,79,23,111,84,59,61,69,112,32,113,95,13]))),sv=u.lazy(()=>R(()=>import("./Malls-DkfGqr2J.js"),__vite__mapDeps([145,1,2,97,8,9,10,11,12,3,4,5,6,7,44,45,46,42,43,77,98,84,99,17,100,29,102,64,31,25,13,59,61,32,22,15,146,103,74,40]))),lv=u.lazy(()=>R(()=>import("./MallDetail-mz2aiLZS.js"),__vite__mapDeps([147,1,2,8,9,10,11,12,3,4,5,6,7,88,46,146,29,25,103,40,13,78,148,60,149,135,90,62,27,28,95,59,84,112,32,130]))),cv=u.lazy(()=>R(()=>import("./HomeVisits-BcNfXazu.js"),__vite__mapDeps([150,1,2,97,8,9,10,11,12,3,4,5,6,7,44,45,46,42,43,77,98,84,99,17,100,29,31,25,13,32,22,151,103,74,40]))),dv=u.lazy(()=>R(()=>import("./HomeVisitDetail-Bj_YnBly.js"),__vite__mapDeps([152,1,2,8,9,10,11,12,3,4,5,6,7,
97764,88,46,151,29,25,103,40,31,13,84,98,32,15]))),uv=u.lazy(()=>R(()=>import("./PetActivities-D_Lj32Dm.js"),__vite__mapDeps([153,1,2,43,75,8,9,10,11,12,54,63,3,4,5,6,7,42,37,40,13,39,38,17,100,30,69]))),pv=u.lazy(()=>R(()=>import("./EventDetail-e8k_kFy_.js"),__vite__mapDeps([154,1,2,3,4,5,6,7,8,9,10,11,12,64,43,40,37,109,67,30,73,66,48,155,32,116,78]))),hv=u.lazy(()=>R(()=>import("./PetwellMember-t9S4WEOu.js"),__vite__mapDeps([156,1,2,8,9,10,11,12,3,4,5,6,7,43,40]))),mv=u.lazy(()=>R(()=>import("./Nametag-Be1xBgyF.js"),__vite__mapDeps([157,1,2,11,69,99,158,109,10,8,9,12,3,4,5,6,7,43,45,46,75,54,63,40,76]))),fv=u.lazy(()=>R(()=>import("./VendorApplication-CRDuC8Ns.js"),__vite__mapDeps([159,1,2,8,9,10,11,12,3,4,5,6,7,53,54,160,45,46,40,161,78,99,32,55]))),gv=u.lazy(()=>R(()=>import("./VendorApplicationThankYou-BpBZym3s.js"),__vite__mapDeps([162,1,2,8,9,10,11,12,3,4,5,6,7,43,40,161,109,15]))),yv=u.lazy(()=>R(()=>import("./MidAutumnFestivalRegistration-DISRv6al.js"),__vite__mapDeps([163,1,2,8,9,10,11,12,53,54,160,40,75,63,93,164,165,15,55]))),vv=u.lazy(()=>R(()=>import("./MidAutumnFestivalPayment-B2DglGtG.js"),__vite__mapDeps([166,1,2,8,9,10,11,12,3,4,5,6,7,40,93,165,15,167]))),wv=u.lazy(()=>R(()=>import("./MidAutumnFestivalConfirmed-DmCsid80.js"),__vite__mapDeps([168,1,2,8,9,10,11,12,3,4,5,6,7,40,93,165,109,15]))),bv=u.lazy(()=>R(()=>import("./SignUpLogin-DxESOCD-.js"),__vite__mapDeps([169,1,2,12]))),Pv=u.lazy(()=>R(()=>import("./Register-BJuukmXR.js"),__vite__mapDeps([170,1,2,12]))),xv=u.lazy(()=>R(()=>import("./ForgotPassword-DkXRUTWn.js"),__vite__mapDeps([171,1,2,12]))),Sv=u.lazy(()=>R(()=>import("./VerificationCode-bJASZq7f.js"),__vite__mapDeps([172,1,2,12]))),Tv=u.lazy(()=>R(()=>import("./AuthCallback-CrJ_fqAW.js"),__vite__mapDeps([173,1,2,12]))),Av=u.lazy(()=>R(()=>import("./TestBooking-CS7MUhum.js"),__vite__mapDeps([174,1,2,8,9,10,11,12,3,4,5,6,7,64,43,75,54,63,40,99,32,109]))),Ev=u.lazy(()=>R(()=>import("./NotFound-DTZI5L68.js"),__vite__mapDeps([175,1,2,40]))),kv=u.lazy(()=>R(()=>import("./BlogDogTrainerLicence-Dk6U-mqT.js"),__vite__mapDeps([176,1,2,8,9,10,11,12,3,4,5,6,7,40,45,46,82,94,109,15,148]))),Cv=u.lazy(()=>R(()=>import("./Review-CZFB9g2T.js"),__vite__mapDeps([177,1,2,8,9,10,11,12,3,4,5,6,7,178,48,179,18,19,149,53,54,75,63,40,180,20,21,22,17,14,23,32,99,181,111,155,69,78,92]))),Nv=u.lazy(()=>R(()=>import("./ReviewProduct-D7E0kHyR.js"),__vite__mapDeps([182,1,2,8,9,10,11,12,3,4,5,6,7,160,54,180,20,178,48,40,18,19,107,108,22,183,32,23,67,66,149,99,69,111,30]))),Rv=u.lazy(()=>R(()=>import("./ReviewBrand-C_r99H9P.js"),__vite__mapDeps([184,1,2,8,9,10,11,12,3,4,5,6,7,179,18,19,149,178,48,53,54,75,63,40,180,20,21,22,99,67,23,181,32,155,69]))),Iv=u.lazy(()=>R(()=>import("./Wishlist-DXDrxZcj.js"),__vite__mapDeps([185,1,2,8,9,10,11,12,3,4,5,6,7,158,64,43,40,18,19,48,183,149,67]))),Dv=u.lazy(()=>R(()=>import("./Compare-CVOrncBD.js"),__vite__mapDeps([186,1,2,8,9,10,11,12,3,4,5,6,7,40,18,19,180,20,21,22,149,23,181,99,67,69]))),Wv=u.lazy(()=>R(()=>import("./OtherServices-DYwm6Mn6.js"),__vite__mapDeps([187,1,2,8,9,10,11,12,3,4,5,6,7,51,45,46,164,78,49,40]))),Lv=u.lazy(()=>R(()=>import("./AfcdPdfRedirect-nZ6Q1rlj.js"),__vite__mapDeps([188,1,2,12]))),Ov=u.lazy(()=>R(()=>import("./RainyDayMalls-B9bStGvH.js"),__vite__mapDeps([189,1,2,8,9,10,11,12,3,4,5,6,7,43,64,88,46,89,57,13,24,25,58,59,60,27,28,61,22,62,63,40,94,103,83,69,17,90,32,181,87,67,92]))),Fv=u.lazy(()=>R(()=>import("./NutritionScore-D5eItglQ.js"),__vite__mapDeps([190,1,2,8,9,10,11,12,3,4,5,6,7,13,40,84,124,191,139,167,99,69,109,60,110,17,100,131,130]))),_v=u.lazy(()=>R(()=>import("./NutritionProduct-b9wBvcz6.js"),__vite__mapDeps([192,1,2,8,9,10,11,12,3,4,5,6,7,64,13,40,191,87,14,138,69,60,99,15]))),Mv=u.lazy(()=>R(()=>import("./UserProfile-Duavc4Eg.js"),__vite__mapDeps([193,1,2,12,8,9,10,11,3,4,5,6,7,194,108,19,22,40]))),jv=u.lazy(()=>R(()=>import("./MyReviews-BclwVe3U.js"),__vite__mapDeps([195,1,2,196,8,9,10,11,12,3,4,5,6,7,108,19,139,194,22,40,17]))),Hv=u.lazy(()=>R(()=>import("./AccountProfile-CAuVI5P3.js"),__vite__mapDeps([197,1,2,196,8,9,10,11,12,3,4,5,6,7,108,19,139,84,194,22,40,79]))),$v=u.lazy(()=>R(()=>import("./ContactUsWidget-DVNx2pEF.js"),__vite__mapDeps([198,1,2,52,4,53,54,10,5,55,15,12]))),Bv=u.lazy(()=>R(()=>import("./HomePromoPopups-CvK0ytwZ.js"),__vite__mapDeps([199,1,2,93,78,9,12]))),Vv=new Vs;function Uv(){return l.jsx("div",{className:"flex min-h-[50vh] items-center justify-center",children:l.jsx("div",{className:"h-7 w-7 animate-spin rounded-full border-2 border-primary border-t-transparent"})})}function qv(){return wu(),null}function zv(){const[e,t]=u.useState(!1);return u.useEffect(()=>{const o=window;if(o.requestIdleCallback){const r=o.requestIdleCallback(()=>t(!0),{timeout:2500});return()=>{var i;return(i=o.cancelIdleCallback)==null?void 0:i.call(o,r)}}const n=window.setTimeout(()=>t(!0),1);return()=>window.clearTimeout(n)},[]),e?l.jsxs(u.Suspense,{fallback:null,children:[l.jsx($v,{}),l.jsx(Bv,{})]}):null}const Kv=()=>l.jsx(Us,{client:Vv,children:l.jsx(tu,{children:l.jsx(sg,{children:l.jsx(cg,{children:l.jsx(ug,{children:l.jsxs(pg,{children:[l.jsx(qc,{}),l.jsx(Sd,{}),l.jsxs(Hs,{children:[l.jsx(nu,{}),l.jsx(qv,{}),l.jsx(cu,{}),l.jsx(Iy,{}),l.jsx(zv,{}),l.jsx(u.Suspense,{fallback:l.jsx(Uv,{}),children:l.jsxs($s,{children:[l.jsx(E,{path:"/",element:l.jsx(Dy,{})}),l.jsx(E,{path:"/landing",element:l.jsx(Wy,{})}),l.jsx(E,{path:"/about",element:l.jsx(Ly,{})}),l.jsx(E,{path:"/other-services",element:l.jsx(Wv,{})}),l.jsx(E,{path:"/terms",element:l.jsx($r,{})}),l.jsx(E,{path:"/privacy",element:l.jsx($r,{})}),l.jsx(E,{path:"/clinics",element:l.jsx(jy,{})}),l.jsx(E,{path:"/clinics/:clinicId",element:l.jsx(Hy,{})}),l.jsx(E,{path:"/restaurants",element:l.jsx(ev,{})}),l.jsx(E,{path:"/restaurant",element:l.jsx(Te,{to:"/restaurants",replace:!0})}),l.jsx(E,{path:"/pet-friendly-restaurants-hk",element:l.jsx(Te,{to:"/restaurants",replace:!0})}),l.jsx(E,{path:"/pet-friendly-restaurants/:areaSlug",element:l.jsx(ov,{})}),l.jsx(E,{path:"/chong-wu-you-shan-can-ting",element:l.jsx(Te,{to:"/restaurants",replace:!0})}),l.jsx(E,{path:"/dai-gou-shi-fan-hong-kong",element:l.jsx(Te,{to:"/restaurants",replace:!0})}),l.jsx(E,{path:"/restaurants/:restaurantId",element:l.jsx(tv,{})}),l.jsx(E,{path:"/salons",element:l.jsx(nv,{})}),l.jsx(E,{path:"/salons/:salonId",element:l.jsx(rv,{})}),l.jsx(E,{path:"/lodging",element:l.jsx(iv,{})}),l.jsx(E,{path:"/lodging/:lodgingId",element:l.jsx(av,{})}),l.jsx(E,{path:"/malls",element:l.jsx(sv,{})}),l.jsx(E,{path:"/malls/:mallId",element:l.jsx(lv,{})}),l.jsx(E,{path:"/home-visits",element:l.jsx(cv,{})}),l.jsx(E,{path:"/home-visits/:providerId",element:l.jsx(dv,{})}),l.jsx(E,{path:"/ngos",element:l.jsx($y,{})}),l.jsx(E,{path:"/ngos/:ngoId",element:l.jsx(By,{})}),l.jsxs(E,{path:"/forum",element:l.jsx(_y,{}),children:[l.jsx(E,{index:!0,element:null}),l.jsx(E,{path:":postId",element:null})]}),l.jsx(E,{path:"/owner-zone",element:l.jsx(My,{})}),l.jsx(E,{path:"/download",element:l.jsx(zy,{})}),l.jsx(E,{path:"/delete-account",element:l.jsx(Ky,{})}),l.jsx(E,{path:"/admin-forms-secret",element:l.jsx(Gy,{})}),l.jsx(E,{path:"/mailgoogleform",element:l.jsx(Yy,{})}),l.jsx(E,{path:"/whatsapp-petwell-eng",element:l.jsx(Qy,{})}),l.jsx(E,{path:"/whatsapp-petwell-chin",element:l.jsx(Xy,{})}),l.jsx(E,{path:"/pet-matchmaker",element:l.jsx(Jy,{})}),l.jsx(E,{path:"/christmas-dog-mbti-2025",element:l.jsx(Zy,{})}),l.jsx(E,{path:"/christmas-events-2025",element:l.jsx(Fy,{})}),l.jsx(E,{path:"/pet-activities",element:l.jsx(uv,{})}),l.jsx(E,{path:"/event/:id",element:l.jsx(pv,{})}),l.jsx(E,{path:"/christmas-event/:eventId",element:l.jsx(Oy,{})}),l.jsx(E,{path:"/petwell-member",element:l.jsx(hv,{})}),l.jsx(E,{path:"/anti-lost-dog-tag-hk",element:l.jsx(mv,{})}),l.jsx(E,{path:"/nametag",element:l.jsx(Te,{to:"/anti-lost-dog-tag-hk",replace:!0})}),l.jsx(E,{path:"/namtag",element:l.jsx(Te,{to:"/anti-lost-dog-tag-hk",replace:!0})}),l.jsx(E,{path:"/fang-zou-shi-gou-pai",element:l.jsx(Te,{to:"/anti-lost-dog-tag-hk",replace:!0})}),l.jsx(E,{path:"/防走失狗牌",element:l.jsx(Te,{to:"/anti-lost-dog-tag-hk",replace:!0})}),l.jsx(E,{path:"/vendor-application",element:l.jsx(fv,{})}),l.jsx(E,{path:"/vendor-application/thank-you",element:l.jsx(gv,{})}),l.jsx(E,{path:"/mid-autumn-taiwan-festival",element:l.jsx(yv,{})}),l.jsx(E,{path:"/mid-autumn-taiwan-festival/pay",element:l.jsx(vv,{})}),l.jsx(E,{path:"/mid-autumn-taiwan-festival/confirmed",element:l.jsx(wv,{})}),l.jsx(E,{path:"/signup-login",element:l.jsx(bv,{})}),l.jsx(E,{path:"/register",element:l.jsx(Pv,{})}),l.jsx(E,{path:"/forgot-password",element:l.jsx(xv,{})}),l.jsx(E,{path:"/verification-code",element:l.jsx(Sv,{})}),l.jsx(E,{path:"/auth/*",element:l.jsx(Tv,{})}),l.jsx(E,{path:"/test-booking",element:l.jsx(Av,{})}),l.jsx(E,{path:"/review",element:l.jsx(Cv,{})}),l.jsx(E,{path:"/review/brand/:brand",element:l.jsx(Rv,{})}),l.jsx(E,{path:"/review/:id",element:l.jsx(Nv,{})}),l.jsx(E,{path:"/wishlist",element:l.jsx(Iv,{})}),l.jsx(E,{path:"/compare",element:l.jsx(Dv,{})}),l.jsx(E,{path:"/account",element:l.jsx(Hv,{})}),l.jsx(E,{path:"/account/reviews",element:l.jsx(jv,{})}),l.jsx(E,{path:"/users/:userId",element:l.jsx(Mv,{})}),l.jsx(E,{path:"/merchant",element:l.jsx(Te,{to:"/other-services",replace:!0})}),l.jsx(E,{path:"/blog/hong-kong-dog-trainer-licence-guide",element:l.jsx(kv,{})}),l.jsx(E,{path:"/blog/pet-friendly-shopping-malls-hk-2025",element:l.jsx(Te,{to:"/rainy-day-pet-friendly-indoor-hong-kong",replace:!0})}),l.jsx(E,{path:"/rainy-day-pet-friendly-indoor-hong-kong",element:l.jsx(Ov,{})}),l.jsx(E,{path:"/nutrition",element:l.jsx(Fv,{})}),l.jsx(E,{path:"/nutrition/:id",element:l.jsx(_v,{})}),l.jsx(E,{path:"/food-score",element:l.jsx(Te,{to:"/nutrition",replace:!0})}),l.jsx(E,{path:"/blog/:slug",element:l.jsx(Br,{})}),l.jsx(E,{path:"/afcd-pet-food-safety-pdf",element:l.jsx(Lv,{})}),l.jsx(E,{path:"/:slug",element:l.jsx(Br,{})}),l.jsx(E,{path:"/check/:id",element:l.jsx(qy,{})}),l.jsx(E,{path:"/pet/:tagId",element:l.jsx(Vy,{})}),l.jsx(E,{path:"/activate/:tagId",element:l.jsx(Uy,{})}),l.jsx(E,{path:"*",element:l.jsx(Ev,{})})]})})]})]})})})})})});nl.configure(Zf);Bs(document.getElementById("root")).render(l.jsx(Kv,{}));export{ae as $,Bt as A,le as B,Da as C,Py as D,yw as E,Cw as F,Tw as G,Aw as H,Ee as I,kw as J,Ew as K,ke as L,rw as M,aw as N,dw as O,ww as P,bw as Q,Yf as R,mw as S,Sw as T,Jv as U,iw as V,cc as W,ki as X,Ft as Y,ri as Z,No as _,pw as a,Rw as a$,oe as a0,wt as a1,Vt as a2,ky as a3,Le as a4,Dw as a5,Lw as a6,vs as a7,ue as a8,Ww as a9,je as aA,wa as aB,ja as aC,ku as aD,ml as aE,Cd as aF,Ml as aG,se as aH,Nu as aI,Iu as aJ,er as aK,cw as aL,lw as aM,Qo as aN,me as aO,_u as aP,Wu as aQ,R as aR,yu as aS,nw as aT,Fw as aU,Ow as aV,ag as aW,ig as aX,Nw as aY,_w as aZ,Iw as a_,ws as aa,bs as ab,Ps as ac,by as ad,vy as ae,wy as af,gl as ag,hg as ah,xn as ai,bl as aj,We as ak,Hi as al,Od as am,ly as an,Sg as ao,za as ap,uo as aq,Fd as ar,_d as as,Jr as at,es as au,ei as av,ln as aw,It as ax,Zv as ay,pn as az,ce as b,dl as b0,bt as c,ul as d,lg as e,fw as f,Pw as g,dg as h,hw as i,Ss as j,Ts as k,As as l,Es as m,tt as n,Sy as o,ka as p,Hf as q,xw as r,Lt as s,$f as t,Rh as u,sw as v,uw as w,gw as x,qf as y,vw as z};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.