{"componentChunkName":"component---src-pages-sips-sip-markdown-remark-frontmatter-sip-tsx","path":"/sips/sip-280/","result":{"data":{"markdownRemark":{"fileAbsolutePath":"/vercel/path0/content/sips/sip-280.md","frontmatter":{"sip":280,"sccp":null,"title":"PerpsV2 (Perps Upgradability)","network":"Ethereum & Optimism","author":"Leonardo Massazza (@leomassazza)","type":"Governance","proposal":"https://snapshot.org/#/snxgov.eth/proposal/0x8bf07c2fa0f8070d55539ad02b9afda66f687a57e0b490d92333dfe17f9e09cd","implementor":"Leonardo Massazza (@leomassazza), MEB (@barrasso)","release":null,"created":"2022-09-26T00:00:00.000Z","updated":null,"status":"Implemented"},"html":"<!--You can leave these HTML comments in your merged SIP and delete the visible duplicate text guides, they will not appear and may be helpful to refer to if you edit it again. This is the suggested template for new SIPs. Note that an SIP number will be assigned by an editor. When opening a pull request to submit your SIP, please use an abbreviated title in the filename, `sip-draft_title_abbrev.md`. The title should be 44 characters or less.-->\n<h2 id=\"simple-summary\" style=\"position:relative;\"><a href=\"#simple-summary\" aria-label=\"simple summary permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Simple Summary</h2>\n<!--\"If you can't explain it simply, you don't understand it well enough.\" Simply describe the outcome the proposed changes intends to achieve. This should be non-technical and accessible to a casual community member.-->\n<p>Add upgradability capabilities to current Futures implementation as a first step to add new features to it.\nNote, in this SIP <code>Futures</code> and <code>Perps</code> terms are interchangeale.</p>\n<h2 id=\"abstract\" style=\"position:relative;\"><a href=\"#abstract\" aria-label=\"abstract permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Abstract</h2>\n<!--A short (~200 word) description of the proposed change, the abstract should clearly describe the proposed change. This is what *will* be done if the SIP is implemented, not *why* it should be done or *how* it will be done. If the SIP proposes deploying a new contract, write, \"we propose to deploy a new contract that will do x\".-->\n<p>In order to provide upgradability capabilities to Futures it needs to replace current FuturesMarket implementation. Based on how current Synths work, this SIP will replace the single FuturesMarket contract with a set of contracts:</p>\n<ul>\n<li>a proxy in front of it to have a fixed address.</li>\n<li>an state contract to hold all the FutureMarket state that can be later migrated if needed.</li>\n<li>a set of contracts (due to cotnract size limitations) with the implementation only that uses the state and are pointed by the proxy.</li>\n</ul>\n<p>This will require some addaptation based on the current <code>State</code> and <code>Proxy</code> to allow the implementation to be split in parts.</p>\n<h2 id=\"motivation\" style=\"position:relative;\"><a href=\"#motivation\" aria-label=\"motivation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Motivation</h2>\n<!--This is the problem statement. This is the *why* of the SIP. It should clearly explain *why* the current state of the protocol is inadequate.  It is critical that you explain *why* the change is needed, if the SIP proposes changing how something is calculated, you must address *why* the current calculation is innaccurate or wrong. This is not the place to describe how the SIP will address the issue!-->\n<p>The current Futures contracts are immutable and in order to add new features to it or if a bug is discovered, we need to provide upgradability. This is the first SIP of a series where new features are added and this effort is required to achieve that goal. The intention to maintain it separated from the new features introduced is to allow for minimum changes for the code review and audit.</p>\n<h2 id=\"specification\" style=\"position:relative;\"><a href=\"#specification\" aria-label=\"specification permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Specification</h2>\n<!--The specification should describe the syntax and semantics of any new feature, there are five sections\n1. Overview\n2. Rationale\n3. Technical Specification\n4. Test Cases\n5. Configurable Values\n-->\n<h3 id=\"overview\" style=\"position:relative;\"><a href=\"#overview\" aria-label=\"overview permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Overview</h3>\n<!--This is a high level overview of *how* the SIP will solve the problem. The overview should clearly describe how the new feature will be implemented.-->\n<p>This change will be done by duplication current <code>Futures</code> contracts, scripts and tests as <code>PerpsV2</code> (replacing the names and references), then the <code>FuturesMarket.sol</code> contract will be split into <code>ProxyPerpsV2Market.sol</code> as the market proxy, <code>PerpsV2MarketState.sol</code> as the state, and <code>PerpsV2Market.sol</code>, <code>PerpsV2MarketViews.sol</code>, <code>PerpsV2MarketNextPriceOrders.sol</code> as the implementation isolated on the different aspects of the functionality.</p>\n<p>In order to maintain homogeinity in the behaviour and naming, also FuturesMarketManager.sol is duplicated as PerpsV2MarketManager.sol changing the reference of the implementation to the proxy address, and <code>PerpsV2MarketSettings.sol</code> and <code>PerpsV2MarketData.sol</code> to use the appropriate references.</p>\n<p>The deployment scripts are added to work with this new complexity and the tests are adjusted to use the new contracts.</p>\n<p>Current <code>Futures</code> contract, tests, and scripts are untouched and the new markets will replace the current ones after they are migrated.</p>\n<h3 id=\"rationale\" style=\"position:relative;\"><a href=\"#rationale\" aria-label=\"rationale permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Rationale</h3>\n<!--This is where you explain the reasoning behind how you propose to solve the problem. Why did you propose to implement the change in this way, what were the considerations and trade-offs. The rationale fleshes out what motivated the design and why particular design decisions were made. It should describe alternate designs that were considered and related work. The rationale may also provide evidence of consensus within the community, and should discuss important objections or concerns raised during discussion.-->\n<p>This rationale behind this process is to get a new set of contracts for <code>PerpsV2</code> maintaining the current funtionality so that the tests, code review and audit of the code is minimized to reduce the risk of introducing bugs.</p>\n<p>This SIP introduces the minimum changes to make the current version upgradable and to release new futures features, and fix bugs if found as soon as possible. In order to get it done (and released) in a short period we propose this intermediate architecture. There is a plan to migrate all perps to the new V3 architecture (V3 is under development at the moment of this writting) that will be more optimized, but it is not certain when Perps V3 (based on V3 archtecture) can be prioritized after V3 is live and other parts of Synthetix system is ported to the new architecture before PerpsV3.</p>\n<p>The current Futures's architecture is based on the following components, each one with a different upgradability or migration complexity:</p>\n<ul>\n<li>\n<p><code>FuturesMarketManager.sol</code>: Maintains a list of markets in state. Not upgradable, but migrable via script to a new instance. Small ammount of data.</p>\n</li>\n<li>\n<p><code>FuturesMarketSettings.sol</code>: Upgradable. No state maintaned in the contract.</p>\n</li>\n<li>\n<p><code>FuturesMarketData.sol</code>: Upgradable. No state maintaned in the contract.</p>\n</li>\n<li>\n<p><code>FuturesMarket.sol</code>: One per each market. Maintains all the markets positions for the market. Not upgradable and difficult to migrate since there's no way to retrieve the data onchain.</p>\n<ul>\n<li><code>MixinFuturesViews.sol</code>: Mixin that is used in FuturesMarket. All the views are contained here.</li>\n<li><code>MixinFuturesNextPriceOrders.sol</code>: Mixin that is used in FuturesMarket. Maintains the next price orders state and implements the next price flow logic.</li>\n</ul>\n</li>\n</ul>\n<p>The proposed changes to the architecture, and their new maintenance, upgradability and migration complexity is shown below:</p>\n<ul>\n<li>\n<p><code>PerpsV2MarketManager.sol</code>: Maintains a list of markets in state. Not upgradable, but migrable via script to a new instance. Small ammount of data.</p>\n</li>\n<li>\n<p><code>PerpsV2MarketSettings.sol</code>: Upgradable. No state maintaned in the contract.</p>\n</li>\n<li>\n<p><code>PerpsV2MarketData.sol</code>: Upgradable. No state maintaned in the contract.</p>\n</li>\n<li>\n<p><code>ProxyPerpsV2.sol</code>: One per each market, is the entry point of each market. Not upgradable, but migrable via script to a new instance, it just maintains the market implementation(s) addresses.</p>\n<ul>\n<li><code>PerpsV2MarketState.sol</code>: Maintains all the markets positions and next price orders for the market. Not upgradable but easy to migrate since provides access to all the market positions data to the authorized associate contracts.</li>\n<li><code>PerpsV2Market.sol</code>: Implements all the basic futures flows and doesn't store any state information. Easily upgradable.</li>\n<li><code>PerpsV2MarketViews.sol</code>: Implements all the views for the market. It doesn't store any state information. Easily upgradable. Direct replacement of MixinFururesViews</li>\n<li><code>PerpsV2MarketNextPriceOrders.sol</code>: Implements the next price orders flows for the market. It doesn't store any state information. Easily upgradable. Direct replacement of MixinFururesNextPriceOrders</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"technical-specification\" style=\"position:relative;\"><a href=\"#technical-specification\" aria-label=\"technical specification permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Technical Specification</h3>\n<!--The technical specification should outline the public API of the changes proposed. That is, changes to any of the interfaces Synthetix currently exposes or the creations of new ones.-->\n<p>This architecture refactor is basically a change on the state variables location, addition of a proxy interface and split of FuturesMarket contract into small pieces. The interface of Futures is minimal but requuires some new base contract based on current implementations to extend <code>State.sol</code> and <code>Proxy.sol</code> as <code>StateShares.sol</code> and <code>ProxyPerpsV2.sol</code> to enable multiple proxied contracts instead of just one. The changes are detailed below.</p>\n<h4 id=\"proxyperpsv2sol\" style=\"position:relative;\"><a href=\"#proxyperpsv2sol\" aria-label=\"proxyperpsv2sol permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ProxyPerpsV2.sol</h4>\n<p>Based on <code>Proxy.sol</code> and with the introduction of some routing concepts of V3.</p>\n<p>It adds the capability to route a call to a the configured contract and if not found default to the proxy target. The routes indicates the function selector that needs to be routed, the target implementation and a flag to identify if it's a view or a transaction call to identify if it needs to set the messageSender on the target (view functions will revert if setMessageSender is called since it changes the state).</p>\n<p>Since the proxy has the <code>_emit</code> function that can be called by the implementation(s), it needs to be modified to accept more than one contract (the modifier changed from accept <code>onlyTarget</code> to <code>onlyTargets</code>).</p>\n<p>To manage the routes, ProxyPerpsV2 adds the following functions to the interface and events.</p>\n<pre><code>/* ========== FUNCTIONS ========== */\n\nfunction addRoute(bytes4 selector, address implementation, bool isView) external onlyOwner {}\nfunction removeRoute(bytes4 selector) external onlyOwner {}\nfunction getRoutesLength() external view returns (uint) {}\nfunction getRoutesPage(uint index, uint pageSize) external view returns (Route[] memory) {}\nfunction getAllTargets() external view returns (address[] memory) {}\n\n/* ========== EVENTS ========== */\n\nevent RouteUpdated(bytes4 route, address implementation, bool isView);\nevent RouteRemoved(bytes4 route);\nevent TargetedRouteAdded(address targetedRoute);\nevent TargetedRouteRemoved(address targetedRoute);\n</code></pre>\n<h4 id=\"statesharessol\" style=\"position:relative;\"><a href=\"#statesharessol\" aria-label=\"statesharessol permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>StateShares.sol</h4>\n<p>Based on <code>State.sol</code> adds the capability to update the state to more than one contract. The references to <code>associatedContract</code> changes to <code>associatedContracts</code> (plural) and the constructor takes now an address array instead of an address.</p>\n<p>The introduced modifier changes from <code>onlyAssociatedContract</code> to <code>onlyAssociatedContracts</code>.</p>\n<p>To manage the associated contracts, StateShares removes the setAssociatedContract() function and AssociatedContractSet event and are replaced by the following functions and events.</p>\n<pre><code>/* ========== FUNCTIONS ========== */\n\nfunction addAssociatedContracts(address[] calldata associatedContracts) external onlyOwner {}\nfunction removeAssociatedContracts(address[] calldata associatedContracts) external onlyOwner {}\nfunction associatedContracts() external view returns (address[] memory) {}\n\n/* ========== EVENTS ========== */\n\nevent AssociatedContractAdded(address associatedContract);\nevent AssociatedContractRemoved(address associatedContract);\n</code></pre>\n<h3 id=\"test-cases\" style=\"position:relative;\"><a href=\"#test-cases\" aria-label=\"test cases permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Test Cases</h3>\n<!--Test cases for an implementation are mandatory for SIPs but can be included with the implementation..-->\n<p>Apart from the duplicatation of all <code>Futures</code> test as <code>PerpsV2</code> tests and they adaptation to the new architecture (deployment of related contracts), it adds tests for <code>ProxyPerpsV2</code> and <code>StateShares</code> as well as adding tests to cover security accesibility for the contracts behind the new proxy (that needs to be reachable by the proxy for normal operation and by the owner to the administering functions).</p>\n<h3 id=\"configurable-values-via-sccp\" style=\"position:relative;\"><a href=\"#configurable-values-via-sccp\" aria-label=\"configurable values via sccp permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Configurable Values (Via SCCP)</h3>\n<!--Please list all values configurable via SCCP under this implementation.-->\n<p>No new values are configurable via SCCP under this implementation.</p>\n<h2 id=\"copyright\" style=\"position:relative;\"><a href=\"#copyright\" aria-label=\"copyright permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Copyright</h2>\n<p>Copyright and related rights waived via <a href=\"https://creativecommons.org/publicdomain/zero/1.0/\">CC0</a>.</p>"}},"pageContext":{"id":"cae3419b-73ee-57fa-bbbd-76e831f090ba","frontmatter__sip":280,"__params":{"frontmatter__sip":"280"}}},"staticQueryHashes":[]}