Slide 1

Slide 1 text

㸣Ⰻח椚鍑׃׋孡חז׷ ,PUMJO$PSPVUJOFT UBLBIJSPN

Slide 2

Slide 2 text

˖ UBLBIJSPN !OFX@SVOOBCMF דׅկ ˖ 劤せכ嬁「䃨峔 ׭׿ׄױ׋ַמ׹ דׅկ ˖ "OESPJEָ㥨ֹדׅ ˖ "CFNB57ך"OESPJE،فٔ׾⡲׏גְתׅկ ˖ 2JJUBח׮剅ְ׋ךדծ׉׸׾鋅זָ׵耀ְג ֻ׌ְׁկ ˖ IUUQTRJJUBDPNUBLBIJSPNJUFNT CBBEDDGCB 荈ⴓחאְג

Slide 3

Slide 3 text

$PSPVUJOFTך 椚鍑ָꨇ׃ְ

Slide 4

Slide 4 text

⢪׻׸׷$PSPVUJOFTך"1*

Slide 5

Slide 5 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI

Slide 6

Slide 6 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD

Slide 7

Slide 7 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU

Slide 8

Slide 8 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU

Slide 9

Slide 9 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU

Slide 10

Slide 10 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM

Slide 11

Slide 11 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO

Slide 12

Slide 12 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF

Slide 13

Slide 13 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS

Slide 14

Slide 14 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE

Slide 15

Slide 15 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE

Slide 16

Slide 16 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6*

Slide 17

Slide 17 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS

Slide 18

Slide 18 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM

Slide 19

Slide 19 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM ˖ 4FOE$IBOOFM

Slide 20

Slide 20 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM ˖ 4FOE$IBOOFM ˖ 3FDFJWF$IBOOFM

Slide 21

Slide 21 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM ˖ 4FOE$IBOOFM ˖ 3FDFJWF$IBOOFM ˖ BDUPS

Slide 22

Slide 22 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM ˖ 4FOE$IBOOFM ˖ 3FDFJWF$IBOOFM ˖ BDUPS ˖ SVO#MPDLJOH

Slide 23

Slide 23 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM ˖ 4FOE$IBOOFM ˖ 3FDFJWF$IBOOFM ˖ BDUPS ˖ SVO#MPDLJOH ˖ KPJO

Slide 24

Slide 24 text

⢪׻׸׷$PSPVUJOFTך"1* ˖ MBVODI ˖ BTZOD ˖ BXBJU ˖ XJUI$POUFYU ˖ $PSPVUJOF$POUFYU ˖ $PNNPO1PPM ˖ $POUJOVBUJPO ˖ TVTQFOE$PSPVUJOF ˖ $PSPVUJOF%JTQBUDIFS ˖ %FGFSSFE ˖ 6ODPOOFE ˖ BOESPJE6* ˖ %FGBVMU%JTQBUDIFS ˖ 3FOEF[WPVT$IBOOFM ˖ 4FOE$IBOOFM ˖ 3FDFJWF$IBOOFM ˖ BDUPS ˖ SVO#MPDLJOH ˖ KPJO ˖ 

Slide 25

Slide 25 text

㢳ְ

Slide 26

Slide 26 text

ת׆כ㛇劤涸זהֿ׹ַ׵ ׍ׯ׿ה椚鍑׃׋ְ

Slide 27

Slide 27 text

MBVODI launch { println("thread:"+Thread.currentThread()) } MBVODIדDPSPUVJOF׾饯⹛ׅ׷

Slide 28

Slide 28 text

MBVODI launch { println("thread:"+Thread.currentThread()) } thread:Thread[ForkJoinPool.commonPool-worker-2,5,main] MBVODIדDPSPUVJOF׾饯⹛ׅ׷

Slide 29

Slide 29 text

MBVODI launch { println("thread:"+Thread.currentThread()) } thread:Thread[ForkJoinPool.commonPool-worker-2,5,main] ֿ̓ך5ISFBEכוַֿ׵勻׋ MBVODIדDPSPUVJOF׾饯⹛ׅ׷

Slide 30

Slide 30 text

