bolognese 0.9.95 → 0.9.96

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,378 @@
1
+ require_relative 'doi_utils'
2
+ require_relative 'author_utils'
3
+ require_relative 'datacite_utils'
4
+ require_relative 'utils'
5
+
6
+ require_relative 'readers/bibtex_reader'
7
+ require_relative 'readers/citeproc_reader'
8
+ require_relative 'readers/codemeta_reader'
9
+ require_relative 'readers/crosscite_reader'
10
+ require_relative 'readers/crossref_reader'
11
+ require_relative 'readers/datacite_json_reader'
12
+ require_relative 'readers/datacite_reader'
13
+ require_relative 'readers/ris_reader'
14
+ require_relative 'readers/schema_org_reader'
15
+
16
+ require_relative 'writers/bibtex_writer'
17
+ require_relative 'writers/citation_writer'
18
+ require_relative 'writers/citeproc_writer'
19
+ require_relative 'writers/codemeta_writer'
20
+ require_relative 'writers/crosscite_writer'
21
+ require_relative 'writers/crossref_writer'
22
+ require_relative 'writers/datacite_writer'
23
+ require_relative 'writers/datacite_json_writer'
24
+ require_relative 'writers/jats_writer'
25
+ require_relative 'writers/rdf_xml_writer'
26
+ require_relative 'writers/ris_writer'
27
+ require_relative 'writers/schema_org_writer'
28
+ require_relative 'writers/turtle_writer'
29
+
30
+ module Bolognese
31
+ module MetadataUtils
32
+ # include BenchmarkMethods
33
+ include Bolognese::DoiUtils
34
+ include Bolognese::AuthorUtils
35
+ include Bolognese::DataciteUtils
36
+ include Bolognese::Utils
37
+
38
+ include Bolognese::Readers::BibtexReader
39
+ include Bolognese::Readers::CiteprocReader
40
+ include Bolognese::Readers::CodemetaReader
41
+ include Bolognese::Readers::CrossciteReader
42
+ include Bolognese::Readers::CrossrefReader
43
+ include Bolognese::Readers::DataciteReader
44
+ include Bolognese::Readers::DataciteJsonReader
45
+ include Bolognese::Readers::RisReader
46
+ include Bolognese::Readers::SchemaOrgReader
47
+
48
+ include Bolognese::Writers::BibtexWriter
49
+ include Bolognese::Writers::CitationWriter
50
+ include Bolognese::Writers::CiteprocWriter
51
+ include Bolognese::Writers::CodemetaWriter
52
+ include Bolognese::Writers::CrossciteWriter
53
+ include Bolognese::Writers::CrossrefWriter
54
+ include Bolognese::Writers::DataciteWriter
55
+ include Bolognese::Writers::DataciteJsonWriter
56
+ include Bolognese::Writers::JatsWriter
57
+ include Bolognese::Writers::RdfXmlWriter
58
+ include Bolognese::Writers::RisWriter
59
+ include Bolognese::Writers::SchemaOrgWriter
60
+ include Bolognese::Writers::TurtleWriter
61
+
62
+ attr_accessor :string, :identifier, :from, :author,
63
+ :creator, :title, :publisher, :contributor, :license,
64
+ :date_accepted, :date_available, :date_copyrighted, :date_collected,
65
+ :date_submitted, :date_valid, :date_created, :date_modified, :date_updated, :provider_id, :client_id, :journal,
66
+ :volume, :issue, :first_page, :last_page, :b_doi, :b_url, :b_version, :keywords, :editor,
67
+ :description, :alternate_name, :language, :content_size, :spatial_coverage,
68
+ :schema_version, :has_part, :same_as,
69
+ :is_previous_version_of, :is_new_version_of, :is_cited_by, :cites,
70
+ :is_supplement_to, :is_supplemented_by, :is_continued_by, :continues,
71
+ :has_metadata, :is_metadata_for, :is_referenced_by, :references,
72
+ :is_documented_by, :documents, :is_compiled_by, :compiles,
73
+ :is_variant_form_of, :is_original_form_of, :is_reviewed_by, :reviews,
74
+ :is_derived_from, :is_source_of, :format, :funding, :style, :locale, :state, :regenerate, :sandbox
75
+
76
+ attr_reader :doc, :service_provider, :page_start, :page_end, :related_identifier, :reverse, :name_detector
77
+
78
+ attr_writer :id, :type, :additional_type, :citeproc_type, :bibtex_type, :doi,
79
+ :ris_type, :meta
80
+
81
+ def exists?
82
+ meta.fetch("state", "not_found") != "not_found"
83
+ end
84
+
85
+ def valid?
86
+ exists? && errors.nil?
87
+ end
88
+
89
+ # validate against DataCite schema, unless there are already errors in the reader
90
+ def errors
91
+ meta.fetch("errors", nil) || datacite_errors(xml: datacite, schema_version: schema_version)
92
+ end
93
+
94
+ # replace DOI in XML if provided in options
95
+ def raw
96
+ r = string.present? ? string.strip : nil
97
+ return r unless (from == "datacite" && r.present?)
98
+
99
+ doc = Nokogiri::XML(string, nil, 'UTF-8', &:noblanks)
100
+ node = doc.at_css("identifier")
101
+ node.content = doi.to_s.upcase
102
+ doc.to_xml.strip
103
+ end
104
+
105
+ def should_passthru
106
+ (from == "datacite") && regenerate.blank?
107
+ end
108
+
109
+ # generate name for method to call dynamically
110
+ # the id might change
111
+ def meta
112
+ m = from.present? ? send("read_" + from, string: string, sandbox: sandbox) : {}
113
+ @id = b_doi || m.fetch("id", nil) || m.fetch("identifier", nil)
114
+
115
+ m
116
+ end
117
+
118
+ def id
119
+ @id ||= meta.fetch("id", nil)
120
+ end
121
+
122
+ def type
123
+ @type ||= meta.fetch("type", nil)
124
+ end
125
+
126
+ def additional_type
127
+ @additional_type ||= meta.fetch("additional_type", nil)
128
+ end
129
+
130
+ def citeproc_type
131
+ @citeproc_type ||= meta.fetch("citeproc_type", nil)
132
+ end
133
+
134
+ def bibtex_type
135
+ @bibtex_type ||= meta.fetch("bibtex_type", nil)
136
+ end
137
+
138
+ def ris_type
139
+ @ris_type ||= meta.fetch("ris_type", nil)
140
+ end
141
+
142
+ def resource_type_general
143
+ @resource_type_general ||= meta.fetch("resource_type_general", nil)
144
+ end
145
+
146
+ def doi
147
+ @doi ||= @id.present? ? doi_from_url(@id) : meta.fetch("doi", nil)
148
+ end
149
+
150
+ def b_url
151
+ @b_url ||= meta.fetch("b_url", nil)
152
+ end
153
+
154
+ def identifier
155
+ @identifier ||= meta.fetch("id", nil)
156
+ end
157
+
158
+ def state
159
+ @state ||= meta.fetch("state", nil)
160
+ end
161
+
162
+ def title
163
+ @title ||= meta.fetch("title", nil)
164
+ end
165
+
166
+ def alternate_name
167
+ @alternate_name ||= meta.fetch("alternate_name", nil)
168
+ end
169
+
170
+ def author
171
+ @author ||= meta.fetch("author", nil)
172
+ end
173
+
174
+ def editor
175
+ @editor ||= meta.fetch("editor", nil)
176
+ end
177
+
178
+ def publisher
179
+ @publisher ||= meta.fetch("publisher", nil)
180
+ end
181
+
182
+ def service_provider
183
+ @service_provider ||= meta.fetch("service_provider", nil)
184
+ end
185
+
186
+ def date_created
187
+ @date_created ||= meta.fetch("date_created", nil)
188
+ end
189
+
190
+ def date_accepted
191
+ @date_accepted ||= meta.fetch("date_accepted", nil)
192
+ end
193
+
194
+ def date_available
195
+ @date_available ||= meta.fetch("date_available", nil)
196
+ end
197
+
198
+ def date_copyrighted
199
+ @date_copyrighted ||= meta.fetch("date_copyrighted", nil)
200
+ end
201
+
202
+ def date_collected
203
+ @date_collected ||= meta.fetch("date_collected", nil)
204
+ end
205
+
206
+ def date_submitted
207
+ @date_submitted ||= meta.fetch("date_submitted", nil)
208
+ end
209
+
210
+ def date_valid
211
+ @date_valid ||= meta.fetch("date_valid", nil)
212
+ end
213
+
214
+ def date_published
215
+ @date_published ||= meta.fetch("date_published", nil)
216
+ end
217
+
218
+ def date_modified
219
+ @date_modified ||= meta.fetch("date_modified", nil)
220
+ end
221
+
222
+ def date_registered
223
+ @date_registered ||= meta.fetch("date_registered", nil)
224
+ end
225
+
226
+ def date_updated
227
+ @date_updated ||= meta.fetch("date_updated", nil)
228
+ end
229
+
230
+ def volume
231
+ @volume ||= meta.fetch("volume", nil)
232
+ end
233
+
234
+ def first_page
235
+ @first_page ||= meta.fetch("first_page", nil)
236
+ end
237
+
238
+ def last_page
239
+ @last_page ||= meta.fetch("last_page", nil)
240
+ end
241
+
242
+ def description
243
+ @description ||= meta.fetch("description", nil)
244
+ end
245
+
246
+ def license
247
+ @license ||= meta.fetch("license", nil)
248
+ end
249
+
250
+ def b_version
251
+ @b_version ||= meta.fetch("b_version", nil)
252
+ end
253
+
254
+ def keywords
255
+ @keywords ||= meta.fetch("keywords", nil)
256
+ end
257
+
258
+ def language
259
+ @language ||= meta.fetch("language", nil)
260
+ end
261
+
262
+ def content_size
263
+ @content_size ||= meta.fetch("content_size", nil)
264
+ end
265
+
266
+ def schema_version
267
+ @schema_version ||= meta.fetch("schema_version", nil)
268
+ end
269
+
270
+ def funding
271
+ @funding ||= meta.fetch("funding", nil)
272
+ end
273
+
274
+ def provider_id
275
+ @provider_id ||= meta.fetch("provider_id", nil)
276
+ end
277
+
278
+ def client_id
279
+ @client_id ||= meta.fetch("client_id", nil)
280
+ end
281
+
282
+ def is_identical_to
283
+ meta.fetch("is_identical_to", nil)
284
+ end
285
+
286
+ def is_part_of
287
+ meta.fetch("is_part_of", nil)
288
+ end
289
+
290
+ def has_part
291
+ meta.fetch("has_part", nil)
292
+ end
293
+
294
+ def is_previous_version_of
295
+ meta.fetch("is_previous_of", nil)
296
+ end
297
+
298
+ def is_new_version_of
299
+ meta.fetch("is_new_version_of", nil)
300
+ end
301
+
302
+ def is_variant_form_of
303
+ meta.fetch("is_variant_form_of", nil)
304
+ end
305
+
306
+ def is_original_form_of
307
+ meta.fetch("is_original_form_of", nil)
308
+ end
309
+
310
+ def references
311
+ meta.fetch("references", nil)
312
+ end
313
+
314
+ def is_referenced_by
315
+ meta.fetch("is_referenced_by", nil)
316
+ end
317
+
318
+ def is_supplement_to
319
+ meta.fetch("is_supplement_to", nil)
320
+ end
321
+
322
+ def is_supplemented_by
323
+ meta.fetch("is_supplemented_by", nil)
324
+ end
325
+
326
+ def reviews
327
+ meta.fetch("reviews", nil)
328
+ end
329
+
330
+ def is_reviewed_by
331
+ meta.fetch("is_reviewed_by", nil)
332
+ end
333
+
334
+ def related_identifier_hsh(relation_type)
335
+ Array.wrap(send(relation_type)).select { |r| r["id"] || r["issn"] }
336
+ .map { |r| r.merge("relationType" => relation_type.camelize) }
337
+ end
338
+
339
+ def related_identifier
340
+ relation_types = %w(is_part_of has_part references is_referenced_by is_supplement_to is_supplemented_by)
341
+ relation_types.reduce([]) { |sum, r| sum += related_identifier_hsh(r) }
342
+ end
343
+
344
+ # recognize given name. Can be loaded once as ::NameDetector, e.g. in a Rails initializer
345
+ def name_detector
346
+ @name_detector ||= defined?(::NameDetector) ? ::NameDetector : nil
347
+ end
348
+
349
+ def publication_year
350
+ date_published.present? ? date_published[0..3].to_i.presence : nil
351
+ end
352
+
353
+ def container_title
354
+ Array.wrap(is_part_of).first.to_h.fetch("title", nil)
355
+ end
356
+
357
+ def descriptions
358
+ Array.wrap(description)
359
+ end
360
+
361
+ def reverse
362
+ { "citation" => Array.wrap(is_referenced_by).map { |r| { "@id" => r["id"] }}.unwrap,
363
+ "isBasedOn" => Array.wrap(is_supplement_to).map { |r| { "@id" => r["id"] }}.unwrap }.compact
364
+ end
365
+
366
+ def graph
367
+ RDF::Graph.new << JSON::LD::API.toRdf(schema_hsh)
368
+ end
369
+
370
+ def style
371
+ @style || "apa"
372
+ end
373
+
374
+ def locale
375
+ @locale || "en-US"
376
+ end
377
+ end
378
+ end
@@ -17,7 +17,7 @@ module Bolognese
17
17
  end
