python-pptx2 2.13.0__py3-none-any.whl
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.
- pptx2/__init__.py +152 -0
- pptx2/_color.py +75 -0
- pptx2/_slide_importer.py +597 -0
- pptx2/_svg.py +155 -0
- pptx2/_template_applier.py +292 -0
- pptx2/_textstyle.py +187 -0
- pptx2/accessibility.py +365 -0
- pptx2/action.py +270 -0
- pptx2/animation.py +2237 -0
- pptx2/api.py +49 -0
- pptx2/audit.py +258 -0
- pptx2/chart/__init__.py +0 -0
- pptx2/chart/analytics.py +381 -0
- pptx2/chart/axis.py +543 -0
- pptx2/chart/category.py +200 -0
- pptx2/chart/chart.py +670 -0
- pptx2/chart/data.py +864 -0
- pptx2/chart/datalabel.py +406 -0
- pptx2/chart/legend.py +86 -0
- pptx2/chart/marker.py +70 -0
- pptx2/chart/palettes.py +129 -0
- pptx2/chart/plot.py +462 -0
- pptx2/chart/point.py +101 -0
- pptx2/chart/quick_layouts.py +325 -0
- pptx2/chart/series.py +334 -0
- pptx2/chart/xlsx.py +272 -0
- pptx2/chart/xmlwriter.py +1845 -0
- pptx2/compose/__init__.py +28 -0
- pptx2/compose/from_spec.py +1094 -0
- pptx2/design/__init__.py +8 -0
- pptx2/design/components.py +607 -0
- pptx2/design/figures.py +389 -0
- pptx2/design/layout.py +370 -0
- pptx2/design/recipes.py +1967 -0
- pptx2/design/style.py +209 -0
- pptx2/design/tokens.py +915 -0
- pptx2/diagrams.py +754 -0
- pptx2/dml/__init__.py +0 -0
- pptx2/dml/chtfmt.py +40 -0
- pptx2/dml/color.py +496 -0
- pptx2/dml/effect.py +909 -0
- pptx2/dml/fill.py +691 -0
- pptx2/dml/line.py +287 -0
- pptx2/dml/picture.py +212 -0
- pptx2/dml/three_d.py +381 -0
- pptx2/enum/__init__.py +0 -0
- pptx2/enum/action.py +71 -0
- pptx2/enum/animation.py +31 -0
- pptx2/enum/base.py +218 -0
- pptx2/enum/chart.py +574 -0
- pptx2/enum/dml.py +740 -0
- pptx2/enum/lang.py +685 -0
- pptx2/enum/presentation.py +133 -0
- pptx2/enum/shapes.py +1029 -0
- pptx2/enum/text.py +230 -0
- pptx2/exc.py +42 -0
- pptx2/formats.py +139 -0
- pptx2/geometry.py +420 -0
- pptx2/inherit.py +109 -0
- pptx2/lint.py +2256 -0
- pptx2/math.py +177 -0
- pptx2/media.py +197 -0
- pptx2/opc/__init__.py +0 -0
- pptx2/opc/constants.py +332 -0
- pptx2/opc/oxml.py +188 -0
- pptx2/opc/package.py +762 -0
- pptx2/opc/packuri.py +109 -0
- pptx2/opc/serialized.py +296 -0
- pptx2/opc/shared.py +20 -0
- pptx2/opc/spec.py +45 -0
- pptx2/oxml/__init__.py +555 -0
- pptx2/oxml/action.py +53 -0
- pptx2/oxml/chart/__init__.py +0 -0
- pptx2/oxml/chart/axis.py +337 -0
- pptx2/oxml/chart/chart.py +481 -0
- pptx2/oxml/chart/datalabel.py +253 -0
- pptx2/oxml/chart/legend.py +72 -0
- pptx2/oxml/chart/marker.py +61 -0
- pptx2/oxml/chart/plot.py +365 -0
- pptx2/oxml/chart/series.py +425 -0
- pptx2/oxml/chart/shared.py +220 -0
- pptx2/oxml/coreprops.py +288 -0
- pptx2/oxml/dml/__init__.py +0 -0
- pptx2/oxml/dml/color.py +135 -0
- pptx2/oxml/dml/effect.py +213 -0
- pptx2/oxml/dml/fill.py +316 -0
- pptx2/oxml/dml/line.py +12 -0
- pptx2/oxml/dml/three_d.py +110 -0
- pptx2/oxml/ns.py +135 -0
- pptx2/oxml/presentation.py +313 -0
- pptx2/oxml/shapes/__init__.py +19 -0
- pptx2/oxml/shapes/autoshape.py +467 -0
- pptx2/oxml/shapes/connector.py +107 -0
- pptx2/oxml/shapes/graphfrm.py +347 -0
- pptx2/oxml/shapes/groupshape.py +329 -0
- pptx2/oxml/shapes/picture.py +270 -0
- pptx2/oxml/shapes/shared.py +577 -0
- pptx2/oxml/simpletypes.py +1027 -0
- pptx2/oxml/slide.py +563 -0
- pptx2/oxml/table.py +650 -0
- pptx2/oxml/text.py +815 -0
- pptx2/oxml/theme.py +36 -0
- pptx2/oxml/xmlchemy.py +717 -0
- pptx2/package.py +222 -0
- pptx2/parts/__init__.py +0 -0
- pptx2/parts/chart.py +95 -0
- pptx2/parts/coreprops.py +167 -0
- pptx2/parts/diagram.py +37 -0
- pptx2/parts/embeddedpackage.py +93 -0
- pptx2/parts/image.py +275 -0
- pptx2/parts/media.py +37 -0
- pptx2/parts/presentation.py +136 -0
- pptx2/parts/slide.py +371 -0
- pptx2/presentation.py +408 -0
- pptx2/py.typed +0 -0
- pptx2/render.py +586 -0
- pptx2/section.py +272 -0
- pptx2/shapes/__init__.py +26 -0
- pptx2/shapes/autoshape.py +442 -0
- pptx2/shapes/base.py +1078 -0
- pptx2/shapes/connector.py +297 -0
- pptx2/shapes/freeform.py +337 -0
- pptx2/shapes/graphfrm.py +316 -0
- pptx2/shapes/group.py +264 -0
- pptx2/shapes/picture.py +422 -0
- pptx2/shapes/placeholder.py +468 -0
- pptx2/shapes/shapetree.py +2027 -0
- pptx2/shared.py +82 -0
- pptx2/skill/SKILL.md +450 -0
- pptx2/skill/__init__.py +78 -0
- pptx2/skill/__main__.py +64 -0
- pptx2/skill/references/animations.md +189 -0
- pptx2/skill/references/basics.md +421 -0
- pptx2/skill/references/charts.md +254 -0
- pptx2/skill/references/compose.md +234 -0
- pptx2/skill/references/design.md +366 -0
- pptx2/skill/references/effects.md +249 -0
- pptx2/skill/references/end-to-end-deck.md +231 -0
- pptx2/skill/references/geometry-and-arrows.md +334 -0
- pptx2/skill/references/lint.md +275 -0
- pptx2/skill/references/math.md +86 -0
- pptx2/skill/references/picture-effects.md +129 -0
- pptx2/skill/references/render.md +151 -0
- pptx2/skill/references/smart-art.md +75 -0
- pptx2/skill/references/space-aware-authoring.md +249 -0
- pptx2/skill/references/tables.md +244 -0
- pptx2/skill/references/theme.md +127 -0
- pptx2/skill/references/three-d.md +109 -0
- pptx2/skill/references/transitions.md +100 -0
- pptx2/slide.py +1244 -0
- pptx2/smart_art.py +220 -0
- pptx2/spec.py +633 -0
- pptx2/table.py +1181 -0
- pptx2/table_styles.py +184 -0
- pptx2/templates/default.pptx +0 -0
- pptx2/templates/docx-icon.emf +0 -0
- pptx2/templates/generic-icon.emf +0 -0
- pptx2/templates/notes.xml +23 -0
- pptx2/templates/notesMaster.xml +352 -0
- pptx2/templates/pptx-icon.emf +0 -0
- pptx2/templates/theme.xml +321 -0
- pptx2/templates/xlsx-icon.emf +0 -0
- pptx2/text/__init__.py +0 -0
- pptx2/text/fonts.py +482 -0
- pptx2/text/layout.py +374 -0
- pptx2/text/text.py +1272 -0
- pptx2/theme.py +721 -0
- pptx2/types.py +36 -0
- pptx2/util.py +263 -0
- python_pptx2-2.13.0.dist-info/METADATA +351 -0
- python_pptx2-2.13.0.dist-info/RECORD +175 -0
- python_pptx2-2.13.0.dist-info/WHEEL +5 -0
- python_pptx2-2.13.0.dist-info/entry_points.txt +3 -0
- python_pptx2-2.13.0.dist-info/licenses/LICENSE +22 -0
- python_pptx2-2.13.0.dist-info/top_level.txt +1 -0
pptx2/math.py
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""Native PowerPoint equations from LaTeX.
|
|
2
|
+
|
|
3
|
+
PowerPoint stores editable equations as Office Math (OMML) wrapped in an
|
|
4
|
+
``a14:m`` marker inside a DrawingML paragraph. This module does not compile
|
|
5
|
+
LaTeX itself: it calls ``latex2mathml`` then ``mathml2omml`` and wraps the
|
|
6
|
+
result so PowerPoint will open it.
|
|
7
|
+
|
|
8
|
+
Install the converters with::
|
|
9
|
+
|
|
10
|
+
pip install "python-pptx2[math]"
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import re
|
|
16
|
+
from typing import TYPE_CHECKING, Any
|
|
17
|
+
|
|
18
|
+
from lxml import etree
|
|
19
|
+
|
|
20
|
+
from pptx2.oxml import parse_xml
|
|
21
|
+
from pptx2.oxml.ns import nsuri, qn
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from pptx2.oxml.text import CT_OfficeMathMarker
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
A14_NS = nsuri("a14")
|
|
28
|
+
M_NS = nsuri("m")
|
|
29
|
+
|
|
30
|
+
_WRAPPER_PATTERNS = (
|
|
31
|
+
re.compile(r"^\s*\$\$(.*)\$\$\s*$", re.DOTALL),
|
|
32
|
+
re.compile(r"^\s*\\\[(.*)\\\]\s*$", re.DOTALL),
|
|
33
|
+
re.compile(r"^\s*\\\((.*)\\\)\s*$", re.DOTALL),
|
|
34
|
+
re.compile(r"^\s*\$(.*)\$\s*$", re.DOTALL),
|
|
35
|
+
re.compile(
|
|
36
|
+
r"^\s*\\begin\{(equation\*?|align\*?|displaymath|math)\}"
|
|
37
|
+
r"(.*)\\end\{\1\}\s*$",
|
|
38
|
+
re.DOTALL,
|
|
39
|
+
),
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
_DISPLAY_JC = {
|
|
43
|
+
"left": "left",
|
|
44
|
+
"right": "right",
|
|
45
|
+
"center": "centerGroup",
|
|
46
|
+
"centre": "centerGroup",
|
|
47
|
+
"justify": "centerGroup",
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class MathBackendUnavailable(ImportError):
|
|
52
|
+
"""Raised when the optional LaTeX → OMML converters are not installed."""
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def strip_math_delimiters(source: str) -> str:
|
|
56
|
+
"""Return *source* without a single outer ``$…$`` / ``\\[…\\]`` / env wrapper."""
|
|
57
|
+
text = (source or "").strip()
|
|
58
|
+
for pattern in _WRAPPER_PATTERNS:
|
|
59
|
+
match = pattern.match(text)
|
|
60
|
+
if match:
|
|
61
|
+
return match.group(match.lastindex or 1).strip()
|
|
62
|
+
return text
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def latex_to_omml(latex: str) -> str:
|
|
66
|
+
"""Convert a LaTeX math fragment to an ``<m:oMath>…`` OMML string.
|
|
67
|
+
|
|
68
|
+
Accepts a bare fragment or a common wrapper (``$…$``, ``$$…$$``,
|
|
69
|
+
``\\(…\\)``, ``\\[…\\]``, ``equation`` / ``align`` environments).
|
|
70
|
+
"""
|
|
71
|
+
fragment = strip_math_delimiters(latex)
|
|
72
|
+
if not fragment:
|
|
73
|
+
raise ValueError("latex must be a non-empty math fragment")
|
|
74
|
+
|
|
75
|
+
converter, mathml2omml = _import_math_backends()
|
|
76
|
+
try:
|
|
77
|
+
mathml = converter.convert(fragment)
|
|
78
|
+
except Exception as exc:
|
|
79
|
+
raise ValueError(f"LaTeX could not be converted to MathML: {exc}") from exc
|
|
80
|
+
try:
|
|
81
|
+
omml = mathml2omml.convert(mathml)
|
|
82
|
+
except Exception as exc:
|
|
83
|
+
raise ValueError(f"MathML could not be converted to Office Math: {exc}") from exc
|
|
84
|
+
if not isinstance(omml, str) or not omml.strip():
|
|
85
|
+
raise ValueError("mathml2omml returned empty OMML")
|
|
86
|
+
return omml.strip()
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def office_math_element(
|
|
90
|
+
latex: str,
|
|
91
|
+
*,
|
|
92
|
+
display: bool = False,
|
|
93
|
+
align: str | None = None,
|
|
94
|
+
) -> CT_OfficeMathMarker:
|
|
95
|
+
"""Return an ``a14:m`` element ready to append to a DrawingML paragraph."""
|
|
96
|
+
payload = _omml_payload(latex_to_omml(latex), display=display, align=align)
|
|
97
|
+
xml = f'<a14:m xmlns:a14="{A14_NS}" xmlns:m="{M_NS}">{payload}</a14:m>'
|
|
98
|
+
return parse_xml(xml)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def style_office_math(
|
|
102
|
+
marker: Any,
|
|
103
|
+
*,
|
|
104
|
+
size_pt: float | None = None,
|
|
105
|
+
color: Any = None,
|
|
106
|
+
font: str | None = None,
|
|
107
|
+
) -> None:
|
|
108
|
+
"""Write run-level size / color / typeface onto each ``m:r`` inside *marker*."""
|
|
109
|
+
if size_pt is None and color is None and font is None:
|
|
110
|
+
return
|
|
111
|
+
|
|
112
|
+
from pptx2._color import coerce_color
|
|
113
|
+
|
|
114
|
+
sz = None if size_pt is None else str(int(round(float(size_pt) * 100)))
|
|
115
|
+
rgb = None if color is None else str(coerce_color(color))
|
|
116
|
+
|
|
117
|
+
for run in marker.iter(qn("m:r")):
|
|
118
|
+
rPr = run.find(qn("a:rPr"))
|
|
119
|
+
if rPr is None:
|
|
120
|
+
rPr = etree.Element(qn("a:rPr"))
|
|
121
|
+
text = run.find(qn("m:t"))
|
|
122
|
+
if text is not None:
|
|
123
|
+
text.addprevious(rPr)
|
|
124
|
+
else:
|
|
125
|
+
run.append(rPr)
|
|
126
|
+
if sz is not None:
|
|
127
|
+
rPr.set("sz", sz)
|
|
128
|
+
if font is not None:
|
|
129
|
+
latin = rPr.find(qn("a:latin"))
|
|
130
|
+
if latin is None:
|
|
131
|
+
latin = etree.SubElement(rPr, qn("a:latin"))
|
|
132
|
+
latin.set("typeface", font)
|
|
133
|
+
if rgb is not None:
|
|
134
|
+
solid = rPr.find(qn("a:solidFill"))
|
|
135
|
+
if solid is None:
|
|
136
|
+
solid = etree.Element(qn("a:solidFill"))
|
|
137
|
+
rPr.insert(0, solid)
|
|
138
|
+
srgb = solid.find(qn("a:srgbClr"))
|
|
139
|
+
if srgb is None:
|
|
140
|
+
srgb = etree.SubElement(solid, qn("a:srgbClr"))
|
|
141
|
+
srgb.set("val", rgb)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def _omml_payload(omml: str, *, display: bool, align: str | None) -> str:
|
|
145
|
+
if omml.startswith("<m:oMathPara"):
|
|
146
|
+
return omml
|
|
147
|
+
inner = omml if omml.startswith("<m:oMath") else f"<m:oMath>{omml}</m:oMath>"
|
|
148
|
+
if not display:
|
|
149
|
+
return inner
|
|
150
|
+
jc = _DISPLAY_JC.get((align or "center").lower(), "centerGroup")
|
|
151
|
+
return (
|
|
152
|
+
"<m:oMathPara>"
|
|
153
|
+
f'<m:oMathParaPr><m:jc m:val="{jc}"/></m:oMathParaPr>'
|
|
154
|
+
f"{inner}"
|
|
155
|
+
"</m:oMathPara>"
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _import_math_backends():
|
|
160
|
+
try:
|
|
161
|
+
import latex2mathml.converter as latex2mathml_converter
|
|
162
|
+
import mathml2omml
|
|
163
|
+
except ImportError as exc:
|
|
164
|
+
raise MathBackendUnavailable(
|
|
165
|
+
"Native PowerPoint equations require the latex2mathml and "
|
|
166
|
+
"mathml2omml packages. Install with: pip install 'python-pptx2[math]'"
|
|
167
|
+
) from exc
|
|
168
|
+
return latex2mathml_converter, mathml2omml
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
__all__ = (
|
|
172
|
+
"MathBackendUnavailable",
|
|
173
|
+
"latex_to_omml",
|
|
174
|
+
"office_math_element",
|
|
175
|
+
"strip_math_delimiters",
|
|
176
|
+
"style_office_math",
|
|
177
|
+
)
|
pptx2/media.py
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"""Objects related to images, audio, and video."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import base64
|
|
6
|
+
import hashlib
|
|
7
|
+
import os
|
|
8
|
+
from typing import IO
|
|
9
|
+
|
|
10
|
+
from pptx2.opc.constants import CONTENT_TYPE as CT
|
|
11
|
+
from pptx2.util import lazyproperty
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Video(object):
|
|
15
|
+
"""Immutable value object representing a video such as MP4."""
|
|
16
|
+
|
|
17
|
+
def __init__(self, blob: bytes, mime_type: str | None, filename: str | None):
|
|
18
|
+
super(Video, self).__init__()
|
|
19
|
+
self._blob = blob
|
|
20
|
+
self._mime_type = mime_type
|
|
21
|
+
self._filename = filename
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def from_blob(cls, blob: bytes, mime_type: str | None, filename: str | None = None):
|
|
25
|
+
"""Return a new |Video| object loaded from image binary in *blob*."""
|
|
26
|
+
return cls(blob, mime_type, filename)
|
|
27
|
+
|
|
28
|
+
@classmethod
|
|
29
|
+
def from_path_or_file_like(cls, movie_file: str | IO[bytes], mime_type: str | None) -> Video:
|
|
30
|
+
"""Return a new |Video| object containing video in *movie_file*.
|
|
31
|
+
|
|
32
|
+
*movie_file* can be either a path (string) or a file-like
|
|
33
|
+
(e.g. StringIO) object.
|
|
34
|
+
"""
|
|
35
|
+
if isinstance(movie_file, str):
|
|
36
|
+
# treat movie_file as a path
|
|
37
|
+
with open(movie_file, "rb") as f:
|
|
38
|
+
blob = f.read()
|
|
39
|
+
filename = os.path.basename(movie_file)
|
|
40
|
+
else:
|
|
41
|
+
# assume movie_file is a file-like object
|
|
42
|
+
blob = movie_file.read()
|
|
43
|
+
filename = None
|
|
44
|
+
|
|
45
|
+
return cls.from_blob(blob, mime_type, filename)
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def blob(self):
|
|
49
|
+
"""The bytestream of the media "file"."""
|
|
50
|
+
return self._blob
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def content_type(self):
|
|
54
|
+
"""MIME-type of this media, e.g. `'video/mp4'`."""
|
|
55
|
+
return self._mime_type
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def ext(self):
|
|
59
|
+
"""Return the file extension for this video, e.g. 'mp4'.
|
|
60
|
+
|
|
61
|
+
The extension is that from the actual filename if known. Otherwise
|
|
62
|
+
it is the lowercase canonical extension for the video's MIME type.
|
|
63
|
+
'vid' is used if the MIME type is 'video/unknown'.
|
|
64
|
+
"""
|
|
65
|
+
if self._filename:
|
|
66
|
+
return os.path.splitext(self._filename)[1].lstrip(".")
|
|
67
|
+
return {
|
|
68
|
+
CT.ASF: "asf",
|
|
69
|
+
CT.AVI: "avi",
|
|
70
|
+
CT.MOV: "mov",
|
|
71
|
+
CT.MP4: "mp4",
|
|
72
|
+
CT.MPG: "mpg",
|
|
73
|
+
CT.MS_VIDEO: "avi",
|
|
74
|
+
CT.SWF: "swf",
|
|
75
|
+
CT.WMV: "wmv",
|
|
76
|
+
CT.X_MS_VIDEO: "avi",
|
|
77
|
+
}.get(self._mime_type, "vid")
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def filename(self) -> str:
|
|
81
|
+
"""Return a filename.ext string appropriate to this video.
|
|
82
|
+
|
|
83
|
+
The base filename from the original path is used if this image was
|
|
84
|
+
loaded from the filesystem. If no filename is available, such as when
|
|
85
|
+
the video object is created from an in-memory stream, the string
|
|
86
|
+
'movie.{ext}' is used where 'ext' is suitable to the video format,
|
|
87
|
+
such as 'mp4'.
|
|
88
|
+
"""
|
|
89
|
+
if self._filename is not None:
|
|
90
|
+
return self._filename
|
|
91
|
+
return "movie.%s" % self.ext
|
|
92
|
+
|
|
93
|
+
@lazyproperty
|
|
94
|
+
def sha1(self):
|
|
95
|
+
"""The SHA1 hash digest for the binary "file" of this video.
|
|
96
|
+
|
|
97
|
+
Example: `'1be010ea47803b00e140b852765cdf84f491da47'`
|
|
98
|
+
"""
|
|
99
|
+
return hashlib.sha1(self._blob).hexdigest()
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
SPEAKER_IMAGE_BYTES = base64.b64decode(
|
|
103
|
+
"iVBORw0KGgoAAAANSUhEUgAAAHgAAAA3CAYAAADHao5rAAAACXBIWXMAAAsTAAALEwEAmpw"
|
|
104
|
+
"YAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUh"
|
|
105
|
+
"UIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74"
|
|
106
|
+
"Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz"
|
|
107
|
+
"/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEB"
|
|
108
|
+
"GAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVo"
|
|
109
|
+
"pFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8"
|
|
110
|
+
"lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wA"
|
|
111
|
+
"AKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qI"
|
|
112
|
+
"l7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X"
|
|
113
|
+
"48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5Em"
|
|
114
|
+
"ozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgD"
|
|
115
|
+
"gGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/x"
|
|
116
|
+
"gNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKL"
|
|
117
|
+
"yBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h"
|
|
118
|
+
"1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP"
|
|
119
|
+
"2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0I"
|
|
120
|
+
"gYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iE"
|
|
121
|
+
"PENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG"
|
|
122
|
+
"+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1"
|
|
123
|
+
"mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAc"
|
|
124
|
+
"YZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81"
|
|
125
|
+
"XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgs"
|
|
126
|
+
"V/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx"
|
|
127
|
+
"+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5"
|
|
128
|
+
"Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+h"
|
|
129
|
+
"x9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGj"
|
|
130
|
+
"UYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb"
|
|
131
|
+
"15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZ"
|
|
132
|
+
"nw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFD"
|
|
133
|
+
"pWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbx"
|
|
134
|
+
"t3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvf"
|
|
135
|
+
"rH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+"
|
|
136
|
+
"F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrS"
|
|
137
|
+
"FoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6R"
|
|
138
|
+
"JZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3i"
|
|
139
|
+
"C+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtG"
|
|
140
|
+
"I2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQq"
|
|
141
|
+
"ohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKO"
|
|
142
|
+
"ZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2"
|
|
143
|
+
"Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhT"
|
|
144
|
+
"bF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319k"
|
|
145
|
+
"XbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/"
|
|
146
|
+
"T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr"
|
|
147
|
+
"60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRpt"
|
|
148
|
+
"TmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752"
|
|
149
|
+
"PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca"
|
|
150
|
+
"7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf"
|
|
151
|
+
"9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L"
|
|
152
|
+
"96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV"
|
|
153
|
+
"70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAe"
|
|
154
|
+
"iUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAACJ5JREFUeNrsm19oW9cdx7/n"
|
|
155
|
+
"/tO9uleS9ceWZMdO68Su0jiEmNCGLVsDg+J16xhkYx0UM1ayvS19SQZ7WfK6PWR7Gax0S9n"
|
|
156
|
+
"24JGFlbGNPIRgEkKWZC1u6rizHMXxv1iWJdnWvbqS7p9z9uDokqzs1bWd84GDQEigez465/"
|
|
157
|
+
"x+v3MOYYyBs3shXDAXzOGCOVwwhwvmcMEcLpjDBXPBHC6YwwVzuOAt4dGjRy/MzMwMmqZpS"
|
|
158
|
+
"JLkZbPZYn9//8NkMlnmgncwt27d+tKlS5e+W6lUEolEYjQUCoExBsuy4Lru+319fXMjIyNX"
|
|
159
|
+
"jh49+m8ueAfRarXUCxcuvHvv3r3DR44ceavRaMCyLDDGIAgCFEVBOBwGIQSFQuH9PXv2PD5"
|
|
160
|
+
"16tRvu7u7H3PB2xzXdZXz58//vFKp/Gzfvn1YXFyEYRgwDAOSJEEQBDDG4LouPM+DpmnwPA"
|
|
161
|
+
"/5fP73o6Ojf3zttdfGueBtzAcffPCD8fHxi0NDQ1hZWUE6nYYoiiCEQBCEZ14JIfA8D77vA"
|
|
162
|
+
"wAmJib+cPLkyctvvvnm33ZLf0i7Se7s7Gz/tWvXvpbL5bC+vo5sNgtFUTb/yU/EthshBAAg"
|
|
163
|
+
"yzIAoNls4tChQ6OXL1+GKIreG2+88U8ueJsxPj5+QlXVt0OhEGRZhqIoEEXxGbFPC6aUBuJ"
|
|
164
|
+
"VVYVlWThw4MDo2NiYkMlkisPDwx/v9D4Rdotc0zSj9+7dO5RMJgEA4XAYkiRBkqRA9tNNlu"
|
|
165
|
+
"VArKIokCQJ8Xgc8Xgc+/fvf/u999778fr6egcXvE0ol8spx3HeNQwDoihClmXIsgxRFCFJ0"
|
|
166
|
+
"ucEE0KgqipCodAz0pPJJFKpFGKx2I8uXrz4Qy54m1CpVBK+70MUxUDW0yO1Lbz9XnuUPz26"
|
|
167
|
+
"25/JZDLo7OzExMTE4cnJySG+Bm8DarVa1Pd9EEIgy3IwPYuiCFEANFWEIGw2x6PQNA2qqqK"
|
|
168
|
+
"dRTDGwBgDpTSQXKvVRj/88MOZoaGhSS74C8a27XA75ZEk6YloBYoswHQNfPy4Fx4JoTdmYj"
|
|
169
|
+
"BRhSozsP+ZwCil8DwPlFIkk0kkEglMTEwM5PP5wcHBwTwX/AXhOI5i23bY930wxqAoymbVi"
|
|
170
|
+
"jA0/DD+mj8C048iqjMUHYbFRg0n+uaQ0FzQJ5IdxwGlNFi/AaCzsxPpdHr0+vXrN3aq4F2x"
|
|
171
|
+
"Bs/Pz/eFQqE/t0egIAjQdR2SQDFVzmKlHoEme1BEH3uyDJFsHFdnX4SLECRRhOM4EAQBhmF"
|
|
172
|
+
"A1/UgvUomk4jH4/j0008PeZ4nccFbTKPRCH/00UdHi8Viph1gNZtNUEqhKAp0XUfRNMAYQC"
|
|
173
|
+
"ng+0DNAhp1H4s1A3fmkwhrMmKxGGKxGFRVDdZvWZYRiUQQjUZRq9V+Mjc39wIXvIWsra0lx"
|
|
174
|
+
"sfHTzx48OAuY+yGKIpQVRX1eh2O4wQBFmMUjsvQ8oCWC5RWGWZmKVyX4e58DLarIBzWnomy"
|
|
175
|
+
"23mxoiiIRqPQdR2FQqGfr8FbhOu6SrFYzJim+Y9mswnHcSCKImKxGFZWVmBZFgRBgCQTpPU"
|
|
176
|
+
"6LNOCquhgjMERAUIAnzJUWgrmqzJeTclouRSUUrQj8XbQZRgGwuEwFhYW+vgI3iJarZbS2d"
|
|
177
|
+
"l5v1Qqwfd9uK4LAEgmk2g0GlhfX99cV0UFL2dNCLSGmtlEvUFg2oBpA5YNmHWCikmgKNLnc"
|
|
178
|
+
"uH2VN2udFWr1QQXvEV4nicxxlCv19FsNoOtv0QiAUVRsLq6ikqlAtel2JvycOxFCyulFZh1"
|
|
179
|
+
"CqtBNuXaBPV6EyHRhyAIaLVaQST99MZEWzQPsrZ2BKu2bYMQgmq1Cs/z4DgOwuEwMpkMSqU"
|
|
180
|
+
"SlpeXwQBoegTfe9XEgayDhaUHWNuoo1YHKus1hEgVuR4GLRxFPB6HrusQRRGU0uBwQLsAsl"
|
|
181
|
+
"O3VXdskNVsNtHR0YHl5WU0Gg24rgvGGLLZLCilWFpawuLiIggR0d1l4KffMPH6yz5a5iNUV"
|
|
182
|
+
"qcR8ot4+9UKcv0pCOLmlBwKhaBpGjRNC1Kl9p9H07QmD7K2CFVVm2tra0in07AsCysrK0il"
|
|
183
|
+
"UnBdF5FIBD09PVhYWMDDhw+RyWTQ07MH/X0qznyripNFhnKNYU8SeOVwL6Idm9+jdFNm+yB"
|
|
184
|
+
"AO9CybRumaeLw4cOPueAtIhKJ1Hzf/4phGDe6urowOTmJY8eOBbXk9jRdKBQQiUTQ0dGBeD"
|
|
185
|
+
"yOSCyB4z0aZEmErKhoNDfX7v83BXueh2q1ilKpBF7J2sofLQi0p6dn0bZtDAwMYGNjA1NTU"
|
|
186
|
+
"/B9H61WC4qioK+vDxsbG5iZmcHdu3dh2zZEUUTL8QFBAYgIQSAolUrBsR1KadCe5NpYXl6G"
|
|
187
|
+
"qqp/yuVy/+GCt5C9e/fOy7L8dVmWkcvlMD09jc8++yxYM3VdR29vL+bn53H//n3cunULtm0"
|
|
188
|
+
"HGwqu6wY169XVVTiOE4hmjKHRaGB2dhaFQgHHjx+/EQ6H7Z3YT+K5c+d2pGBCCOvu7n48NT"
|
|
189
|
+
"X1gFL6bcMwUCgUUCqVgkpUu/Q4NzeHZrOJVquFSCQCwzCCIzuSJMH3fViWBUII2ulXoVDAn"
|
|
190
|
+
"Tt3UC6X/3L27NlfaJrW4IK3GFmW3ZdeeilvWda/HMe5u2/fvhFFUWCa5m/279///vDw8K8y"
|
|
191
|
+
"mczfCSH56enpr5bL5UC0IAhPSpksCKparRbK5TJmZmZw+/ZtfPLJJ1fPnDnzy506PQO76Nh"
|
|
192
|
+
"stVpNFIvFDGNMSKfTxVQqVX66tHnp0qXvjI2NfZ8Q8s3e3l709/ejq6sL0WgUoVAIruuiVq"
|
|
193
|
+
"thaWkJ09PTWFpaunL69Olfj4yMXNnJ/fJcXT7L5/ODY2Njb928efPLoii+3t5IkGUZnufBN"
|
|
194
|
+
"E2sra1dHR4e/vidd9753cDAQH6nP/Nzebtwdna2//bt269MTk4eKpVKXZ7nSbquW7lcbvrE"
|
|
195
|
+
"iRPjBw8enNwtz/rcXx9ljAlPypJ0Nz4fvx+8y+GCuWAOF8zhgjlcMIcL5nDBHC6YC+ZwwRw"
|
|
196
|
+
"umLMN+O8AX65uqCMleo4AAAAASUVORK5CYII="
|
|
197
|
+
)
|
pptx2/opc/__init__.py
ADDED
|
File without changes
|