aws-sdk-iotwireless 1.28.0 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ed2eb3d0c66694b79b5cdb4385ca3902f6c5632d868c122c2dc90b00a89f8531
4
- data.tar.gz: '0815007f9ef9aee4e6e9d55b3b522cb8bae9487bfad1d8d4d72354ada4c4e2c4'
3
+ metadata.gz: 3d9a3099381e5e0df41a43711fb5563375ce43c2410deeb62cde2f2d58a2224b
4
+ data.tar.gz: f5676df5cc1a4ac3642840a18ceabb015ac182be5c5f1e239005c87cddca57ab
5
5
  SHA512:
6
- metadata.gz: 482f8a0eab10bbc67403c9ab7f3bc11eaefb2a4a2fe366a3eaa2a084eea0d22cc044ca7c2990c47f360246e5c89060183d212fcd25c7cbacec5c46be65c674d4
7
- data.tar.gz: 0f8a8878f0b871b1482d2dd2a66645112298bf2916a2ce3be7cf58419c630ff09bca889477ba7234644caad3fb004b90a817c5724f6cfa6e456a7a966f48bafe
6
+ metadata.gz: 443f50e83defec76ebf872cc7980907ccc326f11aa2f31bdf4d7cec57dc2efe3c5dc24d34e5227470f02888d058e5feaedbad3d0a1b02518cf087ef59327dace
7
+ data.tar.gz: dfcb37b0b3daa471d792bbd22853458a3e5f4c796740f2e4323e0244e0db4105bfd2b62b4ed00eb4bf0f3606b0ae082d04816aff1ff74f479803a28859d87bc3
data/CHANGELOG.md CHANGED
@@ -1,6 +1,18 @@
1
1
  Unreleased Changes
2
2
  ------------------
3
3
 
4
+ 1.30.0 (2023-02-23)
5
+ ------------------
6
+
7
+ * Feature - In this release, we add additional capabilities for the FUOTA which allows user to configure the fragment size, the sending interval and the redundancy ratio of the FUOTA tasks
8
+
9
+ 1.29.0 (2023-01-18)
10
+ ------------------
11
+
12
+ * Feature - Code Generated Changes, see `./build_tools` or `aws-sdk-core`'s CHANGELOG.md for details.
13
+
14
+ * Issue - Replace runtime endpoint resolution approach with generated ruby code.
15
+
4
16
  1.28.0 (2022-11-28)
5
17
  ------------------
6
18
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.28.0
1
+ 1.30.0
@@ -758,6 +758,23 @@ module Aws::IoTWireless
758
758
  # The tag to attach to the specified resource. Tags are metadata that
759
759
  # you can use to manage a resource.
760
760
  #
761
+ # @option params [Integer] :redundancy_percent
762
+ # The percentage of added redundant fragments. For example, if firmware
763
+ # file is 100 bytes and fragment size is 10 bytes, with
764
+ # `RedundancyPercent` set to 50(%), the final number of encoded
765
+ # fragments is (100 / 10) + (100 / 10 * 50%) = 15.
766
+ #
767
+ # @option params [Integer] :fragment_size_bytes
768
+ # The size of each fragment in bytes. Currently only supported in fuota
769
+ # tasks with multicast groups.
770
+ #
771
+ # @option params [Integer] :fragment_interval_ms
772
+ # The interval of sending fragments in milliseconds. Currently the
773
+ # interval will be rounded to the nearest second. Note that this
774
+ # interval only controls the timing when the cloud sends the fragments
775
+ # down. The actual delay of receiving fragments at device side depends
776
+ # on the device's class and the communication delay with the cloud.
777
+ #
761
778
  # @return [Types::CreateFuotaTaskResponse] Returns a {Seahorse::Client::Response response} object which responds to the following methods:
762
779
  #
763
780
  # * {Types::CreateFuotaTaskResponse#arn #arn} => String
@@ -780,6 +797,9 @@ module Aws::IoTWireless
780
797
  # value: "TagValue", # required
781
798
  # },
782
799
  # ],
800
+ # redundancy_percent: 1,
801
+ # fragment_size_bytes: 1,
802
+ # fragment_interval_ms: 1,
783
803
  # })
784
804
  #
785
805
  # @example Response structure
