tesla_api 3.0.7 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -24,11 +24,11 @@ _Note:_ all `*_range` values are in miles, irrespective of GUI configuration.
24
24
  "in_service": false,
25
25
  "id_s": "12345678901234567",
26
26
  "calendar_enabled": true,
27
- "api_version": 10,
27
+ "api_version": 13,
28
28
  "backseat_token": null,
29
29
  "backseat_token_updated_at": null,
30
30
  "drive_state": {
31
- "gps_as_of": 1604977043,
31
+ "gps_as_of": 1607623884,
32
32
  "heading": 5,
33
33
  "latitude": 33.111111,
34
34
  "longitude": -88.111111,
@@ -36,80 +36,80 @@ _Note:_ all `*_range` values are in miles, irrespective of GUI configuration.
36
36
  "native_location_supported": 1,
37
37
  "native_longitude": -88.111111,
38
38
  "native_type": "wgs",
39
- "power": 0,
39
+ "power": -9,
40
40
  "shift_state": null,
41
41
  "speed": null,
42
- "timestamp": 1604977044186
42
+ "timestamp": 1607623897515
43
43
  },
44
44
  "climate_state": {
45
45
  "battery_heater": false,
46
46
  "battery_heater_no_power": false,
47
47
  "climate_keeper_mode": "off",
48
48
  "defrost_mode": 0,
49
- "driver_temp_setting": 22.8,
49
+ "driver_temp_setting": 21.1,
50
50
  "fan_status": 0,
51
- "inside_temp": 26.9,
51
+ "inside_temp": 22.1,
52
52
  "is_auto_conditioning_on": false,
53
53
  "is_climate_on": false,
54
54
  "is_front_defroster_on": false,
55
55
  "is_preconditioning": false,
56
56
  "is_rear_defroster_on": false,
57
- "left_temp_direction": -224,
57
+ "left_temp_direction": -66,
58
58
  "max_avail_temp": 28.0,
59
59
  "min_avail_temp": 15.0,
60
- "outside_temp": 23.0,
61
- "passenger_temp_setting": 22.8,
60
+ "outside_temp": 18.0,
61
+ "passenger_temp_setting": 21.1,
62
62
  "remote_heater_control_enabled": false,
63
- "right_temp_direction": -224,
63
+ "right_temp_direction": -66,
64
64
  "seat_heater_left": 0,
65
65
  "seat_heater_right": 0,
66
66
  "side_mirror_heaters": false,
67
- "timestamp": 1604977044186,
67
+ "timestamp": 1607623897515,
68
68
  "wiper_blade_heater": false
69
69
  },
70
70
  "charge_state": {
71
71
  "battery_heater_on": false,
72
- "battery_level": 90,
73
- "battery_range": 224.47,
72
+ "battery_level": 59,
73
+ "battery_range": 149.92,
74
74
  "charge_current_request": 40,
75
75
  "charge_current_request_max": 40,
76
76
  "charge_enable_request": true,
77
- "charge_energy_added": 29.41,
77
+ "charge_energy_added": 2.42,
78
78
  "charge_limit_soc": 90,
79
79
  "charge_limit_soc_max": 100,
80
80
  "charge_limit_soc_min": 50,
81
81
  "charge_limit_soc_std": 90,
82
- "charge_miles_added_ideal": 118.5,
83
- "charge_miles_added_rated": 95.0,
82
+ "charge_miles_added_ideal": 10.0,
83
+ "charge_miles_added_rated": 8.0,
84
84
  "charge_port_cold_weather_mode": null,
85
85
  "charge_port_door_open": true,
86
86
  "charge_port_latch": "Engaged",
87
- "charge_rate": 0.0,
87
+ "charge_rate": 28.0,
88
88
  "charge_to_max_range": false,
89
- "charger_actual_current": 0,
90
- "charger_phases": null,
89
+ "charger_actual_current": 40,
90
+ "charger_phases": 1,
91
91
  "charger_pilot_current": 40,
92
- "charger_power": 0,
93
- "charger_voltage": 0,
94
- "charging_state": "Complete",
92
+ "charger_power": 9,
93
+ "charger_voltage": 243,
94
+ "charging_state": "Charging",
95
95
  "conn_charge_cable": "SAE",
96
- "est_battery_range": 171.24,
96
+ "est_battery_range": 132.98,
97
97
  "fast_charger_brand": "<invalid>",
98
98
  "fast_charger_present": false,
99
99
  "fast_charger_type": "<invalid>",
100
- "ideal_battery_range": 280.59,
100
+ "ideal_battery_range": 187.4,
101
101
  "managed_charging_active": false,
102
102
  "managed_charging_start_time": null,
103
103
  "managed_charging_user_canceled": false,
104
104
  "max_range_charge_counter": 0,
105
- "minutes_to_full_charge": 0,
105
+ "minutes_to_full_charge": 165,
106
106
  "not_enough_power_to_heat": false,
107
107
  "scheduled_charging_pending": false,
108
108
  "scheduled_charging_start_time": null,
109
- "time_to_full_charge": 0.0,
110
- "timestamp": 1604977044186,
109
+ "time_to_full_charge": 2.75,
110
+ "timestamp": 1607623897515,
111
111
  "trip_charging": false,
112
- "usable_battery_level": 90,
112
+ "usable_battery_level": 59,
113
113
  "user_charge_enable_request": null
114
114
  },
115
115
  "gui_settings": {
@@ -119,17 +119,19 @@ _Note:_ all `*_range` values are in miles, irrespective of GUI configuration.
119
119
  "gui_range_display": "Rated",
120
120
  "gui_temperature_units": "F",
121
121
  "show_range_units": true,
122
- "timestamp": 1604977044186
122
+ "timestamp": 1607623897515
123
123
  },
124
124
  "vehicle_state": {
125
- "api_version": 10,
125
+ "api_version": 13,
126
126
  "autopark_state_v2": "standby",
127
127
  "autopark_style": "standard",
128
128
  "calendar_supported": true,
129
- "car_version": "2020.36.16 3e9e4e8dd287",
129
+ "car_version": "2020.48.10 f8900cddd03a",
130
130
  "center_display_state": 0,
131
131
  "df": 0,
132
132
  "dr": 0,
133
+ "fd_window": 0,
134
+ "fp_window": 0,
133
135
  "ft": 0,
134
136
  "homelink_device_count": 2,
135
137
  "homelink_nearby": true,
@@ -138,13 +140,15 @@ _Note:_ all `*_range` values are in miles, irrespective of GUI configuration.
138
140
  "locked": false,
139
141
  "media_state": { "remote_control_enabled": true },
140
142
  "notifications_supported": true,
141
- "odometer": 57509.856033,
143
+ "odometer": 57869.762487,
142
144
  "parsed_calendar_supported": true,
143
145
  "pf": 0,
144
146
  "pr": 0,
147
+ "rd_window": 0,
145
148
  "remote_start": false,
146
149
  "remote_start_enabled": true,
147
150
  "remote_start_supported": true,
151
+ "rp_window": 0,
148
152
  "rt": 0,
149
153
  "sentry_mode": false,
150
154
  "sentry_mode_available": true,
@@ -158,18 +162,18 @@ _Note:_ all `*_range` values are in miles, irrespective of GUI configuration.
158
162
  },
159
163
  "speed_limit_mode": {
160
164
  "active": false,
161
- "current_limit_mph": 50.0,
165
+ "current_limit_mph": 85.0,
162
166
  "max_limit_mph": 90,
163
167
  "min_limit_mph": 50,
164
- "pin_code_set": true
168
+ "pin_code_set": false
165
169
  },
166
170
  "summon_standby_mode_enabled": false,
167
171
  "sun_roof_percent_open": 0,
168
172
  "sun_roof_state": "closed",
169
- "timestamp": 1604977044184,
173
+ "timestamp": 1607623897515,
170
174
  "valet_mode": false,
171
175
  "valet_pin_needed": true,
172
- "vehicle_name": "Nikola 2.0"
176
+ "vehicle_name": null
173
177
  },
