rwdhypernote 0.06 → 0.07
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/code/01rwdcore/01rwdcore.rb +15 -13
- data/code/01rwdcore/jumplinkcommand.rb +26 -0
- data/code/01rwdcore/openhelpwindow.rb +26 -26
- data/code/01rwdcore/returntomain.rb +8 -8
- data/code/01rwdcore/rundocuments.rb +10 -0
- data/code/01rwdcore/runeditconfiguration.rb +10 -0
- data/code/01rwdcore/runhelpabout.rb +10 -0
- data/code/01rwdcore/rwdtinkerversion.rb +12 -13
- data/code/01rwdcore/rwdwindowreturn.rb +3 -5
- data/code/01rwdcore/selectiontab.rb +9 -0
- data/code/01rwdcore/test_cases.rb +109 -0
- data/code/01rwdcore/test_harness.rb +13 -0
- data/code/01rwdcore/uploadreturns.rb +60 -60
- data/code/superant.com.rwdtinkerbackwindow/controlclient.rb +89 -92
- data/code/superant.com.rwdtinkerbackwindow/diagnostictab.rb +15 -21
- data/code/superant.com.rwdtinkerbackwindow/installapplet.rb +19 -18
- data/code/superant.com.rwdtinkerbackwindow/installgemapplet.rb +20 -19
- data/code/superant.com.rwdtinkerbackwindow/installremotegem.rb +19 -18
- data/code/superant.com.rwdtinkerbackwindow/listgemdirs.rb +7 -7
- data/code/superant.com.rwdtinkerbackwindow/listgemzips.rb +48 -49
- data/code/superant.com.rwdtinkerbackwindow/listinstalledfiles.rb +8 -7
- data/code/superant.com.rwdtinkerbackwindow/listzips.rb +22 -26
- data/code/superant.com.rwdtinkerbackwindow/loadconfigurationrecord.rb +32 -31
- data/code/superant.com.rwdtinkerbackwindow/loadconfigurationvariables.rb +14 -13
- data/code/superant.com.rwdtinkerbackwindow/network.rb +82 -82
- data/code/superant.com.rwdtinkerbackwindow/openappletname.rb +18 -17
- data/code/superant.com.rwdtinkerbackwindow/openhelpwindowtinkerwin2.rb +37 -37
- data/code/superant.com.rwdtinkerbackwindow/remotegemlist.rb +20 -20
- data/code/superant.com.rwdtinkerbackwindow/removeapplet.rb +33 -32
- data/code/superant.com.rwdtinkerbackwindow/runremoteinstall.rb +11 -0
- data/code/superant.com.rwdtinkerbackwindow/runrwdtinkerbackwindow.rb +8 -9
- data/code/superant.com.rwdtinkerbackwindow/rwdtinkerwin2version.rb +10 -11
- data/code/superant.com.rwdtinkerbackwindow/saveconfigurationrecord.rb +19 -18
- data/code/superant.com.rwdtinkerbackwindow/viewappletcontents.rb +21 -20
- data/code/superant.com.rwdtinkerbackwindow/viewgemappletcontents.rb +23 -20
- data/configuration/language.dist +1 -1
- data/configuration/rwdapplicationidentity.dist +2 -2
- data/configuration/rwdhypernote.dist +2 -2
- data/configuration/rwdtinker.dist +3 -3
- data/configuration/tinkerwin2variables.dist +1 -1
- data/gui/00coreguibegin/applicationguitop.rwd +1 -1
- data/gui/frontwindowselectionbegin/selectiontabbegin/selectiontabbegin.rwd +2 -7
- data/gui/frontwindowselections/superant.com.rwdtinkerwin2selectiontab/jumplinkcommands.rwd +15 -0
- data/gui/helpaboutinstalled/superant.com.tinkerhelpabout/3copyright.rwd +1 -1
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/81jumplinkcommands.rwd +17 -0
- data/init.rb +231 -228
- data/rwd_files/HowTo_HyperNote.txt +6 -0
- data/rwd_files/HowTo_Tinker.txt +16 -0
- data/rwdconfig.dist +8 -2
- data/tests/makedist.rb +37 -8
- metadata +14 -12
- data/gui/frontwindowselections/superant.com.rwdtinkerwin2selectiontab/rwdwin2selectiontab.rwd +0 -12
- data/gui/helpaboutinstalled/superant.com.rwdwin2helpabout/1appname.rwd +0 -4
- data/gui/helpaboutinstalled/superant.com.rwdwin2helpabout/3copyright.rwd +0 -3
- data/gui/helpaboutinstalled/superant.com.rwdwin2helpabout/5version.rwd +0 -10
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/80tab1.rwd +0 -11
- data/tests/rwdtinkertestEN.rb +0 -163
- data/tests/test.result +0 -32
|
@@ -1,99 +1,96 @@
|
|
|
1
1
|
# Bind message passing socket to rwdtinker application
|
|
2
|
-
|
|
3
2
|
def runcontrolcommand
|
|
4
|
-
require 'socket'
|
|
5
|
-
|
|
6
|
-
# Change this line...
|
|
7
|
-
|
|
8
|
-
# And this one...
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
# Rescue all other errors
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
remotehostnotfound = true
|
|
53
|
-
if (commandtext == "query")
|
|
54
|
-
begin
|
|
55
|
-
client = UDPSocket::new()
|
|
56
|
-
client.send(commandtext, 0, ip, port)
|
|
57
|
-
@socket = UDPSocket::new()
|
|
58
|
-
@socket.bind(ip, port)
|
|
59
|
-
# Rescue the "Address in use" error
|
|
60
|
-
rescue Errno::EADDRINUSE
|
|
61
|
-
|
|
62
|
-
databack, info = client.recv(128)
|
|
63
|
-
@remotecommandresult = databack
|
|
64
|
-
@lastremotecommand = "rwdtinker remote: Port #{port} on host #{ip} "
|
|
65
|
-
remotehostnotfound = false
|
|
66
|
-
|
|
67
|
-
# Rescue the "Address not available' error
|
|
68
|
-
rescue Errno::EADDRNOTAVAIL
|
|
69
|
-
puts "Network plugin: Address #{host} is not available to bind."
|
|
70
|
-
|
|
71
|
-
# Rescue "permission denied errors
|
|
72
|
-
rescue Errno::EACCES
|
|
73
|
-
puts "Network plugin: Access denied when binding interface addresses. Did you try to bind a port under 1024 as a regular user?"
|
|
74
|
-
|
|
75
|
-
# Rescue all other errors
|
|
76
|
-
rescue
|
|
77
|
-
puts "Network plugin: An error occured."
|
|
78
|
-
|
|
79
|
-
# Rescue all other errors
|
|
80
|
-
end
|
|
81
|
-
@socket.close
|
|
82
|
-
|
|
83
|
-
# Close the socket after use
|
|
84
|
-
client.close()
|
|
85
|
-
end
|
|
3
|
+
require 'socket'
|
|
4
|
+
|
|
5
|
+
# Change this line...
|
|
6
|
+
ip = '127.0.0.1'
|
|
7
|
+
# And this one...
|
|
8
|
+
port = $rwdcontrolport1
|
|
9
|
+
if @a_remoteportinput
|
|
10
|
+
port = @a_remoteportinput.to_i
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
commandtext = @a_remotecommandinput.to_s
|
|
14
|
+
remotehostnotfound = true
|
|
15
|
+
if (commandtext == "stop")
|
|
16
|
+
begin
|
|
17
|
+
client = UDPSocket::new()
|
|
18
|
+
client.send(commandtext, 0, ip, port)
|
|
19
|
+
@socket = UDPSocket::new()
|
|
20
|
+
@socket.bind(ip, port)
|
|
21
|
+
# Rescue the "Address in use" error
|
|
22
|
+
rescue Errno::EADDRINUSE
|
|
23
|
+
|
|
24
|
+
databack, info = client.recv(128)
|
|
25
|
+
@remotecommandresult = databack
|
|
26
|
+
@lastremotecommand = "rwdtinker remote:: Port #{port} on host #{ip} ."
|
|
27
|
+
remotehostnotfound = false
|
|
28
|
+
|
|
29
|
+
# Rescue the "Address not available" error
|
|
30
|
+
rescue Errno::EADDRNOTAVAIL
|
|
31
|
+
puts "Network plugin: Address #{host} is not available to bind."
|
|
32
|
+
|
|
33
|
+
# Rescue "permission denied errors
|
|
34
|
+
rescue Errno::EACCES
|
|
35
|
+
puts "Network plugin: Access denied when binding interface addresses. Did you try to bind a port under 1024 as a regular user?"
|
|
36
|
+
|
|
37
|
+
# Rescue all other errors
|
|
38
|
+
rescue
|
|
39
|
+
puts "Network plugin: An error occured."
|
|
40
|
+
|
|
41
|
+
# Rescue all other errors
|
|
42
|
+
end
|
|
43
|
+
if remotehostnotfound
|
|
44
|
+
@remotecommandresult = "Remote Host not running"
|
|
45
|
+
end
|
|
46
|
+
@socket.close
|
|
47
|
+
# Close the socket after use
|
|
48
|
+
client.close()
|
|
49
|
+
end
|
|
86
50
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
51
|
+
remotehostnotfound = true
|
|
52
|
+
if (commandtext == "query")
|
|
53
|
+
begin
|
|
54
|
+
client = UDPSocket::new()
|
|
55
|
+
client.send(commandtext, 0, ip, port)
|
|
56
|
+
@socket = UDPSocket::new()
|
|
57
|
+
@socket.bind(ip, port)
|
|
58
|
+
# Rescue the "Address in use" error
|
|
59
|
+
rescue Errno::EADDRINUSE
|
|
60
|
+
|
|
61
|
+
databack, info = client.recv(128)
|
|
62
|
+
@remotecommandresult = databack
|
|
63
|
+
@lastremotecommand = "rwdtinker remote: Port #{port} on host #{ip} "
|
|
64
|
+
remotehostnotfound = false
|
|
65
|
+
|
|
66
|
+
# Rescue the "Address not available' error
|
|
67
|
+
rescue Errno::EADDRNOTAVAIL
|
|
68
|
+
puts "Network plugin: Address #{host} is not available to bind."
|
|
69
|
+
|
|
70
|
+
# Rescue "permission denied errors
|
|
71
|
+
rescue Errno::EACCES
|
|
72
|
+
puts "Network plugin: Access denied when binding interface addresses. Did you try to bind a port under 1024 as a regular user?"
|
|
73
|
+
|
|
74
|
+
# Rescue all other errors
|
|
75
|
+
rescue
|
|
76
|
+
puts "Network plugin: An error occured."
|
|
77
|
+
|
|
78
|
+
# Rescue all other errors
|
|
79
|
+
end
|
|
80
|
+
@socket.close
|
|
81
|
+
|
|
82
|
+
# Close the socket after use
|
|
83
|
+
client.close()
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
if remotehostnotfound
|
|
87
|
+
@remotecommandresult = "Remote Host not running"
|
|
88
|
+
end
|
|
90
89
|
end
|
|
91
90
|
|
|
92
91
|
# list the remote control options on the screen
|
|
93
92
|
def showremoteportoptions
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
93
|
+
|
|
94
|
+
@remoteportoptions = $rwdcontrolports.rwd_options
|
|
95
|
+
@remotecommandoptions = ["query","stop"].rwd_options
|
|
96
|
+
end
|
|
@@ -1,25 +1,19 @@
|
|
|
1
1
|
# Application RwdTinker orginally (c) 2004 Steven Gibson under GPL.
|
|
2
2
|
# This application is a framework for writing programs from RubyWebDialogs
|
|
3
|
-
# http://www.
|
|
4
|
-
# For more information about RwdTinker see http://www.rubyforge.net/projects/rwdapplications
|
|
5
|
-
|
|
3
|
+
# For information see http://www.rubyforge.net/projects/rwdapplications
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
end
|
|
23
|
-
|
|
5
|
+
require 'resolv'
|
|
6
|
+
require 'date'
|
|
7
|
+
|
|
8
|
+
# return the platform information
|
|
9
|
+
def runviewplatform
|
|
10
|
+
@platformdisplay = "Platform is " + RUBY_PLATFORM + "\n"
|
|
11
|
+
@platformdisplay = @platformdisplay + "Ruby Version " + VERSION + "\n"
|
|
12
|
+
@platformdisplay = @platformdisplay + "rwdtinker version " + RwdTinkerVersion + "\n"
|
|
13
|
+
@platformdisplay = @platformdisplay + "program directory " + $progdir + "\n"
|
|
14
|
+
@platformdisplay = @platformdisplay + "hostname " + Resolv.getname(Resolv.getaddress("localhost")) + "\n"
|
|
15
|
+
@platformdisplay = @platformdisplay + "application name " + $rwdapplicationidentity + "\n"
|
|
16
|
+
@platformdisplay = @platformdisplay + "Date " + Date.today().to_s
|
|
17
|
+
|
|
18
|
+
end
|
|
24
19
|
|
|
25
|
-
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
# code in install rwdtinker applets - now uses ruby.zip module
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
nametext = "%s" % [@a_installapplet]
|
|
2
|
+
def installapplet
|
|
5
3
|
|
|
6
|
-
|
|
4
|
+
nametext = "%s" % [@a_installapplet]
|
|
7
5
|
|
|
6
|
+
begin # exception trapped block
|
|
8
7
|
|
|
9
|
-
require 'extras/zip/zip'
|
|
10
|
-
fullname = nametext + ".zip"
|
|
11
|
-
fileName = File.join($zipslocation,fullname)
|
|
12
8
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
9
|
+
require 'extras/zip/zip'
|
|
10
|
+
fullname = nametext + ".zip"
|
|
11
|
+
fileName = File.join($zipslocation,fullname)
|
|
12
|
+
|
|
13
|
+
zf = Zip::ZipFile.new(fileName)
|
|
14
|
+
zf.sort.each {
|
|
15
|
+
|entry|
|
|
16
|
+
zf.extract(entry.to_s, entry.to_s)
|
|
17
|
+
}
|
|
18
|
+
@installapplettext = Message[:applet_installed]
|
|
19
|
+
|
|
20
|
+
rescue
|
|
21
|
+
@installapplettext = "unzip error - applet may not be installed correctly"
|
|
22
|
+
end # exception rescue
|
|
23
|
+
|
|
24
|
+
end
|
|
23
25
|
|
|
24
|
-
end
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
# install rwdtinker applet from a long directory location
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
2
|
+
def installgemapplet
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
require 'extras/zip/zip'
|
|
5
|
+
nametext = "%s" % [@a_installapplet]
|
|
6
|
+
|
|
7
|
+
begin # exception trapped block
|
|
8
|
+
fullname = nametext + ".zip"
|
|
9
|
+
|
|
10
|
+
zf = Zip::ZipFile.new(fullname)
|
|
11
|
+
zf.sort.each {
|
|
12
|
+
|entry|
|
|
13
|
+
zf.extract(entry.to_s, entry.to_s)
|
|
14
|
+
}
|
|
15
|
+
@installapplettext = Message[:applet_installed]
|
|
16
|
+
|
|
17
|
+
rescue
|
|
18
|
+
@installapplettext = "unzip error - applet may not be installed correctly"
|
|
19
|
+
end # exception rescue
|
|
20
|
+
end
|
|
21
|
+
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
# download gem of rwdtinker applet
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
2
|
+
def superantcominstallremotegemapplet
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
|
|
5
|
+
tempnametext = "%s" % [@superantcominstallremoteappletinput]
|
|
6
|
+
temparray = tempnametext.split(/ /)
|
|
7
|
+
nametext = temparray[0]
|
|
8
|
+
begin # exception trapped block
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
commandline = $xpcommand + "gem install " + nametext
|
|
12
|
+
|
|
13
|
+
@superantcominstallremotegemappletresult = `#{commandline}`
|
|
14
|
+
|
|
15
|
+
rescue
|
|
16
|
+
@superantcominstallremotegemappletresult = "error during gem install!"
|
|
17
|
+
end # exception rescue
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# this code is to list the gem directories that are installed
|
|
2
2
|
def superantcomshowgemfiledirs
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
|
|
4
|
+
fileList = Dir.new($gemdirectory_withgemfiles).entries.sort.delete_if { |x| ! (x =~ /\Arwdzip/) }
|
|
5
|
+
@superantcomshowgemappletdirsresult = fileList.rwd_method("superantcomshowgemappletdirsname")
|
|
6
6
|
end
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
def superantcomshowgemappletdirsname(inffile)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
applet = inffile
|
|
10
|
+
@a_gemfiledirsinput = applet
|
|
11
|
+
|
|
12
12
|
end
|
|
@@ -1,54 +1,53 @@
|
|
|
1
1
|
# this code is to list the zips
|
|
2
|
-
|
|
3
|
-
|
|
4
2
|
def fillzipappletname(inffile)
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
applet = inffile.gsub(/\.zip$/, "")
|
|
4
|
+
@a_installapplet = applet
|
|
5
|
+
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def findzipfiles(d)
|
|
9
|
+
a = Array.new(Dir[d].entries.sort)
|
|
10
|
+
#loop through and get the files names
|
|
11
|
+
a.each do |x|
|
|
12
|
+
#adjust the filters to the files you want to see...
|
|
13
|
+
if(!test(?d,x))
|
|
14
|
+
# only zip files
|
|
15
|
+
if x =~ /\.zip/
|
|
16
|
+
puts "#{x}" #opens the file thats in fileName as read only
|
|
17
|
+
$zipsarray = $zipsarray | ["#{x}"]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
8
21
|
end
|
|
9
22
|
|
|
10
|
-
def findzipfiles(d)
|
|
11
|
-
a = Array.new(Dir[d].entries.sort)
|
|
12
|
-
#loop through and get the files names
|
|
13
|
-
a.each do |x|
|
|
14
|
-
#adjust the filters to the files you want to see...
|
|
15
|
-
if(!test(?d,x))
|
|
16
|
-
# only zip files
|
|
17
|
-
if x =~ /\.zip/
|
|
18
|
-
puts "#{x}" #opens the file thats in fileName as read only
|
|
19
|
-
$zipsarray = $zipsarray | ["#{x}"]
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
23
|
def listgemzips
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
24
|
+
startlangdir = $geminstalled_directory
|
|
25
|
+
#get a list of the files and subdirectories on the starting directory only
|
|
26
|
+
alanghash = Array.new(Dir[startlangdir].entries.sort)
|
|
27
|
+
p alanghash
|
|
28
|
+
#loop through the list, ignore the files and add all new directories found
|
|
29
|
+
alanghash.each do |x|
|
|
30
|
+
#if a directory...
|
|
31
|
+
if(test(?d,x))
|
|
32
|
+
# add to the original list of directories
|
|
33
|
+
@@tmproot = x + "/**"
|
|
34
|
+
#adds the new ones to the array
|
|
35
|
+
blanghash = Dir[@@tmproot].entries.sort
|
|
36
|
+
blanghash.each do |x|
|
|
37
|
+
if(test(?d,x))
|
|
38
|
+
alanghash.push(x) #appends to the end of the array...
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
alanghash.each do |x|
|
|
44
|
+
#if it is a file...
|
|
45
|
+
if(!test(?d,x))
|
|
46
|
+
alanghash.delete(x)
|
|
47
|
+
else #it is a directory...
|
|
48
|
+
findzipfiles(x + "/**")
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
@zipslistresult = $zipsarray.rwd_method("fillzipappletname")
|
|
52
|
+
end
|
|
53
|
+
|