@@ -1794,6 +1814,9 @@ module Aws::IoTWireless
1794
1814
  # * {Types::GetFuotaTaskResponse#firmware_update_image #firmware_update_image} => String
1795
1815
  # * {Types::GetFuotaTaskResponse#firmware_update_role #firmware_update_role} => String
1796
1816
  # * {Types::GetFuotaTaskResponse#created_at #created_at} => Time
1817
+ # * {Types::GetFuotaTaskResponse#redundancy_percent #redundancy_percent} => Integer
1818
+ # * {Types::GetFuotaTaskResponse#fragment_size_bytes #fragment_size_bytes} => Integer
1819
+ # * {Types::GetFuotaTaskResponse#fragment_interval_ms #fragment_interval_ms} => Integer
1797
1820
  #
1798
1821
  # @example Request syntax with placeholder values
1799
1822
  #
@@ -1813,6 +1836,9 @@ module Aws::IoTWireless
1813
1836
  # resp.firmware_update_image #=> String
1814
1837
  # resp.firmware_update_role #=> String
1815
1838
  # resp.created_at #=> Time
1839
+ # resp.redundancy_percent #=> Integer
1840
+ # resp.fragment_size_bytes #=> Integer
1841
+ # resp.fragment_interval_ms #=> Integer
1816
1842
  #
1817
1843
  # @overload get_fuota_task(params = {})
1818
1844
  # @param [Hash] params ({})
@@ -2118,7 +2144,7 @@ module Aws::IoTWireless
2118
2144
  #
2119
2145
  # @option params [Time,DateTime,Date,Integer,String] :timestamp
2120
2146
  # Optional information that specifies the time when the position
2121
- # information will be resolved. It uses the UNIX timestamp format. If
2147
+ # information will be resolved. It uses the Unix timestamp format. If
2122
2148
  # not specified, the time at which the request was received will be
2123
2149
  # used.
2124
2150
  #
@@ -2367,7 +2393,7 @@ module Aws::IoTWireless
2367
2393
  end
2368
2394
 
2369
2395
  # Get the position information for a given wireless device or a wireless
2370
- # gateway resource. The postion information uses the [ World Geodetic
2396
+ # gateway resource. The position information uses the [ World Geodetic
2371
2397
  # System (WGS84)][1].
2372
2398
  #
2373
2399
  #
@@ -2376,8 +2402,8 @@ module Aws::IoTWireless
2376
2402
  #
2377
2403
  # @option params [required, String] :resource_identifier
2378
2404
  # The identifier of the resource for which position information is
2379
- # retrieved. It can be the wireless device ID or the wireless gateway ID
2380
- # depending on the resource type.
2405
+ # retrieved. It can be the wireless device ID or the wireless gateway
2406
+ # ID, depending on the resource type.
2381
2407
  #
2382
2408
  # @option params [required, String] :resource_type
2383
2409
  # The type of resource for which position information is retrieved,
@@ -4062,6 +4088,23 @@ module Aws::IoTWireless
4062
4088
  # @option params [String] :firmware_update_role
4063
4089
  # The firmware update role that is to be used with a FUOTA task.
4064
4090
  #
4091
+ # @option params [Integer] :redundancy_percent
4092
+ # The percentage of added redundant fragments. For example, if firmware
4093
+ # file is 100 bytes and fragment size is 10 bytes, with
4094
+ # `RedundancyPercent` set to 50(%), the final number of encoded
4095
+ # fragments is (100 / 10) + (100 / 10 * 50%) = 15.
4096
+ #
4097
+ # @option params [Integer] :fragment_size_bytes
4098
+ # The size of each fragment in bytes. Currently only supported in fuota
4099
+ # tasks with multicast groups.
4100
+ #
4101
+ # @option params [Integer] :fragment_interval_ms
4102
+ # The interval of sending fragments in milliseconds. Currently the
4103
+ # interval will be rounded to the nearest second. Note that this
4104
+ # interval only controls the timing when the cloud sends the fragments
4105
+ # down. The actual delay of receiving fragments at device side depends
4106
+ # on the device's class and the communication delay with the cloud.
4107
+ #
4065
4108
  # @return [Struct] Returns an empty {Seahorse::Client::Response response}.
4066
4109
  #
4067
4110
  # @example Request syntax with placeholder values
