useDeferredValue
useDeferredValue γ―γUI οΏ½?δΈι¨οΏ½?ζ΄ζ°γι
ε»ΆγγγγγοΏ½? React γγγ―γ§γγ
const deferredValue = useDeferredValue(value)γͺγγ‘γ¬γ³γΉ
useDeferredValue(value)
γ³γ³γγΌγγ³γοΏ½?γγγγ¬γγ«γ§ useDeferredValue γεΌγ³εΊγγγοΏ½?ε€οΏ½?ι
ε»ΆγγγγγΌγΈγ§γ³γεεΎγγΎγγ
import { useState, useDeferredValue } from 'react';
function SearchPage() {
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
// ...
}εΌζ°
value: ι ε»Άγγγγε€γδ»»ζοΏ½?εγζγ€γγ¨γγ§γγΎγγ
θΏγε€
εεγ¬γ³γγΌζγ«γ―γθΏγγγε€γ―γγͺγγζΈ‘γγε€γ¨εδΈγ«γͺγγΎγγζ΄ζ°ζγ«γ―γReact γ―γΎγε€γε€γ§εγ¬γ³γγΌγ試γΏοΌγ€γΎγθΏγε€γ―ε€γε€γ«γͺγοΌγ欑γ«ζ°γγε€γ§γγγ―γ°γ©γ¦γ³γγ§εγ¬γ³γγΌγ試γΏγΎγοΌθΏγε€γ―ζ΄ζ°εΎοΏ½?ε€γ«γͺγγΎγοΌγ
注ζηΉ
-
useDeferredValueγ«ζΈ‘γε€γ―γγγͺγγγ£γγͺε€οΌζεεγζ°ε€γͺγ©οΌγΎγγ―γ¬γ³γγΌοΏ½?ε€ι¨γ§δ½ζγγγγͺγγΈγ§γ―γγ§γγγΉγγ§γγγ¬γ³γγΌδΈγ«ζ°γγγͺγγΈγ§γ―γγδ½ζγγ¦γγγ«γγγuseDeferredValueγ«ζΈ‘γγ¨γγγγ―ζ―εοΏ½?γ¬γ³γγΌγ§η°γͺγγοΏ½?γ¨γͺγγγγδΈεΏ θ¦γͺγγγ―γ°γ©γ¦γ³γγ§οΏ½?εγ¬γ³γγΌγεΌγθ΅·γγγΎγγ -
useDeferredValueγοΌObject.isγ§ζ―θΌγγ¦οΌη°γͺγε€γεγεγγ¨γοΌεεοΏ½?ε€γδ½Ώη¨γγοΌηΎε¨οΏ½?γ¬γ³γγΌγ«ε γγ¦γζ°γγε€γ§γγγ―γ°γ©γ¦γ³γγ§εγ¬γ³γγΌγγΉγ±γΈγ₯γΌγ«γγΎγγγγγ―γ°γ©γ¦γ³γγ§οΏ½?εγ¬γ³γγΌγ―δΈζε―θ½γ§γγvalueγ«ε₯οΏ½?ζ΄ζ°γγγγ¨γReact γ―γγγ―γ°γ©γ¦γ³γγ§οΏ½?εγ¬γ³γγΌγζεγγγγη΄γγΎγγδΎγγ°γγ¦γΌγΆγη΄ ζ©γε ₯εγθ‘γγγγγγοΏ½?ε€γεγεγγγ£γΌγγ³γ³γγΌγγ³γγεγ¬γ³γγΌγ§γγγγγιγγ£γε ΄εγγγ£γΌγγ―γ¦γΌγΆγγΏγ€γγζ’γγγγ¨γ«ε葨瀺γγγγγ¨γ«γͺγγΎγγ -
useDeferredValueγ―<Suspense>γ¨η΅±εγγγ¦γγΎγγζ°γγε€γ«γγ£γ¦εΌγθ΅·γγγγγγγ―γ°γ©γ¦γ³γζ΄ζ°γ UI γγ΅γΉγγ³γγγε ΄εγ§γγγ¦γΌγΆγ«γγ©γΌγ«γγγ―γ―葨瀺γγγΎγγγγγΌγΏγθͺγΏθΎΌγΎγγγΎγ§γδ»₯εοΏ½?ι ε»Άγγγε€γ葨瀺γγηΆγγΎγγ -
useDeferredValueθͺδ½γ«δ½θ¨γͺγγγγ―γΌγ―γͺγ―γ¨γΉγγι²γδ»η΅γΏγ―γγγΎγγγ -
useDeferredValueθͺδ½γ«γγεΊοΏ½?οΏ½οΏ½?ι ε»Άγ―γγγΎγγγReact γε οΏ½?εγ¬γ³γγΌγη΅γγγ¨γγγ«γζ°γγι ε»Άε€γ§οΏ½?γγγ―γ°γ©γ¦γ³γεγ¬γ³γγΌδ½ζ₯γιε§γγΎγγγ€γγ³γοΌγΏγ€γγ³γ°γͺγ©οΌγ«γγζ΄ζ°γ―γγγγ―γ°γ©γ¦γ³γοΏ½?εγ¬γ³γγΌγδΈζγγ¦εͺε ηγ«ε¦ηγγγΎγγ -
useDeferredValueγ«γγγγγ―γ°γ©γ¦γ³γοΏ½?εγ¬γ³γγΌγ―γη»ι’γ«γ³γγγγγγγΎγ§γ¨γγ§γ―γγοΏ½?οΏ½θ‘γγΎγγγγγγ―γ°γ©γ¦γ³γοΏ½?εγ¬γ³γγΌγγ΅γΉγγ³γγγε ΄εγγοΏ½?εγ¬γ³γγΌγ«ε―ΎεΏγγγ¨γγ§γ―γγ―γγΌγΏοΏ½?θͺγΏθΎΌγΏγ¨ UI οΏ½?ζ΄ζ°οΏ½?εΎγ«οΏ½?οΏ½θ‘γγγΎγγ
δ½Ώη¨ζ³
ζ°γγγ³γ³γγ³γγθͺγΏθΎΌγΎγγ¦γγιγε€γγ³γ³γγ³γγ葨瀺γγ
UI οΏ½?δΈι¨οΏ½?ζ΄ζ°γι
ε»Άγγγγγγ«γγ³γ³γγΌγγ³γοΏ½?γγγγ¬γγ«γ§ useDeferredValue γεΌγ³εΊγγΎγγ
import { useState, useDeferredValue } from 'react';
function SearchPage() {
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
// ...
}εεγ¬γ³γγΌζγ«γ―γι ε»Άγγγε€γ―ι’ζ°γ«ζΈ‘γγε€γ¨εγγ«γͺγγΎγγ
ζ΄ζ°ζγ«γ―γι ε»Άγγγε€γ―ζζ°οΏ½?ε€γγγι γγγΎγγε ·δ½ηγ«γ―γReact γ―γΎγι ε»Άε€γζ΄ζ°γγγ«εγ¬γ³γγΌγθ‘γγ欑γ«ζ°γγ«εγεγ£γε€γ§γγγ―γ°γ©γ¦γ³γγ§οΏ½?εγ¬γ³γγΌγ試γΏγΎγγ
δΎγδ½Ώγ£γ¦γγγγε½Ήη«γ€ε ΄ι’γθ¦γ¦γγγΎγγγγ
γοΏ½?δΎγ§γ―γSearchResults γ³γ³γγΌγγ³γγ―ζ€η΄’η΅ζγγγ§γγγγιγ΅γΉγγ³γγγΎγγ"a" γε
₯εγγη΅ζγεΎ
γ£γ¦γγ "ab" γ«ζΈγζγγ¦γΏγ¦γγ γγγ"a" οΏ½?ζ€η΄’η΅ζγγγγΌγδΈγγ©γΌγ«γγγ―γ«οΏ½?ζγγγ¦γγΎγγΎγγ
import { Suspense, useState } from 'react'; import SearchResults from './SearchResults.js'; export default function App() { const [query, setQuery] = useState(''); return ( <> <label> Search albums: <input value={query} onChange={e => setQuery(e.target.value)} /> </label> <Suspense fallback={<h2>Loading...</h2>}> <SearchResults query={query} /> </Suspense> </> ); }
γοΏ½?代γγγ«δΈθ¬ηγ«δ½Ώγγγ UI γγΏγΌγ³γ―γη΅ζγͺγΉγοΏ½?ζ΄ζ°γι
ε»Άγγγ¦γζ°γγη΅ζγζΊεγ§γγγΎγ§εοΏ½?η΅ζγ葨瀺γηΆγγγ¨γγγοΏ½?γ§γγι
ε»ΆγγΌγΈγ§γ³οΏ½?γ―γ¨γͺζεεγζΈ‘γγγγ« useDeferredValue γεΌγ³εΊγγΎγοΌ
export default function App() {
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
return (
<>
<label>
Search albums:
<input value={query} onChange={e => setQuery(e.target.value)} />
</label>
<Suspense fallback={<h2>Loading...</h2>}>
<SearchResults query={deferredQuery} />
</Suspense>
</>
);
}query οΏ½?ζΉγ―γγγ«ζ΄ζ°γγγγγγε
₯εγγ£γΌγ«γγ―ζ°γγε€γ葨瀺γγΎγγγγγγdeferredQuery γ―γγΌγΏγθͺγΏθΎΌγΎγγγΎγ§εοΏ½?ε€γδΏζγγγγγSearchResults γ―γγ°γγε€γη΅ζγ葨瀺γγΎγγ
δ»₯δΈοΏ½?δΎγ§ "a" γε
₯εγγη΅ζγθͺγΏθΎΌγΎγγοΏ½?γεΎ
γ‘γ欑γ«ε
₯εζ¬γ "ab" γ«ζΈγζγγ¦γΏγ¦γγ γγγζ°γγη΅ζγθͺγΏθΎΌγΎγγγΎγ§γ―γγ΅γΉγγ³γΉγ«γγγγ©γΌγ«γγγ―οΏ½?代γγγ«ε€γη΅ζγͺγΉγγ葨瀺γγηΆγγγγ¨γ«ηοΏ½?γγ¦γγ γγγ
import { Suspense, useState, useDeferredValue } from 'react'; import SearchResults from './SearchResults.js'; export default function App() { const [query, setQuery] = useState(''); const deferredQuery = useDeferredValue(query); return ( <> <label> Search albums: <input value={query} onChange={e => setQuery(e.target.value)} /> </label> <Suspense fallback={<h2>Loading...</h2>}> <SearchResults query={deferredQuery} /> </Suspense> </> ); }
γγγ«ζ·±γη₯γ
ε€οΏ½?ι ε»Άγ― 2 γ€οΏ½?γΉγγγγ§θ‘γγγγ¨θγγγγ¨γγ§γγΎγοΌ
-
γΎγ React γ―γ
queryγ―ζ°γγε€ ("ab") γ γdeferredQueryγ―ε€γε€ ("a") οΏ½?γΎγΎγγ¨γγηΆζ γ§εγ¬γ³γγΌγ試γΏγΎγγη΅ζγͺγΉγγ«ζΈ‘γε΄οΏ½?ε€γ§γγdeferredQueryγ―ι ε»Άγγγ¦γγγqueryοΏ½?ε€γ«γι γγ¦γγ€γγ¦γγγΎγγ -
γγγ―γ°γ©γ¦γ³γγ§ React γ―γ
queryγ¨deferredQueryοΏ½?δΈ‘ζΉγ"ab"γ«ζ΄ζ°γγγηΆζ γ§εγ¬γ³γγΌγ試γΏγΎγγγοΏ½?εγ¬γ³γγΌγοΏ½?οΏ½δΊγγε ΄εγReact γ―γγγη»ι’γ«θ‘¨η€ΊγγΎγγγγγγγγγγ΅γΉγγ³γγγοΌ"ab"οΏ½?η΅ζγγΎγ θͺγΏθΎΌγΎγγ¦γγͺγοΌε ΄εγReact γ―γοΏ½?γ¬γ³γγΌοΏ½?試θ‘γζΎζ£γγγγΌγΏγθͺγΏθΎΌγΎγγεΎγ«γοΏ½?εγ¬γ³γγΌγε試θ‘γγΎγγγ¦γΌγΆγ―γγγΌγΏγζΊεγ§γγγΎγ§ε€γι ε»Άγγγε€γθ¦ηΆγγΎγγ
ι ε»Άγγγγγγγ―γ°γ©γ¦γ³γγγ¬γ³γγΌγ―δΈζε―θ½γ§γγδΎγγ°γεεΊ¦ε ₯εζ¬γ«γΏγ€γγθ‘γγ¨γReact γ―γγγζΎζ£γγζ°γγε€γ§γγη΄γγΎγγReact γ―εΈΈγ«ζεΎγ«ζδΎγγγε€γδ½Ώη¨γγΎγγ
εγγΌγΉγγγΌγ―γγ¨γ«γγγγ―γΌγ―γͺγ―γ¨γΉγγ―ηΊηγγ¦γγγγ¨γ«ζ³¨ζγγ¦γγ γγγγγγ§οΌζΊεγγ§γγγΎγ§οΌι ε»Άγγγ¦γγοΏ½?γ―η΅ζοΏ½?葨瀺γ§γγγγγγγ―γΌγ―γͺγ―γ¨γΉγθͺδ½γ§γ―γγγΎγγγγ¦γΌγΆγε ₯εγηΆγγε ΄εγ§γγεγγΌγΉγγγΌγ―οΏ½?γ¬γΉγγ³γΉγ―γγ£γγ·γ₯γγγ¦γγγγγBackspace γζΌγγ¨ε³εΊ§γ«εεΏγγεεΊ¦οΏ½?γγ§γγγ―θ΅·γγΎγγγ
γ³γ³γγ³γγε€γγγ¨γγ€γ³γΈγ±γΌγΏγ§θ‘¨η€Ίγγ
δΈθ¨οΏ½?δΎγ§γ―γζζ°οΏ½?γ―γ¨γͺοΏ½?η΅ζγͺγΉγγγΎγ γγΌγδΈγ§γγγγ¨γη€Ίγγ€γ³γΈγ±γΌγΏγγγγΎγγγζ°γγη΅ζγγγΌγγγγοΏ½?γ«ζιγγγγγ¨γγ¦γΌγΆοΏ½?ζ··δΉ±γζγε―θ½ζ§γγγγΎγγη΅ζγͺγΉγγζζ°οΏ½?γ―γ¨γͺγ¨δΈθ΄γγ¦γγͺγγγ¨γγ¦γΌγΆγ«ζη’Ίγ«δΌγγγγγ«γε€γη΅ζγͺγΉγγ葨瀺γγγ¦γγγ¨γγ«θ¦θ¦ηγͺγ€γ³γΈγ±γΌγΏγθΏ½ε γγγγ¨γγ§γγΎγοΌ
<div style={{
opacity: query !== deferredQuery ? 0.5 : 1,
}}>
<SearchResults query={deferredQuery} />
</div>γγγ«γγγε ₯εγιε§γγγ¨η΄γ‘γ«γε€γη΅ζγͺγΉγγγγγγ«ζγγͺγγζ°γγη΅ζγͺγΉγγγγΌγγγγγΎγ§γοΏ½?ηΆζ γηΆγγΎγγδ»₯δΈοΏ½?δΎοΏ½?γγγ«γζγγͺγοΏ½?γι ε»Άγγγ CSS γγ©γ³γΈγ·γ§γ³γθΏ½ε γγγγ¨γ§γεΎγ γ«ε€εγγγγγ«ζγγγγγγ¨γγ§γγΎγγ
import { Suspense, useState, useDeferredValue } from 'react'; import SearchResults from './SearchResults.js'; export default function App() { const [query, setQuery] = useState(''); const deferredQuery = useDeferredValue(query); const isStale = query !== deferredQuery; return ( <> <label> Search albums: <input value={query} onChange={e => setQuery(e.target.value)} /> </label> <Suspense fallback={<h2>Loading...</h2>}> <div style={{ opacity: isStale ? 0.5 : 1, transition: isStale ? 'opacity 0.2s 0.2s linear' : 'opacity 0s 0s linear' }}> <SearchResults query={deferredQuery} /> </div> </Suspense> </> ); }
UI οΏ½?δΈι¨εοΏ½?εγ¬γ³γγΌγι ε»Άγγγ
useDeferredValue γγγγ©γΌγγ³γΉζι©εγ¨γγ¦ι©η¨γγγγ¨γγ§γγΎγγγγγ―γUI οΏ½?δΈι¨οΏ½?εγ¬γ³γγΌγ«ζιγγγγγγγγζι©εγγη°‘εγͺζΉζ³γγͺγγγγγγ«γγ£γ¦ UI οΏ½?δ»οΏ½?ι¨εγγγγγ―γγγοΏ½?γι²γγγγγ¨γγε ΄εγ«ζη¨γ§γγ
γγγΉγγγ£γΌγ«γγ¨γεγγΌγΉγγγΌγ―γγ¨γ«εγ¬γ³γγΌγγγ³γ³γγΌγγ³γοΌγγ£γΌγγι·γγͺγΉγγͺγ©οΌγγγγ¨ζ³εγγ¦γΏγ¦γγ γγοΌ
function App() {
const [text, setText] = useState('');
return (
<>
<input value={text} onChange={e => setText(e.target.value)} />
<SlowList text={text} />
</>
);
}γΎγγ― SlowList γζι©εγγ¦γprops γεγε ΄εγ―εγ¬γ³γγΌγγΉγγγγγγγγ«γγΎγγγγγθ‘γγ«γ―γmemo γ§γ©γγγγΎγγ
const SlowList = memo(function SlowList({ text }) {
// ...
});γγγγγγγζη¨γͺοΏ½?γ― SlowList οΏ½? props γεεοΏ½?γ¬γ³γγΌζγ¨εδΈγ§γγε ΄εοΏ½?γΏγ§γγηΎε¨η΄ι’γγ¦γγει‘γ―γprops γη°γͺγ£γ¦γγηΎγ«ε₯οΏ½?θ¦γοΏ½?οΏ½?η΅ζγ葨瀺γγͺγγ¨γγγͺγε ΄εγ«ι
γγγ¨γγγγ¨γ§γγ
ε
·δ½ηγ«γ―γδΈ»γͺγγγ©γΌγγ³γΉοΏ½?ει‘γ―γε
₯εγγ£γΌγ«γγ«δ½γγε
₯εγγγγ³γ«γSlowList γζ°γγ props γεγεγγγοΏ½?γγͺγΌε
¨δ½γεγ¬γ³γγΌγγγγγε
₯εγγγγ€γζγγ«γͺγγ¨γγγγ¨γ§γγγοΏ½?γγγͺγ±γΌγΉγ§γ―γuseDeferredValue γδ½Ώγγγ¨γ§γε
₯εγγ£γΌγ«γοΏ½?ζ΄ζ°οΌιγγͺγγγ°γͺγγͺγοΌγη΅ζγͺγΉγοΏ½?ζ΄ζ°οΌι
γγ¦γ許γγγοΌγγγεͺε
γγγγ¨γε―θ½γ§γγ
function App() {
const [text, setText] = useState('');
const deferredText = useDeferredValue(text);
return (
<>
<input value={text} onChange={e => setText(e.target.value)} />
<SlowList text={deferredText} />
</>
);
}γγγ«γγ£γ¦ SlowList οΏ½?εγ¬γ³γγΌθͺδ½γι«ιεγγ¦γγγγγ§γ―γγγΎγγγγγγγReact γ«ε―Ύγγ¦γγͺγΉγοΏ½?εγ¬γ³γγΌγ―εͺε
εΊ¦γδΈγγ¦γθ―γγ¨δΌγγγγ¨γ§γγγΌγΉγγγΌγ―γγγγγ―γγͺγγγγ«γγΎγγγͺγΉγγ―ε
₯εγγ£γΌγ«γοΏ½?γεΎγθΏ½γγε½’γ«γͺγγγοΏ½?εΎγθΏ½γγ€γγΎγγγε
γ¨εζ§γ«γReact γ―γ§γγγ γζ©γγͺγΉγγζ΄ζ°γγγγ¨γγΎγγγγ¦γΌγΆοΏ½?ε
₯εγγγγγ―γγγγ¨γ―γͺγγͺγγΎγγ
δΎ 1/2: ι
ε»ΆγγγγͺγΉγοΏ½?εγ¬γ³γγΌ
γοΏ½?δΎγ§γ―γuseDeferredValue γε
₯εγγ¬γΉγγ³γ·γγ«δΏγ€ζΉζ³γη’Ίθͺγ§γγγγγSlowList γ³γ³γγΌγγ³γοΏ½?εγ’γ€γγ γδΊΊηΊηγ«ι
ε»Άγγγγγ¦γγΎγγε
₯εγγ£γΌγ«γγ«ε
₯εγγ¦γΏγ¦γγΉγ γΌγΉγ«ε
₯εγ§γγδΈζΉγ§γγͺγΉγγγγγγθΏ½γγγγγζ§εγη’Ίθͺγγ¦γγ γγγ
import { useState, useDeferredValue } from 'react'; import SlowList from './SlowList.js'; export default function App() { const [text, setText] = useState(''); const deferredText = useDeferredValue(text); return ( <> <input value={text} onChange={e => setText(e.target.value)} /> <SlowList text={deferredText} /> </> ); }
γγγ«ζ·±γη₯γ
γοΏ½?γγγͺγ·γγͺγͺγ«γγγ¦δ½Ώγ£γγγ¨γγγγγγγγͺγγγγγγζι©εζζ³γ 2 γ€γγγΎγγ
- γγγ¦γ³γΉ (debounce) γ―γγ¦γΌγΆγε ₯εγοΌδΎγγ° 1 η§ιοΌεζ’γγγΎγ§γͺγΉγοΏ½?ζ΄ζ°γεΎ γ€γ¨γγζε³γ§γγ
- γΉγγγγͺγ³γ° (throttling) γ―γδΈοΏ½?οΏ½οΏ½?ιιοΌδΎγγ°ζε€§γ§ 1 η§γ« 1 εοΌγ§γͺγΉγγζ΄ζ°γγγ¨γγζε³γ§γγ
γγγοΏ½?ζζ³γ―δΈι¨οΏ½?γ±γΌγΉγ§ε½Ήη«γ‘γΎγγγuseDeferredValue γ― React θͺδ½γ¨ζ·±γη΅±εγγγ¦γγγγ¦γΌγΆοΏ½?γγγ€γΉγ«ι©εΏγγγγγγ¬γ³γγΌοΏ½?ζι©εγ«γγι©γγ¦γγΎγγ
γγγ¦γ³γΉγγΉγγγγͺγ³γ°γ¨γ―η°γͺγγι ε»ΆγγγζιγεΊοΏ½?οΏ½γ§ιΈγΆεΏ θ¦γ―γγγΎγγγγ¦γΌγΆοΏ½?γγγ€γΉγιγε ΄εοΌδΎγγ°γγ―γγ«γͺγ©γγγγγοΌγι ε»Άγγγεγ¬γ³γγΌγ―γ»γΌε³εΊ§γ«θ‘γγγγγγζ°γ₯γγγΎγγγγ¦γΌγΆοΏ½?γγγ€γΉγι γε ΄εγγͺγΉγγ―γγγ€γΉοΏ½?ι γγ«ζ―δΎγγγγγ«ε ₯εγγγι γγγ¦γγγΎγγ
γΎγγγγγ¦γ³γΉγγΉγγγγͺγ³γ°γ¨γ―η°γͺγγuseDeferredValue γ«γγι
ε»Άγγγεγ¬γ³γγΌγ―γγγ©γ«γγ§δΈζε―θ½γ§γγγγγ―γReact γε€§γγͺγͺγΉγγεγ¬γ³γγΌγγ¦γγιδΈγ§γγ¦γΌγΆγε₯οΏ½?γγΌγΉγγγΌγ―γθ‘γγ¨γReact γ―γοΏ½?εγ¬γ³γγΌγζΎζ£γγγγΌγΉγγγΌγ―γε¦ηγγεγ³γγγ―γ°γ©γ¦γ³γγ§γ¬γ³γγΌγγγη΄γγγ¨γγζε³γ§γγε―Ύη
§ηγ«γγγγ¦γ³γΉγγΉγγγγͺγ³γ°οΏ½?εδ½γ―γγγγγ³γ°γ§γγγγγγγ―γδΈεΏ«γͺδ½ι¨γηγΏεΊγγΎγγγγγγ―γ¬γ³γγΌγγγΌγΉγγγΌγ―γγγγγ―γγγΏγ€γγ³γ°γεγ«ι
γγγ¦γγγ«ιγγͺγοΏ½?γ§γγ
ζι©εγγγγ¨γγ¦γγδ½ζ₯γγ¬γ³γγΌοΏ½?ζδΈγ«θ‘γγγγοΏ½?γ§γͺγε ΄εγγγγ¦γ³γΉγ¨γΉγγγγͺγ³γ°γ―δΎηΆγ¨γγ¦ζη¨γ§γγδΎγγ°γγγγγ―γΌγ―γͺγ―γ¨γΉγοΏ½?εζ°γζΈγγγγ¨γγ§γγΎγγγγγοΏ½?ζζ³γδΈη·γ«δ½Ώη¨γγγγ¨γγ§γγΎγγ