gooddata 2.1.10-java → 2.1.15-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,7 +5,6 @@
5
5
  # LICENSE file in the root directory of this source tree.
6
6
 
7
7
  require 'cgi'
8
- require 'active_support/core_ext/hash/compact'
9
8
 
10
9
  require_relative 'profile'
11
10
  require_relative '../extensions/enumerable'
@@ -241,7 +240,7 @@ module GoodData
241
240
 
242
241
  all_users
243
242
  else
244
- find_user_by_login(domain, id)
243
+ find_user_by_login(domain, id, opts)
245
244
  end
246
245
  end
247
246
 
@@ -105,6 +105,7 @@ module GoodData
105
105
  d[:title] = date_dim['dateDimension']['title']
106
106
  d[:urn] = date_dim['dateDimension']['urn']
107
107
  d[:identifier_prefix] = date_dim['dateDimension']['identifierPrefix']
108
+ d[:identifier] = date_dim['dateDimension']['identifier'] if date_dim['dateDimension']['identifier']
108
109
  d[:columns] = parse_bridges(date_dim)
109
110
  end
110
111
  end
@@ -30,7 +30,7 @@ module GoodData
30
30
  :deprecated => 0,
31
31
 
32
32
  # Content When options
33
- :recurrency => '0:0:0:12:0:0',
33
+ :recurrency => '0:0:0:1*12:0:0',
34
34
  :startDate => '2012-06-05',
35
35
  :timeZone => 'America/Los_Angeles',
36
36
 
@@ -118,11 +118,13 @@ module GoodData
118
118
  GoodData.logger.info("Deploying #{path}") if verbose
119
119
 
120
120
  deployed_path = Process.upload_package(path, files_to_exclude, client: client, project: project)
121
+ data_sources = options[:data_sources] || []
121
122
  data = {
122
123
  :process => {
123
124
  :name => deploy_name,
124
125
  :path => "/uploads/#{File.basename(deployed_path)}",
125
- :type => type
126
+ :type => type,
127
+ :dataSources => data_sources
126
128
  }
127
129
  }
128
130
 
@@ -171,10 +173,12 @@ module GoodData
171
173
  verbose = options[:verbose] || false
172
174
  GoodData.logger.info("Deploying #{path}") if verbose
173
175
 
176
+ data_sources = options[:data_sources] || []
174
177
  data = {
175
178
  process: {
176
179
  name: deploy_name,
177
180
  path: path,
181
+ dataSources: data_sources,
178
182
  type: 'RUBY'
179
183
  }
180
184
  }
@@ -185,7 +189,7 @@ module GoodData
185
189
  def deploy_component(data, options = { client: GoodData.client, project: GoodData.project })
186
190
  client, project = GoodData.get_client_and_project(options)
187
191
  data = { process: data } unless data[:process]
188
- data[:process] = GoodData::Helpers.symbolize_keys(data[:process]).select { |k| %i[type name component].include? k }
192
+ data[:process] = GoodData::Helpers.symbolize_keys(data[:process]).select { |k| %i[type name component dataSources].include? k }
189
193
  data[:process][:component] = GoodData::Helpers.symbolize_keys(data[:process][:component]).select { |k| %i[name version configLocation config].include? k }
190
194
 
191
195
  save(data, options)
@@ -266,7 +270,7 @@ module GoodData
266
270
  # @option options [String] :name Readable name of the process
267
271
  # @option options [Boolean] :verbose (false) Switch on verbose mode for detailed logging
268
272
  def deploy(path, options = {})
269
- Process.deploy(path, { client: client, process_id: process_id, :project => project, :name => name, :type => type }.merge(options))
273
+ Process.deploy(path, { client: client, process_id: process_id, :project => project, :name => name, :type => type, :data_sources => data_sources }.merge(options))
270
274
  end
271
275
 
272
276
  # Downloads the process from S3 in a zipped form.
@@ -326,6 +330,10 @@ module GoodData
326
330
  process['component']
327
331
  end
328
332
 
333
+ def data_sources
334
+ process['dataSources']
335
+ end
336
+
329
337
  # Determines whether the process is an ADDv2 component.
330
338
  # @return [Bool] True if the process is an ADDv2 component.
331
339
  def add_v2_component?
@@ -13,7 +13,6 @@ require 'zip'
13
13
  require 'net/smtp'
14
14
 
15
15
  require 'active_support/core_ext/hash/except'
16
- require 'active_support/core_ext/hash/compact'
17
16
  require 'active_support/core_ext/hash/slice'
18
17
 
19
18
  require_relative '../exceptions/no_project_error'
@@ -261,21 +260,26 @@ module GoodData
261
260
  # @option ads_output_stage_uri Uri of the source output stage. It must be in the same domain as the target project.
262
261
  def transfer_processes(from_project, to_project, options = {})