@@ -4075,6 +4118,9 @@ module Aws::IoTWireless
4075
4118
  # },
4076
4119
  # firmware_update_image: "FirmwareUpdateImage",
4077
4120
  # firmware_update_role: "FirmwareUpdateRole",
4121
+ # redundancy_percent: 1,
4122
+ # fragment_size_bytes: 1,
4123
+ # fragment_interval_ms: 1,
4078
4124
  # })
4079
4125
  #
4080
4126
  # @overload update_fuota_task(params = {})
@@ -4371,7 +4417,7 @@ module Aws::IoTWireless
4371
4417
  end
4372
4418
 
4373
4419
  # Update the position information of a given wireless device or a
4374
- # wireless gateway resource. The postion coordinates are based on the [
4420
+ # wireless gateway resource. The position coordinates are based on the [
4375
4421
  # World Geodetic System (WGS84)][1].
4376
4422
  #
4377
4423
  #
@@ -4380,7 +4426,7 @@ module Aws::IoTWireless
4380
4426
  #
4381
4427
  # @option params [required, String] :resource_identifier
4382
4428
  # The identifier of the resource for which position information is
4383
- # updated. It can be the wireless device ID or the wireless gateway ID
4429
+ # updated. It can be the wireless device ID or the wireless gateway ID,
4384
4430
  # depending on the resource type.
4385
4431
  #
4386
4432
  # @option params [required, String] :resource_type
@@ -4530,7 +4576,7 @@ module Aws::IoTWireless
4530
4576
  params: params,
4531
4577
  config: config)
4532
4578
  context[:gem_name] = 'aws-sdk-iotwireless'
4533
- context[:gem_version] = '1.28.0'
4579
+ context[:gem_version] = '1.30.0'
4534
4580
  Seahorse::Client::Request.new(handlers, context)
4535
4581
  end
4536
4582
 
@@ -189,6 +189,8 @@ module Aws::IoTWireless
189
189
  Fingerprint = Shapes::StringShape.new(name: 'Fingerprint')
190
190
  FirmwareUpdateImage = Shapes::StringShape.new(name: 'FirmwareUpdateImage')
191
191
  FirmwareUpdateRole = Shapes::StringShape.new(name: 'FirmwareUpdateRole')
192
+ FragmentIntervalMS = Shapes::IntegerShape.new(name: 'FragmentIntervalMS')
193
+ FragmentSizeBytes = Shapes::IntegerShape.new(name: 'FragmentSizeBytes')
192
194
  FuotaDeviceStatus = Shapes::StringShape.new(name: 'FuotaDeviceStatus')
193
195
  FuotaTask = Shapes::StructureShape.new(name: 'FuotaTask')
194
196
  FuotaTaskArn = Shapes::StringShape.new(name: 'FuotaTaskArn')
@@ -427,6 +429,7 @@ module Aws::IoTWireless
427
429
  RSRQ = Shapes::FloatShape.new(name: 'RSRQ')
428
430
  RSS = Shapes::IntegerShape.new(name: 'RSS')
429
431
  RaAllowed = Shapes::BooleanShape.new(name: 'RaAllowed')
432
+ RedundancyPercent = Shapes::IntegerShape.new(name: 'RedundancyPercent')
430
433
  RegParamsRevision = Shapes::StringShape.new(name: 'RegParamsRevision')
431
434
  RegistrationZone = Shapes::IntegerShape.new(name: 'RegistrationZone')
432
435
  ReportDevStatusBattery = Shapes::BooleanShape.new(name: 'ReportDevStatusBattery')
@@ -765,6 +768,9 @@ module Aws::IoTWireless
765
768
  CreateFuotaTaskRequest.add_member(:firmware_update_image, Shapes::ShapeRef.new(shape: FirmwareUpdateImage, required: true, location_name: "FirmwareUpdateImage"))
766
769
  CreateFuotaTaskRequest.add_member(:firmware_update_role, Shapes::ShapeRef.new(shape: FirmwareUpdateRole, required: true, location_name: "FirmwareUpdateRole"))
767
770
  CreateFuotaTaskRequest.add_member(:tags, Shapes::ShapeRef.new(shape: TagList, location_name: "Tags"))
