puppeteer-ruby 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -12,7 +12,7 @@ class Puppeteer::BrowserContext
12
12
 
13
13
  # @return {!Array<!Target>} target
14
14
  def targets
15
- @browser.targets.select{ |target| target.browser_context == self }
15
+ @browser.targets.select { |target| target.browser_context == self }
16
16
  end
17
17
 
18
18
  # @param {function(!Target):boolean} predicate
@@ -27,7 +27,7 @@ class Puppeteer::BrowserContext
27
27
 
28
28
  # @return {!Promise<!Array<!Puppeteer.Page>>}
29
29
  def pages
30
- targets.select{ |target| target.type == 'page' }.map(&:page).reject{ |page| !page }
30
+ targets.select { |target| target.type == 'page' }.map(&:page).reject { |page| !page }
31
31
  end
32
32
 
33
33
  def incognito?
@@ -23,10 +23,17 @@ class Puppeteer::BrowserRunner
23
23
  def initialize(env, executable_path, args)
24
24
  stdin, @stdout, @stderr, @thread = Open3.popen3(env, executable_path, *args)
25
25
  stdin.close
26
+ @pid = @thread.pid
27
+ end
28
+
29
+ def kill
30
+ Process.kill(:KILL, @pid)
31
+ rescue Errno::ESRCH
32
+ # already killed
26
33
  end
27
34
 
28
35
  def dispose
29
- [@stdout, @stderr].each{ |io| io.close unless io.closed? }
36
+ [@stdout, @stderr].each { |io| io.close unless io.closed? }
30
37
  @thread.join
31
38
  end
32
39
 
@@ -104,12 +111,24 @@ class Puppeteer::BrowserRunner
104
111
  if @temp_directory
105
112
  kill
106
113
  elsif @connection
107
- @connection.sendCommand("Browser.close")
114
+ begin
115
+ @connection.send_message('Browser.close')
116
+ rescue
117
+ kill
118
+ end
108
119
  end
120
+
121
+ @process_closing.call
109
122
  end
110
123
 
111
124
  # @return {Promise}
112
125
  def kill
126
+ unless @closed
127
+ @proc.kill
128
+ end
129
+ if @temp_directory
130
+ FileUtils.rm_rf(@temp_directory)
131
+ end
113
132
  end
114
133
 
115
134
 
@@ -121,7 +140,7 @@ class Puppeteer::BrowserRunner
121
140
  transport = Puppeteer::WebSocketTransport.create(browser_ws_endpoint)
122
141
  @connection = Puppeteer::Connection.new(browser_ws_endpoint, transport, slow_mo)
123
142
  else
124
- raise NotImplementedError.new("PipeTransport is not yet implemented")
143
+ raise NotImplementedError.new('PipeTransport is not yet implemented')
125
144
  end
126
145
 
127
146
  @connection
@@ -2,7 +2,7 @@ class Puppeteer::CDPSession
2
2
  include Puppeteer::EventCallbackable
3
3
  using Puppeteer::AsyncAwaitBehavior
4
4
 
5
- class Error < StandardError ; end
5
+ class Error < StandardError; end
6
6
 
7
7
  # @param {!Connection} connection
8
8
  # @param {string} targetType
@@ -65,7 +65,7 @@ class Puppeteer::CDPSession
65
65
  end
66
66
 
67
67
  def handle_closed
68
- @callbacks.values.each do |callback|
68
+ @callbacks.each_value do |callback|
69
69
  callback.reject(
70
70
  Puppeteer::Connection::ProtocolError.new(
71
71
  method: callback.method,
@@ -121,7 +121,7 @@ class Puppeteer::Connection
121
121
 
122
122
  def handle_message(message)
123
123
  if skip_debug_print?(message['method'])
124
- debug_print "."
124
+ debug_print '.'
125
125
  @prev_log_skipped = true
126
126
  else
127
127
  debug_print "\n" if @prev_log_skipped
@@ -190,7 +190,7 @@ class Puppeteer::Connection
190
190
  error_message: response['error']['message'],
191
191
  error_data: response['error']['data']))
192
192
  else
193
- callback.resolve(message["result"])
193
+ callback.resolve(message['result'])
194
194
  end
195
195
  end
196
196
  else
@@ -207,14 +207,14 @@ class Puppeteer::Connection
207
207
  @closed = true
208
208
  @transport.on_message
209
209
  @transport.on_close
210
- @callbacks.values.each do |callback|
210
+ @callbacks.each_value do |callback|
211
211
  callback.reject(
212
212
  ProtocolError.new(
213
213
  method: callback.method,
214
214
  error_message: 'Target Closed.'))
215
215
  end
216
216
  @callbacks.clear
217
- @sessions.values.each do |session|
217
+ @sessions.each_value do |session|
218
218
  session.handle_closed
219
219
  end
220
220
  @sessions.clear
@@ -1,7 +1,7 @@
1
1
  require 'logger'
2
2
 
3
3
  module Puppeteer::DebugPrint
4
- if ["1", "true"].include?(ENV["DEBUG"])
4
+ if ['1', 'true'].include?(ENV['DEBUG'])
5
5
  def debug_puts(*args, **kwargs)
6
6
  @__debug_logger ||= Logger.new(STDOUT)
7
7
  @__debug_logger.debug(*args, **kwargs)
@@ -20,13 +20,29 @@ class Puppeteer::DOMWorld
20
20
 
21
21
  # @param {?Puppeteer.ExecutionContext} context
22
22
  def context=(context)
23
+ # D, [2020-04-12T22:45:03.938754 #46154] DEBUG -- : RECV << {"method"=>"Runtime.executionContextCreated", "params"=>{"context"=>{"id"=>3, "origin"=>"https://github.com", "name"=>"", "auxData"=>{"isDefault"=>true, "type"=>"default", "frameId"=>"3AD7F1E82BCBA88BFE31D03BC49FF6CB"}}}, "sessionId"=>"636CEF0C4FEAFC4FE815E9E7B5F7BA68"}
24
+ # D, [2020-04-12T22:45:03.938856 #46154] DEBUG -- : RECV << {"method"=>"Runtime.executionContextCreated", "params"=>{"context"=>{"id"=>4, "origin"=>"://", "name"=>"__puppeteer_utility_world__", "auxData"=>{"isDefault"=>false, "type"=>"isolated", "frameId"=>"3AD7F1E82BCBA88BFE31D03BC49FF6CB"}}}, "sessionId"=>"636CEF0C4FEAFC4FE815E9E7B5F7BA68"}
25
+ # D, [2020-04-12T22:45:03.938960 #46154] DEBUG -- : RECV << {"method"=>"Runtime.executionContextDestroyed", "params"=>{"executionContextId"=>1}, "sessionId"=>"636CEF0C4FEAFC4FE815E9E7B5F7BA68"}
26
+ # D, [2020-04-12T22:45:03.939110 #46154] DEBUG -- : RECV << {"method"=>"Page.frameNavigated", "params"=>{"frame"=>{"id"=>"3AD7F1E82BCBA88BFE31D03BC49FF6CB", "loaderId"=>"301B349884E582986C502CBE020966DF", "url"=>"https://github.com/", "securityOrigin"=>"https://github.com", "mimeType"=>"text/html"}}, "sessionId"=>"636CEF0C4FEAFC4FE815E9E7B5F7BA68"}
27
+ # D, [2020-04-12T22:45:03.939793 #46154] DEBUG -- : RECV << {"method"=>"Runtime.executionContextDestroyed", "params"=>{"executionContextId"=>2}, "sessionId"=>"636CEF0C4FEAFC4FE815E9E7B5F7BA68"}
28
+ # executionContextDestroyed is often notified after executionContextCreated.
29
+
23
30
  if context
31
+ if @context_promise.fulfilled?
32
+ @document = nil
33
+ @context_promise = resolvable_future
34
+ @pending_destroy_exists = true
35
+ end
24
36
  @context_promise.fulfill(context)
25
37
  # for (const waitTask of this._waitTasks)
26
38
  # waitTask.rerun();
27
39
  else
28
- @document = nil
29
- @context_promise = resolvable_future
40
+ if @pending_destroy_exists
41
+ @pending_destroy_exists = false
42
+ else
43
+ @document = nil
44
+ @context_promise = resolvable_future
45
+ end
30
46
  end
31
47
  end
32
48
 
@@ -41,7 +57,7 @@ class Puppeteer::DOMWorld
41
57
  end
42
58
  end
43
59
 
44
- class DetachedError < StandardError ; end
60
+ class DetachedError < StandardError; end
45
61
 
46
62
  # @return {!Promise<!Puppeteer.ExecutionContext>}
47
63
  def execution_context
@@ -20,7 +20,7 @@ class Puppeteer::ElementHandle < Puppeteer::JSHandle
20
20
 
21
21
  def content_frame
22
22
  node_info = @remote_object.node_info
23
- frame_id = node_info["node"]["frameId"]
23
+ frame_id = node_info['node']['frameId']
24
24
  if frame_id.is_a?(String)
25
25
  @frame_manager.frame(frame_id)
26
26
  else
@@ -328,7 +328,7 @@ class Puppeteer::ElementHandle < Puppeteer::JSHandle
328
328
  # @param selector [String]
329
329
  def S(selector)
330
330
  handle = evaluate_handle(
331
- "(element, selector) => element.querySelector(selector)",
331
+ '(element, selector) => element.querySelector(selector)',
332
332
  selector,
333
333
  )
334
334
  element = handle.as_element
@@ -344,7 +344,7 @@ class Puppeteer::ElementHandle < Puppeteer::JSHandle
344
344
  # @param selector [String]
345
345
  def SS(selector)
346
346
  handles = evaluate_handle(
347
- "(element, selector) => element.querySelectorAll(selector)",
347
+ '(element, selector) => element.querySelectorAll(selector)',
348
348
  selector,
349
349
  )
350
350
  properties = handles.properties
@@ -32,10 +32,10 @@ class Puppeteer::EmulationManager
32
32
  ),
33
33
  )
34
34
 
35
- reload_needed = @emulating_mobile != mobile || @hasTouch != has_touch;
35
+ reload_needed = @emulating_mobile != mobile || @hasTouch != has_touch
36
36
  @emulating_mobile = mobile
37
37
  @has_touch = has_touch
38
- return reload_needed
38
+ reload_needed
39
39
  end
40
40
 
41
41
  # @param viewport [Puppeteer::Viewport]
@@ -1,4 +1,4 @@
1
1
  # ref: https://github.com/puppeteer/puppeteer/blob/master/lib/Errors.js
2
- class Puppeteer::TimeoutError < StandardError ; end
2
+ class Puppeteer::TimeoutError < StandardError; end
3
3
 
4
- class Puppeteer::WebSocktTransportError < StandardError ; end
4
+ class Puppeteer::WebSocktTransportError < StandardError; end
@@ -55,7 +55,7 @@ class Puppeteer::ExecutionContext
55
55
  )