263
262
  options = GoodData::Helpers.symbolize_keys(options)
263
+ aliases = {}
264
264
  to_project_processes = to_project.processes
265
265
  additional_hidden_params = options[:additional_hidden_params] || {}
266
266
  result = from_project.processes.uniq(&:name).map do |process|
267
- fail "The process name #{process.name} must be unique in transfered project #{to_project}" if to_project_processes.count { |p| p.name == process.name } > 1
267
+ fail "The process name #{process.name} must be unique in transferred project #{to_project}" if to_project_processes.count { |p| p.name == process.name } > 1
268
268
  next if process.type == :dataload || process.add_v2_component?
269
+ collect_process_aliases(process.data, from_project.client, aliases)
269
270
 
270
271
  to_process = to_project_processes.find { |p| p.name == process.name }
271
272
 
273
+ data_sources = GoodData::Helpers.symbolize_keys_recursively!(process.data_sources)
274
+ data_sources = replace_data_source_ids(data_sources, to_project.client, aliases)
272
275
  to_process = if process.path
273
276
  to_process.delete if to_process
274
- GoodData::Process.deploy_from_appstore(process.path, name: process.name, client: to_project.client, project: to_project)
277
+ Process.deploy_from_appstore(process.path, name: process.name, client: to_project.client, project: to_project, data_sources: data_sources)
275
278
  elsif process.component
276
279
  to_process.delete if to_process
277
280
  process_hash = GoodData::Helpers::DeepMergeableHash[GoodData::Helpers.symbolize_keys(process.to_hash)].deep_merge(additional_hidden_params)
278
- GoodData::Process.deploy_component(process_hash, project: to_project, client: to_project.client)
281
+ process_hash = replace_process_data_source_ids(process_hash, to_project.client, aliases)
282
+ Process.deploy_component(process_hash, project: to_project, client: to_project.client)
279
283
  else
280
284
  Dir.mktmpdir('etl_transfer') do |dir|
281
285
  dir = Pathname(dir)
@@ -283,11 +287,10 @@ module GoodData
283
287
  File.open(filename, 'w') do |f|
284
288
  f << process.download
285
289
  end
286
-
287
290
  if to_process
288
- to_process.deploy(filename, type: process.type, name: process.name)
291
+ to_process.deploy(filename, type: process.type, name: process.name, data_sources: data_sources)
289
292
  else
290
- to_project.deploy_process(filename, type: process.type, name: process.name)
293
+ to_project.deploy_process(filename, type: process.type, name: process.name, data_sources: data_sources)
291
294
  end
292
295
  end
293
296
  end
@@ -318,6 +321,78 @@ module GoodData
318
321
  result.compact
319
322
  end
320
323
 
324
+ def collect_process_aliases(process_data, client, aliases)
325
+ data_sources = process_data.dig('process', 'dataSources')
326
+ unless data_sources.blank?
327
+ data_sources.map do |data_source|
328
+ get_data_source_alias(data_source['id'], client, aliases)
329
+ end
330
+ end
331
+ component = process_data.dig('process', 'component')
332
+ get_data_source_alias(component['configLocation']['dataSourceConfig']['id'], client, aliases) if component&.dig('configLocation', 'dataSourceConfig')
333
+ aliases
334
+ end
335
+
336
+ def get_data_source_alias(data_source_id, client, aliases)
337
+ unless aliases[data_source_id]
338
+ data_source = GoodData::DataSource.from_id(data_source_id, client: client)
339
+ if data_source&.dig('dataSource', 'alias')
340
+ aliases[data_source_id] = {
341
+ :type => get_data_source_type(data_source),
342
+ :alias => data_source['dataSource']['alias']
343
+ }
344
+ end
345
+ end
346
+ aliases[data_source_id]
347
+ end
348
+
349
+ def get_data_source_type(data_source_data)
350
+ data_source_data&.dig('dataSource', 'connectionInfo') ? data_source_data['dataSource']['connectionInfo'].first[0].upcase : ""
351
+ end
352
+
353
+ def replace_process_data_source_ids(process_data, client, aliases)
354
+ component = process_data.dig(:process, :component)
355
+ if component&.dig(:configLocation, :dataSourceConfig)
356
+ the_alias = aliases[component[:configLocation][:dataSourceConfig][:id]]
357
+ process_data[:process][:component][:configLocation][:dataSourceConfig][:id] = verify_data_source_alias(the_alias, client)
358
+ end
359
+ process_data[:process][:dataSources] = replace_data_source_ids(process_data[:process][:dataSources], client, aliases)
360
+ process_data
361
+ end
362
+
363
+ def replace_data_source_ids(data_sources, client, aliases)
364
+ array_data_sources = []
365
+ if data_sources && !data_sources.empty?
366
+ data_sources.map do |data_source|
367
+ new_id = verify_data_source_alias(aliases[data_source[:id]], client)
368
+ array_data_sources.push(:id => new_id)
369
+ end
370
+ end
371
+ array_data_sources
372
+ end
373
+
374
+ # Verify whether the data source exists in the domain using its alias
375
+ #
376
+ # @param [String] ds_alias The data source's alias
377
+ # @param [Object] client The Rest Client object
378
+ # @return [String] Id of the data source or failed with the reason
379
+ def verify_data_source_alias(ds_alias, client)
380
+ domain = client.connection.server.url
381
+ fail "The data source alias is empty, check your data source configuration." unless ds_alias
382
+
383
+ uri = "/gdc/dataload/dataSources/internal/availableAlias?alias=#{ds_alias[:alias]}"
384
+ res = client.get(uri)
385
+ fail "Unable to get information about the Data Source '#{ds_alias[:alias]}' in the domain '#{domain}'" unless res
386
+ fail "Unable to find the #{ds_alias[:type]} Data Source '#{ds_alias[:alias]}' in the domain '#{domain}'" if res['availableAlias']['available']
387
+
388
+ ds_type = res['availableAlias']['existingDataSource']['type']
389
+ if ds_type && ds_type != ds_alias[:type]
390
+ fail "Wrong Data Source type - the '#{ds_type}' type is expected but the Data Source '#{ds_alias[:alias]}' in the domain '#{domain}' has the '#{ds_alias[:type]}' type"
391
+ else
392
+ res['availableAlias']['existingDataSource']['id']
393
+ end
394
+ end
395
+
321
396
  def transfer_user_groups(from_project, to_project)