771
+ CreateFuotaTaskRequest.add_member(:redundancy_percent, Shapes::ShapeRef.new(shape: RedundancyPercent, location_name: "RedundancyPercent"))
772
+ CreateFuotaTaskRequest.add_member(:fragment_size_bytes, Shapes::ShapeRef.new(shape: FragmentSizeBytes, location_name: "FragmentSizeBytes"))
773
+ CreateFuotaTaskRequest.add_member(:fragment_interval_ms, Shapes::ShapeRef.new(shape: FragmentIntervalMS, location_name: "FragmentIntervalMS"))
768
774
  CreateFuotaTaskRequest.struct_class = Types::CreateFuotaTaskRequest
769
775
 
770
776
  CreateFuotaTaskResponse.add_member(:arn, Shapes::ShapeRef.new(shape: FuotaTaskArn, location_name: "Arn"))
@@ -1057,6 +1063,9 @@ module Aws::IoTWireless
1057
1063
  GetFuotaTaskResponse.add_member(:firmware_update_image, Shapes::ShapeRef.new(shape: FirmwareUpdateImage, location_name: "FirmwareUpdateImage"))
1058
1064
  GetFuotaTaskResponse.add_member(:firmware_update_role, Shapes::ShapeRef.new(shape: FirmwareUpdateRole, location_name: "FirmwareUpdateRole"))
1059
1065
  GetFuotaTaskResponse.add_member(:created_at, Shapes::ShapeRef.new(shape: CreatedAt, location_name: "CreatedAt"))
1066
+ GetFuotaTaskResponse.add_member(:redundancy_percent, Shapes::ShapeRef.new(shape: RedundancyPercent, location_name: "RedundancyPercent"))
1067
+ GetFuotaTaskResponse.add_member(:fragment_size_bytes, Shapes::ShapeRef.new(shape: FragmentSizeBytes, location_name: "FragmentSizeBytes"))
1068
+ GetFuotaTaskResponse.add_member(:fragment_interval_ms, Shapes::ShapeRef.new(shape: FragmentIntervalMS, location_name: "FragmentIntervalMS"))
1060
1069
  GetFuotaTaskResponse.struct_class = Types::GetFuotaTaskResponse
1061
1070
 
1062
1071
  GetLogLevelsByResourceTypesRequest.struct_class = Types::GetLogLevelsByResourceTypesRequest
@@ -1937,6 +1946,9 @@ module Aws::IoTWireless
1937
1946
  UpdateFuotaTaskRequest.add_member(:lo_ra_wan, Shapes::ShapeRef.new(shape: LoRaWANFuotaTask, location_name: "LoRaWAN"))
1938
1947
  UpdateFuotaTaskRequest.add_member(:firmware_update_image, Shapes::ShapeRef.new(shape: FirmwareUpdateImage, location_name: "FirmwareUpdateImage"))
1939
1948
  UpdateFuotaTaskRequest.add_member(:firmware_update_role, Shapes::ShapeRef.new(shape: FirmwareUpdateRole, location_name: "FirmwareUpdateRole"))
1949
+ UpdateFuotaTaskRequest.add_member(:redundancy_percent, Shapes::ShapeRef.new(shape: RedundancyPercent, location_name: "RedundancyPercent"))
1950
+ UpdateFuotaTaskRequest.add_member(:fragment_size_bytes, Shapes::ShapeRef.new(shape: FragmentSizeBytes, location_name: "FragmentSizeBytes"))
1951
+ UpdateFuotaTaskRequest.add_member(:fragment_interval_ms, Shapes::ShapeRef.new(shape: FragmentIntervalMS, location_name: "FragmentIntervalMS"))
1940
1952
  UpdateFuotaTaskRequest.struct_class = Types::UpdateFuotaTaskRequest
1941
1953
 
1942
1954
  UpdateFuotaTaskResponse.struct_class = Types::UpdateFuotaTaskResponse
@@ -50,9 +50,6 @@ module Aws::IoTWireless
50
50
 
51
51
  def initialize(options = {})
52
52
  self[:region] = options[:region]
53
- if self[:region].nil?
54
- raise ArgumentError, "Missing required EndpointParameter: :region"
55
- end
56
53
  self[:use_dual_stack] = options[:use_dual_stack]
57
54
  self[:use_dual_stack] = false if self[:use_dual_stack].nil?
