Slide 1

Slide 1 text

#JUDPJO$PSFWϨϏϡʔͱ CJUDPJOSCϋϯζΦϯ ೥݄೔ ೔ຊ҉߸௨՟Ϣʔβձɹখᔹप 4IV,PCVDIJ

Slide 2

Slide 2 text

ࣗݾ঺հ খᔹपɹ4IV,PCVDIJɹ!TIV@LPCTIVLPCVDIJ ෱Ԭݝ൧௩ࢢੜ·Εɹฌݿݝ੢ٶࢢɾๅ௩ࢢҭͪ ਆށେֶւࣄՊֶ෦ଔۀ ಸྑઌ୺Պֶٕज़େֶӃେֶ৘ใՊֶݚڀՊम࢜ྃ ৽ଔͰՈిϝʔΧʔͰιϑτ΢ΣΞ։ൃ ͦͷޙ4*FSͰͷडୗ։ൃ౳ લ൒େࡕͷϕϯνϟʔͰ#JUDPJO8FC8BMMFUࢼ࡞඼։ൃ ʙ*5ϕϯμʔͷେࡕࢧࣾʹೖࣾ͠4& ʙϒϩοΫνΣʔϯͷاը౳ਪਐͷͨΊ౦ژຊࣾసۈ ʙϑϨηοπͷγχΞιϑτ΢ΣΞΤϯδχΞ w Ծ૝௨՟ࣄۀऀ޲͚΢ΥϨοτ։ൃͷޙɺݱࡏ͸อकɾӡ༻Λ୲౰ 2

Slide 3

Slide 3 text

ίϛϡχςΟ঺հ ೔ຊ҉߸௨՟ϢʔβձɹIUUQTDSZQUPDVSSFODZDPOOQBTTDPN ʮϏοτίΠϯͱ͔ษڧձʯʢ݄̍ճɿฏ೔໷ʣ w ࣍ճ͸೥݄ௐ੔த ʮ҉߸௨՟ಡॻձʯʢ݄̍ճɿฏ೔໷ʣ w ࣍ճ͸೥݄ௐ੔த DSBTIBDBEFNZ *5ܥಈը഑৴ ʹͯϏοτίΠϯͱ͔ษڧձͷΞʔΧΠϒ഑৴த
 IUUQTDSBTIBDBEFNZDPNNVOJUZDSZQUPDVSSFODZ :PV5VCFνϟϯωϧʢษڧձʗಡॻձʣIUUQCJUMZZPVUVCFDDTUVEZ 3

Slide 4

Slide 4 text