322
397
  from_project.user_groups.map do |ug|
323
398
  # migrate groups
@@ -625,6 +700,7 @@ module GoodData
625
700
  def blueprint(options = {})
626
701
  options = { include_ca: true }.merge(options)
627
702
  result = client.get("/gdc/projects/#{pid}/model/view", params: { includeDeprecated: true, includeGrain: true, includeCA: options[:include_ca] })
703
+
628
704
  polling_url = result['asyncTask']['link']['poll']
629
705
  model = client.poll_on_code(polling_url, options)
630
706
  bp = GoodData::Model::FromWire.from_wire(model, options)
@@ -1606,14 +1682,19 @@ module GoodData
1606
1682
  def import_users(new_users, options = {})
1607
1683
  role_list = roles
1608
1684
  users_list = users
1609
- new_users = new_users.map { |x| ((x.is_a?(Hash) && x[:user] && x[:user].to_hash.merge(role: x[:role])) || x.to_hash).tap { |u| u[:login].downcase! } }
1610
1685
 
1611
1686
  GoodData.logger.warn("Importing users to project (#{pid})")
1687
+ new_users = new_users.map { |x| ((x.is_a?(Hash) && x[:user] && x[:user].to_hash.merge(role: x[:role])) || x.to_hash).tap { |u| u[:login].downcase! } }
1688
+ # First check that if groups are provided we have them set up
1689
+ user_groups_cache, change_groups = check_groups(new_users.map(&:to_hash).flat_map { |u| u[:user_group] || [] }.uniq, options[:user_groups_cache], options)
1612
1690
 
1613
- whitelisted_new_users, whitelisted_users = whitelist_users(new_users.map(&:to_hash), users_list, options[:whitelists])
1691
+ unless change_groups.empty?
1692
+ new_users.each do |user|
1693
+ user[:user_group].map! { |e| change_groups[e].nil? ? e : change_groups[e] }
1694
+ end
1695
+ end
1614
1696
 
1615
- # First check that if groups are provided we have them set up
1616
- user_groups_cache = check_groups(new_users.map(&:to_hash).flat_map { |u| u[:user_group] || [] }.uniq, options[:user_groups_cache], options)
1697
+ whitelisted_new_users, whitelisted_users = whitelist_users(new_users.map(&:to_hash), users_list, options[:whitelists])
1617
1698
 
1618
1699
  # conform the role on list of new users so we can diff them with the users coming from the project
1619
1700
  diffable_new_with_default_role = whitelisted_new_users.map do |u|
@@ -1760,7 +1841,20 @@ module GoodData
1760
1841
  def check_groups(specified_groups, user_groups_cache = nil, options = {})
1761
1842
  current_user_groups = user_groups if user_groups_cache.nil? || user_groups_cache.empty?
1762
1843
  groups = current_user_groups.map(&:name)
1763
- missing_groups = specified_groups - groups
1844
+ missing_groups = []
1845
+ change_groups = {}
1846
+ specified_groups.each do |group|
1847
+ found_group = groups.find { |name| name.casecmp(group).zero? }
1848
+ if found_group.nil?
1849
+ missing_groups << group
1850
+ else
1851
+ # Change groups when they have similar group name with difference of case sensitivity
1852
+ if found_group != group
1853
+ change_groups[group] = found_group
1854
+ GoodData.logger.warn("Group with name #{group} is existed in project with name #{found_group}.")
1855
+ end
1856
+ end
1857
+ end
1764
1858
  if options[:create_non_existing_user_groups]
