write_xlsx 1.08.2 → 1.09.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.
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