# main.rb
#!ruby
# -*- encoding: UTF-8 -*-
STDOUT.set_encoding( Encoding.locale_charmap, Encoding::UTF_8 )
STDERR.set_encoding( Encoding.locale_charmap, Encoding::UTF_8 )
Home_path = File.dirname(File.expand_path( __FILE__ )).encode(Encoding::UTF_8)
Dir.chdir( Home_path )
=begin
プログラミングのお題スレ Part19
582 蟻人間 ◆T6xkBnTXz7B0 2021/04/10(土) 19:40:12.57 ID:Sahzdf8n
お題: かなとアルファベットと数字からなる文字列をモールス信号に変換するプログラム。ただし、長音を「-」、短音を「・」で表し、モールス信号に変換できない文字は下駄文字(〓)に置き換える。全角・半角の両方に対応すること。
-----
無音が規定されていないので、1短音と同じ長さの無音を ','で表す。(モールス符号でなく信号モールス信号だから)
# 長音短音間は 1短音分の無音
# 文字間は 3短音分の無音
# 単語間は 7短音分の無音
和文の単語間も欧文同様 ' 'での分かち書きを想定。
=end
=begin
585 デフォルトの名無しさん 2021/04/11(日) 18:30:35.89 ID:b01EJxrZ
お題
>>582と同じでモールス信号作成。但し、定義ファイルに文字ごとに対応する信号を入れておきそれを指定して動く方式。(これにより言語が関係なくなる)。
日本語用定義ファイルを指定して動かせばそれに従って日本語での変換が行われ、英語用のを指定すれば英語での変換になるようにする。
プログラムと定義ファイルを最低一つ作ること。定義ファイルの内容は定義に従って正しく変換がされるかの確認が出来る程度で良い(例えば数字の変換だけでも良い)。
586 デフォルトの名無しさん 2021/04/11(日) 18:33:36.97 ID:b01EJxrZ
定義ファイルのエンコードはご自由に。でも UTF-8 にしておくとあちこちで使えて良いかも知れない。(Javaとか自動変換してくれるやつだと漢字も1文字扱い出来て楽だし)。
=end
m_type = gets.strip.downcase
str = gets.chomp
require_relative "./morse_#{m_type}"
puts " locate : #{m_type}"
puts " message : '#{str}'"
puts morse( str )
---
# morse_en.rb
#!ruby
# -*- encoding: UTF-8 -*-
def morse( str )
str.unicode_normalize!( :nfc )
str.tr!( '0-9A-Za-za-z ', '0-9A-ZA-ZA-Z ' )
morse = ''
str.each_char{|ch|
morse += case ch
when 'A'; '・-'
when 'B'; '-・・・'
when 'C'; '-・-・'
when 'D'; '-・・'
when 'E'; '・'
when 'F'; '・・-・'
when 'G'; '--・'
when 'H'; '・・・・'
when 'I'; '・・'
when 'J'; '・---'
when 'K'; '-・-'
when 'L'; '・-・・'
when 'M'; '--'
when 'N'; '-・'
when 'O'; '---'
when 'P'; '・--・'
when 'Q'; '--・-'
when 'R'; '・-・'
when 'S'; '・・・'
when 'T'; '-'
when 'U'; '・・-'
when 'V'; '・・・-'
when 'W'; '・--'
when 'X'; '-・・-'
when 'Y'; '-・--'
when 'Z'; '--・・'
when '1'; '・----'
when '2'; '・・---'
when '3'; '・・・--'
when '4'; '・・・・-'
when '5'; '・・・・・'
when '6'; '-・・・・'
when '7'; '--・・・'
when '8'; '---・・'
when '9'; '----・'
when '0'; '-----'
when ' '; ''
else "〓"
end.chars.join(',')
morse += ',' if ch == ' '
morse += ',,,'
}
morse.sub( /[\s,]+$/, '' )
end
---
# morse_jp.rb
#!ruby
# -*- encoding: UTF-8 -*-
def morse( str )
str.unicode_normalize!( :nfc )
str.tr!( 'ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚', 'をぁぃぅぇぉゃゅょっーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜' )
str.tr!( '0-9ぁ-ん ', '0-9ァ-ン ' )
str.tr!( 'ァィゥェォヵヶッャュョ', 'アイウエオカケツヤユヨ' )
morse = ''
str.each_char{|ch|
morse += case ch
when '1'; '・----'
when '2'; '・・---'
when '3'; '・・・--'
when '4'; '・・・・-'
when '5'; '・・・・・'
when '6'; '-・・・・'
when '7'; '--・・・'
when '8'; '---・・'
when '9'; '----・'
when '0'; '-----'
when 'イ'; '・-'
when 'ロ'; '・-・-'
when 'ハ'; '-・・・'
when 'ニ'; '-・-・'
when 'ホ'; '-・・'
when 'ヘ'; '・'
when 'ト'; '・・-・・'
when 'チ'; '・・-・'
when 'リ'; '--・'
when 'ヌ'; '・・・・'
when 'ル'; '-・--・'
when 'ヲ'; '・---'
when 'ワ'; '-・-'
when 'カ'; '・-・・'
when 'ヨ'; '--'
when 'タ'; '-・'
when 'レ'; '---'
when 'ソ'; '---・'
when 'ツ'; '・--・'
when 'ネ'; '--・-'
when 'ナ'; '・-・'
when 'ラ'; '・・・'
when 'ム'; '-'
when 'ウ'; '・・-'
when 'ヰ'; '・-・・-'
when 'ノ'; '・・--'
when 'オ'; '・-・・・'
when 'ク'; '・・・-'
when 'ヤ'; '・--'
when 'マ'; '-・・-'
when 'ケ'; '-・--'
when 'フ'; '--・・'
when 'コ'; '----'
when 'エ'; '-・---'
when 'テ'; '・-・--'
when 'ア'; '--・--'
when 'サ'; '-・-・-'
when 'キ'; '-・-・・'
when 'ユ'; '-・・--'
when 'メ'; '-・・・-'
when 'ミ'; '・・-・-'
when 'シ'; '--・-・'
when 'ヱ'; '・--・・'
when 'ヒ'; '--・・-'
when 'モ'; '-・・-・'
when 'セ'; '・---・'
when 'ス'; '---・-'
when 'ン'; '・-・-・'
when '゛'; '・・'
when '゜'; '・・--・'
when 'ー'; '・--・-'
when '、'; '・-・-・-'
when '」'; '・-・-・・'
when '('; '-・--・-'
when ')'; '・-・・-・'
when ' '; ''
else "〓"
end.chars.join(',')
morse += ',' if ch == ' '
morse += ',,,'
}
morse.sub( /[\s,]+$/, '' )
end
---
# test_morae1.txt
en
Hello morse
---
# test_morae2.txt
jp
もしもし モールス
---
$ Console
> main.rb < test_morae1.txt
> main.rb < test_morae2.txt
IyBtYWluLnJiCiMhcnVieQojIC0qLSBlbmNvZGluZzogVVRGLTggLSotCgoJU1RET1VULnNldF9lbmNvZGluZyggRW5jb2RpbmcubG9jYWxlX2NoYXJtYXAsIEVuY29kaW5nOjpVVEZfOCApCglTVERFUlIuc2V0X2VuY29kaW5nKCBFbmNvZGluZy5sb2NhbGVfY2hhcm1hcCwgRW5jb2Rpbmc6OlVURl84ICkKCglIb21lX3BhdGggPSBGaWxlLmRpcm5hbWUoRmlsZS5leHBhbmRfcGF0aCggX19GSUxFX18gKSkuZW5jb2RlKEVuY29kaW5nOjpVVEZfOCkKCURpci5jaGRpciggSG9tZV9wYXRoICkKCj1iZWdpbgoK44OX44Ot44Kw44Op44Of44Oz44Kw44Gu44GK6aGM44K544OsIFBhcnQxOQo1ODIg6J+75Lq66ZaTIOKXhlQ2eGtCblRYejdCMCAyMDIxLzA0LzEwKOWcnykgMTk6NDA6MTIuNTcgSUQ6U2FoemRmOG4KICAgIOOBiumhjDog44GL44Gq44Go44Ki44Or44OV44Kh44OZ44OD44OI44Go5pWw5a2X44GL44KJ44Gq44KL5paH5a2X5YiX44KS44Oi44O844Or44K55L+h5Y+344Gr5aSJ5o+b44GZ44KL44OX44Ot44Kw44Op44Og44CC44Gf44Gg44GX44CB6ZW36Z+z44KS44CM77yN44CN44CB55+t6Z+z44KS44CM44O744CN44Gn6KGo44GX44CB44Oi44O844Or44K55L+h5Y+344Gr5aSJ5o+b44Gn44GN44Gq44GE5paH5a2X44Gv5LiL6aeE5paH5a2XKOOAkynjgavnva7jgY3mj5vjgYjjgovjgILlhajop5Ljg7vljYrop5Ljga7kuKHmlrnjgavlr77lv5zjgZnjgovjgZPjgajjgIIgCgotLS0tLQoK54Sh6Z+z44GM6KaP5a6a44GV44KM44Gm44GE44Gq44GE44Gu44Gn44CBMeefremfs+OBqOWQjOOBmOmVt+OBleOBrueEoemfs+OCkiAnLCfjgafooajjgZnjgIIo44Oi44O844Or44K556ym5Y+344Gn44Gq44GP5L+h5Y+344Oi44O844Or44K55L+h5Y+344Gg44GL44KJKQojIOmVt+mfs+efremfs+mWk+OBryAx55+t6Z+z5YiG44Gu54Sh6Z+zCiMg5paH5a2X6ZaT44GvIDPnn63pn7PliIbjga7nhKHpn7MKIyDljZjoqp7plpPjga8gN+efremfs+WIhuOBrueEoemfswoK5ZKM5paH44Gu5Y2Y6Kqe6ZaT44KC5qyn5paH5ZCM5qeYICcgJ+OBp+OBruWIhuOBi+OBoeabuOOBjeOCkuaDs+WumuOAggoKPWVuZAoKPWJlZ2luCgo1ODUg44OH44OV44Kp44Or44OI44Gu5ZCN54Sh44GX44GV44KTIDIwMjEvMDQvMTEo5pelKSAxODozMDozNS44OSBJRDpiMDFFSnhyWgogICAg44GK6aGMCiAgICA+PjU4MuOBqOWQjOOBmOOBp+ODouODvOODq+OCueS/oeWPt+S9nOaIkOOAguS9huOBl+OAgeWumue+qeODleOCoeOCpOODq+OBq+aWh+Wtl+OBlOOBqOOBq+WvvuW/nOOBmeOCi+S/oeWPt+OCkuWFpeOCjOOBpuOBiuOBjeOBneOCjOOCkuaMh+WumuOBl+OBpuWLleOBj+aWueW8j+OAgijjgZPjgozjgavjgojjgoroqIDoqp7jgYzplqLkv4LjgarjgY/jgarjgosp44CCCiAgICDml6XmnKzoqp7nlKjlrprnvqnjg5XjgqHjgqTjg6vjgpLmjIflrprjgZfjgabli5XjgYvjgZvjgbDjgZ3jgozjgavlvpPjgaPjgabml6XmnKzoqp7jgafjga7lpInmj5vjgYzooYzjgo/jgozjgIHoi7Hoqp7nlKjjga7jgpLmjIflrprjgZnjgozjgbDoi7Hoqp7jgafjga7lpInmj5vjgavjgarjgovjgojjgYbjgavjgZnjgovjgIIKCiAgICDjg5fjg63jgrDjg6njg6Djgajlrprnvqnjg5XjgqHjgqTjg6vjgpLmnIDkvY7kuIDjgaTkvZzjgovjgZPjgajjgILlrprnvqnjg5XjgqHjgqTjg6vjga7lhoXlrrnjga/lrprnvqnjgavlvpPjgaPjgabmraPjgZfjgY/lpInmj5vjgYzjgZXjgozjgovjgYvjga7norroqo3jgYzlh7rmnaXjgovnqIvluqbjgafoia/jgYQo5L6L44GI44Gw5pWw5a2X44Gu5aSJ5o+b44Gg44GR44Gn44KC6Imv44GEKeOAggoKNTg2IOODh+ODleOCqeODq+ODiOOBruWQjeeEoeOBl+OBleOCkyAyMDIxLzA0LzExKOaXpSkgMTg6MzM6MzYuOTcgSUQ6YjAxRUp4cloKICAgIOWumue+qeODleOCoeOCpOODq+OBruOCqOODs+OCs+ODvOODieOBr+OBlOiHqueUseOBq+OAguOBp+OCgiBVVEYtOCDjgavjgZfjgabjgYrjgY/jgajjgYLjgaHjgZPjgaHjgafkvb/jgYjjgaboia/jgYTjgYvjgoLnn6XjgozjgarjgYTjgIIoSmF2YeOBqOOBi+iHquWLleWkieaPm+OBl+OBpuOBj+OCjOOCi+OChOOBpOOBoOOBqOa8ouWtl+OCgjHmloflrZfmibHjgYTlh7rmnaXjgabmpb3jgaDjgZcp44CCCj1lbmQKCgltX3R5cGUgPSBnZXRzLnN0cmlwLmRvd25jYXNlCglzdHIgPSBnZXRzLmNob21wCglyZXF1aXJlX3JlbGF0aXZlICIuL21vcnNlXyN7bV90eXBlfSIKCglwdXRzICIgbG9jYXRlICA6ICN7bV90eXBlfSIKCXB1dHMgIiBtZXNzYWdlIDogJyN7c3RyfSciCglwdXRzIG1vcnNlKCBzdHIgKQotLS0KIyBtb3JzZV9lbi5yYgojIXJ1YnkKIyAtKi0gZW5jb2Rpbmc6IFVURi04IC0qLQoKZGVmIG1vcnNlKCBzdHIgKQoJc3RyLnVuaWNvZGVfbm9ybWFsaXplISggOm5mYyApCglzdHIudHIhKCAn77yQLe+8me+8oS3vvLrvvYEt772aYS1644CAJywgJzAtOUEtWkEtWkEtWiAnICkKCgltb3JzZSA9ICcnCglzdHIuZWFjaF9jaGFye3xjaHwKCQltb3JzZSArPSBjYXNlIGNoCgkJd2hlbiAnQSc7CSfjg7vvvI0nCgkJd2hlbiAnQic7CSfvvI3jg7vjg7vjg7snCgkJd2hlbiAnQyc7CSfvvI3jg7vvvI3jg7snCgkJd2hlbiAnRCc7CSfvvI3jg7vjg7snCgkJd2hlbiAnRSc7CSfjg7snCgkJd2hlbiAnRic7CSfjg7vjg7vvvI3jg7snCgkJd2hlbiAnRyc7CSfvvI3vvI3jg7snCgkJd2hlbiAnSCc7CSfjg7vjg7vjg7vjg7snCgkJd2hlbiAnSSc7CSfjg7vjg7snCgkJd2hlbiAnSic7CSfjg7vvvI3vvI3vvI0nCgkJd2hlbiAnSyc7CSfvvI3jg7vvvI0nCgkJd2hlbiAnTCc7CSfjg7vvvI3jg7vjg7snCgkJd2hlbiAnTSc7CSfvvI3vvI0nCgkJd2hlbiAnTic7CSfvvI3jg7snCgkJd2hlbiAnTyc7CSfvvI3vvI3vvI0nCgkJd2hlbiAnUCc7CSfjg7vvvI3vvI3jg7snCgkJd2hlbiAnUSc7CSfvvI3vvI3jg7vvvI0nCgkJd2hlbiAnUic7CSfjg7vvvI3jg7snCgkJd2hlbiAnUyc7CSfjg7vjg7vjg7snCgkJd2hlbiAnVCc7CSfvvI0nCgkJd2hlbiAnVSc7CSfjg7vjg7vvvI0nCgkJd2hlbiAnVic7CSfjg7vjg7vjg7vvvI0nCgkJd2hlbiAnVyc7CSfjg7vvvI3vvI0nCgkJd2hlbiAnWCc7CSfvvI3jg7vjg7vvvI0nCgkJd2hlbiAnWSc7CSfvvI3jg7vvvI3vvI0nCgkJd2hlbiAnWic7CSfvvI3vvI3jg7vjg7snCgoJCXdoZW4gJzEnOwkn44O777yN77yN77yN77yNJwoJCXdoZW4gJzInOwkn44O744O777yN77yN77yNJwoJCXdoZW4gJzMnOwkn44O744O744O777yN77yNJwoJCXdoZW4gJzQnOwkn44O744O744O744O777yNJwoJCXdoZW4gJzUnOwkn44O744O744O744O744O7JwoJCXdoZW4gJzYnOwkn77yN44O744O744O744O7JwoJCXdoZW4gJzcnOwkn77yN77yN44O744O744O7JwoJCXdoZW4gJzgnOwkn77yN77yN77yN44O744O7JwoJCXdoZW4gJzknOwkn77yN77yN77yN77yN44O7JwoJCXdoZW4gJzAnOwkn77yN77yN77yN77yN77yNJwoKCQl3aGVuICcgJzsJJycKCQllbHNlCSLjgJMiCgkJZW5kLmNoYXJzLmpvaW4oJywnKQoJCW1vcnNlICs9ICcsJwlpZiBjaCA9PSAnICcKCQltb3JzZSArPSAnLCwsJwoJfQoKCW1vcnNlLnN1YiggL1tccyxdKyQvLCAnJyApCmVuZAotLS0KIyBtb3JzZV9qcC5yYgojIXJ1YnkKIyAtKi0gZW5jb2Rpbmc6IFVURi04IC0qLQoKZGVmIG1vcnNlKCBzdHIgKQoJc3RyLnVuaWNvZGVfbm9ybWFsaXplISggOm5mYyApCglzdHIudHIhKCAn772m772n772o772p772q772r772s772t772u772v772w772x772y772z7720772177227723772477257726772777287729772+772/776A776B776C776D776E776F776G776H776I776J776K776L776M776N776O776P776Q776R776S776T776U776V776W776X776Y776Z776a776b776c776d776e776fJywgJ+OCkuOBgeOBg+OBheOBh+OBieOCg+OCheOCh+OBo+ODvOOCouOCpOOCpuOCqOOCquOCq+OCreOCr+OCseOCs+OCteOCt+OCueOCu+OCveOCv+ODgeODhOODhuODiOODiuODi+ODjOODjeODjuODj+ODkuODleODmOODm+ODnuODn+ODoOODoeODouODpOODpuODqOODqeODquODq+ODrOODreODr+ODs+OCm+OCnCcgKQoJc3RyLnRyISggJ++8kC3vvJnjgYEt44KT44CAJywgJzAtOeOCoS3jg7MgJyApCglzdHIudHIhKCAn44Kh44Kj44Kl44Kn44Kp44O144O244OD44Oj44Ol44OnJywgJ+OCouOCpOOCpuOCqOOCquOCq+OCseODhOODpOODpuODqCcgKQoKCW1vcnNlID0gJycKCXN0ci5lYWNoX2NoYXJ7fGNofAoJCW1vcnNlICs9IGNhc2UgY2gKCQl3aGVuICcxJzsJJ+ODu++8je+8je+8je+8jScKCQl3aGVuICcyJzsJJ+ODu+ODu++8je+8je+8jScKCQl3aGVuICczJzsJJ+ODu+ODu+ODu++8je+8jScKCQl3aGVuICc0JzsJJ+ODu+ODu+ODu+ODu++8jScKCQl3aGVuICc1JzsJJ+ODu+ODu+ODu+ODu+ODuycKCQl3aGVuICc2JzsJJ++8jeODu+ODu+ODu+ODuycKCQl3aGVuICc3JzsJJ++8je+8jeODu+ODu+ODuycKCQl3aGVuICc4JzsJJ++8je+8je+8jeODu+ODuycKCQl3aGVuICc5JzsJJ++8je+8je+8je+8jeODuycKCQl3aGVuICcwJzsJJ++8je+8je+8je+8je+8jScKCgkJd2hlbiAn44KkJzsJJ+ODu++8jScKCQl3aGVuICfjg60nOwkn44O777yN44O777yNJwoJCXdoZW4gJ+ODjyc7CSfvvI3jg7vjg7vjg7snCgkJd2hlbiAn44OLJzsJJ++8jeODu++8jeODuycKCQl3aGVuICfjg5snOwkn77yN44O744O7JwoJCXdoZW4gJ+ODmCc7CSfjg7snCgkJd2hlbiAn44OIJzsJJ+ODu+ODu++8jeODu+ODuycKCQl3aGVuICfjg4EnOwkn44O744O777yN44O7JwoJCXdoZW4gJ+ODqic7CSfvvI3vvI3jg7snCgkJd2hlbiAn44OMJzsJJ+ODu+ODu+ODu+ODuycKCQl3aGVuICfjg6snOwkn77yN44O777yN77yN44O7JwoJCXdoZW4gJ+ODsic7CSfjg7vvvI3vvI3vvI0nCgkJd2hlbiAn44OvJzsJJ++8jeODu++8jScKCQl3aGVuICfjgqsnOwkn44O777yN44O744O7JwoJCXdoZW4gJ+ODqCc7CSfvvI3vvI0nCgkJd2hlbiAn44K/JzsJJ++8jeODuycKCQl3aGVuICfjg6wnOwkn77yN77yN77yNJwoJCXdoZW4gJ+OCvSc7CSfvvI3vvI3vvI3jg7snCgkJd2hlbiAn44OEJzsJJ+ODu++8je+8jeODuycKCQl3aGVuICfjg40nOwkn77yN77yN44O777yNJwoJCXdoZW4gJ+ODiic7CSfjg7vvvI3jg7snCgkJd2hlbiAn44OpJzsJJ+ODu+ODu+ODuycKCQl3aGVuICfjg6AnOwkn77yNJwoJCXdoZW4gJ+OCpic7CSfjg7vjg7vvvI0nCgkJd2hlbiAn44OwJzsJJ+ODu++8jeODu+ODu++8jScKCQl3aGVuICfjg44nOwkn44O744O777yN77yNJwoJCXdoZW4gJ+OCqic7CSfjg7vvvI3jg7vjg7vjg7snCgkJd2hlbiAn44KvJzsJJ+ODu+ODu+ODu++8jScKCQl3aGVuICfjg6QnOwkn44O777yN77yNJwoJCXdoZW4gJ+ODnic7CSfvvI3jg7vjg7vvvI0nCgkJd2hlbiAn44KxJzsJJ++8jeODu++8je+8jScKCQl3aGVuICfjg5UnOwkn77yN77yN44O744O7JwoJCXdoZW4gJ+OCsyc7CSfvvI3vvI3vvI3vvI0nCgkJd2hlbiAn44KoJzsJJ++8jeODu++8je+8je+8jScKCQl3aGVuICfjg4YnOwkn44O777yN44O777yN77yNJwoJCXdoZW4gJ+OCoic7CSfvvI3vvI3jg7vvvI3vvI0nCgkJd2hlbiAn44K1JzsJJ++8jeODu++8jeODu++8jScKCQl3aGVuICfjgq0nOwkn77yN44O777yN44O744O7JwoJCXdoZW4gJ+ODpic7CSfvvI3jg7vjg7vvvI3vvI0nCgkJd2hlbiAn44OhJzsJJ++8jeODu+ODu+ODu++8jScKCQl3aGVuICfjg58nOwkn44O744O777yN44O777yNJwoJCXdoZW4gJ+OCtyc7CSfvvI3vvI3jg7vvvI3jg7snCgkJd2hlbiAn44OxJzsJJ+ODu++8je+8jeODu+ODuycKCQl3aGVuICfjg5InOwkn77yN77yN44O744O777yNJwoJCXdoZW4gJ+ODoic7CSfvvI3jg7vjg7vvvI3jg7snCgkJd2hlbiAn44K7JzsJJ+ODu++8je+8je+8jeODuycKCQl3aGVuICfjgrknOwkn77yN77yN77yN44O777yNJwoJCXdoZW4gJ+ODsyc7CSfjg7vvvI3jg7vvvI3jg7snCgkJd2hlbiAn44KbJzsJJ+ODu+ODuycKCQl3aGVuICfjgpwnOwkn44O744O777yN77yN44O7JwoJCXdoZW4gJ+ODvCc7CSfjg7vvvI3vvI3jg7vvvI0nCgkJd2hlbiAn44CBJzsJJ+ODu++8jeODu++8jeODu++8jScKCQl3aGVuICfjgI0nOwkn44O777yN44O777yN44O744O7JwoJCXdoZW4gJ++8iCc7CSfvvI3jg7vvvI3vvI3jg7vvvI0nCgkJd2hlbiAn77yJJzsJJ+ODu++8jeODu+ODu++8jeODuycKCgkJd2hlbiAnICc7CScnCgkJZWxzZQki44CTIgoJCWVuZC5jaGFycy5qb2luKCcsJykKCQltb3JzZSArPSAnLCcJaWYgY2ggPT0gJyAnCgkJbW9yc2UgKz0gJywsLCcKCX0KCgltb3JzZS5zdWIoIC9bXHMsXSskLywgJycgKQplbmQKLS0tCiMgdGVzdF9tb3JhZTEudHh0CmVuCkhlbGxvIG1vcnNlCi0tLQojIHRlc3RfbW9yYWUyLnR4dApqcArjgoLjgZfjgoLjgZfjgIDjg6Ljg7zjg6vjgrkKLS0tCiQgQ29uc29sZQo+IG1haW4ucmIgPCB0ZXN0X21vcmFlMS50eHQKPiBtYWluLnJiIDwgdGVzdF9tb3JhZTIudHh0Cg==