puppet_module_packaging 0.0.2 → 0.1.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
  SHA1:
3
- metadata.gz: ccc2278c587b1d85d0717646163e3725f8abc4a2
4
- data.tar.gz: 3973f313a92372db4c5a2f9bfa136aa381392d3d
3
+ metadata.gz: 8a13fb00530b3fec6320d698b8703708334a4e4e
4
+ data.tar.gz: 90b4d60817f73b24d9eb3579df035debb83c5795
5
5
  SHA512:
6
- metadata.gz: 05f80f6e6262799d7640c355f15885146962932cca63812526e5a2f852ff84996bd65f8327aa76a662fd1b2cba2c1f78079519723ae50bee34b4ec6998f8f1bb
7
- data.tar.gz: d6f15dd4ba72dba9b29077feaec6a4f0e0c6e51fccd567d5309db62b45fdf1b08e2fbf131125e479df0af5d929754dbc5d3db61f482e34f9adf9cd7f7442b6b2
6
+ metadata.gz: 88edf75759c6982377d3dea822dbfeb19a7c780dcd67973d3bd606fe56e082f545d55fb60fd2ef3254d12538243bf8c928f274e168c48c264e38d79da8744ae4
7
+ data.tar.gz: 05112fc5d7f9b1d4db5ba552c233d5d304ff1fbd876367b1a0033ea684160766b753eda076f30f5cfaeae46c879a6dde467202949fb20c2e3dc8ddcf13e36c80
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.0.0-p247
1
+ ruby-2.1
data/.travis.yml CHANGED
@@ -4,9 +4,11 @@ language: ruby
4
4
  rvm:
5
5
  - 1.9.3
6
6
  - 2.0.0
7
- - jruby-18mode
7
+ - 2.1
8
8
  - jruby-19mode
9
- - rbx-19mode
9
+ - rbx
10
+
11
+ cache: apt
10
12
 
11
13
  bundler_args: --path vendor/bundle
12
14
 
data/Changelog.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.0
4
+
5
+ * Fix a shadowed variable bug in the test suite that prevented it to work
6
+ correctly.
7
+ * Added the Modulefile to the list of installed files in the final package
8
+ * Fixed parsing of `name-author` string in Modulefile
9
+ * Added support for translation of dependencies from Modulefile to final package
10
+ * Minor refactoring
11
+
3
12
  ## 0.0.2
4
13
 
5
14
  * Fix a bug that let the tasks fail if not all the standard module directories
data/README.md CHANGED
@@ -11,8 +11,7 @@ Currently, it provides tasks to build Debian and RPM packages. To do that, it
11
11
  uses excellent Jordan Sissel's [fpm](https://github.com/jordansissel/fpm).
12
12
 
13
13
  **NOTE**: at this stage, this library lacks a bunch of useful features
14
- (particularly, its behavior can't be customized in any way and there's no
15
- dependency management). Feel free to
14
+ (particularly, its behavior can't be customized in any way). Feel free to
16
15
  submit issues or PRs if there's something that could help you out and you'd
17
16
  like to see integrated.
18
17
 
data/Vagrantfile CHANGED
@@ -1,10 +1,12 @@
1
1
  # -*- mode: ruby -*-
2
2
  # vi: set ft=ruby :
3
3
 
4
- Vagrant.configure("2") do |config|
5
- config.vm.box = "ubuntu-base-oss"
6
- config.vm.box_url = "http://vagrantboxes.derecom.it/boxes/ubuntu-base-oss.box"
7
- config.vm.provision :puppet do |puppet|
4
+ VAGRANTFILE_API_VERSION = "2"
5
+
6
+ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
7
+ config.vm.box = "puppetlabs/ubuntu-13.10-64-puppet"
8
+ config.vbguest.auto_update = false
9
+ config.vm.provision "puppet" do |puppet|
8
10
  puppet.manifests_path = "test"
9
11
  puppet.manifest_file = "test_vm.pp"
10
12
  end
@@ -55,6 +55,7 @@ module PuppetModule
55
55
  url,
56
56
  description,
57
57
  license,
58
+ dependencies,
58
59
  chdir,
59
60
  output ].join " "
