write_xlsx 1.08.2 → 1.09.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/Changes +9 -0
  3. data/README.md +1 -1
  4. data/examples/background.rb +19 -0
  5. data/lib/write_xlsx/chart/axis.rb +3 -3
  6. data/lib/write_xlsx/chart/scatter.rb +0 -15
  7. data/lib/write_xlsx/chart/series.rb +1 -1
  8. data/lib/write_xlsx/chart.rb +28 -28
  9. data/lib/write_xlsx/chartsheet.rb +3 -3
  10. data/lib/write_xlsx/drawing.rb +39 -39
  11. data/lib/write_xlsx/format.rb +11 -179
  12. data/lib/write_xlsx/package/app.rb +2 -2
  13. data/lib/write_xlsx/package/button.rb +8 -8
  14. data/lib/write_xlsx/package/comments.rb +8 -8
  15. data/lib/write_xlsx/package/content_types.rb +18 -9
  16. data/lib/write_xlsx/package/core.rb +5 -5
  17. data/lib/write_xlsx/package/custom.rb +2 -2
  18. data/lib/write_xlsx/package/metadata.rb +159 -0
  19. data/lib/write_xlsx/package/packager.rb +21 -0
  20. data/lib/write_xlsx/package/shared_strings.rb +6 -6
  21. data/lib/write_xlsx/package/styles.rb +11 -11
  22. data/lib/write_xlsx/package/table.rb +23 -23
  23. data/lib/write_xlsx/package/theme.rb +1 -1
  24. data/lib/write_xlsx/package/vml.rb +43 -43
  25. data/lib/write_xlsx/shape.rb +17 -15
  26. data/lib/write_xlsx/sparkline.rb +340 -340
  27. data/lib/write_xlsx/utility.rb +4 -23
  28. data/lib/write_xlsx/version.rb +1 -1
  29. data/lib/write_xlsx/workbook.rb +171 -644
  30. data/lib/write_xlsx/worksheet/cell_data.rb +25 -3
  31. data/lib/write_xlsx/worksheet/data_validation.rb +20 -20
  32. data/lib/write_xlsx/worksheet/hyperlink.rb +4 -4
  33. data/lib/write_xlsx/worksheet/page_setup.rb +12 -12
  34. data/lib/write_xlsx/worksheet.rb +295 -4184
  35. data/test/perl_output/background.xlsx +0 -0
  36. data/test/regression/images/logo.gif +0 -0
  37. data/test/regression/images/logo.jpg +0 -0
  38. data/test/regression/images/red.gif +0 -0
  39. data/test/regression/test_background01.rb +23 -0
  40. data/test/regression/test_background02.rb +23 -0
  41. data/test/regression/test_background03.rb +24 -0
  42. data/test/regression/test_background04.rb +25 -0
  43. data/test/regression/test_background05.rb +25 -0
  44. data/test/regression/test_background06.rb +31 -0
  45. data/test/regression/test_background07.rb +37 -0
  46. data/test/regression/test_chart_axis47.rb +52 -0
  47. data/test/regression/test_chart_axis48.rb +53 -0
  48. data/test/regression/test_dynamic_array01.rb +25 -0
  49. data/test/regression/test_image56.rb +23 -0
  50. data/test/regression/test_image57.rb +23 -0
  51. data/test/regression/test_set_column10.rb +55 -0
  52. data/test/regression/test_set_column11.rb +48 -0
  53. data/test/regression/test_set_row01.rb +35 -0
  54. data/test/regression/test_set_row02.rb +35 -0
  55. data/test/regression/test_set_row03.rb +35 -0
  56. data/test/regression/test_set_row04.rb +35 -0
  57. data/test/regression/xlsx_files/background01.xlsx +0 -0
  58. data/test/regression/xlsx_files/background02.xlsx +0 -0
  59. data/test/regression/xlsx_files/background03.xlsx +0 -0
  60. data/test/regression/xlsx_files/background04.xlsx +0 -0
  61. data/test/regression/xlsx_files/background05.xlsx +0 -0
  62. data/test/regression/xlsx_files/background06.xlsx +0 -0
  63. data/test/regression/xlsx_files/background07.xlsx +0 -0
  64. data/test/regression/xlsx_files/chart_axis47.xlsx +0 -0
  65. data/test/regression/xlsx_files/chart_axis48.xlsx +0 -0
  66. data/test/regression/xlsx_files/dynamic_array01.xlsx +0 -0
  67. data/test/regression/xlsx_files/image56.xlsx +0 -0
  68. data/test/regression/xlsx_files/image57.xlsx +0 -0
  69. data/test/regression/xlsx_files/set_row01.xlsx +0 -0
  70. data/test/regression/xlsx_files/set_row03.xlsx +0 -0
  71. data/test/test_example_match.rb +12 -0
  72. data/test/worksheet/test_pixels_to_row_col.rb +46 -0
  73. metadata +78 -2
