tesla_api 3.0.3 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -14,13 +14,12 @@ Returns the vehicle's configuration information including model, color, badging
14
14
  "car_special_type": "base",
15
15
  "car_type": "models2",
16
16
  "charge_port_type": "US",
17
+ "ece_restrictions": false,
17
18
  "eu_vehicle": false,
18
19
  "exterior_color": "White",
19
20
  "has_air_suspension": true,
20
21
  "has_ludicrous_mode": false,
21
- "key_version": 1,
22
22
  "motorized_charge_port": true,
23
- "perf_config": "P2",
24
23
  "plg": true,
25
24
  "rear_seat_heaters": 0,
26
25
  "rear_seat_type": 0,
@@ -30,8 +29,9 @@ Returns the vehicle's configuration information including model, color, badging
30
29
  "spoiler_type": "None",
31
30
  "sun_roof_installed": 2,
32
31
  "third_row_seats": "None",
33
- "timestamp": 1538364666096,
32
+ "timestamp": 1604977445448,
34
33
  "trim_badging": "p90d",
34
+ "use_range_badging": false,
35
35
  "wheel_type": "AeroTurbine19"
36
36
  }
37
37
  }
@@ -4,27 +4,51 @@
4
4
 
5
5
  Returns the vehicle's physical state, such as which doors are open.
6
6
 
7
+ For the trunk (rt) and frunk (ft) fields, you should interpret a zero (0) value as closed and a non-zero value as open (partially or fully).
8
+
9
+ Here are the currently known values for the `center_display_state` field:
10
+
11
+ | State | Description |
12
+ | ----- | --------------- |
13
+ | 0 | Off |
14
+ | 2 | Normal On |
15
+ | 3 | Charging Screen |
16
+ | 7 | Sentry Mode |
17
+ | 8 | Dog Mode |
18
+
19
+ Here are the descriptions for the shorthand fields:
20
+
21
+ | Field | Description |
22
+ | ----- | --------------- |
23
+ | df | driver front |
24
+ | dr | driver rear |
25
+ | pf | passenger front |
26
+ | pr | passenger rear |
27
+ | ft | front trunk |
28
+ | rt | rear trunk |
29
+
7
30
  ### Response
8
31
 
9
32
  ```json
10
33
  {
11
34
  "response": {
12
- "api_version": 6,
13
- "autopark_state_v2": "ready",
35
+ "api_version": 10,
36
+ "autopark_state_v2": "standby",
14
37
  "autopark_style": "standard",
15
38
  "calendar_supported": true,
16
- "car_version": "2018.42.2 19e7e44",
39
+ "car_version": "2020.36.16 3e9e4e8dd287",
17
40
  "center_display_state": 0,
18
41
  "df": 0,
19
42
  "dr": 0,
20
43
  "ft": 0,
44
+ "homelink_device_count": 2,
21
45
  "homelink_nearby": true,
22
46
  "is_user_present": false,
23
47
  "last_autopark_error": "no_error",
24
- "locked": true,
48
+ "locked": false,
25
49
  "media_state": { "remote_control_enabled": true },
26
50
  "notifications_supported": true,
27
- "odometer": 36051.517239,
51
+ "odometer": 57509.856033,
28
52
  "parsed_calendar_supported": true,
29
53
  "pf": 0,
30
54
  "pr": 0,
@@ -32,30 +56,30 @@ Returns the vehicle's physical state, such as which doors are open.
32
56
  "remote_start_enabled": true,
33
57
  "remote_start_supported": true,
34
58
  "rt": 0,
35
- "sentry_mode": true,
36
- "software_update": { "expected_duration_sec": 2700, "status": "" },
59
+ "sentry_mode": false,
60
+ "sentry_mode_available": true,
61
+ "smart_summon_available": true,
62
+ "software_update": {
63
+ "download_perc": 0,
64
+ "expected_duration_sec": 2700,
65
+ "install_perc": 1,
66
+ "status": "",
67
+ "version": ""
68
+ },
37
69
  "speed_limit_mode": {
38
70
  "active": false,
39
71
  "current_limit_mph": 50.0,
40
72
  "max_limit_mph": 90,
41
73
  "min_limit_mph": 50,
42
- "pin_code_set": false
74
+ "pin_code_set": true
43
75
  },
76
+ "summon_standby_mode_enabled": false,
44
77
  "sun_roof_percent_open": 0,
45
- "sun_roof_state": "unknown",
46
- "timestamp": 1543187581934,
78
+ "sun_roof_state": "closed",
79
+ "timestamp": 1604977470379,
47
80
  "valet_mode": false,
48
81
  "valet_pin_needed": true,
49
82
  "vehicle_name": "Nikola 2.0"
50
83
  }
51
84
  }
52
85
  ```
