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.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +36 -0
- data/docs/api-basics/authentication.md +163 -36
- data/docs/vehicle/optioncodes.md +82 -42
- data/docs/vehicle/state/data.md +42 -37
- data/lib/tesla_api/client.rb +76 -11
- data/lib/tesla_api/version.rb +1 -1
- data/spec/cassettes/client-login.yml +254 -46
- data/spec/cassettes/client-refresh.yml +109 -49
- data/spec/lib/tesla_api/client_spec.rb +20 -38
- metadata +6 -8
- data/.travis.yml +0 -16
- data/spec/cassettes/client-login_timeout.yml +0 -83
data/docs/vehicle/state/data.md
CHANGED
@@ -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":
|
27
|
+
"api_version": 13,
|
28
28
|
"backseat_token": null,
|
29
29
|
"backseat_token_updated_at": null,
|
30
30
|
"drive_state": {
|
31
|
-
"gps_as_of":
|
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":
|
39
|
+
"power": -9,
|
40
40
|
"shift_state": null,
|
41
41
|
"speed": null,
|
42
|
-
"timestamp":
|
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":
|
49
|
+
"driver_temp_setting": 21.1,
|
50
50
|
"fan_status": 0,
|
51
|
-
"inside_temp":
|
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": -
|
57
|
+
"left_temp_direction": -66,
|
58
58
|
"max_avail_temp": 28.0,
|
59
59
|
"min_avail_temp": 15.0,
|
60
|
-
"outside_temp":
|
61
|
-
"passenger_temp_setting":
|
60
|
+
"outside_temp": 18.0,
|
61
|
+
"passenger_temp_setting": 21.1,
|
62
62
|
"remote_heater_control_enabled": false,
|
63
|
-
"right_temp_direction": -
|
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":
|
67
|
+
"timestamp": 1607623897515,
|
68
68
|
"wiper_blade_heater": false
|
69
69
|
},
|
70
70
|
"charge_state": {
|
71
71
|
"battery_heater_on": false,
|
72
|
-
"battery_level":
|
73
|
-
"battery_range":
|
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":
|
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":
|
83
|
-
"charge_miles_added_rated":
|
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":
|
87
|
+
"charge_rate": 28.0,
|
88
88
|
"charge_to_max_range": false,
|
89
|
-
"charger_actual_current":
|
90
|
-
"charger_phases":
|
89
|
+
"charger_actual_current": 40,
|
90
|
+
"charger_phases": 1,
|
91
91
|
"charger_pilot_current": 40,
|
92
|
-
"charger_power":
|
93
|
-
"charger_voltage":
|
94
|
-
"charging_state": "
|
92
|
+
"charger_power": 9,
|
93
|
+
"charger_voltage": 243,
|
94
|
+
"charging_state": "Charging",
|
95
95
|
"conn_charge_cable": "SAE",
|
96
|
-
"est_battery_range":
|
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":
|
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":
|
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":
|
110
|
-
"timestamp":
|
109
|
+
"time_to_full_charge": 2.75,
|
110
|
+
"timestamp": 1607623897515,
|
111
111
|
"trip_charging": false,
|
112
|
-
"usable_battery_level":
|
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":
|
122
|
+
"timestamp": 1607623897515
|
123
123
|
},
|
124
124
|
"vehicle_state": {
|
125
|
-
"api_version":
|
125
|
+
"api_version": 13,
|
126
126
|
"autopark_state_v2": "standby",
|
127
127
|
"autopark_style": "standard",
|
128
128
|
"calendar_supported": true,
|
129
|
-
"car_version": "2020.
|
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":
|
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":
|
165
|
+
"current_limit_mph": 85.0,
|
162
166
|
"max_limit_mph": 90,
|
163
167
|
"min_limit_mph": 50,
|
164
|
-
"pin_code_set":
|
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":
|
173
|
+
"timestamp": 1607623897515,
|
170
174
|
"valet_mode": false,
|
171
175
|
"valet_pin_needed": true,
|
172
|
-
"vehicle_name":
|
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":
|
200
|
+
"timestamp": 1607623897515,
|
196
201
|
"trim_badging": "p90d",
|
197
202
|
"use_range_badging": false,
|
198
203
|
"wheel_type": "AeroTurbine19"
|
data/lib/tesla_api/client.rb
CHANGED
@@ -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
|
-
@
|
46
|
+
response = @api.post(
|
47
|
+
@sso_uri + '/oauth2/v3/token',
|
45
48
|
{
|
46
49
|
grant_type: 'refresh_token',
|
47
|
-
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: '
|
131
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
|
65
132
|
client_id: client_id,
|
66
|
-
client_secret: client_secret
|
67
|
-
|
68
|
-
|
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
|
data/lib/tesla_api/version.rb
CHANGED
@@ -1,48 +1,256 @@
|
|
1
1
|
---
|
2
2
|
http_interactions:
|
3
|
-
- request:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
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
|