60
61
  end
@@ -91,6 +92,16 @@ module PuppetModule
91
92
  optionally('--license', modinfo.license)
92
93
  end
93
94
 
95
+ def dependencies
96
+ return "" unless modinfo.dependencies
97
+
98
+ modinfo.dependencies.map do |dep|
99
+ dep[:versions].map do |version_constraint|
100
+ "-d 'puppet-mod-#{dep[:author]}-#{dep[:name]} #{version_constraint}'"
101
+ end
102
+ end
103
+ end
104
+
94
105
  def src_fmt
95
106
  "-s dir"
96
107
  end
@@ -25,7 +25,7 @@ module PuppetModule
25
25
  end
26
26
 
27
27
  def assets_to_install
28
- ['manifests','templates','lib','files']
28
+ ['Modulefile','manifests','templates','lib','files']
29
29
  end
30
30
  end
31
31
  end
@@ -12,6 +12,7 @@ module PuppetModule
12
12
 
13
13
  def initialize(str)
14
14
  @metadata = OpenStruct.new
15
+ @metadata.dependencies = []
15
16
  binding.eval str
16
17
  validate_required_fields
17
18
  end
@@ -25,7 +26,7 @@ module PuppetModule
25
26
  private
26
27
 
27
28
  def name(s)
28
- @metadata.author, @metadata.name = s.split '/'
29
+ @metadata.author, @metadata.name = s.split '-'
29
30
  end
30
31
 
31
32
  def version(s)
@@ -56,6 +57,26 @@ module PuppetModule
56
57
  @metadata.project_page = s
57
58
  end
58
59
 
60
+ def dependency(mod, ver)
61
+ a, n = mod.split('/')
62
+ @metadata.dependencies << {
63
+ :name => n,
64
+ :author => a,
65
+ :versions => dependency_versions_for(ver),
66
+ }
67
+ end
68
+
69
+ def dependency_versions_for(versions_str)
70
+ versions = []
71
+ versions_str.split(/(>=|<=|==|=|<|>)\s+/)\
72
+ .select { |s| !s.empty? }\
73
+ .each_slice(2) { |v|
74
+ versions << v.map { |s| s.strip }.join(" ")
75
+ }
76
+
77
+ versions
78
+ end
79
+
59
80
  def validate_required_fields
60
81
  raise ArgumentError, 'Modulefile doesn`t contain name or author' unless
61
82
  @metadata.name and @metadata.author
@@ -1,5 +1,5 @@
1
1
  module PuppetModule
2
2
  module Pkg
3
- VERSION = "0.0.2"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
@@ -6,15 +6,21 @@ describe 'install task' do
6
6
  do_into_tmp_module('testmod', t)
7
7
  end
8
8
 
9
- let(:output_dir) { 'build/usr/share/puppet/modules/testmod' }
9
+ let(:output_dir) { Pathname.new 'build/usr/share/puppet/modules/testmod' }
10
10
 
11
- it 'installs all module dirs into the `build` subfolder' do
11
+ it 'installs all module dirs into the `build` subfolder, leaving out other project files' do
12
12
  `rake install`
13
13
 
14
14
  assert directory?(output_dir), "expected #{output_dir} to exist, but it didn't"
15
15
  filesystem {
16
+ file 'Modulefile'
17
+
16
18
  dir 'manifests' do
17
19
  file 'init.pp'
20
+ file 'defined_type.pp'
21
+ dir 'defined_type' do
22
+ file 'sub_manifest.pp'
23
+ end
18
24
  end
19
25
 
20
26
  dir 'files' do
@@ -29,6 +35,8 @@ describe 'install task' do
29
35
  file 'utils.rb'
30
36
  end
31
37
  }.must_exist_within output_dir
38
+
39
+ (output_dir + 'README.md').wont_exist
32
40
  end
33
41
  end
34
42
 
@@ -5,7 +5,6 @@ describe 'using PuppetModule::Pkg::Tasks in a Rakefile' do
5
5
  do_into_tmp_module('testmod', t)
6
6
  end
7
7
 