56
56
  # }).catch(rewriteError);
57
57
 
58
- exception_details = result["exceptionDetails"]
58
+ exception_details = result['exceptionDetails']
59
59
  if exception_details
60
60
  raise EvaluationError.new("Evaluation failed: #{exception_details}")
61
61
  end
@@ -111,10 +111,10 @@ class Puppeteer::ExecutionContext
111
111
  returnByValue: @return_by_value,
112
112
  awaitPromise: true,
113
113
  userGesture: true,
114
- ) #.catch(rewriteError);
114
+ ) # .catch(rewriteError);
115
115
 
116
- exception_details = result["exceptionDetails"]
117
- remote_object = Puppeteer::RemoteObject.new(result["result"])
116
+ exception_details = result['exceptionDetails']
117
+ remote_object = Puppeteer::RemoteObject.new(result['result'])
118
118
 
119
119
  if exception_details
120
120
  raise EvaluationError.new("Evaluation failed: #{exceptionDetails}")
@@ -176,7 +176,7 @@ class Puppeteer::ExecutionContext
176
176
  end
177
177
  end
178
178
 
179
- class EvaluationError < StandardError ; end
179
+ class EvaluationError < StandardError; end
180
180
 
181
181
  # @param return_by_value [Boolean]
182
182
  # @param page_function [String]
@@ -186,7 +186,7 @@ class Puppeteer::ExecutionContext
186
186
  # https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer
187
187
  # But we don't support the syntax here.
188
188
  js_object =
189
- if ["=>", "async", "function"].any? { |keyword| page_function.include?(keyword) }
189
+ if ['=>', 'async', 'function'].any? { |keyword| page_function.include?(keyword) }
190
190
  JavaScriptFunction.new(self, page_function, args, return_by_value)
191
191
  else
192
192
  JavaScriptExpression.new(self, page_function, return_by_value)
@@ -211,7 +211,7 @@ class Puppeteer::Frame
211
211
  main_execution_context = @main_world.execution_context
212
212
  result = main_execution_context.adopt_element_handle(handle)
213
213
  handle.dispose
214
- return result
214
+ result
215
215
  end
216
216
 
217
217
  # @param {string} xpath
@@ -225,7 +225,7 @@ class Puppeteer::Frame
225
225
  main_execution_context = @main_world.execution_context
226
226
  result = main_execution_context.adopt_element_handle(handle)
227
227
  handle.dispose
228
- return result
228
+ result
229
229
  end
230
230
 
231
231
  # @param {Function|string} pageFunction
@@ -80,7 +80,7 @@ class Puppeteer::FrameManager
80
80
 
81
81
  attr_reader :network_manager
82
82
 
83
- class NavigationError < StandardError ; end
83
+ class NavigationError < StandardError; end
84
84
 
85
85
  # @param frame [Puppeteer::Frame]
86
86
  # @param url [String]
@@ -101,14 +101,14 @@ class Puppeteer::FrameManager
101
101
  ensure_new_document_navigation = false
102
102
 
103
103
  begin
104
- navigate = future {
104
+ navigate = future do
105
105
  result = @client.send_message('Page.navigate', navigate_params)
106
106
  loader_id = result['loaderId']
107
107
  ensure_new_document_navigation = !!loader_id
108
108
  if result['errorText']
109
109
  raise NavigationError.new("#{result['errorText']} at #{url}")
110
110
  end
111
- }
111
+ end
112
112
  await_any(
113
113
  navigate,
114
114
  watcher.timeout_or_termination_promise,
@@ -253,7 +253,7 @@ class Puppeteer::FrameManager
253
253
  end
254
254
 
255
255
  # Update frame payload.
256
- frame.navigated(frame_payload);
256
+ frame.navigated(frame_payload)
257
257
 
258
258
  emit_event 'Events.FrameManager.FrameNavigated', frame
259
259
  end
@@ -346,12 +346,12 @@ class Puppeteer::FrameManager
346
346
  # To avoid the problem, just skip recent created ids.
347
347
  now = Time.now
348
348
  context_ids_to_skip = @context_id_created.select { |k, v| now - v < 1 }.keys
349
- @context_id_to_context.reject{ |k, v| context_ids_to_skip.include?(k) }.values.each do |context|
349
+ @context_id_to_context.reject { |k, v| context_ids_to_skip.include?(k) }.each_value do |context|
350
350
  if context.world
351
351
  context.world.context = nil
352
352
  end
353
353
  end
354
- @context_id_to_context.select!{ |k, v| context_ids_to_skip.include?(k) }
354
+ @context_id_to_context.select! { |k, v| context_ids_to_skip.include?(k) }
355
355
  end
356
356
 
357
357
  def execution_context_by_id(context_id)
@@ -359,7 +359,7 @@ class Puppeteer::FrameManager
359
359
  if !context
360
360
  raise "INTERNAL ERROR: missing context with id = #{context_id}"
361
361
  end
362
- return context
362
+ context
363
363
  end
364
364
 
365
365
  # @param {!Frame} frame
@@ -35,7 +35,7 @@ class Puppeteer::Keyboard
35
35
  location: description.location,
36
36
  isKeypad: description.location == 3,
37
37
  }.compact
38
- @client.send_message('Input.dispatchKeyEvent', params);
38
+ @client.send_message('Input.dispatchKeyEvent', params)
39
39
  end
40
40
 
41
41
  # @param key [String]
@@ -24,260 +24,260 @@ class Puppeteer::Keyboard
24
24
  end
25
25
 