@@ -177,8 +177,8 @@ module Writexlsx
177
177
  #
178
178
  def write_textbox
179
179
  attributes = [
180
- ['style', 'mso-direction-alt:auto']
181
- ]
180
+ ['style', 'mso-direction-alt:auto']
181
+ ]
182
182
 
183
183
  @writer.tag_elements('v:textbox', attributes) do
184
184
  # Write the div element.
@@ -191,8 +191,8 @@ module Writexlsx
191
191
  #
192
192
  def write_client_data
193
193
  attributes = [
194
- ['ObjectType', 'Note']
195
- ]
194
+ ['ObjectType', 'Note']
195
+ ]
196
196
 
197
197
  @writer.tag_elements('x:ClientData', attributes) do
198
198
  @writer.empty_tag('x:MoveWithCells')
@@ -225,10 +225,10 @@ module Writexlsx
225
225
  @author = options[:author]
226
226
  @start_cell = options[:start_cell]
227
227
  @start_row, @start_col = if @start_cell
228
- substitute_cellref(@start_cell)
229
- else
230
- [ options[:start_row], options[:start_col] ]
231
- end
228
+ substitute_cellref(@start_cell)
229
+ else
230
+ [ options[:start_row], options[:start_col] ]
231
+ end
232
232
  @visible = options[:visible]
233
233
  @x_offset = options[:x_offset] || default_x_offset(col)
234
234
  @y_offset = options[:y_offset] || default_y_offset(row)
@@ -165,9 +165,9 @@ module Writexlsx
165
165
  #
166
166
  def add_table_name(table_name)
167
167
  add_override(
168
- "/xl/tables/#{table_name}.xml",
169
- "#{App_document}spreadsheetml.table+xml"
170
- )
168
+ "/xl/tables/#{table_name}.xml",
169
+ "#{App_document}spreadsheetml.table+xml"
170
+ )
171
171
  end
172
172
 
173
173
  #
@@ -187,6 +187,15 @@ module Writexlsx
187
187
  add_override(custom, "#{App_document}custom-properties+xml")
188
188
  end
189
189
 
190
+ #
191
+ # Add the metadata file to the ContentTypes overrides.
192
+ #
193
+ def add_metadata
194
+ add_override(
195
+ "/xl/metadata.xml",
196
+ "#{App_document}spreadsheetml.sheetMetadata+xml"
197
+ )
198
+ end
190
199
 
191
200
  private
192
201
 
@@ -219,10 +228,10 @@ module Writexlsx
219
228
 
220
229
  def write_default_or_override(tag, param0, a)
221
230
  @writer.empty_tag(tag,
222
- [
223
- [param0, a[0]],
224
- ['ContentType', a[1]]
225
- ])
231
+ [
232
+ [param0, a[0]],
233
+ ['ContentType', a[1]]
234
+ ])
226
235
  end
227
236
 
228
237
  #
@@ -231,8 +240,8 @@ module Writexlsx
231
240
  def write_types
232
241
  xmlns = 'http://schemas.openxmlformats.org/package/2006/content-types'
233
242
  attributes = [
234
- ['xmlns', xmlns]
235
- ]
243
+ ['xmlns', xmlns]
244
+ ]
236
245
 
237
246
  @writer.tag_elements('Types', attributes) { yield }
238
247
  end
@@ -68,11 +68,11 @@ module Writexlsx
68
68
  xmlns_xsi = 'http://www.w3.org/2001/XMLSchema-instance'
69
69
 
70
70
  attributes = [
71
- ['xmlns:cp', xmlns_cp],
72
- ['xmlns:dc', xmlns_dc],
73
- ['xmlns:dcterms', xmlns_dcterms],
74
- ['xmlns:dcmitype', xmlns_dcmitype],
75
- ['xmlns:xsi', xmlns_xsi]
71
+ ['xmlns:cp', xmlns_cp],
72
+ ['xmlns:dc', xmlns_dc],
73
+ ['xmlns:dcterms', xmlns_dcterms],
74
+ ['xmlns:dcmitype', xmlns_dcmitype],
75
+ ['xmlns:xsi', xmlns_xsi]
76
76
  ]