58
55
  if self[:use_dual_stack].nil?
@@ -9,104 +9,61 @@
9
9
 
10
10
  module Aws::IoTWireless
11
11
  class EndpointProvider
12
- def initialize(rule_set = nil)
13
- @@rule_set ||= begin
14
- endpoint_rules = Aws::Json.load(Base64.decode64(RULES))
15
- Aws::Endpoints::RuleSet.new(
16
- version: endpoint_rules['version'],
17
- service_id: endpoint_rules['serviceId'],
18
- parameters: endpoint_rules['parameters'],
19
- rules: endpoint_rules['rules']
20
- )
12
+ def resolve_endpoint(parameters)
13
+ region = parameters.region
14
+ use_dual_stack = parameters.use_dual_stack
15
+ use_fips = parameters.use_fips
16
+ endpoint = parameters.endpoint
17
+ if Aws::Endpoints::Matchers.set?(endpoint)
18
+ if Aws::Endpoints::Matchers.boolean_equals?(use_fips, true)
19
+ raise ArgumentError, "Invalid Configuration: FIPS and custom endpoint are not supported"
20
+ end
21
+ if Aws::Endpoints::Matchers.boolean_equals?(use_dual_stack, true)
22
+ raise ArgumentError, "Invalid Configuration: Dualstack and custom endpoint are not supported"
23
+ end
24
+ return Aws::Endpoints::Endpoint.new(url: endpoint, headers: {}, properties: {})
21
25
  end
22
- @provider = Aws::Endpoints::RulesProvider.new(rule_set || @@rule_set)
23
- end
26
+ if Aws::Endpoints::Matchers.set?(region)
27
+ if (partition_result = Aws::Endpoints::Matchers.aws_partition(region))
28
+ if Aws::Endpoints::Matchers.boolean_equals?(use_fips, true) && Aws::Endpoints::Matchers.boolean_equals?(use_dual_stack, true)
29
+ if Aws::Endpoints::Matchers.boolean_equals?(true, Aws::Endpoints::Matchers.attr(partition_result, "supportsFIPS")) && Aws::Endpoints::Matchers.boolean_equals?(true, Aws::Endpoints::Matchers.attr(partition_result, "supportsDualStack"))
30
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless-fips.#{region}.#{partition_result['dualStackDnsSuffix']}", headers: {}, properties: {})
31
+ end
32
+ raise ArgumentError, "FIPS and DualStack are enabled, but this partition does not support one or both"
33
+ end
34
+ if Aws::Endpoints::Matchers.boolean_equals?(use_fips, true)
35
+ if Aws::Endpoints::Matchers.boolean_equals?(true, Aws::Endpoints::Matchers.attr(partition_result, "supportsFIPS"))
36
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless-fips.#{region}.#{partition_result['dnsSuffix']}", headers: {}, properties: {})
37
+ end
38
+ raise ArgumentError, "FIPS is enabled but this partition does not support FIPS"
39
+ end
40
+ if Aws::Endpoints::Matchers.boolean_equals?(use_dual_stack, true)
41
+ if Aws::Endpoints::Matchers.boolean_equals?(true, Aws::Endpoints::Matchers.attr(partition_result, "supportsDualStack"))
42
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.#{region}.#{partition_result['dualStackDnsSuffix']}", headers: {}, properties: {})
43
+ end
44
+ raise ArgumentError, "DualStack is enabled but this partition does not support DualStack"
45
+ end
46
+ if Aws::Endpoints::Matchers.string_equals?(region, "ap-northeast-1")
47
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.ap-northeast-1.amazonaws.com", headers: {}, properties: {})
48
+ end
49
+ if Aws::Endpoints::Matchers.string_equals?(region, "ap-southeast-2")
50
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.ap-southeast-2.amazonaws.com", headers: {}, properties: {})
51
+ end
52
+ if Aws::Endpoints::Matchers.string_equals?(region, "eu-west-1")
53
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.eu-west-1.amazonaws.com", headers: {}, properties: {})
54
+ end
55
+ if Aws::Endpoints::Matchers.string_equals?(region, "us-east-1")
56
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.us-east-1.amazonaws.com", headers: {}, properties: {})
57
+ end
58
+ if Aws::Endpoints::Matchers.string_equals?(region, "us-west-2")
59
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.us-west-2.amazonaws.com", headers: {}, properties: {})
60
+ end
61
+ return Aws::Endpoints::Endpoint.new(url: "https://api.iotwireless.#{region}.#{partition_result['dnsSuffix']}", headers: {}, properties: {})
62
+ end
63
+ end
64
+ raise ArgumentError, "Invalid Configuration: Missing Region"
65
+ raise ArgumentError, 'No endpoint could be resolved'
24
66
 