MBVODI launch { println("thread:"+Thread.currentThread()) } thread:Thread[ForkJoinPool.commonPool-worker-2,5,main] MBVODIדDPSPUVJOF׾饯⹛ׅ׷ MBVODIך⚥׾鋅ח遤ֲֿ

Slide 31

Slide 31 text

MBVODI ך⚥魦 public fun launch( context: CoroutineContext = DefaultDispatcher, start: CoroutineStart = CoroutineStart.DEFAULT, parent: Job? = null, onCompletion: CompletionHandler? = null, block: suspend CoroutineScope.() -> Unit ): Job { 㹋כ$PSPVUJOF$POUFYUד㹋遤ׅ׷5ISFBEָ寸ת׷

Slide 32

Slide 32 text

MBVODI ך$PSPVUJOF$POUFYU public fun launch( context: CoroutineContext = DefaultDispatcher, start: CoroutineStart = CoroutineStart.DEFAULT, parent: Job? = null, onCompletion: CompletionHandler? = null, block: suspend CoroutineScope.() -> Unit ): Job { 䒷侧ך$PSPVUJOF$POUFYUכرؿٕؓزד%FGBVMU%JTQBUDIFS 植朐כ%FGBVMU%JTQBUDIFSכ$PNNPO1PPM public val DefaultDispatcher: CoroutineDispatcher = CommonPool

Slide 33

Slide 33 text

MBVODI ך$PSPVUJOF$POUFYU public fun launch( context: CoroutineContext = DefaultDispatcher, start: CoroutineStart = CoroutineStart.DEFAULT, parent: Job? = null, onCompletion: CompletionHandler? = null, block: suspend CoroutineScope.() -> Unit ): Job { $PNNPO1PPM public val DefaultDispatcher: CoroutineDispatcher = CommonPool

Slide 34

Slide 34 text

MBVODI ד⢪׻׸גְ׷ $PNNPO1PPM object CommonPool : CoroutineDispatcher() { override fun dispatch( context: CoroutineContext, block: Runnable ) = try { (pool ?: getOrCreatePoolSync()).execute(timeSource.trackTask(block)) } … $PNNPO1PPMך EJTQBUDIًاحسָㄎל׸׷

Slide 35

Slide 35 text

MBVODI ד⢪׻׸גְ׷ $PNNPO1PPM object CommonPool : CoroutineDispatcher() { override fun dispatch( context: CoroutineContext, block: Runnable ) = try { (pool ?: getOrCreatePoolSync()).execute(timeSource.trackTask(block)) } … 5ISFBE1PPMָזֽ׸ל⡲׶ծFYFDVUFׅ׷׌ֽ

Slide 36

Slide 36 text

知⽃ז
 %JTQBUDIFS׾⡲׏ג׫׷

Slide 37

Slide 37 text

鑐׃ח$PSPVUJOF%JTQBUDIFS׾
 ⡲׏ג׫׷ class MyDispatcher : CoroutineDispatcher() { override fun dispatch(context: CoroutineContext, block: Runnable) { println("dispatch:before") block.run() println("dispatch:after") } } launch(MyDispatcher()) { println("thread:"+Thread.currentThread()) } $PSPVUJOF%JTQBUDIFS׾竰䪫׃׋ؙٓأ׾⡲׷

Slide 38

Slide 38 text

鑐׃ח$PSPVUJOF%JTQBUDIFS׾
 ⡲׏ג׫׷ class MyDispatcher : CoroutineDispatcher() { override fun dispatch(context: CoroutineContext, block: Runnable) { println("dispatch:before") block.run() println("dispatch:after") } } launch(MyDispatcher()) { println("thread:"+Thread.currentThread()) } 荈ⴓד⡲׏׋%JTQBUDIFS׾䭷㹀ׅ׷

Slide 39

Slide 39 text

鑐׃ח$PSPVUJOF%JTQBUDIFS׾
 ⡲׏ג׫׷ class MyDispatcher : CoroutineDispatcher() { override fun dispatch(context: CoroutineContext, block: Runnable) { println("dispatch:before") block.run() println("dispatch:after") } } launch(MyDispatcher()) { println("thread:"+Thread.currentThread()) } EJTQBUDIًاحس׾㹋鄲׃ג׫׷

Slide 40

Slide 40 text

class MyDispatcher : CoroutineDispatcher() { override fun dispatch(context: CoroutineContext, block: Runnable) { println("dispatch:before") block.run() println("dispatch:after") } } launch(MyDispatcher()) { println("thread:"+Thread.currentThread()) } EJTQBUDICFGPSF UISFBE5ISFBE EJTQBUDIBGUFS ׉ךתתךأٖحسד 㹋遤דֹ׋

Slide 41

Slide 41 text

$PSPVUJOFT׏ג5ISFBEה ずׄדכ

Slide 42

Slide 42 text

$PSPVUJOFTחכ
 ⚥倖ָ֮׷

Slide 43

Slide 43 text

⚥倖 class MyDispatcher : CoroutineDispatcher() { val executor = Executors.newSingleThreadExecutor() override fun dispatch(context: CoroutineContext, block: Runnable) { executor.execute { println("dispatch:before") block.run() println("dispatch:after") } } } launch(MyDispatcher()) { println("1:" + Thread.currentThread()) suspendCoroutine { continuation -> thread { // ී௨ʹthreadΛ࡞࣮ͬͯߦ͢Δ // தஅ͞ΕͨCoroutinesΛ࠶։͢Δ continuation.resume("test") } } println("2:" + Thread.currentThread()) } 㹋ꥷך⹛ֹח
 さ׻ׇ׷׋׭ ➙㔐ך⢽דכ FYFDVUPS׾⢪ֲ

Slide 44

Slide 44 text

class MyDispatcher : CoroutineDispatcher() { val executor = Executors.newSingleThreadExecutor() override fun dispatch(context: CoroutineContext, block: Runnable) { executor.execute { println("dispatch:before") block.run() println("dispatch:after") } } } launch(MyDispatcher()) { println("1:" + Thread.currentThread()) suspendCoroutine { continuation -> thread { // ී௨ʹthreadΛ࡞࣮ͬͯߦ͢Δ // தஅ͞ΕͨCoroutinesΛ࠶։͢Δ continuation.resume("test") } } println("2:" + Thread.currentThread()) } TVTQFOE$PSPVUJOF ׾⢪ֲה DPSPVUJOFT⚥倖דֹ׷

Slide 45

Slide 45 text

class MyDispatcher : CoroutineDispatcher() { val executor = Executors.newSingleThreadExecutor() override fun dispatch(context: CoroutineContext, block: Runnable) { executor.execute { println("dispatch:before") block.run() println("dispatch:after") } } } launch(MyDispatcher()) { println("1:" + Thread.currentThread()) suspendCoroutine { continuation -> thread { // ී௨ʹthreadΛ࡞࣮ͬͯߦ͢Δ // தஅ͞ΕͨCoroutinesΛ࠶։͢Δ continuation.resume("test") } } println("2:" + Thread.currentThread()) } SFTVNF ׾⢪ֲהⱄꟚדֹ׷

Slide 46

Slide 46 text

override fun dispatch(context: CoroutineContext, block: Runnable) executor.execute { println("dispatch:before") block.run() println("dispatch:after") } } } launch(MyDispatcher()) { println("1:" + Thread.currentThread()) suspendCoroutine { continuation -> thread { // ී௨ʹthreadΛ࡞࣮ͬͯߦ͢Δ // தஅ͞ΕͨCoroutinesΛ࠶։͢Δ continuation.resume("test") } } println("2:" + Thread.currentThread()) } ⚥倖⵸ה⚥倖䖓ךⱄꟚד 㔐5ISFBE1PPMד 㹋遤ׁ׸גְ׷ EJTQBUDICFGPSF 5ISFBE EJTQBUDIBGUFS ͜͜ͰҰ౓தஅ EJTQBUDICFGPSF 5ISFBE EJTQBUDIBGUFS

Slide 47

Slide 47 text

"OESPJEד 㹋ꥷוֲ⢪ֲ

Slide 48

Slide 48 text

launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } "1*ַ׵《䖤׃גծ׉ךⰻ㺁׾4OBDLCBSח⳿ׅ⢽

Slide 49

Slide 49 text

launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } "1*ַ׵《䖤׃גծ׉ךⰻ㺁׾4OBDLCBSח⳿ׅ⢽ 6*ծծ

Slide 50

Slide 50 text

val UI = HandlerContext(Handler(Looper.getMainLooper()), “UI") public class HandlerContext( private val handler: Handler, private val name: String? = null ) : CoroutineDispatcher(), Delay { … override fun dispatch(context: CoroutineContext, block: Runnable) { handler.post(block) } launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } "OESPJEך)BOEMFS׾⡲׷

Slide 51

Slide 51 text

val UI = HandlerContext(Handler(Looper.getMainLooper()), “UI") public class HandlerContext( private val handler: Handler, private val name: String? = null ) : CoroutineDispatcher(), Delay { … override fun dispatch(context: CoroutineContext, block: Runnable) { handler.post(block) } launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } "OESPJEך)BOEMFSחQPTUׅ׷׌ֽ

Slide 52

Slide 52 text

launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action", null).show() }

Slide 53

Slide 53 text

launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } GFUDI ך⚥כ

Slide 54

Slide 54 text

launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } Api.kt interface ApiSearvice { @GET("/") fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"): Deferred } val service = retrofit.create(ApiSearvice::class.java) suspend fun fetch(): Response { return service.fetchDeferrd().await() } 3FUSPUח״׷㹋鄲

Slide 55

Slide 55 text

launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } Api.kt interface ApiSearvice { @GET("/") fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"): Deferred } val service = retrofit.create(ApiSearvice::class.java) suspend fun fetch(): Response { return service.fetchDeferrd().await() } SFUSPULPUMJODPSPVUJOFTBEBQUFS׾⢪ֲה
 %FGFSSFE׾鵤ׅ

Slide 56

Slide 56 text

launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } Api.kt interface ApiSearvice { @GET("/") fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"): Deferred } val service = retrofit.create(ApiSearvice::class.java) suspend fun fetch(): Response { return service.fetchDeferrd().await() } %FGFSSFEכBXBJU ׅ׷ֿהד穠卓׾《䖤דֹ׷ BXBJU ׾ㄎעֿהדDPSPVUJOFTָ⚥倖׃גծ 0L)UUQך鸐⥋أٖحسד《䖤׃גծ 《䖤דֹ如痥ⱄꟚׅ׷կ

Slide 57

Slide 57 text

launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } Api.kt interface ApiSearvice { @GET("/") fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"): Deferred } val service = retrofit.create(ApiSearvice::class.java) suspend fun fetch(): Response { return service.fetchDeferrd().await() } TVTQFOEًاحس׾⢪ֲהծ BXBJU ׾剅ַ׆חず劍涸ח《䖤׃גְ׷״ֲח剅ֽ׷ ,PUMJOךط؎ذ؍ـזأة؎ٕכֿך剅ֹ倯 ˖ IUUQTHJUIVCDPN,PUMJOLPUMJODPSPVUJOFTCMPCNBTUFSLPUMJODPSPVUJOFTJOGPSNBMNEBTZODISPOPVTQSPHSBNNJOHTUZMFT

Slide 58

Slide 58 text

launch(UI) { val response = api.fetch() Snackbar.make(view, "code:${response.code}", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } Api.kt interface ApiSearvice { @GET("/") fun fetchDeferrd(@Query("zipcode") zipCode: String = "1000000"): Deferred } val service = retrofit.create(ApiSearvice::class.java) suspend fun fetch(): Response { return service.fetchDeferrd().await() } TVTQFOEًاحس׾⢪ֲ׋׭ח׻ׂ׻ׂٓحف׃גְ׷ ˖ IUUQTHJUIVCDPN,PUMJOLPUMJODPSPVUJOFTCMPCNBTUFSLPUMJODPSPVUJOFTJOGPSNBMNEBTZODISPOPVTQSPHSBNNJOHTUZMFT

Slide 59

Slide 59 text

׌ְ׋ְ椚鍑דֹ׋

Slide 60

Slide 60 text

תה׭ ˖ $PSPVUJFOTכ5ISFBE♳ד⹛ֻծ⹛ֹכ然钠דֹ׷ ˖ ⚥倖ָדֹגⱄꟚָדֹ׷ ˖ TVTQFOE׾⢪׏׋剅ֹ倯ד剅ְגְֻ