53
-
54
- ### Center Display States
55
- | State | Description |
56
- |-------|-----------------|
57
- | 0 | Off |
58
- | 2 | Normal On |
59
- | 3 | Charging Screen |
60
- | 7 | Sentry Mode |
61
- | 8 | Dog Mode |
@@ -2,7 +2,7 @@ module TeslaApi
2
2
  module Autopark
3
3
  def start_autopark(&handler)
4
4
  Async do |task|
5
- Async::WebSocket::Client.connect(endpoint, headers: headers) do |connection|
5
+ Async::WebSocket::Client.connect(autopark_endpoint, headers: headers) do |connection|
6
6
  while message = connection.read
7
7
  case message[:msg_type]
8
8
  when 'control:hello'
@@ -21,21 +21,21 @@ module TeslaApi
21
21
 
22
22
  private
23
23
 
24
- def endpoint
25
- Async::HTTP::Endpoint.parse(autopark_socket_endpoint)
24
+ def autopark_endpoint
25
+ Async::HTTP::Endpoint.parse(autopark_endpoint_url)
26
26
  end
27
27
 
28
- def autopark_socket_endpoint
28
+ def autopark_endpoint_url
29
29
  "wss://streaming.vn.teslamotors.com/connect/#{self['vehicle_id']}"
30
30
  end
31
31
 
32
- def headers
32
+ def autopark_headers
33
33
  {
34
34
  'Authorization' => "Basic #{socket_auth}"
35
35
  }
36
36
  end
37
37
 
38
- def socket_auth
38
+ def autopark_socket_auth
39
39
  Base64.strict_encode64("#{email}:#{self['tokens'].first}")
40
40
  end
41
41
  end
@@ -2,7 +2,8 @@ module TeslaApi
2
2
  class Client
3
3
  attr_reader :api, :email, :access_token, :access_token_expires_at, :refresh_token, :client_id, :client_secret
4
4
 
5
- BASE_URI = 'https://owner-api.teslamotors.com/api/1'
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,
@@ -10,9 +11,15 @@ module TeslaApi
10
11
  access_token_expires_at: nil,
11
12
  refresh_token: nil,
12
13
  client_id: ENV['TESLA_CLIENT_ID'],
13
- client_secret: ENV['TESLA_CLIENT_SECRET']
14
+ client_secret: ENV['TESLA_CLIENT_SECRET'],
15
+ retry_options: nil,
16
+ base_uri: nil,
17
+ sso_uri: nil,
18
+ client_options: {}
14
19
  )
15
20
  @email = email
21
+ @base_uri = base_uri || BASE_URI
22
+ @sso_uri = sso_uri || SSO_URI
16
23
 
17
24
  @client_id = client_id
18
25
  @client_secret = client_secret
@@ -22,49 +29,114 @@ module TeslaApi
22
29
  @refresh_token = refresh_token
23
30
 
24
31
  @api = Faraday.new(
25
- BASE_URI,
26
- headers: { 'User-Agent' => "github.com/timdorr/tesla-api v:#{VERSION}" }
32
+ @base_uri + '/api/1',
33
+ {
34
+ headers: { 'User-Agent' => "github.com/timdorr/tesla-api v:#{VERSION}" }
35
+ }.merge(client_options)
27
36
  ) do |conn|
28
37
  conn.request :json
29
38
  conn.response :json
30
39
  conn.response :raise_error
40
+ conn.request :retry, retry_options if retry_options # Must be registered after :raise_error
31
41
  conn.adapter Faraday.default_adapter
32
42
  end
33
43
  end
34
44
 
35
45
  def refresh_access_token