174
178
  "vehicle_config": {
175
179
  "can_accept_navigation_requests": true,
@@ -177,6 +181,7 @@ _Note:_ all `*_range` values are in miles, irrespective of GUI configuration.
177
181
  "car_special_type": "base",
178
182
  "car_type": "models2",
179
183
  "charge_port_type": "US",
184
+ "default_charge_to_max": false,
180
185
  "ece_restrictions": false,
181
186
  "eu_vehicle": false,
182
187
  "exterior_color": "White",
@@ -192,7 +197,7 @@ _Note:_ all `*_range` values are in miles, irrespective of GUI configuration.
192
197
  "spoiler_type": "None",
193
198
  "sun_roof_installed": 2,
194
199
  "third_row_seats": "None",
195
- "timestamp": 1604977044187,
200
+ "timestamp": 1607623897515,
196
201
  "trim_badging": "p90d",
197
202
  "use_range_badging": false,
198
203
  "wheel_type": "AeroTurbine19"
@@ -3,6 +3,7 @@ module TeslaApi
3
3
  attr_reader :api, :email, :access_token, :access_token_expires_at, :refresh_token, :client_id, :client_secret
4
4
 
5
5
  BASE_URI = 'https://owner-api.teslamotors.com'
6
+ SSO_URI = 'https://auth.tesla.com'
6
7
 
7
8
  def initialize(
8
9
  email: nil,
@@ -13,10 +14,12 @@ module TeslaApi
13
14
  client_secret: ENV['TESLA_CLIENT_SECRET'],
14
15
  retry_options: nil,
15
16
  base_uri: nil,
17
+ sso_uri: nil,
16
18
  client_options: {}
17
19
  )
18
20
  @email = email
19
21
  @base_uri = base_uri || BASE_URI
22
+ @sso_uri = sso_uri || SSO_URI
20
23
 
21
24
  @client_id = client_id
22
25
  @client_secret = client_secret
@@ -40,38 +43,100 @@ module TeslaApi
40
43
  end
41
44
 
42
45
  def refresh_access_token
43
- response = api.post(
44
- @base_uri + '/oauth/token',
46
+ response = @api.post(
47
+ @sso_uri + '/oauth2/v3/token',
45
48
  {
46
49
  grant_type: 'refresh_token',
47
- client_id: client_id,
50
+ client_id: 'ownerapi',
48
51
  client_secret: client_secret,
49
- refresh_token: refresh_token
52
+ refresh_token: refresh_token,
53
+ scope: 'openid email offline_access'
50
54
  }
51
55
  ).body
52
56
 
57
+ @refresh_token = response['refresh_token']
58
+
59
+ response = api.post(
60
+ @base_uri + '/oauth/token',
61
+ {
62
+ grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
63
+ client_id: client_id,
64
+ client_secret: client_secret
65
+ },
66
+ 'Authorization' => "Bearer #{response['access_token']}"
67
+ ).body
68
+
53
69
  @access_token = response['access_token']
54
70
  @access_token_expires_at = Time.at(response['created_at'].to_f + response['expires_in'].to_f).to_datetime
55
- @refresh_token = response['refresh_token']
56
71
 
57
72
  response
58
73
  end
59
74
 
60
75
  def login!(password)
76
+ code_verifier = rand(36**86).to_s(36)
77
+ code_challenge = Base64.urlsafe_encode64(Digest::SHA256.hexdigest(code_verifier))
78
+ state = rand(36**20).to_s(36)
79
+
80
+ response = Faraday.get(
81
+ @sso_uri + '/oauth2/v3/authorize',
82
+ {
83
+ client_id: 'ownerapi',
84
+ code_challenge: code_challenge,
85
+ code_challenge_method: 'S256',
86
+ redirect_uri: 'https://auth.tesla.com/void/callback',
87
+ response_type: 'code',
88
+ scope: 'openid email offline_access',
89
+ state: state,
90
+ }
91
+ )
92
+
93
+ cookie = response.headers['set-cookie'].split(' ').first
94
+ parameters = Hash[response.body.scan(/type="hidden" name="(.*?)" value="(.*?)"/)]
95
+
96
+ response = Faraday.post(
97
+ @sso_uri + '/oauth2/v3/authorize?' + URI.encode_www_form({
98
+ client_id: 'ownerapi',
99
+ code_challenge: code_challenge,
100
+ code_challenge_method: 'S256',
101
+ redirect_uri: 'https://auth.tesla.com/void/callback',
102
+ response_type: 'code',
103
+ scope: 'openid email offline_access',
104
+ state: state,
105
+ }),
106
+ URI.encode_www_form(parameters.merge(
107
+ 'identity' => email,
108
+ 'credential' => password
109
+ )),
110
+ 'Cookie' => cookie
111
+ )
112
+
113
+ code = CGI.parse(URI(response.headers['location']).query)['code'].first
114
+
115
+ response = @api.post(
116
+ @sso_uri + '/oauth2/v3/token',
117
+ {
118
+ grant_type: 'authorization_code',
119
+ client_id: 'ownerapi',
120
+ code: code,
121
+ code_verifier: code_verifier,
122
+ redirect_uri: 'https://auth.tesla.com/void/callback'
123
+ }
124
+ ).body
125
+
126
+ @refresh_token = response['refresh_token']
127
+
61
128
  response = api.post(
62
129
  @base_uri + '/oauth/token',
63
130
  {
64
- grant_type: 'password',
131
+ grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
65
132
  client_id: client_id,
66
- client_secret: client_secret,
67
- email: email,
68
- password: password
69
- }
133
+ client_secret: client_secret
134
+ },
135
+ 'Authorization' => "Bearer #{response['access_token']}"
70
136
  ).body
71
137
 
72
138
  @access_token = response['access_token']
73
139
  @access_token_expires_at = Time.at(response['created_at'].to_f + response['expires_in'].to_f).to_datetime
74
- @refresh_token = response['refresh_token']
75
140
 
76
141
  response
77
142
  end
@@ -1,3 +1,3 @@
1
1
  module TeslaApi
2
- VERSION = '3.0.7'
2
+ VERSION = '3.1.0'
3
3
  end
@@ -1,48 +1,256 @@
1
1
  ---
2
2
  http_interactions:
3
- - request:
4
- method: post
5
- uri: https://owner-api.teslamotors.com/oauth/token
6
- body:
7
- encoding: UTF-8
8
- string: grant_type=password&client_id=<TESLA_CLIENT_ID>&client_secret=<TESLA_CLIENT_SECRET>&email=<TESLA_EMAIL>&password=<TESLA_PASS>
9
- headers:
10
- Accept-Encoding:
11
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
- Accept:
13
- - "*/*"
14
- User-Agent:
15
- - Ruby
16
- response:
17
- status:
18
- code: 200
19
- message: OK
20
- headers:
21
- Server:
22
- - nginx
23
- Date:
24
- - Mon, 15 Dec 2014 03:09:22 GMT
25
- Content-Type:
26
- - application/json; charset=utf-8
27
- Transfer-Encoding:
28
- - chunked
29
- Connection:
30
- - keep-alive
31
- Status:
32
- - 200 OK
33
- Cache-Control:
34
- - no-store
35
- Pragma:
36
- - no-cache
37
- X-Ua-Compatible:
38
- - IE=Edge,chrome=1
39
- X-Request-Id:
40
- - 349d563d345a9694c610770b743d3006
41
- X-Runtime:
42
- - '0.416152'
43
- body:
44
- encoding: UTF-8
45
- string: '{"access_token":"1cba4845a8653d4b731440e9911d84304a179bd16a9ecbc9b649f2d8e0f6947e","token_type":"bearer","expires_in":7776000,"refresh_token":"fea03b395fa4e72ebc399d9cda6163dcf438c248f744ebdd5bfcda571f5f317f","created_at":1475777133}'
46
- http_version:
47
- recorded_at: Mon, 15 Dec 2014 03:09:22 GMT
48
- recorded_with: VCR 2.9.3
3
+ - request:
4
+ method: get
5
+ uri: https://auth.tesla.com/oauth2/v3/authorize?client_id=ownerapi&code_challenge=NWQxNjFkMmQzY2Q2OWE5MWQ5MDc5YWU4YWIxYTdiYmVkZjU5ZTczMzI2NDY4Njc2NjYzZTJhMzU1OTBlMDU5OA==&code_challenge_method=S256&redirect_uri=https://auth.tesla.com/void/callback&response_type=code&scope=openid%20email%20offline_access&state=762iuznqj8lyqymdkfj8
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v1.3.0
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - '*/*'
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Content-Type:
24
+ - text/html; charset=utf-8
25
+ Content-Length:
26
+ - '24778'
27
+ X-Dns-Prefetch-Control:
28
+ - 'off'
29
+ X-Frame-Options:
30
+ - DENY
31
+ Strict-Transport-Security:
32
+ - max-age=15552000; includeSubDomains
33
+ X-Download-Options:
34
+ - noopen
35
+ X-Content-Type-Options:
36
+ - nosniff
37
+ X-Xss-Protection:
38
+ - 1; mode=block
39
+ X-Request-Id:
40
+ - dc7d9846-c51a-45db-b439-32d9df2d89ff
41
+ X-Correlation-Id:
42
+ - dc7d9846-c51a-45db-b439-32d9df2d89ff
43
+ Content-Security-Policy:
44
+ - "connect-src 'self'; default-src 'none'; font-src 'self' data: fonts.gstatic.com;
45
+ frame-src 'self' www.google.com www.recaptcha.net; img-src 'self' data:;
46
+ script-src www.recaptcha.net 'self' 'nonce-3af960a43626bbab403e'; style-src
47
+ 'unsafe-inline' 'self'"
48
+ X-Content-Security-Policy:
49
+ - "connect-src 'self'; default-src 'none'; font-src 'self' data: fonts.gstatic.com;
50
+ frame-src 'self' www.google.com www.recaptcha.net; img-src 'self' data:;
51
+ script-src www.recaptcha.net 'self' 'nonce-3af960a43626bbab403e'; style-src
52
+ 'unsafe-inline' 'self'"
53
+ X-Webkit-Csp:
54
+ - "connect-src 'self'; default-src 'none'; font-src 'self' data: fonts.gstatic.com;
55
+ frame-src 'self' www.google.com www.recaptcha.net; img-src 'self' data:;
56
+ script-src www.recaptcha.net 'self' 'nonce-3af960a43626bbab403e'; style-src
57
+ 'unsafe-inline' 'self'"
58
+ Etag:
59
+ - W/"60ca-S7hQtdbWJEREEmKoHSmOmmJGnQo"
60
+ X-Response-Time:
61
+ - 8.699ms
62
+ Date:
63
+ - Sat, 30 Jan 2021 15:08:45 GMT
64
+ Connection:
65
+ - keep-alive
66
+ Set-Cookie:
67
+ - tesla-auth.sid=s%3A3cYTHTFWso2Vw-uGb1FL6C_3WyOjPvMd.plTqAcQU4Dvt7nyuuFWtbwlFBQp7I%2Fr8ZRwaewR1Xg0;
68
+ Path=/; Expires=Tue, 02 Feb 2021 15:08:45 GMT; HttpOnly; Secure
69
+ body:
70
+ encoding: ASCII-8BIT
71
+ string: !binary |-
72
+ PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgPHRpdGxlPlRlc2xhIFNTTyAtIFNpZ24gSW48L3RpdGxlPgoKCiAgPCEtLSBSZXF1aXJlZCBtZXRhIHRhZ3MgLS0+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlLGNocm9tZT0xIiAvPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEsIG1heGltdW0tc2NhbGU9MSwgdXNlci1zY2FsYWJsZT0wLCB2aWV3cG9ydC1maXQ9Y292ZXIiIC8+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9zdGF0aWMvY3NzL2dvdGhhbS1ib29rLmNzcyIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvc3RhdGljL2Nzcy9nb3RoYW0tbWVkaXVtLmNzcyIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvc3RhdGljL2Nzcy9taW5pbWFsLmJ1bmRsZS5jc3MiIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL3N0YXRpYy9jc3Mvc2hpbXMubWluLmNzcyIgLz4KCjxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL2kxOG5leHQuYnVuZGxlLm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL2kxOG4uanMiPjwvc2NyaXB0PgoKCgogIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBub25jZT0iM2FmOTYwYTQzNjI2YmJhYjQwM2UiPgogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIGFwcGx5RGFya01vZGUgJiYgYXBwbHlEYXJrTW9kZSgpOwoKICAgICAgdmFyIG1lc3NhZ2VzID0ge307CgogICAgICBmb3IgKHZhciBwcm9wIGluIG1lc3NhZ2VzKSB7CiAgICAgICAgYWRkRXJyb3JNZXNzYWdlKG1lc3NhZ2VzW3Byb3BdLCBwcm9wKTsKICAgICAgfQoKICAgICAgLy8gIEF1dG8tZm9jdXMKICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNmb3JtLWlucHV0LWlkZW50aXR5IikudmFsdWUpIHsKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjZm9ybS1pbnB1dC1jcmVkZW50aWFsIikuZm9jdXMoKTsKICAgICAgfQoKICAgICAgaTE4bigpLmluaXQoWyJjb21tb24iLCAibG9naW4iXSwgZnVuY3Rpb24oZXJyLCB0KSB7CiAgICAgICAgaTE4bigpLnRyYW5zbGF0ZSgpOwoKICAgICAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmb3JtIik7CgogICAgICAgIHZhciBjYW5jZWwgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoIiNmb3JtLXN1Ym1pdC1jYW5jZWwiKTsKICAgICAgICBpZiAoY2FuY2VsKSB7CiAgICAgICAgICBjYW5jZWwuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICBmb3JtLnF1ZXJ5U2VsZWN0b3IoIiNmb3JtLWlucHV0LWNhbmNlbCIpLnZhbHVlID0gIjEiOwogICAgICAgICAgICBmb3JtLnN1Ym1pdCgpOwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgc3VibWl0ID0gZm9ybS5xdWVyeVNlbGVjdG9yKCIjZm9ybS1zdWJtaXQtY29udGludWUiKTsKICAgICAgICBzdWJtaXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgZXZlbnQudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vICBBdXRvLWZvY3VzCiAgICAgICAgaWYgKGZvcm0ucXVlcnlTZWxlY3RvcigiI2Zvcm0taW5wdXQtaWRlbnRpdHkiKS52YWx1ZSkgewogICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2Zvcm0taW5wdXQtY3JlZGVudGlhbCIpLmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgZm9ybS5xdWVyeVNlbGVjdG9yKCIjZm9ybS1pbnB1dC1pZGVudGl0eSIpLmZvY3VzKCk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICB9KTsKICA8L3NjcmlwdD4KCgo8L2hlYWQ+Cjxib2R5IGNsYXNzPSJ0ZHMtc2NyaW0tLWJsYWNrIHRkcy10aGVtZS0tcGFsbGFkaXVtIj4KCiAgPGRpdiBjbGFzcz0idG1wLXNoZWxsIHRkcy0tZmFkZS1pbi0iPgoKCiAgICAKCgoKICAgIDxtYWluIGlkPSJtYWluLWNvbnRlbnQiIGNsYXNzPSJ0bXAtc2hlbGwtcm93IHRtcC1zaGVsbC1yb3ctLXN0cmV0Y2giPgogICAgICA8ZGl2IGNsYXNzPSJ0ZHMtY29udGVudF9jb250YWluZXIgdGRzLWNvbnRlbnRfY29udGFpbmVyLS1zbWFsbCI+CgoKICAgICAgICA8aDEgY2xhc3M9InRkcy10ZXh0LS1oMS1hbHQiIGRhdGEtaTE4bi1rZXk9ImxvZ2luOnBhZ2VIZWFkZXIiPlNpZ24gSW48L2gxPgoKICAgICAgICAKCgogICAgICAgIDxkaXYgY2xhc3M9InRkcy1zdGF0dXNfbXNnIHRkcy1zdGF0dXNfbXNnLS1lbmNsb3NlZCB0ZHMtLWlzX2hpZGRlbiIgcm9sZT0iYWxlcnQiIGRhdGEtZmllbGQ9Il8iPgogIDxzdmcgY2xhc3M9InRkcy1zdGF0dXNfbXNnLWljb24iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8dGl0bGU+RXJyb3IgSWNvbjwvdGl0bGU+CiAgICA8ZGVzY3JpcHRpb24+QSBlcnJvciBpY29uLCBjYWxsaW5nIHlvdXIgYXR0ZW50aW9uIHRvIGFuIGlzc3VlIHByZXZlbnRpbmcgZm9ybSBzdWJtaXNzaW9uLiA8L2Rlc2NyaXB0aW9uPgogICAgPHVzZSB4bGluazpocmVmPSIjdGRzLWVycm9yIj48L3VzZT4KICA8L3N2Zz4KICA8ZGl2IGNsYXNzPSJ0ZHMtc3RhdHVzX21zZy10ZXh0Ij4KICAgIDwhLS0KICAgIDxkaXYgY2xhc3M9InRkcy1zdGF0dXNfbXNnLWhlYWRlciI+CiAgICAgIDxoNj5FcnJvcjwvaDY+CiAgICA8L2Rpdj4KICAgIC0tPgogICAgPGRpdiBjbGFzcz0idGRzLXN0YXR1c19tc2ctYm9keSI+CiAgICAgIDwhLS08cD5SZXF1aXJlZCBpbmZvcm1hdGlvbiBpcyBub3QgcHJlc2VudCBpbiBmb3JtOiAmbHQ7ZmllbGQgbmFtZSZndDs8L3A+LS0+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9kaXY+CgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaW5nbGUtY29sdW1uLWZvcm0td3JhcHBlciI+CiAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGlkPSJmb3JtIiBjbGFzcz0ic3NvLWZvcm0gc2lnbi1pbi1mb3JtIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iX2NzcmYiIHZhbHVlPSJBTGZ6M2E0dC00bHI3UktTTE9MNDVWczRYRVB1SFhpOGlrTFUiIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Il9waGFzZSIgdmFsdWU9ImF1dGhlbnRpY2F0ZSIgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iX3Byb2Nlc3MiIHZhbHVlPSIxIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0cmFuc2FjdGlvbl9pZCIgdmFsdWU9ImJGVUZUS200IiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjYW5jZWwiIHZhbHVlPSIiIGlkPSJmb3JtLWlucHV0LWNhbmNlbCIgLz4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRkcy1mb3JtLWl0ZW0iPgogICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0idGRzLWZvcm0taXRlbS1sYWJlbCIgZm9yPSJmb3JtLWlucHV0LWlkZW50aXR5Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtaTE4bi1rZXk9ImxvZ2luOmZvcm1JZGVudGl0eUxhYmVsMSI+RW1haWwgQWRkcmVzczwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRkcy10b29sdGlwIj4KICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ0ZHMtdG9vbHRpcC10cmlnZ2VyIiBhcmlhLWxhYmVsPSJFbWFpbCBBZGRyZXNzIFRvb2x0aXAiPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtdG9vbHRpcC1pY29uIj48L2k+CiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZHMtdG9vbHRpcC1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8cCBkYXRhLWkxOG4ta2V5PSJsb2dpbjpmb3JtSWRlbnRpdHlUb29sdGlwVGV4dDEiPgogICAgICAgICAgICAgICAgICAgICAgSWYgeW91ciBhY2NvdW50IGlzIGxpbmtlZCB0byBhbiBlbWFpbCBhZGRyZXNzIHlvdSBubyBsb25nZXIgaGF2ZSBhY2Nlc3MgdG8sIHBsZWFzZSBzaWduIGludG8geW91ciBhY2NvdW50IGFuZCB1cGRhdGUgeW91ciBlbWFpbCBhZGRyZXNzIHVuZGVyIGFjY291bnQgc2V0dGluZ3MKICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgPHAgZGF0YS1pMThuLWtleT0ibG9naW46Zm9ybUlkZW50aXR5VG9vbHRpcFRleHQyIiBkYXRhLWkxOG4tZGF0YT0ieyYjMzQ7bGluayYjMzQ7OnsmIzM0O3N0YXJ0JiMzNDs6JiMzNDsmbHQ7YSBocmVmPVwmIzM0O2h0dHBzOi8vd3d3LnRlc2xhLmNvbS9zdXBwb3J0L2FjY291bnQtc3VwcG9ydFwmIzM0OyB0YXJnZXQ9XCYjMzQ7X2JsYW5rXCYjMzQ7Jmd0OyYjMzQ7LCYjMzQ7ZW5kJiMzNDs6JiMzNDsmbHQ7L2EmZ3Q7JiMzNDt9fSI+CiAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgaGF2ZSB0cm91YmxlIHNpZ25pbmcgaW4sIHBsZWFzZSB2aXNpdCBvdXIgc3VwcG9ydCBwYWdlCiAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PjwhLS0gdGRzLXRvb2x0aXAgLS0+CiAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZHMtdGV4dC1pbnB1dC0td3JhcHBlciIgZGF0YS1maWVsZD0iaWRlbnRpdHkiPgogICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJ0ZHMtdGV4dC1pbnB1dCIgaWQ9ImZvcm0taW5wdXQtaWRlbnRpdHkiIHR5cGU9InRleHQiICBuYW1lPSJpZGVudGl0eSIgdmFsdWU9IiIgYXV0b2NvbXBsZXRlPSJ1c2VybmFtZSIgYXV0b2NhcGl0YWxpemU9Im5vbmUiIC8+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0ZHMtZm9ybS1pdGVtLWZlZWRiYWNrIj48L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+PCEtLSB0ZHMtZm9ybS1pdGVtIC0tPgoKCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRkcy1mb3JtLWl0ZW0gdGRzLWZvcm0taXRlbS0tcGFzc3dvcmQiIGRhdGEtc2hvd2xhYmVsPSJTaG93IFBhc3N3b3JkIiBkYXRhLWhpZGVsYWJlbD0iSGlkZSBQYXNzd29yZCIgZGF0YS1zaG93aWNvbj0idGRzLWV5ZS1zaG93IiBkYXRhLWhpZGVpY29uPSJ0ZHMtZXllLWhpZGUiPgoKICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9InRkcy1mb3JtLWl0ZW0tbGFiZWwiIGZvcj0icGFzc3dvcmQtaW5wdXQiPgogICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1pMThuLWtleT0ibG9naW46Zm9ybVBhc3N3b3JkTGFiZWwiPlBhc3N3b3JkPC9zcGFuPgogICAgICAgICAgICAgIDwvbGFiZWw+CgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRkcy10ZXh0LWlucHV0LS13cmFwcGVyIiBkYXRhLWZpZWxkPSJwYXNzd29yZCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9InRkcy10ZXh0LWlucHV0IiBpZD0iZm9ybS1pbnB1dC1jcmVkZW50aWFsIiB0eXBlPSJwYXNzd29yZCIgIG5hbWU9ImNyZWRlbnRpYWwiIGF1dG9jb21wbGV0ZT0iY3VycmVudC1wYXNzd29yZCIgYXV0b2NhcGl0YWxpemU9Im5vbmUiIGFyaWEtbGFiZWw9ImNyZWRlbnRpYWxzLWlucHV0IiAvPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGRzLXBhc3N3b3JkLWlucHV0LS10b2dnbGUiIHR5cGU9ImJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9InRkcy1pY29uIj4KICAgICAgICAgICAgICAgICAgICA8dGl0bGU+U2hvdyBQYXNzd29yZDwvdGl0bGU+CiAgICAgICAgICAgICAgICAgICAgPGRlc2M+Q2xpY2sgSWNvbiB0byB0b2dnbGUgcGFzc3dvcmQgdmlzaWJpbGl0eTwvZGVzYz4KICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiN0ZHMtZXllLXNob3ciPjwvdXNlPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGRzLWZvcm0taXRlbS1mZWVkYmFjayI+PC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8L2Rpdj4KCgogICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9InRkcy1idG4gdGRzLWJ0bi0tYmx1ZSB0ZHMtYnRuLS1mdWxsIiBkYXRhLWkxOG4ta2V5PSJsb2dpbjpmb3JtU3VibWl0TGFiZWwiIGlkPSJmb3JtLXN1Ym1pdC1jb250aW51ZSI+CiAgICAgICAgICAgICAgU2lnbiBJbgogICAgICAgICAgICA8L2J1dHRvbj4KCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHAgY2xhc3M9Im5lZWQtaGVscCB0ZHMtdGV4dC0tY2VudGVyIj4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICAKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZXNsYS5jb20vc3VwcG9ydC9hY2NvdW50LXN1cHBvcnQiIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0idGRzLWxpbmsiIGRhdGEtaTE4bi1rZXk9ImxvZ2luOmZvcmdvdFN1cHBvcnRMaW5rTGFiZWwiPkZvcmdvdCBlbWFpbD88L2E+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRtcC1saW5rLXNlcGFyYXRvciI+fDwvc3Bhbj4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICA8YSBocmVmPSIvdXNlci9wYXNzd29yZC9mb3Jnb3QiIGNsYXNzPSJ0ZHMtbGluayIgZGF0YS1pMThuLWtleT0ibG9naW46Zm9yZ290UGFzc3dvcmRMaW5rTGFiZWwiPkZvcmdvdCBwYXNzd29yZD88L2E+CiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICA8L2Zvcm0+CgoKICAgICAgICAKCiAgICAgICAgPC9kaXY+CgoKICAgICAgPC9kaXY+CiAgICA8L21haW4+CgoKICAgIAoKCgogIDwvZGl2PgoKCiAgCgo8ZGlhbG9nIGlkPSJsb2NhbGUtbW9kYWwiIGNsYXNzPSJ0ZHMtbW9kYWwiPgogIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0idGRzLW1vZGFsLWNsb3NlIiBhcmlhLWxhYmVsPSJDbG9zZSBMb2NhbGUgTW9kYWwiIGRhdGEtc2hvdWxkLWNsb3NlPSJsb2NhbGUtbW9kYWwiPgogICAgPGkgY2xhc3M9InRkcy1tb2RhbC1jbG9zZS1pY29uIj48L2k+CiAgPC9idXR0b24+CgogIDxzZWN0aW9uIGNsYXNzPSJ0ZHMtbW9kYWwtY29udGFpbmVyIj4KICA8aGVhZGVyIGNsYXNzPSJ0ZHMtbW9kYWwtaGVhZGVyIj48aDI+U2VsZWN0IFlvdXIgTWFya2V0PC9oMj48L2hlYWRlcj4KCiAgPHNlY3Rpb24gY2xhc3M9InRkcy1tb2RhbC1jb250ZW50Ij4KCgogICAgPG1haW4gY2xhc3M9InRkcy1tb2RhbC1ib2R5X2NvbnRlbnQgb3ZlcmZsb3ctc2Nyb2xsLWdyYWRpZW50Ij4KICAgICAgPGRpdiBjbGFzcz0ibG9jYWxlLWxpc3QtY29udGFpbmVyIG92ZXJmbG93LXNjcm9sbC1ncmFkaWVudF9fc2Nyb2xsZXIiPgogICAgICAgIAogICAgICAgIAogICAgICAgIDxkaXYgY2xhc3M9ImxvY2FsZS1yZWdpb24tLU5vcnRoIEFtZXJpY2EiPgogICAgICAgICAgPGg0IGNsYXNzPSJ0ZHMtdGV4dC0tYm9keV9oZWFkbGluZSByZWdpb24tdGl0bGUgbm90cmFuc2xhdGUiPk5vcnRoIEFtZXJpY2E8L2g0PgogICAgICAgICAgPHVsIGNsYXNzPSJyZWdpb24tbGlzdCI+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl91cyIgZGF0YS1zdWJsYW5nPSJ1cyI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLXVzIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJlbl91cyIgdGl0bGU9IlVuaXRlZCBTdGF0ZXMiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJlbi1VUyI+VW5pdGVkIFN0YXRlczwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2NhIGhhc19zdWJsYW5nIiBkYXRhLXN1Ymxhbmc9ImNhIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tY2EiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImVuX2NhIiB0aXRsZT0iQ2FuYWRhIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZW4tQ0EiPkNhbmFkYTwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2NhIGlzLXN1YmxhbmctY2EgaXMtc3VibGFuZyB0ZHMtLWZhZGUtaW4gdGRzLS1pc19oaWRkZW4iIGRhdGEtc3VibGFuZz0iY2EiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1jYSI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZW5fY2EiIHRpdGxlPSJFbmdsaXNoIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZW4tQ0EiPkVuZ2xpc2g8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl9jYSBpcy1zdWJsYW5nLWNhIGlzLXN1YmxhbmcgdGRzLS1mYWRlLWluIHRkcy0taXNfaGlkZGVuIiBkYXRhLXN1Ymxhbmc9ImNhIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tY2EiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImZyX2NhIiB0aXRsZT0iRnJhbsOnYWlzIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZnItQ0EiPkZyYW7Dp2FpczwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVzX214IiBkYXRhLXN1Ymxhbmc9Im14Ij4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tbXgiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImVzX214IiB0aXRsZT0iTcOpeGljbyIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImVzLU1YIj5Nw6l4aWNvPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsb2NhbGUtcmVnaW9uLS1FdXJvcGUiPgogICAgICAgICAgPGg0IGNsYXNzPSJ0ZHMtdGV4dC0tYm9keV9oZWFkbGluZSByZWdpb24tdGl0bGUgbm90cmFuc2xhdGUiPkV1cm9wZTwvaDQ+CiAgICAgICAgICA8dWwgY2xhc3M9InJlZ2lvbi1saXN0Ij4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLW5sX2JlIGhhc19zdWJsYW5nIiBkYXRhLXN1Ymxhbmc9ImJlIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tYmUiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9Im5sX2JlIiB0aXRsZT0iQmVsZ2l1bSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9Im5sLUJFIj5CZWxnaXVtPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5fYmUgaXMtc3VibGFuZy1iZSBpcy1zdWJsYW5nIHRkcy0tZmFkZS1pbiB0ZHMtLWlzX2hpZGRlbiIgZGF0YS1zdWJsYW5nPSJiZSI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWJlIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJubF9iZSIgdGl0bGU9Ik5lZGVybGFuZHMiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJubC1CRSI+TmVkZXJsYW5kczwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2JlIGlzLXN1YmxhbmctYmUgaXMtc3VibGFuZyB0ZHMtLWZhZGUtaW4gdGRzLS1pc19oaWRkZW4iIGRhdGEtc3VibGFuZz0iYmUiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1iZSI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZnJfYmUiIHRpdGxlPSJGcmFuw6dhaXMiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJmci1CRSI+RnJhbsOnYWlzPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tY3NfY3oiIGRhdGEtc3VibGFuZz0iY3oiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1jeiI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iY3NfY3oiIHRpdGxlPSLEjGVza28iIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJjcy1DWiI+xIxlc2tvPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZGFfZGsiIGRhdGEtc3VibGFuZz0iZGsiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1kayI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZGFfZGsiIHRpdGxlPSJEYW5tYXJrIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZGEtREsiPkRhbm1hcms8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1kZV9kZSIgZGF0YS1zdWJsYW5nPSJkZSI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWRlIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJkZV9kZSIgdGl0bGU9IkRldXRzY2hsYW5kIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZGUiPkRldXRzY2hsYW5kPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZXNfZXMiIGRhdGEtc3VibGFuZz0iZXMiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1lcyI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZXNfZXMiIHRpdGxlPSJFc3Bhw7FhIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZXMiPkVzcGHDsWE8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1mcl9mciIgZGF0YS1zdWJsYW5nPSJmciI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWZyIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJmcl9mciIgdGl0bGU9IkZyYW5jZSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImZyIj5GcmFuY2U8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl9nYiIgZGF0YS1zdWJsYW5nPSJnYiI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWdiIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJlbl9nYiIgdGl0bGU9IlVuaXRlZCBLaW5nZG9tIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZW4tR0IiPlVuaXRlZCBLaW5nZG9tPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5faWUiIGRhdGEtc3VibGFuZz0iaWUiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1pZSI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZW5faWUiIHRpdGxlPSJJcmVsYW5kIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZW4tSUUiPklyZWxhbmQ8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1pc19pcyIgZGF0YS1zdWJsYW5nPSJpcyI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWlzIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJpc19pcyIgdGl0bGU9IkljZWxhbmQiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJpcyI+SWNlbGFuZDwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWl0X2l0IiBkYXRhLXN1Ymxhbmc9Iml0Ij4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0taXQiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9Iml0X2l0IiB0aXRsZT0iSXRhbGlhIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iaXQiPkl0YWxpYTwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWZyX2x1IGhhc19zdWJsYW5nIiBkYXRhLXN1Ymxhbmc9Imx1Ij4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tbHUiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImZyX2x1IiB0aXRsZT0iTHV4ZW1ib3VyZyIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImZyLUxVIj5MdXhlbWJvdXJnPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5fbHUgaXMtc3VibGFuZy1sdSBpcy1zdWJsYW5nIHRkcy0tZmFkZS1pbiB0ZHMtLWlzX2hpZGRlbiIgZGF0YS1zdWJsYW5nPSJsdSI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWx1Ij48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJmcl9sdSIgdGl0bGU9IkZyYW7Dp2FpcyIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImZyLUxVIj5GcmFuw6dhaXM8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl9sdSBpcy1zdWJsYW5nLWx1IGlzLXN1YmxhbmcgdGRzLS1mYWRlLWluIHRkcy0taXNfaGlkZGVuIiBkYXRhLXN1Ymxhbmc9Imx1Ij4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tbHUiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImRlX2x1IiB0aXRsZT0iRGV1dHNjaCIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImRlLUxVIj5EZXV0c2NoPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tbmxfbmwiIGRhdGEtc3VibGFuZz0ibmwiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1ubCI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0ibmxfbmwiIHRpdGxlPSJOZWRlcmxhbmQiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJubCI+TmVkZXJsYW5kPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tbm9fbm8iIGRhdGEtc3VibGFuZz0ibm8iPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1ubyI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0ibm9fbm8iIHRpdGxlPSJOb3JnZSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9Im5vIj5Ob3JnZTwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWRlX2F0IiBkYXRhLXN1Ymxhbmc9ImF0Ij4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tYXQiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImRlX2F0IiB0aXRsZT0iw5ZzdGVycmVpY2giIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJkZS1BVCI+w5ZzdGVycmVpY2g8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1wbF9wbCIgZGF0YS1zdWJsYW5nPSJwbCI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLXBsIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJwbF9wbCIgdGl0bGU9IlBvbHNrYSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9InB0Ij5Qb2xza2E8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1wdF9wdCIgZGF0YS1zdWJsYW5nPSJwdCI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLXB0Ij48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJwdF9wdCIgdGl0bGU9IlBvcnR1Z2FsIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0icHQiPlBvcnR1Z2FsPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZnJfY2ggaGFzX3N1YmxhbmciIGRhdGEtc3VibGFuZz0iY2giPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1jaCI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZnJfY2giIHRpdGxlPSJTd2l0emVybGFuZCIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImZyLUNIIj5Td2l0emVybGFuZDwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2NoIGlzLXN1YmxhbmctY2ggaXMtc3VibGFuZyB0ZHMtLWZhZGUtaW4gdGRzLS1pc19oaWRkZW4iIGRhdGEtc3VibGFuZz0iY2giPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1jaCI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZnJfY2giIHRpdGxlPSJGcmFuw6dhaXMiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJmci1DSCI+RnJhbsOnYWlzPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5fY2ggaXMtc3VibGFuZy1jaCBpcy1zdWJsYW5nIHRkcy0tZmFkZS1pbiB0ZHMtLWlzX2hpZGRlbiIgZGF0YS1zdWJsYW5nPSJjaCI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWNoIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJkZV9jaCIgdGl0bGU9IkRldXRzY2giIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJkZS1DSCI+RGV1dHNjaDwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2NoIGlzLXN1YmxhbmctY2ggaXMtc3VibGFuZyB0ZHMtLWZhZGUtaW4gdGRzLS1pc19oaWRkZW4iIGRhdGEtc3VibGFuZz0iY2giPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1jaCI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iaXRfY2giIHRpdGxlPSJJdGFsaWFubyIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9Iml0LUNIIj5JdGFsaWFubzwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLXN2X3NlIiBkYXRhLXN1Ymxhbmc9InNlIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tc2UiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9InN2X3NlIiB0aXRsZT0iU3ZlcmlnZSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9InN2LVNFIj5TdmVyaWdlPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZmlfZmkiIGRhdGEtc3VibGFuZz0iZmkiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1maSI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZmlfZmkiIHRpdGxlPSJTdW9taSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImZpIj5TdW9taTwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2V1IiBkYXRhLXN1Ymxhbmc9ImV1Ij4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tZXUiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImVuX2V1IiB0aXRsZT0iT3RoZXIgRXVyb3BlIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZW4tRVUiPk90aGVyIEV1cm9wZTwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibG9jYWxlLXJlZ2lvbi0tTWlkZGxlLUVhc3QiPgogICAgICAgICAgPGg0IGNsYXNzPSJ0ZHMtdGV4dC0tYm9keV9oZWFkbGluZSByZWdpb24tdGl0bGUgbm90cmFuc2xhdGUiPk1pZGRsZS1FYXN0PC9oND4KICAgICAgICAgIDx1bCBjbGFzcz0icmVnaW9uLWxpc3QiPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5fYWUiIGRhdGEtc3VibGFuZz0iYWUiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1hZSI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZW5fYWUiIHRpdGxlPSJVQUUiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJlbi1BRSI+VUFFPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5fam8iIGRhdGEtc3VibGFuZz0iam8iPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1qbyI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iZW5fam8iIHRpdGxlPSJKb3JkYW4iIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJlbi1KTyI+Sm9yZGFuPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsb2NhbGUtcmVnaW9uLS1Bc2lhL1BhY2lmaWMiPgogICAgICAgICAgPGg0IGNsYXNzPSJ0ZHMtdGV4dC0tYm9keV9oZWFkbGluZSByZWdpb24tdGl0bGUgbm90cmFuc2xhdGUiPkFzaWEvUGFjaWZpYzwvaDQ+CiAgICAgICAgICA8dWwgY2xhc3M9InJlZ2lvbi1saXN0Ij4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLXpoX2NuIiBkYXRhLXN1Ymxhbmc9ImNuIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tY24iPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9InpoX2NuIiB0aXRsZT0i5Lit5Zu95aSn6ZmGIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iemgtQ04iPuS4reWbveWkp+mZhjwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLXpoX2hrIGhhc19zdWJsYW5nIiBkYXRhLXN1Ymxhbmc9ImhrIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0taGsiPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9InpoX2hrIiB0aXRsZT0iSG9uZyBLb25nIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iemgtSEsiPkhvbmcgS29uZzwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX2hrIGlzLXN1YmxhbmctaGsgaXMtc3VibGFuZyB0ZHMtLWZhZGUtaW4gdGRzLS1pc19oaWRkZW4iIGRhdGEtc3VibGFuZz0iaGsiPgogICAgICAgICAgICAgIDxpIGNsYXNzPSJ0ZHMtaWNvbiB0ZHMtaWNvbi1mbGFnLS1oayI+PC9pPgogICAgICAgICAgICAgIDxhIHJlbD0iemhfaGsiIHRpdGxlPSLkuK3mlociIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJ6aC1ISyI+5Lit5paHPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5faGsgaXMtc3VibGFuZy1oayBpcy1zdWJsYW5nIHRkcy0tZmFkZS1pbiB0ZHMtLWlzX2hpZGRlbiIgZGF0YS1zdWJsYW5nPSJoayI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWhrIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJlbl9oayIgdGl0bGU9IkVuZ2xpc2giIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJlbi1ISyI+RW5nbGlzaDwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpIGNsYXNzPSJyZWdpb24taXRlbSBpMThuLWVuX21vIGhhc19zdWJsYW5nIiBkYXRhLXN1Ymxhbmc9Im1vIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tbW8iPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImVuX21vIiB0aXRsZT0iTWFjYXUiIGNsYXNzPSJyZWdpb24tbGluayBub3RyYW5zbGF0ZSIgZGF0YS1sYW5nPSJlbi1NTyI+TWFjYXU8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl9tbyBpcy1zdWJsYW5nLW1vIGlzLXN1YmxhbmcgdGRzLS1mYWRlLWluIHRkcy0taXNfaGlkZGVuIiBkYXRhLXN1Ymxhbmc9Im1vIj4KICAgICAgICAgICAgICA8aSBjbGFzcz0idGRzLWljb24gdGRzLWljb24tZmxhZy0tbW8iPjwvaT4KICAgICAgICAgICAgICA8YSByZWw9ImVuX21vIiB0aXRsZT0iRW5nbGlzaCIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImVuLU1PIj5FbmdsaXNoPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8bGkgY2xhc3M9InJlZ2lvbi1pdGVtIGkxOG4tZW5fbW8gaXMtc3VibGFuZy1tbyBpcy1zdWJsYW5nIHRkcy0tZmFkZS1pbiB0ZHMtLWlzX2hpZGRlbiIgZGF0YS1zdWJsYW5nPSJtbyI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLW1vIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJ6aF9tbyIgdGl0bGU9IuS4reaWhyIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9InpoLU1PIj7kuK3mloc8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi16aF90dyIgZGF0YS1zdWJsYW5nPSJ0dyI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLXR3Ij48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJ6aF90dyIgdGl0bGU9IuWPsOeBoyIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9InpoLVRXIj7lj7DngaM8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1qYV9qcCIgZGF0YS1zdWJsYW5nPSJqcCI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWpwIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJqYV9qcCIgdGl0bGU9IuaXpeacrCIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImphLUpQIj7ml6XmnKw8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1rb19rciIgZGF0YS1zdWJsYW5nPSJrciI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWtyIj48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJrb19rciIgdGl0bGU9IuuMgO2VnOuvvOq1rSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImtvLUtSIj7rjIDtlZzrr7zqta08L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl9hdSIgZGF0YS1zdWJsYW5nPSJhdSI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLWF1Ij48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJlbl9hdSIgdGl0bGU9IkF1c3RyYWxpYSIgY2xhc3M9InJlZ2lvbi1saW5rIG5vdHJhbnNsYXRlIiBkYXRhLWxhbmc9ImVuLUFVIj5BdXN0cmFsaWE8L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaSBjbGFzcz0icmVnaW9uLWl0ZW0gaTE4bi1lbl9ueiIgZGF0YS1zdWJsYW5nPSJueiI+CiAgICAgICAgICAgICAgPGkgY2xhc3M9InRkcy1pY29uIHRkcy1pY29uLWZsYWctLW56Ij48L2k+CiAgICAgICAgICAgICAgPGEgcmVsPSJlbl9ueiIgdGl0bGU9Ik5ldyBaZWFsYW5kIiBjbGFzcz0icmVnaW9uLWxpbmsgbm90cmFuc2xhdGUiIGRhdGEtbGFuZz0iZW4tTloiPk5ldyBaZWFsYW5kPC9hPgogICAgICAgICAgICA8L2xpPgogICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KICAgICAgICAKICAgICAgICAKICAgICAgPC9kaXY+CiAgICA8L21haW4+CgoKICA8L3NlY3Rpb24+Cjwvc2VjdGlvbj4KPC9kaWFsb2c+CgoKPGRpdiBjbGFzcz0idGRzLW1vZGFsLWJhY2tkcm9wIiBkYXRhLXNob3VsZC1jbG9zZT0idGRzLW1vZGFsLWZ1bGxzY3JlZW4tZXhhbXBsZSI+PC9kaXY+CgoKPGRpdiBpZD0ic3Bpbm5lci1tb2RhbCIgY2xhc3M9InRkcy1zcGlubmVyIHRkcy1zcGlubmVyLS1mYWRlX291dCB0ZHMtc3Bpbm5lci1mdWxsc2NyZWVuIj48L2Rpdj4KCgo8IS0tIEFuaW1hdGVkIEJhY2tkcm9wIC0tPgo8ZGl2IGNsYXNzPSJ0ZHMtc2l0ZS1uYXYtLWZseW91dC1iYWNrZHJvcCIgZGF0YS10ZHMtY2xvc2U9Im1vYmlsZS1mbHlvdXQiPjwvZGl2PgoKCjwhLS0gU1ZHIGxvb2t1cCB0YWJsZSAtIEZvbGxvd2luZyBwYXR0ZXJuIGZyb20gZGVzaWduLnRlc2xhLmNvbSAtLT4KPGRpdiBjbGFzcz0idGRzLS1pc192aXN1YWxseV9oaWRkZW4iPgogIDxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8c3ltYm9sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMwIDMwIiBpZD0idGRzLWV5ZS1oaWRlLS1pbnZlcnRlZCI+PGcgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2IDcpIj48cGF0aCBmaWxsLXJ1bGU9Im5vbnplcm8iIGQ9Ik0xNy41MSA3LjgxYzAgMS40OC00LjEgNS43NS04Ljc3IDUuNzVhOC41IDguNSAwIDAxLTIuNDktLjRsMS4yMy0xLjIyYy40Mi4wOC44NC4xMiAxLjI2LjEyIDEuOCAwIDMuNjItLjc2IDUuMi0yLjAxIDEuMTQtLjkgMi4wNC0yLjA1IDIuMDQtMi4yNCAwLS4yLS44OS0xLjM0LTIuMDItMi4yNGwtLjA2LS4wNSAxLjA3LTEuMDdjMS41NiAxLjIzIDIuNTUgMi42MyAyLjU0IDMuMzZ6bS01LjI3IDBhMy41IDMuNSAwIDAxLTQuMDggMy40NWw0LjAzLTQuMDNjLjA0LjE5LjA1LjM4LjA1LjU4em0tMy41LTUuNzVjLjg4IDAgMS43NC4xNSAyLjU2LjRMMTAuMDcgMy43YTYuODkgNi44OSAwIDAwLTEuMzMtLjEzYy0xLjgyIDAtMy42NC43Ni01LjIxIDItMS4xNC45LTIgMi4wNS0yIDIuMjUgMCAuMTkuODcgMS4zNCAyLjAxIDIuMjRsLjEuMDctMS4wNyAxLjA4QzEgOS45NSAwIDguNTQgMCA3LjhjMC0xLjQ4IDQuMDgtNS43MyA4Ljc0LTUuNzV6bTAgMi4yNWMuMjMgMCAuNDQuMDIuNjUuMDZMNS4zIDguNDZhMy41MiAzLjUyIDAgMDEzLjQ0LTQuMTV6Ii8+PHJlY3Qgd2lkdGg9IjEuNSIgaGVpZ2h0PSIxOS42MiIgeD0iOC4wMSIgeT0iLTIiIHJ4PSIuNzUiIHRyYW5zZm9ybT0ic2NhbGUoLTEgMSkgcm90YXRlKC00NSAwIDI4Ljk1KSIvPjwvZz48L3N5bWJvbD4KICAgIDxzeW1ib2wgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMzAgMzAiIGlkPSJ0ZHMtZXllLWhpZGUiPjxnIGZpbGw9IiMwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNiA3KSI+PHBhdGggZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNMTcuNTEgNy44MWMwIDEuNDgtNC4xIDUuNzUtOC43NyA1Ljc1YTguNSA4LjUgMCAwMS0yLjQ5LS40bDEuMjMtMS4yMmMuNDIuMDguODQuMTIgMS4yNi4xMiAxLjggMCAzLjYyLS43NiA1LjItMi4wMSAxLjE0LS45IDIuMDQtMi4wNSAyLjA0LTIuMjQgMC0uMi0uODktMS4zNC0yLjAyLTIuMjRsLS4wNi0uMDUgMS4wNy0xLjA3YzEuNTYgMS4yMyAyLjU1IDIuNjMgMi41NCAzLjM2em0tNS4yNyAwYTMuNSAzLjUgMCAwMS00LjA4IDMuNDVsNC4wMy00LjAzYy4wNC4xOS4wNS4zOC4wNS41OHptLTMuNS01Ljc1Yy44OCAwIDEuNzQuMTUgMi41Ni40TDEwLjA3IDMuN2E2Ljg5IDYuODkgMCAwMC0xLjMzLS4xM2MtMS44MiAwLTMuNjQuNzYtNS4yMSAyLTEuMTQuOS0yIDIuMDUtMiAyLjI1IDAgLjE5Ljg3IDEuMzQgMi4wMSAyLjI0bC4xLjA3LTEuMDcgMS4wOEMxIDkuOTUgMCA4LjU0IDAgNy44YzAtMS40OCA0LjA4LTUuNzMgOC43NC01Ljc1em0wIDIuMjVjLjIzIDAgLjQ0LjAyLjY1LjA2TDUuMyA4LjQ2YTMuNTIgMy41MiAwIDAxMy40NC00LjE1eiIvPjxyZWN0IHdpZHRoPSIxLjUiIGhlaWdodD0iMTkuNjIiIHg9IjguMDEiIHk9Ii0yIiByeD0iLjc1IiB0cmFuc2Zvcm09InNjYWxlKC0xIDEpIHJvdGF0ZSgtNDUgMCAyOC45NSkiLz48L2c+PC9zeW1ib2w+CiAgICA8c3ltYm9sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMwIDMwIiBpZD0idGRzLWV5ZS1zaG93LS1pbnZlcnRlZCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9IiNmZmYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcgMTApIj48Y2lyY2xlIGN4PSI4IiBjeT0iNSIgcj0iMi4zMSIgc3Ryb2tlLXdpZHRoPSIyLjM3Ii8+PHBhdGggc3Ryb2tlLXdpZHRoPSIxLjUiIGQ9Ik04IDBjNC40OSAwIDggNC4xMyA4IDUgMCAuODctMy41NiA1LTggNS00LjQ0IDAtOC00LjEyLTgtNSAwLS44OCAzLjUxLTUgOC01eiIvPjwvZz48L3N5bWJvbD4KICAgIDxzeW1ib2wgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMzAgMzAiIGlkPSJ0ZHMtZXllLXNob3ciPjxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3IDEwKSI+PGNpcmNsZSBjeD0iOCIgY3k9IjUiIHI9IjIuMzEiIHN0cm9rZS13aWR0aD0iMi4zNyIvPjxwYXRoIHN0cm9rZS13aWR0aD0iMS41IiBkPSJNOCAwYzQuNDkgMCA4IDQuMTMgOCA1IDAgLjg3LTMuNTYgNS04IDUtNC40NCAwLTgtNC4xMi04LTUgMC0uODggMy41MS01IDgtNXoiLz48L2c+PC9zeW1ib2w+CiAgICA8c3ltYm9sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDIwIDIwIiBpZD0idGRzLWVycm9yIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxjaXJjbGUgY3g9IjEwIiBjeT0iMTAiIHI9IjEwIiBmaWxsPSIjRUQ0RTNCIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEwLjA3NSA0LjVjLjY1IDAgMS4xNzkuNTI4IDEuMTc5IDEuMTc5djQuNzE0YTEuMTc5IDEuMTc5IDAgMTEtMi4zNTggMFY1LjY3OUExLjE4IDEuMTggMCAwMTEwLjA3NSA0LjV6bTAgOC4yNWExLjM3NSAxLjM3NSAwIDExMCAyLjc1IDEuMzc1IDEuMzc1IDAgMDEwLTIuNzV6Ii8+PC9nPjwvc3ltYm9sPgogICAgPHN5bWJvbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAxOCIgaWQ9InRkcy13YXJuaW5nIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0wLTFoMjB2MjBIMHoiLz48cGF0aCBmaWxsPSIjRkJCMDFCIiBkPSJNMTIuODI1IDEuNjI3bDYuNjYzIDExLjA3N0MyMC44NzUgMTUuMDA5IDE5LjI4IDE4IDE2LjY2MyAxOEgzLjMzN0MuNzIgMTgtLjg3NSAxNS4wMS41MTIgMTIuNzA0TDcuMTc1IDEuNjI3YTMuMjY2IDMuMjY2IDAgMDE1LjY1IDB6Ii8+PHBhdGggZD0iTTEwLjA3NSA0Yy42NSAwIDEuMTc5LjUyOCAxLjE3OSAxLjE3OXY0LjcxNGExLjE3OSAxLjE3OSAwIDExLTIuMzU4IDBWNS4xNzlBMS4xOCAxLjE4IDAgMDExMC4wNzUgNHptMCA4LjI1YTEuMzc1IDEuMzc1IDAgMTEwIDIuNzUgMS4zNzUgMS4zNzUgMCAwMTAtMi43NXoiIGZpbGw9IiNGRkYiLz48L2c+PC9zeW1ib2w+CiAgPC9zdmc+CjwvZGl2PgoKCjxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL21pbmltYWwuYnVuZGxlLmpzIiB0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9zdGF0aWMvc2NyaXB0cy91dGlscy5qcyIgdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL3NpdGUuanMiIHR5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIvc3RhdGljL2pzL3Rkcy10ZXh0LWlucHV0cy0tcGFzc3dvcmQuanMiIHR5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiPjwvc2NyaXB0PgoKICA8IS0tIEB0b2RvIHJvbGxpbmcgaW5kZXggY3J5cHRvIGtleXM6IGh0dHA6Ly9iaXRseS5jb20vMldYQlJOcCAtLT4KPC9ib2R5Pgo8L2h0bWw+Cg==
73
+ recorded_at: Sat, 30 Jan 2021 15:08:45 GMT
74
+ - request:
75
+ method: post
76
+ uri: https://auth.tesla.com/oauth2/v3/authorize?client_id=ownerapi&code_challenge=NWQxNjFkMmQzY2Q2OWE5MWQ5MDc5YWU4YWIxYTdiYmVkZjU5ZTczMzI2NDY4Njc2NjYzZTJhMzU1OTBlMDU5OA==&code_challenge_method=S256&redirect_uri=https://auth.tesla.com/void/callback&response_type=code&scope=openid%20email%20offline_access&state=762iuznqj8lyqymdkfj8
77
+ body:
78
+ encoding: US-ASCII
79
+ string: _csrf=ALfz3a4t-4lr7RKSLOL45Vs4XEPuHXi8ikLU&_phase=authenticate&_process=1&transaction_id=bFUFTKm4&cancel=&identity=<TESLA_EMAIL>&credential=<TESLA_PASS>
80
+ headers:
81
+ User-Agent:
82
+ - Faraday v1.3.0
83
+ Cookie:
84
+ - tesla-auth.sid=s%3A3cYTHTFWso2Vw-uGb1FL6C_3WyOjPvMd.plTqAcQU4Dvt7nyuuFWtbwlFBQp7I%2Fr8ZRwaewR1Xg0;
85
+ Content-Type:
86
+ - application/x-www-form-urlencoded
87
+ Accept-Encoding:
88
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
89
+ Accept:
90
+ - '*/*'
91
+ response:
92
+ status:
93
+ code: 302
94
+ message: Moved Temporarily
95
+ headers:
96
+ Server:
97
+ - nginx
98
+ Content-Type:
99
+ - text/plain; charset=utf-8
100
+ Content-Length:
101
+ - '201'
102
+ X-Dns-Prefetch-Control:
103
+ - 'off'
104
+ X-Frame-Options:
105
+ - DENY
106
+ Strict-Transport-Security:
107
+ - max-age=15552000; includeSubDomains
108
+ X-Download-Options:
109
+ - noopen
110
+ X-Content-Type-Options:
111
+ - nosniff
112
+ X-Xss-Protection:
113
+ - 1; mode=block
114
+ X-Request-Id:
115
+ - 0ccd9ad5-b7d3-4bcb-8fe9-d342984977fe
116
+ X-Correlation-Id:
117
+ - 0ccd9ad5-b7d3-4bcb-8fe9-d342984977fe
118
+ Content-Security-Policy:
119
+ - "connect-src 'self'; default-src 'none'; font-src 'self' data: fonts.gstatic.com;
120
+ frame-src 'self' www.google.com www.recaptcha.net; img-src 'self' data:;
121
+ script-src www.recaptcha.net 'self' 'nonce-951afd475f3cf4502a4c'; style-src
122
+ 'unsafe-inline' 'self'"
123
+ X-Content-Security-Policy:
124
+ - "connect-src 'self'; default-src 'none'; font-src 'self' data: fonts.gstatic.com;
125
+ frame-src 'self' www.google.com www.recaptcha.net; img-src 'self' data:;
126
+ script-src www.recaptcha.net 'self' 'nonce-951afd475f3cf4502a4c'; style-src
127
+ 'unsafe-inline' 'self'"
128
+ X-Webkit-Csp:
129
+ - "connect-src 'self'; default-src 'none'; font-src 'self' data: fonts.gstatic.com;
130
+ frame-src 'self' www.google.com www.recaptcha.net; img-src 'self' data:;
131
+ script-src www.recaptcha.net 'self' 'nonce-951afd475f3cf4502a4c'; style-src
132
+ 'unsafe-inline' 'self'"
133
+ Location:
134
+ - https://auth.tesla.com/void/callback?code=69b1459d21be76d6285c03c60c8669992701acf48dac9e1e91a1996edf75&state=762iuznqj8lyqymdkfj8&issuer=https%3A%2F%2Fauth.tesla.com%2Foauth2%2Fv3
135
+ X-Response-Time:
136
+ - 263.918ms
137
+ Date:
138
+ - Sat, 30 Jan 2021 15:08:45 GMT
139
+ Connection:
140
+ - keep-alive
141
+ Set-Cookie:
142
+ - tesla-auth.sid=s%3A3cYTHTFWso2Vw-uGb1FL6C_3WyOjPvMd.plTqAcQU4Dvt7nyuuFWtbwlFBQp7I%2Fr8ZRwaewR1Xg0;
143
+ Path=/; Expires=Tue, 02 Feb 2021 15:08:45 GMT; HttpOnly; Secure
144
+ body:
145
+ encoding: UTF-8
146
+ string: Found. Redirecting to https://auth.tesla.com/void/callback?code=69b1459d21be76d6285c03c60c8669992701acf48dac9e1e91a1996edf75&state=762iuznqj8lyqymdkfj8&issuer=https%3A%2F%2Fauth.tesla.com%2Foauth2%2Fv3
147
+ recorded_at: Sat, 30 Jan 2021 15:08:45 GMT
148
+ - request:
149
+ method: post
150
+ uri: https://auth.tesla.com/oauth2/v3/token
151
+ body:
152
+ encoding: UTF-8
153
+ string: '{"grant_type":"authorization_code","client_id":"ownerapi","code":"69b1459d21be76d6285c03c60c8669992701acf48dac9e1e91a1996edf75","code_verifier":"dxqer47aeddb0wgk7rt99sk58y05dh0ylbxf2hqfr72o44gi41e6xw4wro6kg3sjx0xr2kythlvcqea1doz6pf","redirect_uri":"https://auth.tesla.com/void/callback"}'
154
+ headers:
155
+ User-Agent:
156
+ - github.com/timdorr/tesla-api v:3.0.7
157
+ Content-Type:
158
+ - application/json
159
+ Accept-Encoding:
160
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
161
+ Accept:
162
+ - '*/*'
163
+ response:
164
+ status:
165
+ code: 200
166
+ message: OK
167
+ headers:
168
+ Server:
169
+ - nginx
170
+ Content-Type:
171
+ - application/json
172
+ X-Dns-Prefetch-Control:
173
+ - 'off'
174
+ X-Frame-Options:
175
+ - DENY
176
+ Strict-Transport-Security:
177
+ - max-age=15552000; includeSubDomains
178
+ X-Download-Options:
179
+ - noopen
180
+ X-Content-Type-Options:
181
+ - nosniff
182
+ X-Xss-Protection:
183
+ - 1; mode=block
184
+ X-Request-Id:
185
+ - de86978b-cdd1-40db-bf32-68012bbd54c1
186
+ X-Correlation-Id:
187
+ - de86978b-cdd1-40db-bf32-68012bbd54c1
188
+ Cache-Control:
189
+ - no-store
190
+ Pragma:
191
+ - no-cache
192
+ X-Response-Time:
193
+ - 36.785ms
194
+ Date:
195
+ - Sat, 30 Jan 2021 15:08:45 GMT
196
+ Content-Length:
197
+ - '2548'
198
+ Connection:
199
+ - keep-alive
200
+ body:
201
+ encoding: UTF-8
202
+ string: '{"access_token":"eyJaccess","refresh_token":"eyJrefresh","expires_in":300,"state":"762iuznqj8lyqymdkfj8","token_type":"Bearer"}'
203
+ recorded_at: Sat, 30 Jan 2021 15:08:45 GMT
204
+ - request:
205
+ method: post
206
+ uri: https://owner-api.teslamotors.com/oauth/token
207
+ body:
208
+ encoding: UTF-8
209
+ string: '{"grant_type":"urn:ietf:params:oauth:grant-type:jwt-bearer","client_id":"<TESLA_CLIENT_ID>","client_secret":"<TESLA_CLIENT_SECRET>"}'
210
+ headers:
211
+ User-Agent:
212
+ - github.com/timdorr/tesla-api v:3.0.7
213
+ Authorization:
214
+ - Bearer bear
215
+ Content-Type:
216
+ - application/json
217
+ Accept-Encoding:
218
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
219
+ Accept:
220
+ - '*/*'
221
+ response:
222
+ status:
223
+ code: 200
224
+ message: OK
225
+ headers:
226
+ Date:
227
+ - Sat, 30 Jan 2021 15:08:46 GMT
228
+ Content-Type:
229
+ - application/json; charset=utf-8
230
+ Transfer-Encoding:
231
+ - chunked
232
+ Connection:
233
+ - keep-alive
234
+ Vary:
235
+ - Accept-Encoding
236
+ X-Frame-Options:
237
+ - SAMEORIGIN
238
+ X-Xss-Protection:
239
+ - 1; mode=block
240
+ X-Content-Type-Options:
241
+ - nosniff
242
+ Etag:
243
+ - W/"0fc2f98b86def89113ad5807d5bbb454"
244
+ Cache-Control:
245
+ - max-age=0, private, must-revalidate
246
+ X-Request-Id:
247
+ - 92adc6fad2102e8ee4d9c4fb94c6432092adc6fad2102e8ee4d9c4fb94c64320
248
+ X-Runtime:
249
+ - '0.339176'
250
+ Strict-Transport-Security:
251
+ - max-age=15724800; includeSubDomains
252
+ body:
253
+ encoding: ASCII-8BIT
254
+ string: '{"access_token":"qts-access","token_type":"bearer","expires_in":3888000,"refresh_token":"refresh","created_at":1612019326}'
255
+ recorded_at: Sat, 30 Jan 2021 15:08:46 GMT
256
+ recorded_with: VCR 6.0.0