constrained_optimization_demo.html•809 kB
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>constrained_optimization_demo</title><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script>
<style type="text/css">
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: var(--jp-cell-editor-active-background) }
.highlight { background: var(--jp-cell-editor-background); color: var(--jp-mirror-editor-variable-color) }
.highlight .c { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment */
.highlight .err { color: var(--jp-mirror-editor-error-color) } /* Error */
.highlight .k { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword */
.highlight .o { color: var(--jp-mirror-editor-operator-color); font-weight: bold } /* Operator */
.highlight .p { color: var(--jp-mirror-editor-punctuation-color) } /* Punctuation */
.highlight .ch { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Multiline */
.highlight .cp { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Preproc */
.highlight .cpf { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Single */
.highlight .cs { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Special */
.highlight .kc { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Type */
.highlight .m { color: var(--jp-mirror-editor-number-color) } /* Literal.Number */
.highlight .s { color: var(--jp-mirror-editor-string-color) } /* Literal.String */
.highlight .ow { color: var(--jp-mirror-editor-operator-color); font-weight: bold } /* Operator.Word */
.highlight .pm { color: var(--jp-mirror-editor-punctuation-color) } /* Punctuation.Marker */
.highlight .w { color: var(--jp-mirror-editor-variable-color) } /* Text.Whitespace */
.highlight .mb { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Bin */
.highlight .mf { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Float */
.highlight .mh { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Hex */
.highlight .mi { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Integer */
.highlight .mo { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Oct */
.highlight .sa { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Affix */
.highlight .sb { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Backtick */
.highlight .sc { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Char */
.highlight .dl { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Delimiter */
.highlight .sd { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Doc */
.highlight .s2 { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Double */
.highlight .se { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Escape */
.highlight .sh { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Heredoc */
.highlight .si { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Interpol */
.highlight .sx { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Other */
.highlight .sr { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Regex */
.highlight .s1 { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Single */
.highlight .ss { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Symbol */
.highlight .il { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Integer.Long */
</style>
<style type="text/css">
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*
* Mozilla scrollbar styling
*/
/* use standard opaque scrollbars for most nodes */
[data-jp-theme-scrollbars='true'] {
scrollbar-color: rgb(var(--jp-scrollbar-thumb-color))
var(--jp-scrollbar-background-color);
}
/* for code nodes, use a transparent style of scrollbar. These selectors
* will match lower in the tree, and so will override the above */
[data-jp-theme-scrollbars='true'] .CodeMirror-hscrollbar,
[data-jp-theme-scrollbars='true'] .CodeMirror-vscrollbar {
scrollbar-color: rgba(var(--jp-scrollbar-thumb-color), 0.5) transparent;
}
/* tiny scrollbar */
.jp-scrollbar-tiny {
scrollbar-color: rgba(var(--jp-scrollbar-thumb-color), 0.5) transparent;
scrollbar-width: thin;
}
/* tiny scrollbar */
.jp-scrollbar-tiny::-webkit-scrollbar,
.jp-scrollbar-tiny::-webkit-scrollbar-corner {
background-color: transparent;
height: 4px;
width: 4px;
}
.jp-scrollbar-tiny::-webkit-scrollbar-thumb {
background: rgba(var(--jp-scrollbar-thumb-color), 0.5);
}
.jp-scrollbar-tiny::-webkit-scrollbar-track:horizontal {
border-left: 0 solid transparent;
border-right: 0 solid transparent;
}
.jp-scrollbar-tiny::-webkit-scrollbar-track:vertical {
border-top: 0 solid transparent;
border-bottom: 0 solid transparent;
}
/*
* Lumino
*/
.lm-ScrollBar[data-orientation='horizontal'] {
min-height: 16px;
max-height: 16px;
min-width: 45px;
border-top: 1px solid #a0a0a0;
}
.lm-ScrollBar[data-orientation='vertical'] {
min-width: 16px;
max-width: 16px;
min-height: 45px;
border-left: 1px solid #a0a0a0;
}
.lm-ScrollBar-button {
background-color: #f0f0f0;
background-position: center center;
min-height: 15px;
max-height: 15px;
min-width: 15px;
max-width: 15px;
}
.lm-ScrollBar-button:hover {
background-color: #dadada;
}
.lm-ScrollBar-button.lm-mod-active {
background-color: #cdcdcd;
}
.lm-ScrollBar-track {
background: #f0f0f0;
}
.lm-ScrollBar-thumb {
background: #cdcdcd;
}
.lm-ScrollBar-thumb:hover {
background: #bababa;
}
.lm-ScrollBar-thumb.lm-mod-active {
background: #a0a0a0;
}
.lm-ScrollBar[data-orientation='horizontal'] .lm-ScrollBar-thumb {
height: 100%;
min-width: 15px;
border-left: 1px solid #a0a0a0;
border-right: 1px solid #a0a0a0;
}
.lm-ScrollBar[data-orientation='vertical'] .lm-ScrollBar-thumb {
width: 100%;
min-height: 15px;
border-top: 1px solid #a0a0a0;
border-bottom: 1px solid #a0a0a0;
}
.lm-ScrollBar[data-orientation='horizontal']
.lm-ScrollBar-button[data-action='decrement'] {
background-image: var(--jp-icon-caret-left);
background-size: 17px;
}
.lm-ScrollBar[data-orientation='horizontal']
.lm-ScrollBar-button[data-action='increment'] {
background-image: var(--jp-icon-caret-right);
background-size: 17px;
}
.lm-ScrollBar[data-orientation='vertical']
.lm-ScrollBar-button[data-action='decrement'] {
background-image: var(--jp-icon-caret-up);
background-size: 17px;
}
.lm-ScrollBar[data-orientation='vertical']
.lm-ScrollBar-button[data-action='increment'] {
background-image: var(--jp-icon-caret-down);
background-size: 17px;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/
.lm-Widget {
box-sizing: border-box;
position: relative;
overflow: hidden;
}
.lm-Widget.lm-mod-hidden {
display: none !important;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
.lm-AccordionPanel[data-orientation='horizontal'] > .lm-AccordionPanel-title {
/* Title is rotated for horizontal accordion panel using CSS */
display: block;
transform-origin: top left;
transform: rotate(-90deg) translate(-100%);
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/
.lm-CommandPalette {
display: flex;
flex-direction: column;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.lm-CommandPalette-search {
flex: 0 0 auto;
}
.lm-CommandPalette-content {
flex: 1 1 auto;
margin: 0;
padding: 0;
min-height: 0;
overflow: auto;
list-style-type: none;
}
.lm-CommandPalette-header {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.lm-CommandPalette-item {
display: flex;
flex-direction: row;
}
.lm-CommandPalette-itemIcon {
flex: 0 0 auto;
}
.lm-CommandPalette-itemContent {
flex: 1 1 auto;
overflow: hidden;
}
.lm-CommandPalette-itemShortcut {
flex: 0 0 auto;
}
.lm-CommandPalette-itemLabel {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.lm-close-icon {
border: 1px solid transparent;
background-color: transparent;
position: absolute;
z-index: 1;
right: 3%;
top: 0;
bottom: 0;
margin: auto;
padding: 7px 0;
display: none;
vertical-align: middle;
outline: 0;
cursor: pointer;
}
.lm-close-icon:after {
content: 'X';
display: block;
width: 15px;
height: 15px;
text-align: center;
color: #000;
font-weight: normal;
font-size: 12px;
cursor: pointer;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/
.lm-DockPanel {
z-index: 0;
}
.lm-DockPanel-widget {
z-index: 0;
}
.lm-DockPanel-tabBar {
z-index: 1;
}
.lm-DockPanel-handle {
z-index: 2;
}
.lm-DockPanel-handle.lm-mod-hidden {
display: none !important;
}
.lm-DockPanel-handle:after {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
content: '';
}
.lm-DockPanel-handle[data-orientation='horizontal'] {
cursor: ew-resize;
}
.lm-DockPanel-handle[data-orientation='vertical'] {
cursor: ns-resize;
}
.lm-DockPanel-handle[data-orientation='horizontal']:after {
left: 50%;
min-width: 8px;
transform: translateX(-50%);
}
.lm-DockPanel-handle[data-orientation='vertical']:after {
top: 50%;
min-height: 8px;
transform: translateY(-50%);
}
.lm-DockPanel-overlay {
z-index: 3;
box-sizing: border-box;
pointer-events: none;
}
.lm-DockPanel-overlay.lm-mod-hidden {
display: none !important;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/
.lm-Menu {
z-index: 10000;
position: absolute;
white-space: nowrap;
overflow-x: hidden;
overflow-y: auto;
outline: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.lm-Menu-content {
margin: 0;
padding: 0;
display: table;
list-style-type: none;
}
.lm-Menu-item {
display: table-row;
}
.lm-Menu-item.lm-mod-hidden,
.lm-Menu-item.lm-mod-collapsed {
display: none !important;
}
.lm-Menu-itemIcon,
.lm-Menu-itemSubmenuIcon {
display: table-cell;
text-align: center;
}
.lm-Menu-itemLabel {
display: table-cell;
text-align: left;
}
.lm-Menu-itemShortcut {
display: table-cell;
text-align: right;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/
.lm-MenuBar {
outline: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.lm-MenuBar-content {
margin: 0;
padding: 0;
display: flex;
flex-direction: row;
list-style-type: none;
}
.lm-MenuBar-item {
box-sizing: border-box;
}
.lm-MenuBar-itemIcon,
.lm-MenuBar-itemLabel {
display: inline-block;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/
.lm-ScrollBar {
display: flex;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.lm-ScrollBar[data-orientation='horizontal'] {
flex-direction: row;
}
.lm-ScrollBar[data-orientation='vertical'] {
flex-direction: column;
}
.lm-ScrollBar-button {
box-sizing: border-box;
flex: 0 0 auto;
}
.lm-ScrollBar-track {
box-sizing: border-box;
position: relative;
overflow: hidden;
flex: 1 1 auto;
}
.lm-ScrollBar-thumb {
box-sizing: border-box;
position: absolute;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/
.lm-SplitPanel-child {
z-index: 0;
}
.lm-SplitPanel-handle {
z-index: 1;
}
.lm-SplitPanel-handle.lm-mod-hidden {
display: none !important;
}
.lm-SplitPanel-handle:after {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
content: '';
}
.lm-SplitPanel[data-orientation='horizontal'] > .lm-SplitPanel-handle {
cursor: ew-resize;
}
.lm-SplitPanel[data-orientation='vertical'] > .lm-SplitPanel-handle {
cursor: ns-resize;
}
.lm-SplitPanel[data-orientation='horizontal'] > .lm-SplitPanel-handle:after {
left: 50%;
min-width: 8px;
transform: translateX(-50%);
}
.lm-SplitPanel[data-orientation='vertical'] > .lm-SplitPanel-handle:after {
top: 50%;
min-height: 8px;
transform: translateY(-50%);
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/
.lm-TabBar {
display: flex;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.lm-TabBar[data-orientation='horizontal'] {
flex-direction: row;
align-items: flex-end;
}
.lm-TabBar[data-orientation='vertical'] {
flex-direction: column;
align-items: flex-end;
}
.lm-TabBar-content {
margin: 0;
padding: 0;
display: flex;
flex: 1 1 auto;
list-style-type: none;
}
.lm-TabBar[data-orientation='horizontal'] > .lm-TabBar-content {
flex-direction: row;
}
.lm-TabBar[data-orientation='vertical'] > .lm-TabBar-content {
flex-direction: column;
}
.lm-TabBar-tab {
display: flex;
flex-direction: row;
box-sizing: border-box;
overflow: hidden;
touch-action: none; /* Disable native Drag/Drop */
}
.lm-TabBar-tabIcon,
.lm-TabBar-tabCloseIcon {
flex: 0 0 auto;
}
.lm-TabBar-tabLabel {
flex: 1 1 auto;
overflow: hidden;
white-space: nowrap;
}
.lm-TabBar-tabInput {
user-select: all;
width: 100%;
box-sizing: border-box;
}
.lm-TabBar-tab.lm-mod-hidden {
display: none !important;
}
.lm-TabBar-addButton.lm-mod-hidden {
display: none !important;
}
.lm-TabBar.lm-mod-dragging .lm-TabBar-tab {
position: relative;
}
.lm-TabBar.lm-mod-dragging[data-orientation='horizontal'] .lm-TabBar-tab {
left: 0;
transition: left 150ms ease;
}
.lm-TabBar.lm-mod-dragging[data-orientation='vertical'] .lm-TabBar-tab {
top: 0;
transition: top 150ms ease;
}
.lm-TabBar.lm-mod-dragging .lm-TabBar-tab.lm-mod-dragging {
transition: none;
}
.lm-TabBar-tabLabel .lm-TabBar-tabInput {
user-select: all;
width: 100%;
box-sizing: border-box;
background: inherit;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/
.lm-TabPanel-tabBar {
z-index: 1;
}
.lm-TabPanel-stackedPanel {
z-index: 0;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-Collapse {
display: flex;
flex-direction: column;
align-items: stretch;
}
.jp-Collapse-header {
padding: 1px 12px;
background-color: var(--jp-layout-color1);
border-bottom: solid var(--jp-border-width) var(--jp-border-color2);
color: var(--jp-ui-font-color1);
cursor: pointer;
display: flex;
align-items: center;
font-size: var(--jp-ui-font-size0);
font-weight: 600;
text-transform: uppercase;
user-select: none;
}
.jp-Collapser-icon {
height: 16px;
}
.jp-Collapse-header-collapsed .jp-Collapser-icon {
transform: rotate(-90deg);
margin: auto 0;
}
.jp-Collapser-title {
line-height: 25px;
}
.jp-Collapse-contents {
padding: 0 12px;
background-color: var(--jp-layout-color1);
color: var(--jp-ui-font-color1);
overflow: auto;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/* This file was auto-generated by ensureUiComponents() in @jupyterlab/buildutils */
/**
* (DEPRECATED) Support for consuming icons as CSS background images
*/
/* Icons urls */
:root {
--jp-icon-add-above: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEzN18xOTQ5MikiPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGQ9Ik00Ljc1IDQuOTMwNjZINi42MjVWNi44MDU2NkM2LjYyNSA3LjAxMTkxIDYuNzkzNzUgNy4xODA2NiA3IDcuMTgwNjZDNy4yMDYyNSA3LjE4MDY2IDcuMzc1IDcuMDExOTEgNy4zNzUgNi44MDU2NlY0LjkzMDY2SDkuMjVDOS40NTYyNSA0LjkzMDY2IDkuNjI1IDQuNzYxOTEgOS42MjUgNC41NTU2NkM5LjYyNSA0LjM0OTQxIDkuNDU2MjUgNC4xODA2NiA5LjI1IDQuMTgwNjZINy4zNzVWMi4zMDU2NkM3LjM3NSAyLjA5OTQxIDcuMjA2MjUgMS45MzA2NiA3IDEuOTMwNjZDNi43OTM3NSAxLjkzMDY2IDYuNjI1IDIuMDk5NDEgNi42MjUgMi4zMDU2NlY0LjE4MDY2SDQuNzVDNC41NDM3NSA0LjE4MDY2IDQuMzc1IDQuMzQ5NDEgNC4zNzUgNC41NTU2NkM0LjM3NSA0Ljc2MTkxIDQuNTQzNzUgNC45MzA2NiA0Ljc1IDQuOTMwNjZaIiBmaWxsPSIjNjE2MTYxIiBzdHJva2U9IiM2MTYxNjEiIHN0cm9rZS13aWR0aD0iMC43Ii8+CjwvZz4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTExLjUgOS41VjExLjVMMi41IDExLjVWOS41TDExLjUgOS41Wk0xMiA4QzEyLjU1MjMgOCAxMyA4LjQ0NzcyIDEzIDlWMTJDMTMgMTIuNTUyMyAxMi41NTIzIDEzIDEyIDEzTDIgMTNDMS40NDc3MiAxMyAxIDEyLjU1MjMgMSAxMlY5QzEgOC40NDc3MiAxLjQ0NzcxIDggMiA4TDEyIDhaIiBmaWxsPSIjNjE2MTYxIi8+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzEzN18xOTQ5MiI+CjxyZWN0IGNsYXNzPSJqcC1pY29uMyIgd2lkdGg9IjYiIGhlaWdodD0iNiIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDEwIDEuNTU1NjYpIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==);
--jp-icon-add-below: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEzN18xOTQ5OCkiPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGQ9Ik05LjI1IDEwLjA2OTNMNy4zNzUgMTAuMDY5M0w3LjM3NSA4LjE5NDM0QzcuMzc1IDcuOTg4MDkgNy4yMDYyNSA3LjgxOTM0IDcgNy44MTkzNEM2Ljc5Mzc1IDcuODE5MzQgNi42MjUgNy45ODgwOSA2LjYyNSA4LjE5NDM0TDYuNjI1IDEwLjA2OTNMNC43NSAxMC4wNjkzQzQuNTQzNzUgMTAuMDY5MyA0LjM3NSAxMC4yMzgxIDQuMzc1IDEwLjQ0NDNDNC4zNzUgMTAuNjUwNiA0LjU0Mzc1IDEwLjgxOTMgNC43NSAxMC44MTkzTDYuNjI1IDEwLjgxOTNMNi42MjUgMTIuNjk0M0M2LjYyNSAxMi45MDA2IDYuNzkzNzUgMTMuMDY5MyA3IDEzLjA2OTNDNy4yMDYyNSAxMy4wNjkzIDcuMzc1IDEyLjkwMDYgNy4zNzUgMTIuNjk0M0w3LjM3NSAxMC44MTkzTDkuMjUgMTAuODE5M0M5LjQ1NjI1IDEwLjgxOTMgOS42MjUgMTAuNjUwNiA5LjYyNSAxMC40NDQzQzkuNjI1IDEwLjIzODEgOS40NTYyNSAxMC4wNjkzIDkuMjUgMTAuMDY5M1oiIGZpbGw9IiM2MTYxNjEiIHN0cm9rZT0iIzYxNjE2MSIgc3Ryb2tlLXdpZHRoPSIwLjciLz4KPC9nPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMi41IDUuNUwyLjUgMy41TDExLjUgMy41TDExLjUgNS41TDIuNSA1LjVaTTIgN0MxLjQ0NzcyIDcgMSA2LjU1MjI4IDEgNkwxIDNDMSAyLjQ0NzcyIDEuNDQ3NzIgMiAyIDJMMTIgMkMxMi41NTIzIDIgMTMgMi40NDc3MiAxMyAzTDEzIDZDMTMgNi41NTIyOSAxMi41NTIzIDcgMTIgN0wyIDdaIiBmaWxsPSIjNjE2MTYxIi8+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzEzN18xOTQ5OCI+CjxyZWN0IGNsYXNzPSJqcC1pY29uMyIgd2lkdGg9IjYiIGhlaWdodD0iNiIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0ibWF0cml4KDEgMS43NDg0NmUtMDcgMS43NDg0NmUtMDcgLTEgNCAxMy40NDQzKSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=);
--jp-icon-add: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE5IDEzaC02djZoLTJ2LTZINXYtMmg2VjVoMnY2aDZ2MnoiLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-bell: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE2IDE2IiB2ZXJzaW9uPSIxLjEiPgogICA8cGF0aCBjbGFzcz0ianAtaWNvbjIganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMzMzMzMzIgogICAgICBkPSJtOCAwLjI5Yy0xLjQgMC0yLjcgMC43My0zLjYgMS44LTEuMiAxLjUtMS40IDMuNC0xLjUgNS4yLTAuMTggMi4yLTAuNDQgNC0yLjMgNS4zbDAuMjggMS4zaDVjMC4wMjYgMC42NiAwLjMyIDEuMSAwLjcxIDEuNSAwLjg0IDAuNjEgMiAwLjYxIDIuOCAwIDAuNTItMC40IDAuNi0xIDAuNzEtMS41aDVsMC4yOC0xLjNjLTEuOS0wLjk3LTIuMi0zLjMtMi4zLTUuMy0wLjEzLTEuOC0wLjI2LTMuNy0xLjUtNS4yLTAuODUtMS0yLjItMS44LTMuNi0xLjh6bTAgMS40YzAuODggMCAxLjkgMC41NSAyLjUgMS4zIDAuODggMS4xIDEuMSAyLjcgMS4yIDQuNCAwLjEzIDEuNyAwLjIzIDMuNiAxLjMgNS4yaC0xMGMxLjEtMS42IDEuMi0zLjQgMS4zLTUuMiAwLjEzLTEuNyAwLjMtMy4zIDEuMi00LjQgMC41OS0wLjcyIDEuNi0xLjMgMi41LTEuM3ptLTAuNzQgMTJoMS41Yy0wLjAwMTUgMC4yOCAwLjAxNSAwLjc5LTAuNzQgMC43OS0wLjczIDAuMDAxNi0wLjcyLTAuNTMtMC43NC0wLjc5eiIgLz4KPC9zdmc+Cg==);
--jp-icon-bug-dot: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiPgogICAgICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTcuMTkgOEgyMFYxMEgxNy45MUMxNy45NiAxMC4zMyAxOCAxMC42NiAxOCAxMVYxMkgyMFYxNEgxOC41SDE4VjE0LjAyNzVDMTUuNzUgMTQuMjc2MiAxNCAxNi4xODM3IDE0IDE4LjVDMTQgMTkuMjA4IDE0LjE2MzUgMTkuODc3OSAxNC40NTQ5IDIwLjQ3MzlDMTMuNzA2MyAyMC44MTE3IDEyLjg3NTcgMjEgMTIgMjFDOS43OCAyMSA3Ljg1IDE5Ljc5IDYuODEgMThINFYxNkg2LjA5QzYuMDQgMTUuNjcgNiAxNS4zNCA2IDE1VjE0SDRWMTJINlYxMUM2IDEwLjY2IDYuMDQgMTAuMzMgNi4wOSAxMEg0VjhINi44MUM3LjI2IDcuMjIgNy44OCA2LjU1IDguNjIgNi4wNEw3IDQuNDFMOC40MSAzTDEwLjU5IDUuMTdDMTEuMDQgNS4wNiAxMS41MSA1IDEyIDVDMTIuNDkgNSAxMi45NiA1LjA2IDEzLjQyIDUuMTdMMTUuNTkgM0wxNyA0LjQxTDE1LjM3IDYuMDRDMTYuMTIgNi41NSAxNi43NCA3LjIyIDE3LjE5IDhaTTEwIDE2SDE0VjE0SDEwVjE2Wk0xMCAxMkgxNFYxMEgxMFYxMloiIGZpbGw9IiM2MTYxNjEiLz4KICAgICAgICA8cGF0aCBkPSJNMjIgMTguNUMyMiAyMC40MzMgMjAuNDMzIDIyIDE4LjUgMjJDMTYuNTY3IDIyIDE1IDIwLjQzMyAxNSAxOC41QzE1IDE2LjU2NyAxNi41NjcgMTUgMTguNSAxNUMyMC40MzMgMTUgMjIgMTYuNTY3IDIyIDE4LjVaIiBmaWxsPSIjNjE2MTYxIi8+CiAgICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-bug: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0yMCA4aC0yLjgxYy0uNDUtLjc4LTEuMDctMS40NS0xLjgyLTEuOTZMMTcgNC40MSAxNS41OSAzbC0yLjE3IDIuMTdDMTIuOTYgNS4wNiAxMi40OSA1IDEyIDVjLS40OSAwLS45Ni4wNi0xLjQxLjE3TDguNDEgMyA3IDQuNDFsMS42MiAxLjYzQzcuODggNi41NSA3LjI2IDcuMjIgNi44MSA4SDR2MmgyLjA5Yy0uMDUuMzMtLjA5LjY2LS4wOSAxdjFINHYyaDJ2MWMwIC4zNC4wNC42Ny4wOSAxSDR2MmgyLjgxYzEuMDQgMS43OSAyLjk3IDMgNS4xOSAzczQuMTUtMS4yMSA1LjE5LTNIMjB2LTJoLTIuMDljLjA1LS4zMy4wOS0uNjYuMDktMXYtMWgydi0yaC0ydi0xYzAtLjM0LS4wNC0uNjctLjA5LTFIMjBWOHptLTYgOGgtNHYtMmg0djJ6bTAtNGgtNHYtMmg0djJ6Ii8+CiAgPC9nPgo8L3N2Zz4K);
--jp-icon-build: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE0LjkgMTcuNDVDMTYuMjUgMTcuNDUgMTcuMzUgMTYuMzUgMTcuMzUgMTVDMTcuMzUgMTMuNjUgMTYuMjUgMTIuNTUgMTQuOSAxMi41NUMxMy41NCAxMi41NSAxMi40NSAxMy42NSAxMi40NSAxNUMxMi40NSAxNi4zNSAxMy41NCAxNy40NSAxNC45IDE3LjQ1Wk0yMC4xIDE1LjY4TDIxLjU4IDE2Ljg0QzIxLjcxIDE2Ljk1IDIxLjc1IDE3LjEzIDIxLjY2IDE3LjI5TDIwLjI2IDE5LjcxQzIwLjE3IDE5Ljg2IDIwIDE5LjkyIDE5LjgzIDE5Ljg2TDE4LjA5IDE5LjE2QzE3LjczIDE5LjQ0IDE3LjMzIDE5LjY3IDE2LjkxIDE5Ljg1TDE2LjY0IDIxLjdDMTYuNjIgMjEuODcgMTYuNDcgMjIgMTYuMyAyMkgxMy41QzEzLjMyIDIyIDEzLjE4IDIxLjg3IDEzLjE1IDIxLjdMMTIuODkgMTkuODVDMTIuNDYgMTkuNjcgMTIuMDcgMTkuNDQgMTEuNzEgMTkuMTZMOS45NjAwMiAxOS44NkM5LjgxMDAyIDE5LjkyIDkuNjIwMDIgMTkuODYgOS41NDAwMiAxOS43MUw4LjE0MDAyIDE3LjI5QzguMDUwMDIgMTcuMTMgOC4wOTAwMiAxNi45NSA4LjIyMDAyIDE2Ljg0TDkuNzAwMDIgMTUuNjhMOS42NTAwMSAxNUw5LjcwMDAyIDE0LjMxTDguMjIwMDIgMTMuMTZDOC4wOTAwMiAxMy4wNSA4LjA1MDAyIDEyLjg2IDguMTQwMDIgMTIuNzFMOS41NDAwMiAxMC4yOUM5LjYyMDAyIDEwLjEzIDkuODEwMDIgMTAuMDcgOS45NjAwMiAxMC4xM0wxMS43MSAxMC44NEMxMi4wNyAxMC41NiAxMi40NiAxMC4zMiAxMi44OSAxMC4xNUwxMy4xNSA4LjI4OTk4QzEzLjE4IDguMTI5OTggMTMuMzIgNy45OTk5OCAxMy41IDcuOTk5OThIMTYuM0MxNi40NyA3Ljk5OTk4IDE2LjYyIDguMTI5OTggMTYuNjQgOC4yODk5OEwxNi45MSAxMC4xNUMxNy4zMyAxMC4zMiAxNy43MyAxMC41NiAxOC4wOSAxMC44NEwxOS44MyAxMC4xM0MyMCAxMC4wNyAyMC4xNyAxMC4xMyAyMC4yNiAxMC4yOUwyMS42NiAxMi43MUMyMS43NSAxMi44NiAyMS43MSAxMy4wNSAyMS41OCAxMy4xNkwyMC4xIDE0LjMxTDIwLjE1IDE1TDIwLjEgMTUuNjhaIi8+CiAgICA8cGF0aCBkPSJNNy4zMjk2NiA3LjQ0NDU0QzguMDgzMSA3LjAwOTU0IDguMzM5MzIgNi4wNTMzMiA3LjkwNDMyIDUuMjk5ODhDNy40NjkzMiA0LjU0NjQzIDYuNTA4MSA0LjI4MTU2IDUuNzU0NjYgNC43MTY1NkM1LjM5MTc2IDQuOTI2MDggNS4xMjY5NSA1LjI3MTE4IDUuMDE4NDkgNS42NzU5NEM0LjkxMDA0IDYuMDgwNzEgNC45NjY4MiA2LjUxMTk4IDUuMTc2MzQgNi44NzQ4OEM1LjYxMTM0IDcuNjI4MzIgNi41NzYyMiA3Ljg3OTU0IDcuMzI5NjYgNy40NDQ1NFpNOS42NTcxOCA0Ljc5NTkzTDEwLjg2NzIgNC45NTE3OUMxMC45NjI4IDQuOTc3NDEgMTEuMDQwMiA1LjA3MTMzIDExLjAzODIgNS4xODc5M0wxMS4wMzg4IDYuOTg4OTNDMTEuMDQ1NSA3LjEwMDU0IDEwLjk2MTYgNy4xOTUxOCAxMC44NTUgNy4yMTA1NEw5LjY2MDAxIDcuMzgwODNMOS4yMzkxNSA4LjEzMTg4TDkuNjY5NjEgOS4yNTc0NUM5LjcwNzI5IDkuMzYyNzEgOS42NjkzNCA5LjQ3Njk5IDkuNTc0MDggOS41MzE5OUw4LjAxNTIzIDEwLjQzMkM3LjkxMTMxIDEwLjQ5MiA3Ljc5MzM3IDEwLjQ2NzcgNy43MjEwNSAxMC4zODI0TDYuOTg3NDggOS40MzE4OEw2LjEwOTMxIDkuNDMwODNMNS4zNDcwNCAxMC4zOTA1QzUuMjg5MDkgMTAuNDcwMiA1LjE3MzgzIDEwLjQ5MDUgNS4wNzE4NyAxMC40MzM5TDMuNTEyNDUgOS41MzI5M0MzLjQxMDQ5IDkuNDc2MzMgMy4zNzY0NyA5LjM1NzQxIDMuNDEwNzUgOS4yNTY3OUwzLjg2MzQ3IDguMTQwOTNMMy42MTc0OSA3Ljc3NDg4TDMuNDIzNDcgNy4zNzg4M0wyLjIzMDc1IDcuMjEyOTdDMi4xMjY0NyA3LjE5MjM1IDIuMDQwNDkgNy4xMDM0MiAyLjA0MjQ1IDYuOTg2ODJMMi4wNDE4NyA1LjE4NTgyQzIuMDQzODMgNS4wNjkyMiAyLjExOTA5IDQuOTc5NTggMi4yMTcwNCA0Ljk2OTIyTDMuNDIwNjUgNC43OTM5M0wzLjg2NzQ5IDQuMDI3ODhMMy40MTEwNSAyLjkxNzMxQzMuMzczMzcgMi44MTIwNCAzLjQxMTMxIDIuNjk3NzYgMy41MTUyMyAyLjYzNzc2TDUuMDc0MDggMS43Mzc3NkM1LjE2OTM0IDEuNjgyNzYgNS4yODcyOSAxLjcwNzA0IDUuMzU5NjEgMS43OTIzMUw2LjExOTE1IDIuNzI3ODhMNi45ODAwMSAyLjczODkzTDcuNzI0OTYgMS43ODkyMkM3Ljc5MTU2IDEuNzA0NTggNy45MTU0OCAxLjY3OTIyIDguMDA4NzkgMS43NDA4Mkw5LjU2ODIxIDIuNjQxODJDOS42NzAxNyAyLjY5ODQyIDkuNzEyODUgMi44MTIzNCA5LjY4NzIzIDIuOTA3OTdMOS4yMTcxOCA0LjAzMzgzTDkuNDYzMTYgNC4zOTk4OEw5LjY1NzE4IDQuNzk1OTNaIi8+CiAgPC9nPgo8L3N2Zz4K);
--jp-icon-caret-down-empty-thin: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwb2x5Z29uIGNsYXNzPSJzdDEiIHBvaW50cz0iOS45LDEzLjYgMy42LDcuNCA0LjQsNi42IDkuOSwxMi4yIDE1LjQsNi43IDE2LjEsNy40ICIvPgoJPC9nPgo8L3N2Zz4K);
--jp-icon-caret-down-empty: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik01LjIsNS45TDksOS43bDMuOC0zLjhsMS4yLDEuMmwtNC45LDVsLTQuOS01TDUuMiw1Ljl6Ii8+CiAgPC9nPgo8L3N2Zz4K);
--jp-icon-caret-down: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik01LjIsNy41TDksMTEuMmwzLjgtMy44SDUuMnoiLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-caret-left: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwYXRoIGQ9Ik0xMC44LDEyLjhMNy4xLDlsMy44LTMuOGwwLDcuNkgxMC44eiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-caret-right: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik03LjIsNS4yTDEwLjksOWwtMy44LDMuOFY1LjJINy4yeiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-caret-up-empty-thin: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwb2x5Z29uIGNsYXNzPSJzdDEiIHBvaW50cz0iMTUuNCwxMy4zIDkuOSw3LjcgNC40LDEzLjIgMy42LDEyLjUgOS45LDYuMyAxNi4xLDEyLjYgIi8+Cgk8L2c+Cjwvc3ZnPgo=);
--jp-icon-caret-up: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwYXRoIGQ9Ik01LjIsMTAuNUw5LDYuOGwzLjgsMy44SDUuMnoiLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-case-sensitive: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0MTQxNDEiPgogICAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiAgPC9nPgogIDxnIGNsYXNzPSJqcC1pY29uLWFjY2VudDIiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTcuNiw4aDAuOWwzLjUsOGgtMS4xTDEwLDE0SDZsLTAuOSwySDRMNy42LDh6IE04LDkuMUw2LjQsMTNoMy4yTDgsOS4xeiIvPgogICAgPHBhdGggZD0iTTE2LjYsOS44Yy0wLjIsMC4xLTAuNCwwLjEtMC43LDAuMWMtMC4yLDAtMC40LTAuMS0wLjYtMC4yYy0wLjEtMC4xLTAuMi0wLjQtMC4yLTAuNyBjLTAuMywwLjMtMC42LDAuNS0wLjksMC43Yy0wLjMsMC4xLTAuNywwLjItMS4xLDAuMmMtMC4zLDAtMC41LDAtMC43LTAuMWMtMC4yLTAuMS0wLjQtMC4yLTAuNi0wLjNjLTAuMi0wLjEtMC4zLTAuMy0wLjQtMC41IGMtMC4xLTAuMi0wLjEtMC40LTAuMS0wLjdjMC0wLjMsMC4xLTAuNiwwLjItMC44YzAuMS0wLjIsMC4zLTAuNCwwLjQtMC41QzEyLDcsMTIuMiw2LjksMTIuNSw2LjhjMC4yLTAuMSwwLjUtMC4xLDAuNy0wLjIgYzAuMy0wLjEsMC41LTAuMSwwLjctMC4xYzAuMiwwLDAuNC0wLjEsMC42LTAuMWMwLjIsMCwwLjMtMC4xLDAuNC0wLjJjMC4xLTAuMSwwLjItMC4yLDAuMi0wLjRjMC0xLTEuMS0xLTEuMy0xIGMtMC40LDAtMS40LDAtMS40LDEuMmgtMC45YzAtMC40LDAuMS0wLjcsMC4yLTFjMC4xLTAuMiwwLjMtMC40LDAuNS0wLjZjMC4yLTAuMiwwLjUtMC4zLDAuOC0wLjNDMTMuMyw0LDEzLjYsNCwxMy45LDQgYzAuMywwLDAuNSwwLDAuOCwwLjFjMC4zLDAsMC41LDAuMSwwLjcsMC4yYzAuMiwwLjEsMC40LDAuMywwLjUsMC41QzE2LDUsMTYsNS4yLDE2LDUuNnYyLjljMCwwLjIsMCwwLjQsMCwwLjUgYzAsMC4xLDAuMSwwLjIsMC4zLDAuMmMwLjEsMCwwLjIsMCwwLjMsMFY5Ljh6IE0xNS4yLDYuOWMtMS4yLDAuNi0zLjEsMC4yLTMuMSwxLjRjMCwxLjQsMy4xLDEsMy4xLTAuNVY2Ljl6Ii8+CiAgPC9nPgo8L3N2Zz4K);
--jp-icon-check: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-circle-empty: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-circle: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPGNpcmNsZSBjeD0iOSIgY3k9IjkiIHI9IjgiLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-clear: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8bWFzayBpZD0iZG9udXRIb2xlIj4KICAgIDxyZWN0IHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0id2hpdGUiIC8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4IiBmaWxsPSJibGFjayIvPgogIDwvbWFzaz4KCiAgPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxyZWN0IGhlaWdodD0iMTgiIHdpZHRoPSIyIiB4PSIxMSIgeT0iMyIgdHJhbnNmb3JtPSJyb3RhdGUoMzE1LCAxMiwgMTIpIi8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgbWFzaz0idXJsKCNkb251dEhvbGUpIi8+CiAgPC9nPgo8L3N2Zz4K);
--jp-icon-close: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbi1ub25lIGpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIGpwLWljb24zLWhvdmVyIiBmaWxsPSJub25lIj4KICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjExIi8+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIGpwLWljb24tYWNjZW50Mi1ob3ZlciIgZmlsbD0iIzYxNjE2MSI+CiAgICA8cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIvPgogIDwvZz4KCiAgPGcgY2xhc3M9ImpwLWljb24tbm9uZSBqcC1pY29uLWJ1c3kiIGZpbGw9Im5vbmUiPgogICAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iNyIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-code-check: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiI+CiAgICA8cGF0aCBkPSJNNi41OSwzLjQxTDIsOEw2LjU5LDEyLjZMOCwxMS4xOEw0LjgyLDhMOCw0LjgyTDYuNTksMy40MU0xMi40MSwzLjQxTDExLDQuODJMMTQuMTgsOEwxMSwxMS4xOEwxMi40MSwxMi42TDE3LDhMMTIuNDEsMy40MU0yMS41OSwxMS41OUwxMy41LDE5LjY4TDkuODMsMTZMOC40MiwxNy40MUwxMy41LDIyLjVMMjMsMTNMMjEuNTksMTEuNTlaIiAvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-code: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAyOCAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTExLjQgMTguNkw2LjggMTRMMTEuNCA5LjRMMTAgOEw0IDE0TDEwIDIwTDExLjQgMTguNlpNMTYuNiAxOC42TDIxLjIgMTRMMTYuNiA5LjRMMTggOEwyNCAxNEwxOCAyMEwxNi42IDE4LjZWMTguNloiLz4KCTwvZz4KPC9zdmc+Cg==);
--jp-icon-collapse-all: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTggMmMxIDAgMTEgMCAxMiAwczIgMSAyIDJjMCAxIDAgMTEgMCAxMnMwIDItMiAyQzIwIDE0IDIwIDQgMjAgNFMxMCA0IDYgNGMwLTIgMS0yIDItMnoiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTE4IDhjMC0xLTEtMi0yLTJTNSA2IDQgNnMtMiAxLTIgMmMwIDEgMCAxMSAwIDEyczEgMiAyIDJjMSAwIDExIDAgMTIgMHMyLTEgMi0yYzAtMSAwLTExIDAtMTJ6bS0yIDB2MTJINFY4eiIgLz4KICAgICAgICA8cGF0aCBkPSJNNiAxM3YyaDh2LTJ6IiAvPgogICAgPC9nPgo8L3N2Zz4K);
--jp-icon-console: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwMCAyMDAiPgogIDxnIGNsYXNzPSJqcC1jb25zb2xlLWljb24tYmFja2dyb3VuZC1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiMwMjg4RDEiPgogICAgPHBhdGggZD0iTTIwIDE5LjhoMTYwdjE1OS45SDIweiIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtY29uc29sZS1pY29uLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIiBmaWxsPSIjZmZmIj4KICAgIDxwYXRoIGQ9Ik0xMDUgMTI3LjNoNDB2MTIuOGgtNDB6TTUxLjEgNzdMNzQgOTkuOWwtMjMuMyAyMy4zIDEwLjUgMTAuNSAyMy4zLTIzLjNMOTUgOTkuOSA4NC41IDg5LjQgNjEuNiA2Ni41eiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-copy: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTExLjksMUgzLjJDMi40LDEsMS43LDEuNywxLjcsMi41djEwLjJoMS41VjIuNWg4LjdWMXogTTE0LjEsMy45aC04Yy0wLjgsMC0xLjUsMC43LTEuNSwxLjV2MTAuMmMwLDAuOCwwLjcsMS41LDEuNSwxLjVoOCBjMC44LDAsMS41LTAuNywxLjUtMS41VjUuNEMxNS41LDQuNiwxNC45LDMuOSwxNC4xLDMuOXogTTE0LjEsMTUuNWgtOFY1LjRoOFYxNS41eiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-copyright: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+CiAgPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0xMS44OCw5LjE0YzEuMjgsMC4wNiwxLjYxLDEuMTUsMS42MywxLjY2aDEuNzljLTAuMDgtMS45OC0xLjQ5LTMuMTktMy40NS0zLjE5QzkuNjQsNy42MSw4LDksOCwxMi4xNCBjMCwxLjk0LDAuOTMsNC4yNCwzLjg0LDQuMjRjMi4yMiwwLDMuNDEtMS42NSwzLjQ0LTIuOTVoLTEuNzljLTAuMDMsMC41OS0wLjQ1LDEuMzgtMS42MywxLjQ0QzEwLjU1LDE0LjgzLDEwLDEzLjgxLDEwLDEyLjE0IEMxMCw5LjI1LDExLjI4LDkuMTYsMTEuODgsOS4xNHogTTEyLDJDNi40OCwyLDIsNi40OCwyLDEyczQuNDgsMTAsMTAsMTBzMTAtNC40OCwxMC0xMFMxNy41MiwyLDEyLDJ6IE0xMiwyMGMtNC40MSwwLTgtMy41OS04LTggczMuNTktOCw4LThzOCwzLjU5LDgsOFMxNi40MSwyMCwxMiwyMHoiLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-cut: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTkuNjQgNy42NGMuMjMtLjUuMzYtMS4wNS4zNi0xLjY0IDAtMi4yMS0xLjc5LTQtNC00UzIgMy43OSAyIDZzMS43OSA0IDQgNGMuNTkgMCAxLjE0LS4xMyAxLjY0LS4zNkwxMCAxMmwtMi4zNiAyLjM2QzcuMTQgMTQuMTMgNi41OSAxNCA2IDE0Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTRjMC0uNTktLjEzLTEuMTQtLjM2LTEuNjRMMTIgMTRsNyA3aDN2LTFMOS42NCA3LjY0ek02IDhjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTAgMTJjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTYtNy41Yy0uMjggMC0uNS0uMjItLjUtLjVzLjIyLS41LjUtLjUuNS4yMi41LjUtLjIyLjUtLjUuNXpNMTkgM2wtNiA2IDIgMiA3LTdWM3oiLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-delete: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIiAvPgogICAgPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjI2MjYyIiBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyek0xOSA0aC0zLjVsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz4KPC9zdmc+Cg==);
--jp-icon-download: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-duplicate: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIuNzk5OTggMC44NzVIOC44OTU4MkM5LjIwMDYxIDAuODc1IDkuNDQ5OTggMS4xMzkxNCA5LjQ0OTk4IDEuNDYxOThDOS40NDk5OCAxLjc4NDgyIDkuMjAwNjEgMi4wNDg5NiA4Ljg5NTgyIDIuMDQ4OTZIMy4zNTQxNUMzLjA0OTM2IDIuMDQ4OTYgMi43OTk5OCAyLjMxMzEgMi43OTk5OCAyLjYzNTk0VjkuNjc5NjlDMi43OTk5OCAxMC4wMDI1IDIuNTUwNjEgMTAuMjY2NyAyLjI0NTgyIDEwLjI2NjdDMS45NDEwMyAxMC4yNjY3IDEuNjkxNjUgMTAuMDAyNSAxLjY5MTY1IDkuNjc5NjlWMi4wNDg5NkMxLjY5MTY1IDEuNDAzMjggMi4xOTA0IDAuODc1IDIuNzk5OTggMC44NzVaTTUuMzY2NjUgMTEuOVY0LjU1SDExLjA4MzNWMTEuOUg1LjM2NjY1Wk00LjE0MTY1IDQuMTQxNjdDNC4xNDE2NSAzLjY5MDYzIDQuNTA3MjggMy4zMjUgNC45NTgzMiAzLjMyNUgxMS40OTE3QzExLjk0MjcgMy4zMjUgMTIuMzA4MyAzLjY5MDYzIDEyLjMwODMgNC4xNDE2N1YxMi4zMDgzQzEyLjMwODMgMTIuNzU5NCAxMS45NDI3IDEzLjEyNSAxMS40OTE3IDEzLjEyNUg0Ljk1ODMyQzQuNTA3MjggMTMuMTI1IDQuMTQxNjUgMTIuNzU5NCA0LjE0MTY1IDEyLjMwODNWNC4xNDE2N1oiIGZpbGw9IiM2MTYxNjEiLz4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNOS40MzU3NCA4LjI2NTA3SDguMzY0MzFWOS4zMzY1QzguMzY0MzEgOS40NTQzNSA4LjI2Nzg4IDkuNTUwNzggOC4xNTAwMiA5LjU1MDc4QzguMDMyMTcgOS41NTA3OCA3LjkzNTc0IDkuNDU0MzUgNy45MzU3NCA5LjMzNjVWOC4yNjUwN0g2Ljg2NDMxQzYuNzQ2NDUgOC4yNjUwNyA2LjY1MDAyIDguMTY4NjQgNi42NTAwMiA4LjA1MDc4QzYuNjUwMDIgNy45MzI5MiA2Ljc0NjQ1IDcuODM2NSA2Ljg2NDMxIDcuODM2NUg3LjkzNTc0VjYuNzY1MDdDNy45MzU3NCA2LjY0NzIxIDguMDMyMTcgNi41NTA3OCA4LjE1MDAyIDYuNTUwNzhDOC4yNjc4OCA2LjU1MDc4IDguMzY0MzEgNi42NDcyMSA4LjM2NDMxIDYuNzY1MDdWNy44MzY1SDkuNDM1NzRDOS41NTM2IDcuODM2NSA5LjY1MDAyIDcuOTMyOTIgOS42NTAwMiA4LjA1MDc4QzkuNjUwMDIgOC4xNjg2NCA5LjU1MzYgOC4yNjUwNyA5LjQzNTc0IDguMjY1MDdaIiBmaWxsPSIjNjE2MTYxIiBzdHJva2U9IiM2MTYxNjEiIHN0cm9rZS13aWR0aD0iMC41Ii8+Cjwvc3ZnPgo=);
--jp-icon-edit: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-ellipses: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPGNpcmNsZSBjeD0iNSIgY3k9IjEyIiByPSIyIi8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIyIi8+CiAgICA8Y2lyY2xlIGN4PSIxOSIgY3k9IjEyIiByPSIyIi8+CiAgPC9nPgo8L3N2Zz4K);
--jp-icon-error: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjE5IiByPSIyIi8+PHBhdGggZD0iTTEwIDNoNHYxMmgtNHoiLz48L2c+CjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiLz4KPC9zdmc+Cg==);
--jp-icon-expand-all: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTggMmMxIDAgMTEgMCAxMiAwczIgMSAyIDJjMCAxIDAgMTEgMCAxMnMwIDItMiAyQzIwIDE0IDIwIDQgMjAgNFMxMCA0IDYgNGMwLTIgMS0yIDItMnoiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTE4IDhjMC0xLTEtMi0yLTJTNSA2IDQgNnMtMiAxLTIgMmMwIDEgMCAxMSAwIDEyczEgMiAyIDJjMSAwIDExIDAgMTIgMHMyLTEgMi0yYzAtMSAwLTExIDAtMTJ6bS0yIDB2MTJINFY4eiIgLz4KICAgICAgICA8cGF0aCBkPSJNMTEgMTBIOXYzSDZ2MmgzdjNoMnYtM2gzdi0yaC0zeiIgLz4KICAgIDwvZz4KPC9zdmc+Cg==);
--jp-icon-extension: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIwLjUgMTFIMTlWN2MwLTEuMS0uOS0yLTItMmgtNFYzLjVDMTMgMi4xMiAxMS44OCAxIDEwLjUgMVM4IDIuMTIgOCAzLjVWNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAydjMuOEgzLjVjMS40OSAwIDIuNyAxLjIxIDIuNyAyLjdzLTEuMjEgMi43LTIuNyAyLjdIMlYyMGMwIDEuMS45IDIgMiAyaDMuOHYtMS41YzAtMS40OSAxLjIxLTIuNyAyLjctMi43IDEuNDkgMCAyLjcgMS4yMSAyLjcgMi43VjIySDE3YzEuMSAwIDItLjkgMi0ydi00aDEuNWMxLjM4IDAgMi41LTEuMTIgMi41LTIuNVMyMS44OCAxMSAyMC41IDExeiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-fast-forward: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTQgMThsOC41LTZMNCA2djEyem05LTEydjEybDguNS02TDEzIDZ6Ii8+CiAgICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-file-upload: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTkgMTZoNnYtNmg0bC03LTctNyA3aDR6bS00IDJoMTR2Mkg1eiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-file: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkuMyA4LjJsLTUuNS01LjVjLS4zLS4zLS43LS41LTEuMi0uNUgzLjljLS44LjEtMS42LjktMS42IDEuOHYxNC4xYzAgLjkuNyAxLjYgMS42IDEuNmgxNC4yYy45IDAgMS42LS43IDEuNi0xLjZWOS40Yy4xLS41LS4xLS45LS40LTEuMnptLTUuOC0zLjNsMy40IDMuNmgtMy40VjQuOXptMy45IDEyLjdINC43Yy0uMSAwLS4yIDAtLjItLjJWNC43YzAtLjIuMS0uMy4yLS4zaDcuMnY0LjRzMCAuOC4zIDEuMWMuMy4zIDEuMS4zIDEuMS4zaDQuM3Y3LjJzLS4xLjItLjIuMnoiLz4KPC9zdmc+Cg==);
--jp-icon-filter-dot: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTE0LDEyVjE5Ljg4QzE0LjA0LDIwLjE4IDEzLjk0LDIwLjUgMTMuNzEsMjAuNzFDMTMuMzIsMjEuMSAxMi42OSwyMS4xIDEyLjMsMjAuNzFMMTAuMjksMTguN0MxMC4wNiwxOC40NyA5Ljk2LDE4LjE2IDEwLDE3Ljg3VjEySDkuOTdMNC4yMSw0LjYyQzMuODcsNC4xOSAzLjk1LDMuNTYgNC4zOCwzLjIyQzQuNTcsMy4wOCA0Ljc4LDMgNSwzVjNIMTlWM0MxOS4yMiwzIDE5LjQzLDMuMDggMTkuNjIsMy4yMkMyMC4wNSwzLjU2IDIwLjEzLDQuMTkgMTkuNzksNC42MkwxNC4wMywxMkgxNFoiIC8+CiAgPC9nPgogIDxnIGNsYXNzPSJqcC1pY29uLWRvdCIgZmlsbD0iI0ZGRiI+CiAgICA8Y2lyY2xlIGN4PSIxOCIgY3k9IjE3IiByPSIzIj48L2NpcmNsZT4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-filter-list: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-filter: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTE0LDEyVjE5Ljg4QzE0LjA0LDIwLjE4IDEzLjk0LDIwLjUgMTMuNzEsMjAuNzFDMTMuMzIsMjEuMSAxMi42OSwyMS4xIDEyLjMsMjAuNzFMMTAuMjksMTguN0MxMC4wNiwxOC40NyA5Ljk2LDE4LjE2IDEwLDE3Ljg3VjEySDkuOTdMNC4yMSw0LjYyQzMuODcsNC4xOSAzLjk1LDMuNTYgNC4zOCwzLjIyQzQuNTcsMy4wOCA0Ljc4LDMgNSwzVjNIMTlWM0MxOS4yMiwzIDE5LjQzLDMuMDggMTkuNjIsMy4yMkMyMC4wNSwzLjU2IDIwLjEzLDQuMTkgMTkuNzksNC42MkwxNC4wMywxMkgxNFoiIC8+CiAgPC9nPgo8L3N2Zz4K);
--jp-icon-folder-favorite: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzAwMDAwMCI+CiAgPHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggY2xhc3M9ImpwLWljb24zIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzYxNjE2MSIgZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS0yLjA2IDExTDE1IDE1LjI4IDEyLjA2IDE3bC43OC0zLjMzLTIuNTktMi4yNCAzLjQxLS4yOUwxNSA4bDEuMzQgMy4xNCAzLjQxLjI5LTIuNTkgMi4yNC43OCAzLjMzeiIvPgo8L3N2Zz4K);
--jp-icon-folder: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yaC04bC0yLTJ6Ii8+Cjwvc3ZnPgo=);
--jp-icon-home: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzAwMDAwMCI+CiAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGNsYXNzPSJqcC1pY29uMyBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xMCAyMHYtNmg0djZoNXYtOGgzTDEyIDMgMiAxMmgzdjh6Ii8+Cjwvc3ZnPgo=);
--jp-icon-html5: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUxMiA1MTIiPgogIDxwYXRoIGNsYXNzPSJqcC1pY29uMCBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiMwMDAiIGQ9Ik0xMDguNCAwaDIzdjIyLjhoMjEuMlYwaDIzdjY5aC0yM1Y0NmgtMjF2MjNoLTIzLjJNMjA2IDIzaC0yMC4zVjBoNjMuN3YyM0gyMjl2NDZoLTIzbTUzLjUtNjloMjQuMWwxNC44IDI0LjNMMzEzLjIgMGgyNC4xdjY5aC0yM1YzNC44bC0xNi4xIDI0LjgtMTYuMS0yNC44VjY5aC0yMi42bTg5LjItNjloMjN2NDYuMmgzMi42VjY5aC01NS42Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI2U0NGQyNiIgZD0iTTEwNy42IDQ3MWwtMzMtMzcwLjRoMzYyLjhsLTMzIDM3MC4yTDI1NS43IDUxMiIvPgogIDxwYXRoIGNsYXNzPSJqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiNmMTY1MjkiIGQ9Ik0yNTYgNDgwLjVWMTMxaDE0OC4zTDM3NiA0NDciLz4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1zZWxlY3RhYmxlLWludmVyc2UiIGZpbGw9IiNlYmViZWIiIGQ9Ik0xNDIgMTc2LjNoMTE0djQ1LjRoLTY0LjJsNC4yIDQ2LjVoNjB2NDUuM0gxNTQuNG0yIDIyLjhIMjAybDMuMiAzNi4zIDUwLjggMTMuNnY0Ny40bC05My4yLTI2Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIiBmaWxsPSIjZmZmIiBkPSJNMzY5LjYgMTc2LjNIMjU1Ljh2NDUuNGgxMDkuNm0tNC4xIDQ2LjVIMjU1Ljh2NDUuNGg1NmwtNS4zIDU5LTUwLjcgMTMuNnY0Ny4ybDkzLTI1LjgiLz4KPC9zdmc+Cg==);
--jp-icon-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1icmFuZDQganAtaWNvbi1zZWxlY3RhYmxlLWludmVyc2UiIGZpbGw9IiNGRkYiIGQ9Ik0yLjIgMi4yaDE3LjV2MTcuNUgyLjJ6Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzNGNTFCNSIgZD0iTTIuMiAyLjJ2MTcuNWgxNy41bC4xLTE3LjVIMi4yem0xMi4xIDIuMmMxLjIgMCAyLjIgMSAyLjIgMi4ycy0xIDIuMi0yLjIgMi4yLTIuMi0xLTIuMi0yLjIgMS0yLjIgMi4yLTIuMnpNNC40IDE3LjZsMy4zLTguOCAzLjMgNi42IDIuMi0zLjIgNC40IDUuNEg0LjR6Ii8+Cjwvc3ZnPgo=);
--jp-icon-info: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUwLjk3OCA1MC45NzgiPgoJPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KCQk8cGF0aCBkPSJNNDMuNTIsNy40NThDMzguNzExLDIuNjQ4LDMyLjMwNywwLDI1LjQ4OSwwQzE4LjY3LDAsMTIuMjY2LDIuNjQ4LDcuNDU4LDcuNDU4CgkJCWMtOS45NDMsOS45NDEtOS45NDMsMjYuMTE5LDAsMzYuMDYyYzQuODA5LDQuODA5LDExLjIxMiw3LjQ1NiwxOC4wMzEsNy40NThjMCwwLDAuMDAxLDAsMC4wMDIsMAoJCQljNi44MTYsMCwxMy4yMjEtMi42NDgsMTguMDI5LTcuNDU4YzQuODA5LTQuODA5LDcuNDU3LTExLjIxMiw3LjQ1Ny0xOC4wM0M1MC45NzcsMTguNjcsNDguMzI4LDEyLjI2Niw0My41Miw3LjQ1OHoKCQkJIE00Mi4xMDYsNDIuMTA1Yy00LjQzMiw0LjQzMS0xMC4zMzIsNi44NzItMTYuNjE1LDYuODcyaC0wLjAwMmMtNi4yODUtMC4wMDEtMTIuMTg3LTIuNDQxLTE2LjYxNy02Ljg3MgoJCQljLTkuMTYyLTkuMTYzLTkuMTYyLTI0LjA3MSwwLTMzLjIzM0MxMy4zMDMsNC40NCwxOS4yMDQsMiwyNS40ODksMmM2LjI4NCwwLDEyLjE4NiwyLjQ0LDE2LjYxNyw2Ljg3MgoJCQljNC40MzEsNC40MzEsNi44NzEsMTAuMzMyLDYuODcxLDE2LjYxN0M0OC45NzcsMzEuNzcyLDQ2LjUzNiwzNy42NzUsNDIuMTA2LDQyLjEwNXoiLz4KCQk8cGF0aCBkPSJNMjMuNTc4LDMyLjIxOGMtMC4wMjMtMS43MzQsMC4xNDMtMy4wNTksMC40OTYtMy45NzJjMC4zNTMtMC45MTMsMS4xMS0xLjk5NywyLjI3Mi0zLjI1MwoJCQljMC40NjgtMC41MzYsMC45MjMtMS4wNjIsMS4zNjctMS41NzVjMC42MjYtMC43NTMsMS4xMDQtMS40NzgsMS40MzYtMi4xNzVjMC4zMzEtMC43MDcsMC40OTUtMS41NDEsMC40OTUtMi41CgkJCWMwLTEuMDk2LTAuMjYtMi4wODgtMC43NzktMi45NzljLTAuNTY1LTAuODc5LTEuNTAxLTEuMzM2LTIuODA2LTEuMzY5Yy0xLjgwMiwwLjA1Ny0yLjk4NSwwLjY2Ny0zLjU1LDEuODMyCgkJCWMtMC4zMDEsMC41MzUtMC41MDMsMS4xNDEtMC42MDcsMS44MTRjLTAuMTM5LDAuNzA3LTAuMjA3LDEuNDMyLTAuMjA3LDIuMTc0aC0yLjkzN2MtMC4wOTEtMi4yMDgsMC40MDctNC4xMTQsMS40OTMtNS43MTkKCQkJYzEuMDYyLTEuNjQsMi44NTUtMi40ODEsNS4zNzgtMi41MjdjMi4xNiwwLjAyMywzLjg3NCwwLjYwOCw1LjE0MSwxLjc1OGMxLjI3OCwxLjE2LDEuOTI5LDIuNzY0LDEuOTUsNC44MTEKCQkJYzAsMS4xNDItMC4xMzcsMi4xMTEtMC40MSwyLjkxMWMtMC4zMDksMC44NDUtMC43MzEsMS41OTMtMS4yNjgsMi4yNDNjLTAuNDkyLDAuNjUtMS4wNjgsMS4zMTgtMS43MywyLjAwMgoJCQljLTAuNjUsMC42OTctMS4zMTMsMS40NzktMS45ODcsMi4zNDZjLTAuMjM5LDAuMzc3LTAuNDI5LDAuNzc3LTAuNTY1LDEuMTk5Yy0wLjE2LDAuOTU5LTAuMjE3LDEuOTUxLTAuMTcxLDIuOTc5CgkJCUMyNi41ODksMzIuMjE4LDIzLjU3OCwzMi4yMTgsMjMuNTc4LDMyLjIxOHogTTIzLjU3OCwzOC4yMnYtMy40ODRoMy4wNzZ2My40ODRIMjMuNTc4eiIvPgoJPC9nPgo8L3N2Zz4K);
--jp-icon-inspector: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaW5zcGVjdG9yLWljb24tY29sb3IganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tNSAxNEg0di00aDExdjR6bTAtNUg0VjloMTF2NHptNSA1aC00VjloNHY5eiIvPgo8L3N2Zz4K);
--jp-icon-json: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtanNvbi1pY29uLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI0Y5QTgyNSI+CiAgICA8cGF0aCBkPSJNMjAuMiAxMS44Yy0xLjYgMC0xLjcuNS0xLjcgMSAwIC40LjEuOS4xIDEuMy4xLjUuMS45LjEgMS4zIDAgMS43LTEuNCAyLjMtMy41IDIuM2gtLjl2LTEuOWguNWMxLjEgMCAxLjQgMCAxLjQtLjggMC0uMyAwLS42LS4xLTEgMC0uNC0uMS0uOC0uMS0xLjIgMC0xLjMgMC0xLjggMS4zLTItMS4zLS4yLTEuMy0uNy0xLjMtMiAwLS40LjEtLjguMS0xLjIuMS0uNC4xLS43LjEtMSAwLS44LS40LS43LTEuNC0uOGgtLjVWNC4xaC45YzIuMiAwIDMuNS43IDMuNSAyLjMgMCAuNC0uMS45LS4xIDEuMy0uMS41LS4xLjktLjEgMS4zIDAgLjUuMiAxIDEuNyAxdjEuOHpNMS44IDEwLjFjMS42IDAgMS43LS41IDEuNy0xIDAtLjQtLjEtLjktLjEtMS4zLS4xLS41LS4xLS45LS4xLTEuMyAwLTEuNiAxLjQtMi4zIDMuNS0yLjNoLjl2MS45aC0uNWMtMSAwLTEuNCAwLTEuNC44IDAgLjMgMCAuNi4xIDEgMCAuMi4xLjYuMSAxIDAgMS4zIDAgMS44LTEuMyAyQzYgMTEuMiA2IDExLjcgNiAxM2MwIC40LS4xLjgtLjEgMS4yLS4xLjMtLjEuNy0uMSAxIDAgLjguMy44IDEuNC44aC41djEuOWgtLjljLTIuMSAwLTMuNS0uNi0zLjUtMi4zIDAtLjQuMS0uOS4xLTEuMy4xLS41LjEtLjkuMS0xLjMgMC0uNS0uMi0xLTEuNy0xdi0xLjl6Ii8+CiAgICA8Y2lyY2xlIGN4PSIxMSIgY3k9IjEzLjgiIHI9IjIuMSIvPgogICAgPGNpcmNsZSBjeD0iMTEiIGN5PSI4LjIiIHI9IjIuMSIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-julia: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDMyNSAzMDAiPgogIDxnIGNsYXNzPSJqcC1icmFuZDAganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjY2IzYzMzIj4KICAgIDxwYXRoIGQ9Ik0gMTUwLjg5ODQzOCAyMjUgQyAxNTAuODk4NDM4IDI2Ni40MjE4NzUgMTE3LjMyMDMxMiAzMDAgNzUuODk4NDM4IDMwMCBDIDM0LjQ3NjU2MiAzMDAgMC44OTg0MzggMjY2LjQyMTg3NSAwLjg5ODQzOCAyMjUgQyAwLjg5ODQzOCAxODMuNTc4MTI1IDM0LjQ3NjU2MiAxNTAgNzUuODk4NDM4IDE1MCBDIDExNy4zMjAzMTIgMTUwIDE1MC44OTg0MzggMTgzLjU3ODEyNSAxNTAuODk4NDM4IDIyNSIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzM4OTgyNiI+CiAgICA8cGF0aCBkPSJNIDIzNy41IDc1IEMgMjM3LjUgMTE2LjQyMTg3NSAyMDMuOTIxODc1IDE1MCAxNjIuNSAxNTAgQyAxMjEuMDc4MTI1IDE1MCA4Ny41IDExNi40MjE4NzUgODcuNSA3NSBDIDg3LjUgMzMuNTc4MTI1IDEyMS4wNzgxMjUgMCAxNjIuNSAwIEMgMjAzLjkyMTg3NSAwIDIzNy41IDMzLjU3ODEyNSAyMzcuNSA3NSIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzk1NThiMiI+CiAgICA8cGF0aCBkPSJNIDMyNC4xMDE1NjIgMjI1IEMgMzI0LjEwMTU2MiAyNjYuNDIxODc1IDI5MC41MjM0MzggMzAwIDI0OS4xMDE1NjIgMzAwIEMgMjA3LjY3OTY4OCAzMDAgMTc0LjEwMTU2MiAyNjYuNDIxODc1IDE3NC4xMDE1NjIgMjI1IEMgMTc0LjEwMTU2MiAxODMuNTc4MTI1IDIwNy42Nzk2ODggMTUwIDI0OS4xMDE1NjIgMTUwIEMgMjkwLjUyMzQzOCAxNTAgMzI0LjEwMTU2MiAxODMuNTc4MTI1IDMyNC4xMDE1NjIgMjI1Ii8+CiAgPC9nPgo8L3N2Zz4K);
--jp-icon-jupyter-favicon: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUyIiBoZWlnaHQ9IjE2NSIgdmlld0JveD0iMCAwIDE1MiAxNjUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgPGcgY2xhc3M9ImpwLWp1cHl0ZXItaWNvbi1jb2xvciIgZmlsbD0iI0YzNzcyNiI+CiAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjA3ODk0NywgMTEwLjU4MjkyNykiIGQ9Ik03NS45NDIyODQyLDI5LjU4MDQ1NjEgQzQzLjMwMjM5NDcsMjkuNTgwNDU2MSAxNC43OTY3ODMyLDE3LjY1MzQ2MzQgMCwwIEM1LjUxMDgzMjExLDE1Ljg0MDY4MjkgMTUuNzgxNTM4OSwyOS41NjY3NzMyIDI5LjM5MDQ5NDcsMzkuMjc4NDE3MSBDNDIuOTk5Nyw0OC45ODk4NTM3IDU5LjI3MzcsNTQuMjA2NzgwNSA3NS45NjA1Nzg5LDU0LjIwNjc4MDUgQzkyLjY0NzQ1NzksNTQuMjA2NzgwNSAxMDguOTIxNDU4LDQ4Ljk4OTg1MzcgMTIyLjUzMDY2MywzOS4yNzg0MTcxIEMxMzYuMTM5NDUzLDI5LjU2Njc3MzIgMTQ2LjQxMDI4NCwxNS44NDA2ODI5IDE1MS45MjExNTgsMCBDMTM3LjA4Nzg2OCwxNy42NTM0NjM0IDEwOC41ODI1ODksMjkuNTgwNDU2MSA3NS45NDIyODQyLDI5LjU4MDQ1NjEgTDc1Ljk0MjI4NDIsMjkuNTgwNDU2MSBaIiAvPgogICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMzczNjgsIDAuNzA0ODc4KSIgZD0iTTc1Ljk3ODQ1NzksMjQuNjI2NDA3MyBDMTA4LjYxODc2MywyNC42MjY0MDczIDEzNy4xMjQ0NTgsMzYuNTUzNDQxNSAxNTEuOTIxMTU4LDU0LjIwNjc4MDUgQzE0Ni40MTAyODQsMzguMzY2MjIyIDEzNi4xMzk0NTMsMjQuNjQwMTMxNyAxMjIuNTMwNjYzLDE0LjkyODQ4NzggQzEwOC45MjE0NTgsNS4yMTY4NDM5IDkyLjY0NzQ1NzksMCA3NS45NjA1Nzg5LDAgQzU5LjI3MzcsMCA0Mi45OTk3LDUuMjE2ODQzOSAyOS4zOTA0OTQ3LDE0LjkyODQ4NzggQzE1Ljc4MTUzODksMjQuNjQwMTMxNyA1LjUxMDgzMjExLDM4LjM2NjIyMiAwLDU0LjIwNjc4MDUgQzE0LjgzMzA4MTYsMzYuNTg5OTI5MyA0My4zMzg1Njg0LDI0LjYyNjQwNzMgNzUuOTc4NDU3OSwyNC42MjY0MDczIEw3NS45Nzg0NTc5LDI0LjYyNjQwNzMgWiIgLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-jupyter: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzkiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCAzOSA1MSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTYzOCAtMjI4MSkiPgogICAgIDxnIGNsYXNzPSJqcC1qdXB5dGVyLWljb24tY29sb3IiIGZpbGw9IiNGMzc3MjYiPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM5Ljc0IDIzMTEuOTgpIiBkPSJNIDE4LjI2NDYgNy4xMzQxMUMgMTAuNDE0NSA3LjEzNDExIDMuNTU4NzIgNC4yNTc2IDAgMEMgMS4zMjUzOSAzLjgyMDQgMy43OTU1NiA3LjEzMDgxIDcuMDY4NiA5LjQ3MzAzQyAxMC4zNDE3IDExLjgxNTIgMTQuMjU1NyAxMy4wNzM0IDE4LjI2OSAxMy4wNzM0QyAyMi4yODIzIDEzLjA3MzQgMjYuMTk2MyAxMS44MTUyIDI5LjQ2OTQgOS40NzMwM0MgMzIuNzQyNCA3LjEzMDgxIDM1LjIxMjYgMy44MjA0IDM2LjUzOCAwQyAzMi45NzA1IDQuMjU3NiAyNi4xMTQ4IDcuMTM0MTEgMTguMjY0NiA3LjEzNDExWiIvPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM5LjczIDIyODUuNDgpIiBkPSJNIDE4LjI3MzMgNS45MzkzMUMgMjYuMTIzNSA1LjkzOTMxIDMyLjk3OTMgOC44MTU4MyAzNi41MzggMTMuMDczNEMgMzUuMjEyNiA5LjI1MzAzIDMyLjc0MjQgNS45NDI2MiAyOS40Njk0IDMuNjAwNEMgMjYuMTk2MyAxLjI1ODE4IDIyLjI4MjMgMCAxOC4yNjkgMEMgMTQuMjU1NyAwIDEwLjM0MTcgMS4yNTgxOCA3LjA2ODYgMy42MDA0QyAzLjc5NTU2IDUuOTQyNjIgMS4zMjUzOSA5LjI1MzAzIDAgMTMuMDczNEMgMy41Njc0NSA4LjgyNDYzIDEwLjQyMzIgNS45MzkzMSAxOC4yNzMzIDUuOTM5MzFaIi8+CiAgICA8L2c+CiAgICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjY5LjMgMjI4MS4zMSkiIGQ9Ik0gNS44OTM1MyAyLjg0NEMgNS45MTg4OSAzLjQzMTY1IDUuNzcwODUgNC4wMTM2NyA1LjQ2ODE1IDQuNTE2NDVDIDUuMTY1NDUgNS4wMTkyMiA0LjcyMTY4IDUuNDIwMTUgNC4xOTI5OSA1LjY2ODUxQyAzLjY2NDMgNS45MTY4OCAzLjA3NDQ0IDYuMDAxNTEgMi40OTgwNSA1LjkxMTcxQyAxLjkyMTY2IDUuODIxOSAxLjM4NDYzIDUuNTYxNyAwLjk1NDg5OCA1LjE2NDAxQyAwLjUyNTE3IDQuNzY2MzMgMC4yMjIwNTYgNC4yNDkwMyAwLjA4MzkwMzcgMy42Nzc1N0MgLTAuMDU0MjQ4MyAzLjEwNjExIC0wLjAyMTIzIDIuNTA2MTcgMC4xNzg3ODEgMS45NTM2NEMgMC4zNzg3OTMgMS40MDExIDAuNzM2ODA5IDAuOTIwODE3IDEuMjA3NTQgMC41NzM1MzhDIDEuNjc4MjYgMC4yMjYyNTkgMi4yNDA1NSAwLjAyNzU5MTkgMi44MjMyNiAwLjAwMjY3MjI5QyAzLjYwMzg5IC0wLjAzMDcxMTUgNC4zNjU3MyAwLjI0OTc4OSA0Ljk0MTQyIDAuNzgyNTUxQyA1LjUxNzExIDEuMzE1MzEgNS44NTk1NiAyLjA1Njc2IDUuODkzNTMgMi44NDRaIi8+CiAgICAgIDxwYXRoIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2MzkuOCAyMzIzLjgxKSIgZD0iTSA3LjQyNzg5IDMuNTgzMzhDIDcuNDYwMDggNC4zMjQzIDcuMjczNTUgNS4wNTgxOSA2Ljg5MTkzIDUuNjkyMTNDIDYuNTEwMzEgNi4zMjYwNyA1Ljk1MDc1IDYuODMxNTYgNS4yODQxMSA3LjE0NDZDIDQuNjE3NDcgNy40NTc2MyAzLjg3MzcxIDcuNTY0MTQgMy4xNDcwMiA3LjQ1MDYzQyAyLjQyMDMyIDcuMzM3MTIgMS43NDMzNiA3LjAwODcgMS4yMDE4NCA2LjUwNjk1QyAwLjY2MDMyOCA2LjAwNTIgMC4yNzg2MSA1LjM1MjY4IDAuMTA1MDE3IDQuNjMyMDJDIC0wLjA2ODU3NTcgMy45MTEzNSAtMC4wMjYyMzYxIDMuMTU0OTQgMC4yMjY2NzUgMi40NTg1NkMgMC40Nzk1ODcgMS43NjIxNyAwLjkzMTY5NyAxLjE1NzEzIDEuNTI1NzYgMC43MjAwMzNDIDIuMTE5ODMgMC4yODI5MzUgMi44MjkxNCAwLjAzMzQzOTUgMy41NjM4OSAwLjAwMzEzMzQ0QyA0LjU0NjY3IC0wLjAzNzQwMzMgNS41MDUyOSAwLjMxNjcwNiA2LjIyOTYxIDAuOTg3ODM1QyA2Ljk1MzkzIDEuNjU4OTYgNy4zODQ4NCAyLjU5MjM1IDcuNDI3ODkgMy41ODMzOEwgNy40Mjc4OSAzLjU4MzM4WiIvPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM4LjM2IDIyODYuMDYpIiBkPSJNIDIuMjc0NzEgNC4zOTYyOUMgMS44NDM2MyA0LjQxNTA4IDEuNDE2NzEgNC4zMDQ0NSAxLjA0Nzk5IDQuMDc4NDNDIDAuNjc5MjY4IDMuODUyNCAwLjM4NTMyOCAzLjUyMTE0IDAuMjAzMzcxIDMuMTI2NTZDIDAuMDIxNDEzNiAyLjczMTk4IC0wLjA0MDM3OTggMi4yOTE4MyAwLjAyNTgxMTYgMS44NjE4MUMgMC4wOTIwMDMxIDEuNDMxOCAwLjI4MzIwNCAxLjAzMTI2IDAuNTc1MjEzIDAuNzEwODgzQyAwLjg2NzIyMiAwLjM5MDUxIDEuMjQ2OTEgMC4xNjQ3MDggMS42NjYyMiAwLjA2MjA1OTJDIDIuMDg1NTMgLTAuMDQwNTg5NyAyLjUyNTYxIC0wLjAxNTQ3MTQgMi45MzA3NiAwLjEzNDIzNUMgMy4zMzU5MSAwLjI4Mzk0MSAzLjY4NzkyIDAuNTUxNTA1IDMuOTQyMjIgMC45MDMwNkMgNC4xOTY1MiAxLjI1NDYyIDQuMzQxNjkgMS42NzQzNiA0LjM1OTM1IDIuMTA5MTZDIDQuMzgyOTkgMi42OTEwNyA0LjE3Njc4IDMuMjU4NjkgMy43ODU5NyAzLjY4NzQ2QyAzLjM5NTE2IDQuMTE2MjQgMi44NTE2NiA0LjM3MTE2IDIuMjc0NzEgNC4zOTYyOUwgMi4yNzQ3MSA0LjM5NjI5WiIvPgogICAgPC9nPgogIDwvZz4+Cjwvc3ZnPgo=);
--jp-icon-jupyterlab-wordmark: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMDAiIHZpZXdCb3g9IjAgMCAxODYwLjggNDc1Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0RTRFNEUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4MC4xMzY0MDEsIDY0LjI3MTQ5MykiPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDU4Ljg3NTU2NikiPgogICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjA4NzYwMywgMC4xNDAyOTQpIj4KICAgICAgICA8cGF0aCBkPSJNLTQyNi45LDE2OS44YzAsNDguNy0zLjcsNjQuNy0xMy42LDc2LjRjLTEwLjgsMTAtMjUsMTUuNS0zOS43LDE1LjVsMy43LDI5IGMyMi44LDAuMyw0NC44LTcuOSw2MS45LTIzLjFjMTcuOC0xOC41LDI0LTQ0LjEsMjQtODMuM1YwSC00Mjd2MTcwLjFMLTQyNi45LDE2OS44TC00MjYuOSwxNjkuOHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTU1LjA0NTI5NiwgNTYuODM3MTA0KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuNTYyNDUzLCAxLjc5OTg0MikiPgogICAgICAgIDxwYXRoIGQ9Ik0tMzEyLDE0OGMwLDIxLDAsMzkuNSwxLjcsNTUuNGgtMzEuOGwtMi4xLTMzLjNoLTAuOGMtNi43LDExLjYtMTYuNCwyMS4zLTI4LDI3LjkgYy0xMS42LDYuNi0yNC44LDEwLTM4LjIsOS44Yy0zMS40LDAtNjktMTcuNy02OS04OVYwaDM2LjR2MTEyLjdjMCwzOC43LDExLjYsNjQuNyw0NC42LDY0LjdjMTAuMy0wLjIsMjAuNC0zLjUsMjguOS05LjQgYzguNS01LjksMTUuMS0xNC4zLDE4LjktMjMuOWMyLjItNi4xLDMuMy0xMi41LDMuMy0xOC45VjAuMmgzNi40VjE0OEgtMzEyTC0zMTIsMTQ4eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzOTAuMDEzMzIyLCA1My40Nzk2MzgpIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS43MDY0NTgsIDAuMjMxNDI1KSI+CiAgICAgICAgPHBhdGggZD0iTS00NzguNiw3MS40YzAtMjYtMC44LTQ3LTEuNy02Ni43aDMyLjdsMS43LDM0LjhoMC44YzcuMS0xMi41LDE3LjUtMjIuOCwzMC4xLTI5LjcgYzEyLjUtNywyNi43LTEwLjMsNDEtOS44YzQ4LjMsMCw4NC43LDQxLjcsODQuNywxMDMuM2MwLDczLjEtNDMuNywxMDkuMi05MSwxMDkuMmMtMTIuMSwwLjUtMjQuMi0yLjItMzUtNy44IGMtMTAuOC01LjYtMTkuOS0xMy45LTI2LjYtMjQuMmgtMC44VjI5MWgtMzZ2LTIyMEwtNDc4LjYsNzEuNEwtNDc4LjYsNzEuNHogTS00NDIuNiwxMjUuNmMwLjEsNS4xLDAuNiwxMC4xLDEuNywxNS4xIGMzLDEyLjMsOS45LDIzLjMsMTkuOCwzMS4xYzkuOSw3LjgsMjIuMSwxMi4xLDM0LjcsMTIuMWMzOC41LDAsNjAuNy0zMS45LDYwLjctNzguNWMwLTQwLjctMjEuMS03NS42LTU5LjUtNzUuNiBjLTEyLjksMC40LTI1LjMsNS4xLTM1LjMsMTMuNGMtOS45LDguMy0xNi45LDE5LjctMTkuNiwzMi40Yy0xLjUsNC45LTIuMywxMC0yLjUsMTUuMVYxMjUuNkwtNDQyLjYsMTI1LjZMLTQ0Mi42LDEyNS42eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2MDYuNzQwNzI2LCA1Ni44MzcxMDQpIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC43NTEyMjYsIDEuOTg5Mjk5KSI+CiAgICAgICAgPHBhdGggZD0iTS00NDAuOCwwbDQzLjcsMTIwLjFjNC41LDEzLjQsOS41LDI5LjQsMTIuOCw0MS43aDAuOGMzLjctMTIuMiw3LjktMjcuNywxMi44LTQyLjQgbDM5LjctMTE5LjJoMzguNUwtMzQ2LjksMTQ1Yy0yNiw2OS43LTQzLjcsMTA1LjQtNjguNiwxMjcuMmMtMTIuNSwxMS43LTI3LjksMjAtNDQuNiwyMy45bC05LjEtMzEuMSBjMTEuNy0zLjksMjIuNS0xMC4xLDMxLjgtMTguMWMxMy4yLTExLjEsMjMuNy0yNS4yLDMwLjYtNDEuMmMxLjUtMi44LDIuNS01LjcsMi45LTguOGMtMC4zLTMuMy0xLjItNi42LTIuNS05LjdMLTQ4MC4yLDAuMSBoMzkuN0wtNDQwLjgsMEwtNDQwLjgsMHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoODIyLjc0ODEwNCwgMC4wMDAwMDApIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS40NjQwNTAsIDAuMzc4OTE0KSI+CiAgICAgICAgPHBhdGggZD0iTS00MTMuNywwdjU4LjNoNTJ2MjguMmgtNTJWMTk2YzAsMjUsNywzOS41LDI3LjMsMzkuNWM3LjEsMC4xLDE0LjItMC43LDIxLjEtMi41IGwxLjcsMjcuN2MtMTAuMywzLjctMjEuMyw1LjQtMzIuMiw1Yy03LjMsMC40LTE0LjYtMC43LTIxLjMtMy40Yy02LjgtMi43LTEyLjktNi44LTE3LjktMTIuMWMtMTAuMy0xMC45LTE0LjEtMjktMTQuMS01Mi45IFY4Ni41aC0zMVY1OC4zaDMxVjkuNkwtNDEzLjcsMEwtNDEzLjcsMHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTc0LjQzMzI4NiwgNTMuNDc5NjM4KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuOTkwMDM0LCAwLjYxMDMzOSkiPgogICAgICAgIDxwYXRoIGQ9Ik0tNDQ1LjgsMTEzYzAuOCw1MCwzMi4yLDcwLjYsNjguNiw3MC42YzE5LDAuNiwzNy45LTMsNTUuMy0xMC41bDYuMiwyNi40IGMtMjAuOSw4LjktNDMuNSwxMy4xLTY2LjIsMTIuNmMtNjEuNSwwLTk4LjMtNDEuMi05OC4zLTEwMi41Qy00ODAuMiw0OC4yLTQ0NC43LDAtMzg2LjUsMGM2NS4yLDAsODIuNyw1OC4zLDgyLjcsOTUuNyBjLTAuMSw1LjgtMC41LDExLjUtMS4yLDE3LjJoLTE0MC42SC00NDUuOEwtNDQ1LjgsMTEzeiBNLTMzOS4yLDg2LjZjMC40LTIzLjUtOS41LTYwLjEtNTAuNC02MC4xIGMtMzYuOCwwLTUyLjgsMzQuNC01NS43LDYwLjFILTMzOS4yTC0zMzkuMiw4Ni42TC0zMzkuMiw4Ni42eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjAxLjk2MTA1OCwgNTMuNDc5NjM4KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMTc5NjQwLCAwLjcwNTA2OCkiPgogICAgICAgIDxwYXRoIGQ9Ik0tNDc4LjYsNjhjMC0yMy45LTAuNC00NC41LTEuNy02My40aDMxLjhsMS4yLDM5LjloMS43YzkuMS0yNy4zLDMxLTQ0LjUsNTUuMy00NC41IGMzLjUtMC4xLDcsMC40LDEwLjMsMS4ydjM0LjhjLTQuMS0wLjktOC4yLTEuMy0xMi40LTEuMmMtMjUuNiwwLTQzLjcsMTkuNy00OC43LDQ3LjRjLTEsNS43LTEuNiwxMS41LTEuNywxNy4ydjEwOC4zaC0zNlY2OCBMLTQ3OC42LDY4eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbi13YXJuMCIgZmlsbD0iI0YzNzcyNiI+CiAgICA8cGF0aCBkPSJNMTM1Mi4zLDMyNi4yaDM3VjI4aC0zN1YzMjYuMnogTTE2MDQuOCwzMjYuMmMtMi41LTEzLjktMy40LTMxLjEtMy40LTQ4Ljd2LTc2IGMwLTQwLjctMTUuMS04My4xLTc3LjMtODMuMWMtMjUuNiwwLTUwLDcuMS02Ni44LDE4LjFsOC40LDI0LjRjMTQuMy05LjIsMzQtMTUuMSw1My0xNS4xYzQxLjYsMCw0Ni4yLDMwLjIsNDYuMiw0N3Y0LjIgYy03OC42LTAuNC0xMjIuMywyNi41LTEyMi4zLDc1LjZjMCwyOS40LDIxLDU4LjQsNjIuMiw1OC40YzI5LDAsNTAuOS0xNC4zLDYyLjItMzAuMmgxLjNsMi45LDI1LjZIMTYwNC44eiBNMTU2NS43LDI1Ny43IGMwLDMuOC0wLjgsOC0yLjEsMTEuOGMtNS45LDE3LjItMjIuNywzNC00OS4yLDM0Yy0xOC45LDAtMzQuOS0xMS4zLTM0LjktMzUuM2MwLTM5LjUsNDUuOC00Ni42LDg2LjItNDUuOFYyNTcuN3ogTTE2OTguNSwzMjYuMiBsMS43LTMzLjZoMS4zYzE1LjEsMjYuOSwzOC43LDM4LjIsNjguMSwzOC4yYzQ1LjQsMCw5MS4yLTM2LjEsOTEuMi0xMDguOGMwLjQtNjEuNy0zNS4zLTEwMy43LTg1LjctMTAzLjcgYy0zMi44LDAtNTYuMywxNC43LTY5LjMsMzcuNGgtMC44VjI4aC0zNi42djI0NS43YzAsMTguMS0wLjgsMzguNi0xLjcsNTIuNUgxNjk4LjV6IE0xNzA0LjgsMjA4LjJjMC01LjksMS4zLTEwLjksMi4xLTE1LjEgYzcuNi0yOC4xLDMxLjEtNDUuNCw1Ni4zLTQ1LjRjMzkuNSwwLDYwLjUsMzQuOSw2MC41LDc1LjZjMCw0Ni42LTIzLjEsNzguMS02MS44LDc4LjFjLTI2LjksMC00OC4zLTE3LjYtNTUuNS00My4zIGMtMC44LTQuMi0xLjctOC44LTEuNy0xMy40VjIwOC4yeiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-kernel: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgZmlsbD0iIzYxNjE2MSIgZD0iTTE1IDlIOXY2aDZWOXptLTIgNGgtMnYtMmgydjJ6bTgtMlY5aC0yVjdjMC0xLjEtLjktMi0yLTJoLTJWM2gtMnYyaC0yVjNIOXYySDdjLTEuMSAwLTIgLjktMiAydjJIM3YyaDJ2MkgzdjJoMnYyYzAgMS4xLjkgMiAyIDJoMnYyaDJ2LTJoMnYyaDJ2LTJoMmMxLjEgMCAyLS45IDItMnYtMmgydi0yaC0ydi0yaDJ6bS00IDZIN1Y3aDEwdjEweiIvPgo8L3N2Zz4K);
--jp-icon-keyboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMjAgNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMTdjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0tOSAzaDJ2MmgtMlY4em0wIDNoMnYyaC0ydi0yek04IDhoMnYySDhWOHptMCAzaDJ2Mkg4di0yem0tMSAySDV2LTJoMnYyem0wLTNINVY4aDJ2MnptOSA3SDh2LTJoOHYyem0wLTRoLTJ2LTJoMnYyem0wLTNoLTJWOGgydjJ6bTMgM2gtMnYtMmgydjJ6bTAtM2gtMlY4aDJ2MnoiLz4KPC9zdmc+Cg==);
--jp-icon-launch: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMzIgMzIiIHdpZHRoPSIzMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0yNiwyOEg2YTIuMDAyNywyLjAwMjcsMCwwLDEtMi0yVjZBMi4wMDI3LDIuMDAyNywwLDAsMSw2LDRIMTZWNkg2VjI2SDI2VjE2aDJWMjZBMi4wMDI3LDIuMDAyNywwLDAsMSwyNiwyOFoiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMjAgMiAyMCA0IDI2LjU4NiA0IDE4IDEyLjU4NiAxOS40MTQgMTQgMjggNS40MTQgMjggMTIgMzAgMTIgMzAgMiAyMCAyIi8+CiAgPC9nPgo8L3N2Zz4K);
--jp-icon-launcher: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkgMTlINVY1aDdWM0g1YTIgMiAwIDAwLTIgMnYxNGEyIDIgMCAwMDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiLz4KPC9zdmc+Cg==);
--jp-icon-line-form: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGZpbGw9IndoaXRlIiBkPSJNNS44OCA0LjEyTDEzLjc2IDEybC03Ljg4IDcuODhMOCAyMmwxMC0xMEw4IDJ6Ii8+Cjwvc3ZnPgo=);
--jp-icon-link: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-list: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xOSA1djE0SDVWNWgxNG0xLjEtMkgzLjljLS41IDAtLjkuNC0uOS45djE2LjJjMCAuNC40LjkuOS45aDE2LjJjLjQgMCAuOS0uNS45LS45VjMuOWMwLS41LS41LS45LS45LS45ek0xMSA3aDZ2MmgtNlY3em0wIDRoNnYyaC02di0yem0wIDRoNnYyaC02ek03IDdoMnYySDd6bTAgNGgydjJIN3ptMCA0aDJ2Mkg3eiIvPgo8L3N2Zz4K);
--jp-icon-markdown: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDAganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjN0IxRkEyIiBkPSJNNSAxNC45aDEybC02LjEgNnptOS40LTYuOGMwLTEuMy0uMS0yLjktLjEtNC41LS40IDEuNC0uOSAyLjktMS4zIDQuM2wtMS4zIDQuM2gtMkw4LjUgNy45Yy0uNC0xLjMtLjctMi45LTEtNC4zLS4xIDEuNi0uMSAzLjItLjIgNC42TDcgMTIuNEg0LjhsLjctMTFoMy4zTDEwIDVjLjQgMS4yLjcgMi43IDEgMy45LjMtMS4yLjctMi42IDEtMy45bDEuMi0zLjdoMy4zbC42IDExaC0yLjRsLS4zLTQuMnoiLz4KPC9zdmc+Cg==);
--jp-icon-move-down: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNMTIuNDcxIDcuNTI4OTlDMTIuNzYzMiA3LjIzNjg0IDEyLjc2MzIgNi43NjMxNiAxMi40NzEgNi40NzEwMVY2LjQ3MTAxQzEyLjE3OSA2LjE3OTA1IDExLjcwNTcgNi4xNzg4NCAxMS40MTM1IDYuNDcwNTRMNy43NSAxMC4xMjc1VjEuNzVDNy43NSAxLjMzNTc5IDcuNDE0MjEgMSA3IDFWMUM2LjU4NTc5IDEgNi4yNSAxLjMzNTc5IDYuMjUgMS43NVYxMC4xMjc1TDIuNTk3MjYgNi40NjgyMkMyLjMwMzM4IDYuMTczODEgMS44MjY0MSA2LjE3MzU5IDEuNTMyMjYgNi40Njc3NFY2LjQ2Nzc0QzEuMjM4MyA2Ljc2MTcgMS4yMzgzIDcuMjM4MyAxLjUzMjI2IDcuNTMyMjZMNi4yOTI4OSAxMi4yOTI5QzYuNjgzNDIgMTIuNjgzNCA3LjMxNjU4IDEyLjY4MzQgNy43MDcxMSAxMi4yOTI5TDEyLjQ3MSA3LjUyODk5WiIgZmlsbD0iIzYxNjE2MSIvPgo8L3N2Zz4K);
--jp-icon-move-up: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNMS41Mjg5OSA2LjQ3MTAxQzEuMjM2ODQgNi43NjMxNiAxLjIzNjg0IDcuMjM2ODQgMS41Mjg5OSA3LjUyODk5VjcuNTI4OTlDMS44MjA5NSA3LjgyMDk1IDIuMjk0MjYgNy44MjExNiAyLjU4NjQ5IDcuNTI5NDZMNi4yNSAzLjg3MjVWMTIuMjVDNi4yNSAxMi42NjQyIDYuNTg1NzkgMTMgNyAxM1YxM0M3LjQxNDIxIDEzIDcuNzUgMTIuNjY0MiA3Ljc1IDEyLjI1VjMuODcyNUwxMS40MDI3IDcuNTMxNzhDMTEuNjk2NiA3LjgyNjE5IDEyLjE3MzYgNy44MjY0MSAxMi40Njc3IDcuNTMyMjZWNy41MzIyNkMxMi43NjE3IDcuMjM4MyAxMi43NjE3IDYuNzYxNyAxMi40Njc3IDYuNDY3NzRMNy43MDcxMSAxLjcwNzExQzcuMzE2NTggMS4zMTY1OCA2LjY4MzQyIDEuMzE2NTggNi4yOTI4OSAxLjcwNzExTDEuNTI4OTkgNi40NzEwMVoiIGZpbGw9IiM2MTYxNjEiLz4KPC9zdmc+Cg==);
--jp-icon-new-folder: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS0xIDhoLTN2M2gtMnYtM2gtM3YtMmgzVjloMnYzaDN2MnoiLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-not-trusted: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI1IDI1Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMgMykiIGQ9Ik0xLjg2MDk0IDExLjQ0MDlDMC44MjY0NDggOC43NzAyNyAwLjg2Mzc3OSA2LjA1NzY0IDEuMjQ5MDcgNC4xOTkzMkMyLjQ4MjA2IDMuOTMzNDcgNC4wODA2OCAzLjQwMzQ3IDUuNjAxMDIgMi44NDQ5QzcuMjM1NDkgMi4yNDQ0IDguODU2NjYgMS41ODE1IDkuOTg3NiAxLjA5NTM5QzExLjA1OTcgMS41ODM0MSAxMi42MDk0IDIuMjQ0NCAxNC4yMTggMi44NDMzOUMxNS43NTAzIDMuNDEzOTQgMTcuMzk5NSAzLjk1MjU4IDE4Ljc1MzkgNC4yMTM4NUMxOS4xMzY0IDYuMDcxNzcgMTkuMTcwOSA4Ljc3NzIyIDE4LjEzOSAxMS40NDA5QzE3LjAzMDMgMTQuMzAzMiAxNC42NjY4IDE3LjE4NDQgOS45OTk5OSAxOC45MzU0QzUuMzMzMTkgMTcuMTg0NCAyLjk2OTY4IDE0LjMwMzIgMS44NjA5NCAxMS40NDA5WiIvPgogICAgPHBhdGggY2xhc3M9ImpwLWljb24yIiBzdHJva2U9IiMzMzMzMzMiIHN0cm9rZS13aWR0aD0iMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS4zMTU5MiA5LjMyMDMxKSIgZD0iTTcuMzY4NDIgMEwwIDcuMzY0NzkiLz4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMzE1OTIgMTYuNjgzNikgc2NhbGUoMSAtMSkiIGQ9Ik03LjM2ODQyIDBMMCA3LjM2NDc5Ii8+Cjwvc3ZnPgo=);
--jp-icon-notebook: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtbm90ZWJvb2staWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiNFRjZDMDAiPgogICAgPHBhdGggZD0iTTE4LjcgMy4zdjE1LjRIMy4zVjMuM2gxNS40bTEuNS0xLjVIMS44djE4LjNoMTguM2wuMS0xOC4zeiIvPgogICAgPHBhdGggZD0iTTE2LjUgMTYuNWwtNS40LTQuMy01LjYgNC4zdi0xMWgxMXoiLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-numbering: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAyOCAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTQgMTlINlYxOS41SDVWMjAuNUg2VjIxSDRWMjJIN1YxOEg0VjE5Wk01IDEwSDZWNkg0VjdINVYxMFpNNCAxM0g1LjhMNCAxNS4xVjE2SDdWMTVINS4yTDcgMTIuOVYxMkg0VjEzWk05IDdWOUgyM1Y3SDlaTTkgMjFIMjNWMTlIOVYyMVpNOSAxNUgyM1YxM0g5VjE1WiIvPgoJPC9nPgo8L3N2Zz4K);
--jp-icon-offline-bolt: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyIDIuMDJjLTUuNTEgMC05Ljk4IDQuNDctOS45OCA5Ljk4czQuNDcgOS45OCA5Ljk4IDkuOTggOS45OC00LjQ3IDkuOTgtOS45OFMxNy41MSAyLjAyIDEyIDIuMDJ6TTExLjQ4IDIwdi02LjI2SDhMMTMgNHY2LjI2aDMuMzVMMTEuNDggMjB6Ii8+CiAgPC9nPgo8L3N2Zz4K);
--jp-icon-palette: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE4IDEzVjIwSDRWNkg5LjAyQzkuMDcgNS4yOSA5LjI0IDQuNjIgOS41IDRINEMyLjkgNCAyIDQuOSAyIDZWMjBDMiAyMS4xIDIuOSAyMiA0IDIySDE4QzE5LjEgMjIgMjAgMjEuMSAyMCAyMFYxNUwxOCAxM1pNMTkuMyA4Ljg5QzE5Ljc0IDguMTkgMjAgNy4zOCAyMCA2LjVDMjAgNC4wMSAxNy45OSAyIDE1LjUgMkMxMy4wMSAyIDExIDQuMDEgMTEgNi41QzExIDguOTkgMTMuMDEgMTEgMTUuNDkgMTFDMTYuMzcgMTEgMTcuMTkgMTAuNzQgMTcuODggMTAuM0wyMSAxMy40MkwyMi40MiAxMkwxOS4zIDguODlaTTE1LjUgOUMxNC4xMiA5IDEzIDcuODggMTMgNi41QzEzIDUuMTIgMTQuMTIgNCAxNS41IDRDMTYuODggNCAxOCA1LjEyIDE4IDYuNUMxOCA3Ljg4IDE2Ljg4IDkgMTUuNSA5WiIvPgogICAgPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00IDZIOS4wMTg5NEM5LjAwNjM5IDYuMTY1MDIgOSA2LjMzMTc2IDkgNi41QzkgOC44MTU3NyAxMC4yMTEgMTAuODQ4NyAxMi4wMzQzIDEySDlWMTRIMTZWMTIuOTgxMUMxNi41NzAzIDEyLjkzNzcgMTcuMTIgMTIuODIwNyAxNy42Mzk2IDEyLjYzOTZMMTggMTNWMjBINFY2Wk04IDhINlYxMEg4VjhaTTYgMTJIOFYxNEg2VjEyWk04IDE2SDZWMThIOFYxNlpNOSAxNkgxNlYxOEg5VjE2WiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-paste: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTE5IDJoLTQuMThDMTQuNC44NCAxMy4zIDAgMTIgMGMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptNyAxOEg1VjRoMnYzaDEwVjRoMnYxNnoiLz4KICAgIDwvZz4KPC9zdmc+Cg==);
--jp-icon-pdf: url(data:image/svg+xml;base64,PHN2ZwogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMiAyMiIgd2lkdGg9IjE2Ij4KICAgIDxwYXRoIHRyYW5zZm9ybT0icm90YXRlKDQ1KSIgY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI0ZGMkEyQSIKICAgICAgIGQ9Im0gMjIuMzQ0MzY5LC0zLjAxNjM2NDIgaCA1LjYzODYwNCB2IDEuNTc5MjQzMyBoIC0zLjU0OTIyNyB2IDEuNTA4NjkyOTkgaCAzLjMzNzU3NiBWIDEuNjUwODE1NCBoIC0zLjMzNzU3NiB2IDMuNDM1MjYxMyBoIC0yLjA4OTM3NyB6IG0gLTcuMTM2NDQ0LDEuNTc5MjQzMyB2IDQuOTQzOTU0MyBoIDAuNzQ4OTIgcSAxLjI4MDc2MSwwIDEuOTUzNzAzLC0wLjYzNDk1MzUgMC42NzgzNjksLTAuNjM0OTUzNSAwLjY3ODM2OSwtMS44NDUxNjQxIDAsLTEuMjA0NzgzNTUgLTAuNjcyOTQyLC0xLjgzNDMxMDExIC0wLjY3Mjk0MiwtMC42Mjk1MjY1OSAtMS45NTkxMywtMC42Mjk1MjY1OSB6IG0gLTIuMDg5Mzc3LC0xLjU3OTI0MzMgaCAyLjIwMzM0MyBxIDEuODQ1MTY0LDAgMi43NDYwMzksMC4yNjU5MjA3IDAuOTA2MzAxLDAuMjYwNDkzNyAxLjU1MjEwOCwwLjg5MDAyMDMgMC41Njk4MywwLjU0ODEyMjMgMC44NDY2MDUsMS4yNjQ0ODAwNiAwLjI3Njc3NCwwLjcxNjM1NzgxIDAuMjc2Nzc0LDEuNjIyNjU4OTQgMCwwLjkxNzE1NTEgLTAuMjc2Nzc0LDEuNjM4OTM5OSAtMC4yNzY3NzUsMC43MTYzNTc4IC0wLjg0NjYwNSwxLjI2NDQ4IC0wLjY1MTIzNCwwLjYyOTUyNjYgLTEuNTYyOTYyLDAuODk1NDQ3MyAtMC45MTE3MjgsMC4yNjA0OTM3IC0yLjczNTE4NSwwLjI2MDQ5MzcgaCAtMi4yMDMzNDMgeiBtIC04LjE0NTg1NjUsMCBoIDMuNDY3ODIzIHEgMS41NDY2ODE2LDAgMi4zNzE1Nzg1LDAuNjg5MjIzIDAuODMwMzI0LDAuNjgzNzk2MSAwLjgzMDMyNCwxLjk1MzcwMzE0IDAsMS4yNzUzMzM5NyAtMC44MzAzMjQsMS45NjQ1NTcwNiBRIDkuOTg3MTk2MSwyLjI3NDkxNSA4LjQ0MDUxNDUsMi4yNzQ5MTUgSCA3LjA2MjA2ODQgViA1LjA4NjA3NjcgSCA0Ljk3MjY5MTUgWiBtIDIuMDg5Mzc2OSwxLjUxNDExOTkgdiAyLjI2MzAzOTQzIGggMS4xNTU5NDEgcSAwLjYwNzgxODgsMCAwLjkzODg2MjksLTAuMjkzMDU1NDcgMC4zMzEwNDQxLC0wLjI5ODQ4MjQxIDAuMzMxMDQ0MSwtMC44NDExNzc3MiAwLC0wLjU0MjY5NTMxIC0wLjMzMTA0NDEsLTAuODM1NzUwNzQgLTAuMzMxMDQ0MSwtMC4yOTMwNTU1IC0wLjkzODg2MjksLTAuMjkzMDU1NSB6IgovPgo8L3N2Zz4K);
--jp-icon-python: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iLTEwIC0xMCAxMzEuMTYxMzYxNjk0MzM1OTQgMTMyLjM4ODk5OTkzODk2NDg0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMzA2OTk4IiBkPSJNIDU0LjkxODc4NSw5LjE5Mjc0MjFlLTQgQyA1MC4zMzUxMzIsMC4wMjIyMTcyNyA0NS45NTc4NDYsMC40MTMxMzY5NyA0Mi4xMDYyODUsMS4wOTQ2NjkzIDMwLjc2MDA2OSwzLjA5OTE3MzEgMjguNzAwMDM2LDcuMjk0NzcxNCAyOC43MDAwMzUsMTUuMDMyMTY5IHYgMTAuMjE4NzUgaCAyNi44MTI1IHYgMy40MDYyNSBoIC0yNi44MTI1IC0xMC4wNjI1IGMgLTcuNzkyNDU5LDAgLTE0LjYxNTc1ODgsNC42ODM3MTcgLTE2Ljc0OTk5OTgsMTMuNTkzNzUgLTIuNDYxODE5OTgsMTAuMjEyOTY2IC0yLjU3MTAxNTA4LDE2LjU4NjAyMyAwLDI3LjI1IDEuOTA1OTI4Myw3LjkzNzg1MiA2LjQ1NzU0MzIsMTMuNTkzNzQ4IDE0LjI0OTk5OTgsMTMuNTkzNzUgaCA5LjIxODc1IHYgLTEyLjI1IGMgMCwtOC44NDk5MDIgNy42NTcxNDQsLTE2LjY1NjI0OCAxNi43NSwtMTYuNjU2MjUgaCAyNi43ODEyNSBjIDcuNDU0OTUxLDAgMTMuNDA2MjUzLC02LjEzODE2NCAxMy40MDYyNSwtMTMuNjI1IHYgLTI1LjUzMTI1IGMgMCwtNy4yNjYzMzg2IC02LjEyOTk4LC0xMi43MjQ3NzcxIC0xMy40MDYyNSwtMTMuOTM3NDk5NyBDIDY0LjI4MTU0OCwwLjMyNzk0Mzk3IDU5LjUwMjQzOCwtMC4wMjAzNzkwMyA1NC45MTg3ODUsOS4xOTI3NDIxZS00IFogbSAtMTQuNSw4LjIxODc1MDEyNTc5IGMgMi43Njk1NDcsMCA1LjAzMTI1LDIuMjk4NjQ1NiA1LjAzMTI1LDUuMTI0OTk5NiAtMmUtNiwyLjgxNjMzNiAtMi4yNjE3MDMsNS4wOTM3NSAtNS4wMzEyNSw1LjA5Mzc1IC0yLjc3OTQ3NiwtMWUtNiAtNS4wMzEyNSwtMi4yNzc0MTUgLTUuMDMxMjUsLTUuMDkzNzUgLTEwZS03LC0yLjgyNjM1MyAyLjI1MTc3NCwtNS4xMjQ5OTk2IDUuMDMxMjUsLTUuMTI0OTk5NiB6Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI2ZmZDQzYiIgZD0ibSA4NS42Mzc1MzUsMjguNjU3MTY5IHYgMTEuOTA2MjUgYyAwLDkuMjMwNzU1IC03LjgyNTg5NSwxNi45OTk5OTkgLTE2Ljc1LDE3IGggLTI2Ljc4MTI1IGMgLTcuMzM1ODMzLDAgLTEzLjQwNjI0OSw2LjI3ODQ4MyAtMTMuNDA2MjUsMTMuNjI1IHYgMjUuNTMxMjQ3IGMgMCw3LjI2NjM0NCA2LjMxODU4OCwxMS41NDAzMjQgMTMuNDA2MjUsMTMuNjI1MDA0IDguNDg3MzMxLDIuNDk1NjEgMTYuNjI2MjM3LDIuOTQ2NjMgMjYuNzgxMjUsMCA2Ljc1MDE1NSwtMS45NTQzOSAxMy40MDYyNTMsLTUuODg3NjEgMTMuNDA2MjUsLTEzLjYyNTAwNCBWIDg2LjUwMDkxOSBoIC0yNi43ODEyNSB2IC0zLjQwNjI1IGggMjYuNzgxMjUgMTMuNDA2MjU0IGMgNy43OTI0NjEsMCAxMC42OTYyNTEsLTUuNDM1NDA4IDEzLjQwNjI0MSwtMTMuNTkzNzUgMi43OTkzMywtOC4zOTg4ODYgMi42ODAyMiwtMTYuNDc1Nzc2IDAsLTI3LjI1IC0xLjkyNTc4LC03Ljc1NzQ0MSAtNS42MDM4NywtMTMuNTkzNzUgLTEzLjQwNjI0MSwtMTMuNTkzNzUgeiBtIC0xNS4wNjI1LDY0LjY1NjI1IGMgMi43Nzk0NzgsM2UtNiA1LjAzMTI1LDIuMjc3NDE3IDUuMDMxMjUsNS4wOTM3NDcgLTJlLTYsMi44MjYzNTQgLTIuMjUxNzc1LDUuMTI1MDA0IC01LjAzMTI1LDUuMTI1MDA0IC0yLjc2OTU1LDAgLTUuMDMxMjUsLTIuMjk4NjUgLTUuMDMxMjUsLTUuMTI1MDA0IDJlLTYsLTIuODE2MzMgMi4yNjE2OTcsLTUuMDkzNzQ3IDUuMDMxMjUsLTUuMDkzNzQ3IHoiLz4KPC9zdmc+Cg==);
--jp-icon-r-kernel: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMjE5NkYzIiBkPSJNNC40IDIuNWMxLjItLjEgMi45LS4zIDQuOS0uMyAyLjUgMCA0LjEuNCA1LjIgMS4zIDEgLjcgMS41IDEuOSAxLjUgMy41IDAgMi0xLjQgMy41LTIuOSA0LjEgMS4yLjQgMS43IDEuNiAyLjIgMyAuNiAxLjkgMSAzLjkgMS4zIDQuNmgtMy44Yy0uMy0uNC0uOC0xLjctMS4yLTMuN3MtMS4yLTIuNi0yLjYtMi42aC0uOXY2LjRINC40VjIuNXptMy43IDYuOWgxLjRjMS45IDAgMi45LS45IDIuOS0yLjNzLTEtMi4zLTIuOC0yLjNjLS43IDAtMS4zIDAtMS42LjJ2NC41aC4xdi0uMXoiLz4KPC9zdmc+Cg==);
--jp-icon-react: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMTUwIDE1MCA1NDEuOSAyOTUuMyI+CiAgPGcgY2xhc3M9ImpwLWljb24tYnJhbmQyIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzYxREFGQiI+CiAgICA8cGF0aCBkPSJNNjY2LjMgMjk2LjVjMC0zMi41LTQwLjctNjMuMy0xMDMuMS04Mi40IDE0LjQtNjMuNiA4LTExNC4yLTIwLjItMTMwLjQtNi41LTMuOC0xNC4xLTUuNi0yMi40LTUuNnYyMi4zYzQuNiAwIDguMy45IDExLjQgMi42IDEzLjYgNy44IDE5LjUgMzcuNSAxNC45IDc1LjctMS4xIDkuNC0yLjkgMTkuMy01LjEgMjkuNC0xOS42LTQuOC00MS04LjUtNjMuNS0xMC45LTEzLjUtMTguNS0yNy41LTM1LjMtNDEuNi01MCAzMi42LTMwLjMgNjMuMi00Ni45IDg0LTQ2LjlWNzhjLTI3LjUgMC02My41IDE5LjYtOTkuOSA1My42LTM2LjQtMzMuOC03Mi40LTUzLjItOTkuOS01My4ydjIyLjNjMjAuNyAwIDUxLjQgMTYuNSA4NCA0Ni42LTE0IDE0LjctMjggMzEuNC00MS4zIDQ5LjktMjIuNiAyLjQtNDQgNi4xLTYzLjYgMTEtMi4zLTEwLTQtMTkuNy01LjItMjktNC43LTM4LjIgMS4xLTY3LjkgMTQuNi03NS44IDMtMS44IDYuOS0yLjYgMTEuNS0yLjZWNzguNWMtOC40IDAtMTYgMS44LTIyLjYgNS42LTI4LjEgMTYuMi0zNC40IDY2LjctMTkuOSAxMzAuMS02Mi4yIDE5LjItMTAyLjcgNDkuOS0xMDIuNyA4Mi4zIDAgMzIuNSA0MC43IDYzLjMgMTAzLjEgODIuNC0xNC40IDYzLjYtOCAxMTQuMiAyMC4yIDEzMC40IDYuNSAzLjggMTQuMSA1LjYgMjIuNSA1LjYgMjcuNSAwIDYzLjUtMTkuNiA5OS45LTUzLjYgMzYuNCAzMy44IDcyLjQgNTMuMiA5OS45IDUzLjIgOC40IDAgMTYtMS44IDIyLjYtNS42IDI4LjEtMTYuMiAzNC40LTY2LjcgMTkuOS0xMzAuMSA2Mi0xOS4xIDEwMi41LTQ5LjkgMTAyLjUtODIuM3ptLTEzMC4yLTY2LjdjLTMuNyAxMi45LTguMyAyNi4yLTEzLjUgMzkuNS00LjEtOC04LjQtMTYtMTMuMS0yNC00LjYtOC05LjUtMTUuOC0xNC40LTIzLjQgMTQuMiAyLjEgMjcuOSA0LjcgNDEgNy45em0tNDUuOCAxMDYuNWMtNy44IDEzLjUtMTUuOCAyNi4zLTI0LjEgMzguMi0xNC45IDEuMy0zMCAyLTQ1LjIgMi0xNS4xIDAtMzAuMi0uNy00NS0xLjktOC4zLTExLjktMTYuNC0yNC42LTI0LjItMzgtNy42LTEzLjEtMTQuNS0yNi40LTIwLjgtMzkuOCA2LjItMTMuNCAxMy4yLTI2LjggMjAuNy0zOS45IDcuOC0xMy41IDE1LjgtMjYuMyAyNC4xLTM4LjIgMTQuOS0xLjMgMzAtMiA0NS4yLTIgMTUuMSAwIDMwLjIuNyA0NSAxLjkgOC4zIDExLjkgMTYuNCAyNC42IDI0LjIgMzggNy42IDEzLjEgMTQuNSAyNi40IDIwLjggMzkuOC02LjMgMTMuNC0xMy4yIDI2LjgtMjAuNyAzOS45em0zMi4zLTEzYzUuNCAxMy40IDEwIDI2LjggMTMuOCAzOS44LTEzLjEgMy4yLTI2LjkgNS45LTQxLjIgOCA0LjktNy43IDkuOC0xNS42IDE0LjQtMjMuNyA0LjYtOCA4LjktMTYuMSAxMy0yNC4xek00MjEuMiA0MzBjLTkuMy05LjYtMTguNi0yMC4zLTI3LjgtMzIgOSAuNCAxOC4yLjcgMjcuNS43IDkuNCAwIDE4LjctLjIgMjcuOC0uNy05IDExLjctMTguMyAyMi40LTI3LjUgMzJ6bS03NC40LTU4LjljLTE0LjItMi4xLTI3LjktNC43LTQxLTcuOSAzLjctMTIuOSA4LjMtMjYuMiAxMy41LTM5LjUgNC4xIDggOC40IDE2IDEzLjEgMjQgNC43IDggOS41IDE1LjggMTQuNCAyMy40ek00MjAuNyAxNjNjOS4zIDkuNiAxOC42IDIwLjMgMjcuOCAzMi05LS40LTE4LjItLjctMjcuNS0uNy05LjQgMC0xOC43LjItMjcuOC43IDktMTEuNyAxOC4zLTIyLjQgMjcuNS0zMnptLTc0IDU4LjljLTQuOSA3LjctOS44IDE1LjYtMTQuNCAyMy43LTQuNiA4LTguOSAxNi0xMyAyNC01LjQtMTMuNC0xMC0yNi44LTEzLjgtMzkuOCAxMy4xLTMuMSAyNi45LTUuOCA0MS4yLTcuOXptLTkwLjUgMTI1LjJjLTM1LjQtMTUuMS01OC4zLTM0LjktNTguMy01MC42IDAtMTUuNyAyMi45LTM1LjYgNTguMy01MC42IDguNi0zLjcgMTgtNyAyNy43LTEwLjEgNS43IDE5LjYgMTMuMiA0MCAyMi41IDYwLjktOS4yIDIwLjgtMTYuNiA0MS4xLTIyLjIgNjAuNi05LjktMy4xLTE5LjMtNi41LTI4LTEwLjJ6TTMxMCA0OTBjLTEzLjYtNy44LTE5LjUtMzcuNS0xNC45LTc1LjcgMS4xLTkuNCAyLjktMTkuMyA1LjEtMjkuNCAxOS42IDQuOCA0MSA4LjUgNjMuNSAxMC45IDEzLjUgMTguNSAyNy41IDM1LjMgNDEuNiA1MC0zMi42IDMwLjMtNjMuMiA0Ni45LTg0IDQ2LjktNC41LS4xLTguMy0xLTExLjMtMi43em0yMzcuMi03Ni4yYzQuNyAzOC4yLTEuMSA2Ny45LTE0LjYgNzUuOC0zIDEuOC02LjkgMi42LTExLjUgMi42LTIwLjcgMC01MS40LTE2LjUtODQtNDYuNiAxNC0xNC43IDI4LTMxLjQgNDEuMy00OS45IDIyLjYtMi40IDQ0LTYuMSA2My42LTExIDIuMyAxMC4xIDQuMSAxOS44IDUuMiAyOS4xem0zOC41LTY2LjdjLTguNiAzLjctMTggNy0yNy43IDEwLjEtNS43LTE5LjYtMTMuMi00MC0yMi41LTYwLjkgOS4yLTIwLjggMTYuNi00MS4xIDIyLjItNjAuNiA5LjkgMy4xIDE5LjMgNi41IDI4LjEgMTAuMiAzNS40IDE1LjEgNTguMyAzNC45IDU4LjMgNTAuNi0uMSAxNS43LTIzIDM1LjYtNTguNCA1MC42ek0zMjAuOCA3OC40eiIvPgogICAgPGNpcmNsZSBjeD0iNDIwLjkiIGN5PSIyOTYuNSIgcj0iNDUuNyIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-redo: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE4LjQgMTAuNkMxNi41NSA4Ljk5IDE0LjE1IDggMTEuNSA4Yy00LjY1IDAtOC41OCAzLjAzLTkuOTYgNy4yMkwzLjkgMTZjMS4wNS0zLjE5IDQuMDUtNS41IDcuNi01LjUgMS45NSAwIDMuNzMuNzIgNS4xMiAxLjg4TDEzIDE2aDlWN2wtMy42IDMuNnoiLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-refresh: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTkgMTMuNWMtMi40OSAwLTQuNS0yLjAxLTQuNS00LjVTNi41MSA0LjUgOSA0LjVjMS4yNCAwIDIuMzYuNTIgMy4xNyAxLjMzTDEwIDhoNVYzbC0xLjc2IDEuNzZDMTIuMTUgMy42OCAxMC42NiAzIDkgMyA1LjY5IDMgMy4wMSA1LjY5IDMuMDEgOVM1LjY5IDE1IDkgMTVjMi45NyAwIDUuNDMtMi4xNiA1LjktNWgtMS41MmMtLjQ2IDItMi4yNCAzLjUtNC4zOCAzLjV6Ii8+CiAgICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-regex: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0MTQxNDEiPgogICAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbi1hY2NlbnQyIiBmaWxsPSIjRkZGIj4KICAgIDxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjUuNSIgY3k9IjE0LjUiIHI9IjEuNSIvPgogICAgPHJlY3QgeD0iMTIiIHk9IjQiIGNsYXNzPSJzdDIiIHdpZHRoPSIxIiBoZWlnaHQ9IjgiLz4KICAgIDxyZWN0IHg9IjguNSIgeT0iNy41IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjg2NiAtMC41IDAuNSAwLjg2NiAtMi4zMjU1IDcuMzIxOSkiIGNsYXNzPSJzdDIiIHdpZHRoPSI4IiBoZWlnaHQ9IjEiLz4KICAgIDxyZWN0IHg9IjEyIiB5PSI0IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjUgLTAuODY2IDAuODY2IDAuNSAtMC42Nzc5IDE0LjgyNTIpIiBjbGFzcz0ic3QyIiB3aWR0aD0iMSIgaGVpZ2h0PSI4Ii8+CiAgPC9nPgo8L3N2Zz4K);
--jp-icon-run: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTggNXYxNGwxMS03eiIvPgogICAgPC9nPgo8L3N2Zz4K);
--jp-icon-running: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUxMiA1MTIiPgogIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICA8cGF0aCBkPSJNMjU2IDhDMTE5IDggOCAxMTkgOCAyNTZzMTExIDI0OCAyNDggMjQ4IDI0OC0xMTEgMjQ4LTI0OFMzOTMgOCAyNTYgOHptOTYgMzI4YzAgOC44LTcuMiAxNi0xNiAxNkgxNzZjLTguOCAwLTE2LTcuMi0xNi0xNlYxNzZjMC04LjggNy4yLTE2IDE2LTE2aDE2MGM4LjggMCAxNiA3LjIgMTYgMTZ2MTYweiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-save: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTE3IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdsLTQtNHptLTUgMTZjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzem0zLTEwSDVWNWgxMHY0eiIvPgogICAgPC9nPgo8L3N2Zz4K);
--jp-icon-search: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyLjEsMTAuOWgtMC43bC0wLjItMC4yYzAuOC0wLjksMS4zLTIuMiwxLjMtMy41YzAtMy0yLjQtNS40LTUuNC01LjRTMS44LDQuMiwxLjgsNy4xczIuNCw1LjQsNS40LDUuNCBjMS4zLDAsMi41LTAuNSwzLjUtMS4zbDAuMiwwLjJ2MC43bDQuMSw0LjFsMS4yLTEuMkwxMi4xLDEwLjl6IE03LjEsMTAuOWMtMi4xLDAtMy43LTEuNy0zLjctMy43czEuNy0zLjcsMy43LTMuN3MzLjcsMS43LDMuNywzLjcgUzkuMiwxMC45LDcuMSwxMC45eiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-settings: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVBLjQ4OC40ODggMCAwMDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiLz4KPC9zdmc+Cg==);
--jp-icon-share: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTSAxOCAyIEMgMTYuMzU0OTkgMiAxNSAzLjM1NDk5MDQgMTUgNSBDIDE1IDUuMTkwOTUyOSAxNS4wMjE3OTEgNS4zNzcxMjI0IDE1LjA1NjY0MSA1LjU1ODU5MzggTCA3LjkyMTg3NSA5LjcyMDcwMzEgQyA3LjM5ODUzOTkgOS4yNzc4NTM5IDYuNzMyMDc3MSA5IDYgOSBDIDQuMzU0OTkwNCA5IDMgMTAuMzU0OTkgMyAxMiBDIDMgMTMuNjQ1MDEgNC4zNTQ5OTA0IDE1IDYgMTUgQyA2LjczMjA3NzEgMTUgNy4zOTg1Mzk5IDE0LjcyMjE0NiA3LjkyMTg3NSAxNC4yNzkyOTcgTCAxNS4wNTY2NDEgMTguNDM5NDUzIEMgMTUuMDIxNTU1IDE4LjYyMTUxNCAxNSAxOC44MDgzODYgMTUgMTkgQyAxNSAyMC42NDUwMSAxNi4zNTQ5OSAyMiAxOCAyMiBDIDE5LjY0NTAxIDIyIDIxIDIwLjY0NTAxIDIxIDE5IEMgMjEgMTcuMzU0OTkgMTkuNjQ1MDEgMTYgMTggMTYgQyAxNy4yNjc0OCAxNiAxNi42MDE1OTMgMTYuMjc5MzI4IDE2LjA3ODEyNSAxNi43MjI2NTYgTCA4Ljk0MzM1OTQgMTIuNTU4NTk0IEMgOC45NzgyMDk1IDEyLjM3NzEyMiA5IDEyLjE5MDk1MyA5IDEyIEMgOSAxMS44MDkwNDcgOC45NzgyMDk1IDExLjYyMjg3OCA4Ljk0MzM1OTQgMTEuNDQxNDA2IEwgMTYuMDc4MTI1IDcuMjc5Mjk2OSBDIDE2LjYwMTQ2IDcuNzIyMTQ2MSAxNy4yNjc5MjMgOCAxOCA4IEMgMTkuNjQ1MDEgOCAyMSA2LjY0NTAwOTYgMjEgNSBDIDIxIDMuMzU0OTkwNCAxOS42NDUwMSAyIDE4IDIgeiBNIDE4IDQgQyAxOC41NjQxMjkgNCAxOSA0LjQzNTg3MDYgMTkgNSBDIDE5IDUuNTY0MTI5NCAxOC41NjQxMjkgNiAxOCA2IEMgMTcuNDM1ODcxIDYgMTcgNS41NjQxMjk0IDE3IDUgQyAxNyA0LjQzNTg3MDYgMTcuNDM1ODcxIDQgMTggNCB6IE0gNiAxMSBDIDYuNTY0MTI5NCAxMSA3IDExLjQzNTg3MSA3IDEyIEMgNyAxMi41NjQxMjkgNi41NjQxMjk0IDEzIDYgMTMgQyA1LjQzNTg3MDYgMTMgNSAxMi41NjQxMjkgNSAxMiBDIDUgMTEuNDM1ODcxIDUuNDM1ODcwNiAxMSA2IDExIHogTSAxOCAxOCBDIDE4LjU2NDEyOSAxOCAxOSAxOC40MzU4NzEgMTkgMTkgQyAxOSAxOS41NjQxMjkgMTguNTY0MTI5IDIwIDE4IDIwIEMgMTcuNDM1ODcxIDIwIDE3IDE5LjU2NDEyOSAxNyAxOSBDIDE3IDE4LjQzNTg3MSAxNy40MzU4NzEgMTggMTggMTggeiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-spreadsheet: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDEganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNENBRjUwIiBkPSJNMi4yIDIuMnYxNy42aDE3LjZWMi4ySDIuMnptMTUuNCA3LjdoLTUuNVY0LjRoNS41djUuNXpNOS45IDQuNHY1LjVINC40VjQuNGg1LjV6bS01LjUgNy43aDUuNXY1LjVINC40di01LjV6bTcuNyA1LjV2LTUuNWg1LjV2NS41aC01LjV6Ii8+Cjwvc3ZnPgo=);
--jp-icon-stop: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik02IDZoMTJ2MTJINnoiLz4KICAgIDwvZz4KPC9zdmc+Cg==);
--jp-icon-tab: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDNWNWgxMHY0aDh2MTB6Ii8+CiAgPC9nPgo8L3N2Zz4K);
--jp-icon-table-rows: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yMSw4SDNWNGgxOFY4eiBNMjEsMTBIM3Y0aDE4VjEweiBNMjEsMTZIM3Y0aDE4VjE2eiIvPgogICAgPC9nPgo8L3N2Zz4K);
--jp-icon-tag: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCA0MyAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTI4LjgzMzIgMTIuMzM0TDMyLjk5OTggMTYuNTAwN0wzNy4xNjY1IDEyLjMzNEgyOC44MzMyWiIvPgoJCTxwYXRoIGQ9Ik0xNi4yMDk1IDIxLjYxMDRDMTUuNjg3MyAyMi4xMjk5IDE0Ljg0NDMgMjIuMTI5OSAxNC4zMjQ4IDIxLjYxMDRMNi45ODI5IDE0LjcyNDVDNi41NzI0IDE0LjMzOTQgNi4wODMxMyAxMy42MDk4IDYuMDQ3ODYgMTMuMDQ4MkM1Ljk1MzQ3IDExLjUyODggNi4wMjAwMiA4LjYxOTQ0IDYuMDY2MjEgNy4wNzY5NUM2LjA4MjgxIDYuNTE0NzcgNi41NTU0OCA2LjA0MzQ3IDcuMTE4MDQgNi4wMzA1NUM5LjA4ODYzIDUuOTg0NzMgMTMuMjYzOCA1LjkzNTc5IDEzLjY1MTggNi4zMjQyNUwyMS43MzY5IDEzLjYzOUMyMi4yNTYgMTQuMTU4NSAyMS43ODUxIDE1LjQ3MjQgMjEuMjYyIDE1Ljk5NDZMMTYuMjA5NSAyMS42MTA0Wk05Ljc3NTg1IDguMjY1QzkuMzM1NTEgNy44MjU2NiA4LjYyMzUxIDcuODI1NjYgOC4xODI4IDguMjY1QzcuNzQzNDYgOC43MDU3MSA3Ljc0MzQ2IDkuNDE3MzMgOC4xODI4IDkuODU2NjdDOC42MjM4MiAxMC4yOTY0IDkuMzM1ODIgMTAuMjk2NCA5Ljc3NTg1IDkuODU2NjdDMTAuMjE1NiA5LjQxNzMzIDEwLjIxNTYgOC43MDUzMyA5Ljc3NTg1IDguMjY1WiIvPgoJPC9nPgo8L3N2Zz4K);
--jp-icon-terminal: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiA+CiAgICA8cmVjdCBjbGFzcz0ianAtdGVybWluYWwtaWNvbi1iYWNrZ3JvdW5kLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZSIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIiBmaWxsPSIjMzMzMzMzIi8+CiAgICA8cGF0aCBjbGFzcz0ianAtdGVybWluYWwtaWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUtaW52ZXJzZSIgZD0iTTUuMDU2NjQgOC43NjE3MkM1LjA1NjY0IDguNTk3NjYgNS4wMzEyNSA4LjQ1MzEyIDQuOTgwNDcgOC4zMjgxMkM0LjkzMzU5IDguMTk5MjIgNC44NTU0NyA4LjA4MjAzIDQuNzQ2MDkgNy45NzY1NkM0LjY0MDYyIDcuODcxMDkgNC41IDcuNzc1MzkgNC4zMjQyMiA3LjY4OTQ1QzQuMTUyMzQgNy41OTk2MSAzLjk0MzM2IDcuNTExNzIgMy42OTcyNyA3LjQyNTc4QzMuMzAyNzMgNy4yODUxNiAyLjk0MzM2IDcuMTM2NzIgMi42MTkxNCA2Ljk4MDQ3QzIuMjk0OTIgNi44MjQyMiAyLjAxNzU4IDYuNjQyNTggMS43ODcxMSA2LjQzNTU1QzEuNTYwNTUgNi4yMjg1MiAxLjM4NDc3IDUuOTg4MjggMS4yNTk3NyA1LjcxNDg0QzEuMTM0NzcgNS40Mzc1IDEuMDcyMjcgNS4xMDkzOCAxLjA3MjI3IDQuNzMwNDdDMS4wNzIyNyA0LjM5ODQ0IDEuMTI4OTEgNC4wOTU3IDEuMjQyMTkgMy44MjIyN0MxLjM1NTQ3IDMuNTQ0OTIgMS41MTU2MiAzLjMwNDY5IDEuNzIyNjYgMy4xMDE1NkMxLjkyOTY5IDIuODk4NDQgMi4xNzk2OSAyLjczNDM3IDIuNDcyNjYgMi42MDkzOEMyLjc2NTYyIDIuNDg0MzggMy4wOTE4IDIuNDA0MyAzLjQ1MTE3IDIuMzY5MTRWMS4xMDkzOEg0LjM4ODY3VjIuMzgwODZDNC43NDAyMyAyLjQyNzczIDUuMDU2NjQgMi41MjM0NCA1LjMzNzg5IDIuNjY3OTdDNS42MTkxNCAyLjgxMjUgNS44NTc0MiAzLjAwMTk1IDYuMDUyNzMgMy4yMzYzM0M2LjI1MTk1IDMuNDY2OCA2LjQwNDMgMy43NDAyMyA2LjUwOTc3IDQuMDU2NjRDNi42MTkxNCA0LjM2OTE0IDYuNjczODMgNC43MjA3IDYuNjczODMgNS4xMTEzM0g1LjA0NDkyQzUuMDQ0OTIgNC42Mzg2NyA0LjkzNzUgNC4yODEyNSA0LjcyMjY2IDQuMDM5MDZDNC41MDc4MSAzLjc5Mjk3IDQuMjE2OCAzLjY2OTkyIDMuODQ5NjEgMy42Njk5MkMzLjY1MDM5IDMuNjY5OTIgMy40NzY1NiAzLjY5NzI3IDMuMzI4MTIgMy43NTE5NUMzLjE4MzU5IDMuODAyNzMgMy4wNjQ0NSAzLjg3Njk1IDIuOTcwNyAzLjk3NDYxQzIuODc2OTUgNC4wNjgzNiAyLjgwNjY0IDQuMTc5NjkgMi43NTk3NyA0LjMwODU5QzIuNzE2OCA0LjQzNzUgMi42OTUzMSA0LjU3ODEyIDIuNjk1MzEgNC43MzA0N0MyLjY5NTMxIDQuODgyODEgMi43MTY4IDUuMDE5NTMgMi43NTk3NyA1LjE0MDYyQzIuODA2NjQgNS4yNTc4MSAyLjg4MjgxIDUuMzY3MTkgMi45ODgyOCA1LjQ2ODc1QzMuMDk3NjYgNS41NzAzMSAzLjI0MDIzIDUuNjY3OTcgMy40MTYwMiA1Ljc2MTcyQzMuNTkxOCA1Ljg1MTU2IDMuODEwNTUgNS45NDMzNiA0LjA3MjI3IDYuMDM3MTFDNC40NjY4IDYuMTg1NTUgNC44MjQyMiA2LjMzOTg0IDUuMTQ0NTMgNi41QzUuNDY0ODQgNi42NTYyNSA1LjczODI4IDYuODM5ODQgNS45NjQ4NCA3LjA1MDc4QzYuMTk1MzEgNy4yNTc4MSA2LjM3MTA5IDcuNSA2LjQ5MjE5IDcuNzc3MzRDNi42MTcxOSA4LjA1MDc4IDYuNjc5NjkgOC4zNzUgNi42Nzk2OSA4Ljc1QzYuNjc5NjkgOS4wOTM3NSA2LjYyMzA1IDkuNDA0MyA2LjUwOTc3IDkuNjgxNjRDNi4zOTY0OCA5Ljk1NTA4IDYuMjM0MzggMTAuMTkxNCA2LjAyMzQ0IDEwLjM5MDZDNS44MTI1IDEwLjU4OTggNS41NTg1OSAxMC43NSA1LjI2MTcyIDEwLjg3MTFDNC45NjQ4NCAxMC45ODgzIDQuNjMyODEgMTEuMDY0NSA0LjI2NTYyIDExLjA5OTZWMTIuMjQ4SDMuMzMzOThWMTEuMDk5NkMzLjAwMTk1IDExLjA2ODQgMi42Nzk2OSAxMC45OTYxIDIuMzY3MTkgMTAuODgyOEMyLjA1NDY5IDEwLjc2NTYgMS43NzczNCAxMC41OTc3IDEuNTM1MTYgMTAuMzc4OUMxLjI5Njg4IDEwLjE2MDIgMS4xMDU0NyA5Ljg4NDc3IDAuOTYwOTM4IDkuNTUyNzNDMC44MTY0MDYgOS4yMTY4IDAuNzQ0MTQxIDguODE0NDUgMC43NDQxNDEgOC4zNDU3SDIuMzc4OTFDMi4zNzg5MSA4LjYyNjk1IDIuNDE5OTIgOC44NjMyOCAyLjUwMTk1IDkuMDU0NjlDMi41ODM5OCA5LjI0MjE5IDIuNjg5NDUgOS4zOTI1OCAyLjgxODM2IDkuNTA1ODZDMi45NTExNyA5LjYxNTIzIDMuMTAxNTYgOS42OTMzNiAzLjI2OTUzIDkuNzQwMjNDMy40Mzc1IDkuNzg3MTEgMy42MDkzOCA5LjgxMDU1IDMuNzg1MTYgOS44MTA1NUM0LjIwMzEyIDkuODEwNTUgNC41MTk1MyA5LjcxMjg5IDQuNzM0MzggOS41MTc1OEM0Ljk0OTIyIDkuMzIyMjcgNS4wNTY2NCA5LjA3MDMxIDUuMDU2NjQgOC43NjE3MlpNMTMuNDE4IDEyLjI3MTVIOC4wNzQyMlYxMUgxMy40MThWMTIuMjcxNVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMuOTUyNjQgNikiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=);
--jp-icon-text-editor: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtdGV4dC1lZGl0b3ItaWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xNSAxNUgzdjJoMTJ2LTJ6bTAtOEgzdjJoMTJWN3pNMyAxM2gxOHYtMkgzdjJ6bTAgOGgxOHYtMkgzdjJ6TTMgM3YyaDE4VjNIM3oiLz4KPC9zdmc+Cg==);
--jp-icon-toc: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik03LDVIMjFWN0g3VjVNNywxM1YxMUgyMVYxM0g3TTQsNC41QTEuNSwxLjUgMCAwLDEgNS41LDZBMS41LDEuNSAwIDAsMSA0LDcuNUExLjUsMS41IDAgMCwxIDIuNSw2QTEuNSwxLjUgMCAwLDEgNCw0LjVNNCwxMC41QTEuNSwxLjUgMCAwLDEgNS41LDEyQTEuNSwxLjUgMCAwLDEgNCwxMy41QTEuNSwxLjUgMCAwLDEgMi41LDEyQTEuNSwxLjUgMCAwLDEgNCwxMC41TTcsMTlWMTdIMjFWMTlIN000LDE2LjVBMS41LDEuNSAwIDAsMSA1LjUsMThBMS41LDEuNSAwIDAsMSA0LDE5LjVBMS41LDEuNSAwIDAsMSAyLjUsMThBMS41LDEuNSAwIDAsMSA0LDE2LjVaIiAvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-tree-view: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yMiAxMVYzaC03djNIOVYzSDJ2OGg3VjhoMnYxMGg0djNoN3YtOGgtN3YzaC0yVjhoMnYzeiIvPgogICAgPC9nPgo8L3N2Zz4K);
--jp-icon-trusted: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI1Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMykiIGQ9Ik0xLjg2MDk0IDExLjQ0MDlDMC44MjY0NDggOC43NzAyNyAwLjg2Mzc3OSA2LjA1NzY0IDEuMjQ5MDcgNC4xOTkzMkMyLjQ4MjA2IDMuOTMzNDcgNC4wODA2OCAzLjQwMzQ3IDUuNjAxMDIgMi44NDQ5QzcuMjM1NDkgMi4yNDQ0IDguODU2NjYgMS41ODE1IDkuOTg3NiAxLjA5NTM5QzExLjA1OTcgMS41ODM0MSAxMi42MDk0IDIuMjQ0NCAxNC4yMTggMi44NDMzOUMxNS43NTAzIDMuNDEzOTQgMTcuMzk5NSAzLjk1MjU4IDE4Ljc1MzkgNC4yMTM4NUMxOS4xMzY0IDYuMDcxNzcgMTkuMTcwOSA4Ljc3NzIyIDE4LjEzOSAxMS40NDA5QzE3LjAzMDMgMTQuMzAzMiAxNC42NjY4IDE3LjE4NDQgOS45OTk5OSAxOC45MzU0QzUuMzMzMiAxNy4xODQ0IDIuOTY5NjggMTQuMzAzMiAxLjg2MDk0IDExLjQ0MDlaIi8+CiAgICA8cGF0aCBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiMzMzMzMzMiIHN0cm9rZT0iIzMzMzMzMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOCA5Ljg2NzE5KSIgZD0iTTIuODYwMTUgNC44NjUzNUwwLjcyNjU0OSAyLjk5OTU5TDAgMy42MzA0NUwyLjg2MDE1IDYuMTMxNTdMOCAwLjYzMDg3Mkw3LjI3ODU3IDBMMi44NjAxNSA0Ljg2NTM1WiIvPgo8L3N2Zz4K);
--jp-icon-undo: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyLjUgOGMtMi42NSAwLTUuMDUuOTktNi45IDIuNkwyIDd2OWg5bC0zLjYyLTMuNjJjMS4zOS0xLjE2IDMuMTYtMS44OCA1LjEyLTEuODggMy41NCAwIDYuNTUgMi4zMSA3LjYgNS41bDIuMzctLjc4QzIxLjA4IDExLjAzIDE3LjE1IDggMTIuNSA4eiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-user: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE2IDdhNCA0IDAgMTEtOCAwIDQgNCAwIDAxOCAwek0xMiAxNGE3IDcgMCAwMC03IDdoMTRhNyA3IDAgMDAtNy03eiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-users: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDM2IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogPGcgY2xhc3M9ImpwLWljb24zIiB0cmFuc2Zvcm09Im1hdHJpeCgxLjczMjcgMCAwIDEuNzMyNyAtMy42MjgyIC4wOTk1NzcpIiBmaWxsPSIjNjE2MTYxIj4KICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjUsMCwwLDEuNSwwLC02KSIgZD0ibTEyLjE4NiA3LjUwOThjLTEuMDUzNSAwLTEuOTc1NyAwLjU2NjUtMi40Nzg1IDEuNDEwMiAwLjc1MDYxIDAuMzEyNzcgMS4zOTc0IDAuODI2NDggMS44NzMgMS40NzI3aDMuNDg2M2MwLTEuNTkyLTEuMjg4OS0yLjg4MjgtMi44ODA5LTIuODgyOHoiLz4KICA8cGF0aCBkPSJtMjAuNDY1IDIuMzg5NWEyLjE4ODUgMi4xODg1IDAgMCAxLTIuMTg4NCAyLjE4ODUgMi4xODg1IDIuMTg4NSAwIDAgMS0yLjE4ODUtMi4xODg1IDIuMTg4NSAyLjE4ODUgMCAwIDEgMi4xODg1LTIuMTg4NSAyLjE4ODUgMi4xODg1IDAgMCAxIDIuMTg4NCAyLjE4ODV6Ii8+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS41LDAsMCwxLjUsMCwtNikiIGQ9Im0zLjU4OTggOC40MjE5Yy0xLjExMjYgMC0yLjAxMzcgMC45MDExMS0yLjAxMzcgMi4wMTM3aDIuODE0NWMwLjI2Nzk3LTAuMzczMDkgMC41OTA3LTAuNzA0MzUgMC45NTg5OC0wLjk3ODUyLTAuMzQ0MzMtMC42MTY4OC0xLjAwMzEtMS4wMzUyLTEuNzU5OC0xLjAzNTJ6Ii8+CiAgPHBhdGggZD0ibTYuOTE1NCA0LjYyM2ExLjUyOTQgMS41Mjk0IDAgMCAxLTEuNTI5NCAxLjUyOTQgMS41Mjk0IDEuNTI5NCAwIDAgMS0xLjUyOTQtMS41Mjk0IDEuNTI5NCAxLjUyOTQgMCAwIDEgMS41Mjk0LTEuNTI5NCAxLjUyOTQgMS41Mjk0IDAgMCAxIDEuNTI5NCAxLjUyOTR6Ii8+CiAgPHBhdGggZD0ibTYuMTM1IDEzLjUzNWMwLTMuMjM5MiAyLjYyNTktNS44NjUgNS44NjUtNS44NjUgMy4yMzkyIDAgNS44NjUgMi42MjU5IDUuODY1IDUuODY1eiIvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMy43Njg1IiByPSIyLjk2ODUiLz4KIDwvZz4KPC9zdmc+Cg==);
--jp-icon-vega: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbjEganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMjEyMTIxIj4KICAgIDxwYXRoIGQ9Ik0xMC42IDUuNGwyLjItMy4ySDIuMnY3LjNsNC02LjZ6Ii8+CiAgICA8cGF0aCBkPSJNMTUuOCAyLjJsLTQuNCA2LjZMNyA2LjNsLTQuOCA4djUuNWgxNy42VjIuMmgtNHptLTcgMTUuNEg1LjV2LTQuNGgzLjN2NC40em00LjQgMEg5LjhWOS44aDMuNHY3Ljh6bTQuNCAwaC0zLjRWNi41aDMuNHYxMS4xeiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-word: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KIDxnIGNsYXNzPSJqcC1pY29uMiIgZmlsbD0iIzQxNDE0MSI+CiAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiA8L2c+CiA8ZyBjbGFzcz0ianAtaWNvbi1hY2NlbnQyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSguNDMgLjA0MDEpIiBmaWxsPSIjZmZmIj4KICA8cGF0aCBkPSJtNC4xNCA4Ljc2cTAuMDY4Mi0xLjg5IDIuNDItMS44OSAxLjE2IDAgMS42OCAwLjQyIDAuNTY3IDAuNDEgMC41NjcgMS4xNnYzLjQ3cTAgMC40NjIgMC41MTQgMC40NjIgMC4xMDMgMCAwLjItMC4wMjMxdjAuNzE0cS0wLjM5OSAwLjEwMy0wLjY1MSAwLjEwMy0wLjQ1MiAwLTAuNjkzLTAuMjItMC4yMzEtMC4yLTAuMjg0LTAuNjYyLTAuOTU2IDAuODcyLTIgMC44NzItMC45MDMgMC0xLjQ3LTAuNDcyLTAuNTI1LTAuNDcyLTAuNTI1LTEuMjYgMC0wLjI2MiAwLjA0NTItMC40NzIgMC4wNTY3LTAuMjIgMC4xMTYtMC4zNzggMC4wNjgyLTAuMTY4IDAuMjMxLTAuMzA0IDAuMTU4LTAuMTQ3IDAuMjYyLTAuMjQyIDAuMTE2LTAuMDkxNCAwLjM2OC0wLjE2OCAwLjI2Mi0wLjA5MTQgMC4zOTktMC4xMjYgMC4xMzYtMC4wNDUyIDAuNDcyLTAuMTAzIDAuMzM2LTAuMDU3OCAwLjUwNC0wLjA3OTggMC4xNTgtMC4wMjMxIDAuNTY3LTAuMDc5OCAwLjU1Ni0wLjA2ODIgMC43NzctMC4yMjEgMC4yMi0wLjE1MiAwLjIyLTAuNDQxdi0wLjI1MnEwLTAuNDMtMC4zNTctMC42NjItMC4zMzYtMC4yMzEtMC45NzYtMC4yMzEtMC42NjIgMC0wLjk5OCAwLjI2Mi0wLjMzNiAwLjI1Mi0wLjM5OSAwLjc5OHptMS44OSAzLjY4cTAuNzg4IDAgMS4yNi0wLjQxIDAuNTA0LTAuNDIgMC41MDQtMC45MDN2LTEuMDVxLTAuMjg0IDAuMTM2LTAuODYxIDAuMjMxLTAuNTY3IDAuMDkxNC0wLjk4NyAwLjE1OC0wLjQyIDAuMDY4Mi0wLjc2NiAwLjMyNi0wLjMzNiAwLjI1Mi0wLjMzNiAwLjcwNHQwLjMwNCAwLjcwNCAwLjg2MSAwLjI1MnoiIHN0cm9rZS13aWR0aD0iMS4wNSIvPgogIDxwYXRoIGQ9Im0xMCA0LjU2aDAuOTQ1djMuMTVxMC42NTEtMC45NzYgMS44OS0wLjk3NiAxLjE2IDAgMS44OSAwLjg0IDAuNjgyIDAuODQgMC42ODIgMi4zMSAwIDEuNDctMC43MDQgMi40Mi0wLjcwNCAwLjg4Mi0xLjg5IDAuODgyLTEuMjYgMC0xLjg5LTEuMDJ2MC43NjZoLTAuODV6bTIuNjIgMy4wNHEtMC43NDYgMC0xLjE2IDAuNjQtMC40NTIgMC42My0wLjQ1MiAxLjY4IDAgMS4wNSAwLjQ1MiAxLjY4dDEuMTYgMC42M3EwLjc3NyAwIDEuMjYtMC42MyAwLjQ5NC0wLjY0IDAuNDk0LTEuNjggMC0xLjA1LTAuNDcyLTEuNjgtMC40NjItMC42NC0xLjI2LTAuNjR6IiBzdHJva2Utd2lkdGg9IjEuMDUiLz4KICA8cGF0aCBkPSJtMi43MyAxNS44IDEzLjYgMC4wMDgxYzAuMDA2OSAwIDAtMi42IDAtMi42IDAtMC4wMDc4LTEuMTUgMC0xLjE1IDAtMC4wMDY5IDAtMC4wMDgzIDEuNS0wLjAwODMgMS41LTJlLTMgLTAuMDAxNC0xMS4zLTAuMDAxNC0xMS4zLTAuMDAxNGwtMC4wMDU5Mi0xLjVjMC0wLjAwNzgtMS4xNyAwLjAwMTMtMS4xNyAwLjAwMTN6IiBzdHJva2Utd2lkdGg9Ii45NzUiLz4KIDwvZz4KPC9zdmc+Cg==);
--jp-icon-yaml: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbi1jb250cmFzdDIganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjRDgxQjYwIj4KICAgIDxwYXRoIGQ9Ik03LjIgMTguNnYtNS40TDMgNS42aDMuM2wxLjQgMy4xYy4zLjkuNiAxLjYgMSAyLjUuMy0uOC42LTEuNiAxLTIuNWwxLjQtMy4xaDMuNGwtNC40IDcuNnY1LjVsLTIuOS0uMXoiLz4KICAgIDxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjE3LjYiIGN5PSIxNi41IiByPSIyLjEiLz4KICAgIDxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjE3LjYiIGN5PSIxMSIgcj0iMi4xIi8+CiAgPC9nPgo8L3N2Zz4K);
}
/* Icon CSS class declarations */
.jp-AddAboveIcon {
background-image: var(--jp-icon-add-above);
}
.jp-AddBelowIcon {
background-image: var(--jp-icon-add-below);
}
.jp-AddIcon {
background-image: var(--jp-icon-add);
}
.jp-BellIcon {
background-image: var(--jp-icon-bell);
}
.jp-BugDotIcon {
background-image: var(--jp-icon-bug-dot);
}
.jp-BugIcon {
background-image: var(--jp-icon-bug);
}
.jp-BuildIcon {
background-image: var(--jp-icon-build);
}
.jp-CaretDownEmptyIcon {
background-image: var(--jp-icon-caret-down-empty);
}
.jp-CaretDownEmptyThinIcon {
background-image: var(--jp-icon-caret-down-empty-thin);
}
.jp-CaretDownIcon {
background-image: var(--jp-icon-caret-down);
}
.jp-CaretLeftIcon {
background-image: var(--jp-icon-caret-left);
}
.jp-CaretRightIcon {
background-image: var(--jp-icon-caret-right);
}
.jp-CaretUpEmptyThinIcon {
background-image: var(--jp-icon-caret-up-empty-thin);
}
.jp-CaretUpIcon {
background-image: var(--jp-icon-caret-up);
}
.jp-CaseSensitiveIcon {
background-image: var(--jp-icon-case-sensitive);
}
.jp-CheckIcon {
background-image: var(--jp-icon-check);
}
.jp-CircleEmptyIcon {
background-image: var(--jp-icon-circle-empty);
}
.jp-CircleIcon {
background-image: var(--jp-icon-circle);
}
.jp-ClearIcon {
background-image: var(--jp-icon-clear);
}
.jp-CloseIcon {
background-image: var(--jp-icon-close);
}
.jp-CodeCheckIcon {
background-image: var(--jp-icon-code-check);
}
.jp-CodeIcon {
background-image: var(--jp-icon-code);
}
.jp-CollapseAllIcon {
background-image: var(--jp-icon-collapse-all);
}
.jp-ConsoleIcon {
background-image: var(--jp-icon-console);
}
.jp-CopyIcon {
background-image: var(--jp-icon-copy);
}
.jp-CopyrightIcon {
background-image: var(--jp-icon-copyright);
}
.jp-CutIcon {
background-image: var(--jp-icon-cut);
}
.jp-DeleteIcon {
background-image: var(--jp-icon-delete);
}
.jp-DownloadIcon {
background-image: var(--jp-icon-download);
}
.jp-DuplicateIcon {
background-image: var(--jp-icon-duplicate);
}
.jp-EditIcon {
background-image: var(--jp-icon-edit);
}
.jp-EllipsesIcon {
background-image: var(--jp-icon-ellipses);
}
.jp-ErrorIcon {
background-image: var(--jp-icon-error);
}
.jp-ExpandAllIcon {
background-image: var(--jp-icon-expand-all);
}
.jp-ExtensionIcon {
background-image: var(--jp-icon-extension);
}
.jp-FastForwardIcon {
background-image: var(--jp-icon-fast-forward);
}
.jp-FileIcon {
background-image: var(--jp-icon-file);
}
.jp-FileUploadIcon {
background-image: var(--jp-icon-file-upload);
}
.jp-FilterDotIcon {
background-image: var(--jp-icon-filter-dot);
}
.jp-FilterIcon {
background-image: var(--jp-icon-filter);
}
.jp-FilterListIcon {
background-image: var(--jp-icon-filter-list);
}
.jp-FolderFavoriteIcon {
background-image: var(--jp-icon-folder-favorite);
}
.jp-FolderIcon {
background-image: var(--jp-icon-folder);
}
.jp-HomeIcon {
background-image: var(--jp-icon-home);
}
.jp-Html5Icon {
background-image: var(--jp-icon-html5);
}
.jp-ImageIcon {
background-image: var(--jp-icon-image);
}
.jp-InfoIcon {
background-image: var(--jp-icon-info);
}
.jp-InspectorIcon {
background-image: var(--jp-icon-inspector);
}
.jp-JsonIcon {
background-image: var(--jp-icon-json);
}
.jp-JuliaIcon {
background-image: var(--jp-icon-julia);
}
.jp-JupyterFaviconIcon {
background-image: var(--jp-icon-jupyter-favicon);
}
.jp-JupyterIcon {
background-image: var(--jp-icon-jupyter);
}
.jp-JupyterlabWordmarkIcon {
background-image: var(--jp-icon-jupyterlab-wordmark);
}
.jp-KernelIcon {
background-image: var(--jp-icon-kernel);
}
.jp-KeyboardIcon {
background-image: var(--jp-icon-keyboard);
}
.jp-LaunchIcon {
background-image: var(--jp-icon-launch);
}
.jp-LauncherIcon {
background-image: var(--jp-icon-launcher);
}
.jp-LineFormIcon {
background-image: var(--jp-icon-line-form);
}
.jp-LinkIcon {
background-image: var(--jp-icon-link);
}
.jp-ListIcon {
background-image: var(--jp-icon-list);
}
.jp-MarkdownIcon {
background-image: var(--jp-icon-markdown);
}
.jp-MoveDownIcon {
background-image: var(--jp-icon-move-down);
}
.jp-MoveUpIcon {
background-image: var(--jp-icon-move-up);
}
.jp-NewFolderIcon {
background-image: var(--jp-icon-new-folder);
}
.jp-NotTrustedIcon {
background-image: var(--jp-icon-not-trusted);
}
.jp-NotebookIcon {
background-image: var(--jp-icon-notebook);
}
.jp-NumberingIcon {
background-image: var(--jp-icon-numbering);
}
.jp-OfflineBoltIcon {
background-image: var(--jp-icon-offline-bolt);
}
.jp-PaletteIcon {
background-image: var(--jp-icon-palette);
}
.jp-PasteIcon {
background-image: var(--jp-icon-paste);
}
.jp-PdfIcon {
background-image: var(--jp-icon-pdf);
}
.jp-PythonIcon {
background-image: var(--jp-icon-python);
}
.jp-RKernelIcon {
background-image: var(--jp-icon-r-kernel);
}
.jp-ReactIcon {
background-image: var(--jp-icon-react);
}
.jp-RedoIcon {
background-image: var(--jp-icon-redo);
}
.jp-RefreshIcon {
background-image: var(--jp-icon-refresh);
}
.jp-RegexIcon {
background-image: var(--jp-icon-regex);
}
.jp-RunIcon {
background-image: var(--jp-icon-run);
}
.jp-RunningIcon {
background-image: var(--jp-icon-running);
}
.jp-SaveIcon {
background-image: var(--jp-icon-save);
}
.jp-SearchIcon {
background-image: var(--jp-icon-search);
}
.jp-SettingsIcon {
background-image: var(--jp-icon-settings);
}
.jp-ShareIcon {
background-image: var(--jp-icon-share);
}
.jp-SpreadsheetIcon {
background-image: var(--jp-icon-spreadsheet);
}
.jp-StopIcon {
background-image: var(--jp-icon-stop);
}
.jp-TabIcon {
background-image: var(--jp-icon-tab);
}
.jp-TableRowsIcon {
background-image: var(--jp-icon-table-rows);
}
.jp-TagIcon {
background-image: var(--jp-icon-tag);
}
.jp-TerminalIcon {
background-image: var(--jp-icon-terminal);
}
.jp-TextEditorIcon {
background-image: var(--jp-icon-text-editor);
}
.jp-TocIcon {
background-image: var(--jp-icon-toc);
}
.jp-TreeViewIcon {
background-image: var(--jp-icon-tree-view);
}
.jp-TrustedIcon {
background-image: var(--jp-icon-trusted);
}
.jp-UndoIcon {
background-image: var(--jp-icon-undo);
}
.jp-UserIcon {
background-image: var(--jp-icon-user);
}
.jp-UsersIcon {
background-image: var(--jp-icon-users);
}
.jp-VegaIcon {
background-image: var(--jp-icon-vega);
}
.jp-WordIcon {
background-image: var(--jp-icon-word);
}
.jp-YamlIcon {
background-image: var(--jp-icon-yaml);
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/**
* (DEPRECATED) Support for consuming icons as CSS background images
*/
.jp-Icon,
.jp-MaterialIcon {
background-position: center;
background-repeat: no-repeat;
background-size: 16px;
min-width: 16px;
min-height: 16px;
}
.jp-Icon-cover {
background-position: center;
background-repeat: no-repeat;
background-size: cover;
}
/**
* (DEPRECATED) Support for specific CSS icon sizes
*/
.jp-Icon-16 {
background-size: 16px;
min-width: 16px;
min-height: 16px;
}
.jp-Icon-18 {
background-size: 18px;
min-width: 18px;
min-height: 18px;
}
.jp-Icon-20 {
background-size: 20px;
min-width: 20px;
min-height: 20px;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.lm-TabBar .lm-TabBar-addButton {
align-items: center;
display: flex;
padding: 4px;
padding-bottom: 5px;
margin-right: 1px;
background-color: var(--jp-layout-color2);
}
.lm-TabBar .lm-TabBar-addButton:hover {
background-color: var(--jp-layout-color1);
}
.lm-DockPanel-tabBar .lm-TabBar-tab {
width: var(--jp-private-horizontal-tab-width);
}
.lm-DockPanel-tabBar .lm-TabBar-content {
flex: unset;
}
.lm-DockPanel-tabBar[data-orientation='horizontal'] {
flex: 1 1 auto;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/**
* Support for icons as inline SVG HTMLElements
*/
/* recolor the primary elements of an icon */
.jp-icon0[fill] {
fill: var(--jp-inverse-layout-color0);
}
.jp-icon1[fill] {
fill: var(--jp-inverse-layout-color1);
}
.jp-icon2[fill] {
fill: var(--jp-inverse-layout-color2);
}
.jp-icon3[fill] {
fill: var(--jp-inverse-layout-color3);
}
.jp-icon4[fill] {
fill: var(--jp-inverse-layout-color4);
}
.jp-icon0[stroke] {
stroke: var(--jp-inverse-layout-color0);
}
.jp-icon1[stroke] {
stroke: var(--jp-inverse-layout-color1);
}
.jp-icon2[stroke] {
stroke: var(--jp-inverse-layout-color2);
}
.jp-icon3[stroke] {
stroke: var(--jp-inverse-layout-color3);
}
.jp-icon4[stroke] {
stroke: var(--jp-inverse-layout-color4);
}
/* recolor the accent elements of an icon */
.jp-icon-accent0[fill] {
fill: var(--jp-layout-color0);
}
.jp-icon-accent1[fill] {
fill: var(--jp-layout-color1);
}
.jp-icon-accent2[fill] {
fill: var(--jp-layout-color2);
}
.jp-icon-accent3[fill] {
fill: var(--jp-layout-color3);
}
.jp-icon-accent4[fill] {
fill: var(--jp-layout-color4);
}
.jp-icon-accent0[stroke] {
stroke: var(--jp-layout-color0);
}
.jp-icon-accent1[stroke] {
stroke: var(--jp-layout-color1);
}
.jp-icon-accent2[stroke] {
stroke: var(--jp-layout-color2);
}
.jp-icon-accent3[stroke] {
stroke: var(--jp-layout-color3);
}
.jp-icon-accent4[stroke] {
stroke: var(--jp-layout-color4);
}
/* set the color of an icon to transparent */
.jp-icon-none[fill] {
fill: none;
}
.jp-icon-none[stroke] {
stroke: none;
}
/* brand icon colors. Same for light and dark */
.jp-icon-brand0[fill] {
fill: var(--jp-brand-color0);
}
.jp-icon-brand1[fill] {
fill: var(--jp-brand-color1);
}
.jp-icon-brand2[fill] {
fill: var(--jp-brand-color2);
}
.jp-icon-brand3[fill] {
fill: var(--jp-brand-color3);
}
.jp-icon-brand4[fill] {
fill: var(--jp-brand-color4);
}
.jp-icon-brand0[stroke] {
stroke: var(--jp-brand-color0);
}
.jp-icon-brand1[stroke] {
stroke: var(--jp-brand-color1);
}
.jp-icon-brand2[stroke] {
stroke: var(--jp-brand-color2);
}
.jp-icon-brand3[stroke] {
stroke: var(--jp-brand-color3);
}
.jp-icon-brand4[stroke] {
stroke: var(--jp-brand-color4);
}
/* warn icon colors. Same for light and dark */
.jp-icon-warn0[fill] {
fill: var(--jp-warn-color0);
}
.jp-icon-warn1[fill] {
fill: var(--jp-warn-color1);
}
.jp-icon-warn2[fill] {
fill: var(--jp-warn-color2);
}
.jp-icon-warn3[fill] {
fill: var(--jp-warn-color3);
}
.jp-icon-warn0[stroke] {
stroke: var(--jp-warn-color0);
}
.jp-icon-warn1[stroke] {
stroke: var(--jp-warn-color1);
}
.jp-icon-warn2[stroke] {
stroke: var(--jp-warn-color2);
}
.jp-icon-warn3[stroke] {
stroke: var(--jp-warn-color3);
}
/* icon colors that contrast well with each other and most backgrounds */
.jp-icon-contrast0[fill] {
fill: var(--jp-icon-contrast-color0);
}
.jp-icon-contrast1[fill] {
fill: var(--jp-icon-contrast-color1);
}
.jp-icon-contrast2[fill] {
fill: var(--jp-icon-contrast-color2);
}
.jp-icon-contrast3[fill] {
fill: var(--jp-icon-contrast-color3);
}
.jp-icon-contrast0[stroke] {
stroke: var(--jp-icon-contrast-color0);
}
.jp-icon-contrast1[stroke] {
stroke: var(--jp-icon-contrast-color1);
}
.jp-icon-contrast2[stroke] {
stroke: var(--jp-icon-contrast-color2);
}
.jp-icon-contrast3[stroke] {
stroke: var(--jp-icon-contrast-color3);
}
.jp-icon-dot[fill] {
fill: var(--jp-warn-color0);
}
.jp-jupyter-icon-color[fill] {
fill: var(--jp-jupyter-icon-color, var(--jp-warn-color0));
}
.jp-notebook-icon-color[fill] {
fill: var(--jp-notebook-icon-color, var(--jp-warn-color0));
}
.jp-json-icon-color[fill] {
fill: var(--jp-json-icon-color, var(--jp-warn-color1));
}
.jp-console-icon-color[fill] {
fill: var(--jp-console-icon-color, white);
}
.jp-console-icon-background-color[fill] {
fill: var(--jp-console-icon-background-color, var(--jp-brand-color1));
}
.jp-terminal-icon-color[fill] {
fill: var(--jp-terminal-icon-color, var(--jp-layout-color2));
}
.jp-terminal-icon-background-color[fill] {
fill: var(
--jp-terminal-icon-background-color,
var(--jp-inverse-layout-color2)
);
}
.jp-text-editor-icon-color[fill] {
fill: var(--jp-text-editor-icon-color, var(--jp-inverse-layout-color3));
}
.jp-inspector-icon-color[fill] {
fill: var(--jp-inspector-icon-color, var(--jp-inverse-layout-color3));
}
/* CSS for icons in selected filebrowser listing items */
.jp-DirListing-item.jp-mod-selected .jp-icon-selectable[fill] {
fill: #fff;
}
.jp-DirListing-item.jp-mod-selected .jp-icon-selectable-inverse[fill] {
fill: var(--jp-brand-color1);
}
/* stylelint-disable selector-max-class, selector-max-compound-selectors */
/**
* TODO: come up with non css-hack solution for showing the busy icon on top
* of the close icon
* CSS for complex behavior of close icon of tabs in the main area tabbar
*/
.lm-DockPanel-tabBar
.lm-TabBar-tab.lm-mod-closable.jp-mod-dirty
> .lm-TabBar-tabCloseIcon
> :not(:hover)
> .jp-icon3[fill] {
fill: none;
}
.lm-DockPanel-tabBar
.lm-TabBar-tab.lm-mod-closable.jp-mod-dirty
> .lm-TabBar-tabCloseIcon
> :not(:hover)
> .jp-icon-busy[fill] {
fill: var(--jp-inverse-layout-color3);
}
/* stylelint-enable selector-max-class, selector-max-compound-selectors */
/* CSS for icons in status bar */
#jp-main-statusbar .jp-mod-selected .jp-icon-selectable[fill] {
fill: #fff;
}
#jp-main-statusbar .jp-mod-selected .jp-icon-selectable-inverse[fill] {
fill: var(--jp-brand-color1);
}
/* special handling for splash icon CSS. While the theme CSS reloads during
splash, the splash icon can loose theming. To prevent that, we set a
default for its color variable */
:root {
--jp-warn-color0: var(--md-orange-700);
}
/* not sure what to do with this one, used in filebrowser listing */
.jp-DragIcon {
margin-right: 4px;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/**
* Support for alt colors for icons as inline SVG HTMLElements
*/
/* alt recolor the primary elements of an icon */
.jp-icon-alt .jp-icon0[fill] {
fill: var(--jp-layout-color0);
}
.jp-icon-alt .jp-icon1[fill] {
fill: var(--jp-layout-color1);
}
.jp-icon-alt .jp-icon2[fill] {
fill: var(--jp-layout-color2);
}
.jp-icon-alt .jp-icon3[fill] {
fill: var(--jp-layout-color3);
}
.jp-icon-alt .jp-icon4[fill] {
fill: var(--jp-layout-color4);
}
.jp-icon-alt .jp-icon0[stroke] {
stroke: var(--jp-layout-color0);
}
.jp-icon-alt .jp-icon1[stroke] {
stroke: var(--jp-layout-color1);
}
.jp-icon-alt .jp-icon2[stroke] {
stroke: var(--jp-layout-color2);
}
.jp-icon-alt .jp-icon3[stroke] {
stroke: var(--jp-layout-color3);
}
.jp-icon-alt .jp-icon4[stroke] {
stroke: var(--jp-layout-color4);
}
/* alt recolor the accent elements of an icon */
.jp-icon-alt .jp-icon-accent0[fill] {
fill: var(--jp-inverse-layout-color0);
}
.jp-icon-alt .jp-icon-accent1[fill] {
fill: var(--jp-inverse-layout-color1);
}
.jp-icon-alt .jp-icon-accent2[fill] {
fill: var(--jp-inverse-layout-color2);
}
.jp-icon-alt .jp-icon-accent3[fill] {
fill: var(--jp-inverse-layout-color3);
}
.jp-icon-alt .jp-icon-accent4[fill] {
fill: var(--jp-inverse-layout-color4);
}
.jp-icon-alt .jp-icon-accent0[stroke] {
stroke: var(--jp-inverse-layout-color0);
}
.jp-icon-alt .jp-icon-accent1[stroke] {
stroke: var(--jp-inverse-layout-color1);
}
.jp-icon-alt .jp-icon-accent2[stroke] {
stroke: var(--jp-inverse-layout-color2);
}
.jp-icon-alt .jp-icon-accent3[stroke] {
stroke: var(--jp-inverse-layout-color3);
}
.jp-icon-alt .jp-icon-accent4[stroke] {
stroke: var(--jp-inverse-layout-color4);
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-icon-hoverShow:not(:hover) .jp-icon-hoverShow-content {
display: none !important;
}
/**
* Support for hover colors for icons as inline SVG HTMLElements
*/
/**
* regular colors
*/
/* recolor the primary elements of an icon */
.jp-icon-hover :hover .jp-icon0-hover[fill] {
fill: var(--jp-inverse-layout-color0);
}
.jp-icon-hover :hover .jp-icon1-hover[fill] {
fill: var(--jp-inverse-layout-color1);
}
.jp-icon-hover :hover .jp-icon2-hover[fill] {
fill: var(--jp-inverse-layout-color2);
}
.jp-icon-hover :hover .jp-icon3-hover[fill] {
fill: var(--jp-inverse-layout-color3);
}
.jp-icon-hover :hover .jp-icon4-hover[fill] {
fill: var(--jp-inverse-layout-color4);
}
.jp-icon-hover :hover .jp-icon0-hover[stroke] {
stroke: var(--jp-inverse-layout-color0);
}
.jp-icon-hover :hover .jp-icon1-hover[stroke] {
stroke: var(--jp-inverse-layout-color1);
}
.jp-icon-hover :hover .jp-icon2-hover[stroke] {
stroke: var(--jp-inverse-layout-color2);
}
.jp-icon-hover :hover .jp-icon3-hover[stroke] {
stroke: var(--jp-inverse-layout-color3);
}
.jp-icon-hover :hover .jp-icon4-hover[stroke] {
stroke: var(--jp-inverse-layout-color4);
}
/* recolor the accent elements of an icon */
.jp-icon-hover :hover .jp-icon-accent0-hover[fill] {
fill: var(--jp-layout-color0);
}
.jp-icon-hover :hover .jp-icon-accent1-hover[fill] {
fill: var(--jp-layout-color1);
}
.jp-icon-hover :hover .jp-icon-accent2-hover[fill] {
fill: var(--jp-layout-color2);
}
.jp-icon-hover :hover .jp-icon-accent3-hover[fill] {
fill: var(--jp-layout-color3);
}
.jp-icon-hover :hover .jp-icon-accent4-hover[fill] {
fill: var(--jp-layout-color4);
}
.jp-icon-hover :hover .jp-icon-accent0-hover[stroke] {
stroke: var(--jp-layout-color0);
}
.jp-icon-hover :hover .jp-icon-accent1-hover[stroke] {
stroke: var(--jp-layout-color1);
}
.jp-icon-hover :hover .jp-icon-accent2-hover[stroke] {
stroke: var(--jp-layout-color2);
}
.jp-icon-hover :hover .jp-icon-accent3-hover[stroke] {
stroke: var(--jp-layout-color3);
}
.jp-icon-hover :hover .jp-icon-accent4-hover[stroke] {
stroke: var(--jp-layout-color4);
}
/* set the color of an icon to transparent */
.jp-icon-hover :hover .jp-icon-none-hover[fill] {
fill: none;
}
.jp-icon-hover :hover .jp-icon-none-hover[stroke] {
stroke: none;
}
/**
* inverse colors
*/
/* inverse recolor the primary elements of an icon */
.jp-icon-hover.jp-icon-alt :hover .jp-icon0-hover[fill] {
fill: var(--jp-layout-color0);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon1-hover[fill] {
fill: var(--jp-layout-color1);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon2-hover[fill] {
fill: var(--jp-layout-color2);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon3-hover[fill] {
fill: var(--jp-layout-color3);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon4-hover[fill] {
fill: var(--jp-layout-color4);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon0-hover[stroke] {
stroke: var(--jp-layout-color0);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon1-hover[stroke] {
stroke: var(--jp-layout-color1);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon2-hover[stroke] {
stroke: var(--jp-layout-color2);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon3-hover[stroke] {
stroke: var(--jp-layout-color3);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon4-hover[stroke] {
stroke: var(--jp-layout-color4);
}
/* inverse recolor the accent elements of an icon */
.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent0-hover[fill] {
fill: var(--jp-inverse-layout-color0);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent1-hover[fill] {
fill: var(--jp-inverse-layout-color1);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent2-hover[fill] {
fill: var(--jp-inverse-layout-color2);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent3-hover[fill] {
fill: var(--jp-inverse-layout-color3);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent4-hover[fill] {
fill: var(--jp-inverse-layout-color4);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent0-hover[stroke] {
stroke: var(--jp-inverse-layout-color0);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent1-hover[stroke] {
stroke: var(--jp-inverse-layout-color1);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent2-hover[stroke] {
stroke: var(--jp-inverse-layout-color2);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent3-hover[stroke] {
stroke: var(--jp-inverse-layout-color3);
}
.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent4-hover[stroke] {
stroke: var(--jp-inverse-layout-color4);
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-IFrame {
width: 100%;
height: 100%;
}
.jp-IFrame > iframe {
border: none;
}
/*
When drag events occur, `lm-mod-override-cursor` is added to the body.
Because iframes steal all cursor events, the following two rules are necessary
to suppress pointer events while resize drags are occurring. There may be a
better solution to this problem.
*/
body.lm-mod-override-cursor .jp-IFrame {
position: relative;
}
body.lm-mod-override-cursor .jp-IFrame::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: transparent;
}
/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2016, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-HoverBox {
position: fixed;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-FormGroup-content fieldset {
border: none;
padding: 0;
min-width: 0;
width: 100%;
}
/* stylelint-disable selector-max-type */
.jp-FormGroup-content fieldset .jp-inputFieldWrapper input,
.jp-FormGroup-content fieldset .jp-inputFieldWrapper select,
.jp-FormGroup-content fieldset .jp-inputFieldWrapper textarea {
font-size: var(--jp-content-font-size2);
border-color: var(--jp-input-border-color);
border-style: solid;
border-radius: var(--jp-border-radius);
border-width: 1px;
padding: 6px 8px;
background: none;
color: var(--jp-ui-font-color0);
height: inherit;
}
.jp-FormGroup-content fieldset input[type='checkbox'] {
position: relative;
top: 2px;
margin-left: 0;
}
.jp-FormGroup-content button.jp-mod-styled {
cursor: pointer;
}
.jp-FormGroup-content .checkbox label {
cursor: pointer;
font-size: var(--jp-content-font-size1);
}
.jp-FormGroup-content .jp-root > fieldset > legend {
display: none;
}
.jp-FormGroup-content .jp-root > fieldset > p {
display: none;
}
/** copy of `input.jp-mod-styled:focus` style */
.jp-FormGroup-content fieldset input:focus,
.jp-FormGroup-content fieldset select:focus {
-moz-outline-radius: unset;
outline: var(--jp-border-width) solid var(--md-blue-500);
outline-offset: -1px;
box-shadow: inset 0 0 4px var(--md-blue-300);
}
.jp-FormGroup-content fieldset input:hover:not(:focus),
.jp-FormGroup-content fieldset select:hover:not(:focus) {
background-color: var(--jp-border-color2);
}
/* stylelint-enable selector-max-type */
.jp-FormGroup-content .checkbox .field-description {
/* Disable default description field for checkbox:
because other widgets do not have description fields,
we add descriptions to each widget on the field level.
*/
display: none;
}
.jp-FormGroup-content #root__description {
display: none;
}
.jp-FormGroup-content .jp-modifiedIndicator {
width: 5px;
background-color: var(--jp-brand-color2);
margin-top: 0;
margin-left: calc(var(--jp-private-settingeditor-modifier-indent) * -1);
flex-shrink: 0;
}
.jp-FormGroup-content .jp-modifiedIndicator.jp-errorIndicator {
background-color: var(--jp-error-color0);
margin-right: 0.5em;
}
/* RJSF ARRAY style */
.jp-arrayFieldWrapper legend {
font-size: var(--jp-content-font-size2);
color: var(--jp-ui-font-color0);
flex-basis: 100%;
padding: 4px 0;
font-weight: var(--jp-content-heading-font-weight);
border-bottom: 1px solid var(--jp-border-color2);
}
.jp-arrayFieldWrapper .field-description {
padding: 4px 0;
white-space: pre-wrap;
}
.jp-arrayFieldWrapper .array-item {
width: 100%;
border: 1px solid var(--jp-border-color2);
border-radius: 4px;
margin: 4px;
}
.jp-ArrayOperations {
display: flex;
margin-left: 8px;
}
.jp-ArrayOperationsButton {
margin: 2px;
}
.jp-ArrayOperationsButton .jp-icon3[fill] {
fill: var(--jp-ui-font-color0);
}
button.jp-ArrayOperationsButton.jp-mod-styled:disabled {
cursor: not-allowed;
opacity: 0.5;
}
/* RJSF form validation error */
.jp-FormGroup-content .validationErrors {
color: var(--jp-error-color0);
}
/* Hide panel level error as duplicated the field level error */
.jp-FormGroup-content .panel.errors {
display: none;
}
/* RJSF normal content (settings-editor) */
.jp-FormGroup-contentNormal {
display: flex;
align-items: center;
flex-wrap: wrap;
}
.jp-FormGroup-contentNormal .jp-FormGroup-contentItem {
margin-left: 7px;
color: var(--jp-ui-font-color0);
}
.jp-FormGroup-contentNormal .jp-FormGroup-description {
flex-basis: 100%;
padding: 4px 7px;
}
.jp-FormGroup-contentNormal .jp-FormGroup-default {
flex-basis: 100%;
padding: 4px 7px;
}
.jp-FormGroup-contentNormal .jp-FormGroup-fieldLabel {
font-size: var(--jp-content-font-size1);
font-weight: normal;
min-width: 120px;
}
.jp-FormGroup-contentNormal fieldset:not(:first-child) {
margin-left: 7px;
}
.jp-FormGroup-contentNormal .field-array-of-string .array-item {
/* Display `jp-ArrayOperations` buttons side-by-side with content except
for small screens where flex-wrap will place them one below the other.
*/
display: flex;
align-items: center;
flex-wrap: wrap;
}
.jp-FormGroup-contentNormal .jp-objectFieldWrapper .form-group {
padding: 2px 8px 2px var(--jp-private-settingeditor-modifier-indent);
margin-top: 2px;
}
/* RJSF compact content (metadata-form) */
.jp-FormGroup-content.jp-FormGroup-contentCompact {
width: 100%;
}
.jp-FormGroup-contentCompact .form-group {
display: flex;
padding: 0.5em 0.2em 0.5em 0;
}
.jp-FormGroup-contentCompact
.jp-FormGroup-compactTitle
.jp-FormGroup-description {
font-size: var(--jp-ui-font-size1);
color: var(--jp-ui-font-color2);
}
.jp-FormGroup-contentCompact .jp-FormGroup-fieldLabel {
padding-bottom: 0.3em;
}
.jp-FormGroup-contentCompact .jp-inputFieldWrapper .form-control {
width: 100%;
box-sizing: border-box;
}
.jp-FormGroup-contentCompact .jp-arrayFieldWrapper .jp-FormGroup-compactTitle {
padding-bottom: 7px;
}
.jp-FormGroup-contentCompact
.jp-objectFieldWrapper
.jp-objectFieldWrapper
.form-group {
padding: 2px 8px 2px var(--jp-private-settingeditor-modifier-indent);
margin-top: 2px;
}
.jp-FormGroup-contentCompact ul.error-detail {
margin-block-start: 0.5em;
margin-block-end: 0.5em;
padding-inline-start: 1em;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
.jp-SidePanel {
display: flex;
flex-direction: column;
min-width: var(--jp-sidebar-min-width);
overflow-y: auto;
color: var(--jp-ui-font-color1);
background: var(--jp-layout-color1);
font-size: var(--jp-ui-font-size1);
}
.jp-SidePanel-header {
flex: 0 0 auto;
display: flex;
border-bottom: var(--jp-border-width) solid var(--jp-border-color2);
font-size: var(--jp-ui-font-size0);
font-weight: 600;
letter-spacing: 1px;
margin: 0;
padding: 2px;
text-transform: uppercase;
}
.jp-SidePanel-toolbar {
flex: 0 0 auto;
}
.jp-SidePanel-content {
flex: 1 1 auto;
}
.jp-SidePanel-toolbar,
.jp-AccordionPanel-toolbar {
height: var(--jp-private-toolbar-height);
}
.jp-SidePanel-toolbar.jp-Toolbar-micro {
display: none;
}
.lm-AccordionPanel .jp-AccordionPanel-title {
box-sizing: border-box;
line-height: 25px;
margin: 0;
display: flex;
align-items: center;
background: var(--jp-layout-color1);
color: var(--jp-ui-font-color1);
border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color);
box-shadow: var(--jp-toolbar-box-shadow);
font-size: var(--jp-ui-font-size0);
}
.jp-AccordionPanel-title {
cursor: pointer;
user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
text-transform: uppercase;
}
.lm-AccordionPanel[data-orientation='horizontal'] > .jp-AccordionPanel-title {
/* Title is rotated for horizontal accordion panel using CSS */
display: block;
transform-origin: top left;
transform: rotate(-90deg) translate(-100%);
}
.jp-AccordionPanel-title .lm-AccordionPanel-titleLabel {
user-select: none;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.jp-AccordionPanel-title .lm-AccordionPanel-titleCollapser {
transform: rotate(-90deg);
margin: auto 0;
height: 16px;
}
.jp-AccordionPanel-title.lm-mod-expanded .lm-AccordionPanel-titleCollapser {
transform: rotate(0deg);
}
.lm-AccordionPanel .jp-AccordionPanel-toolbar {
background: none;
box-shadow: none;
border: none;
margin-left: auto;
}
.lm-AccordionPanel .lm-SplitPanel-handle:hover {
background: var(--jp-layout-color3);
}
.jp-text-truncated {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/*-----------------------------------------------------------------------------
| Copyright (c) 2017, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-Spinner {
position: absolute;
display: flex;
justify-content: center;
align-items: center;
z-index: 10;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: var(--jp-layout-color0);
outline: none;
}
.jp-SpinnerContent {
font-size: 10px;
margin: 50px auto;
text-indent: -9999em;
width: 3em;
height: 3em;
border-radius: 50%;
background: var(--jp-brand-color3);
background: linear-gradient(
to right,
#f37626 10%,
rgba(255, 255, 255, 0) 42%
);
position: relative;
animation: load3 1s infinite linear, fadeIn 1s;
}
.jp-SpinnerContent::before {
width: 50%;
height: 50%;
background: #f37626;
border-radius: 100% 0 0;
position: absolute;
top: 0;
left: 0;
content: '';
}
.jp-SpinnerContent::after {
background: var(--jp-layout-color0);
width: 75%;
height: 75%;
border-radius: 50%;
content: '';
margin: auto;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes load3 {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2017, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
button.jp-mod-styled {
font-size: var(--jp-ui-font-size1);
color: var(--jp-ui-font-color0);
border: none;
box-sizing: border-box;
text-align: center;
line-height: 32px;
height: 32px;
padding: 0 12px;
letter-spacing: 0.8px;
outline: none;
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
}
input.jp-mod-styled {
background: var(--jp-input-background);
height: 28px;
box-sizing: border-box;
border: var(--jp-border-width) solid var(--jp-border-color1);
padding-left: 7px;
padding-right: 7px;
font-size: var(--jp-ui-font-size2);
color: var(--jp-ui-font-color0);
outline: none;
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
}
input[type='checkbox'].jp-mod-styled {
appearance: checkbox;
-webkit-appearance: checkbox;
-moz-appearance: checkbox;
height: auto;
}
input.jp-mod-styled:focus {
border: var(--jp-border-width) solid var(--md-blue-500);
box-shadow: inset 0 0 4px var(--md-blue-300);
}
.jp-select-wrapper {
display: flex;
position: relative;
flex-direction: column;
padding: 1px;
background-color: var(--jp-layout-color1);
box-sizing: border-box;
margin-bottom: 12px;
}
.jp-select-wrapper:not(.multiple) {
height: 28px;
}
.jp-select-wrapper.jp-mod-focused select.jp-mod-styled {
border: var(--jp-border-width) solid var(--jp-input-active-border-color);
box-shadow: var(--jp-input-box-shadow);
background-color: var(--jp-input-active-background);
}
select.jp-mod-styled:hover {
cursor: pointer;
color: var(--jp-ui-font-color0);
background-color: var(--jp-input-hover-background);
box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.5);
}
select.jp-mod-styled {
flex: 1 1 auto;
width: 100%;
font-size: var(--jp-ui-font-size2);
background: var(--jp-input-background);
color: var(--jp-ui-font-color0);
padding: 0 25px 0 8px;
border: var(--jp-border-width) solid var(--jp-input-border-color);
border-radius: 0;
outline: none;
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
}
select.jp-mod-styled:not([multiple]) {
height: 32px;
}
select.jp-mod-styled[multiple] {
max-height: 200px;
overflow-y: auto;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-switch {
display: flex;
align-items: center;
padding-left: 4px;
padding-right: 4px;
font-size: var(--jp-ui-font-size1);
background-color: transparent;
color: var(--jp-ui-font-color1);
border: none;
height: 20px;
}
.jp-switch:hover {
background-color: var(--jp-layout-color2);
}
.jp-switch-label {
margin-right: 5px;
font-family: var(--jp-ui-font-family);
}
.jp-switch-track {
cursor: pointer;
background-color: var(--jp-switch-color, var(--jp-border-color1));
-webkit-transition: 0.4s;
transition: 0.4s;
border-radius: 34px;
height: 16px;
width: 35px;
position: relative;
}
.jp-switch-track::before {
content: '';
position: absolute;
height: 10px;
width: 10px;
margin: 3px;
left: 0;
background-color: var(--jp-ui-inverse-font-color1);
-webkit-transition: 0.4s;
transition: 0.4s;
border-radius: 50%;
}
.jp-switch[aria-checked='true'] .jp-switch-track {
background-color: var(--jp-switch-true-position-color, var(--jp-warn-color0));
}
.jp-switch[aria-checked='true'] .jp-switch-track::before {
/* track width (35) - margins (3 + 3) - thumb width (10) */
left: 19px;
}
/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2016, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
:root {
--jp-private-toolbar-height: calc(
28px + var(--jp-border-width)
); /* leave 28px for content */
}
.jp-Toolbar {
color: var(--jp-ui-font-color1);
flex: 0 0 auto;
display: flex;
flex-direction: row;
border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color);
box-shadow: var(--jp-toolbar-box-shadow);
background: var(--jp-toolbar-background);
min-height: var(--jp-toolbar-micro-height);
padding: 2px;
z-index: 8;
overflow-x: hidden;
}
/* Toolbar items */
.jp-Toolbar > .jp-Toolbar-item.jp-Toolbar-spacer {
flex-grow: 1;
flex-shrink: 1;
}
.jp-Toolbar-item.jp-Toolbar-kernelStatus {
display: inline-block;
width: 32px;
background-repeat: no-repeat;
background-position: center;
background-size: 16px;
}
.jp-Toolbar > .jp-Toolbar-item {
flex: 0 0 auto;
display: flex;
padding-left: 1px;
padding-right: 1px;
font-size: var(--jp-ui-font-size1);
line-height: var(--jp-private-toolbar-height);
height: 100%;
}
/* Toolbar buttons */
/* This is the div we use to wrap the react component into a Widget */
div.jp-ToolbarButton {
color: transparent;
border: none;
box-sizing: border-box;
outline: none;
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
padding: 0;
margin: 0;
}
button.jp-ToolbarButtonComponent {
background: var(--jp-layout-color1);
border: none;
box-sizing: border-box;
outline: none;
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
padding: 0 6px;
margin: 0;
height: 24px;
border-radius: var(--jp-border-radius);
display: flex;
align-items: center;
text-align: center;
font-size: 14px;
min-width: unset;
min-height: unset;
}
button.jp-ToolbarButtonComponent:disabled {
opacity: 0.4;
}
button.jp-ToolbarButtonComponent > span {
padding: 0;
flex: 0 0 auto;
}
button.jp-ToolbarButtonComponent .jp-ToolbarButtonComponent-label {
font-size: var(--jp-ui-font-size1);
line-height: 100%;
padding-left: 2px;
color: var(--jp-ui-font-color1);
font-family: var(--jp-ui-font-family);
}
#jp-main-dock-panel[data-mode='single-document']
.jp-MainAreaWidget
> .jp-Toolbar.jp-Toolbar-micro {
padding: 0;
min-height: 0;
}
#jp-main-dock-panel[data-mode='single-document']
.jp-MainAreaWidget
> .jp-Toolbar {
border: none;
box-shadow: none;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
.jp-WindowedPanel-outer {
position: relative;
overflow-y: auto;
}
.jp-WindowedPanel-inner {
position: relative;
}
.jp-WindowedPanel-window {
position: absolute;
left: 0;
right: 0;
overflow: visible;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/* Sibling imports */
body {
color: var(--jp-ui-font-color1);
font-size: var(--jp-ui-font-size1);
}
/* Disable native link decoration styles everywhere outside of dialog boxes */
a {
text-decoration: unset;
color: unset;
}
a:hover {
text-decoration: unset;
color: unset;
}
/* Accessibility for links inside dialog box text */
.jp-Dialog-content a {
text-decoration: revert;
color: var(--jp-content-link-color);
}
.jp-Dialog-content a:hover {
text-decoration: revert;
}
/* Styles for ui-components */
.jp-Button {
color: var(--jp-ui-font-color2);
border-radius: var(--jp-border-radius);
padding: 0 12px;
font-size: var(--jp-ui-font-size1);
/* Copy from blueprint 3 */
display: inline-flex;
flex-direction: row;
border: none;
cursor: pointer;
align-items: center;
justify-content: center;
text-align: left;
vertical-align: middle;
min-height: 30px;
min-width: 30px;
}
.jp-Button:disabled {
cursor: not-allowed;
}
.jp-Button:empty {
padding: 0 !important;
}
.jp-Button.jp-mod-small {
min-height: 24px;
min-width: 24px;
font-size: 12px;
padding: 0 7px;
}
/* Use our own theme for hover styles */
.jp-Button.jp-mod-minimal:hover {
background-color: var(--jp-layout-color2);
}
.jp-Button.jp-mod-minimal {
background: none;
}
.jp-InputGroup {
display: block;
position: relative;
}
.jp-InputGroup input {
box-sizing: border-box;
border: none;
border-radius: 0;
background-color: transparent;
color: var(--jp-ui-font-color0);
box-shadow: inset 0 0 0 var(--jp-border-width) var(--jp-input-border-color);
padding-bottom: 0;
padding-top: 0;
padding-left: 10px;
padding-right: 28px;
position: relative;
width: 100%;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
font-size: 14px;
font-weight: 400;
height: 30px;
line-height: 30px;
outline: none;
vertical-align: middle;
}
.jp-InputGroup input:focus {
box-shadow: inset 0 0 0 var(--jp-border-width)
var(--jp-input-active-box-shadow-color),
inset 0 0 0 3px var(--jp-input-active-box-shadow-color);
}
.jp-InputGroup input:disabled {
cursor: not-allowed;
resize: block;
background-color: var(--jp-layout-color2);
color: var(--jp-ui-font-color2);
}
.jp-InputGroup input:disabled ~ span {
cursor: not-allowed;
color: var(--jp-ui-font-color2);
}
.jp-InputGroup input::placeholder,
input::placeholder {
color: var(--jp-ui-font-color2);
}
.jp-InputGroupAction {
position: absolute;
bottom: 1px;
right: 0;
padding: 6px;
}
.jp-HTMLSelect.jp-DefaultStyle select {
background-color: initial;
border: none;
border-radius: 0;
box-shadow: none;
color: var(--jp-ui-font-color0);
display: block;
font-size: var(--jp-ui-font-size1);
font-family: var(--jp-ui-font-family);
height: 24px;
line-height: 14px;
padding: 0 25px 0 10px;
text-align: left;
-moz-appearance: none;
-webkit-appearance: none;
}
.jp-HTMLSelect.jp-DefaultStyle select:disabled {
background-color: var(--jp-layout-color2);
color: var(--jp-ui-font-color2);
cursor: not-allowed;
resize: block;
}
.jp-HTMLSelect.jp-DefaultStyle select:disabled ~ span {
cursor: not-allowed;
}
/* Use our own theme for hover and option styles */
/* stylelint-disable-next-line selector-max-type */
.jp-HTMLSelect.jp-DefaultStyle select:hover,
.jp-HTMLSelect.jp-DefaultStyle select > option {
background-color: var(--jp-layout-color2);
color: var(--jp-ui-font-color0);
}
select {
box-sizing: border-box;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Styles
|----------------------------------------------------------------------------*/
.jp-StatusBar-Widget {
display: flex;
align-items: center;
background: var(--jp-layout-color2);
min-height: var(--jp-statusbar-height);
justify-content: space-between;
padding: 0 10px;
}
.jp-StatusBar-Left {
display: flex;
align-items: center;
flex-direction: row;
}
.jp-StatusBar-Middle {
display: flex;
align-items: center;
}
.jp-StatusBar-Right {
display: flex;
align-items: center;
flex-direction: row-reverse;
}
.jp-StatusBar-Item {
max-height: var(--jp-statusbar-height);
margin: 0 2px;
height: var(--jp-statusbar-height);
white-space: nowrap;
text-overflow: ellipsis;
color: var(--jp-ui-font-color1);
padding: 0 6px;
}
.jp-mod-highlighted:hover {
background-color: var(--jp-layout-color3);
}
.jp-mod-clicked {
background-color: var(--jp-brand-color1);
}
.jp-mod-clicked:hover {
background-color: var(--jp-brand-color0);
}
.jp-mod-clicked .jp-StatusBar-TextItem {
color: var(--jp-ui-inverse-font-color1);
}
.jp-StatusBar-HoverItem {
box-shadow: '0px 4px 4px rgba(0, 0, 0, 0.25)';
}
.jp-StatusBar-TextItem {
font-size: var(--jp-ui-font-size1);
font-family: var(--jp-ui-font-family);
line-height: 24px;
color: var(--jp-ui-font-color1);
}
.jp-StatusBar-GroupItem {
display: flex;
align-items: center;
flex-direction: row;
}
.jp-Statusbar-ProgressCircle svg {
display: block;
margin: 0 auto;
width: 16px;
height: 24px;
align-self: normal;
}
.jp-Statusbar-ProgressCircle path {
fill: var(--jp-inverse-layout-color3);
}
.jp-Statusbar-ProgressBar-progress-bar {
height: 10px;
width: 100px;
border: solid 0.25px var(--jp-brand-color2);
border-radius: 3px;
overflow: hidden;
align-self: center;
}
.jp-Statusbar-ProgressBar-progress-bar > div {
background-color: var(--jp-brand-color2);
background-image: linear-gradient(
-45deg,
rgba(255, 255, 255, 0.2) 25%,
transparent 25%,
transparent 50%,
rgba(255, 255, 255, 0.2) 50%,
rgba(255, 255, 255, 0.2) 75%,
transparent 75%,
transparent
);
background-size: 40px 40px;
float: left;
width: 0%;
height: 100%;
font-size: 12px;
line-height: 14px;
color: #fff;
text-align: center;
animation: jp-Statusbar-ExecutionTime-progress-bar 2s linear infinite;
}
.jp-Statusbar-ProgressBar-progress-bar p {
color: var(--jp-ui-font-color1);
font-family: var(--jp-ui-font-family);
font-size: var(--jp-ui-font-size1);
line-height: 10px;
width: 100px;
}
@keyframes jp-Statusbar-ExecutionTime-progress-bar {
0% {
background-position: 0 0;
}
100% {
background-position: 40px 40px;
}
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Variables
|----------------------------------------------------------------------------*/
:root {
--jp-private-commandpalette-search-height: 28px;
}
/*-----------------------------------------------------------------------------
| Overall styles
|----------------------------------------------------------------------------*/
.lm-CommandPalette {
padding-bottom: 0;
color: var(--jp-ui-font-color1);
background: var(--jp-layout-color1);
/* This is needed so that all font sizing of children done in ems is
* relative to this base size */
font-size: var(--jp-ui-font-size1);
}
/*-----------------------------------------------------------------------------
| Modal variant
|----------------------------------------------------------------------------*/
.jp-ModalCommandPalette {
position: absolute;
z-index: 10000;
top: 38px;
left: 30%;
margin: 0;
padding: 4px;
width: 40%;
box-shadow: var(--jp-elevation-z4);
border-radius: 4px;
background: var(--jp-layout-color0);
}
.jp-ModalCommandPalette .lm-CommandPalette {
max-height: 40vh;
}
.jp-ModalCommandPalette .lm-CommandPalette .lm-close-icon::after {
display: none;
}
.jp-ModalCommandPalette .lm-CommandPalette .lm-CommandPalette-header {
display: none;
}
.jp-ModalCommandPalette .lm-CommandPalette .lm-CommandPalette-item {
margin-left: 4px;
margin-right: 4px;
}
.jp-ModalCommandPalette
.lm-CommandPalette
.lm-CommandPalette-item.lm-mod-disabled {
display: none;
}
/*-----------------------------------------------------------------------------
| Search
|----------------------------------------------------------------------------*/
.lm-CommandPalette-search {
padding: 4px;
background-color: var(--jp-layout-color1);
z-index: 2;
}
.lm-CommandPalette-wrapper {
overflow: overlay;
padding: 0 9px;
background-color: var(--jp-input-active-background);
height: 30px;
box-shadow: inset 0 0 0 var(--jp-border-width) var(--jp-input-border-color);
}
.lm-CommandPalette.lm-mod-focused .lm-CommandPalette-wrapper {
box-shadow: inset 0 0 0 1px var(--jp-input-active-box-shadow-color),
inset 0 0 0 3px var(--jp-input-active-box-shadow-color);
}
.jp-SearchIconGroup {
color: white;
background-color: var(--jp-brand-color1);
position: absolute;
top: 4px;
right: 4px;
padding: 5px 5px 1px;
}
.jp-SearchIconGroup svg {
height: 20px;
width: 20px;
}
.jp-SearchIconGroup .jp-icon3[fill] {
fill: var(--jp-layout-color0);
}
.lm-CommandPalette-input {
background: transparent;
width: calc(100% - 18px);
float: left;
border: none;
outline: none;
font-size: var(--jp-ui-font-size1);
color: var(--jp-ui-font-color0);
line-height: var(--jp-private-commandpalette-search-height);
}
.lm-CommandPalette-input::-webkit-input-placeholder,
.lm-CommandPalette-input::-moz-placeholder,
.lm-CommandPalette-input:-ms-input-placeholder {
color: var(--jp-ui-font-color2);
font-size: var(--jp-ui-font-size1);
}
/*-----------------------------------------------------------------------------
| Results
|----------------------------------------------------------------------------*/
.lm-CommandPalette-header:first-child {
margin-top: 0;
}
.lm-CommandPalette-header {
border-bottom: solid var(--jp-border-width) var(--jp-border-color2);
color: var(--jp-ui-font-color1);
cursor: pointer;
display: flex;
font-size: var(--jp-ui-font-size0);
font-weight: 600;
letter-spacing: 1px;
margin-top: 8px;
padding: 8px 0 8px 12px;
text-transform: uppercase;
}
.lm-CommandPalette-header.lm-mod-active {
background: var(--jp-layout-color2);
}
.lm-CommandPalette-header > mark {
background-color: transparent;
font-weight: bold;
color: var(--jp-ui-font-color1);
}
.lm-CommandPalette-item {
padding: 4px 12px 4px 4px;
color: var(--jp-ui-font-color1);
font-size: var(--jp-ui-font-size1);
font-weight: 400;
display: flex;
}
.lm-CommandPalette-item.lm-mod-disabled {
color: var(--jp-ui-font-color2);
}
.lm-CommandPalette-item.lm-mod-active {
color: var(--jp-ui-inverse-font-color1);
background: var(--jp-brand-color1);
}
.lm-CommandPalette-item.lm-mod-active .lm-CommandPalette-itemLabel > mark {
color: var(--jp-ui-inverse-font-color0);
}
.lm-CommandPalette-item.lm-mod-active .jp-icon-selectable[fill] {
fill: var(--jp-layout-color0);
}
.lm-CommandPalette-item.lm-mod-active:hover:not(.lm-mod-disabled) {
color: var(--jp-ui-inverse-font-color1);
background: var(--jp-brand-color1);
}
.lm-CommandPalette-item:hover:not(.lm-mod-active):not(.lm-mod-disabled) {
background: var(--jp-layout-color2);
}
.lm-CommandPalette-itemContent {
overflow: hidden;
}
.lm-CommandPalette-itemLabel > mark {
color: var(--jp-ui-font-color0);
background-color: transparent;
font-weight: bold;
}
.lm-CommandPalette-item.lm-mod-disabled mark {
color: var(--jp-ui-font-color2);
}
.lm-CommandPalette-item .lm-CommandPalette-itemIcon {
margin: 0 4px 0 0;
position: relative;
width: 16px;
top: 2px;
flex: 0 0 auto;
}
.lm-CommandPalette-item.lm-mod-disabled .lm-CommandPalette-itemIcon {
opacity: 0.6;
}
.lm-CommandPalette-item .lm-CommandPalette-itemShortcut {
flex: 0 0 auto;
}
.lm-CommandPalette-itemCaption {
display: none;
}
.lm-CommandPalette-content {
background-color: var(--jp-layout-color1);
}
.lm-CommandPalette-content:empty::after {
content: 'No results';
margin: auto;
margin-top: 20px;
width: 100px;
display: block;
font-size: var(--jp-ui-font-size2);
font-family: var(--jp-ui-font-family);
font-weight: lighter;
}
.lm-CommandPalette-emptyMessage {
text-align: center;
margin-top: 24px;
line-height: 1.32;
padding: 0 8px;
color: var(--jp-content-font-color3);
}
/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2017, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-Dialog {
position: absolute;
z-index: 10000;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
top: 0;
left: 0;
margin: 0;
padding: 0;
width: 100%;
height: 100%;
background: var(--jp-dialog-background);
}
.jp-Dialog-content {
display: flex;
flex-direction: column;
margin-left: auto;
margin-right: auto;
background: var(--jp-layout-color1);
padding: 24px 24px 12px;
min-width: 300px;
min-height: 150px;
max-width: 1000px;
max-height: 500px;
box-sizing: border-box;
box-shadow: var(--jp-elevation-z20);
word-wrap: break-word;
border-radius: var(--jp-border-radius);
/* This is needed so that all font sizing of children done in ems is
* relative to this base size */
font-size: var(--jp-ui-font-size1);
color: var(--jp-ui-font-color1);
resize: both;
}
.jp-Dialog-content.jp-Dialog-content-small {
max-width: 500px;
}
.jp-Dialog-button {
overflow: visible;
}
button.jp-Dialog-button:focus {
outline: 1px solid var(--jp-brand-color1);
outline-offset: 4px;
-moz-outline-radius: 0;
}
button.jp-Dialog-button:focus::-moz-focus-inner {
border: 0;
}
button.jp-Dialog-button.jp-mod-styled.jp-mod-accept:focus,
button.jp-Dialog-button.jp-mod-styled.jp-mod-warn:focus,
button.jp-Dialog-button.jp-mod-styled.jp-mod-reject:focus {
outline-offset: 4px;
-moz-outline-radius: 0;
}
button.jp-Dialog-button.jp-mod-styled.jp-mod-accept:focus {
outline: 1px solid var(--jp-accept-color-normal, var(--jp-brand-color1));
}
button.jp-Dialog-button.jp-mod-styled.jp-mod-warn:focus {
outline: 1px solid var(--jp-warn-color-normal, var(--jp-error-color1));
}
button.jp-Dialog-button.jp-mod-styled.jp-mod-reject:focus {
outline: 1px solid var(--jp-reject-color-normal, var(--md-grey-600));
}
button.jp-Dialog-close-button {
padding: 0;
height: 100%;
min-width: unset;
min-height: unset;
}
.jp-Dialog-header {
display: flex;
justify-content: space-between;
flex: 0 0 auto;
padding-bottom: 12px;
font-size: var(--jp-ui-font-size3);
font-weight: 400;
color: var(--jp-ui-font-color1);
}
.jp-Dialog-body {
display: flex;
flex-direction: column;
flex: 1 1 auto;
font-size: var(--jp-ui-font-size1);
background: var(--jp-layout-color1);
color: var(--jp-ui-font-color1);
overflow: auto;
}
.jp-Dialog-footer {
display: flex;
flex-direction: row;
justify-content: flex-end;
align-items: center;
flex: 0 0 auto;
margin-left: -12px;
margin-right: -12px;
padding: 12px;
}
.jp-Dialog-checkbox {
padding-right: 5px;
}
.jp-Dialog-checkbox > input:focus-visible {
outline: 1px solid var(--jp-input-active-border-color);
outline-offset: 1px;
}
.jp-Dialog-spacer {
flex: 1 1 auto;
}
.jp-Dialog-title {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.jp-Dialog-body > .jp-select-wrapper {
width: 100%;
}
.jp-Dialog-body > button {
padding: 0 16px;
}
.jp-Dialog-body > label {
line-height: 1.4;
color: var(--jp-ui-font-color0);
}
.jp-Dialog-button.jp-mod-styled:not(:last-child) {
margin-right: 12px;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
.jp-Input-Boolean-Dialog {
flex-direction: row-reverse;
align-items: end;
width: 100%;
}
.jp-Input-Boolean-Dialog > label {
flex: 1 1 auto;
}
/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2016, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-MainAreaWidget > :focus {
outline: none;
}
.jp-MainAreaWidget .jp-MainAreaWidget-error {
padding: 6px;
}
.jp-MainAreaWidget .jp-MainAreaWidget-error > pre {
width: auto;
padding: 10px;
background: var(--jp-error-color3);
border: var(--jp-border-width) solid var(--jp-error-color1);
border-radius: var(--jp-border-radius);
color: var(--jp-ui-font-color1);
font-size: var(--jp-ui-font-size1);
white-space: pre-wrap;
word-wrap: break-word;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
/**
* google-material-color v1.2.6
* https://github.com/danlevan/google-material-color
*/
:root {
--md-red-50: #ffebee;
--md-red-100: #ffcdd2;
--md-red-200: #ef9a9a;
--md-red-300: #e57373;
--md-red-400: #ef5350;
--md-red-500: #f44336;
--md-red-600: #e53935;
--md-red-700: #d32f2f;
--md-red-800: #c62828;
--md-red-900: #b71c1c;
--md-red-A100: #ff8a80;
--md-red-A200: #ff5252;
--md-red-A400: #ff1744;
--md-red-A700: #d50000;
--md-pink-50: #fce4ec;
--md-pink-100: #f8bbd0;
--md-pink-200: #f48fb1;
--md-pink-300: #f06292;
--md-pink-400: #ec407a;
--md-pink-500: #e91e63;
--md-pink-600: #d81b60;
--md-pink-700: #c2185b;
--md-pink-800: #ad1457;
--md-pink-900: #880e4f;
--md-pink-A100: #ff80ab;
--md-pink-A200: #ff4081;
--md-pink-A400: #f50057;
--md-pink-A700: #c51162;
--md-purple-50: #f3e5f5;
--md-purple-100: #e1bee7;
--md-purple-200: #ce93d8;
--md-purple-300: #ba68c8;
--md-purple-400: #ab47bc;
--md-purple-500: #9c27b0;
--md-purple-600: #8e24aa;
--md-purple-700: #7b1fa2;
--md-purple-800: #6a1b9a;
--md-purple-900: #4a148c;
--md-purple-A100: #ea80fc;
--md-purple-A200: #e040fb;
--md-purple-A400: #d500f9;
--md-purple-A700: #a0f;
--md-deep-purple-50: #ede7f6;
--md-deep-purple-100: #d1c4e9;
--md-deep-purple-200: #b39ddb;
--md-deep-purple-300: #9575cd;
--md-deep-purple-400: #7e57c2;
--md-deep-purple-500: #673ab7;
--md-deep-purple-600: #5e35b1;
--md-deep-purple-700: #512da8;
--md-deep-purple-800: #4527a0;
--md-deep-purple-900: #311b92;
--md-deep-purple-A100: #b388ff;
--md-deep-purple-A200: #7c4dff;
--md-deep-purple-A400: #651fff;
--md-deep-purple-A700: #6200ea;
--md-indigo-50: #e8eaf6;
--md-indigo-100: #c5cae9;
--md-indigo-200: #9fa8da;
--md-indigo-300: #7986cb;
--md-indigo-400: #5c6bc0;
--md-indigo-500: #3f51b5;
--md-indigo-600: #3949ab;
--md-indigo-700: #303f9f;
--md-indigo-800: #283593;
--md-indigo-900: #1a237e;
--md-indigo-A100: #8c9eff;
--md-indigo-A200: #536dfe;
--md-indigo-A400: #3d5afe;
--md-indigo-A700: #304ffe;
--md-blue-50: #e3f2fd;
--md-blue-100: #bbdefb;
--md-blue-200: #90caf9;
--md-blue-300: #64b5f6;
--md-blue-400: #42a5f5;
--md-blue-500: #2196f3;
--md-blue-600: #1e88e5;
--md-blue-700: #1976d2;
--md-blue-800: #1565c0;
--md-blue-900: #0d47a1;
--md-blue-A100: #82b1ff;
--md-blue-A200: #448aff;
--md-blue-A400: #2979ff;
--md-blue-A700: #2962ff;
--md-light-blue-50: #e1f5fe;
--md-light-blue-100: #b3e5fc;
--md-light-blue-200: #81d4fa;
--md-light-blue-300: #4fc3f7;
--md-light-blue-400: #29b6f6;
--md-light-blue-500: #03a9f4;
--md-light-blue-600: #039be5;
--md-light-blue-700: #0288d1;
--md-light-blue-800: #0277bd;
--md-light-blue-900: #01579b;
--md-light-blue-A100: #80d8ff;
--md-light-blue-A200: #40c4ff;
--md-light-blue-A400: #00b0ff;
--md-light-blue-A700: #0091ea;
--md-cyan-50: #e0f7fa;
--md-cyan-100: #b2ebf2;
--md-cyan-200: #80deea;
--md-cyan-300: #4dd0e1;
--md-cyan-400: #26c6da;
--md-cyan-500: #00bcd4;
--md-cyan-600: #00acc1;
--md-cyan-700: #0097a7;
--md-cyan-800: #00838f;
--md-cyan-900: #006064;
--md-cyan-A100: #84ffff;
--md-cyan-A200: #18ffff;
--md-cyan-A400: #00e5ff;
--md-cyan-A700: #00b8d4;
--md-teal-50: #e0f2f1;
--md-teal-100: #b2dfdb;
--md-teal-200: #80cbc4;
--md-teal-300: #4db6ac;
--md-teal-400: #26a69a;
--md-teal-500: #009688;
--md-teal-600: #00897b;
--md-teal-700: #00796b;
--md-teal-800: #00695c;
--md-teal-900: #004d40;
--md-teal-A100: #a7ffeb;
--md-teal-A200: #64ffda;
--md-teal-A400: #1de9b6;
--md-teal-A700: #00bfa5;
--md-green-50: #e8f5e9;
--md-green-100: #c8e6c9;
--md-green-200: #a5d6a7;
--md-green-300: #81c784;
--md-green-400: #66bb6a;
--md-green-500: #4caf50;
--md-green-600: #43a047;
--md-green-700: #388e3c;
--md-green-800: #2e7d32;
--md-green-900: #1b5e20;
--md-green-A100: #b9f6ca;
--md-green-A200: #69f0ae;
--md-green-A400: #00e676;
--md-green-A700: #00c853;
--md-light-green-50: #f1f8e9;
--md-light-green-100: #dcedc8;
--md-light-green-200: #c5e1a5;
--md-light-green-300: #aed581;
--md-light-green-400: #9ccc65;
--md-light-green-500: #8bc34a;
--md-light-green-600: #7cb342;
--md-light-green-700: #689f38;
--md-light-green-800: #558b2f;
--md-light-green-900: #33691e;
--md-light-green-A100: #ccff90;
--md-light-green-A200: #b2ff59;
--md-light-green-A400: #76ff03;
--md-light-green-A700: #64dd17;
--md-lime-50: #f9fbe7;
--md-lime-100: #f0f4c3;
--md-lime-200: #e6ee9c;
--md-lime-300: #dce775;
--md-lime-400: #d4e157;
--md-lime-500: #cddc39;
--md-lime-600: #c0ca33;
--md-lime-700: #afb42b;
--md-lime-800: #9e9d24;
--md-lime-900: #827717;
--md-lime-A100: #f4ff81;
--md-lime-A200: #eeff41;
--md-lime-A400: #c6ff00;
--md-lime-A700: #aeea00;
--md-yellow-50: #fffde7;
--md-yellow-100: #fff9c4;
--md-yellow-200: #fff59d;
--md-yellow-300: #fff176;
--md-yellow-400: #ffee58;
--md-yellow-500: #ffeb3b;
--md-yellow-600: #fdd835;
--md-yellow-700: #fbc02d;
--md-yellow-800: #f9a825;
--md-yellow-900: #f57f17;
--md-yellow-A100: #ffff8d;
--md-yellow-A200: #ff0;
--md-yellow-A400: #ffea00;
--md-yellow-A700: #ffd600;
--md-amber-50: #fff8e1;
--md-amber-100: #ffecb3;
--md-amber-200: #ffe082;
--md-amber-300: #ffd54f;
--md-amber-400: #ffca28;
--md-amber-500: #ffc107;
--md-amber-600: #ffb300;
--md-amber-700: #ffa000;
--md-amber-800: #ff8f00;
--md-amber-900: #ff6f00;
--md-amber-A100: #ffe57f;
--md-amber-A200: #ffd740;
--md-amber-A400: #ffc400;
--md-amber-A700: #ffab00;
--md-orange-50: #fff3e0;
--md-orange-100: #ffe0b2;
--md-orange-200: #ffcc80;
--md-orange-300: #ffb74d;
--md-orange-400: #ffa726;
--md-orange-500: #ff9800;
--md-orange-600: #fb8c00;
--md-orange-700: #f57c00;
--md-orange-800: #ef6c00;
--md-orange-900: #e65100;
--md-orange-A100: #ffd180;
--md-orange-A200: #ffab40;
--md-orange-A400: #ff9100;
--md-orange-A700: #ff6d00;
--md-deep-orange-50: #fbe9e7;
--md-deep-orange-100: #ffccbc;
--md-deep-orange-200: #ffab91;
--md-deep-orange-300: #ff8a65;
--md-deep-orange-400: #ff7043;
--md-deep-orange-500: #ff5722;
--md-deep-orange-600: #f4511e;
--md-deep-orange-700: #e64a19;
--md-deep-orange-800: #d84315;
--md-deep-orange-900: #bf360c;
--md-deep-orange-A100: #ff9e80;
--md-deep-orange-A200: #ff6e40;
--md-deep-orange-A400: #ff3d00;
--md-deep-orange-A700: #dd2c00;
--md-brown-50: #efebe9;
--md-brown-100: #d7ccc8;
--md-brown-200: #bcaaa4;
--md-brown-300: #a1887f;
--md-brown-400: #8d6e63;
--md-brown-500: #795548;
--md-brown-600: #6d4c41;
--md-brown-700: #5d4037;
--md-brown-800: #4e342e;
--md-brown-900: #3e2723;
--md-grey-50: #fafafa;
--md-grey-100: #f5f5f5;
--md-grey-200: #eee;
--md-grey-300: #e0e0e0;
--md-grey-400: #bdbdbd;
--md-grey-500: #9e9e9e;
--md-grey-600: #757575;
--md-grey-700: #616161;
--md-grey-800: #424242;
--md-grey-900: #212121;
--md-blue-grey-50: #eceff1;
--md-blue-grey-100: #cfd8dc;
--md-blue-grey-200: #b0bec5;
--md-blue-grey-300: #90a4ae;
--md-blue-grey-400: #78909c;
--md-blue-grey-500: #607d8b;
--md-blue-grey-600: #546e7a;
--md-blue-grey-700: #455a64;
--md-blue-grey-800: #37474f;
--md-blue-grey-900: #263238;
}
/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2017, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| RenderedText
|----------------------------------------------------------------------------*/
:root {
/* This is the padding value to fill the gaps between lines containing spans with background color. */
--jp-private-code-span-padding: calc(
(var(--jp-code-line-height) - 1) * var(--jp-code-font-size) / 2
);
}
.jp-RenderedText {
text-align: left;
padding-left: var(--jp-code-padding);
line-height: var(--jp-code-line-height);
font-family: var(--jp-code-font-family);
}
.jp-RenderedText pre,
.jp-RenderedJavaScript pre,
.jp-RenderedHTMLCommon pre {
color: var(--jp-content-font-color1);
font-size: var(--jp-code-font-size);
border: none;
margin: 0;
padding: 0;
}
.jp-RenderedText pre a:link {
text-decoration: none;
color: var(--jp-content-link-color);
}
.jp-RenderedText pre a:hover {
text-decoration: underline;
color: var(--jp-content-link-color);
}
.jp-RenderedText pre a:visited {
text-decoration: none;
color: var(--jp-content-link-color);
}
/* console foregrounds and backgrounds */
.jp-RenderedText pre .ansi-black-fg {
color: #3e424d;
}
.jp-RenderedText pre .ansi-red-fg {
color: #e75c58;
}
.jp-RenderedText pre .ansi-green-fg {
color: #00a250;
}
.jp-RenderedText pre .ansi-yellow-fg {
color: #ddb62b;
}
.jp-RenderedText pre .ansi-blue-fg {
color: #208ffb;
}
.jp-RenderedText pre .ansi-magenta-fg {
color: #d160c4;
}
.jp-RenderedText pre .ansi-cyan-fg {
color: #60c6c8;
}
.jp-RenderedText pre .ansi-white-fg {
color: #c5c1b4;
}
.jp-RenderedText pre .ansi-black-bg {
background-color: #3e424d;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-red-bg {
background-color: #e75c58;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-green-bg {
background-color: #00a250;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-yellow-bg {
background-color: #ddb62b;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-blue-bg {
background-color: #208ffb;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-magenta-bg {
background-color: #d160c4;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-cyan-bg {
background-color: #60c6c8;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-white-bg {
background-color: #c5c1b4;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-black-intense-fg {
color: #282c36;
}
.jp-RenderedText pre .ansi-red-intense-fg {
color: #b22b31;
}
.jp-RenderedText pre .ansi-green-intense-fg {
color: #007427;
}
.jp-RenderedText pre .ansi-yellow-intense-fg {
color: #b27d12;
}
.jp-RenderedText pre .ansi-blue-intense-fg {
color: #0065ca;
}
.jp-RenderedText pre .ansi-magenta-intense-fg {
color: #a03196;
}
.jp-RenderedText pre .ansi-cyan-intense-fg {
color: #258f8f;
}
.jp-RenderedText pre .ansi-white-intense-fg {
color: #a1a6b2;
}
.jp-RenderedText pre .ansi-black-intense-bg {
background-color: #282c36;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-red-intense-bg {
background-color: #b22b31;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-green-intense-bg {
background-color: #007427;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-yellow-intense-bg {
background-color: #b27d12;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-blue-intense-bg {
background-color: #0065ca;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-magenta-intense-bg {
background-color: #a03196;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-cyan-intense-bg {
background-color: #258f8f;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-white-intense-bg {
background-color: #a1a6b2;
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-default-inverse-fg {
color: var(--jp-ui-inverse-font-color0);
}
.jp-RenderedText pre .ansi-default-inverse-bg {
background-color: var(--jp-inverse-layout-color0);
padding: var(--jp-private-code-span-padding) 0;
}
.jp-RenderedText pre .ansi-bold {
font-weight: bold;
}
.jp-RenderedText pre .ansi-underline {
text-decoration: underline;
}
.jp-RenderedText[data-mime-type='application/vnd.jupyter.stderr'] {
background: var(--jp-rendermime-error-background);
padding-top: var(--jp-code-padding);
}
/*-----------------------------------------------------------------------------
| RenderedLatex
|----------------------------------------------------------------------------*/
.jp-RenderedLatex {
color: var(--jp-content-font-color1);
font-size: var(--jp-content-font-size1);
line-height: var(--jp-content-line-height);
}
/* Left-justify outputs.*/
.jp-OutputArea-output.jp-RenderedLatex {
padding: var(--jp-code-padding);
text-align: left;
}
/*-----------------------------------------------------------------------------
| RenderedHTML
|----------------------------------------------------------------------------*/
.jp-RenderedHTMLCommon {
color: var(--jp-content-font-color1);
font-family: var(--jp-content-font-family);
font-size: var(--jp-content-font-size1);
line-height: var(--jp-content-line-height);
/* Give a bit more R padding on Markdown text to keep line lengths reasonable */
padding-right: 20px;
}
.jp-RenderedHTMLCommon em {
font-style: italic;
}
.jp-RenderedHTMLCommon strong {
font-weight: bold;
}
.jp-RenderedHTMLCommon u {
text-decoration: underline;
}
.jp-RenderedHTMLCommon a:link {
text-decoration: none;
color: var(--jp-content-link-color);
}
.jp-RenderedHTMLCommon a:hover {
text-decoration: underline;
color: var(--jp-content-link-color);
}
.jp-RenderedHTMLCommon a:visited {
text-decoration: none;
color: var(--jp-content-link-color);
}
/* Headings */
.jp-RenderedHTMLCommon h1,
.jp-RenderedHTMLCommon h2,
.jp-RenderedHTMLCommon h3,
.jp-RenderedHTMLCommon h4,
.jp-RenderedHTMLCommon h5,
.jp-RenderedHTMLCommon h6 {
line-height: var(--jp-content-heading-line-height);
font-weight: var(--jp-content-heading-font-weight);
font-style: normal;
margin: var(--jp-content-heading-margin-top) 0
var(--jp-content-heading-margin-bottom) 0;
}
.jp-RenderedHTMLCommon h1:first-child,
.jp-RenderedHTMLCommon h2:first-child,
.jp-RenderedHTMLCommon h3:first-child,
.jp-RenderedHTMLCommon h4:first-child,
.jp-RenderedHTMLCommon h5:first-child,
.jp-RenderedHTMLCommon h6:first-child {
margin-top: calc(0.5 * var(--jp-content-heading-margin-top));
}
.jp-RenderedHTMLCommon h1:last-child,
.jp-RenderedHTMLCommon h2:last-child,
.jp-RenderedHTMLCommon h3:last-child,
.jp-RenderedHTMLCommon h4:last-child,
.jp-RenderedHTMLCommon h5:last-child,
.jp-RenderedHTMLCommon h6:last-child {
margin-bottom: calc(0.5 * var(--jp-content-heading-margin-bottom));
}
.jp-RenderedHTMLCommon h1 {
font-size: var(--jp-content-font-size5);
}
.jp-RenderedHTMLCommon h2 {
font-size: var(--jp-content-font-size4);
}
.jp-RenderedHTMLCommon h3 {
font-size: var(--jp-content-font-size3);
}
.jp-RenderedHTMLCommon h4 {
font-size: var(--jp-content-font-size2);
}
.jp-RenderedHTMLCommon h5 {
font-size: var(--jp-content-font-size1);
}
.jp-RenderedHTMLCommon h6 {
font-size: var(--jp-content-font-size0);
}
/* Lists */
/* stylelint-disable selector-max-type, selector-max-compound-selectors */
.jp-RenderedHTMLCommon ul:not(.list-inline),
.jp-RenderedHTMLCommon ol:not(.list-inline) {
padding-left: 2em;
}
.jp-RenderedHTMLCommon ul {
list-style: disc;
}
.jp-RenderedHTMLCommon ul ul {
list-style: square;
}
.jp-RenderedHTMLCommon ul ul ul {
list-style: circle;
}
.jp-RenderedHTMLCommon ol {
list-style: decimal;
}
.jp-RenderedHTMLCommon ol ol {
list-style: upper-alpha;
}
.jp-RenderedHTMLCommon ol ol ol {
list-style: lower-alpha;
}
.jp-RenderedHTMLCommon ol ol ol ol {
list-style: lower-roman;
}
.jp-RenderedHTMLCommon ol ol ol ol ol {
list-style: decimal;
}
.jp-RenderedHTMLCommon ol,
.jp-RenderedHTMLCommon ul {
margin-bottom: 1em;
}
.jp-RenderedHTMLCommon ul ul,
.jp-RenderedHTMLCommon ul ol,
.jp-RenderedHTMLCommon ol ul,
.jp-RenderedHTMLCommon ol ol {
margin-bottom: 0;
}
/* stylelint-enable selector-max-type, selector-max-compound-selectors */
.jp-RenderedHTMLCommon hr {
color: var(--jp-border-color2);
background-color: var(--jp-border-color1);
margin-top: 1em;
margin-bottom: 1em;
}
.jp-RenderedHTMLCommon > pre {
margin: 1.5em 2em;
}
.jp-RenderedHTMLCommon pre,
.jp-RenderedHTMLCommon code {
border: 0;
background-color: var(--jp-layout-color0);
color: var(--jp-content-font-color1);
font-family: var(--jp-code-font-family);
font-size: inherit;
line-height: var(--jp-code-line-height);
padding: 0;
white-space: pre-wrap;
}
.jp-RenderedHTMLCommon :not(pre) > code {
background-color: var(--jp-layout-color2);
padding: 1px 5px;
}
/* Tables */
.jp-RenderedHTMLCommon table {
border-collapse: collapse;
border-spacing: 0;
border: none;
color: var(--jp-ui-font-color1);
font-size: var(--jp-ui-font-size1);
table-layout: fixed;
margin-left: auto;
margin-bottom: 1em;
margin-right: auto;
}
.jp-RenderedHTMLCommon thead {
border-bottom: var(--jp-border-width) solid var(--jp-border-color1);
vertical-align: bottom;
}
.jp-RenderedHTMLCommon td,
.jp-RenderedHTMLCommon th,
.jp-RenderedHTMLCommon tr {
vertical-align: middle;
padding: 0.5em;
line-height: normal;
white-space: normal;
max-width: none;
border: none;
}
.jp-RenderedMarkdown.jp-RenderedHTMLCommon td,
.jp-RenderedMarkdown.jp-RenderedHTMLCommon th {
max-width: none;
}
:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon td,
:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon th,
:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon tr {
text-align: right;
}
.jp-RenderedHTMLCommon th {
font-weight: bold;
}
.jp-RenderedHTMLCommon tbody tr:nth-child(odd) {
background: var(--jp-layout-color0);
}
.jp-RenderedHTMLCommon tbody tr:nth-child(even) {
background: var(--jp-rendermime-table-row-background);
}
.jp-RenderedHTMLCommon tbody tr:hover {
background: var(--jp-rendermime-table-row-hover-background);
}
.jp-RenderedHTMLCommon p {
text-align: left;
margin: 0;
margin-bottom: 1em;
}
.jp-RenderedHTMLCommon img {
-moz-force-broken-image-icon: 1;
}
/* Restrict to direct children as other images could be nested in other content. */
.jp-RenderedHTMLCommon > img {
display: block;
margin-left: 0;
margin-right: 0;
margin-bottom: 1em;
}
/* Change color behind transparent images if they need it... */
[data-jp-theme-light='false'] .jp-RenderedImage img.jp-needs-light-background {
background-color: var(--jp-inverse-layout-color1);
}
[data-jp-theme-light='true'] .jp-RenderedImage img.jp-needs-dark-background {
background-color: var(--jp-inverse-layout-color1);
}
.jp-RenderedHTMLCommon img,
.jp-RenderedImage img,
.jp-RenderedHTMLCommon svg,
.jp-RenderedSVG svg {
max-width: 100%;
height: auto;
}
.jp-RenderedHTMLCommon img.jp-mod-unconfined,
.jp-RenderedImage img.jp-mod-unconfined,
.jp-RenderedHTMLCommon svg.jp-mod-unconfined,
.jp-RenderedSVG svg.jp-mod-unconfined {
max-width: none;
}
.jp-RenderedHTMLCommon .alert {
padding: var(--jp-notebook-padding);
border: var(--jp-border-width) solid transparent;
border-radius: var(--jp-border-radius);
margin-bottom: 1em;
}
.jp-RenderedHTMLCommon .alert-info {
color: var(--jp-info-color0);
background-color: var(--jp-info-color3);
border-color: var(--jp-info-color2);
}
.jp-RenderedHTMLCommon .alert-info hr {
border-color: var(--jp-info-color3);
}
.jp-RenderedHTMLCommon .alert-info > p:last-child,
.jp-RenderedHTMLCommon .alert-info > ul:last-child {
margin-bottom: 0;
}
.jp-RenderedHTMLCommon .alert-warning {
color: var(--jp-warn-color0);
background-color: var(--jp-warn-color3);
border-color: var(--jp-warn-color2);
}
.jp-RenderedHTMLCommon .alert-warning hr {
border-color: var(--jp-warn-color3);
}
.jp-RenderedHTMLCommon .alert-warning > p:last-child,
.jp-RenderedHTMLCommon .alert-warning > ul:last-child {
margin-bottom: 0;
}
.jp-RenderedHTMLCommon .alert-success {
color: var(--jp-success-color0);
background-color: var(--jp-success-color3);
border-color: var(--jp-success-color2);
}
.jp-RenderedHTMLCommon .alert-success hr {
border-color: var(--jp-success-color3);
}
.jp-RenderedHTMLCommon .alert-success > p:last-child,
.jp-RenderedHTMLCommon .alert-success > ul:last-child {
margin-bottom: 0;
}
.jp-RenderedHTMLCommon .alert-danger {
color: var(--jp-error-color0);
background-color: var(--jp-error-color3);
border-color: var(--jp-error-color2);
}
.jp-RenderedHTMLCommon .alert-danger hr {
border-color: var(--jp-error-color3);
}
.jp-RenderedHTMLCommon .alert-danger > p:last-child,
.jp-RenderedHTMLCommon .alert-danger > ul:last-child {
margin-bottom: 0;
}
.jp-RenderedHTMLCommon blockquote {
margin: 1em 2em;
padding: 0 1em;
border-left: 5px solid var(--jp-border-color2);
}
a.jp-InternalAnchorLink {
visibility: hidden;
margin-left: 8px;
color: var(--md-blue-800);
}
h1:hover .jp-InternalAnchorLink,
h2:hover .jp-InternalAnchorLink,
h3:hover .jp-InternalAnchorLink,
h4:hover .jp-InternalAnchorLink,
h5:hover .jp-InternalAnchorLink,
h6:hover .jp-InternalAnchorLink {
visibility: visible;
}
.jp-RenderedHTMLCommon kbd {
background-color: var(--jp-rendermime-table-row-background);
border: 1px solid var(--jp-border-color0);
border-bottom-color: var(--jp-border-color2);
border-radius: 3px;
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
display: inline-block;
font-size: var(--jp-ui-font-size0);
line-height: 1em;
padding: 0.2em 0.5em;
}
/* Most direct children of .jp-RenderedHTMLCommon have a margin-bottom of 1.0.
* At the bottom of cells this is a bit too much as there is also spacing
* between cells. Going all the way to 0 gets too tight between markdown and
* code cells.
*/
.jp-RenderedHTMLCommon > *:last-child {
margin-bottom: 0.5em;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Copyright (c) 2014-2017, PhosphorJS Contributors
|
| Distributed under the terms of the BSD 3-Clause License.
|
| The full license is in the file LICENSE, distributed with this software.
|----------------------------------------------------------------------------*/
.lm-cursor-backdrop {
position: fixed;
width: 200px;
height: 200px;
margin-top: -100px;
margin-left: -100px;
will-change: transform;
z-index: 100;
}
.lm-mod-drag-image {
will-change: transform;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
.jp-lineFormSearch {
padding: 4px 12px;
background-color: var(--jp-layout-color2);
box-shadow: var(--jp-toolbar-box-shadow);
z-index: 2;
font-size: var(--jp-ui-font-size1);
}
.jp-lineFormCaption {
font-size: var(--jp-ui-font-size0);
line-height: var(--jp-ui-font-size1);
margin-top: 4px;
color: var(--jp-ui-font-color0);
}
.jp-baseLineForm {
border: none;
border-radius: 0;
position: absolute;
background-size: 16px;
background-repeat: no-repeat;
background-position: center;
outline: none;
}
.jp-lineFormButtonContainer {
top: 4px;
right: 8px;
height: 24px;
padding: 0 12px;
width: 12px;
}
.jp-lineFormButtonIcon {
top: 0;
right: 0;
background-color: var(--jp-brand-color1);
height: 100%;
width: 100%;
box-sizing: border-box;
padding: 4px 6px;
}
.jp-lineFormButton {
top: 0;
right: 0;
background-color: transparent;
height: 100%;
width: 100%;
box-sizing: border-box;
}
.jp-lineFormWrapper {
overflow: hidden;
padding: 0 8px;
border: 1px solid var(--jp-border-color0);
background-color: var(--jp-input-active-background);
height: 22px;
}
.jp-lineFormWrapperFocusWithin {
border: var(--jp-border-width) solid var(--md-blue-500);
box-shadow: inset 0 0 4px var(--md-blue-300);
}
.jp-lineFormInput {
background: transparent;
width: 200px;
height: 100%;
border: none;
outline: none;
color: var(--jp-ui-font-color0);
line-height: 28px;
}
/*-----------------------------------------------------------------------------
| Copyright (c) 2014-2016, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-JSONEditor {
display: flex;
flex-direction: column;
width: 100%;
}
.jp-JSONEditor-host {
flex: 1 1 auto;
border: var(--jp-border-width) solid var(--jp-input-border-color);
border-radius: 0;
background: var(--jp-layout-color0);
min-height: 50px;
padding: 1px;
}
.jp-JSONEditor.jp-mod-error .jp-JSONEditor-host {
border-color: red;
outline-color: red;
}
.jp-JSONEditor-header {
display: flex;
flex: 1 0 auto;
padding: 0 0 0 12px;
}
.jp-JSONEditor-header label {
flex: 0 0 auto;
}
.jp-JSONEditor-commitButton {
height: 16px;
width: 16px;
background-size: 18px;
background-repeat: no-repeat;
background-position: center;
}
.jp-JSONEditor-host.jp-mod-focused {
background-color: var(--jp-input-active-background);
border: 1px solid var(--jp-input-active-border-color);
box-shadow: var(--jp-input-box-shadow);
}
.jp-Editor.jp-mod-dropTarget {
border: var(--jp-border-width) solid var(--jp-input-active-border-color);
box-shadow: var(--jp-input-box-shadow);
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-DocumentSearch-input {
border: none;
outline: none;
color: var(--jp-ui-font-color0);
font-size: var(--jp-ui-font-size1);
background-color: var(--jp-layout-color0);
font-family: var(--jp-ui-font-family);
padding: 2px 1px;
resize: none;
}
.jp-DocumentSearch-overlay {
position: absolute;
background-color: var(--jp-toolbar-background);
border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color);
border-left: var(--jp-border-width) solid var(--jp-toolbar-border-color);
top: 0;
right: 0;
z-index: 7;
min-width: 405px;
padding: 2px;
font-size: var(--jp-ui-font-size1);
--jp-private-document-search-button-height: 20px;
}
.jp-DocumentSearch-overlay button {
background-color: var(--jp-toolbar-background);
outline: 0;
}
.jp-DocumentSearch-overlay button:hover {
background-color: var(--jp-layout-color2);
}
.jp-DocumentSearch-overlay button:active {
background-color: var(--jp-layout-color3);
}
.jp-DocumentSearch-overlay-row {
display: flex;
align-items: center;
margin-bottom: 2px;
}
.jp-DocumentSearch-button-content {
display: inline-block;
cursor: pointer;
box-sizing: border-box;
width: 100%;
height: 100%;
}
.jp-DocumentSearch-button-content svg {
width: 100%;
height: 100%;
}
.jp-DocumentSearch-input-wrapper {
border: var(--jp-border-width) solid var(--jp-border-color0);
display: flex;
background-color: var(--jp-layout-color0);
margin: 2px;
}
.jp-DocumentSearch-input-wrapper:focus-within {
border-color: var(--jp-cell-editor-active-border-color);
}
.jp-DocumentSearch-toggle-wrapper,
.jp-DocumentSearch-button-wrapper {
all: initial;
overflow: hidden;
display: inline-block;
border: none;
box-sizing: border-box;
}
.jp-DocumentSearch-toggle-wrapper {
width: 14px;
height: 14px;
}
.jp-DocumentSearch-button-wrapper {
width: var(--jp-private-document-search-button-height);
height: var(--jp-private-document-search-button-height);
}
.jp-DocumentSearch-toggle-wrapper:focus,
.jp-DocumentSearch-button-wrapper:focus {
outline: var(--jp-border-width) solid
var(--jp-cell-editor-active-border-color);
outline-offset: -1px;
}
.jp-DocumentSearch-toggle-wrapper,
.jp-DocumentSearch-button-wrapper,
.jp-DocumentSearch-button-content:focus {
outline: none;
}
.jp-DocumentSearch-toggle-placeholder {
width: 5px;
}
.jp-DocumentSearch-input-button::before {
display: block;
padding-top: 100%;
}
.jp-DocumentSearch-input-button-off {
opacity: var(--jp-search-toggle-off-opacity);
}
.jp-DocumentSearch-input-button-off:hover {
opacity: var(--jp-search-toggle-hover-opacity);
}
.jp-DocumentSearch-input-button-on {
opacity: var(--jp-search-toggle-on-opacity);
}
.jp-DocumentSearch-index-counter {
padding-left: 10px;
padding-right: 10px;
user-select: none;
min-width: 35px;
display: inline-block;
}
.jp-DocumentSearch-up-down-wrapper {
display: inline-block;
padding-right: 2px;
margin-left: auto;
white-space: nowrap;
}
.jp-DocumentSearch-spacer {
margin-left: auto;
}
.jp-DocumentSearch-up-down-wrapper button {
outline: 0;
border: none;
width: var(--jp-private-document-search-button-height);
height: var(--jp-private-document-search-button-height);
vertical-align: middle;
margin: 1px 5px 2px;
}
.jp-DocumentSearch-up-down-button:hover {
background-color: var(--jp-layout-color2);
}
.jp-DocumentSearch-up-down-button:active {
background-color: var(--jp-layout-color3);
}
.jp-DocumentSearch-filter-button {
border-radius: var(--jp-border-radius);
}
.jp-DocumentSearch-filter-button:hover {
background-color: var(--jp-layout-color2);
}
.jp-DocumentSearch-filter-button-enabled {
background-color: var(--jp-layout-color2);
}
.jp-DocumentSearch-filter-button-enabled:hover {
background-color: var(--jp-layout-color3);
}
.jp-DocumentSearch-search-options {
padding: 0 8px;
margin-left: 3px;
width: 100%;
display: grid;
justify-content: start;
grid-template-columns: 1fr 1fr;
align-items: center;
justify-items: stretch;
}
.jp-DocumentSearch-search-filter-disabled {
color: var(--jp-ui-font-color2);
}
.jp-DocumentSearch-search-filter {
display: flex;
align-items: center;
user-select: none;
}
.jp-DocumentSearch-regex-error {
color: var(--jp-error-color0);
}
.jp-DocumentSearch-replace-button-wrapper {
overflow: hidden;
display: inline-block;
box-sizing: border-box;
border: var(--jp-border-width) solid var(--jp-border-color0);
margin: auto 2px;
padding: 1px 4px;
height: calc(var(--jp-private-document-search-button-height) + 2px);
}
.jp-DocumentSearch-replace-button-wrapper:focus {
border: var(--jp-border-width) solid var(--jp-cell-editor-active-border-color);
}
.jp-DocumentSearch-replace-button {
display: inline-block;
text-align: center;
cursor: pointer;
box-sizing: border-box;
color: var(--jp-ui-font-color1);
/* height - 2 * (padding of wrapper) */
line-height: calc(var(--jp-private-document-search-button-height) - 2px);
width: 100%;
height: 100%;
}
.jp-DocumentSearch-replace-button:focus {
outline: none;
}
.jp-DocumentSearch-replace-wrapper-class {
margin-left: 14px;
display: flex;
}
.jp-DocumentSearch-replace-toggle {
border: none;
background-color: var(--jp-toolbar-background);
border-radius: var(--jp-border-radius);
}
.jp-DocumentSearch-replace-toggle:hover {
background-color: var(--jp-layout-color2);
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.cm-editor {
line-height: var(--jp-code-line-height);
font-size: var(--jp-code-font-size);
font-family: var(--jp-code-font-family);
border: 0;
border-radius: 0;
height: auto;
/* Changed to auto to autogrow */
}
.cm-editor pre {
padding: 0 var(--jp-code-padding);
}
.jp-CodeMirrorEditor[data-type='inline'] .cm-dialog {
background-color: var(--jp-layout-color0);
color: var(--jp-content-font-color1);
}
.jp-CodeMirrorEditor {
cursor: text;
}
/* When zoomed out 67% and 33% on a screen of 1440 width x 900 height */
@media screen and (min-width: 2138px) and (max-width: 4319px) {
.jp-CodeMirrorEditor[data-type='inline'] .cm-cursor {
border-left: var(--jp-code-cursor-width1) solid
var(--jp-editor-cursor-color);
}
}
/* When zoomed out less than 33% */
@media screen and (min-width: 4320px) {
.jp-CodeMirrorEditor[data-type='inline'] .cm-cursor {
border-left: var(--jp-code-cursor-width2) solid
var(--jp-editor-cursor-color);
}
}
.cm-editor.jp-mod-readOnly .cm-cursor {
display: none;
}
.jp-CollaboratorCursor {
border-left: 5px solid transparent;
border-right: 5px solid transparent;
border-top: none;
border-bottom: 3px solid;
background-clip: content-box;
margin-left: -5px;
margin-right: -5px;
}
.cm-searching,
.cm-searching span {
/* `.cm-searching span`: we need to override syntax highlighting */
background-color: var(--jp-search-unselected-match-background-color);
color: var(--jp-search-unselected-match-color);
}
.cm-searching::selection,
.cm-searching span::selection {
background-color: var(--jp-search-unselected-match-background-color);
color: var(--jp-search-unselected-match-color);
}
.jp-current-match > .cm-searching,
.jp-current-match > .cm-searching span,
.cm-searching > .jp-current-match,
.cm-searching > .jp-current-match span {
background-color: var(--jp-search-selected-match-background-color);
color: var(--jp-search-selected-match-color);
}
.jp-current-match > .cm-searching::selection,
.cm-searching > .jp-current-match::selection,
.jp-current-match > .cm-searching span::selection {
background-color: var(--jp-search-selected-match-background-color);
color: var(--jp-search-selected-match-color);
}
.cm-trailingspace {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAsElEQVQIHQGlAFr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7+r3zKmT0/+pk9P/7+r3zAAAAAAAAAAABAAAAAAAAAAA6OPzM+/q9wAAAAAA6OPzMwAAAAAAAAAAAgAAAAAAAAAAGR8NiRQaCgAZIA0AGR8NiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQyoYJ/SY80UAAAAASUVORK5CYII=);
background-position: center left;
background-repeat: repeat-x;
}
.jp-CollaboratorCursor-hover {
position: absolute;
z-index: 1;
transform: translateX(-50%);
color: white;
border-radius: 3px;
padding-left: 4px;
padding-right: 4px;
padding-top: 1px;
padding-bottom: 1px;
text-align: center;
font-size: var(--jp-ui-font-size1);
white-space: nowrap;
}
.jp-CodeMirror-ruler {
border-left: 1px dashed var(--jp-border-color2);
}
/* Styles for shared cursors (remote cursor locations and selected ranges) */
.jp-CodeMirrorEditor .cm-ySelectionCaret {
position: relative;
border-left: 1px solid black;
margin-left: -1px;
margin-right: -1px;
box-sizing: border-box;
}
.jp-CodeMirrorEditor .cm-ySelectionCaret > .cm-ySelectionInfo {
white-space: nowrap;
position: absolute;
top: -1.15em;
padding-bottom: 0.05em;
left: -1px;
font-size: 0.95em;
font-family: var(--jp-ui-font-family);
font-weight: bold;
line-height: normal;
user-select: none;
color: white;
padding-left: 2px;
padding-right: 2px;
z-index: 101;
transition: opacity 0.3s ease-in-out;
}
.jp-CodeMirrorEditor .cm-ySelectionInfo {
transition-delay: 0.7s;
opacity: 0;
}
.jp-CodeMirrorEditor .cm-ySelectionCaret:hover > .cm-ySelectionInfo {
opacity: 1;
transition-delay: 0s;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-MimeDocument {
outline: none;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Variables
|----------------------------------------------------------------------------*/
:root {
--jp-private-filebrowser-button-height: 28px;
--jp-private-filebrowser-button-width: 48px;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-FileBrowser .jp-SidePanel-content {
display: flex;
flex-direction: column;
}
.jp-FileBrowser-toolbar.jp-Toolbar {
flex-wrap: wrap;
row-gap: 12px;
border-bottom: none;
height: auto;
margin: 8px 12px 0;
box-shadow: none;
padding: 0;
justify-content: flex-start;
}
.jp-FileBrowser-Panel {
flex: 1 1 auto;
display: flex;
flex-direction: column;
}
.jp-BreadCrumbs {
flex: 0 0 auto;
margin: 8px 12px;
}
.jp-BreadCrumbs-item {
margin: 0 2px;
padding: 0 2px;
border-radius: var(--jp-border-radius);
cursor: pointer;
}
.jp-BreadCrumbs-item:hover {
background-color: var(--jp-layout-color2);
}
.jp-BreadCrumbs-item:first-child {
margin-left: 0;
}
.jp-BreadCrumbs-item.jp-mod-dropTarget {
background-color: var(--jp-brand-color2);
opacity: 0.7;
}
/*-----------------------------------------------------------------------------
| Buttons
|----------------------------------------------------------------------------*/
.jp-FileBrowser-toolbar > .jp-Toolbar-item {
flex: 0 0 auto;
padding-left: 0;
padding-right: 2px;
align-items: center;
height: unset;
}
.jp-FileBrowser-toolbar > .jp-Toolbar-item .jp-ToolbarButtonComponent {
width: 40px;
}
/*-----------------------------------------------------------------------------
| Other styles
|----------------------------------------------------------------------------*/
.jp-FileDialog.jp-mod-conflict input {
color: var(--jp-error-color1);
}
.jp-FileDialog .jp-new-name-title {
margin-top: 12px;
}
.jp-LastModified-hidden {
display: none;
}
.jp-FileSize-hidden {
display: none;
}
.jp-FileBrowser .lm-AccordionPanel > h3:first-child {
display: none;
}
/*-----------------------------------------------------------------------------
| DirListing
|----------------------------------------------------------------------------*/
.jp-DirListing {
flex: 1 1 auto;
display: flex;
flex-direction: column;
outline: 0;
}
.jp-DirListing-header {
flex: 0 0 auto;
display: flex;
flex-direction: row;
align-items: center;
overflow: hidden;
border-top: var(--jp-border-width) solid var(--jp-border-color2);
border-bottom: var(--jp-border-width) solid var(--jp-border-color1);
box-shadow: var(--jp-toolbar-box-shadow);
z-index: 2;
}
.jp-DirListing-headerItem {
padding: 4px 12px 2px;
font-weight: 500;
}
.jp-DirListing-headerItem:hover {
background: var(--jp-layout-color2);
}
.jp-DirListing-headerItem.jp-id-name {
flex: 1 0 84px;
}
.jp-DirListing-headerItem.jp-id-modified {
flex: 0 0 112px;
border-left: var(--jp-border-width) solid var(--jp-border-color2);
text-align: right;
}
.jp-DirListing-headerItem.jp-id-filesize {
flex: 0 0 75px;
border-left: var(--jp-border-width) solid var(--jp-border-color2);
text-align: right;
}
.jp-id-narrow {
display: none;
flex: 0 0 5px;
padding: 4px;
border-left: var(--jp-border-width) solid var(--jp-border-color2);
text-align: right;
color: var(--jp-border-color2);
}
.jp-DirListing-narrow .jp-id-narrow {
display: block;
}
.jp-DirListing-narrow .jp-id-modified,
.jp-DirListing-narrow .jp-DirListing-itemModified {
display: none;
}
.jp-DirListing-headerItem.jp-mod-selected {
font-weight: 600;
}
/* increase specificity to override bundled default */
.jp-DirListing-content {
flex: 1 1 auto;
margin: 0;
padding: 0;
list-style-type: none;
overflow: auto;
background-color: var(--jp-layout-color1);
}
.jp-DirListing-content mark {
color: var(--jp-ui-font-color0);
background-color: transparent;
font-weight: bold;
}
.jp-DirListing-content .jp-DirListing-item.jp-mod-selected mark {
color: var(--jp-ui-inverse-font-color0);
}
/* Style the directory listing content when a user drops a file to upload */
.jp-DirListing.jp-mod-native-drop .jp-DirListing-content {
outline: 5px dashed rgba(128, 128, 128, 0.5);
outline-offset: -10px;
cursor: copy;
}
.jp-DirListing-item {
display: flex;
flex-direction: row;
align-items: center;
padding: 4px 12px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.jp-DirListing-checkboxWrapper {
/* Increases hit area of checkbox. */
padding: 4px;
}
.jp-DirListing-header
.jp-DirListing-checkboxWrapper
+ .jp-DirListing-headerItem {
padding-left: 4px;
}
.jp-DirListing-content .jp-DirListing-checkboxWrapper {
position: relative;
left: -4px;
margin: -4px 0 -4px -8px;
}
.jp-DirListing-checkboxWrapper.jp-mod-visible {
visibility: visible;
}
/* For devices that support hovering, hide checkboxes until hovered, selected...
*/
@media (hover: hover) {
.jp-DirListing-checkboxWrapper {
visibility: hidden;
}
.jp-DirListing-item:hover .jp-DirListing-checkboxWrapper,
.jp-DirListing-item.jp-mod-selected .jp-DirListing-checkboxWrapper {
visibility: visible;
}
}
.jp-DirListing-item[data-is-dot] {
opacity: 75%;
}
.jp-DirListing-item.jp-mod-selected {
color: var(--jp-ui-inverse-font-color1);
background: var(--jp-brand-color1);
}
.jp-DirListing-item.jp-mod-dropTarget {
background: var(--jp-brand-color3);
}
.jp-DirListing-item:hover:not(.jp-mod-selected) {
background: var(--jp-layout-color2);
}
.jp-DirListing-itemIcon {
flex: 0 0 20px;
margin-right: 4px;
}
.jp-DirListing-itemText {
flex: 1 0 64px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
user-select: none;
}
.jp-DirListing-itemText:focus {
outline-width: 2px;
outline-color: var(--jp-inverse-layout-color1);
outline-style: solid;
outline-offset: 1px;
}
.jp-DirListing-item.jp-mod-selected .jp-DirListing-itemText:focus {
outline-color: var(--jp-layout-color1);
}
.jp-DirListing-itemModified {
flex: 0 0 125px;
text-align: right;
}
.jp-DirListing-itemFileSize {
flex: 0 0 90px;
text-align: right;
}
.jp-DirListing-editor {
flex: 1 0 64px;
outline: none;
border: none;
color: var(--jp-ui-font-color1);
background-color: var(--jp-layout-color1);
}
.jp-DirListing-item.jp-mod-running .jp-DirListing-itemIcon::before {
color: var(--jp-success-color1);
content: '\25CF';
font-size: 8px;
position: absolute;
left: -8px;
}
.jp-DirListing-item.jp-mod-running.jp-mod-selected
.jp-DirListing-itemIcon::before {
color: var(--jp-ui-inverse-font-color1);
}
.jp-DirListing-item.lm-mod-drag-image,
.jp-DirListing-item.jp-mod-selected.lm-mod-drag-image {
font-size: var(--jp-ui-font-size1);
padding-left: 4px;
margin-left: 4px;
width: 160px;
background-color: var(--jp-ui-inverse-font-color2);
box-shadow: var(--jp-elevation-z2);
border-radius: 0;
color: var(--jp-ui-font-color1);
transform: translateX(-40%) translateY(-58%);
}
.jp-Document {
min-width: 120px;
min-height: 120px;
outline: none;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Main OutputArea
| OutputArea has a list of Outputs
|----------------------------------------------------------------------------*/
.jp-OutputArea {
overflow-y: auto;
}
.jp-OutputArea-child {
display: table;
table-layout: fixed;
width: 100%;
overflow: hidden;
}
.jp-OutputPrompt {
width: var(--jp-cell-prompt-width);
color: var(--jp-cell-outprompt-font-color);
font-family: var(--jp-cell-prompt-font-family);
padding: var(--jp-code-padding);
letter-spacing: var(--jp-cell-prompt-letter-spacing);
line-height: var(--jp-code-line-height);
font-size: var(--jp-code-font-size);
border: var(--jp-border-width) solid transparent;
opacity: var(--jp-cell-prompt-opacity);
/* Right align prompt text, don't wrap to handle large prompt numbers */
text-align: right;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
/* Disable text selection */
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.jp-OutputArea-prompt {
display: table-cell;
vertical-align: top;
}
.jp-OutputArea-output {
display: table-cell;
width: 100%;
height: auto;
overflow: auto;
user-select: text;
-moz-user-select: text;
-webkit-user-select: text;
-ms-user-select: text;
}
.jp-OutputArea .jp-RenderedText {
padding-left: 1ch;
}
/**
* Prompt overlay.
*/
.jp-OutputArea-promptOverlay {
position: absolute;
top: 0;
width: var(--jp-cell-prompt-width);
height: 100%;
opacity: 0.5;
}
.jp-OutputArea-promptOverlay:hover {
background: var(--jp-layout-color2);
box-shadow: inset 0 0 1px var(--jp-inverse-layout-color0);
cursor: zoom-out;
}
.jp-mod-outputsScrolled .jp-OutputArea-promptOverlay:hover {
cursor: zoom-in;
}
/**
* Isolated output.
*/
.jp-OutputArea-output.jp-mod-isolated {
width: 100%;
display: block;
}
/*
When drag events occur, `lm-mod-override-cursor` is added to the body.
Because iframes steal all cursor events, the following two rules are necessary
to suppress pointer events while resize drags are occurring. There may be a
better solution to this problem.
*/
body.lm-mod-override-cursor .jp-OutputArea-output.jp-mod-isolated {
position: relative;
}
body.lm-mod-override-cursor .jp-OutputArea-output.jp-mod-isolated::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: transparent;
}
/* pre */
.jp-OutputArea-output pre {
border: none;
margin: 0;
padding: 0;
overflow-x: auto;
overflow-y: auto;
word-break: break-all;
word-wrap: break-word;
white-space: pre-wrap;
}
/* tables */
.jp-OutputArea-output.jp-RenderedHTMLCommon table {
margin-left: 0;
margin-right: 0;
}
/* description lists */
.jp-OutputArea-output dl,
.jp-OutputArea-output dt,
.jp-OutputArea-output dd {
display: block;
}
.jp-OutputArea-output dl {
width: 100%;
overflow: hidden;
padding: 0;
margin: 0;
}
.jp-OutputArea-output dt {
font-weight: bold;
float: left;
width: 20%;
padding: 0;
margin: 0;
}
.jp-OutputArea-output dd {
float: left;
width: 80%;
padding: 0;
margin: 0;
}
.jp-TrimmedOutputs pre {
background: var(--jp-layout-color3);
font-size: calc(var(--jp-code-font-size) * 1.4);
text-align: center;
text-transform: uppercase;
}
/* Hide the gutter in case of
* - nested output areas (e.g. in the case of output widgets)
* - mirrored output areas
*/
.jp-OutputArea .jp-OutputArea .jp-OutputArea-prompt {
display: none;
}
/* Hide empty lines in the output area, for instance due to cleared widgets */
.jp-OutputArea-prompt:empty {
padding: 0;
border: 0;
}
/*-----------------------------------------------------------------------------
| executeResult is added to any Output-result for the display of the object
| returned by a cell
|----------------------------------------------------------------------------*/
.jp-OutputArea-output.jp-OutputArea-executeResult {
margin-left: 0;
width: 100%;
}
/* Text output with the Out[] prompt needs a top padding to match the
* alignment of the Out[] prompt itself.
*/
.jp-OutputArea-executeResult .jp-RenderedText.jp-OutputArea-output {
padding-top: var(--jp-code-padding);
border-top: var(--jp-border-width) solid transparent;
}
/*-----------------------------------------------------------------------------
| The Stdin output
|----------------------------------------------------------------------------*/
.jp-Stdin-prompt {
color: var(--jp-content-font-color0);
padding-right: var(--jp-code-padding);
vertical-align: baseline;
flex: 0 0 auto;
}
.jp-Stdin-input {
font-family: var(--jp-code-font-family);
font-size: inherit;
color: inherit;
background-color: inherit;
width: 42%;
min-width: 200px;
/* make sure input baseline aligns with prompt */
vertical-align: baseline;
/* padding + margin = 0.5em between prompt and cursor */
padding: 0 0.25em;
margin: 0 0.25em;
flex: 0 0 70%;
}
.jp-Stdin-input::placeholder {
opacity: 0;
}
.jp-Stdin-input:focus {
box-shadow: none;
}
.jp-Stdin-input:focus::placeholder {
opacity: 1;
}
/*-----------------------------------------------------------------------------
| Output Area View
|----------------------------------------------------------------------------*/
.jp-LinkedOutputView .jp-OutputArea {
height: 100%;
display: block;
}
.jp-LinkedOutputView .jp-OutputArea-output:only-child {
height: 100%;
}
/*-----------------------------------------------------------------------------
| Printing
|----------------------------------------------------------------------------*/
@media print {
.jp-OutputArea-child {
break-inside: avoid-page;
}
}
/*-----------------------------------------------------------------------------
| Mobile
|----------------------------------------------------------------------------*/
@media only screen and (max-width: 760px) {
.jp-OutputPrompt {
display: table-row;
text-align: left;
}
.jp-OutputArea-child .jp-OutputArea-output {
display: table-row;
margin-left: var(--jp-notebook-padding);
}
}
/* Trimmed outputs warning */
.jp-TrimmedOutputs > a {
margin: 10px;
text-decoration: none;
cursor: pointer;
}
.jp-TrimmedOutputs > a:hover {
text-decoration: none;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Table of Contents
|----------------------------------------------------------------------------*/
:root {
--jp-private-toc-active-width: 4px;
}
.jp-TableOfContents {
display: flex;
flex-direction: column;
background: var(--jp-layout-color1);
color: var(--jp-ui-font-color1);
font-size: var(--jp-ui-font-size1);
height: 100%;
}
.jp-TableOfContents-placeholder {
text-align: center;
}
.jp-TableOfContents-placeholderContent {
color: var(--jp-content-font-color2);
padding: 8px;
}
.jp-TableOfContents-placeholderContent > h3 {
margin-bottom: var(--jp-content-heading-margin-bottom);
}
.jp-TableOfContents .jp-SidePanel-content {
overflow-y: auto;
}
.jp-TableOfContents-tree {
margin: 4px;
}
.jp-TableOfContents ol {
list-style-type: none;
}
/* stylelint-disable-next-line selector-max-type */
.jp-TableOfContents li > ol {
/* Align left border with triangle icon center */
padding-left: 11px;
}
.jp-TableOfContents-content {
/* left margin for the active heading indicator */
margin: 0 0 0 var(--jp-private-toc-active-width);
padding: 0;
background-color: var(--jp-layout-color1);
}
.jp-tocItem {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.jp-tocItem-heading {
display: flex;
cursor: pointer;
}
.jp-tocItem-heading:hover {
background-color: var(--jp-layout-color2);
}
.jp-tocItem-content {
display: block;
padding: 4px 0;
white-space: nowrap;
text-overflow: ellipsis;
overflow-x: hidden;
}
.jp-tocItem-collapser {
height: 20px;
margin: 2px 2px 0;
padding: 0;
background: none;
border: none;
cursor: pointer;
}
.jp-tocItem-collapser:hover {
background-color: var(--jp-layout-color3);
}
/* Active heading indicator */
.jp-tocItem-heading::before {
content: ' ';
background: transparent;
width: var(--jp-private-toc-active-width);
height: 24px;
position: absolute;
left: 0;
border-radius: var(--jp-border-radius);
}
.jp-tocItem-heading.jp-tocItem-active::before {
background-color: var(--jp-brand-color1);
}
.jp-tocItem-heading:hover.jp-tocItem-active::before {
background: var(--jp-brand-color0);
opacity: 1;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-Collapser {
flex: 0 0 var(--jp-cell-collapser-width);
padding: 0;
margin: 0;
border: none;
outline: none;
background: transparent;
border-radius: var(--jp-border-radius);
opacity: 1;
}
.jp-Collapser-child {
display: block;
width: 100%;
box-sizing: border-box;
/* height: 100% doesn't work because the height of its parent is computed from content */
position: absolute;
top: 0;
bottom: 0;
}
/*-----------------------------------------------------------------------------
| Printing
|----------------------------------------------------------------------------*/
/*
Hiding collapsers in print mode.
Note: input and output wrappers have "display: block" propery in print mode.
*/
@media print {
.jp-Collapser {
display: none;
}
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Header/Footer
|----------------------------------------------------------------------------*/
/* Hidden by zero height by default */
.jp-CellHeader,
.jp-CellFooter {
height: 0;
width: 100%;
padding: 0;
margin: 0;
border: none;
outline: none;
background: transparent;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Input
|----------------------------------------------------------------------------*/
/* All input areas */
.jp-InputArea {
display: table;
table-layout: fixed;
width: 100%;
overflow: hidden;
}
.jp-InputArea-editor {
display: table-cell;
overflow: hidden;
vertical-align: top;
/* This is the non-active, default styling */
border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);
border-radius: 0;
background: var(--jp-cell-editor-background);
}
.jp-InputPrompt {
display: table-cell;
vertical-align: top;
width: var(--jp-cell-prompt-width);
color: var(--jp-cell-inprompt-font-color);
font-family: var(--jp-cell-prompt-font-family);
padding: var(--jp-code-padding);
letter-spacing: var(--jp-cell-prompt-letter-spacing);
opacity: var(--jp-cell-prompt-opacity);
line-height: var(--jp-code-line-height);
font-size: var(--jp-code-font-size);
border: var(--jp-border-width) solid transparent;
/* Right align prompt text, don't wrap to handle large prompt numbers */
text-align: right;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
/* Disable text selection */
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
/*-----------------------------------------------------------------------------
| Mobile
|----------------------------------------------------------------------------*/
@media only screen and (max-width: 760px) {
.jp-InputArea-editor {
display: table-row;
margin-left: var(--jp-notebook-padding);
}
.jp-InputPrompt {
display: table-row;
text-align: left;
}
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Placeholder
|----------------------------------------------------------------------------*/
.jp-Placeholder {
display: table;
table-layout: fixed;
width: 100%;
}
.jp-Placeholder-prompt {
display: table-cell;
box-sizing: border-box;
}
.jp-Placeholder-content {
display: table-cell;
padding: 4px 6px;
border: 1px solid transparent;
border-radius: 0;
background: none;
box-sizing: border-box;
cursor: pointer;
}
.jp-Placeholder-contentContainer {
display: flex;
}
.jp-Placeholder-content:hover,
.jp-InputPlaceholder > .jp-Placeholder-content:hover {
border-color: var(--jp-layout-color3);
}
.jp-Placeholder-content .jp-MoreHorizIcon {
width: 32px;
height: 16px;
border: 1px solid transparent;
border-radius: var(--jp-border-radius);
}
.jp-Placeholder-content .jp-MoreHorizIcon:hover {
border: 1px solid var(--jp-border-color1);
box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.25);
background-color: var(--jp-layout-color0);
}
.jp-PlaceholderText {
white-space: nowrap;
overflow-x: hidden;
color: var(--jp-inverse-layout-color3);
font-family: var(--jp-code-font-family);
}
.jp-InputPlaceholder > .jp-Placeholder-content {
border-color: var(--jp-cell-editor-border-color);
background: var(--jp-cell-editor-background);
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Private CSS variables
|----------------------------------------------------------------------------*/
:root {
--jp-private-cell-scrolling-output-offset: 5px;
}
/*-----------------------------------------------------------------------------
| Cell
|----------------------------------------------------------------------------*/
.jp-Cell {
padding: var(--jp-cell-padding);
margin: 0;
border: none;
outline: none;
background: transparent;
}
/*-----------------------------------------------------------------------------
| Common input/output
|----------------------------------------------------------------------------*/
.jp-Cell-inputWrapper,
.jp-Cell-outputWrapper {
display: flex;
flex-direction: row;
padding: 0;
margin: 0;
/* Added to reveal the box-shadow on the input and output collapsers. */
overflow: visible;
}
/* Only input/output areas inside cells */
.jp-Cell-inputArea,
.jp-Cell-outputArea {
flex: 1 1 auto;
}
/*-----------------------------------------------------------------------------
| Collapser
|----------------------------------------------------------------------------*/
/* Make the output collapser disappear when there is not output, but do so
* in a manner that leaves it in the layout and preserves its width.
*/
.jp-Cell.jp-mod-noOutputs .jp-Cell-outputCollapser {
border: none !important;
background: transparent !important;
}
.jp-Cell:not(.jp-mod-noOutputs) .jp-Cell-outputCollapser {
min-height: var(--jp-cell-collapser-min-height);
}
/*-----------------------------------------------------------------------------
| Output
|----------------------------------------------------------------------------*/
/* Put a space between input and output when there IS output */
.jp-Cell:not(.jp-mod-noOutputs) .jp-Cell-outputWrapper {
margin-top: 5px;
}
.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea {
overflow-y: auto;
max-height: 24em;
margin-left: var(--jp-private-cell-scrolling-output-offset);
resize: vertical;
}
.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea[style*='height'] {
max-height: unset;
}
.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea::after {
content: ' ';
box-shadow: inset 0 0 6px 2px rgb(0 0 0 / 30%);
width: 100%;
height: 100%;
position: sticky;
bottom: 0;
top: 0;
margin-top: -50%;
float: left;
display: block;
pointer-events: none;
}
.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-child {
padding-top: 6px;
}
.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-prompt {
width: calc(
var(--jp-cell-prompt-width) - var(--jp-private-cell-scrolling-output-offset)
);
}
.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-promptOverlay {
left: calc(-1 * var(--jp-private-cell-scrolling-output-offset));
}
/*-----------------------------------------------------------------------------
| CodeCell
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| MarkdownCell
|----------------------------------------------------------------------------*/
.jp-MarkdownOutput {
display: table-cell;
width: 100%;
margin-top: 0;
margin-bottom: 0;
padding-left: var(--jp-code-padding);
}
.jp-MarkdownOutput.jp-RenderedHTMLCommon {
overflow: auto;
}
/* collapseHeadingButton (show always if hiddenCellsButton is _not_ shown) */
.jp-collapseHeadingButton {
display: flex;
min-height: var(--jp-cell-collapser-min-height);
font-size: var(--jp-code-font-size);
position: absolute;
background-color: transparent;
background-size: 25px;
background-repeat: no-repeat;
background-position-x: center;
background-position-y: top;
background-image: var(--jp-icon-caret-down);
right: 0;
top: 0;
bottom: 0;
}
.jp-collapseHeadingButton.jp-mod-collapsed {
background-image: var(--jp-icon-caret-right);
}
/*
set the container font size to match that of content
so that the nested collapse buttons have the right size
*/
.jp-MarkdownCell .jp-InputPrompt {
font-size: var(--jp-content-font-size1);
}
/*
Align collapseHeadingButton with cell top header
The font sizes are identical to the ones in packages/rendermime/style/base.css
*/
.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='1'] {
font-size: var(--jp-content-font-size5);
background-position-y: calc(0.3 * var(--jp-content-font-size5));
}
.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='2'] {
font-size: var(--jp-content-font-size4);
background-position-y: calc(0.3 * var(--jp-content-font-size4));
}
.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='3'] {
font-size: var(--jp-content-font-size3);
background-position-y: calc(0.3 * var(--jp-content-font-size3));
}
.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='4'] {
font-size: var(--jp-content-font-size2);
background-position-y: calc(0.3 * var(--jp-content-font-size2));
}
.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='5'] {
font-size: var(--jp-content-font-size1);
background-position-y: top;
}
.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='6'] {
font-size: var(--jp-content-font-size0);
background-position-y: top;
}
/* collapseHeadingButton (show only on (hover,active) if hiddenCellsButton is shown) */
.jp-Notebook.jp-mod-showHiddenCellsButton .jp-collapseHeadingButton {
display: none;
}
.jp-Notebook.jp-mod-showHiddenCellsButton
:is(.jp-MarkdownCell:hover, .jp-mod-active)
.jp-collapseHeadingButton {
display: flex;
}
/* showHiddenCellsButton (only show if jp-mod-showHiddenCellsButton is set, which
is a consequence of the showHiddenCellsButton option in Notebook Settings)*/
.jp-Notebook.jp-mod-showHiddenCellsButton .jp-showHiddenCellsButton {
margin-left: calc(var(--jp-cell-prompt-width) + 2 * var(--jp-code-padding));
margin-top: var(--jp-code-padding);
border: 1px solid var(--jp-border-color2);
background-color: var(--jp-border-color3) !important;
color: var(--jp-content-font-color0) !important;
display: flex;
}
.jp-Notebook.jp-mod-showHiddenCellsButton .jp-showHiddenCellsButton:hover {
background-color: var(--jp-border-color2) !important;
}
.jp-showHiddenCellsButton {
display: none;
}
/*-----------------------------------------------------------------------------
| Printing
|----------------------------------------------------------------------------*/
/*
Using block instead of flex to allow the use of the break-inside CSS property for
cell outputs.
*/
@media print {
.jp-Cell-inputWrapper,
.jp-Cell-outputWrapper {
display: block;
}
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Variables
|----------------------------------------------------------------------------*/
:root {
--jp-notebook-toolbar-padding: 2px 5px 2px 2px;
}
/*-----------------------------------------------------------------------------
/*-----------------------------------------------------------------------------
| Styles
|----------------------------------------------------------------------------*/
.jp-NotebookPanel-toolbar {
padding: var(--jp-notebook-toolbar-padding);
/* disable paint containment from lumino 2.0 default strict CSS containment */
contain: style size !important;
}
.jp-Toolbar-item.jp-Notebook-toolbarCellType .jp-select-wrapper.jp-mod-focused {
border: none;
box-shadow: none;
}
.jp-Notebook-toolbarCellTypeDropdown select {
height: 24px;
font-size: var(--jp-ui-font-size1);
line-height: 14px;
border-radius: 0;
display: block;
}
.jp-Notebook-toolbarCellTypeDropdown span {
top: 5px !important;
}
.jp-Toolbar-responsive-popup {
position: absolute;
height: fit-content;
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-end;
border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color);
box-shadow: var(--jp-toolbar-box-shadow);
background: var(--jp-toolbar-background);
min-height: var(--jp-toolbar-micro-height);
padding: var(--jp-notebook-toolbar-padding);
z-index: 1;
right: 0;
top: 0;
}
.jp-Toolbar > .jp-Toolbar-responsive-opener {
margin-left: auto;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Variables
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
/*-----------------------------------------------------------------------------
| Styles
|----------------------------------------------------------------------------*/
.jp-Notebook-ExecutionIndicator {
position: relative;
display: inline-block;
height: 100%;
z-index: 9997;
}
.jp-Notebook-ExecutionIndicator-tooltip {
visibility: hidden;
height: auto;
width: max-content;
width: -moz-max-content;
background-color: var(--jp-layout-color2);
color: var(--jp-ui-font-color1);
text-align: justify;
border-radius: 6px;
padding: 0 5px;
position: fixed;
display: table;
}
.jp-Notebook-ExecutionIndicator-tooltip.up {
transform: translateX(-50%) translateY(-100%) translateY(-32px);
}
.jp-Notebook-ExecutionIndicator-tooltip.down {
transform: translateX(calc(-100% + 16px)) translateY(5px);
}
.jp-Notebook-ExecutionIndicator-tooltip.hidden {
display: none;
}
.jp-Notebook-ExecutionIndicator:hover .jp-Notebook-ExecutionIndicator-tooltip {
visibility: visible;
}
.jp-Notebook-ExecutionIndicator span {
font-size: var(--jp-ui-font-size1);
font-family: var(--jp-ui-font-family);
color: var(--jp-ui-font-color1);
line-height: 24px;
display: block;
}
.jp-Notebook-ExecutionIndicator-progress-bar {
display: flex;
justify-content: center;
height: 100%;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
/*
* Execution indicator
*/
.jp-tocItem-content::after {
content: '';
/* Must be identical to form a circle */
width: 12px;
height: 12px;
background: none;
border: none;
position: absolute;
right: 0;
}
.jp-tocItem-content[data-running='0']::after {
border-radius: 50%;
border: var(--jp-border-width) solid var(--jp-inverse-layout-color3);
background: none;
}
.jp-tocItem-content[data-running='1']::after {
border-radius: 50%;
border: var(--jp-border-width) solid var(--jp-inverse-layout-color3);
background-color: var(--jp-inverse-layout-color3);
}
.jp-tocItem-content[data-running='0'],
.jp-tocItem-content[data-running='1'] {
margin-right: 12px;
}
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
.jp-Notebook-footer {
height: 27px;
margin-left: calc(
var(--jp-cell-prompt-width) + var(--jp-cell-collapser-width) +
var(--jp-cell-padding)
);
width: calc(
100% -
(
var(--jp-cell-prompt-width) + var(--jp-cell-collapser-width) +
var(--jp-cell-padding) + var(--jp-cell-padding)
)
);
border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);
color: var(--jp-ui-font-color3);
margin-top: 6px;
background: none;
cursor: pointer;
}
.jp-Notebook-footer:focus {
border-color: var(--jp-cell-editor-active-border-color);
}
/* For devices that support hovering, hide footer until hover */
@media (hover: hover) {
.jp-Notebook-footer {
opacity: 0;
}
.jp-Notebook-footer:focus,
.jp-Notebook-footer:hover {
opacity: 1;
}
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Imports
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| CSS variables
|----------------------------------------------------------------------------*/
:root {
--jp-side-by-side-output-size: 1fr;
--jp-side-by-side-resized-cell: var(--jp-side-by-side-output-size);
--jp-private-notebook-dragImage-width: 304px;
--jp-private-notebook-dragImage-height: 36px;
--jp-private-notebook-selected-color: var(--md-blue-400);
--jp-private-notebook-active-color: var(--md-green-400);
}
/*-----------------------------------------------------------------------------
| Notebook
|----------------------------------------------------------------------------*/
/* stylelint-disable selector-max-class */
.jp-NotebookPanel {
display: block;
height: 100%;
}
.jp-NotebookPanel.jp-Document {
min-width: 240px;
min-height: 120px;
}
.jp-Notebook {
padding: var(--jp-notebook-padding);
outline: none;
overflow: auto;
background: var(--jp-layout-color0);
}
.jp-Notebook.jp-mod-scrollPastEnd::after {
display: block;
content: '';
min-height: var(--jp-notebook-scroll-padding);
}
.jp-MainAreaWidget-ContainStrict .jp-Notebook * {
contain: strict;
}
.jp-Notebook .jp-Cell {
overflow: visible;
}
.jp-Notebook .jp-Cell .jp-InputPrompt {
cursor: move;
}
/*-----------------------------------------------------------------------------
| Notebook state related styling
|
| The notebook and cells each have states, here are the possibilities:
|
| - Notebook
| - Command
| - Edit
| - Cell
| - None
| - Active (only one can be active)
| - Selected (the cells actions are applied to)
| - Multiselected (when multiple selected, the cursor)
| - No outputs
|----------------------------------------------------------------------------*/
/* Command or edit modes */
.jp-Notebook .jp-Cell:not(.jp-mod-active) .jp-InputPrompt {
opacity: var(--jp-cell-prompt-not-active-opacity);
color: var(--jp-cell-prompt-not-active-font-color);
}
.jp-Notebook .jp-Cell:not(.jp-mod-active) .jp-OutputPrompt {
opacity: var(--jp-cell-prompt-not-active-opacity);
color: var(--jp-cell-prompt-not-active-font-color);
}
/* cell is active */
.jp-Notebook .jp-Cell.jp-mod-active .jp-Collapser {
background: var(--jp-brand-color1);
}
/* cell is dirty */
.jp-Notebook .jp-Cell.jp-mod-dirty .jp-InputPrompt {
color: var(--jp-warn-color1);
}
.jp-Notebook .jp-Cell.jp-mod-dirty .jp-InputPrompt::before {
color: var(--jp-warn-color1);
content: '•';
}
.jp-Notebook .jp-Cell.jp-mod-active.jp-mod-dirty .jp-Collapser {
background: var(--jp-warn-color1);
}
/* collapser is hovered */
.jp-Notebook .jp-Cell .jp-Collapser:hover {
box-shadow: var(--jp-elevation-z2);
background: var(--jp-brand-color1);
opacity: var(--jp-cell-collapser-not-active-hover-opacity);
}
/* cell is active and collapser is hovered */
.jp-Notebook .jp-Cell.jp-mod-active .jp-Collapser:hover {
background: var(--jp-brand-color0);
opacity: 1;
}
/* Command mode */
.jp-Notebook.jp-mod-commandMode .jp-Cell.jp-mod-selected {
background: var(--jp-notebook-multiselected-color);
}
.jp-Notebook.jp-mod-commandMode
.jp-Cell.jp-mod-active.jp-mod-selected:not(.jp-mod-multiSelected) {
background: transparent;
}
/* Edit mode */
.jp-Notebook.jp-mod-editMode .jp-Cell.jp-mod-active .jp-InputArea-editor {
border: var(--jp-border-width) solid var(--jp-cell-editor-active-border-color);
box-shadow: var(--jp-input-box-shadow);
background-color: var(--jp-cell-editor-active-background);
}
/*-----------------------------------------------------------------------------
| Notebook drag and drop
|----------------------------------------------------------------------------*/
.jp-Notebook-cell.jp-mod-dropSource {
opacity: 0.5;
}
.jp-Notebook-cell.jp-mod-dropTarget,
.jp-Notebook.jp-mod-commandMode
.jp-Notebook-cell.jp-mod-active.jp-mod-selected.jp-mod-dropTarget {
border-top-color: var(--jp-private-notebook-selected-color);
border-top-style: solid;
border-top-width: 2px;
}
.jp-dragImage {
display: block;
flex-direction: row;
width: var(--jp-private-notebook-dragImage-width);
height: var(--jp-private-notebook-dragImage-height);
border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);
background: var(--jp-cell-editor-background);
overflow: visible;
}
.jp-dragImage-singlePrompt {
box-shadow: 2px 2px 4px 0 rgba(0, 0, 0, 0.12);
}
.jp-dragImage .jp-dragImage-content {
flex: 1 1 auto;
z-index: 2;
font-size: var(--jp-code-font-size);
font-family: var(--jp-code-font-family);
line-height: var(--jp-code-line-height);
padding: var(--jp-code-padding);
border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);
background: var(--jp-cell-editor-background-color);
color: var(--jp-content-font-color3);
text-align: left;
margin: 4px 4px 4px 0;
}
.jp-dragImage .jp-dragImage-prompt {
flex: 0 0 auto;
min-width: 36px;
color: var(--jp-cell-inprompt-font-color);
padding: var(--jp-code-padding);
padding-left: 12px;
font-family: var(--jp-cell-prompt-font-family);
letter-spacing: var(--jp-cell-prompt-letter-spacing);
line-height: 1.9;
font-size: var(--jp-code-font-size);
border: var(--jp-border-width) solid transparent;
}
.jp-dragImage-multipleBack {
z-index: -1;
position: absolute;
height: 32px;
width: 300px;
top: 8px;
left: 8px;
background: var(--jp-layout-color2);
border: var(--jp-border-width) solid var(--jp-input-border-color);
box-shadow: 2px 2px 4px 0 rgba(0, 0, 0, 0.12);
}
/*-----------------------------------------------------------------------------
| Cell toolbar
|----------------------------------------------------------------------------*/
.jp-NotebookTools {
display: block;
min-width: var(--jp-sidebar-min-width);
color: var(--jp-ui-font-color1);
background: var(--jp-layout-color1);
/* This is needed so that all font sizing of children done in ems is
* relative to this base size */
font-size: var(--jp-ui-font-size1);
overflow: auto;
}
.jp-ActiveCellTool {
padding: 12px 0;
display: flex;
}
.jp-ActiveCellTool-Content {
flex: 1 1 auto;
}
.jp-ActiveCellTool .jp-ActiveCellTool-CellContent {
background: var(--jp-cell-editor-background);
border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);
border-radius: 0;
min-height: 29px;
}
.jp-ActiveCellTool .jp-InputPrompt {
min-width: calc(var(--jp-cell-prompt-width) * 0.75);
}
.jp-ActiveCellTool-CellContent > pre {
padding: 5px 4px;
margin: 0;
white-space: normal;
}
.jp-MetadataEditorTool {
flex-direction: column;
padding: 12px 0;
}
.jp-RankedPanel > :not(:first-child) {
margin-top: 12px;
}
.jp-KeySelector select.jp-mod-styled {
font-size: var(--jp-ui-font-size1);
color: var(--jp-ui-font-color0);
border: var(--jp-border-width) solid var(--jp-border-color1);
}
.jp-KeySelector label,
.jp-MetadataEditorTool label,
.jp-NumberSetter label {
line-height: 1.4;
}
.jp-NotebookTools .jp-select-wrapper {
margin-top: 4px;
margin-bottom: 0;
}
.jp-NumberSetter input {
width: 100%;
margin-top: 4px;
}
.jp-NotebookTools .jp-Collapse {
margin-top: 16px;
}
/*-----------------------------------------------------------------------------
| Presentation Mode (.jp-mod-presentationMode)
|----------------------------------------------------------------------------*/
.jp-mod-presentationMode .jp-Notebook {
--jp-content-font-size1: var(--jp-content-presentation-font-size1);
--jp-code-font-size: var(--jp-code-presentation-font-size);
}
.jp-mod-presentationMode .jp-Notebook .jp-Cell .jp-InputPrompt,
.jp-mod-presentationMode .jp-Notebook .jp-Cell .jp-OutputPrompt {
flex: 0 0 110px;
}
/*-----------------------------------------------------------------------------
| Side-by-side Mode (.jp-mod-sideBySide)
|----------------------------------------------------------------------------*/
.jp-mod-sideBySide.jp-Notebook .jp-Notebook-cell {
margin-top: 3em;
margin-bottom: 3em;
margin-left: 5%;
margin-right: 5%;
}
.jp-mod-sideBySide.jp-Notebook .jp-CodeCell {
display: grid;
grid-template-columns: minmax(0, 1fr) min-content minmax(
0,
var(--jp-side-by-side-output-size)
);
grid-template-rows: auto minmax(0, 1fr) auto;
grid-template-areas:
'header header header'
'input handle output'
'footer footer footer';
}
.jp-mod-sideBySide.jp-Notebook .jp-CodeCell.jp-mod-resizedCell {
grid-template-columns: minmax(0, 1fr) min-content minmax(
0,
var(--jp-side-by-side-resized-cell)
);
}
.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellHeader {
grid-area: header;
}
.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-Cell-inputWrapper {
grid-area: input;
}
.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-Cell-outputWrapper {
/* overwrite the default margin (no vertical separation needed in side by side move */
margin-top: 0;
grid-area: output;
}
.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellFooter {
grid-area: footer;
}
.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellResizeHandle {
grid-area: handle;
user-select: none;
display: block;
height: 100%;
cursor: ew-resize;
padding: 0 var(--jp-cell-padding);
}
.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellResizeHandle::after {
content: '';
display: block;
background: var(--jp-border-color2);
height: 100%;
width: 5px;
}
.jp-mod-sideBySide.jp-Notebook
.jp-CodeCell.jp-mod-resizedCell
.jp-CellResizeHandle::after {
background: var(--jp-border-color0);
}
.jp-CellResizeHandle {
display: none;
}
/*-----------------------------------------------------------------------------
| Placeholder
|----------------------------------------------------------------------------*/
.jp-Cell-Placeholder {
padding-left: 55px;
}
.jp-Cell-Placeholder-wrapper {
background: #fff;
border: 1px solid;
border-color: #e5e6e9 #dfe0e4 #d0d1d5;
border-radius: 4px;
-webkit-border-radius: 4px;
margin: 10px 15px;
}
.jp-Cell-Placeholder-wrapper-inner {
padding: 15px;
position: relative;
}
.jp-Cell-Placeholder-wrapper-body {
background-repeat: repeat;
background-size: 50% auto;
}
.jp-Cell-Placeholder-wrapper-body div {
background: #f6f7f8;
background-image: -webkit-linear-gradient(
left,
#f6f7f8 0%,
#edeef1 20%,
#f6f7f8 40%,
#f6f7f8 100%
);
background-repeat: no-repeat;
background-size: 800px 104px;
height: 104px;
position: absolute;
right: 15px;
left: 15px;
top: 15px;
}
div.jp-Cell-Placeholder-h1 {
top: 20px;
height: 20px;
left: 15px;
width: 150px;
}
div.jp-Cell-Placeholder-h2 {
left: 15px;
top: 50px;
height: 10px;
width: 100px;
}
div.jp-Cell-Placeholder-content-1,
div.jp-Cell-Placeholder-content-2,
div.jp-Cell-Placeholder-content-3 {
left: 15px;
right: 15px;
height: 10px;
}
div.jp-Cell-Placeholder-content-1 {
top: 100px;
}
div.jp-Cell-Placeholder-content-2 {
top: 120px;
}
div.jp-Cell-Placeholder-content-3 {
top: 140px;
}
</style>
<style type="text/css">
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*
The following CSS variables define the main, public API for styling JupyterLab.
These variables should be used by all plugins wherever possible. In other
words, plugins should not define custom colors, sizes, etc unless absolutely
necessary. This enables users to change the visual theme of JupyterLab
by changing these variables.
Many variables appear in an ordered sequence (0,1,2,3). These sequences
are designed to work well together, so for example, `--jp-border-color1` should
be used with `--jp-layout-color1`. The numbers have the following meanings:
* 0: super-primary, reserved for special emphasis
* 1: primary, most important under normal situations
* 2: secondary, next most important under normal situations
* 3: tertiary, next most important under normal situations
Throughout JupyterLab, we are mostly following principles from Google's
Material Design when selecting colors. We are not, however, following
all of MD as it is not optimized for dense, information rich UIs.
*/
:root {
/* Elevation
*
* We style box-shadows using Material Design's idea of elevation. These particular numbers are taken from here:
*
* https://github.com/material-components/material-components-web
* https://material-components-web.appspot.com/elevation.html
*/
--jp-shadow-base-lightness: 0;
--jp-shadow-umbra-color: rgba(
var(--jp-shadow-base-lightness),
var(--jp-shadow-base-lightness),
var(--jp-shadow-base-lightness),
0.2
);
--jp-shadow-penumbra-color: rgba(
var(--jp-shadow-base-lightness),
var(--jp-shadow-base-lightness),
var(--jp-shadow-base-lightness),
0.14
);
--jp-shadow-ambient-color: rgba(
var(--jp-shadow-base-lightness),
var(--jp-shadow-base-lightness),
var(--jp-shadow-base-lightness),
0.12
);
--jp-elevation-z0: none;
--jp-elevation-z1: 0 2px 1px -1px var(--jp-shadow-umbra-color),
0 1px 1px 0 var(--jp-shadow-penumbra-color),
0 1px 3px 0 var(--jp-shadow-ambient-color);
--jp-elevation-z2: 0 3px 1px -2px var(--jp-shadow-umbra-color),
0 2px 2px 0 var(--jp-shadow-penumbra-color),
0 1px 5px 0 var(--jp-shadow-ambient-color);
--jp-elevation-z4: 0 2px 4px -1px var(--jp-shadow-umbra-color),
0 4px 5px 0 var(--jp-shadow-penumbra-color),
0 1px 10px 0 var(--jp-shadow-ambient-color);
--jp-elevation-z6: 0 3px 5px -1px var(--jp-shadow-umbra-color),
0 6px 10px 0 var(--jp-shadow-penumbra-color),
0 1px 18px 0 var(--jp-shadow-ambient-color);
--jp-elevation-z8: 0 5px 5px -3px var(--jp-shadow-umbra-color),
0 8px 10px 1px var(--jp-shadow-penumbra-color),
0 3px 14px 2px var(--jp-shadow-ambient-color);
--jp-elevation-z12: 0 7px 8px -4px var(--jp-shadow-umbra-color),
0 12px 17px 2px var(--jp-shadow-penumbra-color),
0 5px 22px 4px var(--jp-shadow-ambient-color);
--jp-elevation-z16: 0 8px 10px -5px var(--jp-shadow-umbra-color),
0 16px 24px 2px var(--jp-shadow-penumbra-color),
0 6px 30px 5px var(--jp-shadow-ambient-color);
--jp-elevation-z20: 0 10px 13px -6px var(--jp-shadow-umbra-color),
0 20px 31px 3px var(--jp-shadow-penumbra-color),
0 8px 38px 7px var(--jp-shadow-ambient-color);
--jp-elevation-z24: 0 11px 15px -7px var(--jp-shadow-umbra-color),
0 24px 38px 3px var(--jp-shadow-penumbra-color),
0 9px 46px 8px var(--jp-shadow-ambient-color);
/* Borders
*
* The following variables, specify the visual styling of borders in JupyterLab.
*/
--jp-border-width: 1px;
--jp-border-color0: var(--md-grey-400);
--jp-border-color1: var(--md-grey-400);
--jp-border-color2: var(--md-grey-300);
--jp-border-color3: var(--md-grey-200);
--jp-inverse-border-color: var(--md-grey-600);
--jp-border-radius: 2px;
/* UI Fonts
*
* The UI font CSS variables are used for the typography all of the JupyterLab
* user interface elements that are not directly user generated content.
*
* The font sizing here is done assuming that the body font size of --jp-ui-font-size1
* is applied to a parent element. When children elements, such as headings, are sized
* in em all things will be computed relative to that body size.
*/
--jp-ui-font-scale-factor: 1.2;
--jp-ui-font-size0: 0.83333em;
--jp-ui-font-size1: 13px; /* Base font size */
--jp-ui-font-size2: 1.2em;
--jp-ui-font-size3: 1.44em;
--jp-ui-font-family: system-ui, -apple-system, blinkmacsystemfont, 'Segoe UI',
helvetica, arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
'Segoe UI Symbol';
/*
* Use these font colors against the corresponding main layout colors.
* In a light theme, these go from dark to light.
*/
/* Defaults use Material Design specification */
--jp-ui-font-color0: rgba(0, 0, 0, 1);
--jp-ui-font-color1: rgba(0, 0, 0, 0.87);
--jp-ui-font-color2: rgba(0, 0, 0, 0.54);
--jp-ui-font-color3: rgba(0, 0, 0, 0.38);
/*
* Use these against the brand/accent/warn/error colors.
* These will typically go from light to darker, in both a dark and light theme.
*/
--jp-ui-inverse-font-color0: rgba(255, 255, 255, 1);
--jp-ui-inverse-font-color1: rgba(255, 255, 255, 1);
--jp-ui-inverse-font-color2: rgba(255, 255, 255, 0.7);
--jp-ui-inverse-font-color3: rgba(255, 255, 255, 0.5);
/* Content Fonts
*
* Content font variables are used for typography of user generated content.
*
* The font sizing here is done assuming that the body font size of --jp-content-font-size1
* is applied to a parent element. When children elements, such as headings, are sized
* in em all things will be computed relative to that body size.
*/
--jp-content-line-height: 1.6;
--jp-content-font-scale-factor: 1.2;
--jp-content-font-size0: 0.83333em;
--jp-content-font-size1: 14px; /* Base font size */
--jp-content-font-size2: 1.2em;
--jp-content-font-size3: 1.44em;
--jp-content-font-size4: 1.728em;
--jp-content-font-size5: 2.0736em;
/* This gives a magnification of about 125% in presentation mode over normal. */
--jp-content-presentation-font-size1: 17px;
--jp-content-heading-line-height: 1;
--jp-content-heading-margin-top: 1.2em;
--jp-content-heading-margin-bottom: 0.8em;
--jp-content-heading-font-weight: 500;
/* Defaults use Material Design specification */
--jp-content-font-color0: rgba(0, 0, 0, 1);
--jp-content-font-color1: rgba(0, 0, 0, 0.87);
--jp-content-font-color2: rgba(0, 0, 0, 0.54);
--jp-content-font-color3: rgba(0, 0, 0, 0.38);
--jp-content-link-color: var(--md-blue-900);
--jp-content-font-family: system-ui, -apple-system, blinkmacsystemfont,
'Segoe UI', helvetica, arial, sans-serif, 'Apple Color Emoji',
'Segoe UI Emoji', 'Segoe UI Symbol';
/*
* Code Fonts
*
* Code font variables are used for typography of code and other monospaces content.
*/
--jp-code-font-size: 13px;
--jp-code-line-height: 1.3077; /* 17px for 13px base */
--jp-code-padding: 5px; /* 5px for 13px base, codemirror highlighting needs integer px value */
--jp-code-font-family-default: menlo, consolas, 'DejaVu Sans Mono', monospace;
--jp-code-font-family: var(--jp-code-font-family-default);
/* This gives a magnification of about 125% in presentation mode over normal. */
--jp-code-presentation-font-size: 16px;
/* may need to tweak cursor width if you change font size */
--jp-code-cursor-width0: 1.4px;
--jp-code-cursor-width1: 2px;
--jp-code-cursor-width2: 4px;
/* Layout
*
* The following are the main layout colors use in JupyterLab. In a light
* theme these would go from light to dark.
*/
--jp-layout-color0: white;
--jp-layout-color1: white;
--jp-layout-color2: var(--md-grey-200);
--jp-layout-color3: var(--md-grey-400);
--jp-layout-color4: var(--md-grey-600);
/* Inverse Layout
*
* The following are the inverse layout colors use in JupyterLab. In a light
* theme these would go from dark to light.
*/
--jp-inverse-layout-color0: #111;
--jp-inverse-layout-color1: var(--md-grey-900);
--jp-inverse-layout-color2: var(--md-grey-800);
--jp-inverse-layout-color3: var(--md-grey-700);
--jp-inverse-layout-color4: var(--md-grey-600);
/* Brand/accent */
--jp-brand-color0: var(--md-blue-900);
--jp-brand-color1: var(--md-blue-700);
--jp-brand-color2: var(--md-blue-300);
--jp-brand-color3: var(--md-blue-100);
--jp-brand-color4: var(--md-blue-50);
--jp-accent-color0: var(--md-green-900);
--jp-accent-color1: var(--md-green-700);
--jp-accent-color2: var(--md-green-300);
--jp-accent-color3: var(--md-green-100);
/* State colors (warn, error, success, info) */
--jp-warn-color0: var(--md-orange-900);
--jp-warn-color1: var(--md-orange-700);
--jp-warn-color2: var(--md-orange-300);
--jp-warn-color3: var(--md-orange-100);
--jp-error-color0: var(--md-red-900);
--jp-error-color1: var(--md-red-700);
--jp-error-color2: var(--md-red-300);
--jp-error-color3: var(--md-red-100);
--jp-success-color0: var(--md-green-900);
--jp-success-color1: var(--md-green-700);
--jp-success-color2: var(--md-green-300);
--jp-success-color3: var(--md-green-100);
--jp-info-color0: var(--md-cyan-900);
--jp-info-color1: var(--md-cyan-700);
--jp-info-color2: var(--md-cyan-300);
--jp-info-color3: var(--md-cyan-100);
/* Cell specific styles */
--jp-cell-padding: 5px;
--jp-cell-collapser-width: 8px;
--jp-cell-collapser-min-height: 20px;
--jp-cell-collapser-not-active-hover-opacity: 0.6;
--jp-cell-editor-background: var(--md-grey-100);
--jp-cell-editor-border-color: var(--md-grey-300);
--jp-cell-editor-box-shadow: inset 0 0 2px var(--md-blue-300);
--jp-cell-editor-active-background: var(--jp-layout-color0);
--jp-cell-editor-active-border-color: var(--jp-brand-color1);
--jp-cell-prompt-width: 64px;
--jp-cell-prompt-font-family: var(--jp-code-font-family-default);
--jp-cell-prompt-letter-spacing: 0;
--jp-cell-prompt-opacity: 1;
--jp-cell-prompt-not-active-opacity: 0.5;
--jp-cell-prompt-not-active-font-color: var(--md-grey-700);
/* A custom blend of MD grey and blue 600
* See https://meyerweb.com/eric/tools/color-blend/#546E7A:1E88E5:5:hex */
--jp-cell-inprompt-font-color: #307fc1;
/* A custom blend of MD grey and orange 600
* https://meyerweb.com/eric/tools/color-blend/#546E7A:F4511E:5:hex */
--jp-cell-outprompt-font-color: #bf5b3d;
/* Notebook specific styles */
--jp-notebook-padding: 10px;
--jp-notebook-select-background: var(--jp-layout-color1);
--jp-notebook-multiselected-color: var(--md-blue-50);
/* The scroll padding is calculated to fill enough space at the bottom of the
notebook to show one single-line cell (with appropriate padding) at the top
when the notebook is scrolled all the way to the bottom. We also subtract one
pixel so that no scrollbar appears if we have just one single-line cell in the
notebook. This padding is to enable a 'scroll past end' feature in a notebook.
*/
--jp-notebook-scroll-padding: calc(
100% - var(--jp-code-font-size) * var(--jp-code-line-height) -
var(--jp-code-padding) - var(--jp-cell-padding) - 1px
);
/* Rendermime styles */
--jp-rendermime-error-background: #fdd;
--jp-rendermime-table-row-background: var(--md-grey-100);
--jp-rendermime-table-row-hover-background: var(--md-light-blue-50);
/* Dialog specific styles */
--jp-dialog-background: rgba(0, 0, 0, 0.25);
/* Console specific styles */
--jp-console-padding: 10px;
/* Toolbar specific styles */
--jp-toolbar-border-color: var(--jp-border-color1);
--jp-toolbar-micro-height: 8px;
--jp-toolbar-background: var(--jp-layout-color1);
--jp-toolbar-box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.24);
--jp-toolbar-header-margin: 4px 4px 0 4px;
--jp-toolbar-active-background: var(--md-grey-300);
/* Statusbar specific styles */
--jp-statusbar-height: 24px;
/* Input field styles */
--jp-input-box-shadow: inset 0 0 2px var(--md-blue-300);
--jp-input-active-background: var(--jp-layout-color1);
--jp-input-hover-background: var(--jp-layout-color1);
--jp-input-background: var(--md-grey-100);
--jp-input-border-color: var(--jp-inverse-border-color);
--jp-input-active-border-color: var(--jp-brand-color1);
--jp-input-active-box-shadow-color: rgba(19, 124, 189, 0.3);
/* General editor styles */
--jp-editor-selected-background: #d9d9d9;
--jp-editor-selected-focused-background: #d7d4f0;
--jp-editor-cursor-color: var(--jp-ui-font-color0);
/* Code mirror specific styles */
--jp-mirror-editor-keyword-color: #008000;
--jp-mirror-editor-atom-color: #88f;
--jp-mirror-editor-number-color: #080;
--jp-mirror-editor-def-color: #00f;
--jp-mirror-editor-variable-color: var(--md-grey-900);
--jp-mirror-editor-variable-2-color: rgb(0, 54, 109);
--jp-mirror-editor-variable-3-color: #085;
--jp-mirror-editor-punctuation-color: #05a;
--jp-mirror-editor-property-color: #05a;
--jp-mirror-editor-operator-color: #a2f;
--jp-mirror-editor-comment-color: #408080;
--jp-mirror-editor-string-color: #ba2121;
--jp-mirror-editor-string-2-color: #708;
--jp-mirror-editor-meta-color: #a2f;
--jp-mirror-editor-qualifier-color: #555;
--jp-mirror-editor-builtin-color: #008000;
--jp-mirror-editor-bracket-color: #997;
--jp-mirror-editor-tag-color: #170;
--jp-mirror-editor-attribute-color: #00c;
--jp-mirror-editor-header-color: blue;
--jp-mirror-editor-quote-color: #090;
--jp-mirror-editor-link-color: #00c;
--jp-mirror-editor-error-color: #f00;
--jp-mirror-editor-hr-color: #999;
/*
RTC user specific colors.
These colors are used for the cursor, username in the editor,
and the icon of the user.
*/
--jp-collaborator-color1: #ffad8e;
--jp-collaborator-color2: #dac83d;
--jp-collaborator-color3: #72dd76;
--jp-collaborator-color4: #00e4d0;
--jp-collaborator-color5: #45d4ff;
--jp-collaborator-color6: #e2b1ff;
--jp-collaborator-color7: #ff9de6;
/* Vega extension styles */
--jp-vega-background: white;
/* Sidebar-related styles */
--jp-sidebar-min-width: 250px;
/* Search-related styles */
--jp-search-toggle-off-opacity: 0.5;
--jp-search-toggle-hover-opacity: 0.8;
--jp-search-toggle-on-opacity: 1;
--jp-search-selected-match-background-color: rgb(245, 200, 0);
--jp-search-selected-match-color: black;
--jp-search-unselected-match-background-color: var(
--jp-inverse-layout-color0
);
--jp-search-unselected-match-color: var(--jp-ui-inverse-font-color0);
/* Icon colors that work well with light or dark backgrounds */
--jp-icon-contrast-color0: var(--md-purple-600);
--jp-icon-contrast-color1: var(--md-green-600);
--jp-icon-contrast-color2: var(--md-pink-600);
--jp-icon-contrast-color3: var(--md-blue-600);
/* Button colors */
--jp-accept-color-normal: var(--md-blue-700);
--jp-accept-color-hover: var(--md-blue-800);
--jp-accept-color-active: var(--md-blue-900);
--jp-warn-color-normal: var(--md-red-700);
--jp-warn-color-hover: var(--md-red-800);
--jp-warn-color-active: var(--md-red-900);
--jp-reject-color-normal: var(--md-grey-600);
--jp-reject-color-hover: var(--md-grey-700);
--jp-reject-color-active: var(--md-grey-800);
/* File or activity icons and switch semantic variables */
--jp-jupyter-icon-color: #f37626;
--jp-notebook-icon-color: #f37626;
--jp-json-icon-color: var(--md-orange-700);
--jp-console-icon-background-color: var(--md-blue-700);
--jp-console-icon-color: white;
--jp-terminal-icon-background-color: var(--md-grey-800);
--jp-terminal-icon-color: var(--md-grey-200);
--jp-text-editor-icon-color: var(--md-grey-700);
--jp-inspector-icon-color: var(--md-grey-700);
--jp-switch-color: var(--md-grey-400);
--jp-switch-true-position-color: var(--md-orange-900);
}
</style>
<style type="text/css">
/* Force rendering true colors when outputing to pdf */
* {
-webkit-print-color-adjust: exact;
}
/* Misc */
a.anchor-link {
display: none;
}
/* Input area styling */
.jp-InputArea {
overflow: hidden;
}
.jp-InputArea-editor {
overflow: hidden;
}
.cm-editor.cm-s-jupyter .highlight pre {
/* weird, but --jp-code-padding defined to be 5px but 4px horizontal padding is hardcoded for pre.cm-line */
padding: var(--jp-code-padding) 4px;
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
color: inherit;
}
.jp-OutputArea-output pre {
line-height: inherit;
font-family: inherit;
}
.jp-RenderedText pre {
color: var(--jp-content-font-color1);
font-size: var(--jp-code-font-size);
}
/* Hiding the collapser by default */
.jp-Collapser {
display: none;
}
@page {
margin: 0.5in; /* Margin for each printed piece of paper */
}
@media print {
.jp-Cell-inputWrapper,
.jp-Cell-outputWrapper {
display: block;
}
}
</style>
<!-- Load mathjax -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS_CHTML-full,Safe"> </script>
<!-- MathJax configuration -->
<script type="text/x-mathjax-config">
init_mathjax = function() {
if (window.MathJax) {
// MathJax loaded
MathJax.Hub.Config({
TeX: {
equationNumbers: {
autoNumber: "AMS",
useLabelIds: true
}
},
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
processEscapes: true,
processEnvironments: true
},
displayAlign: 'center',
messageStyle: 'none',
CommonHTML: {
linebreaks: {
automatic: true
}
}
});
MathJax.Hub.Queue(["Typeset", MathJax.Hub]);
}
}
init_mathjax();
</script>
<!-- End of mathjax configuration --><script type="module">
document.addEventListener("DOMContentLoaded", async () => {
const diagrams = document.querySelectorAll(".jp-Mermaid > pre.mermaid");
// do not load mermaidjs if not needed
if (!diagrams.length) {
return;
}
const mermaid = (await import("https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.7.0/mermaid.esm.min.mjs")).default;
const parser = new DOMParser();
mermaid.initialize({
maxTextSize: 100000,
maxEdges: 100000,
startOnLoad: false,
fontFamily: window
.getComputedStyle(document.body)
.getPropertyValue("--jp-ui-font-family"),
theme: document.querySelector("body[data-jp-theme-light='true']")
? "default"
: "dark",
});
let _nextMermaidId = 0;
function makeMermaidImage(svg) {
const img = document.createElement("img");
const doc = parser.parseFromString(svg, "image/svg+xml");
const svgEl = doc.querySelector("svg");
const { maxWidth } = svgEl?.style || {};
const firstTitle = doc.querySelector("title");
const firstDesc = doc.querySelector("desc");
img.setAttribute("src", `data:image/svg+xml,${encodeURIComponent(svg)}`);
if (maxWidth) {
img.width = parseInt(maxWidth);
}
if (firstTitle) {
img.setAttribute("alt", firstTitle.textContent);
}
if (firstDesc) {
const caption = document.createElement("figcaption");
caption.className = "sr-only";
caption.textContent = firstDesc.textContent;
return [img, caption];
}
return [img];
}
async function makeMermaidError(text) {
let errorMessage = "";
try {
await mermaid.parse(text);
} catch (err) {
errorMessage = `${err}`;
}
const result = document.createElement("details");
result.className = 'jp-RenderedMermaid-Details';
const summary = document.createElement("summary");
summary.className = 'jp-RenderedMermaid-Summary';
const pre = document.createElement("pre");
const code = document.createElement("code");
code.innerText = text;
pre.appendChild(code);
summary.appendChild(pre);
result.appendChild(summary);
const warning = document.createElement("pre");
warning.innerText = errorMessage;
result.appendChild(warning);
return [result];
}
async function renderOneMarmaid(src) {
const id = `jp-mermaid-${_nextMermaidId++}`;
const parent = src.parentNode;
let raw = src.textContent.trim();
const el = document.createElement("div");
el.style.visibility = "hidden";
document.body.appendChild(el);
let results = null;
let output = null;
try {
let { svg } = await mermaid.render(id, raw, el);
svg = cleanMermaidSvg(svg);
results = makeMermaidImage(svg);
output = document.createElement("figure");
results.map(output.appendChild, output);
} catch (err) {
parent.classList.add("jp-mod-warning");
results = await makeMermaidError(raw);
output = results[0];
} finally {
el.remove();
}
parent.classList.add("jp-RenderedMermaid");
parent.appendChild(output);
}
/**
* Post-process to ensure mermaid diagrams contain only valid SVG and XHTML.
*/
function cleanMermaidSvg(svg) {
return svg.replace(RE_VOID_ELEMENT, replaceVoidElement);
}
/**
* A regular expression for all void elements, which may include attributes and
* a slash.
*
* @see https://developer.mozilla.org/en-US/docs/Glossary/Void_element
*
* Of these, only `<br>` is generated by Mermaid in place of `\n`,
* but _any_ "malformed" tag will break the SVG rendering entirely.
*/
const RE_VOID_ELEMENT =
/<\s*(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)\s*([^>]*?)\s*>/gi;
/**
* Ensure a void element is closed with a slash, preserving any attributes.
*/
function replaceVoidElement(match, tag, rest) {
rest = rest.trim();
if (!rest.endsWith('/')) {
rest = `${rest} /`;
}
return `<${tag} ${rest}>`;
}
void Promise.all([...diagrams].map(renderOneMarmaid));
});
</script>
<style>
.jp-Mermaid:not(.jp-RenderedMermaid) {
display: none;
}
.jp-RenderedMermaid {
overflow: auto;
display: flex;
}
.jp-RenderedMermaid.jp-mod-warning {
width: auto;
padding: 0.5em;
margin-top: 0.5em;
border: var(--jp-border-width) solid var(--jp-warn-color2);
border-radius: var(--jp-border-radius);
color: var(--jp-ui-font-color1);
font-size: var(--jp-ui-font-size1);
white-space: pre-wrap;
word-wrap: break-word;
}
.jp-RenderedMermaid figure {
margin: 0;
overflow: auto;
max-width: 100%;
}
.jp-RenderedMermaid img {
max-width: 100%;
}
.jp-RenderedMermaid-Details > pre {
margin-top: 1em;
}
.jp-RenderedMermaid-Summary {
color: var(--jp-warn-color2);
}
.jp-RenderedMermaid:not(.jp-mod-warning) pre {
display: none;
}
.jp-RenderedMermaid-Summary > pre {
display: inline-block;
white-space: normal;
}
</style>
<!-- End of mermaid configuration --></head>
<body class="jp-Notebook" data-jp-theme-light="true" data-jp-theme-name="JupyterLab Light">
<main>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
<h1 id="General-Purpose-Constrained-Optimization-MCP-Server">General Purpose Constrained Optimization MCP Server<a class="anchor-link" href="#General-Purpose-Constrained-Optimization-MCP-Server">¶</a></h1><p>This notebook demonstrates the capabilities, theory and of the Constrained Optimization MCP Server for solving various optimization problems including:</p>
<ol>
<li><strong>Constraint Satisfaction Problems</strong> (Z3)</li>
<li><strong>Convex Optimization</strong> (CVXPY)</li>
<li><strong>Linear Programming</strong> (HiGHS)</li>
<li><strong>Constraint Programming</strong> (OR-Tools)</li>
<li><strong>Portfolio Optimization</strong></li>
</ol>
<h2 id="Table-of-Contents">Table of Contents<a class="anchor-link" href="#Table-of-Contents">¶</a></h2><ol>
<li><a href="#setup">Setup and Installation</a></li>
<li><a href="#z3-examples">Constraint Satisfaction Problems (Z3)</a></li>
<li><a href="#cvxpy-examples">Convex Optimization (CVXPY)</a></li>
<li><a href="#highs-examples">Linear Programming (HiGHS)</a></li>
<li><a href="#ortools-examples">Constraint Programming (OR-Tools)</a></li>
<li><a href="#portfolio-examples">Portfolio Optimization</a></li>
<li><a href="#advanced-examples">Advanced Examples</a></li>
<li><a href="#performance-analysis">Performance Analysis</a></li>
</ol>
<h2 id="Setup">Setup<a class="anchor-link" href="#Setup">¶</a></h2><p>First, let's import the necessary libraries and set up the MCP server.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="cm-editor cm-s-jupyter">
<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># Install the package if not already installed</span>
<span class="c1"># !pip install constrained-opt-mcp</span>
<span class="c1"># Import required libraries</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">pandas</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">pd</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">matplotlib.pyplot</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">plt</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">seaborn</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">sns</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">cvxpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">cp</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Optional</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">time</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="c1"># Import MCP server components</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">constrained_opt_mcp.models.ortools_models</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
<span class="n">ORToolsProblem</span><span class="p">,</span> <span class="n">ORToolsVariable</span><span class="p">,</span> <span class="n">ORToolsConstraint</span>
<span class="p">)</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">constrained_opt_mcp.solvers.ortools_solver</span><span class="w"> </span><span class="kn">import</span> <span class="n">solve_problem</span>
<span class="c1"># Set up plotting style</span>
<span class="n">plt</span><span class="o">.</span><span class="n">style</span><span class="o">.</span><span class="n">use</span><span class="p">(</span><span class="s1">'seaborn-v0_8'</span><span class="p">)</span>
<span class="n">sns</span><span class="o">.</span><span class="n">set_palette</span><span class="p">(</span><span class="s2">"husl"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"✅ Libraries imported successfully!"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"📅 Demo started at: </span><span class="si">{</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S'</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain" tabindex="0">
<pre>✅ Libraries imported successfully!
📅 Demo started at: 2025-09-13 12:10:58
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
<h2 id="%F0%9F%93%90-Mathematical-Foundations">📐 Mathematical Foundations<a class="anchor-link" href="#%F0%9F%93%90-Mathematical-Foundations">¶</a></h2><h3 id="Optimization-Theory-Overview">Optimization Theory Overview<a class="anchor-link" href="#Optimization-Theory-Overview">¶</a></h3><p><strong>Constrained Optimization</strong> is the mathematical discipline of finding the best solution to a problem subject to constraints. The general form is:</p>
<p>$$\min_{x \in \mathbb{R}^n} f(x) \quad \text{subject to} \quad \begin{cases}
g_i(x) \leq 0, & i = 1, \ldots, m \\
h_j(x) = 0, & j = 1, \ldots, p \\
x \in \mathcal{X}
\end{cases}$$</p>
<p>Where:</p>
<ul>
<li>$f: \mathbb{R}^n \to \mathbb{R}$ is the <strong>objective function</strong></li>
<li>$g_i: \mathbb{R}^n \to \mathbb{R}$ are <strong>inequality constraints</strong></li>
<li>$h_j: \mathbb{R}^n \to \mathbb{R}$ are <strong>equality constraints</strong></li>
<li>$\mathcal{X} \subseteq \mathbb{R}^n$ is the <strong>feasible region</strong></li>
</ul>
<h3 id="Problem-Classifications">Problem Classifications<a class="anchor-link" href="#Problem-Classifications">¶</a></h3><h4 id="1.-Linear-Programming-(LP)">1. <strong>Linear Programming (LP)</strong><a class="anchor-link" href="#1.-Linear-Programming-(LP)">¶</a></h4><p>$$\min_{x} c^T x \quad \text{subject to} \quad Ax \leq b, \quad x \geq 0$$</p>
<h4 id="2.-Quadratic-Programming-(QP)">2. <strong>Quadratic Programming (QP)</strong><a class="anchor-link" href="#2.-Quadratic-Programming-(QP)">¶</a></h4><p>$$\min_{x} \frac{1}{2}x^T Q x + c^T x \quad \text{subject to} \quad Ax \leq b, \quad x \geq 0$$</p>
<h4 id="3.-Convex-Optimization">3. <strong>Convex Optimization</strong><a class="anchor-link" href="#3.-Convex-Optimization">¶</a></h4><p>$$\min_{x} f(x) \quad \text{subject to} \quad g_i(x) \leq 0, \quad h_j(x) = 0$$</p>
<p>Where $f$ and $g_i$ are convex functions, and $h_j$ are affine functions.</p>
<h4 id="4.-Constraint-Satisfaction-Problems-(CSP)">4. <strong>Constraint Satisfaction Problems (CSP)</strong><a class="anchor-link" href="#4.-Constraint-Satisfaction-Problems-(CSP)">¶</a></h4><p>Find $x \in \mathcal{D}$ such that $C_1(x) \land C_2(x) \land \ldots \land C_k(x)$</p>
<p>Where $\mathcal{D}$ is the domain and $C_i$ are logical constraints.</p>
<h3 id="Duality-Theory">Duality Theory<a class="anchor-link" href="#Duality-Theory">¶</a></h3><p>For any optimization problem, there exists a <strong>dual problem</strong>:</p>
<p><strong>Primal:</strong> $\min_{x} f(x) \quad \text{s.t.} \quad g_i(x) \leq 0, \quad h_j(x) = 0$</p>
<p><strong>Dual:</strong> $\max_{\lambda, \nu} \mathcal{L}(x^*, \lambda, \nu) \quad \text{s.t.} \quad \lambda \geq 0$</p>
<p>Where $\mathcal{L}(x, \lambda, \nu) = f(x) + \sum_i \lambda_i g_i(x) + \sum_j \nu_j h_j(x)$ is the <strong>Lagrangian</strong>.</p>
<h3 id="Optimality-Conditions">Optimality Conditions<a class="anchor-link" href="#Optimality-Conditions">¶</a></h3><h4 id="Karush-Kuhn-Tucker-(KKT)-Conditions">Karush-Kuhn-Tucker (KKT) Conditions<a class="anchor-link" href="#Karush-Kuhn-Tucker-(KKT)-Conditions">¶</a></h4><p>For a solution $x^*$ to be optimal, there must exist multipliers $\lambda^* \geq 0$ and $\nu^*$ such that:</p>
<ol>
<li><strong>Stationarity:</strong> $\nabla f(x^*) + \sum_i \lambda_i^* \nabla g_i(x^*) + \sum_j \nu_j^* \nabla h_j(x^*) = 0$</li>
<li><strong>Primal feasibility:</strong> $g_i(x^*) \leq 0, \quad h_j(x^*) = 0$</li>
<li><strong>Dual feasibility:</strong> $\lambda_i^* \geq 0$</li>
<li><strong>Complementary slackness:</strong> $\lambda_i^* g_i(x^*) = 0$</li>
</ol>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [31]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="cm-editor cm-s-jupyter">
<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># MCP Server Setup</span>
<span class="c1"># Note: In a real environment, you would connect to the MCP server</span>
<span class="c1"># For this demo, we'll simulate the MCP server responses</span>
<span class="k">class</span><span class="w"> </span><span class="nc">MCPServerSimulator</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Simulates MCP server responses for demonstration purposes"""</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">solvers</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'z3'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_simulate_z3_solver</span><span class="p">,</span>
<span class="s1">'cvxpy'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_simulate_cvxpy_solver</span><span class="p">,</span>
<span class="s1">'highs'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_simulate_highs_solver</span><span class="p">,</span>
<span class="s1">'ortools'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_simulate_ortools_solver</span>
<span class="p">}</span>
<span class="k">def</span><span class="w"> </span><span class="nf">solve_constraint_satisfaction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">problem_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Solve constraint satisfaction problems using Z3"""</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">solvers</span><span class="p">[</span><span class="s1">'z3'</span><span class="p">](</span><span class="n">problem_data</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">solve_convex_optimization</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">problem_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Solve convex optimization problems using CVXPY"""</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">solvers</span><span class="p">[</span><span class="s1">'cvxpy'</span><span class="p">](</span><span class="n">problem_data</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">solve_linear_programming</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">problem_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Solve linear programming problems using HiGHS"""</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">solvers</span><span class="p">[</span><span class="s1">'highs'</span><span class="p">](</span><span class="n">problem_data</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">solve_constraint_programming</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">problem_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Solve constraint programming problems using OR-Tools"""</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">solvers</span><span class="p">[</span><span class="s1">'ortools'</span><span class="p">](</span><span class="n">problem_data</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">solve_portfolio_optimization</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">problem_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Solve portfolio optimization problems"""</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">solvers</span><span class="p">[</span><span class="s1">'cvxpy'</span><span class="p">](</span><span class="n">problem_data</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_simulate_z3_solver</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">problem_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Simulate Z3 solver response"""</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">"status"</span><span class="p">:</span> <span class="s2">"SATISFIABLE"</span><span class="p">,</span>
<span class="s2">"solution"</span><span class="p">:</span> <span class="p">{</span><span class="s2">"x"</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s2">"y"</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">"z"</span><span class="p">:</span> <span class="mi">2</span><span class="p">},</span>
<span class="s2">"solver"</span><span class="p">:</span> <span class="s2">"Z3"</span><span class="p">,</span>
<span class="s2">"solve_time"</span><span class="p">:</span> <span class="mf">0.15</span><span class="p">,</span>
<span class="s2">"variables"</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="n">problem_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"variables"</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
<span class="p">}</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_simulate_cvxpy_solver</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">problem_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Simulate CVXPY solver response"""</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">"status"</span><span class="p">:</span> <span class="s2">"OPTIMAL"</span><span class="p">,</span>
<span class="s2">"solution"</span><span class="p">:</span> <span class="p">{</span><span class="s2">"x1"</span><span class="p">:</span> <span class="mf">0.3</span><span class="p">,</span> <span class="s2">"x2"</span><span class="p">:</span> <span class="mf">0.2</span><span class="p">,</span> <span class="s2">"x3"</span><span class="p">:</span> <span class="mf">0.3</span><span class="p">,</span> <span class="s2">"x4"</span><span class="p">:</span> <span class="mf">0.2</span><span class="p">},</span>
<span class="s2">"objective_value"</span><span class="p">:</span> <span class="mf">0.108</span><span class="p">,</span>
<span class="s2">"solver"</span><span class="p">:</span> <span class="s2">"CVXPY"</span><span class="p">,</span>
<span class="s2">"solve_time"</span><span class="p">:</span> <span class="mf">0.08</span>
<span class="p">}</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_simulate_highs_solver</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">problem_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Simulate HiGHS solver response"""</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">"status"</span><span class="p">:</span> <span class="s2">"OPTIMAL"</span><span class="p">,</span>
<span class="s2">"solution"</span><span class="p">:</span> <span class="p">{</span><span class="s2">"x"</span><span class="p">:</span> <span class="mf">15.0</span><span class="p">,</span> <span class="s2">"y"</span><span class="p">:</span> <span class="mf">1.25</span><span class="p">},</span>
<span class="s2">"objective_value"</span><span class="p">:</span> <span class="mf">205.0</span><span class="p">,</span>
<span class="s2">"solver"</span><span class="p">:</span> <span class="s2">"HiGHS"</span><span class="p">,</span>
<span class="s2">"solve_time"</span><span class="p">:</span> <span class="mf">0.05</span>
<span class="p">}</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_simulate_ortools_solver</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">problem_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Simulate OR-Tools solver response"""</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">"status"</span><span class="p">:</span> <span class="s2">"OPTIMAL"</span><span class="p">,</span>
<span class="s2">"solution"</span><span class="p">:</span> <span class="p">{</span><span class="s2">"nurse_1"</span><span class="p">:</span> <span class="s2">"morning"</span><span class="p">,</span> <span class="s2">"nurse_2"</span><span class="p">:</span> <span class="s2">"evening"</span><span class="p">,</span> <span class="s2">"nurse_3"</span><span class="p">:</span> <span class="s2">"night"</span><span class="p">},</span>
<span class="s2">"solver"</span><span class="p">:</span> <span class="s2">"OR-Tools"</span><span class="p">,</span>
<span class="s2">"solve_time"</span><span class="p">:</span> <span class="mf">0.12</span>
<span class="p">}</span>
<span class="c1"># Initialize the MCP server simulator</span>
<span class="n">mcp_server</span> <span class="o">=</span> <span class="n">MCPServerSimulator</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"🚀 MCP Server initialized successfully!"</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain" tabindex="0">
<pre>🚀 MCP Server initialized successfully!
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
<h2 id="%F0%9F%93%8A-Solver-Performance-Overview">📊 Solver Performance Overview<a class="anchor-link" href="#%F0%9F%93%8A-Solver-Performance-Overview">¶</a></h2><p>Let's start by visualizing the performance characteristics of different solvers:</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [32]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="cm-editor cm-s-jupyter">
<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># Create solver performance visualization</span>
<span class="n">solvers</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Z3'</span><span class="p">,</span> <span class="s1">'CVXPY'</span><span class="p">,</span> <span class="s1">'HiGHS'</span><span class="p">,</span> <span class="s1">'OR-Tools'</span><span class="p">]</span>
<span class="n">solve_times</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.15</span><span class="p">,</span> <span class="mf">0.08</span><span class="p">,</span> <span class="mf">0.05</span><span class="p">,</span> <span class="mf">0.12</span><span class="p">]</span>
<span class="n">problem_types</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Constraint Satisfaction'</span><span class="p">,</span> <span class="s1">'Convex Optimization'</span><span class="p">,</span> <span class="s1">'Linear Programming'</span><span class="p">,</span> <span class="s1">'Constraint Programming'</span><span class="p">]</span>
<span class="n">colors</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'#FF6B6B'</span><span class="p">,</span> <span class="s1">'#4ECDC4'</span><span class="p">,</span> <span class="s1">'#45B7D1'</span><span class="p">,</span> <span class="s1">'#96CEB4'</span><span class="p">]</span>
<span class="n">fig</span><span class="p">,</span> <span class="p">(</span><span class="n">ax1</span><span class="p">,</span> <span class="n">ax2</span><span class="p">)</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">15</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span>
<span class="c1"># Solve times bar chart</span>
<span class="n">bars</span> <span class="o">=</span> <span class="n">ax1</span><span class="o">.</span><span class="n">bar</span><span class="p">(</span><span class="n">solvers</span><span class="p">,</span> <span class="n">solve_times</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">colors</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.8</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="s1">'black'</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">ax1</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'Solver Performance (Solve Times)'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span>
<span class="n">ax1</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Solve Time (seconds)'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
<span class="n">ax1</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s1">'Solver'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
<span class="c1"># Add value labels on bars</span>
<span class="k">for</span> <span class="n">bar</span><span class="p">,</span> <span class="n">time</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">bars</span><span class="p">,</span> <span class="n">solve_times</span><span class="p">):</span>
<span class="n">height</span> <span class="o">=</span> <span class="n">bar</span><span class="o">.</span><span class="n">get_height</span><span class="p">()</span>
<span class="n">ax1</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">bar</span><span class="o">.</span><span class="n">get_x</span><span class="p">()</span> <span class="o">+</span> <span class="n">bar</span><span class="o">.</span><span class="n">get_width</span><span class="p">()</span><span class="o">/</span><span class="mf">2.</span><span class="p">,</span> <span class="n">height</span> <span class="o">+</span> <span class="mf">0.005</span><span class="p">,</span>
<span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">time</span><span class="si">:</span><span class="s1">.2f</span><span class="si">}</span><span class="s1">s'</span><span class="p">,</span> <span class="n">ha</span><span class="o">=</span><span class="s1">'center'</span><span class="p">,</span> <span class="n">va</span><span class="o">=</span><span class="s1">'bottom'</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span>
<span class="c1"># Problem type distribution pie chart</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">pie</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="n">labels</span><span class="o">=</span><span class="n">problem_types</span><span class="p">,</span> <span class="n">colors</span><span class="o">=</span><span class="n">colors</span><span class="p">,</span> <span class="n">autopct</span><span class="o">=</span><span class="s1">'</span><span class="si">%1.0f%%</span><span class="s1">'</span><span class="p">,</span> <span class="n">startangle</span><span class="o">=</span><span class="mi">90</span><span class="p">)</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'Supported Problem Types'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="c1"># Create a feature comparison table</span>
<span class="n">feature_data</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'Solver'</span><span class="p">:</span> <span class="n">solvers</span><span class="p">,</span>
<span class="s1">'Problem Type'</span><span class="p">:</span> <span class="n">problem_types</span><span class="p">,</span>
<span class="s1">'Solve Time (s)'</span><span class="p">:</span> <span class="n">solve_times</span><span class="p">,</span>
<span class="s1">'Best For'</span><span class="p">:</span> <span class="p">[</span>
<span class="s1">'Logic puzzles, verification'</span><span class="p">,</span>
<span class="s1">'Portfolio optimization, ML'</span><span class="p">,</span>
<span class="s1">'Production planning, resource allocation'</span><span class="p">,</span>
<span class="s1">'Scheduling, assignment, routing'</span>
<span class="p">]</span>
<span class="p">}</span>
<span class="n">df_features</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">feature_data</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"🔧 Solver Capabilities Overview:"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">df_features</span><span class="o">.</span><span class="n">to_string</span><span class="p">(</span><span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedImage jp-OutputArea-output" tabindex="0">
<img alt="No description has been provided for this image" class="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABZYAAAJOCAYAAAAkpFLLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAA5LtJREFUeJzs3Xd4FOXXxvHv7qYTUui9Q0AIEAEBgZ9UQURFRAUVaRZEsKHSi6IiCIoCiog0AWmCShelK9JbKKH3kkAaKaTtvn/E7EtIgCwkTMr9ua5cyc7MzpyZnc0+c/aZ85hsNpsNEREREREREREREZEMMhsdgIiIiIiIiIiIiIjkLEosi4iIiIiIiIiIiIhDlFgWEREREREREREREYcosSwiIiIiIiIiIiIiDlFiWUREREREREREREQcosSyiIiIiIiIiIiIiDhEiWURERERERERERERcYgSyyIiIiIiIiIiIiLiECWWRURERERERERERMQhTkYHICJZJz4+nrlz57Jy5UpOnjxJdHQ0Xl5ePPDAAzzzzDO0bdv2ntbfpUsXtm3bBkBQUFBmhJypJkyYwMSJE1NNM5lMODs74+3tTe3atenTpw9Vq1bNku3HxcUxduxYVq5cSXh4OIUKFaJfv3488cQTWbI9+X/Dhg1j/vz5TJgwgUcffRQAq9XK4sWL+e233zh69CjXrl0jX758VK5cmSeffJKOHTtisVjuepsDBgxgyZIlAPz111+UKlUqU/Ylo/z8/DK87F9//cWSJUvs749Zs2ZRv379rAotU0yfPp3PP/+ct99+m969exsdjoiIyD3J6nZ6TnX48OFMb5vv2LGDF198EYA+ffrQt2/fWy5r9PXD1q1befnllzMU690sf7+cO3eOFi1aZHj57HgtKSIZo8SySC51/fp1unXrxu7du1NNDw0NZfPmzWzevJmtW7fy0UcfGRShMWw2G/Hx8YSEhLBmzRr++ecfZs+ezQMPPJDp25o2bRqzZs2yP7548SLOzs6Zvh1Jbd++fSxcuJDixYvbG7RWq5V33nmH1atXp1o2IiKCHTt2sGPHDtauXct3332H2aybebKjDh068PXXXzN58mQef/xxypYta3RIIiIid0Xt9LT27t3L6NGjsVgs/PTTT0aHk8r9vH4QEclplFgWyaXmzZtnb6y2b9+eF198EW9vb44ePconn3zCxYsXmTdvHk888QR169Y1ONqsN378eAICAkhMTOTq1at89913rFu3jujoaMaOHcu0adMyfZt79uyx/z158mRKlSpF8eLFM307ktqECROwWq08++yz9h7If/31lz2p/Mgjj/Dqq69StGhRzpw5w+jRozly5Ajr169n6dKlPPXUU0aGf9c2bNiQ6vHzzz/PpUuXKFasGPPnz081r3DhwnTv3p1nn30WgAIFCty3OO+Wt7c3jz/+OIsWLeLrr7/myy+/NDokERGRu6J2elrPPfccAA899JDBkfw/I64fcovixYunaZs+8sgjANSuXZuvv/7aiLBEJAsosSySS/3777/2v4cMGUL+/PkBKFu2LAkJCbzzzjsAbNmyJU80WAsUKECxYsUAKFWqFOPHj+eRRx4hPDycrVu3kpSUdE9lENITExNj/7tp06aYTKZMXb+kdfToUTZu3AjAY489Zp++detW+9/vvfee/fbFMmXK4OXlZU+wbtmyJccmllPO7xQp57PFYkkzD8DT0xNPT8/7EltmadOmDYsWLWL16tX2pLmIiEhOo3Z6zmDE9UNucav2J4CLi4vacCK5iO73FcmlXFxc7H9/+OGHHDx40P740UcfZcuWLWzZsoWePXumel58fDw//vgjTz/9NAEBAQQEBPD888+zaNEibDbbbbf5559/4ufnh5+fH999912a9davXx8/Pz97jwSAyMhIRo0aRfPmzalRowZNmjRh6NChXL58OdXzBwwYgJ+fH/Xr1+fvv/+mZcuW1KhRgy5dujh8bADc3Nzst9InJiYSGhpqn3f8+HHeeecdGjRogL+/P23atGHSpEnExcWlWkfz5s3x8/PjrbfeYurUqdSvX5/atWvzwgsv4OfnZ68/DVC1alWaN2+e6nhk9Djfajvjx49n69at9mO+YcMGZs6cSevWrfH39+fJJ5/kr7/+wmazMXPmTFq1amWffnNJCIDffvuNTp06Ub9+fWrUqMHDDz9Mr169UvW8vjmeEydO0Lt3b+rUqUNAQAC9evXi5MmTada9b98++vTpQ8OGDfH396dFixYMGzaMCxcupFrOarUya9YsnnjiCfz9/XnooYfo1asX+/btu8MrmmzFihUAVKhQgQoVKtin31iC5KOPPmLHjh3241yzZk37+2HIkCFp4lmwYAGdOnWibt261K5dm/bt2zNt2jTi4+NvG8uhQ4fsr83N6wV44okn8PPz43//+x9JSUlAcl3uiRMn0rp1a/tr8N5773HixIkM7b8jJkyYYI8vJfF+7tw5+7Sff/6Z3377zf5atG7dmoULFwLw+++/065dO/v0uXPnpll/Rt9HERERjBo1ilatWlGjRg1q1KhBixYtGDlyJBEREamWbdCgAZ6eniQmJrJo0aJMPyYiIiL3w92001Pawn5+fpw7d84+/cbP7gEDBqRZvm7duly5coX+/ftTv359AgICeOWVVzh8+HCqmBxdHjKnPZvSbk6xbds2/Pz8mDBhgn1aRtsUkHwHV6dOnahVqxYPP/wwo0aN4vr167d9PTLqVtcPXbp0wc/Pjw4dOvDbb7/RpEkT/P396d+/v/25J0+eZOjQoTRr1owaNWrQqFEj3n333XSP641+/vlne7vwscceY+bMmXe8Jkuxd+9eXnvtNerWrUvNmjV56qmn+Omnn7BaramWSzl/xo4dy6ZNm3juueeoWbMmTZs25fvvv8dms7Fp0yY6duxIzZo1adasGZMmTUqznrv1zDPP4Ofnh7+/P1FRUanmjRs3zh5fyjVJyrnUu3dv9u/fT7du3QgICKBBgwYMGTIk1XVdio0bN9KlSxf7efrcc8/x+++/p1ku5Vxr3Lgx1atXp3bt2jz11FNMnTo10/ZXJLdRj2WRXOqJJ56wJw/Xrl3L2rVrKVq0KPXr16dJkya0aNGCfPnypXpOdHQ0Xbp04cCBA6mm79mzhz179rBx40a++uqrW34z36xZM4oWLcrly5f57bffeOONN+zz1q5dS3h4OJB8iz4kJ5Q6deqUKmkWHBzMggULWLduHfPnz6dkyZJpYuzdu7e9gVijRo27ODoQGxvLqVOnAHBycsLb2xtIToB269aN6Oho+7InT57km2++YcuWLUyfPj1NneQtW7akStS++uqr7Ny585bbvtvjfPN2atWqlWr+2LFjOXLkiP1xUFAQffv2pXHjxqluRQsKCuKdd95h/vz51KxZE4DZs2czcuTIVOu7evUq69at459//uH333+nXLlyqeafPHmS5557jmvXrtmnrVu3jqNHj7J69WqcnJI/YtasWcO7775LQkKCfblz584xf/581q9fz7x58yhRogQA77//PsuXL7cvFx8fz7p169i8eTMTJ06kadOm6R/U/2zevBmAgICAVNMff/xxpk+fjs1mY9euXbz44ov4+vry0EMP0bhxY1q1aoWvr2+q5yQlJdGrVy97D+gUhw4d4tChQ6xZs4Yff/wRDw+PdGOpVq0atWrVYu/evaxatYqhQ4fi6uoKwP79++2vVcqggfHx8fTo0YMdO3bY13H16lWWL1/O+vXrmTVr1l2f73dj7ty5qc6nU6dOMWTIEPv/kxunf/TRRxQsWJDWrVsDGX8fWa1Wunfvnua9cO7cOWbPns3u3btZsGCB/VxydnamevXqbN26lb///ps+ffpk5SEQERHJEnfTTr9bCQkJvPjii/Z2L8CmTZvYuXMns2fPpnr16ne1fGa1Z+/Ubnakbb5s2TLef/99e+L1+vXrzJgxw97x4F7d6vohxenTpxkwYIA9Aenv7w9gb7PceDfjlStXWLFiBWvWrGHMmDHpDta4YMECgoOD7Y9PnDjBZ599xunTpxk2bNhtY/3rr794++23U7W/Dx8+zCeffMKePXsYN25cmuesX7+eqVOn2o/fxYsX+fLLL9m1axcbN26079eFCxf45ptvcHd3p0ePHreNIyOeeeYZAgMDiY+P588//6R9+/b2eatWrQKgfPny1K5dO9Xzjh8/zksvvWS/LoyJiWHhwoXs2LGDRYsW2e/Mmzt3Lh9//HGqhPzevXvZu3cvx44d47333gPg/PnzPP/886mubRITEzl8+DCHDx/m0qVL6XYWEcnr1GNZJJdq1aoVr7/+eqpply9f5vfff+eDDz7gkUceYcGCBanmjx492t44fPzxx1m8eDHz5s2jUaNGAKxevZoff/zxltu0WCz23sgnT55k79699nlLliwBIH/+/PaG0/jx4zlx4gQmk4kBAwawatUqvvvuOwoXLkxISAiffPJJmm0kJCRQokQJfvnlF2bOnEnnzp0zdDxCQ0O5dOkSZ8+eZceOHfTp08feG7Jx48a4uLhgs9kYPHgw0dHR+Pr6MnHiRHtC0Gw2s337dubMmZNm3ZGRkbRu3ZqVK1fy1Vdf0ahRIzZs2JCq8bNhwwZ7ndu7Pc43b6dJkyap5h8/fpxhw4axYsUKnnnmGSA5Obphwwb69OnDypUr7cfLarWyZs0a+98pg6TUqlWLJUuWsHr1al599VUguRft33//nSaeI0eOUKNGDRYtWsTChQspWrQokJwU3L59O5B80TFkyBASEhLw8vJi7NixrFq1ioEDB2Iymbh8+bK9R8rKlSvtSeX27duzdOlS5s+fT0BAAAkJCQwaNOi2vYTj4uIIDAwESNXzBZK/gBg6dKg9QQkQFhbG6tWrGTp0KI888giTJk1K1eD88ccf7Unlhg0bMm/ePBYvXky7du0A2LVrF59//vkt4wHsx/vatWv89ddf9ukp7weLxWIvwzFr1ix7UvmVV15hxYoVzJw5kwoVKhAdHc3gwYNvu63MduTIEXr37s3KlSvp1auXffratWt5/vnnWbFiBW+//bZ9espFoiPvo4MHD9rfC6+88gqrVq1ixYoVvPTSS0Dy/6ybBzZKeW337duXbk8lERGR7O5u2ul36/r160RFRfHNN9+wfPlyeyIwJiYmTacCR5bPrPZsSrs5Re3atdmwYQPdu3d3qE0RHx/PZ599hs1mw2w28+GHH7JixQo+/fTTVIlCR2Tk+uFGUVFRPPjggyxdupTJkyfTtm1boqKi6NevHzExMbi7u9vb6uPGjaNAgQIkJCQwYMCAVL3QUwQHB/Paa6+xfPlyJkyYYB8TY86cObft6RwbG2tvf5cpU4Yff/yRlStX0rt3byA5AZ9yHXCjo0eP8uyzz7JixYpUiev169fTrFkzli5dyqeffmqfnt4dkHejXbt29s4XN3YwOXjwIGfOnAHg6aefTvO8U6dOUaVKFebOncsvv/xiP/dOnjzJlClTgOT3Vcp54e/vz9y5c1m+fLm9/T1lyhT7ebx69Wr7uTJ+/Hj+/PNPfvnlFx566CHMZjObNm1K06NaRJRYFsnV3nvvPRYtWkTHjh0pVKhQqnnXrl1j6NCh9m/wo6Ki+PXXXwGoUqUKX3zxBdWrVycgIICJEydSuHBhgDuO0vzss8/ak3cpybOQkBB7T9KnnnoKd3d3bDabfdu1a9fmsccew93dnQceeMCeFF2/fj1hYWFptvHqq69So0YNGjRoQJkyZTJ0LN555x0eeeQRWrZsyYsvvmiPx9fX137bYFBQkL2H5tNPP42/vz/u7u60bNmSevXqpdqnm3344YdUqFCBtm3b2uuG3djYLFasGIULF77n43zjdm5MkkLygBgvvvgiFStW5OWXX7ZPr1y5Mn379qVChQr2hB1gP7Zms5nVq1ezceNGvvvuOx544AEKFSqUqpRESm/zG5lMJr788kv8/f2pWbMmXbt2tc8LCQkB4J9//rE/t0ePHjzxxBOUL1+ebt26MXDgQMaMGWO/YFm2bBmQ3Cu1b9++eHl5UaxYMfuF19WrV9P0Hr7RlStX7D0pihQpkmb+iy++yNKlS+nSpUuanvBxcXF88803/PDDD/ZpKRcqBQoUYNKkSQQEBFC9enW++OILe43mxYsXp+pBc7O2bdvae7OknDvx8fH2RvP//vc/+4COKftfokQJunTpQr58+ShXrpy93Mvhw4c5dOjQLbeV2fz8/Hj77bepUKECr7zyin26t7c3Q4cOpWLFinTv3t0+PeV8cuR9dGNPn8DAQA4dOoS3tzeDBg1i27Zt/P333/bnpEh5bRMTE1P14hEREclJHGmn36sPPviA1q1bU6lSJfr372+/s2v37t1cvXrV4eUzsz17c73dlMeenp4OtSkCAwPt+9KuXTt69uxJxYoV6dixY6o2qiMycv1ws7feeosqVarQrFkzChQowMqVK+1tpDfffNPeVm/Xrh0jRowAktuh6X2RUK9ePfr160elSpV49NFHeffdd+3z1q9ff8u4//77b3s5iJdeeolKlSrh4eHB888/by/lkd41jY+PD8OHD6dixYq8+OKLeHl5Aclt/k8++YQqVarQsWNHe4I7veu0u+Hl5UWrVq2A5B7tKdcOKb2VzWZzumOgmEwmxo8fT506dahRowZffvml/U7CP//8076OlF7br776KiVLlsTT05PevXvbr0lTzmUfHx/7uv/55x/OnDlD+fLl+f7779m9ezerV6/OceOTiNwPKoUhksv5+/vj7++PzWbj6NGjbNmyhUWLFtkbaVOnTqVt27acOnXK3vuvfv36qW5b8/DwoHbt2qxZs4bg4GBCQ0PtDYqbFS1alGbNmrFmzRpWrlzJoEGD+P3330lMTAT+f8TnsLAwe6Nh9+7d9lGCb2S1Wjl8+DANGzZMNb1y5cp3fTwsFguurq4UKlSIunXr0qdPH3uS8cbawNOmTUt3pOejR48SHx+fKmns4eFBqVKlMrT9eznOd9rOjYngG2+frFixYrrTU14TSD7We/bsYd26dezZs4fTp0+nqiOWXk2xAgUKpIrvxr9T1n3jbZTVqlVL9fybG/kpyyYkJNCiRYt09zEwMJCWLVumO+/GC6NbNfoqVKjAkCFDGDJkCKdPn+bff//lt99+s9+C+eOPP/Lqq68SHh7OpUuXgORe3DceN7PZTIMGDTh8+DAJCQmcOHHCfqvjzVxdXXn66aeZMWMGf//9NyEhIezcudN+7t9Ybzxl/y9cuJDu+yFl/28+jlnlVudTmTJl7Lecuru7YzabsVqt9tfckfdR6dKl6d27N9999x3//vuvfTCjMmXK0LhxY55//nl7Ej/Fja9taGgopUuXzoS9FRERuf8y2k6/nYzU2725RFhAQID9jqBz585RsGBBh5a3WCxZ1p69kSNtiosXL9qn3Vwu7ubHjrrd9cPNbr5OubFn8cMPP5xqXkoPW0j+Yv5mN7cvb9yPm8cpudGN7e/PPvuMzz77LM0yN5cwgeT2140dV/Lly0dkZCS+vr6pXsN8+fIRGhqa6lriXnXs2JFly5aRkJDAH3/8wXPPPWdPLDdo0CDdwf6KFCmS6nXw8fGhQoUKBAYG2nuA33gs3nrrrXS3nXIs2rVrx/Lly9m8eTMLFixgwYIFWCwW+1g5nTp1SvMlkIgosSySK125coVvvvmG4OBgHnjgAd566y1MJhNVqlShSpUqdO7cmTZt2nD+/HmOHz8OkKb3681ubLSaTKbbLtupUyfWrFlDeHg4Gzdu5LfffgOSG6Upt7FndATl9AZfSBk52xGzZs2ifv36t13mTscAkktLRERE2HtiwK2TmHezjdsd5zttx83NLd3nuru733KdKdt87bXX2LRpE87OzrRs2ZKXXnqJokWL3raG7Y3bg+SEa3rrTnGnxmdGzon0zof03BhLQkICn376KSEhIRQsWJCPP/4YSB55vWzZsjz33HO88MIL7Nq1i/DwcEJDQ9Pc2ngzR94Pzz//PDNmzCApKYkVK1bYk6fFihVLlUDOyP5nVs+QjLjx9b3xeN54PkHa/Xf0ffT222/Trl07VqxYwT///MOBAwc4c+YMc+fOZd68eUyaNCnVwJeObktERCQ7uZt2+s1u/ML/ToMJ32mZ9Noxd1o+K9uzN3KkTXHjdm7uEJHR646bZeT64WY3X6fcbtt3ak/e3Ha+cV23W29Gjlt6bepbte3v1PbLDA0aNKBUqVKcO3eOFStW4O/vz+nTp4H0y2BA+udpyjFNidGR6wsXFxd+/PFH/v33X/7880+2bt3KsWPHOHDgAAcOHGD27Nn88ssvt/xSQSSv0hWZSC7k5eXF77//TmxsLLt376ZLly6pBiYzm832D92UW9FLlSqFi4sL8fHxbN26FavVam9MxMTE2OslFytWLM0gZzdr1KgRZcqU4cyZM0yZMsX+DXzKoH0p2/Xx8SE8PJxGjRql6oFw6tQpLBYLJUuWTDdZmVXJpBvLarz77rup6soePHiQwoULp0oop7h5ML/buZfj7Mh2HLF161Y2bdoEQN++fe2lJ/bt23fP675xwL/9+/en6m08cOBAQkNDqVq1Ku+++y5ly5YlKCgId3d3tm/fbt/fq1evcuXKFcqXL3/bhO+NvW1uLE/h7OzM5s2bOXv2LE5OTvTs2dN+GyCkbhybzWby58+Pi4uLvdb3vn37iI6OtvfatVqtbN26FUhugN7Yszc9FSpUoH79+mzdupUlS5bYLxKfffbZVI3dsmXLcuDAAcqVK5eqZt3FixeJjY1N04sku3LkfRQWFsbRo0c5deoUL774In379iUhIYFdu3bx2muvcf36dWbPnp0qsRwZGWn/+1Z3ToiIiGRXd9NOB1K1gW6s83q7nqsptm3blqon7f79+4HkNlB6d/7caXlnZ+csa8/emGx1pE1x437c3IbdtWvXbbeZmW7evxvvHNyyZUuqwRL/+ecf+98336EFpBrQGVLv1+3KAd44b+zYsTzxxBOp1lGmTJlUZR+yA5PJxNNPP82ECRPYtm0bs2fPBpJ7R6eUybhZSjsy5VyNioqy91BOOQY3tvl//vlnHnzwQSA5aX/gwAEqVqxo/7Ij5cucy5cv2wfpi4qKYvHixXz66aeEhYWxdOnSVOehiKjGskiu5OLiYv9mNzw8nFdffZUNGzZw+vRpduzYwVtvvWVvhLZu3RpI7j3Qpk0bIHnQrg8++ICDBw+yZ88e+vbta6+Ze2ON3lsxmUz2JHJKw9LLy4vHHnss1XIpjZx//vmHyZMnc+LECbZv307Xrl1p2bIlTZs2tY/yez9UqVLF3qibNm0ay5cv58yZM/z222907NiRxo0b07dv33vaRmYe58xyYxJ206ZNHDlyhK1bt/LRRx/Zp9/trW6NGjWyXxT99NNPLFmyhJMnTzJnzhyWLFnC+vXr7beqpZwPsbGxfPjhhxw8eJCgoCD69evHk08+Se3atTl48OAtt1WkSBF7T4ubL7I6depk34/XXnuN1atXc+rUKfbt28fgwYPtFxzNmjWzX7h17NgRSE5s9+3blz179nDw4EEGDBhgv63xmWeesddyu52UQfwOHTpEfHw8FovFvv4UKft/6tQpPvnkE44ePcr+/ft5/fXXeeyxx6hXr16OqCnsyPto48aNdOnShaFDhzJw4ED279/PxYsXuXjxIklJSUDaL5JSjkH+/PnTvS1SREQkO7ubdjqkHj9i9uzZJCQkcObMGb766qs7bvPrr79m6dKlHD9+nK+//to+yHK9evXS7TByp+Wzoj2bMnjbhQsXOH78OKdPn3aoTVG9enV7iY3ly5czZcoUjh07xsKFC5kxY0aG48hsbdq0sXdOmDRpEj///DPHjx9n+fLl9ra2q6trqvJoKQ4ePMjAgQM5dOgQa9eu5csvvwSSv3y4Vdk4SB50OqVkw1dffcW6des4c+YM06ZN49lnn6V+/fp3HIDaCB06dMBsNpOUlMSiRYuA5ON3c4/pG7333nv8+++/HDp0iA8++MB+XfPoo4/af6ecWx9//DH//vsvp0+fZuzYsTz33HPUqVOHWbNmAfDtt9/y6quvMmTIEMaNG2dPMt9YZiUndPIQud/0rhDJpd577z327dtHYGAg+/fv57XXXkuzTNWqVVPVmhoyZAiHDx/myJEjLFu2zD6YWIrWrVvbB1q7kw4dOvD111/bb1F66qmn0txe1atXL9auXcv58+f56quvUjWMzWYz/fr1S/OcrGQymRg8eDCvvPIKERERvPfee6nm+/j43LY0REZl5nHODHXq1KFgwYJcvXqV7du3p+rVkOLKlSt3te58+fLx8ccf069fP6Kjo9MMdFKkSBH7cW7VqhWPPPIIGzZsYMWKFWkGrOnYsSMPPPDALbfl7OxMzZo12bZtm702YYquXbuybds2NmzYwKlTp9KtsVa8eHGGDh1qf9y7d292797Nv//+y99//83ff/+davkHH3yQ/v37Z+g4tGzZ0t4DGpIHWrw5Kdq5c2eWLl3KgQMH+Omnn9IMePP666+nOyhhduPI++jxxx9nxYoVrF+/3v5zIxcXlzT/u1KS+rVq1cqSWzFFRESy2t2009u0acPkyZNJSEjgl19+YfHixdhsNipXroyHhwcxMTG33J6Hhwfvv/9+qmmenp72Xpl3s3xmt2erVq3K3r17OX/+PG3btuWFF15g+PDhGW5TmM1mPv74Y15//XUSEhIYN24c48aNA5KTzunVFL4fvL29GTt2LO+88w4xMTH2AftSODs7M3r0aEqUKJHmubVr12bx4sUsXrw41fRevXrdtseyu7s7AwcO5IMPPuD8+fNpetiWLFky1QDM2UWJEiV4+OGH7YMkwq3LYEDydcbFixfTjNtSpUoVevbsCWAv7Tdu3DgOHTqUZtnq1avbB45/66232Lp1K2fPnmXKlClMmTIlTXwdOnS4p30UyY3UY1kkl8qfPz8///wzAwcOJCAggPz582OxWPDx8SEgIIAPP/yQBQsWpKoD5u3tzS+//MKHH35I9erV8fDwwN3dnVq1avHJJ5/w9ddfZ7hGWYECBVL1srixDEaKQoUKsXDhQl5++WX7bXUFChSgcePGTJ8+Pd3Rf7PaQw89xIIFC3jssccoVKgQzs7OFC9enA4dOrBgwQJ7jeh7kZnHOTP4+Pgwbdo0GjdujJeXF/nz58ff358xY8bYBxnZsGGDvQepo9q0acOcOXNo3rw5Pj4+uLi4UKZMGTp37syCBQvsdcpMJhMTJ06kf//+VKtWDXd3dzw9PalRowYjR45M1YP6VlLiTaljnMLZ2ZnJkyfz2Wef0aBBA3x8fHBycsLLy4vq1avTu3dvli5dSvHixe3PcXFxYfr06YwcOZI6deqQP39+XF1dqVq1Kv3792fmzJm37UFx8/ZTGq2Q/vvBzc2NWbNm0bt3bypWrIirqyve3t7UrVuXb775JkfddpfR95GTkxMTJkxg2LBh1KxZ0/66FC5cmNatWzNv3jzq1q1rX29SUpI9sXyrAQ5FRESyu7tpp1eqVInvvvsOf39/XF1dKVy4MC+//DJz586949gQ3377LR06dMDLywsPDw+aNm3KvHnzbtmuzcjymd2eHThwILVq1cLd3R1fX197iTNH2uaNGjVi5syZ1KtXz36MunXrxuTJkzMcR1Zo3rw5v/32G8899xwlS5a0X/M89thjLFy4MM1dnSl69erFRx99RIUKFXB2dqZixYqMHDmSt99++47bbNeuHTNnzqRp06b4+Pjg7OxMqVKl6NKlC/Pnz6do0aKZvZuZ4sb2cqlSpVK1A2/m4+PDzz//TMOGDXF1daVAgQI8//zz/PTTT6nuKHzttdeYNGkS9evXx8vLC1dXV8qVK0evXr2YNWuWvUd50aJFWbBgAa+//jqVKlUiX758ODs7U6ZMGV566SUWLlyoMmwi6TDZMjKMrIiISA5w8eJFWrRoQVJSEqtXr05V41lyvr179/Lcc8/h7OzMpk2b7ljvXUREJK8aMGAAS5YsAeCvv/6yl4nIrOVFssLKlSt55513AOjTp0+6ZQibN2/O+fPnKVmyJGvXrr3PEYrIzdRjWUREco3ixYvzv//9DyBNWQXJ+VatWgUk94JXUllEREQk54uKiiI4OJjdu3fzxRdfAGCxWG5bBkNEsg8lliXTREdH069fP2rXrm0vZXAnXbp0wc/Pj9DQ0FTTW7dujZ+fX6qfG0fNFRG5lbfeeguz2czChQuNDkUyUVxcHEuWLMHNzY13333X6HBEREREJBPs27ePJk2a0KlTJ86fPw8kl41Tr3mRnEGD90mmGTVqFMuWLaNy5cpcvXqVzz//nNKlS9OyZct0l580aRLbtm1LM/369eucOXOGYsWKUb16dft01TMSkYx44IEHePrpp/nll1/YtGkTTZo0MTokyQS//vorYWFh9O7d216XW0RERERyttKlS1OoUCEiIyMpWrQo7dq1y5QB00Xk/lCNZckUMTEx1K9fn0KFCrFmzRoOHTpEx44dadKkCVOnTk21bEhICCNHjmT16tX2aVu2bLEnjgMDA3nmmWfo0aMH/fv3v6/7ISIiIiIiIiIiInemUhiSKQ4dOkR8fDz+/v44OTlRo0YN3Nzc2L9/f5pl9+7dy+rVq+nYsWO6o9EeOXIEgFOnTtGvXz/GjRtHWFiYff6GDRto3749tWvXpkGDBvTr14/IyMis2zkRERERERERERFJRaUwJFMEBwcD4OPjA4DJZMLLy4vg4GDi4uJwdXW1L1uqVCl+/PFHGjduTPPmzdOs6+jRowCpRnhdu3YtS5YsISoqir59+2KxWKhTpw4XL15k2bJlmEwmxo4dm4V7KCIiIiIiIiIiIimUWJZMERcXB4CT0/+fUil/X79+PVViuWrVqrddV9GiRalbty6vv/46NWvW5J133mHLli388ssvBAQEEBcXxyOPPMKXX36Js7Mzc+bMoVq1almwVyIiIiIiIiIiIpIeJZZvEBJyzegQcqy4uORS3dHR1+3HMS4uHoBr1xKIj0//2CYlWQEIC4vG19eX0NBoHn/8GR5//BkAEhKgXbun2bJlC9u27aRZs8eoXftBNmzYQP369XnggRo8/HBjihcvp9dP7onZbKJAgXyEhkZjtar0vNx/OgfFaDoHjVe4cH6jQxARERERyTDVWJZMUbBgQQCuXUuudWyz2YiKuoa3t3eq3sq3YjabMJlMmM0mLl26SGDg/9dmdnJyBiAxMRGLxcL48d/yySejadWqDcHBl5k8eSKvvPIyiYmJWbBnklfceA6KGEHnoBhN56CIiIiIiDhCiWXJFJUqVcZisXDgQCCJiYkcORJEXFwc1apVd3hdAwb0o1ev7hw+fAiA7dv/BaBq1WoEBu5n1KiPCQ4OZvDgESxatBQ/v2qcPXuGy5cvZeo+iYiIiIiIiIiISPpUCkMyRb58nrRs2ZrVq1fQvfsLhIWFAdC+/TOcOHGMH374jqpVH6Br1553XNfTT3fkiy8+4513elOxYiX27t1NwYIFadv2Sa5di2TjxnWsWbOKjRvXkZCQQFDQIYoWLUbRosWyejdFREREREREREQEJZYlE/XrNwCwsWHDOjw88vHmm+/QuPEj7Nq1g02bNpCUlJSh9Tz1VAeuX4/ll18WcOjQQWrXfpD33uuPp6cnnp6ejBs3gSlTvuXIkSCcnJxo0OBh3nzznVQDB4qIiIiIiIiIiEjWMdlsNo3O8h8N/mYcJyczvr75CAuLJjHRanQ4kgfpHBSj6RwUo+kcNJ4G7xMRERGRnEQ1lkVERERERERERETEIUosi4iIiIiIiIiIiIhDlFgWEREREREREREREYcosSwiIiIiIiIiIiIiDlFiWUREREREREREREQcosSyiIiIiIiIiIiIiDhEiWURERERERERERERcYgSyyIiIiIiIiIiIiLiECWWRURERERERERERMQhSiyLiIiIiIiIiIiIiEOUWBYRERERERERERERhyixLCIiIiIiIiIiIiIOUWJZRERERERERERERByixLKIiIiIiIiIiIiIOESJZRERERERERERERFxiBLLIiIiIiIiIiIiIuIQJZZFRERERERERERExCFORgcgyS5fvkxkZITRYRjGYjHh7e1BREQMSUk2o8MxhJeXN0WLFjU6DBERERERERERkTtSYjkbuHz5Mq90eZ746CijQzGU2WzCas2bSWUAl3yeTP1pvpLLIiIiIiIiIiKS7SmxnA1ERkYQHx3FRw0bUs7X1+hwDGEygZPZTKLVii0P5pZPhYUxfMsWIiMjlFgWEREREREREZFsT4nlbKScry9VCxcxOgxDmEzgZDGTmJQ3E8siIiIiIiIiIiI5iQbvExERERERERERERGHKLEsIiIiIiIiIiIiIg5RYllEREREREREREREHKLEsoiIiIiIiIiIiIg4RIllEREREREREREREXGIEssiIiIiIiIiIiIi4hAllkVERERERERERETEIUosi4iIiIiIiIiIiIhDlFgWEREREREREREREYcosSwiIiIiIiIiIiIiDlFiWUREREREREREREQcosSyiIiIiIiIiIiIiDhEiWURERERERERERERcYgSyyIiIiIiIiIiIiLiECWWRURERERERERERMQhSiyLiIiIiIiIiIiIiEOUWBYRERERERERERERhyixLCIiIiIiIiIiIiIOUWJZRERERERERERERByixLKIiIiIiIiIiIiIOESJZRERERERERERERFxiBLLIiIiIiIiIiIiIuIQJZZFRERERERERERExCFORgcgIiIiIiIiIpJtxcdDXBxcv578O+UnKQlsNvtPWEFvwvK7YcIEJhMmwGwy4WR2wsVswdnihLPZ6b/fFqP3SkTknhmeWI6Li+Ojjz7ijz/+wM3NjR49etCjR4/bPmfHjh3079+fv/76K935K1eu5J133iEoKCgrQhYRERERERGRnMhqhagoiIiAyMjk3yk/kZHJP7GxqRPIVmuGVn3imdZs88nYjeEmTDjbk80WXCzOeDi74uHkSj5nNzycXcnn7IrHf397OLliMpnuZc9FRDKd4YnlMWPGEBgYyMyZM7lw4QL9+/enRIkStGnTJt3lg4KCePvtt3F1dU13fmRkJJ9++mlWhiwiIiIiIiIi2VV8PAQH///P5csQEgJhYXDtWoYTxVnJho14ayLx1sQMLW/ChLuTC54u7ni7euDj6omPWz68XfPh45oPZ4vh6R0RyYMM/c8TExPDwoUL+eGHH6hevTrVq1fn6NGjzJkzJ93E8rx58xg9ejSlS5cmKioq3XWOGTOG0qVLExISktXhi4iIiIiIiIhRYmLgzBm4ePH/E8jBwcm9j202o6PLVDZsxCTGEZMYR3BMeJr5+Zxd8Xb1xMc1Hz5u+Sjglp/CHt64Obnc/2BFJM8wNLF8+PBhEhMTCQgIsE+rU6cOkydPxmq1YjanvoVk48aNjB49mqioKCZOnJhmfdu2bWPbtm0MHjyY1157LcvjFxEREREREZH7ICWJfOYMnD2b/PvqVaOjyjaiE+KITojjQlTqY5LfxZ1C7t4U9vCmiIe3ks0i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N3r37s1LL71E+fLls2z7tnvsZerm5oabm1umbGvp0qU0atSIF1980T7to48+YuvWraxYsYLXXnvN4W0UKFAgQ7FFRUVRtWpVypQpk6HlM8qR45NjxMfDL7/A338bHYmIOCDBmsTa03s5f+0qTUpVxzmbDeynz8PUnJ2dKVz4/+tjFylShDfeeIP33nuPiIgIvL297zrWnCCjn9+ZRT2WRURERHKRCRO+ZM2aVRQvXoKkJCsTJ45n06b1t1x+xoyp7N69M830mTN/ZNasadhsNipVqszu3Tt59903iYyMzLLYRTIqPj6e5cuX8+KLL9ovolM0a9aMGTNmULJkSSD59uChQ4fy8MMPU6dOHT744AMiIiIA2Lp1K82bN2fu3Lk0adKE2rVr88EHHxAfHw9AZGQkffv2pW7dutSrV4/333+fqKgotm7dysCBAzl//jx+fn6cO3eOLl26MHLkSFq0aEHTpk2Jiopi586ddO7cmVq1alG7dm1effVV+624N976e7s4zp07x8svvwyAn58fW7duTXM8zGYzQUFBXL161T7NZDIxbdo0nnvuOSD5Ynzy5Mk0b96cGjVq0LhxYyZOnGiPZeLEiWzbtg0/Pz8g9a20hw8ftpfZaNKkif15AwYMYPHixfz666/243D58mXeeust6tWrR40aNXj66afZufP//8ecPn2anj17EhAQQNOmTZk1a5Z9ewAvv/wyEyZMSHNr9PHjx+nZsycPPvigPYaUW7wnTJhAv379GD58OA8++CANGzbkhx9+yPD5dF9cugRffKGkskgOFhR6jkVBm7kam33aQvo8zBiLxYLJZMLZ2ZnFixfTqVMn3nzzTerUqcPvv/+O1Wpl6tSptGjRgpo1a9KlSxeCgoLszw8LC6NPnz4EBATQokULfv75Z/vnZUrMw4cPp06dOkyZMoX4+HhGjRpFkyZNqF69Os2bN2f+/Pn29TVv3pxFixbxzDPPULNmTXr06MH58+fp27cvtWrV4qmnnuLo0aP249OlSxe+++476tWrR6NGjfj1119ZtWoVzZo1o27dunzxxRep1p3y+Z3yvJ49e1KzZk1at27Npk2bMrRfGaXEsoiIiEguERsby+rVKyhatBjTp89l7NivAfj117R11q5evcKQIR8ydWr6ty6uWrUcJycnfvzxJ779diotW7YmNPQq27f/m6X7IJIR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IiIiIiIiknOdOAHLlhkdhYhItrDr0jHOXbtidBiSRyixLCIiIiIiIjlTTAxMnw5Wq9GRiIhkCzbgr1N7iEmIMzoUyQOUWBYREREREZGcafZsCAszOgoRkWwlJjGOtaf3YFO9ZcliSiyLiIiIiIhIzrNpE+zbZ3QUIiLZ0tlrV9gXctLoMCSXU2JZREREREREcparV+HXX42OQkQkW9t2IYjw61FGhyG5mBLLIiIiIiIiknPYbDBnDsSpfqiIyO0k2qysO7NPJTEkyyixLCIiIiIiIjnH5s1w5IjRUYiI5AiXosPYG6ySGJI1lFgWERERERGRnEElMEREHLb9okpiSNZQYllERERERESyP5XAEBG5KyqJIVlFiWURERERERHJ/lQCQ0TkrqkkhmQFJZZFREREREQke1MJDBGRe6aSGJLZlFgWERERERGR7G3uXJXAEBG5RyqJIZlNiWURERERERHJvnbuhKAgo6MQEckVLkWHERR6zugwJJdQYllERERERESyp7g4WLLE6ChERHKVfy8cJi4xwegwJBdQYllERERERESyp5UrITzc6ChERHKV2MR4tl/SYKhy75RYFhERERERkezn0iVYt87oKEREcqXAkNNciYk0OgzJ4ZRYFhERERERkexn4UJISjI6ChGRXMmGjU3nAo0OQ3I4JZZFREREREQke9m9WwP2iYhkMQ3kJ/dKiWURERERERHJPuLiYPFio6MQEckT/j1/mPgkDeQnd0eJZREREREREck+Vq+GsDCjoxARyRNiEuPYfvGo0WFIDqXEsoiIiIiIiGQPYWGwdq3RUYiI5CmBV04RERdtdBiSAymxLCIiIiIiItnD8uWQmGh0FCIieYrVZmPbhSNGhyE5kBLLIiIiIiIiYryLF2HbNqOjEBHJk46FXyAkJsLoMCSHUWJZREREREREjLd0KVitRkchIpJnbb1w2OgQJIdRYllERERERESMdfIk7NtndBQiInna2WtXOH/titFhSA6ixLKIiIiIiIgY67ffjI5ARESAfy8EGR2C5CBKLIuIiIiIiIhxDhyAY8eMjkJERIDgmHCOh180OgzJIZyMDkBERERERETyKJsNfv/d6ChyhcvXr/NpUBD/hobiarHQtmhR3qtUCVeLhU8OH+ans2dTLT/Uz4+XypTheHQ07+7bx8Xr13m5TBn6VqxoX2b0kSMU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crtXbsS/ZUOcXZPrgpfwK88Dj9Rj0chvKVKuJE27PX2/didP2XP5BC3K1TY6DMlmlFgWERERERGRrBcbC9u3Gx1FrvRa+fK8Vr78Lee3LFKElkVuP/jWWxUrppnWv0oV+lepcs/xiaSo91QL6j3V4pbzK9atQcW6NW67jobPtkkzrclLT9LkpSfvOT65tWPhF3k4oRruzq5GhyLZiEphiIiIiIiISNb791+Ijzc6ChERuQtWm5VDV88aHYZkM3fdY/nEiROcO3eOqKgofH19KVGiBGVvqtEkIiIiIiIigs0GmzYZHYWIiNyDg1fPEFC0IiaTyehQJJtwKLF85coVpk+fzrJlywgODk410qbJZKJUqVI89thjvPzyyxQqVCjTgxUREREREZEcKCgIgoONjkJERO7BtfhYTkcGU867qNGhSDaRocRyUlISkyZNYurUqZQoUYKnn34af39/SpYsiYeHBxEREVy+fJmdO3eydu1aZs2aRdeuXenTpw/Ozs5ZvQ8iIiIiIiKSnam3sohIrhAYclqJZbHLUGL5mWeeoVSpUsydO5caNdIvou7v70/Lli3p378/O3bsYOrUqTz77LP8+uuvmRmviIiIiIiI5CTh4bB/v9FRiIhIJjh7LYTIuBi8XD2MDkWygQwllgcMGECDBg0yvNK6detSt25dtmzZcteBiYiIiIiISC6weTNYrUZHISIimSTwymkeLlnN6DAkGzBnZCFHkso3atiw4V09T0RERERERHKBpCT45x+joxARkUwUdPUsidYko8OQbCBDieWbbdu2jT179gBw4cIFevXqxRNPPMGkSZMcXldcXByDBg2ibt26NG7cmGnTpt3xOTt27KBFixZppi9btoyWLVtSq1Yt3nzzTUJDQx2OR0RERERERDLJvn0QGWl0FCIikomuJyVwPOyi0WFINuBwYvnXX3+la9eurFmzBoBhw4axdetWypYty+TJk5kyZYpD6xszZgyBgYHMnDmT4cOHM3HiRFatWnXL5YOCgnj77bex2Wyppu/bt4/BgwfTp08f5s+fT2RkJAMHDnR090RERERERCSzbN1qdAQiIpIFjoSdNzoEyQYcTizPmDGDp59+mg8++ICQkBD++ecf+vTpw8SJE3n33Xf55ZdfMryumJgYFi5cyODBg6levTqtWrXilVdeYc6cOekuP2/ePDp16kTB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D4cQ9VATERGITrhORFy00WHIfeJwYrlOnTrs2rUrK2IRERERERGRnOboUaMjEBGRbOT8NfVaziscLoXxyiuv8MEHH5CYmEitWrVwd3dPs0y9evUyJTgRERERERHJ5pRYFhGRG1yIusoDhcoYHYbcBw4nlrt37w7ApEmTADCZTPZ5NpsNk8nEoUOHMik8ERERERERydaUWBYRkRtciAo1OgS5TxxOLM+aNSsr4hAREREREZGcJixM9ZVFRCSV6ITrhF+Pxsctn9GhSBZzOLH80EMPZUUcIiIiIiIiktOot7KIiKTjQtRVJZbzAIcTywAnT57km2++Ydu2bURGRuLr60vdunV58803qVixYmbHKCIiIiIiItmREssiIpKO86qznCc4nFg+duwYnTp1wmKx0Lx5cwoVKkRISAjr1q1j/fr1LFy4UMllERERERGRvECJZRERScfFqKtGhyD3gcOJ5bFjx1KqVCl++ukn8ufPb59+7do1unbtyldffcXEiRMzNUgRERERERHJZqKi4MoVo6MQEZFsKDohjqj4WDxd3I0ORbKQ2dEnbN++nV69eqVKKgPkz5+f1157je3bt2dacCIiIiIiIpJNnT1rdAQiIpKNhcREGB2CZDGHE8tOTk64urqmO8/FxYX4+Ph7DkpERERERESyuTNnjI5ARESyMSWWcz+HE8v+/v7MnTsXm82WarrNZmPOnDnUqFEj04ITERERERGRbEo9lkVE5DZCYpVYzu0crrH89ttv07lzZ5588knatGlD4cKFCQkJYdWqVZw8eZLp06dnRZwiIiIiIiKSnajHsoiI3IZ6LOd+DieW/f39mTp1KuPGjWPixInYbDZMJhM1atTghx9+oF69elkRp4iIiIiIiGQXUVEQGmp0FCIiko3FJsZrAL9czuHEMkCDBg2YN28e8fHxREZG4uXlRWJiYpoB/URERERERCQXUhkMERHJgJCYCCWWczGHaywnJCQwfPhwnnvuOdzd3SlatCi7d++mYcOGjB49GqvVmhVxioiIiIiISHahMhgiIpIBKoeRuzmcWJ4wYQK///47jz/+uH3aAw88wPvvv8+CBQuYOnVqpgYoIiIiIiIi2Yx6LIuISAZoAL/czeFSGEuXLqV///506tTJPs3Hx4du3brh5OTErFmzeO211zI1SBEREREREclGzp0zOgIREckBrsRE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vBIlStx7ZCIiIiIiIpJtuKvHsoiI3AN3ixLLuY3DieXDhw/zwQcfcOzYsVsuc+jQoXsKSkRERERERLIX9VgWEZF74a4ey7mOw4nlYcOGERYWxocffoiPj08WhCQiIiIiIiLZjXosi4jIvdAXlLmPw4nlI0eO8NVXX9GsWbOsiEdERERERESyISUERETkXqjHcu7j8CtaunRpYmNjsyIWERERERERyabczEoIiIjI3fNQjeVcx+FX9L333uPrr79m27ZtXL9+PStiEhERERERkWxGPZZFROReuDvpcyS3cbgURvny5bHZbHTt2jXd+SaTiYMHD95zYCIiIiIiIpJ9qMayiIjcC3f1WM51HE4sDxw4kPDwcJ5//nkKFSqUFTGJiIiIiIhINpPfydnoEEREJAfzdnE4DSnZnMOv6MGDBxk1ahRt27bNinhEREREREQkG/J1VmJZRETuXgFXJZZzG4f7oBcpUgR3d/esiEVERERERESyqQLOLkaHICIiOVgBV31Bmds4nFh+9dVXGT9+PKdOncqCcERERERERCQ78rA44WZWfUwREXGck8mEj4tq9ec2DvdB/+OPPzh37hyPPfYYXl5eeHp6pppvMpn4888/My1AERERERERyR4KOLtwIe660WGIiEgO4+PqhMlkMjoMyWQOJ5YLFy7Mo48+mhWxiIiIiIiISDbmq8SyiIjchYKqr5wrOfyqjho1KiviEBERERERkWxOdZZFRORuqL5y7pShxPKFC//X3r3H51z/fxx/Xoedz2djMzPMHDabSU7FktCB5JgfJRXli44UiWjJqRPpIFKhotC3kpD6lg4UIRXlUEjYmA2bza7r+v2xdmVNtZXts+163G+361bX5/O+Pp/Xe9e7z6fr9Xl/Xp9DCgsLk5ubmw4dOvS37WvXrv2vAwMAAAAAVC1BJJYBAP9AMDOWa6QyfatpaWlaunSpEhMTlZaW9rc1Ub7//vsLEhwAAAAAoOoIcmPGGQCg/EKYsVwjlSmxPHXqVEVHR0uSHnnkEYptAwAAAIALohQGAOCfYMZyzVSmb3XFihVKTExUUFCQevXqVdExAQAAAACqoAh3T6NDAABUQ5HeHkaHgApgLkujTZs26fTp0xUdCwAAAACgCqvj6WV0CACAaijKhzteaqIyJZYBAAAAAPC3usnPwu3MAICy87SYFUqN5RqJxDIAAAAAoMxqM2sZAFAOtb3deV5bDVXmS80jRoyQu/vfT1s3mUxat27dvwoKAAAAAFA11fHw0q7TJ40OAwBQTUT5UF+5pipzYrlJkyYKDg6uyFgAAAAAAFVcbU8e4AcAKLs6PLivxirXjOXExMSKjAUAAAAAUMXV9qAUBgCg7JixXHNRYxkAAAAAUGZ1qLEMACiHKJ+/L62L6onEMgAAAACgzGp7eIlHMAEAyooZyzVXmRLL1157rYKCgio6FgAAAABAFeduNivMnSQBAODvBbhb5OdW5kq8qGbK9M1OnTq1ouMAAAAAAFQTsV4+OlqQb3QYAIAqrqE/5ZNqMkphAAAAAADKpYG3r9EhAACqgYb+3kaHgApEYhkAAAAAUC5xJJYBAGXAjOWajcQyAAAAAKBc4rx9jA4BAFANNAwgsVyTkVgGAAAAAJRLoJu7Qt3cjQ4DAFCF+btZFOHFuaIm+0ePZTx+/Ljmz5+vzz77TBkZGXrhhRe0bt06NW7cWJ07d77QMQIAAAAAqpg4b19lZh83OgwAQBXVgDIYNV65ZywfOHBA11xzjZYuXaqIiAgdO3ZMNptN+/bt06hRo/TRRx9VQJgAAAAAgKqEB/gBAP4K9ZVrvnLPWJ42bZpCQkL0yiuvyNvbW82aNZMkzZo1S/n5+Xr22WfVsWPHCx0nAAAAAKAK4QF+AIC/Qn3lmq/cM5Y///xz3X777fL395fJZCqxrl+/fvrxxx8vWHAAAAAAgKqJB/gBAP5KQ39vo0NABftHD++zWs8/0bmgoKBUshkAAAAAUPMEurkr3N3D6DAAAFVQkLtVkd48uK+mK3diOTU1Vc8995xyc3Ody0wmk+x2u1599VWlpKRc0AABAAAAAFVTM98Ao0MAAFRBicHc1eIKyl1j+e6779aAAQPUpUsXtW7dWiaTSfPnz9eePXv0888/a8mSJRURJwAAAACgimnm56/1x48aHQYAoIpJDKYOvyso94zlRo0a6Y033lDr1q21ceNGWSwWffbZZ6pbt65ee+01JSQkVEScAAAAAIAqpjkzlgEA55HEjGWXUO4ZyzabTbGxsZo1a1ZFxAMAAAAAqCbCPTwV7u6howX5RocCAKgigtytquvraXQYqATlnrHcvn17Pfzww/rmm28qIh4AAAAAQDVCnWUAwLmor+w6yp1Yvuqqq/T++++rb9++6tq1q5599ln98ssvFREbAAAAAKCKa+5HYhkA8DvqK7uOcieWx48fr48//lgLFixQamqqXnzxRV1++eX6v//7Py1btkwnT56siDgBAAAAAFUQiWUAwLmor+w6yp1YliSTyaQ2bdro4Ycf1oYNGzR37lxFRkbqoYceUocOHS50jAAAAACAKirM3UO13KmlCQCgvrKr+UeJ5WKFhYXasGGDVq1apY8//liS1KZNmwsSGAAAAACgemjm5290CACAKoD6yq6l3Illh8Ohzz//XA888IDatWun2267TT/99JNGjRqlTz75RM8880y5tpefn69x48YpNTVV7du314IFC/607Xfffac+ffooKSlJ1113nXbs2FFi/erVq3XFFVeoRYsWuummm6j9DAAAAACVIMU/yOgQAABVwEVhXGh0JeVOLHfo0EE33XSTPv/8c11//fVavXq1li5dqoEDByooqPz/MzF9+nTt2LFDL730kiZOnKg5c+Zo9erVpdrl5ubq1ltvVWpqqpYvX67k5GQNGzZMubm5kqQtW7bo7rvv1pAhQ7R8+XK5u7vrrrvuKnc8AAAAAIDySfYPlNVkMjoMAICBzCapdZif0WGgElnL+4G0tDRdc801Sk1N/dc7z83N1bJlyzRv3jw1bdpUTZs21Y8//qjFixera9euJdquWrVKHh4eGjNmjEwmk/MhgqtXr1avXr20YMECXXPNNerfv7+koocM3nDDDTp+/LiCg4P/dawAAAAAgPPztljVzDdAW0+eMDoUAIBBmgT6yN+93KlGVGPlnrE8efLkC5JUlqSdO3eqsLBQycnJzmUtW7bUtm3bZLfbS7Tdtm2bWrZsKdNvV8FNJpNSUlK0detWSdKmTZt0+eWXO9tHR0dr/fr1JJUBAAAAoBJcFMhvLwBwZReHM1vZ1ZTpMkJaWpozoft3TCaT1q1bV6a2GRkZCgoKkru7u3NZaGio8vPzdeLEiRJJ4YyMDDVo0KDE50NCQvTjjz8qJydH2dnZstlsGjp0qHbu3KnExERNmjRJERERZYoFAAAAAPDPXRQQrOcP7DU6DACAQdpQX9nllCmxfNFFF5U5sVweeXl5JZLKkpzvCwoKytS2oKDAWWf54Ycf1p133qnRo0frySef1LBhw7R8+XKZzWWbmG02m2Q2V35dMIuleBZ20csVnTsTXXIYG4wBir93i8Ukq7XcNxL8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zpYkbdy4UWlpaVqyZIk6dOigFi1a6N5771VBQYFOnjyp5s2b64svvnBu+9SpU2revLm++uorSdLatWvVvXt3JSUlqXfv3tq0aZMk6fjx42rdurXmzJkjqSjhO2jQII0YMeK8/Vm2bJl69epVKpnr7u6uW2+9VevWrVNWVpYOHjyo+Ph4vf322+rQoYNSU1P18MMPq7CwUAcPHtTgwYMl/X4L9bmlMGbPnq0xY8ZoypQpSk5OVlpamjZs2KBFixapbdu2uvjii/Xyyy879128jY0bN5a4zbn4df/990uSdu/eraFDhyo5OVnNmzfX9ddf77z9ubjsxeDBgzV79uxSpTD27NmjoUOHKiUlRR06dNCcOXOcZUxmz56tu+++WxMnTlRKSoratGmjefPmlWF0/Ht1PL00s3GiEv3+/YxtADVDsyBvzWnb0PCkslSyFMby5cs1aNAgPfXUU2rdurVSU1M1derUEhcaX3vtNaWlpSk5OVmDBg3Srl27nOuOHDmiUaNGqVWrVmrWrJmuvfZabd68WZKc55ynn35arVq10uTJk8sco8VikSS5ubk5z7UTJ05Uy5Yt9fzzzztj79atmxITE9WrVy99+eWXzs+fOXNG48ePV8uWLdWhQwctW7ZMTZo00cGDB88bl8Ph0LPPPqu0tDQ1a9ZM7du3d56DpaJyFfPnz9eQIUOUmJio3r176+eff9aECROUnJysLl26OM/hxfG+8cYbateunVq1aqV58+bpyy+/VNeuXZWcnKwxY8Y4z1fnlsK47777NHXqVN1xxx1KSkrSpZdeqpUrV5apX1UJiWUAAAAANdb+/fuVm5ur5s2bl1pnMpl08cUXy93dXZL0n//8R99//72effZZvfjii9qzZ0+JusNHjx7V+++/rxdeeEGzZ8/WmjVrtHLlSvn5+alDhw5au3ats+1HH32k4OBgtWzZUjt37tTYsWN122236b///a+uueYa3XLLLfr5558VHBysMWPG6IUXXtCvv/6qN954Q7t27dKkSZNKxZubm6s9e/acty+S1LJlS9lsNn377bfOZXPmzNHjjz+uOXPmaM2aNZo9e7YiIyOdP2w3bNig5OTkUttatWqV/Pz89NZbbykxMVF33HGHNmzYoFdeeUWDBg3StGnTStV0Tk5O1oYNG5yvGTNmyN3dXQMHDpTdbtfw4cNVp04dvfXWW3rttddks9k0Y8YMSXLeGj179mzddNNNJbZ7/PhxXX/99QoPD9eyZcs0ceJELVq0qERy+/3335eHh4dWrFihoUOHaubMmdq3b995/04Xmp/VTZMaNNWVYZGVsj8AVVe3qGBNbxWnQPeqWSDg66+/1r59+/Tqq69qwoQJevnll/XZZ59JktavX685c+ZowoQJWrFihVq2bKnBgwc7L7Dec889stlseu2117Ry5UpFRESUOldt2bJFb775pvPi5d85cuSInnzySdWvX99559Avv/yigoICLV++XFdddZWWL1+uKVOmaNiwYVq5cqXatm2rW2+9VUeOHJEkPfzww/r66681f/58Pf7443rhhRdks9n+NK6VK1fqpZdeUnp6ulavXq0RI0Zo9uzZJc6dTz/9tPr27avly5fr5MmT6t27t0JDQ/XGG2+oYcOGevjhh51tjx49qnXr1umVV17R8OHD9dhjj+mRRx7Ro48+qscee0yrVq3SBx98cN7+L168WE2bNtU777yjLl26aOLEiTp58mSZ+1UVkFgGAAAAUGPl5ORI+vtSDzt37tSmTZs0Y8YMJSYmKjExUTNmzND69eu1d+9eSdLZs2f1wAMPKD4+Xh06dFCHDh30zTffSJKuvPJKrV271jnz6/3331e3bt1kMpk0f/589e3bV1dffbViYmI0ePBgXXLJJXr11VclSdddd52SkpI0ceJETZ8+XePGjTtveYmTJ0/K4XD8aT1jf39/SdKJEyecy+69916lpqbq4osv1ujRo7V06VKZzWbnNsLCwpyJ9XMFBQVp9OjRqlu3rq699lqdPHlS48ePV1xcnIYOHarCwkL9/PPPJT7j7u6usLAwhYWFyWaz6ZFHHtF9992nZs2a6cyZM+rfv7/uu+8+1a1bV02bNtW1116r3bt3S5KCg4sebBUQEFDq1u133nlHXl5emjJliuLi4tS5c2eNHj1aL7zwgrNNYGCgxo4dq5iYGN18880KDAzUjh07zvt3qggWk0m3RtfXiLpxsppMlbZfAFWDxSTdnlBbdzaLktVcdY8BNptNU6ZMUf369dWjRw81btzYeR574YUXNGzYMHXq1En16tXTHXfcoTp16ui///2vHA6HOnfurAkTJiguLk4NGjTQwIEDncfwYjfccIPq1q2revXqnXf/hw4dUnJyspKTk5WYmKhLLrlEmZmZeuyxx5wzlyXp5ptvVkxMjGrXru28oNmzZ0/Vr19f99xzjxo1aqRFixbp9OnTWrlypSZMmKAWLVooNTVVDzzwQKn9nhtXZGSkpk6dqjZt2igqKkoDBgxQWFiYfvzxR2f7Tp06qVu3bmrQoIE6d+4sX19fjRo1SnFxcerbt6/z/wukov83GDt2rOrXr++8kDpw4EC1aNFCnTp1UkJCQon254qPj9ctt9yi6OhojR49WmfOnNGPP/5Y5n5VBVXzEgoAAAAAXADF9QyLZ1z9mb1798rf379EreW4uDgFBARo7969zsR0TEyMc72vr68Kf3twW6dOnTR+/Hht27ZN8fHx+uSTT5wzavfs2aP33ntPr7/+uvOzZ8+eVfv27Z3vJ0+erO7duys1NVU9e/Y8b4zFyeCMjIzzrj969GiJPktSSkqK89+bNWum48ePKysr6y//FpIUFRUl028J0uJax8UlQ4rfFxQUnPezBQUFGjVqlNq2bet8OKC3t7cGDBiglStXaseOHdq7d6++++47hYaG/m0se/bsUdOmTWW1/v7zNTk5WRkZGc4LB1FRUSWSEj4+Ps7vpjJ1Ca2lKE9vPbp3p7ILz1b6/gFUPj83ix5oUVfJIf+8Vn1lCQkJka+vr/P9ueexPXv2aMaMGXrsscec6/Pz8/XTTz/JZDJpwIABWrVqlbZs2aJ9+/Zpx44dzhIPxYrPE38mPDxcr7zyiiQ5L3IWXxQ9V1RUlPPf9+zZU6o8VIsWLbRnzx7t3btXZ8+eLXEnz/nuwjk3rosvvljbtm3TrFmztGfPHn3//ffKyMgo0Zdz9+/p6anatWuXOCeePVvy+B4dHe1c98f9eXp6/un58twEfPH3UlhYWOZ+VQUklgEAAADUWHXr1pWfn5++/fZbJSYmllp/2223adCgQeedtSsVze4699bTP7YrnqHs7e2tTp066f3339eRI0cUGhrq3J/NZtMtt9xSKmF87sPpdu/eLYfDoV27dikrK0tBQUGlYvH09FSjRo307bffqkePHqXW79ixQxaLRU2aNFFubq4klXj6fPGPZlMZZtSem8QtZjaX7YbXqVOnKicnR1OmTHEuO336tHr37q2goCClpaXpqquu0t69e7VgwYK/3d4fa2NLv/el+Ls5t5/F/viAwsrSxNdfsxonKX3P99qXd9qQGABUjhhfDz2UUk+1vUsfp6qi853rio+VNptN48aNU5s2bUqs9/X1ld1u10033aScnBx1795daWlpOnv2rP7zn/+UaHu+4/W5rFZriQu0f+bc7ZxvmzabTXa7/bznqvMd+8/dxrJly/TII4+oT58+6tKli8aOHVuqdMcft/t357/yti/2Z+eusvarKqAUBgAAAIAay2q1qnv37lq8eHGpGUPr16/X+vXrFR4ertjYWOXk5JS4XXX37t06depUiVnMf+XKK6/U//73P61bt07du3d3Lo+NjdXBgwcVExPjfL3++uv6+OOPJRUlXadMmaJ77rlH9erV06OPPvqn++jfv7+WLVvmrC1ZrLCwUM8884w6d+7sLCshSd9//73z33fs2KHw8HAFBQWVKbn8T7z11ltavny5nnzyyRIlLTZt2qSjR4/q5Zdf1s0336y2bdvq0KFDZfqhHBsbq2+//bbEDLGvv/5awcHBJWZnVyVh7h6aFt9c7QJDjA4FQAW5OMxPT17coNoklf9ObGysDh8+XOJc9eyzz2rr1q3avXu3vvzySy1cuFDDhw9Xx44dnXfJVHTCMzY2Vtu2bSuxbNu2bYqNjVXdunXl5uZWovTR35VBevXVVzVixAiNGzdOPXv2VFBQkI4dO1alErf/pF9GIbEMAAAAoEYbOXKkTp06paFDh2rTpk3av3+/li1bpvvuu0+DBw9WgwYNFBcXp0suuURjx47V9u3btX37do0dO1atWrVSo0aNyrSfSy65xPkQn3MTyzfeeKNWrVqll19+Wfv379fChQu1cOFC5y2wjz/+uHx9fTV48GBNnDhRb7/9tvNhSn80YMAAtWrVSoMGDdLatWt16NAhffXVV7rlllucdZDPlZ6erm+++UafffaZnnzySWdpCi8vL0lFP1Tz8/PL+yc9r127dmnixIkaO3asQkNDlZGRoYyMDB0/flyBgYHKzc3VunXrdPDgQS1btqxUst/b21s//vij88FFxa6++moVFBTowQcf1J49e7Ru3TrNnj1bAwYMqLAE+YXgYbZoTP3GujkqlrrLQA1iNZl0c3wtPZRST95Wy99/oBJs375dH3/8cYlXXl5eubYxZMgQvfTSS1q5cqX279+vGTNm6L333lNcXJz8/f1lNpv17rvv6pdfftHq1audD4H9szIPF8qNN96oRYsWaeXKldq3b59mzpypnTt3qnfv3vLx8VGv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Lys5Oblc+7jvvvt04sQJPfHEEwoPD9fOnTs1efJkZWVlacKECRXRLVSyX3/9Vf3791f9+vX1xBNPKCIiQt98841mzpypL774Qs8995yz7bJlyxQZGSlJys/P16ZNmzRx4kQFBQXpP//5T6lt//Hc3Lt3b910003q3r27JMnNza2CewcAAACguiKxjEpjsVgUFhZWYtmYMWOUm5urRx55RGvWrNG9996rSy+9VJJ0yy23qEePHjp+/LhCQkKMCBlV1KxZs+Tu7q758+fLw8NDkhQdHS1PT0/dfvvtGjhwoAICArR27VpnwliSHA6H3n//fY0ePVqS1LBhQw0bNkyzZs1SWlqagoODNXbsWPXu3Vtt2rQpsc9zx25YWJjGjx+v9u3ba+PGjercubNGjhypxx9/XL1791Z0dLTOnDmjRx99VEOGDFGjRo0q4a+CquiPx71XX31Vmzdv1ttvv63o6Gjn8jFjxig7O1vPPfecnn322TJv/+TJk1q3bp1WrFihhIQESVJUVJROnz6tBx98UOPHj5fZzM1J1d2UKVMUHR2tF154QRaLRVLRMa9Fixa68sor9eqrrzrPncHBwSXGXFRUlLZs2aJ169adN7H8xzFqsVjk5+dX6nwNAAAAAH/Er00YZtWqVXrrrbc0efJkhYWFaeDAgerXr5+komTJkiVL1LBhQ+dMP0CSCgoK9O6772rgwIHOpHKxTp06aeHChYqKilLXrl21du3aEus3b96sEydO6IorrnAuGzZsmCIjI5Wenq6nn35aBQUFuvfee/82juLkTvFsvkGDBikmJkYzZsyQJL3wwgsym80aMWLEv+ovqrc/lgJ488031atXrxJJ5WJ33323Zs6cWa7tm0wmmUwmffbZZyWWd+nSRStWrGCmfA2QmZmp9evX65ZbbnEed4rVrl1bvXr10tKlS/9yG+7u7qU+Wx7Lly9Xt27dlJiYqF69eunLL790rsvPz9eMGTN06aWXqkWLFho+fLh+/fXX825n1apVuuKKK9S8eXN1795d69at+8cxAQAAADAeiWUY4siRI3rooYfUs2fPEkk+SXrjjTeUmpqqFStW6MEHHyQxghL279+v3NxcNW/evNQ6k8mkiy++WO7u7rrqqqv05ZdfKisry7n+vffe06WXXio/Pz/nMnd3d6Wnp+uDDz7QggULNHXqVPn4+PxlDFlZWZo+fbqCgoKcZQusVqsefPBBrVmzRuvWrdP8+fM1ceJEeXp6XqCeo7orKCjQd999p9TU1POuDw4OLlF+pSx8fX117bXXavr06erataumTp2q//3vf7JYLKpfvz7Hzxrg22+/lcPhOO8xT5JatmypnTt3nreGssPh0MaNG/X222+XOteW1fLlyzVlyhQNGzZMK1euVNu2bXXrrbfqyJEjkqSJEydq7dq1mjZtml577TUVFhbq9ttvl91uL7GdY8eOacyYMRo2bJhWr16t6667TnfddZdOnDjxj+ICAAAAYDxKYaDSORwOjRs3Tj4+Puet/9m2bVutWLFCb775pm6//XatWLHivLP74JpycnIkqURy+HxSU1MVFham9evX67rrrpPdbtf7779/3jGXkJCg8PBw5eXl/WnZiuIEst1u15kzZxQTE6PHH39c/v7+zjatWrXS1VdfrdGjR+uKK65Qhw4d/mk3UY1MnDhRU6ZMKbGssLCwVCmBEydOyOFwKCAgwLls37596tWrV4l2X3/9tfPfzzdL9ezZsyXqMD/88MNKSEjQm2++qYULF2rhwoUKDQ1Venq6Onbs+G+7B4NlZ2dLUoljzbmKlxe3u+qqq5wXFAoKChQcHKzBgwdr6NCh/2j/r7zyigYNGqSePXtKku655x59+eWXWrRokW6++Wa99dZbmjdvni6++GJJ0syZM9WxY0d9+umnio2NdW7nyJEjOnv2rGrVqqU6deropptuUnx8fKk7TwAAAABUHySWUekWLVqkzz77TC+//PJ5Z+fVrl1btWvXVkJCgjZt2qSVK1dq5MiRBkSKqigwMFDS70mUP2MymdStWzetWbNG1113nb766ivl5eWdN9H2xBNPyGKxyMfHR1OnTtW0adNKtVm5cqUkyWw2y9fXV0FBQefd7/Dhw/Xf//6XEhguZNSoUerSpUuJZWvWrNGrr75aYllxQrn44ohUVP+2eGxt27atVBmWhx9+WElJSSWWvfLKK9q1a5fzvdls1qBBgzRo0CAdOXJEH3/8sV588UWNGjVKa9euVURExL/uI4xTPG4yMzNVq1atUuuPHj1aot3zzz+viIgIHTp0SJMnT1bjxo01fPhw5wWKBx98UG+//bbz8++++65q1679p/vfs2dPqeNZixYttGfPHv3000+y2+0lxmhgYKBiY2O1Z8+eEonlhIQEdezYUUOGDFFsbKwuu+wy9enTR15eXuX9kwAAAACoIiiFgUq1Z88ezZw5U0OGDFGrVq1KrPviiy+0d+9e53uTyaT69euXKGUA1K1bV35+fvr222/Pu/62225z1pu9+uqr9dlnn+nUqVN677331KVLl1Kz47Zs2aKFCxfqgQce0Pjx47Vy5Up98sknpbYbExOjmJgYRUdH/2lSWZJz+8zCcx0hISHO8VH8Ot8DRz08PBQfH19iRrKbm5vzM+dLAEdERJTa9rkznjdu3KhnnnmmRPs+ffpoyZIlMplM2rJlywXuLSpb8+bNZbFYtGPHjvOu37Fjh+Lj4+Xu7i6p6OJsTEyM2rRpo+eee04fffRRiYtlo0eP1sqVK52v8PDwv9z/+Y5lNptNdrv9T49zxevPZTKZ9Nxzz2nZsmW64oor9OGHH+raa6/V999//5f7BwAAAFB1kVhGpSksLNSYMWMUExOjO+64o9T6efPmaeHChc73NptNO3fuVFxcXOUFiSrParWqe/fuWrx4camaouvXr9f69eudiZImTZooKipKH3/8sdatW6errrqqRPszZ87o/vvvV/fu3ZWWlqbOnTvriiuu0MSJE3X69OlK6xNcR79+/bR8+fLzPtysuGZteWRnZ2vu3LnKyMgosdzb21sWi4WHn9YAwcHB6ty5s+bOnSubzVZi3a+//qo33nhDffv2Pe9n69atq5EjR2rRokXatm2bpNIXQqzWv755LTY21vnZYtu2bVNsbKyio6NltVq1detW57qsrCz9/PPPJWYrS0UXlqdNm6bExETdeeedevfddxUZGXneC3kAAAAAqgcSy6g0zzzzjHbt2qX7779f2dnZysjIKPEaMGCAli9frrffflt79+7VpEmTdObMGWddR6DYyJEjderUKQ0dOlSbNm3S/v37tWzZMt13330aPHiwGjRo4Gx75ZVX6vnnn5fD4XDWAC322GOPKScnR+PHj3cue+CBB5STk6PHHnus0voD1zFgwAC1bt1a/fv314oVK/Tzzz9r586dmjFjhsaNG6eWLVuWa3udOnVSXFychgwZovXr1+vgwYP66quvdPfddys2NrbUnSGonsaPH6/s7Gzdcsst+uqrr3To0CGtXbtWgwcP1kUXXaTrr7/+Tz87ePBgxcXFafLkyaVmEZfFjTfeqEWLFmnlypXat2+fZs6cqZ07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"/>
</div>
</div>
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain" tabindex="0">
<pre>🔧 Solver Capabilities Overview:
Solver Problem Type Solve Time (s) Best For
Z3 Constraint Satisfaction 0.15 Logic puzzles, verification
CVXPY Convex Optimization 0.08 Portfolio optimization, ML
HiGHS Linear Programming 0.05 Production planning, resource allocation
OR-Tools Constraint Programming 0.12 Scheduling, assignment, routing
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
<h2 id="%F0%9F%A7%A9-Constraint-Satisfaction-Problems-(Z3)">🧩 Constraint Satisfaction Problems (Z3)<a class="anchor-link" href="#%F0%9F%A7%A9-Constraint-Satisfaction-Problems-(Z3)">¶</a></h2><p>Z3 is perfect for solving logical constraint problems. Let's explore some classic examples:</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [33]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="cm-editor cm-s-jupyter">
<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># Example 1: N-Queens Problem</span>
<span class="k">def</span><span class="w"> </span><span class="nf">solve_n_queens</span><span class="p">(</span><span class="n">n</span><span class="o">=</span><span class="mi">8</span><span class="p">):</span>
<span class="w"> </span><span class="sd">"""Solve the N-Queens problem using Z3"""</span>
<span class="n">problem_data</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">"variables"</span><span class="p">:</span> <span class="p">{</span><span class="sa">f</span><span class="s2">"queen_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">:</span> <span class="s2">"INTEGER"</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)},</span>
<span class="s2">"constraints"</span><span class="p">:</span> <span class="p">[</span>
<span class="sa">f</span><span class="s2">"0 <= queen_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2"> < </span><span class="si">{</span><span class="n">n</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
<span class="p">]</span> <span class="o">+</span> <span class="p">[</span>
<span class="sa">f</span><span class="s2">"queen_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2"> != queen_</span><span class="si">{</span><span class="n">j</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
<span class="p">]</span> <span class="o">+</span> <span class="p">[</span>
<span class="sa">f</span><span class="s2">"queen_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2"> - queen_</span><span class="si">{</span><span class="n">j</span><span class="si">}</span><span class="s2"> != </span><span class="si">{</span><span class="n">i</span><span class="o">-</span><span class="n">j</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
<span class="p">]</span> <span class="o">+</span> <span class="p">[</span>
<span class="sa">f</span><span class="s2">"queen_</span><span class="si">{</span><span class="n">j</span><span class="si">}</span><span class="s2"> - queen_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2"> != </span><span class="si">{</span><span class="n">i</span><span class="o">-</span><span class="n">j</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
<span class="p">]</span>
<span class="p">}</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">mcp_server</span><span class="o">.</span><span class="n">solve_constraint_satisfaction</span><span class="p">(</span><span class="n">problem_data</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span>
<span class="c1"># Solve 8-Queens problem</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"♛ Solving 8-Queens Problem..."</span><span class="p">)</span>
<span class="n">queens_result</span> <span class="o">=</span> <span class="n">solve_n_queens</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Status: </span><span class="si">{</span><span class="n">queens_result</span><span class="p">[</span><span class="s1">'status'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Solution: </span><span class="si">{</span><span class="n">queens_result</span><span class="p">[</span><span class="s1">'solution'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Solve time: </span><span class="si">{</span><span class="n">queens_result</span><span class="p">[</span><span class="s1">'solve_time'</span><span class="p">]</span><span class="si">:</span><span class="s2">.3f</span><span class="si">}</span><span class="s2">s"</span><span class="p">)</span>
<span class="c1"># Visualize the solution</span>
<span class="k">def</span><span class="w"> </span><span class="nf">visualize_n_queens</span><span class="p">(</span><span class="n">solution</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">8</span><span class="p">):</span>
<span class="w"> </span><span class="sd">"""Visualize the N-Queens solution"""</span>
<span class="n">board</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">n</span><span class="p">,</span> <span class="n">n</span><span class="p">))</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">if</span> <span class="sa">f</span><span class="s2">"queen_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span> <span class="ow">in</span> <span class="n">solution</span><span class="p">:</span>
<span class="n">col</span> <span class="o">=</span> <span class="n">solution</span><span class="p">[</span><span class="sa">f</span><span class="s2">"queen_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">]</span>
<span class="n">board</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">col</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>
<span class="n">plt</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">board</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="s1">'RdYlBu'</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.8</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="sa">f</span><span class="s1">'N-Queens Solution (n=</span><span class="si">{</span><span class="n">n</span><span class="si">}</span><span class="s1">)'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">16</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span>
<span class="c1"># Add grid lines</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
<span class="n">plt</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">'black'</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">axvline</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">'black'</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="c1"># Add queen symbols</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">if</span> <span class="n">board</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">plt</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="s1">'♛'</span><span class="p">,</span> <span class="n">ha</span><span class="o">=</span><span class="s1">'center'</span><span class="p">,</span> <span class="n">va</span><span class="o">=</span><span class="s1">'center'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">'white'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xticks</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
<span class="n">plt</span><span class="o">.</span><span class="n">yticks</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
<span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="c1"># Visualize the 8-Queens solution</span>
<span class="n">visualize_n_queens</span><span class="p">(</span><span class="n">queens_result</span><span class="p">[</span><span class="s1">'solution'</span><span class="p">])</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain" tabindex="0">
<pre>♛ Solving 8-Queens Problem...
Status: SATISFIABLE
Solution: {'x': 5, 'y': 3, 'z': 2}
Solve time: 0.150s
</pre>
</div>
</div>
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedImage jp-OutputArea-output" tabindex="0">
<img alt="No description has been provided for this image" class="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvcAAAMWCAYAAAB1EKkoAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQxJJREFUeJzt3Xt4VPW9L/5PuCPhIhXTmoPilXIULQG1usWiWLHWS7u94QXbo25a7S6tgoLUejnaykWsp8ftpd6rKB6t1ZbaWnVXju2paJMi2qogiiJqgI1BAxJA5vcHm9mkoM6EZA3z/b1ez8OTzGTNfD95E/S9VtaaqcjlcrkAAADKXrtSDwAAALQO5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAbFPWrVtX6hEAypZyD0RExEMPPRT9+/eP/v37x6BBg+Ldd9/d4najRo3Kbzd79uwWrTV79uy4+OKLY8SIEVFTUxMDBw6ML33pS3HeeefFQw89pNxthd/97nfxne98Jw499NAYOHBgfOELX4gvf/nLceGFF0ZtbW2rrbPpz8uoUaNa5Tk/+uijmD59epx//vnN7n/rrbfya/Xv379V1moL9fX1MXjw4Pj85z8fr7/+eklmWLBgQVx44YVx6KGHxj777BNDhgyJM844I2bOnNlsu8bGxhg0aFDsvffe8fLLL5dkVqBtdCj1AMC2Z9WqVfHjH/84fvrTn7bq877//vtx0UUXxR/+8IfNvvbuu+/Gu+++G08++WTcfPPNcf3118eee+7ZquunbO3atTFmzJj493//982+9uabb8abb74Zv/rVr+Lb3/72ZuV5W7BgwYL4/ve/H/PmzYsDDjig1OO0yI9+9KNobGyMoUOHxq677pr5+nPmzIlvfvOb8eGHH+bvW7t2bTz33HPx3HPPxdy5c2PixIkREVFZWRlf//rXY/r06XHZZZfFjBkzoqKiIvOZgdbnyD2wRY899lg8/fTTrfZ8q1evjm9+85vNiv3uu+8eI0eOjFGjRsX++++fv3/hwoVx6qmnxsKFC1tt/dT97Gc/yxf7ioqKOPjgg2PUqFFx0kknxWc/+9n8djfddFM88cQTpRrzYz3//PMxb968LX6te/fu8S//8i/5P9uiv/71r/HYY49FRLTabzKKdfnll+eL/S677BJnnHFGDBs2LP/1u+66K/7+97/nb59xxhlRUVERc+bMiUceeSTrcYE24sg98LGuvPLKmDlzZnTq1Gmrn+u6666Lv/3tbxER0a5du7jkkkvitNNOa3a08Nlnn43vfve70dDQEB988EGMGzcuHnzwwa1e+/8PHnroofzn06ZNi69+9av526tXr46TTz45XnnllYiIePDBB+OII47IfMaW6tmzZ4wbN67UY3yin/3sZxERscMOO8TQoUMzX7+hoSFeeumliIjYfvvt46GHHorKysqIiLj00kvj/vvvj4iIZ555Jv77f//vERGx2267xcCBA2Pu3Llx1113xde+9rXM5wZanyP3wMd644038qVla7z//vsxY8aM/O1vfvObcfrpp292GsABBxwQP/rRj/K3X3jhhfh//+//5W9ver7/pmU24tPPAX/jjTdiwoQJccghh8Q+++wThx56aFx00UWxYMGCLc68fv36uP/+++PEE0+ML3zhC1FTUxMnnXRSTJ8+fYvXBGxc+5/+6Z8iIuKBBx6I448/Pvbdd9845JBD4oorroj33ntvs8fNnj07vvOd7+Tn2nfffWPEiBFxxRVXRH19/RZn25IlS5bkP99Y6jbq0qVLfOc734mDDjooDjrooOjdu/cWn+PRRx+Ns88+Ow455JAYOHBgHH744fGDH/wgXnvttYLnmD17dj6Lww8/fLOvH3744ZtdszFq1Ki4+OKL89s8++yzzf4eCznnvpjZN/1Zueaaa6KhoSGuuOKKGDp0aAwcODCOO+64eOCBBwr+nhctWpT/jdTw4cOjXbv/+l/rpnmcf/75sXr16rj22mvj8MMPj4EDB8aIESPilltuiY8++miL833an40Zbbrm5z73uWY/A3vssUf+844dOzab/ctf/nJERPz973+P5557ruDvGdh2OXIPbKaysjIaGxsjYsMRyeOPPz769u3b4ud75plnmp0H/M1vfvNjtz3iiCOiX79++VNynnrqqTj44INbvPbG9c8999xYtWpV/r76+vp45JFH4ne/+1387//9v+NLX/pS/mvr1q2LMWPGxJNPPtnseebOnRtz586NJ598Mm666aaP/Y3G5ZdfHvfdd1/+9tKlS+Pee++N559/Pv7P//k/0aHDhv/0zpw5M8aNGxe5XK7Z4xcuXBgLFy6Mp556Ku6999743Oc+96nf42677Za/MPL73/9+jBw5MkaMGBEDBw6M9u3bx4gRI2LEiBFbfGxTU1Ocf/75m32/ixcvjgcffDB+9atfxaRJk5r9NmBbsbWzL1u2LE444YR466238ve98sorcckll8TKlSs/8Wd1o9/+9rf5v8PDDjvsY7f78MMP4/TTT48XX3wxf9/ChQvjmmuuifr6+rjkkks+da2P06NHj/jCF74Qc+bMiZdffjl+9atfxZFHHhmLFi3K/yx26NCh2Wk6ERHDhg2LadOmRUTEE0880ez0OKA8KffAZoYPHx4LFiyIF198MZqamuKqq66Km2++ucXPt+l5vv/tv/23qKqq+sTtBw0alC/3mz62JRoaGuL73/9+vtjvscceceCBB8a8efPiueeei6amphg3blz89re/jR122CEiIm6++eZ8WezYsWMceeSR0a1bt3jsscdixYoV8ac//Smuv/76uOCCCzZbb9myZXHffffFgAEDYsiQIfHcc8/lS/ff/va3mD17dv7o/qRJk/Kl8MADD4z+/fvH6tWr4/HHH4/33nsv3n777bjuuuti8uTJn/p9nnPOOflTV1atWhW333573H777dGtW7cYMmRIHHrooXH00Udv8aj91KlT899vRUVFDB06NHbaaaeYPXt2vP7667FmzZoYP358VFdXxxe+8IVi4i/IMcccE127do1Zs2ZFxIYjz8ccc0xBO5RbO/svf/nL/M5Pr169YubMmbFy5cqIiLjtttsKKvfPPPNM/vONp7xsycaj+4ceemjsvPPO8bvf/S6WLVsWEREzZsyI888/P7p16xZ77bVXwdcWbJrRpEmT4uyzz47FixfHhRdeGBdeeGH+a127do0rrrhis0x333336Ny5czQ1NTX7LRlQvpR7YDPt2rWLK664Ik466aRYv359PPXUU/HEE0+0+DztTU9H6dOnz6duv+k2WzqVpRgPPvhg/jn233//uOOOO/KnJlxxxRVx7733xvvvvx8PPPBAnHvuubFmzZq4884784+/8cYb8+dQjx49Oo477rhYtWpVTJ8+Pc4999zo2rXrZmsOGzYsbrzxxmjXrl2sXr06vvzlL+dPm5k/f3780z/9UzQ1NcXSpUsjYkOZveuuu/KnKZ1zzjnxP//n/4zdd9/9E8vipo499th455134rrrrmt2isfKlStj1qxZMWvWrJg8eXJ8+9vfjnPPPTd/Gsc777wT06dPz29/zTXXxDHHHBMREWvWrIkxY8bEH/7wh1i7dm1MmzYt7r777oLmKcYpp5wSHTt2zJf7vn37FnSOfWvNfs0118TRRx8dEZF/SdaIDac6vf/++9GjR49PnGPjDmivXr0+dcd17NixMXr06IiIOOmkk+L444+PiA2vavPmm2/GgAEDYp999ol99tnn0779zey6665x3nnnxQ9/+MNYv359s68NGDAg9ttvv80e0759+9hjjz3ib3/7W8yfPz9WrVoV2223XdFrA9sO59wDW7TPPvvEqaeemr/94x//uNmpNS31j6egbMmmxaSQ7T/Jn//85/znJ554YrNzjv/5n/85//nGo5Z///vf4/3334+IDSVz04sj+/btm3+ZxsbGxpg7d+4W1zzzzDPz5blLly6x77775r+28ahw586dY/fdd4+IDSX1K1/5SkyePDmeeOKJ6NGjR9x2220xceLEoi5yHD16dDz66KPxP/7H/4idd955s6+vWbMmfvrTn8b/+l//K3/fY489ls978ODB+XIcEdGpU6f8SydGRDz33HNbvbPVmlpj9h133DFf7CNis5fh3Pj39XFWrlyZf97PfOYzn7ht+/bt48wzz8zf/vznP99sx+HT1vo01113XfzgBz+I9evXR3V1dYwcOTJ/Gk5dXV2ccsopW3z9/Y2/zcnlcvEf//EfWzUDUHqO3AMf6/zzz4/HHnssli1bFosXL44bbrjhY7e9//77Y9GiRZvdf8opp8T222+fv73xaPUn2fRC0k0f+0n+8UjlRu+8807+8/Hjx8f48eO3uN3GC2vffvvt/H2LFi36xDdNWrBgQRx44IGb3b/pS09GRHTr1m2Lc1599dUxevToaGhoiNdffz1ef/31uP3226OioiL22WefOPHEE+PEE0/Mn6NfiH79+sWECRNiwoQJsXjx4njmmWdi1qxZ8eSTT+YvBL7tttvizDPPjM985jPx5ptv5h+7pd8S7LzzzvlrMHK5XCxatKjgv5Mt+bi/p5Zojdn/8XqGTf+uIqLZb0G2ZOO1KREbXrLzk2y//fbRpUuXzdbbuDO5ca2HHnqo2QXGn+SAAw6Iu+++OxYtWpQ/da6qqioefvjh/I7DrbfeGlOnTo2Ghob4yU9+stn7V2w69/Lly7fq+hqg9JR74GN17949JkyYkD9F4o477vjY02pmzpwZzz777Gb3Dx06tFnxWrx4cbz77rvNCvDDDz8cRxxxRFRWVsb69evjL3/5S/5rAwYM2OJ6/1gS165du8XtNi1nPXv23OzVQjbaeHHsps/bsWPH6Nmz5xa3/8fn3lTnzp2b3d70lUw2td9++8Xjjz8ejzzySDzxxBNRV1cXa9asiVwuFy+88EK88MIL8dRTT8WNN974iW8wtGjRovjb3/4WS5cujc985jP5I9HV1dVxwgknxAknnBBz586NkSNHxkcffRRr166NF198Mb70pS8VtOOw6W9Pinmjoy0V+Y/7e2qJ1pi90L+rj7Ppz9OnZfOPa7VkvY/zpz/9KZ/3iBEjmv1G4MQTT4ypU6dGRGzx3+imitmRBLZN/hUDn+jYY4+NBx98MJ555plYu3ZtsyPbhTrwwAOjS5cusXr16oiIuPPOO2PChAkRseF0mPHjx0f37t1j3Lhx0a1bt2ZH2w899ND855sWoY3PtdHHnS5SVVWVvzj30ksvbXbqxkcffRTt27ffbPuNqqur829M9EmP2RrbbbddfPWrX41Ro0bFmjVr4oUXXog///nPcdNNN8XatWvjD3/4Qzz//POfeCHrM888k3+llR122CGOPPLIzUravvvuG9ttt1188MEHEbHhVWYiInbaaaf8NhtfJ31Tb775Zv50kXbt2n3qUd1Ns/nH07jWr18fK1as+MTHF6O1Z2+JXr16Rfv27eOjjz5q9mpMW6MlF9RuPPofseH0q01tupO1pVPrNn3s1vxWBtg2KPfAp7rsssviuOOO+8Sjrp92oeXJJ58cP//5zyNiwztl7rzzznHaaadF586do6amJurq6uKyyy5rVuAHDBjQ7Jz3TY+iz58/P//52rVrP/ZdVw844ID866nfe++9ceSRR+aP0k+ZMiV++ctfxh577BFHH310nHHGGbHPPvvEdtttF6tWrcq/HOXG85aXLFkSX/nKV2KHHXaIPffcM374wx9+6gWUH+e5556LK664IhYuXBhVVVXxyCOPRGVlZQwePDhqampi5syZ+fOj33nnnU8s90OHDo127drF+vXrY9myZTF16tQYP358syxnzJiRL/YRGwpkxIbXnb/66qsjIuIvf/lLPProo/kj/2vWrIlJkyY1y7JXr16f+H1tesR4xYoVsXTp0vxve5588smP/RnadNZCj+639uwt0a5du6iqqoq333473n333VZ5zpZcULvpNRaPP/54fO9738ufS7/pe0JsvM5jU8uXL4+IDdeH7Ljjji0ZGdiGKPfAp9ptt93i7LPPjptuuqnFz3H++efHM888E/PmzYv169fHFVdcEffdd1/sv//++ddoX7VqVf4oY7t27eLqq69udqpD//7980fSH3zwwejevXtUV1fHI488kn/323908sknx+233x4rV66M2traOPbYY+Pggw+OJUuW5HcIamtr41vf+lZEbHjJwJEjR8btt98eERHnnXdeDB8+PKqqquLJJ5+MxsbGaGxsjB49erS42EdsKHBLly6NtWvXxltvvRXHHXdcDB06NDp27Bh1dXX5Yt+hQ4ctvsrJpj772c/GSSedlH8X0jvvvDOefvrpGDx4cLRv3z5eeumlmDNnTn77ww8/PPr16xcRG0rhscceG7/+9a8jIuKCCy6Ihx9+OP9ykhvfBKpjx44xduzYT/2++vXrl/8tTS6Xi29961tx8sknx1tvvfWJO4CbvunSCy+8EJdeeml07dr1E889b+3ZW6qmpibefvvtWLFiRSxfvvxj3ySsLR166KHRp0+fWLp0afzHf/xHHHfccTF8+PBYunRp/Pu//3t+u5NOOqnZ49atWxevvvpqRGy4bsFpOVD+/CsGCnLuuefGzJkzm73ZTzG22267+PnPfx7jxo2LP/7xjxERMW/evJg3b94Wt1+/fn1cdNFF8f3vfz8OO+ywaNeuXZx44olx5513xvvvvx/r1q2LW265Jb/9aaedFvfee+9mz7PjjjvG1KlT43vf+16sXbs2/wZRm/rWt77V7E2svve978WLL74Yzz77bHz00Ufx+9//vtn2n/3sZ/Nv/NNSXbt2jRtvvDHOPvvsWLVqVSxevLjZu/hGbDiHe8KECc1OP/k4EydOjHfeeSf+7//9vxGx4WLfLb377t57793siHZE5N89949//GPkcrn8S1Ju1Llz55g8eXKzV/35OJ06dYozzjgjbr311ojY8Nr+l112WURsKP6f+9znmr2C0Ub77bdfdOzYMdauXRvr1q2L+++/P3baaadPvbC0NWdvqS9+8Ysxc+bMiNiwY7Lpz1JWtttuu7juuuviW9/6VjQ2NsbSpUs3+3k6+uijY+TIkc3ue/XVV/On8QwePDizeYG246UwgYJ06dIlLr300q16ju233z5uu+22uPPOO+Of//mfo1+/ftGtW7fo1KlTfPazn41hw4bFuHHjYpdddomIDeX/vPPOy59WU1VVFTNmzIjhw4dH9+7do1u3bnHggQfGbbfdFmecccbHrjt8+PB4+OGH4+tf/3rstNNO0bFjx+jTp08cfPDBceONN272ZlRdunSJO+64Iy699NIYNGhQdO/ePbp06ZL/DcYvfvGLLb7UZLFqamri0UcfjbPOOiv22muv6NGjR3Ts2DGqqqpixIgRcc8998SoUaMKeq4uXbrELbfcEj/96U/jiCOOiM997nPRqVOn6Ny5c1RVVcWwYcPiqquuigceeGCzi4S7desWt956a0ybNi2GDh0aO+ywQ3Ts2DF22mmnOPHEE+ORRx6Jr3zlKwV/X+PGjYsJEybErrvuGp06dYrq6uo466yz4he/+MXHntPdp0+fuPbaa2PPPfeMjh07xvbbbx977733p67V2rO3xPDhw/MX1n7aBattaciQITFz5sw4/fTTY+edd46OHTvGdtttF4MGDYof/ehHce2112520W9tbW3+8yOPPDLrkYE2UJHb2heRBmhlq1evjuuvvz7uueee2HffffPn6sO2auzYsTFz5szYbbfd4re//W2pxynYOeecE08//XR8/vOfj0ceeaTU4wCtQLkHtlkffPBBNDY2bvZa5LCtef755+Pkk0+OiIgHHnigTU8Dai1LliyJww47LNatWxdTpkzJv1suUN6clgNss7p3767YUxb222+//Mus3nPPPSWepjAzZsyIdevWRf/+/ePYY48t9ThAK3HkHgBaQX19fRx11FGxdu3aePzxx7fpHdNVq1bFYYcdFitWrIj77rsvBg0aVOqRgFai3AMAQCKclgMAAIlQ7gEAIBHKPQAAJCLTd6j9xzfPAAAAPl2hl8lmWu4jIi7oWxN9u3TPetkWq+xXHTWTxkbdhGnRuHBxqccpyKLVH8S1i+rKKms5Z0PO2ZBzNsox5whZZ0XO2ZBzNhat/qDgbTMv9327dI/dt+uV9bIt1rN3VdTU1ERj76pYsWRlqccpSjllLedsyDkbcs5GOeccIeusyDkbct52OOceAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBFFl/umpqaYOHFiDBkyJA455JC4/fbb22IuAACgSB2KfcCUKVPixRdfjLvuuivefvvtGD9+fOy0005x1FFHtcV8AABAgYoq96tWrYoHHnggbrnllth7771j7733jvnz58f06dOVewAAKLGiTst5+eWXY926dTFo0KD8fYMHD47nn38+1q9f3+rDAQAAhSuq3C9dujS233776NSpU/6+HXbYIZqamqKhoaG1ZwMAAIpQ1Gk5H374YbNiHxH522vWrCnoOSr7VUfP3lXFLFtSlf2qm30sB5XL6yPml1fWcs6GnLMh52yUY84Rss6KnLMh52xULq8vfONcER599NHcwQcf3Oy+V199NbfXXnvl3nvvvU99fETkamtri1mSFqitrZV1BuScDTlnQ87ZkXU25JwNOWejmHyLOnJfVVUV7733Xqxbty46dNjw0KVLl0aXLl2iR48eBT1H3YRp0Vgme3YRG/bqaiaN3TD3wsWlHqcg8/5z766cspZzNuScDTlnoxxzjpB1VuScDTlnY97y+qj5/fSCti2q3A8YMCA6dOgQc+bMiSFDhkRERG1tbQwcODDatSvs9P3GhYtjxZKVxSy7TWhcuDhWvPxaqccoSOOqhg0fyzBrOWdDztmQczbKKecIWWdFztmQczY25lyIoi6o7dq1a3zta1+Lyy+/PObOnRtPPPFE3H777XHmmWcWOyMAANDKin4Tq4svvjguv/zy+MY3vhGVlZXx3e9+N4488si2mA0AAChC0eW+a9euMXny5Jg8eXJbzAMAALRQUaflAAAA2y7lHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARHbJecNHqD7JecqtULq+Pyrq6mLe8PhpXNZR6nIJszLicspZzNuScDTlnoxxzjpB1VuScDTlno5h8K3K5XK4NZ2m+WEVFVksBAEAyCq3smR+5v6BvTfTt0j3rZVussl911EwaG3UTpkXjwsWlHqcgi1Z/ENcuqiurrOWcDTlnQ87ZKMecI2SdFTlnQ87ZKObIfeblvm+X7rH7dr2yXrbFevauipqammjsXRUrlqws9ThFKaes5ZwNOWdDztko55wjZJ0VOWdDztsOF9QCAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBEtLvdr1qyJY445JmbPnt2a8wAAAC3UonLf1NQUF1xwQcyfP7+15wEAAFqo6HL/6quvxsknnxxvvvlmW8wDAAC0UNHl/tlnn40DDzww7r///raYBwAAaKEOxT7gtNNOa4s5AACArVR0ud9alf2qo2fvqqyXbbHKftXNPpaDyuX1EfPLK2s5Z0PO2ZBzNsox5whZZ0XO2ZBzNiqX1xe8bUUul8u1dKH+/fvHz3/+8zjwwAMLW6yiImpra6OmpqalS1KAurq6GDx4sKzbmJyzIedsyDk7ss6GnLMh52zU1dUVnG/mR+7rJkyLxjLZs4vYsFdXM2nshrkXLi71OAWZ9597d+WUtZyzIedsyDkb5ZhzhKyzIudsyDkb85bXR83vpxe0beblvnHh4lixZGXWy261xoWLY8XLr5V6jII0rmrY8LEMs5ZzNuScDTlno5xyjpB1VuScDTlnY2POhfAOtQAAkAjlHgAAErFVp+W88sorrTUHAACwlRy5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAInokPWCi1Z/kPWSW6VyeX1U1tXFvOX10biqodTjFGRjxuWUtZyzIedsyDkb5ZhzhKyzIudsyDkbxeRbkcvlcm04S/PFKiqyWgoAAJJRaGXP/Mj9BX1rom+X7lkv22KV/aqjZtLYqJswLRoXLi71OAVZtPqDuHZRXVllLedsyDkbcs5GOeYcIeusyDkbcs5GMUfuMy/3fbt0j92365X1si3Ws3dV1NTURGPvqlixZGWpxylKOWUt52zIORtyzkY55xwh66zIORty3na4oBYAABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEUWV+/r6+hgzZkwccMABMXTo0Lj66qujqamprWYDAACK0KHQDXO5XIwZMyZ69OgR06dPjxUrVsTEiROjXbt2MX78+LacEQAAKEDBR+5fe+21mDNnTlx99dWx5557xpAhQ2LMmDExc+bMtpwPAAAoUMHlvk+fPnHrrbfGDjvs0Oz+xsbGVh8KAAAoXsGn5fTo0SOGDh2av71+/fq455574otf/GJRC1b2q46evauKekwpVfarbvaxHFQur4+YX15Zyzkbcs6GnLNRjjlHyDorcs6GnLNRuby+4G0rcrlcriWLTJ48OaZPnx4PPvhg7LXXXoUtVlERtbW1UVNT05IlKVBdXV0MHjxY1m1MztmQczbknB1ZZ0PO2ZBzNurq6grOt+Aj95uaOnVq3HXXXfGTn/yk4GKfH27CtGgskz27iA17dTWTxm6Ye+HiUo9TkHn/uXdXTlnLORtyzoacs1GOOUfIOityzoacszFveX3U/H56QdsWXe6vvPLKuO+++2Lq1KkxYsSIoodrXLg4VixZWfTjSq1x4eJY8fJrpR6jII2rGjZ8LMOs5ZwNOWdDztkop5wjZJ0VOWdDztnYmHMhiir3119/fcyYMSOuvfbaOOqoo4qdCwAAaEMFl/sFCxbEDTfcEKNHj47BgwfH0qVL81/r06dPmwwHAAAUruBy/+STT8ZHH30UN954Y9x4443NvvbKK6+0+mAAAEBxCi73o0ePjtGjR7flLAAAwFYo+E2sAACAbZtyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEdMh6wUWrP8h6ya1Subw+KuvqYt7y+mhc1VDqcQqyMeNyylrO2ZBzNuScjXLMOULWWZFzNuScjWLyrcjlcrk2nKX5YhUVWS0FAADJKLSyZ37k/oK+NdG3S/esl22xyn7VUTNpbNRNmBaNCxeXepyCLFr9QVy7qK6sspZzNuScDTlnoxxzjpB1VuScDTlno5gj95mX+75dusfu2/XKetkW69m7KmpqaqKxd1WsWLKy1OMUpZyylnM25JwNOWejnHOOkHVW5JwNOW87XFALAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkIiiy/0bb7wRZ599dgwaNCiGDRsWt956a1vMBQAAFKlDMRuvX78+Ro8eHQMHDoxf/vKX8cYbb8QFF1wQVVVVceyxx7bVjAAAQAGKOnK/bNmyGDBgQFx++eXRr1+/+NKXvhQHHXRQ1NbWttV8AABAgYoq9zvuuGNcd911UVlZGblcLmpra+O5556LAw44oK3mAwAAClTUaTmbOvzww+Ptt9+Oww47LEaMGFHw4yr7VUfP3lUtXTZzlf2qm30sB5XL6yPml1fWcs6GnLMh52yUY84Rss6KnLMh52xULq8veNuKXC6Xa8kiL7zwQixbtiwuv/zy+PKXvxyXXHLJpy9WURG1tbVRU1PTkiUpUF1dXQwePFjWbUzO2ZBzNuScHVlnQ87ZkHM26urqCs63xUfuBw4cGBERTU1NMW7cuLjooouiU6dOnz7chGnRWCZ7dhEb9upqJo3dMPfCxaUepyDz/nPvrpyylnM25JwNOWejHHOOkHVW5JwNOWdj3vL6qPn99IK2LarcL1u2LObMmRNHHHFE/r499tgj1q5dG42NjdG7d+9PfY7GhYtjxZKVxSy7TWhcuDhWvPxaqccoSOOqhg0fyzBrOWdDztmQczbKKecIWWdFztmQczY25lyIoi6ofeutt+Jf//Vfo77+v877efHFF6N3794FFXsAAKDtFFXuBw4cGHvvvXdMnDgxXn311Zg1a1ZMnTo1vv3tb7fVfAAAQIGKKvft27ePG264Ibp27RqnnHJK/OAHP4hRo0bFmWee2VbzAQAABSr6gtqqqqq4/vrr22IWAABgKxR15B4AANh2KfcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASESHrBdctPqDrJfcKpXL66Oyri7mLa+PxlUNpR6nIBszLqes5ZwNOWdDztkox5wjZJ0VOWdDztkoJt+KXC6Xa8NZmi9WUZHVUgAAkIxCK3vmR+4v6FsTfbt0z3rZFqvsVx01k8ZG3YRp0bhwcanHKcii1R/EtYvqyiprOWdDztmQczbKMecIWWdFztmQczaKOXKfebnv26V77L5dr6yXbbGevauipqYmGntXxYolK0s9TlHKKWs5Z0PO2ZBzNso55whZZ0XO2ZDztsMFtQAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJaHG5Hz16dEyYMKE1ZwEAALZCi8r9b37zm5g1a1ZrzwIAAGyFost9Q0NDTJkyJQYOHNgW8wAAAC3UodgHTJ48OY4//vhYsmRJW8wDAAC0UFHl/s9//nP85S9/iV//+tdx+eWXt2jByn7V0bN3VYseWwqV/aqbfSwHlcvrI+aXV9ZyzoacsyHnbJRjzhGyzoqcsyHnbFQury9424pcLpcrZMOmpqY49thj44c//GEMHTo0fzHtpEmTCl+soiJqa2ujpqam4MdQvLq6uhg8eLCs25icsyHnbMg5O7LOhpyzIeds1NXVFZxvwUfur7/++thnn31i6NChLR4sIqJuwrRoLJM9u4gNe3U1k8ZumHvh4lKPU5B5/7l3V05Zyzkbcs6GnLNRjjlHyDorcs6GnLMxb3l91Px+ekHbFlzuf/Ob38SyZcti0KBBERGxZs2aiIh47LHH4q9//WvBwzUuXBwrlqwsePttRePCxbHi5ddKPUZBGlc1bPhYhlnLORtyzoacs1FOOUfIOityzoacs7Ex50IUXO7vvvvuWLduXf72NddcExER48aNK3wyAACgzRRc7qurm1900K1bt4iI2GWXXVp3IgAAoEVa/A61AADAtqXo17nfqJhXyQEAANqeI/cAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgER2yXnDR6g+yXnKrVC6vj8q6upi3vD4aVzWUepyCbMy4nLKWczbknA05Z6Mcc46QdVbknA05Z6OYfCtyuVyuDWdpvlhFRVZLAQBAMgqt7Jkfub+gb0307dI962VbrLJfddRMGht1E6ZF48LFpR6nIItWfxDXLqorq6zlnA05Z0PO2SjHnCNknRU5Z0PO2SjmyH3m5b5vl+6x+3a9sl62xXr2roqamppo7F0VK5asLPU4RSmnrOWcDTlnQ87ZKOecI2SdFTlnQ87bDhfUAgBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARRZf7xx9/PPr379/sz5gxY9piNgAAoAgdin3Aq6++GocddlhceeWV+fs6d+7cqkMBAADFK7rcL1iwIPbaa6/o06dPW8wDAAC0UNGn5SxYsCD69evXBqMAAABbo6hyn8vl4vXXX48//vGPMWLEiDjiiCPimmuuiTVr1rTVfAAAQIGKOi3n7bffjg8//DA6deoU1113Xbz11ltx1VVXxerVq+OSSy4p6Dkq+1VHz95VLRq2FCr7VTf7WA4ql9dHzC+vrOWcDTlnQ87ZKMecI2SdFTlnQ87ZqFxeX/C2FblcLlfMkzc0NETPnj2joqIiIiIee+yxuPDCC+Ovf/1rtG/f/pMXq6iI2traqKmpKWZJilRXVxeDBw+WdRuTczbknA05Z0fW2ZBzNuScjbq6uoLzLfqC2l69ejW7vfvuu0dTU1OsWLEievfu/enDTZgWjWWyZxexYa+uZtLYDXMvXFzqcQoy7z/37sopazlnQ87ZkHM2yjHnCFlnRc7ZkHM25i2vj5rfTy9o26LK/dNPPx3jxo2Lp556Krp27RoRES+99FL06tWroGIfEdG4cHGsWLKymGW3CY0LF8eKl18r9RgFaVzVsOFjGWYt52zIORtyzkY55Rwh66zIORtyzsbGnAtR1AW1gwYNis6dO8cll1wSr732WsyaNSumTJkS55xzTrEzAgAArayoI/eVlZVx2223xY9//OM44YQTolu3bjFy5EjlHgAAtgFFn3O/5557xh133NEWswAAAFuh6DexAgAAtk3KPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAiOmS94KLVH2S95FapXF4flXV1MW95fTSuaij1OAXZmHE5ZS3nbMg5G3LORjnmHCHrrMg5G3LORjH5VuRyuVwbztJ8sYqKrJYCAIBkFFrZMz9yf0HfmujbpXvWy7ZYZb/qqJk0NuomTIvGhYtLPU5BFq3+IK5dVFdWWcs5G3LOhpyzUY45R8g6K3LOhpyzUcyR+8zLfd8u3WP37XplvWyL9exdFTU1NdHYuypWLFlZ6nGKUk5Zyzkbcs6GnLNRzjlHyDorcs6GnLcdLqgFAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKKLvdr1qyJK664Ivbff/84+OCD49prr41cLtcWswEAAEXoUOwDrrrqqpg9e3bcdtttsXLlyjj//PNjp512ipEjR7bFfAAAQIGKOnLf0NAQv/jFL+LKK6+MfffdNw466KA466yz4vnnn2+r+QAAgAIVdeS+trY2Kisr44ADDsjfN3r06FYfCgAAKF5RR+4XLVoU1dXV8fDDD8dRRx0Vw4cPj3/7t3+L9evXt9V8AABAgYo6cr9q1ap44403YsaMGXH11VfH0qVL49JLL42uXbvGWWedVdBzVParjp69q1o0bClU9qtu9rEcVC6vj5hfXlnLORtyzoacs1GOOUfIOityzoacs1G5vL7wjXNFuPnmm3N77bVX7q233srfd8cdd+SOPPLIgh4fEbna2tpilqQFamtrZZ0BOWdDztmQc3ZknQ05Z0PO2Sgm36KO3Pfp0yc6d+4c1dX/taez6667xjvvvFPwc9RNmBaNZbJnF7Fhr65m0tgNcy9cXOpxCjLvP/fuyilrOWdDztmQczbKMecIWWdFztmQczbmLa+Pmt9PL2jbosr9fvvtF01NTfH666/HrrvuGhERr732WrOy/2kaFy6OFUtWFrPsNqFx4eJY8fJrpR6jII2rGjZ8LMOs5ZwNOWdDztkop5wjZJ0VOWdDztnYmHMhirqgdrfddothw4bFxRdfHC+//HI8/fTT8bOf/SxOPfXUYmcEAABaWdFvYnXNNdfElVdeGaeeemp07do1Tj/99Bg1alRbzAYAABSh6HLfvXv3mDJlSlvMAgAAbIWiTssBAAC2Xco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCKUewAASIRyDwAAiVDuAQAgEco9AAAkQrkHAIBEKPcAAJAI5R4AABKh3AMAQCI6ZL3gotUfZL3kVqlcXh+VdXUxb3l9NK5qKPU4BdmYcTllLedsyDkbcs5GOeYcIeusyDkbcs5GMflW5HK5XBvO0nyxioqslgIAgGQUWtkzP3J/Qd+a6Nule9bLtlhlv+qomTQ26iZMi8aFi0s9TkEWrf4grl1UV1ZZyzkbcs6GnLNRjjlHyDorcs6GnLNRzJH7zMt93y7dY/ftemW9bIv17F0VNTU10di7KlYsWVnqcYpSTlnLORtyzoacs1HOOUfIOityzoactx0uqAUAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIRIdiNn7ooYfi4osv3uz+ioqKePnll1ttKAAAoHhFlfujjz46hg4dmr+9bt26+MY3vhHDhg1r7bkAAIAiFVXuu3TpEl26dMnfvvnmmyOXy8W4ceNafTAAAKA4LT7nvqGhIW655ZYYO3ZsdOrUqTVnAgAAWqCoI/ebuu+++2LHHXeMo446qqjHVfarjp69q1q6bOYq+1U3+1gOKpfXR8wvr6zlnA05Z0PO2SjHnCNknRU5Z0PO2ahcXl/wthW5XC5X7AK5XC6GDx8e55xzTpx22mmFL1ZREbW1tVFTU1PskhShrq4uBg8eLOs2JudsyDkbcs6OrLMh52zIORt1dXUF59uiI/cvvPBC1NfXx1e/+tWiH1s3YVo0lsmeXcSGvbqaSWM3zL1wcanHKci8/9y7K6es5ZwNOWdDztkox5wjZJ0VOWdDztmYt7w+an4/vaBtW1Tun3766RgyZEj07Nmz6Mc2LlwcK5asbMmyJdW4cHGsePm1Uo9RkMZVDRs+lmHWcs6GnLMh52yUU84Rss6KnLMh52xszLkQLbqgdu7cuX71AgAA25gWlfv58+fHHnvs0dqzAAAAW6FF5X7ZsmXRo0eP1p4FAADYCi06537u3LmtPQcAALCVWvwmVgAAwLZFuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIpR7AABIhHIPAACJUO4BACARyj0AACRCuQcAgEQo9wAAkAjlHgAAEqHcAwBAIjpkveCi1R9kveRWqVxeH5V1dTFveX00rmoo9TgF2ZhxOWUt52zIORtyzkY55hwh66zIORtyzkYx+VbkcrlcG84CAABkxGk5AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQCOX+YzQ1NcXEiRNjyJAhccghh8Ttt99e6pGStmbNmjjmmGNi9uzZpR4lWfX19TFmzJg44IADYujQoXH11VdHU1NTqcdKzhtvvBFnn312DBo0KIYNGxa33nprqUdK3ujRo2PChAmlHiNJjz/+ePTv37/ZnzFjxpR6rCStWbMmrrjiith///3j4IMPjmuvvTZyuVypx0rKQw89tNnPc//+/ePzn/98qUdrVR1KPcC2asqUKfHiiy/GXXfdFW+//XaMHz8+dtpppzjqqKNKPVpympqaYuzYsTF//vxSj5KsXC4XY8aMiR49esT06dNjxYoVMXHixGjXrl2MHz++1OMlY/369TF69OgYOHBg/PKXv4w33ngjLrjggqiqqopjjz221OMl6Te/+U3MmjUrvv71r5d6lCS9+uqrcdhhh8WVV16Zv69z584lnChdV111VcyePTtuu+22WLlyZZx//vmx0047xciRI0s9WjKOPvroGDp0aP72unXr4hvf+EYMGzasdEO1AeV+C1atWhUPPPBA3HLLLbH33nvH3nvvHfPnz4/p06cr963s1VdfjbFjxzo60cZee+21mDNnTvzpT3+KHXbYISIixowZE5MnT1buW9GyZctiwIABcfnll0dlZWX069cvDjrooKitrVXu20BDQ0NMmTIlBg4cWOpRkrVgwYLYa6+9ok+fPqUeJWkNDQ3xi1/8Iu64447Yd999IyLirLPOiueff165b0VdunSJLl265G/ffPPNkcvlYty4cSWcqvU5LWcLXn755Vi3bl0MGjQof9/gwYPj+eefj/Xr15dwsvQ8++yzceCBB8b9999f6lGS1qdPn7j11lvzxX6jxsbGEk2Uph133DGuu+66qKysjFwuF7W1tfHcc8/FAQccUOrRkjR58uQ4/vjjY4899ij1KMlasGBB9OvXr9RjJK+2tjYqKyub/bdi9OjRcfXVV5dwqrQ1NDTELbfcEmPHjo1OnTqVepxWpdxvwdKlS2P77bdv9pe9ww47RFNTUzQ0NJRusASddtppMXHixOjatWupR0lajx49mv0qcv369XHPPffEF7/4xRJOlbbDDz88TjvttBg0aFCMGDGi1OMk589//nP85S9/ifPOO6/UoyQrl8vF66+/Hn/84x9jxIgRccQRR8Q111wTa9asKfVoyVm0aFFUV1fHww8/HEcddVQMHz48/u3f/s0BxTZ03333xY477pjkGRnK/RZ8+OGHm+3FbbztP2qkYOrUqfH3v/89zj///FKPkqyf/vSncdNNN8VLL73k6Fsra2pqissuuywuvfTSZr9ip3W9/fbb+f8fXnfddTF+/Pj49a9/HVOmTCn1aMlZtWpVvPHGGzFjxoy4+uqrY/z48XH33XfHnXfeWerRkpTL5eKBBx6IM844o9SjtAnn3G9B586dNyvxG2/7HwnlburUqXHXXXfFT37yk9hrr71KPU6yNp4H3tTUFOPGjYuLLroouV/9lsr1118f++yzT7PfRtH6qqurY/bs2dGzZ8+oqKiIAQMGxPr16+PCCy+Miy++ONq3b1/qEZPRoUOHaGxsjGnTpkV1dXVEbNi5uu++++Kss84q8XTpeeGFF6K+vj6++tWvlnqUNqHcb0FVVVW89957sW7duujQYUNES5cujS5dukSPHj1KPB203JVXXhn33XdfTJ061akibWDZsmUxZ86cOOKII/L37bHHHrF27dpobGyM3r17l3C6dPzmN7+JZcuW5a+L2njw5bHHHou//vWvpRwtOb169Wp2e/fdd4+mpqZYsWKFn+dW1KdPn+jcuXO+2EdE7LrrrvHOO++UcKp0Pf300zFkyJDo2bNnqUdpE07L2YIBAwZEhw4dYs6cOfn7amtrY+DAgdGuncgoT9dff33MmDEjrr322mSPVpTaW2+9Ff/6r/8a9fX1+ftefPHF6N27tyLUiu6+++749a9/HQ8//HA8/PDDcfjhh8fhhx8eDz/8cKlHS8rTTz8dBx54YHz44Yf5+1566aXo1auXn+dWtt9++0VTU1O8/vrr+ftee+21ZmWf1jN37tyoqakp9RhtRlPdgq5du8bXvva1uPzyy2Pu3LnxxBNPxO233x5nnnlmqUeDFlmwYEHccMMN8S//8i8xePDgWLp0af4PrWfgwIGx9957x8SJE+PVV1+NWbNmxdSpU+Pb3/52qUdLSnV1deyyyy75P926dYtu3brFLrvsUurRkjJo0KDo3LlzXHLJJfHaa6/FrFmzYsqUKXHOOeeUerTk7LbbbjFs2LC4+OKL4+WXX46nn346fvazn8Wpp55a6tGSNH/+/KRfZctpOR/j4osvjssvvzy+8Y1vRGVlZXz3u9+NI488stRjQYs8+eST8dFHH8WNN94YN954Y7OvvfLKKyWaKj3t27ePG264Ia688so45ZRTomvXrjFq1CgHBihLlZWVcdttt8WPf/zjOOGEE6Jbt24xcuRI5b6NXHPNNXHllVfGqaeeGl27do3TTz89Ro0aVeqxkrRs2bKkT7OuyHn3IAAASILTcgAAIBHKPQAAJEK5BwCARCj3AACQCOUeAAASodwDAEAilHsAAEiEcg8AAIlQ7gEAIBHKPQAAJEK5BwCARCj3AACQiP8Pq5wyFoxUaogAAAAASUVORK5CYII="/>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
<h3 id="Mathematical-Theory:-N-Queens-Problem">Mathematical Theory: N-Queens Problem<a class="anchor-link" href="#Mathematical-Theory:-N-Queens-Problem">¶</a></h3><p>The N-Queens problem is a classic constraint satisfaction problem where we need to place N queens on an N×N chessboard such that no two queens attack each other.</p>
<p><strong>Mathematical Formulation:</strong></p>
<p>For an N×N board, we define:</p>
<ul>
<li>Variables: $q_i \in \{0, 1, 2, ..., N-1\}$ for $i = 0, 1, ..., N-1$</li>
<li>$q_i$ represents the column position of the queen in row $i$</li>
</ul>
<p><strong>Constraints:</strong></p>
<ol>
<li><strong>Row constraint</strong>: Each queen is in a different row (implicit by variable definition)</li>
<li><strong>Column constraint</strong>: No two queens in the same column
$$\forall i, j: i \neq j \Rightarrow q_i \neq q_j$$</li>
<li><strong>Diagonal constraint</strong>: No two queens on the same diagonal
$$\forall i, j: i \neq j \Rightarrow |q_i - q_j| \neq |i - j|$$</li>
</ol>
<p><strong>Objective</strong>: Find a valid assignment that satisfies all constraints.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [34]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="cm-editor cm-s-jupyter">
<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># Performance analysis for different board sizes</span>
<span class="k">def</span><span class="w"> </span><span class="nf">analyze_n_queens_performance</span><span class="p">(</span><span class="n">max_n</span><span class="o">=</span><span class="mi">12</span><span class="p">):</span>
<span class="w"> </span><span class="sd">"""Analyze N-Queens performance for different board sizes"""</span>
<span class="n">sizes</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="n">max_n</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span>
<span class="n">solve_times</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">solutions_count</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">sizes</span><span class="p">:</span>
<span class="c1"># Simulate solve time (exponential growth)</span>
<span class="n">time_sim</span> <span class="o">=</span> <span class="mf">0.01</span> <span class="o">*</span> <span class="p">(</span><span class="mi">2</span> <span class="o">**</span> <span class="p">(</span><span class="n">n</span><span class="o">/</span><span class="mi">3</span><span class="p">))</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">normal</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.001</span><span class="p">)</span>
<span class="n">solve_times</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="mf">0.001</span><span class="p">,</span> <span class="n">time_sim</span><span class="p">))</span>
<span class="c1"># Simulate solution count (known values for small n)</span>
<span class="n">known_counts</span> <span class="o">=</span> <span class="p">{</span><span class="mi">4</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">6</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">7</span><span class="p">:</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">8</span><span class="p">:</span> <span class="mi">92</span><span class="p">,</span> <span class="mi">9</span><span class="p">:</span> <span class="mi">352</span><span class="p">,</span> <span class="mi">10</span><span class="p">:</span> <span class="mi">724</span><span class="p">,</span> <span class="mi">11</span><span class="p">:</span> <span class="mi">2680</span><span class="p">,</span> <span class="mi">12</span><span class="p">:</span> <span class="mi">14200</span><span class="p">}</span>
<span class="n">solutions_count</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">known_counts</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="mi">1000</span> <span class="o">*</span> <span class="p">(</span><span class="n">n</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)))</span>
<span class="k">return</span> <span class="n">sizes</span><span class="p">,</span> <span class="n">solve_times</span><span class="p">,</span> <span class="n">solutions_count</span>
<span class="c1"># Analyze performance</span>
<span class="n">sizes</span><span class="p">,</span> <span class="n">times</span><span class="p">,</span> <span class="n">counts</span> <span class="o">=</span> <span class="n">analyze_n_queens_performance</span><span class="p">(</span><span class="mi">12</span><span class="p">)</span>
<span class="c1"># Create performance visualization</span>
<span class="n">fig</span><span class="p">,</span> <span class="p">(</span><span class="n">ax1</span><span class="p">,</span> <span class="n">ax2</span><span class="p">)</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">15</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span>
<span class="c1"># Solve time vs board size</span>
<span class="n">ax1</span><span class="o">.</span><span class="n">semilogy</span><span class="p">(</span><span class="n">sizes</span><span class="p">,</span> <span class="n">times</span><span class="p">,</span> <span class="s1">'o-'</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">markersize</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">'#FF6B6B'</span><span class="p">)</span>
<span class="n">ax1</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s1">'Board Size (N)'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
<span class="n">ax1</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Solve Time (seconds)'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
<span class="n">ax1</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'N-Queens Solve Time Complexity'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span>
<span class="n">ax1</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.3</span><span class="p">)</span>
<span class="n">ax1</span><span class="o">.</span><span class="n">set_yscale</span><span class="p">(</span><span class="s1">'log'</span><span class="p">)</span>
<span class="c1"># Add complexity annotation</span>
<span class="n">ax1</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="s1">'Exponential Growth</span><span class="se">\n</span><span class="s1">O(2^N)'</span><span class="p">,</span> <span class="n">xy</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">),</span> <span class="n">xytext</span><span class="o">=</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">),</span>
<span class="n">arrowprops</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">arrowstyle</span><span class="o">=</span><span class="s1">'->'</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">'red'</span><span class="p">,</span> <span class="n">lw</span><span class="o">=</span><span class="mi">2</span><span class="p">),</span>
<span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">,</span> <span class="n">ha</span><span class="o">=</span><span class="s1">'center'</span><span class="p">)</span>
<span class="c1"># Solution count vs board size</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">semilogy</span><span class="p">(</span><span class="n">sizes</span><span class="p">,</span> <span class="n">counts</span><span class="p">,</span> <span class="s1">'s-'</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">markersize</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">'#4ECDC4'</span><span class="p">)</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s1">'Board Size (N)'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Number of Solutions'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'N-Queens Solution Count'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.3</span><span class="p">)</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">set_yscale</span><span class="p">(</span><span class="s1">'log'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="c1"># Create complexity analysis table</span>
<span class="n">complexity_data</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'N'</span><span class="p">:</span> <span class="n">sizes</span><span class="p">,</span>
<span class="s1">'Solve Time (s)'</span><span class="p">:</span> <span class="p">[</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">t</span><span class="si">:</span><span class="s2">.4f</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">times</span><span class="p">],</span>
<span class="s1">'Solutions'</span><span class="p">:</span> <span class="n">counts</span><span class="p">,</span>
<span class="s1">'Complexity'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'O(2^N)'</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">sizes</span><span class="p">]</span>
<span class="p">}</span>
<span class="n">df_complexity</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">complexity_data</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"📊 N-Queens Complexity Analysis:"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">df_complexity</span><span class="o">.</span><span class="n">to_string</span><span class="p">(</span><span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedImage jp-OutputArea-output" tabindex="0">
<img alt="No description has been provided for this image" class="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABdEAAAHmCAYAAACcZccMAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAA3JhJREFUeJzs3Xd8U2X7x/FvmiZNS1sotGyUIQJCoQypgMpwgRMQlJ8yHYgCKvIg4AIHCgouhqiIAxeiPE4EFQEXslcRkL1HGaU7aZPz+yNPQ0MLJNA2HZ/36+XLc859knPl6qneuXqf+zYZhmEIAAAAAAAAAADkERToAAAAAAAAAAAAKK4oogMAAAAAAAAAcAYU0QEAAAAAAAAAOAOK6AAAAAAAAAAAnAFFdAAAAAAAAAAAzoAiOgAAAAAAAAAAZ0ARHQAAAAAAAACAM6CIDgAAAAAAAADAGVBEBwAAJZphGIEOoVggDwAAAABQOCiiAwBQAo0aNUoNGjQ44z/t2rULdIhFYtq0aXrvvfc8+5MnT1aDBg38eo9Ro0apU6dOPp07f/58DRw4UFdddZWaNGmiK6+8Uo888ojWr1/v1zUL0qFDhzRw4EDt37/fc6xTp04aNWpUwGICAAAAgNIkONABAACA8xMTE6MpU6bk22axWIo4msB44403NGTIEM9+z549ddVVVxX4dbKzszV8+HD9/PPPuvXWW/X0008rKipKBw4c0BdffKFevXpp4sSJuvHGGwv82ufy119/acmSJUV+XQAAAAAoKyiiAwBQQlmtVsXFxQU6jGKlatWqqlq1aoG/7/Tp0zV//ny9+eabuuGGG7zabrnlFg0ePFjPPvusOnXqJJvNVuDXBwAAAAAEDtO5AABQiiUkJKhx48ZeU3scO3ZMbdq00YABA2QYhubOnasGDRpo3bp16tatm5o2bapbbrlF8+fP93qvlJQUvfTSS7r22msVGxurm2++WV9++aXXOZ06ddKbb76pCRMmqG3btmratKnuvfde7dq1y+u8lStXqnfv3mrWrJlat26tkSNH6vjx4572uXPn6rLLLtO6det05513KjY2Vh07dvSauiVn2pYpU6Z4tk+fzsXpdOqdd97RzTffrKZNmyouLk69evXS33//7XMOMzIy9N5776lz5855CuiSFBQUpEcffVTx8fE6duyYV/xz5sxRu3bt1Lp1a23btk2SNG/ePHXv3l3NmzdXu3bt9Mwzz+jkyZOSpI8++kgNGzbUiRMnPO8/depUNWjQQEuXLvUc++WXX9SwYUNNnz5do0ePliRdc801Xj/nrKwsvfzyy2rXrp3i4uJ0zz33aPfu3T5/bgAAAACAG0V0AABKsOzs7Hz/yVlkskmTJrr//vv13//+11OEfeaZZ+RyuTR+/HiZTCbPez3wwAO65pprNGXKFNWpU0ePPvqoZ5qQzMxM3XXXXfruu+903333adq0aWrZsqWefPJJTZ8+3Sumjz76SDt27NBLL72kF154QQkJCRo5cqSnfcWKFerfv79sNptef/11PfHEE1q+fLn69u2rzMxMz3kul0uPPvqobrzxRr3zzjtq0aKFXn75Zf3++++SpNmzZ0uSevTo4dk+3cSJEzVt2jTdeeedmjFjhp5//nklJSXpkUceUUZGhk85/uuvv5Senq6bb775jOc0aNBAb775pmrUqOE55nQ6NXPmTI0bN06jR49WvXr1NG3aND322GOKi4vTm2++qcGDB2vBggXq06ePMjMz1aFDBxmG4VXkz9lesWKF59hvv/2myy67THfccYcefPBBSe4/Jjz00EOec+bNm6etW7dq/PjxGjNmjBISEjRs2DCfPjMAAAAA4BSmcwEAoITav3+/GjdunG/b448/rnvvvVeSNHjwYP3666969tlnNXDgQP3yyy964403VKVKFa/X9OnTR4MHD5YkXXXVVerWrZumTp2q9u3ba+7cufr333/1+eefq3nz5p5zsrOzNW3aNPXq1UsVKlSQJEVGRmratGkym82SpD179mjy5Mk6ceKEoqKiNGnSJNWpU0dvv/2255xmzZrppptu0ldffaW7775bkmQYhh566CH17NlTktSyZUv9/PPPWrx4sa666irPVDZVq1Y947Q2R44c0bBhw9SnTx/PsZCQEA0dOlRbtmzxaTqcvXv3SpJq167tddzlcsnlcnkdCwoKUlDQqTEKgwYNUocOHSRJJ0+e1FtvvaU77rhDzzzzjOecSy+9VHfffbfns9epU0dLly5Vly5dlJGRoTVr1qhx48ZeRfTff/9d3bt3V8WKFXXRRRdJkho1aqSaNWt6zqlSpYqmTZvmmR9/9+7deuutt5Samqrw8PBzfm4AAAAAgBtFdAAASqiYmBi99dZb+bZVq1bNs22xWDRhwgT17NlTTz75pLp166bOnTvneU23bt082yaTSdddd50mT56szMxMLV++XDVq1PAU0HPceuut+vLLL7Vu3Tq1b99ekhQbG+spjkvyzFGekZEhm82mdevW6d5775VhGMrOzpYk1apVS/Xq1dOff/7pKaJL8rqe1WpVxYoVlZ6e7nOOJk2aJEk6fvy4duzYod27d2vRokWSJIfD4dN7nF4oz/HGG2/kGYU/ZMgQDR061LPfqFEjz/batWvlcDjyjGhv1aqVatSooeXLl+vuu+9Whw4d9Msvv0iSVq1aJYvFor59++qZZ56Rw+HQnj17dODAAU9x/kyaNm3qtcBsToE9OTmZIjoAAAAA+IEiOgAAJZTValVsbKxP5zZq1EgNGjRQQkKCOnbsmO85lStX9tqvVKmSDMNQcnKyTp48qZiYmDyviY6OluQuzOYIDQ31OidnZLbL5VJycrJcLpfeffddvfvuu3neLyQkxGv/9EU6g4KCPFPV+GLDhg169tlntWHDBoWGhuqSSy5R9erVJcnn98k5f//+/apfv77n+F133aVrr73Ws9+jR488rw0LC/Ns58x7npOz3KKjo5WSkiJJat++vd5//33t27dPS5cuVYsWLdSmTRvZ7XatW7dOCQkJiomJUZMmTc4ad+5rS94/BwAAAACA7yiiAwBQBsyePVsJCQlq2LChxo0bpzZt2igyMtLrnKSkJK8C79GjR2U2m1WhQgWVL18+30UpExMTJUlRUVE+xVGuXDmZTCb1799fN910U5720wvwFyI1NVX33XefGjRooB9++EF169ZVUFCQlixZogULFvj8Pu3atVNISIjmz5/vNfq7SpUqeabEOZvy5ctLcue1bt26Xm2JiYmqVauWJPfI9PDwcC1dulR///23brjhBlWpUkW1a9fWsmXLtGrVKnXo0MFrPnsAAAAAQOFhYVEAAEq5/fv3a8KECerRo4emT5+ulJQUjRs3Ls95OVOISO5R2j/99JNatmwpq9Wqyy+/XPv379eaNWu8XvPtt9/KYrGoadOmPsUSHh6uyy67TDt27FBsbKznn/r162vy5MlatmyZX58t9/zjp9uxY4eSkpLUt29fXXLJJZ5zf/vtN0m+j8iOiIjQgAED9PXXX+vnn3/O95x///33nO/TrFkzWa1Wff/9917HV65cqQMHDqhFixaS3NPvtGvXTgsXLtSmTZvUunVrSdIVV1yhxYsXa+XKlV5PE5wtBwAAAACAC8dIdAAASiiHw6G1a9eesb1Bgway2Wx68sknFRoaqscff1zly5fXo48+qhdffFE33HCDOnXq5Dn/5Zdflt1uV506dTRnzhxt375dH374oSSpe/fu+vTTTzV48GA9/PDDqlmzpn799Vd99dVXGjJkSJ5R7Wfz2GOPaeDAgRo+fLhuvfVWOZ1OzZw5U+vWrdNDDz3kVw4iIyO1evVqrVixQq1atfJqq1OnjsLDwzV9+nQFBwcrODhYCxYs0JdffinJPUe7rx5++GEdOnRIQ4cOVefOnXXdddepcuXKSkxM1KJFi/Tjjz+qSpUqatOmzRnfo0KFCho4cKCmTp0qi8Wijh07at++fXrjjTd0ySWXeM1J3759ez3xxBMKCwvzTNsSHx+vzz//XCEhIWrbtq1XDiTp559/1tVXX6169er5/LkAAAAAAOdGER0AgBIqMTFRd9555xnbv/76a61evVpLly7V66+/7plOpE+fPvruu+/0zDPPeEY/S9LYsWP19ttva+/evbrssss0c+ZMT2E6NDRUs2bN0qRJk/TGG28oNTVVdevW1bhx4/KdC/xsrrzySr333nuaMmWKHn74YVksFjVu3Fjvv/++4uLi/HqvQYMGadq0abr//vs1b948r7aIiAhNmzZNL7/8sh555BGVK1dOjRo10scff6z7779fK1eu9PojwtmYzWZNmDBBN998s+bMmaNXXnlFR48e9bznk08+qa5du55zOpqhQ4cqOjpaH3/8sWbPnq0KFSqoc+fOevTRR73mMG/fvr1MJpNatGih4GB3dy0+Pl4mk0nx8fFe14mPj1fbtm01adIkLV26VO+8846v6QMAAAAA+MBk+LM6FwAAKHXmzp2r0aNHa+HChapZs2agwwEAAAAAoFhhEk0AAAAAAAAAAM6AIjoAAAAAAAAAAGfAdC4AAAAAAAAAAJwBI9EBAAAAAAAAADgDiugAAKBUO3bsmCZPnqxDhw4FOhQAAAAAQAlEER0AAATEqlWrNHToULVr106xsbG65ppr9NRTT2n79u35nv/888/rtdde8+xv3LhR999/v6644grFx8frnnvu0caNG/O87pNPPtGUKVP04Ycfeh2fO3euGjRooBdeeCHf602ePFkNGjTw7H/55ZcaOHDg+XxUAAAAAEAJRhEdAAAUuXfeeUd33323MjIy9MQTT+i9997ToEGD9M8//6hbt2764YcfvM5funSpfv75Zw0aNEiStHv3bvXu3VuZmZkaN26cXnrpJTkcDt11113asWOH53V2u12fffaZ2rdvrzlz5ig1NTVPLJ988olWrlx5zphvv/12JSYm6ssvv7zATw8AAAAAKEkoogMAgCK1aNEiTZo0SUOGDNGMGTN00003qXXr1urZs6dmz56tDh06aNSoUdq6davnNS+99JL69++v0NBQSdKsWbMUGhqqt99+W9dcc406deqkd955R6Ghofr44489r/v222+VnZ2tSZMmKSQkRF999VWeeMLDw/XEE08oMzPzrHGbTCY98MADevXVV895LgAAAACg9KCIDgAAitSUKVNUt25dDR48OE+bxWLRc889J7PZrHfffVeStHjxYv3777+66aabPOfVrVtX99xzj8LCwjzHwsLCVLVqVe3Zs8dz7MMPP9Rtt92miIgI9ejRQ7NmzZLL5fK65siRI7Vnzx69+uqr54y9Y8eOstvt+RbjAQAAAAClE0V0AABQZI4fP66EhAR17NhRJpMp33MqVKigtm3bauHChZLco8nj4uJUpUoVzzl33XWX7rvvPq/X7d69W1u3blX9+vUlSX/88Ye2bt2qXr16SZLuvPNOHThwwPO+Oa644grdeeedmjVrllatWnXW+ENCQtSxY0d99913/n1wAAAAAECJRREdAAAUmf3790uSatSocdbzLr74YqWmpurkyZP6+++/FRsbe9bzMzMzNXLkSFmtVvXu3VuS9MEHH6hly5a65JJLJEnVq1dX+/bt9f777+d5/eOPP65q1ar5NK1LbGys1q9fn+/86gAAAACA0ociOgAAKDKGYUhyT9tyNmazWZK7OH7s2DHVrFnzjOempqbqgQce0IYNG/TKK694CvQzZszQp59+6nXuW2+9leeYJJUrV07jxo3Trl279Nprr501tho1asjpdOrQoUNnPQ8AAAAAUDpQRAcAAEUmp8CdMyL9TPbu3aty5cp59nPPfZ7bwYMHddddd2n16tV67bXXdO211553bG3atNGdd96pjz76SKtXrz7jeTmxpKSknPe1AAAAAAAlB0V0AABQZCpVqqS4uDgtWLAgzwKfOVJTU/Xnn3+qU6dOioqKkiQlJyfnOW/Lli3q2bOnDh48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pqKiotSsWTN169ZN11xzTcF8iFLi2LFjmjFjhn777TcdOHBAWVlZiomJUYsWLdSvXz81bdr0gt4/5+fYunVrzZo1qyBC9tncuXPzvbfykxNfp06dtH//ftWoUUO//vprIUd4fjIzM/XZZ59pwYIF2r59uzIyMhQdHa2WLVuqb9++ahYWJsXFSenp7hf88IN0440Bjflccv834aOPPlJ8fHyhXWvZsmXq+79R+UOGDNHQoUO92vfu3auoqCiFh4cXWgwAAJQ19P+Lj5LU/09NTdWJEydUq1atQnn/grJhwwbNmjVLK1as0NGjR2W1WlW3bl3dcMMNuuuuuxQWFhboEM/J4XBo7969qlevXqBDAcospnMBcFazZs3S5s2bC+S9Fi1apOuvv15vvfWWNm7cqJSUFGVlZenIkSP6+eef9dBDD2nQoEFKS0srkOuVdLt379Ytt9yimTNnatu2bUpPT1dWVpYOHDig77//Xnfeeae+//77QIeJXHbu3Klbb71V48eP15o1a5ScnKysrCwdPHhQ33//vXr16qX3evY8VUAfNKjYF9CLi6SkJL300kvq0qWLkpKSAh0OAAClFv3/wCkp/f/s7Gx98sknuu6667RixYpAh3NWb775pnr06KFvvvlGBw4ckMPhUGpqqtavX69XXnlF3bp105EjRwId5hkZhqHvv/9enTt31rx58wIdDlCmBQc6AADFm9Pp1JgxY/T555/LZDKd9/usX79eQ4cOVVZWloKDg9W/f3916dJFERER2rJli6ZNm6ZNmzZp0aJFGjlypGckTFk2fvx4HTt2TGazWY8++qjat2+v4OBgLV26VOPHj1dWVpbGjBmjTp06lYjRE6fr0qWL2rZt69lfs2aNHn30UUnuEVADBgzwtFmtVknS7Nmz5XQ6ZTabizRWXyQnJ+u+++7Tvn37FBQUpHvvvVc333yzgoKCtHjxYk2ZMkV2u12vpKerSWio4mvUkCZODHTYxU7z5s21ZMkSSfIabT5hwgTNnTs3UGEBAFBm0P8PnJLS///uu+/03HPP5duW04/L6b8H0kcffaSpU6dKkurXr69HH31U9evX1759+zR58mStWbNGu3bt0vDhw4vNqPnTrVixQsOHDw90GABEER2AD9auXavZs2erV69e5/0e48aNU1ZWliR35/CWW27xtF188cW66qqrdPfdd2vjxo36+eef9ccff+jKK6+84NhLsmXLlkmSLr30Ug0cONBzvF69etq+fbs+/fRTpaamasOGDYU6vUZhCQ0NVWhoqGe/YsWKnu3w8HBVrVo1z2tiYmKKJLbz8d5772nfvn2SpJEjR6p///6etksvvVRRJ0/qqRkzZJhMmluhguI//lgqVy5A0RZfVqs13589s88BAFB06P8HRknp/5+tX5ZfPy4QTp48qddee02SVL16dX366aeKjIyU5L7/WrRooa5du2rXrl1as2aNduzYobp16wYy5HzRBwaKD6ZzAXBWOaNPXn31VR0/fvy83mPHjh1au3atJKlZs2ZeHegcoaGhnlHIkvTf//7Xs92pUyc1aNBAnTp18nrN3Llz1aBBAzVo0CDPCNXffvtNffr0UfPmzdW8eXPdcccd+vbbb/ON79tvv1WPHj3UrFkzz7zVv/32m9c5+/bt81zr448/1pIlS3TnnXeqadOmatu2rcaOHavU1FSv16xZs0aDBg1SmzZtdNlll6lFixbq2bOnvvrqq3PmTDo1emPTpk2aNGmSDh486GkbNWqUli5dqqVLl6p58+Zerzty5IhefPFFXX/99YqNjVV8fLwGDRqk5cuXn/Oa48aN83zOVatWebVt2LDB0zYx1wjq7du369FHH9UVV1yh2NhYde7cWVOnTpXdbvfpc/ojv3th8uTJnriOHTumF154Qe3atVNcXJz69++v7du3KzU1Vc8//7yuuOIKNW/eXP369dOWLVvyvL8v98KZ5Nyz5cuX19133+3dmJ6u22bM0PhDh/Tzzp2acP/9Uq4vPqmpqXrjjTd00003qVmzZmrVqpX69eunn3/+Oc91cv8Mfv/9d91xxx1q2rSpOnTooLfffluGYej3339Xjx491LRpU3Xs2FFTp06Vy+XKN2cHDx705KxZs2a66667fLpXfM1ZZmambrzxRs/1cv8ejhgxwnP8rbfekuT+8phzbPLkyZLcP/fc/0245ppr1KlTJy1evNhz7qRJk7ziSk1NVWxsrBo0aKB7773X588DAEBZR//fraz0/yXvvmFOIT9HzvE+ffp44sg9Z/7o0aPVoEEDz2CS08/P4XK59MUXX6hXr15q1aqV4uLi1LVrV82cOVMOh8Pr3FGjRqlBgwaKj49XSkqKnn/+eV155ZWKjY1Vjx49fOqf//TTT0r/3xSKvXv39hTQc4SGhmrcuHH64IMPtHLlyjwF9KVLl2rQoEFq27atmjRpomuvvVYvvviijh496nXe2e7J/O7j3Odv3rxZH3zwgW644QY1adJE119/vd5//33PuZMnT/asFSRJU6ZMyfdnBKBoMBIdwFl1795dX331lU6ePKnx48fr5Zdf9vs9cjrQktSuXbsznnfFFVcoODhY2dnZXq/x16effqrnnnvO66/269at07p167Rt2zY99thjnuMTJ07Uu+++6/X6ZcuWafny5Ro7dmy+o2/mzZun1atXe97fbrfrs88+U3p6uic/69evV58+fTyjbyQpLS1N69ev1/r165WcnOw1XUl+br75Zs9jhe+8847eeecd1a9fX1dccYU6dOigNm3a5JnWZPPmzerfv79OnDjhOeZwOLRo0SItXrxYo0aN8hohfbpevXrpo48+kiR98803atmypact54uNyWTSHXfc4fmc/fv395rHcufOnXrzzTe1dOlSvf/++7JYLGf9nAWpf//++vfffz37S5cu1YABAxQdHa2NGzd6jv/999+69957tWDBApX732jw87kXchw8eFCHDx+WJDVp0iTvZx45UtZ//1U3SWrVSnrqKU/T4cOHddddd3m+eEjuwvPff/+tv//+W/369dMTTzyR55qLFy/WjBkzPPfhwYMH9eqrr2r16tX67bffPEXzAwcO6M0331RoaKjuueeePO/zwAMPeP1BYdWqVRowYICmTZum9u3bn/EzS77lzGaz6dVXX1XPnj3lcDg0btw4tWvXTqtWrfJ8sW3durUeeOCBs14rP1dddZUqV66sI0eO6Mcff/R61HXhwoWeL2Tdu3f3+70BACir6P+Xrf5/UXA6nRo0aFCe4vemTZu0adMm/fzzz3rvvffyTFGTlZWlPn36aNOmTZ5jGzZs0KBBg/TDDz+oTp06Z7zmmjVrPNun/9EhR6tWrfI9Pn36dM8o9hx79+7Vhx9+qHnz5unDDz8skAU+n3/+ea1cudKzv3v3bo0fP14RERHq0aPHBb8/gILFSHQAZ3X//fd7/ir/zTffnNdfvXP/tf5sj/dZrVZFRUVJcq9Kfz4OHz6sF198UYZhKDY2Vp9++ql++OEH9ezZU5K7M5pTTF2/fr2nA33VVVfpq6++0jfffKNOnTrJMAy9+OKL+S4ys2rVKvXp00fz5s3Ta6+9puBg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z0Ke9erV06ZNm5Samqr169d7jUbPPYVLTv88d+5yT0eTnp5eIINF/Mk1gMLFSHQAPuvevbtnrmt/jR492tMZHj16tCZNmiSbzabRo0fLZrNpzZo12r9/vyT3Ij/XXHON57W5O7dffvmlp7M1e/bsPNe5/vrrPaMVnnvuOf3999/avXu3Jk6cqDvuuEMtW7bURx99JEleHdiRI0dq7dq12r59u8aMGaPu3burefPmnhHD/nr22Wf14IMP6j//+Y8++OAD7dq1S0eOHNHhw4c955xtVEbLli1Vv359Se4i53/+8x+tWbNGu3fv1sKFCzV06FDPuTkLLrZp08bz6Ozs2bM1ffp0bdu2TYsXL9Zjjz0myd0J69279znjr1mzpq666ipJ0rp16yRJ7dq1U61atTznXHrppZ4O+cyZM/XDDz9oz549+uabb9SjRw9deeWVXnEWZwVxLwwaNMhzr06YNk2vBQfrX6tVm7t10yu7d3sWsbLZbBo4cKAk9/QzOSOllyxZopdeeklbtmzRsmXL9NBDD3lGr/jyMztfH3/8sT755BNt375dH330kWcql1q1ap21eO9vzl544QXt2bNHkvu/ATnTyPz000+aM2fOOePM/QVl/fr1XsX+sLAwdenSRZL09ddfy263y2QyUUQHAOAC0f/3XUnu/+den+bzzz9Xenq6EhMT9eKLL+Z7fu7R4Zs2bdKmTZuUnp5+xvfPKVAfO3ZMQ4cO1dq1a/XPP/94TUlz++2355kD/kJER0froYcekiTt379fd999txYvXqw9e/Zo4cKFGjBggKfI3aNHD8/CqDmxStJjjz2mRYsWafv27XrnnXf0+eefS3J/D4qPj5fknbu5c+cqKSlJycnJev755wtk8dHcud62bZu2bt161idkARQeRqID8JnJZNKzzz6r2267zTP3n6+aN2+u119/XY8//rjS0tL0zjvv6J133sn33JSUFG3cuFFNmjSR5B6VkjNC4cknn9RTTz0lwzAUFxentWvXer22SpUqGjJkiCZNmqRNmzapX79+Xu2NGzf2TP3QuHFj/d///Z8+++wzLV26NM/iMFdeeaVn/m9/jR49Wv369dOJEyf00ksv6aWXXvJqv+yyy7y+KJzOZDJp4sSJ6tevn5KSkvT99997LYSUo3v37p45pc1ms15//XXdd999OnnypF577TW99tpr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NX369Av6PIF4kCXnmjxEc27kynfkyj/ky3fkyj/ky3cXmivDMLQ+M0XzkxP1rz3Nqy3UFKQOEZV0TXi0ooItFxhp4HFf+ae458vvIvqAAQMkSVOnTpUkr4VFDcOQyWTSpk2bCig8AABQbLhcsuzYJtvalQrZ/I9MTqdXs2EOlr1RY2U2b6WsOnUlFvoBipWHHnpIvXv31po1a5ScnKzy5curWbNmKl++/Hm937Zt2zR8+HAZp03dlJ6erjlz5ujdd99V48aN1bhxY23dulWffPKJOnfufMGfw2oNzALEJpNkNptlMkmnfWSchlz5jlz5h3z5jlz5h3z57nxzlW249HfqCc1LOqJ9jkyvtgrmYN1QvrI6RkYrzByY/88XBu4r/xT3fPldRP/oo48KIw4AAFBMBR0/Ktva1bKtWy1z8sk87VnVayozrqXsTZrJyOcJNQDFR2RkpNq3b18g77V8+XLFx8dr2LBhiouL8xzfvHmzsrOz1bx5c8+xli1bavr06XK5XBc8B7rD4QzYSHTDkLKzncXyi11xQq58R678Q758R678Q75852+uMlxO/Z56XD+lHNUJZ5ZXW7XgEN0QGaMrylWQxRQkuaQsl/MM71TycF/5p7jny+8ieuvWrQsjDgAAUJw47Ar5J0G2tatk3b0zT7MrrJwym8YpM66VnFWqBiBAAOfSqFEjzZ49W02bNlXDhg29niA9nclk0j///OPX+9911135Hk9MTFRUVJSs1lNrIERHR8tutyspKUkVK174FE+B/GJlGMVzdFRxRK58R678Q758R678Q758d65cnXRm6dfUY1qUckzphndhvJ41TJ0jY9TMFqmg//VPSnPeua/8U1zz5XcRXZJ27typN998U8uXL1dycrKioqLUqlUrDR48WPXq1SvoGAEAQFEwDAXv3S3b2lUK2bheQQ6Hd7MpSI76DZQZ11KOSxtI5vPqRgAoIoMHD1aVKlU822crohekjIwMrwK6JM++47T/rgAAgOLrvr3r/Tp/Rq2mOpxl108pifoz7YSy5V0JbWaLUOfIyqofUq4gwwSKhN/ffrdt26ZevXrJbDarU6dOio6OVmJiohYtWqTFixdrzpw5FNIBAChBglKSFbJutWxrVyn42NE87dnRMe7pWpo2lysiMgARAjgfQ4YM8WwPHTr0rOceOnSowK4bEhKSp1ies2+z2QrsOgAAoHh56+hurc446VU6N8uk+LAK6hwZo+oW+gEoufwuok+cOFE1a9bUrFmzFBER4TmekpKifv366bXXXtOUKVMKNEgAAFDAnNmybtks29qVsm77V6bTnpdzWUNkb9JUmXEtlV3zouK7RDoAn+Se2uV0K1eu1P333681a9YUyLWqVKmiEydOKDs7W8HB7q8biYmJstlsiozkD3EAAJRWqzJOrZ8UYgpS+/CKujY8WhWDrWd5FVAy+F1EX7FihcaNG+dVQJekiIgIDRw4UGPGjCmw4AAAQMEyHz4o25qVsm1Yp6D0tDztjtp13aPOGzWRrHR2gZJs5syZSk9PlyQZhqE5c+bot99+y3PemjVr8ky/ciEaNWqk4OBgrV27Vq1atZIkrVq1SrGxsRe8qCgAACjeIoOCdW1EtDqEV1JYkDnQ4QAFxu8ienBwsEJCQvJts1qtzHMIAEAxY8pIV8iGdbKtXSnLwQN52p2R5ZUZ11KZzVrIVbFSACIEUBjsdrvnCVGTyaQ5c+bkOScoKEgRERF68MEHC+y6oaGh6tq1q8aOHasXX3xRR44c0cyZM/XSSy8V2DUAAEDx0zeqhtqUi5LFxB/NUfr4XUSPjY3Vp59+qg4dOngtTmQYhj755BM1adKkQAMEAADnweWSZec22dasUsjmf2RyZns1G+Zg2Rtdpsy4VsqqU09idChQ6jz44IOe4njDhg01e/ZsNWvWrEiuPXr0aI0dO1b9+vVTeHi4hg4dquuvv75Irg0AAC6ccdp0j764OpwBOSi9TIafvxUbNmzQ//3f/6lOnTrq3LmzYmJilJiYqPnz52vnzp16//33dfnllxdWvCVCYmJKkV/TZJIsFrOyspw6j//OlSnkyj/ky3fkyj/ky3cmk2QxnMoymc+Zq6Djx2Rbu0q2datlTj6Zpz2rWg1lNm8pe5M4GaGhhRRx4HBf+Yd8+S6QuYqJiTj3SWVIIPraEr8v/iBXviNX/iFfviNX/iFf7qL5kWyHNttTtcWeqi2ZaTrpyj73C3OZUSvv2itlGfeVf4p7f/u8RqLPmDFDkyZN0pQpU2QYhkwmk5o0aaJ33323zBfQAQAoKObDBxW67C/ZEtbLlOWQYbEqs0lTZcS3lbNKtVMnOhwK2ZQg25qVsu7emed9XKFhymzaXJnNW3q/DkCZkTOty9kMGTKkCCIBAADFxbFshzZluovmm+1pOuHMCnRIQLHl90j0HE6nUw6HQ8nJyYqMjFR2dnaexUbLKkaiF2/kyj/ky3fkyj/k6+xCEtYp4r9zZHI587QZQWaldO0hZ4Uo93QtG9cryGH3PsdkkuOSS5XZvJUclzaUzH7/3bxE4r7yD/nyXXEfGXMuDRs2PGNbeHi4KleurHnz5l3wdYoCI9GLP3LlO3LlH/LlO3Lln7KSrxPZWZ6R5psz03TUeeZ1DUNMQbIbLr/en5Ho3srKfVVQint/2+9v1FlZWXrhhReUkJCgr776SqGhofrrr780cOBA9enTRyNGjFAQ86oCAHDezIcPnrGALkkml1MRc2fLlE9bdqVoZca1kr1Zc7kiIgs3UAAlxubNm/McS09P18qVKzV27Fg9/fTTAYgKAAAUppPOLG2xp2lLZqo221N1OPvMRXOryaRLrOXU0BauBiHldLE1TIP2bSjCaIHize8i+uTJk/Xtt99q6NChnmOXXXaZ/vOf/2jy5MmKiorSwIEDCzRIAADKktBlf52xgJ4jdwHdZbXK3ripMpu3UnbNi9x/wgeAcwgLC9PVV1+twYMH6+WXX9Z///vfQIcEAAAuQKoz2100t6dqc2aqDmTbz3husEyqFxKmhiHhamALVx1rqCwmBsUCZ+J3Ef27777TyJEj1atXL8+xChUqqH///goODtZHH31EER0AgAtgS1jv03mGyaSUW2+X/bJYyWot5KgAlFbVq1fX9u3bAx0GAADwU7rLqX9zjTTfl5WpM82CYZZUxxr2v5Hm4apnDZOVmSQAn/ldRD9x4oRq1aqVb1vdunV16NChCw4KAIAyK8shU9aZH7PMzWQYsjduKlkshRwUgNLIMAwdOnRIM2bMUI0aNQIdDgAAOIdMl1Pb7OnabHcXzXc7Ms5YNDdJqm0NVYOQcDUMCdclIWGyBZn9ul5+c5wzzzfKKr+L6HXr1tWCBQvUrl27PG2//vqrLr744gIJDACAsiYo+aRCl/4uQ8p3vvPTGRYrBXQAPmnYsKFMZ5jqyTAMvfzyy0UcEQAAOBeHy6XtjjRttqdpc2aqdjnSdaZJH02Salls7qK5LVz1Q8opzM+iOYAz87uI3rdvX40aNUpJSUm69tprValSJR0/flyLFi3Sjz/+qJdeeqkw4gQAoNQKOn5UYX/+Jtva1eecCz23zCbNCjEqAKXJ4MGD8y2ih4eHq0OHDqpdu3bRBwUAALxkGS7ttKe7i+b2VO2wpyv7jGPNpRoWmxqElFPDkHBdGlJO4Wa/y3wAfOT3b1fXrl2VlpamadOm6aeffvIcj4qK0tNPP62uXbsWZHwAAJRa5sOHFPbnYoUkrJcp17OQhtksuVxex05nBJmVEd+2KMIEUAoMHTo00CEAAIDTZBuGdjvSPSPNtzvS5DjLd4CqwSHuovn/5jWPpGgOFJnz+m27++67ddddd2nnzp1KSkpSZGSk6tatqyAWJAAA4JyC9+9V2O+LFLJlk9dxlzVEmZdfofQr2sm6a4ci/jsn35HpRpBZKd16ylmlalGFDKAE+vrrr/06n8EwAAAULpdhaE9WhjZnpmqzPU1b7WmyG64znh9jtqqBzT3SvKEtXBXMTOUIBMp5/8kqOTlZO3fu1JEjR3TDDTdo165dqlOnzhnnWgQAoEwzDFl27VDY74tk3bndq8kVGqaMK65URusrZNhCJUn2Js2UHVNFocv+ki1hnUxZDhkWqzKbNFNGfFsK6ADOadSoUT6fazKZKKIDAFDAXIah/VmZ7oVAM1P1rz1NGWcpmlc0W/43p7m7cF4p2FqE0QI4m/Mqor/11lt6++23lZmZKZPJpKZNm+r111/XiRMnNHPmTEVGRhZ0nAAAlEyGIeu/mxX2xyJZ9u31anJGRCqj7VXKaNFasubtIDurVFXqrd2Vdlt3WeRSloJ0lqc7AcDLwoULAx0CAABlimEYOpht/99Ic3fRPPUsax6VDwpWA1u4Gv5vipYYs5XBqUAx5XcR/eOPP9bkyZP1wAMPqGPHjrrjjjskSb1799bjjz+uN954Q08//XSBBwoAQInicilk43qF/bFEwUcOeTU5oyoqvV17ZTZrIQX7+L9ii0XK8n3RUQCoUaNGvse3b9+ulJQURUVF6eKLLy7iqAAACKz79q736/wZtZqesc0wDB3JdnhGmm+xpynZlX3G88ODzO6R5v8rmlcNDqFoDpQQfhfRZ82apYEDB+qRRx6R03nqy3z79u316KOP6p133qGIDgAou7KzZVu/RqF/LlHw8WPeTZWrKP3KDrI3jpWCzAEKEEBZ9f3332vChAk6evSo51h0dLSGDx/OVC4AAPjoaLbDM9J8iz1NJ5xZZzw3zGTWpTlzmoeUU3WLTUEUzYESye8i+oEDB9S6det82+rWrevVKQcAoMxwOBS6eoVC//pN5pRkr6asGjWVflVHOS5tKJlYhBtA0fv11181YsQIXXHFFXrssccUHR2tI0eO6Ntvv9Xo0aNVoUIFdejQIdBhAgBQ7BzPdmiLPc1dNM9M1dGzFM1tpiDVD8lZCLScallCKZoDpYTfRfRq1appzZo1atu2bZ62hIQEVatWrUACAwCgJDBlZih0+d8KXfangtLTvNocdeop/coOyqpTT6LzDCCA3nrrLXXu3Fmvvfaa1/Hbb79dw4YN09tvv00RHQCAfDx+cPMZ26wmky6xuqdmaRgSroutoTLT7wdKJb+L6D169NDkyZNls9k8He309HQtWLBAb7/9tgYMGFDQMQIAUOyY0lIV9vefsq1YqiC73avN3qCR0q/soOyaFwUoOgDw9u+//2ro0KH5tnXr1k2PPPJIEUcEAEDJEyyT6oWE/W+kebjqWEMVzJOmQJngdxH9/vvv1759+zRx4kRNnDhRktS3b18ZhqFbb71VDzzwQIEHCQBAcRF0Mkmhf/2u0NUrZMo+9SinYTLJ3rip0q9sL2cVnsoCULxERUXp5MmT+bYlJSXJarUWcUQAAJQMl1jDPCPN64WEyULRHCiT/C6im0wmPffccxowYICWLVumpKQkRURE6PLLL9ell15aGDECABBw5mOJCv3jN9nWr5HJdWphbSPIrMy4Fkpvd7VcFaMDGCEAnFmbNm00ZcoUXX755apatarn+MGDBzV16lS1a9cugNEBAFB8japySaBDAFAM+F1Ez1GnTh3VqVNHkpSYmKgjR47I6XTKbDYXWHAAAASa+dBBhf2xWCH/bJDJMDzHjWCLMlq2Vkbbq+SKLB/ACAHg3B577DHdfvvtuv7669W8eXNFR0fr6NGjWrNmjcqXL6/hw4cHOkQAAArV8WyHfko5GugwAJRQfhfRU1NTNW7cODVp0kR33323fvzxR40YMUJOp1O1a9fWzJkzWVwUAFDiBe/drbDfFylk6xav464QmzJat1FGfFsZ5cIDFB0A+CcmJkb//e9/NXPmTK1YsUIJCQkqX768+vTpowEDBig6midpAACl06Esu+anHNHStCQ5ZZz7BQCQD7+L6JMmTdKCBQs8j3xOnDhRDRs21IMPPqjXX39dEydO1KRJkwo8UAAACp1hyLJjm8L+WCzrrh1eTa6wckpvc6UyW10hw2YLUIAAcP4qVaqkESNGBDoMAACKxB5HhuYlH9GqjJOUzgFcML+L6AsXLtSoUaN08803KyEhQfv379fjjz+ua665RtnZ2RozZkxhxAkAQOExXLJu2aSw3xfLcmCfV5MzsrzS216tzBatJAsL7wEoeRISEhQZGamLLrpIknTixAm9++672r59uxo0aKD+/furYsWKAY4SAICC8a89TfOSjyghM8XreKgpSJ0iovVD8pEARQagJPO7iJ6UlKS6detKkpYsWaLg4GDPqPTy5cvLbrcXbIQAABQWl1MhCesV9scSBSce9mrKrlhJ6Vd2kL1pnGQ+7yVEACBgsrKyNGzYMC1cuFDDhg3TwIEDZbfbdffdd2vnzp1q0KCBNmzYoB9++EFz5syhkA4AKLEMw9CGzBTNSz6ibY50r7aIoGBdHxGt9uGVFBZkpogO4Lz4XRWoUaOGtmzZolatWumXX35RXFycwsPdc8IuWbJENWvWLPAgAQAoUNlZsq1drbA/l8icdMK7qUo1pV/VQfZGTaSgoAAFCAAX7uOPP9bvv/+u0aNH6+abb5YkffLJJ9qxY4ceeeQRPfjgg0pLS9Ndd92l6dOn64knnghwxAAA+MdlGFqZcVI/Jh/R3qxMr7Zos0U3RMSoXbmKsubq18+o1TTP+5hMksViVlaWUwZzvwDIh99F9F69emn8+PGeDvirr74qSRoyZIgWLlyop556qsCDBACgQDjsCl21XKF//S5zqvfjnVk1L1L6VR3lqN/A3YsGgBLuu+++0z333KO+fft6jv34448KDQ3VPffcI0kqV66c+vTpQxEdAFCiZBkuLU07oR9TEpWY7fBqqx4coi6RlXV5WAUF068HUED8LqL369dPlSpV0ooVKzRkyBDdeOONkiSLxaKxY8fqzjvvLPAgAQC4EKaMDIUu/0uhy/5UUEaGV5ujXn2lX9lBWRfXoXgOoFTZtWuXhg8f7tlPTU3Vxo0bdcUVVygkJMRzvHbt2jp8+HB+bwEAQLGS6XJqSepx/ZyaqCRntldbHWuoboysrGa2SAXRrwdQwM5rktebb77Z80hojtdee61AAgIAoKCYUlMUtvQP2Vb+rSCH9wgVe8PGSr+yvbJr1ApQdABQuAzDUFCux9fXrFkjl8ul+Ph4r/NSUlIUGhpa1OEBAOCzVGe2FqYe1a+px5Tmcnq1NQoJ142RldUwpJxMFM8BFBKfiui9e/fWU089pYYNG/r8xhs2bNCLL76ozz777LyDAwDgfAQlnVDYn7/JtmalTLlGqBimINljmyq9XQc5K1cJYIQAUPjq1KmjhIQEtWnTRpK0aNEimUwmXXnllV7nLVmyRLVr1w5AhAAAnN2J7Cz9lJKo39KOy264vNqah0aqS0Rl1Q0JC1B0AMoSn4roffr00b333qumTZvqlltuUceOHfMdrZKamqrff/9ds2fP1qZNmzRmzJgCDxgAgDMxHz2isD+WKGTDWplcpzrZhtmszLhWSm93tVxRFQMYIQAUnVtvvVVTp05VVFSUXC6X5s6dq0aNGqlx48aec3788Ud99dVXGjZsWAAjBQDA2+EsuxakJOqvtBPK1qmVPoMkxYdFqUtkjKpbbIELEECZ41MR/YYbbtDll1+uadOm6cknn1R2drYuueQS1axZU6GhoUpOTtahQ4e0detWBQcHq2fPnpo4caKio6MLO34AABR8cL/C/lgs6z8bZcrVyTYsVmW0ildGmyvliogMYIQAUPT69OmjLVu26Omnn5ZhGKpWrZpefvllT3uXLl20a9cutWrVSn369AlgpAAAuO11ZOjHlCNakX4yV69esphMurJcRd0QEaPoYGvA4gNQdpkMwzDOfdopx48f108//aRly5Zp7969SklJUVRUlGrUqKF27dqpY8eOioqKKqx4S4TExJQiv6bJJFksZmVlOeXfT7TsIVf+IV++I1f+KYh8Be/ZpXK/L5J1279ex122UGXEt1VG6zYywsoVQLSBxb3lO3LlH/Llu0DmKiYm4oJef/DgQR09elQNGzaUxWLxHJ8wYYLq1q2rrl27eh0v7gLR15b4ffEHufIdufIP+fJdScvVVnuafkw+ovWZ3v+NDzUFqUN4JV0bEa3y5sL7f1VJy1cgkSvfkSv/FPf+tt9FdJwbRfTijVz5h3z5jlz557zzZRiybP9XYb8vlnXPLq8mV7lwpbe5Spmt4mWEhBRkuAHFveU7cuUf8uW74t6pL0soohd/5Mp35Mo/5Mt3JSFXhmFoY2aqfkg5oq32NK+2iCCzro2IUcfwSgoLMhd6LCUhX8UFufIdufJPce9v+zSdCwAAAWe4ZN30j8L+WCTLwQNeTc7yFZTerr0ym7eUgkvOaEoAAACgrHEZhlZlnNSPyUe0JyvTq62i2aLOETFqV66iQoKCAhQhAORFER0AULw5nQrZsFZhfy5R8NFEr6bs6BilX9lB9ibNJHPhj1ABAAAAcH6yDZeWpiVpfsoRHc52eLVVDQ5Rl8gYxYdVULCJ4jmA4ociuo/sdrsef/xxHTt2TA6HQ0888YTi4uICHRYAlGwOh2Q6Q/E7K0u2tSsV9udvMp9M8m6qVl3pV3aUo9FlEp1sAAAAoNiyu1z6Le2Yfko5qhPOLK+2iy2hujGyspqHRirIZApQhABwbhTRffTll1+qbt26euONN7Rjxw6NHj1as2fPDnRYAFDimA8fVOiyv2RLWC9TlkOGxarMJk2VEd9WzirVZLLbZVu5TGFLf1dQWqrXax0X1Vb6VR2VVa++e8I0AMAZLV++XLH/3959h0dV5f8Df9/pk0wqKZAQQlFaeoGsBVdYFrFSFhcBEX/I6hcFVsQF41pgEUIRFVAEEURZpIu7KiqydkFKQgKhGSA0EyC9Tp/7+yMwMk4CMyHJnUner+fheZxz7tz7meMk+cxnzj0nLg5arVbqUIiIqA2qsVnwdVUJ/lddjGqb1aGvp9oXd/uHobdaB4F5PRF5ARbRXTRkyBD7L3ar1QqlkmvuEhG5S52bA79tmyFclUQLZhO0B/ZDk5MFY/deUJ0+BZlB7/A8403dob/9Tpiju7R0yEREXuvJJ5/EihUrkJKSgkceeQQvv/wyunXrJnVYRETUypVbzfiqqhjfVpfAKNoc+hI1/rjbPxTd1L4SRUdE1DiNKqKbTCZs2bIFu3btQlFREebOnYu9e/ciJiYG8fHxTR1ji9q4cSPWrl3r0LZq1SqEh4cDAEpLSzF9+nRMnz5divCIiLyW/GKhUwH9aoLNBs2xw/bHIgSYeseg9vb+sHSIaKkwiYhaDZvNht27d6N9+/bYu3cvTp8+fc1Z6RER/F1LRESNV2Qx4ovKIvxUUwYLRHu7AKCvTyDu8QtDpEojXYBERDdAEEVRvP5hvyktLcW4ceNw6tQpdO3aFSdOnMCWLVuwZMkS/Pzzz1izZg2SkpKaK15J5efnY8qUKZg6dSoGDBjQ4HFFRVUtGFUdQQCUSjnMZivc+z/a9nCs3MPxch3H6tp0/90K7YH91z1OBGBMTEHtbXfAGhLW/IF5Ab63XMexcg/Hy3VSjlVoqF+jnvfcc8/h448/dvk2+aNHjzbqOi1Nilwb4M+LOzhWruNYuYfj5bqWHKvzJj0+ryrC3tpyXH0pBQTc5huEwf6hCFWomzeIG8T3lus4Vq7jWLnH0/Ntt2eiL1iwADU1Ndi+fTsiIyMRGxsLAFiyZAkee+wxLFmyBO+995770Xq4wsJCTJw4EQsWLPD62fZERFLQ5B507UClElVDRjRvMEREbcCcOXMwePBglJWVIT09HRMnTkSnTp2kDouIiFqJk8YabK+8hByD45ebakGGO3Xt8Ge/EATKuRQuEbUObhfRv/nmGzz//POIjo6G1frbLflqtRrjx4/Hc88953YQJpMJGRkZ+PTTT6FUKjFixAhMnTq1STaXMJlMGD58OF588UWkpaUBAIxGI2bNmoUdO3ZAo9Fg/PjxGD9+/DXPs2zZMtTW1mLhwoUAgKCgICxZsuSG4yMiavUsZqiOHoFgNrl0uGA2A2YzwL0niIhuiFwux5133gmgbpPR4cOHIyoqStqgiIjIq4miiCPGamyvvITjxhqHPp1Mjj/pQjDArx18ZdyCj4haF7d/qxmNRgQGBtbbJ5fLYTab3Q7ilVdewZ49e7Bq1SrU1NRg6tSpiIiIwEMPPeT2uX4f67Rp05CXl+fQvmDBAuTm5uL9999HQUEBZsyYgYiICAwePLjBc82ePfuGYiEialNsVijzT0GTmwPV0cOQGQ0uP1VUqlhAJyJqYhkZGQCA77//Hnv37kVlZSWCgoKQmpqKfv36SRwdERF5Opso4oC+EtsrL+GMWe/QFyRX4i6/UPTzDYZaJpMoQiKi5uV2ET0uLg4ffvgh/vjHPzr1ffLJJ/blXVxVXl6OrVu34r333rMvkzJ+/Hjk5OQ4FdGPHz+O4OBghIaGAgCqqqqQn59f7/IqJ06cwLRp0/D7Jd9ra2uxefNmrFy5EjExMYiJiUFeXh7WrVt3zSI6ERFdhyhCcf4sNIdyoD5yCLKa6kadxhCb0MSBERGRyWTCk08+iR9//BFyuRxBQUEoKyvDO++8gz/84Q9YsWIFVCqV1GESEZGHsYgi9tSW4fPKIlywGB36whUq3O0Xhj/4BkIhsHhORK2b20X0v//973j00UcxZMgQ/PGPf4QgCPj000+xdOlS/Pjjj3j33XfdOl9mZiZ0Oh369u1rb3v88cfrPXb58uU4efIk1q1bB5VKhYkTJ0KhUGDNmjVOx+7duxdpaWmYOnUqEhMT7e3Hjh2DxWJx2Pw0JSUFy5cvh81mg4zfmhIRuU4UIb94AZrcHKhzcyCvKHc6xKZSw9SrN0yRUfD74jMINqvzea6cTiaHPu3WZgyYiKhtWrp0KTIzM7FgwQLce++9kMvlsFgs+PTTTzFr1iy8/fbb+Pvf/94isRiNRkyfPh0lJSUwmUx4/vnnHfJ1IiKSntFmw481pfiyqgilVscVB6KUGtzrH4ZkbQBkTbAMLxGRN3C7iJ6amor33nsPixYtwrvvvgtRFLFmzRr07t0bK1aswB/+8Ae3znfu3DlERkbi448/xvLly2E2mzF8+HBMnDjRqaA9e/ZsjB07Fk888QT8/f1RVFSE9evX13ve0aNH19teVFSEoKAgh5k2ISEhMBqNKC8vR3BwsFvxExG1RbLS4roZ57kHoSi+5NQvyhUwde8JQ2wCTDf3+G15Fq0P/LZtrreQLsrkqBr2IKzh7Zs7fCKiNufTTz/FpEmT8MADD9jbFAoFhg4dipKSEqxfv77FiuhbtmxB165dsXjxYpw6dQrp6enYuHFji1ybiIiurdZmxdfVxfhfVTGqfpezd1f74h6/MMRodE2yhx0RkTdp1E4Pffr0wYYNG2AwGFBRUQGdTgdfX99GBVBbW4szZ85gw4YNyMjIQFFREV566SVotVqnzT51Oh1WrlyJQYMGwWg0Yvv27W4XvfV6vdOtqlcem0yubXpHRNQWyaoqoc49CHVuNpQFvzr1i4IM5m431RXOe/aGqNY4HWOMTYAlNBzaPbugyc2BYDZBVKpgiE2APu1WFtCJiJpJaWkpevfuXW9f7969cfHixRaLZciQIfbii9VqhZL7YBARSa7CasZXVcX4troEBtHm0Bev8cPd/mG4Wd24ug8RUWvQ6O2Sq6urUVlZCQCoqKhARUWFvS8iIsL1ABQKVFdXY9GiRYiMjAQAFBQUYP369U5FdABYtWoVFAoFdDodli5dioULF7r1DaharXYqll95rNE4F3yIiNoyobYG6qOHoc7NgfJ0PgSITseYO3WGITYext5xEH111z2nNbw9qh8Yjpohw6GEDWbIIDqfloiImlCnTp2QmZmJW265xalv37596NChQ4vFotPV/a0oLS3F9OnTMX369Ba7NhEROSq2mPBlVRF+qC6F5apcXwDQxycAd/uFIUqllS5AIiIP4XYR/dixY/jHP/6BEydONHjM0aNHXT5faGgo1Gq1vYAOAF26dEFhYaHTsStXrsSGDRuwevVq+Pn5YcyYMZgzZw5eeOEFl68XHh6OsrIyWCwWKBR1L7+oqAgajQb+/v4un4eIqNUyGaE+dgTq3ByoTuZBsNmcDjG3j4AxNgHG2HjYAgIbfy2lEjA3vEY6ERE1jYceegjz5s2DRqPBvffei5CQEBQXF+PTTz/FypUrMWnSpBaNJz8/H1OmTMHUqVPrLewTEZHrJpw76Nbx70bFo8BswOeVl7CnthxXZ/sKCLjVNwh3+YUiXKlu2kCJiLyY20X0l156CWVlZZg+fToCAwNvOICEhAQYjUbk5+ejS5cuAIBTp045FNWv0Gg0WLJkiX1T0BUrVmD37t1uXa9Xr15QKBTIzs5GamoqgLrNTePi4ripKBG1XRYLVCeOQ52bA/XxYxAsZudD2oVcLpwnwBoSKkGQRETUWKNGjcKRI0fw6quvYtGiRfZ2URQxbNgwPP744y0WS2FhISZOnIgFCxYgPj6+xa5LRER13io+jQP6Soc2tSDDHb7BGOQXiiAFl9kiIvo9t4vov/zyC15//XX079+/SQLo2rUr7rzzTqSnp2PmzJkoKirCO++8g4kTJzodO3bsWIfHiYmJSExMdOt6Wq0WQ4cOxcyZMzF37lxcunQJq1evRkZGxo28DCIi72OzQXn6FNSHcqA+mguZ0eB0iNU/AMaYeBjjEmBpHwFwAyEiIq8kk8kwZ84cjB8/Hnv37kVFRQUCAgLQt29fdOvW7YbObTKZMHz4cLz44otIS0sDABiNRsyaNQs7duyARqPB+PHj7Us1Llu2DLW1tVi4cCEAICgoCEuWLLmxF0hERC67uoDuI5NjoC4EA3TtoJM3esVfIqJWz+3fkFFRUdDr9U0axKuvvorZs2dj1KhR0Gq1GDNmjFPBvCldKdiPGzcOOp0OkydPxqBBg5rtekREHkMUoTh/FurcHGgOH4KsptrpEJvWB8becTDGJcDcKRoQeJcOEVFr0a1btxsuml/NaDRi2rRpyMvLc2hfsGABcnNz8f7776OgoAAzZsxAREQEBg8ejNmzZ9/wdaX4TvfKNfl98vVxrFzHsXIPx6vpBMoVGOQXij/qgqGRyaUOR3J8b7mOY+U6jpV7PH283C6iP/PMM5g3bx5CQkIQHx/fJJtx+vn5YcGCBTd8noYcP37c4bFWq8X8+fMxf/78ZrsmEZHHEEXIL12A5lAO1IcPQl5e5nSITaWCqWcMjLEJMHW9CZAzkSYioms7ceIEpk2bBvF3u0PX1tZi8+bNWLlyJWJiYhATE4O8vDysW7cOgwcPvuHrqlTS/I0SBEAul0MQwA2xr4Nj5TqOlXs4Xk3j/4VG4Xa/YCg5WcaO7y3Xcaxcx7Fyj6ePl9tF9C5dukAURYwbN67efkEQcOTIkRsOjIiIboystASa3Byoc3OgKLrk1C/KFTB17wFDbAJMN/es2+STiIjIRXv37kVaWhqmTp3qsMTisWPHYLFY7PsYAUBKSgqWL18Om812w/sQmUxWyWaiiyJgsVg98oOdJ+FYuY5j5R6OV9O4XRsEWESYYZU6FI/B95brOFau41i5x9PHy+0ienp6OsrLyzFy5EiEhIQ0R0xERNRIsqpKqA8fhPpQDpQF5536RUEGc9dudYXznjEQm+BuIiIiaptGjx5db3tRURGCgoKgUqnsbSEhITAajSgvL0dwcPANX1vKD1ai6JmzozwRx8p1HCv3cLyAWpsVhw1VOKivcvu5bX3sroXvLddxrFzHsXKPp46X20X0I0eOICMjA/fcc09zxENERG4S9LVQH8mFOjcHytP5EOD818YcFQ1DbAKMMXEQfXUSRElERFLatm0bbr31VoSHhzf7tfR6vUMBHYD9sclkavbrExG1RqIootBixCF9FQ4aKpFnrIFN6qCIiNoQt4voYWFh0Gq1zRELERG5ymSE+vhRqHNzoDqRB8HmfCumuX0HGGMTYIyJhy0wSIIgiYjIU/zrX//CggUL8Oc//7nZr6VWq52K5VceN8V+SkREbYVZtOG4oQYHDZU4pK9CkZVfRBIRScXtIvrf/vY3vPHGG+jSpQs6d+7cDCEREVG9LBaoTvwCdW4O1L8chWA2Ox8S3K6ucB6bAGtomARBEhGRJ2rfvj2qq6tb5Frh4eEoKyuDxWKBQlH3caOoqAgajQb+/v4tEgMRkbcqt5pxUF+Jg4YqHDVUwyjWP988VKFCvMYP8Vp/vF6U38JREhG1PW4X0Xfs2IHz58/j7rvvhr+/P3Q6x2UBBEHAzp07myxAIqI2zWaD8vSpusL50VzIDAanQ6x+/jDGxMMYlwhLhwhIstsaERF5tJEjR2LOnDk4cOAAevToAV9fX6djhg4d2iTX6tWrFxQKBbKzs5GamgoAyMzMRFxc3A1vKkpE1NrYRBGnTXocNFTioL4SZ83O+T4AyAHcrPZFnMYfCVo/hCvUEJj3ExG1GLeL6KGhoRg0aFBzxEJERAAgilD8eg7qQzlQHzkEebXzZkE2rQ+MvWNhjE2AObozILAoQUREDZs3bx4AYNOmTfX2C4LQZEV0rVaLoUOHYubMmZg7dy4uXbqE1atXIyMjo0nOT0Tk7WptVhy5vCnoIUMlqupZmhEA/GRyxGn8Ea/1Q2+NH3xk8haOlIiIrnC7iM7kl4ioecgvXoAmNwfq3BzIy8uc+m0qFUw9e8MYmwBT15sBOZNoIiJyzf/+978WvV56ejpmzpyJcePGQafTYfLkyZyIQ0RtliiKuGgxIudy0TzPWIP6y+ZAJ6UG8Vp/xGv80VmlhcyF2ebvRsU7tQkCoFTKYTZbIYo3+AKIiAiCKF7/12lBQQFCQ0OhVCpRUFBw3ZNGREQ0SXDeqqjIedZoc+MfSNdxrNzD8XJdY8ZKVlYKzaG6wrmi6KJTvyiXw3RzTxhiE2Dq3gNQqpo4aunwveU6jpXrOFbu4Xi5TsqxCg31a/JzGo1GqFQqr1wKQIpcG+DPizs4Vq7jWLnHm8bLLNrwi7HGvr55kaX+TUHVggy9NDr7+uaBcmWTXN+bxsoTcLxcx7FyHcfKPZ6eb7s0E33AgAHYtGkT4uPjMWDAgOsm20ePHnUtQiKi1sZkAoRrzxCXVVVCffgQ1Lk5UP56zqlfFASYu3SrK5z3ioGo0TZXtERE1IacOnUKS5Yswa5du1BdXY3Nmzdjy5Yt6Nq1K8aOHSt1eEREXq/casYhfRUOGipx5FqbgspViNP6IUHrj+5qXyi5NCMRkcdzqYiekZGBqKgoAMDcuXO9csYKEVFzkV8shHbPLmhyD0IwmyAqVTDExkOfdius4R0AAIJeD/XR3LrC+elTEOr5WtUcFQ1DbDyMveMg6pp+1iEREbVdR48exZgxY9CuXTvcf//9+PDDDwEAcrkcc+fOhU6nw7BhwySOkojIu1zZFPSQoRIH9VU4Y9bXe5wcwE1qX8RfXt+8PTcFJSLyOi4V0bdt24b4+HgEBQVh+PDhzR0TEZHXUOfmwG/bZghXbQYkmE3QHtgPTc4B6FP6Ql5RDtWJXxyOucIS3gGG2AQYY+NhCwxqydCJiKgNmT9/PmJjY7F69WoAwLp16wAAL7zwAoxGIz744AMW0YmIXKC3WXH48qaguYYqVNos9R6nu2pT0BhuCkpE5PVcKqLv3bsXNTU1zR0LEZFXkV8sdCqgX02wWeGzb7dTuyW4HYyXC+fW0PDmDpOIiAjZ2dl47bXXoFAoYLU6/t2655578Omnn0oUGRGR57tgNuLg5dnmdZuC1r9Yb5RSgwStP+I0fuii8nFpU1AiIvIOLhXRiYjImXbPrgYL6L9n9fOHMSYOxtgEWCI61u2YQURE1ELUajUMBkO9feXl5VCpWs/G1UREN8pi3xS0bn3zSw1sCqoSBPRW+yFe64c4jT+CFE2zKSgREXkeFtGJiBpJk5vj0nGiQoHSp2cAMm4YRERE0rjtttuwZMkSJCcnIzQ0FAAgCAJqamqwevVq3HrrrRJHSEQkrYqrNgU9fI1NQUPkKsRr/RCv8UcPDTcFJSJqK1wuoj/11FMuzVARBAE7d+68oaCIiDyW1QLVL8ehydoLwWx26SmCxQJYrSyiExGRZP7xj39g5MiRGDx4MHr27AlBEDBv3jzk5+dDFEW89tprUodIRNSibKKIs2Y9cvSVOKSvwukGNgWV4cqmoH6I1/qjAzcFJSJqk1wuovfu3RvBwcHNGQsRkceSX7wATfZ+aA5mQ1br3h4RolIFKHlrJxERSadDhw74z3/+gzVr1uDnn39Gp06dUFtbi/vuuw//7//9P4SFhUkdIhFRszPYrDhsqMZBQ13h/NqbgvohTuuPGI0OvjLexE9E1Na5NRM9Pj6+OWMhIvIogl4PdW42NAcyoSz81anfplRC5sJsdENsQnOER0RE5JagoCBMnTpV6jCIiFwy4dxBt45/N6r+esXFqzYF/eU6m4LGa/0Rz01BiYioHvw6lYjoajYblPknoMnOhProEQhWx9kpolwBY8/eMCSmwOarQ9C7y665uagok0OfxnVmiYhIehcuXMAHH3yA/fv3o6KiAu3atcMf/vAHjB07FkFBQVKHR0TUJCyiDXlXbQp68RqbgvZS6xCv9Uecxg/BCm6wTEREDWMRnYgIgKy0BJrsTGhysiCvrHDqN3eIhCExBca4BIhaH3t71bAH4bdtc72FdFEmR9WwB2ENb9+ssRMREV3P0aNH8cgjj8BsNiMxMRFRUVEoKirCypUrsXXrVvz73/9GVFSU1GESETXaj9WlOGSowmFDFQwNbgqqRNzl2eY91DqouGcRERG5yKUi+rBhwzg7hYhaH5MJ6iOHoMnOhOpMvlO3zccXhrhEGJJSYA3vUO8pjLEJsISGQ7tnFzS5ORDMJohKFQyxCdCn3coCOhEReYT58+ejY8eOWLlyJUJCQuzthYWFmDBhAjIyMrBs2TIJIyQiujFrys47tV3ZFDTu8qagEdwUlIiIGsmlInpGRkZzx0FE1DJEEYpzZ+qWazl8EDKT4+2doiDAdHMPGBJTYOreE5Bf/9ekNbw9qh8Yjpohw6GEDWbIINa/1CIREZEkDhw4gNdee82hgA7UbTg6ZcoUPPfccxJFRkTUtHwvbwoaz01BiYioCfGvCRG1CbKqSqhzsqDJzoSipNip3xISWrdcS3wSbH7+jb+QUgmYG14jnYiISArBwcGoqampt08ul8PX17eFIyIialr3+IUhXuuHrtwUlIiImgGL6ETUelksUP1ytG65lhO/QPjd9HCbSg1jbDwMiSmwdOwEMNkmIqJWauLEiVi0aBG6deuGmJgYe/u5c+ewePFiPP744xJGR0R044YHchlFIiJqPiyiE1GrI79QCM2B/dAcyoZMX+vUb+rctW7Wea9YQKWSIEIiIqLmN2DAAIe1f4uLizFixAhERUUhJCQEFRUVyM/Ph0qlwpdffolHHnlEwmiJiIiIiDwXi+hE1CoI+lqoD2VDcyATygsFTv3WgEAYEpJhSEyBLShYggiJiIhaVt++fa+7gV58fHwLRUNE5DqRGwwREZGHaVQRvbS0FKtWrcKuXbtQVFSEd999Fzt37kTPnj0xcODApo6RiKh+NhuUp/KgOZAJ9fEjEKyOa5GLcgWMvWJgSEqFuUtXQJBJFCgREVHLmzdvntQhEBG5zWSz4f2y81KHQURE5MDtIvq5c+cwatQoGI1GpKSk4NixY7BarcjPz8eyZcuwbNky3Hnnnc0QKhFRHXlJMdTZmdDkZEFeVenUb47oWLdcS2wCRK1WggiJiIg8U3V1NSornf92AkBEREQLR0NE5KjUYsJbxWdwxqyXOhQiIiIHbhfR58+fj3bt2mHt2rXw8fFBbGwsAGDRokUwGo1Yvnw5i+hE1PRMRqgPH6rbJPTsaadum48vDPFJMCSlwBrGTYWIiIiuduzYMfzjH//AiRMnGjzm6NGjLRgREZGjPGMN3i4+g0qbRepQiIiInLhdRN+9ezfmzp0Lf39/WH+3dMLIkSPx9NNPN1VsRNTWiSKUZ0/XzTo/fAiC2eTYLchg6t4DhsQUmG7uCcjlEgVKRETk2V566SWUlZVh+vTpCAwMlDocIiIH31eXYF1ZAayoWws9RK7CpJBodFQ53lUqCIBSKYfZbAWXTSciopbUqDXRFYr6n2Yyma67eRER0fXIKiugycmCOjsTitISp35LaBgMiSkwxCdB1PlJECEREZF3+eWXX/D666+jf//+UodCRGRnEUVsKi/A19W/5fw91Tr8X7tO0MkbVa4gIiJqFm7/VUpNTcWKFStwyy23QK1WAwAEQYDNZsP69euRnJzc5EESURtgsUB9/Ag02ZlQnsyD8LupJTa1GsbYBBgSU2CJjKqbhkJEREQuiYqKgl7PNYaJyHNUWS1YXnIGx4019rY/6drhwcAIKJjrExGRh3G7iD5t2jSMGjUKgwYNQlpaGgRBwKpVq3Dy5EmcOXMGH374YXPESUStlKKwAJoD+6HOzYasng/3pi7d6jYJ7RUDKFUSREhEROT9nnnmGcybNw8hISGIj4+HRqOROiQiasPOmfR4q/g0iq1mAIAcAsYGReJ2XbDEkREREdXP7SJ69+7dsWXLFrz55pvYs2cP5HI5du3ahT59+mD+/Pno0aNHc8RJRK2IUFsDzcFsaLIzobhY6NRvDQisW64lMQW2wCAJIiQiImpdunTpAlEUMW7cuHr7BUHAkSNHWjgqImqLMmsrsKr0LEyX7zz1lynwZEg0blL7ShwZERFRw9wuolutVnTp0gWLFi1qjng8ltFoxPTp01FSUgKTyYTnn38eiYmJUodF5D1sVqhO5EGTnQnV8aMQbI4bE4sKBYy9Y2FITIW5cxdAkEkUKBERUeuTnp6O8vJyjBw5EiEhIVKHQ0RtkE0U8d/Ki/i08pK9rbNSiydDohGs4B2nRETk2dwuot9+++249957MWTIEMTFxTVHTB5py5Yt6Nq1KxYvXoxTp04hPT0dGzdulDosIo8nLy6CJjsT6pwsyKurnPrNkVEwJKXCGBMPkbeWExERNYsjR44gIyMD99xzj9ShEFEbZLBZ8W7pOWTrK+1tf/AJxCNBHaGScfIMERF5PreL6Pfddx+++OILrFu3DtHR0Rg6dCjuv/9+REZGNkd8HmPIkCEQLm9uYrVaoVQqJY6IyHMJRiPUhw/WbRJ67oxTv81XB0NCMgyJybCGhksQIRERUdsSFhYGrVYrdRhE1AZdshjxZtFpFFiMAAABwIiADhjkF2L/jE1EROTpBFG8vBCZG0RRxM8//4zPPvsMX331FaqqqpCcnIwhQ4Zg8ODB8PPza45YW8TGjRuxdu1ah7ZVq1YhPLyu0FdaWorHHnsM06dPxy233FLvOYqKnGfbNjdBAJRKOcxmK9z/P9q2cKzcIwiAUrTCLMivPV6iCOWZfGiy90N9JBeC2ezYLZPB1L0nDImpMN3UHZDLmzdwCfC95R6Ol+s4Vq7jWLmH4+U6KccqNPTGc+tNmzZh3bp1WLx4MTp37nzjQUlIilwb4M+LOzhWrmvtY3XEUIXlJWdRe3kpR60gwxPtohGrbdzvtdY+Xk2JY+UejpfrOFau41i5x9Pz7UYV0a9mNpvx008/4bPPPsPnn38OhUKB7OzsGzmlx8rPz8eUKVMwdepUDBgwoMHjWET3bBwr18gvFkK7Zxc0uQchmE0QlSoYYuOhT7sV1vAO9uNkFeXQ5GRBk50JeVmp03ksYeF1m4TGJ0H01bXkS2hxfG+5h+PlOo6V6zhW7uF4uc7Tk/rrmTBhAg4cOIDa2lr4+/tDp3P8mywIAnbu3HnD12kJLKJ7Po6V61rrWImiiJ3VxdhUXogrL6u9Qo1JIZ3RXqlu9Hlb63g1B46VezheruNYuY5j5R5Pz7fdXs7lahaLBT/++CM+//xzfP/99wDQ4Oxsb1dYWIiJEydiwYIFiI+Plzocomalzs2B37bNDpt/CmYTtAf2Q5NzAFUPDAfk8rrlWk6egADH3242jQbG2AQYklJh6RBZ95uQiIiIJBMaGopBgwZJHQYRtQFm0Ya1pb9iV22ZvS1e44e/tesEraz13Y1KRERtg9tF9N8v5VJRUYH4+HhMmTIF99xzD4KCgm4ooMcffxzBwcGYN2/eDZ3nCpPJhOHDh+PFF19EWloaAMBoNGLWrFnYsWMHNBoNxo8fj/Hjx1/zPMuWLUNtbS0WLlwIAAgKCsKSJUuaJEYiTyK/WOhUQL+aYLPC7+PN+H1ZXIQAc9duMCSmwNgzBuC+AURERB4jIyND6hCIqA0ot5qxrPgMTplq7W33+IVhaEA4ZJxYQ0REXsztInq/fv1QUlKCiIgIjB49GkOGDGmydRU/++wzfPfddxg2bFiTnM9oNGLatGnIy8tzaF+wYAFyc3Px/vvvo6CgADNmzEBERAQGDx7c4Llmz57dJDEReTrtnl0NFtCvuDr9tQYFX94kNAW2gMBmjY2IiIiIiDzTKWMt3io+jQqbBQCgEgQ8GhyFvj6B0gZGRETUBNwuog8YMAAPPPAAUlNTmzSQ8vJyLFiwAHFxcQ0ec/z4cQQHByM0NBQAUFVVhfz8/HqXVzlx4gSmTZuG3y/5Xltbi82bN2PlypWIiYlBTEwM8vLysG7dumsW0YnaCk3uQZeOE2UyVIx9DObozoAga96giIiI6Ib07NkTwnVmgR49erSFoiGi1uanmlKsLf0VlsvLPAbLlZgU0hmdVFqJIyMiImoabhfR//WvfzVHHJg/fz6GDBmCS5cuNXjM8uXLcfLkSaxbtw4qlQoTJ06EQqHAmjVrnI7du3cv0tLSMHXqVCQmJtrbjx07BovFgqSkJHtbSkoKli9fDpvNBpmMxUBqu2TFRRDMJpeOFWw2mCOjWEAnIiLyAk899ZRTEb2mpgZZWVk4e/Ysnn32WYkiIyJvZhVFbCkvxFfVxfa2m9W+mNguGv7yG9qCjYiIyKO49FdtwIAB1525coUgCNi5c6dbQezevRv79+/HJ598gpkzZzZ43OzZszF27Fg88cQT8Pf3R1FREdavX1/vsaNHj663vaioCEFBQVCpVPa2kJAQGI1GlJeXIzg42K3Yibye1QLV8WPQHtgH5Ym86x9/mahUcd1zIiIiLzF58uQG+6ZPn47c3Fz85S9/acGIiMjbVVsteKfkLI4Yq+1tf/QNxqigCCg40YaIiFoZl4roffv2dbmI7i6j0YiXX34ZL730EjQazTWP1el0WLlyJQYNGgSj0Yjt27e7XfTW6/UOBXQA9scmk2szcIlaA3lxETQH9kOTkwVZTfX1n/A7htiEZoiKiIiIWtqwYcPw9NNP4+WXX5Y6FCLyEr+aDXiz+DSKLHWfoeUARgVF4k5dO2kDIyIiaiYuFdHnzZvXbAG8+eabiI2NRb9+/Vw6ftWqVVAoFNDpdFi6dCkWLlzoVoFfrVY7FcuvPL5eEZ/I65lNUB/JhSZrH1RnTzt1WwODYLy5B7SZeyHYbA2eRpTJoU+7tRkDJSIiopZy9uxZWCwWqcMgIi9xQF+Bd0vOwSjWfV7wk8kxMaQzuqt9JY6MiIio+TRqkTKTyYStW7di7969qKysRFBQEFJTUzF06FC3C9GfffYZiouL7WuUXylof/nllzhw4IDDsStXrsSGDRuwevVq+Pn5YcyYMZgzZw5eeOEFl68XHh6OsrIyWCwWKBR1L7+oqAgajQb+/v5uxU7kLRSFv0KTtQ/qQ9mQGY0OfaJcDmPPGBiS+8DcpSsgyGDp1Bl+2zZDsFmdziXK5Kga9iCs4e1bKnwiIiK6QW+++aZTm81mw4ULF7B9+3b0799fgqiIyJuIoojPKi/h48qL9rZOSg2eCumMdgrVNZ5JRETk/dwuoldWVuKRRx7BsWPHEBERgdDQUOTn5+PTTz/FunXr8OGHH8LPz8/l861du9Zh5surr74KAPVubqTRaLBkyRJ7wX3FihXYvXu3W/H36tULCoUC2dnZSE1NBQBkZmYiLi6Om4pSqyIYDFAfyobmwD4oCwuc+i2hYTAk9YEhIQmij+OsEWNsAiyh4dDu2QVNbg4EswmiUgVDbAL0abeygE5ERORl6iuiA3XLJQ4cOBDp6ektHBEReRODzYr3Ss8jU19hb+ujDcCjwVFQ83M0ERG1AW4X0RctWoQLFy7g3//+t70IDQD79+/HlClTsHjxYrdmhkdGRjo89vWtK+ZFR0c7HTt27FiHx4mJiUhMTHQjekCr1WLo0KGYOXMm5s6di0uXLmH16tXIyMhw6zxEHkkUoTx7GpoD+6A+nAvBYnbsViphiEmAITkVlo6dgGsshWQNb4/qB4ajZshwKGGDGTKIYnO/ACIiImoOx44dkzoEIvJSxRYT3iw+jfNmAwBAADAsoD3u9gtttr3TiIiIPI3bRfT//e9/ePrppx0K6ACQmpqKKVOmYNmyZW4V0aWQnp6OmTNnYty4cdDpdJg8eTIGDRokdVhEjSbUVEOTkwVN1n4oSoqc+s0RHWFI7gNjbDxEdSPW/lcqAbPz0i5ERERERNR6HTNUY3nJGVRfXuZRI8jwt3adkKDlUqhERNS2uF1Er6mpQVRUVL19UVFRKC8vv6GAmmMT0+PHjzs81mq1mD9/PubPn9/k1yJqMTYblKfyoM3aD9XxI04bgdo0Ghjik2BI6gNr+w4SBUlERERScWeJFkEQMHfu3GaMhoi8iSiK+Ka6BBvKC3DlU0a4QoWnQjojQtmISTlERERezu0ieteuXfHNN9/gtttuc+r75ptv6l2GhYiajqyiHJoD+6HJzoS8otyp39S5a92s854xdTPIiYiIqE3as2fPdY8pKyuDXq+XrIi+c+dO/O9//+PSikQexCLa8GFZAb6vKbW3xWr88Hi7TvCRySWMjIiISDpuF9Efe+wxTJs2DVarFffeey9CQkJQXFyMTz/9FJs2bcLLL7/cHHEStW1WC1THj0F7YB+UJ/IgwHFxcpuvDobEFBiSUmFtFyJRkERERORJvv766wb7LBYLli1bhnfeeQchISGYOXNmywV22fz58/HNN9+4vccRETWfCqsZbxefwQlTrb3tLr9Q/CWgPWRc/5yIiNowt4vo99xzD06fPo3ly5djw4YNAOpu9VKpVHjyyScxcuTIJg+SqK2SF1+CJms/NDlZkNXWOPSJggDTzT1gSOoD0809ADlnhRAREdH1HT16FOnp6Th+/DjuvfdevPjiiwgICGjxOOLj4/HHP/4RH3/8cYtfm5rOhHMH3Tr+3aj4ZoqEbtRpUy3eKj6DMqsZAKAUBIwL6og/+AZJHBkREZH03C6iA8CTTz6Jhx9+GNnZ2aioqEBAQAASEhIkSb6JWh2zCeojudBk7YPq7GmnbmtgEAxJqTAkpsDmz585IiIico3FYsFbb72FlStXIjAwEG+++Sb+9Kc/SRbP3Xff7dKSM0TU/PbUlGFN2XmYxbo7XoPkSjwVEo3OKh+JIyMiIvIMjSqiA4C/vz/uuOMOVFRU4OzZs5DJZE0ZF1Gboyj8FZqsfVAfyobMaHToE+VyGHvGwJDcB+YuXQGBP29ERETkuiNHjthnnz/wwAN44YUX4O/vL3VYRCQxmyjio4oL+KKqyN7WTeWDJ0OiESDn/kpERERXuFxEP3jwIJYtW4bBgwdj6NChAIB///vfWLhwIUwmE9RqNSZPnozHHnusuWIlanUEgx7qQ9nQZO2H8kKBU78lNAyGpD4wJCRB9PGVIEIiIiLyZhaLBW+++SbeffddBAUF4e2330b//v2lDouIPECtzYp3Ss4i11Blb7vdNwhjgiKh5KQdIiIiBy4V0Y8dO4axY8ciMDAQw4cPBwAcOnQIc+bMQbdu3fD000/j1KlTeP311xEdHY2BAwc2a9BEXk0UoTx7GpoD+6A+nAvBYnbsViphiEmAITkVlo6dAG7gQ0RERI1w+PBhPPfcczhx4gSGDh2K559/Hn5+fs1yLZPJhOHDh+PFF19EWloaAMBoNGLWrFnYsWMHNBoNxo8fj/HjxzfL9YnIPYVmA94sPo2LFhMAQAbgocAI9Ne1g8DPH0RERE5cKqKvWLECPXv2xJo1a6DVagEAH3zwAQDg1VdfRc+ePQEAxcXFWLt2LYvoRPUQaqqhycmCJms/FCVFTv3miI4wJPeBMTYeolojQYRERETUmvz1r3+FzWaDn58ffv31Vzz11FMNHisIAt5///1GXcdoNGLatGnIy8tzaF+wYAFyc3Px/vvvo6CgADNmzEBERAQGDx5sPyYtLc1edHeHFDW+K9dkffHGcPwcSfG+OqivxDvFZ6EXbQAAnUyOiSHR6KnRtVwQjcSfQ9dxrNzD8XIdx8p1HCv3ePp4uVRE37dvH5577jl7AR0AfvzxR0RFRdkL6ABw++23Y9u2bU0fJZG3stmgPJUHbdZ+qI4fgWCzOXZrNDDEJ8GQ1AfW9h0kCpKIiIhao+TkZPt/i5c3C2zI9fobcuLECUybNs3p+bW1tdi8eTNWrlyJmJgYxMTEIC8vD+vWrXMoojeGSiW/oec3liAAcrkcggA0crgIQLaxCvE+flDLpPn/6Gla8n0liiI+K7+EzaUFuHKpKJUGT7fvilClunkv3kT4c+g6jpV7OF6u41i5jmPlHk8fL5eK6OXl5Wjfvr398cmTJ1FWVuY041yr1cJkMjVthEReSFZeBk12JjQH9kNeWeHUb+rctW7Wec8YQMkNe4iIiKjprV27ttmvsXfvXqSlpWHq1KlITEy0tx87dgwWiwVJSUn2tpSUFCxfvhw2mw0yWePXWzaZrJLNRBdFwGKxeuQHOykYfzdBxBVLL+ZDJQiI1fghxScA8Vp/+LThgnpLva+MNhveLz2PPbXl9rZkrT8eaxcFDeQwm63Nd/EmxJ9D13Gs3MPxch3HynUcK/d4+ni5VEQPDAxESUmJ/fHPP/8MQRBwyy23OBx38uRJBAcHN22ERN7CaoHq+DFoD+yD8kQeBDj+xFt1fjAmJEOfnApbcIhEQRIRERE1ndGjR9fbXlRUhKCgIKhUKntbSEgIjEYjysvLb/gzg5QfrETRM2dHtSSbKOLn2nJ8VFHYqOebRBFZ+kpk6SuhgIBeGh1StAFI1PpDJ3fpI2qr05zvqxKLCW8Vn8FZs97eNsQ/HPf6h0EmCF75fubPoes4Vu7heLmOY+U6jpV7PHW8XMpQ+vbti02bNmHQoEGwWq3YunUr1Go1+vXrZz/GZDJh3bp1DreNErUF8uJL0GTthyYnC7LaGoc+URBgurkHDEl9YLq5ByBvu7NsiIiIqO3Q6/UOBXQA9se8c9W75RlrsLGsAKevKsi644++wcjSV6LKZgEAWCDikKEKhwxVkJUBPdQ6JPsEIFnrjwA579i8UXnGGiwrPmMfb7Ugw4TgKCT5BEgcGRERkXdxqYg+ceJEjBw5EgMHDoQoiigoKMBTTz0FPz8/AMDWrVuxbt065OfnY8GCBc0aMJFHMJugPnwI2gP7oTx72qnbGhgEQ1IqDIkpsPkzQSUiIqK2Ra1WOxXLrzzWaLiBujcqspiwtbwQ+/XOSxW6Y2xwR4wRRZww1iBTX4EsfSXKrGYAgA3AUWM1jhqr8WHZr7hJ5YMknwCkaAPQTqG69onJyXfVJfiwrADWy3fIhspVmBTSGZEq/gwSERG5y6Ui+s0334xNmzZh9erVKCkpwd/+9jeMGjXK3v/GG29AoVDgrbfeQq9evZotWCKpKQp/hSZrH9SHsiEzGh36RLkcxp4xMCT3gblLV0Bo/FqfRERERN4sPDwcZWVlsFgsUCjqPnIUFRVBo9HA399f4ujIHQabFdsrL2FHVTEsVy1X2FGpwcjACCwqOuX2OWWCgO4aHbprdBgZGIHTJn1dQb22AkXWui9bRAB5plrkmWqxqbwQnZVaJF8uqId7ySaYUrGIIjaWF+Cb6t+WZO2l1uGJdp3a7HI5REREN8rlv6A33XQT5s6dW2/fli1bEBoaekMbBBF5KsGgh/pQNjRZ+6G8UODUbwkNgyG5DwzxSRB9fCWIkIiIiMiz9OrVCwqFAtnZ2UhNTQUAZGZmIi4ujp8ZvIRNFPFTTRm2VVxA5eWlQADAT6bAsIBw3O4bDJkg4N2oeKfnCgKgVNZtVnm9NU1lgoCuah90VftgREB7nDMbkHW5oF5g+W3SymmzHqcr9Pio4gIilRqkaOsK6hFKNQQpdpr1UFVWC94uOYNfjL8tMzlQF4IHAztAznEiIiJqtCb5Gjo8PLwpTkPUckwmQLjG+uSiCOXZ09Ac2Af14VwIFrNjt1IJQ0wCDMmpsHTsVPdJgYiIiIgAAFqtFkOHDsXMmTMxd+5cXLp0CatXr0ZGRobUoZELjhmqsbG8AOfMBnubAgIG+oXgXv8waGXNs8+PIAjopNKik0qLoQHtUWg22Geon70qll/NBvxqNuC/lRcRrlAhWRuAFJ8ARCu1bbqgftakx1vFp1FyeXkcBQSMDY7Ebb43tpEvERERNVERncgbyC8WQrtnFzS5ByGYTRCVKhhi46FPuxXW8A4AAKG6CpqcA9Ac2AdFSbHTOcyRHWFI6gNjbDxENdcSJCIiImpIeno6Zs6ciXHjxkGn02Hy5MkYNGiQ1GHRNVyyGLG5vBAH9JUO7SnaAIwIbI9QRcsuo9JBqcF9Sg3u8w9HkcWIrNpKZOorcMpUaz/mosWEz6uK8HlVEdrJlUjWBiDZJwDdVD6QtaGC+v7acqwuPQfT5an/ATIFngyJRjc175QlIiJqCoIoXu8GO3JXUVFVi1/TnVsm2yJ1bg78tm2GYLM69YkyOWpvuQ2K0lKojh+BYLM59Ns0Ghjik2BI7mMvtrclfG+5jmPlHo6X6zhWruNYuYfj5Topxyo01K9lL+jhpMi1gdb981Jrs+KzyovYWVVi34QSADopNXgoMALdNTq3ztfcY1VqMeGAvhJZ+gr8YqxBfZcIkCmQ7BOAZG0Auqt9PXYpkxsdK5so4j+VF/FZ5SV7WxeVFk+264wghbIJI/UMrfnnsKlxrNzD8XIdx8p1HCv3eHq+zZnoLjIajZg+fTpKSkpgMpnw/PPPIzExUeqwyAXyi4UNFtABQLBZ4fvT907tps5dYUjuA2PPGEDZ+hJQIiIiImrbrKKIH2pK8Z+KC6i6KlcOkCkwPLA9bvEJ8sjZ3MEKFf7kF4I/+YWg0mpBtr4CmfoKHDNU48qrqLBZ8E11Cb6pLoFOJkei1h/J2gD01uigEFrHuvx6mxXvlpxFjuG3L5Zu8QnCI8GRULaS10hEROQpWER30ZYtW9C1a1csXrwYp06dQnp6OjZu3Ch1WOQC7Z5dDRbQf8+q84MxIRn65FTYgkOaOTIiIiIiImkcNlRhU3khfr1qrXGlIGCQXyju9guFppnWPW9q/nIF7tC1wx26dqixWZCjr0JWbQVyDVWwXJ6jXm2z4seaMvxYUwatIEO81h8p2gDEaPyg9tKNbi+ajXiz+DQKL2++KgB4MLAD/qwLadPrwhMRETUXFtFdNGTIEHsyYrVaoeTMZK+hyT3o0nGiQoHSp2cAcu/4wEBERERE5K4LZgM2lRfioMFxWZy+PgH4S0AHtFOoJIrsxvnKFLjVNwi3+gbBYLPioKGuoH7IUAWjWLdko160YU9tOfbUlkMlCIjT+CPFJwDxGj+v+eLgsKEKK4rPolasmyjkI5PjiXadEKPh0k9ERETNhUX039m4cSPWrl3r0LZq1SqEh4cDAEpLSzF9+nRMnz5divDIHVYLVLmHIJhNLh0uWCyAzcYiOhERERG1OjU2Cz6puIRvqotx9T2aXVRajAyMwE2tbANKjUyOvj6B6OsTCJPNhsPGuoJ6tr4S+ssFdZMoIvPyUjAKCOit0SHFJwAJGn/o5J73UVkURXxVXYzN5YX2deA7KNSYFNIZ4cqW3fSViIiorfG8zEBiI0eOxMiRI+vty8/Px5QpUzB16lTccsstLRwZuUpWWgxt5j5osjMhq61x+XmiUsW1z4mIiIioVbGIIr6vLsF/Ki+i5qolDoPkSgwPaI80n0CPXPe8KalkMiRpA5CkDYBFtOGYoQaZ+goc0Feg+vKYWCDioKEKBw1VkAPooa4rqCdq/REgl/4zglm04YPSX7G7tszelqjxx2PtoqD1khn0RERE3oxFdBcVFhZi4sSJWLBgAeLj46UOh37PYoH62BFosvZClX+yUacwxCY0cVBERERERNI5pK/ExvJCXLi8bjYAqAQBg/3CcJdfqNeuB34jFIIMsVo/xGr98LAYiTxjXUE9q7YCFTYLAMAK4IixGkeM1fh32a+4We2LZG0AkrX+CJZguZsyixlvlZzGaZPe3naffxge8A9v9V+AEBEReQqPKKKfOXMG//rXv5CVlYWAgAA8/PDDmDBhQpOc22QyYfjw4XjxxReRlpYGADAajZg1axZ27NgBjUaD8ePHY/z48dc8z7Jly1BbW4uFCxcCAIKCgrBkyZImiZEaT15SBE3mPmhyspxmnYsyOYy9esPU5Sb4bf/vNTcXFWVy6NNube5wiYiIiIia3a9mAzaVF+Cwodqh/RafQAwLaC9JIdgTyQUBPTU69NToMCowAqdMtci6XFAvtpoBACKAX4w1+MVYgw3lBeiq8kGy1h/JPgEIUzT/EionjTVYVnzGXuBXCQLGB0ch1Sew2a9NREREv5G8iG6z2fD4448jLi4O27Ztw5kzZ/DMM88gPDwc999//w2d22g0Ytq0acjLy3NoX7BgAXJzc/H++++joKAAM2bMQEREBAYPHtzguWbPnn1DsVATsligPnYYmsy9UJ0+5dwd3A6G5L4wJCZD9NXVNarV8Nu2ud5CuiiTo2rYg7CGt2/uyImIiIiImk2V1YL/Vl7Ed9UlsF3V3k3lg5GBEeiq9pEsNk8nEwTcpPbFTWpfPBjQAWfNemTWViJLX+Ewk/+UqRanTLXYUnEBUUoNkrUBSPEJQIRS0+Qx/Vhdin+X/QrL5RXQ28mVmBTSGVEqbZNfi4iIiK5N8iJ6cXExevXqhZkzZ0Kn06Fz58645ZZbkJmZ6VREP378OIKDgxEaGgoAqKqqQn5+fr3Lq5w4cQLTpk2DKIoO7bW1tdi8eTNWrlyJmJgYxMTEIC8vD+vWrbtmEZ2kJy8ugibr8lrn+lqHPlEuh7FXDAzJfWHu3BX43W2NxtgEWELDod2zC5rcHAhmE0SlCobYBOjTbmUBnYiIiIi8lkW04evqEnxScdG+aSYABMuVGBHYAX20ARC47IfLBEFAtMoH0SofDAsIR4HFiKzaug1Iz5sN9uPOmQ04ZzbgP5UX0V6hRopPAFK0AYhSauod7wnnDjY6pu5qX0xsFw0/D9zwlIiIqC2Q/C9wWFgY3njjDQB1u41nZWVh3759ePnll52OXb58OU6ePIl169ZBpVJh4sSJUCgUWLNmjdOxe/fuRVpaGqZOnYrExER7+7Fjx2CxWJCUlGRvS0lJwfLly2Gz2SBrg+sCejSLGeqjl2edn8l37m4XUjfrPCHpt1nnDbCGt0f1A8NRM2Q4lLDBDBl+9x0LEREREZHXEEUROYZKbC4vxEWLyd6uFmS42z8Ug3ShUPHzzQ0RBAGRSg0iAzS4PyAcF81GZOnrCupXr1F+wWLEZ5WX8FnlJYTIVUjx8UeyNgBdVD43vG55f107jAyMgIJfhBAREUlG8iL61QYMGICCggL0798fd911l1P/7NmzMXbsWDzxxBPw9/dHUVER1q9fX++5Ro8eXW97UVERgoKCoFL9tg5gSEgIjEYjysvLERwc3DQvhm6IvOgSNFl769Y61+sd+kS5HMbesXWzzqO7OM06d4lSCZgbXiOdiIiIiMiTnTPpsam8EEeNv617LgC41TcIwwLaI1CulC64VixcqcbdyjDc7R+GEosJB/SVyNRX4ISxBlfm5xRbTfiyqhhfVhUjSK5EkrauoO4uOQSMCYrAHbp2TfsiiIiIyG0eVURfsmQJiouLMXPmTGRkZOCFF15w6NfpdFi5ciUGDRoEo9GI7du3u1301uv1DgV0APbHJpOpvqdQSzGboT6aWzfr/Oxpp25LSOhvs859fFs+PiIiIiIiiVVaLfi44gJ+qCnF1TdVdlf7YmRgB0SruO55S2mnUGGgXwgG+oWgwmquK6jXVuC4sdq+Jn2Z1Yyvq0vwdXWJ2+d/Nqwrblbzcw8REZEn8KgielxcHIC6DUGfffZZTJ8+3angvWrVKigUCuh0OixduhQLFy50a30/tVrtVCy/8lijafrNYOj65JcuXp51fgAyw+9nnStgjLk867xT58bNOiciIiIi8nJm0YadVcX4rPISDFetex4iV+HBwA5I1vpz3XMJBciVuFPXDnfq2qHaakG2vm5T0iOGavvGoO5iAZ2IiMhzSF5ELy4uRnZ2NgYOHGhvu+mmm2A2m1FdXe0w03zlypXYsGEDVq9eDT8/P4wZMwZz5sxxmrF+LeHh4SgrK4PFYoFCUffyi4qKoNFo4O/v33QvjK7NbIb6yCFoM/dCee6MU7clJAyGlMuzzrWcTUNEREREbZMoisjSV2JLeSGKrL9NBtIIMtzrH4aBfiFQClz33JPo5ArcrgvG7bpg6G1WHNRXIuvysi9ERETknSQvop8/fx6TJk3Cd999h/DwcABAbm4ugoODnZZq0Wg0WLJkiX1T0BUrVmD37t1uXa9Xr15QKBTIzs5GamoqACAzMxNxcXHcVLQFyC9dgCZzLzQHD0BmMDj0iQoFjDFx0Cf3hSUqmrPOiYiIiKhNO2OqxcbyQvxirLG3CQD6+QZjSEA4ArjuucfTyuRI8w1Cmm8QJpw7KHU4RERE1EiSF9Hj4uIQExOD559/Hunp6fj111+xcOFC/N///Z/TsWPHjnV4nJiYiMTERLeup9VqMXToUMycORNz587FpUuXsHr1amRkZNzIy6BrMZugPnx51vn5s07dltBw6FP6whifBFGrlSBAIiIiIiLPUW41Y1vFBeyqKXNYCKSnWoeRgR0QpWLOTERERNSSJC+iy+VyLFu2DLNnz8bIkSOh1WoxduxYPPLII812zfT0dMycORPjxo2DTqfD5MmTMWjQoGa7Xlslv1gIbeZeqA9mQ2b8/axzJYyx8dAn94GlYyfOOiciIiKiNs9ks+Gr6mJsr7wE41XrnocpVPhrYAckaLjuOREREZEUBFEUG7fLCTWoqKiqxa8pCIBSKYfZbIWk/0dNJmgOH4Qmcy+Uv55z6raEtYc+pU/drHONNDNoPGasvATHy3UcK/dwvFzHsXIdx8o9HC/XSTlWoaF+LXtBDydFrg0073tAFEXs01dgS3khSq1me7tWkOH+gHAM0LWDwovWPefvlvq5u5zLu1HxzRSJ9+J7y3UcK/dwvFzHsXIdx8o9np5vSz4TnVoH+YWCulnnh7IhMxod+kSFEobYeBhS+sISGcVZ50REREREl50y1mJjeQFOmmrtbTIAf9S1wwP+4fCT8yMbERERkdSYkVHjmYzQ5F6edV5w3qnbEt6+bq3zuCSIGo0EARIREREReaZSiwkfVVzAz7XlDu0xGh3+GhiBSCXzZyIiIiJPwSI6uU1RWADNlVnnpt/NOlcqYYhNqJt1HtGRs86JiIiIiK5itNnwRdUlfFlVBNNV9yq3V6jx18AOiNP4cd3zVqq+5Vl4qz8REZF3YBGdXCIYjVDn5kCTtRfKgl+d+s3tO8CQkgZjXAJENWfNEBERERFdzSaK2FNbjo8qLqDsqnXPfWRyDPEPxx917aBg8ZyIiIjII7GITtekKPi1btZ5bjZkJpNDn6hUwRB3edZ5h0jOOiciIiIiqscJYw02lBfgtElvb5MD6K8LwX3+YdBx3XMiIiIij8ZsjZwIRgPUhy7POi8scOo3d4iEIaUvjLEJENVqCSIkIiIiIvJ8JRYTtlYUYm9thUN7vMYPfw3sgPZc95yIiIjIK7CITnVEEYqC89Bk7oMmNweC2XHWuU2lgjEuEYbkvrBEREoUJBERERGR5zPYrPi8qgg7qopgvmqh6wiFGiODIhCj8ZMwOiIiIiJyF4vobZxgMEB9KLtu1vmFQqd+c0QkDClpMMTGAyrOOiciIiIiaohNFLGrpgzbKi6gwmaxt+tkcgwNaI9+vsGQcwlEIiIiIq/DInpbJIpQ/Hqubtb54RwIZrNDt02lrpt1ntKnbq1zIiIiIiK6pl8M1dhQXoiz5qvXPRfwJ792uM8/HD4yuYTREREREdGNYBG9NTGZAKHh5Fww6KE+mA1t1l4oLl5w6jdHdoQhuS9nnRMRERFRmzbh3EG3jk/RBiBT77jueZLWHyMCOiBcybyaiIiIyNuxiO7l5BcLod2zC5rcgxDMJohKFQyx8dCn3QpreIe6Wefnz0KbtQ/q3IMQLL+bda5WwxiXBH1KH1jbR0j0KoiIiIiIvNfVBfQopQYjAyPQU6OTMCIiIiIiakosonsxdW4O/LZthmCz2tsEswnaA/uhycmCIS4RysJfobh00em55o5R0Cf3hTEmHlCpWjJsIiIiIqJWx0+mwLCAcNzuGwwZ1z0nIiIialVYRPdS8ouFTgX0qwk2G7Q5WQ5tNrUGxvjLs87DO7REmERERERErd7dfqG4xz8MWq57TkRERNQqsYjupbR7djVYQP89c1Q09Ml9YIyJA5ScdU5ERERE1JT+EsgJKkREREStGYvoXkqT69pmR6JCifLx/9fM0RARERERERERERG1TjKpA6BGMJsgmE0uHSpYzIDZfP0DiYiIiIiIiIiIiMgJi+jeSKmC6OKyLKJSBSiVzRwQERERERERERERUevEIrqXMsTGu3hcQjNHQkRERERERERERNR6sYjupfRpt0KUya95jCiTQ592awtFRERERERERERERNT6sIjupazhHVA17MEGC+miTI6qYQ/CGt6+hSMjIiIiIiIiIiIiaj0UUgdAjWeMTYAlNBzaPbugyc2BYDZBVKpgiE2APu1WFtCJiIiIiIiIiIiIbhCL6F7OGt4e1Q8MR82Q4VDCBjNkEEWpoyIiIiIi8l7vRjnvPyQIgFIph9lsZb5NRERE1MZwOZfWRKmUOgIiIiIiIiIiIiKiVoVFdCIiIiIiIiIiIiKiBrCITkRERERERERERETUABbRiYiIiIiIiIiIiIgawCI6EREREREREREREVEDBFHk3vJERERERERERERERPXhTHQiIiIiIiIiIiIiogawiE5ERERERERERERE1AAW0YmIiIiIiIiIiIiIGsAiOhERERERERERERFRA1hEJyIiIiIiIiIiIiJqAIvoREREREREREREREQNYBGdiIiIiIiIiIiIiKgBLKITERERERERERERETWARXQiIiIiIiIiIiIiogawiN6KPP7443juueekDsOjffXVV+jRo4fDvylTpkgdlkcymUyYNWsW+vTpg1tvvRWvvfYaRFGUOiyP9NFHHzm9r3r06IGePXtKHZpHKiwsxBNPPIHk5GQMGDAAa9askTokj1ZSUoIpU6YgNTUVf/7zn/HRRx9JHZLHMZlMuO+++7Bnzx5727lz5/Doo48iMTER99xzD3788UcJI/Qs9Y0XAJw5cwbx8fESReWZ6hur7OxsPPTQQ0hKSsJdd92F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NiEjZwkJCTh8+DAMBoO9LTMzEwkJCRJGRa2BzWbDpEmTcP78eaxduxY333yz1CFRM2O+7R7m265jvt04zLevj/m265hrNx7zbWounpxvs4juxSIjIxEdHW3/5+vrC19fX0RHR0sdmkdKSkqCWq3GCy+8gFOnTuG7777DggULMGHCBKlD8zhdu3bFnXfeifT0dBw7dgw//PAD3nnnHYwaNUrq0DxaXl4ebrrpJqnD8GgDBgyAUqnECy+8gPz8fHz99ddYvnw5xo4dK3VoHikwMBC1tbVYuHAhzp07h82bN2Pr1q38vXUdffv2RYcOHZCeno68vDy88847OHjwIEaMGCF1aOTltmzZgj179uCVV16Bv78/ioqKUFRU5HQ7M7UezLfdw3zbdcy3G4f59vUx33Ydc+3GY75NzcWT820u50Jthk6nw6pVqzB37lz85S9/ga+vLx566CH+gWzAq6++itmzZ2PUqFHQarUYM2YME6/rKC4uhr+/v9RheDQ/Pz+sWbMGc+bMwYgRIxAcHIyJEyd6xCYhnur111/Hyy+/jPvvvx8dO3bE4sWLER8fL3VYHk0ul2PZsmX45z//ieHDhyM6OhpvvfUWIiIipA6NvNyXX34Jm82GJ554wqG9b9++WLt2rURREXkO5tvuYb7tPubb18d82z3MtRuH+TY1F0/OtwVRFEVJIyAiIiIiIiIiIiIi8lBczoWIiIiIiIiIiIiIqAEsohMRERERERERERERNYBFdCIiIiIiIiIiIiKiBrCITkRERERERERERETUABbRiYiIiIiIiIiIiIgawCI6EREREREREREREVEDWEQnIiIiIiIiIiIiImoAi+hERERERERERERERA1gEZ2IyAuMHTsWPXr0cPiXmpqKRx55BHv37pU6PJw/fx49evTARx99dM3jysrKkJGRgYEDByI2NhZ9+/bFuHHj8NVXXzkct3TpUvTo0aM5Q3Zw/vx59O/fH6WlpQCAAQMGIDk5GQUFBfUe36NHDyxduhQAYDKZMHjwYGRnZ7dUuERERETUhJhrNy/m2kTUGrCITkTkJXr37o2NGzdi48aN+PDDDzFv3jwolUo89thjyMvLkzq86zIYDBgzZgy+/fZbPP7441i1ahXmzp2LkJAQTJo0Ce+//7792AcffBAbN25skbhEUUR6ejrGjRuH4OBge3tNTQ1eeOGF6z5fpVLh2WefxYwZM2AwGJozVCIiIiJqJsy1mwdzbSJqLVhEJyLyEjqdDomJiUhMTERKSgoGDhyIpUuXQiaTXXdWiif44osvcPLkSaxYsQJ//etfkZaWhoEDB2LRokUYOHAglixZAqvVCgBo3749EhMTWySur776Cr/88gtGjx7t0O7v74+ffvoJmzZtuu45Bg4cCKVSifXr1zdXmERERETUjJhrNw/m2kTUWrCITkTkxbRaLdRqNQRBcGjfvn07hg8fjqSkJNx222146aWXUFFR4XDMzp07MXr0aCQlJSE2NhaDBw/GunXr7P179uxBjx49sGHDBvTv3x/Jycn46aefAAA7duzAAw88gPj4eAwbNgzHjh27bqzFxcUAAJvN5tT3xBNP4Mknn4TJZALgeIvpldtX6/s3YMAA+zkKCgrwzDPPoG/fvkhISMC4ceNw5MiR68a1YsUK3HXXXVCpVA7tAwYMQN++fTF//nwUFhZe9zz3338/3nvvPftrICIiIiLvxlybuTYR0RUsohMReQlRFGGxWGCxWGA2m1FUVIRFixbBZDLhL3/5i/24ZcuW4ZlnnkFiYiKWLFmCp556Cl9++SXGjh1rvwXy22+/xVNPPYWYmBgsW7YMS5cuRVRUFP71r38hJyfH4bpvvvkmZsyYgZdeeglJSUn4+uuvMWXKFPTo0QNvvfUW7r77bvzjH/+4bvz9+vWDQqHAuHHj8OabbyI7OxtmsxkAEB8fj8ceewxardbpeWFhYfZba6/8mzZtGgBgxIgRAIDS0lI89NBDOHz4MF588UUsWrQINpsNY8aMwcmTJxuM6dSpU8jNzcWgQYOc+gRBwNy5c2Gz2Vy61XTw4MG4ePGiR6ybSURERETuYa7NXJuI6FoUUgdARESu2bdvH2JiYpzan3nmGXTr1g0AUFFRgbfffht//etf8dJLL9mP6d69O8aMGYOtW7dizJgxOHHiBIYNG4Z//vOf9mOSkpKQlpaGPXv2ICEhwd4+evRoDB482P74rbfeQnx8PBYuXAigLmEHgEWLFl0z/h49euD111/HrFmzsHTpUixduhQajQapqakYMWIE7r777nqfp1KpHG43PXv2LFatWoVBgwZh4sSJAID3338f5eXlWL9+PSIjIwEAd9xxB+655x4sXrwYS5YsqffcP//8M4C6Dxb1iYqKwjPPPINXXnkFmzdvxoMPPtjg64uOjkZAQAB2796N22+//ZpjQURERESehbl2HebaRET1YxGdiMhLxMTEYNasWQDqZspUVlbi+++/x+uvv47a2lpMnToV2dnZMJlMuO+++xyem5qaisjISOzduxdjxozBhAkTANRt6JOfn4+zZ8/i0KFDAOB0i2SvXr3s/20wGHD48GH8/e9/dzjm7rvvvm5iDwCDBg1C//798fPPP2PXrl3Ys2cPdu3ahR9//BGff/45Fi9e7HS77NWqq6sxceJEhIaGYt68efZjd+/ejV69eiE8PBwWiwUAIJPJcMcdd+C///1vg+c7d+4c/P394e/v3+AxDz/8ML788kvMmzcP/fr1Q/v27Rs8NiIiAufPn7/eMBARERGRh2GuzVybiOhaWEQnIvISvr6+iIuLc2i7/fbbUVtbi3fffRePPPKIfS3GkJAQp+eHhISgqqoKQN0tmS+//DJ27twJQRAQHR2N1NRUAHUfGq7m4+Nj/++KigqIooigoCCHY8LCwlx+HUqlEv369bPPqrl48SJeeeUVfPnll/j222/Rv3//ep9ns9nwzDPP4NKlS9iyZQt8fX3tfeXl5Thz5ky9s4cAQK/X13v7anV1db3tV7tyq+kDDzyAF154Ae+++26Dx2q1WlRXV1/zfERERETkeZhrM9cmIroWFtGJiLxcbGwsNm/ejPPnzyMgIABA3cZCXbt2dTiuqKgIUVFRAIBnn30Wp06dwpo1a5CUlASVSgW9Xo9NmzZd81qBgYGQyWT2jYuuKC8vv26cDz30ELp06YKMjAyH9vDwcMyZMwc7duzAiRMnGkzsFy5ciB9++AErVqxAdHS0Q5+fnx/69u2L6dOn1/vc329kdEVQUJD9w861dOrUCVOnTsXcuXOxZcuWBo+rrKxERETEdc9HRERERN6BuTZzbSIigBuLEhF5vYMHD0IulyMqKgoJCQlQqVT49NNPHY7Zv38/CgoKkJycDADIzMzEoEGDkJaWZk96v//+ewB1s1AaolarkZSUhB07djjMovn666+vG2dkZCS++OILnDt3zqkvPz8fQN16kvXZtm0bVq9ejalTp+KOO+5w6u/bty/y8/PRpUsXxMXF2f/95z//wZYtWyCXy+s9b0REBGpra+2ziq5l7NixSElJwbx58+rtF0URFy9etK8TSURERETej7k2c20iIoAz0YmIvEZ1dTWys7Ptj00mE77++mts3boVI0eORHBwMADg8ccfx1tvvQWlUon+/fvj/PnzWLx4MW666SYMGzYMQN3mPp988gliYmLQvn17ZGVl4Z133oEgCNDr9deM45lnnsG4ceMwadIkjBw5Evn5+Vi+fPl14586dSr27NmDESNG4JFHHkFSUhJkMhkOHTqE1atX44477qg3ac/OzsaLL76Ivn374vbbb0dOTo7Dh4revXvj0UcfxX/+8x88+uijGD9+PIKCgrB9+3Zs2rQJ6enpDcZ02223Aaj7oDNgwIBrxi+TyZCRkYEHHnig3v5ffvkFVVVV9ltniYiIiMh7MNdmrk1EdC0sohMReYkjR45g5MiR9sdqtdp+6+Njjz1mb588eTJCQkLw73//Gxs3bkRgYCAGDx6Mp59+2r7m4rx58zB79mzMnj0bANC5c2fMmjUL//3vf7F///5rxpGamoqVK1fitddew6RJk9CxY0fMnTsX//d//3fN53Xs2BHbtm3DihUr8Mknn2DlypUQRRHR0dF47LHH8Mgjj9S70dEPP/wAs9mMvXv32j+YXO1///sfOnbsiA0bNmDRokWYOXMmjEYjOnfujDlz5mDEiBENxhQVFYWYmBh89913103sASA6OhpTp051uk0WqJtdFBoaap+BRERERETeg7k2c20iomsRxN/vakFERNSGfPnll3j++efx/fffO2yg5A5RFHHXXXdh9OjRePTRR5s2QCIiIiIiL8Vcm4haC66JTkREbdqgQYNw8803Y/369Y0+x44dO2C1WvHQQw81YWRERERERN6NuTYRtRaciU5ERG3e2bNn8fDDD+Pjjz+2r3fpKpPJhPvvvx9z585FSkpKM0VIREREROSdmGsTUWvAIjoRERERERERERERUQO4nAsRERERERERERERUQNYRCciIiIiIiIiIiIiagCL6EREREREREREREREDWARnYiIiIiIiIiIiIioASyiExERERERERERERE1gEV0IiIiIiIiIiIiIqIGsIhORERERERERERERNQAFtGJiIiIiIiIiIiIiBrw/wG3hJuFjs3zsgAAAABJRU5ErkJggg=="/>
</div>
</div>
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain" tabindex="0">
<pre>📊 N-Queens Complexity Analysis:
N Solve Time (s) Solutions Complexity
4 0.0246 2 O(2^N)
5 0.0312 10 O(2^N)
6 0.0394 4 O(2^N)
7 0.0495 40 O(2^N)
8 0.0609 92 O(2^N)
9 0.0810 352 O(2^N)
10 0.1016 724 O(2^N)
11 0.1255 2680 O(2^N)
12 0.1596 14200 O(2^N)
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
<h2 id="%F0%9F%93%88-Convex-Optimization-(CVXPY)">📈 Convex Optimization (CVXPY)<a class="anchor-link" href="#%F0%9F%93%88-Convex-Optimization-(CVXPY)">¶</a></h2><p>Convex optimization is perfect for portfolio optimization and machine learning problems. Let's explore Modern Portfolio Theory:</p>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
<h3 id="Mathematical-Theory:-Modern-Portfolio-Theory">Mathematical Theory: Modern Portfolio Theory<a class="anchor-link" href="#Mathematical-Theory:-Modern-Portfolio-Theory">¶</a></h3><p><strong>Markowitz Portfolio Optimization</strong> seeks to find the optimal allocation of assets that maximizes expected return for a given level of risk.</p>
<p><strong>Mathematical Formulation:</strong></p>
<p>Given:</p>
<ul>
<li>$n$ assets with expected returns $\mu = [\mu_1, \mu_2, ..., \mu_n]^T$</li>
<li>Covariance matrix $\Sigma \in \mathbb{R}^{n \times n}$</li>
<li>Risk-free rate $r_f$</li>
<li>Risk aversion parameter $\lambda$</li>
</ul>
<p><strong>Objective Function:</strong>
$$\max_{w} \quad \mu^T w - \frac{\lambda}{2} w^T \Sigma w$$</p>
<p><strong>Constraints:</strong></p>
<ol>
<li><strong>Budget constraint</strong>: $\sum_{i=1}^{n} w_i = 1$</li>
<li><strong>Long-only constraint</strong>: $w_i \geq 0$ for all $i$</li>
<li><strong>Sector limits</strong>: $w_i \leq w_{i}^{max}$ for all $i$</li>
</ol>
<p><strong>Where:</strong></p>
<ul>
<li>$w = [w_1, w_2, ..., w_n]^T$ is the portfolio weight vector</li>
<li>$w_i$ represents the fraction of wealth invested in asset $i$</li>
<li>$\mu^T w$ is the expected portfolio return</li>
<li>$w^T \Sigma w$ is the portfolio variance (risk measure)</li>
</ul>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [35]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="cm-editor cm-s-jupyter">
<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># Portfolio Optimization Example</span>
<span class="k">def</span><span class="w"> </span><span class="nf">create_portfolio_data</span><span class="p">():</span>
<span class="w"> </span><span class="sd">"""Create sample portfolio data"""</span>
<span class="n">assets</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Bonds'</span><span class="p">,</span> <span class="s1">'Stocks'</span><span class="p">,</span> <span class="s1">'Real Estate'</span><span class="p">,</span> <span class="s1">'Commodities'</span><span class="p">]</span>
<span class="n">expected_returns</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mf">0.08</span><span class="p">,</span> <span class="mf">0.12</span><span class="p">,</span> <span class="mf">0.10</span><span class="p">,</span> <span class="mf">0.15</span><span class="p">])</span>
<span class="n">volatilities</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mf">0.02</span><span class="p">,</span> <span class="mf">0.15</span><span class="p">,</span> <span class="mf">0.08</span><span class="p">,</span> <span class="mf">0.20</span><span class="p">])</span>
<span class="c1"># Create correlation matrix</span>
<span class="n">correlation</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span>
<span class="p">[</span><span class="mf">1.00</span><span class="p">,</span> <span class="mf">0.20</span><span class="p">,</span> <span class="mf">0.10</span><span class="p">,</span> <span class="mf">0.05</span><span class="p">],</span> <span class="c1"># Bonds</span>
<span class="p">[</span><span class="mf">0.20</span><span class="p">,</span> <span class="mf">1.00</span><span class="p">,</span> <span class="mf">0.30</span><span class="p">,</span> <span class="mf">0.40</span><span class="p">],</span> <span class="c1"># Stocks</span>
<span class="p">[</span><span class="mf">0.10</span><span class="p">,</span> <span class="mf">0.30</span><span class="p">,</span> <span class="mf">1.00</span><span class="p">,</span> <span class="mf">0.15</span><span class="p">],</span> <span class="c1"># Real Estate</span>
<span class="p">[</span><span class="mf">0.05</span><span class="p">,</span> <span class="mf">0.40</span><span class="p">,</span> <span class="mf">0.15</span><span class="p">,</span> <span class="mf">1.00</span><span class="p">]</span> <span class="c1"># Commodities</span>
<span class="p">])</span>
<span class="c1"># Convert to covariance matrix</span>
<span class="n">cov_matrix</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">outer</span><span class="p">(</span><span class="n">volatilities</span><span class="p">,</span> <span class="n">volatilities</span><span class="p">)</span> <span class="o">*</span> <span class="n">correlation</span>
<span class="k">return</span> <span class="n">assets</span><span class="p">,</span> <span class="n">expected_returns</span><span class="p">,</span> <span class="n">volatilities</span><span class="p">,</span> <span class="n">cov_matrix</span>
<span class="c1"># Generate portfolio data</span>
<span class="n">assets</span><span class="p">,</span> <span class="n">returns</span><span class="p">,</span> <span class="n">vols</span><span class="p">,</span> <span class="n">cov_matrix</span> <span class="o">=</span> <span class="n">create_portfolio_data</span><span class="p">()</span>
<span class="c1"># Create portfolio optimization problem</span>
<span class="k">def</span><span class="w"> </span><span class="nf">solve_portfolio_optimization</span><span class="p">(</span><span class="n">risk_aversion</span><span class="o">=</span><span class="mf">1.0</span><span class="p">):</span>
<span class="w"> </span><span class="sd">"""Solve portfolio optimization problem"""</span>
<span class="n">problem_data</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">"objective"</span><span class="p">:</span> <span class="s2">"maximize"</span><span class="p">,</span>
<span class="s2">"variables"</span><span class="p">:</span> <span class="p">{</span><span class="sa">f</span><span class="s2">"w_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">:</span> <span class="s2">"REAL"</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">assets</span><span class="p">))},</span>
<span class="s2">"objective_function"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"sum([</span><span class="si">{</span><span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">r</span><span class="si">:</span><span class="s1">.3f</span><span class="si">}</span><span class="s1">*w_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s1">'</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="nb">enumerate</span><span class="p">(</span><span class="n">returns</span><span class="p">)])</span><span class="si">}</span><span class="s2">]) - </span><span class="si">{</span><span class="n">risk_aversion</span><span class="o">/</span><span class="mi">2</span><span class="si">}</span><span class="s2"> * portfolio_variance"</span><span class="p">,</span>
<span class="s2">"constraints"</span><span class="p">:</span> <span class="p">[</span>
<span class="s2">"sum([w_0, w_1, w_2, w_3]) == 1.0"</span><span class="p">,</span> <span class="c1"># Budget constraint</span>
<span class="s2">"w_0 >= 0"</span><span class="p">,</span> <span class="s2">"w_1 >= 0"</span><span class="p">,</span> <span class="s2">"w_2 >= 0"</span><span class="p">,</span> <span class="s2">"w_3 >= 0"</span><span class="p">,</span> <span class="c1"># Long-only</span>
<span class="s2">"w_0 <= 0.4"</span><span class="p">,</span> <span class="s2">"w_1 <= 0.6"</span><span class="p">,</span> <span class="s2">"w_2 <= 0.3"</span><span class="p">,</span> <span class="s2">"w_3 <= 0.2"</span> <span class="c1"># Sector limits</span>
<span class="p">]</span>
<span class="p">}</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">mcp_server</span><span class="o">.</span><span class="n">solve_convex_optimization</span><span class="p">(</span><span class="n">problem_data</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span>
<span class="c1"># Solve portfolio optimization</span>
<span class="n">portfolio_result</span> <span class="o">=</span> <span class="n">solve_portfolio_optimization</span><span class="p">(</span><span class="n">risk_aversion</span><span class="o">=</span><span class="mf">2.0</span><span class="p">)</span>
<span class="c1"># Create portfolio visualization</span>
<span class="n">fig</span><span class="p">,</span> <span class="p">((</span><span class="n">ax1</span><span class="p">,</span> <span class="n">ax2</span><span class="p">),</span> <span class="p">(</span><span class="n">ax3</span><span class="p">,</span> <span class="n">ax4</span><span class="p">))</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">15</span><span class="p">,</span> <span class="mi">12</span><span class="p">))</span>
<span class="c1"># 1. Asset allocation pie chart</span>
<span class="n">weights</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.3</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">,</span> <span class="mf">0.3</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">]</span> <span class="c1"># Simulated optimal weights</span>
<span class="n">colors</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'#FF6B6B'</span><span class="p">,</span> <span class="s1">'#4ECDC4'</span><span class="p">,</span> <span class="s1">'#45B7D1'</span><span class="p">,</span> <span class="s1">'#96CEB4'</span><span class="p">]</span>
<span class="n">wedges</span><span class="p">,</span> <span class="n">texts</span><span class="p">,</span> <span class="n">autotexts</span> <span class="o">=</span> <span class="n">ax1</span><span class="o">.</span><span class="n">pie</span><span class="p">(</span><span class="n">weights</span><span class="p">,</span> <span class="n">labels</span><span class="o">=</span><span class="n">assets</span><span class="p">,</span> <span class="n">colors</span><span class="o">=</span><span class="n">colors</span><span class="p">,</span> <span class="n">autopct</span><span class="o">=</span><span class="s1">'</span><span class="si">%1.1f%%</span><span class="s1">'</span><span class="p">,</span> <span class="n">startangle</span><span class="o">=</span><span class="mi">90</span><span class="p">)</span>
<span class="n">ax1</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'Optimal Portfolio Allocation'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span>
<span class="c1"># 2. Risk-Return scatter plot</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">vols</span><span class="p">,</span> <span class="n">returns</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="n">colors</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.7</span><span class="p">,</span> <span class="n">edgecolors</span><span class="o">=</span><span class="s1">'black'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">asset</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">assets</span><span class="p">):</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="n">asset</span><span class="p">,</span> <span class="p">(</span><span class="n">vols</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">returns</span><span class="p">[</span><span class="n">i</span><span class="p">]),</span> <span class="n">xytext</span><span class="o">=</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="n">textcoords</span><span class="o">=</span><span class="s1">'offset points'</span><span class="p">)</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s1">'Volatility (Risk)'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Expected Return'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'Risk-Return Profile'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span>
<span class="n">ax2</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.3</span><span class="p">)</span>
<span class="c1"># 3. Efficient frontier</span>
<span class="k">def</span><span class="w"> </span><span class="nf">calculate_efficient_frontier</span><span class="p">():</span>
<span class="w"> </span><span class="sd">"""Calculate efficient frontier"""</span>
<span class="n">risk_aversions</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mf">0.1</span><span class="p">,</span> <span class="mf">5.0</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span>
<span class="n">portfolio_returns</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">portfolio_risks</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">ra</span> <span class="ow">in</span> <span class="n">risk_aversions</span><span class="p">:</span>
<span class="c1"># Simulate portfolio optimization result</span>
<span class="n">portfolio_return</span> <span class="o">=</span> <span class="mf">0.3</span><span class="o">*</span><span class="mf">0.08</span> <span class="o">+</span> <span class="mf">0.2</span><span class="o">*</span><span class="mf">0.12</span> <span class="o">+</span> <span class="mf">0.3</span><span class="o">*</span><span class="mf">0.10</span> <span class="o">+</span> <span class="mf">0.2</span><span class="o">*</span><span class="mf">0.15</span>
<span class="n">portfolio_risk</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mf">0.3</span><span class="o">**</span><span class="mi">2</span><span class="o">*</span><span class="mf">0.02</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="mf">0.2</span><span class="o">**</span><span class="mi">2</span><span class="o">*</span><span class="mf">0.15</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="mf">0.3</span><span class="o">**</span><span class="mi">2</span><span class="o">*</span><span class="mf">0.08</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="mf">0.2</span><span class="o">**</span><span class="mi">2</span><span class="o">*</span><span class="mf">0.20</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
<span class="n">portfolio_returns</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">portfolio_return</span><span class="p">)</span>
<span class="n">portfolio_risks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">portfolio_risk</span><span class="p">)</span>
<span class="k">return</span> <span class="n">portfolio_returns</span><span class="p">,</span> <span class="n">portfolio_risks</span>
<span class="n">eff_returns</span><span class="p">,</span> <span class="n">eff_risks</span> <span class="o">=</span> <span class="n">calculate_efficient_frontier</span><span class="p">()</span>
<span class="n">ax3</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">eff_risks</span><span class="p">,</span> <span class="n">eff_returns</span><span class="p">,</span> <span class="s1">'b-'</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">'Efficient Frontier'</span><span class="p">)</span>
<span class="n">ax3</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">vols</span><span class="p">,</span> <span class="n">returns</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="n">colors</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.7</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">'Individual Assets'</span><span class="p">)</span>
<span class="n">ax3</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s1">'Portfolio Risk (σ)'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
<span class="n">ax3</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">'Portfolio Return (μ)'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
<span class="n">ax3</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'Efficient Frontier'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span>
<span class="n">ax3</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
<span class="n">ax3</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.3</span><span class="p">)</span>
<span class="c1"># 4. Correlation heatmap</span>
<span class="n">im</span> <span class="o">=</span> <span class="n">ax4</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">cov_matrix</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="s1">'RdYlBu_r'</span><span class="p">,</span> <span class="n">aspect</span><span class="o">=</span><span class="s1">'auto'</span><span class="p">)</span>
<span class="n">ax4</span><span class="o">.</span><span class="n">set_xticks</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">assets</span><span class="p">)))</span>
<span class="n">ax4</span><span class="o">.</span><span class="n">set_yticks</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">assets</span><span class="p">)))</span>
<span class="n">ax4</span><span class="o">.</span><span class="n">set_xticklabels</span><span class="p">(</span><span class="n">assets</span><span class="p">,</span> <span class="n">rotation</span><span class="o">=</span><span class="mi">45</span><span class="p">)</span>
<span class="n">ax4</span><span class="o">.</span><span class="n">set_yticklabels</span><span class="p">(</span><span class="n">assets</span><span class="p">)</span>
<span class="n">ax4</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'Asset Correlation Matrix'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span>
<span class="c1"># Add correlation values to heatmap</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">assets</span><span class="p">)):</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">assets</span><span class="p">)):</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">ax4</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">cov_matrix</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">j</span><span class="p">]</span><span class="si">:</span><span class="s1">.2f</span><span class="si">}</span><span class="s1">'</span><span class="p">,</span>
<span class="n">ha</span><span class="o">=</span><span class="s2">"center"</span><span class="p">,</span> <span class="n">va</span><span class="o">=</span><span class="s2">"center"</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s2">"black"</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="c1"># Display portfolio statistics</span>
<span class="n">portfolio_stats</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'Asset'</span><span class="p">:</span> <span class="n">assets</span><span class="p">,</span>
<span class="s1">'Weight (%)'</span><span class="p">:</span> <span class="p">[</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">w</span><span class="o">*</span><span class="mi">100</span><span class="si">:</span><span class="s2">.1f</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">weights</span><span class="p">],</span>
<span class="s1">'Expected Return (%)'</span><span class="p">:</span> <span class="p">[</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">r</span><span class="o">*</span><span class="mi">100</span><span class="si">:</span><span class="s2">.1f</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">returns</span><span class="p">],</span>
<span class="s1">'Volatility (%)'</span><span class="p">:</span> <span class="p">[</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">v</span><span class="o">*</span><span class="mi">100</span><span class="si">:</span><span class="s2">.1f</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">vols</span><span class="p">]</span>
<span class="p">}</span>
<span class="n">df_portfolio</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">portfolio_stats</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"📊 Portfolio Optimization Results:"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">df_portfolio</span><span class="o">.</span><span class="n">to_string</span><span class="p">(</span><span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="se">\n</span><span class="s2">🎯 Portfolio Expected Return: </span><span class="si">{</span><span class="mf">0.3</span><span class="o">*</span><span class="mf">0.08</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mf">0.2</span><span class="o">*</span><span class="mf">0.12</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mf">0.3</span><span class="o">*</span><span class="mf">0.10</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mf">0.2</span><span class="o">*</span><span class="mf">0.15</span><span class="si">:</span><span class="s2">.1%</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"📉 Portfolio Risk: </span><span class="si">{</span><span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="mf">0.3</span><span class="o">**</span><span class="mi">2</span><span class="o">*</span><span class="mf">0.02</span><span class="o">**</span><span class="mi">2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mf">0.2</span><span class="o">**</span><span class="mi">2</span><span class="o">*</span><span class="mf">0.15</span><span class="o">**</span><span class="mi">2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mf">0.3</span><span class="o">**</span><span class="mi">2</span><span class="o">*</span><span class="mf">0.08</span><span class="o">**</span><span class="mi">2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mf">0.2</span><span class="o">**</span><span class="mi">2</span><span class="o">*</span><span class="mf">0.20</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="si">:</span><span class="s2">.1%</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedImage jp-OutputArea-output" tabindex="0">
<img alt="No description has been provided for this image" class="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABc0AAASlCAYAAAB6A/EPAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xd8FHX+x/H3JtkUSEISeujSQUpogoAIKKK/UzkRhFMU7MeBcOediB6IICAo6km1oagoHSwUEUGQ3nsPBEILCSEJ6dny+yOwJiRAsiSZzeb1fDx4kJ2ZnXnvZ6PMfPa73zHZ7Xa7AAAAAAAAAACAPIwOAAAAAAAAAACAq6BpDgAAAAAAAADAVTTNAQAAAAAAAAC4iqY5AAAAAAAAAABX0TQHAAAAAAAAAOAqmuYAAAAAAAAAAFxF0xwAAAAAAAAAgKtomgMAAAAAAAAAcBVNcwAAAAAAAAAArqJpDpQgGRkZmj9/vp577jm1b99ed955p+666y717dtXX3zxhZKSkgrsWImJiYqMjMy2rH79+qpfv7769etXYMfJry1btjhyTJ48+abbLlq0yLHttT8NGjTQnXfeqXbt2unZZ5/Vtm3biiT34cOHcyw7evSonnnmGYWFhal58+Z69NFHdfny5Xzt98yZM47X9vrrrzuWv/76647lZ86cue38N/Lkk086jjN8+PAbbjd58mTHdlu2bHEsd4XfqVu5/r270WsBAAAoKFnP5a4/lw0LC9MDDzyg0aNHKzo6+obPc+YcMOv586JFi5zO36VLl1zzN2rUSK1atdJjjz2mTz/9VOnp6U4f45rczrNdTdbzx6zvZZMmTdShQwcNGjSo0F9HWlqaxo4dqw4dOujOO+/Uvffeq59++inX35kbXWMAQHFC0xwoIWJiYtSnTx/997//1fr16xUTE6OMjAzFxcVp586dmjhxov7v//5PBw4cuK3jWCwWzZ49W/fff3+RNZSLkt1uV0ZGhmJjY7VhwwYNGDBA69atK7TjhYeH6+9//7sGDhyYY92gQYO0efNmJScnKyUlRZGRkQoKCiq0LAXt5MmT2r59u+Px8uXLdeXKFQMTFaybvXcAAABGsNvtSk5OVkREhGbPnq2//e1vio+PNzpWnlmtVl25ckUHDhzQpEmT9K9//cvpfRX3czW73a709HRFR0fr119/1d/+9jcdPHiw0I43c+ZMff3114qOjlZGRobOnz8vs9lcaMcDAKN5GR0AQOGzWCz6+9//rv3790uS2rRpoxdeeEG1atXSpUuX9MMPP+j777/X+fPn9dxzz2nx4sWqXLmyU8f66aefNHr06FzXrV27VpLk7e3t3Asx0PDhw9W9e3dZrVYlJCTo22+/1YIFC5SRkaFx48apQ4cO8vAo+M8hX3jhBZ09e1ZVqlTJtjw2NlanTp2SlDna+n//+58sFotMJlOBHHf48OEaOnSoJKl8+fIFss/rLViwINvjlJQU/fjjj3ryyScL5XhF7Ubv3YABA9SrVy9JUkhIiBHRAABACTJ37lxVqlRJkmSz2RQTE6Nx48Zp165dOn36tL7//nu9/PLLkormHDA/KlWqpLlz5zoeWywWhYeH64033lBMTIx+/fVX7dy5Uy1atMj3vm90rubqPvroI4WFhclisejSpUuaPn261qxZo6SkJL3//vuaOXNmoRx39+7djp9nzJihqlWrqnLlymrXrp1L/c4AQEGhaQ6UAAsWLNDevXslSffee6+mTZsmT09PSVK1atXUvHlzVa1aVRMnTtTly5f1wQcf6L333nPqWHa7/Ybrrp2sF0eBgYGO/FWqVNE777yjPXv26NixYzp58qTOnz9fpCfcKSkpjp8bNmyoWrVqFej+y5QpozJlyhToPrOyWCz64YcfJGXWMyoqShaLRfPmzXObpvmN+Pv7y9/f3+gYAACghChXrly28/DQ0FANHz5cvXv3liTt2bPHsa6wzwHzy9PTM8c1RNWqVfXMM89o0qRJkqS9e/c61TQvrkJCQhw1qVq1qj766CN16tRJcXFx2rJli6xWq+NaryAlJyc7fr733nuzDdZxpd8ZACgoTM8ClAA//fST4+fXXnst15Oo/v37O06+li9f7mjKZp0/7/z583rnnXfUvn17NWvWTH/729+0detWxz5ef/31bPNSDx8+PNvcdrnNP31tDrz27dvr4sWLGjZsmNq0aaOwsDANHjxYUVFRio6O1muvvaZWrVqpZcuWGjhwoM6fP58tf3x8vCZMmKAHHnhAzZs3V/PmzdWtWzeNHz9eCQkJBVDF7Ewmk+rWret4nHU+SJvNpnnz5qlPnz5q1aqVmjdvrh49emjmzJk55l3s16+f6tevr8cee0w//PCDOnbsqCZNmmjYsGGqX7++zp49K0k6e/asY07A119/XV26dHHsY8mSJTnmaD958qRGjBihzp07684771T79u31z3/+M89zHd5sPst9+/bp1VdfVceOHXXnnXeqU6dOevPNN3PMYX8zv//+u6NmPXv2VIcOHSRlzimZ9cLNWfl5DyQpKipKo0aNUpcuXXTnnXeqQ4cOevnll7Vr165s29ntdn399df661//qtatW+vOO+9Ux44d9a9//Uvh4eGS/pzDMbf3Trr5nOZ5fd+yzhP57bffau3atXriiSfUtGlT3X333Ro1apQSExNvu44AAMA9Zb0e8PPzc/x8o3PAXbt26eWXX1a7du3UqFEjtWjRQr169dLChQtveazY2Fjdf//9ql+/vho2bKhly5bddn4vrz/H//n6+mZbt27dOvXr109hYWEKCwtT79699eOPPzrW38652s2uZ+666y5t2LBB9913n+68807HNtfmZ3/llVd04sQJDRw4UC1btlRYWJhefvllnTx58rZq4evrqxo1akjKHJgSGxsr6ebXGdfk5dzz2j2hsl73NWjQwHE9kt958MPDwzV06FC1bdtWTZo0Uffu3TV16lSlpaXdVh0AoKAx0hxwc3a73fFVusqVK6t27dq5bufp6am2bdtqyZIlysjI0P79+9W6dets27z00ks6cuSI4/GOHTs0YMAATZs2TZ06dbqtnCkpKerTp4/j5FWSVq5cqYiICCUnJ2c7Afvtt98UGRmpH3/8USaTSVarVc8//7xjNP01p06d0ldffaXDhw9r1qxZt5XvejabLVstypYtKylznsWXX345xzznhw4d0qFDh/Trr7/qiy++UKlSpXJkff3112Wz2SRJTZo00ZIlS5zKtmHDBg0aNCjbaJCYmBgtW7ZMv/76qyZOnKiHHnrIqX0vWbJEb775piwWi2PZhQsXtGDBAq1YsUKffPKJWrVqdcv9ZJ2a5S9/+Ytq1qyp33//XVLmV4ibNWvmVD4p/+/B6dOn1adPH126dMmxbXR0tNasWaP169dr2rRpuueeeyRJEydOzPGV14sXL2rp0qXauHGjfvnlF6dzO/u+LVu2TDt37nR8yyMtLU3ff/+9kpOTNXHiRKfzAAAA95Oenq4LFy7ogw8+cCy76667bvqcvXv3ql+/fsrIyHAsS0pK0t69e7V3714lJCRowIABuT43OTlZL774ok6fPi2TyaQxY8Y4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tG3bNv3xxx/au3dvjpHfuY2yyovbed+un3Lp2oXYtbwAAKBkmzNnjvz9/bV8+XJNmzZNdrtdERERatSo0S0b5lLm3NirV6/WwYMH9fnnn+vzzz+X2Wx2jFrv3bt3rjc5z3rtsX379hw3qBw/frwWL16c7Tl//etfs30jsFKlSvr+++8VExOjzz77TCtXrnRc1zRq1Cjbc69NUSJlNolzc+DAgVu+3hu51QAk6ebn8yEhIdnO07L+nPW6Jq88PT3l4+OjcuXKqVWrVho0aJDjg4Jb5SrMa4YbyTp3+8yZM3NMeShJx44dU3p6+g0/iAGAokTTHHBzZrNZjRs31t69e3Xx4kUdPnw4R3NQymyubd682fGc3EZIXD/VQ15OHPPDx8fH8XPWE/isN/fJepf2a44dO6Ynn3xS8fHxCg0N1cMPP6zmzZtr69at+v777wsk2/jx4/XYY4/ddJtbzUOYtV65vY6AgADnwmWR201e83r829l3Vjfb95YtW3T69GnH4zfeeCPX7Q4ePKi9e/fm+4OY/L4HWZvct7pYSU5O1pNPPqmDBw+qdOnS6tatm1566SXZbDa99dZb+cp5vdt5366/+VVeLn4BAEDJUb58eVWtWlV169aV3W7XtGnTdPbsWT377LNavHhxroNlsgoKCtKCBQu0du1arVmzRlu3blVERIR27typnTt3au7cuZo/f362b5xeU79+fR05ckRHjhzRnDlzHCOa88rT01OhoaEKDQ3VRx99pP79+2vr1q3atGmTXnnlFX3xxReOc5+8nKteP7DmVrKeK+blRpU3O58vqHO2r7/++pbz0N8qV2FeM9xIXuZst1qtio+Pv+XvJAAUBa6sgRLgr3/9q+PncePG5TrP8bRp0xzzOj/44IPy8/PLsU3WO6ZLcsxPKMkx13jWE6uCbqrfyOeff+6Yx2/u3Ll644039NBDDxXoSV5eBAQEOE7w9u7dm20edZvNpi1btkiSvL29s42qv+ZmN73Jay2zjjretGlTtnUbN250/JzbBydFse+sNwC9lXnz5uUjXab8vgfVqlVz/J7s378/275mz56tp59+WqNGjVJ0dLSWL1+ugwcPSpJGjx6td999V717977lV4jz8t4V5vsGAABwzT/+8Q/H4Jjo6Og8ffB/8uRJrV27VikpKRozZox++eUXbdq0SS+88IKkzBHea9euzfG8Bx54QAsXLnRMCfLxxx8rLi7Osf7dd991NNSv/cnt3j/XeHp6asKECY5R7Rs3btTXX3/tWH/tekSSvv/+e8c+Dxw4oHnz5mnHjh1asWJFjv1ef66WdZRz1vvs3Opbu1LeGsNGuP46w4hzz+rVqzt+/uc//5ntfV+8eLHWr1+vI0eO0DAH4DJomgMlwOOPP+6YCmTLli3q16+f1qxZo8jISO3atUvDhw/XtGnTJGXOhXejua6//fZbzZ49W+Hh4fr6668dU7NUq1ZNDRs2lJR9tPihQ4d06NChbHdkLwxZG6NLlixRRESE5s2bl+3rngU1PcutXJvz/dKlSxo8eLB2796tgwcP6vXXX3d8DbJnz54qVapUnvZ3rZ5xcXE6fPiwjh8/ftPtu3fv7piSZOrUqfr+++8VHh6upUuXOuZe9/HxUe/evfP92h599FHHhcDo0aP1888/Kzw8XHPmzNHkyZMlZc61/uCDD+b6/ISEBK1cuVJS5oilffv25bhQ+uOPP7LdyNKZG4Lm5z0ICQlRu3btJGXeIPTDDz9UeHi41q5dq8mTJ2vLli36/fffVbZs2Wy/ZytXrtSJEye0du1affDBB47lWX/P8vPeFeb7BgAAcI2Xl5feffddRxP1t99+0/Lly2/6nLffflt///vf9e9//1tfffWVIiIidPHiRUVFRWXb7/Xuvfdemc1mxw024+Li9NFHH91W/tDQ0Gzzdn/00Uc6e/asJKlbt26O86/Ro0dr8+bNOnXqlN5//3317t1bLVu2zNZkv9G5Wtb7wcyZM0fJycmKjo7WuHHjbiu7KzHi3LNevXqOJvzMmTO1dOlSnT59Wj/88IMef/xxdejQQYMHDy6w4wHA7XLNj0EBFChvb2/NmDFDgwYN0q5du7R79269/PLLObarWLGipk+fnm1u6axCQkI0evTobMvMZrNGjx7t+Hrhtfm9Jembb77RN998o/nz59/2fOc3061bN/3666+SpEmTJmnSpEk5tomOjs42+qSwDBw4ULt27dLmzZu1YcMGx00mr2nRooWGDRuW5/01aNBAJ06cUHJysh599FF16tRJn3766Q23L1OmjN5//30NHTpUycnJGjVqVLb1ZrNZEyZMUGhoaL5el5Q5IuW///2vxowZo9jYWL366qvZ1vv7++t///tfrnNaStJPP/3k+Frro48+mutchRUqVFDXrl31yy+/KDk5WT///LP69OmTr5z5fQ/eeust9e3bV7GxsZoxY4ZmzJjhWOfl5aW3335bHh4euueeezRp0iSlpqbql19+0S+//JLj2Flv4pSf964w3zcAAICs6tatq8GDBzs++B83bpw6dux4w3O44cOH65lnntHly5c1fvx4jR8/Ptv6Ro0aqWvXrjc83t13363OnTtrzZo1mjdvnvr06XNbI5h79eqlFStWaP369UpJSdHo0aP1ySefqGLFiho0aJAmTZqkQ4cO5bjxaOPGjdWzZ0/H4xudq91zzz0KDAxUQkKC1q9frxYtWshut6tChQoKDQ3N04hzV2fEuafJZNKbb76p559/XvHx8TkGagUFBWnQoEEFdjwAuF2MNAdKiHLlymn27Nl67733dM8996hs2bIym80KDAxU8+bN9e9//1vLli1T48aNb7iP0aNHa8CAAQoJCZGPj49at26tWbNmZbt5TO3atTVkyBBVrVpV3t7eqlmzZqG/tkceeURjxoxRnTp15OPjo4oVK+r+++/XV1995Zh6Y/Xq1YWeQ8r8gOLLL7/UmDFj1LJlSwUEBMjHx0cNGjTQsGHDNGvWrFynvrmRwYMH66677lKpUqUUGBiYbeTLjXTp0kU//PCDevfurSpVqshsNiskJEQPPvig5s+ff8OR4HnRt29fzZ07V3/5y19UoUIFmc1mVaxYUT179tSSJUvUqlWrGz4369QsWS9Yrpe1Se7MFC35fQ9q1qypxYsX64knnlDlypUdr6lr16767rvv1KlTJ8d2n3/+uVq2bKnSpUsrKChIrVq10meffeb4QCbr71l+37vCfN8AAACyev755x3fRL148WK2b85dr379+lqwYIGeeuop1axZU35+fvLx8VGdOnX08ssv65tvvrnljRuHDRsms9ksq9WqsWPH3nb+d955xzFP9++//+6YduXFF1/U1KlTdddddykwMFA+Pj6qWbOmXn75ZX399dfZbhJ/o3O1kJAQzZw5U23atJGfn5+CgoL02GOPacGCBQoODr7t7K7CiHPPNm3aaN68eXrwwQdVrlw5mc1mVa5cWY899pjmzZuXbQAWABjNZC+qSYcBFEuTJ0/WlClTJDl30xkAAAAAAACgOGGkOQAAAAAAAAAAV9E0BwAAAAAAAADgKprmAAAAAAAAAABcxZzmAAAAAAAA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njw5X+K4qmnTpgoJCdH8+fM1atSofN03AJQEFM0BAAAAAEC+ateunTw9PfXll1/mWDRfvny53Nzc1KFDh0KN67bbbrvuuqCgIAUFBeX7MZOSkjR79mxNnjxZNjZZP/Bft27dbONbtWql48ePa9myZeaieZUqVfI9rkcffVT33nuv+vXrp4CAgHzfPwAUZ7RnAQAAAAAA+crR0VF33nmn1q9fr/j4+CzrUlNTtXr1anXp0kXOzs6SpI0bN+ree+9V/fr11bhxY40ePVqnTp267v7T09P19ttv684771SdOnVUt25d9e3bV5s3b5aUObN7woQJkqQ2bdqYW7Jc257lv65tzzJ+/HgtX75cJ06cUFhYmJYtW6ZevXqpb9++2bYbNGiQBg8efN1Yv/jiCyUnJ6tVq1bXHfNfbm5uMplM5sf/bbeyceNG3X333YqIiFDDhg316KOP3nBW/M8//6xatWpp0qRJ5j7ttWvXVnBwsN57771cxwUApQVFcwAAAAAAkO969eql5ORkffPNN1mW//TTTzp//rz69OkjSVqxYoUeeOABlSlTRi+//LImTJig7du365577tG5c+dy3Pfs2bM1f/583XPPPXr33Xc1ZcoUxcbGatSoUUpMTFTLli316KOPSspsyTJs2LA8xT5s2DC1aNFC/v7+Wrx4sVq2bKnevXtr+/btOnLkiHncqVOntGXLFvXs2fO6+/ryyy/VsmVLOTg4ZFuXlpZm/kpJSdGZM2f0zjvvaOPGjerWrVuO+zt27JiGDRumWrVq6c0339TUqVN16NAhPfzww8rIyMg2/vfff9djjz2mrl276sUXX8xSjO/YsaO++uqrvKQGAEoF2rMAAAAAAIB8V7NmTdWoUUOrVq3K0st7xYoVCgsLU+3atZWRkaHZs2crMjJSc+bMMY+pV6+eOnfurIULF2rs2LHZ9n327Fk98cQTWWZfOzo6asSIEfr7779Vt25dlStXTpJUo0YNhYaG5in2cuXKycfHRw4ODuYWKnfeeadmzJihlStXauTIkZKklStXytXVVe3atctxP/Hx8frzzz/VqVOn6+bov4KDgzVixIjr3oR0165dSkpK0iOPPKLAwEBJma1lvv/+eyUkJGTp2b5r1y498sgj6tChg6ZOnZqlYC5lzjZfsGCBDhw4oMqVK984KQBQilA0BwAAAAAABaJXr16aNm2azpw5o8DAQMXGxurHH380F8IPHTqk6OhojR49Ost25cqVU0REhH777bcc93u1wH7+/HkdPHhQR44c0Y8//ihJSklJKZBzcXd3V/v27fXll1+ai+bLly9X586d5eTklOM2p06dUnp6+nWL9kuXLpUkJSYm6v3339eWLVv09NNPq02bNteNIzw8XI6Ojurdu7c6duyoO+64Q40bN1adOnWyjDt58qQeeughGYahZ599Nls/dUnmuI4fP07RHACuQXsWAAAAAABQILp27So7OzutWbNGkrR69WqZTCbdddddkqTY2FhJkp+fX7Zt/fz8dOnSpRz3++eff6p3795q2rSphgwZos8++8xcFL7as7sg9O7dW8eOHdMff/yh7du36/DhwzdszXI1fhcXlxzX165dW7Vr11ajRo00b9481axZU6NGjdIff/xx3X2Ghobq448/Vnh4uJYuXaohQ4aoefPmeuWVV7Kc+/Hjx1WrVi2lpqZq3rx5Oe7rak/56+UZAEoriuYAAAAAAKBAeHl5qW3btlq1apWkzHYm7dq1k5eXl3m9JMXExGTbNjo6Wt7e3tmWx8fHa8iQIXJxcdHq1au1bds2LV26NEsLmILSqFEjlStXTmvXrtXXX3+tSpUqmdu35ORq/HFxcTfdt42NjaZPny47OzuNHz9eycnJ1x1bp04dzZs3T1u2bNH777+v5s2ba8GCBVq7dq15TLVq1fTWW29p0KBB+vDDD/Xnn39m28/FixezxAkAyETRHAAAAAAAFJhevXrpr7/+0m+//aadO3eqd+/e5nUVK1aUv79/tptRHjt2TDt27FC9evWy7e/gwYOKjY3VwIEDVaVKFfMM859++kmSzDfDzKkdSV7ktL3JZFLPnj21bt06/fDDD+rRo8cN9xEYGChbW1udPn06V8cMCQnRsGHDdOzYMb3zzjs5jnn//ffVqlUrpaSkyMHBQU2bNtWUKVMkZbZkucrLy0t2dnYaPny4goKC9PTTTystLS3Lvs6cOSMps486AOBfFM0BAAAAAECBadasmYKDg/XMM88oNDRUTZs2Na+zsbHRk08+qV9++UWjR4/Whg0btGLFCg0ePFienp4aPHhwtv1VrFhRbm5uWrBggdavX69ffvlFzzzzjD799FNJmf3BJcnDw0OS9N133+nAgQN5jtvDw0MxMTHasGGDzp49a17e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uXjxojZs2KBZs2Zp9+7d2fqIX/2DUW64uLjk6T1fRESEhg4dau4fb2Njo5deeqlAWncCKNkomgNALl3b59CSgu5/ew3mJKcb0/y3kHv1o5755eqsjtxyd3fP8vhGsz2krHn775siKev55ce53SweKec8X++PBAAAAPlpy5YtOnr0qPnx1XZ3/7Vnzx7t2rXLfAPNVq1a6fvvv9eaNWv0888/a/v27Tp//ry+/vprff3113rwwQc1duxYSdLdd9+tyMhIrV69Whs3btTOnTvNPc2XL1+uZ599Vv3797f4uik3ru09vWPHjhzHfP/993rxxRfVunVr9erVSzVr1rzhNfPNriv/e516s/WWXp9fa8GCBXrllVckZRaShw0bpvDwcI0bN05nzpy56f6vp6hcY187o/ytt96SlDnZ5No/8Fxr37596t+/vy5evKjg4GB17dpVdevW1W+//abPPvssz8e35Br92j90ZGRk6LvvvtPDDz+c5/0AKN0omgNALlWoUEE///yzJGn37t3mmS8pKSm67777VKZMGbVq1eq6N/q5+hFXSfrss8/MN5pMS0vTX3/9pcqVK+dL4fbaC+iC8N8L+NDQUDk4OCglJUVbtmxRRkaG+cI8ISFBO3fulJQ5u+naGUd5ce0bgZud37U3k5o9e7a6du1qfrxr1y6VK1fOfOOrazH7BAAAFIZrbwB6M59//rnq1KmjpKQk/fPPPzp06JDq1aun++67T4Zh6MCBAxo9erSioqL0ySefaPTo0UpMTDSP7dChgx566CGlp6drz549Gj58uM6cOaMPP/xQ/fv3t/i6Scp5lvi1qlWrpho1amjv3r3auHGjdu/ebb75ppQ523jRokXmm9tHRESoZs2aqly5snnMpk2bzL2wJenXX381f3+1T/e1blZo/u/6W70+T0pK0htvvCEps9f81f7iaWlpunz5crbxebmmLYxr7NwIDg5W2bJldezYMXPbnOv1M5ekd99919ySZvHixQoICJCU2ev8v3KTj7xeo3/66af68ccfzfs3DEOvvfaamjVrluX5BwA3Q09zAMVWTEyMTp8+fd2v/HZtn+sXXnhBv/76qw4cOKDnn39eO3fu1Nq1a5WSknLd7du3b2/uL/nCCy9o8+bNOnLkiGbPnq27775b9evX14cffmhxfFf3HRsbq6ioKPPNUAuam5ub+Uad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+2tb133NeU1RQYbzzyzHfc3sV6LPQlaa429U6EGgmzZt0sGDB9WoUSPFxsbq0ksvray4AAAAgGpn3759+t///qfu3bsrMNBRtJwwYYKKi4v1ySefqLCwUM8//7yeffZZvfjii9q3b59GjRqlp59+Wl27dtWePXs0evRozZkzR3feeee/juf777/XZ599prffflt16tTRa6+9pnHjxunzzz9XUlKSBg4cqKSkJLVs2VLz58/XzJkzNXnyZEVHR2vFihWKj4/X5Zdfrquvvlrbt2/X+vXr9dZbb0lyFOM3b96sd955R76+vnrttdc0atQozZw5s9zxNYgKUXCwz78eZ021e5ef9uyQwsODFNMqQpKU8oe3ioulFs2C5eN76iGeqfsMHc+WvL291aRxLR05HKadKVJggKGYVhHa8FuxTCYfVz/FJ4J05JAUUfvUsXNZSMNQT4fgcfY0x8f7sBB/nefMx2pvs4okNa3jJ9+AUw+7SzbbJDnmW3Rdsw7WDdEGSf5mm85rGKol1mKZvH1c/WTVCtReSeGBXq5j57K6EYGeDsGjsv0MSVJooL8aO3Ph421WgaT6wWb5B53Kj7esjj+9vVU/zF/1wp3tDYsaRwSq8eV9JElZaamOdiYvV5+QvJqEeToEj/LK9VGKpLDQQLV05mKDt7eKCqSmDQLk63fqvrbrF8c35ry9vdUoKkSH6ofqD0n+PlLLJmH62VYsk9nH1U/e/kAdkBQRYnYdO5dt28MvD/6qXEXz48eP695779WGDRtkt9tlGIbat2+vV199VfXr16/sGAEAAACPmDhxop577jlJksVikbe3t3r16qXx48dLchTRf/jhB61evVrBwY4Pbs8995z69++vcePGyWaz6cknn9RNN90kSWrYsKG6du3qWg1eHu3bty917N5779V9992ngwcPytvbW1FRUYqKitJTTz2lXbscXzM+udIqPDxcfn5+ql+/viZNmqQuXbpIkm699Va9/fbb2r59u2JjYxUQECBvb29FRkaqoKBAs2bN0ty5c10rzxMTE3XxxRcrJSXFdex05n8+SCaTW19uPSskJRm66ae31evyppo2zTEHon54WPl50qyZg+Tn5+dqe801M7VgwWZZrVa9+FxvLVok/fi9FNetuT7+8CZ9OfdO2Ww2ffyho5/x4zdo8ybpnmFddN99N3lkfKhekpKOaskcqXu7+po29nJJ0v+9YVJuljRtXO8S823/8vpK3bleVqtVE4ZerEVRmfr6HemSttGaPvZyffSsn2w2m6Y7+xmf/b3WLZYGX9tW9913uSeGh2okyWu75k+VOjQL0zM3XyhJeucRQ9mSnr2tc4m5tubDCO35Q7Jarbqvdys10159JKl9i3quayVpz55aevMhqU6oX4nj57xzfAfkpKQcrfha6tG5gaZN6itJ+namSXnHpfcmXVfyv6Ob3tKhvRtltVoVP7KrFrXK1befSF07NNaMSX312ZuO+9oMZz/jxy/Xhp+kOwe213339fXI+KqTuFs/8XQI1U65iuavv/66tmzZopEjR6pNmzbatWuXpk+frqefflrvvMOTZgEAAHB2euihh9S7d2/l5eXprbfe0sGDB/XYY48pLMyxImnnzp2y2WylvoFps9m0d+9etWnTRj4+Ppo2bZq2b9+u7du3a8eOHbr++uvLHcP8+fNLHQsNdaz0vOaaazRr1iz16tVLF154oa644grdeOONZfZzySWXaOPGjXr11Ve1c+dObd26Venp6bLZbKXa7t+/X8XFxbrllltKjWvPnj3lLpr3v/Hjc3qledoRx/6+CxZu1KDBc2S325WWdkw+vsG6657/K9E2OcXxwNbMzEyNf2qRli1bIEna+HueBg2eIy+vYOXnH9HNt82SyeSj31atkSR9Mme3lv88pwpHVT2FxEZ6OgSPO7TbsVL3+59TdF/CEtntdqUfzZBfQIgefqPkQxZ3pjlWZGZmZuqFD37TkkWOB81uTbXpvoQlMvuF6njGIQ17/juZvX204sfNkqQvf83QhuwlVTiq6qnuOb4qde9WxzM9VmzcpYmfORZXph/LlH9wLU36MrlE29R8b0mOuTZ9UYp++Ga9o49cH038bIOr3cmV5mnZJ0ocP9ft33DY0yF41OH9jmeAfLdsi+4a963jv6PpGfL1D9EDzywt0Xb7AYskx1yLf+tnLV3suFdt3l2su8Z9K5NPiPKzDmvw4/8ns9lHP3+3UZI0d/ERrd77bdUNCjVGuYrmS5Ys0aOPPqohQ4ZIki699FLVrVtXo0ePVn5+vgICAio1SAAAAMATateurcaNG0uS3njjDd1444164IEH9Nlnn8nb21tWq1XBwcGaO3duqWvr1q2r5ORk3XrrrerZs6c6duyooUOHVmh7E0mu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8nAzR2mZqidRvJA7Sz5s/MiZ5vJovT8bZe0QMhR3v1K8eGDDP840l4drb/xu7RD+U7Swj4iIiIiIiIiIiIhIIhXNRUREREREREREREQSqWguIiIiIiIiIiIiIpJIRXMRERERERERERERkUQqmouIiIiIiIiIiIiIJFLRXEREREREREREREQkkYrmIiIiIiIiIiIiIiKJVDQXEREREREREREREUmkormIiIiIiIiIiIiISCIVzUVEREREREREREREEqloLiIiIiIiIiIiIiKSSEVzEREREREREREREZFEKpqLiIiIiIiIiIiIiCRS0VxEREREREREREREJJGK5iIiIiIiIiIiIiIiiVQ0FxERERERERERERFJpKK5iIiIiIiIiIiIiEgiFc1FRERERERERERERBKpaC4iIiIiIiIiIiIikkhFcxERERERERERERGRRCqai4iIiIiIiIiIiIgkUtFcRERERERERERERCSRiuYiIiIiIiIiIiIiIolUNBcRERERERERERERSWRr7QAyI5ugWzicPgUxsWC2Ic4jO9E+JcGsH4eIiIiIiIiIiIiINalK+xTZXr6I45GD2ISEgI0JTCYA7C6cx+H4UWLzFSCyanWwMVs5UhEREREREREREZHMSUXzp8T+95M4HPgNEwaY/7IqjtkGU2wMduf+wCY0mPCGTTTrXERERERERERERMQKrL6meVRUFMOGDaNSpUrUqlWLJUuWPLLtiRMnaNOmDb6+vrRq1Ypjx45Z9hmGwaxZs6hTpw6VK1fmnXfeITg4+Gl04R+Zr1/D4cDehIL537ExYw6+Q5ad259OYCIiIiIiIiIiIiKSjNWL5pMmTeLYsWMsW7aMkSNHMnv2bDZv3pyiXUREBD179qRSpUqsX78ePz8/evXqRUREBABr1qxh7dq1TJkyhVWrVnHr1i2GDx/+tLvzUA7Hj2B63MY2Ntheu4rp/r30DElEREREREREREREHsKqRfOIiAgCAwMZPnw4pUuXpkGDBnTv3p1Vq1alaLtp0yYcHBwICAigaNGiDB8+nKxZs1oK7D/++CNNmjShSpUqFC9enO7du/Prr78+7S6lYIoIxzbo5hM+CRyPHEqXeERERERERERERETk0axaND916hSxsbH4+flZtlWsWJHDhw8THx+frO3hw4epWLEipsSbZ5pMJipUqMChQ4cAcHNzY8eOHdy8eZMHDx7wzTffULJkyafWl0exO38O/tKXf2QyYRN8O30CEhEREREREREREZFHsurdJoOCgnB3d8fe3t6yzdPTk6ioKEJDQ/Hw8EjW1tvbO9nzs2fPzunTpwHo06cPb775JnXq1MFsNpMjRw7WrFnzxDGZHnsdlcdjExVpKfQ/0fPi4v42lqR9aR1vZqDcpY7ylnrKXeoob6mn3KWO8pZ6yp2IiIiIiDxLrFo0j4yMTFYwByyPo6OjH6ttUrurV6/i6OjI/PnzyZYtG5MmTWLYsGF/e2PRv7K3N6emG3/LJotTwnrmT/gp0mRvh53do+MxmcBsNmMygfEP9xeV5JS71FHeUk+5Sx3lLfWUu9RR3lJPuRMRERERkWeJVYvmDg4OKYrjSY8dHR0fq62joyOGYTB48GACAgKoV68eANOnT6devXocPnwYX1/fx4onOvrvZ3enRmz+Qtge2I/pST5BGgYxLq7ExMQ9sknSh9LY2Dh9OH1Cyl3qKG+pp9yljvKWespd6ihvqafciYiIiIjIs8SqRfNcuXIREhJCbGwstrYJoQQFBeHo6Ei2bNlStL19O/k637dv3yZnzpwEBwdz/fp1fHx8LPvy5MmDu7s7V69efeyiOaT97CgjqwuxnjmxvRP0BE8yiCrj+1ixGIZmdKWWcpc6ylvqKXepo7ylnnKXOspb6il3IiIiIiLyLLDqjUBLliyJra2t5WaeAPv376ds2bLY2CQPzdfXl4MHD2IkfhIzDIMDBw7g6+uLq6sr9vb2nD171tI+ODiY0NBQ8uXL91T68neiS5V5/E+Q8fHE5cpNvJt7+gYlIiIiIiIiIiIiIilYtWju5OREixYtGDVqFEeOHGHr1q0sWbKETp06AQmzzh88eABA48aNuXv3LuPGjePMmTOMGzeOyMhIXnzxRWxtbXnllVeYOHEiv/32G3/88QeDBg3C19eXsmXLWrOLAMTmK8CDsuX/uXAeH098NlfC6z7/VOISERERERERERERkeSsWjQHGDp0KKVLl6Zz586MHj2avn370rBhQwBq1arFpk2bAHB2dmbBggXs37+fV155hcOHD7Nw4UKyZMkCwLBhw2jYsCEDBw6kY8eOZMuWjblz52JK60XKUym6bHkiq1QnPktWiPvLWuXx8RgmG2LzFeD+i83Azv7hBxERERERERERERGRdGXVNc0hYbb5xIkTmThxYop9v//+e7LH5cqVY8OGDQ89joODA4MHD2bw4MHpEmdaiPH2IaZocWwvX8Lu/BlMsTFgYybe1Y2o0uUwHBysHaKIiIiIiIiIiIhIpmb1onmmYzIRW6AgsQUKWjsSEREREREREREREfkLqy/PIiIiIiIiIiIiIiLyX6GiuYiIiIiIiIiIiIhIIhXNRUREREREREREREQSqWguIiIiIiIiIiIiIpJIRXMRERERERERERERkUQqmouIiIiIiIiIiIiIJFLRXEREREREREREREQkkYrmIiIiIiIiIiIiIiKJVDQXEREREREREREREUmkormIiIiIiIiIiIiISCIVzUVEREREREREREREEqloLiIiIiIiIiIiIiKSSEVzEREREREREREREZFEKpqLiIiIiIiIiIiIiCQyGYZhWDsIEREREREREREREZH/As00FxERERERERERERFJpKK5iIiIiIiIiIiIiEgiFc1FRERERERERERERBKpaC4iIiIiIiIiIiIikkhFcxERERERERERERGRRCqai4iIiIiIiIiIiIgkUtFcRERERERERERERCSRiuYiIiIiIiIiIiIiIolUNBcRERERERERERERSaSiuYiIiIiIiIiIiIhIIhXNrSwqKophw4ZRqVIlatWqxZIlSx7Z9sSJE7Rp0wZfX19atWrFsWPHLPsMw2DhwoXUr1+fChUq0LlzZ86cOZPsuT4+Psn+vPLKK+nat/SUVnkDqFSpUorchIeHP/HrZBRplbu/5izpzxdffAHA999/n2Jfv3790rt76SY158K+fft4/vnnU2zfuHEjL7zwAr6+vvTp04fg4GDLPsMwmDJlCtWqVaNKlSpMmjSJ+Pj4NO3L05RWectsYxyk7TmXmca5tMpbZhvj4Mlyt2PHDl5++WX8/Pxo1qwZ27ZtS7Y/M41zIiIiIiLyDDLEqsaMGWM0a9bMOHbsmLFlyxbDz8/P+Pbbb1O0Cw8PN2rWrGlMmDDBOHPmjDF27FijRo0aRnh4uGEYhvHpp58aVatWNX744Qfj3LlzxrBhw4znnnvOiIiIMAzDML788kvj5ZdfNm7dumX5Exwc/FT7mpbSKm83btwwihcvbly6dClZbuLj45/odTKStMrdn/N169YtY9KkSUa9evWMu3fvGoZhGHPnzjV69eqVrE1YWNhT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Hw4ODrz33nucO3eOH3/80fJNbEb0JHn7J6+99hpffvklgYGBnDp1ioCAAJ577jny589v2T9lyhT27NnDnj17mDp1aoY959Iyb5lpjIO0y11mG+fS8pyDzDPGwZPlbsGCBVy6dImJEyda9gUFBXHv3j0gc41zIukl6aoPPz8/vLy8+OKLL5g7dy5FixZlxYoVfPPNN0yfPh0/Pz8Ajh49SmxsLHFxcdYMWzKYVatW8dFHHwFgNpsJDg7mgw8+4P79++TPn5+3336bli1bMnbsWObPn0/v3r0pXrw4WbJk0ZJaku5y5cpF2bJluXjxIl5eXparaiZOnEitWrX49ddf2b17N7/88gsLFy7k5s2blC1b1spRy7MgaeLgmTNnOHToEDt27MDe3p7169fTrl07xo4dyyeffELPnj0pVaoUhQoVskym0Zr6zxhDrCoiIsIICAgwypcvb9SqVctYunSpZV/x4sWNdevWWR4fPnzYaNGihVG2bFmjdevWxvHjxw3DMIxbt24ZxYsXf+ifpOdfu3bN6NOnj1GpUiWjSpUqxtixY42oqKin2te0lBZ5MwzDePDggfHhhx8aNWvWNHx9fY1evXoZ165de6zXyajSKneGYRjvv/++0b9//4e+zh9//GF06dLFKF++vFGzZk1j1qxZRnx8fLr06Wl4krwlWbdunVGvXr2Hbq9bt65Rvnx5o0+fPkZwcLBlX2xsrDF+/HijUqVKRtWqVY3Jkydn+rxlxjHOMNLunMts41xa/q5mpjHOMB4/d40aNXro7+PgwYMt7TPTOCeSXjZv3mxUqVLFGDFihNGpUyejZs2axocffmicOXPGMAzDmDlzptGlSxejQ4cORpUqVVK8TxP5Ow8ePDAWLFhg1K5d21iwYIFle5MmTYwvvvgiWdt79+4ZO3bsML755htj+vTpRuXKlY1z58497ZAlk/jze4JLly4Z27dvN+bOnWu88sorlvcmERERRt++fY2GDRsaDRo0MF5++WWNgfKv/fnc++6774yaNWsaHTp0MGrWrGl069bN2Lx5s2EYCWPihg0bjJ07dxoffvihUalSJY2JzyiTYehrEBERERERkf+KqKgo3n77bcqUKcNbb70FwJdffsk333xD0aJF6dWrF7du3eL777/Hzs6Ohg0bWm4WKvK4QkJC+Oabb1iyZAmtWrWiT58+9OjRgxdeeIF27dpZ2h07dox58+Zx4cIFsmbNyujRoylZsqQVI5dnlWEYmEwmjh07xu+//07JkiUpVaoUd+7cYcWKFezcuZPmzZvTpUsXIGEJOMMwcHJywt3d3brBS4Z169atZMsEnj9/nk6dOvHWW2/Rrl079u/fj7+/Px9++CENGjQgPDyct99+m4iICBwcHBg7diwlSpSwYg8kvdhaOwARERERERH5v7i4OC5evEiZMmUs215++WVsbW2ZMGEC8fHxdO3alT59+lgxSsmokgqT7u7uNG/enLi4OJYsWYLZbMbT05Pp06dz4cIFcubMSdOmTSlTpgyjRo0iS5YsxMXFZcibhct/X9J5+d133zFs2DDc3d0JCgri7bffpn379nTq1AkbGxs2btxIREQErq6u+Pn5UapUKWuHLhnYJ598wo0bN+jfvz/29vaYTCZu3bqFu7s77dq14+rVqwwZMoS2bdtSuXJlVq5cSc+ePVmxYgXh4eHY2tri7Oxs7W5IOtGa5iIiIiIiIlb014t/s2TJwnPPPceRI0e4dOmSZXvTpk0pVKgQX375JWvXriU6Olrrp0qq3b9/H1tbW15++WV69OjB119/zYYNG6hcuTJnz55l1apVtGzZksqVK7Ns2TKyZMmigrmkG5PJxMGDB3nvvfcYOHAgW7dupXPnzixcuJDPPvuMrFmz0qFDB+rUqcNXX33F2LFjsbXVPFD5d7y8vGjXrh0ODg6Eh4cDkD17dtzc3Pjpp5/w9/enRo0ajBkzBjs7O+bOncvWrVuxs7PDzc1NBfNnnEYYERERERERK0maXXngwAFOnDhB7ty5qVatGo0aNWLChAl89tlnvPrqqxQoUABI+IBfpEgR2rRpg729vZWjl4wm6XzbunUry5Yt4+LFi3Ts2JHatWtjMpmYPn06hQsXpn///gD8/PPPnD9/nqpVq2IymawcvTxLgoODsbW1TfZFzIEDB6hevTrt27cnNDSUAwcOkD9/fhYtWkRMTAydO3emX79+tG7dGltb22RLaog8iatXr5I3b14aNmwIJJx7X375Ja+99hr58uUjMjKSHj160KJFC0aPHg2AnZ0d3t7eeHh4WDN0eYpUNBcREREREbGSpOUIBg0aRM6cOTGZTJQtW5YPPviALl268Mknn3Do0CF8fHyIiIhg586drF27lly5clk7dMmATCYT+/btY9Cg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TNy7d48DBw7wyiuvACS7csHGJmHu7tGjR6lYsSLFixdn1KhRuLq6Ym9vz6JFi8ifP7/V4hf5MxXNRUREREREREQyKW9vb5YtW4adnZ0K5vKvubq64urqyvnz56lbt+5Dr1zIli0bAwYM4Pvvv6dp06bY2dlhY2Ojm87Kf4qWZxERERERERERycSKFi1KgQIFrB2GZHCGYRAdHU2+fPnYvXs39+7de2i7cuXK4enpye+//06uXLnw8PBQwVz+c1Q0FxERERERERERkX/FZDLh4OBA7969+fnnn/n444+T7Y+PjwcgJCQEDw8PPDw8rBGmyGNR0VxERERERERERETSRLly5Xj//fdZtGgREyZM4ObNm8D/1zQPDAzEMAwKFixozTBF/pbWNBcREREREREREZE007p1axwcHBg5ciRHjhyhZMmSuLq6cvnyZXbt2sXSpUvJnj27tcMUeSSTYRiGtYMQERERERERERGRZ8vZs2cJDAzk6NGj2NjY4OPjQ/v27SlSpIi1QxP5Wyqai4iIiIiIiIiISLozDAOTyWTtMET+kdY0FxERERERERERkXSh+bqSEWmmuYiIiIiIiIiIiIhIIs00FxERERERERERERFJpKK5iIiIiIiIiIiIiEgiFc1FRERERERERERERBKpaC4iIiIiIiIiIiIikkhFcxERERERERERERGRRCqai4iIiIiIiIiIiIgkUtFcRERERERERERERCSRiuYiIiIiIiIiIiIiIolUNBcRERERERERERERSaSiuYiIiIiIiIiIiIhIov8BOub7F+bhVOIAAAAASUVORK5CYII="/>
</div>
</div>
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain" tabindex="0">
<pre>📊 Portfolio Optimization Results:
Asset Weight (%) Expected Return (%) Volatility (%)
Bonds 30.0 8.0 2.0
Stocks 20.0 12.0 15.0
Real Estate 30.0 10.0 8.0
Commodities 20.0 15.0 20.0
🎯 Portfolio Expected Return: 10.8%
📉 Portfolio Risk: 5.6%
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
<h2 id="%F0%9F%8F%A2-Equity-Portfolio-Optimization">🏢 Equity Portfolio Optimization<a class="anchor-link" href="#%F0%9F%8F%A2-Equity-Portfolio-Optimization">¶</a></h2><h3 id="Mathematical-Theory:-Equity-Portfolio-with-Sector-Constraints">Mathematical Theory: Equity Portfolio with Sector Constraints<a class="anchor-link" href="#Mathematical-Theory:-Equity-Portfolio-with-Sector-Constraints">¶</a></h3><p>For equity portfolios, we often need to consider:</p>
<ul>
<li><strong>Sector diversification</strong>: Limit exposure to specific sectors</li>
<li><strong>Market cap constraints</strong>: Balance between large, mid, and small cap stocks</li>
<li><strong>ESG constraints</strong>: Environmental, Social, and Governance factors</li>
<li><strong>Liquidity constraints</strong>: Minimum trading volume requirements</li>
</ul>
<p><strong>Mathematical Formulation:</strong></p>
<pre><code>Minimize: w^T Σ w - λ μ^T w
Subject to:
Σ w_i = 1 (weights sum to 1)
w_i ≥ 0 (no short selling)
Σ_{i∈S_j} w_i ≤ s_j (sector limits)
Σ_{i∈L} w_i ≥ l_min (large cap minimum)
Σ_{i∈M} w_i ≥ m_min (mid cap minimum)
Σ_{i∈S} w_i ≥ s_min (small cap minimum)
w_i ≤ w_max (individual position limits)
</code></pre>
<p>Where:</p>
<ul>
<li>S_j = set of stocks in sector j</li>
<li>s_j = maximum allocation to sector j</li>
<li>L, M, S = large, mid, small cap stocks</li>
<li>l_min, m_min, s_min = minimum allocations</li>
</ul>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [36]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="cm-editor cm-s-jupyter">
<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># Equity Portfolio Optimization Example</span>
<span class="k">def</span><span class="w"> </span><span class="nf">create_equity_portfolio_data</span><span class="p">():</span>
<span class="w"> </span><span class="sd">"""Create sample equity portfolio data with sectors and market caps"""</span>
<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<span class="c1"># Define sectors and market caps</span>
<span class="n">sectors</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Technology'</span><span class="p">,</span> <span class="s1">'Healthcare'</span><span class="p">,</span> <span class="s1">'Financial'</span><span class="p">,</span> <span class="s1">'Consumer'</span><span class="p">,</span> <span class="s1">'Industrial'</span><span class="p">,</span> <span class="s1">'Energy'</span><span class="p">]</span>
<span class="n">market_caps</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Large'</span><span class="p">,</span> <span class="s1">'Mid'</span><span class="p">,</span> <span class="s1">'Small'</span><span class="p">]</span>
<span class="c1"># Create 30 stocks with different characteristics</span>
<span class="n">stocks</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">30</span><span class="p">):</span>
<span class="n">sector</span> <span class="o">=</span> <span class="n">sectors</span><span class="p">[</span><span class="n">i</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">sectors</span><span class="p">)]</span>
<span class="n">market_cap</span> <span class="o">=</span> <span class="n">market_caps</span><span class="p">[</span><span class="n">i</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">market_caps</span><span class="p">)]</span>
<span class="c1"># Generate returns and volatility based on sector and market cap</span>
<span class="n">base_return</span> <span class="o">=</span> <span class="mf">0.08</span> <span class="o">+</span> <span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="mi">3</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.02</span> <span class="c1"># 8-12% base return</span>
<span class="n">base_vol</span> <span class="o">=</span> <span class="mf">0.15</span> <span class="o">+</span> <span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="mi">3</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.05</span> <span class="c1"># 15-25% volatility</span>
<span class="c1"># Add sector-specific adjustments</span>
<span class="k">if</span> <span class="n">sector</span> <span class="o">==</span> <span class="s1">'Technology'</span><span class="p">:</span>
<span class="n">base_return</span> <span class="o">+=</span> <span class="mf">0.02</span>
<span class="n">base_vol</span> <span class="o">+=</span> <span class="mf">0.03</span>
<span class="k">elif</span> <span class="n">sector</span> <span class="o">==</span> <span class="s1">'Healthcare'</span><span class="p">:</span>
<span class="n">base_return</span> <span class="o">+=</span> <span class="mf">0.01</span>
<span class="n">base_vol</span> <span class="o">+=</span> <span class="mf">0.02</span>
<span class="k">elif</span> <span class="n">sector</span> <span class="o">==</span> <span class="s1">'Energy'</span><span class="p">:</span>
<span class="n">base_return</span> <span class="o">+=</span> <span class="mf">0.03</span>
<span class="n">base_vol</span> <span class="o">+=</span> <span class="mf">0.05</span>
<span class="n">stocks</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
<span class="s1">'Symbol'</span><span class="p">:</span> <span class="sa">f</span><span class="s1">'STOCK_</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">:</span><span class="s1">02d</span><span class="si">}</span><span class="s1">'</span><span class="p">,</span>
<span class="s1">'Sector'</span><span class="p">:</span> <span class="n">sector</span><span class="p">,</span>
<span class="s1">'MarketCap'</span><span class="p">:</span> <span class="n">market_cap</span><span class="p">,</span>
<span class="s1">'ExpectedReturn'</span><span class="p">:</span> <span class="n">base_return</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">normal</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">),</span>
<span class="s1">'Volatility'</span><span class="p">:</span> <span class="nb">max</span><span class="p">(</span><span class="mf">0.1</span><span class="p">,</span> <span class="n">base_vol</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">normal</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.02</span><span class="p">)),</span>
<span class="s1">'ESG_Score'</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">60</span><span class="p">,</span> <span class="mi">95</span><span class="p">),</span>
<span class="s1">'Liquidity'</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">)</span> <span class="c1"># Daily volume ratio</span>
<span class="p">})</span>
<span class="k">return</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">stocks</span><span class="p">)</span>
<span class="c1"># Create equity data</span>
<span class="n">equity_data</span> <span class="o">=</span> <span class="n">create_equity_portfolio_data</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"📈 Equity Portfolio Data:"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">equity_data</span><span class="o">.</span><span class="n">head</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain" tabindex="0">
<pre>📈 Equity Portfolio Data:
Symbol Sector MarketCap ExpectedReturn Volatility ESG_Score \
0 STOCK_01 Technology Large 0.104967 0.177235 85.619788
1 STOCK_02 Healthcare Mid 0.107658 0.215317 62.032926
2 STOCK_03 Financial Small 0.135792 0.265349 60.720457
3 STOCK_04 Consumer Large 0.075305 0.160851 66.363874
4 STOCK_05 Industrial Mid 0.102420 0.161734 75.118076
5 STOCK_06 Energy Small 0.139872 0.306285 70.225063
6 STOCK_07 Technology Large 0.114656 0.175484 66.988582
7 STOCK_08 Healthcare Mid 0.104556 0.222218 81.264070
8 STOCK_09 Financial Small 0.113994 0.244166 83.948156
9 STOCK_10 Consumer Large 0.079865 0.128846 61.203598
Liquidity
0 1.397988
1 1.799264
2 1.954865
3 0.775107
4 0.936844
5 1.049543
6 1.271352
7 0.755786
8 1.160229
9 1.863981
</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [37]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="cm-editor cm-s-jupyter">
<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># Generate correlation matrix for equity portfolio</span>
<span class="k">def</span><span class="w"> </span><span class="nf">generate_equity_correlation_matrix</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
<span class="w"> </span><span class="sd">"""Generate realistic correlation matrix for equity portfolio"""</span>
<span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<span class="c1"># Create base correlation matrix</span>
<span class="n">corr_matrix</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">eye</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
<span class="c1"># Add sector-based correlations</span>
<span class="k">for</span> <span class="n">sector</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="s1">'Sector'</span><span class="p">]</span><span class="o">.</span><span class="n">unique</span><span class="p">():</span>
<span class="n">sector_indices</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">data</span><span class="p">[</span><span class="s1">'Sector'</span><span class="p">]</span> <span class="o">==</span> <span class="n">sector</span><span class="p">]</span><span class="o">.</span><span class="n">index</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sector_indices</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
<span class="c1"># Higher correlation within sectors</span>
<span class="n">sector_corr</span> <span class="o">=</span> <span class="mf">0.3</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">sector_indices</span><span class="p">:</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">sector_indices</span><span class="p">:</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">!=</span> <span class="n">j</span><span class="p">:</span>
<span class="n">corr_matrix</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">sector_corr</span>
<span class="c1"># Add market cap correlations</span>
<span class="k">for</span> <span class="n">cap</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="s1">'MarketCap'</span><span class="p">]</span><span class="o">.</span><span class="n">unique</span><span class="p">():</span>
<span class="n">cap_indices</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">data</span><span class="p">[</span><span class="s1">'MarketCap'</span><span class="p">]</span> <span class="o">==</span> <span class="n">cap</span><span class="p">]</span><span class="o">.</span><span class="n">index</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">cap_indices</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
<span class="n">cap_corr</span> <span class="o">=</span> <span class="mf">0.2</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">cap_indices</span><span class="p">:</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">cap_indices</span><span class="p">:</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">!=</span> <span class="n">j</span> <span class="ow">and</span> <span class="n">corr_matrix</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o"><</span> <span class="n">cap_corr</span><span class="p">:</span>
<span class="n">corr_matrix</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">cap_corr</span>
<span class="c1"># Make symmetric and ensure positive definite</span>
<span class="n">corr_matrix</span> <span class="o">=</span> <span class="p">(</span><span class="n">corr_matrix</span> <span class="o">+</span> <span class="n">corr_matrix</span><span class="o">.</span><span class="n">T</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>
<span class="n">corr_matrix</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">maximum</span><span class="p">(</span><span class="n">corr_matrix</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">)</span> <span class="c1"># Minimum correlation</span>
<span class="c1"># Convert to covariance matrix</span>
<span class="n">vols</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s1">'Volatility'</span><span class="p">]</span><span class="o">.</span><span class="n">values</span>
<span class="n">cov_matrix</span> <span class="o">=</span> <span class="n">corr_matrix</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">outer</span><span class="p">(</span><span class="n">vols</span><span class="p">,</span> <span class="n">vols</span><span class="p">)</span>
<span class="k">return</span> <span class="n">cov_matrix</span>
<span class="c1"># Generate covariance matrix</span>
<span class="n">equity_cov_matrix</span> <span class="o">=</span> <span class="n">generate_equity_correlation_matrix</span><span class="p">(</span><span class="n">equity_data</span><span class="p">)</span>
<span class="n">equity_returns</span> <span class="o">=</span> <span class="n">equity_data</span><span class="p">[</span><span class="s1">'ExpectedReturn'</span><span class="p">]</span><span class="o">.</span><span class="n">values</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"📊 Equity Portfolio Statistics:"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Number of stocks: </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">equity_data</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Average return: </span><span class="si">{</span><span class="n">equity_returns</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span><span class="si">:</span><span class="s2">.1%</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Average volatility: </span><span class="si">{</span><span class="n">equity_data</span><span class="p">[</span><span class="s1">'Volatility'</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span><span class="si">:</span><span class="s2">.1%</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Average ESG score: </span><span class="si">{</span><span class="n">equity_data</span><span class="p">[</span><span class="s1">'ESG_Score'</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span><span class="si">:</span><span class="s2">.1f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain" tabindex="0">
<pre>📊 Equity Portfolio Statistics:
Number of stocks: 30
Average return: 11.0%
Average volatility: 21.8%
Average ESG score: 75.1
</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [38]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="cm-editor cm-s-jupyter">
<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># Equity Portfolio Optimization with Constraints</span>
<span class="k">def</span><span class="w"> </span><span class="nf">optimize_equity_portfolio</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">cov_matrix</span><span class="p">,</span> <span class="n">returns</span><span class="p">,</span> <span class="n">risk_aversion</span><span class="o">=</span><span class="mf">1.0</span><span class="p">):</span>
<span class="w"> </span><span class="sd">"""Optimize equity portfolio with sector and market cap constraints"""</span>
<span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="c1"># Create CVXPY variables</span>
<span class="n">weights</span> <span class="o">=</span> <span class="n">cp</span><span class="o">.</span><span class="n">Variable</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
<span class="c1"># Expected return and risk</span>
<span class="n">expected_return</span> <span class="o">=</span> <span class="n">returns</span> <span class="o">@</span> <span class="n">weights</span>
<span class="n">risk</span> <span class="o">=</span> <span class="n">cp</span><span class="o">.</span><span class="n">quad_form</span><span class="p">(</span><span class="n">weights</span><span class="p">,</span> <span class="n">cov_matrix</span><span class="p">)</span>
<span class="c1"># Objective: maximize return - risk_aversion * risk</span>
<span class="n">objective</span> <span class="o">=</span> <span class="n">cp</span><span class="o">.</span><span class="n">Maximize</span><span class="p">(</span><span class="n">expected_return</span> <span class="o">-</span> <span class="n">risk_aversion</span> <span class="o">*</span> <span class="n">risk</span><span class="p">)</span>
<span class="c1"># Constraints</span>
<span class="n">constraints</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">cp</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">weights</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">,</span> <span class="c1"># Weights sum to 1</span>
<span class="n">weights</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">,</span> <span class="c1"># No short selling</span>
<span class="n">weights</span> <span class="o"><=</span> <span class="mf">0.1</span> <span class="c1"># Max 10% per stock</span>
<span class="p">]</span>
<span class="c1"># Sector constraints (max 25% per sector)</span>
<span class="k">for</span> <span class="n">sector</span> <span class="ow">in</span> <span class="n">data</span><span class="p">[</span><span class="s1">'Sector'</span><span class="p">]</span><span class="o">.</span><span class="n">unique</span><span class="p">():</span>
<span class="n">sector_indices</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">data</span><span class="p">[</span><span class="s1">'Sector'</span><span class="p">]</span> <span class="o">==</span> <span class="n">sector</span><span class="p">]</span><span class="o">.</span><span class="n">index</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sector_indices</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="n">constraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cp</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">weights</span><span class="p">[</span><span class="n">sector_indices</span><span class="p">])</span> <span class="o"><=</span> <span class="mf">0.25</span><span class="p">)</span>
<span class="c1"># Market cap constraints</span>
<span class="n">large_cap_indices</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">data</span><span class="p">[</span><span class="s1">'MarketCap'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'Large'</span><span class="p">]</span><span class="o">.</span><span class="n">index</span>
<span class="n">mid_cap_indices</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">data</span><span class="p">[</span><span class="s1">'MarketCap'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'Mid'</span><span class="p">]</span><span class="o">.</span><span class="n">index</span>
<span class="n">small_cap_indices</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">data</span><span class="p">[</span><span class="s1">'MarketCap'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'Small'</span><span class="p">]</span><span class="o">.</span><span class="n">index</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">large_cap_indices</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="n">constraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cp</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">weights</span><span class="p">[</span><span class="n">large_cap_indices</span><span class="p">])</span> <span class="o">>=</span> <span class="mf">0.3</span><span class="p">)</span> <span class="c1"># Min 30% large cap</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">mid_cap_indices</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="n">constraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cp</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">weights</span><span class="p">[</span><span class="n">mid_cap_indices</span><span class="p">])</span> <span class="o">>=</span> <span class="mf">0.2</span><span class="p">)</span> <span class="c1"># Min 20% mid cap</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">small_cap_indices</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="n">constraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cp</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">weights</span><span class="p">[</span><span class="n">small_cap_indices</span><span class="p">])</span> <span class="o">>=</span> <span class="mf">0.1</span><span class="p">)</span> <span class="c1"># Min 10% small cap</span>
<span class="c1"># ESG constraint (min 70 average ESG score)</span>
<span class="n">esg_scores</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s1">'ESG_Score'</span><span class="p">]</span><span class="o">.</span><span class="n">values</span>
<span class="n">constraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">esg_scores</span> <span class="o">@</span> <span class="n">weights</span> <span class="o">>=</span> <span class="mi">70</span><span class="p">)</span>
<span class="c1"># Liquidity constraint (min 1.0 average liquidity)</span>
<span class="n">liquidity</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s1">'Liquidity'</span><span class="p">]</span><span class="o">.</span><span class="n">values</span>
<span class="n">constraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">liquidity</span> <span class="o">@</span> <span class="n">weights</span> <span class="o">>=</span> <span class="mf">1.0</span><span class="p">)</span>
<span class="c1"># Solve the problem</span>
<span class="n">problem</span> <span class="o">=</span> <span class="n">cp</span><span class="o">.</span><span class="n">Problem</span><span class="p">(</span><span class="n">objective</span><span class="p">,</span> <span class="n">constraints</span><span class="p">)</span>
<span class="n">problem</span><span class="o">.</span><span class="n">solve</span><span class="p">()</span>
<span class="k">if</span> <span class="n">problem</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="n">cp</span><span class="o">.</span><span class="n">OPTIMAL</span><span class="p">:</span>
<span class="k">return</span> <span class="n">weights</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">expected_return</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">risk</span><span class="o">.</span><span class="n">value</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span>
<span class="c1"># Optimize equity portfolio</span>
<span class="n">weights</span><span class="p">,</span> <span class="n">portfolio_return</span><span class="p">,</span> <span class="n">portfolio_risk</span> <span class="o">=</span> <span class="n">optimize_equity_portfolio</span><span class="p">(</span>
<span class="n">equity_data</span><span class="p">,</span> <span class="n">equity_cov_matrix</span><span class="p">,</span> <span class="n">equity_returns</span><span class="p">,</span> <span class="n">risk_aversion</span><span class="o">=</span><span class="mf">2.0</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">weights</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"✅ Equity Portfolio Optimization Successful!"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Expected Return: </span><span class="si">{</span><span class="n">portfolio_return</span><span class="si">:</span><span class="s2">.1%</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Portfolio Risk: </span><span class="si">{</span><span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">portfolio_risk</span><span class="p">)</span><span class="si">:</span><span class="s2">.1%</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Sharpe Ratio: </span><span class="si">{</span><span class="n">portfolio_return</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">portfolio_risk</span><span class="p">)</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"❌ Optimization failed"</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="application/vnd.jupyter.stderr" tabindex="0">
<pre>
<span class="ansi-red-fg">---------------------------------------------------------------------------</span>
<span class="ansi-red-fg">NameError</span> Traceback (most recent call last)
Cell <span class="ansi-green-fg">In[38], line 59</span>
<span class="ansi-green-intense-fg ansi-bold"> 56</span> <span class="ansi-bold" style="color: rgb(0,135,0)">return</span> <span class="ansi-bold" style="color: rgb(0,135,0)">None</span>, <span class="ansi-bold" style="color: rgb(0,135,0)">None</span>, <span class="ansi-bold" style="color: rgb(0,135,0)">None</span>
<span class="ansi-green-intense-fg ansi-bold"> 58</span> <span style="color: rgb(95,135,135)"># Optimize equity portfolio</span>
<span class="ansi-green-fg">---> 59</span> weights, portfolio_return, portfolio_risk <span style="color: rgb(98,98,98)">=</span> <span class="ansi-yellow-bg">optimize_equity_portfolio</span><span class="ansi-yellow-bg">(</span>
<span class="ansi-green-intense-fg ansi-bold"> 60</span> <span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">equity_data</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">equity_cov_matrix</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">equity_returns</span><span class="ansi-yellow-bg">,</span><span class="ansi-yellow-bg"> </span><span class="ansi-yellow-bg">risk_aversion</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">=</span><span class="ansi-yellow-bg" style="color: rgb(98,98,98)">2.0</span>
<span class="ansi-green-intense-fg ansi-bold"> 61</span> <span class="ansi-yellow-bg">)</span>
<span class="ansi-green-intense-fg ansi-bold"> 63</span> <span class="ansi-bold" style="color: rgb(0,135,0)">if</span> weights <span class="ansi-bold" style="color: rgb(175,0,255)">is</span> <span class="ansi-bold" style="color: rgb(175,0,255)">not</span> <span class="ansi-bold" style="color: rgb(0,135,0)">None</span>:
<span class="ansi-green-intense-fg ansi-bold"> 64</span> <span style="color: rgb(0,135,0)">print</span>(<span style="color: rgb(175,0,0)">"</span><span style="color: rgb(175,0,0)">✅ Equity Portfolio Optimization Successful!</span><span style="color: rgb(175,0,0)">"</span>)
Cell <span class="ansi-green-fg">In[38], line 7</span>, in <span class="ansi-cyan-fg">optimize_equity_portfolio</span><span class="ansi-blue-fg">(data, cov_matrix, returns, risk_aversion)</span>
<span class="ansi-green-intense-fg ansi-bold"> 4</span> n <span style="color: rgb(98,98,98)">=</span> <span style="color: rgb(0,135,0)">len</span>(data)
<span class="ansi-green-intense-fg ansi-bold"> 6</span> <span style="color: rgb(95,135,135)"># Create CVXPY variables</span>
<span class="ansi-green-fg">----> 7</span> weights <span style="color: rgb(98,98,98)">=</span> <span class="ansi-yellow-bg">cp</span><span style="color: rgb(98,98,98)">.</span>Variable(n)
<span class="ansi-green-intense-fg ansi-bold"> 9</span> <span style="color: rgb(95,135,135)"># Expected return and risk</span>
<span class="ansi-green-intense-fg ansi-bold"> 10</span> expected_return <span style="color: rgb(98,98,98)">=</span> returns <span style="color: rgb(98,98,98)">@</span> weights
<span class="ansi-red-fg">NameError</span>: name 'cp' is not defined</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="cm-editor cm-s-jupyter">
<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># Visualize Equity Portfolio Results</span>
<span class="k">if</span> <span class="n">weights</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># Create portfolio summary</span>
<span class="n">portfolio_summary</span> <span class="o">=</span> <span class="n">equity_data</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">portfolio_summary</span><span class="p">[</span><span class="s1">'Weight'</span><span class="p">]</span> <span class="o">=</span> <span class="n">weights</span>
<span class="n">portfolio_summary</span><span class="p">[</span><span class="s1">'Weight_Pct'</span><span class="p">]</span> <span class="o">=</span> <span class="n">weights</span> <span class="o">*</span> <span class="mi">100</span>
<span class="n">portfolio_summary</span> <span class="o">=</span> <span class="n">portfolio_summary</span><span class="p">[</span><span class="n">portfolio_summary</span><span class="p">[</span><span class="s1">'Weight'</span><span class="p">]</span> <span class="o">></span> <span class="mf">0.001</span><span class="p">]</span> <span class="c1"># Only show significant holdings</span>
<span class="c1"># Sort by weight</span>
<span class="n">portfolio_summary</span> <span class="o">=</span> <span class="n">portfolio_summary</span><span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="s1">'Weight'</span><span class="p">,</span> <span class="n">ascending</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"📊 Top 10 Holdings:"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">portfolio_summary</span><span class="p">[[</span><span class="s1">'Symbol'</span><span class="p">,</span> <span class="s1">'Sector'</span><span class="p">,</span> <span class="s1">'MarketCap'</span><span class="p">,</span> <span class="s1">'ExpectedReturn'</span><span class="p">,</span> <span class="s1">'Volatility'</span><span class="p">,</span> <span class="s1">'ESG_Score'</span><span class="p">,</span> <span class="s1">'Weight_Pct'</span><span class="p">]]</span><span class="o">.</span><span class="n">head</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span><span class="o">.</span><span class="n">to_string</span><span class="p">(</span><span class="n">index</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
<span class="c1"># Sector allocation</span>
<span class="n">sector_allocation</span> <span class="o">=</span> <span class="n">portfolio_summary</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">'Sector'</span><span class="p">)[</span><span class="s1">'Weight'</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span><span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="n">ascending</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="se">\n</span><span class="s2">🏭 Sector Allocation:"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">sector</span><span class="p">,</span> <span class="n">weight</span> <span class="ow">in</span> <span class="n">sector_allocation</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">sector</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">weight</span><span class="si">:</span><span class="s2">.1%</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="c1"># Market cap allocation</span>
<span class="n">cap_allocation</span> <span class="o">=</span> <span class="n">portfolio_summary</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">'MarketCap'</span><span class="p">)[</span><span class="s1">'Weight'</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span><span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="n">ascending</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="se">\n</span><span class="s2">📈 Market Cap Allocation:"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">cap</span><span class="p">,</span> <span class="n">weight</span> <span class="ow">in</span> <span class="n">cap_allocation</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">cap</span><span class="si">}</span><span class="s2"> Cap: </span><span class="si">{</span><span class="n">weight</span><span class="si">:</span><span class="s2">.1%</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="c1"># Portfolio metrics</span>
<span class="n">portfolio_esg</span> <span class="o">=</span> <span class="p">(</span><span class="n">portfolio_summary</span><span class="p">[</span><span class="s1">'ESG_Score'</span><span class="p">]</span> <span class="o">*</span> <span class="n">portfolio_summary</span><span class="p">[</span><span class="s1">'Weight'</span><span class="p">])</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span>
<span class="n">portfolio_liquidity</span> <span class="o">=</span> <span class="p">(</span><span class="n">portfolio_summary</span><span class="p">[</span><span class="s1">'Liquidity'</span><span class="p">]</span> <span class="o">*</span> <span class="n">portfolio_summary</span><span class="p">[</span><span class="s1">'Weight'</span><span class="p">])</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="se">\n</span><span class="s2">📊 Portfolio Metrics:"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Number of Holdings: </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">portfolio_summary</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Average ESG Score: </span><span class="si">{</span><span class="n">portfolio_esg</span><span class="si">:</span><span class="s2">.1f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Average Liquidity: </span><span class="si">{</span><span class="n">portfolio_liquidity</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Concentration (HHI): </span><span class="si">{</span><span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">weights</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="si">:</span><span class="s2">.3f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
<h2 id="%F0%9F%8C%8D-Multi-Asset-Portfolio-Optimization">🌍 Multi-Asset Portfolio Optimization<a class="anchor-link" href="#%F0%9F%8C%8D-Multi-Asset-Portfolio-Optimization">¶</a></h2><h3 id="Mathematical-Theory:-Multi-Asset-Portfolio-with-Asset-Class-Constraints">Mathematical Theory: Multi-Asset Portfolio with Asset Class Constraints<a class="anchor-link" href="#Mathematical-Theory:-Multi-Asset-Portfolio-with-Asset-Class-Constraints">¶</a></h3><p>Multi-asset portfolios combine different asset classes to achieve diversification benefits:</p>
<p><strong>Asset Classes:</strong></p>
<ul>
<li><strong>Equities</strong>: Stocks, ETFs, REITs</li>
<li><strong>Fixed Income</strong>: Government bonds, corporate bonds, high-yield</li>
<li><strong>Alternatives</strong>: Commodities, real estate, private equity</li>
<li><strong>Cash</strong>: Money market instruments, short-term bonds</li>
</ul>
<p><strong>Mathematical Formulation:</strong></p>
<pre><code>Minimize: w^T Σ w - λ μ^T w
Subject to:
Σ w_i = 1 (weights sum to 1)
w_i ≥ 0 (no short selling)
Σ_{i∈E} w_i ≥ e_min (equity minimum)
Σ_{i∈F} w_i ≥ f_min (fixed income minimum)
Σ_{i∈A} w_i ≤ a_max (alternatives maximum)
Σ_{i∈C} w_i ≤ c_max (cash maximum)
w_i ≤ w_max (individual position limits)
Σ_{i∈R} w_i ≤ r_max (regional exposure limits)
</code></pre>
<p>Where:</p>
<ul>
<li>E, F, A, C = equity, fixed income, alternatives, cash asset classes</li>
<li>e_min, f_min = minimum allocations to core asset classes</li>
<li>a_max, c_max = maximum allocations to alternatives and cash</li>
<li>R = regional exposure limits (e.g., emerging markets)</li>
</ul>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="cm-editor cm-s-jupyter">
<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># Multi-Asset Portfolio Data Creation</span>
<span class="k">def</span><span class="w"> </span><span class="nf">create_multi_asset_data</span><span class="p">():</span>
<span class="w"> </span><span class="sd">"""Create sample multi-asset portfolio data"""</span>
<span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<span class="c1"># Define asset classes and subclasses</span>
<span class="n">assets</span> <span class="o">=</span> <span class="p">[</span>
<span class="c1"># Equities</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'US Large Cap'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Equity'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'US'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.10</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.16</span><span class="p">},</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'US Small Cap'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Equity'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'US'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.12</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.22</span><span class="p">},</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'International Developed'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Equity'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'International'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.09</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.18</span><span class="p">},</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'Emerging Markets'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Equity'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'International'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.13</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.25</span><span class="p">},</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'REITs'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Equity'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'Real Estate'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.08</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.20</span><span class="p">},</span>
<span class="c1"># Fixed Income</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'US Treasury 10Y'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Fixed Income'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'Government'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.04</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.08</span><span class="p">},</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'Corporate Bonds'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Fixed Income'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'Corporate'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.05</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.06</span><span class="p">},</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'High Yield Bonds'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Fixed Income'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'High Yield'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.07</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.12</span><span class="p">},</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'International Bonds'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Fixed Income'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'International'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.03</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.07</span><span class="p">},</span>
<span class="c1"># Alternatives</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'Gold'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Alternative'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'Commodity'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.06</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.15</span><span class="p">},</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'Oil'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Alternative'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'Commodity'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.08</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.30</span><span class="p">},</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'Private Equity'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Alternative'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'Private'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.15</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.25</span><span class="p">},</span>
<span class="c1"># Cash</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'Money Market'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Cash'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'Short Term'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.02</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.01</span><span class="p">},</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'Short Term Bonds'</span><span class="p">,</span> <span class="s1">'class'</span><span class="p">:</span> <span class="s1">'Cash'</span><span class="p">,</span> <span class="s1">'subclass'</span><span class="p">:</span> <span class="s1">'Short Term'</span><span class="p">,</span> <span class="s1">'expected_return'</span><span class="p">:</span> <span class="mf">0.025</span><span class="p">,</span> <span class="s1">'volatility'</span><span class="p">:</span> <span class="mf">0.02</span><span class="p">},</span>
<span class="p">]</span>
<span class="c1"># Add some random variation</span>
<span class="k">for</span> <span class="n">asset</span> <span class="ow">in</span> <span class="n">assets</span><span class="p">:</span>
<span class="n">asset</span><span class="p">[</span><span class="s1">'expected_return'</span><span class="p">]</span> <span class="o">+=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">normal</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.005</span><span class="p">)</span>
<span class="n">asset</span><span class="p">[</span><span class="s1">'volatility'</span><span class="p">]</span> <span class="o">+=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">normal</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">)</span>
<span class="n">asset</span><span class="p">[</span><span class="s1">'volatility'</span><span class="p">]</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mf">0.01</span><span class="p">,</span> <span class="n">asset</span><span class="p">[</span><span class="s1">'volatility'</span><span class="p">])</span> <span class="c1"># Minimum volatility</span>
<span class="k">return</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">assets</span><span class="p">)</span>
<span class="c1"># Create multi-asset data</span>
<span class="n">multi_asset_data</span> <span class="o">=</span> <span class="n">create_multi_asset_data</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"🌍 Multi-Asset Portfolio Data:"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">multi_asset_data</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
<h2 id="%F0%9F%8E%AF-Combinatorial-Optimization-Examples">🎯 Combinatorial Optimization Examples<a class="anchor-link" href="#%F0%9F%8E%AF-Combinatorial-Optimization-Examples">¶</a></h2><h3 id="N-Queens-Problem">N-Queens Problem<a class="anchor-link" href="#N-Queens-Problem">¶</a></h3><p>The N-Queens problem is a classic constraint satisfaction problem where we need to place N queens on an N×N chessboard such that no two queens attack each other.</p>
<h4 id="Mathematical-Formulation">Mathematical Formulation<a class="anchor-link" href="#Mathematical-Formulation">¶</a></h4><p><strong>Variables:</strong> $x_{i,j} \in \{0,1\}$ where $x_{i,j} = 1$ if a queen is placed at position $(i,j)$</p>
<p><strong>Objective:</strong> Find any feasible solution (satisfaction problem)</p>
<p><strong>Constraints:</strong></p>
<ol>
<li><strong>Row constraints:</strong> $\sum_{j=1}^{n} x_{i,j} = 1 \quad \forall i \in \{1, \ldots, n\}$</li>
<li><strong>Column constraints:</strong> $\sum_{i=1}^{n} x_{i,j} = 1 \quad \forall j \in \{1, \ldots, n\}$</li>
<li><strong>Diagonal constraints:</strong><ul>
<li>Main diagonals: $\sum_{i-j=k} x_{i,j} \leq 1 \quad \forall k \in \{-(n-1), \ldots, n-1\}$</li>
<li>Anti-diagonals: $\sum_{i+j=k} x_{i,j} \leq 1 \quad \forall k \in \{2, \ldots, 2n\}$</li>
</ul>
</li>
</ol>
<h4 id="Alternative-Formulation-(Row-based)">Alternative Formulation (Row-based)<a class="anchor-link" href="#Alternative-Formulation-(Row-based)">¶</a></h4><p><strong>Variables:</strong> $q_i \in \{1, \ldots, n\}$ where $q_i$ is the column of the queen in row $i$</p>
<p><strong>Constraints:</strong></p>
<ol>
<li><strong>Different columns:</strong> $q_i \neq q_j \quad \forall i \neq j$</li>
<li><strong>Different main diagonals:</strong> $q_i - q_j \neq i - j \quad \forall i \neq j$</li>
<li><strong>Different anti-diagonals:</strong> $q_i + q_j \neq i + j \quad \forall i \neq j$</li>
</ol>
<h4 id="Complexity-Analysis">Complexity Analysis<a class="anchor-link" href="#Complexity-Analysis">¶</a></h4><ul>
<li><strong>Time Complexity:</strong> $O(n!)$ for backtracking algorithms</li>
<li><strong>Space Complexity:</strong> $O(n)$ for recursive depth</li>
<li><strong>Solution Count:</strong><ul>
<li>$n=8$: 92 solutions, 12 unique up to rotation/reflection</li>
<li>$n=4$: 2 solutions</li>
<li>$n=1$: 1 solution</li>
<li>$n=2,3$: 0 solutions</li>
</ul>
</li>
</ul>
<h4 id="Constraint-Programming-Approach">Constraint Programming Approach<a class="anchor-link" href="#Constraint-Programming-Approach">¶</a></h4><p>The problem can be solved using constraint programming with the following constraint types:</p>
<ul>
<li><strong>AllDifferent constraint</strong> for columns</li>
<li><strong>Custom constraints</strong> for diagonal attacks</li>
<li><strong>Domain reduction</strong> through constraint propagation</li>
</ul>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="cm-editor cm-s-jupyter">
<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># N-Queens Problem Example</span>
<span class="k">def</span><span class="w"> </span><span class="nf">solve_nqueens_demo</span><span class="p">(</span><span class="n">n</span><span class="o">=</span><span class="mi">8</span><span class="p">):</span>
<span class="w"> </span><span class="sd">"""Solve N-Queens problem using OR-Tools"""</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">constrained_opt_mcp.models.ortools_models</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
<span class="n">ORToolsProblem</span><span class="p">,</span> <span class="n">ORToolsVariable</span><span class="p">,</span> <span class="n">ORToolsConstraint</span>
<span class="p">)</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">constrained_opt_mcp.solvers.ortools_solver</span><span class="w"> </span><span class="kn">import</span> <span class="n">solve_problem</span>
<span class="c1"># Create problem</span>
<span class="n">problem</span> <span class="o">=</span> <span class="n">ORToolsProblem</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="s2">"N-Queens Problem"</span><span class="p">,</span>
<span class="n">problem_type</span><span class="o">=</span><span class="s2">"constraint_programming"</span>
<span class="p">)</span>
<span class="c1"># Create variables: queens[i] = column position of queen in row i</span>
<span class="n">queens</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="n">var</span> <span class="o">=</span> <span class="n">ORToolsVariable</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">"queen_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
<span class="n">domain</span><span class="o">=</span><span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)),</span>
<span class="n">var_type</span><span class="o">=</span><span class="s2">"integer"</span>
<span class="p">)</span>
<span class="n">queens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
<span class="n">problem</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
<span class="c1"># Add constraints</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
<span class="c1"># No two queens in same column</span>
<span class="n">problem</span><span class="o">.</span><span class="n">add_constraint</span><span class="p">(</span><span class="n">ORToolsConstraint</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">"different_columns_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">j</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
<span class="n">constraint_type</span><span class="o">=</span><span class="s2">"not_equal"</span><span class="p">,</span>
<span class="n">variables</span><span class="o">=</span><span class="p">[</span><span class="n">queens</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">queens</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span>
<span class="p">))</span>
<span class="c1"># No two queens on same diagonal</span>
<span class="n">problem</span><span class="o">.</span><span class="n">add_constraint</span><span class="p">(</span><span class="n">ORToolsConstraint</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">"different_diagonals_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">j</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
<span class="n">constraint_type</span><span class="o">=</span><span class="s2">"not_equal"</span><span class="p">,</span>
<span class="n">variables</span><span class="o">=</span><span class="p">[</span><span class="n">queens</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">queens</span><span class="p">[</span><span class="n">j</span><span class="p">]],</span>
<span class="n">coefficients</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">],</span>
<span class="n">constant</span><span class="o">=-</span><span class="p">(</span><span class="n">i</span> <span class="o">-</span> <span class="n">j</span><span class="p">)</span>
<span class="p">))</span>
<span class="n">problem</span><span class="o">.</span><span class="n">add_constraint</span><span class="p">(</span><span class="n">ORToolsConstraint</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">"different_anti_diagonals_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">j</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
<span class="n">constraint_type</span><span class="o">=</span><span class="s2">"not_equal"</span><span class="p">,</span>
<span class="n">variables</span><span class="o">=</span><span class="p">[</span><span class="n">queens</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">queens</span><span class="p">[</span><span class="n">j</span><span class="p">]],</span>
<span class="n">coefficients</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span>
<span class="n">constant</span><span class="o">=-</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="n">j</span><span class="p">)</span>
<span class="p">))</span>
<span class="c1"># Solve the problem</span>
<span class="n">solution</span> <span class="o">=</span> <span class="n">solve_problem</span><span class="p">(</span><span class="n">problem</span><span class="p">)</span>
<span class="k">if</span> <span class="n">solution</span><span class="o">.</span><span class="n">is_optimal</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span><span class="n">solution</span><span class="o">.</span><span class="n">variable_values</span><span class="p">[</span><span class="sa">f</span><span class="s2">"queen_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="c1"># Solve 8-Queens problem</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Solving 8-Queens problem..."</span><span class="p">)</span>
<span class="n">solution</span> <span class="o">=</span> <span class="n">solve_nqueens_demo</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
<span class="k">if</span> <span class="n">solution</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Solution found: </span><span class="si">{</span><span class="n">solution</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="c1"># Visualize solution</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>
<span class="n">n</span> <span class="o">=</span> <span class="mi">8</span>
<span class="c1"># Create chessboard</span>
<span class="n">board</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">n</span><span class="p">,</span> <span class="n">n</span><span class="p">))</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="n">j</span><span class="p">)</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">board</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">ax</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">board</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="s1">'gray'</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.3</span><span class="p">)</span>
<span class="c1"># Place queens</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">solution</span><span class="p">):</span>
<span class="n">ax</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="mi">500</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s1">'red'</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="s1">'o'</span><span class="p">,</span> <span class="n">edgecolors</span><span class="o">=</span><span class="s1">'black'</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="s1">'Q'</span><span class="p">,</span> <span class="n">ha</span><span class="o">=</span><span class="s1">'center'</span><span class="p">,</span> <span class="n">va</span><span class="o">=</span><span class="s1">'center'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">16</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">'white'</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_xticks</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_yticks</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_xticklabels</span><span class="p">([</span><span class="nb">chr</span><span class="p">(</span><span class="mi">65</span> <span class="o">+</span> <span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)])</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_yticklabels</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'8-Queens Problem Solution'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">16</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.3</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"No solution found!"</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
<h2 id="%F0%9F%8F%AD-Scheduling-&-Operations-Examples">🏭 Scheduling & Operations Examples<a class="anchor-link" href="#%F0%9F%8F%AD-Scheduling-&-Operations-Examples">¶</a></h2><h3 id="Job-Shop-Scheduling">Job Shop Scheduling<a class="anchor-link" href="#Job-Shop-Scheduling">¶</a></h3><p>Job shop scheduling involves scheduling a set of jobs on a set of machines where each job consists of a sequence of operations, and each operation must be performed on a specific machine for a specific duration.</p>
<h4 id="Mathematical-Formulation">Mathematical Formulation<a class="anchor-link" href="#Mathematical-Formulation">¶</a></h4><p><strong>Given:</strong></p>
<ul>
<li>$J = \{1, \ldots, n\}$: set of jobs</li>
<li>$M = \{1, \ldots, m\}$: set of machines</li>
<li>$O_{ij}$: operation $j$ of job $i$ with processing time $p_{ij}$ on machine $m_{ij}$</li>
</ul>
<p><strong>Variables:</strong></p>
<ul>
<li>$s_{ij} \geq 0$: start time of operation $O_{ij}$</li>
<li>$C_{max}$: makespan (completion time of all jobs)</li>
</ul>
<p><strong>Objective:</strong>
$$\min C_{max}$$</p>
<p><strong>Constraints:</strong></p>
<ol>
<li><p><strong>Precedence constraints:</strong> $s_{ij} + p_{ij} \leq s_{i,j+1} \quad \forall i \in J, j \in \{1, \ldots, |O_i|-1\}$</p>
</li>
<li><p><strong>Machine capacity constraints:</strong> For any two operations $O_{ij}$ and $O_{kl}$ on the same machine $m_{ij} = m_{kl}$:
$$s_{ij} + p_{ij} \leq s_{kl} \quad \text{or} \quad s_{kl} + p_{kl} \leq s_{ij}$$</p>
</li>
<li><p><strong>Makespan definition:</strong> $s_{ij} + p_{ij} \leq C_{max} \quad \forall i \in J, j \in O_i$</p>
</li>
<li><p><strong>Non-negativity:</strong> $s_{ij} \geq 0 \quad \forall i \in J, j \in O_i$</p>
</li>
</ol>
<h4 id="Alternative-Formulation-with-Binary-Variables">Alternative Formulation with Binary Variables<a class="anchor-link" href="#Alternative-Formulation-with-Binary-Variables">¶</a></h4><p><strong>Additional Variables:</strong></p>
<ul>
<li>$y_{ij,kl} \in \{0,1\}$: 1 if operation $O_{ij}$ precedes $O_{kl}$ on the same machine</li>
</ul>
<p><strong>Constraints:</strong>
$$s_{ij} + p_{ij} \leq s_{kl} + M(1 - y_{ij,kl})$$
$$s_{kl} + p_{kl} \leq s_{ij} + My_{ij,kl}$$</p>
<p>Where $M$ is a large constant (e.g., $M = \sum_{i,j} p_{ij}$).</p>
<h4 id="Complexity-Analysis">Complexity Analysis<a class="anchor-link" href="#Complexity-Analysis">¶</a></h4><ul>
<li><strong>General case:</strong> NP-Hard</li>
<li><strong>2-machine case:</strong> Polynomial time solvable (Johnson's algorithm)</li>
<li><strong>3-machine case:</strong> NP-Hard</li>
<li><strong>Approximation algorithms:</strong> Various heuristics available</li>
</ul>
<h4 id="Solution-Methods">Solution Methods<a class="anchor-link" href="#Solution-Methods">¶</a></h4><ol>
<li><p><strong>Exact methods:</strong></p>
<ul>
<li>Branch-and-bound</li>
<li>Constraint programming</li>
<li>Mixed-integer programming</li>
</ul>
</li>
<li><p><strong>Heuristic methods:</strong></p>
<ul>
<li>Genetic algorithms</li>
<li>Simulated annealing</li>
<li>Tabu search</li>
<li>Priority rules (SPT, LPT, etc.)</li>
</ul>
</li>
</ol>
<h4 id="Performance-Metrics">Performance Metrics<a class="anchor-link" href="#Performance-Metrics">¶</a></h4><ul>
<li><strong>Makespan:</strong> $C_{max} = \max_{i,j} (s_{ij} + p_{ij})$</li>
<li><strong>Total completion time:</strong> $\sum_{i} C_i$ where $C_i$ is completion time of job $i$</li>
<li><strong>Total tardiness:</strong> $\sum_{i} \max(0, C_i - d_i)$ where $d_i$ is due date of job $i$</li>
<li><strong>Machine utilization:</strong> $\frac{\sum_{i,j} p_{ij}}{m \cdot C_{max}}$</li>
</ul>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="cm-editor cm-s-jupyter">
<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># Job Shop Scheduling Example</span>
<span class="k">def</span><span class="w"> </span><span class="nf">solve_job_shop_demo</span><span class="p">():</span>
<span class="w"> </span><span class="sd">"""Solve a simple job shop scheduling problem"""</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">constrained_opt_mcp.models.ortools_models</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
<span class="n">ORToolsProblem</span><span class="p">,</span> <span class="n">ORToolsVariable</span><span class="p">,</span> <span class="n">ORToolsConstraint</span>
<span class="p">)</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">constrained_opt_mcp.solvers.ortools_solver</span><span class="w"> </span><span class="kn">import</span> <span class="n">solve_problem</span>
<span class="c1"># Simple 2-job, 2-machine problem</span>
<span class="n">jobs</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Job1'</span><span class="p">,</span> <span class="s1">'Job2'</span><span class="p">]</span>
<span class="n">machines</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Machine1'</span><span class="p">,</span> <span class="s1">'Machine2'</span><span class="p">]</span>
<span class="n">processing_times</span> <span class="o">=</span> <span class="p">{</span>
<span class="p">(</span><span class="s1">'Job1'</span><span class="p">,</span> <span class="s1">'Machine1'</span><span class="p">):</span> <span class="mi">3</span><span class="p">,</span>
<span class="p">(</span><span class="s1">'Job1'</span><span class="p">,</span> <span class="s1">'Machine2'</span><span class="p">):</span> <span class="mi">2</span><span class="p">,</span>
<span class="p">(</span><span class="s1">'Job2'</span><span class="p">,</span> <span class="s1">'Machine1'</span><span class="p">):</span> <span class="mi">2</span><span class="p">,</span>
<span class="p">(</span><span class="s1">'Job2'</span><span class="p">,</span> <span class="s1">'Machine2'</span><span class="p">):</span> <span class="mi">4</span>
<span class="p">}</span>
<span class="c1"># Create problem</span>
<span class="n">problem</span> <span class="o">=</span> <span class="n">ORToolsProblem</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="s2">"Job Shop Scheduling"</span><span class="p">,</span>
<span class="n">problem_type</span><span class="o">=</span><span class="s2">"constraint_programming"</span>
<span class="p">)</span>
<span class="c1"># Create variables for start times</span>
<span class="n">start_times</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">job</span> <span class="ow">in</span> <span class="n">jobs</span><span class="p">:</span>
<span class="k">for</span> <span class="n">machine</span> <span class="ow">in</span> <span class="n">machines</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span><span class="n">job</span><span class="p">,</span> <span class="n">machine</span><span class="p">)</span> <span class="ow">in</span> <span class="n">processing_times</span><span class="p">:</span>
<span class="n">var</span> <span class="o">=</span> <span class="n">ORToolsVariable</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">"start_</span><span class="si">{</span><span class="n">job</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">machine</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
<span class="n">domain</span><span class="o">=</span><span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">20</span><span class="p">)),</span>
<span class="n">var_type</span><span class="o">=</span><span class="s2">"integer"</span>
<span class="p">)</span>
<span class="n">start_times</span><span class="p">[(</span><span class="n">job</span><span class="p">,</span> <span class="n">machine</span><span class="p">)]</span> <span class="o">=</span> <span class="n">var</span>
<span class="n">problem</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
<span class="c1"># Create makespan variable</span>
<span class="n">makespan_var</span> <span class="o">=</span> <span class="n">ORToolsVariable</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="s2">"makespan"</span><span class="p">,</span>
<span class="n">domain</span><span class="o">=</span><span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">20</span><span class="p">)),</span>
<span class="n">var_type</span><span class="o">=</span><span class="s2">"integer"</span>
<span class="p">)</span>
<span class="n">problem</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="n">makespan_var</span><span class="p">)</span>
<span class="c1"># Objective: minimize makespan</span>
<span class="n">problem</span><span class="o">.</span><span class="n">set_objective</span><span class="p">(</span>
<span class="n">objective_type</span><span class="o">=</span><span class="s2">"minimize"</span><span class="p">,</span>
<span class="n">coefficients</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
<span class="n">variables</span><span class="o">=</span><span class="p">[</span><span class="n">makespan_var</span><span class="p">]</span>
<span class="p">)</span>
<span class="c1"># Constraints: makespan >= completion time of each operation</span>
<span class="k">for</span> <span class="p">(</span><span class="n">job</span><span class="p">,</span> <span class="n">machine</span><span class="p">),</span> <span class="n">start_var</span> <span class="ow">in</span> <span class="n">start_times</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">processing_time</span> <span class="o">=</span> <span class="n">processing_times</span><span class="p">[(</span><span class="n">job</span><span class="p">,</span> <span class="n">machine</span><span class="p">)]</span>
<span class="n">problem</span><span class="o">.</span><span class="n">add_constraint</span><span class="p">(</span><span class="n">ORToolsConstraint</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">"makespan_</span><span class="si">{</span><span class="n">job</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">machine</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
<span class="n">constraint_type</span><span class="o">=</span><span class="s2">"greater_equal"</span><span class="p">,</span>
<span class="n">variables</span><span class="o">=</span><span class="p">[</span><span class="n">makespan_var</span><span class="p">,</span> <span class="n">start_var</span><span class="p">],</span>
<span class="n">coefficients</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">],</span>
<span class="n">constant</span><span class="o">=</span><span class="n">processing_time</span>
<span class="p">))</span>
<span class="c1"># Solve the problem</span>
<span class="n">solution</span> <span class="o">=</span> <span class="n">solve_problem</span><span class="p">(</span><span class="n">problem</span><span class="p">)</span>
<span class="k">if</span> <span class="n">solution</span><span class="o">.</span><span class="n">is_optimal</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'makespan'</span><span class="p">:</span> <span class="n">solution</span><span class="o">.</span><span class="n">variable_values</span><span class="p">[</span><span class="s1">'makespan'</span><span class="p">],</span>
<span class="s1">'schedule'</span><span class="p">:</span> <span class="p">{}</span>
<span class="p">}</span>
<span class="k">for</span> <span class="p">(</span><span class="n">job</span><span class="p">,</span> <span class="n">machine</span><span class="p">),</span> <span class="n">start_var</span> <span class="ow">in</span> <span class="n">start_times</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">start_time</span> <span class="o">=</span> <span class="n">solution</span><span class="o">.</span><span class="n">variable_values</span><span class="p">[</span><span class="sa">f</span><span class="s2">"start_</span><span class="si">{</span><span class="n">job</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">machine</span><span class="si">}</span><span class="s2">"</span><span class="p">]</span>
<span class="n">processing_time</span> <span class="o">=</span> <span class="n">processing_times</span><span class="p">[(</span><span class="n">job</span><span class="p">,</span> <span class="n">machine</span><span class="p">)]</span>
<span class="n">result</span><span class="p">[</span><span class="s1">'schedule'</span><span class="p">][(</span><span class="n">job</span><span class="p">,</span> <span class="n">machine</span><span class="p">)]</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'start'</span><span class="p">:</span> <span class="n">start_time</span><span class="p">,</span>
<span class="s1">'end'</span><span class="p">:</span> <span class="n">start_time</span> <span class="o">+</span> <span class="n">processing_time</span><span class="p">,</span>
<span class="s1">'duration'</span><span class="p">:</span> <span class="n">processing_time</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="c1"># Solve job shop scheduling</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Solving Job Shop Scheduling problem..."</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">solve_job_shop_demo</span><span class="p">()</span>
<span class="k">if</span> <span class="n">result</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Optimal makespan: </span><span class="si">{</span><span class="n">result</span><span class="p">[</span><span class="s1">'makespan'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">Schedule:"</span><span class="p">)</span>
<span class="k">for</span> <span class="p">(</span><span class="n">job</span><span class="p">,</span> <span class="n">machine</span><span class="p">),</span> <span class="n">info</span> <span class="ow">in</span> <span class="n">result</span><span class="p">[</span><span class="s1">'schedule'</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">" </span><span class="si">{</span><span class="n">job</span><span class="si">}</span><span class="s2"> on </span><span class="si">{</span><span class="n">machine</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">info</span><span class="p">[</span><span class="s1">'start'</span><span class="p">]</span><span class="si">}</span><span class="s2">-</span><span class="si">{</span><span class="n">info</span><span class="p">[</span><span class="s1">'end'</span><span class="p">]</span><span class="si">}</span><span class="s2"> (duration: </span><span class="si">{</span><span class="n">info</span><span class="p">[</span><span class="s1">'duration'</span><span class="p">]</span><span class="si">}</span><span class="s2">)"</span><span class="p">)</span>
<span class="c1"># Visualize schedule</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span>
<span class="n">jobs</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Job1'</span><span class="p">,</span> <span class="s1">'Job2'</span><span class="p">]</span>
<span class="n">machines</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Machine1'</span><span class="p">,</span> <span class="s1">'Machine2'</span><span class="p">]</span>
<span class="n">colors</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'Job1'</span><span class="p">:</span> <span class="s1">'skyblue'</span><span class="p">,</span> <span class="s1">'Job2'</span><span class="p">:</span> <span class="s1">'lightcoral'</span><span class="p">}</span>
<span class="n">y_pos</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">machine</span> <span class="ow">in</span> <span class="n">machines</span><span class="p">:</span>
<span class="k">for</span> <span class="p">(</span><span class="n">job</span><span class="p">,</span> <span class="n">mach</span><span class="p">),</span> <span class="n">info</span> <span class="ow">in</span> <span class="n">result</span><span class="p">[</span><span class="s1">'schedule'</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">mach</span> <span class="o">==</span> <span class="n">machine</span><span class="p">:</span>
<span class="n">ax</span><span class="o">.</span><span class="n">barh</span><span class="p">(</span><span class="n">y_pos</span><span class="p">,</span> <span class="n">info</span><span class="p">[</span><span class="s1">'duration'</span><span class="p">],</span> <span class="n">left</span><span class="o">=</span><span class="n">info</span><span class="p">[</span><span class="s1">'start'</span><span class="p">],</span>
<span class="n">color</span><span class="o">=</span><span class="n">colors</span><span class="p">[</span><span class="n">job</span><span class="p">],</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.7</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="s1">'black'</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">info</span><span class="p">[</span><span class="s1">'start'</span><span class="p">]</span> <span class="o">+</span> <span class="n">info</span><span class="p">[</span><span class="s1">'duration'</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">y_pos</span><span class="p">,</span> <span class="n">job</span><span class="p">,</span>
<span class="n">ha</span><span class="o">=</span><span class="s1">'center'</span><span class="p">,</span> <span class="n">va</span><span class="o">=</span><span class="s1">'center'</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span>
<span class="n">y_pos</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_yticks</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">machines</span><span class="p">)))</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_yticklabels</span><span class="p">(</span><span class="n">machines</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s1">'Time'</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s1">'Job Shop Schedule (Gantt Chart)'</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.3</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"No solution found!"</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
<h3 id="Knapsack-Problem">Knapsack Problem<a class="anchor-link" href="#Knapsack-Problem">¶</a></h3><p>The knapsack problem is a classic combinatorial optimization problem where we must select items to maximize value while respecting a weight constraint.</p>
<h4 id="Mathematical-Formulation">Mathematical Formulation<a class="anchor-link" href="#Mathematical-Formulation">¶</a></h4><p><strong>0/1 Knapsack Problem:</strong></p>
<p><strong>Given:</strong></p>
<ul>
<li>$n$ items with values $v_1, v_2, \ldots, v_n$ and weights $w_1, w_2, \ldots, w_n$</li>
<li>Knapsack capacity $W$</li>
</ul>
<p><strong>Variables:</strong></p>
<ul>
<li>$x_i \in \{0,1\}$: 1 if item $i$ is selected, 0 otherwise</li>
</ul>
<p><strong>Objective:</strong>
$$\max \sum_{i=1}^{n} v_i x_i$$</p>
<p><strong>Constraints:</strong>
$$\sum_{i=1}^{n} w_i x_i \leq W$$</p>
<p><strong>Integer Linear Programming Form:</strong>
$$\begin{align}
\max \quad & \sum_{i=1}^{n} v_i x_i \\
\text{s.t.} \quad & \sum_{i=1}^{n} w_i x_i \leq W \\
& x_i \in \{0,1\}, \quad i = 1, \ldots, n
\end{align}$$</p>
<h4 id="Variations">Variations<a class="anchor-link" href="#Variations">¶</a></h4><p><strong>1. Multiple Knapsack Problem:</strong></p>
<ul>
<li>$m$ knapsacks with capacities $W_1, W_2, \ldots, W_m$</li>
<li>Each item can be assigned to at most one knapsack</li>
</ul>
<p><strong>Variables:</strong> $x_{ij} \in \{0,1\}$: 1 if item $i$ is in knapsack $j$</p>
<p><strong>Objective:</strong> $\max \sum_{i=1}^{n} \sum_{j=1}^{m} v_i x_{ij}$</p>
<p><strong>Constraints:</strong></p>
<ul>
<li>$\sum_{j=1}^{m} x_{ij} \leq 1 \quad \forall i$ (each item at most once)</li>
<li>$\sum_{i=1}^{n} w_i x_{ij} \leq W_j \quad \forall j$ (capacity constraints)</li>
</ul>
<p><strong>2. Unbounded Knapsack:</strong></p>
<ul>
<li>Items can be selected multiple times</li>
<li>Variables: $x_i \in \mathbb{Z}_+$ (non-negative integers)</li>
</ul>
<p><strong>3. Fractional Knapsack:</strong></p>
<ul>
<li>Items can be partially selected</li>
<li>Variables: $x_i \in [0,1]$ (continuous)</li>
<li>Solvable by greedy algorithm (sort by value/weight ratio)</li>
</ul>
<h4 id="Solution-Methods">Solution Methods<a class="anchor-link" href="#Solution-Methods">¶</a></h4><p><strong>1. Dynamic Programming:</strong></p>
<ul>
<li>Time: $O(nW)$, Space: $O(nW)$</li>
<li>Optimal for 0/1 knapsack</li>
</ul>
<p><strong>2. Branch and Bound:</strong></p>
<ul>
<li>Upper bound: fractional knapsack solution</li>
<li>Lower bound: current best integer solution</li>
</ul>
<p><strong>3. Approximation Algorithms:</strong></p>
<ul>
<li>Greedy by value/weight ratio: $\frac{1}{2}$-approximation</li>
<li>FPTAS (Fully Polynomial Time Approximation Scheme)</li>
</ul>
<h4 id="Complexity-Analysis">Complexity Analysis<a class="anchor-link" href="#Complexity-Analysis">¶</a></h4><ul>
<li><strong>0/1 Knapsack:</strong> NP-Complete (weakly NP-complete)</li>
<li><strong>Multiple Knapsack:</strong> NP-Complete</li>
<li><strong>Fractional Knapsack:</strong> Polynomial time (greedy)</li>
<li><strong>Unbounded Knapsack:</strong> NP-Complete</li>
</ul>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
<h3 id="Economic-Production-Planning">Economic Production Planning<a class="anchor-link" href="#Economic-Production-Planning">¶</a></h3><p>Economic production planning involves optimizing production schedules, inventory levels, and resource allocation across multiple periods while minimizing costs and meeting demand.</p>
<h4 id="Mathematical-Formulation">Mathematical Formulation<a class="anchor-link" href="#Mathematical-Formulation">¶</a></h4><p><strong>Multi-Period Production Planning Model:</strong></p>
<p><strong>Given:</strong></p>
<ul>
<li>$T$: planning horizon (periods)</li>
<li>$I$: set of products</li>
<li>$R$: set of resources</li>
<li>$D_{it}$: demand for product $i$ in period $t$</li>
<li>$h_i$: holding cost per unit of product $i$ per period</li>
<li>$p_i$: production cost per unit of product $i$</li>
<li>$s_i$: setup cost for product $i$</li>
<li>$c_{ir}$: resource consumption of product $i$ for resource $r$</li>
<li>$K_{rt}$: capacity of resource $r$ in period $t$</li>
</ul>
<p><strong>Variables:</strong></p>
<ul>
<li>$x_{it} \geq 0$: production quantity of product $i$ in period $t$</li>
<li>$I_{it} \geq 0$: inventory level of product $i$ at end of period $t$</li>
<li>$y_{it} \in \{0,1\}$: 1 if product $i$ is produced in period $t$</li>
</ul>
<p><strong>Objective:</strong>
$$\min \sum_{i \in I} \sum_{t=1}^{T} (p_i x_{it} + h_i I_{it} + s_i y_{it})$$</p>
<p><strong>Constraints:</strong></p>
<ol>
<li><p><strong>Inventory balance:</strong> $I_{i,t-1} + x_{it} - I_{it} = D_{it} \quad \forall i, t$</p>
</li>
<li><p><strong>Resource capacity:</strong> $\sum_{i \in I} c_{ir} x_{it} \leq K_{rt} \quad \forall r, t$</p>
</li>
<li><p><strong>Setup constraints:</strong> $x_{it} \leq M y_{it} \quad \forall i, t$ (where $M$ is large constant)</p>
</li>
<li><p><strong>Non-negativity:</strong> $x_{it}, I_{it} \geq 0, \quad y_{it} \in \{0,1\} \quad \forall i, t$</p>
</li>
</ol>
<h4 id="Advanced-Formulations">Advanced Formulations<a class="anchor-link" href="#Advanced-Formulations">¶</a></h4><p><strong>1. Capacitated Lot Sizing Problem (CLSP):</strong></p>
<ul>
<li>Single product, multiple periods</li>
<li>Setup costs and capacity constraints</li>
<li>NP-Hard problem</li>
</ul>
<p><strong>2. Multi-Level Production Planning:</strong></p>
<ul>
<li>Bill of Materials (BOM) structure</li>
<li>Dependent demand for components</li>
<li>MRP (Material Requirements Planning) integration</li>
</ul>
<p><strong>3. Stochastic Production Planning:</strong></p>
<ul>
<li>Uncertain demand scenarios</li>
<li>Risk measures (CVaR, VaR)</li>
<li>Robust optimization approaches</li>
</ul>
<h4 id="Solution-Methods">Solution Methods<a class="anchor-link" href="#Solution-Methods">¶</a></h4><p><strong>1. Exact Methods:</strong></p>
<ul>
<li>Mixed-Integer Linear Programming (MILP)</li>
<li>Branch-and-bound algorithms</li>
<li>Cutting plane methods</li>
</ul>
<p><strong>2. Heuristic Methods:</strong></p>
<ul>
<li>Lagrangian relaxation</li>
<li>Genetic algorithms</li>
<li>Simulated annealing</li>
<li>Tabu search</li>
</ul>
<p><strong>3. Decomposition Methods:</strong></p>
<ul>
<li>Dantzig-Wolfe decomposition</li>
<li>Benders decomposition</li>
<li>Column generation</li>
</ul>
<h4 id="Performance-Metrics">Performance Metrics<a class="anchor-link" href="#Performance-Metrics">¶</a></h4><ul>
<li><strong>Total Cost:</strong> Production + Holding + Setup costs</li>
<li><strong>Service Level:</strong> $\frac{\text{Demand Met}}{\text{Total Demand}} \times 100\%$</li>
<li><strong>Capacity Utilization:</strong> $\frac{\text{Resource Used}}{\text{Resource Available}} \times 100\%$</li>
<li><strong>Inventory Turnover:</strong> $\frac{\text{Cost of Goods Sold}}{\text{Average Inventory}}$</li>
</ul>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
<div class="jp-Cell-inputWrapper" tabindex="0">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
</div>
</div>
</div>
</div>
</main>
</body>
</html>