8
- let(:fixture_module) { File.join(fixture_dir, 'testmod') }
9
8
  let(:task_list) { `rake -T` }
10
9
 
11
10
  [:install, :clean, :deb, :rpm].each do |task|
@@ -1,4 +1,4 @@
1
- name 'testdev/testmod'
1
+ name 'testdev-testmod'
2
2
  version '0.0.1'
3
3
  source 'https://example.com/git/testmod'
4
4
  author 'Test Developer <test@example.com>'
@@ -7,7 +7,7 @@ summary 'A silly module, only useful for testing'
7
7
  description 'A long description of this silly module'
8
8
  project_page 'https://example.com/testmod/home'
9
9
 
10
- ## Add dependencies, if any:
11
- # dependency 'username/name', '>= 1.2.0'
10
+ dependency 'user_1/mod_1', '= 1.2.3'
11
+ dependency 'user_2/mod_2', '>= 1.0.0 < 3.2'
12
12
 
13
13
  unsupported_field 'I don`t know what I am for'
@@ -1 +1 @@
1
- name 'testdev/testmod'
1
+ name 'testdev-testmod'
File without changes
File without changes
@@ -1,2 +1,2 @@
1
- name 'testdev/testmod_small'
1
+ name 'testdev-testmod_small'
2
2
  version '0.0.1'
@@ -29,6 +29,10 @@ describe PuppetModule::Pkg::Tasks::Modulefile do
29
29
  metadata.summary.must_equal 'A silly module, only useful for testing'
30
30
  metadata.description.must_equal 'A long description of this silly module'
31
31
  metadata.project_page.must_equal 'https://example.com/testmod/home'
32
+ metadata.dependencies.must_equal [
33
+ { :author => 'user_1', :name => 'mod_1', :versions => ['= 1.2.3'] },
34
+ { :author => 'user_2', :name => 'mod_2', :versions => ['>= 1.0.0', '< 3.2']},
35
+ ]
32
36
  end
33
37
 
34
38
  it 'raises an error if the Modulefile doesn`t contain required fields' do
data/test/test_vm.pp CHANGED
@@ -1,4 +1,5 @@
1
1
  $deps = [
2
+ 'ruby-dev',
2
3
  'libxml2',
3
4
  'libxml2-dev',
4
5
  'libxslt1.1',
@@ -21,3 +22,8 @@ package { 'bundler':
21
22
  exec { 'apt-get update':
22
23
  path => '/usr/bin',
23
24
  }
25
+
26
+ user { 'vagrant':
27
+ ensure => present,
28
+ shell => '/bin/bash',
29
+ }
@@ -17,7 +17,11 @@ describe 'packaging tasks' do
17
17
  :author_full => 'a_dev <a@dev.com>',
18
18
  :project_page => 'http://a.b.c/my_mod',
19
19
  :summary => 'nothing fancy',
20
- :license => 'whatever')
20
+ :license => 'whatever',
21
+ :dependencies => [
22
+ { :author => 'user_1', :name => 'mod_1', :versions => ['< 1'] },
23
+ { :author => 'user_2', :name => 'mod_2', :versions => ['> 2.0', '<= 3.0'] },
24
+ ])
21
25
  }