77
77
 
78
78
  @writer.tag_elements('cp:coreProperties', attributes) { yield }
@@ -47,7 +47,7 @@ module Writexlsx
47
47
  @properties.each do |property|
48
48
  # Write the property element.
49
49
  write_property(property)
50
- end
50
+ end
51
51
  end
52
52
  end
53
53
 
@@ -112,7 +112,7 @@ module Writexlsx
112
112
  end
113
113
 
114
114
  @writer.data_element('vt:bool', data)
115
- end
115
+ end
116
116
 
117
117
  #
118
118
  # Write the <vt:filetime> element.
@@ -0,0 +1,159 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'write_xlsx/package/xml_writer_simple'
3
+ require 'write_xlsx/utility'
4
+
5
+ module Writexlsx
6
+ module Package
7
+ #
8
+ # Metadata - A class for writing the Excel XLSX metadata.xml file.
9
+ #
10
+ class Metadata
11
+ include Writexlsx::Utility
12
+
13
+ def initialize(workbook)
14
+ @writer = Package::XMLWriterSimple.new
15
+ @workbook = workbook
16
+ end
17
+
18
+ def set_xml_writer(filename)
19
+ @writer.set_xml_writer(filename)
20
+ end
21
+
22
+ def assemble_xml_file
23
+ write_xml_declaration do
24
+ # Write the metadata element.
25
+ write_metadata
26
+ # Write the metadataTypes element.
27
+ write_metadata_types
28
+ # Write the futureMetadata element.
29
+ write_future_metadata
30
+ # Write the cellMetadata element.
31
+ write_cell_metadata
32
+ @writer.end_tag('metadata')
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ #
39
+ # Write the <metadata> element.
40
+ #
41
+ def write_metadata
42
+ xmlns = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'
43
+ xmlns_xda =
44
+ 'http://schemas.microsoft.com/office/spreadsheetml/2017/dynamicarray'
45
+
46
+ attributes = [
47
+ ['xmlns', xmlns],
48
+ ['xmlns:xda', xmlns_xda]
49
+ ]
50
+
51
+ @writer.start_tag('metadata', attributes)
52
+ end
53
+
54
+ #
55
+ # Write the <metadataTypes> element.
56
+ #
57
+ def write_metadata_types
58
+ attributes = [['count', 1 ]]
59
+
60
+ @writer.tag_elements('metadataTypes', attributes) do
61
+ # Write the metadataType element.
62
+ write_metadata_type
63
+ end
64
+ end
65
+
66
+ #
67
+ # Write the <metadataType> element.
68
+ #
69
+ def write_metadata_type
70
+ attributes = [
71
+ ['name', 'XLDAPR'],
72
+ ['minSupportedVersion', 120000],
73
+ ['copy', 1],
74
+ ['pasteAll', 1],
75
+ ['pasteValues', 1],
76
+ ['merge', 1],
77
+ ['splitFirst', 1],
78
+ ['rowColShift', 1],
79
+ ['clearFormats', 1],
80
+ ['clearComments', 1],
81
+ ['assign', 1],
82
+ ['coerce', 1],
83
+ ['cellMeta', 1]
84
+ ]
85
+
86
+ @writer.empty_tag('metadataType', attributes)
87
+ end
88
+
89
+ #
90
+ # Write the <futureMetadata> element.
91
+ #
92
+ def write_future_metadata
93
+ attributes = [
94
+ ['name', 'XLDAPR'],
95
+ ['count', 1]
96
+ ]
97
+
98
+ @writer.tag_elements('futureMetadata', attributes) do
99
+ @writer.tag_elements('bk') do
100
+ @writer.tag_elements('extLst') do
101
+ # Write the ext element.
102
+ write_ext();
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ #
109
+ # Write the <ext> element.
110
+ #
111
+ def write_ext
112
+ attributes = [[ 'uri', '{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}']]
113
+ @writer.tag_elements('ext', attributes) do
114
+ # Write the xda:dynamicArrayProperties element.
115
+ write_xda_dynamic_array_properties
116
+ end
117
+ end
118
+
119
+ #
120
+ # Write the <xda:dynamicArrayProperties> element.
121
+ #
122
+ def write_xda_dynamic_array_properties
123
+ attributes = [
124
+ ['fDynamic', 1],
125
+ ['fCollapsed', 0]
126
+ ]
127
+
128
+ @writer.empty_tag('xda:dynamicArrayProperties', attributes)
129
+ end
130
+
131
+ #
132
+ # Write the <cellMetadata> element.
133
+ #
134
+ def write_cell_metadata
135
+ count = 1
136
+
137
+ attributes = [['count', count]]
138
+
139
+ @writer.tag_elements('cellMetadata', attributes) do
140
+ @writer.tag_elements('bk') do
141
+ # Write the rc element.
142
+ write_rc
143
+ end
144
+ end
145
+ end
146
+
147
+ #
148
+ # Write the <rc> element.
149
+ #
150
+ def write_rc
151
+ attributes = [
152
+ ['t', 1],
153
+ ['v', 0]
154
+ ]
155
+ @writer.empty_tag('rc', attributes)
156
+ end
157
+ end
158
+ end
159
+ end
@@ -6,6 +6,7 @@ require 'write_xlsx/package/comments'
6
6
  require 'write_xlsx/package/content_types'