(#&$ (P#MPDLDIBJO&OHJOFFSJOH$PNNVOJUZ IUUQTHPCMPDLDIBJOOFUXPSL ίʔυΛॻ͘͜ͱ͚͕ͩ#MPDLDIBJOΛਐԽͤ͞Δ ʮಈըͰֶͿϒϩοΫνΣʔϯʯͳͲίϯςϯπ๛෋ ݄ ໷ʹ)BTI)VCͰ.FFUVQ 4

Slide 5

Slide 5 text

ϏοτίΠϯ͸Φʔϓϯιʔε ϏοτίΠϯ #JUDPJO ͸Φʔϓϯιʔε ୭Ͱ΋։ൃʹࢀՃՄೳʂ
 IUUQTHJUIVCDPNCJUDPJOCJUDPJO ϏοτίΠϯΛ͸͡Ίɺ҉߸௨՟ɾϒϩοΫνΣʔϯͷଟ͘͸044 ٕज़తʹ΋໘ന͍ʂʂ ϥΠτίΠϯ -JUFDPJO ͸#JUDPJOͷιʔείʔυ͔ΒϑΥʔΫ
 IUUQTHJUIVCDPNMJUFDPJOQSPKFDUMJUFDPJO ϞφίΠϯ .POBDPJO ͸-JUFDPJOͷιʔείʔυ͕ϕʔε
 IUUQTHJUIVCDPNNPOBDPJOQSPKFDUNPOBDPJO ΠʔαϦΞϜ &UIFSFVN ΋Φʔϓϯιʔε
 IUUQTHJUIVCDPNFUIFSFVNHPFUIFSFVN 5

Slide 6

Slide 6 text

ΞδΣϯμ #JUDPJO$PSFʹ͍ͭͯগ͠ 3FHUFTUϞʔυͰϋϯζΦϯ #JUDPJO$PSFW CJUDPJOSCϋϯζΦϯ ࣍ճ݄͸#JUDPJO$PSFCJUDPJOSC3VCZPO3BJMTͰΞϓϦ։ൃ 6

Slide 7

Slide 7 text

8JOEPXTͷํͷࣄલ४උ 8JOEPXTͷํ͸6CVOUVΛΠϯετʔϧ͍ͯͩ͘͠͞ IUUQTXXXNJDSPTPGUDPNKBKQQVCVOUV OCMHHINTW BDUJWFUBCQJWPUPWFSWJFXUBC 6CVOUVͰ࣮ߦ TVEPBQUVQEBUF TVEPBQUVQHSBEF 7

Slide 8

Slide 8 text

#JUDPJO$PSF #JUDPJOϦϑΝϨϯε࣮૷ͷϊʔυ ެࣜΫϥΠΞϯτιϑτ΢ΣΞ ։ൃݴޠ͸$ গ͠1ZUIPO΋ೖΔΑ͏ʹ CJUDPJOEͱ΋͍͏ 8

Slide 9

Slide 9 text

ϏϧυͱΠϯετʔϧ HJUDMPOFIUUQTHJUIVCDPNCJUDPJOCJUDPJO DECJUDPJO HJUUBH &OUFS͔ˣΩʔͰWΛݟ͚ͭΔ HJUDIFDLPVUW 6CVOUV IUUQTRJJUBDPNLFBDIJUFNTCCDDFG w ʮϏϧυͷલʹґଘ͢ΔQBDLBHFΛΠϯετʔϧʯ͔Βॱ൪ʹ࣮ߦ .BD IUUQTCMPDLDIBJOKQCJUDPJOJOTUBMMCJUDPJOEPONBD NBLFʹ͕͔͔࣌ؒΔͷͰɺͦͷؒʹઆ໌ 9

Slide 10

Slide 10 text

ॳظىಈͱऴྃ ىಈ CJUDPJOESFHUFTUUYJOEFYEBFNPO ϒϩοΫνΣʔϯ৘ใΛࢀর CJUDPJODMJSFHUFTUHFUCMPDLDIBJOJOGP ఀࢭ CJUDPJODMJSFHUFTUTUPQ ੨ࣈ͸λʔϛφϧʹଧͪࠐΜͰ࣮ߦ͢ΔίϚϯυ 10

Slide 11

Slide 11 text

CJUDPJODPOG -JOVYͷ৔߹ DEdCJUDPJO .BDͷ৔߹ DE6TFST\64&3^-JCSBSZ"QQMJDBUJPO4VQQPSU#JUDPJO OBOPCJUDPJODPOG·ͨ͸WJCJUDPJODPOG ԼهΛίϐϖͯ͠อଘ 11 regtest=1 # regtestϞʔυ༗ޮԽ txindex=1 # શͯͷTXΛऔಘ(ϑϧϊʔυ) server=1 # RPCΞΫηεՄೳʹ daemon=1 # ίϯιʔϧϩά͕ग़ͳ͍ rpcuser=hoge # RPCΞΫηεϢʔβ rpcpassword=hoge # RPCΞΫηεύεϫʔυ [regtest] # regtest༻ઃఆ rpcport=18332 # RPC༻port port=18333 # ଞͷϊʔυͱ௨৴͢Δport

Slide 12

Slide 12 text

࠶౓ىಈͯ͠ίϚϯυΛݟΔ CJUDPJOE CJUDPJODMJIFMQ CJUDPJODMJIFMQHFUCMPDLDIJBOJOGP 12

Slide 13

Slide 13 text

3FHUFTUϞʔυ 5FTUOFU͸ແՁ஋ͳ#JUDPJOͷྲྀ௨͢ΔωοτϫʔΫ 1P8 1SPPGPG8PSL ܕͰϚΠχϯά΋͍ͯ͠Δ w ϒϩοΫੜ੒ִؒฏۉ෼͕ͩɺ҆ఆ͠ͳ͍ w ٸܹʹૣ͘ͳͬͨ൓ಈͰ஗͘ͳͬͨΓ 3FHUFTU͸։ൃ༻ͷωοτϫʔΫ ೚ҙͷλΠϛϯάͰϚΠχϯά͠์୊ʢίετ̌ʣ w ঝೝͱ͍͏ςετ΋͙͢ʹͰ͖Δ ωοτͷͳ͍؀ڥͰ΋࢖͑Δ ෳ਺୆ܨ͛Δ͜ͱ΋Մೳ w 3FPSHͷςετ΋؆୯ʹͰ͖Δ w #MPDLXJUIIPMEJOHBUUBDL ηϧϑΟογϡɾϚΠχϯά߈ܸ ΋؆୯ 13

Slide 14

Slide 14 text

3FHUFTUϚΠχϯάͱૹۚ CJUDPJODMJHFUOFXBEESFTT .T'9D:#-CJW'R-VSR-%SC&K7 BEESFTT.T'9D:#-CJW'R-VSR-%SC&K7 ΑΓޙ͸֤ࣗग़ྗ͞ΕͨΞυϨεͰஔ͖׵͍͑ͯͩ͘͞ CJUDPJODMJHFOFSBUFUPBEESFTTBEESFTT CJUDPJODMJHFUCBMBODF CJUDPJODMJHFUOFXBEESFTT /"T6RK&5UX;E#$U"%UUFN-35JB2 BEESFTT/"T6RK&5UX;E#$U"%UUFN-35JB2 ΑΓޙ͸֤ࣗग़ྗ͞ΕͨΞυϨεͰஔ͖׵͍͑ͯͩ͘͞ CJUDPJODMJTFOEUPBEESFTTBEESFTT DFFGFDEGEBDBCBDEFCDDE BEF 14

Slide 15

Slide 15 text

τϥϯβΫγϣϯͷࢀর UYJEDFFGFDEGEBDBCBDEFCDD EBEF ΑΓޙ͸֤ࣗग़ྗ͞ΕͨτϥϯβΫγϣϯͰஔ͖׵͍͑ͯͩ͘͞ CJUDPJODMJHFUUSBOTBDUJPOUYJE CJUDPJODMJHFUSBXUSBOTBDUJPOUYJE SBXUSBOTBDUJPO CJUDPJODMJHFUSBXUSBOTBDUJPOUYJE FDIPSBXUSBOTBDUJPO CJUDPJODMJEFDPEFSBXUSBOTBDUJPOSBXUSBOTBDUJPO 15

Slide 16

Slide 16 text

ΞϦε͕Ϙϒʹ#5$ΛૹΔ Ҏલड͚औֹ͍ͬͯͨΛ߹ࢉͯ͠ɺ૬खʹૹΓɺ͓௼Γ͸ࣗ෼΁ 59தʹهࡌͷͳֹ͍ ͜͜Ͱ͸#5$ ͸ޙʹϚΠφʔ΁ τϥϯβΫγϣϯͷߏ଄ 16 ΞϦε Ϙϒ 5SBOTBDUJPO 59 */165 065165 ΞϦε Ωϟϩϧ ΞϦεˠϘϒ #5$ ΩϟϩϧˠΞϦε #5$ ΞϦεˠΞϦε ͓௼Γ #5$ #5$ σϏοτˠΞϦε #5$ #5$ σϏοτ ܭ#5$ ܭ#5$ ϚΠφʔ ωοτϫʔΫख਺ྉ #5$ ˞59ʹهࡌ͸ͳ͍ ൿີ伴Λࠩ͠ࠐΜͰ ϩοΫղআɿిࢠॺ໊ ΞϦεͷ ൿີ伴 ΞϦεͷ ൿີ伴 ΞϦεͷ ެ։伴 Ϙϒͷ ެ։伴 ΞϦεͷ ެ։伴 ΞϦεͷ ެ։伴

Slide 17

Slide 17 text

3FMFBTF/PUFͷ೔ຊޠ༁CZ҆౔ໜږࢯ IUUQTCJUDPJODPSFPSHKBSFMFBTFT #JUDPJO$PSFWFSTJPO 17 $ bitcoin-cli getbalances { "mine": { "trusted": 7699.99774240, "untrusted_pending": 0.00000000, "immature": 2500.00205560 } }

Slide 18

Slide 18 text

CJUDPJOSC CJUDPJOSVCZ IUUQTHJUIVCDPNMJBOCJUDPJOSVCZ CJUDPJOͷSVCZϥΠϒϥϦɺ#JUDPJOE CJUDPJODPSF ͱซ༻ ్த͔ΒDIBJOUPQF$50҆౔ໜږࢯ͕DPOUSJCVUFSʹ CJUDPJOSVCZͷ-JBO͕؅ཧΛ΍ΊͨͷͰɺ҆౔ࢯ͕৽ͨʹCJUDPJOSCΛΦʔϓ ϯιʔεͰ։ൃ։࢝ IUUQTHJUIVCDPNDIBJOUPQFCJUDPJOSC ॻ੶͸CJUDPJOSVCZͰॻ͔Ε͍ͯΔ͕ɺҰ෦͸CJUDPJOSCͰͷίʔσΟϯάʹ ΋Ԡ༻Մೳ 18

Slide 19

Slide 19 text

3VCZΠϯετʔϧ .BDͷ৔߹ IUUQTXXXPJBYKQSBJMT[BLLBO SBJMT@@@JOTUBMMBUJPO@PO@NBDPTYIUNM 6CVOUVͷ৔߹ IUUQTXXXPJBYKQSBJMT[BLLBO SBJMT@@@JOTUBMMBUJPO@PO@VCVOUIUNM 3VCZΠϯετʔϧ·ͰʢʮHFNSDͷ࡞੒ʯͷखલSVCZW·Ͱʣ 3BJMTΠϯετʔϧ͸ෆཁ ίʔυதͷWFS͸ʹஔ͖׵࣮͑ͯߦ 19

Slide 20

Slide 20 text

CJUDPJOSCΠϯετʔϧ IUUQTHJUIVCDPNDIBJOUPQFCJUDPJOSC 3&"%.&ΛಡΜͰΠϯετʔϧ 20

Slide 21

Slide 21 text

JSC 3VCZର࿩ܕϞʔυ CJUDPJOSC JSC SFRVJSFCJUDPJO #JUDPJODIBJO@QBSBNTSFHUFTU #JUDPJO,FZHFOFSBUF #JUDPJO,FZHFOFSBUFQSJW@LFZ #JUDPJO,FZHFOFSBUFQVCLFZ 21

Slide 22

Slide 22 text

.OFNPOJD #JUDPJO8BMMFU.BTUFS,FZHFOFSBUF 22 irb(main):035:0> mk = Bitcoin::Wallet::MasterKey.generate => # irb(main):036:0> mk = Bitcoin::Wallet::MasterKey.generate.mnemonic => ["rocket", "habit", "slam", "pioneer", "ethics", "client", "outer", "name", "alarm", "bulb", "visa", "special", "index", "shadow", "tube", "bronze", "focus", "skin", "deposit", "climb", "tattoo", "chimney", "anger", "daring"]

Slide 23

Slide 23 text

#JUDPJO4DSJQU -*'0 -BTU*O'JSTU0VU ͷ୯७ͳεΫϦϓτ 'PSUIͷΑ͏ͳٯϙʔϥϯυه๏ #JUDPJO5SBOTBDUJPOʹ͸ඞؚͣ·ΕΔ #JUDPJO$PSF CJUDPJOE ΍ϥΠϒϥϦΛ࢖͏ͱɺ#JUDPJO4DSJQUΛҙࣝ͠ͳ ͯ͘΋ɺϓϩάϥϜ͸ॻ͚Δ 6OMPDLJOH4DSJQUͱ-PDLJOH4DSJQUΛಉ࣌ʹ࣮ߦ ਖ਼࣮͘͠ߦͰ͖Ε͹6OMPDLJOH4DSJQUͰ-PDLJOH4DSJQUΛղআͯ͠ɺτϥϯ βΫγϣϯͷ༗ޮੑΛࣔͤΔ 23 6OMPDLJOH4DSJQU -PDLJOH4DSJQU

Slide 24

Slide 24 text

୯७ͳྫ 6OMPDLJOH4DSJQUɺ-PDLJOH4DSJQUͷॱͰ࣮ߦ͢Δ ελοΫʹσʔλͱ01ίʔυΛೖΕ͍ͯ͘ 01ίʔυΛελοΫʹೖΕͨͱ͖͸໋ྩʹԠͯ͡Լͷσʔλͭ·ͨ͸ෳ਺ ʹରͯ͠ԋࢉ͢Δ 24 -PDLJOH4DSJQU 6OMPDLJOH4DSJQU 01@"%%01@&26"-Λ࣮ߦ 01@"%% Ճࢉ ༗ޮ 01@&26"- 01@"%%01@&26"- ಉ஋͔ ౳͍͠

Slide 25

Slide 25 text

#JUDPJO4DSJQU TDSJQU#JUDPJO4DSJQUGSPN@TUSJOH 01@"%%01@&26"-z TDSJQUSVO TDSJQU#JUDPJO4DSJQUGSPN@TUSJOH 01@"%%01@&26"-z TDSJQUSVO 25 irb(main):017:0> script = Bitcoin::Script.from_string("2 4 OP_ADD 6 OP_EQUAL").run => true irb(main):018:0> script = Bitcoin::Script.from_string("2 3 OP_ADD 6 OP_EQUAL").run => false irb(main):019:0> script = Bitcoin::Script.from_string("2 4 OP_ADD 6 OP_EQUAL") => # irb(main):020:0> script.run => true

Slide 26

Slide 26 text

ࢀߟʣ11, 1BZUP1VCMJD,FZ TJH͸ൿີ伴Λ༻͍ͯੜ੒͞ΕΔॺ໊ɺ1VC,͸ެ։伴 26 -PDLJOH4DSJQU 6OMPDLJOH4DSJQU TJH1VC,01@$)&$,4*(Λ࣮ߦ TJH 1VC, TJH 1VC, 536& ༗ޮ $)&$,4*( TJH 1VC,01@$)&$,4*( ॺ໊Λݕূ

Slide 27

Slide 27 text

ࢀߟʣ11,) 1BZUP1VCMJD,FZ)BTIʢ11,ͷൃల൛ʣ ެ։伴ϋογϡΛ༻͍Δ͜ͱͰΞυϨεΛ୹͘දݱͰ͖Δ TDSJQU͸ʢʣ಺Ͱͷݺͼํ΋͋Δ 27 -PDLJOH4DSJQU TDSJQU1VC,FZ 6OMPDLJOH4DSJQU TDSJQU4JH TJH TJH1VC,01@%6101@)"4)1VC,)BTI01@&26"-7&3*': 01@$)&$,4*(Λ࣮ߦ TJH 536& 1VC, TJH 1VC, TJH 1VC, 1VC, 1VC, 1VC,)BTI TJH 1VC, 1VC,)BTI 1VC,)BTI TJH 1VC, 1VC,)BTI 1VC,)BTI TJH 1VC, 01@%61 )"4) ෳ੡ 01@&26"- ౳͍͠ TJH1VC, 01@%6101@)"4)1VC,)BTI 01@&26"-7&3*':01@$)&$,4*( ಉ஋͔ 4)"ͷޙ 3*1&.% ෳ੡