22
26
  let(:opts) { OpenStruct.new(
23
27
  :pkg_dir => 'pkg',
@@ -38,6 +42,9 @@ describe 'packaging tasks' do
38
42
  regexp_matches(/-n puppet-mod-#{mod.author}-#{mod.name}/),
39
43
  regexp_matches(/-v #{mod.version}/),
40
44
  regexp_matches(/-m '#{mod.author_full}'/),
45
+ regexp_matches(/-d 'puppet-mod-user_1-mod_1 < 1'/),
46
+ regexp_matches(/-d 'puppet-mod-user_2-mod_2 > 2.0'/),
47
+ regexp_matches(/-d 'puppet-mod-user_2-mod_2 <= 3.0'/),
41
48
  regexp_matches(/--url '#{mod.project_page}'/),
42
49
  regexp_matches(/--description '#{mod.summary}'/),
43
50
  regexp_matches(/--license '#{mod.license}'/),
@@ -23,6 +23,7 @@ describe PuppetModule::Pkg::Tasks::Install do
23
23
  it 'installs all the relevant directories into the output folder' do
24
24
  sys.expects(:cp).with(
25
25
  includes(
26
+ 'Modulefile',
26
27
  'manifests',
27
28
  'templates',
28
29
  'files',
metadata CHANGED
@@ -1,146 +1,126 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet_module_packaging
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefano Zanella
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain:
11
- - |
12
- -----BEGIN CERTIFICATE-----
13
- MIIDQDCCAiigAwIBAgIBADANBgkqhkiG9w0BAQUFADBGMRgwFgYDVQQDDA96YW5l
14
- bGxhLnN0ZWZhbm8xFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixk
15
- ARkWA2NvbTAeFw0xMzA4MDcxOTA2MDZaFw0xNDA4MDcxOTA2MDZaMEYxGDAWBgNV
16
- BAMMD3phbmVsbGEuc3RlZmFubzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYK
17
- CZImiZPyLGQBGRYDY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
18
- 2JCnJCnjjs62MR/Tw/4WgSG42ruiCEqXV1ECMsXymHPE8xyHkYAwLXvBRzOkZ/IA
19
- puJ1XhScduMRcUuE0ZPA5N2HBZI0WsmyyNTYBjOob8m0SNInoRZfIMloj3D8QzB7
20
- /6G5HLMWNx60JEpIDgfXvIuSRKNKQ0/0+/G/H4COgj72pd3F4dYltvx+mSwPRq7Q
21
- MdZsK3T5Q3d4eLBY1VSlJpq0wkwdEWTXAhR0Mfmbn1D8m9IhJfubgXuXVBY4OPO8
22
- KAF/wWqTkzA6guVQlSKdZR4vwms7OpeFkotnivBKa6JwUQSXO8AZEyy53V8cSYDu
23
- dbaFi53YbEwOWSMQnW8/kQIDAQABozkwNzAdBgNVHQ4EFgQUcBKkmJAvSTKfDf7z
24
- LEu1wE+Rk+swCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwDQYJKoZIhvcNAQEFBQAD
25
- ggEBAMeqfk1l4Y0iZ8jNiu0afcQ60DVqBkRtrT/rsZEqGsdOw11bntOE4yWpo4Kd
26
- Y0C/kYrVQ/mIN7IGKbCSjES3aYdQftV9SRW77FA25m2KXRbnEYtJDUX35gAqSdRY
27
- 9IiYivsMq2dr70eKPNFrFOwWvmwhcGyEG8EDvYoXWllke7RGz1Dn/AZx6jPnShO+
28
- 0ru4OXsM9++md3sGXIugEFNygvo2/1yQoTe6+XiBocS+pWsJd6JZBfkxPRT4Dz4H
29
- RigBD0E3/t/ABjCXkmqwp5gnAZmP8JiVUkn8rp5E0FXvC8T7nsPs2TW/TAmUV6rN
30
- hK25FX8YWgT9fD9y3PpWjiYcrCo=
31
- -----END CERTIFICATE-----
32
- date: 2013-11-13 00:00:00.000000000 Z
11
+ - rubygems-stefanozanella.crt
12
+ date: 2014-04-01 00:00:00.000000000 Z
33
13
  dependencies:
34
14
  - !ruby/object:Gem::Dependency
35
15
  name: fpm
36
16
  requirement: !ruby/object:Gem::Requirement
37
17
  requirements:
38
- - - ~>
18
+ - - "~>"
39
19
  - !ruby/object:Gem::Version
40
20
  version: '0.4'
41
21
  type: :runtime
42
22
  prerelease: false
43
23
  version_requirements: !ruby/object:Gem::Requirement
44
24
  requirements:
45
- - - ~>
25
+ - - "~>"
46
26
  - !ruby/object:Gem::Version
47
27
  version: '0.4'
48
28
  - !ruby/object:Gem::Dependency
49
29
  name: bundler
50
30
  requirement: !ruby/object:Gem::Requirement
51
31
  requirements:
52
- - - ~>
32
+ - - "~>"
53
33
  - !ruby/object:Gem::Version
54
34
  version: '1.3'
55
35
  type: :development
56
36
  prerelease: false
57
37
  version_requirements: !ruby/object:Gem::Requirement
58
38
  requirements:
59
- - - ~>
39
+ - - "~>"
60
40
  - !ruby/object:Gem::Version
61
41
  version: '1.3'
62
42
  - !ruby/object:Gem::Dependency
63
43
  name: rake
64
44
  requirement: !ruby/object:Gem::Requirement
65
45
  requirements:
66
- - - '>='
46
+ - - ">="
67
47
  - !ruby/object:Gem::Version
68
48
  version: '0'
69
49
  type: :development
70
50
  prerelease: false
71
51
  version_requirements: !ruby/object:Gem::Requirement
72
52
  requirements:
73
- - - '>='
53
+ - - ">="
74
54
  - !ruby/object:Gem::Version
75
55
  version: '0'
76
56
  - !ruby/object:Gem::Dependency
77
57
  name: rubygems-tasks
78
58
  requirement: !ruby/object:Gem::Requirement
79
59
  requirements:
80
- - - '>='
60
+ - - ">="
81
61
  - !ruby/object:Gem::Version
82
62
  version: '0'
83
63
  type: :development
84
64
  prerelease: false
85
65
  version_requirements: !ruby/object:Gem::Requirement
86
66
  requirements:
87
- - - '>='
67
+ - - ">="
88
68
  - !ruby/object:Gem::Version
89
69
  version: '0'
90
70
  - !ruby/object:Gem::Dependency
91
71
  name: minitest
92
72
  requirement: !ruby/object:Gem::Requirement
93
73
  requirements:
94
- - - '>='
74
+ - - ">="
95
75
  - !ruby/object:Gem::Version
96
76
  version: '0'
97
77
  type: :development
98
78
  prerelease: false
99
79
  version_requirements: !ruby/object:Gem::Requirement
100
80
  requirements:
101
- - - '>='
81
+ - - ">="
102
82
  - !ruby/object:Gem::Version
103
83
  version: '0'
104
84
  - !ruby/object:Gem::Dependency
105
85
  name: minitest-filesystem
106
86
  requirement: !ruby/object:Gem::Requirement
107
87
  requirements:
108
- - - '>='
88
+ - - ">="
109
89
  - !ruby/object:Gem::Version
110
90
  version: '0'
111
91
  type: :development
112
92
  prerelease: false
113
93
  version_requirements: !ruby/object:Gem::Requirement
114
94
  requirements:
115
- - - '>='
95
+ - - ">="
116
96
  - !ruby/object:Gem::Version
117
97
  version: '0'
118
98
  - !ruby/object:Gem::Dependency
119
99
  name: minitest-around
120
100
  requirement: !ruby/object:Gem::Requirement
121
101
  requirements:
122
- - - '>='
102
+ - - ">="
123
103
  - !ruby/object:Gem::Version
124
104
  version: '0'
125
105
  type: :development
126
106
  prerelease: false
127
107
  version_requirements: !ruby/object:Gem::Requirement
128
108
  requirements:
129
- - - '>='
109
+ - - ">="
130
110
  - !ruby/object:Gem::Version
131
111
  version: '0'
132
112
  - !ruby/object:Gem::Dependency
133
113
  name: mocha
134
114
  requirement: !ruby/object:Gem::Requirement
135
115
  requirements:
136
- - - '>='
116
+ - - ">="
137
117
  - !ruby/object:Gem::Version
138
118
  version: '0'
139
119
  type: :development
140
120
  prerelease: false
141
121
  version_requirements: !ruby/object:Gem::Requirement
142
122
  requirements:
143
- - - '>='
123
+ - - ">="
144
124
  - !ruby/object:Gem::Version
145
125
  version: '0'
146
126
  description: |2
@@ -152,9 +132,9 @@ executables: []
152
132
  extensions: []
153
133
  extra_rdoc_files: []
154
134
  files:
155
- - .gitignore
156
- - .ruby-version
157
- - .travis.yml
135
+ - ".gitignore"
136
+ - ".ruby-version"
137
+ - ".travis.yml"
158
138
  - Changelog.md
159
139
  - Gemfile
160
140
  - LICENSE
@@ -181,9 +161,12 @@ files:
181
161
  - test/fixture/testmod/Modulefile
182
162
  - test/fixture/testmod/Modulefile.no_name_or_author
183
163
  - test/fixture/testmod/Modulefile.no_version
164
+ - test/fixture/testmod/README.md
184
165
  - test/fixture/testmod/Rakefile
185
166
  - test/fixture/testmod/files/example.dat
186
167
  - test/fixture/testmod/lib/utils.rb
168
+ - test/fixture/testmod/manifests/defined_type.pp
169
+ - test/fixture/testmod/manifests/defined_type/sub_manifest.pp
187
170
  - test/fixture/testmod/manifests/init.pp
188
171
  - test/fixture/testmod/templates/config.erb
189
172
  - test/fixture/testmod_small/Modulefile
@@ -208,17 +191,17 @@ require_paths:
208
191
  - lib
209
192
  required_ruby_version: !ruby/object:Gem::Requirement
210
193
  requirements:
211
- - - '>='
194
+ - - ">="
212
195
  - !ruby/object:Gem::Version
213
196
  version: '0'
214
197
  required_rubygems_version: !ruby/object:Gem::Requirement
215
198
  requirements:
216
- - - '>='
199
+ - - ">="
217
200
  - !ruby/object:Gem::Version
218
201
  version: '0'
219
202
  requirements: []
220
203
  rubyforge_project:
221
- rubygems_version: 2.0.7
204
+ rubygems_version: 2.2.0
222
205
  signing_key:
223
206
  specification_version: 4
224
207
  summary: Rake tasks for packaging Puppet modules
@@ -231,9 +214,12 @@ test_files:
231
214
  - test/fixture/testmod/Modulefile
232
215
  - test/fixture/testmod/Modulefile.no_name_or_author
233
216
  - test/fixture/testmod/Modulefile.no_version
217
+ - test/fixture/testmod/README.md
234
218
  - test/fixture/testmod/Rakefile
235
219
  - test/fixture/testmod/files/example.dat
236
220
  - test/fixture/testmod/lib/utils.rb
221
+ - test/fixture/testmod/manifests/defined_type.pp
222
+ - test/fixture/testmod/manifests/defined_type/sub_manifest.pp
237
223
  - test/fixture/testmod/manifests/init.pp
238
224
  - test/fixture/testmod/templates/config.erb
239
225
  - test/fixture/testmod_small/Modulefile
checksums.yaml.gz.sig DELETED
@@ -1 +0,0 @@
1
- P������N:�ĕ<��NV',���� ���X=Gd~�z���FU:M�uu��'�+b(���՞�T%"�$���Dd���Ie,)���ʗ�������Jp9Ou$ۂ|���u0�x.�絨V�d�^Q��9��"��A�W�F!�XBKK;��J>$mtS�<��cw�z�E�� �;��`�d����]6�қ ``s�d�ڡ{�nl������5��_�[:�-!�
data.tar.gz.sig DELETED
@@ -1 +0,0 @@
1
- ~�3��q�PjV$�z�w+�(�5Dۤʧ��x��n��QԌ%_���|M�(&�b�,C�=J���k-�NY�A�� �{���&P�"�/U����#��6� ��I��� �v6>��5[I[���>��ob���L !K�$d��:��CԿ a���Z���?]j�A��>'�v�c��ʌ�W��6��,�e��+r�CT�A��xz���?k�+=;?�Ξ���� ���H�[п�[���=��C^I2�
metadata.gz.sig DELETED
@@ -1 +0,0 @@
1
- 5��R�h�i��}gg�A���"Q��d5@��}?�Sg�Z�+�m$t� �9x!��@^�R�����ҟ��e�ڂͨ^��Ь��a�6�΄)ŝyR�5F�iDz���֊�3fl�ԅ�L����[Q����g)m��١,Yh~���v^c���k��2����r�(�(��F�mcG��z�6�Gv2���