36
- response = api.post(
37
- 'https://owner-api.teslamotors.com/oauth/token',
46
+ response = @api.post(
47
+ @sso_uri + '/oauth2/v3/token',
38
48
  {
39
49
  grant_type: 'refresh_token',
40
- client_id: client_id,
50
+ client_id: 'ownerapi',
41
51
  client_secret: client_secret,
42
- refresh_token: refresh_token
52
+ refresh_token: refresh_token,
53
+ scope: 'openid email offline_access'
43
54
  }
44
55
  ).body
45
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
+
46
69
  @access_token = response['access_token']
47
70
  @access_token_expires_at = Time.at(response['created_at'].to_f + response['expires_in'].to_f).to_datetime
48
- @refresh_token = response['refresh_token']
49
71
 
50
72
  response
51
73
  end
52
74
 
53
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
+
54
128
  response = api.post(
55
- 'https://owner-api.teslamotors.com/oauth/token',
129
+ @base_uri + '/oauth/token',
56
130
  {
57
- grant_type: 'password',
131
+ grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
58
132
  client_id: client_id,
59
- client_secret: client_secret,
60
- email: email,
61
- password: password
62
- }
133
+ client_secret: client_secret
134
+ },
135
+ 'Authorization' => "Bearer #{response['access_token']}"
63
136
  ).body
64
137
 
65
138
  @access_token = response['access_token']
66
139
  @access_token_expires_at = Time.at(response['created_at'].to_f + response['expires_in'].to_f).to_datetime
67
- @refresh_token = response['refresh_token']
68
140
 
69
141
  response
70
142
  end
@@ -1,6 +1,14 @@
1
1
  module TeslaApi
2
2
  module Stream
3
- def stream(&receiver)
3
+ def self.streaming_endpoint_url
4
+ 'wss://streaming.vn.teslamotors.com/streaming/'
5
+ end
6
+
7
+ def self.streaming_endpoint
8
+ Async::HTTP::Endpoint.parse(streaming_endpoint_url, alpn_protocols: Async::HTTP::Protocol::HTTP11.names)
9
+ end
10
+
11
+ def stream(endpoint: Stream.streaming_endpoint, &receiver)
4
12
  Async do |task|
5
13
  Async::WebSocket::Client.connect(endpoint) do |connection|
6
14
  on_timeout = ->(subtask) do
@@ -8,7 +16,7 @@ module TeslaApi
8
16
  task.stop
9
17
  end
10
18
 
11
- connection.write(stream_connect_message)
19
+ connection.write(streaming_connect_message)
12
20
  timeout = task.async(&on_timeout)
13
21
 
14
22
  while message = connection.read
@@ -46,18 +54,10 @@ module TeslaApi
46
54
 
47
55
  TIMEOUT = 30
48
56
 
49
- def endpoint
50
- Async::HTTP::Endpoint.parse(streaming_endpoint)
51
- end
52
-
53
- def streaming_endpoint
54
- 'wss://streaming.vn.teslamotors.com/streaming/'
55
- end
56
-
57
- def stream_connect_message
57
+ def streaming_connect_message
58
58
  {
59
- msg_type: 'data:subscribe',
60
- token: Base64.strict_encode64("#{email}:#{self['tokens'].first}"),
59
+ msg_type: 'data:subscribe_oauth',
60
+ token: client.access_token,
61
61
  value: 'speed,odometer,soc,elevation,est_heading,est_lat,est_lng,power,shift_state,range,est_range,heading',
62
62
  tag: self['vehicle_id'].to_s,
63
63
  }
@@ -27,6 +27,10 @@ module TeslaApi
27
27
 
28
28
  # State
29
29
 
30
+ def vehicle_data
31
+ client.get("/vehicles/#{id}/vehicle_data")['response']
32
+ end
33
+
30
34
  def data
31
35
  client.get("/vehicles/#{id}/data")['response']
32
36
  end
@@ -94,7 +98,7 @@ module TeslaApi
94
98
  end
95
99
 
96
100
  def set_charge_limit(percent)
97
- command('set_charge_limit', body: {percent: percent})['response']
101
+ command('set_charge_limit', body: {percent: percent.to_i})['response']
98
102
  end
99
103
 
100
104
  def charge_start
@@ -1,3 +1,3 @@
1
1
  module TeslaApi
2
- VERSION = '3.0.3'
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