Slide 28

Slide 28 text

ࢀߟʣ11,)ʢଓ͖ʣ ࢒Γ͸11,ͱಉ͡ 28 -PDLJOH4DSJQU 6OMPDLJOH4DSJQU TJH 1VC, TJH 1VC, 536& $)&$,4*( TJH1VC, 01@%6101@)"4)1VC,)BTI 01@&26"-7&3*':01@$)&$,4*( ॺ໊Λݕূ

Slide 29

Slide 29 text

ࢀߟʣϚϧνγά NPGOʢOਓதNਓͷॺ໊ͰϩοΫղআͰ͖ΔʣϚϧνγά Α͋͘ΔPGͷྫ 29 -PDLJOH4DSJQU TDSJQU1VC,FZ 6OMPDLJOH4DSJQU TDSJQU4JH 01@TJH"4JH#1VC,"1VC,#1VC,$01@$)&$,.6-5*4*( )"4) 01@TJH"TJH# 1VC,"1VC,#1VC,$ 01@$)&$,.6-5*4*( 536& TJHOBUVSF# 1VCMJD,FZ$ $)&$,.6-5*4*( TJHOBUVSF" 1VCMJD,FZ# 1VCMJD,FZ"

Slide 30

Slide 30 text

CJUDPJOSC࢖༻ JSC ԼهͷίʔυΛෳ਺ߦؙ͝ͱίϐϖ 30 irb(main):001:0> require 'bitcoin' => true irb(main):002:0> require 'net/http' => true irb(main):003:0> require 'json' => false irb(main):004:0> Bitcoin.chain_params = :regtest => :regtest irb(main):005:0> RPCUSER="hoge" => "hoge" irb(main):006:0> RPCPASSWORD="hoge" => "hoge" irb(main):007:0> HOST="localhost" => "localhost" irb(main):008:0> PORT=18332 => 18332 irb(main):011:0> def bitcoinRPC(method,param) irb(main):012:1> http = Net::HTTP.new(HOST, PORT) irb(main):013:1> request = Net::HTTP::Post.new('/') irb(main):014:1> request.basic_auth(RPCUSER,RPCPASSWORD) irb(main):015:1> request.content_type = 'application/json' irb(main):016:1> request.body = {method: method, params: param, id: 'jsonrpc'}.to_json irb(main):017:1> JSON.parse(http.request(request).body)["result"] irb(main):018:1> end => :bitcoinRPC require 'bitcoin' require 'net/http' require 'json' Bitcoin.chain_params = :regtest RPCUSER="hoge" RPCPASSWORD="hoge" HOST="localhost" PORT=18332 def bitcoinRPC(method,param) http = Net::HTTP.new(HOST, PORT) request = Net::HTTP::Post.new('/') request.basic_auth(RPCUSER,RPCPASSWORD) request.content_type = 'application/json' request.body = {method: method, params: param, id: 'jsonrpc'}.to_json JSON.parse(http.request(request).body)["result"] end