7
7
  require 'write_xlsx/package/core'
8
8
  require 'write_xlsx/package/custom'
9
+ require 'write_xlsx/package/metadata'
9
10
  require 'write_xlsx/package/relationships'
10
11
  require 'write_xlsx/package/shared_strings'
11
12
  require 'write_xlsx/package/styles'
@@ -56,6 +57,7 @@ module Writexlsx
56
57
  write_drawing_rels_files
57
58
  add_image_files
58
59
  add_vba_project
60
+ write_metadata_file
59
61
  end
60
62
 
61
63
  private
@@ -175,6 +177,20 @@ module Writexlsx
175
177
  core.assemble_xml_file
176
178
  end
177
179
 
180
+ #
181
+ # Write the metadata.xml file.
182
+ #
183
+ def write_metadata_file
184
+ metadata = Package::Metadata.new(@workbook)
185
+
186
+ return unless @workbook.has_metadata?
187
+
188
+ FileUtils.mkdir_p("#{@package_dir}/xl")
189
+
190
+ metadata.set_xml_writer( "#{@package_dir}/xl/metadata.xml")
191
+ metadata.assemble_xml_file
192
+ end
193
+
178
194
  #
179
195
  # Write the custom.xml file.
180
196
  #
@@ -211,6 +227,8 @@ module Writexlsx
211
227
  content.add_vba_project if @workbook.vba_project
212
228
  # Add the custom properties if present.
213
229
  content.add_custom_properties unless @workbook.custom_properties.empty?
230
+ # Add the metadata file if present.
231
+ content.add_metadata if @workbook.has_metadata?
214
232
 
215
233
  content.set_xml_writer("#{@package_dir}/[Content_Types].xml")
216
234
  content.assemble_xml_file
@@ -305,6 +323,9 @@ module Writexlsx
305
323
  rels.add_ms_package_relationship('/vbaProject', 'vbaProject.bin')
306
324
  end
307
325
 
326
+ # Add the metadata file if required.
327
+ rels.add_document_relationship('/sheetMetadata', 'metadata.xml') if @workbook.has_metadata?
328
+
308
329
  rels.set_xml_writer("#{@package_dir}/xl/_rels/workbook.xml.rels")
309
330
  rels.assemble_xml_file
310
331
  end
@@ -63,9 +63,9 @@ module Writexlsx
63
63
 
64
64
  attributes =
65
65
  [
66
- ['xmlns', schema + '/spreadsheetml/2006/main'],
67
- ['count', total_count],
68
- ['uniqueCount', unique_count]
66
+ ['xmlns', schema + '/spreadsheetml/2006/main'],
67
+ ['count', total_count],
68
+ ['uniqueCount', unique_count]
69
69
  ]
70
70
 
71
71
  @writer.tag_elements('sst', attributes) { yield }
@@ -94,9 +94,9 @@ module Writexlsx
94
94
 
95
95
  # Convert control character to the _xHHHH_ escape.
96
96
  string = string.gsub(
97
- /([\x00-\x08\x0B-\x1F])/,
98
- sprintf("_x%04X_", $1.ord)
99
- ) if string =~ /([\x00-\x08\x0B-\x1F])/
97
+ /([\x00-\x08\x0B-\x1F])/,
98
+ sprintf("_x%04X_", $1.ord)
99
+ ) if string =~ /([\x00-\x08\x0B-\x1F])/
100
100
 
101
101
  # Convert character to \xC2\xxx or \xC3\xxx
102
102
  if string.bytesize == 1 && 0x80 <= string.ord && string.ord <= 0xFF
@@ -56,11 +56,11 @@ module Writexlsx
56
56
  # based on the default or user defined values in the Workbook palette.
57
57
  #
