aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/apis/google_docs/GoogleApiClientUtils.ts189
-rw-r--r--src/client/util/DictationManager.ts66
-rw-r--r--src/client/util/DocumentManager.ts4
-rw-r--r--src/client/util/DragManager.ts4
-rw-r--r--src/client/util/SelectionManager.ts1
-rw-r--r--src/client/views/DocumentDecorations.tsx7
-rw-r--r--src/client/views/EditableView.tsx28
-rw-r--r--src/client/views/GlobalKeyHandler.ts2
-rw-r--r--src/client/views/MainOverlayTextBox.tsx1
-rw-r--r--src/client/views/MetadataEntryMenu.tsx2
-rw-r--r--src/client/views/collections/CollectionStackingView.tsx13
-rw-r--r--src/client/views/collections/CollectionStackingViewFieldColumn.tsx4
-rw-r--r--src/client/views/collections/CollectionTreeView.tsx89
-rw-r--r--src/client/views/collections/CollectionViewChromes.scss73
-rw-r--r--src/client/views/collections/CollectionViewChromes.tsx101
-rw-r--r--src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx59
-rw-r--r--src/client/views/collections/collectionFreeForm/MarqueeView.tsx20
-rw-r--r--src/client/views/nodes/ButtonBox.tsx27
-rw-r--r--src/client/views/nodes/CollectionFreeFormDocumentView.tsx2
-rw-r--r--src/client/views/nodes/DocumentView.tsx64
-rw-r--r--src/client/views/nodes/FormattedTextBox.tsx126
-rw-r--r--src/client/views/nodes/KeyValueBox.tsx2
-rw-r--r--src/client/views/nodes/PresBox.tsx282
-rw-r--r--src/client/views/nodes/VideoBox.tsx6
-rw-r--r--src/client/views/presentationview/PresentationElement.tsx613
-rw-r--r--src/client/views/presentationview/PresentationList.tsx47
-rw-r--r--src/client/views/presentationview/PresentationView.scss14
-rw-r--r--src/new_fields/Doc.ts6
-rw-r--r--src/new_fields/RichTextField.ts6
-rw-r--r--src/server/RouteStore.ts2
-rw-r--r--src/server/apis/google/GoogleApiServerUtils.ts65
-rw-r--r--src/server/authentication/models/current_user_utils.ts5
-rw-r--r--src/server/index.ts41
-rw-r--r--src/server/slides.json10820
34 files changed, 11664 insertions, 1127 deletions
diff --git a/src/client/apis/google_docs/GoogleApiClientUtils.ts b/src/client/apis/google_docs/GoogleApiClientUtils.ts
index 821c52270..798886def 100644
--- a/src/client/apis/google_docs/GoogleApiClientUtils.ts
+++ b/src/client/apis/google_docs/GoogleApiClientUtils.ts
@@ -1,4 +1,4 @@
-import { docs_v1 } from "googleapis";
+import { docs_v1, slides_v1 } from "googleapis";
import { PostToServer } from "../../../Utils";
import { RouteStore } from "../../../server/RouteStore";
import { Opt } from "../../../new_fields/Doc";
@@ -9,50 +9,84 @@ export const Pushes = "googleDocsPushCount";
export namespace GoogleApiClientUtils {
- export namespace Docs {
+ export enum Service {
+ Documents = "Documents",
+ Slides = "Slides"
+ }
- export enum Actions {
- Create = "create",
- Retrieve = "retrieve",
- Update = "update"
- }
+ export enum Actions {
+ Create = "create",
+ Retrieve = "retrieve",
+ Update = "update"
+ }
- export enum WriteMode {
- Insert,
- Replace
- }
+ export enum WriteMode {
+ Insert,
+ Replace
+ }
- export type DocumentId = string;
- export type Reference = DocumentId | CreateOptions;
- export type TextContent = string | string[];
- export type IdHandler = (id: DocumentId) => any;
+ export type Identifier = string;
+ export type Reference = Identifier | CreateOptions;
+ export type TextContent = string | string[];
+ export type IdHandler = (id: Identifier) => any;
+ export type CreationResult = Opt<Identifier>;
+ export type ReadLinesResult = Opt<{ title?: string, bodyLines?: string[] }>;
+ export type ReadResult = { title?: string, body?: string };
- export type CreationResult = Opt<DocumentId>;
- export type RetrievalResult = Opt<docs_v1.Schema$Document>;
- export type UpdateResult = Opt<docs_v1.Schema$BatchUpdateDocumentResponse>;
- export type ReadLinesResult = Opt<{ title?: string, bodyLines?: string[] }>;
- export type ReadResult = { title?: string, body?: string };
+ export interface CreateOptions {
+ service: Service;
+ title?: string; // if excluded, will use a default title annotated with the current date
+ }
- export interface CreateOptions {
- handler: IdHandler; // callback to process the documentId of the newly created Google Doc
- title?: string; // if excluded, will use a default title annotated with the current date
- }
+ export interface RetrieveOptions {
+ service: Service;
+ identifier: Identifier;
+ }
- export interface RetrieveOptions {
- documentId: DocumentId;
- }
+ export interface ReadOptions {
+ identifier: Identifier;
+ removeNewlines?: boolean;
+ }
- export type ReadOptions = RetrieveOptions & { removeNewlines?: boolean };
+ export interface WriteOptions {
+ mode: WriteMode;
+ content: TextContent;
+ reference: Reference;
+ index?: number; // if excluded, will compute the last index of the document and append the content there
+ }
- export interface WriteOptions {
- mode: WriteMode;
- content: TextContent;
- reference: Reference;
- index?: number; // if excluded, will compute the last index of the document and append the content there
+ /**
+ * After following the authentication routine, which connects this API call to the current signed in account
+ * and grants the appropriate permissions, this function programmatically creates an arbitrary Google Doc which
+ * should appear in the user's Google Doc library instantaneously.
+ *
+ * @param options the title to assign to the new document, and the information necessary
+ * to store the new documentId returned from the creation process
+ * @returns the documentId of the newly generated document, or undefined if the creation process fails.
+ */
+ export const create = async (options: CreateOptions): Promise<CreationResult> => {
+ const path = `${RouteStore.googleDocs}/${options.service}/${Actions.Create}`;
+ const parameters = {
+ requestBody: {
+ title: options.title || `Dash Export (${new Date().toDateString()})`
+ }
+ };
+ try {
+ const schema: any = await PostToServer(path, parameters);
+ let key = ["document", "presentation"].find(prefix => `${prefix}Id` in schema) + "Id";
+ return schema[key];
+ } catch {
+ return undefined;
}
+ };
+
+ export namespace Docs {
+
+ export type RetrievalResult = Opt<docs_v1.Schema$Document | slides_v1.Schema$Presentation>;
+ export type UpdateResult = Opt<docs_v1.Schema$BatchUpdateDocumentResponse>;
export interface UpdateOptions {
- documentId: DocumentId;
+ documentId: Identifier;
requests: docs_v1.Schema$Request[];
}
@@ -96,46 +130,27 @@ export namespace GoogleApiClientUtils {
}
- /**
- * After following the authentication routine, which connects this API call to the current signed in account
- * and grants the appropriate permissions, this function programmatically creates an arbitrary Google Doc which
- * should appear in the user's Google Doc library instantaneously.
- *
- * @param options the title to assign to the new document, and the information necessary
- * to store the new documentId returned from the creation process
- * @returns the documentId of the newly generated document, or undefined if the creation process fails.
- */
- export const create = async (options: CreateOptions): Promise<CreationResult> => {
- const path = RouteStore.googleDocs + Actions.Create;
- const parameters = {
- requestBody: {
- title: options.title || `Dash Export (${new Date().toDateString()})`
- }
- };
- try {
- const schema: docs_v1.Schema$Document = await PostToServer(path, parameters);
- const generatedId = schema.documentId;
- if (generatedId) {
- options.handler(generatedId);
- return generatedId;
- }
- } catch {
- return undefined;
- }
- };
+ const KeyMapping = new Map<Service, string>([
+ [Service.Documents, "documentId"],
+ [Service.Slides, "presentationId"]
+ ]);
export const retrieve = async (options: RetrieveOptions): Promise<RetrievalResult> => {
- const path = RouteStore.googleDocs + Actions.Retrieve;
+ const path = `${RouteStore.googleDocs}/${options.service}/${Actions.Retrieve}`;
try {
- const schema: RetrievalResult = await PostToServer(path, options);
- return schema;
+ let parameters: any = {}, key: string | undefined;
+ if ((key = KeyMapping.get(options.service))) {
+ parameters[key] = options.identifier;
+ const schema: RetrievalResult = await PostToServer(path, parameters);
+ return schema;
+ }
} catch {
return undefined;
}
};
export const update = async (options: UpdateOptions): Promise<UpdateResult> => {
- const path = RouteStore.googleDocs + Actions.Update;
+ const path = `${RouteStore.googleDocs}/${Service.Documents}/${Actions.Update}`;
const parameters = {
documentId: options.documentId,
requestBody: {
@@ -151,7 +166,7 @@ export namespace GoogleApiClientUtils {
};
export const read = async (options: ReadOptions): Promise<ReadResult> => {
- return retrieve(options).then(document => {
+ return retrieve({ ...options, service: Service.Documents }).then(document => {
let result: ReadResult = {};
if (document) {
let title = document.title;
@@ -163,7 +178,7 @@ export namespace GoogleApiClientUtils {
};
export const readLines = async (options: ReadOptions): Promise<ReadLinesResult> => {
- return retrieve(options).then(document => {
+ return retrieve({ ...options, service: Service.Documents }).then(document => {
let result: ReadLinesResult = {};
if (document) {
let title = document.title;
@@ -177,14 +192,14 @@ export namespace GoogleApiClientUtils {
export const write = async (options: WriteOptions): Promise<UpdateResult> => {
const requests: docs_v1.Schema$Request[] = [];
- const documentId = await Utils.initialize(options.reference);
- if (!documentId) {
+ const identifier = await Utils.initialize(options.reference);
+ if (!identifier) {
return undefined;
}
let index = options.index;
const mode = options.mode;
if (!(index && mode === WriteMode.Insert)) {
- let schema = await retrieve({ documentId });
+ let schema = await retrieve({ identifier, service: Service.Documents });
if (!schema || !(index = Utils.endOf(schema))) {
return undefined;
}
@@ -210,7 +225,7 @@ export namespace GoogleApiClientUtils {
if (!requests.length) {
return undefined;
}
- let replies: any = await update({ documentId, requests });
+ let replies: any = await update({ documentId: identifier, requests });
let errors = "errors";
if (errors in replies) {
console.log("Write operation failed:");
@@ -221,4 +236,36 @@ export namespace GoogleApiClientUtils {
}
+ export namespace Slides {
+
+ export namespace Utils {
+
+ export const extractTextBoxes = (slides: slides_v1.Schema$Page[]) => {
+ slides.map(slide => {
+ let elements = slide.pageElements;
+ if (elements) {
+ let textboxes: slides_v1.Schema$TextContent[] = [];
+ for (let element of elements) {
+ if (element && element.shape && element.shape.shapeType === "TEXT_BOX" && element.shape.text) {
+ textboxes.push(element.shape.text);
+ }
+ }
+ textboxes.map(text => {
+ if (text.textElements) {
+ text.textElements.map(element => {
+
+ });
+ }
+ if (text.lists) {
+
+ }
+ });
+ }
+ });
+ };
+
+ }
+
+ }
+
} \ No newline at end of file
diff --git a/src/client/util/DictationManager.ts b/src/client/util/DictationManager.ts
index 488a146bf..fb3c15cea 100644
--- a/src/client/util/DictationManager.ts
+++ b/src/client/util/DictationManager.ts
@@ -45,7 +45,7 @@ export namespace DictationManager {
export namespace Controls {
- const infringe = "unable to process: dictation manager still involved in previous session";
+ export const Infringed = "unable to process: dictation manager still involved in previous session";
const intraSession = ". ";
const interSession = " ... ";
@@ -64,35 +64,45 @@ export namespace DictationManager {
export type ListeningUIStatus = { interim: boolean } | false;
export interface ListeningOptions {
+ useOverlay: boolean;
language: string;
continuous: ContinuityArgs;
delimiters: DelimiterArgs;
interimHandler: InterimResultHandler;
tryExecute: boolean;
+ terminators: string[];
}
export const listen = async (options?: Partial<ListeningOptions>) => {
let results: string | undefined;
let main = MainView.Instance;
- main.dictationOverlayVisible = true;
- main.isListening = { interim: false };
+ let overlay = options !== undefined && options.useOverlay;
+ if (overlay) {
+ main.dictationOverlayVisible = true;
+ main.isListening = { interim: false };
+ }
try {
results = await listenImpl(options);
if (results) {
Utils.CopyText(results);
- main.isListening = false;
- let execute = options && options.tryExecute;
- main.dictatedPhrase = execute ? results.toLowerCase() : results;
- main.dictationSuccess = execute ? await DictationManager.Commands.execute(results) : true;
+ if (overlay) {
+ main.isListening = false;
+ let execute = options && options.tryExecute;
+ main.dictatedPhrase = execute ? results.toLowerCase() : results;
+ main.dictationSuccess = execute ? await DictationManager.Commands.execute(results) : true;
+ }
+ options && options.tryExecute && await DictationManager.Commands.execute(results);
}
} catch (e) {
- main.isListening = false;
- main.dictatedPhrase = results = `dictation error: ${"error" in e ? e.error : "unknown error"}`;
- main.dictationSuccess = false;
+ if (overlay) {
+ main.isListening = false;
+ main.dictatedPhrase = results = `dictation error: ${"error" in e ? e.error : "unknown error"}`;
+ main.dictationSuccess = false;
+ }
} finally {
- main.initiateDictationFade();
+ overlay && main.initiateDictationFade();
}
return results;
@@ -100,7 +110,7 @@ export namespace DictationManager {
const listenImpl = (options?: Partial<ListeningOptions>) => {
if (isListening) {
- return infringe;
+ return Infringed;
}
isListening = true;
@@ -128,6 +138,12 @@ export namespace DictationManager {
recognizer.onresult = (e: SpeechRecognitionEvent) => {
current = synthesize(e, intra);
+ let matchedTerminator: string | undefined;
+ if (options && options.terminators && (matchedTerminator = options.terminators.find(end => current ? current.trim().toLowerCase().endsWith(end.toLowerCase()) : false))) {
+ current = matchedTerminator;
+ recognizer.abort();
+ return complete();
+ }
handler && handler(current);
isManuallyStopped && complete();
};
@@ -163,13 +179,13 @@ export namespace DictationManager {
}
isManuallyStopped = true;
salvageSession ? recognizer.stop() : recognizer.abort();
- let main = MainView.Instance;
- if (main.dictationOverlayVisible) {
- main.cancelDictationFade();
- main.dictationOverlayVisible = false;
- main.dictationSuccess = undefined;
- setTimeout(() => main.dictatedPhrase = placeholder, 500);
- }
+ // let main = MainView.Instance;
+ // if (main.dictationOverlayVisible) {
+ // main.cancelDictationFade();
+ // main.dictationOverlayVisible = false;
+ // main.dictationSuccess = undefined;
+ // setTimeout(() => main.dictatedPhrase = placeholder, 500);
+ // }
};
const synthesize = (e: SpeechRecognitionEvent, delimiter?: string) => {
@@ -301,11 +317,16 @@ export namespace DictationManager {
}
}],
- ["create bulleted note", {
+ ["new outline", {
action: (target: DocumentView) => {
let newBox = Docs.Create.TextDocument({ width: 400, height: 200, title: "My Outline" });
+ newBox.autoHeight = true;
let proto = newBox.proto!;
- let proseMirrorState = '"{"doc":{"type":"doc","content":[{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"type":"text","text":""}]}]}]}]},"selection":{"type":"text","anchor":1,"head":1}}"';
+ proto.page = -1;
+ let prompt = "Press alt + r to start dictating here...";
+ let head = 3;
+ let anchor = head + prompt.length;
+ let proseMirrorState = `{"doc":{"type":"doc","content":[{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"type":"text","text":"${prompt}"}]}]}]}]},"selection":{"type":"text","anchor":${anchor},"head":${head}}}`;
proto.data = new RichTextField(proseMirrorState);
proto.backgroundColor = "#eeffff";
target.props.addDocTab(newBox, proto, "onRight");
@@ -323,6 +344,9 @@ export namespace DictationManager {
let what = matches[2];
let dataDoc = Doc.GetProto(target.props.Document);
let fieldKey = "data";
+ if (isNaN(count)) {
+ return;
+ }
for (let i = 0; i < count; i++) {
let created: Doc | undefined;
switch (what) {
diff --git a/src/client/util/DocumentManager.ts b/src/client/util/DocumentManager.ts
index 7f526b247..124faf266 100644
--- a/src/client/util/DocumentManager.ts
+++ b/src/client/util/DocumentManager.ts
@@ -9,6 +9,7 @@ import { CollectionView } from '../views/collections/CollectionView';
import { DocumentView } from '../views/nodes/DocumentView';
import { LinkManager } from './LinkManager';
import { undoBatch, UndoManager } from './UndoManager';
+import { Scripting } from './Scripting';
export class DocumentManager {
@@ -202,4 +203,5 @@ export class DocumentManager {
return 1;
}
}
-} \ No newline at end of file
+}
+Scripting.addGlobal(function focus(doc: any) { DocumentManager.Instance.getDocumentViews(Doc.GetProto(doc)).map(view => view.props.focus(doc, true)) }) \ No newline at end of file
diff --git a/src/client/util/DragManager.ts b/src/client/util/DragManager.ts
index 894b366ef..24c093213 100644
--- a/src/client/util/DragManager.ts
+++ b/src/client/util/DragManager.ts
@@ -140,6 +140,8 @@ export namespace DragManager {
withoutShiftDrag?: boolean;
+ finishDrag?: (dropData: { [id: string]: any }) => void;
+
offsetX?: number;
offsetY?: number;
@@ -234,7 +236,7 @@ export namespace DragManager {
export function StartDocumentDrag(eles: HTMLElement[], dragData: DocumentDragData, downX: number, downY: number, options?: DragOptions) {
runInAction(() => StartDragFunctions.map(func => func()));
- StartDrag(eles, dragData, downX, downY, options,
+ StartDrag(eles, dragData, downX, downY, options, options && options.finishDrag ? options.finishDrag :
(dropData: { [id: string]: any }) => {
(dropData.droppedDocuments = dragData.userDropAction === "alias" || (!dragData.userDropAction && dragData.dropAction === "alias") ?
dragData.draggedDocuments.map(d => Doc.MakeAlias(d)) :
diff --git a/src/client/util/SelectionManager.ts b/src/client/util/SelectionManager.ts
index ee623d082..9efef888d 100644
--- a/src/client/util/SelectionManager.ts
+++ b/src/client/util/SelectionManager.ts
@@ -4,7 +4,6 @@ import { DocumentView } from "../views/nodes/DocumentView";
import { FormattedTextBox } from "../views/nodes/FormattedTextBox";
import { NumCast, StrCast } from "../../new_fields/Types";
import { InkingControl } from "../views/InkingControl";
-import { CurrentUserUtils } from "../../server/authentication/models/current_user_utils";
export namespace SelectionManager {
diff --git a/src/client/views/DocumentDecorations.tsx b/src/client/views/DocumentDecorations.tsx
index 2d92aaba7..4ba8d3b2f 100644
--- a/src/client/views/DocumentDecorations.tsx
+++ b/src/client/views/DocumentDecorations.tsx
@@ -714,7 +714,7 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
let canPull = this.targetDoc.data && this.targetDoc.data instanceof RichTextField;
let dataDoc = Doc.GetProto(this.targetDoc);
if (!canPull || !dataDoc[GoogleRef]) return (null);
- let icon = !dataDoc.unchanged ? (this.pullIcon as any) : fetch;
+ let icon = dataDoc.unchanged === false ? (this.pullIcon as any) : fetch;
icon = this.openHover ? "share" : icon;
let animation = this.isAnimatingFetch ? "spin 0.5s linear infinite" : "none";
let title = `${!dataDoc.unchanged ? "Pull from" : "Fetch"} Google Docs`;
@@ -727,10 +727,11 @@ export class DocumentDecorations extends React.Component<{}, { value: string }>
backgroundColor: this.pullColor,
transition: "0.2s ease all"
}}
- onPointerEnter={e => e.ctrlKey && runInAction(() => this.openHover = true)}
+ onPointerEnter={e => e.altKey && runInAction(() => this.openHover = true)}
onPointerLeave={() => runInAction(() => this.openHover = false)}
onClick={e => {
- if (e.ctrlKey) {
+ if (e.altKey) {
+ e.preventDefault();
window.open(`https://docs.google.com/document/d/${dataDoc[GoogleRef]}/edit`);
} else {
this.clearPullColor();
diff --git a/src/client/views/EditableView.tsx b/src/client/views/EditableView.tsx
index c3612fee9..dd5395802 100644
--- a/src/client/views/EditableView.tsx
+++ b/src/client/views/EditableView.tsx
@@ -3,6 +3,7 @@ import { observer } from 'mobx-react';
import { observable, action, trace } from 'mobx';
import "./EditableView.scss";
import * as Autosuggest from 'react-autosuggest';
+import { undoBatch } from '../util/UndoManager';
export interface EditableProps {
/**
@@ -70,14 +71,12 @@ export class EditableView extends React.Component<EditableProps> {
onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
if (e.key === "Tab") {
e.stopPropagation();
+ this.finalizeEdit(e.currentTarget.value, e.shiftKey);
this.props.OnTab && this.props.OnTab();
} else if (e.key === "Enter") {
e.stopPropagation();
if (!e.ctrlKey) {
- if (this.props.SetValue(e.currentTarget.value, e.shiftKey)) {
- this._editing = false;
- this.props.isEditingCallback && this.props.isEditingCallback(false);
- }
+ this.finalizeEdit(e.currentTarget.value, e.shiftKey);
} else if (this.props.OnFillDown) {
this.props.OnFillDown(e.currentTarget.value);
this._editing = false;
@@ -100,6 +99,14 @@ export class EditableView extends React.Component<EditableProps> {
e.stopPropagation();
}
+ @action
+ private finalizeEdit(value: string, shiftDown: boolean) {
+ if (this.props.SetValue(value, shiftDown)) {
+ this._editing = false;
+ this.props.isEditingCallback && this.props.isEditingCallback(false);
+ }
+ }
+
stopPropagation(e: React.SyntheticEvent) {
e.stopPropagation();
}
@@ -118,7 +125,7 @@ export class EditableView extends React.Component<EditableProps> {
className: "editableView-input",
onKeyDown: this.onKeyDown,
autoFocus: true,
- onBlur: action(() => this._editing = false),
+ onBlur: e => this.finalizeEdit(e.currentTarget.value, false),
onPointerDown: this.stopPropagation,
onClick: this.stopPropagation,
onPointerUp: this.stopPropagation,
@@ -126,9 +133,14 @@ export class EditableView extends React.Component<EditableProps> {
onChange: this.props.autosuggestProps.onChange
}}
/>
- : <input className="editableView-input" defaultValue={this.props.GetValue()} onKeyDown={this.onKeyDown} autoFocus
- onBlur={action(() => { this._editing = false; this.props.isEditingCallback && this.props.isEditingCallback(false); })} onPointerDown={this.stopPropagation} onClick={this.stopPropagation} onPointerUp={this.stopPropagation}
- style={{ display: this.props.display, fontSize: this.props.fontSize }} />;
+ : <input className="editableView-input"
+ defaultValue={this.props.GetValue()}
+ onKeyDown={this.onKeyDown}
+ autoFocus={true}
+ onBlur={e => this.finalizeEdit(e.currentTarget.value, false)}
+ onPointerDown={this.stopPropagation} onClick={this.stopPropagation} onPointerUp={this.stopPropagation}
+ style={{ display: this.props.display, fontSize: this.props.fontSize }}
+ />;
} else {
if (this.props.autosuggestProps) this.props.autosuggestProps.resetValue();
return (
diff --git a/src/client/views/GlobalKeyHandler.ts b/src/client/views/GlobalKeyHandler.ts
index 790784f46..fda3f55bb 100644
--- a/src/client/views/GlobalKeyHandler.ts
+++ b/src/client/views/GlobalKeyHandler.ts
@@ -105,7 +105,7 @@ export default class KeyManager {
switch (keyname) {
case " ":
- DictationManager.Controls.listen({ tryExecute: true });
+ DictationManager.Controls.listen({ useOverlay: true, tryExecute: true });
stopPropagation = true;
preventDefault = true;
}
diff --git a/src/client/views/MainOverlayTextBox.tsx b/src/client/views/MainOverlayTextBox.tsx
index 9fe435bc5..0839e1114 100644
--- a/src/client/views/MainOverlayTextBox.tsx
+++ b/src/client/views/MainOverlayTextBox.tsx
@@ -144,6 +144,7 @@ export class MainOverlayTextBox extends React.Component<MainOverlayTextBoxProps>
Document={FormattedTextBox.InputBoxOverlay.props.Document}
DataDoc={FormattedTextBox.InputBoxOverlay.props.DataDoc}
onClick={undefined}
+ ChromeHeight={this.ChromeHeight}
isSelected={returnTrue} select={emptyFunction} renderDepth={0} selectOnLoad={true}
ContainingCollectionView={undefined} whenActiveChanged={emptyFunction} active={returnTrue} ContentScaling={returnOne}
ScreenToLocalTransform={this._textXf} PanelWidth={returnZero} PanelHeight={returnZero} focus={emptyFunction}
diff --git a/src/client/views/MetadataEntryMenu.tsx b/src/client/views/MetadataEntryMenu.tsx
index 4a45eede9..ec628c5a3 100644
--- a/src/client/views/MetadataEntryMenu.tsx
+++ b/src/client/views/MetadataEntryMenu.tsx
@@ -172,7 +172,7 @@ export class MetadataEntryMenu extends React.Component<MetadataEntryProps>{
</div>
<div className="metadataEntry-keys" >
<ul>
- {this._allSuggestions.map(s => <li key={s} onClick={action(() => { this._currentKey = s; this.previewValue(); })} >{s}</li>)}
+ {this._allSuggestions.slice().sort().map(s => <li key={s} onClick={action(() => { this._currentKey = s; this.previewValue(); })} >{s}</li>)}
</ul>
</div>
</div>
diff --git a/src/client/views/collections/CollectionStackingView.tsx b/src/client/views/collections/CollectionStackingView.tsx
index c74c60d8f..4ab656744 100644
--- a/src/client/views/collections/CollectionStackingView.tsx
+++ b/src/client/views/collections/CollectionStackingView.tsx
@@ -287,15 +287,18 @@ export class CollectionStackingView extends CollectionSubView(doc => doc) {
masonryChildren(docs: Doc[]) {
this._docXfs.length = 0;
return docs.map((d, i) => {
+ const pair = Doc.GetLayoutDataDocPair(this.props.Document, this.props.DataDoc, this.props.fieldKey, d);
+ if (!pair.layout || pair.data instanceof Promise) {
+ return (null);
+ }
let dref = React.createRef<HTMLDivElement>();
- let layoutDoc = Doc.expandTemplateLayout(d, this.props.DataDoc);
let width = () => (d.nativeWidth && !d.ignoreAspect && !this.props.Document.fillColumn ? Math.min(d[WidthSym](), this.columnWidth) : this.columnWidth);/// (uniqueHeadings.length + 1);
- let height = () => this.getDocHeight(layoutDoc);
- let dxf = () => this.getDocTransform(layoutDoc, dref.current!);
+ let height = () => this.getDocHeight(pair.layout);
+ let dxf = () => this.getDocTransform(pair.layout!, dref.current!);
let rowSpan = Math.ceil((height() + this.gridGap) / this.gridGap);
this._docXfs.push({ dxf: dxf, width: width, height: height });
- return <div className="collectionStackingView-masonryDoc" key={d[Id]} ref={dref} style={{ gridRowEnd: `span ${rowSpan}` }} >
- {this.getDisplayDoc(layoutDoc, d, dxf, width)}
+ return !pair.layout ? (null) : <div className="collectionStackingView-masonryDoc" key={d[Id]} ref={dref} style={{ gridRowEnd: `span ${rowSpan}` }} >
+ {this.getDisplayDoc(pair.layout, pair.data, dxf, width)}
</div>;
});
}
diff --git a/src/client/views/collections/CollectionStackingViewFieldColumn.tsx b/src/client/views/collections/CollectionStackingViewFieldColumn.tsx
index cc8476548..2536eff00 100644
--- a/src/client/views/collections/CollectionStackingViewFieldColumn.tsx
+++ b/src/client/views/collections/CollectionStackingViewFieldColumn.tsx
@@ -83,9 +83,9 @@ export class CollectionStackingViewFieldColumn extends React.Component<CSVFieldC
return (null);
}
let width = () => Math.min(d.nativeWidth && !d.ignoreAspect && !parent.props.Document.fillColumn ? d[WidthSym]() : Number.MAX_VALUE, parent.columnWidth / parent.numGroupColumns);
- let height = () => parent.getDocHeight(pair!.layout);
+ let height = () => parent.getDocHeight(pair.layout);
let dref = React.createRef<HTMLDivElement>();
- let dxf = () => this.getDocTransform(pair!.layout, dref.current!);
+ let dxf = () => this.getDocTransform(pair.layout!, dref.current!);
this.props.parent._docXfs.push({ dxf: dxf, width: width, height: height });
let rowSpan = Math.ceil((height() + parent.gridGap) / parent.gridGap);
let style = parent.isStackingView ? { width: width(), margin: "auto", marginTop: i === 0 ? 0 : parent.gridGap, height: height() } : { gridRowEnd: `span ${rowSpan}` };
diff --git a/src/client/views/collections/CollectionTreeView.tsx b/src/client/views/collections/CollectionTreeView.tsx
index ebd385743..7e1aacd5d 100644
--- a/src/client/views/collections/CollectionTreeView.tsx
+++ b/src/client/views/collections/CollectionTreeView.tsx
@@ -28,6 +28,7 @@ import "./CollectionTreeView.scss";
import React = require("react");
import { ComputedField, ScriptField } from '../../../new_fields/ScriptField';
import { KeyValueBox } from '../nodes/KeyValueBox';
+import { ContextMenuProps } from '../ContextMenuItem';
export interface TreeViewProps {
@@ -49,6 +50,8 @@ export interface TreeViewProps {
treeViewId: string;
parentKey: string;
active: () => boolean;
+ showHeaderFields: () => boolean;
+ preventTreeViewOpen: boolean;
}
library.add(faTrashAlt);
@@ -65,7 +68,12 @@ library.add(faArrowsAltH);
library.add(faPlus, faMinus);
@observer
/**
- * Component that takes in a document prop and a boolean whether it's collapsed or not.
+ * Renders a treeView of a collection of documents
+ *
+ * special fields:
+ * treeViewOpen : flag denoting whether the documents sub-tree (contents) is visible or hidden
+ * preventTreeViewOpen : ignores the treeViewOpen flag (for allowing a view to not be slaved to other views of the document)
+ * treeViewExpandedView : name of field whose contents are being displayed as the document's subtree
*/
class TreeView extends React.Component<TreeViewProps> {
static loadId = "";
@@ -73,7 +81,9 @@ class TreeView extends React.Component<TreeViewProps> {
private _treedropDisposer?: DragManager.DragDropDisposer;
private _dref = React.createRef<HTMLDivElement>();
get defaultExpandedView() { return this.childDocs ? this.fieldKey : "fields"; }
- @observable _collapsed: boolean = true;
+ @observable _overrideTreeViewOpen = false; // override of the treeViewOpen field allowing the display state to be independent of the document's state
+ @computed get treeViewOpen() { return (BoolCast(this.props.document.treeViewOpen) && !this.props.preventTreeViewOpen) || this._overrideTreeViewOpen; }
+ set treeViewOpen(c: boolean) { if (this.props.preventTreeViewOpen) this._overrideTreeViewOpen = c; else this.props.document.treeViewOpen = c; }
@computed get treeViewExpandedView() { return StrCast(this.props.document.treeViewExpandedView, this.defaultExpandedView); }
@computed get MAX_EMBED_HEIGHT() { return NumCast(this.props.document.maxEmbedHeight, 300); }
@computed get dataDoc() { return this.resolvedDataDoc ? this.resolvedDataDoc : this.props.document; }
@@ -146,7 +156,7 @@ class TreeView extends React.Component<TreeViewProps> {
let rect = this._header!.current!.getBoundingClientRect();
let bounds = this.props.ScreenToLocalTransform().transformPoint(rect.left, rect.top + rect.height / 2);
let before = x[1] < bounds[1];
- let inside = x[0] > bounds[0] + 75 || (!before && !this._collapsed);
+ let inside = x[0] > bounds[0] + 75;
this._header!.current!.className = "treeViewItem-header";
if (inside) this._header!.current!.className += " treeViewItem-header-inside";
else if (before) this._header!.current!.className += " treeViewItem-header-above";
@@ -163,20 +173,21 @@ class TreeView extends React.Component<TreeViewProps> {
fontStyle={style}
fontSize={12}
GetValue={() => StrCast(this.props.document[key])}
- SetValue={(value: string) => (Doc.GetProto(this.dataDoc)[key] = value) ? true : true}
- OnFillDown={(value: string) => {
+ SetValue={undoBatch((value: string) => (Doc.GetProto(this.dataDoc)[key] = value) ? true : true)}
+ OnFillDown={undoBatch((value: string) => {
Doc.GetProto(this.dataDoc)[key] = value;
let doc = this.props.document.detailedLayout instanceof Doc ? Doc.ApplyTemplate(Doc.GetProto(this.props.document.detailedLayout)) : undefined;
if (!doc) doc = Docs.Create.FreeformDocument([], { title: "", x: 0, y: 0, width: 100, height: 25, templates: new List<string>([Templates.Title.Layout]) });
TreeView.loadId = doc[Id];
return this.props.addDocument(doc);
- }}
- OnTab={() => this.props.indentDocument && this.props.indentDocument()}
+ })}
+ OnTab={() => { TreeView.loadId = ""; this.props.indentDocument && this.props.indentDocument(); }}
/>)
onWorkspaceContextMenu = (e: React.MouseEvent): void => {
if (!e.isPropagationStopped()) { // need to test this because GoldenLayout causes a parallel hierarchy in the React DOM for its children and the main document view7
if (NumCast(this.props.document.viewType) !== CollectionViewType.Docking) {
+ ContextMenu.Instance.addItem({ description: "Pin to Presentation", event: () => this.props.pinToPres(this.props.document), icon: "tv" });
ContextMenu.Instance.addItem({ description: "Open Tab", event: () => this.props.addDocTab(this.props.document, this.resolvedDataDoc, "inTab"), icon: "folder" });
ContextMenu.Instance.addItem({ description: "Open Right", event: () => this.props.addDocTab(this.props.document, this.resolvedDataDoc, "onRight"), icon: "caret-square-right" });
if (DocumentManager.Instance.getDocumentViews(this.dataDoc).length) {
@@ -200,7 +211,7 @@ class TreeView extends React.Component<TreeViewProps> {
let rect = this._header!.current!.getBoundingClientRect();
let bounds = this.props.ScreenToLocalTransform().transformPoint(rect.left, rect.top + rect.height / 2);
let before = x[1] < bounds[1];
- let inside = x[0] > bounds[0] + 75 || (!before && !this._collapsed);
+ let inside = x[0] > bounds[0] + 75 || (!before && this.treeViewOpen);
if (de.data instanceof DragManager.LinkDragData) {
let sourceDoc = de.data.linkSourceDocument;
let destDoc = this.props.document;
@@ -256,14 +267,14 @@ class TreeView extends React.Component<TreeViewProps> {
let rows: JSX.Element[] = [];
for (let key of Object.keys(ids).slice().sort()) {
let contents = doc[key];
- let contentElement: JSX.Element[] | JSX.Element = [];
+ let contentElement: (JSX.Element | null)[] | JSX.Element = [];
if (contents instanceof Doc || Cast(contents, listSpec(Doc))) {
let remDoc = (doc: Doc) => this.remove(doc, key);
- let addDoc = (doc: Doc, addBefore?: Doc, before?: boolean) => Doc.AddDocToList(this.dataDoc, key, doc, addBefore, before, !BoolCast(this.props.document.stackingHeadersSortDescending));
+ let addDoc = (doc: Doc, addBefore?: Doc, before?: boolean) => Doc.AddDocToList(this.dataDoc, key, doc, addBefore, before, !BoolCast(this.props.document.stackingHeadersSortDescending, true));
contentElement = TreeView.GetChildElements(contents instanceof Doc ? [contents] :
DocListCast(contents), this.props.treeViewId, doc, undefined, key, addDoc, remDoc, this.move,
- this.props.dropAction, this.props.addDocTab, this.props.pinToPres, this.props.ScreenToLocalTransform, this.props.outerXf, this.props.active, this.props.panelWidth, this.props.renderDepth);
+ this.props.dropAction, this.props.addDocTab, this.props.pinToPres, this.props.ScreenToLocalTransform, this.props.outerXf, this.props.active, this.props.panelWidth, this.props.renderDepth, this.props.showHeaderFields, this.props.preventTreeViewOpen);
} else {
contentElement = <EditableView
key="editableView"
@@ -288,14 +299,14 @@ class TreeView extends React.Component<TreeViewProps> {
const expandKey = this.treeViewExpandedView === this.fieldKey ? this.fieldKey : this.treeViewExpandedView === "links" ? "links" : undefined;
if (expandKey !== undefined) {
let remDoc = (doc: Doc) => this.remove(doc, expandKey);
- let addDoc = (doc: Doc, addBefore?: Doc, before?: boolean) => Doc.AddDocToList(this.dataDoc, expandKey, doc, addBefore, before, !BoolCast(this.props.document.stackingHeadersSortDescending));
+ let addDoc = (doc: Doc, addBefore?: Doc, before?: boolean) => Doc.AddDocToList(this.dataDoc, expandKey, doc, addBefore, before, !BoolCast(this.props.document.stackingHeadersSortDescending, true));
let docs = expandKey === "links" ? this.childLinks : this.childDocs;
return <ul key={expandKey + "more"}>
{!docs ? (null) :
TreeView.GetChildElements(docs as Doc[], this.props.treeViewId, this.props.document.layout as Doc,
this.resolvedDataDoc, expandKey, addDoc, remDoc, this.move,
this.props.dropAction, this.props.addDocTab, this.props.pinToPres, this.props.ScreenToLocalTransform,
- this.props.outerXf, this.props.active, this.props.panelWidth, this.props.renderDepth)}
+ this.props.outerXf, this.props.active, this.props.panelWidth, this.props.renderDepth, this.props.showHeaderFields, this.props.preventTreeViewOpen)}
</ul >;
} else if (this.treeViewExpandedView === "fields") {
return <ul><div ref={this._dref} style={{ display: "inline-block" }} key={this.props.document[Id] + this.props.document.title}>
@@ -329,8 +340,8 @@ class TreeView extends React.Component<TreeViewProps> {
@computed
get renderBullet() {
- return <div className="bullet" onClick={action(() => this._collapsed = !this._collapsed)} style={{ color: StrCast(this.props.document.color, "black"), opacity: 0.4 }}>
- {<FontAwesomeIcon icon={this._collapsed ? (this.childDocs ? "caret-square-right" : "caret-right") : (this.childDocs ? "caret-square-down" : "caret-down")} />}
+ return <div className="bullet" onClick={action(() => this.treeViewOpen = !this.treeViewOpen)} style={{ color: StrCast(this.props.document.color, "black"), opacity: 0.4 }}>
+ {<FontAwesomeIcon icon={!this.treeViewOpen ? (this.childDocs ? "caret-square-right" : "caret-right") : (this.childDocs ? "caret-square-down" : "caret-down")} />}
</div>;
}
/**
@@ -344,13 +355,13 @@ class TreeView extends React.Component<TreeViewProps> {
let headerElements = (
<span className="collectionTreeView-keyHeader" key={this.treeViewExpandedView}
onPointerDown={action(() => {
- if (!this._collapsed) {
+ if (this.treeViewOpen) {
this.props.document.treeViewExpandedView = this.treeViewExpandedView === this.fieldKey ? "fields" :
this.treeViewExpandedView === "fields" && this.props.document.layout ? "layout" :
this.treeViewExpandedView === "layout" && this.props.document.links ? "links" :
this.childDocs ? this.fieldKey : "fields";
}
- this._collapsed = false;
+ this.treeViewOpen = true;
})}>
{this.treeViewExpandedView}
</span>);
@@ -368,7 +379,7 @@ class TreeView extends React.Component<TreeViewProps> {
}} >
{this.editableView("title")}
</div >
- {headerElements}
+ {this.props.showHeaderFields() ? headerElements : (null)}
{openRight}
</>;
}
@@ -381,13 +392,13 @@ class TreeView extends React.Component<TreeViewProps> {
{this.renderTitle}
</div>
<div className="treeViewItem-border">
- {this._collapsed ? (null) : this.renderContent}
+ {!this.treeViewOpen ? (null) : this.renderContent}
</div>
</li>
</div>;
}
public static GetChildElements(
- docs: Doc[],
+ docList: Doc[],
treeViewId: string,
containingCollection: Doc,
dataDoc: Doc | undefined,
@@ -402,8 +413,11 @@ class TreeView extends React.Component<TreeViewProps> {
outerXf: () => { translateX: number, translateY: number },
active: () => boolean,
panelWidth: () => number,
- renderDepth: number
+ renderDepth: number,
+ showHeaderFields: () => boolean,
+ preventTreeViewOpen: boolean
) {
+ let docs = docList.filter(child => !child.excludeFromLibrary && child.opacity !== 0);
let viewSpecScript = Cast(containingCollection.viewSpecScript, ScriptField);
if (viewSpecScript) {
let script = viewSpecScript.script;
@@ -418,7 +432,7 @@ class TreeView extends React.Component<TreeViewProps> {
});
}
- let descending = BoolCast(containingCollection.stackingHeadersSortDescending);
+ let descending = BoolCast(containingCollection.stackingHeadersSortDescending, true);
docs.slice().sort(function (a, b): 1 | -1 {
let descA = descending ? b : a;
let descB = descending ? a : b;
@@ -448,11 +462,14 @@ class TreeView extends React.Component<TreeViewProps> {
}
let indent = i === 0 ? undefined : () => {
- if (StrCast(docs[i - 1].layout).indexOf("CollectionView") !== -1) {
+ if (StrCast(docs[i - 1].layout).indexOf("fieldKey") !== -1) {
let fieldKeysub = StrCast(docs[i - 1].layout).split("fieldKey")[1];
let fieldKey = fieldKeysub.split("\"")[1];
- Doc.AddDocToList(docs[i - 1], fieldKey, child);
- remove(child);
+ if (fieldKey && Cast(docs[i - 1][fieldKey], listSpec(Doc)) !== undefined) {
+ Doc.AddDocToList(docs[i - 1], fieldKey, child);
+ docs[i - 1].treeViewOpen = true;
+ remove(child);
+ }
}
};
let addDocument = (doc: Doc, relativeTo?: Doc, before?: boolean) => {
@@ -481,7 +498,9 @@ class TreeView extends React.Component<TreeViewProps> {
ScreenToLocalTransform={screenToLocalXf}
outerXf={outerXf}
parentKey={key}
- active={active} />;
+ active={active}
+ showHeaderFields={showHeaderFields}
+ preventTreeViewOpen={preventTreeViewOpen} />;
});
}
}
@@ -523,6 +542,10 @@ export class CollectionTreeView extends CollectionSubView(Document) {
e.stopPropagation();
e.preventDefault();
ContextMenu.Instance.displayMenu(e.pageX - 15, e.pageY - 15);
+ } else {
+ let layoutItems: ContextMenuProps[] = [];
+ layoutItems.push({ description: this.props.Document.preventTreeViewOpen ? "Persist Treeview State" : "Abandon Treeview State", event: () => this.props.Document.preventTreeViewOpen = !this.props.Document.preventTreeViewOpen, icon: "paint-brush" });
+ ContextMenu.Instance.addItem({ description: "Treeview Options ...", subitems: layoutItems, icon: "eye" });
}
}
outerXf = () => Utils.GetScreenTransform(this._mainEle!);
@@ -561,7 +584,7 @@ export class CollectionTreeView extends CollectionSubView(Document) {
render() {
Doc.UpdateDocumentExtensionForField(this.props.DataDoc ? this.props.DataDoc : this.props.Document, this.props.fieldKey);
let dropAction = StrCast(this.props.Document.dropAction) as dropActionType;
- let addDoc = (doc: Doc, relativeTo?: Doc, before?: boolean) => Doc.AddDocToList(this.props.Document, this.props.fieldKey, doc, relativeTo, before, !BoolCast(this.props.Document.stackingHeadersSortDescending));
+ let addDoc = (doc: Doc, relativeTo?: Doc, before?: boolean) => Doc.AddDocToList(this.props.Document, this.props.fieldKey, doc, relativeTo, before, false, false, !BoolCast(this.props.Document.stackingHeadersSortDescending, true));
let moveDoc = (d: Doc, target: Doc, addDoc: (doc: Doc) => boolean) => this.props.moveDocument(d, target, addDoc);
return !this.childDocs ? (null) : (
<div id="body" className="collectionTreeView-dropTarget"
@@ -575,20 +598,22 @@ export class CollectionTreeView extends CollectionSubView(Document) {
display={"block"}
height={72}
GetValue={() => StrCast(this.resolvedDataDoc.title)}
- SetValue={(value: string) => (Doc.GetProto(this.resolvedDataDoc).title = value) ? true : true}
- OnFillDown={(value: string) => {
+ SetValue={undoBatch((value: string) => (Doc.GetProto(this.resolvedDataDoc).title = value) ? true : true)}
+ OnFillDown={undoBatch((value: string) => {
Doc.GetProto(this.props.Document).title = value;
let doc = this.props.Document.detailedLayout instanceof Doc ? Doc.ApplyTemplate(Doc.GetProto(this.props.Document.detailedLayout)) : undefined;
if (!doc) doc = Docs.Create.FreeformDocument([], { title: "", x: 0, y: 0, width: 100, height: 25, templates: new List<string>([Templates.Title.Layout]) });
TreeView.loadId = doc[Id];
- Doc.AddDocToList(this.props.Document, this.props.fieldKey, doc, this.childDocs.length ? this.childDocs[0] : undefined, true, !BoolCast(this.props.Document.stackingHeadersSortDescending));
- }} />
+ Doc.AddDocToList(this.props.Document, this.props.fieldKey, doc, this.childDocs.length ? this.childDocs[0] : undefined, true, false, false, !BoolCast(this.props.Document.stackingHeadersSortDescending, true));
+ })} />
{this.props.Document.workspaceLibrary ? this.renderNotifsButton : (null)}
{this.props.Document.allowClear ? this.renderClearButton : (null)}
<ul className="no-indent" style={{ width: "max-content" }} >
{
TreeView.GetChildElements(this.childDocs, this.props.Document[Id], this.props.Document, this.props.DataDoc, this.props.fieldKey, addDoc, this.remove,
- moveDoc, dropAction, this.props.addDocTab, this.props.pinToPres, this.props.ScreenToLocalTransform, this.outerXf, this.props.active, this.props.PanelWidth, this.props.renderDepth)
+ moveDoc, dropAction, this.props.addDocTab, this.props.pinToPres, this.props.ScreenToLocalTransform,
+ this.outerXf, this.props.active, this.props.PanelWidth, this.props.renderDepth, () => this.props.Document.chromeStatus !== "disabled",
+ BoolCast(this.props.Document.preventTreeViewOpen))
}
</ul>
</div >
diff --git a/src/client/views/collections/CollectionViewChromes.scss b/src/client/views/collections/CollectionViewChromes.scss
index f39bd877a..64411b5fe 100644
--- a/src/client/views/collections/CollectionViewChromes.scss
+++ b/src/client/views/collections/CollectionViewChromes.scss
@@ -64,7 +64,7 @@
font-size: 75%;
background: rgb(238, 238, 238);
height: 100%;
- width: 150px;
+ width: 75px;
}
.collectionViewBaseChrome-viewSpecsMenu {
@@ -234,4 +234,75 @@
margin-left: 50px;
}
}
+}
+
+
+.commandEntry-outerDiv {
+ display: flex;
+ flex-direction: column;
+ width: 165px;
+ height: 40px;
+}
+.commandEntry-inputArea {
+ display:flex;
+ flex-direction: row;
+ width: 150px;
+ margin: auto 0 auto auto;
+}
+
+.react-autosuggest__container {
+ position: relative;
+ width: 100%;
+ margin-left: 5px;
+ margin-right: 5px;
+}
+
+.react-autosuggest__input {
+ border: 1px solid #aaa;
+ border-radius: 4px;
+ width: 100%;
+}
+
+.react-autosuggest__input--focused {
+ outline: none;
+}
+
+.react-autosuggest__input--open {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+.react-autosuggest__suggestions-container {
+ display: none;
+}
+
+.react-autosuggest__suggestions-container--open {
+ display: block;
+ position: fixed;
+ overflow-y: auto;
+ max-height: 400px;
+ width: 180px;
+ border: 1px solid #aaa;
+ background-color: #fff;
+ font-family: Helvetica, sans-serif;
+ font-weight: 300;
+ font-size: 16px;
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ z-index: 2;
+}
+
+.react-autosuggest__suggestions-list {
+ margin: 0;
+ padding: 0;
+ list-style-type: none;
+}
+
+.react-autosuggest__suggestion {
+ cursor: pointer;
+ padding: 10px 20px;
+}
+
+.react-autosuggest__suggestion--highlighted {
+ background-color: #ddd;
} \ No newline at end of file
diff --git a/src/client/views/collections/CollectionViewChromes.tsx b/src/client/views/collections/CollectionViewChromes.tsx
index 9631243c0..333baf288 100644
--- a/src/client/views/collections/CollectionViewChromes.tsx
+++ b/src/client/views/collections/CollectionViewChromes.tsx
@@ -8,7 +8,7 @@ import { List } from "../../../new_fields/List";
import { listSpec } from "../../../new_fields/Schema";
import { ScriptField } from "../../../new_fields/ScriptField";
import { BoolCast, Cast, NumCast, StrCast } from "../../../new_fields/Types";
-import { Utils } from "../../../Utils";
+import { Utils, emptyFunction } from "../../../Utils";
import { DragManager } from "../../util/DragManager";
import { CompileScript } from "../../util/Scripting";
import { undoBatch } from "../../util/UndoManager";
@@ -18,7 +18,9 @@ import { DocLike } from "../MetadataEntryMenu";
import { CollectionViewType } from "./CollectionBaseView";
import { CollectionView } from "./CollectionView";
import "./CollectionViewChromes.scss";
+import * as Autosuggest from 'react-autosuggest';
import KeyRestrictionRow from "./KeyRestrictionRow";
+import { Docs } from "../../documents/Documents";
const datepicker = require('js-datepicker');
interface CollectionViewChromeProps {
@@ -43,6 +45,8 @@ export class CollectionViewBaseChrome extends React.Component<CollectionViewChro
@observable private _dateWithinValue: string = "";
@observable private _dateValue: Date | string = "";
@observable private _keyRestrictions: [JSX.Element, string][] = [];
+ @observable private suggestions: string[] = [];
+ _commandRef = React.createRef<HTMLInputElement>();
@computed private get filterValue() { return Cast(this.props.CollectionView.props.Document.viewSpecScript, ScriptField); }
private _picker: any;
@@ -276,7 +280,12 @@ export class CollectionViewBaseChrome extends React.Component<CollectionViewChro
protected drop(e: Event, de: DragManager.DropEvent): boolean {
if (de.data instanceof DragManager.DocumentDragData) {
if (de.data.draggedDocuments.length) {
- this.props.CollectionView.props.Document.childLayout = de.data.draggedDocuments[0];
+ if (this._currentKey === "Set Template") {
+ this.props.CollectionView.props.Document.childLayout = de.data.draggedDocuments[0];
+ }
+ if (this._currentKey === "Set Content") {
+ Doc.GetProto(this.props.CollectionView.props.Document).data = new List<Doc>(de.data.draggedDocuments);
+ }
e.stopPropagation();
return true;
}
@@ -297,13 +306,74 @@ export class CollectionViewBaseChrome extends React.Component<CollectionViewChro
datePickerRef = (node: HTMLInputElement) => {
if (node) {
- this._picker = datepicker("#" + node.id, {
- disabler: (date: Date) => date > new Date(),
- onSelect: (instance: any, date: Date) => runInAction(() => this._dateValue = date),
- dateSelected: new Date()
- });
+ try {
+ this._picker = datepicker("#" + node.id, {
+ disabler: (date: Date) => date > new Date(),
+ onSelect: (instance: any, date: Date) => runInAction(() => this._dateValue = date),
+ dateSelected: new Date()
+ });
+ } catch (e) {
+ console.log("date picker exception:" + e);
+ }
}
}
+
+ @observable private _currentKey: string = "";
+ @observable _allCommands: string[] = ["Set Template", "Set Content"];
+ private autosuggestRef = React.createRef<Autosuggest>();
+
+ renderSuggestion = (suggestion: string) => {
+ return <p>{suggestion}</p>;
+ }
+ getSuggestionValue = (suggestion: string) => suggestion;
+
+ @action
+ onKeyChange = (e: React.ChangeEvent, { newValue }: { newValue: string }) => {
+ this._currentKey = newValue;
+ }
+ onSuggestionFetch = async ({ value }: { value: string }) => {
+ const sugg = await this.getKeySuggestions(value);
+ runInAction(() => this.suggestions = sugg);
+ }
+ @action
+ onSuggestionClear = () => {
+ this.suggestions = [];
+ }
+ getKeySuggestions = async (value: string): Promise<string[]> => {
+ return this._allCommands.filter(c => c.indexOf(value) !== -1);
+ }
+
+ autoSuggestDown = (e: React.PointerEvent) => {
+ e.stopPropagation();
+ }
+ dragCommandDown = (e: React.PointerEvent) => {
+ let de = new DragManager.DocumentDragData([this.props.CollectionView.props.Document], [undefined]);
+ DragManager.StartDocumentDrag([this._commandRef.current!], de, e.clientX, e.clientY, {
+ finishDrag: (dropData: { [id: string]: any }) => {
+ let bd = Docs.Create.ButtonDocument({ width: 150, height: 50, title: this._currentKey });
+ let script = `getProto(target).data = copyField(this.source);`;
+ let compiled = CompileScript(script, {
+ params: { doc: Doc.name },
+ capturedVariables: { target: this.props.CollectionView.props.Document },
+ typecheck: false,
+ editable: true
+ });
+ if (compiled.compiled) {
+ let scriptField = new ScriptField(compiled);
+ bd.onClick = scriptField;
+ }
+ dropData.droppedDocuments = [bd];
+ },
+ handlers: {
+ dragComplete: action(() => {
+ }),
+ },
+ hideSource: false
+ });
+ e.preventDefault();
+ e.stopPropagation();
+ }
+
render() {
let collapsed = this.props.CollectionView.props.Document.chromeStatus !== "enabled";
return (
@@ -333,7 +403,7 @@ export class CollectionViewBaseChrome extends React.Component<CollectionViewChro
</select>
<div className="collectionViewBaseChrome-viewSpecs" style={{ display: collapsed ? "none" : "grid" }}>
<input className="collectionViewBaseChrome-viewSpecsInput"
- placeholder="FILTER DOCUMENTS"
+ placeholder="FILTER"
value={this.filterValue ? this.filterValue.script.originalScript === "return true" ? "" : this.filterValue.script.originalScript : ""}
onChange={(e) => { }}
onPointerDown={this.openViewSpecs}
@@ -384,8 +454,19 @@ export class CollectionViewBaseChrome extends React.Component<CollectionViewChro
</div>
</div>
</div>
- <div className="collectionViewBaseChrome-template" ref={this.createDropTarget} style={{}}>
- TEMPLATE
+ <div className="collectionViewBaseChrome-template" ref={this.createDropTarget} >
+ <div className="commandEntry-outerDiv" ref={this._commandRef} onPointerDown={this.dragCommandDown}>
+ <div className="commandEntry-inputArea" onPointerDown={this.autoSuggestDown} >
+ <Autosuggest inputProps={{ value: this._currentKey, onChange: this.onKeyChange }}
+ getSuggestionValue={this.getSuggestionValue}
+ suggestions={this.suggestions}
+ alwaysRenderSuggestions={true}
+ renderSuggestion={this.renderSuggestion}
+ onSuggestionsFetchRequested={this.onSuggestionFetch}
+ onSuggestionsClearRequested={this.onSuggestionClear}
+ ref={this.autosuggestRef} />
+ </div>
+ </div>
</div>
</div>
{this.subChrome()}
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
index 3be6aa3d3..224e8047d 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
@@ -1,17 +1,18 @@
import { library } from "@fortawesome/fontawesome-svg-core";
import { faEye } from "@fortawesome/free-regular-svg-icons";
-import { faCompass, faCompressArrowsAlt, faExpandArrowsAlt, faPaintBrush, faTable, faUpload, faChalkboard, faBraille } from "@fortawesome/free-solid-svg-icons";
-import { action, computed, observable, IReactionDisposer, reaction } from "mobx";
+import { faBraille, faChalkboard, faCompass, faCompressArrowsAlt, faExpandArrowsAlt, faPaintBrush, faTable, faUpload } from "@fortawesome/free-solid-svg-icons";
+import { action, computed, IReactionDisposer, observable, reaction } from "mobx";
import { observer } from "mobx-react";
-import { Doc, DocListCastAsync, HeightSym, WidthSym, DocListCast, FieldResult, Field, Opt } from "../../../../new_fields/Doc";
+import { Doc, DocListCastAsync, Field, FieldResult, HeightSym, Opt, WidthSym } from "../../../../new_fields/Doc";
import { Id } from "../../../../new_fields/FieldSymbols";
import { InkField, StrokeData } from "../../../../new_fields/InkField";
import { createSchema, makeInterface } from "../../../../new_fields/Schema";
import { ScriptField } from "../../../../new_fields/ScriptField";
import { BoolCast, Cast, FieldValue, NumCast, StrCast } from "../../../../new_fields/Types";
-import { emptyFunction, returnOne, Utils, returnFalse, returnEmptyString } from "../../../../Utils";
+import { emptyFunction, returnEmptyString, returnOne, Utils } from "../../../../Utils";
import { CognitiveServices } from "../../../cognitive_services/CognitiveServices";
-import { DocServer } from "../../../DocServer";
+import { Docs } from "../../../documents/Documents";
+import { DocumentType } from "../../../documents/DocumentTypes";
import { DocumentManager } from "../../../util/DocumentManager";
import { DragManager } from "../../../util/DragManager";
import { HistoryUtil } from "../../../util/History";
@@ -29,15 +30,14 @@ import { DocumentViewProps, positionSchema } from "../../nodes/DocumentView";
import { pageSchema } from "../../nodes/ImageBox";
import { OverlayElementOptions, OverlayView } from "../../OverlayView";
import PDFMenu from "../../pdf/PDFMenu";
-import { CollectionSubView } from "../CollectionSubView";
import { ScriptBox } from "../../ScriptBox";
+import { CollectionSubView } from "../CollectionSubView";
import { CollectionFreeFormLinksView } from "./CollectionFreeFormLinksView";
import { CollectionFreeFormRemoteCursors } from "./CollectionFreeFormRemoteCursors";
import "./CollectionFreeFormView.scss";
import { MarqueeView } from "./MarqueeView";
import React = require("react");
-import { Docs } from "../../../documents/Documents";
-import { DocumentType } from "../../../documents/DocumentTypes";
+import { DocServer } from "../../../DocServer";
library.add(faEye as any, faTable, faPaintBrush, faExpandArrowsAlt, faCompressArrowsAlt, faCompass, faUpload, faBraille, faChalkboard);
@@ -345,9 +345,14 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
}, -1);
if (cluster !== -1) {
let eles = this.childDocs.filter(cd => NumCast(cd.cluster) === cluster);
+
+ // hacky way to get a list of DocumentViews in the current view given a list of Documents in the current view
+ let prevSelected = SelectionManager.SelectedDocuments();
this.selectDocuments(eles);
let clusterDocs = SelectionManager.SelectedDocuments();
SelectionManager.DeselectAll();
+ prevSelected.map(dv => SelectionManager.SelectDoc(dv, true));
+
let de = new DragManager.DocumentDragData(eles, eles.map(d => undefined));
de.moveDocument = this.props.moveDocument;
const [left, top] = clusterDocs[0].props.ScreenToLocalTransform().scale(clusterDocs[0].props.ContentScaling()).inverse().transformPoint(0, 0);
@@ -818,6 +823,36 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
onContextMenu = (e: React.MouseEvent) => {
let layoutItems: ContextMenuProps[] = [];
+ layoutItems.push({
+ description: "Import document", icon: "upload", event: () => {
+ const input = document.createElement("input");
+ input.type = "file";
+ input.accept = ".zip";
+ input.onchange = async _e => {
+ const files = input.files;
+ if (!files) return;
+ const file = files[0];
+ let formData = new FormData();
+ formData.append('file', file);
+ formData.append('remap', "true");
+ const upload = Utils.prepend("/uploadDoc");
+ const response = await fetch(upload, { method: "POST", body: formData });
+ const json = await response.json();
+ if (json === "error") {
+ return;
+ }
+ const doc = await DocServer.GetRefField(json);
+ if (!doc || !(doc instanceof Doc)) {
+ return;
+ }
+ const [x, y] = this.props.ScreenToLocalTransform().transformPoint(e.pageX, e.pageY);
+ doc.x = x, doc.y = y;
+ this.props.addDocument &&
+ this.props.addDocument(doc, false);
+ };
+ input.click();
+ }
+ });
layoutItems.push({ description: `${this.fitToBox ? "Unset" : "Set"} Fit To Container`, event: this.fitToContainer, icon: !this.fitToBox ? "expand-arrows-alt" : "compress-arrows-alt" });
layoutItems.push({ description: "reset view", event: () => { this.props.Document.panX = this.props.Document.panY = 0; this.props.Document.scale = 1; }, icon: "compress-arrows-alt" });
layoutItems.push({
@@ -835,12 +870,8 @@ export class CollectionFreeFormView extends CollectionSubView(PanZoomDocument) {
icon: !this.props.Document.useClusters ? "chalkboard" : "chalkboard"
});
layoutItems.push({ description: "Arrange contents in grid", event: this.arrangeContents, icon: "table" });
- ContextMenu.Instance.addItem({ description: "Layout...", subitems: layoutItems, icon: "compass" });
-
- let existingAnalyze = ContextMenu.Instance.findByDescription("Analyzers...");
- let analyzers: ContextMenuProps[] = existingAnalyze && "subitems" in existingAnalyze ? existingAnalyze.subitems : [];
- analyzers.push({ description: "Analyze Strokes", event: this.analyzeStrokes, icon: "paint-brush" });
- !existingAnalyze && ContextMenu.Instance.addItem({ description: "Analyzers...", subitems: analyzers, icon: "hand-point-right" });
+ layoutItems.push({ description: "Analyze Strokes", event: this.analyzeStrokes, icon: "paint-brush" });
+ ContextMenu.Instance.addItem({ description: "Freeform Options ...", subitems: layoutItems, icon: "eye" });
}
diff --git a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
index 4d318c02c..e70d526c5 100644
--- a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
+++ b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
@@ -374,7 +374,7 @@ export class MarqueeView extends React.Component<MarqueeViewProps>
marqueeSelect(selectBackgrounds: boolean = true) {
let selRect = this.Bounds;
let selection: Doc[] = [];
- this.props.activeDocuments().filter(doc => !doc.isBackground).map(doc => {
+ this.props.activeDocuments().filter(doc => !doc.isBackground && doc.z === undefined).map(doc => {
var x = NumCast(doc.x);
var y = NumCast(doc.y);
var w = NumCast(doc.width);
@@ -384,7 +384,7 @@ export class MarqueeView extends React.Component<MarqueeViewProps>
}
});
if (!selection.length && selectBackgrounds) {
- this.props.activeDocuments().map(doc => {
+ this.props.activeDocuments().filter(doc => doc.z === undefined).map(doc => {
var x = NumCast(doc.x);
var y = NumCast(doc.y);
var w = NumCast(doc.width);
@@ -394,6 +394,22 @@ export class MarqueeView extends React.Component<MarqueeViewProps>
}
});
}
+ if (!selection.length) {
+ let left = this._downX < this._lastX ? this._downX : this._lastX;
+ let top = this._downY < this._lastY ? this._downY : this._lastY;
+ let topLeft = this.props.getContainerTransform().transformPoint(left, top);
+ let size = this.props.getContainerTransform().transformDirection(this._lastX - this._downX, this._lastY - this._downY);
+ let otherBounds = { left: topLeft[0], top: topLeft[1], width: Math.abs(size[0]), height: Math.abs(size[1]) };
+ this.props.activeDocuments().filter(doc => doc.z !== undefined).map(doc => {
+ var x = NumCast(doc.x);
+ var y = NumCast(doc.y);
+ var w = NumCast(doc.width);
+ var h = NumCast(doc.height);
+ if (this.intersectRect({ left: x, top: y, width: w, height: h }, otherBounds)) {
+ selection.push(doc);
+ }
+ });
+ }
return selection;
}
diff --git a/src/client/views/nodes/ButtonBox.tsx b/src/client/views/nodes/ButtonBox.tsx
index 8b6f11aac..ca5f0acc2 100644
--- a/src/client/views/nodes/ButtonBox.tsx
+++ b/src/client/views/nodes/ButtonBox.tsx
@@ -15,7 +15,11 @@ import { Doc } from '../../../new_fields/Doc';
import './ButtonBox.scss';
import { observer } from 'mobx-react';
import { DocumentIconContainer } from './DocumentIcon';
-import { StrCast } from '../../../new_fields/Types';
+import { StrCast, BoolCast } from '../../../new_fields/Types';
+import { DragManager } from '../../util/DragManager';
+import { undoBatch } from '../../util/UndoManager';
+import { action, computed } from 'mobx';
+import { List } from '../../../new_fields/List';
library.add(faEdit as any);
@@ -30,10 +34,29 @@ const ButtonDocument = makeInterface(ButtonSchema);
@observer
export class ButtonBox extends DocComponent<FieldViewProps, ButtonDocument>(ButtonDocument) {
public static LayoutString() { return FieldView.LayoutString(ButtonBox); }
+ private dropDisposer?: DragManager.DragDropDisposer;
+ @computed get dataDoc() { return this.props.DataDoc && (BoolCast(this.props.Document.isTemplate) || BoolCast(this.props.DataDoc.isTemplate) || this.props.DataDoc.layout === this.props.Document) ? this.props.DataDoc : Doc.GetProto(this.props.Document); }
+
+
+ protected createDropTarget = (ele: HTMLDivElement) => {
+ if (this.dropDisposer) {
+ this.dropDisposer();
+ }
+ if (ele) {
+ this.dropDisposer = DragManager.MakeDropTarget(ele, { handlers: { drop: this.drop.bind(this) } });
+ }
+ }
+ @undoBatch
+ @action
+ drop = (e: Event, de: DragManager.DropEvent) => {
+ if (de.data instanceof DragManager.DocumentDragData) {
+ Doc.GetProto(this.dataDoc).source = new List<Doc>(de.data.droppedDocuments);
+ }
+ }
render() {
return (
- <div className="buttonBox-outerDiv" >
+ <div className="buttonBox-outerDiv" ref={this.createDropTarget} >
<div className="buttonBox-mainButton" style={{ background: StrCast(this.props.Document.backgroundColor), color: StrCast(this.props.Document.color, "black") }} >{this.Document.text || this.Document.title}</div>
</div>
);
diff --git a/src/client/views/nodes/CollectionFreeFormDocumentView.tsx b/src/client/views/nodes/CollectionFreeFormDocumentView.tsx
index ee596c841..7631ecc6c 100644
--- a/src/client/views/nodes/CollectionFreeFormDocumentView.tsx
+++ b/src/client/views/nodes/CollectionFreeFormDocumentView.tsx
@@ -83,7 +83,7 @@ export class CollectionFreeFormDocumentView extends DocComponent<CollectionFreeF
transformOrigin: "left top",
position: "absolute",
backgroundColor: "transparent",
- boxShadow: this.props.Document.z ? `#9c9396 ${StrCast(this.props.Document.boxShadow, "10px 10px 0.9vw")}` :
+ boxShadow: this.props.Document.opacity === 0 ? undefined : this.props.Document.z ? `#9c9396 ${StrCast(this.props.Document.boxShadow, "10px 10px 0.9vw")}` :
this.clusterColor ? (
this.props.Document.isBackground ? `0px 0px 50px 50px ${this.clusterColor}` :
`${this.clusterColor} ${StrCast(this.props.Document.boxShadow, `0vw 0vw ${50 / this.props.ContentScaling()}px`)}`) : undefined,
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index 9f1d98bb5..31c12c994 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -40,7 +40,7 @@ import { DocumentContentsView } from "./DocumentContentsView";
import "./DocumentView.scss";
import { FormattedTextBox } from './FormattedTextBox';
import React = require("react");
-import { PresBox } from './PresBox';
+import { DocumentType } from '../../documents/DocumentTypes';
const JsxParser = require('react-jsx-parser').default; //TODO Why does this need to be imported like this?
library.add(fa.faTrash);
@@ -295,8 +295,8 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
onClick = async (e: React.MouseEvent) => {
if (e.nativeEvent.cancelBubble) return; // needed because EditableView may stopPropagation which won't apparently stop this event from firing.
- e.stopPropagation();
if (this.onClickHandler && this.onClickHandler.script) {
+ e.stopPropagation();
this.onClickHandler.script.run({ this: this.props.Document.isTemplate && this.props.DataDoc ? this.props.DataDoc : this.props.Document });
e.preventDefault();
return;
@@ -304,6 +304,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
let altKey = e.altKey;
let ctrlKey = e.ctrlKey;
if (this._doubleTap && this.props.renderDepth) {
+ e.stopPropagation();
let fullScreenAlias = Doc.MakeAlias(this.props.Document);
fullScreenAlias.templates = new List<string>();
Doc.UseDetailLayout(fullScreenAlias);
@@ -315,10 +316,13 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
else if (CurrentUserUtils.MainDocId !== this.props.Document[Id] &&
(Math.abs(e.clientX - this._downX) < Utils.DRAG_THRESHOLD &&
Math.abs(e.clientY - this._downY) < Utils.DRAG_THRESHOLD)) {
+ if (BoolCast(this.props.Document.ignoreClick)) {
+ return;
+ }
+ e.stopPropagation();
SelectionManager.SelectDoc(this, e.ctrlKey);
let isExpander = (e.target as any).id === "isExpander";
- if (BoolCast(this.props.Document.isButton) || isExpander) {
- SelectionManager.DeselectAll();
+ if (BoolCast(this.props.Document.isButton) || this.props.Document.type === DocumentType.BUTTON || isExpander) {
let subBulletDocs = await DocListCastAsync(this.props.Document.subBulletDocs);
let maximizedDocs = await DocListCastAsync(this.props.Document.maximizedDocs);
let summarizedDocs = await DocListCastAsync(this.props.Document.summarizedDocs);
@@ -329,6 +333,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
expandedDocs = summarizedDocs ? [...summarizedDocs, ...expandedDocs] : expandedDocs;
// let expandedDocs = [...(subBulletDocs ? subBulletDocs : []), ...(maximizedDocs ? maximizedDocs : []), ...(summarizedDocs ? summarizedDocs : []),];
if (expandedDocs.length) { // bcz: need a better way to associate behaviors with click events on widget-documents
+ SelectionManager.DeselectAll();
let maxLocation = StrCast(this.props.Document.maximizeLocation, "inPlace");
let getDispDoc = (target: Doc) => Object.getOwnPropertyNames(target).indexOf("isPrototype") === -1 ? target : Doc.MakeDelegate(target);
if (altKey || ctrlKey) {
@@ -357,6 +362,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
}
}
else if (linkedDocs.length) {
+ SelectionManager.DeselectAll();
let first = linkedDocs.filter(d => Doc.AreProtosEqual(d.anchor1 as Doc, this.props.Document));
let linkedFwdDocs = first.length ? [first[0].anchor2 as Doc, first[0].anchor1 as Doc] : [expandedDocs[0], expandedDocs[0]];
@@ -394,13 +400,15 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
}
if (this.active) e.stopPropagation(); // events stop at the lowest document that is active.
document.removeEventListener("pointermove", this.onPointerMove);
- document.addEventListener("pointermove", this.onPointerMove);
document.removeEventListener("pointerup", this.onPointerUp);
+ document.addEventListener("pointermove", this.onPointerMove);
document.addEventListener("pointerup", this.onPointerUp);
- // }
}
onPointerMove = (e: PointerEvent): void => {
- if (!e.cancelBubble && this.active) {
+ if (e.cancelBubble && this.active) {
+ document.removeEventListener("pointermove", this.onPointerMove);
+ }
+ else if (!e.cancelBubble && this.active) {
if (!this.props.Document.excludeFromLibrary && (Math.abs(this._downX - e.clientX) > 3 || Math.abs(this._downY - e.clientY) > 3)) {
if (!e.altKey && !this.topMost && e.buttons === 1 && !BoolCast(this.props.Document.lockedPosition)) {
document.removeEventListener("pointermove", this.onPointerMove);
@@ -583,7 +591,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
cm.addItem({ description: "Open...", subitems: subitems, icon: "external-link-alt" });
let existingMake = ContextMenu.Instance.findByDescription("Make...");
let makes: ContextMenuProps[] = existingMake && "subitems" in existingMake ? existingMake.subitems : [];
- makes.push({ description: this.props.Document.isBackground ? "Remove Background" : "Into Background", event: this.makeBackground, icon: BoolCast(this.props.Document.lockedPosition) ? "unlock" : "lock" });
+ makes.push({ description: this.props.Document.isBackground ? "Remove Background" : "Into Background", event: this.makeBackground, icon: this.props.Document.lockedPosition ? "unlock" : "lock" });
makes.push({ description: this.props.Document.isButton ? "Remove Button" : "Into Button", event: this.makeBtnClicked, icon: "concierge-bell" });
makes.push({ description: "OnClick script", icon: "edit", event: () => ScriptBox.EditClickScript(this.props.Document, "onClick") });
makes.push({
@@ -593,6 +601,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
this.makeBtnClicked();
}, icon: "window-restore"
});
+ makes.push({ description: this.props.Document.ignoreClick ? "Selectable" : "Unselectable", event: () => this.props.Document.ignoreClick = !this.props.Document.ignoreClick, icon: this.props.Document.ignoreClick ? "unlock" : "lock" })
!existingMake && cm.addItem({ description: "Make...", subitems: makes, icon: "hand-point-right" });
let existing = ContextMenu.Instance.findByDescription("Layout...");
let layoutItems: ContextMenuProps[] = existing && "subitems" in existing ? existing.subitems : [];
@@ -629,35 +638,6 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
}
});
- cm.addItem({
- description: "Import document", icon: "upload", event: () => {
- const input = document.createElement("input");
- input.type = "file";
- input.accept = ".zip";
- input.onchange = async _e => {
- const files = input.files;
- if (!files) return;
- const file = files[0];
- let formData = new FormData();
- formData.append('file', file);
- formData.append('remap', "true");
- const upload = Utils.prepend("/uploadDoc");
- const response = await fetch(upload, { method: "POST", body: formData });
- const json = await response.json();
- if (json === "error") {
- return;
- }
- const doc = await DocServer.GetRefField(json);
- if (!doc || !(doc instanceof Doc)) {
- return;
- }
- const [x, y] = this.props.ScreenToLocalTransform().transformPoint(e.pageX, e.pageY);
- doc.x = x, doc.y = y;
- this.props.addDocument && this.props.addDocument(doc, false);
- };
- input.click();
- }
- });
cm.addItem({ description: "Delete", event: this.deleteClicked, icon: "trash" });
type User = { email: string, userDocumentId: string };
let usersMenu: ContextMenuProps[] = [];
@@ -745,7 +725,13 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
chromeHeight = () => {
let showOverlays = this.props.showOverlays ? this.props.showOverlays(this.layoutDoc) : undefined;
let showTitle = showOverlays && "title" in showOverlays ? showOverlays.title : StrCast(this.layoutDoc.showTitle);
- return showTitle ? 25 : 0;
+ let templates = Cast(this.layoutDoc.templates, listSpec("string"));
+ if (!showOverlays && templates instanceof List) {
+ templates.map(str => {
+ if (!showTitle && str.indexOf("{props.Document.title}") !== -1) showTitle = "title";
+ });
+ }
+ return (showTitle ? 25 : 0) + 1;// bcz: why 8??
}
get layoutDoc() {
@@ -801,7 +787,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
{!showTitle && !showCaption ? this.contents :
<div style={{ position: "absolute", display: "inline-block", width: "100%", height: "100%", pointerEvents: "none" }}>
- <div style={{ width: "100%", height: showTextTitle ? "calc(100% - 33px)" : "100%", display: "inline-block", position: "absolute", top: showTextTitle ? "29px" : undefined }}>
+ <div style={{ width: "100%", height: showTextTitle ? "calc(100% - 29px)" : "100%", display: "inline-block", position: "absolute", top: showTextTitle ? "29px" : undefined }}>
{this.contents}
</div>
{!showTitle ? (null) :
diff --git a/src/client/views/nodes/FormattedTextBox.tsx b/src/client/views/nodes/FormattedTextBox.tsx
index 9652a3a78..467f10ab8 100644
--- a/src/client/views/nodes/FormattedTextBox.tsx
+++ b/src/client/views/nodes/FormattedTextBox.tsx
@@ -6,7 +6,7 @@ import { baseKeymap } from "prosemirror-commands";
import { history } from "prosemirror-history";
import { keymap } from "prosemirror-keymap";
import { Fragment, Node, Node as ProsNode, NodeType, Slice } from "prosemirror-model";
-import { EditorState, Plugin, Transaction } from "prosemirror-state";
+import { EditorState, Plugin, Transaction, TextSelection } from "prosemirror-state";
import { EditorView } from "prosemirror-view";
import { DateField } from '../../../new_fields/DateField';
import { Doc, DocListCast, Opt, WidthSym } from "../../../new_fields/Doc";
@@ -35,6 +35,8 @@ import React = require("react");
import { GoogleApiClientUtils, Pulls, Pushes } from '../../apis/google_docs/GoogleApiClientUtils';
import { DocumentDecorations } from '../DocumentDecorations';
import { MainOverlayTextBox } from '../MainOverlayTextBox';
+import { DictationManager } from '../../util/DictationManager';
+import { ReplaceStep } from 'prosemirror-transform';
library.add(faEdit);
library.add(faSmile, faTextHeight, faUpload);
@@ -62,7 +64,7 @@ export const GoogleRef = "googleDocId";
type RichTextDocument = makeInterface<[typeof richTextSchema]>;
const RichTextDocument = makeInterface(richTextSchema);
-type PullHandler = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => void;
+type PullHandler = (exportState: GoogleApiClientUtils.ReadResult, dataDoc: Doc) => void;
@observer
export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTextBoxProps), RichTextDocument>(RichTextDocument) {
@@ -85,7 +87,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
private pushReactionDisposer: Opt<IReactionDisposer>;
private dropDisposer?: DragManager.DragDropDisposer;
public get CurrentDiv(): HTMLDivElement { return this._ref.current!; }
- private isGoogleDocsUpdate = false;
@observable _entered = false;
@observable public static InputBoxOverlay?: FormattedTextBox = undefined;
@@ -183,6 +184,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
const marks = tx.storedMarks;
if (marks) { FormattedTextBox._toolTipTextMenu.mark_key_pressed(marks); }
}
+
this._applyingChange = true;
const fieldkey = "preview";
if (this.extensionDoc) this.extensionDoc.text = state.doc.textBetween(0, state.doc.content.size, "\n\n");
@@ -268,6 +270,64 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
}
}
+ recordKeyHandler = (e: KeyboardEvent) => {
+ if (this.props.Document !== SelectionManager.SelectedDocuments()[0].props.Document) {
+ return;
+ }
+ if (e.key === "R" && e.altKey) {
+ e.stopPropagation();
+ e.preventDefault();
+ this.recordBullet();
+ }
+ }
+
+ recordBullet = async () => {
+ let completedCue = "end session";
+ let results = await DictationManager.Controls.listen({
+ interimHandler: this.setCurrentBulletContent,
+ continuous: { indefinite: false },
+ terminators: [completedCue, "bullet", "next"]
+ });
+ if (results && [DictationManager.Controls.Infringed, completedCue].includes(results)) {
+ DictationManager.Controls.stop();
+ return;
+ }
+ this.nextBullet(this._editorView!.state.selection.to);
+ setTimeout(this.recordBullet, 2000);
+ }
+
+ setCurrentBulletContent = (value: string) => {
+ if (this._editorView) {
+ let state = this._editorView.state;
+ let from = state.selection.from;
+ let to = state.selection.to;
+ this._editorView.dispatch(state.tr.insertText(value, from, to));
+ state = this._editorView.state;
+ let updated = TextSelection.create(state.doc, from, from + value.length);
+ this._editorView.dispatch(state.tr.setSelection(updated));
+ }
+ }
+
+ nextBullet = (pos: number) => {
+ if (this._editorView) {
+ let frag = Fragment.fromArray(this.newListItems(2));
+ let slice = new Slice(frag, 2, 2);
+ let state = this._editorView.state;
+ this._editorView.dispatch(state.tr.step(new ReplaceStep(pos, pos, slice)));
+ pos += 4;
+ state = this._editorView.state;
+ this._editorView.dispatch(state.tr.setSelection(TextSelection.create(this._editorView.state.doc, pos, pos)));
+ }
+ }
+
+ private newListItems = (count: number) => {
+ let listItems: any[] = [];
+ for (let i = 0; i < count; i++) {
+ listItems.push(schema.nodes.list_item.create(undefined, schema.nodes.paragraph.create()));
+ }
+ return listItems;
+ }
+
componentDidMount() {
const config = {
schema,
@@ -301,7 +361,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
}
this.pullFromGoogleDoc(this.checkState);
- runInAction(() => DocumentDecorations.Instance.isAnimatingFetch = true);
+ this.dataDoc[GoogleRef] && this.dataDoc.unchanged && runInAction(() => DocumentDecorations.Instance.isAnimatingFetch = true);
this._reactionDisposer = reaction(
() => {
@@ -312,13 +372,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
if (this._editorView && !this._applyingChange) {
let updatedState = JSON.parse(incomingValue);
this._editorView.updateState(EditorState.fromJSON(config, updatedState));
- // manually sets cursor selection at the end of the text on focus
- if (this.isGoogleDocsUpdate) {
- this.isGoogleDocsUpdate = false;
- let end = this._editorView.state.doc.content.size - 1;
- updatedState.selection = { type: "text", anchor: end, head: end };
- this._editorView.updateState(EditorState.fromJSON(config, updatedState));
- }
this.tryUpdateHeight();
}
}
@@ -377,25 +430,24 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
this.unhighlightSearchTerms();
}
}, { fireImmediately: true });
+ setTimeout(() => this.tryUpdateHeight(), 0);
}
pushToGoogleDoc = async () => {
- this.pullFromGoogleDoc(async (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
- let modes = GoogleApiClientUtils.Docs.WriteMode;
+ this.pullFromGoogleDoc(async (exportState: GoogleApiClientUtils.ReadResult, dataDoc: Doc) => {
+ let modes = GoogleApiClientUtils.WriteMode;
let mode = modes.Replace;
- let reference: Opt<GoogleApiClientUtils.Docs.Reference> = Cast(this.dataDoc[GoogleRef], "string");
+ let reference: Opt<GoogleApiClientUtils.Reference> = Cast(this.dataDoc[GoogleRef], "string");
if (!reference) {
mode = modes.Insert;
- reference = {
- title: StrCast(this.dataDoc.title),
- handler: id => this.dataDoc[GoogleRef] = id
- };
+ reference = { service: GoogleApiClientUtils.Service.Documents, title: StrCast(this.dataDoc.title) };
}
let redo = async () => {
let data = Cast(this.dataDoc.data, RichTextField);
if (this._editorView && reference && data) {
let content = data[ToPlainText]();
let response = await GoogleApiClientUtils.Docs.write({ reference, content, mode });
+ response && (this.dataDoc[GoogleRef] = response.documentId);
let pushSuccess = response !== undefined && !("errors" in response);
dataDoc.unchanged = pushSuccess;
DocumentDecorations.Instance.startPushOutcome(pushSuccess);
@@ -415,32 +467,38 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
pullFromGoogleDoc = async (handler: PullHandler) => {
let dataDoc = this.dataDoc;
let documentId = StrCast(dataDoc[GoogleRef]);
- let exportState: GoogleApiClientUtils.Docs.ReadResult = {};
+ let exportState: GoogleApiClientUtils.ReadResult = {};
if (documentId) {
- exportState = await GoogleApiClientUtils.Docs.read({ documentId });
+ exportState = await GoogleApiClientUtils.Docs.read({ identifier: documentId });
}
UndoManager.RunInBatch(() => handler(exportState, dataDoc), Pulls);
}
- updateState = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
+ updateState = (exportState: GoogleApiClientUtils.ReadResult, dataDoc: Doc) => {
let pullSuccess = false;
if (exportState !== undefined && exportState.body !== undefined && exportState.title !== undefined) {
- let data = Cast(dataDoc.data, RichTextField);
- if (data) {
+ const data = Cast(dataDoc.data, RichTextField);
+ if (data instanceof RichTextField) {
pullSuccess = true;
- this.isGoogleDocsUpdate = true;
dataDoc.data = new RichTextField(data[FromPlainText](exportState.body));
+ setTimeout(() => {
+ if (this._editorView) {
+ let state = this._editorView.state;
+ let end = state.doc.content.size - 1;
+ this._editorView.dispatch(state.tr.setSelection(TextSelection.create(state.doc, end, end)));
+ }
+ }, 0);
dataDoc.title = exportState.title;
+ this.Document.customTitle = true;
dataDoc.unchanged = true;
}
} else {
delete dataDoc[GoogleRef];
}
DocumentDecorations.Instance.startPullOutcome(pullSuccess);
- this.tryUpdateHeight();
}
- checkState = (exportState: GoogleApiClientUtils.Docs.ReadResult, dataDoc: Doc) => {
+ checkState = (exportState: GoogleApiClientUtils.ReadResult, dataDoc: Doc) => {
if (exportState !== undefined && exportState.body !== undefined && exportState.title !== undefined) {
let data = Cast(dataDoc.data, RichTextField);
if (data) {
@@ -575,7 +633,6 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
if (!this.props.isOverlay) this.props.select(false);
else this._editorView!.focus();
}
- this.tryUpdateHeight();
}
componentWillUnmount() {
@@ -661,6 +718,9 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
@action
onFocused = (e: React.FocusEvent): void => {
+ document.removeEventListener("keypress", this.recordKeyHandler);
+ document.addEventListener("keypress", this.recordKeyHandler);
+ this.tryUpdateHeight();
if (!this.props.isOverlay) {
FormattedTextBox.InputBoxOverlay = this;
} else {
@@ -710,6 +770,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
});
}
onBlur = (e: any) => {
+ document.removeEventListener("keypress", this.recordKeyHandler);
if (this._undoTyping) {
this._undoTyping.end();
this._undoTyping = undefined;
@@ -738,14 +799,11 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
@action
tryUpdateHeight() {
- if (this.props.Document.autoHeight && this._ref.current!.scrollHeight !== 0) {
- // console.log("DT = " + this.props.Document.title + " " + this._ref.current!.clientHeight + " " + this._ref.current!.scrollHeight + " " + this._ref.current!.textContent);
- let xf = this._ref.current!.getBoundingClientRect();
- let scrBounds = this.props.ScreenToLocalTransform().transformBounds(0, 0, xf.width, this._ref.current!.textContent === "" ? 35 : this._ref.current!.scrollHeight);
+ const ChromeHeight = this.props.ChromeHeight;
+ let sh = this._ref.current ? this._ref.current.scrollHeight : 0;
+ if (this.props.Document.autoHeight && sh !== 0) {
let nh = this.props.Document.isTemplate ? 0 : NumCast(this.dataDoc.nativeHeight, 0);
let dh = NumCast(this.props.Document.height, 0);
- let sh = scrBounds.height;
- const ChromeHeight = MainOverlayTextBox.Instance.ChromeHeight;
this.props.Document.height = Math.max(10, (nh ? dh / nh * sh : sh) + (ChromeHeight ? ChromeHeight() : 0));
this.dataDoc.nativeHeight = nh ? sh : undefined;
}
@@ -781,7 +839,7 @@ export class FormattedTextBox extends DocComponent<(FieldViewProps & FormattedTe
<div className={`formattedTextBox-cont-${style}`} ref={this._ref}
style={{
overflowY: this.props.Document.autoHeight ? "hidden" : "auto",
- height: this.props.height ? this.props.height : undefined,
+ height: this.props.Document.autoHeight ? "max-content" : this.props.height ? this.props.height : undefined,
background: this.props.hideOnLeave ? "rgba(0,0,0 ,0.4)" : undefined,
opacity: this.props.hideOnLeave ? (this._entered || this.props.isSelected() || Doc.IsBrushed(this.props.Document) ? 1 : 0.1) : 1,
color: this.props.color ? this.props.color : this.props.hideOnLeave ? "white" : "inherit",
diff --git a/src/client/views/nodes/KeyValueBox.tsx b/src/client/views/nodes/KeyValueBox.tsx
index 0d4b377dd..653c5c27f 100644
--- a/src/client/views/nodes/KeyValueBox.tsx
+++ b/src/client/views/nodes/KeyValueBox.tsx
@@ -128,7 +128,7 @@ export class KeyValueBox extends React.Component<FieldViewProps> {
let rows: JSX.Element[] = [];
let i = 0;
const self = this;
- for (let key of Object.keys(ids).sort()) {
+ for (let key of Object.keys(ids).slice().sort()) {
rows.push(<KeyValuePair doc={realDoc} ref={(function () {
let oldEl: KeyValuePair | undefined;
return (el: KeyValuePair) => {
diff --git a/src/client/views/nodes/PresBox.tsx b/src/client/views/nodes/PresBox.tsx
index 112d39c32..e376fbddb 100644
--- a/src/client/views/nodes/PresBox.tsx
+++ b/src/client/views/nodes/PresBox.tsx
@@ -12,7 +12,7 @@ import { BoolCast, Cast, FieldValue, NumCast, StrCast } from "../../../new_field
import { Utils } from "../../../Utils";
import { DocumentManager } from "../../util/DocumentManager";
import { undoBatch } from "../../util/UndoManager";
-import PresentationElement, { buttonIndex } from "../presentationview/PresentationElement";
+import PresentationElement from "../presentationview/PresentationElement";
import PresentationViewList from "../presentationview/PresentationList";
import "../presentationview/PresentationView.scss";
import { FieldView, FieldViewProps } from './FieldView';
@@ -45,17 +45,12 @@ export class PresBox extends React.Component<FieldViewProps> { //FieldViewProps?
//Keeping track of the doc for the current presentation -- bcz: keeping a list of current presentations shouldn't be needed. Let users create them, store them, as they see fit.
@computed get curPresentation() { return this.props.Document; }
- //Mapping from presentation ids to a list of doc that represent a group
- @observable groupMappings: Map<String, Doc[]> = new Map();
//mapping from docs to their rendered component
@observable presElementsMappings: Map<Doc, PresentationElement> = new Map();
//variable that holds all the docs in the presentation
@observable childrenDocs: Doc[] = [];
//variable to hold if presentation is started
@observable presStatus: boolean = false;
- //back-up so that presentation stays the way it's when refreshed
- @observable presGroupBackUp: Doc = new Doc();
- @observable presButtonBackUp: Doc = new Doc();
//Mapping of guids to presentations.
@observable presentationsMapping: Map<String, Doc> = new Map();
//Mapping of presentations to guid, so that select option values can be given.
@@ -102,87 +97,11 @@ export class PresBox extends React.Component<FieldViewProps> { //FieldViewProps?
* otherwise initializes.
*/
setPresentationBackUps = async () => {
- //getting both backUp documents
-
- let castedGroupBackUp = Cast(this.curPresentation.presGroupBackUp, Doc);
- let castedButtonBackUp = Cast(this.curPresentation.presButtonBackUp, Doc);
- //if instantiated before
- if (castedGroupBackUp instanceof Promise) {
- castedGroupBackUp.then(doc => {
- let toAssign = doc ? doc : new Doc();
- this.curPresentation.presGroupBackUp = toAssign;
- runInAction(() => this.presGroupBackUp = toAssign);
- if (doc) {
- if (toAssign[Id] === doc[Id]) {
- this.retrieveGroupMappings();
- }
- }
- });
-
- //if never instantiated a store doc yet
- } else if (castedGroupBackUp instanceof Doc) {
- let castedDoc: Doc = await castedGroupBackUp;
- runInAction(() => this.presGroupBackUp = castedDoc);
- this.retrieveGroupMappings();
- } else {
- runInAction(() => {
- let toAssign = new Doc();
- this.presGroupBackUp = toAssign;
- this.curPresentation.presGroupBackUp = toAssign;
-
- });
-
- }
- //if instantiated before
- if (castedButtonBackUp instanceof Promise) {
- castedButtonBackUp.then(doc => {
- let toAssign = doc ? doc : new Doc();
- this.curPresentation.presButtonBackUp = toAssign;
- runInAction(() => this.presButtonBackUp = toAssign);
- });
-
- //if never instantiated a store doc yet
- } else if (castedButtonBackUp instanceof Doc) {
- let castedDoc: Doc = await castedButtonBackUp;
- runInAction(() => this.presButtonBackUp = castedDoc);
-
- } else {
- runInAction(() => {
- let toAssign = new Doc();
- this.presButtonBackUp = toAssign;
- this.curPresentation.presButtonBackUp = toAssign;
- });
-
- }
-
-
//storing the presentation status,ie. whether it was stopped or playing
let presStatusBackUp = BoolCast(this.curPresentation.presStatus);
runInAction(() => this.presStatus = presStatusBackUp);
}
- /**
- * This is the function that is called to retrieve the groups that have been stored and
- * push them to the groupMappings.
- */
- retrieveGroupMappings = async () => {
- let castedGroupDocs = await DocListCastAsync(this.presGroupBackUp.groupDocs);
- if (castedGroupDocs !== undefined) {
- castedGroupDocs.forEach(async (groupDoc: Doc, index: number) => {
- let castedGrouping = await DocListCastAsync(groupDoc.grouping);
- let castedKey = StrCast(groupDoc.presentIdStore, null);
- if (castedGrouping) {
- castedGrouping.forEach((doc: Doc) => {
- doc.presentId = castedKey;
- });
- }
- if (castedGrouping !== undefined && castedKey !== undefined) {
- this.groupMappings.set(castedKey, castedGrouping);
- }
- });
- }
- }
-
//observable means render is re-called every time variable is changed
@observable
collapsed: boolean = false;
@@ -193,17 +112,13 @@ export class PresBox extends React.Component<FieldViewProps> { //FieldViewProps?
if (docAtCurrentNext === undefined) {
return;
}
- //asking for it's presentation id
- let curNextPresId = StrCast(docAtCurrentNext.presentId);
let nextSelected = current + 1;
- //if curDoc is in a group, selection slides until last one, if not it's next one
- if (this.groupMappings.has(curNextPresId)) {
- let currentsArray = this.groupMappings.get(StrCast(docAtCurrentNext.presentId))!;
- nextSelected = current + currentsArray.length - currentsArray.indexOf(docAtCurrentNext);
-
- //end of grup so go beyond
- if (nextSelected === current) nextSelected = current + 1;
+ let presDocs = DocListCast(this.curPresentation.data);
+ for (; nextSelected < presDocs.length - 1; nextSelected++) {
+ if (!this.presElementsMappings.get(presDocs[nextSelected + 1])!.props.document.groupButton) {
+ break;
+ }
}
this.gotoDocument(nextSelected, current);
@@ -219,31 +134,31 @@ export class PresBox extends React.Component<FieldViewProps> { //FieldViewProps?
//asking for its presentation id.
let curPresId = StrCast(docAtCurrent.presentId);
- let prevSelected = current - 1;
+ let prevSelected = current;
let zoomOut: boolean = false;
//checking if this presentation id is mapped to a group, if so chosing the first element in group
- if (this.groupMappings.has(curPresId)) {
- let currentsArray = this.groupMappings.get(StrCast(docAtCurrent.presentId))!;
- prevSelected = current - currentsArray.length + (currentsArray.length - currentsArray.indexOf(docAtCurrent)) - 1;
- //end of grup so go beyond
- if (prevSelected === current) prevSelected = current - 1;
-
- //checking if any of the group members had used zooming in
- currentsArray.forEach((doc: Doc) => {
- //let presElem: PresentationElement | undefined = this.presElementsMappings.get(doc);
- if (this.presElementsMappings.get(doc)!.selected[buttonIndex.Show]) {
- zoomOut = true;
- return;
- }
- });
-
+ let presDocs = DocListCast(this.curPresentation.data);
+ let currentsArray: Doc[] = [];
+ for (; prevSelected > 0 && presDocs[prevSelected].groupButton; prevSelected--) {
+ currentsArray.push(presDocs[prevSelected]);
}
+ prevSelected = Math.max(0, prevSelected - 1);
+
+ //checking if any of the group members had used zooming in
+ currentsArray.forEach((doc: Doc) => {
+ //let presElem: PresentationElement | undefined = this.presElementsMappings.get(doc);
+ if (this.presElementsMappings.get(doc)!.props.document.showButton) {
+ zoomOut = true;
+ return;
+ }
+ });
+
// if a group set that flag to zero or a single element
//If so making sure to zoom out, which goes back to state before zooming action
if (current > 0) {
- if (zoomOut || this.presElementsMappings.get(docAtCurrent)!.selected[buttonIndex.Show]) {
+ if (zoomOut || this.presElementsMappings.get(docAtCurrent)!.showButton) {
let prevScale = NumCast(this.childrenDocs[prevSelected].viewScale, null);
let curScale = DocumentManager.Instance.getScaleOfDocView(this.childrenDocs[current]);
if (prevScale !== undefined) {
@@ -264,19 +179,18 @@ export class PresBox extends React.Component<FieldViewProps> { //FieldViewProps?
*/
showAfterPresented = (index: number) => {
this.presElementsMappings.forEach((presElem: PresentationElement, key: Doc) => {
- let selectedButtons: boolean[] = presElem.selected;
//the order of cases is aligned based on priority
- if (selectedButtons[buttonIndex.HideTillPressed]) {
+ if (presElem.props.document.hideTillShownButton) {
if (this.childrenDocs.indexOf(key) <= index) {
key.opacity = 1;
}
}
- if (selectedButtons[buttonIndex.HideAfter]) {
+ if (presElem.props.document.hideAfterButton) {
if (this.childrenDocs.indexOf(key) < index) {
key.opacity = 0;
}
}
- if (selectedButtons[buttonIndex.FadeAfter]) {
+ if (presElem.props.document.fadeButton) {
if (this.childrenDocs.indexOf(key) < index) {
key.opacity = 0.5;
}
@@ -291,21 +205,19 @@ export class PresBox extends React.Component<FieldViewProps> { //FieldViewProps?
*/
hideIfNotPresented = (index: number) => {
this.presElementsMappings.forEach((presElem: PresentationElement, key: Doc) => {
- let selectedButtons: boolean[] = presElem.selected;
-
//the order of cases is aligned based on priority
- if (selectedButtons[buttonIndex.HideAfter]) {
+ if (presElem.props.document.hideAfterButton) {
if (this.childrenDocs.indexOf(key) >= index) {
key.opacity = 1;
}
}
- if (selectedButtons[buttonIndex.FadeAfter]) {
+ if (presElem.props.document.fadeButton) {
if (this.childrenDocs.indexOf(key) >= index) {
key.opacity = 1;
}
}
- if (selectedButtons[buttonIndex.HideTillPressed]) {
+ if (presElem.props.document.hideTillShownButton) {
if (this.childrenDocs.indexOf(key) > index) {
key.opacity = 0;
}
@@ -320,34 +232,36 @@ export class PresBox extends React.Component<FieldViewProps> { //FieldViewProps?
*/
navigateToElement = async (curDoc: Doc, fromDoc: number) => {
let docToJump: Doc = curDoc;
- let curDocPresId = StrCast(curDoc.presentId, null);
let willZoom: boolean = false;
- //checking if in group
- if (curDocPresId !== undefined) {
- if (this.groupMappings.has(curDocPresId)) {
- let currentDocGroup = this.groupMappings.get(curDocPresId)!;
- currentDocGroup.forEach((doc: Doc, index: number) => {
- let selectedButtons: boolean[] = this.presElementsMappings.get(doc)!.selected;
- if (selectedButtons[buttonIndex.Navigate]) {
- docToJump = doc;
- willZoom = false;
- }
- if (selectedButtons[buttonIndex.Show]) {
- docToJump = doc;
- willZoom = true;
- }
- });
- }
+ let presDocs = DocListCast(this.curPresentation.data);
+ let nextSelected = presDocs.indexOf(curDoc);
+ let currentDocGroups: Doc[] = [];
+ for (; nextSelected < presDocs.length - 1; nextSelected++) {
+ if (!this.presElementsMappings.get(presDocs[nextSelected + 1])!.props.document.groupButton) {
+ break;
+ }
+ currentDocGroups.push(presDocs[nextSelected]);
}
+
+ currentDocGroups.forEach((doc: Doc, index: number) => {
+ if (this.presElementsMappings.get(doc)!.navButton) {
+ docToJump = doc;
+ willZoom = false;
+ }
+ if (this.presElementsMappings.get(doc)!.showButton) {
+ docToJump = doc;
+ willZoom = true;
+ }
+ });
+
//docToJump stayed same meaning, it was not in the group or was the last element in the group
if (docToJump === curDoc) {
//checking if curDoc has navigation open
- let curDocButtons = this.presElementsMappings.get(curDoc)!.selected;
- if (curDocButtons[buttonIndex.Navigate]) {
+ if (this.presElementsMappings.get(curDoc)!.navButton) {
DocumentManager.Instance.jumpToDocument(curDoc, false);
- } else if (curDocButtons[buttonIndex.Show]) {
+ } else if (this.presElementsMappings.get(curDoc)!.showButton) {
let curScale = DocumentManager.Instance.getScaleOfDocView(this.childrenDocs[fromDoc]);
//awaiting jump so that new scale can be found, since jumping is async
await DocumentManager.Instance.jumpToDocument(curDoc, true);
@@ -406,69 +320,6 @@ export class PresBox extends React.Component<FieldViewProps> { //FieldViewProps?
//removing the Presentation Element stored for it
this.presElementsMappings.delete(removedDoc);
- let removedDocPresentId = StrCast(removedDoc.presentId);
-
- //Removing it from local mapping of the groups
- if (this.groupMappings.has(removedDocPresentId)) {
- let removedDocsGroup = this.groupMappings.get(removedDocPresentId);
- if (removedDocsGroup) {
- removedDocsGroup.splice(removedDocsGroup.indexOf(removedDoc), 1);
- if (removedDocsGroup.length === 0) {
- this.groupMappings.delete(removedDocPresentId);
- }
- }
- }
-
- //removing it from the backUp of selected Buttons
- // let castedList = Cast(this.presButtonBackUp.selectedButtonDocs, listSpec(Doc));
- // if (castedList) {
- // castedList.forEach(async (doc, indexOfDoc) => {
- // let curDoc = await doc;
- // let curDocId = StrCast(curDoc.docId);
- // if (curDocId === removedDoc[Id]) {
- // if (castedList) {
- // castedList.splice(indexOfDoc, 1);
- // return;
- // }
- // }
- // });
-
- // }
- //removing it from the backUp of selected Buttons
-
- let castedList = Cast(this.presButtonBackUp.selectedButtonDocs, listSpec(Doc));
- if (castedList) {
- for (let doc of castedList) {
- let curDoc = await doc;
- let curDocId = StrCast(curDoc.docId);
- if (curDocId === removedDoc[Id]) {
- castedList.splice(castedList.indexOf(curDoc), 1);
- break;
-
- }
- }
- }
-
- //removing it from the backup of groups
- let castedGroupDocs = await DocListCastAsync(this.presGroupBackUp.groupDocs);
- if (castedGroupDocs) {
- castedGroupDocs.forEach(async (groupDoc: Doc, index: number) => {
- let castedKey = StrCast(groupDoc.presentIdStore, null);
- if (castedKey === removedDocPresentId) {
- let castedGrouping = await DocListCastAsync(groupDoc.grouping);
- if (castedGrouping) {
- castedGrouping.splice(castedGrouping.indexOf(removedDoc), 1);
- if (castedGrouping.length === 0) {
- castedGroupDocs!.splice(castedGroupDocs!.indexOf(groupDoc), 1);
- }
- }
- }
-
- });
-
- }
-
-
}
}
@@ -489,6 +340,7 @@ export class PresBox extends React.Component<FieldViewProps> { //FieldViewProps?
//it'll also execute the necessary actions if presentation is playing.
@action
public gotoDocument = async (index: number, fromDoc: number) => {
+ Doc.UnBrushAllDocs();
const list = FieldValue(Cast(this.curPresentation.data, listSpec(Doc)));
if (!list) {
return;
@@ -509,26 +361,7 @@ export class PresBox extends React.Component<FieldViewProps> { //FieldViewProps?
this.hideIfNotPresented(index);
this.showAfterPresented(index);
}
-
}
-
- //Function that is called to resetGroupIds, so that documents get new groupIds at
- //first load, when presentation is changed.
- resetGroupIds = async () => {
- let castedGroupDocs = await DocListCastAsync(this.presGroupBackUp.groupDocs);
- if (castedGroupDocs !== undefined) {
- castedGroupDocs.forEach(async (groupDoc: Doc, index: number) => {
- let castedGrouping = await DocListCastAsync(groupDoc.grouping);
- if (castedGrouping) {
- castedGrouping.forEach((doc: Doc) => {
- doc.presentId = Utils.GenerateGuid();
- });
- }
- });
- }
- runInAction(() => this.groupMappings = new Map());
- }
-
//Function that sets the store of the children docs.
@action
setChildrenDocs = (docList: Doc[]) => {
@@ -580,21 +413,19 @@ export class PresBox extends React.Component<FieldViewProps> { //FieldViewProps?
//The function that starts the presentation, also checking if actions should be applied
//directly at start.
startPresentation = (startIndex: number) => {
- let selectedButtons: boolean[];
this.presElementsMappings.forEach((component: PresentationElement, doc: Doc) => {
- selectedButtons = component.selected;
- if (selectedButtons[buttonIndex.HideTillPressed]) {
+ if (component.props.document.hideTillShownButton) {
if (this.childrenDocs.indexOf(doc) > startIndex) {
doc.opacity = 0;
}
}
- if (selectedButtons[buttonIndex.HideAfter]) {
+ if (component.props.document.hideAfterButton) {
if (this.childrenDocs.indexOf(doc) < startIndex) {
doc.opacity = 0;
}
}
- if (selectedButtons[buttonIndex.FadeAfter]) {
+ if (component.props.document.fadeButton) {
if (this.childrenDocs.indexOf(doc) < startIndex) {
doc.opacity = 0.5;
}
@@ -684,12 +515,9 @@ export class PresBox extends React.Component<FieldViewProps> { //FieldViewProps?
mainDocument={this.curPresentation}
deleteDocument={this.RemoveDoc}
gotoDocument={this.gotoDocument}
- groupMappings={this.groupMappings}
PresElementsMappings={this.presElementsMappings}
setChildrenDocs={this.setChildrenDocs}
presStatus={this.presStatus}
- presButtonBackUp={this.presButtonBackUp}
- presGroupBackUp={this.presGroupBackUp}
removeDocByRef={this.removeDocByRef}
clearElemMap={() => this.presElementsMappings.clear()}
/>
diff --git a/src/client/views/nodes/VideoBox.tsx b/src/client/views/nodes/VideoBox.tsx
index 704030d85..3f4ee8960 100644
--- a/src/client/views/nodes/VideoBox.tsx
+++ b/src/client/views/nodes/VideoBox.tsx
@@ -34,7 +34,7 @@ library.add(faVideo);
export class VideoBox extends DocComponent<FieldViewProps, VideoDocument>(VideoDocument) {
private _reactionDisposer?: IReactionDisposer;
private _youtubeReactionDisposer?: IReactionDisposer;
- private _youtubePlayer: any = undefined;
+ private _youtubePlayer: YT.Player | undefined = undefined;
private _videoRef: HTMLVideoElement | null = null;
private _youtubeIframeId: number = -1;
private _youtubeContentCreated = false;
@@ -78,7 +78,7 @@ export class VideoBox extends DocComponent<FieldViewProps, VideoDocument>(VideoD
@action public Pause = (update: boolean = true) => {
this.Playing = false;
update && this.player && this.player.pause();
- update && this._youtubePlayer && this._youtubePlayer.pauseVideo();
+ update && this._youtubePlayer && this._youtubePlayer.pauseVideo && this._youtubePlayer.pauseVideo();
this._youtubePlayer && this._playTimer && clearInterval(this._playTimer);
this._playTimer = undefined;
this.updateTimecode();
@@ -244,7 +244,7 @@ export class VideoBox extends DocComponent<FieldViewProps, VideoDocument>(VideoD
let onYoutubePlayerStateChange = (event: any) => runInAction(() => {
if (started && event.data === YT.PlayerState.PLAYING) {
started = false;
- this._youtubePlayer.unMute();
+ this._youtubePlayer && this._youtubePlayer.unMute();
this.Pause();
return;
}
diff --git a/src/client/views/presentationview/PresentationElement.tsx b/src/client/views/presentationview/PresentationElement.tsx
index 912970a50..83413814f 100644
--- a/src/client/views/presentationview/PresentationElement.tsx
+++ b/src/client/views/presentationview/PresentationElement.tsx
@@ -1,21 +1,19 @@
import { library } from '@fortawesome/fontawesome-svg-core';
import { faFile as fileRegular } from '@fortawesome/free-regular-svg-icons';
-import { faArrowUp, faFile as fileSolid, faFileDownload, faLocationArrow, faSearch, faArrowRight } from '@fortawesome/free-solid-svg-icons';
+import { faArrowRight, faArrowUp, faFile as fileSolid, faFileDownload, faLocationArrow, faSearch } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { action, computed, observable, runInAction } from "mobx";
+import { action, computed } from "mobx";
import { observer } from "mobx-react";
import { Doc } from "../../../new_fields/Doc";
import { Id } from "../../../new_fields/FieldSymbols";
-import { List } from "../../../new_fields/List";
-import { listSpec } from "../../../new_fields/Schema";
-import { BoolCast, Cast, NumCast, StrCast } from "../../../new_fields/Types";
-import { Utils, returnFalse, emptyFunction, returnOne, returnEmptyString } from "../../../Utils";
+import { BoolCast, NumCast, StrCast } from "../../../new_fields/Types";
+import { emptyFunction, returnEmptyString, returnFalse, returnOne } from "../../../Utils";
+import { DocumentType } from "../../documents/DocumentTypes";
import { DragManager, dropActionType, SetupDrag } from "../../util/DragManager";
import { SelectionManager } from "../../util/SelectionManager";
-import { ContextMenu } from "../ContextMenu";
import { Transform } from "../../util/Transform";
+import { ContextMenu } from "../ContextMenu";
import { DocumentView } from "../nodes/DocumentView";
-import { DocumentType } from "../../documents/DocumentTypes";
import React = require("react");
@@ -33,26 +31,9 @@ interface PresentationElementProps {
deleteDocument(index: number): void;
gotoDocument(index: number, fromDoc: number): Promise<void>;
allListElements: Doc[];
- groupMappings: Map<String, Doc[]>;
presStatus: boolean;
- presButtonBackUp: Doc;
- presGroupBackUp: Doc;
removeDocByRef(doc: Doc): boolean;
PresElementsMappings: Map<Doc, PresentationElement>;
-
-
-}
-
-//enum for the all kinds of buttons a doc in presentation can have
-export enum buttonIndex {
- Show = 0,
- Navigate = 1,
- HideTillPressed = 2,
- FadeAfter = 3,
- HideAfter = 4,
- Group = 5,
- OpenRight = 6
-
}
/**
@@ -62,37 +43,33 @@ export enum buttonIndex {
@observer
export default class PresentationElement extends React.Component<PresentationElementProps> {
- @observable private selectedButtons: boolean[];
private header?: HTMLDivElement | undefined;
private listdropDisposer?: DragManager.DragDropDisposer;
- private presElRef: React.RefObject<HTMLDivElement>;
- private backUpDoc: Doc | undefined;
-
-
- constructor(props: PresentationElementProps) {
- super(props);
- this.selectedButtons = new Array(7);
-
- this.presElRef = React.createRef();
- }
-
+ private presElRef: React.RefObject<HTMLDivElement> = React.createRef();
componentWillUnmount() {
this.listdropDisposer && this.listdropDisposer();
}
+ @computed get currentIndex() { return NumCast(this.props.mainDocument.selectedDoc); }
- /**
- * Getter to get the status of the buttons.
- */
- @computed
- get selected() {
- return this.selectedButtons;
- }
+ @computed get showButton() { return BoolCast(this.props.document.showButton); }
+ @computed get navButton() { return BoolCast(this.props.document.navButton); }
+ @computed get hideTillShownButton() { return BoolCast(this.props.document.hideTillShownButton); }
+ @computed get fadeButton() { return BoolCast(this.props.document.fadeButton); }
+ @computed get hideAfterButton() { return BoolCast(this.props.document.hideAfterButton); }
+ @computed get groupButton() { return BoolCast(this.props.document.groupButton); }
+ @computed get openRightButton() { return BoolCast(this.props.document.openRightButton); }
+ set showButton(val: boolean) { this.props.document.showButton = val; }
+ set navButton(val: boolean) { this.props.document.navButton = val; }
+ set hideTillShownButton(val: boolean) { this.props.document.hideTillShownButton = val; }
+ set fadeButton(val: boolean) { this.props.document.fadeButton = val; }
+ set hideAfterButton(val: boolean) { this.props.document.hideAfterButton = val; }
+ set groupButton(val: boolean) { this.props.document.groupButton = val; }
+ set openRightButton(val: boolean) { this.props.document.openRightButton = val; }
//Lifecycle function that makes sure that button BackUp is received when mounted.
async componentDidMount() {
- this.receiveButtonBackUp();
if (this.presElRef.current) {
this.header = this.presElRef.current;
this.createListDropTarget(this.presElRef.current);
@@ -107,156 +84,9 @@ export default class PresentationElement extends React.Component<PresentationEle
}
}
- /**
- * Function that will be called to receive stored backUp for buttons
- */
- receiveButtonBackUp = async () => {
-
- //get the list that stores docs that keep track of buttons
- let castedList = Cast(this.props.presButtonBackUp.selectedButtonDocs, listSpec(Doc));
- if (!castedList) {
- this.props.presButtonBackUp.selectedButtonDocs = castedList = new List<Doc>();
- }
-
- let foundDoc: boolean = false;
-
- //if this is the first time this doc mounts, push a doc for it to store
-
- for (let doc of castedList) {
- let curDoc = await doc;
- let curDocId = StrCast(curDoc.docId);
- if (curDocId === this.props.document[Id]) {
- let selectedButtonOfDoc = Cast(curDoc.selectedButtons, listSpec("boolean"), null);
- if (selectedButtonOfDoc !== undefined) {
- runInAction(() => this.selectedButtons = selectedButtonOfDoc);
- foundDoc = true;
- this.backUpDoc = curDoc;
- break;
- }
- }
- }
-
- if (!foundDoc) {
- let newDoc = new Doc();
- let defaultBooleanArray: boolean[] = new Array(7);
- newDoc.selectedButtons = new List(defaultBooleanArray);
- newDoc.docId = this.props.document[Id];
- castedList.push(newDoc);
- this.backUpDoc = newDoc;
- }
-
- }
-
- /**
- * The function that is called to group docs together. It tries to group a doc
- * that turned grouping option with the above document. If that doc is grouped with
- * other documents. Those other documents will be grouped with doc's above document as well.
- */
@action
- onGroupClick = (document: Doc, index: number, buttonStatus: boolean) => {
- let p = this.props;
- if (index >= 1) {
- //checking if options was turned true
- if (buttonStatus) {
- //getting the id of the above-doc and the doc
- let aboveGuid = StrCast(p.allListElements[index - 1].presentId, null);
- let docGuid = StrCast(document.presentId, null);
- //the case where above-doc is already in group
- if (p.groupMappings.has(aboveGuid)) {
- let aboveArray = p.groupMappings.get(aboveGuid)!;
- //case where doc is already in group
- if (p.groupMappings.has(docGuid)) {
- let docsArray = p.groupMappings.get(docGuid)!;
- docsArray.forEach((doc: Doc) => {
- if (!aboveArray.includes(doc)) {
- aboveArray.push(doc);
- }
- doc.presentId = aboveGuid;
- });
- p.groupMappings.delete(docGuid);
- //the case where doc was not in group
- } else {
- if (!aboveArray.includes(document)) {
- aboveArray.push(document);
-
- }
-
- }
- //the case where above-doc was not in group
- } else {
- let newAboveArray: Doc[] = [];
- newAboveArray.push(p.allListElements[index - 1]);
-
- //the case where doc is in group
- if (p.groupMappings.has(docGuid)) {
- let docsArray = p.groupMappings.get(docGuid)!;
- docsArray.forEach((doc: Doc) => {
- newAboveArray.push(doc);
- doc.presentId = aboveGuid;
- });
- p.groupMappings.delete(docGuid);
-
- //the case where doc is not in a group
- } else {
- newAboveArray.push(document);
-
- }
- p.groupMappings.set(aboveGuid, newAboveArray);
-
- }
- document.presentId = aboveGuid;
-
- //when grouping is turned off
- } else {
- let curArray = p.groupMappings.get(StrCast(document.presentId, Utils.GenerateGuid()))!;
- let targetIndex = curArray.indexOf(document);
- let firstPart = curArray.slice(0, targetIndex);
- let firstPartNewGuid = Utils.GenerateGuid();
- firstPart.forEach((doc: Doc) => doc.presentId = firstPartNewGuid);
- let secondPart = curArray.slice(targetIndex);
- p.groupMappings.set(StrCast(p.allListElements[index - 1].presentId, Utils.GenerateGuid()), firstPart);
- p.groupMappings.set(StrCast(document.presentId, Utils.GenerateGuid()), secondPart);
-
-
- }
-
- }
- this.autoSaveGroupChanges();
-
- }
-
-
- /**
- * This function is called at the end of each group update to update the group updates.
- */
- @action
- autoSaveGroupChanges = () => {
- let castedList: List<Doc> = new List<Doc>();
- this.props.presGroupBackUp.groupDocs = castedList;
- this.props.groupMappings.forEach((docArray: Doc[], id: String) => {
- //create a new doc for each group
- let newGroupDoc = new Doc();
- castedList.push(newGroupDoc);
- //store the id of the group in the doc
- newGroupDoc.presentIdStore = id.toString();
- //store the doc array which represents the group in the doc
- newGroupDoc.grouping = new List(docArray);
- });
-
- }
-
- /**
- * Function that is called on click to change the group status of a docus, by turning the option on/off.
- */
- @action
- changeGroupStatus = () => {
- if (this.selectedButtons[buttonIndex.Group]) {
- this.selectedButtons[buttonIndex.Group] = false;
- } else {
- this.selectedButtons[buttonIndex.Group] = true;
- }
- this.autoSaveButtonChange(buttonIndex.Group);
-
+ onGroupClick = (e: React.MouseEvent) => {
+ this.groupButton = !this.groupButton;
}
/**
@@ -266,31 +96,18 @@ export default class PresentationElement extends React.Component<PresentationEle
@action
onHideDocumentUntilPressClick = (e: React.MouseEvent) => {
e.stopPropagation();
- const current = NumCast(this.props.mainDocument.selectedDoc);
- if (this.selectedButtons[buttonIndex.HideTillPressed]) {
- this.selectedButtons[buttonIndex.HideTillPressed] = false;
- if (this.props.index >= current) {
+ this.hideTillShownButton = !this.hideTillShownButton;
+ if (!this.hideTillShownButton) {
+ if (this.props.index >= this.currentIndex) {
this.props.document.opacity = 1;
}
} else {
- this.selectedButtons[buttonIndex.HideTillPressed] = true;
if (this.props.presStatus) {
- if (this.props.index > current) {
+ if (this.props.index > this.currentIndex) {
this.props.document.opacity = 0;
}
}
}
- this.autoSaveButtonChange(buttonIndex.HideTillPressed);
- }
-
- /**
- * This function is called to get the updates for the changed buttons.
- */
- @action
- autoSaveButtonChange = async (index: buttonIndex) => {
- if (this.backUpDoc) {
- this.backUpDoc.selectedButtons = new List(this.selectedButtons);
- }
}
/**
@@ -301,25 +118,19 @@ export default class PresentationElement extends React.Component<PresentationEle
@action
onHideDocumentAfterPresentedClick = (e: React.MouseEvent) => {
e.stopPropagation();
- const current = NumCast(this.props.mainDocument.selectedDoc);
- if (this.selectedButtons[buttonIndex.HideAfter]) {
- this.selectedButtons[buttonIndex.HideAfter] = false;
- if (this.props.index <= current) {
+ this.hideAfterButton = !this.hideAfterButton;
+ if (!this.hideAfterButton) {
+ if (this.props.index <= this.currentIndex) {
this.props.document.opacity = 1;
}
} else {
- if (this.selectedButtons[buttonIndex.FadeAfter]) {
- this.selectedButtons[buttonIndex.FadeAfter] = false;
- }
- this.selectedButtons[buttonIndex.HideAfter] = true;
+ if (this.fadeButton) this.fadeButton = false;
if (this.props.presStatus) {
- if (this.props.index < current) {
+ if (this.props.index < this.currentIndex) {
this.props.document.opacity = 0;
}
}
}
- this.autoSaveButtonChange(buttonIndex.HideAfter);
-
}
/**
@@ -330,25 +141,19 @@ export default class PresentationElement extends React.Component<PresentationEle
@action
onFadeDocumentAfterPresentedClick = (e: React.MouseEvent) => {
e.stopPropagation();
- const current = NumCast(this.props.mainDocument.selectedDoc);
- if (this.selectedButtons[buttonIndex.FadeAfter]) {
- this.selectedButtons[buttonIndex.FadeAfter] = false;
- if (this.props.index <= current) {
+ this.fadeButton = !this.fadeButton;
+ if (!this.fadeButton) {
+ if (this.props.index <= this.currentIndex) {
this.props.document.opacity = 1;
}
} else {
- if (this.selectedButtons[buttonIndex.HideAfter]) {
- this.selectedButtons[buttonIndex.HideAfter] = false;
- }
- this.selectedButtons[buttonIndex.FadeAfter] = true;
+ this.hideAfterButton = false;
if (this.props.presStatus) {
- if (this.props.index < current) {
+ if (this.props.index < this.currentIndex) {
this.props.document.opacity = 0.5;
}
}
}
- this.autoSaveButtonChange(buttonIndex.FadeAfter);
-
}
/**
@@ -357,22 +162,13 @@ export default class PresentationElement extends React.Component<PresentationEle
@action
onNavigateDocumentClick = (e: React.MouseEvent) => {
e.stopPropagation();
- if (this.selectedButtons[buttonIndex.Navigate]) {
- this.selectedButtons[buttonIndex.Navigate] = false;
-
- } else {
- if (this.selectedButtons[buttonIndex.Show]) {
- this.selectedButtons[buttonIndex.Show] = false;
- }
- this.selectedButtons[buttonIndex.Navigate] = true;
- const current = NumCast(this.props.mainDocument.selectedDoc);
- if (current === this.props.index) {
+ this.navButton = !this.navButton;
+ if (this.navButton) {
+ this.showButton = false;
+ if (this.currentIndex === this.props.index) {
this.props.gotoDocument(this.props.index, this.props.index);
}
}
-
- this.autoSaveButtonChange(buttonIndex.Navigate);
-
}
/**
@@ -381,23 +177,16 @@ export default class PresentationElement extends React.Component<PresentationEle
@action
onZoomDocumentClick = (e: React.MouseEvent) => {
e.stopPropagation();
- if (this.selectedButtons[buttonIndex.Show]) {
- this.selectedButtons[buttonIndex.Show] = false;
- this.props.document.viewScale = 1;
+ this.showButton = !this.showButton;
+ if (!this.showButton) {
+ this.props.document.viewScale = 1;
} else {
- if (this.selectedButtons[buttonIndex.Navigate]) {
- this.selectedButtons[buttonIndex.Navigate] = false;
- }
- this.selectedButtons[buttonIndex.Show] = true;
- const current = NumCast(this.props.mainDocument.selectedDoc);
- if (current === this.props.index) {
+ this.navButton = false;
+ if (this.currentIndex === this.props.index) {
this.props.gotoDocument(this.props.index, this.props.index);
}
}
-
- this.autoSaveButtonChange(buttonIndex.Show);
-
}
/**
@@ -407,13 +196,8 @@ export default class PresentationElement extends React.Component<PresentationEle
@action
onRightTabClick = (e: React.MouseEvent) => {
e.stopPropagation();
- if (this.selectedButtons[buttonIndex.OpenRight]) {
- this.selectedButtons[buttonIndex.OpenRight] = false;
- // action maybe
- } else {
- this.selectedButtons[buttonIndex.OpenRight] = true;
- }
- this.autoSaveButtonChange(buttonIndex.OpenRight);
+
+ this.openRightButton = !this.openRightButton;
}
/**
@@ -449,8 +233,6 @@ export default class PresentationElement extends React.Component<PresentationEle
//where does treeViewId come from
let movedDocs = (de.data.options === this.props.mainDocument[Id] ? de.data.draggedDocuments : de.data.droppedDocuments);
//console.log("How is this causing an issue");
- let droppedDoc: Doc = de.data.droppedDocuments[0];
- await this.updateGroupsOnDrop(droppedDoc, de);
document.removeEventListener("pointermove", this.onDragMove, true);
return (de.data.dropAction || de.data.userDropAction) ?
de.data.droppedDocuments.reduce((added: boolean, d: Doc) => Doc.AddDocToList(this.props.mainDocument, "data", d, this.props.document, before) || added, false)
@@ -463,221 +245,13 @@ export default class PresentationElement extends React.Component<PresentationEle
return false;
}
- /**
- * This method is called to update groups when the user drags and drops an
- * element to a different place. It follows the default behaviour and reconstructs
- * the groups in the way they would appear if clicked by user.
- */
- updateGroupsOnDrop = async (droppedDoc: Doc, de: DragManager.DropEvent) => {
-
- let x = this.ScreenToLocalListTransform(de.x, de.y);
- let rect = this.header!.getBoundingClientRect();
- let bounds = this.ScreenToLocalListTransform(rect.left, rect.top + rect.height / 2);
- let before = x[1] < bounds[1];
-
- let droppedDocIndex = this.props.allListElements.indexOf(droppedDoc);
-
- let dropIndexDiff = droppedDocIndex - this.props.index;
-
- //checking if the position it's dropped corresponds to current location with 3 cases.
- if (droppedDocIndex === this.props.index) {
- return;
- }
-
- if (dropIndexDiff === 1 && !before) {
- return;
- }
- if (dropIndexDiff === -1 && before) {
- return;
- }
-
- let p = this.props;
- let droppedDocSelectedButtons: boolean[] = await this.getSelectedButtonsOfDoc(droppedDoc);
- let curDocGuid = StrCast(droppedDoc.presentId, null);
-
- //Splicing the doc from its current group, since it's moved
- if (p.groupMappings.has(curDocGuid)) {
- let groupArray = this.props.groupMappings.get(curDocGuid)!;
-
- if (droppedDocSelectedButtons[buttonIndex.Group]) {
- let groupIndexOfDrop = groupArray.indexOf(droppedDoc);
- let firstPart = groupArray.splice(0, groupIndexOfDrop);
-
- if (firstPart.length > 1) {
- let newGroupGuid = Utils.GenerateGuid();
- firstPart.forEach((doc: Doc) => doc.presentId = newGroupGuid);
- this.props.groupMappings.set(newGroupGuid, firstPart);
- }
- }
-
- groupArray.splice(groupArray.indexOf(droppedDoc), 1);
- if (groupArray.length === 0) {
- this.props.groupMappings.delete(curDocGuid);
- }
- droppedDoc.presentId = Utils.GenerateGuid();
-
- //making sure to correct to groups after splicing, in case the dragged element
- //had the grouping on.
- let indexOfBelow = droppedDocIndex + 1;
- if (indexOfBelow < this.props.allListElements.length && indexOfBelow > 1) {
- let selectedButtonsOrigBelow: boolean[] = await this.getSelectedButtonsOfDoc(this.props.allListElements[indexOfBelow]);
- let aboveBelowDoc: Doc = this.props.allListElements[droppedDocIndex - 1];
- let aboveBelowDocSelectedButtons: boolean[] = await this.getSelectedButtonsOfDoc(aboveBelowDoc);
- let belowDoc: Doc = this.props.allListElements[indexOfBelow];
- let belowDocPresId = StrCast(belowDoc.presentId);
-
- if (selectedButtonsOrigBelow[buttonIndex.Group]) {
- let belowDocGroup: Doc[] = this.props.groupMappings.get(belowDocPresId)!;
- if (aboveBelowDocSelectedButtons[buttonIndex.Group]) {
- let aboveBelowDocPresId = StrCast(aboveBelowDoc.presentId);
- if (this.props.groupMappings.has(aboveBelowDocPresId)) {
- let aboveBelowDocGroup: Doc[] = this.props.groupMappings.get(aboveBelowDocPresId)!;
- aboveBelowDocGroup.push(...belowDocGroup);
- this.props.groupMappings.delete(belowDocPresId);
- belowDocGroup.forEach((doc: Doc) => doc.presentId = aboveBelowDocPresId);
-
- }
- } else {
- belowDocGroup.unshift(aboveBelowDoc);
- aboveBelowDoc.presentId = belowDocPresId;
- }
-
-
- }
- }
-
- }
-
- //Case, when the dropped doc had the group button clicked.
- if (droppedDocSelectedButtons[buttonIndex.Group]) {
- if (before) {
- if (this.props.index > 0) {
- let aboveDoc = this.props.allListElements[this.props.index - 1];
- let aboveDocGuid = StrCast(aboveDoc.presentId);
- if (this.props.groupMappings.has(aboveDocGuid)) {
- this.protectOrderAndPush(aboveDocGuid, aboveDoc, droppedDoc);
- } else {
- this.createNewGroup(aboveDoc, droppedDoc, aboveDocGuid);
- }
- } else {
- let propsPresId = StrCast(this.props.document.presentId);
- if (this.selectedButtons[buttonIndex.Group]) {
- let propsArray = this.props.groupMappings.get(propsPresId)!;
- propsArray.unshift(droppedDoc);
- droppedDoc.presentId = propsPresId;
- }
- }
- } else {
- let propsDocGuid = StrCast(this.props.document.presentId);
- if (this.props.groupMappings.has(propsDocGuid)) {
- this.protectOrderAndPush(propsDocGuid, this.props.document, droppedDoc);
-
- } else {
- this.createNewGroup(this.props.document, droppedDoc, propsDocGuid);
- }
- }
-
-
- //if the group button of the element was not clicked.
- } else {
- if (before) {
- if (this.props.index > 0) {
-
- let aboveDoc = this.props.allListElements[this.props.index - 1];
- let aboveDocGuid = StrCast(aboveDoc.presentId);
- let aboveDocSelectedButtons: boolean[] = await this.getSelectedButtonsOfDoc(aboveDoc);
-
-
- if (this.selectedButtons[buttonIndex.Group]) {
- if (aboveDocSelectedButtons[buttonIndex.Group]) {
- let aboveGroupArray = this.props.groupMappings.get(aboveDocGuid)!;
- let propsDocPresId = StrCast(this.props.document.presentId);
-
- this.halveGroupArray(aboveDoc, aboveGroupArray, droppedDoc, propsDocPresId);
-
- } else {
- let belowPresentId = StrCast(this.props.document.presentId);
- let belowGroup = this.props.groupMappings.get(belowPresentId)!;
- belowGroup.splice(belowGroup.indexOf(aboveDoc), 1);
- belowGroup.unshift(droppedDoc);
- droppedDoc.presentId = belowPresentId;
- aboveDoc.presentId = Utils.GenerateGuid();
- }
-
-
- }
- } else {
- let propsPresId = StrCast(this.props.document.presentId);
- if (this.selectedButtons[buttonIndex.Group]) {
- let propsArray = this.props.groupMappings.get(propsPresId)!;
- propsArray.unshift(droppedDoc);
- droppedDoc.presentId = propsPresId;
- }
- }
- } else {
- if (this.props.index < this.props.allListElements.length - 1) {
- let belowDoc = this.props.allListElements[this.props.index + 1];
- let belowDocGuid = StrCast(belowDoc.presentId);
- let belowDocSelectedButtons: boolean[] = await this.getSelectedButtonsOfDoc(belowDoc);
-
- let propsDocGuid = StrCast(this.props.document.presentId);
-
- if (belowDocSelectedButtons[buttonIndex.Group]) {
- let belowGroupArray = this.props.groupMappings.get(belowDocGuid)!;
- if (this.selectedButtons[buttonIndex.Group]) {
-
- let propsGroupArray = this.props.groupMappings.get(propsDocGuid)!;
-
- this.halveGroupArray(this.props.document, propsGroupArray, droppedDoc, belowDocGuid);
-
- } else {
- belowGroupArray.splice(belowGroupArray.indexOf(this.props.document), 1);
- this.props.document.presentId = Utils.GenerateGuid();
- belowGroupArray.unshift(droppedDoc);
- droppedDoc.presentId = belowDocGuid;
- }
- }
-
- }
- }
- }
- this.autoSaveGroupChanges();
-
- }
-
- /**
- * This method returns the selectedButtons boolean array of the passed in doc,
- * retrieving it from the back-up.
- */
- getSelectedButtonsOfDoc = async (paramDoc: Doc) => {
- let castedList = Cast(this.props.presButtonBackUp.selectedButtonDocs, listSpec(Doc));
- let foundSelectedButtons: boolean[] = new Array(7);
-
- //if this is the first time this doc mounts, push a doc for it to store
- for (let doc of castedList!) {
- let curDoc = await doc;
- let curDocId = StrCast(curDoc.docId);
- if (curDocId === paramDoc[Id]) {
- let selectedButtonOfDoc = Cast(curDoc.selectedButtons, listSpec("boolean"), null);
- if (selectedButtonOfDoc !== undefined) {
- return selectedButtonOfDoc;
- }
- }
- }
-
- return foundSelectedButtons;
-
- }
-
//This is used to add dragging as an event.
onPointerEnter = (e: React.PointerEvent): void => {
if (e.buttons === 1 && SelectionManager.GetIsDragging()) {
- let selected = NumCast(this.props.mainDocument.selectedDoc, 0);
this.header!.className = "presentationView-item";
-
- if (selected === this.props.index) {
+ if (this.currentIndex === this.props.index) {
//this doc is selected
this.header!.className = "presentationView-item presentationView-selected";
}
@@ -687,13 +261,9 @@ export default class PresentationElement extends React.Component<PresentationEle
//This is used to remove the dragging when dropped.
onPointerLeave = (e: React.PointerEvent): void => {
- //to get currently selected presentation doc
- let selected = NumCast(this.props.mainDocument.selectedDoc, 0);
-
this.header!.className = "presentationView-item";
-
- if (selected === this.props.index) {
+ if (this.currentIndex === this.props.index) {
//this doc is selected
this.header!.className = "presentationView-item presentationView-selected";
@@ -729,62 +299,6 @@ export default class PresentationElement extends React.Component<PresentationEle
move: DragManager.MoveFunction = (doc: Doc, target: Doc, addDoc) => {
return this.props.document !== target && this.props.removeDocByRef(doc) && addDoc(doc);
}
-
- /**
- * Helper method that gets called to divide a group array into two different groups
- * including the targetDoc in first part.
- * @param targetDoc document that is targeted as slicing point
- * @param propsGroupArray the array that gets divided into 2
- * @param droppedDoc the dropped document
- * @param belowDocGuid presentId of the belowGroup
- */
- private halveGroupArray(targetDoc: Doc, propsGroupArray: Doc[], droppedDoc: Doc, belowDocGuid: string) {
- let targetIndex = propsGroupArray.indexOf(targetDoc);
- let firstPart = propsGroupArray.slice(0, targetIndex + 1);
- let firstPartNewGuid = Utils.GenerateGuid();
- firstPart.forEach((doc: Doc) => doc.presentId = firstPartNewGuid);
- let secondPart = propsGroupArray.slice(targetIndex + 1);
- secondPart.unshift(droppedDoc);
- droppedDoc.presentId = belowDocGuid;
- this.props.groupMappings.set(firstPartNewGuid, firstPart);
- this.props.groupMappings.set(belowDocGuid, secondPart);
- }
-
- /**
- * Helper method that creates a new group, pushing above document first,
- * and dropped document second.
- * @param aboveDoc the document above dropped document
- * @param droppedDoc the dropped document itself
- * @param aboveDocGuid above document's presentId
- */
- private createNewGroup(aboveDoc: Doc, droppedDoc: Doc, aboveDocGuid: string) {
- let newGroup: Doc[] = [];
- newGroup.push(aboveDoc);
- newGroup.push(droppedDoc);
- droppedDoc.presentId = aboveDocGuid;
- this.props.groupMappings.set(aboveDocGuid, newGroup);
- }
-
- /**
- * Helper method that finds the above document's group, and pushes the
- * dropped document into that group, protecting the visual order of the
- * presentation elements.
- * @param aboveDoc the document above dropped document
- * @param droppedDoc the dropped document itself
- * @param aboveDocGuid above document's presentId
- */
- private protectOrderAndPush(aboveDocGuid: string, aboveDoc: Doc, droppedDoc: Doc) {
- let groupArray = this.props.groupMappings.get(aboveDocGuid)!;
- let tempStack: Doc[] = [];
- while (groupArray[groupArray.length - 1] !== aboveDoc) {
- tempStack.push(groupArray.pop()!);
- }
- groupArray.push(droppedDoc);
- droppedDoc.presentId = aboveDocGuid;
- while (tempStack.length !== 0) {
- groupArray.push(tempStack.pop()!);
- }
- }
/**
* This function is a getter to get if a document is in previewMode.
*/
@@ -872,11 +386,8 @@ export default class PresentationElement extends React.Component<PresentationEle
let p = this.props;
let title = p.document.title;
- //to get currently selected presentation doc
- let selected = NumCast(p.mainDocument.selectedDoc, 0);
-
let className = " presentationView-item";
- if (selected === p.index) {
+ if (this.currentIndex === p.index) {
//this doc is selected
className += " presentationView-selected";
}
@@ -892,23 +403,19 @@ export default class PresentationElement extends React.Component<PresentationEle
outlineStyle: "dashed",
outlineWidth: Doc.IsBrushed(p.document) ? `1px` : "0px",
}}
- onClick={e => { p.gotoDocument(p.index, NumCast(this.props.mainDocument.selectedDoc)); e.stopPropagation(); }}>
+ onClick={e => { p.gotoDocument(p.index, this.currentIndex); e.stopPropagation(); }}>
<strong className="presentationView-name">
{`${p.index + 1}. ${title}`}
</strong>
<button className="presentation-icon" onPointerDown={(e) => e.stopPropagation()} onClick={e => { this.props.deleteDocument(p.index); e.stopPropagation(); }}>X</button>
<br></br>
- <button title="Zoom" className={this.selectedButtons[buttonIndex.Show] ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={this.onZoomDocumentClick}><FontAwesomeIcon icon={"search"} /></button>
- <button title="Navigate" className={this.selectedButtons[buttonIndex.Navigate] ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={this.onNavigateDocumentClick}><FontAwesomeIcon icon={"location-arrow"} /></button>
- <button title="Hide Document Till Presented" className={this.selectedButtons[buttonIndex.HideTillPressed] ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={this.onHideDocumentUntilPressClick}><FontAwesomeIcon icon={fileSolid} /></button>
- <button title="Fade Document After Presented" className={this.selectedButtons[buttonIndex.FadeAfter] ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={this.onFadeDocumentAfterPresentedClick}><FontAwesomeIcon icon={faFileDownload} color={"gray"} /></button>
- <button title="Hide Document After Presented" className={this.selectedButtons[buttonIndex.HideAfter] ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={this.onHideDocumentAfterPresentedClick}><FontAwesomeIcon icon={faFileDownload} /></button>
- <button title="Group With Up" className={this.selectedButtons[buttonIndex.Group] ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={(e) => {
- e.stopPropagation();
- this.changeGroupStatus();
- this.onGroupClick(p.document, p.index, this.selectedButtons[buttonIndex.Group]);
- }}> <FontAwesomeIcon icon={"arrow-up"} /> </button>
- <button title="Open Right" className={this.selectedButtons[buttonIndex.OpenRight] ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={this.onRightTabClick}><FontAwesomeIcon icon={"arrow-right"} /></button>
+ <button title="Zoom" className={this.showButton ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={this.onZoomDocumentClick}><FontAwesomeIcon icon={"search"} /></button>
+ <button title="Navigate" className={this.navButton ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={this.onNavigateDocumentClick}><FontAwesomeIcon icon={"location-arrow"} /></button>
+ <button title="Hide Document Till Presented" className={this.hideTillShownButton ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={this.onHideDocumentUntilPressClick}><FontAwesomeIcon icon={fileSolid} /></button>
+ <button title="Fade Document After Presented" className={this.fadeButton ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={this.onFadeDocumentAfterPresentedClick}><FontAwesomeIcon icon={faFileDownload} /></button>
+ <button title="Hide Document After Presented" className={this.hideAfterButton ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={this.onHideDocumentAfterPresentedClick}><FontAwesomeIcon icon={faFileDownload} /></button>
+ <button title="Group With Up" className={this.groupButton ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={this.onGroupClick}> <FontAwesomeIcon icon={"arrow-up"} /> </button>
+ <button title="Open Right" className={this.openRightButton ? "presentation-interaction-selected" : "presentation-interaction"} onPointerDown={(e) => e.stopPropagation()} onClick={this.onRightTabClick}><FontAwesomeIcon icon={"arrow-right"} /></button>
<br />
{this.renderEmbeddedInline()}
diff --git a/src/client/views/presentationview/PresentationList.tsx b/src/client/views/presentationview/PresentationList.tsx
index 288ade042..930ce202e 100644
--- a/src/client/views/presentationview/PresentationList.tsx
+++ b/src/client/views/presentationview/PresentationList.tsx
@@ -1,24 +1,20 @@
-import { observer } from "mobx-react";
-import React = require("react");
import { action } from "mobx";
-import "./PresentationView.scss";
-import { Utils } from "../../../Utils";
-import { Doc, DocListCast, DocListCastAsync } from "../../../new_fields/Doc";
-import { NumCast, StrCast } from "../../../new_fields/Types";
+import { observer } from "mobx-react";
+import { Doc, DocListCast } from "../../../new_fields/Doc";
import { Id } from "../../../new_fields/FieldSymbols";
+import { NumCast } from "../../../new_fields/Types";
import PresentationElement from "./PresentationElement";
+import "./PresentationView.scss";
+import React = require("react");
interface PresListProps {
mainDocument: Doc;
deleteDocument(index: number): void;
gotoDocument(index: number, fromDoc: number): Promise<void>;
- groupMappings: Map<String, Doc[]>;
PresElementsMappings: Map<Doc, PresentationElement>;
setChildrenDocs: (docList: Doc[]) => void;
presStatus: boolean;
- presButtonBackUp: Doc;
- presGroupBackUp: Doc;
removeDocByRef(doc: Doc): boolean;
clearElemMap(): void;
@@ -31,35 +27,6 @@ interface PresListProps {
*/
export default class PresentationViewList extends React.Component<PresListProps> {
- /**
- * Method that initializes presentation ids for the
- * docs that is in the presentation, when presentation list
- * gets re-rendered. It makes sure to not assign ids to the
- * docs that are in the group, so that mapping won't be disrupted.
- */
-
- @action
- initializeGroupIds = async (docList: Doc[]) => {
- docList.forEach(async (doc: Doc, index: number) => {
- let docGuid = StrCast(doc.presentId, null);
- //checking if part of group
- let storedGuids: string[] = [];
- let castedGroupDocs = await DocListCastAsync(this.props.presGroupBackUp.groupDocs);
- //making sure the docs that were in groups, which were stored, to not get new guids.
- if (castedGroupDocs !== undefined) {
- castedGroupDocs.forEach((doc: Doc) => {
- let storedGuid = StrCast(doc.presentIdStore, null);
- if (storedGuid) {
- storedGuids.push(storedGuid);
- }
-
- });
- }
- if (!this.props.groupMappings.has(docGuid) && !storedGuids.includes(docGuid)) {
- doc.presentId = Utils.GenerateGuid();
- }
- });
- }
/**
* Initially every document starts with a viewScale 1, which means
@@ -77,7 +44,6 @@ export default class PresentationViewList extends React.Component<PresListProps>
render() {
const children = DocListCast(this.props.mainDocument.data);
- this.initializeGroupIds(children);
this.initializeScaleViews(children);
this.props.setChildrenDocs(children);
this.props.clearElemMap();
@@ -96,11 +62,8 @@ export default class PresentationViewList extends React.Component<PresListProps>
index={index}
deleteDocument={this.props.deleteDocument}
gotoDocument={this.props.gotoDocument}
- groupMappings={this.props.groupMappings}
allListElements={children}
presStatus={this.props.presStatus}
- presButtonBackUp={this.props.presButtonBackUp}
- presGroupBackUp={this.props.presGroupBackUp}
removeDocByRef={this.props.removeDocByRef}
PresElementsMappings={this.props.PresElementsMappings}
/>
diff --git a/src/client/views/presentationview/PresentationView.scss b/src/client/views/presentationview/PresentationView.scss
index b0968132b..5c40a8808 100644
--- a/src/client/views/presentationview/PresentationView.scss
+++ b/src/client/views/presentationview/PresentationView.scss
@@ -1,6 +1,5 @@
.presentationView-cont {
position: absolute;
- background: white;
z-index: 2;
box-shadow: #AAAAAA .2vw .2vw .4vw;
right: 0;
@@ -24,14 +23,11 @@
user-select: none;
transition: all .1s;
-
-
.documentView-node {
position: absolute;
z-index: 1;
}
-
}
.presentationView-item-above {
@@ -49,12 +45,15 @@
.presentationView-item:hover {
transition: all .1s;
- background: #AAAAAA
+ background: #AAAAAA;
+ border-radius: 12px;
}
.presentationView-selected {
background: gray;
color: black;
+ border-radius: 12px;
+ box-shadow: black 2px 2px 5px;
}
.presentationView-heading {
@@ -71,7 +70,6 @@
display: inline-block;
width: calc(100% - 200px);
letter-spacing: 2px;
-
}
.presentation-icon {
@@ -79,11 +77,12 @@
}
.presentation-interaction {
+ color: gray;
float: left;
}
.presentation-interaction-selected {
- background: #505050;
+ color: white;
float: left;
}
@@ -96,6 +95,7 @@
margin-right: 2.5%;
margin-left: 2.5%;
width: 20%;
+ border-radius: 5px;
}
.presentation-buttons {
diff --git a/src/new_fields/Doc.ts b/src/new_fields/Doc.ts
index bd08edec8..6b72bc58f 100644
--- a/src/new_fields/Doc.ts
+++ b/src/new_fields/Doc.ts
@@ -664,6 +664,10 @@ export namespace Doc {
}
}
+ export function UnBrushAllDocs() {
+ manager.BrushedDoc.clear();
+ }
}
Scripting.addGlobal(function renameAlias(doc: any, n: any) { return StrCast(doc.title).replace(/\([0-9]*\)/, "") + `(${n})`; });
-Scripting.addGlobal(function getProto(doc: any) { return Doc.GetProto(doc); }); \ No newline at end of file
+Scripting.addGlobal(function getProto(doc: any) { return Doc.GetProto(doc); });
+Scripting.addGlobal(function copyField(field: any) { return ObjectField.MakeCopy(field); }); \ No newline at end of file
diff --git a/src/new_fields/RichTextField.ts b/src/new_fields/RichTextField.ts
index cae5623e6..1b52e6f82 100644
--- a/src/new_fields/RichTextField.ts
+++ b/src/new_fields/RichTextField.ts
@@ -28,6 +28,12 @@ export class RichTextField extends ObjectField {
return `new RichTextField("${this.Data}")`;
}
+ public static Initialize = (initial: string) => {
+ !initial.length && (initial = " ");
+ let pos = initial.length + 1;
+ return `{"doc":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"${initial}"}]}]},"selection":{"type":"text","anchor":${pos},"head":${pos}}}`;
+ }
+
[ToPlainText]() {
// Because we're working with plain text, just concatenate all paragraphs
let content = JSON.parse(this.Data).doc.content;
diff --git a/src/server/RouteStore.ts b/src/server/RouteStore.ts
index 5d977006a..014906054 100644
--- a/src/server/RouteStore.ts
+++ b/src/server/RouteStore.ts
@@ -31,6 +31,6 @@ export enum RouteStore {
// APIS
cognitiveServices = "/cognitiveservices",
- googleDocs = "/googleDocs/"
+ googleDocs = "/googleDocs"
} \ No newline at end of file
diff --git a/src/server/apis/google/GoogleApiServerUtils.ts b/src/server/apis/google/GoogleApiServerUtils.ts
index 817b2b696..8785cd974 100644
--- a/src/server/apis/google/GoogleApiServerUtils.ts
+++ b/src/server/apis/google/GoogleApiServerUtils.ts
@@ -1,7 +1,10 @@
-import { google, docs_v1 } from "googleapis";
+import { google, docs_v1, slides_v1 } from "googleapis";
import { createInterface } from "readline";
import { readFile, writeFile } from "fs";
import { OAuth2Client } from "google-auth-library";
+import { Opt } from "../../../new_fields/Doc";
+import { GlobalOptions } from "googleapis-common";
+import { GaxiosResponse } from "gaxios";
/**
* Server side authentication for Google Api queries.
@@ -13,38 +16,57 @@ export namespace GoogleApiServerUtils {
const SCOPES = [
'documents.readonly',
'documents',
+ 'presentations',
+ 'presentations.readonly',
'drive',
'drive.file',
];
- // The file token.json stores the user's access and refresh tokens, and is
- // created automatically when the authorization flow completes for the first
- // time.
+
export const parseBuffer = (data: Buffer) => JSON.parse(data.toString());
- export namespace Docs {
+ export enum Service {
+ Documents = "Documents",
+ Slides = "Slides"
+ }
+
- export interface CredentialPaths {
- credentials: string;
- token: string;
- }
+ export interface CredentialPaths {
+ credentials: string;
+ token: string;
+ }
- export type Endpoint = docs_v1.Docs;
+ export type ApiResponse = Promise<GaxiosResponse>;
+ export type ApiRouter = (endpoint: Endpoint, paramters: any) => ApiResponse;
+ export type ApiHandler = (parameters: any) => ApiResponse;
+ export type Action = "create" | "retrieve" | "update";
- export const GetEndpoint = async (paths: CredentialPaths) => {
- return new Promise<Endpoint>((resolve, reject) => {
- readFile(paths.credentials, (err, credentials) => {
- if (err) {
- reject(err);
- return console.log('Error loading client secret file:', err);
+ export type Endpoint = { get: ApiHandler, create: ApiHandler, batchUpdate: ApiHandler };
+ export type EndpointParameters = GlobalOptions & { version: "v1" };
+
+ export const GetEndpoint = async (sector: string, paths: CredentialPaths) => {
+ return new Promise<Opt<Endpoint>>((resolve, reject) => {
+ readFile(paths.credentials, (err, credentials) => {
+ if (err) {
+ reject(err);
+ return console.log('Error loading client secret file:', err);
+ }
+ return authorize(parseBuffer(credentials), paths.token).then(auth => {
+ let routed: Opt<Endpoint>;
+ let parameters: EndpointParameters = { auth, version: "v1" };
+ switch (sector) {
+ case Service.Documents:
+ routed = google.docs(parameters).documents;
+ break;
+ case Service.Slides:
+ routed = google.slides(parameters).presentations;
+ break;
}
- return authorize(parseBuffer(credentials), paths.token).then(auth => {
- resolve(google.docs({ version: "v1", auth }));
- });
+ resolve(routed);
});
});
- };
+ });
+ };
- }
/**
* Create an OAuth2 client with the given credentials, and returns the promise resolving to the authenticated client
@@ -105,5 +127,4 @@ export namespace GoogleApiServerUtils {
});
});
}
-
} \ No newline at end of file
diff --git a/src/server/authentication/models/current_user_utils.ts b/src/server/authentication/models/current_user_utils.ts
index de45aad02..f7ce24967 100644
--- a/src/server/authentication/models/current_user_utils.ts
+++ b/src/server/authentication/models/current_user_utils.ts
@@ -10,7 +10,7 @@ import { CollectionView } from "../../../client/views/collections/CollectionView
import { Doc } from "../../../new_fields/Doc";
import { List } from "../../../new_fields/List";
import { listSpec } from "../../../new_fields/Schema";
-import { Cast, StrCast } from "../../../new_fields/Types";
+import { Cast, StrCast, PromiseValue } from "../../../new_fields/Types";
import { Utils } from "../../../Utils";
import { RouteStore } from "../../RouteStore";
@@ -49,12 +49,14 @@ export class CurrentUserUtils {
workspaces.boxShadow = "0 0";
doc.workspaces = workspaces;
}
+ PromiseValue(Cast(doc.workspaces, Doc)).then(workspaces => workspaces && (workspaces.preventTreeViewOpen = true));
if (doc.recentlyClosed === undefined) {
const recentlyClosed = Docs.Create.TreeDocument([], { title: "Recently Closed", height: 75 });
recentlyClosed.excludeFromLibrary = true;
recentlyClosed.boxShadow = "0 0";
doc.recentlyClosed = recentlyClosed;
}
+ PromiseValue(Cast(doc.recentlyClosed, Doc)).then(recent => recent && (recent.preventTreeViewOpen = true));
if (doc.curPresentation === undefined) {
const curPresentation = Docs.Create.PresDocument(new List<Doc>(), { title: "Presentation" });
curPresentation.excludeFromLibrary = true;
@@ -73,6 +75,7 @@ export class CurrentUserUtils {
}
StrCast(doc.title).indexOf("@") !== -1 && (doc.title = StrCast(doc.title).split("@")[0] + "'s Library");
doc.width = 100;
+ doc.preventTreeViewOpen = true;
}
public static loadCurrentUser() {
diff --git a/src/server/index.ts b/src/server/index.ts
index ef1829f30..34a0a19f1 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -38,13 +38,14 @@ import flash = require('connect-flash');
import { Search } from './Search';
import _ = require('lodash');
import * as Archiver from 'archiver';
-import AdmZip from 'adm-zip';
+var AdmZip = require('adm-zip');
import * as YoutubeApi from "./apis/youtube/youtubeApiSample";
import { Response } from 'express-serve-static-core';
import { GoogleApiServerUtils } from "./apis/google/GoogleApiServerUtils";
import { GaxiosResponse } from 'gaxios';
import { Opt } from '../new_fields/Doc';
import { docs_v1 } from 'googleapis';
+import { Endpoint } from 'googleapis-common';
const MongoStore = require('connect-mongo')(session);
const mongoose = require('mongoose');
const probe = require("probe-image-size");
@@ -358,7 +359,7 @@ app.post("/uploadDoc", (req, res) => {
for (const name in files) {
const path_2 = files[name].path;
const zip = new AdmZip(path_2);
- zip.getEntries().forEach(entry => {
+ zip.getEntries().forEach((entry: any) => {
if (!entry.entryName.startsWith("files/")) return;
let dirname = path.dirname(entry.entryName) + "/";
let extname = path.extname(entry.entryName);
@@ -367,13 +368,17 @@ app.post("/uploadDoc", (req, res) => {
// zip.extractEntryTo(dirname + basename + "_s" + extname, __dirname + RouteStore.public, true, false);
// zip.extractEntryTo(dirname + basename + "_m" + extname, __dirname + RouteStore.public, true, false);
// zip.extractEntryTo(dirname + basename + "_l" + extname, __dirname + RouteStore.public, true, false);
- zip.extractEntryTo(entry.entryName, __dirname + RouteStore.public, true, false);
- dirname = "/" + dirname;
-
- fs.createReadStream(__dirname + RouteStore.public + dirname + basename + extname).pipe(fs.createWriteStream(__dirname + RouteStore.public + dirname + basename + "_o" + extname));
- fs.createReadStream(__dirname + RouteStore.public + dirname + basename + extname).pipe(fs.createWriteStream(__dirname + RouteStore.public + dirname + basename + "_s" + extname));
- fs.createReadStream(__dirname + RouteStore.public + dirname + basename + extname).pipe(fs.createWriteStream(__dirname + RouteStore.public + dirname + basename + "_m" + extname));
- fs.createReadStream(__dirname + RouteStore.public + dirname + basename + extname).pipe(fs.createWriteStream(__dirname + RouteStore.public + dirname + basename + "_l" + extname));
+ try {
+ zip.extractEntryTo(entry.entryName, __dirname + RouteStore.public, true, false);
+ dirname = "/" + dirname;
+
+ fs.createReadStream(__dirname + RouteStore.public + dirname + basename + extname).pipe(fs.createWriteStream(__dirname + RouteStore.public + dirname + basename + "_o" + extname));
+ fs.createReadStream(__dirname + RouteStore.public + dirname + basename + extname).pipe(fs.createWriteStream(__dirname + RouteStore.public + dirname + basename + "_s" + extname));
+ fs.createReadStream(__dirname + RouteStore.public + dirname + basename + extname).pipe(fs.createWriteStream(__dirname + RouteStore.public + dirname + basename + "_m" + extname));
+ fs.createReadStream(__dirname + RouteStore.public + dirname + basename + extname).pipe(fs.createWriteStream(__dirname + RouteStore.public + dirname + basename + "_l" + extname));
+ } catch (e) {
+ console.log(e);
+ }
});
const json = zip.getEntry("doc.json");
let docs: any;
@@ -799,21 +804,19 @@ function HandleYoutubeQuery([query, callback]: [YoutubeQueryInput, (result?: any
const credentials = path.join(__dirname, "./credentials/google_docs_credentials.json");
const token = path.join(__dirname, "./credentials/google_docs_token.json");
-type ApiResponse = Promise<GaxiosResponse>;
-type ApiHandler = (endpoint: docs_v1.Resource$Documents, parameters: any) => ApiResponse;
-type Action = "create" | "retrieve" | "update";
-
-const EndpointHandlerMap = new Map<Action, ApiHandler>([
+const EndpointHandlerMap = new Map<GoogleApiServerUtils.Action, GoogleApiServerUtils.ApiRouter>([
["create", (api, params) => api.create(params)],
["retrieve", (api, params) => api.get(params)],
["update", (api, params) => api.batchUpdate(params)],
]);
-app.post(RouteStore.googleDocs + ":action", (req, res) => {
- GoogleApiServerUtils.Docs.GetEndpoint({ credentials, token }).then(endpoint => {
- let handler = EndpointHandlerMap.get(req.params.action);
- if (handler) {
- let execute = handler(endpoint.documents, req.body).then(
+app.post(RouteStore.googleDocs + "/:sector/:action", (req, res) => {
+ let sector = req.params.sector;
+ let action = req.params.action;
+ GoogleApiServerUtils.GetEndpoint(GoogleApiServerUtils.Service[sector], { credentials, token }).then(endpoint => {
+ let handler = EndpointHandlerMap.get(action);
+ if (endpoint && handler) {
+ let execute = handler(endpoint, req.body).then(
response => res.send(response.data),
rejection => res.send(rejection)
);
diff --git a/src/server/slides.json b/src/server/slides.json
new file mode 100644
index 000000000..323cac3a6
--- /dev/null
+++ b/src/server/slides.json
@@ -0,0 +1,10820 @@
+{
+ "presentationId": "1gHxyT6bBhsPVeuWNnWDzI33yEviMVo8n60JtZiVy3tY",
+ "pageSize": {
+ "width": {
+ "magnitude": 9144000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 5143500,
+ "unit": "EMU"
+ }
+ },
+ "slides": [
+ {
+ "objectId": "p",
+ "pageElements": [
+ {
+ "objectId": "i0",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 0.6842,
+ "translateX": 311708.35000000003,
+ "translateY": 744575,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 20,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 20,
+ "textRun": {
+ "content": "Importing into Dash\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "CENTERED_TITLE",
+ "parentObjectId": "p2_i0"
+ }
+ }
+ },
+ {
+ "objectId": "i1",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 0.2642,
+ "translateX": 311700,
+ "translateY": 2834125,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 15,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 15,
+ "textRun": {
+ "content": "By Sam Wilkins\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SUBTITLE",
+ "parentObjectId": "p2_i1"
+ }
+ }
+ }
+ ],
+ "slideProperties": {
+ "layoutObjectId": "p2",
+ "masterObjectId": "simple-light-2",
+ "notesPage": {
+ "objectId": "p:notes",
+ "pageType": "NOTES",
+ "pageElements": [
+ {
+ "objectId": "i2",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.032025,
+ "scaleY": 1.143,
+ "translateX": 381300,
+ "translateY": 685800,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeProperties": {
+ "outline": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SLIDE_IMAGE",
+ "parentObjectId": "n:slide"
+ }
+ }
+ },
+ {
+ "objectId": "i3",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 1.8288,
+ "scaleY": 1.3716,
+ "translateX": 685800,
+ "translateY": 4343400,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "BODY",
+ "index": 1,
+ "parentObjectId": "n:text"
+ }
+ }
+ }
+ ],
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "notesProperties": {
+ "speakerNotesObjectId": "i3"
+ }
+ }
+ },
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ }
+ },
+ {
+ "objectId": "g5f40953d50_0_0",
+ "pageElements": [
+ {
+ "objectId": "g5f40953d50_0_1",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 0.1909,
+ "translateX": 311700,
+ "translateY": 445025,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 10,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 10,
+ "textRun": {
+ "content": "Dr. Seuss\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "TITLE",
+ "parentObjectId": "p4_i0"
+ }
+ }
+ },
+ {
+ "objectId": "g5f40953d50_0_2",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 1.1388,
+ "translateX": 311700,
+ "translateY": 1152475,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 25,
+ "paragraphMarker": {
+ "style": {
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 25,
+ "textRun": {
+ "content": "Here is a bulleted list!\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 25,
+ "endIndex": 34,
+ "paragraphMarker": {
+ "style": {
+ "indentStart": {
+ "magnitude": 36,
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "magnitude": 18,
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "COLLAPSE_LISTS"
+ },
+ "bullet": {
+ "listId": "kix.wifbmqnyqu4p",
+ "glyph": "●",
+ "bulletStyle": {
+ "underline": false
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 25,
+ "endIndex": 34,
+ "textRun": {
+ "content": "One fish\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 34,
+ "endIndex": 43,
+ "paragraphMarker": {
+ "style": {
+ "indentStart": {
+ "magnitude": 36,
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "magnitude": 18,
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "COLLAPSE_LISTS"
+ },
+ "bullet": {
+ "listId": "kix.wifbmqnyqu4p",
+ "glyph": "●",
+ "bulletStyle": {
+ "underline": false
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 34,
+ "endIndex": 43,
+ "textRun": {
+ "content": "Two fish\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 43,
+ "endIndex": 52,
+ "paragraphMarker": {
+ "style": {
+ "indentStart": {
+ "magnitude": 36,
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "magnitude": 18,
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "COLLAPSE_LISTS"
+ },
+ "bullet": {
+ "listId": "kix.wifbmqnyqu4p",
+ "glyph": "●",
+ "bulletStyle": {
+ "underline": false
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 43,
+ "endIndex": 52,
+ "textRun": {
+ "content": "Red fish\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 52,
+ "endIndex": 62,
+ "paragraphMarker": {
+ "style": {
+ "indentStart": {
+ "magnitude": 36,
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "magnitude": 18,
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "COLLAPSE_LISTS"
+ },
+ "bullet": {
+ "listId": "kix.wifbmqnyqu4p",
+ "glyph": "●",
+ "bulletStyle": {
+ "underline": false
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 52,
+ "endIndex": 62,
+ "textRun": {
+ "content": "Blue fish\n",
+ "style": {}
+ }
+ }
+ ],
+ "lists": {
+ "kix.wifbmqnyqu4p": {
+ "listId": "kix.wifbmqnyqu4p",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "underline": false
+ }
+ }
+ }
+ },
+ "kix.yuy8atv38lqp": {
+ "listId": "kix.yuy8atv38lqp",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "underline": false
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "underline": false
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "BODY",
+ "parentObjectId": "p4_i1"
+ }
+ }
+ }
+ ],
+ "slideProperties": {
+ "layoutObjectId": "p4",
+ "masterObjectId": "simple-light-2",
+ "notesPage": {
+ "objectId": "g5f40953d50_0_0:notes",
+ "pageType": "NOTES",
+ "pageElements": [
+ {
+ "objectId": "g5f40953d50_0_3",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.032,
+ "scaleY": 1.143,
+ "translateX": 381300,
+ "translateY": 685800,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeProperties": {
+ "outline": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SLIDE_IMAGE",
+ "parentObjectId": "n:slide"
+ }
+ }
+ },
+ {
+ "objectId": "g5f40953d50_0_4",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 1.8288,
+ "scaleY": 1.3716,
+ "translateX": 685800,
+ "translateY": 4343400,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "BODY",
+ "index": 1,
+ "parentObjectId": "n:text"
+ }
+ }
+ }
+ ],
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "notesProperties": {
+ "speakerNotesObjectId": "g5f40953d50_0_4"
+ }
+ }
+ },
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ }
+ }
+ ],
+ "title": "THIS IS MY FIRST DASH PRESENTATION",
+ "masters": [
+ {
+ "objectId": "simple-light-2",
+ "pageType": "MASTER",
+ "pageElements": [
+ {
+ "objectId": "p1_i0",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 0.1909,
+ "translateX": 311700,
+ "translateY": 445025,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK1"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "NOT_RENDERED",
+ "solidFill": {
+ "color": {
+ "rgbColor": {
+ "red": 1,
+ "green": 1,
+ "blue": 1
+ }
+ },
+ "alpha": 1
+ }
+ },
+ "outline": {
+ "outlineFill": {
+ "solidFill": {
+ "color": {
+ "rgbColor": {}
+ },
+ "alpha": 1
+ }
+ },
+ "weight": {
+ "magnitude": 9525,
+ "unit": "EMU"
+ },
+ "dashStyle": "SOLID",
+ "propertyState": "NOT_RENDERED"
+ },
+ "shadow": {
+ "type": "OUTER",
+ "transform": {
+ "scaleX": 1,
+ "scaleY": 1,
+ "unit": "EMU"
+ },
+ "alignment": "BOTTOM_LEFT",
+ "blurRadius": {
+ "unit": "EMU"
+ },
+ "color": {
+ "rgbColor": {}
+ },
+ "alpha": 1,
+ "rotateWithShape": false,
+ "propertyState": "NOT_RENDERED"
+ },
+ "contentAlignment": "TOP"
+ },
+ "placeholder": {
+ "type": "TITLE"
+ }
+ }
+ },
+ {
+ "objectId": "p1_i1",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 1.1388,
+ "translateX": 311700,
+ "translateY": 1152475,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 115,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "magnitude": 16,
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 18,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 115,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "magnitude": 16,
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 115,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "magnitude": 16,
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 115,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "magnitude": 16,
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 115,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "magnitude": 16,
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 115,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "magnitude": 16,
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 115,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "magnitude": 16,
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 115,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "magnitude": 16,
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 115,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "magnitude": 16,
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 18,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "NOT_RENDERED",
+ "solidFill": {
+ "color": {
+ "rgbColor": {
+ "red": 1,
+ "green": 1,
+ "blue": 1
+ }
+ },
+ "alpha": 1
+ }
+ },
+ "outline": {
+ "outlineFill": {
+ "solidFill": {
+ "color": {
+ "rgbColor": {}
+ },
+ "alpha": 1
+ }
+ },
+ "weight": {
+ "magnitude": 9525,
+ "unit": "EMU"
+ },
+ "dashStyle": "SOLID",
+ "propertyState": "NOT_RENDERED"
+ },
+ "shadow": {
+ "type": "OUTER",
+ "transform": {
+ "scaleX": 1,
+ "scaleY": 1,
+ "unit": "EMU"
+ },
+ "alignment": "BOTTOM_LEFT",
+ "blurRadius": {
+ "unit": "EMU"
+ },
+ "color": {
+ "rgbColor": {}
+ },
+ "alpha": 1,
+ "rotateWithShape": false,
+ "propertyState": "NOT_RENDERED"
+ },
+ "contentAlignment": "TOP"
+ },
+ "placeholder": {
+ "type": "BODY"
+ }
+ }
+ },
+ {
+ "objectId": "p1_i2",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.1829,
+ "scaleY": 0.1312,
+ "translateX": 8472457.8125,
+ "translateY": 4663216.797499999,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "END",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "NEVER_COLLAPSE"
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "autoText": {
+ "type": "SLIDE_NUMBER",
+ "content": "#",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 10,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "themeColor": "DARK2"
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 10,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "NOT_RENDERED",
+ "solidFill": {
+ "color": {
+ "rgbColor": {
+ "red": 1,
+ "green": 1,
+ "blue": 1
+ }
+ },
+ "alpha": 1
+ }
+ },
+ "outline": {
+ "outlineFill": {
+ "solidFill": {
+ "color": {
+ "rgbColor": {}
+ },
+ "alpha": 1
+ }
+ },
+ "weight": {
+ "magnitude": 9525,
+ "unit": "EMU"
+ },
+ "dashStyle": "SOLID",
+ "propertyState": "NOT_RENDERED"
+ },
+ "shadow": {
+ "type": "OUTER",
+ "transform": {
+ "scaleX": 1,
+ "scaleY": 1,
+ "unit": "EMU"
+ },
+ "alignment": "BOTTOM_LEFT",
+ "blurRadius": {
+ "unit": "EMU"
+ },
+ "color": {
+ "rgbColor": {}
+ },
+ "alpha": 1,
+ "rotateWithShape": false,
+ "propertyState": "NOT_RENDERED"
+ },
+ "contentAlignment": "MIDDLE"
+ },
+ "placeholder": {
+ "type": "SLIDE_NUMBER"
+ }
+ }
+ }
+ ],
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "solidFill": {
+ "color": {
+ "themeColor": "LIGHT1"
+ },
+ "alpha": 1
+ }
+ },
+ "colorScheme": {
+ "colors": [
+ {
+ "type": "DARK1",
+ "color": {}
+ },
+ {
+ "type": "LIGHT1",
+ "color": {
+ "red": 1,
+ "green": 1,
+ "blue": 1
+ }
+ },
+ {
+ "type": "DARK2",
+ "color": {
+ "red": 0.34901962,
+ "green": 0.34901962,
+ "blue": 0.34901962
+ }
+ },
+ {
+ "type": "LIGHT2",
+ "color": {
+ "red": 0.93333334,
+ "green": 0.93333334,
+ "blue": 0.93333334
+ }
+ },
+ {
+ "type": "ACCENT1",
+ "color": {
+ "red": 1,
+ "green": 0.67058825,
+ "blue": 0.2509804
+ }
+ },
+ {
+ "type": "ACCENT2",
+ "color": {
+ "red": 0.12941177,
+ "green": 0.12941177,
+ "blue": 0.12941177
+ }
+ },
+ {
+ "type": "ACCENT3",
+ "color": {
+ "red": 0.47058824,
+ "green": 0.5647059,
+ "blue": 0.6117647
+ }
+ },
+ {
+ "type": "ACCENT4",
+ "color": {
+ "red": 1,
+ "green": 0.67058825,
+ "blue": 0.2509804
+ }
+ },
+ {
+ "type": "ACCENT5",
+ "color": {
+ "green": 0.5921569,
+ "blue": 0.654902
+ }
+ },
+ {
+ "type": "ACCENT6",
+ "color": {
+ "red": 0.93333334,
+ "green": 1,
+ "blue": 0.25490198
+ }
+ },
+ {
+ "type": "HYPERLINK",
+ "color": {
+ "green": 0.5921569,
+ "blue": 0.654902
+ }
+ },
+ {
+ "type": "FOLLOWED_HYPERLINK",
+ "color": {
+ "green": 0.5921569,
+ "blue": 0.654902
+ }
+ },
+ {
+ "type": "TEXT1",
+ "color": {}
+ },
+ {
+ "type": "BACKGROUND1",
+ "color": {
+ "red": 1,
+ "green": 1,
+ "blue": 1
+ }
+ },
+ {
+ "type": "TEXT2",
+ "color": {
+ "red": 0.93333334,
+ "green": 0.93333334,
+ "blue": 0.93333334
+ }
+ },
+ {
+ "type": "BACKGROUND2",
+ "color": {
+ "red": 0.34901962,
+ "green": 0.34901962,
+ "blue": 0.34901962
+ }
+ }
+ ]
+ }
+ },
+ "masterProperties": {
+ "displayName": "Simple Light"
+ }
+ }
+ ],
+ "layouts": [
+ {
+ "objectId": "p2",
+ "pageType": "LAYOUT",
+ "pageElements": [
+ {
+ "objectId": "p2_i0",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 0.6842,
+ "translateX": 311708.35000000003,
+ "translateY": 744575,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 52,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ },
+ "contentAlignment": "BOTTOM"
+ },
+ "placeholder": {
+ "type": "CENTERED_TITLE",
+ "parentObjectId": "p1_i0"
+ }
+ }
+ },
+ {
+ "objectId": "p2_i1",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 0.2642,
+ "translateX": 311700,
+ "translateY": 2834125,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 28,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SUBTITLE",
+ "parentObjectId": "p1_i1"
+ }
+ }
+ },
+ {
+ "objectId": "p2_i2",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.1829,
+ "scaleY": 0.1312,
+ "translateX": 8472457.8125,
+ "translateY": 4663216.797499999,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "autoText": {
+ "type": "SLIDE_NUMBER",
+ "content": "#",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SLIDE_NUMBER",
+ "parentObjectId": "p1_i2"
+ }
+ }
+ }
+ ],
+ "layoutProperties": {
+ "masterObjectId": "simple-light-2",
+ "name": "TITLE",
+ "displayName": "Title slide"
+ },
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ }
+ },
+ {
+ "objectId": "p3",
+ "pageType": "LAYOUT",
+ "pageElements": [
+ {
+ "objectId": "p3_i0",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 0.2806,
+ "translateX": 311700,
+ "translateY": 2150850,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 36,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ },
+ "contentAlignment": "MIDDLE"
+ },
+ "placeholder": {
+ "type": "TITLE",
+ "parentObjectId": "p1_i0"
+ }
+ }
+ },
+ {
+ "objectId": "p3_i1",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.1829,
+ "scaleY": 0.1312,
+ "translateX": 8472457.8125,
+ "translateY": 4663216.797499999,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "autoText": {
+ "type": "SLIDE_NUMBER",
+ "content": "#",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SLIDE_NUMBER",
+ "parentObjectId": "p1_i2"
+ }
+ }
+ }
+ ],
+ "layoutProperties": {
+ "masterObjectId": "simple-light-2",
+ "name": "SECTION_HEADER",
+ "displayName": "Section header"
+ },
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ }
+ },
+ {
+ "objectId": "p4",
+ "pageType": "LAYOUT",
+ "pageElements": [
+ {
+ "objectId": "p4_i0",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 0.1909,
+ "translateX": 311700,
+ "translateY": 445025,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {}
+ },
+ "1": {
+ "bulletStyle": {}
+ },
+ "2": {
+ "bulletStyle": {}
+ },
+ "3": {
+ "bulletStyle": {}
+ },
+ "4": {
+ "bulletStyle": {}
+ },
+ "5": {
+ "bulletStyle": {}
+ },
+ "6": {
+ "bulletStyle": {}
+ },
+ "7": {
+ "bulletStyle": {}
+ },
+ "8": {
+ "bulletStyle": {}
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "TITLE",
+ "parentObjectId": "p1_i0"
+ }
+ }
+ },
+ {
+ "objectId": "p4_i1",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 1.1388,
+ "translateX": 311700,
+ "translateY": 1152475,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {}
+ },
+ "1": {
+ "bulletStyle": {}
+ },
+ "2": {
+ "bulletStyle": {}
+ },
+ "3": {
+ "bulletStyle": {}
+ },
+ "4": {
+ "bulletStyle": {}
+ },
+ "5": {
+ "bulletStyle": {}
+ },
+ "6": {
+ "bulletStyle": {}
+ },
+ "7": {
+ "bulletStyle": {}
+ },
+ "8": {
+ "bulletStyle": {}
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "BODY",
+ "parentObjectId": "p1_i1"
+ }
+ }
+ },
+ {
+ "objectId": "p4_i2",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.1829,
+ "scaleY": 0.1312,
+ "translateX": 8472457.8125,
+ "translateY": 4663216.797499999,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "autoText": {
+ "type": "SLIDE_NUMBER",
+ "content": "#",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SLIDE_NUMBER",
+ "parentObjectId": "p1_i2"
+ }
+ }
+ }
+ ],
+ "layoutProperties": {
+ "masterObjectId": "simple-light-2",
+ "name": "TITLE_AND_BODY",
+ "displayName": "Title and body"
+ },
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ }
+ },
+ {
+ "objectId": "p5",
+ "pageType": "LAYOUT",
+ "pageElements": [
+ {
+ "objectId": "p5_i0",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 0.1909,
+ "translateX": 311700,
+ "translateY": 445025,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {}
+ },
+ "1": {
+ "bulletStyle": {}
+ },
+ "2": {
+ "bulletStyle": {}
+ },
+ "3": {
+ "bulletStyle": {}
+ },
+ "4": {
+ "bulletStyle": {}
+ },
+ "5": {
+ "bulletStyle": {}
+ },
+ "6": {
+ "bulletStyle": {}
+ },
+ "7": {
+ "bulletStyle": {}
+ },
+ "8": {
+ "bulletStyle": {}
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "TITLE",
+ "parentObjectId": "p1_i0"
+ }
+ }
+ },
+ {
+ "objectId": "p5_i1",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 1.3333,
+ "scaleY": 1.1388,
+ "translateX": 311700,
+ "translateY": 1152475,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "BODY",
+ "parentObjectId": "p1_i1"
+ }
+ }
+ },
+ {
+ "objectId": "p5_i2",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 1.3333,
+ "scaleY": 1.1388,
+ "translateX": 4832400,
+ "translateY": 1152475,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 14,
+ "unit": "PT"
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "BODY",
+ "index": 1,
+ "parentObjectId": "p1_i1"
+ }
+ }
+ },
+ {
+ "objectId": "p5_i3",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.1829,
+ "scaleY": 0.1312,
+ "translateX": 8472457.8125,
+ "translateY": 4663216.797499999,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "autoText": {
+ "type": "SLIDE_NUMBER",
+ "content": "#",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SLIDE_NUMBER",
+ "parentObjectId": "p1_i2"
+ }
+ }
+ }
+ ],
+ "layoutProperties": {
+ "masterObjectId": "simple-light-2",
+ "name": "TITLE_AND_TWO_COLUMNS",
+ "displayName": "Title and two columns"
+ },
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ }
+ },
+ {
+ "objectId": "p6",
+ "pageType": "LAYOUT",
+ "pageElements": [
+ {
+ "objectId": "p6_i0",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 0.1909,
+ "translateX": 311700,
+ "translateY": 445025,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {}
+ },
+ "1": {
+ "bulletStyle": {}
+ },
+ "2": {
+ "bulletStyle": {}
+ },
+ "3": {
+ "bulletStyle": {}
+ },
+ "4": {
+ "bulletStyle": {}
+ },
+ "5": {
+ "bulletStyle": {}
+ },
+ "6": {
+ "bulletStyle": {}
+ },
+ "7": {
+ "bulletStyle": {}
+ },
+ "8": {
+ "bulletStyle": {}
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "TITLE",
+ "parentObjectId": "p1_i0"
+ }
+ }
+ },
+ {
+ "objectId": "p6_i1",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.1829,
+ "scaleY": 0.1312,
+ "translateX": 8472457.8125,
+ "translateY": 4663216.797499999,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "autoText": {
+ "type": "SLIDE_NUMBER",
+ "content": "#",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SLIDE_NUMBER",
+ "parentObjectId": "p1_i2"
+ }
+ }
+ }
+ ],
+ "layoutProperties": {
+ "masterObjectId": "simple-light-2",
+ "name": "TITLE_ONLY",
+ "displayName": "Title only"
+ },
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ }
+ },
+ {
+ "objectId": "p7",
+ "pageType": "LAYOUT",
+ "pageElements": [
+ {
+ "objectId": "p7_i0",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.936,
+ "scaleY": 0.2519,
+ "translateX": 311700,
+ "translateY": 555600,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 24,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ },
+ "contentAlignment": "BOTTOM"
+ },
+ "placeholder": {
+ "type": "TITLE",
+ "parentObjectId": "p1_i0"
+ }
+ }
+ },
+ {
+ "objectId": "p7_i1",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.936,
+ "scaleY": 1.0598,
+ "translateX": 311700,
+ "translateY": 1389600,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 12,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "BODY",
+ "parentObjectId": "p1_i1"
+ }
+ }
+ },
+ {
+ "objectId": "p7_i2",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.1829,
+ "scaleY": 0.1312,
+ "translateX": 8472457.8125,
+ "translateY": 4663216.797499999,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "autoText": {
+ "type": "SLIDE_NUMBER",
+ "content": "#",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SLIDE_NUMBER",
+ "parentObjectId": "p1_i2"
+ }
+ }
+ }
+ ],
+ "layoutProperties": {
+ "masterObjectId": "simple-light-2",
+ "name": "ONE_COLUMN_TEXT",
+ "displayName": "One column text"
+ },
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ }
+ },
+ {
+ "objectId": "p8",
+ "pageType": "LAYOUT",
+ "pageElements": [
+ {
+ "objectId": "p8_i0",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.1226,
+ "scaleY": 1.3636,
+ "translateX": 490250,
+ "translateY": 450150,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 48,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ },
+ "contentAlignment": "MIDDLE"
+ },
+ "placeholder": {
+ "type": "TITLE",
+ "parentObjectId": "p1_i0"
+ }
+ }
+ },
+ {
+ "objectId": "p8_i1",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.1829,
+ "scaleY": 0.1312,
+ "translateX": 8472457.8125,
+ "translateY": 4663216.797499999,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "autoText": {
+ "type": "SLIDE_NUMBER",
+ "content": "#",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SLIDE_NUMBER",
+ "parentObjectId": "p1_i2"
+ }
+ }
+ }
+ ],
+ "layoutProperties": {
+ "masterObjectId": "simple-light-2",
+ "name": "MAIN_POINT",
+ "displayName": "Main point"
+ },
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ }
+ },
+ {
+ "objectId": "p9",
+ "pageType": "LAYOUT",
+ "pageElements": [
+ {
+ "objectId": "p9_i0",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 1.524,
+ "scaleY": 1.7145,
+ "translateX": 4572000,
+ "translateY": -125,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "RECTANGLE",
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "solidFill": {
+ "color": {
+ "themeColor": "LIGHT2"
+ },
+ "alpha": 1
+ }
+ },
+ "outline": {
+ "outlineFill": {
+ "solidFill": {
+ "color": {
+ "rgbColor": {}
+ },
+ "alpha": 1
+ }
+ },
+ "weight": {
+ "magnitude": 9525,
+ "unit": "EMU"
+ },
+ "dashStyle": "SOLID",
+ "propertyState": "NOT_RENDERED"
+ },
+ "shadow": {
+ "type": "OUTER",
+ "transform": {
+ "scaleX": 1,
+ "scaleY": 1,
+ "unit": "EMU"
+ },
+ "alignment": "BOTTOM_LEFT",
+ "blurRadius": {
+ "unit": "EMU"
+ },
+ "color": {
+ "rgbColor": {}
+ },
+ "alpha": 1,
+ "rotateWithShape": false,
+ "propertyState": "NOT_RENDERED"
+ },
+ "contentAlignment": "MIDDLE"
+ }
+ }
+ },
+ {
+ "objectId": "p9_i1",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 1.3484,
+ "scaleY": 0.4941,
+ "translateX": 265500,
+ "translateY": 1233175,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 42,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ },
+ "contentAlignment": "BOTTOM"
+ },
+ "placeholder": {
+ "type": "TITLE",
+ "parentObjectId": "p1_i0"
+ }
+ }
+ },
+ {
+ "objectId": "p9_i2",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 1.3484,
+ "scaleY": 0.4117,
+ "translateX": 265500,
+ "translateY": 2803075,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "CENTER",
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 21,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SUBTITLE",
+ "parentObjectId": "p1_i1"
+ }
+ }
+ },
+ {
+ "objectId": "p9_i3",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 1.279,
+ "scaleY": 1.2317,
+ "translateX": 4939500,
+ "translateY": 724075,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {}
+ },
+ "1": {
+ "bulletStyle": {}
+ },
+ "2": {
+ "bulletStyle": {}
+ },
+ "3": {
+ "bulletStyle": {}
+ },
+ "4": {
+ "bulletStyle": {}
+ },
+ "5": {
+ "bulletStyle": {}
+ },
+ "6": {
+ "bulletStyle": {}
+ },
+ "7": {
+ "bulletStyle": {}
+ },
+ "8": {
+ "bulletStyle": {}
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ },
+ "contentAlignment": "MIDDLE"
+ },
+ "placeholder": {
+ "type": "BODY",
+ "parentObjectId": "p1_i1"
+ }
+ }
+ },
+ {
+ "objectId": "p9_i4",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.1829,
+ "scaleY": 0.1312,
+ "translateX": 8472457.8125,
+ "translateY": 4663216.797499999,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "autoText": {
+ "type": "SLIDE_NUMBER",
+ "content": "#",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SLIDE_NUMBER",
+ "parentObjectId": "p1_i2"
+ }
+ }
+ }
+ ],
+ "layoutProperties": {
+ "masterObjectId": "simple-light-2",
+ "name": "SECTION_TITLE_AND_DESCRIPTION",
+ "displayName": "Section title and description"
+ },
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ }
+ },
+ {
+ "objectId": "p10",
+ "pageType": "LAYOUT",
+ "pageElements": [
+ {
+ "objectId": "p10_i0",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 1.9996,
+ "scaleY": 0.2017,
+ "translateX": 311700,
+ "translateY": 4230575,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {}
+ },
+ "1": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 18,
+ "unit": "PT"
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 18,
+ "unit": "PT"
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 18,
+ "unit": "PT"
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 18,
+ "unit": "PT"
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 18,
+ "unit": "PT"
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 18,
+ "unit": "PT"
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 18,
+ "unit": "PT"
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 18,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ },
+ "contentAlignment": "MIDDLE"
+ },
+ "placeholder": {
+ "type": "BODY",
+ "parentObjectId": "p1_i1"
+ }
+ }
+ },
+ {
+ "objectId": "p10_i1",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.1829,
+ "scaleY": 0.1312,
+ "translateX": 8472457.8125,
+ "translateY": 4663216.797499999,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "autoText": {
+ "type": "SLIDE_NUMBER",
+ "content": "#",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SLIDE_NUMBER",
+ "parentObjectId": "p1_i2"
+ }
+ }
+ }
+ ],
+ "layoutProperties": {
+ "masterObjectId": "simple-light-2",
+ "name": "CAPTION_ONLY",
+ "displayName": "Caption"
+ },
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ }
+ },
+ {
+ "objectId": "p11",
+ "pageType": "LAYOUT",
+ "pageElements": [
+ {
+ "objectId": "p11_i0",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 0.6545,
+ "translateX": 311700,
+ "translateY": 1106125,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": " ",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "fontSize": {
+ "magnitude": 120,
+ "unit": "PT"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ },
+ "contentAlignment": "BOTTOM"
+ },
+ "placeholder": {
+ "type": "TITLE",
+ "parentObjectId": "p1_i0"
+ }
+ }
+ },
+ {
+ "objectId": "p11_i1",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.8402,
+ "scaleY": 0.4336,
+ "translateX": 311700,
+ "translateY": 3152225,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "alignment": "CENTER",
+ "direction": "LEFT_TO_RIGHT"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {}
+ },
+ "1": {
+ "bulletStyle": {}
+ },
+ "2": {
+ "bulletStyle": {}
+ },
+ "3": {
+ "bulletStyle": {}
+ },
+ "4": {
+ "bulletStyle": {}
+ },
+ "5": {
+ "bulletStyle": {}
+ },
+ "6": {
+ "bulletStyle": {}
+ },
+ "7": {
+ "bulletStyle": {}
+ },
+ "8": {
+ "bulletStyle": {}
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "BODY",
+ "parentObjectId": "p1_i1"
+ }
+ }
+ },
+ {
+ "objectId": "p11_i2",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.1829,
+ "scaleY": 0.1312,
+ "translateX": 8472457.8125,
+ "translateY": 4663216.797499999,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "autoText": {
+ "type": "SLIDE_NUMBER",
+ "content": "#",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SLIDE_NUMBER",
+ "parentObjectId": "p1_i2"
+ }
+ }
+ }
+ ],
+ "layoutProperties": {
+ "masterObjectId": "simple-light-2",
+ "name": "BIG_NUMBER",
+ "displayName": "Big number"
+ },
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ }
+ },
+ {
+ "objectId": "p12",
+ "pageType": "LAYOUT",
+ "pageElements": [
+ {
+ "objectId": "p12_i0",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 0.1829,
+ "scaleY": 0.1312,
+ "translateX": 8472457.8125,
+ "translateY": 4663216.797499999,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "direction": "LEFT_TO_RIGHT"
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "autoText": {
+ "type": "SLIDE_NUMBER",
+ "content": "#",
+ "style": {}
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {}
+ }
+ }
+ ]
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "INHERIT"
+ },
+ "outline": {
+ "propertyState": "INHERIT"
+ },
+ "shadow": {
+ "propertyState": "INHERIT"
+ }
+ },
+ "placeholder": {
+ "type": "SLIDE_NUMBER",
+ "parentObjectId": "p1_i2"
+ }
+ }
+ }
+ ],
+ "layoutProperties": {
+ "masterObjectId": "simple-light-2",
+ "name": "BLANK",
+ "displayName": "Blank"
+ },
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "INHERIT"
+ }
+ }
+ }
+ ],
+ "locale": "en",
+ "revisionId": "kaHql7SEgvqFcw",
+ "notesMaster": {
+ "objectId": "n",
+ "pageType": "NOTES_MASTER",
+ "pageElements": [
+ {
+ "objectId": "n:slide",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 2.032025,
+ "scaleY": 1.143,
+ "translateX": 381300,
+ "translateY": 685800,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeProperties": {
+ "outline": {
+ "outlineFill": {
+ "solidFill": {
+ "color": {
+ "rgbColor": {}
+ },
+ "alpha": 1
+ }
+ },
+ "weight": {
+ "magnitude": 9525,
+ "unit": "EMU"
+ },
+ "dashStyle": "SOLID"
+ },
+ "contentAlignment": "MIDDLE"
+ },
+ "placeholder": {
+ "type": "SLIDE_IMAGE"
+ }
+ }
+ },
+ {
+ "objectId": "n:text",
+ "size": {
+ "width": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ },
+ "height": {
+ "magnitude": 3000000,
+ "unit": "EMU"
+ }
+ },
+ "transform": {
+ "scaleX": 1.8288,
+ "scaleY": 1.3716,
+ "translateX": 685800,
+ "translateY": 4343400,
+ "unit": "EMU"
+ },
+ "shape": {
+ "shapeType": "TEXT_BOX",
+ "text": {
+ "textElements": [
+ {
+ "endIndex": 1,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "COLLAPSE_LISTS"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "endIndex": 1,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "COLLAPSE_LISTS"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 1,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 1,
+ "endIndex": 2,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "COLLAPSE_LISTS"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 2,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 2,
+ "endIndex": 3,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "COLLAPSE_LISTS"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 3,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 3,
+ "endIndex": 4,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "COLLAPSE_LISTS"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 4,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 4,
+ "endIndex": 5,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "COLLAPSE_LISTS"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 5,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 5,
+ "endIndex": 6,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "COLLAPSE_LISTS"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 6,
+ "glyph": "●",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 6,
+ "endIndex": 7,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "COLLAPSE_LISTS"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 7,
+ "glyph": "○",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 7,
+ "endIndex": 8,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "paragraphMarker": {
+ "style": {
+ "lineSpacing": 100,
+ "alignment": "START",
+ "indentStart": {
+ "unit": "PT"
+ },
+ "indentEnd": {
+ "unit": "PT"
+ },
+ "spaceAbove": {
+ "unit": "PT"
+ },
+ "spaceBelow": {
+ "unit": "PT"
+ },
+ "indentFirstLine": {
+ "unit": "PT"
+ },
+ "direction": "LEFT_TO_RIGHT",
+ "spacingMode": "COLLAPSE_LISTS"
+ },
+ "bullet": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": 8,
+ "glyph": "■",
+ "bulletStyle": {}
+ }
+ }
+ },
+ {
+ "startIndex": 8,
+ "endIndex": 9,
+ "textRun": {
+ "content": "\n",
+ "style": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ }
+ ],
+ "lists": {
+ "bodyPlaceholderListEntity": {
+ "listId": "bodyPlaceholderListEntity",
+ "nestingLevel": {
+ "0": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "1": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "2": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "3": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "4": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "5": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "6": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "7": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ },
+ "8": {
+ "bulletStyle": {
+ "backgroundColor": {},
+ "foregroundColor": {
+ "opaqueColor": {
+ "rgbColor": {}
+ }
+ },
+ "bold": false,
+ "italic": false,
+ "fontFamily": "Arial",
+ "fontSize": {
+ "magnitude": 11,
+ "unit": "PT"
+ },
+ "baselineOffset": "NONE",
+ "smallCaps": false,
+ "strikethrough": false,
+ "underline": false,
+ "weightedFontFamily": {
+ "fontFamily": "Arial",
+ "weight": 400
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "shapeProperties": {
+ "shapeBackgroundFill": {
+ "propertyState": "NOT_RENDERED",
+ "solidFill": {
+ "color": {
+ "rgbColor": {
+ "red": 1,
+ "green": 1,
+ "blue": 1
+ }
+ },
+ "alpha": 1
+ }
+ },
+ "outline": {
+ "outlineFill": {
+ "solidFill": {
+ "color": {
+ "rgbColor": {}
+ },
+ "alpha": 1
+ }
+ },
+ "weight": {
+ "magnitude": 9525,
+ "unit": "EMU"
+ },
+ "dashStyle": "SOLID",
+ "propertyState": "NOT_RENDERED"
+ },
+ "shadow": {
+ "type": "OUTER",
+ "transform": {
+ "scaleX": 1,
+ "scaleY": 1,
+ "unit": "EMU"
+ },
+ "alignment": "BOTTOM_LEFT",
+ "blurRadius": {
+ "unit": "EMU"
+ },
+ "color": {
+ "rgbColor": {}
+ },
+ "alpha": 1,
+ "rotateWithShape": false,
+ "propertyState": "NOT_RENDERED"
+ },
+ "contentAlignment": "TOP"
+ },
+ "placeholder": {
+ "type": "BODY",
+ "index": 1
+ }
+ }
+ }
+ ],
+ "pageProperties": {
+ "pageBackgroundFill": {
+ "propertyState": "NOT_RENDERED",
+ "solidFill": {
+ "color": {
+ "rgbColor": {
+ "red": 1,
+ "green": 1,
+ "blue": 1
+ }
+ },
+ "alpha": 1
+ }
+ },
+ "colorScheme": {
+ "colors": [
+ {
+ "type": "DARK1",
+ "color": {}
+ },
+ {
+ "type": "LIGHT1",
+ "color": {
+ "red": 1,
+ "green": 1,
+ "blue": 1
+ }
+ },
+ {
+ "type": "DARK2",
+ "color": {
+ "red": 0.08235294,
+ "green": 0.5058824,
+ "blue": 0.34509805
+ }
+ },
+ {
+ "type": "LIGHT2",
+ "color": {
+ "red": 0.9529412,
+ "green": 0.9529412,
+ "blue": 0.9529412
+ }
+ },
+ {
+ "type": "ACCENT1",
+ "color": {
+ "red": 0.019607844,
+ "green": 0.5529412,
+ "blue": 0.78039217
+ }
+ },
+ {
+ "type": "ACCENT2",
+ "color": {
+ "red": 0.3137255,
+ "green": 0.7058824,
+ "blue": 0.19607843
+ }
+ },
+ {
+ "type": "ACCENT3",
+ "color": {
+ "red": 0.92941177,
+ "green": 0.3372549,
+ "blue": 0.105882354
+ }
+ },
+ {
+ "type": "ACCENT4",
+ "color": {
+ "red": 0.92941177,
+ "green": 0.9372549
+ }
+ },
+ {
+ "type": "ACCENT5",
+ "color": {
+ "red": 0.14117648,
+ "green": 0.79607844,
+ "blue": 0.8980392
+ }
+ },
+ {
+ "type": "ACCENT6",
+ "color": {
+ "red": 0.39215687,
+ "green": 0.8980392,
+ "blue": 0.44705883
+ }
+ },
+ {
+ "type": "HYPERLINK",
+ "color": {
+ "red": 0.13333334,
+ "blue": 0.8
+ }
+ },
+ {
+ "type": "FOLLOWED_HYPERLINK",
+ "color": {
+ "red": 0.33333334,
+ "green": 0.101960786,
+ "blue": 0.54509807
+ }
+ },
+ {
+ "type": "TEXT1",
+ "color": {}
+ },
+ {
+ "type": "BACKGROUND1",
+ "color": {
+ "red": 1,
+ "green": 1,
+ "blue": 1
+ }
+ },
+ {
+ "type": "TEXT2",
+ "color": {
+ "red": 0.9529412,
+ "green": 0.9529412,
+ "blue": 0.9529412
+ }
+ },
+ {
+ "type": "BACKGROUND2",
+ "color": {
+ "red": 0.08235294,
+ "green": 0.5058824,
+ "blue": 0.34509805
+ }
+ }
+ ]
+ }
+ }
+ }
+} \ No newline at end of file