18
18
 
19
19
  meta = string.present? ? Maremma.from_json(string) : {}
20
- identifier = meta.fetch("identifier", nil) || options[:id]
20
+ identifier = meta.fetch("identifier", nil)
21
21
  id = normalize_id(meta.fetch("@id", nil) || identifier)
22
22
  type = meta.fetch("@type", nil)
23
23
  author = get_authors(from_schema_org(Array.wrap(meta.fetch("agents", nil))))
@@ -129,7 +129,7 @@ module Bolognese
129
129
  additional_type = (additional_type || model).to_s.underscore.camelize.presence
130
130
  type = CR_TO_SO_TRANSLATIONS[additional_type] || "ScholarlyArticle"
131
131
 
132
- doi = bibliographic_metadata.dig("doi_data", "doi").to_s.downcase.presence || doi_from_url(options[:id])
132
+ doi = bibliographic_metadata.dig("doi_data", "doi").to_s.downcase.presence #|| doi_from_url(options[:id])
133
133
 
134
134
  # Crossref servers run on Eastern Time
135
135
  Time.zone = 'Eastern Time (US & Canada)'
@@ -16,7 +16,7 @@ module Bolognese
16
16
  id = normalize_id(id)
17
17
  response = Maremma.get(id)
18
18
  doc = Nokogiri::XML(response.body.fetch("data", nil), nil, 'UTF-8')
19
- #string = doc.at_xpath('//script[@type="application/ld+json"]')
19
+
20
20
  # workaround for xhtml documents
21
21
  nodeset = doc.css("script")
22
22
  string = nodeset.find { |element| element["type"] == "application/ld+json" }
@@ -33,7 +33,7 @@ module Bolognese
33
33
 
34
34
  meta = string.present? ? Maremma.from_json(string) : {}
35
35
 
36
- id = normalize_id(meta.fetch("@id", nil) || options[:id])
36
+ id = normalize_id(meta.fetch("@id", nil) || meta.fetch("identifier", nil))
37
37
  type = meta.fetch("@type", nil) && meta.fetch("@type").camelcase
38
38
  resource_type_general = Bolognese::Utils::SO_TO_DC_TRANSLATIONS[type]
39
39
  authors = meta.fetch("author", nil) || meta.fetch("creator", nil)
@@ -65,11 +65,13 @@ module Bolognese
65
65
  "ris_type" => Bolognese::Utils::SO_TO_RIS_TRANSLATIONS[resource_type_general.to_s.dasherize] || "GEN",
66
66
  "resource_type_general" => resource_type_general,
67
67
  "doi" => validate_doi(id),
68
+ "identifier" => id,
68
69
  "b_url" => normalize_id(meta.fetch("url", nil)),
69
70
  "title" => meta.fetch("name", nil),
70
71
  "alternate_name" => meta.fetch("alternateName", nil),
71
72
  "author" => author,
72
- "publisher" => meta.dig("publisher", "name"),
73
+ "editor" => editor,
74
+ "publisher" => publisher,
73
75
  "service_provider" => meta.fetch("provider", nil),
74
76
  "is_identical_to" => schema_org_is_identical_to(meta),
75
77
  "is_part_of" => is_part_of,
@@ -1,3 +1,3 @@
1
1
  module Bolognese
2
- VERSION = "0.9.95"
2
+ VERSION = "0.9.96"
3
3
  end
@@ -29,17 +29,17 @@ http_interactions:
29
29
  Location:
30
30
  - "/eating-your-own-dog-food/"
31
31
  Date:
32
- - Sun, 01 Apr 2018 09:07:34 GMT
32
+ - Sat, 05 May 2018 11:18:18 GMT
33
33
  Server:
34
34
  - AmazonS3
35
35
  Age:
36
- - '7'
36
+ - '1'
37
37
  X-Cache:
38
38
  - Hit from cloudfront
39
39
  Via:
40
- - 1.1 b4a55cbff1b10f55c71caa19690c960e.cloudfront.net (CloudFront)
40
+ - 1.1 79503619d600dbc1c9e04a650d3d7f3f.cloudfront.net (CloudFront)
41
41
  X-Amz-Cf-Id:
42
- - PiYKF90NnJ3q74OCFm-SsaoZ4dFao2Mf2nsqorGgC5peSZ1G49af-w==
42
+ - STgSOeC22bUHkt2ibmg8PYtQx3wOaP4LuhYPvdMOpKbqG6whLJv1CA==
43
43
  body:
44
44
  encoding: ASCII-8BIT
45
45
  string: |
@@ -50,14 +50,14 @@ http_interactions:
50
50
  <ul>
51
51
  <li>Code: Found</li>
52
52
  <li>Message: Resource Found</li>
53
- <li>RequestId: 9969744BDEDE2DCF</li>
54
- <li>HostId: CHCBOci8Ah7seqAe+QhEI4MkzkKUaFeWxNnz62xRgBd+OUDoxKz3/WrhvPncEjkePwujz5xR060=</li>
53
+ <li>RequestId: D9CCB55C4CD3060A</li>
54
+ <li>HostId: 96Rt2L2T/eEFeJZens9Xh0CiPmwnzPOib+s4Z2/eYdziOrw0Ja/kRiarTIWcIYC/CM6+fDkkYCk=</li>
55
55
  </ul>
56
56
  <hr/>
57
57
  </body>
58
58
  </html>
59
59
  http_version:
60
- recorded_at: Sun, 01 Apr 2018 09:07:41 GMT
60
+ recorded_at: Sat, 05 May 2018 11:18:19 GMT
61
61
  - request:
62
62
  method: get
63
63
  uri: https://blog.datacite.org/eating-your-own-dog-food/
@@ -81,27 +81,27 @@ http_interactions:
81
81
  Connection:
82
82
  - keep-alive
83
83
  Date:
84
- - Sun, 01 Apr 2018 09:07:35 GMT
84
+ - Fri, 04 May 2018 14:28:27 GMT
85
85
  Cache-Control:
86
86
  - max-age=31536000
87
87
  Last-Modified:
88
- - Sat, 17 Mar 2018 06:52:49 GMT
88
+ - Thu, 19 Apr 2018 19:39:54 GMT
89
89
  Etag:
90
90
  - '"1503fefbb078bce096ab37de682aaef9"'
91
91
  Server:
92
92
  - AmazonS3
93
93
  Age:
94
- - '7'
94
+ - '74993'
95
95
  X-Cache:
96
96
  - Hit from cloudfront
97
97
  Via:
98
- - 1.1 f5d27f80802e2b6e66ec3970da5568b8.cloudfront.net (CloudFront)
98
+ - 1.1 268be5c908db8ae22ed9c5c6cfffc109.cloudfront.net (CloudFront)
99
99
  X-Amz-Cf-Id:
100
- - "-aA8hrGsojsp7E9okzWAiBPen1XoAZfca4cKjVGRw_EbL3f41hhFcA=="
100
+ - gPl2ytth78oV9A5h_Y65W3oEivzS7-GV4ZH0Yq-vw9guHRfEex266w==
101
101
  body:
102
102
  encoding: ASCII-8BIT
103
103
  string: !binary |-
104
104
  PCFET0NUWVBFIGh0bWw+CiAgPGh0bWw+CiAgICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDwhLS0gKDEpIE9wdGltaXplIGZvciBtb2JpbGUgdmVyc2lvbnM6IGh0dHA6Ly9nb28uZ2wvRU9wRmwgLS0+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8IS0tICgxKSBmb3JjZSBsYXRlc3QgSUUgcmVuZGVyaW5nIGVuZ2luZTogYml0Lmx5LzFjOEVpQzkgLS0+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgoKCiAgICA8dGl0bGU+RWF0aW5nIHlvdXIgb3duIERvZyBGb29kPC90aXRsZT4KICAgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJFYXRpbmcgeW91ciBvd24gZG9nIGZvb2QgaXMgYSBzbGFuZyB0ZXJtIHRvIGRlc2NyaWJlIHRoYXQgYW4gb3JnYW5pemF0aW9uIHNob3VsZCBpdHNlbGYgdXNlIHRoZSBwcm9kdWN0cyBhbmQgc2VydmljZXMgaXQgcHJvdmlkZXMuIEZvciBEYXRhQ2l0ZSB0aGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIHVzZSBET0lzIHdpdGggYXBwcm9wcmlhdGUgbWV0YWRhdGEgYW5kIHN0cmF0ZWdpZXMgZm9yIGxvbmctdGVybSBwcmVzZXJ2YXRpb24gZm9yLi4uIiAvPgoKICAgIDxtZXRhIG5hbWU9IkhhbmRoZWxkRnJpZW5kbHkiIGNvbnRlbnQ9IlRydWUiIC8+CiAgICA8bWV0YSBuYW1lPSJNb2JpbGVPcHRpbWl6ZWQiIGNvbnRlbnQ9IjMyMCIgLz4KICAgIDxtZXRhIG5hbWU9ImFwcGxlLW1vYmlsZS13ZWItYXBwLWNhcGFibGUiIGNvbnRlbnQ9InllcyI+CiAgICA8bWV0YSBuYW1lPSJhcHBsZS1tb2JpbGUtd2ViLWFwcC1zdGF0dXMtYmFyLXN0eWxlIiBjb250ZW50PSJibGFjay10cmFuc2x1Y2VudCI+CgogICAgPCEtLSBEdWJsaW5Db3JlIE1ldGFkYXRhIC0tPgogICAgPG1ldGEgcHJvcGVydHk9ImRjOnRpdGxlIiBjb250ZW50PSJFYXRpbmcgeW91ciBvd24gRG9nIEZvb2QiIC8+CiAgICA8bWV0YSBwcm9wZXJ0eT0iZGM6Zm9ybWF0IiBjb250ZW50PSJ0ZXh0L2h0bWwiIC8+CiAgICA8bWV0YSBwcm9wZXJ0eT0iZGM6bGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuIiAvPgogICAgPG1ldGEgcHJvcGVydHk9ImRjOnJpZ2h0cyIgY29udGVudD0iQ0MtQlkiIC8+CiAgICA8bWV0YSBwcm9wZXJ0eT0iZGM6c291cmNlIiBjb250ZW50PSJEYXRhQ2l0ZSBCbG9nIiAvPgogICAgPG1ldGEgcHJvcGVydHk9ImRjOnN1YmplY3QiIGNvbnRlbnQ9IlNjaG9sYXJseSBDb21tdW5pY2F0aW9uIiAvPgogICAgPG1ldGEgcHJvcGVydHk9ImRjOnR5cGUiIGNvbnRlbnQ9IndlYnNpdGUiIC8+CgoKICAgIDxtZXRhIHByb3BlcnR5PSJvZzpzaXRlX25hbWUiIGNvbnRlbnQ9IkVhdGluZyB5b3VyIG93biBEb2cgRm9vZCIgLz4KICAgIDxtZXRhIHByb3BlcnR5PSJvZzpkZXNjcmlwdGlvbiIgY29udGVudD0iRWF0aW5nIHlvdXIgb3duIGRvZyBmb29kIGlzIGEgc2xhbmcgdGVybSB0byBkZXNjcmliZSB0aGF0IGFuIG9yZ2FuaXphdGlvbiBzaG91bGQgaXRzZWxmIHVzZSB0aGUgcHJvZHVjdHMgYW5kIHNlcnZpY2VzIGl0IHByb3ZpZGVzLiBGb3IgRGF0YUNpdGUgdGhpcyBtZWFucyB0aGF0IHdlIHNob3VsZCB1c2UgRE9JcyB3aXRoIGFwcHJvcHJpYXRlIG1ldGFkYXRhIGFuZCBzdHJhdGVnaWVzIGZvciBsb25nLXRlcm0gcHJlc2VydmF0aW9uIGZvci4uLiIgLz4KICAgIDxtZXRhIHByb3BlcnR5PSJvZzppbWFnZSIgY29udGVudD0iaHR0cHM6Ly9ibG9nLmRhdGFjaXRlLm9yZy9pbWFnZXMvMjAxNi8xMi8yMzA3ODUuanBnIiAvPgogICAgPG1ldGEgcHJvcGVydHk9Im9nOnR5cGUiIGNvbnRlbnQ9ImJsb2ciIC8+CgogICAgPGxpbmsgaHJlZj0iLy9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PUxpYnJlK0Jhc2tlcnZpbGxlOjQwMCw0MDBpLDcwMCIgcmVsPSJzdHlsZXNoZWV0Ij4KICAgIDxsaW5rIGhyZWY9Jy8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1SYWxld2F5OjQwMCw2MDAsNDAwaXRhbGljLDYwMGl0YWxpYycgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2Nzcyc+CiAgICA8bGluayBocmVmPSIvL21heGNkbi5ib290c3RyYXBjZG4uY29tL2ZvbnQtYXdlc29tZS80LjYuMS9jc3MvZm9udC1hd2Vzb21lLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0ndGV4dC9jc3MnPgogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9hc3NldHMuZGF0YWNpdGUub3JnL3N0eWxlc2hlZXRzL2RhdGFjaXRlLmNzcyIgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2Nzcyc+CiAgICA8bGluayBocmVmPSJodHRwczovL2Fzc2V0cy5kYXRhY2l0ZS5vcmcvaW1hZ2VzL2Zhdmljb24uaWNvIiByZWw9Imljb24iIHR5cGU9ImltYWdlL2ljbyIgLz4KCiAgICA8c2NyaXB0IHNyYz0iLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvZml0dmlkcy8xLjEuMC9qcXVlcnkuZml0dmlkcy5taW4uanMiPjwvc2NyaXB0PgoKICAgICAgPHNjcmlwdAogICAgICAgIHNyYz0iLy9kMnd5OGY3YTl1cnNubS5jbG91ZGZyb250Lm5ldC9idWdzbmFnLTIubWluLmpzIgogICAgICAgIGRhdGEtYXBpa2V5PSJjMzdhNTg2MTk2NzA5MWE5YjQyYTFhNzdlMjM1MTE0YSI+CiAgICAgIDwvc2NyaXB0PgoKICAgIDxzY3JpcHQgdHlwZT0iYXBwbGljYXRpb24vbGQranNvbiI+CiAgICAgIHsiQGNvbnRleHQiOiJodHRwOi8vc2NoZW1hLm9yZyIsIkB0eXBlIjoiQmxvZ1Bvc3RpbmciLCJAaWQiOiJodHRwczovL2RvaS5vcmcvMTAuNTQzOC80azNtLW55dmciLCJuYW1lIjoiRWF0aW5nIHlvdXIgb3duIERvZyBGb29kIiwiYWx0ZXJuYXRlTmFtZSI6Ik1TLTQ5LTM2MzItNTA4MyIsInVybCI6Imh0dHBzOi8vYmxvZy5kYXRhY2l0ZS5vcmcvZWF0aW5nLXlvdXItb3duLWRvZy1mb29kLyIsImF1dGhvciI6W3siQHR5cGUiOiJQZXJzb24iLCJAaWQiOiJodHRwczovL29yY2lkLm9yZy8wMDAwLTAwMDMtMTQxOS0yNDA1IiwiZ2l2ZW5OYW1lIjoiTWFydGluIiwiZmFtaWx5TmFtZSI6IkZlbm5lciIsIm5hbWUiOiJNYXJ0aW4gRmVubmVyIn1dLCJwdWJsaXNoZXIiOnsiQHR5cGUiOiJPcmdhbml6YXRpb24iLCJuYW1lIjoiRGF0YUNpdGUifSwiZGF0ZUNyZWF0ZWQiOiIyMDE2LTEyLTIwIiwiZGF0ZVB1Ymxpc2hlZCI6IjIwMTYtMTItMjAiLCJkYXRlTW9kaWZpZWQiOiIyMDE2LTEyLTIwIiwia2V5d29yZHMiOiJkYXRhY2l0ZSwgZG9pLCBtZXRhZGF0YSwgZmVhdHVyZWQiLCJ2ZXJzaW9uIjoiMS4wIiwiZGVzY3JpcHRpb24iOiJFYXRpbmcgeW91ciBvd24gZG9nIGZvb2QgaXMgYSBzbGFuZyB0ZXJtIHRvIGRlc2NyaWJlIHRoYXQgYW4gb3JnYW5pemF0aW9uIHNob3VsZCBpdHNlbGYgdXNlIHRoZSBwcm9kdWN0cyBhbmQgc2VydmljZXMgaXQgcHJvdmlkZXMuIEZvciBEYXRhQ2l0ZSB0aGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIHVzZSBET0lzIHdpdGggYXBwcm9wcmlhdGUgbWV0YWRhdGEgYW5kIHN0cmF0ZWdpZXMgZm9yIGxvbmctdGVybSBwcmVzZXJ2YXRpb24gZm9yLi4uIiwibGljZW5zZSI6Imh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS80LjAvIiwiaW1hZ2UiOiJodHRwczovL2Jsb2cuZGF0YWNpdGUub3JnL2ltYWdlcy8yMDE2LzEyLzIzMDc4NS5qcGciLCJpc1BhcnRPZiI6eyJAdHlwZSI6IkJsb2ciLCJAaWQiOiJodHRwczovL2RvaS5vcmcvMTAuNTQzOC8wMDAwLTAwU1MiLCJuYW1lIjoiRGF0YUNpdGUgQmxvZyJ9LCJjaXRhdGlvbiI6W3siQHR5cGUiOiJDcmVhdGl2ZVdvcmsiLCJAaWQiOiJodHRwczovL2RvaS5vcmcvMTAuNTQzOC8wMDEyIn0seyJAdHlwZSI6IkNyZWF0aXZlV29yayIsIkBpZCI6Imh0dHBzOi8vZG9pLm9yZy8xMC41NDM4LzU1RTUtVDVDMCJ9XX0KICAgIDwvc2NyaXB0PgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxoZWFkZXIgY2xhc3M9ImhlYWRlciIgaWQ9Im5hdnRvcCI+CiAgICAgIDxkaXYgY2xhc3M9Im5hdmJhciBuYXZiYXItd2hpdGUiIHJvbGU9Im5hdmlnYXRpb24iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lci1mbHVpZCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItaGVhZGVyIgogICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Im5hdmJhci10b2dnbGUiIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9Ii5uYXZiYXItY29sbGFwc2UiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzci1vbmx5Ij5Ub2dnbGUgbmF2aWdhdGlvbjwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaWNvbi1iYXIiPjwvc3Bhbj4KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxhIGNsYXNzPSJuYXZiYXItYnJhbmQiIGhyZWY9Ii8iPkRhdGFDaXRlIEJsb2c8L2E+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXZiYXItY29sbGFwc2UgY29sbGFwc2UiPgogICAgICAgICAgICA8dWwgY2xhc3M9Im5hdiBuYXZiYXItbmF2IG5hdmJhci1yaWdodCI+CiAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vc3VwcG9ydC5kYXRhY2l0ZS5vcmciPlN1cHBvcnQ8L2E+PC9saT4KICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRyb3Bkb3duIj4KICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJkcm9wZG93bi10b2dnbGUiIGRhdGEtdG9nZ2xlPSJkcm9wZG93biIgaWQ9InNpdGVzIj48aSBjbGFzcz0nZmEgZmEtdGgnPjwvaT4gPHNwYW4gY2xhc3M9ImNhcmV0Ij48L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJkcm9wZG93bi1tZW51IiByb2xlPSJtZW51Ij4KICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZyI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9J2ZhIGZhLWdsb2JlIGZhLWZ3Jz48L2k+CiAgICAgICAgICAgICAgICAgICAgSG9tZXBhZ2U8L2E+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2Jsb2cuZGF0YWNpdGUub3JnIj4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0nZmEgZmEtcnNzIGZhLWZ3Jz48L2k+CiAgICAgICAgICAgICAgICAgICAgQmxvZzwvYT4KICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJkaXZpZGVyIj48L2xpPgogICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9tZHMuZGF0YWNpdGUub3JnIj4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0nZmEgZmEtZGF0YWJhc2UgZmEtZncnPjwvaT4KICAgICAgICAgICAgICAgICAgICBNRFM8L2E+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3NjaGVtYS5kYXRhY2l0ZS5vcmciPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSdmYSBmYS1maWxlLWNvZGUtbyBmYS1mdyc+PC9pPgogICAgICAgICAgICAgICAgICAgIFNjaGVtYTwvYT4KICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jaXRhdGlvbi5jcm9zc2NpdGUub3JnIj4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0nZmEgZmEtZmlsZS10ZXh0LW8gZmEtZncnPjwvaT4KICAgICAgICAgICAgICAgICAgICBDaXRhdGlvbiBGb3JtYXR0ZXI8L2E+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGl2aWRlciI+PC9saT4KICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vc2VhcmNoLmRhdGFjaXRlLm9yZyI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9J2ZhIGZhLXNlYXJjaCBmYS1mdyc+PC9pPgogICAgICAgICAgICAgICAgICAgIFNlYXJjaDwvYT4KICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vb2FpLmRhdGFjaXRlLm9yZyI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9J2ZhIGZhLXRhYmxlIGZhLWZ3Jz48L2k+CiAgICAgICAgICAgICAgICAgICAgT0FJLVBNSDwvYT4KICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vc3RhdHMuZGF0YWNpdGUub3JnIj4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0nZmEgZmEtYmFyLWNoYXJ0IGZhLWZ3Jz48L2k+CiAgICAgICAgICAgICAgICAgICAgU3RhdGlzdGljczwvYT4KICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vYXBpLmRhdGFjaXRlLm9yZyI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9J2ZhIGZhLWNvZ3MgZmEtZncnPjwvaT4KICAgICAgICAgICAgICAgICAgICBSRVNUIEFQSTwvYT4KICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cucmUzZGF0YS5vcmciPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSdmYSBmYS1jdWJlcyBmYS1mdyc+PC9pPgogICAgICAgICAgICAgICAgICAgIHJlM2RhdGE8L2E+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGl2aWRlciI+PC9saT4KICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9zdGF0dXMuZGF0YWNpdGUub3JnIj4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0nZmEgZmEtY2FsZW5kYXItY2hlY2stbyBmYS1mdyc+PC9pPgogICAgICAgICAgICAgICAgICAgIFN0YXR1czwvYT4KICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvaGVhZGVyPgogICAgICA8ZGl2IGNsYXNzPSJ3cmFwcGVyIj4KICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gc2VjdGlvbi13aGl0ZSI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lci1mbHVpZCI+CiAgICAgICAgPGRpdiBjbGFzcz0icm93IHJvdy1zZWN0aW9uIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC04IGNvbC1tZC1vZmZzZXQtMiBwb3N0LWNvbnRlbnQiPgogICAgICAgICAgICA8YSBuYW1lPSJ0b3BvZnBhZ2UiPjwvYT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icG9zdC1tZXRhIj4KICAgICAgICAgICAgICA8aDE+RWF0aW5nIHlvdXIgb3duIERvZyBGb29kPC9oMT4KICAgICAgICAgICAgICBEZWNlbWJlciAyMCwgMjAxNiBieSBNYXJ0aW4gRmVubmVyCiAgICAgICAgICAgICAg4oCiIDxzcGFuIGNsYXNzPSJwb3N0LXJlYWRpbmctdGltZSI+PC9zcGFuPiByZWFkCiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZG9pIj48YSBocmVmPSJodHRwczovL2RvaS5vcmcvMTAuNTQzOC80azNtLW55dmciPmh0dHBzOi8vZG9pLm9yZy8xMC41NDM4LzRrM20tbnl2ZzwvYT48L3A+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPHA+PGEgaHJlZj0iaHR0cHM6Ly9uZXdyZXB1YmxpYy5jb20vYXJ0aWNsZS8xMTUzNDkvZG9nZm9vZGluZy10ZWNoLXNsYW5nLXdvcmtpbmctb3V0LWdsaXRjaGVzIj5FYXRpbmcgeW91ciBvd24gZG9nIGZvb2Q8L2E+IGlzIGEgc2xhbmcgdGVybSB0byBkZXNjcmliZSB0aGF0IGFuIG9yZ2FuaXphdGlvbiBzaG91bGQgaXRzZWxmIHVzZSB0aGUgcHJvZHVjdHMgYW5kIHNlcnZpY2VzIGl0IHByb3ZpZGVzLiBGb3IgRGF0YUNpdGUgdGhpcyBtZWFucyB0aGF0IHdlIHNob3VsZCB1c2UgRE9JcyB3aXRoIGFwcHJvcHJpYXRlIG1ldGFkYXRhIGFuZCBzdHJhdGVnaWVzIGZvciBsb25nLXRlcm0gcHJlc2VydmF0aW9uIGZvciB0aGUgc2Nob2xhcmx5IG91dHB1dHMgd2UgcHJvZHVjZS4gRm9yIHRoZSBtb3N0IHBhcnQgdGhpcyBpcyBub3QgcmVzZWFyY2ggZGF0YSwgYnV0IHJhdGhlciB0ZWNobmljYWwgZG9jdW1lbnRzIHN1Y2ggYXMgdGhlIERhdGFDaXRlIFNjaGVtYSBhbmQgaXRzIGRvY3VtZW50YXRpb24gPHNwYW4gY2xhc3M9ImNpdGF0aW9uIj4oPGEgaHJlZj0iI3JlZi1odHRwczovL2RvaS5vcmcvMTAuNTQzOC8wMDEyIj4yMDE2PC9hPik8L3NwYW4+LjwvcD4KPHA+VGhlc2Ugb3V0cHV0cyBhbHNvIGluY2x1ZGUgdGhlIHBvc3RzIG9uIHRoaXMgYmxvZywgd2hlcmUgd2UgZGlzY3VzcyB0b3BpY3MgcmVsZXZhbnQgZm9yIHRoZSBEYXRhQ2l0ZSBjb21tdW5pdHksIGJ1dCBhbHNvIG9mIGJyb2FkZXIgaW50ZXJlc3QgdG8gYW55b25lIHdobyBjYXJlcyBhYm91dCByZXNlYXJjaCBkYXRhLCBwZXJzaXN0ZW50IGlkZW50aWZpZXJzLCBhbmQgc2Nob2xhcmx5IGluZnJhc3RydWN0dXJlLiBBbmQgc3RhcnRpbmcgdG9kYXkgYWxsIGJsb2cgcG9zdHMgb24gdGhpcyBibG9nIHdpbGwgaGF2ZSBhIERPSSwgbWV0YWRhdGEgYW5kIHVzZSBhIHBlcnNpc3RlbnQgc3RvcmFnZSBtZWNoYW5pc20uPC9wPgo8ZGl2IGNsYXNzPSJmaWd1cmUiPgo8aW1nIHNyYz0iL2ltYWdlcy8yMDE2LzEyLzIzMDc4NS5qcGciIGFsdD0iUGhvdG8gYnkgQmlsbCBFbXJpY2guIENDIFplcm8uIiAvPgo8cCBjbGFzcz0iY2FwdGlvbiI+UGhvdG8gYnkgPGEgaHJlZj0iaHR0cHM6Ly93d3cucGV4ZWxzLmNvbS9waG90by9ibGFjay1hbmQtdGFuLXlvcmtzaGlyZS10ZXJyaWVyLXB1cHB5LTIzMDc4NS8iPkJpbGwgRW1yaWNoPC9hPi4gPGEgaHJlZj0iaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8iPkNDIFplcm88L2E+LjwvcD4KPC9kaXY+CjxoMyBpZD0idGVjaG5pY2FsLWltcGxlbWVudGF0aW9uIj5UZWNobmljYWwgSW1wbGVtZW50YXRpb248L2gzPgo8cD5UaGlzIGJsb2cgaXMgcG93ZXJlZCBieSB0aGUgc3RhdGljIHNpdGUgZ2VuZXJhdG9yIDxhIGhyZWY9Imh0dHBzOi8vbWlkZGxlbWFuYXBwLmNvbS8iPk1pZGRsZW1hbjwvYT4sIHdpdGggYmxvZyBwb3N0cyB3cml0dGVuIGluIDxhIGhyZWY9Imh0dHA6Ly9jb21tb25tYXJrLm9yZy8iPk1hcmtkb3duPC9hPiBhbmQgY29udmVydGVkIHRvIEhUTUwgdXNpbmcgPGEgaHJlZj0iaHR0cDovL3BhbmRvYy5vcmcvIj5QYW5kb2M8L2E+IGFuZCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly90cmF2aXMtY2kub3JnIj5UcmF2aXMgQ0k8L2E+IGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gc2VydmljZS4gU3RhdGljIHNpdGUgZ2VuZXJhdG9yIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gZGF0YWJhc2Ugb3IgYXBwbGljYXRpb24gc2VydmVyIHBvd2VyaW5nIHRoZSBzaXRlLCBtYWtpbmcgd2Vic2l0ZSBhZG1pbnN0cmF0aW9uIHNpbXBsZXIsIGNoZWFwZXIgYW5kIHNhZmVyLiBJbiBhZGRpdGlvbiB0byB0aGUgYmxvZywgdGhlIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZyI+RGF0YUNpdGUgaG9tZXBhZ2U8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL3NjaGVtYS5kYXRhY2l0ZS5vcmciPk1ldGFkYXRhIFNjaGVtYSBzdWJzaXRlPC9hPiBhcmUgYWxzbyBnZW5lcmF0ZWQgdXNpbmcgTWlkZGxlbWFuLjwvcD4KPHA+VGhlIHNpbXBsaWNpdHkgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBoZXJlLCBhcyByZWdpc3RlcmluZyB0aGUgRE9JcyBhbmQgbWV0YWRhdGEgY2FuIGJlIGFjY29tcGxpc2hlZCB1c2luZyBhIGNvbW1hbmQgbGluZSB1dGlsaXR5IHdyaXR0ZW4gYnkgRGF0YUNpdGUgc3RhZmYgdGhhdCBkb2VzbuKAmXQgbmVlZCB0byBrbm93IG11Y2ggYWJvdXQgdGhlIGludGVybmFscyBvZiBNaWRkbGVtYW4sIGFuZCB0aHVzIGNhbiBiZSBlYXNpbHkgYWRhcHRlZCB0byBvdGhlciBzdGF0aWMgc2l0ZSBnZW5lcmF0b3JzIHN1Y2ggYXMgPGEgaHJlZj0iaHR0cDovL2pla3lsbHJiLmNvbS8iPkpla3lsbDwvYT4sIDxhIGhyZWY9Imh0dHA6Ly9nb2h1Z28uaW8vIj5IdWdvPC9hPiBvciA8YSBocmVmPSJodHRwczovL2hleG8uaW8vIj5IZXhvPC9hPi4gVGhlIGNvbW1hbmQgbGluZSB1dGlsaXR5IGlzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhY2l0ZS9jaXJuZWNvIj5DaXJuZWNvPC9hPiwgZ2VuZXJhdGluZyB0aGUgbWV0YWRhdGEgWE1MIGFjY29yZGluZyB0byB0aGUgRGF0YUNpdGUgTWV0YWRhdGEgU2NoZW1hLCBhbmQgcmVnaXN0ZXJpbmcgRE9JIGFuZCBtZXRhZGF0YSB3aXRoIHRoZSBEYXRhQ2l0ZSBNRFMuIExpa2UgYWxsIHRvb2xzIG1lbnRpb25lZCBpbiB0aGlzIHBvc3QgQ2lybmVjbyBpcyBvcGVuIHNvdXJjZSBzb2Z0d2FyZSwgcGxlYXNlIHJlYWNoIG91dCB0byB1cyBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gaW1wbGVtZW50aW5nIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSBmb3IgeW91ciBibG9nLjwvcD4KPGgzIGlkPSJnZW5lcmF0aW5nLWRvaXMiPkdlbmVyYXRpbmcgRE9JczwvaDM+CjxwPlRoZSBET0lzIGZvciB0aGlzIGJsb2cgYXJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LCB1c2luZyBhIG1vZGlmaWVkIGJhc2UzMiBlbmNvZGluZyBhbGdvcml0aG0gdGhhdCBpcyBwcm92aWRlZCBieSBDaXJuZWNvLCBhcyBkaXNjdXNzZWQgbGFzdCB3ZWVrIDxzcGFuIGNsYXNzPSJjaXRhdGlvbiI+KEZlbm5lciwgPGEgaHJlZj0iI3JlZi1odHRwczovL2RvaS5vcmcvMTAuNTQzOC81NUU1LVQ1QzAiPjIwMTY8L2E+KTwvc3Bhbj4uIFRoZSBET0kgaXMgZ2VuZXJhdGVkIGFuZCBtaW50ZWQgd2hlbiBhIG5ldyBwb3N0IGlzIHB1c2hlZCB0byA8YSBocmVmPSJodHRwczovL2Jsb2cuZGF0YWNpdGUub3JnIiBjbGFzcz0idXJpIj5odHRwczovL2Jsb2cuZGF0YWNpdGUub3JnPC9hPi4gVGhpcyBhdm9pZHMgdHdvIHByb2JsZW1zOiBhKSBET0ktbGlrZSBzdHJpbmdzIGluIHRoZSB3aWxkIGJlZm9yZSBwdWJsaWNhdGlvbiBhbmQgYikgdGhlIHJhbmRvbWx5IGdlbmVyYXRlZCBET0kgZXhpc3RzIGFscmVhZHkgKHdlIGNhbiBzaW1wbHkgZ2VuZXJhdGUgYSBuZXcgb25lKS4gQWxsIERPSXMgYXJlIHNob3J0LCB3aXRob3V0IHNlbWFudGljIGluZm9tYXRpb24gdGhhdCBtaWdodCBjaGFuZ2Ugb3ZlciB0aW1lLCBhbmQgd2l0aCBhIGNoZWNrc3VtIHRvIG1pbmltaXplIHRyYW5zY3JpcHRpb24gZXJyb3JzLCBmb3IgZXhhbXBsZSA8c3Ryb25nPmh0dHBzOi8vZG9pLm9yZy8xMC41NDM4L1hDQkotRzdaWTwvc3Ryb25nPi4gR29pbmcgZm9yd2FyZCB3ZSBlbmNvdXJhZ2UgdXNlcnMgdG8gbGluayB0byB0aGUgRGF0YUNpdGUgQmxvZyB1c2luZyB0aGUgRE9JLCBhcyB0aGVzZSBsaW5rcyB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgZXZlbiBpZiB3ZSBldmVyIG1vdmUgdGhlIGJsb2cgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24uPC9wPgo8aDMgaWQ9ImdlbmVyYXRpbmctbWV0YWRhdGEiPkdlbmVyYXRpbmcgTWV0YWRhdGE8L2gzPgo8cD5Gb3IgdGhlIGdlbmVyYXRpb24gb2YgbWV0YWRhdGEsIHdlIG5lZWQgdG8gc3RyaWtlIGEgYmFsYW5jZSBiZXR3ZWVuIHNpbXBsZSBhdXRob3IgcHJvdmlkZWQgbWV0YWRhdGEsIGJ1dCByaWNoIGVub3VnaCB0byBhaWQgZGlzY292ZXJ5LiBXZSBhcmUgZG9pbmcgdGhpcyB2aWEgdGhyZWUgbWVjaGFuaXNtczo8L3A+Cjx1bD4KPGxpPm1ldGFkYXRhIHByb3ZpZGVkIGJ5IHRoZSBhdXRob3I8L2xpPgo8bGk+ZGVmYXVsdCBtZXRhZGF0YSBmb3IgdGhlIGJsb2c8L2xpPgo8bGk+bWV0YWRhdGEgYXV0b21hdGljYWxseSBleHRyYWN0ZWQgZnJvbSBjb250ZW50PC9saT4KPC91bD4KPHA+VGhlIG1ldGFkYXRhIHByb3ZpZGVkIGJ5IHRoZSBhdXRob3IgYXJlIHRoZSB0eXBpY2FsIG1ldGFkYXRhIGZvciBibG9nIHBvc3RzLCBwcm92aWRlZCB2aWEgPGEgaHJlZj0iaHR0cHM6Ly9nb2h1Z28uaW8vY29udGVudC9mcm9udC1tYXR0ZXIvIj5ZQU1MIGZyb250IG1hdHRlcjwvYT4gYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBvc3Q6PC9wPgo8ZGl2IGNsYXNzPSJzb3VyY2VDb2RlIj48cHJlIGNsYXNzPSJzb3VyY2VDb2RlIHlhbWwiPjxjb2RlIGNsYXNzPSJzb3VyY2VDb2RlIHlhbWwiPjxzcGFuIGNsYXNzPSJvdCI+LS0tPC9zcGFuPgo8c3BhbiBjbGFzcz0iZnUiPmxheW91dDo8L3NwYW4+IHBvc3QKPHNwYW4gY2xhc3M9ImZ1Ij50aXRsZTo8L3NwYW4+IEVhdGluZyB5b3VyIG93biBEb2cgRm9vZAo8c3BhbiBjbGFzcz0iZnUiPmF1dGhvcjo8L3NwYW4+IG1mZW5uZXIKPHNwYW4gY2xhc3M9ImZ1Ij5kYXRlOjwvc3Bhbj4gMjAxNi0xMi0xOQo8c3BhbiBjbGFzcz0iZnUiPnRhZ3M6PC9zcGFuPgo8c3BhbiBjbGFzcz0ia3ciPi08L3NwYW4+IGRhdGFjaXRlCjxzcGFuIGNsYXNzPSJrdyI+LTwvc3Bhbj4gZG9pCjxzcGFuIGNsYXNzPSJrdyI+LTwvc3Bhbj4gbWV0YWRhdGEKPHNwYW4gY2xhc3M9Im90Ij4tLS08L3NwYW4+PC9jb2RlPjwvcHJlPjwvZGl2Pgo8cD5XZSBjYW4gcmV1c2UgYWxsIHRoZXNlIG1ldGFkYXRhIHdoZW4gZ2VuZXJhdGluZyBEYXRhQ2l0ZSBtZXRhZGF0YSwgdXNpbmcgdGhlIHRhZ3MgYXMgPGNvZGU+c3ViamVjdHM8L2NvZGU+LjwvcD4KPHA+VGhlIGRlZmF1bHQgbWV0YWRhdGEgYXJlIG1ldGFkYXRhIHRoYXQgYWx3YXlzIHN0YXkgdGhlIHNhbWUgZm9yIHRoZSBibG9nLCBzdWNoIGFzIDxjb2RlPnB1Ymxpc2hlcjwvY29kZT4sIDxjb2RlPkhvc3RpbmdJbnN0aXR1dGlvbjwvY29kZT4gYW5kIDxjb2RlPnJpZ2h0czwvY29kZT4uIFdlIGNhbiBzdG9yZSB0aGVtIGluIGEgc2l0ZS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4gV2UgY2FuIGFsc28gYXNzdW1lIHJlYXNvbmFibGUgZGVmYXVsdHMgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiB0aGUgWUFNTCBmcm9udCBtYXR0ZXIsIGUuZy4gPGNvZGU+cmVzb3VyY2VUeXBlPC9jb2RlPiAod2UgdXNlIDxhIGhyZWY9Imh0dHBzOi8vc2NoZW1hLm9yZy9CbG9nUG9zdGluZyI+QmxvZ1Bvc3Rpbmc8L2E+IHdpdGggPGNvZGU+cmVzb3VyY2VUeXBlR2VuZXJhbDwvY29kZT4gVGV4dCkgYW5kIDxjb2RlPnZlcnNpb248L2NvZGU+LiBXZSBzdG9yZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGF1dGhvcnMgb3V0c2lkZSB0aGUgYmxvZyBwb3N0LCBpbmNsdWRpbmcgPGNvZGU+Z2l2ZW5OYW1lPC9jb2RlPiwgPGNvZGU+ZmFtaWx5TmFtZTwvY29kZT4gYW5kIDxjb2RlPm5hbWVJZGVudGlmaWVyPC9jb2RlPiAod2Ugbm93IHNob3cgdGhlIE9SQ0lEIElEIG9mIGV2ZXJ5IGJsb2cgYXV0aG9yIGF0IHRoZSBib3R0b20gb2YgdGhlIHBvc3QpLjwvcD4KPHA+RmluYWxseSwgdGhlcmUgYXJlIG1ldGFkYXRhIHRoYXQgd2UgY2FuIGF1dG9tYXRpY2FsbHkgZXh0cmFjdCBmcm9tIHRoZSBibG9nIHBvc3QsIGFuZCB3ZSBhcmUgY3VycmVudGx5IGRvaW5nIHRoaXMgZm9yIHRoZSA8Y29kZT5kZXNjcmlwdGlvbjwvY29kZT4gYW5kIDxjb2RlPnJlbGF0ZWRJZGVudGlmaWVyPC9jb2RlPi4gVGhpcyBibG9nIHVzZXMgUGFuZG9jIGFuZCBCaWJUZXggdG8gZ2VuZXJhdGUgdGhlIHJlZmVyZW5jZXMgc2VjdGlvbiBhdCB0aGUgZW5kLCBhbmQgd2UgY2FuIGZldGNoIHRoaXMgaW5mb3JtYXRpb24gYW5kIGNvbnZlcnQgaXQgaW50byB0aGUgZm9ybWF0IG5lZWRlZCBmb3IgPGNvZGU+cmVsYXRlZElkZW50aWZpZXI8L2NvZGU+LjwvcD4KPHA+VGFrZW4gdG9nZXRoZXIgd2UgY2FuIHByb3ZpZGUgYWxsIG1ldGFkYXRhIHRoYXQgYXJlIDxlbT5yZXF1aXJlZDwvZW0+IG9yIDxlbT5yZWNvbW1lbmRlZDwvZW0+IGluIHRoZSBNZXRhZGF0YSBTY2hlbWEgZG9jdW1lbnRhdGlvbiA8c3BhbiBjbGFzcz0iY2l0YXRpb24iPig8YSBocmVmPSIjcmVmLWh0dHBzOi8vZG9pLm9yZy8xMC41NDM4LzAwMTIiPjIwMTY8L2E+KTwvc3Bhbj4sIGFuZCB3ZSBjYW4gZG8gdGhpcyB3aXRob3V0IGFueSBleHRyYSBlZmZvcnQgZm9yIHRoZSBhdXRob3IuIFRoZSBmdWxsIFhNTCBpcyBhdmFsYWlsYWJsZSA8YSBocmVmPSJodHRwczovL2RhdGEuZGF0YWNpdGUub3JnL2FwcGxpY2F0aW9uL3gtZGF0YWNpdGUreG1sLzEwLjU0MzgvNEszTS1OWVZHIj5oZXJlPC9hPi48L3A+CjxwPk5vdCBhbGwgYmxvZyBwb3N0cyBuZWVkIHRvIGJlIGNpdGVkIGZvcm1hbGx5IHdpdGggbWV0YWRhdGEgaW4gYSA8ZW0+cmVmZXJlbmNlczwvZW0+IGxpc3QgZm9ybWF0dGVkIGFjY29yZGluZyB0byBhIHNwZWNpZmljIGNpdGF0aW9uIHN0eWxlLiBCdXQgdGhlc2UgbWV0YWRhdGEgZ3JlYXRseSBoZWxwIHdpdGggZGlzY292ZXJ5LCBhIHNlYXJjaCBpbiBEYXRhQ2l0ZSBTZWFyY2ggZm9yIDxhIGhyZWY9Imh0dHA6Ly9zZWFyY2guZGF0YWNpdGUub3JnL3dvcmtzP3F1ZXJ5PWVhdGluZytkb2crZm9vZCI+ZWF0aW5nIGRvZyBmb29kPC9hPiB3aWxsIGZvciBleGFtcGxlIGJyaW5nIHVwIHRoaXMgYmxvZyBwb3N0IGFzIHRoZSBmaXJzdCBoaXQuPC9wPgo8aDMgaWQ9InBlcnNpc3RlbnQtc3RvcmFnZSI+UGVyc2lzdGVudCBzdG9yYWdlPC9oMz4KPHA+VXNpbmcgRE9JcyBtZWFucyB0aGF0IHJlYWRlcnMgbm90IG9ubHkgZXhwZWN0IHJpY2ggbWV0YWRhdGEgdGhhdCBoZWxwIHdpdGggY2l0YXRpb24gYW5kIGRpc2NvdmVyeSwgYnV0IGFsc28gdGhhdCBEYXRhQ2l0ZSB0YWtlcyBleHRyYSBjYXJlIHRvIHByZXNlcnZlIHRoZSBibG9nIHBvc3RzLCB0aGlua2luZyBiZXlvbmQgdGhlIHBhcnRpY3VsYXIgdGVjaG5pY2FsIGltcGxlbWVudGF0aW9uIG9yIGV2ZW4gdGhlIGNvbnRpdWluZyBleGlzdGVuY2Ugb2YgdGhpcyBibG9nLiBUaGlzIGlzIGFuIGFyZWEgd2hlcmUgd2UgZG8gbmVlZCB0byBkbyBtb3JlIHdvcmssIHN0YXJ0aW5nIHdpdGggYSBkZWNpc2lvbiBhYm91dCB0aGUgYmVzdCBhcmNoaXZhbCBmb3JtYXQgZm9yIGEgYmxvZyBwb3N0IChIVE1MLCBQREYsIDxhIGhyZWY9Imh0dHBzOi8vamF0cy5ubG0ubmloLmdvdi8iPkpBVFM8L2E+PykuIEZvciBub3cgYmxvZyBwb3N0cyBhcmUgaG9zdGVkIGluIG11bHRpcGxlIEdpdCByZXBvc2l0b3JpZXMgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhY2l0ZS9ibG9nIj5vbmUgb2YgdGhlbSBvbiBHaXRodWI8L2E+KSwgYW5kIGluIHR3byBpbmRlcGVuZGVudCBBbWF6b24gUzMgYnVja2V0cyB0aGF0IGVhY2ggdXNlIDxhIGhyZWY9Imh0dHA6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvVmVyc2lvbmluZy5odG1sIj52ZXJzaW9uaW5nPC9hPi4gTXVsdGlwbGUgbG9jYXRpb25zIHdpdGggdmVyc2lvbmluZyBhcmUgYSBnb29kIHN0YXJ0LCBidXQgbW9yZSB3b3JrIGlzIGNsZWFybHkgbmVlZGVkLjwvcD4KPGgzIGlkPSJyZWZlcmVuY2VzIiBjbGFzcz0idW5udW1iZXJlZCI+UmVmZXJlbmNlczwvaDM+CjxkaXYgaWQ9InJlZnMiIGNsYXNzPSJyZWZlcmVuY2VzIj4KPGRpdiBpZD0icmVmLWh0dHBzOi8vZG9pLm9yZy8xMC41NDM4LzAwMTIiPgo8cD5EYXRhQ2l0ZSBNZXRhZGF0YSBXb3JraW5nIEdyb3VwLiAoMjAxNikuIERhdGFDaXRlIE1ldGFkYXRhIFNjaGVtYSBmb3IgdGhlIFB1YmxpY2F0aW9uIGFuZCBDaXRhdGlvbiBvZiBSZXNlYXJjaCBEYXRhIHY0LjAuIDxlbT5EYXRhQ2l0ZTwvZW0+LiA8YSBocmVmPSJodHRwczovL2RvaS5vcmcvMTAuNTQzOC8wMDEyIiBjbGFzcz0idXJpIj5odHRwczovL2RvaS5vcmcvMTAuNTQzOC8wMDEyPC9hPjwvcD4KPC9kaXY+CjxkaXYgaWQ9InJlZi1odHRwczovL2RvaS5vcmcvMTAuNTQzOC81NUU1LVQ1QzAiPgo8cD5GZW5uZXIsIE0uICgyMDE2KS4gQ29vbCBET0nigJlzLiA8ZW0+RGF0YUNpdGU8L2VtPi4gPGEgaHJlZj0iaHR0cHM6Ly9kb2kub3JnLzEwLjU0MzgvNTVFNS1UNUMwIiBjbGFzcz0idXJpIj5odHRwczovL2RvaS5vcmcvMTAuNTQzOC81NUU1LVQ1QzA8L2E+PC9wPgo8L2Rpdj4KPC9kaXY+CgogICAgICAgICAgICA8aHIgd2lkdGg9IjgwJSI+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTUgY29sLW1kLW9mZnNldC0yIHBvc3QtY29udGVudCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJvdHRvbS10ZWFzZXIgY2YiPgogIDxkaXYgY2xhc3M9ImlzTGVmdCI+CiAgICA8c2VjdGlvbiBjbGFzcz0iYXV0aG9yIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImF1dGhvci1pbWFnZSIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6IHVybChodHRwczovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyLzQzNDU5MmEwOTdlOTEyNjE3OTJlYmQ2YjQ5MjA0MmJjP3M9MjUwJmQ9bW0mcj14KSI+QmxvZyBMb2dvPC9kaXY+CiAgICAgICAgPGg0Pk1hcnRpbiBGZW5uZXI8L2g0PgogICAgICAgIDxwIGNsYXNzPSJiaW8iPkRhdGFDaXRlIFRlY2huaWNhbCBEaXJlY3RvcjwvcD4KICAgICAgICA8cCBjbGFzcz0ib3JjaWQiPjxhIGhyZWY9Imh0dHBzOi8vb3JjaWQub3JnLzAwMDAtMDAwMy0xNDE5LTI0MDUiPmh0dHBzOi8vb3JjaWQub3JnLzAwMDAtMDAwMy0xNDE5LTI0MDU8L2E+PC9wPgogICAgICAgIDxkaXYgY2xhc3M9ImNsZWFyZml4Ij48L2Rpdj4KICAgICAgPGg0PkVhdGluZyB5b3VyIG93biBEb2cgRm9vZDwvaDQ+CiAgICAgICAgPHAgY2xhc3M9InB1Ymxpc2hlZCI+PGEgaHJlZj0iaHR0cHM6Ly9kb2kub3JnLzEwLjU0MzgvNGszbS1ueXZnIj5odHRwczovL2RvaS5vcmcvMTAuNTQzOC80azNtLW55dmc8L2E+CiAgICAgIDxwIGNsYXNzPSJwdWJsaXNoZWQiPjxpIGNsYXNzPSJmYSBmYS1jYWxlbmRhciI+PC9pPiA8dGltZSBkYXRldGltZT0iMjAxNi0xMi0yMCAwMDowMCI+RGVjZW1iZXIgMjAsIDIwMTY8L3RpbWU+PC9wPgogICAgICA8cCBjbGFzcz0icHVibGlzaGVkIj48aSBjbGFzcz0iZmEgZmEtaGlzdG9yeSI+PC9pPiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGF0YWNpdGUvYmxvZy9jb21taXRzL21hc3Rlci9zb3VyY2UvcG9zdHMvZWF0aW5nLXlvdXItb3duLWRvZy1mb29kLmh0bWwubWQiPkhpc3Rvcnk8L2E+PC9wPgogICAgICA8cCBjbGFzcz0icHVibGlzaGVkIj7CqSAyMDE2IE1hcnRpbiBGZW5uZXIuIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzQuMC8iPkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gbGljZW5zZTwvYT4uPC9wPgogICAgICA8cCBjbGFzcz0icHVibGlzaGVkIj4KICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdGFncyI+PC9pPgogICAgICAgIDxhIGhyZWY9Ii9pbmRleC5odG1sP3RhZz1kYXRhY2l0ZSI+ZGF0YWNpdGU8L2E+LCA8YSBocmVmPSIvaW5kZXguaHRtbD90YWc9ZG9pIj5kb2k8L2E+LCA8YSBocmVmPSIvaW5kZXguaHRtbD90YWc9bWV0YWRhdGEiPm1ldGFkYXRhPC9hPiwgPGEgaHJlZj0iL2luZGV4Lmh0bWw/dGFnPWZlYXR1cmVkIj5mZWF0dXJlZDwvYT4KICAgICAgPC9wPgogICAgPC9zZWN0aW9uPgogIDwvZGl2Pgo8L2Rpdj4KCiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0yIGNvbC1tZC1vZmZzZXQtMSI+CiAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJib3R0b20tdGVhc2VyIGNmIj4KICA8ZGl2IGNsYXNzPSJpc0xlZnQiPgogICAgPGg1IGNsYXNzPSJpbmRleC1oZWFkbGluZSBmZWF0dXJlZCI+PHNwYW4+U2hhcmUgb248L3NwYW4+PC9oNT4KICAgICAgPGEgY2xhc3M9Imljb24tdHdpdHRlciIgaHJlZj0iaHR0cDovL3R3aXR0ZXIuY29tL3NoYXJlP3RleHQ9T24gdGhlIEBkYXRhY2l0ZSBibG9nOiBFYXRpbmcgeW91ciBvd24gRG9nIEZvb2QmYW1wO3VybD1odHRwczovL2Jsb2cuZGF0YWNpdGUub3JnL2VhdGluZy15b3VyLW93bi1kb2ctZm9vZC8iCiAgICAgICAgb25jbGljaz0id2luZG93Lm9wZW4odGhpcy5ocmVmLCAndHdpdHRlci1zaGFyZScsICd3aWR0aD01NTAsaGVpZ2h0PTI1NScpO3JldHVybiBmYWxzZTsiPgogICAgICAgIDxpIGNsYXNzPSJmYSBmYS10d2l0dGVyIGZhLTJ4Ij48L2k+PHNwYW4gY2xhc3M9ImhpZGRlbiI+dHdpdHRlcjwvc3Bhbj4KICAgICAgPC9hPgogICAgICA8YSBjbGFzcz0iaWNvbi1mYWNlYm9vayIgaHJlZj0iaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL3NoYXJlci5waHA/dD1PbiB0aGUgQGRhdGFjaXRlIGJsb2c6IEVhdGluZyB5b3VyIG93biBEb2cgRm9vZCZhbXA7dT1odHRwczovL2Jsb2cuZGF0YWNpdGUub3JnL2VhdGluZy15b3VyLW93bi1kb2ctZm9vZC8iCiAgICAgICAgb25jbGljaz0id2luZG93Lm9wZW4odGhpcy5ocmVmLCAnZmFjZWJvb2stc2hhcmUnLCAnd2lkdGg9NTUwLGhlaWdodD0yNTUnKTtyZXR1cm4gZmFsc2U7Ij4KICAgICAgICA8aSBjbGFzcz0iZmEgZmEtZmFjZWJvb2sgZmEtMngiPjwvaT48c3BhbiBjbGFzcz0iaGlkZGVuIj5mYWNlYm9vazwvc3Bhbj4KICAgICAgPC9hPgogIDwvZGl2Pgo8L2Rpdj4KCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC04IGNvbC1tZC1vZmZzZXQtMiBwb3N0LWNvbnRlbnQiPgogICAgICAgICAgICAgIDxkaXYgaWQ9ImRpc3F1c190aHJlYWQiPjwvZGl2Pgo8c2NyaXB0PgogICAgdmFyIGRpc3F1c19jb25maWcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5wYWdlLnVybCA9ICdodHRwczovL2Jsb2cuZGF0YWNpdGUub3JnL2VhdGluZy15b3VyLW93bi1kb2ctZm9vZC8nOwogICAgICAgIHRoaXMucGFnZS5pZGVudGlmaWVyID0gJ2h0dHBzOi8vYmxvZy5kYXRhY2l0ZS5vcmcvZWF0aW5nLXlvdXItb3duLWRvZy1mb29kLyc7CiAgICB9OwogICAgKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBkID0gZG9jdW1lbnQsIHMgPSBkLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwoKICAgICAgICBzLnNyYyA9ICcvL2RhdGFjaXRlLmRpc3F1cy5jb20vZW1iZWQuanMnOyAgLy8KCiAgICAgICAgcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGltZXN0YW1wJywgK25ldyBEYXRlKCkpOwogICAgICAgIChkLmhlYWQgfHwgZC5ib2R5KS5hcHBlbmRDaGlsZChzKTsKICAgIH0pKCk7Cjwvc2NyaXB0Pgo8bm9zY3JpcHQ+UGxlYXNlIGVuYWJsZSBKYXZhU2NyaXB0IHRvIHZpZXcgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZGlzcXVzLmNvbS8/cmVmX25vc2NyaXB0IiByZWw9Im5vZm9sbG93Ij5jb21tZW50cyBwb3dlcmVkIGJ5IERpc3F1cy48L2E+PC9ub3NjcmlwdD4KCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+CiAgICA8Zm9vdGVyIGNsYXNzPSdyb3cgZm9vdGVyJz4KICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyLWZsdWlkIj4KICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtbWQtMyBjb2wtc20tNCc+CiAgICAgICAgICA8aDQ+QWJvdXQgRGF0YUNpdGU8L2g0PgogICAgICAgICAgPHVsPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL21pc3Npb24uaHRtbCI+V2hhdCB3ZSBkbzwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL2JvYXJkLmh0bWwiPkJvYXJkPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvc3RlZXJpbmcuaHRtbCI+U3RlZXJpbmcgZ3JvdXBzPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvc3RhZmYuaHRtbCI+U3RhZmY8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9qb2JvcHBvcnR1bml0aWVzLmh0bWwiPkpvYiBvcHBvcnR1bml0aWVzPC9hPjwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9J2NvbC1tZC0zIGNvbC1zbS00Jz4KICAgICAgICAgIDxoND5TZXJ2aWNlczwvaDQ+CiAgICAgICAgICA8dWw+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvZG9pcy5odG1sIj5Bc3NpZ24gRE9JczwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL3NlYXJjaC5odG1sIj5NZXRhZGF0YSBzZWFyY2g8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9ldmVudGRhdGEuaHRtbCI+RXZlbnQgZGF0YTwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL3Byb2ZpbGVzLmh0bWwiPlByb2ZpbGVzPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvcmUzZGF0YS5odG1sIj5yZTNkYXRhPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvY2l0YXRpb24uaHRtbCI+Q2l0YXRpb24gZm9ybWF0dGVyPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvc3RhdHMuaHRtbCI+U3RhdGlzdGljczwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL2NvbnRlbnQuaHRtbCI+Q29udGVudCBuZWdvdGlhdGlvbjwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL29haXBtaC5odG1sIj5PQUktUE1IPC9hPjwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9J2NvbC1tZC0zIGNvbC1zbS00Jz4KICAgICAgICAgIDxoND5SZXNvdXJjZXM8L2g0PgogICAgICAgICAgPHVsPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9zY2hlbWEuZGF0YWNpdGUub3JnIj5NZXRhZGF0YSBzY2hlbWE8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vc3VwcG9ydC5kYXRhY2l0ZS5vcmciPlN1cHBvcnQ8L2E+PC9saT4KICAgICAgICAgIDwvdWw+CiAgICAgICAgICA8aDQ+Q29tbXVuaXR5PC9oND4KICAgICAgICAgIDx1bD4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9tZW1iZXJzLmh0bWwiPk1lbWJlcnM8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9wYXJ0bmVycy5odG1sIj5QYXJ0bmVyczwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL3N0ZWVyaW5nLmh0bWwiPlN0ZWVyaW5nIGdyb3VwczwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL2V2ZW50cy5odG1sIj5FdmVudHM8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9yb2FkbWFwLmh0bWwiPlJvYWRtYXA8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy91c2VyLXN0b3JpZXMuaHRtbCI+VXNlciBTdG9yaWVzPC9hPjwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9J2NvbC1tZC0zJz4KICAgICAgICAgIDxoNCBjbGFzcz0ic2hhcmUiPkNvbnRhY3QgdXM8L2g0PgogICAgICAgICAgPGEgaHJlZj0nbWFpbHRvOnN1cHBvcnRAZGF0YWNpdGUub3JnJyBjbGFzcz0ic2hhcmUiPgogICAgICAgICAgICA8aSBjbGFzcz0nZmEgZmEtYXQnPjwvaT4KICAgICAgICAgIDwvYT4KICAgICAgICAgIDxhIGhyZWY9J2h0dHBzOi8vYmxvZy5kYXRhY2l0ZS5vcmcvZmVlZC54bWwnIGNsYXNzPSJzaGFyZSI+CiAgICAgICAgICAgIDxpIGNsYXNzPSdmYSBmYS1yc3MnPjwvaT4KICAgICAgICAgIDwvYT4KICAgICAgICAgIDxhIGhyZWY9J2h0dHBzOi8vdHdpdHRlci5jb20vZGF0YWNpdGUnIGNsYXNzPSJzaGFyZSI+CiAgICAgICAgICAgIDxpIGNsYXNzPSdmYSBmYS10d2l0dGVyJz48L2k+CiAgICAgICAgICA8L2E+CiAgICAgICAgICA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vZGF0YWNpdGUvZGF0YWNpdGUnIGNsYXNzPSJzaGFyZSI+CiAgICAgICAgICAgIDxpIGNsYXNzPSdmYSBmYS1naXRodWInPjwvaT4KICAgICAgICAgIDwvYT4KICAgICAgICAgIDxhIGhyZWY9J2h0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9jb21wYW55L2RhdGFjaXRlJyBjbGFzcz0ic2hhcmUiPgogICAgICAgICAgICA8aSBjbGFzcz0nZmEgZmEtbGlua2VkaW4nPjwvaT4KICAgICAgICAgIDwvYT4KICAgICAgICAgIDx1bD4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy90ZXJtcy5odG1sIj5UZXJtcyBhbmQgY29uZGl0aW9uczwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBwb2xpY3k8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9hY2tub3dsZWRnbWVudHMuaHRtbCI+QWNrbm93bGVkZ2VtZW50czwvYT48L2xpPgogICAgICAgICAgPC91bD4KICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zdGF0dXMuZGF0YWNpdGUub3JnIiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1kb3QiPjwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWRlc2NyaXB0aW9uIj48L3NwYW4+CiAgICAgICAgICA8L2E+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9mb290ZXI+CiAgICA8c2NyaXB0IHNyYz0iLy9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTIuMS40Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLy9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4zLjYvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLy9jZG4uc3RhdHVzcGFnZS5pby9zZS12Mi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9hc3NldHMuZGF0YWNpdGUub3JnL2phdmFzY3JpcHRzL2RlZmF1bHQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZWFkaW5nVGltZS5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9pbmRleC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iL2phdmFzY3JpcHRzL3NlYXJjaC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IGlkPSJkc3EtY291bnQtc2NyIiBzcmM9Ii8vZGF0YWNpdGUuZGlzcXVzLmNvbS9jb3VudC5qcyIgYXN5bmM+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICAoZnVuY3Rpb24oaSxzLG8sZyxyLGEsbSl7aVsnR29vZ2xlQW5hbHl0aWNzT2JqZWN0J109cjtpW3JdPWlbcl18fGZ1bmN0aW9uKCl7CiAgICAgIChpW3JdLnE9aVtyXS5xfHxbXSkucHVzaChhcmd1bWVudHMpfSxpW3JdLmw9MSpuZXcgRGF0ZSgpO2E9cy5jcmVhdGVFbGVtZW50KG8pLAogICAgICBtPXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUobylbMF07YS5hc3luYz0xO2Euc3JjPWc7bS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLG0pCiAgICAgIH0pKHdpbmRvdyxkb2N1bWVudCwnc2NyaXB0JywnLy93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vYW5hbHl0aWNzLmpzJywnZ2EnKTsKCiAgICAgIGdhKCdjcmVhdGUnLCAnVUEtMjI4MDYxOTYtNicsICdhdXRvJyk7CiAgICAgIGdhKCdzZW5kJywgJ3BhZ2V2aWV3Jyk7CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K
105
105
  http_version:
106
- recorded_at: Sun, 01 Apr 2018 09:07:41 GMT
106
+ recorded_at: Sat, 05 May 2018 11:18:19 GMT
107
107
  recorded_with: VCR 3.0.3