58
58
  def palette_color(index)
59
- if index.to_s =~ /^#([0-9A-F]{6})$/i
60
- "FF#{$1.upcase}"
61
- else
62
- "FF#{super(index)}"
63
- end
59
+ if index.to_s =~ /^#([0-9A-F]{6})$/i
60
+ "FF#{$1.upcase}"
61
+ else
62
+ "FF#{super(index)}"
63
+ end
64
64
  end
65
65
 
66
66
  #
@@ -526,9 +526,9 @@ module Writexlsx
526
526
  #
527
527
  def write_cell_style(name, xf_id, builtin_id)
528
528
  attributes = [
529
- ['name', name],
530
- ['xfId', xf_id],
531
- ['builtinId', builtin_id]
529
+ ['name', name],
530
+ ['xfId', xf_id],
531
+ ['builtinId', builtin_id]
532
532
  ]
533
533
 
534
534
  @writer.empty_tag('cellStyle', attributes)
@@ -570,9 +570,9 @@ module Writexlsx
570
570
  #
571
571
  def write_table_styles
572
572
  attributes = [
573
- ['count', 0],
574
- ['defaultTableStyle', 'TableStyleMedium9'],
575
- ['defaultPivotStyle', 'PivotStyleLight16']
573
+ ['count', 0],
574
+ ['defaultTableStyle', 'TableStyleMedium9'],
575
+ ['defaultPivotStyle', 'PivotStyleLight16']
576
576
  ]
577
577
 
578
578
  @writer.empty_tag('tableStyles', attributes)
@@ -117,8 +117,8 @@ module Writexlsx
117
117
  )
118
118
  elsif user_data[:total_string]
119
119
  total_label_only(
120
- @row2, col_num, col_data, user_data[:total_string], user_data[:format]
121
- )
120
+ @row2, col_num, col_data, user_data[:total_string], user_data[:format]
121
+ )
122
122
  end
123
123
 
124
124
  # Get the dxf format index.
@@ -181,7 +181,7 @@ module Writexlsx
181
181
  row1, row2 = row2, row1 if row1 > row2
182
182
  col1, col2 = col2, col1 if col1 > col2
183
183
 
184
- # The final hash contains the validation parameters.
184
+ # The final hash contains the validation parameters.
185
185
  param ||= {}
186
186
 
187
187
  # Turn on Excel's defaults.
@@ -208,17 +208,17 @@ module Writexlsx
208
208
  # List of valid input parameters.
209
209
  def valid_table_parameter
210
210
  [
211
- :autofilter,
212
- :banded_columns,
213
- :banded_rows,
214
- :columns,
215
- :data,
216
- :first_column,
217
- :header_row,
218
- :last_column,
219
- :name,
220
- :style,
221
- :total_row
211
+ :autofilter,
212
+ :banded_columns,
213
+ :banded_rows,
214
+ :columns,
215
+ :data,
216
+ :first_column,
217
+ :header_row,
218
+ :last_column,
219
+ :name,
220
+ :style,
221
+ :total_row
222
222
  ]
223
223
  end
224
224
 
@@ -331,12 +331,12 @@ module Writexlsx
331
331
  xmlns = "#{schema}spreadsheetml/2006/main"
332
332
 
333
333
  attributes = [
334
- ['xmlns', xmlns],
335
- ['id', id],
336
- ['name', @name],
337
- ['displayName', @name],
338
- ['ref', @range]
339
- ]
334
+ ['xmlns', xmlns],
335
+ ['id', id],
336
+ ['name', @name],
337
+ ['displayName', @name],
338
+ ['ref', @range]
339
+ ]
340
340
 
341
341
  unless ptrue?(@header_row_count)
342
342
  attributes << ['headerRowCount', 0]
@@ -378,9 +378,9 @@ module Writexlsx
378
378
  #
379
379
  def write_table_column(col_data)
380
380
  attributes = [
381
- ['id', col_data.id],
382
- ['name', col_data.name]
383
- ]
381
+ ['id', col_data.id],
382
+ ['name', col_data.name]
383
+ ]
384
384
 
385
385
  if ptrue?(col_data.total_string)
386
386
  attributes << [:totalsRowLabel, col_data.total_string]
@@ -36,7 +36,7 @@ module Writexlsx
36
36
  #
37
37
  def write_theme_file
38
38
  theme =
39
- %Q{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
39
+ %Q{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
40
40
  <a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink><a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Arial"/><a:font script="Hebr" typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>}
41
41
  @writer.write(theme)
42
42
  end