hackerone-client 0.19.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 52150bc003fc02809d7dc91f18be91ddcda06ad00d5fec58ef467d807ce8ad81
4
- data.tar.gz: b396dfca44f52a8c8e466b17e649a6dad4952aedff03bbf33af16e2b9048f88f
3
+ metadata.gz: 0cd49e52e3d138ef9f7d37a0ce8610298a658e1a78b085a1cd0a7afa36633674
4
+ data.tar.gz: d540fe6b703f57561a203d19d1104fea40e421b64ae2d337807e6a28bd7dc4ca
5
5
  SHA512:
6
- metadata.gz: abfc5c743020345387f5f010e273580c27a7b82235d0ec271c69373da7857256a4e2eea4a1aab9f1ec88232770ef9b082a990a7d782951da490354f7d3d6f171
7
- data.tar.gz: 2f47d7778bd6ae456604bac21c9beef5b5c44686eab65a3e6852ab64462732481519a4591d5369f1c04c175b7c70c589c33ec3e366338119c85d36d42349ec90
6
+ metadata.gz: 46c0e045343a36893ea0cc5565bb8cc58c1a5dd96035816d61fd8ef3947cd9b7d9969f5fcb6ee336d0c462ae94450d2e98f354b2e5491c05f7ff0fc4669d2538
7
+ data.tar.gz: 93e49f0fbec49d1bbd62689d2556632d38659ab97f132a73b75b3c2decb9bac7f4b49c63939ce574dbb3a137452bb000e37dc6c344a05c012ec8dd8412c5c7bc
@@ -1,3 +1,8 @@
1
+ ## [0.20.0] - 2020-10-21
2
+
3
+ [Add ability to lock a report](https://github.com/oreoshake/hackerone-client/pull/59) (@rzhade3)
4
+ [Add ability to list attachments on a report](https://github.com/oreoshake/hackerone-client/pull/58) (@rzhade3)
5
+
1
6
  ## [0.19.0] - 2020-05-08
2
7
 
3
8
  [Add ability to create a report](https://github.com/oreoshake/hackerone-client/pull/57) (@rzhade3)
data/Gemfile CHANGED
@@ -11,7 +11,7 @@ end
11
11
 
12
12
  group :test do
13
13
  gem "rubocop"
14
- gem "rubocop-github"
14
+ gem "rubocop-github", ">= 0.16.0"
15
15
  gem "rubocop-performance"
16
16
  end
17
17
 
@@ -0,0 +1,156 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.hackerone.com/v1/reports/200/state_changes
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"data":{"type":"state-change","attributes":{"state":"resolved","message":""}}}'
9
+ headers:
10
+ Authorization:
11
+ - Basic NOPE=
12
+ User-Agent:
13
+ - Faraday v1.0.1
14
+ Content-Type:
15
+ - application/json
16
+ Accept-Encoding:
17
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
+ Accept:
19
+ - "*/*"
20
+ response:
21
+ status:
22
+ code: 201
23
+ message: Created
24
+ headers:
25
+ Date:
26
+ - Tue, 04 Aug 2020 20:22:57 GMT
27
+ Content-Type:
28
+ - application/json; charset=utf-8
29
+ Transfer-Encoding:
30
+ - chunked
31
+ Connection:
32
+ - keep-alive
33
+ Set-Cookie:
34
+ - __cfduid=d5217b52e915c7a8c7008d9acee5e37701596572577; expires=Thu, 03-Sep-20
35
+ 20:22:57 GMT; path=/; Domain=api.hackerone.com; HttpOnly; SameSite=Lax; Secure
36
+ X-Request-Id:
37
+ - 2667dcb8-451b-4c3c-a3a0-c8a6571cf5ff
38
+ Etag:
39
+ - W/"90fc4eba1716b554d0709bafb6b998ed"
40
+ Cache-Control:
41
+ - max-age=0, private, must-revalidate
42
+ Strict-Transport-Security:
43
+ - max-age=31536000; includeSubDomains; preload
44
+ X-Frame-Options:
45
+ - DENY
46
+ X-Content-Type-Options:
47
+ - nosniff
48
+ X-Xss-Protection:
49
+ - 1; mode=block
50
+ X-Download-Options:
51
+ - noopen
52
+ X-Permitted-Cross-Domain-Policies:
53
+ - none
54
+ Referrer-Policy:
55
+ - strict-origin-when-cross-origin
56
+ Expect-Ct:
57
+ - enforce, max-age=86400
58
+ Content-Security-Policy:
59
+ - 'default-src ''none''; base-uri ''self''; block-all-mixed-content; child-src
60
+ www.youtube-nocookie.com; connect-src ''self'' www.google-analytics.com errors.hackerone.net;
61
+ font-src ''self''; form-action ''self''; frame-ancestors ''none''; img-src
62
+ ''self'' data: cover-photos.hackerone-user-content.com hackathon-photos.hackerone-user-content.com
63
+ profile-photos.hackerone-user-content.com hackerone-us-west-2-production-attachments.s3.us-west-2.amazonaws.com;
64
+ media-src ''self'' hackerone-us-west-2-production-attachments.s3.us-west-2.amazonaws.com;
65
+ script-src ''self'' www.google-analytics.com; style-src ''self'' ''unsafe-inline'';
66
+ report-uri https://errors.hackerone.net/api/30/csp-report/?sentry_key=61c1e2f50d21487c97a071737701f598'
67
+ Cf-Cache-Status:
68
+ - DYNAMIC
69
+ Cf-Request-Id:
70
+ - 045cbd44e40000934c0c8d6200000001
71
+ Server:
72
+ - cloudflare
73
+ Cf-Ray:
74
+ - 5bdafe4e3b7c934c-SJC
75
+ body:
76
+ encoding: ASCII-8BIT
77
+ string: !binary |-
78
+ eyJkYXRhIjp7ImlkIjoiMjAwIiwidHlwZSI6InJlcG9ydCIsImF0dHJpYnV0ZXMiOnsidGl0bGUiOiJ5YSIsInN0YXRlIjoicmVzb2x2ZWQiLCJjcmVhdGVkX2F0IjoiMjAyMC0wOC0wNFQxODozNDo0Mi44OTlaIiwidnVsbmVyYWJpbGl0eV9pbmZvcm1hdGlvbiI6ImFscmlnaHQgYWxyaWdodCBhbHJpZ2h0IGFscmlnaHRcblxuIyMgSW1wYWN0XG5cbmFscmlnaHQgYWxyaWdodCBhbHJpZ2h0IGFscmlnaHQiLCJ0cmlhZ2VkX2F0IjpudWxsLCJjbG9zZWRfYXQiOiIyMDIwLTA4LTA0VDIwOjIyOjU3LjIxN1oiLCJsYXN0X3JlcG9ydGVyX2FjdGl2aXR5X2F0IjoiMjAyMC0wOC0wNFQxODozNDo0My4wNjNaIiwiZmlyc3RfcHJvZ3JhbV9hY3Rpdml0eV9hdCI6IjIwMjAtMDgtMDRUMTg6MzQ6NDMuMDYzWiIsImxhc3RfcHJvZ3JhbV9hY3Rpdml0eV9hdCI6IjIwMjAtMDgtMDRUMjA6MjI6NTcuMjE3WiIsImJvdW50eV9hd2FyZGVkX2F0IjpudWxsLCJzd2FnX2F3YXJkZWRfYXQiOm51bGwsImRpc2Nsb3NlZF9hdCI6bnVsbCwicmVwb3J0ZXJfYWdyZWVkX29uX2dvaW5nX3B1YmxpY19hdCI6bnVsbCwibGFzdF9wdWJsaWNfYWN0aXZpdHlfYXQiOiIyMDIwLTA4LTA0VDIwOjIyOjU3LjIxN1oiLCJsYXN0X2FjdGl2aXR5X2F0IjoiMjAyMC0wOC0wNFQyMDoyMjo1Ny4yMTdaIiwiY3ZlX2lkcyI6W10sInNvdXJjZSI6bnVsbH0sInJlbGF0aW9uc2hpcHMiOnsicmVwb3J0ZXIiOnsiZGF0YSI6eyJpZCI6IjI5MTA3OSIsInR5cGUiOiJ1c2VyIiwiYXR0cmlidXRlcyI6eyJ1c2VybmFtZSI6InJ6aGFkZTMiLCJuYW1lIjoiUmFodWwgWmhhZGUiLCJkaXNhYmxlZCI6ZmFsc2UsImNyZWF0ZWRfYXQiOiIyMDE4LTA2LTEyVDE3OjQzOjQwLjg1MloiLCJwcm9maWxlX3BpY3R1cmUiOnsiNjJ4NjIiOiJodHRwczovL3Byb2ZpbGUtcGhvdG9zLmhhY2tlcm9uZS11c2VyLWNvbnRlbnQuY29tL3ZhcmlhbnRzLzAwMC8yOTEvMDc5L2I3OWMzYzM0MzEzMGJkNjMxMTMxZjY5MGUyZjA0YmMwZDFmZGU4YmZfb3JpZ2luYWwucG5nLzNhZmNiNWM4OTYyNDdlN2VlOGFkYTMxYjFjMWViODY1N2UyMjI0MWY5MTEwOTNhY2ZlNGVjN2U5N2EzYTk1OWEiLCI4Mng4MiI6Imh0dHBzOi8vcHJvZmlsZS1waG90b3MuaGFja2Vyb25lLXVzZXItY29udGVudC5jb20vdmFyaWFudHMvMDAwLzI5MS8wNzkvYjc5YzNjMzQzMTMwYmQ2MzExMzFmNjkwZTJmMDRiYzBkMWZkZThiZl9vcmlnaW5hbC5wbmcvZWIzMTgyM2E0Y2M5ZjZiNmJiNGRiOTMwZmZkZjUxMjUzMzkyOGE2OGE0MjU1ZmI1MGE4MzE4MDI4MWE2MGRhNSIsIjExMHgxMTAiOiJodHRwczovL3Byb2ZpbGUtcGhvdG9zLmhhY2tlcm9uZS11c2VyLWNvbnRlbnQuY29tL3ZhcmlhbnRzLzAwMC8yOTEvMDc5L2I3OWMzYzM0MzEzMGJkNjMxMTMxZjY5MGUyZjA0YmMwZDFmZGU4YmZfb3JpZ2luYWwucG5nLzY5MjIzN2ViOTY5MWZiZGU5MmExNzE3NGNkYjgwOWE3ODhhY2UwMmJjNzdjNzI4MDNmMTdkMzJiNDFlNGYyMTMiLCIyNjB4MjYwIjoiaHR0cHM6Ly9wcm9maWxlLXBob3Rvcy5oYWNrZXJvbmUtdXNlci1jb250ZW50LmNvbS92YXJpYW50cy8wMDAvMjkxLzA3OS9iNzljM2MzNDMxMzBiZDYzMTEzMWY2OTBlMmYwNGJjMGQxZmRlOGJmX29yaWdpbmFsLnBuZy9jZjFlNGI1ZDQ0MDA1Y2I2MWZhYjM1OGRkNjk2ODQxNWYyMDU0NWRlNWYwNTViYTRlZDMzY2E0Mzg3OTQ4Y2RjIn0sImJpbyI6IkFwcGxpY2F0aW9uIFNlY3VyaXR5IEBHaXRIdWIiLCJ3ZWJzaXRlIjoiaHR0cHM6Ly96aGFkZS5kZXYiLCJsb2NhdGlvbiI6IiIsImhhY2tlcm9uZV90cmlhZ2VyIjpmYWxzZX19fSwicHJvZ3JhbSI6eyJkYXRhIjp7ImlkIjoiMTE3NjciLCJ0eXBlIjoicHJvZ3JhbSIsImF0dHJpYnV0ZXMiOnsiaGFuZGxlIjoiZ2l0aHViLXRlc3QiLCJwb2xpY3kiOiIjIEdpdEh1YiBTZWN1cml0eSBCdWcgQm91bnR5XG5cblNvZnR3YXJlIHNlY3VyaXR5IHJlc2VhcmNoZXJzIGFyZSBpbmNyZWFzaW5nbHkgZW5nYWdpbmcgd2l0aCBJbnRlcm5ldCBjb21wYW5pZXMgdG8gaHVudCBkb3duIHZ1bG5lcmFiaWxpdGllcy4gT3VyIGJvdW50eSBwcm9ncmFtIGdpdmVzIGEgdGlwIG9mIHRoZSBoYXQgdG8gdGhlc2UgcmVzZWFyY2hlcnMgYW5kIHByb3ZpZGVzIHJld2FyZHMgb2YgICQzMCwwMDAgb3IgbW9yZSBmb3IgY3JpdGljYWwgdnVsbmVyYWJpbGl0aWVzLlxuXG5cbllvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIGluIG91ciBbcnVsZXNdKGh0dHBzOi8vYm91bnR5LmdpdGh1Yi5jb20vI3J1bGVzKSwgW3Njb3BlXShodHRwczovL2JvdW50eS5naXRodWIuY29tLyNzY29wZSksIFt0YXJnZXRzXShodHRwczovL2JvdW50eS5naXRodWIuY29tLyN0YXJnZXRzKSwgYW5kIFtGQVFdKGh0dHBzOi8vYm91bnR5LmdpdGh1Yi5jb20vI2ZhcXMpIHNlY3Rpb25zLiBZb3UgY2FuIGFsc28gY2hlY2sgdGhlIGN1cnJlbnQgcmFua2luZ3Mgb24gdGhlIFtsZWFkZXJib2FyZF0oaHR0cHM6Ly9ib3VudHkuZ2l0aHViLmNvbS8jbGVhZGVyYm9hcmQpLlxuXG5IYXBweSBoYWNraW5nIVxuXG5cbiMjIFJ1bGVzXG5cbiMjIyBCZWZvcmUgeW91IHN0YXJ0XG5cbiogQ2hlY2sgdGhlIGxpc3Qgb2YgYnVncyB0aGF0IGhhdmUgYmVlbiBbY2xhc3NpZmllZCBhcyBpbmVsaWdpYmxlXShodHRwczovL2JvdW50eS5naXRodWIuY29tL2luZWxpZ2libGUuaHRtbCkuIFN1Ym1pc3Npb25zIHdoaWNoIGFyZSBpbmVsaWdpYmxlIHdpbGwgbGlrZWx5IGJlIGNsb3NlZCBhcyBgTm90IEFwcGxpY2FibGVgLlxuKiBDaGVjayB0aGUgW0dpdEh1YiBDaGFuZ2Vsb2ddKGh0dHBzOi8vZ2l0aHViLmJsb2cvY2hhbmdlbG9nLykgZm9yIHJlY2VudGx5IGxhdW5jaGVkIGZlYXR1cmVzLlxuKiBOZXZlciBhdHRlbXB0IG5vbi10ZWNobmljYWwgYXR0YWNrcyBzdWNoIGFzIHNvY2lhbCBlbmdpbmVlcmluZywgcGhpc2hpbmcsIG9yIHBoeXNpY2FsIGF0dGFja3MgYWdhaW5zdCBvdXIgZW1wbG95ZWVzLCB1c2Vycywgb3IgaW5mcmFzdHJ1Y3R1cmUuXG4qIFdoZW4gaW4gZG91YnQsIGNvbnRhY3QgdXMgYXQgYGJvdW50eUBnaXRodWIuY29tYC5cbiogQnkgcGFydGljaXBhdGluZyBpbiBHaXRIdWIncyBCdWcgQm91bnR5IHByb2dyYW0gKHRoZSBcIlByb2dyYW1cIiksIHlvdSBhY2tub3dsZWRnZSB0aGF0IHlvdSBoYXZlIHJlYWQgYW5kIGFncmVlIHRvIEdpdEh1YidzIFtUZXJtcyBvZiBTZXJ2aWNlXShodHRwczovL2hlbHAuZ2l0aHViLmNvbS9hcnRpY2xlcy9naXRodWItdGVybXMtb2Ytc2VydmljZSkgYXMgd2VsbCBhcyB0aGUgZm9sbG93aW5nOlxuXG4gICogeW91J3JlIG5vdCBwYXJ0aWNpcGF0aW5nIGZyb20gYSBjb3VudHJ5IGFnYWluc3Qgd2hpY2ggdGhlIFVuaXRlZCBTdGF0ZXMgaGFzIGlzc3VlZCBleHBvcnQgc2FuY3Rpb25zIG9yIG90aGVyIHRyYWRlIHJlc3RyaWN0aW9ucywgaW5jbHVkaW5nIEN1YmEsIElyYW4sIE5vcnRoIEtvcmVhLCBTdWRhbiwgYW5kIFN5cmlhLlxuXG4gICogeW91ciBwYXJ0aWNpcGF0aW9uIGluIHRoZSBQcm9ncmFtIHdpbGwgbm90IHZpb2xhdGUgYW55IGxhdyBhcHBsaWNhYmxlIHRvIHlvdSwgb3IgZGlzcnVwdCBvciBjb21wcm9taXNlIGFueSBkYXRhIHRoYXQgaXMgbm90IHlvdXIgb3duLlxuXG4gICogeW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGFueSBhcHBsaWNhYmxlIHRheGVzLCB3aXRoaG9sZGluZyBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciByZWxhdGluZyB0byB5b3VyIHBhcnRpY2lwYXRpb24gaW4gdGhlIFByb2dyYW0sIGluY2x1ZGluZyBmcm9tIGFueSBib3VudHkgcGF5bWVudHMuXG5cbiAgKiBHaXRIdWIgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHRlcm1pbmF0ZSBvciBkaXNjb250aW51ZSB0aGUgUHJvZ3JhbSBhdCBpdHMgZGlzY3JldGlvbi5cblxuICAqIE9ubHkgdGVzdCBmb3IgdnVsbmVyYWJpbGl0aWVzIG9uIHNpdGVzIHlvdSBrbm93IHRvIGJlIG9wZXJhdGVkIGJ5IEdpdEh1YiBhbmQgYXJlIFtpbi1zY29wZV0oaHR0cHM6Ly9ib3VudHkuZ2l0aHViLmNvbSNzY29wZSkuIFNvbWUgc2l0ZXMgaG9zdGVkIG9uIHN1YmRvbWFpbnMgb2YgYEdpdEh1Yi5jb21gIGFyZSBvcGVyYXRlZCBieSB0aGlyZCBwYXJ0aWVzIGFuZCBzaG91bGQgbm90IGJlIHRlc3RlZC5cblxuXG4jIyMgTGVnYWwgc2FmZSBoYXJib3JcblxuWW91ciByZXNlYXJjaCBpcyBjb3ZlcmVkIGJ5IHRoZSBbR2l0SHViIEJ1ZyBCb3VudHkgUHJvZ3JhbSBMZWdhbCBTYWZlIEhhcmJvcl0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvZ2l0aHViLWJ1Zy1ib3VudHktcHJvZ3JhbS1sZWdhbC1zYWZlLWhhcmJvci8pIHBvbGljeS4gSW4gc3VtbWFyeTpcbiogV2UgY29uc2lkZXIgc2VjdXJpdHkgcmVzZWFyY2ggYW5kIHZ1bG5lcmFiaWxpdHkgZGlzY2xvc3VyZSBhY3Rpdml0aWVzIGNvbmR1Y3RlZCBjb25zaXN0ZW50IHdpdGggdGhpcyBwb2xpY3kgYXMg4oCcYXV0aG9yaXplZOKAnSBjb25kdWN0IHVuZGVyIHRoZSBDb21wdXRlciBGcmF1ZCBhbmQgQWJ1c2UgQWN0LCB0aGUgRE1DQSwgYW5kIG90aGVyIGFwcGxpY2FibGUgY29tcHV0ZXIgdXNlIGxhd3Mgc3VjaCBhcyBDYWwuIFBlbmFsIENvZGUgNTAyKGMpLiBXZSB3YWl2ZSBhbnkgcG90ZW50aWFsIERNQ0EgY2xhaW0gYWdhaW5zdCB5b3UgZm9yIGNpcmN1bXZlbnRpbmcgdGhlIHRlY2hub2xvZ2ljYWwgbWVhc3VyZXMgd2UgaGF2ZSB1c2VkIHRvIHByb3RlY3QgdGhlIGFwcGxpY2F0aW9ucyBpbiB0aGlzIGJ1ZyBib3VudHkgcHJvZ3JhbSdzIHNjb3BlLlxuKiBXZSB3YW50IHlvdSB0byByZXNwb25zaWJseSBkaXNjbG9zZSB0aHJvdWdoIG91ciBidWcgYm91bnR5IHByb2dyYW0sIGFuZCBkb24ndCB3YW50IHJlc2VhcmNoZXJzIHB1dCBpbiBmZWFyIG9mIGxlZ2FsIGNvbnNlcXVlbmNlcyBiZWNhdXNlIG9mIHRoZWlyIGdvb2QgZmFpdGggYXR0ZW1wdHMgdG8gY29tcGx5IHdpdGggb3VyIGJ1ZyBib3VudHkgcG9saWN5LiBXZSBjYW5ub3QgYmluZCBhbnkgdGhpcmQgcGFydHksIHNvIGRvIG5vdCBhc3N1bWUgdGhpcyBwcm90ZWN0aW9uIGV4dGVuZHMgdG8gYW55IHRoaXJkIHBhcnR5LiBJZiBpbiBkb3VidCwgYXNrIHVzIGJlZm9yZSBlbmdhZ2luZyBpbiBhbnkgc3BlY2lmaWMgYWN0aW9uIHlvdSB0aGluayBtaWdodCBnbyBvdXRzaWRlIHRoZSBib3VuZHMgb2Ygb3VyIHBvbGljeS5cbiogQmVjYXVzZSBib3RoIGlkZW50aWZ5aW5nIGFuZCBub24taWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gY2FuIHB1dCBhIHJlc2VhcmNoZXIgYXQgcmlzaywgd2UgbGltaXQgd2hhdCB3ZSBzaGFyZSB3aXRoIHRoaXJkIHBhcnRpZXMuIFdlIG1heSBwcm92aWRlIG5vbi1pZGVudGlmeWluZyBzdWJzdGFudGl2ZSBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgcmVwb3J0IHRvIGFuIGFmZmVjdGVkIHRoaXJkIHBhcnR5LCBidXQgb25seSBhZnRlciBub3RpZnlpbmcgeW91IGFuZCByZWNlaXZpbmcgYSBjb21taXRtZW50IHRoYXQgdGhlIHRoaXJkIHBhcnR5IHdpbGwgbm90IHB1cnN1ZSBsZWdhbCBhY3Rpb24gYWdhaW5zdCB5b3UuIFdlIHdpbGwgb25seSBzaGFyZSBpZGVudGlmeWluZyBpbmZvcm1hdGlvbiAobmFtZSwgZW1haWwgYWRkcmVzcywgcGhvbmUgbnVtYmVyLCBldGMuKSB3aXRoIGEgdGhpcmQgcGFydHkgaWYgeW91IGdpdmUgeW91ciB3cml0dGVuIHBlcm1pc3Npb24uXG4qIElmIHlvdXIgc2VjdXJpdHkgcmVzZWFyY2ggYXMgcGFydCBvZiB0aGUgYnVnIGJvdW50eSBwcm9ncmFtIHZpb2xhdGVzIGNlcnRhaW4gcmVzdHJpY3Rpb25zIGluIG91ciBzaXRlIHBvbGljaWVzLCB0aGUgc2FmZSBoYXJib3IgdGVybXMgcGVybWl0IGEgbGltaXRlZCBleGVtcHRpb24uXG5cblxuIyMjIFBlcmZvcm1pbmcgeW91ciByZXNlYXJjaFxuXG4qIERvIG5vdCBpbXBhY3Qgb3RoZXIgdXNlcnMgd2l0aCB5b3VyIHRlc3RpbmcsIHRoaXMgaW5jbHVkZXMgdGVzdGluZyB2dWxuZXJhYmlsaXRpZXMgaW4gcmVwb3NpdG9yaWVzIG9yIG9yZ2FuaXphdGlvbnMgeW91IGRvIG5vdCBvd24uIElmIHlvdSBhcmUgYXR0ZW1wdGluZyB0byBmaW5kIGFuIGF1dGhvcml6YXRpb24gYnlwYXNzLCB5b3UgbXVzdCB1c2UgYWNjb3VudHMgeW91IG93bi5cbiogVGhlIGZvbGxvd2luZyBhcmUgKipuZXZlcioqIGFsbG93ZWQgYW5kIGFyZSBpbmVsaWdpYmxlIGZvciByZXdhcmQuIFdlIG1heSBzdXNwZW5kIHlvdXIgR2l0SHViIGFjY291bnQgYW5kIGJhbiB5b3VyIElQIGFkZHJlc3MgZm9yOlxuXG4gICogUGVyZm9ybWluZyBkaXN0cmlidXRlZCBkZW5pYWwgb2Ygc2VydmljZSAoRERvUykgb3Igb3RoZXIgdm9sdW1ldHJpYyBhdHRhY2tzXG4gICogU3BhbW1pbmcgY29udGVudFxuICAqIExhcmdlLXNjYWxlIHZ1bG5lcmFiaWxpdHkgc2Nhbm5lcnMsIHNjcmFwZXJzLCBvciBhdXRvbWF0ZWQgdG9vbHMgd2hpY2ggcHJvZHVjZSBleGNlc3NpdmUgYW1vdW50cyBvZiB0cmFmZmljLlxuICAgICogTm90ZTogV2UgX2RvXyBhbGxvdyB0aGUgdXNlIG9mIGF1dG9tYXRlZCB0b29scyBzbyBsb25nIGFzIHRoZXkgZG8gbm90IHByb2R1Y2UgZXhjZXNzaXZlIGFtb3VudHMgb2YgdHJhZmZpYy4gRm9yIGV4YW1wbGUsIHJ1bm5pbmcgb25lIGBubWFwYCBzY2FuIGFnYWluc3Qgb25lIGhvc3QgaXMgYWxsb3dlZCwgYnV0IHNlbmRpbmcgNjUsMDAwIHJlcXVlc3RzIGluIHR3byBtaW51dGVzIHVzaW5nIEJ1cnAgU3VpdGUgSW50cnVkZXIgaXMgZXhjZXNzaXZlLlxuKiBSZXNlYXJjaGluZyBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2tzIGlzIGFsbG93ZWQgYW5kIGVsaWdpYmxlIGZvciByZXdhcmRzIG9ubHkgaWYgeW91IGZvbGxvdyB0aGVzZSBydWxlczpcblxuICAqIFJlc2VhcmNoICoqbXVzdCoqIGJlIHBlcmZvcm1lZCBpbiBvcmdhbml6YXRpb25zIG9yIHJlcG9zaXRvcmllcyB5b3Ugb3duXG4gICogU3RvcCAqKmltbWVkaWF0ZWx5KiogaWYgeW91IGJlbGlldmUgeW91IGhhdmUgYWZmZWN0ZWQgdGhlIGF2YWlsYWJpbGl0eSBvZiBvdXIgc2VydmljZXMuIERvbid0IHdvcnJ5IGFib3V0IGRlbW9uc3RyYXRpbmcgdGhlIGZ1bGwgaW1wYWN0IG9mIHlvdXIgdnVsbmVyYWJpbGl0eSwgR2l0SHViJ3Mgc2VjdXJpdHkgdGVhbSB3aWxsIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBpbXBhY3QuXG4gICogVGhlcmUgYXJlIG5vIGxpbWl0cyBmb3IgcmVzZWFyY2hpbmcgZGVuaWFsIG9mIHNlcnZpY2UgdnVsbmVyYWJpbGl0aWVzIGFnYWluc3QgeW91ciBvd24gaW5zdGFuY2Ugb2YgW0dpdEh1YiBFbnRlcnByaXNlIFNlcnZlcl0oaHR0cHM6Ly9ib3VudHkuZ2l0aHViLmNvbS90YXJnZXRzL2dpdGh1Yi1lbnRlcnByaXNlLXNlcnZlci5odG1sKVxuXG5cbiMjIyBIYW5kbGluZyBwZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiAoUElJKVxuXG4qIFBlcnNvbmFsbHkgaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gKFBJSSkgaW5jbHVkZXM6XG4gICogbGVnYWwgYW5kL29yIGZ1bGwgbmFtZXNcbiAgKiBuYW1lcyBvciB1c2VybmFtZXMgY29tYmluZWQgd2l0aCBvdGhlciBpZGVudGlmaWVycyBsaWtlIHBob25lIG51bWJlcnMgb3IgZW1haWwgYWRkcmVzc2VzXG4gICogaGVhbHRoIG9yIGZpbmFuY2lhbCBpbmZvcm1hdGlvbiAoaW5jbHVkaW5nIGluc3VyYW5jZSBpbmZvcm1hdGlvbiwgc29jaWFsIHNlY3VyaXR5IG51bWJlcnMsIGV0Yy4pXG4gICogaW5mb3JtYXRpb24gYWJvdXQgcG9saXRpY2FsIG9yIHJlbGlnaW91cyBhZmZpbGlhdGlvbnNcbiAgKiBpbmZvcm1hdGlvbiBhYm91dCByYWNlLCBldGhuaWNpdHksIHNleHVhbCBvcmllbnRhdGlvbiwgZ2VuZGVyLCBvciBvdGhlciBpZGVudGlmeWluZyBpbmZvcm1hdGlvbiB0aGF0IGNvdWxkIGJlIHVzZWQgZm9yIGRpc2NyaW1pbmF0b3J5IHB1cnBvc2VzXG4qIERvIG5vdCBpbnRlbnRpb25hbGx5IGFjY2VzcyBvdGhlcnMnIFBJSS4gSWYgeW91IHN1c3BlY3QgYSBzZXJ2aWNlIHByb3ZpZGVzIGFjY2VzcyB0byBQSUksIGxpbWl0IHF1ZXJpZXMgdG8geW91ciBvd24gcGVyc29uYWwgaW5mb3JtYXRpb24uXG4qIFJlcG9ydCB0aGUgdnVsbmVyYWJpbGl0eSAqaW1tZWRpYXRlbHkqIGFuZCBkbyBub3QgYXR0ZW1wdCB0byBhY2Nlc3MgYW55IG90aGVyIGRhdGEuIFRoZSBHaXRIdWIgU2VjdXJpdHkgdGVhbSB3aWxsIGFzc2VzcyB0aGUgc2NvcGUgYW5kIGltcGFjdCBvZiB0aGUgUElJIGV4cG9zdXJlLlxuKiBMaW1pdCB0aGUgYW1vdW50IG9mIGRhdGEgcmV0dXJuZWQgZnJvbSBzZXJ2aWNlcy4gRm9yIFNRTCBpbmplY3Rpb24sIGZvciBleGFtcGxlLCBsaW1pdCB0aGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWRcbiogWW91IG11c3QgZGVsZXRlIGFsbCB5b3VyIGxvY2FsLCBzdG9yZWQsIG9yIGNhY2hlZCBjb3BpZXMgb2YgZGF0YSBjb250YWluaW5nIFBJSSBhcyBzb29uIGFzIHBvc3NpYmxlLiBXZSBtYXkgYXNrIHlvdSB0byBzaWduIGEgY2VydGlmaWNhdGUgb2YgZGVsZXRpb24gYW5kIGNvbmZpZGVudGlhbGl0eSBhZ3JlZW1lbnQgcmVnYXJkaW5nIHRoZSBleGFjdCBpbmZvcm1hdGlvbiB5b3UgYWNjZXNzZWQuIFRoaXMgYWdyZWVtZW50IHdpbGwgbm90IGFmZmVjdCB5b3VyIGJvdW50eSByZXdhcmQuXG4qIFdlIG1heSBhc2sgeW91IGZvciB0aGUgdXNlcm5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgeW91ciB0ZXN0aW5nIHRvIGFzc2VzcyB0aGUgaW1wYWN0IG9mIHRoZSB2dWxuZXJhYmlsaXR5XG5cblxuIyMjIFJlcG9ydGluZyB5b3VyIHZ1bG5lcmFiaWxpdHlcblxuKiBTdWJtaXNzaW9ucyBtdXN0IGluY2x1ZGUgd3JpdHRlbiBpbnN0cnVjdGlvbnMgZm9yIHJlcHJvZHVjaW5nIHRoZSB2dWxuZXJhYmlsaXR5LiBTdWJtaXNzaW9ucyB3aXRob3V0IGNsZWFyIHJlcHJvZHVjdGlvbiBzdGVwcyBvciB3aGljaCBvbmx5IGluY2x1ZGUgcmVwcm9kdWN0aW9uIHN0ZXBzIGluIHZpZGVvIGZvcm0gbWF5IGJlIGluZWxpZ2libGUgZm9yIGEgcmV3YXJkLlxuKiBXaGVuIHJlcG9ydGluZyB2dWxuZXJhYmlsaXRpZXMgeW91IG11c3Qga2VlcCBhbGwgaW5mb3JtYXRpb24gb24gSGFja2VyT25lLiBEbyBub3QgcG9zdCBpbmZvcm1hdGlvbiB0byB2aWRlby1zaGFyaW5nIG9yIHBhc3RlYmluIHNpdGVzLiBWaWRlb3MgYW5kIGltYWdlcyBjYW4gYmUgdXBsb2FkZWQgZGlyZWN0bHkgdmlhIEhhY2tlck9uZS5cbiogRm9yIHZ1bG5lcmFiaWxpdGllcyBpbnZvbHZpbmcgcGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHBsZWFzZSBleHBsYWluIHRoZSBraW5kIG9mIFBJSSB5b3UgYmVsaWV2ZSBpcyBleHBvc2VkIGFuZCBsaW1pdCB0aGUgYW1vdW50IG9mIFBJSSBkYXRhIGluY2x1ZGVkIGluIHlvdXIgc3VibWlzc2lvbnMuIEZvciB0ZXh0dWFsIGluZm9ybWF0aW9uIGFuZCBzY3JlZW5zaG90cywgcGxlYXNlIG9ubHkgaW5jbHVkZSByZWRhY3RlZCBkYXRhIGluIHlvdXIgc3VibWlzc2lvbi5cbiogRG8gbm90IHB1YmxpY2x5IGRpc2Nsb3NlIHlvdXIgc3VibWlzc2lvbiB1bnRpbCBHaXRIdWIgaGFzIGV2YWx1YXRlZCB0aGUgaW1wYWN0LlxuXG5cbiMjIyBSZWNlaXZpbmcgeW91ciBhd2FyZFxuXG4qIEFsbCByZXdhcmQgYW1vdW50cyBhcmUgZGV0ZXJtaW5lZCBieSBvdXIgW3NldmVyaXR5IGd1aWRlbGluZXNdKGh0dHBzOi8vYm91bnR5LmdpdGh1Yi5jb20vI3NldmVyaXR5LWd1aWRlbGluZXMpLlxuKiBXaGVuIGR1cGxpY2F0ZXMgb2NjdXIsIHdlIG9ubHkgYXdhcmQgdGhlIGZpcnN0IHJlcG9ydCB0aGF0IHdhcyByZWNlaXZlZCAocHJvdmlkZWQgdGhhdCBpdCBjYW4gYmUgZnVsbHkgcmVwcm9kdWNlZCkuXG4qIFlvdSBhcmUgZnJlZSB0byBwdWJsaXNoIHdyaXRlLXVwcyBhYm91dCB5b3VyIHZ1bG5lcmFiaWxpdHkgYW5kIEdpdEh1YiB3aWxsIG5vdCBsaW1pdCB3aGF0IHlvdSB3cml0ZS4gV2UgbWF5IHBheSBvdXQgeW91ciByZXdhcmQgYmVmb3JlIHRoZSB2dWxuZXJhYmlsaXR5IGlzIHBhdGNoZWQgc28gd2UgbWF5IGFzayB0aGF0IHlvdSBkZWxheSBwdWJsaXNoaW5nIHRvIGtlZXAgb3RoZXIgR2l0SHViIHVzZXJzIHNhZmUuXG4qIE1lZGl1bSwgaGlnaCwgYW5kIGNyaXRpY2FsIHNldmVyaXR5IGlzc3VlcyB3aWxsIGJlIHdyaXR0ZW4gdXAgb24gdGhlIEdpdEh1YiBCdWcgQm91bnR5IHNpdGUgYW5kIGluY2x1ZGVkIGluIG91ciBsZWFkZXJib2FyZC4gV2UgZG9uJ3QgY3VycmVudGx5IHBvc3Qgd3JpdGUtdXBzIGZvciBsb3cgc2V2ZXJpdHkgdnVsbmVyYWJpbGl0aWVzLlxuKiBHaXRIdWIgaXMgYSBDVkUgTnVtYmVyaW5nIEF1dGhvcml0eSAoQ05BKSBmb3IgR2l0SHViIEVudGVycHJpc2UgU2VydmVyLiBFbGlnaWJsZSBCdWcgQm91bnR5IHN1Ym1pc3Npb25zIHRoYXQgYWZmZWN0IEdpdEh1YiBFbnRlcnByaXNlIFNlcnZlciBtYXkgYmUgYXNzaWduZWQgQ1ZFcy4gVGhlc2UgQ1ZFcyB3aWxsIGJlIHNoYXJlZCB3aXRoIHN1Ym1pdHRlcnMgdmlhIEhhY2tlck9uZSwgaW5jbHVkZWQgaW4gW2JvdW50eSB3cml0ZS11cHNdKGh0dHBzOi8vYm91bnR5LmdpdGh1Yi5jb20vYm91bnR5LWh1bnRlcnMuaHRtbCkgYW5kIGxpc3RlZCBpbiB0aGUgR2l0SHViIEVudGVycHJpc2UgU2VydmVyIFtyZWxlYXNlIG5vdGVzXShodHRwczovL2VudGVycHJpc2UuZ2l0aHViLmNvbS9yZWxlYXNlcykuXG4qIFlvdSBtYXkgcHJlZmVyIHRoZSByZXdhcmQgZ28gdG93YXJkIGhlbHBpbmcgb3RoZXJzLiBJZiB5b3UgY2hvb3NlIHRvIGRvIHNvLCBHaXRIdWIgd2lsbCBkb25hdGUgeW91ciByZXdhcmQgdG8gYW4gZXN0YWJsaXNoZWQgNTAxKGMpKDMpIGNoYXJpdGFibGUgb3JnYW5pemF0aW9uIG9mIHlvdXIgY2hvaWNlLiBHaXRIdWIgd2lsbCBhbHNvIG1hdGNoIHlvdXIgZG9uYXRpb24gLSBzdWJqZWN0IHRvIG91ciBkaXNjcmV0aW9uLiBBbnkgcmV3YXJkcyB0aGF0IGdvIHVuY2xhaW1lZCBhZnRlciAxMiBtb250aHMgd2lsbCBiZSBkb25hdGVkIHRvIGEgY2hhcml0eSBvZiBHaXRIdWIncyBjaG9vc2luZy5cblxuXG4jIyBTY29wZVxuXG5HaXRIdWIgcnVucyBhIG51bWJlciBvZiBzZXJ2aWNlcyBidXQgb25seSBzdWJtaXNzaW9ucyB1bmRlciB0aGUgZm9sbG93aW5nIGRvbWFpbnMgYXJlIGVsaWdpYmxlIGZvciByZXdhcmRzLiBBbnkgR2l0SHViLW93bmVkIGRvbWFpbnMgbm90IGxpc3RlZCBiZWxvdyBhcmUgKm5vdCogaW4tc2NvcGUsICpub3QqIGVsaWdpYmxlIGZvciByZXdhcmRzIGFuZCAqbm90KiBjb3ZlcmVkIGJ5IG91ciBbbGVnYWwgc2FmZSBoYXJib3JdKGh0dHBzOi8vYm91bnR5LmdpdGh1Yi5jb20jbGVnYWxfc2FmZV9oYXJib3IpLlxuXG5cbiMjIyBnaXRodWIuY29tXG5cbk91ciBtYWluIGRvbWFpbiBob3N0aW5nIHVzZXItZmFjaW5nIEdpdEh1YiBzZXJ2aWNlcy4uIEFsbCBzdWJkb21haW5zIHVuZGVyIGBnaXRodWIuY29tYCBhcmUgaW4tc2NvcGUgKmV4Y2VwdCo6XG4qIGBibG9nLmdpdGh1Yi5jb21gXG4qIGBjb21tdW5pdHkuZ2l0aHViLmNvbWBcbiogYGVtYWlsLmVudGVycHJpc2UuZ2l0aHViLmNvbWBcbiogYGVtYWlsLmZpbmFuY2UuZ2l0aHViLmNvbWBcbiogYGVtYWlsLnN0YWdpbmcuZmluYW5jZS5naXRodWIuY29tYFxuKiBgZW1haWwuc3VwcG9ydC5naXRodWIuY29tYFxuKiBgZW1haWwudmVyaWZ5LmdpdGh1Yi5jb21gXG4qIGBnb29nbGU3NjUwZGNmNjE0NmYwNGQ4LmdpdGh1Yi5jb21gXG4qIGBrMS5fZG9tYWlua2V5LmdpdGh1Yi5jb21gXG4qIGBrMS5fZG9tYWlua2V5Lm1jbWFpbC5naXRodWIuY29tYFxuKiBgbWNtYWlsLmdpdGh1Yi5jb21gXG4qIGByZXNvdXJjZXMuZ2l0aHViLmNvbWBcbiogYCoucmVzb3VyY2VzLmdpdGh1Yi5jb21gXG4qIGBzZ21haWwuZ2l0aHViLmNvbWBcbiogYCouc2dtYWlsLmdpdGh1Yi5jb21gXG4qIGBzaG9wLmdpdGh1Yi5jb21gXG4qIGBzbXRwLmdpdGh1Yi5jb21gXG4qIGAqLnNtdHAuZ2l0aHViLmNvbWBcbiogYHN1cHBvcnQuZ2l0aHViLmNvbWBcblxuIyMjIGdpdGh1YmFzc2V0cy5jb21cblxuT3VyIGRvbWFpbiBmb3IgaG9zdGluZyBzdGF0aWMgYXNzZXRzLi4gQWxsIHN1YmRvbWFpbnMgdW5kZXIgYGdpdGh1YmFzc2V0cy5jb21gIGFyZSBpbi1zY29wZVxuXG4jIyMgZ2l0aHVidXNlcmNvbnRlbnQuY29tXG5cbk91ciBkb21haW4gZm9yIGhvc3RpbmcgYW5kIHJlbmRlcmluZyB1c2VycycgZGF0YS4uIEFsbCBzdWJkb21haW5zIHVuZGVyIGBnaXRodWJ1c2VyY29udGVudC5jb21gIGFyZSBpbi1zY29wZVxuXG4jIyMgZ2l0aHViYXBwLmNvbVxuXG5PdXIgZG9tYWluIGZvciBob3N0aW5nIGVtcGxveWVlLWZhY2luZyBzZXJ2aWNlcy4uIEFsbCBzdWJkb21haW5zIHVuZGVyIGBnaXRodWJhcHAuY29tYCBhcmUgaW4tc2NvcGUgKmV4Y2VwdCo6XG4qIGBhdG9tLWlvLmdpdGh1YmFwcC5jb21gXG4qIGBhdG9tLWlvLXN0YWdpbmcuZ2l0aHViYXBwLmNvbWBcbiogYGVtYWlsLmVudGVycHJpc2Utc3RhZ2luZy5naXRodWJhcHAuY29tYFxuKiBgZW1haWwuaGF5c3RhY2suZ2l0aHViYXBwLmNvbWBcbiogYHJlcGx5LmdpdGh1YmFwcC5jb21gXG5cbiMjIyBnaXRodWIubmV0XG5cbk91ciBkb21haW4gZm9yIGhvc3RpbmcgR2l0SHViJ3MgaW50ZXJuYWwgcHJvZHVjdGlvbiBzZXJ2aWNlcy4gTWFueSBvZiB0aGVzZSBzZXJ2aWNlcyBhcmUgbm90IGFjY2Vzc2libGUgZnJvbSBvdXRzaWRlIG91ciBpbnRlcm5hbCBuZXR3b3JrLi4gQWxsIHN1YmRvbWFpbnMgdW5kZXIgYGdpdGh1Yi5uZXRgIGFyZSBpbi1zY29wZVxuXG4jIyMgc2VtbWxlLmNvbVxuXG5PdXIgbWFpbiBkb21haW4gZm9yIFNlbW1sZSBhbmQgTEdUTSBzZXJ2aWNlcy4gQWxsIHN1YmRvbWFpbnMgdW5kZXIgYHNlbW1sZS5jb21gIGFyZSBpbi1zY29wZSAqZXhjZXB0KjpcbiogYGRldi5zZW1tbGUuY29tYFxuKiBgZ2l0LnNlbW1sZS5jb21gXG4qIGBqaXJhLnNlbW1sZS5jb21gXG4qIGB3aWtpLnNlbW1sZS5jb21gXG5cbiMjIyBzZW1tbGUubmV0XG5cbk91ciBkb21haW4gZm9yIG5vbi1wcm9kdWN0aW9uIFNlbW1sZSBzZXJ2aWNlcy4gQWxsIHN1YmRvbWFpbnMgdW5kZXIgYHNlbW1sZS5uZXRgIGFyZSBpbi1zY29wZVxuXG4jIyMgZG93bmxvYWRzLmxndG0uY29tXG5cbk91ciBkb21haW4gZm9yIHNlcnZpbmcgTEdUTSBkb3dubG9hZHMuLiBBbGwgc3ViZG9tYWlucyB1bmRlciBgZG93bmxvYWRzLmxndG0uY29tYCBhcmUgaW4tc2NvcGVcblxuIyMjIGxndG0tY29tLnBlbnRlc3Rpbmcuc2VtbWxlLm5ldFxuXG5BbiBpbnN0YW5jZSBvZiBbTEdUTV0oaHR0cHM6Ly9ib3VudHkuZ2l0aHViLmNvbS90YXJnZXRzL2xndG0uaHRtbCkgZXNwZWNpYWxseSBmb3IgQnVnIEJvdW50eSByZXNlYXJjaC4uIEFsbCBzdWJkb21haW5zIHVuZGVyIGBsZ3RtLWNvbS5wZW50ZXN0aW5nLnNlbW1sZS5uZXRgIGFyZSBpbi1zY29wZVxuXG4jIyMgYmFja2VuZC1kb3QtbGd0bS1wZW5ldHJhdGlvbi10ZXN0aW5nLmFwcHNwb3QuY29tXG5cbkFuIGluc3RhbmNlIG9mIFtMR1RNXShodHRwczovL2JvdW50eS5naXRodWIuY29tL3RhcmdldHMvbGd0bS5odG1sKSdzIGJhY2tlbmQgdXNlZCBmb3IgdHJpZ2dlcmluZyBhdXRvbWF0ZWQgdGFza3MuLiBBbGwgc3ViZG9tYWlucyB1bmRlciBgYmFja2VuZC1kb3QtbGd0bS1wZW5ldHJhdGlvbi10ZXN0aW5nLmFwcHNwb3QuY29tYCBhcmUgaW4tc2NvcGVcblxuIyMgU2V2ZXJpdHkgR3VpZGVsaW5lc1xuXG5BbGwgYm91bnR5IHN1Ym1pc3Npb25zIGFyZSByYXRlZCBieSBHaXRIdWIgdXNpbmcgYSBwdXJwb3NlZnVsbHkgc2ltcGxlIHNjYWxlLiBFYWNoIHZ1bG5lcmFiaWxpdHkgaXMgdW5pcXVlIGJ1dCB0aGUgZm9sbG93aW5nIGlzIGEgcm91Z2ggZ3VpZGVsaW5lIHdlIHVzZSBpbnRlcm5hbGx5IGZvciByYXRpbmcgYW5kIHJld2FyZGluZyBzdWJtaXNzaW9uczpcblxuXG4jIyMgQ3JpdGljYWw6ICQyMCwwMDAgLSAkMzAsMDAwXG5cbkNyaXRpY2FsIHNldmVyaXR5IGlzc3VlcyBwcmVzZW50IGEgZGlyZWN0IGFuZCBpbW1lZGlhdGUgcmlzayB0byBhIGJyb2FkIGFycmF5IG9mIG91ciB1c2VycyBvciB0byBHaXRIdWIgaXRzZWxmLiBUaGV5IG9mdGVuIGFmZmVjdCByZWxhdGl2ZWx5IGxvdy1sZXZlbC9mb3VuZGF0aW9uYWwgY29tcG9uZW50cyBpbiBvbmUgb2Ygb3VyIGFwcGxpY2F0aW9uIHN0YWNrcyBvciBpbmZyYXN0cnVjdHVyZS4gRm9yIGV4YW1wbGU6XG4qIGFyYml0cmFyeSBjb2RlL2NvbW1hbmQgZXhlY3V0aW9uIG9uIGEgR2l0SHViIHNlcnZlciBpbiBvdXIgcHJvZHVjdGlvbiBuZXR3b3JrLlxuKiBhcmJpdHJhcnkgU1FMIHF1ZXJpZXMgb24gdGhlIEdpdEh1YiBwcm9kdWN0aW9uIGRhdGFiYXNlLlxuKiBieXBhc3NpbmcgdGhlIEdpdEh1YiBsb2dpbiBwcm9jZXNzLCBlaXRoZXIgcGFzc3dvcmQgb3IgMkZBLlxuKiBhY2Nlc3MgdG8gc2Vuc2l0aXZlIHByb2R1Y3Rpb24gdXNlciBkYXRhIG9yIGFjY2VzcyB0byBpbnRlcm5hbCBwcm9kdWN0aW9uIHN5c3RlbXMuXG4qIGFjY2Vzc2luZyBhbm90aGVyIHVzZXIncyBkYXRhIGluIHRoZSBHaXRIdWIgQWN0aW9ucyBzZXJ2aWNlLlxuXG5UaGUgdXBwZXIgYm91bmQgZm9yIGNyaXRpY2FsIHZ1bG5lcmFiaWxpdGllcywgJDMwLDAwMCwgaXMgb25seSBhIGd1aWRlbGluZSBhbmQgR2l0SHViIG1heSByZXdhcmQgaGlnaGVyIGFtb3VudHMgZm9yIGV4Y2VwdGlvbmFsIHJlcG9ydHMuXG5cblxuIyMjIEhpZ2g6ICQxMCwwMDAgLSAkMjAsMDAwXG5cbkhpZ2ggc2V2ZXJpdHkgaXNzdWVzIGFsbG93IGFuIGF0dGFja2VyIHRvIHJlYWQgb3IgbW9kaWZ5IGhpZ2hseSBzZW5zaXRpdmUgZGF0YSB0aGF0IHRoZXkgYXJlIG5vdCBhdXRob3JpemVkIHRvIGFjY2Vzcy4gVGhleSBhcmUgZ2VuZXJhbGx5IG1vcmUgbmFycm93IGluIHNjb3BlIHRoYW4gY3JpdGljYWwgaXNzdWVzLCB0aG91Z2ggdGhleSBtYXkgc3RpbGwgZ3JhbnQgYW4gYXR0YWNrZXIgZXh0ZW5zaXZlIGFjY2Vzcy4gRm9yIGV4YW1wbGU6XG4qIGluamVjdGluZyBhdHRhY2tlciBjb250cm9sbGVkIGNvbnRlbnQgaW50byBHaXRIdWIuY29tIChYU1MpIHdoaWNoIGJ5cGFzc2VzIENTUC5cbiogYnlwYXNzaW5nIGF1dGhvcml6YXRpb24gbG9naWMgdG8gZ3JhbnQgYSByZXBvc2l0b3J5IGNvbGxhYm9yYXRvciBtb3JlIGFjY2VzcyB0aGFuIGludGVuZGVkLlxuKiBkaXNjb3ZlcmluZyBzZW5zaXRpdmUgdXNlciBvciBHaXRIdWIgZGF0YSBpbiBhIHB1YmxpY2x5IGV4cG9zZWQgcmVzb3VyY2UsIHN1Y2ggYXMgYW4gUzMgYnVja2V0LlxuKiBnYWluaW5nIGFjY2VzcyB0byBhIG5vbi1jcml0aWNhbCByZXNvdXJjZSB0aGF0IG9ubHkgR2l0SHViIGVtcGxveWVlcyBzaG91bGQgYmUgYWJsZSB0byByZWFjaC5cbiogdXNpbmcgdGhlIEdpdEh1YiBBY3Rpb25zIHJlcG8tc2NvcGVkIEdpdEh1YiB0b2tlbiB0byBhY2Nlc3MgaGlnaC1yaXNrIHByaXZhdGUgY29udGVudCBvdXRzaWRlIG9mIHRoYXQgcmVwb3NpdG9yeS5cbiogY29kZSBleGVjdXRpb24gaW4gYSBkZXNrdG9wIGFwcCB0aGF0IHJlcXVpcmVzIG5vIHVzZXIgaW50ZXJhY3Rpb24uXG5cblxuIyMjIE1lZGl1bTogJDQsMDAwIC0gJDEwLDAwMFxuXG5NZWRpdW0gc2V2ZXJpdHkgaXNzdWVzIGFsbG93IGFuIGF0dGFja2VyIHRvIHJlYWQgb3IgbW9kaWZ5IGxpbWl0ZWQgYW1vdW50cyBvZiBkYXRhIHRoYXQgdGhleSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gYWNjZXNzLiBUaGV5IGdlbmVyYWxseSBncmFudCBhY2Nlc3MgdG8gbGVzcyBzZW5zaXRpdmUgaW5mb3JtYXRpb24gdGhhbiBoaWdoIHNldmVyaXR5IGlzc3Vlcy4gRm9yIGV4YW1wbGU6XG4qIGRpc2Nsb3NpbmcgdGhlIHRpdGxlIG9mIGlzc3VlcyBpbiBwcml2YXRlIHJlcG9zaXRvcmllcyB3aGljaCBzaG91bGQgYmUgYmUgaW5hY2Nlc3NpYmxlLlxuKiBpbmplY3RpbmcgYXR0YWNrZXIgY29udHJvbGxlZCBjb250ZW50IGludG8gR2l0SHViLmNvbSAoWFNTKSBidXQgbm90IGJ5cGFzc2luZyBDU1Agb3IgZXhlY3V0aW5nIHNlbnNpdGl2ZSBhY3Rpb25zIHdpdGggYW5vdGhlciB1c2VyJ3Mgc2Vzc2lvbi5cbiogYnlwYXNzaW5nIENTUkYgdmFsaWRhdGlvbiBmb3IgbG93IHJpc2sgYWN0aW9ucywgc3VjaCBhcyBzdGFycmluZyBhIHJlcG9zaXRvcnkgb3IgdW5zdWJzY3JpYmluZyBmcm9tIGEgbWFpbGluZyBsaXN0LlxuKiBlc2NhcGluZyB0aGUgTEdUTSB3b3JrZXIgc2FuZGJveCB0byBhY2Nlc3Mgb3RoZXIgdXNlcidzIGRhdGEgb3IgcHJpdmF0ZSBuZXR3b3JrZWQgcmVzb3VyY2VzXG5cblxuIyMjIExvdzogJDYxNyAtICQyLDAwMFxuXG5Mb3cgc2V2ZXJpdHkgaXNzdWVzIGFsbG93IGFuIGF0dGFja2VyIHRvIGFjY2VzcyBleHRyZW1lbHkgbGltaXRlZCBhbW91bnRzIG9mIGRhdGEuIFRoZXkgbWF5IHZpb2xhdGUgYW4gZXhwZWN0YXRpb24gZm9yIGhvdyBzb21ldGhpbmcgaXMgaW50ZW5kZWQgdG8gd29yaywgYnV0IGl0IGFsbG93cyBuZWFybHkgbm8gZXNjYWxhdGlvbiBvZiBwcml2aWxlZ2Ugb3IgYWJpbGl0eSB0byB0cmlnZ2VyIHVuaW50ZW5kZWQgYmVoYXZpb3IgYnkgYW4gYXR0YWNrZXIuIEZvciBleGFtcGxlOlxuKiBzaWduaW5nIHVwIGFyYml0cmFyeSB1c2VycyBmb3IgYWNjZXNzIHRvIGFuIFwiZWFybHkgYWNjZXNzIGZlYXR1cmVcIiB3aXRob3V0IHRoZWlyIGNvbnNlbnQuXG4qIGNyZWF0aW5nIGFuIGlzc3VlIGNvbW1lbnQgdGhhdCBieXBhc3NlcyBvdXIgaW1hZ2UgcHJveHlpbmcgZmlsdGVyIGJ5IHByb3ZpZGluZyBhIG1hbGZvcm1lZCBVUkwuXG4qIGJ5cGFzc2luZyBjb21tdW5pdHktYW5kLXNhZmV0eSBmZWF0dXJlcyBzdWNoIGFzIGxvY2tlZCBjb252ZXJzYXRpb25zLlxuKiBieXBhc3NpbmcgYmlsbGluZyBcdTAwMjYgcGxhbiByZXN0cmljdGlvbnMgdG8gZ2FpbiBhY2Nlc3MgdG8gcGFpZCBmZWF0dXJlcy5cbiogdHJpZ2dlcmluZyB2ZXJib3NlIG9yIGRlYnVnIGVycm9yIHBhZ2VzIHdpdGhvdXQgcHJvb2Ygb2YgZXhwbG9pdGFiaWxpdHkgb3Igb2J0YWluaW5nIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi5cbiogdHJpZ2dlcmluZyBhcHBsaWNhdGlvbiBleGNlcHRpb25zIHRoYXQgY291bGQgYWZmZWN0IG1hbnkgR2l0SHViIHVzZXJzLlxuKiB0cmlnZ2VyaW5nIFhTUyBvciBDU1JGIHZ1bG5lcmFiaWxpdGllcyBpbiBMR1RNXG5cbiIsImNyZWF0ZWRfYXQiOiIyMDE2LTA0LTE1VDE3OjEwOjMxLjI2MVoiLCJ1cGRhdGVkX2F0IjoiMjAyMC0wNC0wOFQxMzo0NTo0OS41NDhaIn19fSwic2V2ZXJpdHkiOnsiZGF0YSI6eyJpZCI6IjgwOTQxMiIsInR5cGUiOiJzZXZlcml0eSIsImF0dHJpYnV0ZXMiOnsicmF0aW5nIjoiaGlnaCIsImF1dGhvcl90eXBlIjoiVXNlciIsInVzZXJfaWQiOjI5MTA3OSwiY3JlYXRlZF9hdCI6IjIwMjAtMDgtMDRUMTg6MzQ6NDIuOTcwWiJ9fX0sInN3YWciOnsiZGF0YSI6W119LCJhdHRhY2htZW50cyI6eyJkYXRhIjpbeyJpZCI6IjkzNjQyNCIsInR5cGUiOiJhdHRhY2htZW50IiwiYXR0cmlidXRlcyI6eyJleHBpcmluZ191cmwiOiJodHRwczovL2hhY2tlcm9uZS11cy13ZXN0LTItcHJvZHVjdGlvbi1hdHRhY2htZW50cy5zMy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbS9qTE05M0JmTDRDQkRHZnZ3dEVEVnhZM2I/cmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj1hdHRhY2htZW50JTNCJTIwZmlsZW5hbWUlM0QlMjIyMTgyX0Z0WDhWZEZxLmpwZyUyMiUzQiUyMGZpbGVuYW1lJTJBJTNEVVRGLTglMjclMjcyMTgyX0Z0WDhWZEZxLmpwZ1x1MDAyNnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRmpwZWdcdTAwMjZYLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1Nlx1MDAyNlgtQW16LUNyZWRlbnRpYWw9QVNJQVFHSzZGVVJRMkFFSVZEMkolMkYyMDIwMDgwNCUyRnVzLXdlc3QtMiUyRnMzJTJGYXdzNF9yZXF1ZXN0XHUwMDI2WC1BbXotRGF0ZT0yMDIwMDgwNFQyMDIyNTdaXHUwMDI2WC1BbXotRXhwaXJlcz0zNjAwXHUwMDI2WC1BbXotU2lnbmVkSGVhZGVycz1ob3N0XHUwMDI2WC1BbXotU2VjdXJpdHktVG9rZW49SVFvSmIzSnBaMmx1WDJWakVPUCUyRiUyRiUyRiUyRiUyRiUyRiUyRiUyRiUyRiUyRndFYUNYVnpMWGRsYzNRdE1pSkdNRVFDSUNNbElMSXkzVVhUczg2U2VrSU9lSDFRTlcwZnAweU00JTJCNVNVM0VSd3Z4RUFpQWxMOG1SdkZwdFg3Mkc3RVpIaWxiOTZTNHhtaVUzN0xiWElocHVQbkZPRXlxOUF3aXMlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkY4QkVBRWFEREF4TXpZeE9USTNORGcwT1NJTUgzUnpVMFpaVUklMkI5eHhjV0twRURBdEZUJTJGd0hRR1llY3ZoVjdvSlMxaDROQkd2QVNnclY5V1FzSWZEeXdzNjklMkIzSEtpSXE4JTJGQmV4dWI3cms5cSUyRjdxJTJCdXA2UE9iaUcwVFRMSXBoeTVvWmNERmslMkI0QnQwWUl1M09oZyUyRkZxQURidlpIdjMxSFRzRm1JU2FQUiUyQnpEYjJLZGR0d0RKMzNhaDcxQzJ0WjNCdkh3R3ZGSnB1Y0paVWRpcmNVRVlNM3VWUDZabnNDSXMzMkNFcElqYU1USkhSRXVUNk8zYk9YalclMkJUdmhLR0tvRnJaYWtnNGZhaWpseG9pWnI0TktJakZzUEp0UERTRTFYYjRrZnFzZUlUb0wyWWpROTNJUiUyRldhSlRudnphMDV2dEg0TGpGMnRQc3lXeE9Pam1iTm9qV2d5TDh4RVRXVVd4cGhFQVElMkZ5dWxnWlIlMkJmYjRrSGJBRjlUank3a3BJdURxb0x5NjROYkdzRjhjWDJ6VCUyQlNhcUlhYW0yTWRKejBIOTd2MjJuWUUyeG82dGJpZWRVVEp6NTdIMDN2NkZpcW5WcGdrN2N6ZEtDMmpqcmJURkk4MHo4Z2F0T2VSZ2k1bFNDUG1GRXZ4ekNyTFdMRiUyQnY4QjBCN2F2MGVtQ2c5aGNkVjAyRGR5TjlRSVByb2kxcEs2akw1MThRZVglMkJXaklWNHVtQ281UnFEaUNoSlM1NDdyeDhmd25kTTIySmxBQm1MeFhrd3V1T20lMkJRVTY3QUdlbjVuYkxmcUFWdWNtbHhmV3p4QThTOSUyRkdnMjRLWk9ZTlI1ZSUyQlpFb3lHNHNhUDMyZ2E0VzFYMHdycGFaT3V5JTJGN1lMZXFEalNNMjE0SzhVUXJ2RmQwSyUyRkdvZFVZcGVrUWt2dVo4Sk5rWk5xd1hOenpzN1B1NUcxZmdVdTJoQTZ3QXZNYkk3VEVzWmF4cGhXNXV0NEY1WVZLdkc4JTJCVFNKY0UlMkZWVUl3UGhLZmFsUjBzekdIRGtIaEg5ajRSRjJXRFMyRmUxZzh2QVc5bHJDQ3JDT2dYYTRlVXA2ZzJLQmNnWEJ5c010MW84Um5KR0JVSjklMkJDejZwQ2xSQ3VnRHBqQkVSVXVTd3RobENqeUZpYjZsVEphQ2Zmb0tHeiUyRlMwUGdueW9GaDRYRms4MSUyQjA2NXNyUE9majhwclZuM2clM0QlM0RcdTAwMjZYLUFtei1TaWduYXR1cmU9YTZhYmQwZGM4OTc3MTlkYTFiY2JhMDFjOWExOWMxM2VjYWJjMDI3YmYzNGE4ZjZkZjA5ZDQ2ZGE3MTAwMWNjNCIsImNyZWF0ZWRfYXQiOiIyMDIwLTA4LTA0VDE4OjM0OjA5LjQ0NloiLCJmaWxlX25hbWUiOiIyMTgyX0Z0WDhWZEZxLmpwZyIsImNvbnRlbnRfdHlwZSI6ImltYWdlL2pwZWciLCJmaWxlX3NpemUiOjY1MzY5NX19LHsiaWQiOiI5MzY0MjUiLCJ0eXBlIjoiYXR0YWNobWVudCIsImF0dHJpYnV0ZXMiOnsiZXhwaXJpbmdfdXJsIjoiaHR0cHM6Ly9oYWNrZXJvbmUtdXMtd2VzdC0yLXByb2R1Y3Rpb24tYXR0YWNobWVudHMuczMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20vTndoSFpYU2dSbm9xaWJoQlhOejlIeG1OP3Jlc3BvbnNlLWNvbnRlbnQtZGlzcG9zaXRpb249YXR0YWNobWVudCUzQiUyMGZpbGVuYW1lJTNEJTIyc3dhZ2dlcl9wYXJzZS5weSUyMiUzQiUyMGZpbGVuYW1lJTJBJTNEVVRGLTglMjclMjdzd2FnZ2VyX3BhcnNlLnB5XHUwMDI2cmVzcG9uc2UtY29udGVudC10eXBlPXRleHQlMkZ4LXB5dGhvbi1zY3JpcHRcdTAwMjZYLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1Nlx1MDAyNlgtQW16LUNyZWRlbnRpYWw9QVNJQVFHSzZGVVJRMkFFSVZEMkolMkYyMDIwMDgwNCUyRnVzLXdlc3QtMiUyRnMzJTJGYXdzNF9yZXF1ZXN0XHUwMDI2WC1BbXotRGF0ZT0yMDIwMDgwNFQyMDIyNTdaXHUwMDI2WC1BbXotRXhwaXJlcz0zNjAwXHUwMDI2WC1BbXotU2lnbmVkSGVhZGVycz1ob3N0XHUwMDI2WC1BbXotU2VjdXJpdHktVG9rZW49SVFvSmIzSnBaMmx1WDJWakVPUCUyRiUyRiUyRiUyRiUyRiUyRiUyRiUyRiUyRiUyRndFYUNYVnpMWGRsYzNRdE1pSkdNRVFDSUNNbElMSXkzVVhUczg2U2VrSU9lSDFRTlcwZnAweU00JTJCNVNVM0VSd3Z4RUFpQWxMOG1SdkZwdFg3Mkc3RVpIaWxiOTZTNHhtaVUzN0xiWElocHVQbkZPRXlxOUF3aXMlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkY4QkVBRWFEREF4TXpZeE9USTNORGcwT1NJTUgzUnpVMFpaVUklMkI5eHhjV0twRURBdEZUJTJGd0hRR1llY3ZoVjdvSlMxaDROQkd2QVNnclY5V1FzSWZEeXdzNjklMkIzSEtpSXE4JTJGQmV4dWI3cms5cSUyRjdxJTJCdXA2UE9iaUcwVFRMSXBoeTVvWmNERmslMkI0QnQwWUl1M09oZyUyRkZxQURidlpIdjMxSFRzRm1JU2FQUiUyQnpEYjJLZGR0d0RKMzNhaDcxQzJ0WjNCdkh3R3ZGSnB1Y0paVWRpcmNVRVlNM3VWUDZabnNDSXMzMkNFcElqYU1USkhSRXVUNk8zYk9YalclMkJUdmhLR0tvRnJaYWtnNGZhaWpseG9pWnI0TktJakZzUEp0UERTRTFYYjRrZnFzZUlUb0wyWWpROTNJUiUyRldhSlRudnphMDV2dEg0TGpGMnRQc3lXeE9Pam1iTm9qV2d5TDh4RVRXVVd4cGhFQVElMkZ5dWxnWlIlMkJmYjRrSGJBRjlUank3a3BJdURxb0x5NjROYkdzRjhjWDJ6VCUyQlNhcUlhYW0yTWRKejBIOTd2MjJuWUUyeG82dGJpZWRVVEp6NTdIMDN2NkZpcW5WcGdrN2N6ZEtDMmpqcmJURkk4MHo4Z2F0T2VSZ2k1bFNDUG1GRXZ4ekNyTFdMRiUyQnY4QjBCN2F2MGVtQ2c5aGNkVjAyRGR5TjlRSVByb2kxcEs2akw1MThRZVglMkJXaklWNHVtQ281UnFEaUNoSlM1NDdyeDhmd25kTTIySmxBQm1MeFhrd3V1T20lMkJRVTY3QUdlbjVuYkxmcUFWdWNtbHhmV3p4QThTOSUyRkdnMjRLWk9ZTlI1ZSUyQlpFb3lHNHNhUDMyZ2E0VzFYMHdycGFaT3V5JTJGN1lMZXFEalNNMjE0SzhVUXJ2RmQwSyUyRkdvZFVZcGVrUWt2dVo4Sk5rWk5xd1hOenpzN1B1NUcxZmdVdTJoQTZ3QXZNYkk3VEVzWmF4cGhXNXV0NEY1WVZLdkc4JTJCVFNKY0UlMkZWVUl3UGhLZmFsUjBzekdIRGtIaEg5ajRSRjJXRFMyRmUxZzh2QVc5bHJDQ3JDT2dYYTRlVXA2ZzJLQmNnWEJ5c010MW84Um5KR0JVSjklMkJDejZwQ2xSQ3VnRHBqQkVSVXVTd3RobENqeUZpYjZsVEphQ2Zmb0tHeiUyRlMwUGdueW9GaDRYRms4MSUyQjA2NXNyUE9majhwclZuM2clM0QlM0RcdTAwMjZYLUFtei1TaWduYXR1cmU9OTk5NTBkMTQwMmVlZWU3ZDJkZjEwYzY4ZmNkNGQ4ZjRmODQ3MzI4ODViNWRiMmMyNDE3ODQyZWIyNjZkMGExOSIsImNyZWF0ZWRfYXQiOiIyMDIwLTA4LTA0VDE4OjM0OjI4Ljk3MFoiLCJmaWxlX25hbWUiOiJzd2FnZ2VyX3BhcnNlLnB5IiwiY29udGVudF90eXBlIjoidGV4dC94LXB5dGhvbi1zY3JpcHQiLCJmaWxlX3NpemUiOjQ4Mn19XX0sIndlYWtuZXNzIjp7ImRhdGEiOnsiaWQiOiIzMSIsInR5cGUiOiJ3ZWFrbmVzcyIsImF0dHJpYnV0ZXMiOnsibmFtZSI6IkJydXRlIEZvcmNlIiwiZGVzY3JpcHRpb24iOiJUaGUgc29mdHdhcmUgZG9lcyBub3QgaW1wbGVtZW50IHN1ZmZpY2llbnQgbWVhc3VyZXMgdG8gcHJldmVudCBtdWx0aXBsZSBmYWlsZWQgYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgd2l0aGluIGluIGEgc2hvcnQgdGltZSBmcmFtZSwgbWFraW5nIGl0IG1vcmUgc3VzY2VwdGlibGUgdG8gYnJ1dGUgZm9yY2UgYXR0YWNrcy4iLCJleHRlcm5hbF9pZCI6ImN3ZS0zMDciLCJjcmVhdGVkX2F0IjoiMjAxNy0wMS0wNVQwMTo1MToxOS4wMDBaIn19fSwic3RydWN0dXJlZF9zY29wZSI6eyJkYXRhIjp7ImlkIjoiMTU0NTUiLCJ0eXBlIjoic3RydWN0dXJlZC1zY29wZSIsImF0dHJpYnV0ZXMiOnsiYXNzZXRfdHlwZSI6IlVSTCIsImFzc2V0X2lkZW50aWZpZXIiOiJyZW5kZXIuZ2l0aHViLmNvbSIsImVsaWdpYmxlX2Zvcl9ib3VudHkiOnRydWUsImVsaWdpYmxlX2Zvcl9zdWJtaXNzaW9uIjp0cnVlLCJpbnN0cnVjdGlvbiI6IiIsIm1heF9zZXZlcml0eSI6ImNyaXRpY2FsIiwiY3JlYXRlZF9hdCI6IjIwMTgtMTAtMTBUMDA6NDA6NTEuNDc5WiIsInVwZGF0ZWRfYXQiOiIyMDE4LTEwLTEwVDAwOjQwOjUxLjQ3OVoiLCJyZWZlcmVuY2UiOiIiLCJjb25maWRlbnRpYWxpdHlfcmVxdWlyZW1lbnQiOiJtZWRpdW0iLCJpbnRlZ3JpdHlfcmVxdWlyZW1lbnQiOiJtZWRpdW0iLCJhdmFpbGFiaWxpdHlfcmVxdWlyZW1lbnQiOiJsb3cifX19LCJhY3Rpdml0aWVzIjp7ImRhdGEiOlt7InR5cGUiOiJhY3Rpdml0eS1idWctcmVzb2x2ZWQiLCJpZCI6Ijg4NDgyMzEiLCJhdHRyaWJ1dGVzIjp7Im1lc3NhZ2UiOiIiLCJjcmVhdGVkX2F0IjoiMjAyMC0wOC0wNFQyMDoyMjo1Ny4yMTdaIiwidXBkYXRlZF9hdCI6IjIwMjAtMDgtMDRUMjA6MjI6NTcuMjE3WiIsImludGVybmFsIjpmYWxzZX0sInJlbGF0aW9uc2hpcHMiOnsiYWN0b3IiOnsiZGF0YSI6eyJpZCI6IjEyNzM5MDMiLCJ0eXBlIjoidXNlciIsImF0dHJpYnV0ZXMiOnsidXNlcm5hbWUiOiJyemhhZGUzLXRlc3RlciIsIm5hbWUiOm51bGwsImRpc2FibGVkIjpmYWxzZSwiY3JlYXRlZF9hdCI6IjIwMjAtMDgtMDRUMDY6MjY6NDIuNDkxWiIsInByb2ZpbGVfcGljdHVyZSI6eyI2Mng2MiI6Ii9hc3NldHMvYXZhdGFycy9kZWZhdWx0LTcxYTMwMmQ3MDY0NTdmM2QzYTMxZWIzMGZhM2U3M2U2Y2YwYjFkNjc3YjhmYTIxOGVhZWFmZmQ2N2FlOTc5MTgucG5nIiwiODJ4ODIiOiIvYXNzZXRzL2F2YXRhcnMvZGVmYXVsdC03MWEzMDJkNzA2NDU3ZjNkM2EzMWViMzBmYTNlNzNlNmNmMGIxZDY3N2I4ZmEyMThlYWVhZmZkNjdhZTk3OTE4LnBuZyIsIjExMHgxMTAiOiIvYXNzZXRzL2F2YXRhcnMvZGVmYXVsdC03MWEzMDJkNzA2NDU3ZjNkM2EzMWViMzBmYTNlNzNlNmNmMGIxZDY3N2I4ZmEyMThlYWVhZmZkNjdhZTk3OTE4LnBuZyIsIjI2MHgyNjAiOiIvYXNzZXRzL2F2YXRhcnMvZGVmYXVsdC03MWEzMDJkNzA2NDU3ZjNkM2EzMWViMzBmYTNlNzNlNmNmMGIxZDY3N2I4ZmEyMThlYWVhZmZkNjdhZTk3OTE4LnBuZyJ9LCJzaWduYWwiOm51bGwsImltcGFjdCI6bnVsbCwicmVwdXRhdGlvbiI6bnVsbCwiYmlvIjpudWxsLCJ3ZWJzaXRlIjpudWxsLCJsb2NhdGlvbiI6bnVsbCwiaGFja2Vyb25lX3RyaWFnZXIiOmZhbHNlfX19fX1dfSwiYm91bnRpZXMiOnsiZGF0YSI6W119LCJzdW1tYXJpZXMiOnsiZGF0YSI6W119LCJjdXN0b21fZmllbGRfdmFsdWVzIjp7ImRhdGEiOltdfX19fQ==
79
+ recorded_at: Tue, 04 Aug 2020 20:22:57 GMT
80
+ - request:
81
+ method: put
82
+ uri: https://api.hackerone.com/v1/reports/200/close_comments
83
+ body:
84
+ encoding: UTF-8
85
+ string: '{"data":{"type":"activity-comments-closed"}}'
86
+ headers:
87
+ Authorization:
88
+ - Basic NOPE=
89
+ User-Agent:
90
+ - Faraday v1.0.1
91
+ Content-Type:
92
+ - application/json
93
+ Accept-Encoding:
94
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
95
+ Accept:
96
+ - "*/*"
97
+ response:
98
+ status:
99
+ code: 200
100
+ message: OK
101
+ headers:
102
+ Date:
103
+ - Tue, 04 Aug 2020 20:22:58 GMT
104
+ Content-Type:
105
+ - application/json; charset=utf-8
106
+ Transfer-Encoding:
107
+ - chunked
108
+ Connection:
109
+ - keep-alive
110
+ Set-Cookie:
111
+ - __cfduid=d2984afa39f16a0fa59898d5a119139eb1596572577; expires=Thu, 03-Sep-20
112
+ 20:22:57 GMT; path=/; Domain=api.hackerone.com; HttpOnly; SameSite=Lax; Secure
113
+ X-Request-Id:
114
+ - cfc4b577-2ac0-4466-9018-821da6d76939
115
+ Etag:
116
+ - W/"f008fe54d1f034fdb39ac356b76f029e"
117
+ Cache-Control:
118
+ - max-age=0, private, must-revalidate
119
+ Strict-Transport-Security:
120
+ - max-age=31536000; includeSubDomains; preload
121
+ X-Frame-Options:
122
+ - DENY
123
+ X-Content-Type-Options:
124
+ - nosniff
125
+ X-Xss-Protection:
126
+ - 1; mode=block
127
+ X-Download-Options:
128
+ - noopen
129
+ X-Permitted-Cross-Domain-Policies:
130
+ - none
131
+ Referrer-Policy:
132
+ - strict-origin-when-cross-origin
133
+ Expect-Ct:
134
+ - enforce, max-age=86400
135
+ Content-Security-Policy:
136
+ - 'default-src ''none''; base-uri ''self''; block-all-mixed-content; child-src
137
+ www.youtube-nocookie.com; connect-src ''self'' www.google-analytics.com errors.hackerone.net;
138
+ font-src ''self''; form-action ''self''; frame-ancestors ''none''; img-src
139
+ ''self'' data: cover-photos.hackerone-user-content.com hackathon-photos.hackerone-user-content.com
140
+ profile-photos.hackerone-user-content.com hackerone-us-west-2-production-attachments.s3.us-west-2.amazonaws.com;
141
+ media-src ''self'' hackerone-us-west-2-production-attachments.s3.us-west-2.amazonaws.com;
142
+ script-src ''self'' www.google-analytics.com; style-src ''self'' ''unsafe-inline'';
143
+ report-uri https://errors.hackerone.net/api/30/csp-report/?sentry_key=61c1e2f50d21487c97a071737701f598'
144
+ Cf-Cache-Status:
145
+ - DYNAMIC
146
+ Cf-Request-Id:
147
+ - 045cbd479000000293bd38e200000001
148
+ Server:
149
+ - cloudflare
150
+ Cf-Ray:
151
+ - 5bdafe528d570293-SJC
152
+ body:
153
+ encoding: ASCII-8BIT
154
+ string: '{"data":{"type":"activity-comments-closed","id":"8848232","attributes":{"message":"","created_at":"2020-08-04T20:22:57.889Z","updated_at":"2020-08-04T20:22:57.889Z","internal":false},"relationships":{"actor":{"data":{"id":"1273903","type":"user","attributes":{"username":"rzhade3-tester","name":null,"disabled":false,"created_at":"2020-08-04T06:26:42.491Z","profile_picture":{"62x62":"/assets/avatars/default-71a302d706457f3d3a31eb30fa3e73e6cf0b1d677b8fa218eaeaffd67ae97918.png","82x82":"/assets/avatars/default-71a302d706457f3d3a31eb30fa3e73e6cf0b1d677b8fa218eaeaffd67ae97918.png","110x110":"/assets/avatars/default-71a302d706457f3d3a31eb30fa3e73e6cf0b1d677b8fa218eaeaffd67ae97918.png","260x260":"/assets/avatars/default-71a302d706457f3d3a31eb30fa3e73e6cf0b1d677b8fa218eaeaffd67ae97918.png"},"signal":null,"impact":null,"reputation":null,"bio":null,"website":null,"location":null,"hackerone_triager":false}}}}}}'
155
+ recorded_at: Tue, 04 Aug 2020 20:22:58 GMT
156
+ recorded_with: VCR 6.0.0
@@ -191,7 +191,28 @@ http_interactions:
191
191
  },
192
192
  "attachments": {
193
193
  "data": [
194
-
194
+ {
195
+ "id": "936424",
196
+ "type": "attachment",
197
+ "attributes": {
198
+ "expiring_url": "https://redacted.aws.s3.link",
199
+ "created_at": "2020-08-04T18:34:09.446Z",
200
+ "file_name": "2182_FtX8VdFq.jpg",
201
+ "content_type": "image/jpeg",
202
+ "file_size": 653695
203
+ }
204
+ },
205
+ {
206
+ "id": "936425",
207
+ "type": "attachment",
208
+ "attributes": {
209
+ "expiring_url": "https://redacted.aws.s3.link",
210
+ "created_at": "2020-08-04T18:34:28.970Z",
211
+ "file_name": "swagger_parse.py",
212
+ "content_type": "text/x-python-script",
213
+ "file_size": 482
214
+ }
215
+ }
195
216
  ]
196
217
  },
197
218
  "vulnerability_types": {
@@ -14,8 +14,10 @@ require_relative "client/group"
14
14
  require_relative "client/structured_scope"
15
15
  require_relative "client/swag"
16
16
  require_relative "client/address"
17
+ require_relative "client/attachment"
17
18
  require_relative "client/bounty"
18
19
  require_relative "client/incremental/activities"
20
+ require "active_support/core_ext/hash"
19
21
 
20
22
  module HackerOne
21
23
  module Client
@@ -112,7 +114,7 @@ module HackerOne
112
114
  # severity_rating: severity of report, must be one of https://api.hackerone.com/reference/#severity-ratings
113
115
  # source: where the report came from, i.e. API, Bugcrowd, etc.
114
116
  #
115
- # returns an Hackerone::Client::Report object or raises an error if
117
+ # returns an HackerOne::Client::Report object or raises an error if
116
118
  # error during creation
117
119
  def create_report(title:, summary:, impact:, severity_rating:, source:)
118
120
  raise ArgumentError, "Program cannot be nil" unless program
@@ -15,6 +15,12 @@ module HackerOne
15
15
  attributes.internal
16
16
  end
17
17
 
18
+ def attachments
19
+ @attachments ||= activity.relationships.fetch(:attachments, {})
20
+ .fetch(:data, [])
21
+ .map { |attachment| HackerOne::Client::Attachment.new(attachment) }
22
+ end
23
+
18
24
  private
19
25
 
20
26
  def relationships
@@ -85,6 +91,9 @@ module HackerOne
85
91
  delegate :message, :bounty_amount, :bonus_amount, to: :attributes
86
92
  end
87
93
 
94
+ class ReportLocked < Activity
95
+ end
96
+
88
97
  ACTIVITY_TYPE_CLASS_MAPPING = {
89
98
  "activity-bounty-awarded" => BountyAwarded,
90
99
  "activity-swag-awarded" => SwagAwarded,
@@ -93,7 +102,8 @@ module HackerOne
93
102
  "activity-bug-triaged" => BugTriaged,
94
103
  "activity-reference-id-added" => ReferenceIdAdded,
95
104
  "activity-comment" => CommentAdded,
96
- "activity-bounty-suggested" => BountySuggested
105
+ "activity-bounty-suggested" => BountySuggested,
106
+ "activity-comments-closed" => ReportLocked
97
107
  }.freeze
98
108
 
99
109
  def self.build(activity_data)
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HackerOne
4
+ module Client
5
+ class Attachment
6
+ delegate :expiring_url, :file_name, :content_type, :created_at, \
7
+ :file_size, to: :attributes
8
+
9
+ def initialize(attachment)
10
+ @attachment = attachment
11
+ end
12
+
13
+ def id
14
+ @attachment[:id]
15
+ end
16
+
17
+ private
18
+
19
+ def attributes
20
+ OpenStruct.new(@attachment[:attributes])
21
+ end
22
+ end
23
+ end
24
+ end
@@ -26,6 +26,14 @@ module HackerOne
26
26
  duplicate
27
27
  ).map(&:to_sym).freeze
28
28
 
29
+ RESOLVED_STATES = %w(
30
+ resolved
31
+ not-applicable
32
+ informative
33
+ duplicate
34
+ spam
35
+ ).map(&:to_sym).freeze
36
+
29
37
  SEVERITY_RATINGS = %w(
30
38
  none
31
39
  low
@@ -135,6 +143,12 @@ module HackerOne
135
143
  classification_label.split("-").first
136
144
  end
137
145
 
146
+ def attachments
147
+ @attachments ||= relationships.fetch(:attachments, {})
148
+ .fetch(:data, [])
149
+ .map { |attachment| HackerOne::Client::Attachment.new(attachment) }
150
+ end
151
+
138
152
  def activities
139
153
  if ships = relationships.fetch(:activities, {}).fetch(:data, [])
140
154
  ships.map do |activity_data|
@@ -292,6 +306,19 @@ module HackerOne
292
306
  HackerOne::Client::Activities.build(response_json)
293
307
  end
294
308
 
309
+ def lock!
310
+ unless RESOLVED_STATES.include? self.state.to_sym
311
+ raise ArgumentError, "Report must be closed before locking"
312
+ end
313
+
314
+ body = {
315
+ type: "activity-comments-closed"
316
+ }
317
+
318
+ response_json = make_put_request("reports/#{id}/close_comments", request_body: body)
319
+ HackerOne::Client::Activities.build(response_json)
320
+ end
321
+
295
322
  def assign_to_user(name)
296
323
  member = program.find_member(name)
297
324
  _assign_to(member.user.id, :user)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Hackerone
4
4
  module Client
5
- VERSION = "0.19.0"
5
+ VERSION = "0.20.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hackerone-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Neil Matatall
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-08 00:00:00.000000000 Z
11
+ date: 2021-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -146,6 +146,7 @@ files:
146
146
  - fixtures/vcr_cassettes/create_report_invalid.yml
147
147
  - fixtures/vcr_cassettes/dup.yml
148
148
  - fixtures/vcr_cassettes/empty_report_list.yml
149
+ - fixtures/vcr_cassettes/lock_report.yml
149
150
  - fixtures/vcr_cassettes/missing_report.yml
150
151
  - fixtures/vcr_cassettes/programs.yml
151
152
  - fixtures/vcr_cassettes/report.yml
@@ -168,6 +169,7 @@ files:
168
169
  - lib/hackerone/client.rb
169
170
  - lib/hackerone/client/activity.rb
170
171
  - lib/hackerone/client/address.rb
172
+ - lib/hackerone/client/attachment.rb
171
173
  - lib/hackerone/client/bounty.rb
172
174
  - lib/hackerone/client/group.rb
173
175
  - lib/hackerone/client/incremental/activities.rb