diff --git a/docs/command-line-interface.md b/docs/command-line-interface.md
new file mode 100644
index 00000000..0ed7c54e
--- /dev/null
+++ b/docs/command-line-interface.md
@@ -0,0 +1,45 @@
+## Examples
+
+
+### Composition
+
+
+Suppose we have the following system:
+
+
+
+
+Components $M$ and $M'$ obey, respectively, contracts $C = (|i| \le 2, o \le i \le 2o + 2)$ and $C' = (-1 \le o \le 1/5, o' \le o)$. We can use Pacti to obtain the specification of the system by executing the command
+
+`pacti examples/example.json result.json`
+
+Pacti places the result of composition in the file result.json. The output is
+
+```
+ Composed contract:
+ InVars: []
+ OutVars:[]
+ A: 5*i <= 1, -1/2*i <= 0
+ G: -1*i + 1*o_p <= 0
+```
+
+### Quotient
+
+
+Now we consider an example of quotient. Consider the following circuits:
+
+
+
+We wish to implement a system $M$ with specification $C = (|i| \le 1, o' = 2i + 1)$, and to do this we have available a component $M'$ with specification $C' = (|i| \le 2, o = 2i)$. We use the quotient operation in Pacti to obtain the specification of the component that we are missing so that the resulting object meets the specification $C$. We run the command
+
+`pacti examples/example_quotient.json result.json`
+
+And Pacti outputs
+
+```
+ Contract quotient:
+ InVars: []
+ OutVars:[]
+ A: 1*o <= 2, -1*o <= 2
+ G: -1*o + 1*o_p <= 1, 1*o + -1*o_p <= -1
+```
\ No newline at end of file
diff --git a/docs/css/material.css b/docs/css/material.css
index 9e8c14a6..b5fb7fbf 100644
--- a/docs/css/material.css
+++ b/docs/css/material.css
@@ -2,3 +2,8 @@
.md-main__inner {
margin-bottom: 1.5rem;
}
+
+
+.md-content__button {
+ display: none;
+}
\ No newline at end of file
diff --git a/docs/getting_started.ipynb b/docs/getting_started.ipynb
new file mode 100644
index 00000000..aa30b04d
--- /dev/null
+++ b/docs/getting_started.ipynb
@@ -0,0 +1,251 @@
+{
+ "cells": [
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Getting started\n",
+ "\n",
+ "Pacti helps designers to reason about specifications and to manipulate them. These specifications are given to Pacti as assume-guarantee contracts, which are requirements of the form (assumptions, guarantees).\n",
+ "\n",
+ "For Pacti, every contract has four elements:\n",
+ "- Input variables\n",
+ "- Output variables\n",
+ "- Assumptions\n",
+ "- Guarantees\n",
+ "\n",
+ "The assumptions of a contract are only allowed to refer to the input variables. Guarantees are only allowed to refer to the input and output variables of the contract, i.e., no variables outside the interface of the contract may appear in the assumptions or guarantees.\n",
+ "\n",
+ "The algebra of contracts has been extensively researched. This algebra allows us to compute new specifications from existing contracts. For example,\n",
+ "- The operation of composition allows us to compute the specification of the system formed by composing subsystems obeying the specifications being composed. In other words, composition is the system-building operation.\n",
+ "- The operation of quotient allows us to compute the specification of a component that needs to be composed with an existing subsystem so that the resulting system meets a top-level specification. Quotient is used to find missing-component specifications.\n",
+ "- The operation of merging is used to generate a single contract that simultaneously enforces the assumptions and guarantees of the contracts being merged. This is used to fuse contract viewpoints in concurrent design.\n",
+ "\n",
+ "### Computing system specifications\n",
+ "\n",
+ "\n",
+ "Consider the following system:\n",
+ "\n",
+ "![image](data:image/png;base64,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)\n",
+ "\n",
+ "Components $M$ and $M'$ obey, respectively, contracts $C = (|i| \\le 2, o \\le i \\le 2o + 2)$ and $C' = (-1 \\le o \\le 1/5, o' \\le o)$. We can use Pacti to obtain the specification of the system that comprises these two components as follows: "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "InVars: [i]\n",
+ "OutVars:[o_p]\n",
+ "A: [\n",
+ " i <= 0.19999999999999996\n",
+ " -0.5 i <= 0.0\n",
+ "]\n",
+ "G: [\n",
+ " -i + o_p <= 0.0\n",
+ "]\n"
+ ]
+ }
+ ],
+ "source": [
+ "from pacti.terms.polyhedra import PolyhedralContract\n",
+ "\n",
+ "contract1 = PolyhedralContract.from_string(\n",
+ " InputVars=[\"i\"],\n",
+ " OutputVars=[\"o\"],\n",
+ " assumptions=[\"|i| <= 2\"],\n",
+ " guarantees=[\"o - i <= 0\", \"i - 2o <= 2\"])\n",
+ "\n",
+ "contract2 = PolyhedralContract.from_string(\n",
+ " InputVars=[\"o\"],\n",
+ " OutputVars=[\"o_p\"],\n",
+ " assumptions=[\"o <= 0.2\", \"-o <= 1\"],\n",
+ " guarantees=[\"o_p - o <= 0\"])\n",
+ "\n",
+ "system_contract = contract1.compose(contract2)\n",
+ "print(system_contract)"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Pacti gives us the specification of the system. Note that the resulting contract only involves the top-level inputs and outputs.\n",
+ "\n",
+ "\n",
+ "### System diagnostics\n",
+ "\n",
+ "Suppose that we are trying to build a system as shown in the figure above with the same specification $C'$ for $M'$. Suppose that now the specification $C_n$ for $M$ is $(|i| <= 2, |o| <= 3)$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "ValueError",
+ "evalue": "The guarantees \n[\n |o| <= 3.0\n]\nwere insufficient to abduce the assumptions \n[\n o <= 0.2\n -o <= 1.0\n]\nby eliminating the variables \n[, ]",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[4], line 7\u001b[0m\n\u001b[0;32m 1\u001b[0m contract1_n \u001b[39m=\u001b[39m PolyhedralContract\u001b[39m.\u001b[39mfrom_string(\n\u001b[0;32m 2\u001b[0m InputVars\u001b[39m=\u001b[39m[\u001b[39m\"\u001b[39m\u001b[39mi\u001b[39m\u001b[39m\"\u001b[39m],\n\u001b[0;32m 3\u001b[0m OutputVars\u001b[39m=\u001b[39m[\u001b[39m\"\u001b[39m\u001b[39mo\u001b[39m\u001b[39m\"\u001b[39m],\n\u001b[0;32m 4\u001b[0m assumptions\u001b[39m=\u001b[39m[\u001b[39m\"\u001b[39m\u001b[39m|i| <= 2\u001b[39m\u001b[39m\"\u001b[39m],\n\u001b[0;32m 5\u001b[0m guarantees\u001b[39m=\u001b[39m[\u001b[39m\"\u001b[39m\u001b[39m|o| <= 3\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[1;32m----> 7\u001b[0m contract_system \u001b[39m=\u001b[39m contract1_n\u001b[39m.\u001b[39;49mcompose(contract2)\n",
+ "File \u001b[1;32m~\\iir_repo\\pacti\\src\\pacti\\iocontract\\iocontract.py:458\u001b[0m, in \u001b[0;36mIoContract.compose\u001b[1;34m(self, other)\u001b[0m\n\u001b[0;32m 456\u001b[0m new_a \u001b[39m=\u001b[39m other\u001b[39m.\u001b[39ma\u001b[39m.\u001b[39mabduce_with_context(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39ma \u001b[39m|\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mg, assumptions_forbidden_vars)\n\u001b[0;32m 457\u001b[0m \u001b[39mif\u001b[39;00m list_intersection(new_a\u001b[39m.\u001b[39mvars, assumptions_forbidden_vars):\n\u001b[1;32m--> 458\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\n\u001b[0;32m 459\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mThe guarantees \u001b[39m\u001b[39m\\n\u001b[39;00m\u001b[39m{}\u001b[39;00m\u001b[39m\\n\u001b[39;00m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39mformat(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mg)\n\u001b[0;32m 460\u001b[0m \u001b[39m+\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mwere insufficient to abduce the assumptions \u001b[39m\u001b[39m\\n\u001b[39;00m\u001b[39m{}\u001b[39;00m\u001b[39m\\n\u001b[39;00m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39mformat(other\u001b[39m.\u001b[39ma)\n\u001b[0;32m 461\u001b[0m \u001b[39m+\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mby eliminating the variables \u001b[39m\u001b[39m\\n\u001b[39;00m\u001b[39m{}\u001b[39;00m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39mformat(assumptions_forbidden_vars)\n\u001b[0;32m 462\u001b[0m )\n\u001b[0;32m 463\u001b[0m assumptions \u001b[39m=\u001b[39m new_a \u001b[39m|\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39ma\n\u001b[0;32m 464\u001b[0m \u001b[39melif\u001b[39;00m other_helps_self \u001b[39mand\u001b[39;00m \u001b[39mnot\u001b[39;00m self_helps_other:\n",
+ "\u001b[1;31mValueError\u001b[0m: The guarantees \n[\n |o| <= 3.0\n]\nwere insufficient to abduce the assumptions \n[\n o <= 0.2\n -o <= 1.0\n]\nby eliminating the variables \n[, ]"
+ ]
+ }
+ ],
+ "source": [
+ "contract1_n = PolyhedralContract.from_string(\n",
+ " InputVars=[\"i\"],\n",
+ " OutputVars=[\"o\"],\n",
+ " assumptions=[\"|i| <= 2\"],\n",
+ " guarantees=[\"|o| <= 3\"])\n",
+ "\n",
+ "contract_system = contract1_n.compose(contract2)"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Pacti is unable to compute a system specification. In this case, this is due to the fact that our guarantee $|o| \\le 3$ for $M$ does not satisfy the assumptions of $C'$."
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Quotient\n",
+ "\n",
+ "Now consider the situation shown in the following diagram:\n",
+ "\n",
+ "![image](data:image/png;base64,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)"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We wish to implement a system $M$ with specification $C = (|i| \\le 1, o' = 2i + 1)$, and to do this we have available a component $M'$ with specification $C' = (|i| \\le 2, o = 2i)$. We use the quotient operation in Pacti to obtain the specification of the component that we are missing--that would fill the question mark--so that the resulting object meets the specification $C$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "InVars: [o]\n",
+ "OutVars:[o_p]\n",
+ "A: [\n",
+ " |o| <= 2.0\n",
+ "]\n",
+ "G: [\n",
+ " -o + o_p = 1.0\n",
+ "]\n"
+ ]
+ }
+ ],
+ "source": [
+ "contract_top_level = PolyhedralContract.from_string(\n",
+ " InputVars=[\"i\"],\n",
+ " OutputVars=[\"o_p\"],\n",
+ " assumptions=[\"|i| <= 1\"],\n",
+ " guarantees=[\"o_p - 2i = 1\"])\n",
+ "\n",
+ "contract_existing_component = PolyhedralContract.from_string(\n",
+ " InputVars=[\"i\"],\n",
+ " OutputVars=[\"o\"],\n",
+ " assumptions=[\"|i| <= 2\"],\n",
+ " guarantees=[\"o - 2i = 0\"])\n",
+ "\n",
+ "contract_missing_object = contract_top_level.quotient(contract_existing_component)\n",
+ "print(contract_missing_object)"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Observe that Pacti tells us that the missing component's specification has input $o$ and output $o'$. The resulting specification is guaranteed to implement the top-level system when composed with the contract of the existing component. We can verify this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "True\n"
+ ]
+ }
+ ],
+ "source": [
+ "# compose quotient \n",
+ "new_system_object = contract_missing_object.compose(contract_existing_component)\n",
+ "print(new_system_object.refines(contract_top_level))"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### To learn more\n",
+ "\n",
+ "These introductory examples show some analysis tasks we can carry out with Pacti. The `case_studies` folder contains several case studies that discuss the application of Pacti in various design disciplines."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": ".venv",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.7"
+ },
+ "orig_nbformat": 4,
+ "vscode": {
+ "interpreter": {
+ "hash": "b282b3e35ff361393169c4f355db145ffcb63e574f57c9818c827b7c99ca9fc3"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/docs/index.md b/docs/index.md
index ec08973e..52ce6657 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -10,48 +10,4 @@ system using assume-guarantee specifications, or contracts. Pacti's capabilities
- Computing specifications of subsystems that need to be added to a design in order to meet an objective.
- Verifying whether a component meets a specification.
-## Examples
-
-### Composition
-
-
-Suppose we have the following system:
-
-
-
-
-Components $M$ and $M'$ obey, respectively, contracts $C = (|i| \le 2, o \le i \le 2o + 2)$ and $C' = (-1 \le o \le 1/5, o' \le o)$. We can use Pacti to obtain the specification of the system by executing the command
-
-`pacti examples/example.json result.json`
-
-Pacti places the result of composition in the file result.json. The output is
-
-```
- Composed contract:
- InVars: []
- OutVars:[]
- A: 5*i <= 1, -1/2*i <= 0
- G: -1*i + 1*o_p <= 0
-```
-
-### Quotient
-
-
-Now we consider an example of quotient. Consider the following circuits:
-
-
-
-We wish to implement a system $M$ with specification $C = (|i| \le 1, o' = 2i + 1)$, and to do this we have available a component $M'$ with specification $C' = (|i| \le 2, o = 2i)$. We use the quotient operation in Pacti to obtain the specification of the component that we are missing so that the resulting object meets the specification $C$. We run the command
-
-`pacti examples/example_quotient.json result.json`
-
-And Pacti outputs
-
-```
- Contract quotient:
- InVars: []
- OutVars:[]
- A: 1*o <= 2, -1*o <= 2
- G: -1*o + 1*o_p <= 1, 1*o + -1*o_p <= -1
-```
diff --git a/docs/getting_started.md b/docs/installing.md
similarity index 100%
rename from docs/getting_started.md
rename to docs/installing.md
diff --git a/docs/source/_static/circuit_series_composition_background.ai b/docs/source/_static/circuit_series_composition_background.ai
new file mode 100644
index 00000000..1bbd6782
--- /dev/null
+++ b/docs/source/_static/circuit_series_composition_background.ai
@@ -0,0 +1,1586 @@
+%PDF-1.6
%
+1 0 obj
<>/OCGs[23 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<>stream
+
+
+
+
+ application/pdf
+
+
+ circuit_series_composition_background
+
+
+ Adobe Illustrator 26.5 (Windows)
+ 2023-02-19T15:55:14-07:00
+ 2023-02-19T15:55:14-08:00
+ 2023-02-19T15:55:14-08:00
+
+
+
+ 256
+ 80
+ JPEG
+ /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAUAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8Am3lHyj5Ul8qaLLLothJL
JYWzSSNbQszM0KkkkrUknFU2/wAGeT/+rFp//SLB/wA0Yq7/AAZ5P/6sWn/9IsH/ADRirv8ABnk/
/qxaf/0iwf8ANGKu/wAGeT/+rFp//SLB/wA0Yqk/m20/L/yt5fudc1Dy/ZvZ2rRLKsNnbtJSaZIQ
QpC1oZATv0xVU8vWX5Y+Y9PXUNEsNKvrRti8dtDVW/ldSgZG9mAOKpp/gzyf/wBWLT/+kWD/AJox
V3+DPJ//AFYtP/6RYP8AmjFXf4M8n/8AVi0//pFg/wCaMVd/gzyf/wBWLT/+kWD/AJoxV3+DPJ//
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
6hb4q9+xVAa5r+i6Dpsup61ew6fp8A/eXNw4RB4Cp6k9gNziryLUvzW87edS1r+XtmdG0F6q/m/V
IiHkXpysLN6FvZ5dvYHFXeWPy90PQrqTU3MuqeYLje813UHM93IT1o7fYX/JWn04qyfFXYq7FXYq
7FXYq7FXYqlv5E/8dL8wP/Agb/qEhxV6virznzl+dugaPqD6D5ft5PNPmsVX9FaeQY4W6Vu7neOB
QetasPDFWDzeT/NHnK4jv/zJ1IXkCkSW/lWwLRaZCRuvq787lx4uadeoxVmttbW1rBHb20SQW8Sh
YoY1CIqjoFVaADFVTFXYq7FXYq7FXYq7FXYqk/nP/lD9d/7Z91/yYfFXeTP+UP0L/tn2v/JhMVTj
FXYq7FXYqwb87SB+WupEmgE9gST/ANtC3xVkvmP89EvLybRPy3sB5n1aMmO41MsU0m1bv6twP71h
14RdfHFWPWv5eTapqceu+fNRbzPrUe9vDKvHT7Unelva/Y2/mYEnr1xVmoAAoOmKuxV2KuxV2Kux
V2KuxV2KuxVgfkP8zPKHkm58+Prd2frlz5hYWOlWy+te3LfVYQBDAvxHfbkaLXviqJ1G9/M78wqj
VJZPJflSSlNIs3B1S5TwubkCkKsP2E37Niqf+XvLOg+XbAWGi2UdnbA1YIPidv5nc1Z292OKppir
sVdirsVdirsVdirsVdirsVSfzn/yh+u/9s+6/wCTD4qlPlHzd5Ui8qaLFLrVhHLHYWyyRtcwqyss
KgggtUEHFU2/xn5P/wCr7p//AElQf814q7/Gfk//AKvun/8ASVB/zXirv8Z+T/8Aq+6f/wBJUH/N
eKu/xn5P/wCr7p//AElQf814qlvmLUfy68xaRNo+ravp8+n3JjaeEXkScvSkWVQWVw1OSCtDiqJ0
7zD+X+m2cVlp+qaVaWcI4xW8Nxboij2VWAxVE/4z8n/9X3T/APpKg/5rxV3+M/J//V90/wD6SoP+
a8Vd/jPyf/1fdP8A+kqD/mvFXf4z8n/9X3T/APpKg/5rxV3+M/J//V90/wD6SoP+a8Vd/jPyf/1f
dP8A+kqD/mvFXf4z8n/9X3T/APpKg/5rxV3+M/J//V90/wD6SoP+a8Vd/jPyf/1fdP8A+kqD/mvF
Xf4z8n/9X3T/APpKg/5rxV3+M/J//V90/wD6SoP+a8VSTTB+VOm61e63a32ljV9QkMlzfPdQvKSw
oVVmc8Fp2Wnviqd/4z8n/wDV90//AKSoP+a8Vd/jPyf/ANX3T/8ApKg/5rxV3+M/J/8A1fdP/wCk
qD/mvFXf4z8n/wDV90//AKSoP+a8Vd/jPyf/ANX3T/8ApKg/5rxV3+M/J/8A1fdP/wCkqD/mvFXf
4z8n/wDV90//AKSoP+a8Vd/jPyf/ANX3T/8ApKg/5rxV3+M/J/8A1fdP/wCkqD/mvFXf4z8n/wDV
90//AKSoP+a8Vd/jPyf/ANX3T/8ApKg/5rxV3+M/J/8A1fdP/wCkqD/mvFUp83ebvKkvlTWootas
JJZLC5WONbmFmZmhYAABqkk4q//Z
+
+
+
+ proof:pdf
+ uuid:65E6390686CF11DBA6E2D887CEACB407
+ xmp.did:a2eae489-7062-aa47-be7d-5fcd0bcd9241
+ uuid:d503a42a-e61b-490d-9074-fb7aa506c057
+
+ uuid:a18973d7-d008-43df-99c5-094675029025
+ xmp.did:75776949-b0b3-b84d-a964-6b6b6db2542e
+ uuid:65E6390686CF11DBA6E2D887CEACB407
+ proof:pdf
+
+
+
+
+ saved
+ xmp.iid:75776949-b0b3-b84d-a964-6b6b6db2542e
+ 2023-01-24T14:39:27-08:00
+ Adobe Illustrator 26.5 (Windows)
+ /
+
+
+ saved
+ xmp.iid:a2eae489-7062-aa47-be7d-5fcd0bcd9241
+ 2023-01-24T14:47:46-08:00
+ Adobe Illustrator 26.5 (Windows)
+ /
+
+
+
+ Web
+ AIRobin
+ Document
+ 1
+ False
+ False
+
+ 503.899216
+ 157.000000
+ Pixels
+
+
+
+
+ TimesNewRomanPS-ItalicMT
+ Times New Roman
+ Italic
+ Open Type
+ Version 7.03
+ False
+ timesi.ttf
+
+
+
+
+
+ Cyan
+ Magenta
+ Yellow
+ Black
+
+
+
+
+
+ Default Swatch Group
+ 0
+
+
+
+ White
+ RGB
+ PROCESS
+ 255
+ 255
+ 255
+
+
+ Black
+ RGB
+ PROCESS
+ 0
+ 0
+ 0
+
+
+ RGB Red
+ RGB
+ PROCESS
+ 255
+ 0
+ 0
+
+
+ RGB Yellow
+ RGB
+ PROCESS
+ 255
+ 255
+ 0
+
+
+ RGB Green
+ RGB
+ PROCESS
+ 0
+ 255
+ 0
+
+
+ RGB Cyan
+ RGB
+ PROCESS
+ 0
+ 255
+ 255
+
+
+ RGB Blue
+ RGB
+ PROCESS
+ 0
+ 0
+ 255
+
+
+ RGB Magenta
+ RGB
+ PROCESS
+ 255
+ 0
+ 255
+
+
+ R=193 G=39 B=45
+ RGB
+ PROCESS
+ 193
+ 39
+ 45
+
+
+ R=237 G=28 B=36
+ RGB
+ PROCESS
+ 237
+ 28
+ 36
+
+
+ R=241 G=90 B=36
+ RGB
+ PROCESS
+ 241
+ 90
+ 36
+
+
+ R=247 G=147 B=30
+ RGB
+ PROCESS
+ 247
+ 147
+ 30
+
+
+ R=251 G=176 B=59
+ RGB
+ PROCESS
+ 251
+ 176
+ 59
+
+
+ R=252 G=238 B=33
+ RGB
+ PROCESS
+ 252
+ 238
+ 33
+
+
+ R=217 G=224 B=33
+ RGB
+ PROCESS
+ 217
+ 224
+ 33
+
+
+ R=140 G=198 B=63
+ RGB
+ PROCESS
+ 140
+ 198
+ 63
+
+
+ R=57 G=181 B=74
+ RGB
+ PROCESS
+ 57
+ 181
+ 74
+
+
+ R=0 G=146 B=69
+ RGB
+ PROCESS
+ 0
+ 146
+ 69
+
+
+ R=0 G=104 B=55
+ RGB
+ PROCESS
+ 0
+ 104
+ 55
+
+
+ R=34 G=181 B=115
+ RGB
+ PROCESS
+ 34
+ 181
+ 115
+
+
+ R=0 G=169 B=157
+ RGB
+ PROCESS
+ 0
+ 169
+ 157
+
+
+ R=41 G=171 B=226
+ RGB
+ PROCESS
+ 41
+ 171
+ 226
+
+
+ R=0 G=113 B=188
+ RGB
+ PROCESS
+ 0
+ 113
+ 188
+
+
+ R=46 G=49 B=146
+ RGB
+ PROCESS
+ 46
+ 49
+ 146
+
+
+ R=27 G=20 B=100
+ RGB
+ PROCESS
+ 27
+ 20
+ 100
+
+
+ R=102 G=45 B=145
+ RGB
+ PROCESS
+ 102
+ 45
+ 145
+
+
+ R=147 G=39 B=143
+ RGB
+ PROCESS
+ 147
+ 39
+ 143
+
+
+ R=158 G=0 B=93
+ RGB
+ PROCESS
+ 158
+ 0
+ 93
+
+
+ R=212 G=20 B=90
+ RGB
+ PROCESS
+ 212
+ 20
+ 90
+
+
+ R=237 G=30 B=121
+ RGB
+ PROCESS
+ 237
+ 30
+ 121
+
+
+ R=199 G=178 B=153
+ RGB
+ PROCESS
+ 199
+ 178
+ 153
+
+
+ R=153 G=134 B=117
+ RGB
+ PROCESS
+ 153
+ 134
+ 117
+
+
+ R=115 G=99 B=87
+ RGB
+ PROCESS
+ 115
+ 99
+ 87
+
+
+ R=83 G=71 B=65
+ RGB
+ PROCESS
+ 83
+ 71
+ 65
+
+
+ R=198 G=156 B=109
+ RGB
+ PROCESS
+ 198
+ 156
+ 109
+
+
+ R=166 G=124 B=82
+ RGB
+ PROCESS
+ 166
+ 124
+ 82
+
+
+ R=140 G=98 B=57
+ RGB
+ PROCESS
+ 140
+ 98
+ 57
+
+
+ R=117 G=76 B=36
+ RGB
+ PROCESS
+ 117
+ 76
+ 36
+
+
+ R=96 G=56 B=19
+ RGB
+ PROCESS
+ 96
+ 56
+ 19
+
+
+ R=66 G=33 B=11
+ RGB
+ PROCESS
+ 66
+ 33
+ 11
+
+
+
+
+
+ Grays
+ 1
+
+
+
+ R=0 G=0 B=0
+ RGB
+ PROCESS
+ 0
+ 0
+ 0
+
+
+ R=26 G=26 B=26
+ RGB
+ PROCESS
+ 26
+ 26
+ 26
+
+
+ R=51 G=51 B=51
+ RGB
+ PROCESS
+ 51
+ 51
+ 51
+
+
+ R=77 G=77 B=77
+ RGB
+ PROCESS
+ 77
+ 77
+ 77
+
+
+ R=102 G=102 B=102
+ RGB
+ PROCESS
+ 102
+ 102
+ 102
+
+
+ R=128 G=128 B=128
+ RGB
+ PROCESS
+ 128
+ 128
+ 128
+
+
+ R=153 G=153 B=153
+ RGB
+ PROCESS
+ 153
+ 153
+ 153
+
+
+ R=179 G=179 B=179
+ RGB
+ PROCESS
+ 179
+ 179
+ 179
+
+
+ R=204 G=204 B=204
+ RGB
+ PROCESS
+ 204
+ 204
+ 204
+
+
+ R=230 G=230 B=230
+ RGB
+ PROCESS
+ 230
+ 230
+ 230
+
+
+ R=242 G=242 B=242
+ RGB
+ PROCESS
+ 242
+ 242
+ 242
+
+
+
+
+
+ Web Color Group
+ 1
+
+
+
+ R=63 G=169 B=245
+ RGB
+ PROCESS
+ 63
+ 169
+ 245
+
+
+ R=122 G=201 B=67
+ RGB
+ PROCESS
+ 122
+ 201
+ 67
+
+
+ R=255 G=147 B=30
+ RGB
+ PROCESS
+ 255
+ 147
+ 30
+
+
+ R=255 G=29 B=37
+ RGB
+ PROCESS
+ 255
+ 29
+ 37
+
+
+ R=255 G=123 B=172
+ RGB
+ PROCESS
+ 255
+ 123
+ 172
+
+
+ R=189 G=204 B=212
+ RGB
+ PROCESS
+ 189
+ 204
+ 212
+
+
+
+
+
+
+ Adobe PDF library 16.07
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+endstream
endobj
3 0 obj
<>
endobj
5 0 obj
<>/Resources<>/ExtGState<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 28 0 R/TrimBox[0.0 0.0 503.899 157.0]/Type/Page>>
endobj
25 0 obj
<>stream
+HTKO0W7ue4!D㡍 %tݪ .T?#nea~Ӂk=x5Gr3j@׳[;婾Ex*Q
Omv{j 3r #f!նr
Ed2V0(fS^~ZфcgB98+CBH1jn\9)5?a̯?ĪHu04hV^+eNb((rGR$adI@F^f!_T amٌ)Q(
%M3zMV>B4}_.n)
+r]ng)\w!1v7.zXڿ[ ^
+endstream
endobj
28 0 obj
<>stream
+8;X.+gD'f6#XkR4W_>YN@llE\,1$4E3S>6]Y/m?Q?XqdYF$D>b7gcEM2T;*`S0rfk
+fk:=:c9dMggjAKBc(Xln5LCJ^BH2`D>s[[fK@++5GZh%CPOMHfs2#0?-FE>V'dB@C
+p5''9!5G]>S;$3VR(@"7ie.lX\VnSh?F\,I9-3rs$P32Z_HXdEhCN#.DJ#T#Veg[V
+3su8DHEI,]:HHaH;X5e3j?(p6k4t0/]!o?.cu,<96!3G7!$93equ~>
+endstream
endobj
29 0 obj
[/Indexed/DeviceRGB 255 30 0 R]
endobj
30 0 obj
<>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
+endstream
endobj
23 0 obj
<>
endobj
31 0 obj
[/View/Design]
endobj
32 0 obj
<>>>
endobj
22 0 obj
<>
endobj
33 0 obj
<>
endobj
34 0 obj
<>stream
+H| XSg2Bl
+*pMݪ(ō{Z[DEnUAEE@ĥנよabp7E\ZC;A>|Ι@ hI@Mo[&=Wxd\D< >kbG}R`eT<