1765
1859
  missing_groups.each do |g|
1766
1860
  GoodData.logger.info("Creating group #{g}")
@@ -1773,7 +1867,7 @@ module GoodData
1773
1867
  "#{groups.join(',')} and you asked for #{missing_groups.join(',')}"
1774
1868
  end
1775
1869
  end
1776
- current_user_groups
1870
+ [current_user_groups, change_groups]
1777
1871
  end
1778
1872
 
1779
1873
  # Update user
@@ -1904,6 +1998,20 @@ module GoodData
1904
1998
  [user, roles]
1905
1999
  end
1906
2000
 
2001
+ def upgrade_custom_v2(message, options = {})
2002
+ uri = "/gdc/md/#{pid}/datedimension/upgrade"
2003
+ poll_result = client&.post(uri, message)
2004
+
2005
+ return poll_result['wTaskStatus']['status'] if poll_result['wTaskStatus'] && poll_result['wTaskStatus']['status']
2006
+
2007
+ polling_uri = poll_result['asyncTask']['link']['poll']
2008
+ result = client&.poll_on_response(polling_uri, options) do |body|
2009
+ body && body['wTaskStatus'] && body['wTaskStatus']['status'] == 'RUNNING'
2010
+ end
2011
+
2012
+ result['wTaskStatus']['status'] == 'OK' ? 'OK' : 'FAIL'
2013
+ end
2014
+
1907
2015
  def add
1908
2016
  @add ||= GoodData::AutomatedDataDistribution.new(self)
1909
2017
  @add
@@ -7,7 +7,6 @@
7
7
  require_relative '../project_log_formatter'
8
8
 
9
9
  require 'active_support/core_ext/hash/indifferent_access'
10
- require 'active_support/core_ext/hash/compact'
11
10
 
12
11
  require 'gooddata/extensions/true'
13
12
  require 'gooddata/extensions/false'
@@ -13,7 +13,6 @@ require_relative '../mixins/rest_resource'
13
13
  require_relative '../mixins/uri_getter'
14
14
 
15
15
  require 'active_support/core_ext/hash/except'
16
- require 'active_support/core_ext/hash/compact'
17
16
 
18
17
  module GoodData
19
18
  # Representation of User Group
@@ -1,51 +1,51 @@
1
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- CvWpM9wBkYIqKC4GyElIwhqwEiqgpjJGqRjZAOB1FW/sJtEvYUyCAxzacjJn
15
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 0tvIC9/0PgeY3NazXuGCr1NMFS14F/dPjqmJSccpVdApqnaHiiTWKEIix9I4
24
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
@@ -1,109 +1,109 @@
1
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- j1w7BamJI4+drC8uKFIChOmetT6K5Pd8dqmORBz5ltWTSAkoXimey97x2SEY
9
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 0N6970pnv+wB/TCSHFXw3VZhAmEcIxNblLSN2xsVPTXoMf2WbedoXwttJiDg
26
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- L5c55Tz4TEFk53ubn4ZSGNa83+1aPYLWBYZwh6FSYdW+gR1VgCj39BqvuBBr
43
- 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
- 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
- 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
- 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
- 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
- 6N/ZXU5GAcqUioANIbtkUcj+FtO8W+I6XqXE/9OGaokPVpIbN8hs6S/ScfZC
49
- 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
- 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
- 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
- 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
- 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
- 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
- Qy2nv3aHgHqybJaoW7qK9gRzNMFnrFMh7D6F9XGBKaQwJCx0mV2EqOAr5yj9
56
- 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
- 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
- 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
- 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
- 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
- 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
- e6pd/+jX4oww0ZBKw0koEWECQb8TOMohZMwaFDPsujbfjXBylDIaeGmK9k4r
63
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- pF2lxGiZRrRJPOfc+37jNf9/vbMeBRi7iQv38BJUHCU3kxVb1Jl3VUeH+UUG
76
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- xPUzeeJDHmCQHEcCOyZRuI9yp1FBrIyM2JBte2kiAGK1ckxRwhu0FY/vwSkj
86
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- EMhpryt2IEHS7GxwH2AN7fjWamPxV8JRdPg7ttvmD9D4L90ZNmyUsdydwQcR
100
- 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
- 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
- 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
- N5XMf5tXscSWC8uQYHD8/FTn4hbekgylwt2SqJTjT1mRWpIgOy8NtC+gHpVD
104
- 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
- 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
- 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
- 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
- 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
109
- 2Tt1yw==
1
+ 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
109
+ 5UICsw==