26
26
  KEY_DEFINITIONS = {
27
- '0': KeyDefinition.new({'keyCode': 48, 'key': '0', 'code': 'Digit0'}),
28
- '1': KeyDefinition.new({'keyCode': 49, 'key': '1', 'code': 'Digit1'}),
29
- '2': KeyDefinition.new({'keyCode': 50, 'key': '2', 'code': 'Digit2'}),
30
- '3': KeyDefinition.new({'keyCode': 51, 'key': '3', 'code': 'Digit3'}),
31
- '4': KeyDefinition.new({'keyCode': 52, 'key': '4', 'code': 'Digit4'}),
32
- '5': KeyDefinition.new({'keyCode': 53, 'key': '5', 'code': 'Digit5'}),
33
- '6': KeyDefinition.new({'keyCode': 54, 'key': '6', 'code': 'Digit6'}),
34
- '7': KeyDefinition.new({'keyCode': 55, 'key': '7', 'code': 'Digit7'}),
35
- '8': KeyDefinition.new({'keyCode': 56, 'key': '8', 'code': 'Digit8'}),
36
- '9': KeyDefinition.new({'keyCode': 57, 'key': '9', 'code': 'Digit9'}),
37
- 'Power': KeyDefinition.new({'key': 'Power', 'code': 'Power'}),
38
- 'Eject': KeyDefinition.new({'key': 'Eject', 'code': 'Eject'}),
39
- 'Abort': KeyDefinition.new({'keyCode': 3, 'code': 'Abort', 'key': 'Cancel'}),
40
- 'Help': KeyDefinition.new({'keyCode': 6, 'code': 'Help', 'key': 'Help'}),
41
- 'Backspace': KeyDefinition.new({'keyCode': 8, 'code': 'Backspace', 'key': 'Backspace'}),
42
- 'Tab': KeyDefinition.new({'keyCode': 9, 'code': 'Tab', 'key': 'Tab'}),
43
- 'Numpad5': KeyDefinition.new({'keyCode': 12, 'shiftKeyCode': 101, 'key': 'Clear', 'code': 'Numpad5', 'shiftKey': '5', 'location': 3}),
44
- 'NumpadEnter': KeyDefinition.new({'keyCode': 13, 'code': 'NumpadEnter', 'key': 'Enter', 'text': '\r', 'location': 3}),
45
- 'Enter': KeyDefinition.new({'keyCode': 13, 'code': 'Enter', 'key': 'Enter', 'text': '\r'}),
46
- '\r': KeyDefinition.new({'keyCode': 13, 'code': 'Enter', 'key': 'Enter', 'text': '\r'}),
47
- '\n': KeyDefinition.new({'keyCode': 13, 'code': 'Enter', 'key': 'Enter', 'text': '\r'}),
48
- 'ShiftLeft': KeyDefinition.new({'keyCode': 16, 'code': 'ShiftLeft', 'key': 'Shift', 'location': 1}),
49
- 'ShiftRight': KeyDefinition.new({'keyCode': 16, 'code': 'ShiftRight', 'key': 'Shift', 'location': 2}),
50
- 'ControlLeft': KeyDefinition.new({'keyCode': 17, 'code': 'ControlLeft', 'key': 'Control', 'location': 1}),
51
- 'ControlRight': KeyDefinition.new({'keyCode': 17, 'code': 'ControlRight', 'key': 'Control', 'location': 2}),
52
- 'AltLeft': KeyDefinition.new({'keyCode': 18, 'code': 'AltLeft', 'key': 'Alt', 'location': 1}),
53
- 'AltRight': KeyDefinition.new({'keyCode': 18, 'code': 'AltRight', 'key': 'Alt', 'location': 2}),
54
- 'Pause': KeyDefinition.new({'keyCode': 19, 'code': 'Pause', 'key': 'Pause'}),
55
- 'CapsLock': KeyDefinition.new({'keyCode': 20, 'code': 'CapsLock', 'key': 'CapsLock'}),
56
- 'Escape': KeyDefinition.new({'keyCode': 27, 'code': 'Escape', 'key': 'Escape'}),
57
- 'Convert': KeyDefinition.new({'keyCode': 28, 'code': 'Convert', 'key': 'Convert'}),
58
- 'NonConvert': KeyDefinition.new({'keyCode': 29, 'code': 'NonConvert', 'key': 'NonConvert'}),
59
- 'Space': KeyDefinition.new({'keyCode': 32, 'code': 'Space', 'key': ' '}),
60
- 'Numpad9': KeyDefinition.new({'keyCode': 33, 'shiftKeyCode': 105, 'key': 'PageUp', 'code': 'Numpad9', 'shiftKey': '9', 'location': 3}),
61
- 'PageUp': KeyDefinition.new({'keyCode': 33, 'code': 'PageUp', 'key': 'PageUp'}),
62
- 'Numpad3': KeyDefinition.new({'keyCode': 34, 'shiftKeyCode': 99, 'key': 'PageDown', 'code': 'Numpad3', 'shiftKey': '3', 'location': 3}),
63
- 'PageDown': KeyDefinition.new({'keyCode': 34, 'code': 'PageDown', 'key': 'PageDown'}),
64
- 'End': KeyDefinition.new({'keyCode': 35, 'code': 'End', 'key': 'End'}),
65
- 'Numpad1': KeyDefinition.new({'keyCode': 35, 'shiftKeyCode': 97, 'key': 'End', 'code': 'Numpad1', 'shiftKey': '1', 'location': 3}),
66
- 'Home': KeyDefinition.new({'keyCode': 36, 'code': 'Home', 'key': 'Home'}),
67
- 'Numpad7': KeyDefinition.new({'keyCode': 36, 'shiftKeyCode': 103, 'key': 'Home', 'code': 'Numpad7', 'shiftKey': '7', 'location': 3}),
68
- 'ArrowLeft': KeyDefinition.new({'keyCode': 37, 'code': 'ArrowLeft', 'key': 'ArrowLeft'}),
69
- 'Numpad4': KeyDefinition.new({'keyCode': 37, 'shiftKeyCode': 100, 'key': 'ArrowLeft', 'code': 'Numpad4', 'shiftKey': '4', 'location': 3}),
70
- 'Numpad8': KeyDefinition.new({'keyCode': 38, 'shiftKeyCode': 104, 'key': 'ArrowUp', 'code': 'Numpad8', 'shiftKey': '8', 'location': 3}),
71
- 'ArrowUp': KeyDefinition.new({'keyCode': 38, 'code': 'ArrowUp', 'key': 'ArrowUp'}),
72
- 'ArrowRight': KeyDefinition.new({'keyCode': 39, 'code': 'ArrowRight', 'key': 'ArrowRight'}),
73
- 'Numpad6': KeyDefinition.new({'keyCode': 39, 'shiftKeyCode': 102, 'key': 'ArrowRight', 'code': 'Numpad6', 'shiftKey': '6', 'location': 3}),
74
- 'Numpad2': KeyDefinition.new({'keyCode': 40, 'shiftKeyCode': 98, 'key': 'ArrowDown', 'code': 'Numpad2', 'shiftKey': '2', 'location': 3}),
75
- 'ArrowDown': KeyDefinition.new({'keyCode': 40, 'code': 'ArrowDown', 'key': 'ArrowDown'}),
76
- 'Select': KeyDefinition.new({'keyCode': 41, 'code': 'Select', 'key': 'Select'}),
77
- 'Open': KeyDefinition.new({'keyCode': 43, 'code': 'Open', 'key': 'Execute'}),
78
- 'PrintScreen': KeyDefinition.new({'keyCode': 44, 'code': 'PrintScreen', 'key': 'PrintScreen'}),
79
- 'Insert': KeyDefinition.new({'keyCode': 45, 'code': 'Insert', 'key': 'Insert'}),
80
- 'Numpad0': KeyDefinition.new({'keyCode': 45, 'shiftKeyCode': 96, 'key': 'Insert', 'code': 'Numpad0', 'shiftKey': '0', 'location': 3}),
81
- 'Delete': KeyDefinition.new({'keyCode': 46, 'code': 'Delete', 'key': 'Delete'}),
82
- 'NumpadDecimal': KeyDefinition.new({'keyCode': 46, 'shiftKeyCode': 110, 'code': 'NumpadDecimal', 'key': '\u0000', 'shiftKey': '.', 'location': 3}),
83
- 'Digit0': KeyDefinition.new({'keyCode': 48, 'code': 'Digit0', 'shiftKey': ')', 'key': '0'}),
84
- 'Digit1': KeyDefinition.new({'keyCode': 49, 'code': 'Digit1', 'shiftKey': '!', 'key': '1'}),
85
- 'Digit2': KeyDefinition.new({'keyCode': 50, 'code': 'Digit2', 'shiftKey': '@', 'key': '2'}),
86
- 'Digit3': KeyDefinition.new({'keyCode': 51, 'code': 'Digit3', 'shiftKey': '#', 'key': '3'}),
87
- 'Digit4': KeyDefinition.new({'keyCode': 52, 'code': 'Digit4', 'shiftKey': '$', 'key': '4'}),
88
- 'Digit5': KeyDefinition.new({'keyCode': 53, 'code': 'Digit5', 'shiftKey': '%', 'key': '5'}),
89
- 'Digit6': KeyDefinition.new({'keyCode': 54, 'code': 'Digit6', 'shiftKey': '^', 'key': '6'}),
90
- 'Digit7': KeyDefinition.new({'keyCode': 55, 'code': 'Digit7', 'shiftKey': '&', 'key': '7'}),
91
- 'Digit8': KeyDefinition.new({'keyCode': 56, 'code': 'Digit8', 'shiftKey': '*', 'key': '8'}),
92
- 'Digit9': KeyDefinition.new({'keyCode': 57, 'code': 'Digit9', 'shiftKey': '\(', 'key': '9'}),
93
- 'KeyA': KeyDefinition.new({'keyCode': 65, 'code': 'KeyA', 'shiftKey': 'A', 'key': 'a'}),
94
- 'KeyB': KeyDefinition.new({'keyCode': 66, 'code': 'KeyB', 'shiftKey': 'B', 'key': 'b'}),
95
- 'KeyC': KeyDefinition.new({'keyCode': 67, 'code': 'KeyC', 'shiftKey': 'C', 'key': 'c'}),
96
- 'KeyD': KeyDefinition.new({'keyCode': 68, 'code': 'KeyD', 'shiftKey': 'D', 'key': 'd'}),
97
- 'KeyE': KeyDefinition.new({'keyCode': 69, 'code': 'KeyE', 'shiftKey': 'E', 'key': 'e'}),
98
- 'KeyF': KeyDefinition.new({'keyCode': 70, 'code': 'KeyF', 'shiftKey': 'F', 'key': 'f'}),
99
- 'KeyG': KeyDefinition.new({'keyCode': 71, 'code': 'KeyG', 'shiftKey': 'G', 'key': 'g'}),
100
- 'KeyH': KeyDefinition.new({'keyCode': 72, 'code': 'KeyH', 'shiftKey': 'H', 'key': 'h'}),
101
- 'KeyI': KeyDefinition.new({'keyCode': 73, 'code': 'KeyI', 'shiftKey': 'I', 'key': 'i'}),
102
- 'KeyJ': KeyDefinition.new({'keyCode': 74, 'code': 'KeyJ', 'shiftKey': 'J', 'key': 'j'}),
103
- 'KeyK': KeyDefinition.new({'keyCode': 75, 'code': 'KeyK', 'shiftKey': 'K', 'key': 'k'}),
104
- 'KeyL': KeyDefinition.new({'keyCode': 76, 'code': 'KeyL', 'shiftKey': 'L', 'key': 'l'}),
105
- 'KeyM': KeyDefinition.new({'keyCode': 77, 'code': 'KeyM', 'shiftKey': 'M', 'key': 'm'}),
106
- 'KeyN': KeyDefinition.new({'keyCode': 78, 'code': 'KeyN', 'shiftKey': 'N', 'key': 'n'}),
107
- 'KeyO': KeyDefinition.new({'keyCode': 79, 'code': 'KeyO', 'shiftKey': 'O', 'key': 'o'}),
108
- 'KeyP': KeyDefinition.new({'keyCode': 80, 'code': 'KeyP', 'shiftKey': 'P', 'key': 'p'}),
109
- 'KeyQ': KeyDefinition.new({'keyCode': 81, 'code': 'KeyQ', 'shiftKey': 'Q', 'key': 'q'}),
110
- 'KeyR': KeyDefinition.new({'keyCode': 82, 'code': 'KeyR', 'shiftKey': 'R', 'key': 'r'}),
111
- 'KeyS': KeyDefinition.new({'keyCode': 83, 'code': 'KeyS', 'shiftKey': 'S', 'key': 's'}),
112
- 'KeyT': KeyDefinition.new({'keyCode': 84, 'code': 'KeyT', 'shiftKey': 'T', 'key': 't'}),
113
- 'KeyU': KeyDefinition.new({'keyCode': 85, 'code': 'KeyU', 'shiftKey': 'U', 'key': 'u'}),
114
- 'KeyV': KeyDefinition.new({'keyCode': 86, 'code': 'KeyV', 'shiftKey': 'V', 'key': 'v'}),
115
- 'KeyW': KeyDefinition.new({'keyCode': 87, 'code': 'KeyW', 'shiftKey': 'W', 'key': 'w'}),
116
- 'KeyX': KeyDefinition.new({'keyCode': 88, 'code': 'KeyX', 'shiftKey': 'X', 'key': 'x'}),
117
- 'KeyY': KeyDefinition.new({'keyCode': 89, 'code': 'KeyY', 'shiftKey': 'Y', 'key': 'y'}),
118
- 'KeyZ': KeyDefinition.new({'keyCode': 90, 'code': 'KeyZ', 'shiftKey': 'Z', 'key': 'z'}),
119
- 'MetaLeft': KeyDefinition.new({'keyCode': 91, 'code': 'MetaLeft', 'key': 'Meta', 'location': 1}),
120
- 'MetaRight': KeyDefinition.new({'keyCode': 92, 'code': 'MetaRight', 'key': 'Meta', 'location': 2}),
121
- 'ContextMenu': KeyDefinition.new({'keyCode': 93, 'code': 'ContextMenu', 'key': 'ContextMenu'}),
122
- 'NumpadMultiply': KeyDefinition.new({'keyCode': 106, 'code': 'NumpadMultiply', 'key': '*', 'location': 3}),
123
- 'NumpadAdd': KeyDefinition.new({'keyCode': 107, 'code': 'NumpadAdd', 'key': '+', 'location': 3}),
124
- 'NumpadSubtract': KeyDefinition.new({'keyCode': 109, 'code': 'NumpadSubtract', 'key': '-', 'location': 3}),
125
- 'NumpadDivide': KeyDefinition.new({'keyCode': 111, 'code': 'NumpadDivide', 'key': '/', 'location': 3}),
126
- 'F1': KeyDefinition.new({'keyCode': 112, 'code': 'F1', 'key': 'F1'}),
127
- 'F2': KeyDefinition.new({'keyCode': 113, 'code': 'F2', 'key': 'F2'}),
128
- 'F3': KeyDefinition.new({'keyCode': 114, 'code': 'F3', 'key': 'F3'}),
129
- 'F4': KeyDefinition.new({'keyCode': 115, 'code': 'F4', 'key': 'F4'}),
130
- 'F5': KeyDefinition.new({'keyCode': 116, 'code': 'F5', 'key': 'F5'}),
131
- 'F6': KeyDefinition.new({'keyCode': 117, 'code': 'F6', 'key': 'F6'}),
132
- 'F7': KeyDefinition.new({'keyCode': 118, 'code': 'F7', 'key': 'F7'}),
133
- 'F8': KeyDefinition.new({'keyCode': 119, 'code': 'F8', 'key': 'F8'}),
134
- 'F9': KeyDefinition.new({'keyCode': 120, 'code': 'F9', 'key': 'F9'}),
135
- 'F10': KeyDefinition.new({'keyCode': 121, 'code': 'F10', 'key': 'F10'}),
136
- 'F11': KeyDefinition.new({'keyCode': 122, 'code': 'F11', 'key': 'F11'}),
137
- 'F12': KeyDefinition.new({'keyCode': 123, 'code': 'F12', 'key': 'F12'}),
138
- 'F13': KeyDefinition.new({'keyCode': 124, 'code': 'F13', 'key': 'F13'}),
139
- 'F14': KeyDefinition.new({'keyCode': 125, 'code': 'F14', 'key': 'F14'}),
140
- 'F15': KeyDefinition.new({'keyCode': 126, 'code': 'F15', 'key': 'F15'}),
141
- 'F16': KeyDefinition.new({'keyCode': 127, 'code': 'F16', 'key': 'F16'}),
142
- 'F17': KeyDefinition.new({'keyCode': 128, 'code': 'F17', 'key': 'F17'}),
143
- 'F18': KeyDefinition.new({'keyCode': 129, 'code': 'F18', 'key': 'F18'}),
144
- 'F19': KeyDefinition.new({'keyCode': 130, 'code': 'F19', 'key': 'F19'}),
145
- 'F20': KeyDefinition.new({'keyCode': 131, 'code': 'F20', 'key': 'F20'}),
146
- 'F21': KeyDefinition.new({'keyCode': 132, 'code': 'F21', 'key': 'F21'}),
147
- 'F22': KeyDefinition.new({'keyCode': 133, 'code': 'F22', 'key': 'F22'}),
148
- 'F23': KeyDefinition.new({'keyCode': 134, 'code': 'F23', 'key': 'F23'}),
149
- 'F24': KeyDefinition.new({'keyCode': 135, 'code': 'F24', 'key': 'F24'}),
150
- 'NumLock': KeyDefinition.new({'keyCode': 144, 'code': 'NumLock', 'key': 'NumLock'}),
151
- 'ScrollLock': KeyDefinition.new({'keyCode': 145, 'code': 'ScrollLock', 'key': 'ScrollLock'}),
152
- 'AudioVolumeMute': KeyDefinition.new({'keyCode': 173, 'code': 'AudioVolumeMute', 'key': 'AudioVolumeMute'}),
153
- 'AudioVolumeDown': KeyDefinition.new({'keyCode': 174, 'code': 'AudioVolumeDown', 'key': 'AudioVolumeDown'}),
154
- 'AudioVolumeUp': KeyDefinition.new({'keyCode': 175, 'code': 'AudioVolumeUp', 'key': 'AudioVolumeUp'}),
155
- 'MediaTrackNext': KeyDefinition.new({'keyCode': 176, 'code': 'MediaTrackNext', 'key': 'MediaTrackNext'}),
156
- 'MediaTrackPrevious': KeyDefinition.new({'keyCode': 177, 'code': 'MediaTrackPrevious', 'key': 'MediaTrackPrevious'}),
157
- 'MediaStop': KeyDefinition.new({'keyCode': 178, 'code': 'MediaStop', 'key': 'MediaStop'}),
158
- 'MediaPlayPause': KeyDefinition.new({'keyCode': 179, 'code': 'MediaPlayPause', 'key': 'MediaPlayPause'}),
159
- 'Semicolon': KeyDefinition.new({'keyCode': 186, 'code': 'Semicolon', 'shiftKey': ':', 'key': ';'}),
160
- 'Equal': KeyDefinition.new({'keyCode': 187, 'code': 'Equal', 'shiftKey': '+', 'key': '='}),
161
- 'NumpadEqual': KeyDefinition.new({'keyCode': 187, 'code': 'NumpadEqual', 'key': '=', 'location': 3}),
162
- 'Comma': KeyDefinition.new({'keyCode': 188, 'code': 'Comma', 'shiftKey': '\<', 'key': ','}),
163
- 'Minus': KeyDefinition.new({'keyCode': 189, 'code': 'Minus', 'shiftKey': '_', 'key': '-'}),
164
- 'Period': KeyDefinition.new({'keyCode': 190, 'code': 'Period', 'shiftKey': '>', 'key': '.'}),
165
- 'Slash': KeyDefinition.new({'keyCode': 191, 'code': 'Slash', 'shiftKey': '?', 'key': '/'}),
166
- 'Backquote': KeyDefinition.new({'keyCode': 192, 'code': 'Backquote', 'shiftKey': '~', 'key': '`'}),
167
- 'BracketLeft': KeyDefinition.new({'keyCode': 219, 'code': 'BracketLeft', 'shiftKey': '{', 'key': '['}),
168
- 'Backslash': KeyDefinition.new({'keyCode': 220, 'code': 'Backslash', 'shiftKey': '|', 'key': '\\'}),
169
- 'BracketRight': KeyDefinition.new({'keyCode': 221, 'code': 'BracketRight', 'shiftKey': '}', 'key': ']'}),
170
- 'Quote': KeyDefinition.new({'keyCode': 222, 'code': 'Quote', 'shiftKey': '"', 'key': '\''}),
171
- 'AltGraph': KeyDefinition.new({'keyCode': 225, 'code': 'AltGraph', 'key': 'AltGraph'}),
172
- 'Props': KeyDefinition.new({'keyCode': 247, 'code': 'Props', 'key': 'CrSel'}),
173
- 'Cancel': KeyDefinition.new({'keyCode': 3, 'key': 'Cancel', 'code': 'Abort'}),
174
- 'Clear': KeyDefinition.new({'keyCode': 12, 'key': 'Clear', 'code': 'Numpad5', 'location': 3}),
175
- 'Shift': KeyDefinition.new({'keyCode': 16, 'key': 'Shift', 'code': 'ShiftLeft', 'location': 1}),
176
- 'Control': KeyDefinition.new({'keyCode': 17, 'key': 'Control', 'code': 'ControlLeft', 'location': 1}),
177
- 'Alt': KeyDefinition.new({'keyCode': 18, 'key': 'Alt', 'code': 'AltLeft', 'location': 1}),
178
- 'Accept': KeyDefinition.new({'keyCode': 30, 'key': 'Accept'}),
179
- 'ModeChange': KeyDefinition.new({'keyCode': 31, 'key': 'ModeChange'}),
180
- ' ': KeyDefinition.new({'keyCode': 32, 'key': ' ', 'code': 'Space'}),
181
- 'Print': KeyDefinition.new({'keyCode': 42, 'key': 'Print'}),
182
- 'Execute': KeyDefinition.new({'keyCode': 43, 'key': 'Execute', 'code': 'Open'}),
183
- '\u0000': KeyDefinition.new({'keyCode': 46, 'key': '\u0000', 'code': 'NumpadDecimal', 'location': 3}),
184
- 'a': KeyDefinition.new({'keyCode': 65, 'key': 'a', 'code': 'KeyA'}),
185
- 'b': KeyDefinition.new({'keyCode': 66, 'key': 'b', 'code': 'KeyB'}),
186
- 'c': KeyDefinition.new({'keyCode': 67, 'key': 'c', 'code': 'KeyC'}),
187
- 'd': KeyDefinition.new({'keyCode': 68, 'key': 'd', 'code': 'KeyD'}),
188
- 'e': KeyDefinition.new({'keyCode': 69, 'key': 'e', 'code': 'KeyE'}),
189
- 'f': KeyDefinition.new({'keyCode': 70, 'key': 'f', 'code': 'KeyF'}),
190
- 'g': KeyDefinition.new({'keyCode': 71, 'key': 'g', 'code': 'KeyG'}),
191
- 'h': KeyDefinition.new({'keyCode': 72, 'key': 'h', 'code': 'KeyH'}),
192
- 'i': KeyDefinition.new({'keyCode': 73, 'key': 'i', 'code': 'KeyI'}),
193
- 'j': KeyDefinition.new({'keyCode': 74, 'key': 'j', 'code': 'KeyJ'}),
194
- 'k': KeyDefinition.new({'keyCode': 75, 'key': 'k', 'code': 'KeyK'}),
195
- 'l': KeyDefinition.new({'keyCode': 76, 'key': 'l', 'code': 'KeyL'}),
196
- 'm': KeyDefinition.new({'keyCode': 77, 'key': 'm', 'code': 'KeyM'}),
197
- 'n': KeyDefinition.new({'keyCode': 78, 'key': 'n', 'code': 'KeyN'}),
198
- 'o': KeyDefinition.new({'keyCode': 79, 'key': 'o', 'code': 'KeyO'}),
199
- 'p': KeyDefinition.new({'keyCode': 80, 'key': 'p', 'code': 'KeyP'}),
200
- 'q': KeyDefinition.new({'keyCode': 81, 'key': 'q', 'code': 'KeyQ'}),
201
- 'r': KeyDefinition.new({'keyCode': 82, 'key': 'r', 'code': 'KeyR'}),
202
- 's': KeyDefinition.new({'keyCode': 83, 'key': 's', 'code': 'KeyS'}),
203
- 't': KeyDefinition.new({'keyCode': 84, 'key': 't', 'code': 'KeyT'}),
204
- 'u': KeyDefinition.new({'keyCode': 85, 'key': 'u', 'code': 'KeyU'}),
205
- 'v': KeyDefinition.new({'keyCode': 86, 'key': 'v', 'code': 'KeyV'}),
206
- 'w': KeyDefinition.new({'keyCode': 87, 'key': 'w', 'code': 'KeyW'}),
207
- 'x': KeyDefinition.new({'keyCode': 88, 'key': 'x', 'code': 'KeyX'}),
208
- 'y': KeyDefinition.new({'keyCode': 89, 'key': 'y', 'code': 'KeyY'}),
209
- 'z': KeyDefinition.new({'keyCode': 90, 'key': 'z', 'code': 'KeyZ'}),
210
- 'Meta': KeyDefinition.new({'keyCode': 91, 'key': 'Meta', 'code': 'MetaLeft', 'location': 1}),
211
- '*': KeyDefinition.new({'keyCode': 106, 'key': '*', 'code': 'NumpadMultiply', 'location': 3}),
212
- '+': KeyDefinition.new({'keyCode': 107, 'key': '+', 'code': 'NumpadAdd', 'location': 3}),
213
- '-': KeyDefinition.new({'keyCode': 109, 'key': '-', 'code': 'NumpadSubtract', 'location': 3}),
214
- '/': KeyDefinition.new({'keyCode': 111, 'key': '/', 'code': 'NumpadDivide', 'location': 3}),
215
- ';': KeyDefinition.new({'keyCode': 186, 'key': ';', 'code': 'Semicolon'}),
216
- '=': KeyDefinition.new({'keyCode': 187, 'key': '=', 'code': 'Equal'}),
217
- ',': KeyDefinition.new({'keyCode': 188, 'key': ',', 'code': 'Comma'}),
218
- '.': KeyDefinition.new({'keyCode': 190, 'key': '.', 'code': 'Period'}),
219
- '`': KeyDefinition.new({'keyCode': 192, 'key': '`', 'code': 'Backquote'}),
220
- '[': KeyDefinition.new({'keyCode': 219, 'key': '[', 'code': 'BracketLeft'}),
221
- '\\': KeyDefinition.new({'keyCode': 220, 'key': '\\', 'code': 'Backslash'}),
222
- ']': KeyDefinition.new({'keyCode': 221, 'key': ']', 'code': 'BracketRight'}),
223
- '\'': KeyDefinition.new({'keyCode': 222, 'key': '\'', 'code': 'Quote'}),
224
- 'Attn': KeyDefinition.new({'keyCode': 246, 'key': 'Attn'}),
225
- 'CrSel': KeyDefinition.new({'keyCode': 247, 'key': 'CrSel', 'code': 'Props'}),
226
- 'ExSel': KeyDefinition.new({'keyCode': 248, 'key': 'ExSel'}),
227
- 'EraseEof': KeyDefinition.new({'keyCode': 249, 'key': 'EraseEof'}),
228
- 'Play': KeyDefinition.new({'keyCode': 250, 'key': 'Play'}),
229
- 'ZoomOut': KeyDefinition.new({'keyCode': 251, 'key': 'ZoomOut'}),
230
- ')': KeyDefinition.new({'keyCode': 48, 'key': ')', 'code': 'Digit0'}),
231
- '!': KeyDefinition.new({'keyCode': 49, 'key': '!', 'code': 'Digit1'}),
232
- '@': KeyDefinition.new({'keyCode': 50, 'key': '@', 'code': 'Digit2'}),
233
- '#': KeyDefinition.new({'keyCode': 51, 'key': '#', 'code': 'Digit3'}),
234
- '$': KeyDefinition.new({'keyCode': 52, 'key': '$', 'code': 'Digit4'}),
235
- '%': KeyDefinition.new({'keyCode': 53, 'key': '%', 'code': 'Digit5'}),
236
- '^': KeyDefinition.new({'keyCode': 54, 'key': '^', 'code': 'Digit6'}),
237
- '&': KeyDefinition.new({'keyCode': 55, 'key': '&', 'code': 'Digit7'}),
238
- '(': KeyDefinition.new({'keyCode': 57, 'key': '\(', 'code': 'Digit9'}),
239
- 'A': KeyDefinition.new({'keyCode': 65, 'key': 'A', 'code': 'KeyA'}),
240
- 'B': KeyDefinition.new({'keyCode': 66, 'key': 'B', 'code': 'KeyB'}),
241
- 'C': KeyDefinition.new({'keyCode': 67, 'key': 'C', 'code': 'KeyC'}),
242
- 'D': KeyDefinition.new({'keyCode': 68, 'key': 'D', 'code': 'KeyD'}),
243
- 'E': KeyDefinition.new({'keyCode': 69, 'key': 'E', 'code': 'KeyE'}),
244
- 'F': KeyDefinition.new({'keyCode': 70, 'key': 'F', 'code': 'KeyF'}),
245
- 'G': KeyDefinition.new({'keyCode': 71, 'key': 'G', 'code': 'KeyG'}),
246
- 'H': KeyDefinition.new({'keyCode': 72, 'key': 'H', 'code': 'KeyH'}),
247
- 'I': KeyDefinition.new({'keyCode': 73, 'key': 'I', 'code': 'KeyI'}),
248
- 'J': KeyDefinition.new({'keyCode': 74, 'key': 'J', 'code': 'KeyJ'}),
249
- 'K': KeyDefinition.new({'keyCode': 75, 'key': 'K', 'code': 'KeyK'}),
250
- 'L': KeyDefinition.new({'keyCode': 76, 'key': 'L', 'code': 'KeyL'}),
251
- 'M': KeyDefinition.new({'keyCode': 77, 'key': 'M', 'code': 'KeyM'}),
252
- 'N': KeyDefinition.new({'keyCode': 78, 'key': 'N', 'code': 'KeyN'}),
253
- 'O': KeyDefinition.new({'keyCode': 79, 'key': 'O', 'code': 'KeyO'}),
254
- 'P': KeyDefinition.new({'keyCode': 80, 'key': 'P', 'code': 'KeyP'}),
255
- 'Q': KeyDefinition.new({'keyCode': 81, 'key': 'Q', 'code': 'KeyQ'}),
256
- 'R': KeyDefinition.new({'keyCode': 82, 'key': 'R', 'code': 'KeyR'}),
257
- 'S': KeyDefinition.new({'keyCode': 83, 'key': 'S', 'code': 'KeyS'}),
258
- 'T': KeyDefinition.new({'keyCode': 84, 'key': 'T', 'code': 'KeyT'}),
259
- 'U': KeyDefinition.new({'keyCode': 85, 'key': 'U', 'code': 'KeyU'}),
260
- 'V': KeyDefinition.new({'keyCode': 86, 'key': 'V', 'code': 'KeyV'}),
261
- 'W': KeyDefinition.new({'keyCode': 87, 'key': 'W', 'code': 'KeyW'}),
262
- 'X': KeyDefinition.new({'keyCode': 88, 'key': 'X', 'code': 'KeyX'}),
263
- 'Y': KeyDefinition.new({'keyCode': 89, 'key': 'Y', 'code': 'KeyY'}),
264
- 'Z': KeyDefinition.new({'keyCode': 90, 'key': 'Z', 'code': 'KeyZ'}),
265
- ':': KeyDefinition.new({'keyCode': 186, 'key': ':', 'code': 'Semicolon'}),
266
- '<': KeyDefinition.new({'keyCode': 188, 'key': '\<', 'code': 'Comma'}),
267
- '_': KeyDefinition.new({'keyCode': 189, 'key': '_', 'code': 'Minus'}),
268
- '>': KeyDefinition.new({'keyCode': 190, 'key': '>', 'code': 'Period'}),
269
- '?': KeyDefinition.new({'keyCode': 191, 'key': '?', 'code': 'Slash'}),
270
- '~': KeyDefinition.new({'keyCode': 192, 'key': '~', 'code': 'Backquote'}),
271
- '{': KeyDefinition.new({'keyCode': 219, 'key': '{', 'code': 'BracketLeft'}),
272
- '|': KeyDefinition.new({'keyCode': 220, 'key': '|', 'code': 'Backslash'}),
273
- '}': KeyDefinition.new({'keyCode': 221, 'key': '}', 'code': 'BracketRight'}),
274
- '"': KeyDefinition.new({'keyCode': 222, 'key': '"', 'code': 'Quote'}),
275
- 'SoftLeft': KeyDefinition.new({'key': 'SoftLeft', 'code': 'SoftLeft', 'location': 4}),
276
- 'SoftRight': KeyDefinition.new({'key': 'SoftRight', 'code': 'SoftRight', 'location': 4}),
277
- 'Camera': KeyDefinition.new({'keyCode': 44, 'key': 'Camera', 'code': 'Camera', 'location': 4}),
278
- 'Call': KeyDefinition.new({'key': 'Call', 'code': 'Call', 'location': 4}),
279
- 'EndCall': KeyDefinition.new({'keyCode': 95, 'key': 'EndCall', 'code': 'EndCall', 'location': 4}),
280
- 'VolumeDown': KeyDefinition.new({'keyCode': 182, 'key': 'VolumeDown', 'code': 'VolumeDown', 'location': 4}),
281
- 'VolumeUp': KeyDefinition.new({'keyCode': 183, 'key': 'VolumeUp', 'code': 'VolumeUp', 'location': 4}),
27
+ '0': KeyDefinition.new({ 'keyCode': 48, 'key': '0', 'code': 'Digit0' }),
28
+ '1': KeyDefinition.new({ 'keyCode': 49, 'key': '1', 'code': 'Digit1' }),
29
+ '2': KeyDefinition.new({ 'keyCode': 50, 'key': '2', 'code': 'Digit2' }),
30
+ '3': KeyDefinition.new({ 'keyCode': 51, 'key': '3', 'code': 'Digit3' }),
31
+ '4': KeyDefinition.new({ 'keyCode': 52, 'key': '4', 'code': 'Digit4' }),
32
+ '5': KeyDefinition.new({ 'keyCode': 53, 'key': '5', 'code': 'Digit5' }),
33
+ '6': KeyDefinition.new({ 'keyCode': 54, 'key': '6', 'code': 'Digit6' }),
34
+ '7': KeyDefinition.new({ 'keyCode': 55, 'key': '7', 'code': 'Digit7' }),
35
+ '8': KeyDefinition.new({ 'keyCode': 56, 'key': '8', 'code': 'Digit8' }),
36
+ '9': KeyDefinition.new({ 'keyCode': 57, 'key': '9', 'code': 'Digit9' }),
37
+ 'Power': KeyDefinition.new({ 'key': 'Power', 'code': 'Power' }),
38
+ 'Eject': KeyDefinition.new({ 'key': 'Eject', 'code': 'Eject' }),
39
+ 'Abort': KeyDefinition.new({ 'keyCode': 3, 'code': 'Abort', 'key': 'Cancel' }),
40
+ 'Help': KeyDefinition.new({ 'keyCode': 6, 'code': 'Help', 'key': 'Help' }),
41
+ 'Backspace': KeyDefinition.new({ 'keyCode': 8, 'code': 'Backspace', 'key': 'Backspace' }),
42
+ 'Tab': KeyDefinition.new({ 'keyCode': 9, 'code': 'Tab', 'key': 'Tab' }),
43
+ 'Numpad5': KeyDefinition.new({ 'keyCode': 12, 'shiftKeyCode': 101, 'key': 'Clear', 'code': 'Numpad5', 'shiftKey': '5', 'location': 3 }),
44
+ 'NumpadEnter': KeyDefinition.new({ 'keyCode': 13, 'code': 'NumpadEnter', 'key': 'Enter', 'text': '\r', 'location': 3 }),
45
+ 'Enter': KeyDefinition.new({ 'keyCode': 13, 'code': 'Enter', 'key': 'Enter', 'text': '\r' }),
46
+ '\r': KeyDefinition.new({ 'keyCode': 13, 'code': 'Enter', 'key': 'Enter', 'text': '\r' }),
47
+ '\n': KeyDefinition.new({ 'keyCode': 13, 'code': 'Enter', 'key': 'Enter', 'text': '\r' }),
48
+ 'ShiftLeft': KeyDefinition.new({ 'keyCode': 16, 'code': 'ShiftLeft', 'key': 'Shift', 'location': 1 }),
49
+ 'ShiftRight': KeyDefinition.new({ 'keyCode': 16, 'code': 'ShiftRight', 'key': 'Shift', 'location': 2 }),
50
+ 'ControlLeft': KeyDefinition.new({ 'keyCode': 17, 'code': 'ControlLeft', 'key': 'Control', 'location': 1 }),
51
+ 'ControlRight': KeyDefinition.new({ 'keyCode': 17, 'code': 'ControlRight', 'key': 'Control', 'location': 2 }),
52
+ 'AltLeft': KeyDefinition.new({ 'keyCode': 18, 'code': 'AltLeft', 'key': 'Alt', 'location': 1 }),
53
+ 'AltRight': KeyDefinition.new({ 'keyCode': 18, 'code': 'AltRight', 'key': 'Alt', 'location': 2 }),
54
+ 'Pause': KeyDefinition.new({ 'keyCode': 19, 'code': 'Pause', 'key': 'Pause' }),
55
+ 'CapsLock': KeyDefinition.new({ 'keyCode': 20, 'code': 'CapsLock', 'key': 'CapsLock' }),
56
+ 'Escape': KeyDefinition.new({ 'keyCode': 27, 'code': 'Escape', 'key': 'Escape' }),
57
+ 'Convert': KeyDefinition.new({ 'keyCode': 28, 'code': 'Convert', 'key': 'Convert' }),
58
+ 'NonConvert': KeyDefinition.new({ 'keyCode': 29, 'code': 'NonConvert', 'key': 'NonConvert' }),
59
+ 'Space': KeyDefinition.new({ 'keyCode': 32, 'code': 'Space', 'key': ' ' }),
60
+ 'Numpad9': KeyDefinition.new({ 'keyCode': 33, 'shiftKeyCode': 105, 'key': 'PageUp', 'code': 'Numpad9', 'shiftKey': '9', 'location': 3 }),
61
+ 'PageUp': KeyDefinition.new({ 'keyCode': 33, 'code': 'PageUp', 'key': 'PageUp' }),
62
+ 'Numpad3': KeyDefinition.new({ 'keyCode': 34, 'shiftKeyCode': 99, 'key': 'PageDown', 'code': 'Numpad3', 'shiftKey': '3', 'location': 3 }),
63
+ 'PageDown': KeyDefinition.new({ 'keyCode': 34, 'code': 'PageDown', 'key': 'PageDown' }),
64
+ 'End': KeyDefinition.new({ 'keyCode': 35, 'code': 'End', 'key': 'End' }),
65
+ 'Numpad1': KeyDefinition.new({ 'keyCode': 35, 'shiftKeyCode': 97, 'key': 'End', 'code': 'Numpad1', 'shiftKey': '1', 'location': 3 }),
66
+ 'Home': KeyDefinition.new({ 'keyCode': 36, 'code': 'Home', 'key': 'Home' }),
67
+ 'Numpad7': KeyDefinition.new({ 'keyCode': 36, 'shiftKeyCode': 103, 'key': 'Home', 'code': 'Numpad7', 'shiftKey': '7', 'location': 3 }),
68
+ 'ArrowLeft': KeyDefinition.new({ 'keyCode': 37, 'code': 'ArrowLeft', 'key': 'ArrowLeft' }),
69
+ 'Numpad4': KeyDefinition.new({ 'keyCode': 37, 'shiftKeyCode': 100, 'key': 'ArrowLeft', 'code': 'Numpad4', 'shiftKey': '4', 'location': 3 }),
70
+ 'Numpad8': KeyDefinition.new({ 'keyCode': 38, 'shiftKeyCode': 104, 'key': 'ArrowUp', 'code': 'Numpad8', 'shiftKey': '8', 'location': 3 }),
71
+ 'ArrowUp': KeyDefinition.new({ 'keyCode': 38, 'code': 'ArrowUp', 'key': 'ArrowUp' }),
72
+ 'ArrowRight': KeyDefinition.new({ 'keyCode': 39, 'code': 'ArrowRight', 'key': 'ArrowRight' }),
73
+ 'Numpad6': KeyDefinition.new({ 'keyCode': 39, 'shiftKeyCode': 102, 'key': 'ArrowRight', 'code': 'Numpad6', 'shiftKey': '6', 'location': 3 }),
74
+ 'Numpad2': KeyDefinition.new({ 'keyCode': 40, 'shiftKeyCode': 98, 'key': 'ArrowDown', 'code': 'Numpad2', 'shiftKey': '2', 'location': 3 }),
75
+ 'ArrowDown': KeyDefinition.new({ 'keyCode': 40, 'code': 'ArrowDown', 'key': 'ArrowDown' }),
76
+ 'Select': KeyDefinition.new({ 'keyCode': 41, 'code': 'Select', 'key': 'Select' }),
77
+ 'Open': KeyDefinition.new({ 'keyCode': 43, 'code': 'Open', 'key': 'Execute' }),
78
+ 'PrintScreen': KeyDefinition.new({ 'keyCode': 44, 'code': 'PrintScreen', 'key': 'PrintScreen' }),
79
+ 'Insert': KeyDefinition.new({ 'keyCode': 45, 'code': 'Insert', 'key': 'Insert' }),
80
+ 'Numpad0': KeyDefinition.new({ 'keyCode': 45, 'shiftKeyCode': 96, 'key': 'Insert', 'code': 'Numpad0', 'shiftKey': '0', 'location': 3 }),
81
+ 'Delete': KeyDefinition.new({ 'keyCode': 46, 'code': 'Delete', 'key': 'Delete' }),
82
+ 'NumpadDecimal': KeyDefinition.new({ 'keyCode': 46, 'shiftKeyCode': 110, 'code': 'NumpadDecimal', 'key': '\u0000', 'shiftKey': '.', 'location': 3 }),
83
+ 'Digit0': KeyDefinition.new({ 'keyCode': 48, 'code': 'Digit0', 'shiftKey': ')', 'key': '0' }),
84
+ 'Digit1': KeyDefinition.new({ 'keyCode': 49, 'code': 'Digit1', 'shiftKey': '!', 'key': '1' }),
85
+ 'Digit2': KeyDefinition.new({ 'keyCode': 50, 'code': 'Digit2', 'shiftKey': '@', 'key': '2' }),
86
+ 'Digit3': KeyDefinition.new({ 'keyCode': 51, 'code': 'Digit3', 'shiftKey': '#', 'key': '3' }),
87
+ 'Digit4': KeyDefinition.new({ 'keyCode': 52, 'code': 'Digit4', 'shiftKey': '$', 'key': '4' }),
88
+ 'Digit5': KeyDefinition.new({ 'keyCode': 53, 'code': 'Digit5', 'shiftKey': '%', 'key': '5' }),
89
+ 'Digit6': KeyDefinition.new({ 'keyCode': 54, 'code': 'Digit6', 'shiftKey': '^', 'key': '6' }),
90
+ 'Digit7': KeyDefinition.new({ 'keyCode': 55, 'code': 'Digit7', 'shiftKey': '&', 'key': '7' }),
91
+ 'Digit8': KeyDefinition.new({ 'keyCode': 56, 'code': 'Digit8', 'shiftKey': '*', 'key': '8' }),
92
+ 'Digit9': KeyDefinition.new({ 'keyCode': 57, 'code': 'Digit9', 'shiftKey': '\(', 'key': '9' }),
93
+ 'KeyA': KeyDefinition.new({ 'keyCode': 65, 'code': 'KeyA', 'shiftKey': 'A', 'key': 'a' }),
94
+ 'KeyB': KeyDefinition.new({ 'keyCode': 66, 'code': 'KeyB', 'shiftKey': 'B', 'key': 'b' }),
95
+ 'KeyC': KeyDefinition.new({ 'keyCode': 67, 'code': 'KeyC', 'shiftKey': 'C', 'key': 'c' }),
96
+ 'KeyD': KeyDefinition.new({ 'keyCode': 68, 'code': 'KeyD', 'shiftKey': 'D', 'key': 'd' }),
97
+ 'KeyE': KeyDefinition.new({ 'keyCode': 69, 'code': 'KeyE', 'shiftKey': 'E', 'key': 'e' }),
98
+ 'KeyF': KeyDefinition.new({ 'keyCode': 70, 'code': 'KeyF', 'shiftKey': 'F', 'key': 'f' }),
99
+ 'KeyG': KeyDefinition.new({ 'keyCode': 71, 'code': 'KeyG', 'shiftKey': 'G', 'key': 'g' }),
100
+ 'KeyH': KeyDefinition.new({ 'keyCode': 72, 'code': 'KeyH', 'shiftKey': 'H', 'key': 'h' }),
101
+ 'KeyI': KeyDefinition.new({ 'keyCode': 73, 'code': 'KeyI', 'shiftKey': 'I', 'key': 'i' }),
102
+ 'KeyJ': KeyDefinition.new({ 'keyCode': 74, 'code': 'KeyJ', 'shiftKey': 'J', 'key': 'j' }),
103
+ 'KeyK': KeyDefinition.new({ 'keyCode': 75, 'code': 'KeyK', 'shiftKey': 'K', 'key': 'k' }),
104
+ 'KeyL': KeyDefinition.new({ 'keyCode': 76, 'code': 'KeyL', 'shiftKey': 'L', 'key': 'l' }),
105
+ 'KeyM': KeyDefinition.new({ 'keyCode': 77, 'code': 'KeyM', 'shiftKey': 'M', 'key': 'm' }),
106
+ 'KeyN': KeyDefinition.new({ 'keyCode': 78, 'code': 'KeyN', 'shiftKey': 'N', 'key': 'n' }),
107
+ 'KeyO': KeyDefinition.new({ 'keyCode': 79, 'code': 'KeyO', 'shiftKey': 'O', 'key': 'o' }),
108
+ 'KeyP': KeyDefinition.new({ 'keyCode': 80, 'code': 'KeyP', 'shiftKey': 'P', 'key': 'p' }),
109
+ 'KeyQ': KeyDefinition.new({ 'keyCode': 81, 'code': 'KeyQ', 'shiftKey': 'Q', 'key': 'q' }),
110
+ 'KeyR': KeyDefinition.new({ 'keyCode': 82, 'code': 'KeyR', 'shiftKey': 'R', 'key': 'r' }),
111
+ 'KeyS': KeyDefinition.new({ 'keyCode': 83, 'code': 'KeyS', 'shiftKey': 'S', 'key': 's' }),
112
+ 'KeyT': KeyDefinition.new({ 'keyCode': 84, 'code': 'KeyT', 'shiftKey': 'T', 'key': 't' }),
113
+ 'KeyU': KeyDefinition.new({ 'keyCode': 85, 'code': 'KeyU', 'shiftKey': 'U', 'key': 'u' }),
114
+ 'KeyV': KeyDefinition.new({ 'keyCode': 86, 'code': 'KeyV', 'shiftKey': 'V', 'key': 'v' }),
115
+ 'KeyW': KeyDefinition.new({ 'keyCode': 87, 'code': 'KeyW', 'shiftKey': 'W', 'key': 'w' }),
116
+ 'KeyX': KeyDefinition.new({ 'keyCode': 88, 'code': 'KeyX', 'shiftKey': 'X', 'key': 'x' }),
117
+ 'KeyY': KeyDefinition.new({ 'keyCode': 89, 'code': 'KeyY', 'shiftKey': 'Y', 'key': 'y' }),
118
+ 'KeyZ': KeyDefinition.new({ 'keyCode': 90, 'code': 'KeyZ', 'shiftKey': 'Z', 'key': 'z' }),
119
+ 'MetaLeft': KeyDefinition.new({ 'keyCode': 91, 'code': 'MetaLeft', 'key': 'Meta', 'location': 1 }),
120
+ 'MetaRight': KeyDefinition.new({ 'keyCode': 92, 'code': 'MetaRight', 'key': 'Meta', 'location': 2 }),
121
+ 'ContextMenu': KeyDefinition.new({ 'keyCode': 93, 'code': 'ContextMenu', 'key': 'ContextMenu' }),
122
+ 'NumpadMultiply': KeyDefinition.new({ 'keyCode': 106, 'code': 'NumpadMultiply', 'key': '*', 'location': 3 }),
123
+ 'NumpadAdd': KeyDefinition.new({ 'keyCode': 107, 'code': 'NumpadAdd', 'key': '+', 'location': 3 }),
124
+ 'NumpadSubtract': KeyDefinition.new({ 'keyCode': 109, 'code': 'NumpadSubtract', 'key': '-', 'location': 3 }),
125
+ 'NumpadDivide': KeyDefinition.new({ 'keyCode': 111, 'code': 'NumpadDivide', 'key': '/', 'location': 3 }),
126
+ 'F1': KeyDefinition.new({ 'keyCode': 112, 'code': 'F1', 'key': 'F1' }),
127
+ 'F2': KeyDefinition.new({ 'keyCode': 113, 'code': 'F2', 'key': 'F2' }),
128
+ 'F3': KeyDefinition.new({ 'keyCode': 114, 'code': 'F3', 'key': 'F3' }),
129
+ 'F4': KeyDefinition.new({ 'keyCode': 115, 'code': 'F4', 'key': 'F4' }),
130
+ 'F5': KeyDefinition.new({ 'keyCode': 116, 'code': 'F5', 'key': 'F5' }),
131
+ 'F6': KeyDefinition.new({ 'keyCode': 117, 'code': 'F6', 'key': 'F6' }),
132
+ 'F7': KeyDefinition.new({ 'keyCode': 118, 'code': 'F7', 'key': 'F7' }),
133
+ 'F8': KeyDefinition.new({ 'keyCode': 119, 'code': 'F8', 'key': 'F8' }),
134
+ 'F9': KeyDefinition.new({ 'keyCode': 120, 'code': 'F9', 'key': 'F9' }),
135
+ 'F10': KeyDefinition.new({ 'keyCode': 121, 'code': 'F10', 'key': 'F10' }),
136
+ 'F11': KeyDefinition.new({ 'keyCode': 122, 'code': 'F11', 'key': 'F11' }),
137
+ 'F12': KeyDefinition.new({ 'keyCode': 123, 'code': 'F12', 'key': 'F12' }),
138
+ 'F13': KeyDefinition.new({ 'keyCode': 124, 'code': 'F13', 'key': 'F13' }),
139
+ 'F14': KeyDefinition.new({ 'keyCode': 125, 'code': 'F14', 'key': 'F14' }),
140
+ 'F15': KeyDefinition.new({ 'keyCode': 126, 'code': 'F15', 'key': 'F15' }),
141
+ 'F16': KeyDefinition.new({ 'keyCode': 127, 'code': 'F16', 'key': 'F16' }),
142
+ 'F17': KeyDefinition.new({ 'keyCode': 128, 'code': 'F17', 'key': 'F17' }),
143
+ 'F18': KeyDefinition.new({ 'keyCode': 129, 'code': 'F18', 'key': 'F18' }),
144
+ 'F19': KeyDefinition.new({ 'keyCode': 130, 'code': 'F19', 'key': 'F19' }),
145
+ 'F20': KeyDefinition.new({ 'keyCode': 131, 'code': 'F20', 'key': 'F20' }),
146
+ 'F21': KeyDefinition.new({ 'keyCode': 132, 'code': 'F21', 'key': 'F21' }),
147
+ 'F22': KeyDefinition.new({ 'keyCode': 133, 'code': 'F22', 'key': 'F22' }),
148
+ 'F23': KeyDefinition.new({ 'keyCode': 134, 'code': 'F23', 'key': 'F23' }),
149
+ 'F24': KeyDefinition.new({ 'keyCode': 135, 'code': 'F24', 'key': 'F24' }),
150
+ 'NumLock': KeyDefinition.new({ 'keyCode': 144, 'code': 'NumLock', 'key': 'NumLock' }),
151
+ 'ScrollLock': KeyDefinition.new({ 'keyCode': 145, 'code': 'ScrollLock', 'key': 'ScrollLock' }),
152
+ 'AudioVolumeMute': KeyDefinition.new({ 'keyCode': 173, 'code': 'AudioVolumeMute', 'key': 'AudioVolumeMute' }),
153
+ 'AudioVolumeDown': KeyDefinition.new({ 'keyCode': 174, 'code': 'AudioVolumeDown', 'key': 'AudioVolumeDown' }),
154
+ 'AudioVolumeUp': KeyDefinition.new({ 'keyCode': 175, 'code': 'AudioVolumeUp', 'key': 'AudioVolumeUp' }),
155
+ 'MediaTrackNext': KeyDefinition.new({ 'keyCode': 176, 'code': 'MediaTrackNext', 'key': 'MediaTrackNext' }),
156
+ 'MediaTrackPrevious': KeyDefinition.new({ 'keyCode': 177, 'code': 'MediaTrackPrevious', 'key': 'MediaTrackPrevious' }),
157
+ 'MediaStop': KeyDefinition.new({ 'keyCode': 178, 'code': 'MediaStop', 'key': 'MediaStop' }),
158
+ 'MediaPlayPause': KeyDefinition.new({ 'keyCode': 179, 'code': 'MediaPlayPause', 'key': 'MediaPlayPause' }),
159
+ 'Semicolon': KeyDefinition.new({ 'keyCode': 186, 'code': 'Semicolon', 'shiftKey': ':', 'key': ';' }),
160
+ 'Equal': KeyDefinition.new({ 'keyCode': 187, 'code': 'Equal', 'shiftKey': '+', 'key': '=' }),
161
+ 'NumpadEqual': KeyDefinition.new({ 'keyCode': 187, 'code': 'NumpadEqual', 'key': '=', 'location': 3 }),
162
+ 'Comma': KeyDefinition.new({ 'keyCode': 188, 'code': 'Comma', 'shiftKey': '\<', 'key': ',' }),
163
+ 'Minus': KeyDefinition.new({ 'keyCode': 189, 'code': 'Minus', 'shiftKey': '_', 'key': '-' }),
164
+ 'Period': KeyDefinition.new({ 'keyCode': 190, 'code': 'Period', 'shiftKey': '>', 'key': '.' }),
165
+ 'Slash': KeyDefinition.new({ 'keyCode': 191, 'code': 'Slash', 'shiftKey': '?', 'key': '/' }),
166
+ 'Backquote': KeyDefinition.new({ 'keyCode': 192, 'code': 'Backquote', 'shiftKey': '~', 'key': '`' }),
167
+ 'BracketLeft': KeyDefinition.new({ 'keyCode': 219, 'code': 'BracketLeft', 'shiftKey': '{', 'key': '[' }),
168
+ 'Backslash': KeyDefinition.new({ 'keyCode': 220, 'code': 'Backslash', 'shiftKey': '|', 'key': '\\' }),
169
+ 'BracketRight': KeyDefinition.new({ 'keyCode': 221, 'code': 'BracketRight', 'shiftKey': '}', 'key': ']' }),
170
+ 'Quote': KeyDefinition.new({ 'keyCode': 222, 'code': 'Quote', 'shiftKey': '"', 'key': '\'' }),
171
+ 'AltGraph': KeyDefinition.new({ 'keyCode': 225, 'code': 'AltGraph', 'key': 'AltGraph' }),
172
+ 'Props': KeyDefinition.new({ 'keyCode': 247, 'code': 'Props', 'key': 'CrSel' }),
173
+ 'Cancel': KeyDefinition.new({ 'keyCode': 3, 'key': 'Cancel', 'code': 'Abort' }),
174
+ 'Clear': KeyDefinition.new({ 'keyCode': 12, 'key': 'Clear', 'code': 'Numpad5', 'location': 3 }),
175
+ 'Shift': KeyDefinition.new({ 'keyCode': 16, 'key': 'Shift', 'code': 'ShiftLeft', 'location': 1 }),
176
+ 'Control': KeyDefinition.new({ 'keyCode': 17, 'key': 'Control', 'code': 'ControlLeft', 'location': 1 }),
177
+ 'Alt': KeyDefinition.new({ 'keyCode': 18, 'key': 'Alt', 'code': 'AltLeft', 'location': 1 }),
178
+ 'Accept': KeyDefinition.new({ 'keyCode': 30, 'key': 'Accept' }),
179
+ 'ModeChange': KeyDefinition.new({ 'keyCode': 31, 'key': 'ModeChange' }),
180
+ ' ': KeyDefinition.new({ 'keyCode': 32, 'key': ' ', 'code': 'Space' }),
181
+ 'Print': KeyDefinition.new({ 'keyCode': 42, 'key': 'Print' }),
182
+ 'Execute': KeyDefinition.new({ 'keyCode': 43, 'key': 'Execute', 'code': 'Open' }),
183
+ '\u0000': KeyDefinition.new({ 'keyCode': 46, 'key': '\u0000', 'code': 'NumpadDecimal', 'location': 3 }),
184
+ 'a': KeyDefinition.new({ 'keyCode': 65, 'key': 'a', 'code': 'KeyA' }),
185
+ 'b': KeyDefinition.new({ 'keyCode': 66, 'key': 'b', 'code': 'KeyB' }),
186
+ 'c': KeyDefinition.new({ 'keyCode': 67, 'key': 'c', 'code': 'KeyC' }),
187
+ 'd': KeyDefinition.new({ 'keyCode': 68, 'key': 'd', 'code': 'KeyD' }),
188
+ 'e': KeyDefinition.new({ 'keyCode': 69, 'key': 'e', 'code': 'KeyE' }),
189
+ 'f': KeyDefinition.new({ 'keyCode': 70, 'key': 'f', 'code': 'KeyF' }),
190
+ 'g': KeyDefinition.new({ 'keyCode': 71, 'key': 'g', 'code': 'KeyG' }),
191
+ 'h': KeyDefinition.new({ 'keyCode': 72, 'key': 'h', 'code': 'KeyH' }),
192
+ 'i': KeyDefinition.new({ 'keyCode': 73, 'key': 'i', 'code': 'KeyI' }),
193
+ 'j': KeyDefinition.new({ 'keyCode': 74, 'key': 'j', 'code': 'KeyJ' }),
194
+ 'k': KeyDefinition.new({ 'keyCode': 75, 'key': 'k', 'code': 'KeyK' }),
195
+ 'l': KeyDefinition.new({ 'keyCode': 76, 'key': 'l', 'code': 'KeyL' }),
196
+ 'm': KeyDefinition.new({ 'keyCode': 77, 'key': 'm', 'code': 'KeyM' }),
197
+ 'n': KeyDefinition.new({ 'keyCode': 78, 'key': 'n', 'code': 'KeyN' }),
198
+ 'o': KeyDefinition.new({ 'keyCode': 79, 'key': 'o', 'code': 'KeyO' }),
199
+ 'p': KeyDefinition.new({ 'keyCode': 80, 'key': 'p', 'code': 'KeyP' }),
200
+ 'q': KeyDefinition.new({ 'keyCode': 81, 'key': 'q', 'code': 'KeyQ' }),
201
+ 'r': KeyDefinition.new({ 'keyCode': 82, 'key': 'r', 'code': 'KeyR' }),
202
+ 's': KeyDefinition.new({ 'keyCode': 83, 'key': 's', 'code': 'KeyS' }),
203
+ 't': KeyDefinition.new({ 'keyCode': 84, 'key': 't', 'code': 'KeyT' }),
204
+ 'u': KeyDefinition.new({ 'keyCode': 85, 'key': 'u', 'code': 'KeyU' }),
205
+ 'v': KeyDefinition.new({ 'keyCode': 86, 'key': 'v', 'code': 'KeyV' }),
206
+ 'w': KeyDefinition.new({ 'keyCode': 87, 'key': 'w', 'code': 'KeyW' }),
207
+ 'x': KeyDefinition.new({ 'keyCode': 88, 'key': 'x', 'code': 'KeyX' }),
208
+ 'y': KeyDefinition.new({ 'keyCode': 89, 'key': 'y', 'code': 'KeyY' }),
209
+ 'z': KeyDefinition.new({ 'keyCode': 90, 'key': 'z', 'code': 'KeyZ' }),
210
+ 'Meta': KeyDefinition.new({ 'keyCode': 91, 'key': 'Meta', 'code': 'MetaLeft', 'location': 1 }),
211
+ '*': KeyDefinition.new({ 'keyCode': 106, 'key': '*', 'code': 'NumpadMultiply', 'location': 3 }),
212
+ '+': KeyDefinition.new({ 'keyCode': 107, 'key': '+', 'code': 'NumpadAdd', 'location': 3 }),
213
+ '-': KeyDefinition.new({ 'keyCode': 109, 'key': '-', 'code': 'NumpadSubtract', 'location': 3 }),
214
+ '/': KeyDefinition.new({ 'keyCode': 111, 'key': '/', 'code': 'NumpadDivide', 'location': 3 }),
215
+ ';': KeyDefinition.new({ 'keyCode': 186, 'key': ';', 'code': 'Semicolon' }),
216
+ '=': KeyDefinition.new({ 'keyCode': 187, 'key': '=', 'code': 'Equal' }),
217
+ ',': KeyDefinition.new({ 'keyCode': 188, 'key': ',', 'code': 'Comma' }),
218
+ '.': KeyDefinition.new({ 'keyCode': 190, 'key': '.', 'code': 'Period' }),
219
+ '`': KeyDefinition.new({ 'keyCode': 192, 'key': '`', 'code': 'Backquote' }),
220
+ '[': KeyDefinition.new({ 'keyCode': 219, 'key': '[', 'code': 'BracketLeft' }),
221
+ '\\': KeyDefinition.new({ 'keyCode': 220, 'key': '\\', 'code': 'Backslash' }),
222
+ ']': KeyDefinition.new({ 'keyCode': 221, 'key': ']', 'code': 'BracketRight' }),
223
+ '\'': KeyDefinition.new({ 'keyCode': 222, 'key': '\'', 'code': 'Quote' }),
224
+ 'Attn': KeyDefinition.new({ 'keyCode': 246, 'key': 'Attn' }),
225
+ 'CrSel': KeyDefinition.new({ 'keyCode': 247, 'key': 'CrSel', 'code': 'Props' }),
226
+ 'ExSel': KeyDefinition.new({ 'keyCode': 248, 'key': 'ExSel' }),
227
+ 'EraseEof': KeyDefinition.new({ 'keyCode': 249, 'key': 'EraseEof' }),
228
+ 'Play': KeyDefinition.new({ 'keyCode': 250, 'key': 'Play' }),
229
+ 'ZoomOut': KeyDefinition.new({ 'keyCode': 251, 'key': 'ZoomOut' }),
230
+ ')': KeyDefinition.new({ 'keyCode': 48, 'key': ')', 'code': 'Digit0' }),
231
+ '!': KeyDefinition.new({ 'keyCode': 49, 'key': '!', 'code': 'Digit1' }),
232
+ '@': KeyDefinition.new({ 'keyCode': 50, 'key': '@', 'code': 'Digit2' }),
233
+ '#': KeyDefinition.new({ 'keyCode': 51, 'key': '#', 'code': 'Digit3' }),
234
+ '$': KeyDefinition.new({ 'keyCode': 52, 'key': '$', 'code': 'Digit4' }),
235
+ '%': KeyDefinition.new({ 'keyCode': 53, 'key': '%', 'code': 'Digit5' }),
236
+ '^': KeyDefinition.new({ 'keyCode': 54, 'key': '^', 'code': 'Digit6' }),
237
+ '&': KeyDefinition.new({ 'keyCode': 55, 'key': '&', 'code': 'Digit7' }),
238
+ '(': KeyDefinition.new({ 'keyCode': 57, 'key': '\(', 'code': 'Digit9' }),
239
+ 'A': KeyDefinition.new({ 'keyCode': 65, 'key': 'A', 'code': 'KeyA' }),
240
+ 'B': KeyDefinition.new({ 'keyCode': 66, 'key': 'B', 'code': 'KeyB' }),
241
+ 'C': KeyDefinition.new({ 'keyCode': 67, 'key': 'C', 'code': 'KeyC' }),
242
+ 'D': KeyDefinition.new({ 'keyCode': 68, 'key': 'D', 'code': 'KeyD' }),
243
+ 'E': KeyDefinition.new({ 'keyCode': 69, 'key': 'E', 'code': 'KeyE' }),
244
+ 'F': KeyDefinition.new({ 'keyCode': 70, 'key': 'F', 'code': 'KeyF' }),
245
+ 'G': KeyDefinition.new({ 'keyCode': 71, 'key': 'G', 'code': 'KeyG' }),
246
+ 'H': KeyDefinition.new({ 'keyCode': 72, 'key': 'H', 'code': 'KeyH' }),
247
+ 'I': KeyDefinition.new({ 'keyCode': 73, 'key': 'I', 'code': 'KeyI' }),
248
+ 'J': KeyDefinition.new({ 'keyCode': 74, 'key': 'J', 'code': 'KeyJ' }),
249
+ 'K': KeyDefinition.new({ 'keyCode': 75, 'key': 'K', 'code': 'KeyK' }),
250
+ 'L': KeyDefinition.new({ 'keyCode': 76, 'key': 'L', 'code': 'KeyL' }),
251
+ 'M': KeyDefinition.new({ 'keyCode': 77, 'key': 'M', 'code': 'KeyM' }),
252
+ 'N': KeyDefinition.new({ 'keyCode': 78, 'key': 'N', 'code': 'KeyN' }),
253
+ 'O': KeyDefinition.new({ 'keyCode': 79, 'key': 'O', 'code': 'KeyO' }),
254
+ 'P': KeyDefinition.new({ 'keyCode': 80, 'key': 'P', 'code': 'KeyP' }),
255
+ 'Q': KeyDefinition.new({ 'keyCode': 81, 'key': 'Q', 'code': 'KeyQ' }),
256
+ 'R': KeyDefinition.new({ 'keyCode': 82, 'key': 'R', 'code': 'KeyR' }),
257
+ 'S': KeyDefinition.new({ 'keyCode': 83, 'key': 'S', 'code': 'KeyS' }),
258
+ 'T': KeyDefinition.new({ 'keyCode': 84, 'key': 'T', 'code': 'KeyT' }),
259
+ 'U': KeyDefinition.new({ 'keyCode': 85, 'key': 'U', 'code': 'KeyU' }),
260
+ 'V': KeyDefinition.new({ 'keyCode': 86, 'key': 'V', 'code': 'KeyV' }),
261
+ 'W': KeyDefinition.new({ 'keyCode': 87, 'key': 'W', 'code': 'KeyW' }),
262
+ 'X': KeyDefinition.new({ 'keyCode': 88, 'key': 'X', 'code': 'KeyX' }),
263
+ 'Y': KeyDefinition.new({ 'keyCode': 89, 'key': 'Y', 'code': 'KeyY' }),
264
+ 'Z': KeyDefinition.new({ 'keyCode': 90, 'key': 'Z', 'code': 'KeyZ' }),
265
+ ':': KeyDefinition.new({ 'keyCode': 186, 'key': ':', 'code': 'Semicolon' }),
266
+ '<': KeyDefinition.new({ 'keyCode': 188, 'key': '\<', 'code': 'Comma' }),
267
+ '_': KeyDefinition.new({ 'keyCode': 189, 'key': '_', 'code': 'Minus' }),
268
+ '>': KeyDefinition.new({ 'keyCode': 190, 'key': '>', 'code': 'Period' }),
269
+ '?': KeyDefinition.new({ 'keyCode': 191, 'key': '?', 'code': 'Slash' }),
270
+ '~': KeyDefinition.new({ 'keyCode': 192, 'key': '~', 'code': 'Backquote' }),
271
+ '{': KeyDefinition.new({ 'keyCode': 219, 'key': '{', 'code': 'BracketLeft' }),
272
+ '|': KeyDefinition.new({ 'keyCode': 220, 'key': '|', 'code': 'Backslash' }),
273
+ '}': KeyDefinition.new({ 'keyCode': 221, 'key': '}', 'code': 'BracketRight' }),
274
+ '"': KeyDefinition.new({ 'keyCode': 222, 'key': '"', 'code': 'Quote' }),
275
+ 'SoftLeft': KeyDefinition.new({ 'key': 'SoftLeft', 'code': 'SoftLeft', 'location': 4 }),
276
+ 'SoftRight': KeyDefinition.new({ 'key': 'SoftRight', 'code': 'SoftRight', 'location': 4 }),
277
+ 'Camera': KeyDefinition.new({ 'keyCode': 44, 'key': 'Camera', 'code': 'Camera', 'location': 4 }),
278
+ 'Call': KeyDefinition.new({ 'key': 'Call', 'code': 'Call', 'location': 4 }),
279
+ 'EndCall': KeyDefinition.new({ 'keyCode': 95, 'key': 'EndCall', 'code': 'EndCall', 'location': 4 }),
280
+ 'VolumeDown': KeyDefinition.new({ 'keyCode': 182, 'key': 'VolumeDown', 'code': 'VolumeDown', 'location': 4 }),
281
+ 'VolumeUp': KeyDefinition.new({ 'keyCode': 183, 'key': 'VolumeUp', 'code': 'VolumeUp', 'location': 4 }),
282
282
  }
283
283
  end