Upgrade to Pro — share decks privately, control downloads, hide ads and more …

マルチプラットフォーム(SwiftUI)ドキュメントアプリ

notoroid
January 27, 2021

 マルチプラットフォーム(SwiftUI)ドキュメントアプリ

2021年1月札幌iPhoneアプリ開発懇談会オンラン勉強会でのプレゼンテーション使用。
Appleのマルチプラットフォームアプリについてマルチプラットフォームとドキュメントアプリの観点から説明。Appleのドキュメントアプリのコアのアイデアが2004年から変わりがないのが難という話。

#SwiftUI #Swift #iOS #iPhoneApp #macOS #macOSApp #iPadOS #iPadApp

notoroid

January 27, 2021
Tweet

More Decks by notoroid

Other Decks in Programming

Transcript

  1. ϚϧνϓϥοτϑΥʔϜ
    4XJGU6*
    υΩϡϝϯτΞϓϦ
    υΩϡϝϯτΞϓϦςϯϓϨʔτͷ೺Ѳ·Ͱ͕௕͍

    View Slide

  2. ࣗݾ঺հ

    View Slide

  3. ೳొཁ !OPUPSPJE

    w J04ΞϓϦ։ൃऀ
    w ԰߸͍Γ·͢ిࢉاը
    w !OPUPSPJE
    w !JSJNBTV
    w ࠷ۙͷಈ޲
    w ϒϩά࡮৽͠·ͨ͠

    View Slide

  4. ॆిใࠂ͞Μ #BUUFSFDFJWFS

    w όοςϦʔϞχλʔ ϢʔςΟϦςΟʔ

    w ࠷େ୆ ࣮ػϦϞʔτ୆

    w ख࣋ͪͷJ1IPOF͔Βଞʹ͍࣋ͬͯΔ
    J1IPOF J1BEͳͲͷػثͷόοςϦʔঢ়ଶ֬
    ೝՄೳ
    w ࣗ୐ʹ͋ΔJ1IPOFͷόοςϦʔঢ়ଶ֬ೝՄ

    View Slide

  5. ॆిใࠂ͞Μ #BUUFSFDFJWFS

    w "QQMF8BUDIରԠ
    w $PNQMJDBUJPOTରԠ
    w ॆి׬ྃ௨஌
    w ॆి׬ྃΛ఻͑ͯ͘ΕΔ௨஌Λ௥Ճ
    w ҎԼʹࢦఆ͢Δ͜ͱͰόοςϦʔΛέ
    Ξ͢Δ͜ͱ͕Մೳ
    w Կ͔ͱߴ͍J1IPOFΛ௕࣋ͪͤ͞Δͷʹ༗༻

    View Slide

  6. ࿩͢͜ͱ
    w υΩϡϝϯτΞϓϦ֓ཁ
    w 6OJGPSN5ZQF*EFOUJ
    f
    i
    FS
    w 4XJGU޲͚υΩϡϝϯτ༻ϑϨʔϜϫʔΫ

    View Slide

  7. ࿩͞ͳ͍͜ͱ
    w 9DPEF͕ग़ྗ͢ΔυΩϡϝϯτΞϓϦςϯϓϨʔτղઆ
    w /4'JMF8SBQQFS
    w ύοέʔδܗࣜ΁ͷΞΫηε

    View Slide

  8. ୊໨
    w NVMUJQMBUGPSNͱ$BUBMZTU
    w υΩϡϝϯτΞϓϦͱ͍͏ϨτϩχϜ
    w NVMUJQMBUGPSNͰυΩϡϝϯτΞϓϦ
    w υΩϡϝϯτλΠϓͱ6OJGPSN5ZQF*EFOUJ
    f
    i
    FS
    w 6OJGPSN5ZQF*EFOUJ
    f
    i
    FSTGSBNFXPSL
    w NBD04ͱJ04ͷٕज़λΠϜϥΠϯ

    View Slide

  9. NVMUJQMBUGPSNͱ$BUBMZTU

    View Slide

  10. 88%$Ͱ4XJGU6*ͷϚϧνϓ
    ϥοτϑΥʔϜΞϓϦͷ։ൃ͕Մೳʹ

    View Slide

  11. ઌߦ͢Δ$BUBMZTUͱԿ͕ҧ͏

    View Slide

  12. $BUBMZTUͱNVMUJQMBUGPSNᶃ
    ൃද೥ 4%, JOGPQMJTU
    $BUBMZTU 6*,JU ͭ J04 NBD04ڞ༗

    NVMUJQMBUGPSN
    4XJGU6*

    6*,JU"QQ,JU J04 NBD04ͦΕͧΕ

    View Slide

  13. $BUBMZTUͱNVMUJQMBUGPSNᶄ
    w $BUBMZTU
    w J1BEΞϓϦΛNBD04্Ͱಈ͔͢͜ͱΛ໨ࢦ͢
    w <ܽ఺>$BUBMZTUͰ͸NBD04্Ͱ6*,JUػೳΛݺͼग़͠Ͱͷཹҙ఺͕ଟ͍
    w NVMUJQMBUGPSN 4XJGU6*

    w J04NBD04ͰιʔεͰ6*ؚΊڞ༗Ͱ͖Δίʔυ͸͋Δ͕ผΞϓϦ
    w <ܽ఺>֤ωΠςΟϒ6*ίʔυΛഉআͰ͖͕ͨύϥμΠϜγϑτͷӨڹେ

    View Slide

  14. NVMUJQMBUGPSNରԠGSBNFXPSL
    w ௨஌ 6TFS/PUJ
    f
    i
    DBUJPO

    w "7'BVOEBUJPO
    w $PSF*NBHF $PSF%BUB
    w 4QSJUF,JU 4DFOF,JU 4JSJ,JU
    w /4'JMF8SBQQFS
    w $PNCJOFGSBNFXPSL

    View Slide

  15. υΩϡϝϯτΞϓϦͱ͍͏
    ϨτϩχϜ

    View Slide

  16. ϨτϩχϜ SFUSPOZN

    ӳޠSFUSPOZN͋Δ͍͸࠶໋໊ͱ͸ɺ͋Δ
    ݴ༿ͷҙຯ͕࣌୅ͱͱ΋ʹ֦ு͞Εͨɺ͋
    Δ͍͸มԽͨ͠৔߹ʹɺݹ͍ҙຯͷൣғΛ
    ಛఆతʹදͨ͢Ίʹޙ͔ΒߟҊ͞Εͨݴ༿
    ͷ͜ͱΛࢦ͢ 8JLJQFEJB೔ຊޠ൛ΑΓ
    ɻ

    View Slide

  17. ΞϓϦέʔγϣϯͱ1$
    w Apple͕ૹΓग़͖ͯͨ͠ύʔιφϧίϯϐϡʔλʔ(1977ʙ)ͷਓؾΛࢧ͑ͯ
    ͖ͨͷ͸ɺ๛෋ͳΞϓϦέʔγϣϯ܈
    w 8JOEPXTʹ๛෋ͳΞϓϦέʔγϣϯͷ୅໊ࢺ͸ୣΘΕ͕ͨͦΕͰ΋ΫϦ
    ΤΠλʔ޲͚ͷΞϓϦ͸ࠓͰ΋๛෋

    View Slide

  18. ΞϓϦέʔγϣϯͱ1$ᶄ
    • iPhone஀ੜҎલͷΞϓϦέʔγϣϯ

    • σʔλϑΝΠϧ(υΩϡϝϯτ)Λฤू͢ΔϓϩάϥϜ͕ΞϓϦ(දܭࢉ,
    ϫʔυϓϩηοαʔ)

    • iPhone஀ੜҎޙͷΞϓϦ

    • ΞϓϦ͸৘ใڞ༗΍౤ߘͷπʔϧʹ(SNS, Message)

    View Slide

  19. ͔ͭͯͷΞϓϦ͸
    υΩϡϝϯτΞϓϦͱ໋໊

    View Slide

  20. 9DPEFͰ΋ΞϓϦͱ
    υΩϡϝϯτΞϓϦ
    ͸ผѻ͍ʹ

    View Slide

  21. NVMUJQMBUGPSN
    Ͱ
    υΩϡϝϯτΞϓϦ

    View Slide

  22. NVMUJQMBUGPSNɺ
    υΩϡϝϯτΞϓϦʹ͍ͭͯઆ໌

    View Slide

  23. NBD04#JHTVSͰ͸
    NVMUJQMBUGPSNͰ
    υΩϡϝϯτΞϓϦ͕։ൃՄೳʹ

    View Slide

  24. ͸ͨͯͦ͠Ε͸ྑ͍ࣄͮ͘Ί

    View Slide

  25. "QQMFʹͱͬͯ͸
    NBD04ͷఈ্͛ૂ͍

    View Slide

  26. J04ΞϓϦ։ൃऀʹͱͬͯ͸
    NBD04΁ΞϓϦΛల։Ͱ͖Δνϟϯε

    View Slide

  27. ࣮ࡍͷͱ͜Ζ

    View Slide

  28. iOS/macOSͰ͸ผΞϓϦͳͷͰ
    ιʔείʔυҎ֎ͷϦιʔε͕൥ࡶ
    Ϩτϩͳ։ൃϦιʔεͱͷ֨ಆʹͳΔ

    View Slide

  29. ͭͷJOGPQMJTU
    wґଘ৘ใ͕JOGPQMJTUʹूத
    wϝϯςφϯεੑ͸ͦͦ͜͜ѱ͍
    wΞϓϦ͕ѻ͏ϑΝΠϧछผఆٛ
    Λ04͝ͱهड़ඞཁ

    View Slide

  30. υΩϡϝϯτ͕

    w"QQMFͷϑΝΠϧछผఆ͕ٛ
    ݻͬ·ͬͨͷ͕೥Ͱυ
    Ωϡϝϯτߋ৽ͳ͠
    w88%$ʹ4XJGU޲͚ʹϑ
    ϨʔϜϫʔΫ௥Ճ

    View Slide

  31. υΩϡϝϯτΞϓϦʹؔ͢ΔࢿྉΛ
    8FC͔Β୳͚ͩ͢Ͱ೉ّ

    View Slide

  32. ͦ΋ͦ΋υΩϡϝϯτͷ
    ఆٛՕॴ͸Ͳ͜

    View Slide

  33. View Slide

  34. υΩϡϝϯτछผ
    ϑΝΠϧछผఆٛ
    ϑΝΠϧछผఆٛ
    63-4DIFNF
    NBD04ͷରԠαʔϏε

    View Slide

  35. υΩϡϝϯτछผ
    ϑΝΠϧछผఆٛ
    ϑΝΠϧछผఆٛ
    63-4DIFNF
    NBD04ͷରԠαʔϏε

    View Slide

  36. %PDVNFOU5ZQFT
    6OJGPSN5ZQF
    *EFOUJ
    f
    i
    FS
    5ZQFTͰ65*Λࢦఆ
    5ZQFTͰ65*Λࢦఆ

    View Slide

  37. υΩϡϝϯτλΠϓͱ
    6OJGPSN5ZQF*EFOUJ
    f
    i
    FS

    View Slide

  38. υΩϡϝϯτλΠϓ %PDVNFOU5ZQFT

    w ΞϓϦ͕ରԠ͢ΔυΩϡϝϯτछผΛهड़
    w υΩϡϝϯτछผ͸ෳ਺ࢦఆՄೳ
    w 5ZQFTʹ߹க͢ΔϑΝΠϧσʔλछผΛࢦఆ͢Δ
    w 65*Λࢦఆ͢ΔɺΧϯϚ۠੾ΓͰ65*Λ૊Έ߹ΘͤΔ͜ͱ͕Ͱ͖Δ
    w )BOEMFSυΩϡϝϯτʹର͢ΔΞϓϦͷཱͪճΓΛࢦఆ

    View Slide

  39. View Slide

  40. 6OJGPSN5ZQF*EFOUJ
    f
    i
    FS
    w ೥ࡦఆ
    w %PDVNFOU5ZQFͰࢦఆ͢Δ
    w 04ʹϑΝΠϧσʔλछผͷ੔ཧͷͨΊʹಋೖ
    w ΞϓϦ͕Πϯετʔϧ͞ΕΔ͜ͱͰϑΝΠϧσʔλఆ͕ٛ૿Ճ
    w ૿Ճ͢ΔϑΝΠϧσʔλఆٛΛద੾ʹ෼ྨɺࣝผͷͨΊʹࡦఆ

    View Slide

  41. 6OJGPSN5ZQF*EFOUJ
    f
    i
    FS֓ཁ
    w "QQMFͷϑΝΠϧσʔλఆٛ
    w ֊૚ߏ଄Ͱ؅ཧ͞Ε͍ͯΔ
    w ̎छ &YQPSUFE5ZQF*EFOUJ
    f
    i
    FSTͱ*NQPSUFE5ZQF*EFOUJ
    f
    i
    FST

    w &YQPSUFEʙ͸ΞϓϦಠࣗͷϑΝΠϧσʔλܗࣜΛࢦఆ
    w *NQPSUFE͸ΞϓϦಠࣗҎ֎ͷϑΝΠϧσʔλܗࣜΛࢦఆ

    View Slide

  42. 6OJGPSN5ZQF*EFOUJ
    f
    i
    FS֓ཁ
    w "QQMFͷϑΝΠϧσʔλఆٛ
    w ֊૚ߏ଄Ͱ؅ཧ͞Ε͍ͯΔ
    w ̎छ &YQPSUFE5ZQF*EFOUJ
    f
    i
    FSTͱ*NQPSUFE5ZQF*EFOUJ
    f
    i
    FST

    w &YQPSUFEʙ͸ΞϓϦಠࣗͷϑΝΠϧσʔλܗࣜΛࢦఆ
    w *NQPSUFE͸ΞϓϦಠࣗҎ֎ͷϑΝΠϧσʔλܗࣜΛࢦఆ

    View Slide

  43. 65*ͷ֊૚ߏ଄

    View Slide

  44. 65*ͷ֊૚ߏ଄
    ෺ཧ໘ͷ֊૚ߏ଄
    ػೳ໘ͷ֊૚ߏ଄

    View Slide

  45. 65*ͷ֊૚ߏ଄
    ෺ཧ໘ͷ֊૚ߏ଄
    ػೳ໘ͷ֊૚ߏ଄

    View Slide

  46. 65*ͷ֊૚ߏ଄
    ෺ཧ໘ͷ֊૚ߏ଄
    ػೳ໘ͷ֊૚ߏ଄
    QVCMJDKQFHɺQVCMJDUJ
    f
    f
    ͸ػೳ໘ͱ෺ཧ໘ͷ྆ํΛܧঝ

    View Slide

  47. ଟॏܧঝͰϑΝΠϧσʔλఆٛΛ
    ࣮ݱ͓ͯ͠ΓҰݟ೺Ѳͮ͠Β͍

    View Slide

  48. ೥͝ΖͷΦϒδΣΫτࢦ޲
    ϓϩάϥϛϯάͷߟ͑Ͱ࡞ͬͨײ

    View Slide

  49. ࣮ࡍͷ࢖͍ํ

    View Slide

  50. ͳΒ͹$PU&EJUPSΛ
    ࢀߟʹ͠Α͏

    View Slide

  51. $PU&EJUPS
    w ΦʔϓϯιʔεͷςΩετΤσΟλʔΞϓϦ
    w Ҏ্ͷϑΝΠϧʹରԠ
    w IUUQTHJUIVCDPNDPUFEJUPS$PU&EJUPS
    w 65*ʹ͍ͭͯ΋&YQPSUFE *NQPSUFEͷͦΕ
    ͧΕͷఆٛ͋Γ

    View Slide

  52. 6OJGPSN5ZQF*EFOUJ
    f
    i
    FST
    GSBNFXPSL

    View Slide

  53. ͜͜·ͰυΩϡϝϯτΞϓϦΛ
    ࢼͯ͠Έ͍ͨΈ͍ͨͳ࿩ʹͳ͍ͬͯͳ͍

    View Slide

  54. ͳͥ

    View Slide

  55. JOGPQMJTU͸04ʹఏڙ͢Δ৘ใͱ
    ΞϓϦ͕࢖͏৘ใؚ͕·ΕΔ

    View Slide

  56. %PDVNFOU5ZQFT 65*Tͷ༻్
    04 ΞϓϦ
    ಛఆͷ֦ுࢠ෇͖
    ϑΝΠϧΛ։͖͍ͨ
    w ϑΝΠϧΛλοϓͨ͠ͱ͖ʹىಈ
    ͢ΔΞϓϦΛಛఆ͍ͨ͠
    w ϑΝΠϧ։͚ΔީิΛग़͍ͨ͠
    w ϑΝΠϧͷΞΠίϯϓϨϏϡʔ
    ΞΠίϯΛද͍ࣔͨ͠
    w )BOEP
    f
    f
    Մೳ͔
    w FUD

    View Slide

  57. %PDVNFOU5ZQFT 65*Tͷ༻్
    04 ΞϓϦ
    ಛఆͷ֦ுࢠ෇͖
    ϑΝΠϧΛ։͖͍ͨ
    w ϑΝΠϧΛλοϓͨ͠ͱ͖ʹىಈ
    ͢ΔΞϓϦΛಛఆ͍ͨ͠
    w ϑΝΠϧ։͚ΔީิΛ;΍͍ͨ͠
    w ϑΝΠϧͷΞΠίϯϓϨϏϡʔ
    ΞΠίϯΛද͍ࣔͨ͠
    w FUD
    04ͷڍಈ͸ஔ͍͓͍ͯͯ
    υΩϡϝϯτϑΝΠϧΛ։
    ͖͍ͨ

    View Slide

  58. ໰୊Λղܾ͢ΔϑϨʔϜϫʔΫ
    ͕J04 NBD04Ͱ௥Ճ

    View Slide

  59. 6OJGPSN5ZQF*EFOUJ
    f
    i
    FSTGSBNFXPSL
    w NVMUJQMBUGPSNϑϨʔϜϫʔΫ
    w 4XJGUͷΈରԠ ࣮࣭NVMUJQMBUGPSNͰ͔͠࢖͍ͬͯͳ͍

    w υΩϡϝϯτΞϓϦͰѻ͏ϑΝΠϧσʔλఆٛΛࢦఆՄೳ
    w 65*΍֦ுࢠͰϑΟϧσʔλఆٛࢦఆՄೳ
    w Α͘࢖͏ϑΝΠϧͷϓϦηοτఆٛ͋Γ
    w υΩϡϝϯτͰಡΈࠐΈՄೳͳϑΝΠϧσʔλఆٛΛ65*΋͘͠͸ؔ࿈৘ใͰࢦ
    ఆՄೳ ֦ுࢠͳͲ

    View Slide

  60. υΩϡϝϯτΞϓϦͰಡΈࠐΉϑΝΠϧΛࢦఆ͢Δᶃ
    import SwiftUI


    import UniformTypeIdentifiers


    extension UTType {


    static var exampleText: UTType {


    UTType(importedAs: "com.example.plain-text")


    }


    }


    struct FooDocumentAppDocument: FileDocument {





    // ࢲతܗࣜΛࢦఆ


    static var readableContentTypes: [UTType] { [.exampleText] }





    }

    View Slide

  61. υΩϡϝϯτΞϓϦͰಡΈࠐΉϑΝΠϧΛࢦఆ͢Δᶄ
    import SwiftUI


    import UniformTypeIdentifiers


    struct FooDocumentAppDocument: FileDocument {





    // ϓϨʔϯςΩετΛࢦఆ


    static var readableContentTypes: [UTType] { [.plainText] }





    }

    View Slide

  62. υΩϡϝϯτΞϓϦͰಡΈࠐΉϑΝΠϧΛࢦఆ͢Δᶃ
    import SwiftUI


    import UniformTypeIdentifiers


    extension UTType {


    static var nekonekoDocument: UTType {


    UTType(importedAs: "com.nekoneko.document")


    }


    }


    struct FooDocumentAppDocument: FileDocument {





    // ଘࡏ͠ͳ͍UTI͸ϥϯϥΠϜΤϥʔͱͳΔ


    static var readableContentTypes: [UTType] { [.nekonekoDocument] }





    }

    View Slide

  63. %DVNFOU5ZQFT 65*ʹৼΓճ͞ΕΔ
    υΩϡϝϯτΞϓϦ։ൃ͕Ұ෦վળ
    ͨͩ͠NVMUJQMUGPSN 4XJGU6*
    ͷΈ

    View Slide

  64. NBD04ͱJ04ͷٕज़
    λΠϜϥΠϯ

    View Slide

  65. ͔͜͜Β͸ࢲݟ

    View Slide



  66. NBD04 J04
    $PSF%BUB
    $PSF"OJNBUJPO
    $PSF*NBHF
    NBD04
    NVMUJQMBUGPSN
    J04 J1BE04
    "7'PVOEBUJPO
    4XJGU6*
    6TFS/PUJ
    f
    i
    DBUJPOT
    4DFOF,JU 4QSJUF,JU
    4JSJ,JU
    4JSJ,JU
    "VUJP5PPM#PY
    5JHFS
    -FPQBSE

    65*

    View Slide



  67. NBD04 J04
    $PSF%BUB
    $PSF"OJNBUJPO
    $PSF*NBHF
    NBD04
    NVMUJQMBUGPSN
    J04 J1BE04
    "7'PVOEBUJPO
    4XJGU6*
    6TFS/PUJ
    f
    i
    DBUJPOT
    4DFOF,JU 4QSJUF,JU
    4JSJ,JU
    4JSJ,JU
    "VUJP5PPM#PY
    5JHFS
    -FPQBSE

    65*

    View Slide

  68. υΩϡϝϯτఆٛ͸೥ͷ
    ݟͨ໨Ͱ࢒Γଓ͚ͨ

    View Slide

  69. ೥Ҏ߱"QQMF͕
    NBD04΁ͷ͞ΒͳΔఈ্͛Ͱ
    ϑΝΠϧఆٛͷܗ΋มΘΔ͔΋

    View Slide

  70. ·ͱΊ
    w NVMUJQMBUGPSNͱDBUBMZTUʹ͍ͭͯઆ໌͠·ͨ͠
    w υΩϡϝϯτΞϓϦͷ੒Γཱͪʹ͍ͭͯઆ໌͠·ͨ͠
    w .VMUJQMBUGPSNͱυΩϡϝϯτΞϓϦͷ૊Έ߹Θͤ͸൥ࡶͩͬͨΓ
    ೥ͷυΩϡϝϯτ͔͠ͳ͍ͳͲલ్ଟ೉Ͱ͢

    View Slide

  71. ࢀߟ৘ใ

    View Slide

  72. w 6OJGPSN5ZQF*EFOUJ
    f
    i
    FS"QQMFެࣜ
    w IUUQTEFWFMPQFSBQQMFDPNMJCSBSZBSDIJWFEPDVNFOUBUJPO(FOFSBM$PODFQUVBM
    %FW1FEJB$PDPB$PSF6OJGPSN5ZQF*EFOUJ
    f
    i
    FSIUNM
    w .BD΍J04ͰϑΝΠϧͷछྨΛදࣝ͢ผࢠ6OJGPSN5ZQF*EFOUJ
    f
    i
    FSTΛ֦ுࢠ͔Βௐ΂Δ 4XJGUͰ
    ߦͰग़དྷΔ
    OJXBUBLPͷ͸ͯͳϒϩά
    w IUUQTOJXBUBLPIBUFOBCMPHKQFOUSZ
    w ࠓ͔Β͸͡ΊΔυΩϡϝϯτϕʔε"QQ2JJUB
    w IUUQTRJJUBDPNHBDIBMBUUFJUFNTCBDCFCE
    w HBDIBMBUUF%PDVNFOU#BTFE"QQ
    w IUUQTHJUIVCDPNHBDIBMBUUF%PDVNFOU#BTFE"QQ

    View Slide

  73. w 4XJGU6*ͰυΩϡϝϯτϕʔεͷ"QQΛߏங͢Δ
    w IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
    w ๩͍͠ਓ޲͚ͷ#VJMEEPDVNFOUCBTFEBQQTJO4XJGU6*88%$
    ʛτϏʛOPUF
    w IUUQTOPUFDPNUPCJOOECDC
    w 6OJGPSN5ZQF*EFOUJ
    f
    i
    FSͷ࠶ಋೖ88%$
    w IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZUFDIUBMLT

    View Slide

  74. w $PU&
    f
    i
    UPS
    w IUUQTHJUIVCDPNDPUFEJUPS$PU&EJUPS
    w %PDVNFOU1BDLBHFT
    w IUUQTEFWFMPQFSBQQMFDPNMJCSBSZBSDIJWFEPDVNFOUBUJPO$PSF'PVOEBUJPO
    $PODFQUVBM$'#VOEMFT%PDVNFOU1BDLBHFT%PDVNFOU1BDLBHFTIUNM
    [email protected]$)48
    w 6OJGPSN5ZQF*EFOUJ
    f
    i
    FS$PODFQUT
    w IUUQTEFWFMPQFSBQQMFDPNMJCSBSZBSDIJWFEPDVNFOUBUJPO'JMF.BOBHFNFOU
    $PODFQUVBMVOE[email protected]@[email protected]@[email protected]

    View Slide

  75. IUUQTJSJNBTVDPN
    <13>#MPHਵ࣌౤ߘத

    View Slide