25
- def resolve_endpoint(parameters)
26
- @provider.resolve_endpoint(parameters)
27
67
  end
28
-
29
- # @api private
30
- RULES = <<-JSON
31
- eyJ2ZXJzaW9uIjoiMS4wIiwicGFyYW1ldGVycyI6eyJSZWdpb24iOnsiYnVp
32
- bHRJbiI6IkFXUzo6UmVnaW9uIiwicmVxdWlyZWQiOnRydWUsImRvY3VtZW50
33
- YXRpb24iOiJUaGUgQVdTIHJlZ2lvbiB1c2VkIHRvIGRpc3BhdGNoIHRoZSBy
34
- ZXF1ZXN0LiIsInR5cGUiOiJTdHJpbmcifSwiVXNlRHVhbFN0YWNrIjp7ImJ1
35
- aWx0SW4iOiJBV1M6OlVzZUR1YWxTdGFjayIsInJlcXVpcmVkIjp0cnVlLCJk
36
- ZWZhdWx0IjpmYWxzZSwiZG9jdW1lbnRhdGlvbiI6IldoZW4gdHJ1ZSwgdXNl
37
- IHRoZSBkdWFsLXN0YWNrIGVuZHBvaW50LiBJZiB0aGUgY29uZmlndXJlZCBl
38
- bmRwb2ludCBkb2VzIG5vdCBzdXBwb3J0IGR1YWwtc3RhY2ssIGRpc3BhdGNo
39
- aW5nIHRoZSByZXF1ZXN0IE1BWSByZXR1cm4gYW4gZXJyb3IuIiwidHlwZSI6
40
- IkJvb2xlYW4ifSwiVXNlRklQUyI6eyJidWlsdEluIjoiQVdTOjpVc2VGSVBT
41
- IiwicmVxdWlyZWQiOnRydWUsImRlZmF1bHQiOmZhbHNlLCJkb2N1bWVudGF0
42
- aW9uIjoiV2hlbiB0cnVlLCBzZW5kIHRoaXMgcmVxdWVzdCB0byB0aGUgRklQ
43
- Uy1jb21wbGlhbnQgcmVnaW9uYWwgZW5kcG9pbnQuIElmIHRoZSBjb25maWd1
44
- cmVkIGVuZHBvaW50IGRvZXMgbm90IGhhdmUgYSBGSVBTIGNvbXBsaWFudCBl
45
- bmRwb2ludCwgZGlzcGF0Y2hpbmcgdGhlIHJlcXVlc3Qgd2lsbCByZXR1cm4g
46
- YW4gZXJyb3IuIiwidHlwZSI6IkJvb2xlYW4ifSwiRW5kcG9pbnQiOnsiYnVp
47
- bHRJbiI6IlNESzo6RW5kcG9pbnQiLCJyZXF1aXJlZCI6ZmFsc2UsImRvY3Vt
48
- ZW50YXRpb24iOiJPdmVycmlkZSB0aGUgZW5kcG9pbnQgdXNlZCB0byBzZW5k
49
- IHRoaXMgcmVxdWVzdCIsInR5cGUiOiJTdHJpbmcifX0sInJ1bGVzIjpbeyJj
50
- b25kaXRpb25zIjpbeyJmbiI6ImF3cy5wYXJ0aXRpb24iLCJhcmd2IjpbeyJy
51
- ZWYiOiJSZWdpb24ifV0sImFzc2lnbiI6IlBhcnRpdGlvblJlc3VsdCJ9XSwi
52
- dHlwZSI6InRyZWUiLCJydWxlcyI6W3siY29uZGl0aW9ucyI6W3siZm4iOiJp
53
- c1NldCIsImFyZ3YiOlt7InJlZiI6IkVuZHBvaW50In1dfSx7ImZuIjoicGFy
54
- c2VVUkwiLCJhcmd2IjpbeyJyZWYiOiJFbmRwb2ludCJ9XSwiYXNzaWduIjoi
55
- dXJsIn1dLCJ0eXBlIjoidHJlZSIsInJ1bGVzIjpbeyJjb25kaXRpb25zIjpb
56
- eyJmbiI6ImJvb2xlYW5FcXVhbHMiLCJhcmd2IjpbeyJyZWYiOiJVc2VGSVBT
57
- In0sdHJ1ZV19XSwiZXJyb3IiOiJJbnZhbGlkIENvbmZpZ3VyYXRpb246IEZJ
58
- UFMgYW5kIGN1c3RvbSBlbmRwb2ludCBhcmUgbm90IHN1cHBvcnRlZCIsInR5
59
- cGUiOiJlcnJvciJ9LHsiY29uZGl0aW9ucyI6W10sInR5cGUiOiJ0cmVlIiwi
60
- cnVsZXMiOlt7ImNvbmRpdGlvbnMiOlt7ImZuIjoiYm9vbGVhbkVxdWFscyIs
61
- ImFyZ3YiOlt7InJlZiI6IlVzZUR1YWxTdGFjayJ9LHRydWVdfV0sImVycm9y
62
- IjoiSW52YWxpZCBDb25maWd1cmF0aW9uOiBEdWFsc3RhY2sgYW5kIGN1c3Rv
63
- bSBlbmRwb2ludCBhcmUgbm90IHN1cHBvcnRlZCIsInR5cGUiOiJlcnJvciJ9
64
- LHsiY29uZGl0aW9ucyI6W10sImVuZHBvaW50Ijp7InVybCI6eyJyZWYiOiJF
65
- bmRwb2ludCJ9LCJwcm9wZXJ0aWVzIjp7fSwiaGVhZGVycyI6e319LCJ0eXBl
66
- IjoiZW5kcG9pbnQifV19XX0seyJjb25kaXRpb25zIjpbeyJmbiI6ImJvb2xl
67
- YW5FcXVhbHMiLCJhcmd2IjpbeyJyZWYiOiJVc2VGSVBTIn0sdHJ1ZV19LHsi
68
- Zm4iOiJib29sZWFuRXF1YWxzIiwiYXJndiI6W3sicmVmIjoiVXNlRHVhbFN0
69
- YWNrIn0sdHJ1ZV19XSwidHlwZSI6InRyZWUiLCJydWxlcyI6W3siY29uZGl0
70
- aW9ucyI6W3siZm4iOiJib29sZWFuRXF1YWxzIiwiYXJndiI6W3RydWUseyJm
71
- biI6ImdldEF0dHIiLCJhcmd2IjpbeyJyZWYiOiJQYXJ0aXRpb25SZXN1bHQi
72
- fSwic3VwcG9ydHNGSVBTIl19XX0seyJmbiI6ImJvb2xlYW5FcXVhbHMiLCJh
73
- cmd2IjpbdHJ1ZSx7ImZuIjoiZ2V0QXR0ciIsImFyZ3YiOlt7InJlZiI6IlBh
74
- cnRpdGlvblJlc3VsdCJ9LCJzdXBwb3J0c0R1YWxTdGFjayJdfV19XSwidHlw
75
- ZSI6InRyZWUiLCJydWxlcyI6W3siY29uZGl0aW9ucyI6W10sImVuZHBvaW50
76
- Ijp7InVybCI6Imh0dHBzOi8vYXBpLmlvdHdpcmVsZXNzLWZpcHMue1JlZ2lv
77
- bn0ue1BhcnRpdGlvblJlc3VsdCNkdWFsU3RhY2tEbnNTdWZmaXh9IiwicHJv
78
- cGVydGllcyI6e30sImhlYWRlcnMiOnt9fSwidHlwZSI6ImVuZHBvaW50In1d
79
- fSx7ImNvbmRpdGlvbnMiOltdLCJlcnJvciI6IkZJUFMgYW5kIER1YWxTdGFj
80
- ayBhcmUgZW5hYmxlZCwgYnV0IHRoaXMgcGFydGl0aW9uIGRvZXMgbm90IHN1
81
- cHBvcnQgb25lIG9yIGJvdGgiLCJ0eXBlIjoiZXJyb3IifV19LHsiY29uZGl0
82
- aW9ucyI6W3siZm4iOiJib29sZWFuRXF1YWxzIiwiYXJndiI6W3sicmVmIjoi
83
- VXNlRklQUyJ9LHRydWVdfV0sInR5cGUiOiJ0cmVlIiwicnVsZXMiOlt7ImNv
84
- bmRpdGlvbnMiOlt7ImZuIjoiYm9vbGVhbkVxdWFscyIsImFyZ3YiOlt0cnVl
85
- LHsiZm4iOiJnZXRBdHRyIiwiYXJndiI6W3sicmVmIjoiUGFydGl0aW9uUmVz
86
- dWx0In0sInN1cHBvcnRzRklQUyJdfV19XSwidHlwZSI6InRyZWUiLCJydWxl
87
- cyI6W3siY29uZGl0aW9ucyI6W10sInR5cGUiOiJ0cmVlIiwicnVsZXMiOlt7
88
- ImNvbmRpdGlvbnMiOltdLCJlbmRwb2ludCI6eyJ1cmwiOiJodHRwczovL2Fw
89
- aS5pb3R3aXJlbGVzcy1maXBzLntSZWdpb259LntQYXJ0aXRpb25SZXN1bHQj
90
- ZG5zU3VmZml4fSIsInByb3BlcnRpZXMiOnt9LCJoZWFkZXJzIjp7fX0sInR5
91
- cGUiOiJlbmRwb2ludCJ9XX1dfSx7ImNvbmRpdGlvbnMiOltdLCJlcnJvciI6
92
- IkZJUFMgaXMgZW5hYmxlZCBidXQgdGhpcyBwYXJ0aXRpb24gZG9lcyBub3Qg
93
- c3VwcG9ydCBGSVBTIiwidHlwZSI6ImVycm9yIn1dfSx7ImNvbmRpdGlvbnMi
94
- Olt7ImZuIjoiYm9vbGVhbkVxdWFscyIsImFyZ3YiOlt7InJlZiI6IlVzZUR1
95
- YWxTdGFjayJ9LHRydWVdfV0sInR5cGUiOiJ0cmVlIiwicnVsZXMiOlt7ImNv
96
- bmRpdGlvbnMiOlt7ImZuIjoiYm9vbGVhbkVxdWFscyIsImFyZ3YiOlt0cnVl
97
- LHsiZm4iOiJnZXRBdHRyIiwiYXJndiI6W3sicmVmIjoiUGFydGl0aW9uUmVz
98
- dWx0In0sInN1cHBvcnRzRHVhbFN0YWNrIl19XX1dLCJ0eXBlIjoidHJlZSIs
99
- InJ1bGVzIjpbeyJjb25kaXRpb25zIjpbXSwiZW5kcG9pbnQiOnsidXJsIjoi
100
- aHR0cHM6Ly9hcGkuaW90d2lyZWxlc3Mue1JlZ2lvbn0ue1BhcnRpdGlvblJl
101
- c3VsdCNkdWFsU3RhY2tEbnNTdWZmaXh9IiwicHJvcGVydGllcyI6e30sImhl
102
- YWRlcnMiOnt9fSwidHlwZSI6ImVuZHBvaW50In1dfSx7ImNvbmRpdGlvbnMi
103
- OltdLCJlcnJvciI6IkR1YWxTdGFjayBpcyBlbmFibGVkIGJ1dCB0aGlzIHBh
104
- cnRpdGlvbiBkb2VzIG5vdCBzdXBwb3J0IER1YWxTdGFjayIsInR5cGUiOiJl
105
- cnJvciJ9XX0seyJjb25kaXRpb25zIjpbXSwiZW5kcG9pbnQiOnsidXJsIjoi
106
- aHR0cHM6Ly9hcGkuaW90d2lyZWxlc3Mue1JlZ2lvbn0ue1BhcnRpdGlvblJl
107
- c3VsdCNkbnNTdWZmaXh9IiwicHJvcGVydGllcyI6e30sImhlYWRlcnMiOnt9
108
- fSwidHlwZSI6ImVuZHBvaW50In1dfV19
109
-
110
- JSON
111
68
  end
112
69
  end