Slide 31

Slide 31 text

CJUDPJO31$Ͱ#JUDPJO$PSFΛૢ࡞ JSC NBJO CJUDPJO31$ bHFUCMPDLDIBJOJOGP` <> BEESFTTCJUDPJO31$ bHFUOFXBEESFTT <> CJUDPJO31$ HFOFSBUFUPBEESFTT < BEESFTT> 31 irb(main):019:0> bitcoinRPC('getblockchaininfo',[]) => {"chain"=>"regtest", "blocks"=>259, "headers"=>259, "bestblockhash"=>"537f9822f97e2110fa8d04d7676855eef5c7628c425a2a2e271a49d6a0741480", "difficulty"=>4.656542373906925e-10, "mediantime"=>1574683242, "verificationprogress"=>1, "initialblockdownload"=>true, "chainwork"=>"0000000000000000000000000000000000000000000000000000000000000208", "size_on_disk"=>108511, "pruned"=>false, "softforks"=>{"bip34"=>{"type"=>"buried", "active"=>false, "height"=>500}, "bip66"=>{"type"=>"buried", "active"=>false, "height"=>1251}, "bip65"=>{"type"=>"buried", "active"=>false, "height"=>1351}, "csv"=>{"type"=>"buried", "active"=>false, "height"=>432}, "segwit"=>{"type"=>"buried", "active"=>true, "height"=>0}, "testdummy"=>{"type"=>"bip9", "bip9"=>{"status"=>"started", "bit"=>28, "start_time"=>0, "timeout"=>9223372036854775807, "since"=>144, "statistics"=>{"period"=>144, "threshold"=>108, "elapsed"=>116, "count"=>116, "possible"=>true}}, "active"=>false}}, "warnings"=>""}

Slide 32

Slide 32 text

࣍ճ༧ࠂ ࠓճֶΜͩ͜ͱΛੜ͔ͯ͠ɺ3VCZPO3BJMTʹͯ#JUDPJO8FCϢʔβΠϯλʔ ϑΣʔεΛ։ൃ 32

Slide 33

Slide 33 text

ίϛϡχςΟ঺հ ೔ຊ҉߸௨՟ϢʔβձɹIUUQTDSZQUPDVSSFODZDPOOQBTTDPN ʮϏοτίΠϯͱ͔ษڧձʯʢ݄̍ճɿฏ೔໷ʣ w ࣍ճ͸೥݄ௐ੔த ʮ҉߸௨՟ಡॻձʯʢ݄̍ճɿฏ೔໷ʣ w ࣍ճ͸೥݄ௐ੔த DSBTIBDBEFNZ *5ܥಈը഑৴ ʹͯϏοτίΠϯͱ͔ษڧձͷΞʔΧΠϒ഑৴த
 IUUQTDSBTIBDBEFNZDPNNVOJUZDSZQUPDVSSFODZ :PV5VCFνϟϯωϧʢษڧձʗಡॻձʣIUUQCJUMZZPVUVCFDDTUVEZ 33