Unverified Commit 51d261e7 authored by J-shang's avatar J-shang Committed by GitHub
Browse files

Merge pull request #4668 from microsoft/doc-refactor

parents d63a2ea3 b469e1c1
...@@ -3,13 +3,9 @@ Introduction to NNI Training Services ...@@ -3,13 +3,9 @@ Introduction to NNI Training Services
.. toctree:: .. toctree::
Overview <./TrainingService/Overview> Overview <./TrainingService/Overview>
Local<./TrainingService/LocalMode>
Remote<./TrainingService/RemoteMachineMode> Remote<./TrainingService/RemoteMachineMode>
OpenPAI<./TrainingService/PaiMode> OpenPAI<./TrainingService/PaiMode>
Kubeflow<./TrainingService/KubeflowMode> Kubeflow<./TrainingService/KubeflowMode>
AdaptDL<./TrainingService/AdaptDLMode>
FrameworkController<./TrainingService/FrameworkControllerMode> FrameworkController<./TrainingService/FrameworkControllerMode>
DLTS<./TrainingService/DLTSMode>
AML<./TrainingService/AMLMode> AML<./TrainingService/AMLMode>
PAI-DLC<./TrainingService/DLCMode>
Hybrid<./TrainingService/HybridMode> Hybrid<./TrainingService/HybridMode>
"""
Code snippet card, used in index page.
"""
from docutils.parsers.rst import Directive, directives
from docutils.statemachine import StringList
from docutils import nodes
from sphinx.addnodes import pending_xref
CARD_TEMPLATE_HEADER = """
.. raw:: html
<div class="codesnippet-card admonition">
<div class="codesnippet-card-body">
<div class="codesnippet-card-title-container">
<div class="codesnippet-card-icon">
.. image:: {icon}
.. raw:: html
</div>
<h4>{title}</h4>
</div>
"""
CARD_TEMPLATE_FOOTER = """
.. raw:: html
</div>
"""
CARD_TEMPLATE_LINK_CONTAINER_HEADER = """
.. raw:: html
<div class="codesnippet-card-footer">
"""
CARD_TEMPLATE_LINK = """
.. raw:: html
<div class="codesnippet-card-link">
{seemore}
<span class="material-icons right">arrow_forward</span>
</div>
"""
class CodeSnippetCardDirective(Directive):
option_spec = {
'icon': directives.unchanged,
'title': directives.unchanged,
'link': directives.unchanged,
'seemore': directives.unchanged,
}
has_content = True
def run(self):
anchor_node = nodes.paragraph()
try:
title = self.options['title']
link = directives.uri(self.options['link'])
icon = directives.uri(self.options['icon'])
seemore = self.options.get('seemore', 'For a full tutorial, please go here.')
except ValueError as e:
print(e)
raise
# header, title, icon...
card_rst = CARD_TEMPLATE_HEADER.format(title=title, icon=icon)
card_list = StringList(card_rst.split('\n'))
self.state.nested_parse(card_list, self.content_offset, anchor_node)
# code snippet
self.state.nested_parse(self.content, self.content_offset, anchor_node)
# close body
self.state.nested_parse(StringList(CARD_TEMPLATE_FOOTER.split('\n')), self.content_offset, anchor_node)
# start footer
self.state.nested_parse(StringList(CARD_TEMPLATE_LINK_CONTAINER_HEADER.split('\n')), self.content_offset, anchor_node)
# full tutorial link
link_node = pending_xref(CARD_TEMPLATE_LINK,
reftype='doc',
refdomain='std',
reftarget=link,
refexplicit=False,
refwarn=True,
refkeepformat=True)
# refkeepformat is handled in `patch_autodoc.py`
self.state.nested_parse(StringList(CARD_TEMPLATE_LINK.format(seemore=seemore).split('\n')), self.content_offset, link_node)
anchor_node += link_node
# close footer
self.state.nested_parse(StringList(CARD_TEMPLATE_FOOTER.split('\n')), self.content_offset, anchor_node)
# close whole
self.state.nested_parse(StringList(CARD_TEMPLATE_FOOTER.split('\n')), self.content_offset, anchor_node)
return [anchor_node]
def setup(app):
app.add_directive('codesnippetcard', CodeSnippetCardDirective)
"""Hack autodoc to get more fine-grained docstring rendering contol.
autodoc and autosummary didn't expose many of their controls to sphinx users via config.
To customize them, the "correct" approach seems to copy and paste all their code and rewrite some part.
To avoid doing this, I monkey-patched some of the functions to keep the changes minimal.
Note that some of them are related to sphinx internal APIs, which can be broken when sphinx got upgraded.
Try to keep them updated, or pin to a particular sphinx version.
"""
import inspect
import os
from typing import List, Tuple, List
import sphinx
from docutils import nodes
from docutils.nodes import Node
class ClassNewBlacklistPatch:
"""Force some classes to skip ``__new__`` when generating signature."""
original = None
def restore(self, *args, **kwargs):
assert self.original is not None
sphinx.ext.autodoc._CLASS_NEW_BLACKLIST = self.original
def patch(self, *args, **kwargs):
self.original = sphinx.ext.autodoc._CLASS_NEW_BLACKLIST
blacklist = []
import nni.retiarii.nn.pytorch
for name in dir(nni.retiarii.nn.pytorch):
obj = getattr(nni.retiarii.nn.pytorch, name)
if inspect.isclass(obj):
new_name = "{0.__module__}.{0.__qualname__}".format(obj.__new__)
if new_name not in blacklist:
blacklist.append(new_name)
sphinx.ext.autodoc._CLASS_NEW_BLACKLIST = self.original + blacklist
def disable_trace_patch(*args, **kwargs):
"""Disable trace by setting an environment variable."""
os.environ['NNI_TRACE_FLAG'] = 'DISABLE'
def trial_tool_import_patch(*args, **kwargs):
"""Insert dummy trial tool variable to ensure trial_tool can be imported.
See nni/tools/trial_tool/constants.py
"""
os.environ.update({
'NNI_OUTPUT_DIR': '/tmp',
'NNI_PLATFORM': 'unittest',
'NNI_SYS_DIR': '/tmp',
'NNI_TRIAL_JOB_ID': 'dummy',
'NNI_EXP_ID': 'dummy',
'MULTI_PHASE': 'dummy'
})
class AutoSummaryPatch:
"""Ignore certain files as they are completely un-importable. It patches:
- find_autosummary_in_files: Some modules cannot be imported at all due to dependency issues or some special design.
They need to skipped when running autosummary generate.
- Autosummary.get_table: The original autosummary creates an index for each module, and the module links in autosummary table
points to the corresponding generated module page (by using ``:py:module:xxx``). This doesn't work for us,
because we have used automodule else (other than autosummary) in our docs, and to avoid duplicate index,
we have to set ``:noindex:`` in autosummary template (see docs/templates/autosummary/module.rst).
This breaks most of the links, where they fail to link to generated module page by using index.
We here update the python domain role, to a general domain role (``:doc:``), and link to the page directly.
"""
find_autosummary_original = None
get_table_original = None
def restore(self, *args, **kwargs):
assert self.find_autosummary_original is not None and self.get_table_original is not None
sphinx.ext.autosummary.generate.find_autosummary_in_files = self.find_autosummary_original
sphinx.ext.autosummary.Autosummary.get_table = self.get_table_original
def patch(self, app, config):
from sphinx.ext.autosummary import Autosummary
from sphinx.ext.autosummary.generate import AutosummaryEntry
self.find_autosummary_original = sphinx.ext.autosummary.generate.find_autosummary_in_files
self.get_table_original = Autosummary.get_table
def find_autosummary_in_files(filenames: List[str]) -> List[AutosummaryEntry]:
items: List[AutosummaryEntry] = self.find_autosummary_original(filenames)
items = [item for item in items if item.name not in config.autosummary_mock_imports]
return items
def get_table(autosummary, items: List[Tuple[str, str, str, str]]) -> List[Node]:
col_spec, autosummary_table = self.get_table_original(autosummary, items)
if 'toctree' in autosummary.options:
# probably within modules
table = autosummary_table[0]
tgroup = table[0]
tbody = tgroup[-1]
for row in tbody:
entry = row[0]
paragraph = entry[0]
pending_xref = paragraph[0]
# get the reference path and check whether it has been generated
# if path to reference is changed, this should also be changed
reftarget_path = 'reference/_modules/' + pending_xref['reftarget']
if reftarget_path in autosummary.env.found_docs:
# make :py:obj:`xxx` looks like a :doc:`xxx`
pending_xref['refdomain'] = 'std'
pending_xref['reftype'] = 'doc'
pending_xref['refexplicit'] = False
pending_xref['refwarn'] = True
pending_xref['reftarget'] = '/' + reftarget_path
# a special tag to enable `ResolveDocPatch`
pending_xref['refkeepformat'] = True
return [col_spec, autosummary_table]
sphinx.ext.autosummary.generate.find_autosummary_in_files = find_autosummary_in_files
sphinx.ext.autosummary.Autosummary.get_table = get_table
class ResolveDocPatch:
"""Original :doc: role throws away all the format, and keep raw text only.
We wish to keep module names literal. This patch is to keep literal format in :doc: resolver."""
original = None
def restore(self, *args, **kwargs):
assert self.original is not None
sphinx.domains.std.StandardDomain._resolve_doc_xref = self.original
def patch(self, *args, **kwargs):
self.original = sphinx.domains.std.StandardDomain._resolve_doc_xref
def doc_xref_resolver(std_domain, env, fromdocname, builder, typ, target, node, contnode):
if not node.get('refkeepformat'):
# redirect to original implementation to make it safer
return self.original(std_domain, env, fromdocname, builder, typ, target, node, contnode)
# directly reference to document by source name; can be absolute or relative
from sphinx.domains.std import docname_join, make_refnode
refdoc = node.get('refdoc', fromdocname)
docname = docname_join(refdoc, node['reftarget'])
if docname not in env.all_docs:
return None
else:
innernode = node[0] # no astext here, to keep literal intact
return make_refnode(builder, fromdocname, docname, None, innernode)
sphinx.domains.std.StandardDomain._resolve_doc_xref = doc_xref_resolver
def setup(app):
# See life-cycle of sphinx app here:
# https://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx-core-events
patch = ClassNewBlacklistPatch()
app.connect('env-before-read-docs', patch.patch)
app.connect('env-merge-info', patch.restore)
patch = ResolveDocPatch()
app.connect('env-before-read-docs', patch.patch)
app.connect('env-merge-info', patch.restore)
app.connect('env-before-read-docs', disable_trace_patch)
# autosummary generate happens at builder-inited
app.connect('config-inited', trial_tool_import_patch)
autosummary_patch = AutoSummaryPatch()
app.connect('config-inited', autosummary_patch.patch)
app.connect('env-merge-info', autosummary_patch.restore)
"""Creating hard links for tutorials in each individual topics."""
import os
import re
HEADER = """.. THIS FILE IS A COPY OF {} WITH MODIFICATIONS.
.. TO MAKE ONE TUTORIAL APPEAR IN MULTIPLE PLACES.
"""
def flatten_filename(filename):
return filename.replace('/', '_').replace('.', '_')
def copy_tutorials(app):
# TODO: use sphinx logger
print('[tutorial links] copy tutorials...')
for src, tar in app.config.tutorials_copy_list:
target_path = os.path.join(app.srcdir, tar)
content = open(os.path.join(app.srcdir, src)).read()
# Add a header
content = HEADER.format(src) + content
# Add a prefix to labels to avoid duplicates.
label_map = {}
# find all anchors: https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html
# but not hyperlinks: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#external-links
for prefix, label_name in list(re.findall(r'(\.\.\s*_)(.*?)\:\s*\n', content)):
label_map[label_name] = flatten_filename(tar) + '_' + label_name
# anchor
content = content.replace(prefix + label_name + ':', prefix + label_map[label_name] + ':')
# :ref:`xxx`
content = content.replace(f':ref:`{label_name}`', f':ref:`{label_map[label_name]}')
# :ref:`yyy <xxx>`
content = re.sub(r"(\:ref\:`.*?\<)" + label_name + r"(\>`)", r'\1' + label_map[label_name] + r'\2', content)
open(target_path, 'w').write(content)
def setup(app):
# See life-cycle of sphinx app here:
# https://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx-core-events
app.connect('builder-inited', copy_tutorials)
app.add_config_value('tutorials_copy_list', [], True, [list])
<svg width="52" height="41" viewBox="0 0 52 41" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 4C0 1.79086 1.79086 0 4 0H20C22.207 0 23.9965 1.78737 24 3.99353C24 3.99572 24 3.99791 24 4.00012C24 5.6481 25.3288 6.98572 26.9734 7H48C50.2091 7 52 8.79086 52 11V37C52 39.2091 50.2091 41 48 41H4C1.79086 41 0 39.2091 0 37V11V4Z" fill="#374BAE"/>
<path d="M10.5 26L17.5 16.5L28.5 28.5L41.5 23.5" stroke="white"/>
<circle cx="10" cy="27" r="2" fill="#FF78B0"/>
<circle cx="17.5" cy="16.5" r="2.5" fill="#FDDE83"/>
<circle cx="41.5" cy="23.5" r="2.5" fill="white"/>
<path d="M33 27.5C33 29.9853 30.9853 32 28.5 32C26.0147 32 24 29.9853 24 27.5C24 25.0147 26.0147 23 28.5 23C30.9853 23 33 25.0147 33 27.5Z" fill="#A3DAF8"/>
</svg>
<svg width="32" height="30" viewBox="0 0 32 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 4C0 1.79086 1.79086 0 4 0H20C23.3137 0 26 2.68629 26 6V26C26 28.2091 24.2091 30 22 30H4C1.79086 30 0 28.2091 0 26V4Z" fill="url(#paint0_linear_12_337)"/>
<path d="M20 0V0C23.3137 0 26 2.68629 26 6V6H20V0Z" fill="url(#paint1_linear_12_337)"/>
<path opacity="0.2" d="M6 19.5L13 15.5L20 19.5L13 23.5L6 19.5Z" fill="white"/>
<path opacity="0.2" d="M6 16L13 12L20 16L13 20L6 16Z" fill="white"/>
<path d="M6 12L13 8L20 12L13 16L6 12Z" fill="white"/>
<g filter="url(#filter0_b_12_337)">
<rect x="18" y="16" width="14" height="10" rx="2" fill="#FFBFBB" fill-opacity="0.44"/>
</g>
<g filter="url(#filter1_b_12_337)">
<rect x="18.1" y="16.1" width="13.8" height="9.8" rx="1.9" stroke="url(#paint2_linear_12_337)" stroke-width="0.2"/>
</g>
<path d="M28 20V18H26M28 22V24H26M24 18H22V20M22 22V24H24" stroke="#EA501F"/>
<rect x="24" y="20" width="2" height="2" rx="1" fill="#EA501F"/>
<defs>
<filter id="filter0_b_12_337" x="14" y="12" width="22" height="18" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImage" stdDeviation="2"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_12_337"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_12_337" result="shape"/>
</filter>
<filter id="filter1_b_12_337" x="10" y="8" width="30" height="26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImage" stdDeviation="4"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_12_337"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_12_337" result="shape"/>
</filter>
<linearGradient id="paint0_linear_12_337" x1="23" y1="28.125" x2="2.28188" y2="-0.358586" gradientUnits="userSpaceOnUse">
<stop stop-color="#E15D33"/>
<stop offset="1" stop-color="#FFA37B"/>
</linearGradient>
<linearGradient id="paint1_linear_12_337" x1="21.5" y1="6" x2="24.7771" y2="2.16386" gradientUnits="userSpaceOnUse">
<stop stop-color="#E15D33"/>
<stop offset="1" stop-color="#FFA37B"/>
</linearGradient>
<linearGradient id="paint2_linear_12_337" x1="19" y1="17" x2="32" y2="24" gradientUnits="userSpaceOnUse">
<stop stop-color="#F7F2EB" stop-opacity="0.6"/>
<stop offset="1" stop-color="#DDCAAD" stop-opacity="0.12"/>
</linearGradient>
</defs>
</svg>
<svg width="32" height="30" viewBox="0 0 32 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 4C0 1.79086 1.79086 0 4 0H20C23.3137 0 26 2.68629 26 6V26C26 28.2091 24.2091 30 22 30H4C1.79086 30 0 28.2091 0 26V4Z" fill="url(#paint0_linear_12_193)"/>
<path opacity="0.4" d="M5.97656 9.27344C5.49479 9.27344 5.11458 9.22266 4.83594 9.12109C4.55729 9.02214 4.35547 8.86589 4.23047 8.65234C4.10807 8.44141 4.04688 8.11719 4.04688 7.67969V6.97656C4.04688 6.50781 3.85286 6.27344 3.46484 6.27344V5.39844C3.85286 5.39844 4.04688 5.16146 4.04688 4.6875V4.03125C4.04688 3.57292 4.10677 3.23698 4.22656 3.02344C4.34896 2.80729 4.54818 2.64974 4.82422 2.55078C5.10286 2.44922 5.48698 2.39844 5.97656 2.39844V3.27344C5.76302 3.27344 5.60547 3.32161 5.50391 3.41797C5.40234 3.51432 5.35156 3.67839 5.35156 3.91016V4.46484C5.35156 4.81901 5.30339 5.10807 5.20703 5.33203C5.11068 5.55599 4.95312 5.72005 4.73438 5.82422V5.83984C4.95052 5.94401 5.10677 6.11198 5.20312 6.34375C5.30208 6.57552 5.35156 6.88021 5.35156 7.25781V7.75391C5.35156 7.98828 5.39974 8.15365 5.49609 8.25C5.59245 8.34896 5.7526 8.39844 5.97656 8.39844V9.27344Z" fill="white"/>
<path opacity="0.4" d="M14.4023 25.2734C14.0143 25.2734 13.8203 25.5104 13.8203 25.9844V26.6406C13.8203 27.099 13.7591 27.4349 13.6367 27.6484C13.5169 27.8646 13.3177 28.0221 13.0391 28.1211C12.763 28.2227 12.3802 28.2734 11.8906 28.2734V27.3984C12.1068 27.3984 12.2643 27.3503 12.3633 27.2539C12.4648 27.1576 12.5156 26.9935 12.5156 26.7617V26.207C12.5156 25.8555 12.5625 25.5677 12.6562 25.3438C12.7526 25.1198 12.9115 24.9544 13.1328 24.8477V24.832C12.9167 24.7253 12.7591 24.5547 12.6602 24.3203C12.5638 24.0859 12.5156 23.7839 12.5156 23.4141V22.9219C12.5156 22.6901 12.4688 22.5247 12.375 22.4258C12.2812 22.3242 12.1198 22.2734 11.8906 22.2734V21.3984C12.375 21.3984 12.7552 21.4492 13.0312 21.5508C13.3099 21.6497 13.5104 21.806 13.6328 22.0195C13.7578 22.2305 13.8203 22.5547 13.8203 22.9922V23.6953C13.8203 24.1641 14.0143 24.3984 14.4023 24.3984V25.2734Z" fill="white"/>
<path d="M20 0V0C23.3137 0 26 2.68629 26 6V6H20V0Z" fill="url(#paint1_linear_12_193)"/>
<path d="M6.84766 16H5.67969V15.4258H5.66406C5.39583 15.8737 4.9987 16.0977 4.47266 16.0977C4.08464 16.0977 3.77865 15.9883 3.55469 15.7695C3.33333 15.5482 3.22266 15.2539 3.22266 14.8867C3.22266 14.1107 3.68229 13.6628 4.60156 13.543L5.6875 13.3984C5.6875 12.9609 5.45052 12.7422 4.97656 12.7422C4.5 12.7422 4.04688 12.8841 3.61719 13.168V12.2383C3.78906 12.1497 4.02344 12.0716 4.32031 12.0039C4.61979 11.9362 4.89193 11.9023 5.13672 11.9023C6.27734 11.9023 6.84766 12.4714 6.84766 13.6094V16ZM5.6875 14.375V14.1055L4.96094 14.1992C4.5599 14.2513 4.35938 14.4323 4.35938 14.7422C4.35938 14.8828 4.40755 14.9987 4.50391 15.0898C4.60286 15.1784 4.73568 15.2227 4.90234 15.2227C5.13411 15.2227 5.32292 15.1432 5.46875 14.9844C5.61458 14.8229 5.6875 14.6198 5.6875 14.375Z" fill="white"/>
<path d="M21.3711 15.1641C21.0508 15.7865 20.5677 16.0977 19.9219 16.0977C19.4141 16.0977 19.0143 15.9141 18.7227 15.5469C18.431 15.1797 18.2852 14.7018 18.2852 14.1133C18.2852 13.4753 18.4544 12.9479 18.793 12.5312C19.1315 12.112 19.5859 11.9023 20.1562 11.9023C20.7995 11.9023 21.2344 12.1771 21.4609 12.7266H21.4805L21.6992 12H22.9453L22.082 14.0273C22.181 14.3971 22.2826 14.6641 22.3867 14.8281C22.4935 14.9896 22.6159 15.0703 22.7539 15.0703C22.8763 15.0703 22.9792 15.0495 23.0625 15.0078L23.0469 15.9531C22.875 16.0234 22.6784 16.0586 22.457 16.0586C22.1706 16.0586 21.9427 15.9896 21.7734 15.8516C21.6068 15.7109 21.4805 15.4818 21.3945 15.1641H21.3711ZM21.1055 13.9453C20.9544 13.2083 20.6901 12.8398 20.3125 12.8398C20.0651 12.8398 19.8711 12.9544 19.7305 13.1836C19.5898 13.4128 19.5195 13.6979 19.5195 14.0391C19.5195 14.3646 19.5755 14.6302 19.6875 14.8359C19.8021 15.0391 19.9674 15.1406 20.1836 15.1406C20.5534 15.1406 20.8411 14.8034 21.0469 14.1289L21.1055 13.9453Z" fill="white"/>
<rect opacity="0.3" x="9" y="13" width="3" height="1" fill="#FFFEFE"/>
<rect opacity="0.3" x="9" y="15" width="3" height="1" fill="#FFFEFE"/>
<path d="M14 13L16 14.5L14 16" stroke="white"/>
<g filter="url(#filter0_b_12_193)">
<rect x="18" y="16" width="14" height="10" rx="2" fill="#BBE3FF" fill-opacity="0.44"/>
</g>
<g filter="url(#filter1_b_12_193)">
<rect x="18.1" y="16.1" width="13.8" height="9.8" rx="1.9" stroke="url(#paint2_linear_12_193)" stroke-width="0.2"/>
</g>
<path d="M22.6099 23V21.6938H21.3989V23H20.3442V19.499H21.3989V20.7954H22.6099V19.499H23.6646V23H22.6099ZM27.2192 20.6538C27.2192 20.8931 27.1582 21.1055 27.0361 21.291C26.9157 21.4766 26.7432 21.6206 26.5186 21.7231C26.2939 21.8241 26.0327 21.8745 25.7349 21.8745H25.4126V23H24.3579V19.499H25.7935C26.2866 19.499 26.6471 19.5926 26.875 19.7798C27.1045 19.967 27.2192 20.2583 27.2192 20.6538ZM26.1035 20.6904C26.1035 20.5472 26.062 20.439 25.979 20.3657C25.896 20.2925 25.7739 20.2559 25.6128 20.2559H25.4126V21.1201H25.6494C25.9521 21.1201 26.1035 20.9769 26.1035 20.6904ZM30.9692 21.2397C30.9692 21.5913 30.8936 21.9062 30.7422 22.1846C30.5908 22.4613 30.3792 22.6769 30.1074 22.8315C29.8356 22.9845 29.5312 23.061 29.1943 23.061C28.8656 23.061 28.5661 22.987 28.2959 22.8389C28.0273 22.6891 27.8182 22.48 27.6685 22.2114C27.5187 21.9412 27.4438 21.6361 27.4438 21.2959C27.4438 20.9395 27.5195 20.6188 27.6709 20.334C27.8223 20.0492 28.0347 19.8294 28.3081 19.6748C28.5815 19.5186 28.8924 19.4404 29.2407 19.4404C29.576 19.4404 29.8755 19.5153 30.1392 19.665C30.4045 19.8132 30.6087 20.0256 30.752 20.3022C30.8968 20.5773 30.9692 20.8898 30.9692 21.2397ZM29.8511 21.269C29.8511 20.981 29.7957 20.7539 29.6851 20.5879C29.5744 20.4219 29.423 20.3389 29.231 20.3389C29.021 20.3389 28.8574 20.4186 28.7402 20.5781C28.623 20.7376 28.5645 20.9631 28.5645 21.2544C28.5645 21.5392 28.6222 21.7614 28.7378 21.9209C28.855 22.0804 29.0137 22.1602 29.2139 22.1602C29.3359 22.1602 29.4458 22.1243 29.5435 22.0527C29.6411 21.9811 29.7168 21.8786 29.7705 21.7451C29.8242 21.6117 29.8511 21.453 29.8511 21.269Z" fill="#1897FF"/>
<defs>
<filter id="filter0_b_12_193" x="14" y="12" width="22" height="18" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImage" stdDeviation="2"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_12_193"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_12_193" result="shape"/>
</filter>
<filter id="filter1_b_12_193" x="10" y="8" width="30" height="26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImage" stdDeviation="4"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_12_193"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_12_193" result="shape"/>
</filter>
<linearGradient id="paint0_linear_12_193" x1="23" y1="28.125" x2="2.28188" y2="-0.358586" gradientUnits="userSpaceOnUse">
<stop stop-color="#4BA7F4"/>
<stop offset="1" stop-color="#68C2FF"/>
</linearGradient>
<linearGradient id="paint1_linear_12_193" x1="20" y1="6" x2="24.718" y2="2.45575" gradientUnits="userSpaceOnUse">
<stop stop-color="#3BA2F9"/>
<stop offset="1" stop-color="#68C2FF"/>
</linearGradient>
<linearGradient id="paint2_linear_12_193" x1="19" y1="17" x2="32" y2="24" gradientUnits="userSpaceOnUse">
<stop stop-color="#EBF2F7" stop-opacity="0.6"/>
<stop offset="1" stop-color="#ADC6DD" stop-opacity="0.12"/>
</linearGradient>
</defs>
</svg>
<svg width="32" height="30" viewBox="0 0 32 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.2" d="M3 4C3 1.79086 4.79086 0 7 0H23C26.3137 0 29 2.68629 29 6V26C29 28.2091 27.2091 30 25 30H7C4.79086 30 3 28.2091 3 26V4Z" fill="url(#paint0_linear_12_317)"/>
<path d="M0 4C0 1.79086 1.79086 0 4 0H20C23.3137 0 26 2.68629 26 6V26C26 28.2091 24.2091 30 22 30H4C1.79086 30 0 28.2091 0 26V4Z" fill="url(#paint1_linear_12_317)"/>
<path d="M20 0V0C23.3137 0 26 2.68629 26 6V6H20V0Z" fill="url(#paint2_linear_12_317)"/>
<path d="M10.0707 4.92929C10.0317 4.89024 9.96834 4.89024 9.92929 4.92929C9.89024 4.96834 9.89024 5.03166 9.92929 5.07071L10.0707 4.92929ZM17 12L16.7011 10.8846L15.8846 11.7011L17 12ZM9.92929 5.07071L16.2929 11.4343L16.4343 11.2929L10.0707 4.92929L9.92929 5.07071Z" fill="white"/>
<path d="M13 23L14.1154 22.7011L13.2989 21.8846L13 23ZM18.9293 16.9293L13.5657 22.2929L13.7071 22.4343L19.0707 17.0707L18.9293 16.9293Z" fill="white"/>
<path d="M18 15.1C18.0552 15.1 18.1 15.0552 18.1 15C18.1 14.9448 18.0552 14.9 18 14.9V15.1ZM13 15L14 15.5774V14.4226L13 15ZM18 14.9L13.9 14.9V15.1L18 15.1V14.9Z" fill="white"/>
<path d="M10 12L10.5774 11L9.42265 11L10 12ZM10 6L9.42265 7L10.5773 7L10 6ZM10.1 11.1L10.1 9.1875L9.9 9.1875L9.9 11.1L10.1 11.1ZM10.1 9.1875L10.1 6.9L9.9 6.9L9.9 9.1875L10.1 9.1875Z" fill="white"/>
<path d="M10 21L10.5774 20L9.42265 20L10 21ZM10 15L9.42265 16L10.5773 16L10 15ZM10.1 20.1L10.1 18.1875L9.9 18.1875L9.9 20.1L10.1 20.1ZM10.1 18.1875L10.1 15.9L9.9 15.9L9.9 18.1875L10.1 18.1875Z" fill="white"/>
<path d="M11 7.1C11.0552 7.1 11.1 7.05523 11.1 7C11.1 6.94477 11.0552 6.9 11 6.9V7.1ZM5 7V6.9H4.9V7H5ZM5 24H4.9V24.1H5V24ZM7 24L6 23.4226V24.5774L7 24ZM6.83333 23.9C6.7781 23.9 6.73333 23.9448 6.73333 24C6.73333 24.0552 6.7781 24.1 6.83333 24.1V23.9ZM6.5 24.1C6.55523 24.1 6.6 24.0552 6.6 24C6.6 23.9448 6.55523 23.9 6.5 23.9V24.1ZM6.16667 23.9C6.11144 23.9 6.06667 23.9448 6.06667 24C6.06667 24.0552 6.11144 24.1 6.16667 24.1V23.9ZM5.83333 24.1C5.88856 24.1 5.93333 24.0552 5.93333 24C5.93333 23.9448 5.88856 23.9 5.83333 23.9V24.1ZM5.5 23.9C5.44477 23.9 5.4 23.9448 5.4 24C5.4 24.0552 5.44477 24.1 5.5 24.1V23.9ZM5.16667 24.1C5.22189 24.1 5.26667 24.0552 5.26667 24C5.26667 23.9448 5.22189 23.9 5.16667 23.9V24.1ZM5.1 23.7976C5.1 23.7424 5.05523 23.6976 5 23.6976C4.94477 23.6976 4.9 23.7424 4.9 23.7976H5.1ZM4.9 23.3929C4.9 23.4481 4.94477 23.4929 5 23.4929C5.05523 23.4929 5.1 23.4481 5.1 23.3929H4.9ZM5.1 22.9881C5.1 22.9329 5.05523 22.8881 5 22.8881C4.94477 22.8881 4.9 22.9329 4.9 22.9881H5.1ZM4.9 22.5833C4.9 22.6386 4.94477 22.6833 5 22.6833C5.05523 22.6833 5.1 22.6386 5.1 22.5833H4.9ZM5.1 22.1786C5.1 22.1233 5.05523 22.0786 5 22.0786C4.94477 22.0786 4.9 22.1233 4.9 22.1786H5.1ZM4.9 21.7738C4.9 21.829 4.94477 21.8738 5 21.8738C5.05523 21.8738 5.1 21.829 5.1 21.7738H4.9ZM5.1 21.369C5.1 21.3138 5.05523 21.269 5 21.269C4.94477 21.269 4.9 21.3138 4.9 21.369H5.1ZM4.9 20.9643C4.9 21.0195 4.94477 21.0643 5 21.0643C5.05523 21.0643 5.1 21.0195 5.1 20.9643H4.9ZM5.1 20.5595C5.1 20.5043 5.05523 20.4595 5 20.4595C4.94477 20.4595 4.9 20.5043 4.9 20.5595H5.1ZM4.9 20.1548C4.9 20.21 4.94477 20.2548 5 20.2548C5.05523 20.2548 5.1 20.21 5.1 20.1548H4.9ZM5.1 19.75C5.1 19.6948 5.05523 19.65 5 19.65C4.94477 19.65 4.9 19.6948 4.9 19.75H5.1ZM4.9 19.3452C4.9 19.4005 4.94477 19.4452 5 19.4452C5.05523 19.4452 5.1 19.4005 5.1 19.3452H4.9ZM5.1 18.9405C5.1 18.8852 5.05523 18.8405 5 18.8405C4.94477 18.8405 4.9 18.8852 4.9 18.9405H5.1ZM4.9 18.5357C4.9 18.5909 4.94477 18.6357 5 18.6357C5.05523 18.6357 5.1 18.5909 5.1 18.5357H4.9ZM5.1 18.131C5.1 18.0757 5.05523 18.031 5 18.031C4.94477 18.031 4.9 18.0757 4.9 18.131H5.1ZM4.9 17.7262C4.9 17.7814 4.94477 17.8262 5 17.8262C5.05523 17.8262 5.1 17.7814 5.1 17.7262H4.9ZM5.1 17.3214C5.1 17.2662 5.05523 17.2214 5 17.2214C4.94477 17.2214 4.9 17.2662 4.9 17.3214H5.1ZM4.9 16.9167C4.9 16.9719 4.94477 17.0167 5 17.0167C5.05523 17.0167 5.1 16.9719 5.1 16.9167H4.9ZM5.1 16.5119C5.1 16.4567 5.05523 16.4119 5 16.4119C4.94477 16.4119 4.9 16.4567 4.9 16.5119H5.1ZM4.9 16.1071C4.9 16.1624 4.94477 16.2071 5 16.2071C5.05523 16.2071 5.1 16.1624 5.1 16.1071H4.9ZM5.1 15.7024C5.1 15.6472 5.05523 15.6024 5 15.6024C4.94477 15.6024 4.9 15.6472 4.9 15.7024H5.1ZM4.9 15.2976C4.9 15.3528 4.94477 15.3976 5 15.3976C5.05523 15.3976 5.1 15.3528 5.1 15.2976H4.9ZM5.1 14.8929C5.1 14.8376 5.05523 14.7929 5 14.7929C4.94477 14.7929 4.9 14.8376 4.9 14.8929H5.1ZM4.9 14.4881C4.9 14.5433 4.94477 14.5881 5 14.5881C5.05523 14.5881 5.1 14.5433 5.1 14.4881H4.9ZM5.1 14.0833C5.1 14.0281 5.05523 13.9833 5 13.9833C4.94477 13.9833 4.9 14.0281 4.9 14.0833H5.1ZM4.9 13.6786C4.9 13.7338 4.94477 13.7786 5 13.7786C5.05523 13.7786 5.1 13.7338 5.1 13.6786H4.9ZM5.1 13.2738C5.1 13.2186 5.05523 13.1738 5 13.1738C4.94477 13.1738 4.9 13.2186 4.9 13.2738H5.1ZM4.9 12.869C4.9 12.9243 4.94477 12.969 5 12.969C5.05523 12.969 5.1 12.9243 5.1 12.869H4.9ZM5.1 12.4643C5.1 12.4091 5.05523 12.3643 5 12.3643C4.94477 12.3643 4.9 12.4091 4.9 12.4643H5.1ZM4.9 12.0595C4.9 12.1148 4.94477 12.1595 5 12.1595C5.05523 12.1595 5.1 12.1148 5.1 12.0595H4.9ZM5.1 11.6548C5.1 11.5995 5.05523 11.5548 5 11.5548C4.94477 11.5548 4.9 11.5995 4.9 11.6548H5.1ZM4.9 11.25C4.9 11.3052 4.94477 11.35 5 11.35C5.05523 11.35 5.1 11.3052 5.1 11.25H4.9ZM5.1 10.8452C5.1 10.79 5.05523 10.7452 5 10.7452C4.94477 10.7452 4.9 10.79 4.9 10.8452H5.1ZM4.9 10.4405C4.9 10.4957 4.94477 10.5405 5 10.5405C5.05523 10.5405 5.1 10.4957 5.1 10.4405H4.9ZM5.1 10.0357C5.1 9.98048 5.05523 9.93571 5 9.93571C4.94477 9.93571 4.9 9.98048 4.9 10.0357H5.1ZM4.9 9.63095C4.9 9.68618 4.94477 9.73095 5 9.73095C5.05523 9.73095 5.1 9.68618 5.1 9.63095H4.9ZM5.1 9.22619C5.1 9.17096 5.05523 9.12619 5 9.12619C4.94477 9.12619 4.9 9.17096 4.9 9.22619H5.1ZM4.9 8.82142C4.9 8.87665 4.94477 8.92142 5 8.92142C5.05523 8.92142 5.1 8.87665 5.1 8.82142H4.9ZM5.1 8.41666C5.1 8.36143 5.05523 8.31666 5 8.31666C4.94477 8.31666 4.9 8.36143 4.9 8.41666H5.1ZM4.9 8.0119C4.9 8.06713 4.94477 8.1119 5 8.1119C5.05523 8.1119 5.1 8.06713 5.1 8.0119H4.9ZM5.1 7.60714C5.1 7.55191 5.05523 7.50714 5 7.50714C4.94477 7.50714 4.9 7.55191 4.9 7.60714H5.1ZM4.9 7.20238C4.9 7.2576 4.94477 7.30238 5 7.30238C5.05523 7.30238 5.1 7.2576 5.1 7.20238H4.9ZM5.1875 7.1C5.24273 7.1 5.2875 7.05523 5.2875 7C5.2875 6.94477 5.24273 6.9 5.1875 6.9V7.1ZM5.5625 6.9C5.50727 6.9 5.4625 6.94477 5.4625 7C5.4625 7.05523 5.50727 7.1 5.5625 7.1V6.9ZM5.9375 7.1C5.99273 7.1 6.0375 7.05523 6.0375 7C6.0375 6.94477 5.99273 6.9 5.9375 6.9V7.1ZM6.3125 6.9C6.25727 6.9 6.2125 6.94477 6.2125 7C6.2125 7.05523 6.25727 7.1 6.3125 7.1V6.9ZM6.6875 7.1C6.74273 7.1 6.7875 7.05523 6.7875 7C6.7875 6.94477 6.74273 6.9 6.6875 6.9V7.1ZM7.0625 6.9C7.00727 6.9 6.9625 6.94477 6.9625 7C6.9625 7.05523 7.00727 7.1 7.0625 7.1V6.9ZM7.4375 7.1C7.49273 7.1 7.5375 7.05523 7.5375 7C7.5375 6.94477 7.49273 6.9 7.4375 6.9V7.1ZM7.8125 6.9C7.75727 6.9 7.7125 6.94477 7.7125 7C7.7125 7.05523 7.75727 7.1 7.8125 7.1V6.9ZM8.1875 7.1C8.24273 7.1 8.2875 7.05523 8.2875 7C8.2875 6.94477 8.24273 6.9 8.1875 6.9V7.1ZM8.5625 6.9C8.50727 6.9 8.4625 6.94477 8.4625 7C8.4625 7.05523 8.50727 7.1 8.5625 7.1V6.9ZM8.9375 7.1C8.99273 7.1 9.0375 7.05523 9.0375 7C9.0375 6.94477 8.99273 6.9 8.9375 6.9V7.1ZM9.3125 6.9C9.25727 6.9 9.2125 6.94477 9.2125 7C9.2125 7.05523 9.25727 7.1 9.3125 7.1V6.9ZM9.6875 7.1C9.74273 7.1 9.7875 7.05523 9.7875 7C9.7875 6.94477 9.74273 6.9 9.6875 6.9V7.1ZM10.0625 6.9C10.0073 6.9 9.9625 6.94477 9.9625 7C9.9625 7.05523 10.0073 7.1 10.0625 7.1V6.9ZM10.4375 7.1C10.4927 7.1 10.5375 7.05523 10.5375 7C10.5375 6.94477 10.4927 6.9 10.4375 6.9V7.1ZM10.8125 6.9C10.7573 6.9 10.7125 6.94477 10.7125 7C10.7125 7.05523 10.7573 7.1 10.8125 7.1V6.9ZM6.5 23.9H6.16667V24.1H6.5V23.9ZM5.83333 23.9H5.5V24.1H5.83333V23.9ZM5.16667 23.9H5V24.1H5.16667V23.9ZM5.1 24V23.7976H4.9V24H5.1ZM5.1 23.3929V22.9881H4.9V23.3929H5.1ZM5.1 22.5833V22.1786H4.9V22.5833H5.1ZM5.1 21.7738V21.369H4.9V21.7738H5.1ZM5.1 20.9643V20.5595H4.9V20.9643H5.1ZM5.1 20.1548V19.75H4.9V20.1548H5.1ZM5.1 19.3452V18.9405H4.9V19.3452H5.1ZM5.1 18.5357V18.131H4.9V18.5357H5.1ZM5.1 17.7262V17.3214H4.9V17.7262H5.1ZM5.1 16.9167V16.5119H4.9V16.9167H5.1ZM5.1 16.1071V15.7024H4.9V16.1071H5.1ZM5.1 15.2976V14.8929H4.9V15.2976H5.1ZM5.1 14.4881V14.0833H4.9V14.4881H5.1ZM5.1 13.6786V13.2738H4.9V13.6786H5.1ZM5.1 12.869V12.4643H4.9V12.869H5.1ZM5.1 12.0595V11.6548H4.9V12.0595H5.1ZM5.1 11.25V10.8452H4.9V11.25H5.1ZM5.1 10.4405V10.0357H4.9V10.4405H5.1ZM5.1 9.63095V9.22619H4.9V9.63095H5.1ZM5.1 8.82142V8.41666H4.9V8.82142H5.1ZM5.1 8.0119V7.60714H4.9V8.0119H5.1ZM5.1 7.20238V7H4.9V7.20238H5.1ZM5 7.1H5.1875V6.9H5V7.1ZM5.5625 7.1H5.9375V6.9H5.5625V7.1ZM6.3125 7.1H6.6875V6.9H6.3125V7.1ZM7.0625 7.1H7.4375V6.9H7.0625V7.1ZM7.8125 7.1H8.1875V6.9H7.8125V7.1ZM8.5625 7.1H8.9375V6.9H8.5625V7.1ZM9.3125 7.1H9.6875V6.9H9.3125V7.1ZM10.0625 7.1H10.4375V6.9H10.0625V7.1ZM10.8125 7.1H11V6.9H10.8125V7.1Z" fill="white"/>
<circle cx="10" cy="6" r="3" fill="white"/>
<circle cx="10" cy="15" r="3" fill="#FFE0EF"/>
<circle cx="19" cy="15" r="3" fill="#FFB3C1"/>
<circle cx="10" cy="24" r="3" fill="#FFD0D9"/>
<g filter="url(#filter0_b_12_317)">
<rect x="17" y="16" width="15" height="10" rx="2" fill="#FFBBC7" fill-opacity="0.44"/>
</g>
<g filter="url(#filter1_b_12_317)">
<rect x="17.1" y="16.1" width="14.8" height="9.8" rx="1.9" stroke="url(#paint3_linear_12_317)" stroke-width="0.2"/>
</g>
<path d="M21.5498 23V21.0811C21.5498 20.9004 21.5555 20.7018 21.5669 20.4854L21.5742 20.3242H21.5449C21.4928 20.5993 21.453 20.7897 21.4253 20.8955L20.9102 23H19.9189L19.3794 20.9199C19.3647 20.8678 19.3265 20.6693 19.2646 20.3242H19.2354C19.2581 20.8711 19.2695 21.2129 19.2695 21.3496V23H18.3442V19.499H19.9238L20.4048 21.4009C20.4162 21.4399 20.4308 21.5197 20.4487 21.6401C20.4683 21.759 20.4805 21.8509 20.4854 21.916H20.5C20.5179 21.7679 20.5464 21.5929 20.5854 21.3911L21.0347 19.499H22.5898V23H21.5498ZM24.7773 23V22.6143H24.7676C24.6813 22.7331 24.6032 22.8201 24.5332 22.8755C24.4648 22.9308 24.3867 22.9756 24.2988 23.0098C24.2126 23.0439 24.1117 23.061 23.9961 23.061C23.7227 23.061 23.5143 22.9723 23.3711 22.7949C23.2279 22.6175 23.1562 22.3555 23.1562 22.0088V20.5H24.1963V21.9307C24.1963 22.1764 24.2882 22.2993 24.4722 22.2993C24.5731 22.2993 24.6488 22.266 24.6992 22.1992C24.7513 22.1325 24.7773 22.0381 24.7773 21.916V20.5H25.8174V23H24.7773ZM26.3154 23V19.2988H27.3555V23H26.3154ZM29.6187 22.9658C29.5715 22.9886 29.4941 23.0098 29.3867 23.0293C29.2793 23.0505 29.1499 23.061 28.9985 23.061C28.7088 23.061 28.4818 22.9813 28.3174 22.8218C28.1546 22.6623 28.0732 22.4352 28.0732 22.1406V21.2202H27.6802V20.5H28.0732V20.0093L29.0986 19.7261V20.5H29.6187V21.2202H29.0986V21.9697C29.0986 22.1895 29.1857 22.2993 29.3599 22.2993C29.4412 22.2993 29.5275 22.2814 29.6187 22.2456V22.9658ZM31.0444 19.8262C31.0444 19.9727 30.9907 20.0915 30.8833 20.1826C30.7775 20.2738 30.6375 20.3193 30.4634 20.3193C30.2941 20.3193 30.1549 20.2721 30.0459 20.1777C29.9385 20.0833 29.8848 19.9661 29.8848 19.8262C29.8848 19.6829 29.9368 19.5674 30.041 19.4795C30.1468 19.39 30.2876 19.3452 30.4634 19.3452C30.6375 19.3452 30.7775 19.39 30.8833 19.4795C30.9907 19.5674 31.0444 19.6829 31.0444 19.8262ZM29.9434 23V20.5H30.9834V23H29.9434Z" fill="#FF5477"/>
<defs>
<filter id="filter0_b_12_317" x="13" y="12" width="23" height="18" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImage" stdDeviation="2"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_12_317"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_12_317" result="shape"/>
</filter>
<filter id="filter1_b_12_317" x="9" y="8" width="31" height="26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImage" stdDeviation="4"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_12_317"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_12_317" result="shape"/>
</filter>
<linearGradient id="paint0_linear_12_317" x1="26" y1="28.125" x2="5.28188" y2="-0.358586" gradientUnits="userSpaceOnUse">
<stop stop-color="#EA728B"/>
<stop offset="1" stop-color="#EE8798"/>
</linearGradient>
<linearGradient id="paint1_linear_12_317" x1="26" y1="27.6562" x2="3.79037" y2="-0.475949" gradientUnits="userSpaceOnUse">
<stop stop-color="#ED6E88"/>
<stop offset="1" stop-color="#EE8798"/>
<stop offset="1" stop-color="#F98FA0"/>
</linearGradient>
<linearGradient id="paint2_linear_12_317" x1="21" y1="6" x2="25.335" y2="1.87816" gradientUnits="userSpaceOnUse">
<stop offset="0.217949" stop-color="#F06280"/>
<stop offset="1" stop-color="#FF91A3"/>
</linearGradient>
<linearGradient id="paint3_linear_12_317" x1="18.0714" y1="17" x2="31.5517" y2="24.7771" gradientUnits="userSpaceOnUse">
<stop stop-color="#F7EBEF" stop-opacity="0.6"/>
<stop offset="1" stop-color="#DDADC4" stop-opacity="0.12"/>
</linearGradient>
</defs>
</svg>
<svg width="32" height="30" viewBox="0 0 32 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 4C0 1.79086 1.79086 0 4 0H20C23.3137 0 26 2.68629 26 6V26C26 28.2091 24.2091 30 22 30H4C1.79086 30 0 28.2091 0 26V4Z" fill="url(#paint0_linear_12_283)"/>
<path d="M20 0V0C23.3137 0 26 2.68629 26 6V6H20V0Z" fill="url(#paint1_linear_12_283)"/>
<path d="M10.0707 4.92929C10.0317 4.89024 9.96834 4.89024 9.92929 4.92929C9.89024 4.96834 9.89024 5.03166 9.92929 5.07071L10.0707 4.92929ZM17 12L16.7011 10.8846L15.8846 11.7011L17 12ZM9.92929 5.07071L16.2929 11.4343L16.4343 11.2929L10.0707 4.92929L9.92929 5.07071Z" fill="white"/>
<path d="M13 23L14.1154 22.7011L13.2989 21.8846L13 23ZM18.9293 16.9293L13.5657 22.2929L13.7071 22.4343L19.0707 17.0707L18.9293 16.9293Z" fill="white"/>
<path d="M18 15.1C18.0552 15.1 18.1 15.0552 18.1 15C18.1 14.9448 18.0552 14.9 18 14.9V15.1ZM13 15L14 15.5774V14.4226L13 15ZM18 14.9L13.9 14.9V15.1L18 15.1V14.9Z" fill="white"/>
<path d="M10 12L10.5774 11L9.42265 11L10 12ZM10 6L9.42265 7L10.5773 7L10 6ZM10.1 11.1L10.1 9.1875L9.9 9.1875L9.9 11.1L10.1 11.1ZM10.1 9.1875L10.1 6.9L9.9 6.9L9.9 9.1875L10.1 9.1875Z" fill="white"/>
<path d="M10 21L10.5774 20L9.42265 20L10 21ZM10 15L9.42265 16L10.5773 16L10 15ZM10.1 20.1L10.1 18.1875L9.9 18.1875L9.9 20.1L10.1 20.1ZM10.1 18.1875L10.1 15.9L9.9 15.9L9.9 18.1875L10.1 18.1875Z" fill="white"/>
<path d="M11 7.1C11.0552 7.1 11.1 7.05523 11.1 7C11.1 6.94477 11.0552 6.9 11 6.9V7.1ZM5 7V6.9H4.9V7H5ZM5 24H4.9V24.1H5V24ZM7 24L6 23.4226V24.5774L7 24ZM6.83333 23.9C6.7781 23.9 6.73333 23.9448 6.73333 24C6.73333 24.0552 6.7781 24.1 6.83333 24.1V23.9ZM6.5 24.1C6.55523 24.1 6.6 24.0552 6.6 24C6.6 23.9448 6.55523 23.9 6.5 23.9V24.1ZM6.16667 23.9C6.11144 23.9 6.06667 23.9448 6.06667 24C6.06667 24.0552 6.11144 24.1 6.16667 24.1V23.9ZM5.83333 24.1C5.88856 24.1 5.93333 24.0552 5.93333 24C5.93333 23.9448 5.88856 23.9 5.83333 23.9V24.1ZM5.5 23.9C5.44477 23.9 5.4 23.9448 5.4 24C5.4 24.0552 5.44477 24.1 5.5 24.1V23.9ZM5.16667 24.1C5.22189 24.1 5.26667 24.0552 5.26667 24C5.26667 23.9448 5.22189 23.9 5.16667 23.9V24.1ZM5.1 23.7976C5.1 23.7424 5.05523 23.6976 5 23.6976C4.94477 23.6976 4.9 23.7424 4.9 23.7976H5.1ZM4.9 23.3929C4.9 23.4481 4.94477 23.4929 5 23.4929C5.05523 23.4929 5.1 23.4481 5.1 23.3929H4.9ZM5.1 22.9881C5.1 22.9329 5.05523 22.8881 5 22.8881C4.94477 22.8881 4.9 22.9329 4.9 22.9881H5.1ZM4.9 22.5833C4.9 22.6386 4.94477 22.6833 5 22.6833C5.05523 22.6833 5.1 22.6386 5.1 22.5833H4.9ZM5.1 22.1786C5.1 22.1233 5.05523 22.0786 5 22.0786C4.94477 22.0786 4.9 22.1233 4.9 22.1786H5.1ZM4.9 21.7738C4.9 21.829 4.94477 21.8738 5 21.8738C5.05523 21.8738 5.1 21.829 5.1 21.7738H4.9ZM5.1 21.369C5.1 21.3138 5.05523 21.269 5 21.269C4.94477 21.269 4.9 21.3138 4.9 21.369H5.1ZM4.9 20.9643C4.9 21.0195 4.94477 21.0643 5 21.0643C5.05523 21.0643 5.1 21.0195 5.1 20.9643H4.9ZM5.1 20.5595C5.1 20.5043 5.05523 20.4595 5 20.4595C4.94477 20.4595 4.9 20.5043 4.9 20.5595H5.1ZM4.9 20.1548C4.9 20.21 4.94477 20.2548 5 20.2548C5.05523 20.2548 5.1 20.21 5.1 20.1548H4.9ZM5.1 19.75C5.1 19.6948 5.05523 19.65 5 19.65C4.94477 19.65 4.9 19.6948 4.9 19.75H5.1ZM4.9 19.3452C4.9 19.4005 4.94477 19.4452 5 19.4452C5.05523 19.4452 5.1 19.4005 5.1 19.3452H4.9ZM5.1 18.9405C5.1 18.8852 5.05523 18.8405 5 18.8405C4.94477 18.8405 4.9 18.8852 4.9 18.9405H5.1ZM4.9 18.5357C4.9 18.5909 4.94477 18.6357 5 18.6357C5.05523 18.6357 5.1 18.5909 5.1 18.5357H4.9ZM5.1 18.131C5.1 18.0757 5.05523 18.031 5 18.031C4.94477 18.031 4.9 18.0757 4.9 18.131H5.1ZM4.9 17.7262C4.9 17.7814 4.94477 17.8262 5 17.8262C5.05523 17.8262 5.1 17.7814 5.1 17.7262H4.9ZM5.1 17.3214C5.1 17.2662 5.05523 17.2214 5 17.2214C4.94477 17.2214 4.9 17.2662 4.9 17.3214H5.1ZM4.9 16.9167C4.9 16.9719 4.94477 17.0167 5 17.0167C5.05523 17.0167 5.1 16.9719 5.1 16.9167H4.9ZM5.1 16.5119C5.1 16.4567 5.05523 16.4119 5 16.4119C4.94477 16.4119 4.9 16.4567 4.9 16.5119H5.1ZM4.9 16.1071C4.9 16.1624 4.94477 16.2071 5 16.2071C5.05523 16.2071 5.1 16.1624 5.1 16.1071H4.9ZM5.1 15.7024C5.1 15.6472 5.05523 15.6024 5 15.6024C4.94477 15.6024 4.9 15.6472 4.9 15.7024H5.1ZM4.9 15.2976C4.9 15.3528 4.94477 15.3976 5 15.3976C5.05523 15.3976 5.1 15.3528 5.1 15.2976H4.9ZM5.1 14.8929C5.1 14.8376 5.05523 14.7929 5 14.7929C4.94477 14.7929 4.9 14.8376 4.9 14.8929H5.1ZM4.9 14.4881C4.9 14.5433 4.94477 14.5881 5 14.5881C5.05523 14.5881 5.1 14.5433 5.1 14.4881H4.9ZM5.1 14.0833C5.1 14.0281 5.05523 13.9833 5 13.9833C4.94477 13.9833 4.9 14.0281 4.9 14.0833H5.1ZM4.9 13.6786C4.9 13.7338 4.94477 13.7786 5 13.7786C5.05523 13.7786 5.1 13.7338 5.1 13.6786H4.9ZM5.1 13.2738C5.1 13.2186 5.05523 13.1738 5 13.1738C4.94477 13.1738 4.9 13.2186 4.9 13.2738H5.1ZM4.9 12.869C4.9 12.9243 4.94477 12.969 5 12.969C5.05523 12.969 5.1 12.9243 5.1 12.869H4.9ZM5.1 12.4643C5.1 12.4091 5.05523 12.3643 5 12.3643C4.94477 12.3643 4.9 12.4091 4.9 12.4643H5.1ZM4.9 12.0595C4.9 12.1148 4.94477 12.1595 5 12.1595C5.05523 12.1595 5.1 12.1148 5.1 12.0595H4.9ZM5.1 11.6548C5.1 11.5995 5.05523 11.5548 5 11.5548C4.94477 11.5548 4.9 11.5995 4.9 11.6548H5.1ZM4.9 11.25C4.9 11.3052 4.94477 11.35 5 11.35C5.05523 11.35 5.1 11.3052 5.1 11.25H4.9ZM5.1 10.8452C5.1 10.79 5.05523 10.7452 5 10.7452C4.94477 10.7452 4.9 10.79 4.9 10.8452H5.1ZM4.9 10.4405C4.9 10.4957 4.94477 10.5405 5 10.5405C5.05523 10.5405 5.1 10.4957 5.1 10.4405H4.9ZM5.1 10.0357C5.1 9.98048 5.05523 9.93571 5 9.93571C4.94477 9.93571 4.9 9.98048 4.9 10.0357H5.1ZM4.9 9.63095C4.9 9.68618 4.94477 9.73095 5 9.73095C5.05523 9.73095 5.1 9.68618 5.1 9.63095H4.9ZM5.1 9.22619C5.1 9.17096 5.05523 9.12619 5 9.12619C4.94477 9.12619 4.9 9.17096 4.9 9.22619H5.1ZM4.9 8.82142C4.9 8.87665 4.94477 8.92142 5 8.92142C5.05523 8.92142 5.1 8.87665 5.1 8.82142H4.9ZM5.1 8.41666C5.1 8.36143 5.05523 8.31666 5 8.31666C4.94477 8.31666 4.9 8.36143 4.9 8.41666H5.1ZM4.9 8.0119C4.9 8.06713 4.94477 8.1119 5 8.1119C5.05523 8.1119 5.1 8.06713 5.1 8.0119H4.9ZM5.1 7.60714C5.1 7.55191 5.05523 7.50714 5 7.50714C4.94477 7.50714 4.9 7.55191 4.9 7.60714H5.1ZM4.9 7.20238C4.9 7.2576 4.94477 7.30238 5 7.30238C5.05523 7.30238 5.1 7.2576 5.1 7.20238H4.9ZM5.1875 7.1C5.24273 7.1 5.2875 7.05523 5.2875 7C5.2875 6.94477 5.24273 6.9 5.1875 6.9V7.1ZM5.5625 6.9C5.50727 6.9 5.4625 6.94477 5.4625 7C5.4625 7.05523 5.50727 7.1 5.5625 7.1V6.9ZM5.9375 7.1C5.99273 7.1 6.0375 7.05523 6.0375 7C6.0375 6.94477 5.99273 6.9 5.9375 6.9V7.1ZM6.3125 6.9C6.25727 6.9 6.2125 6.94477 6.2125 7C6.2125 7.05523 6.25727 7.1 6.3125 7.1V6.9ZM6.6875 7.1C6.74273 7.1 6.7875 7.05523 6.7875 7C6.7875 6.94477 6.74273 6.9 6.6875 6.9V7.1ZM7.0625 6.9C7.00727 6.9 6.9625 6.94477 6.9625 7C6.9625 7.05523 7.00727 7.1 7.0625 7.1V6.9ZM7.4375 7.1C7.49273 7.1 7.5375 7.05523 7.5375 7C7.5375 6.94477 7.49273 6.9 7.4375 6.9V7.1ZM7.8125 6.9C7.75727 6.9 7.7125 6.94477 7.7125 7C7.7125 7.05523 7.75727 7.1 7.8125 7.1V6.9ZM8.1875 7.1C8.24273 7.1 8.2875 7.05523 8.2875 7C8.2875 6.94477 8.24273 6.9 8.1875 6.9V7.1ZM8.5625 6.9C8.50727 6.9 8.4625 6.94477 8.4625 7C8.4625 7.05523 8.50727 7.1 8.5625 7.1V6.9ZM8.9375 7.1C8.99273 7.1 9.0375 7.05523 9.0375 7C9.0375 6.94477 8.99273 6.9 8.9375 6.9V7.1ZM9.3125 6.9C9.25727 6.9 9.2125 6.94477 9.2125 7C9.2125 7.05523 9.25727 7.1 9.3125 7.1V6.9ZM9.6875 7.1C9.74273 7.1 9.7875 7.05523 9.7875 7C9.7875 6.94477 9.74273 6.9 9.6875 6.9V7.1ZM10.0625 6.9C10.0073 6.9 9.9625 6.94477 9.9625 7C9.9625 7.05523 10.0073 7.1 10.0625 7.1V6.9ZM10.4375 7.1C10.4927 7.1 10.5375 7.05523 10.5375 7C10.5375 6.94477 10.4927 6.9 10.4375 6.9V7.1ZM10.8125 6.9C10.7573 6.9 10.7125 6.94477 10.7125 7C10.7125 7.05523 10.7573 7.1 10.8125 7.1V6.9ZM6.5 23.9H6.16667V24.1H6.5V23.9ZM5.83333 23.9H5.5V24.1H5.83333V23.9ZM5.16667 23.9H5V24.1H5.16667V23.9ZM5.1 24V23.7976H4.9V24H5.1ZM5.1 23.3929V22.9881H4.9V23.3929H5.1ZM5.1 22.5833V22.1786H4.9V22.5833H5.1ZM5.1 21.7738V21.369H4.9V21.7738H5.1ZM5.1 20.9643V20.5595H4.9V20.9643H5.1ZM5.1 20.1548V19.75H4.9V20.1548H5.1ZM5.1 19.3452V18.9405H4.9V19.3452H5.1ZM5.1 18.5357V18.131H4.9V18.5357H5.1ZM5.1 17.7262V17.3214H4.9V17.7262H5.1ZM5.1 16.9167V16.5119H4.9V16.9167H5.1ZM5.1 16.1071V15.7024H4.9V16.1071H5.1ZM5.1 15.2976V14.8929H4.9V15.2976H5.1ZM5.1 14.4881V14.0833H4.9V14.4881H5.1ZM5.1 13.6786V13.2738H4.9V13.6786H5.1ZM5.1 12.869V12.4643H4.9V12.869H5.1ZM5.1 12.0595V11.6548H4.9V12.0595H5.1ZM5.1 11.25V10.8452H4.9V11.25H5.1ZM5.1 10.4405V10.0357H4.9V10.4405H5.1ZM5.1 9.63095V9.22619H4.9V9.63095H5.1ZM5.1 8.82142V8.41666H4.9V8.82142H5.1ZM5.1 8.0119V7.60714H4.9V8.0119H5.1ZM5.1 7.20238V7H4.9V7.20238H5.1ZM5 7.1H5.1875V6.9H5V7.1ZM5.5625 7.1H5.9375V6.9H5.5625V7.1ZM6.3125 7.1H6.6875V6.9H6.3125V7.1ZM7.0625 7.1H7.4375V6.9H7.0625V7.1ZM7.8125 7.1H8.1875V6.9H7.8125V7.1ZM8.5625 7.1H8.9375V6.9H8.5625V7.1ZM9.3125 7.1H9.6875V6.9H9.3125V7.1ZM10.0625 7.1H10.4375V6.9H10.0625V7.1ZM10.8125 7.1H11V6.9H10.8125V7.1Z" fill="white"/>
<circle cx="10" cy="6" r="3" fill="white"/>
<circle cx="10" cy="15" r="3" fill="#FFF2E6"/>
<circle cx="19" cy="15" r="3" fill="#FFDEBF"/>
<circle cx="10" cy="24" r="3" fill="#FFEBB7"/>
<g filter="url(#filter0_b_12_283)">
<rect x="18" y="16" width="14" height="10" rx="2" fill="#FFE4BB" fill-opacity="0.44"/>
</g>
<g filter="url(#filter1_b_12_283)">
<rect x="18.1" y="16.1" width="13.8" height="9.8" rx="1.9" stroke="url(#paint2_linear_12_283)" stroke-width="0.2"/>
</g>
<path d="M22.7905 23L21.5552 21.3105C21.4575 21.1771 21.3778 21.0566 21.3159 20.9492H21.3062C21.3159 21.1217 21.3208 21.3154 21.3208 21.5303V23H20.3442V19.499H21.3403L22.5244 21.1055C22.5391 21.1266 22.557 21.1519 22.5781 21.1812C22.5993 21.2104 22.6204 21.2406 22.6416 21.2715C22.6628 21.3024 22.6823 21.3325 22.7002 21.3618C22.7197 21.3911 22.7344 21.4172 22.7441 21.4399H22.7539C22.7441 21.3683 22.7393 21.2446 22.7393 21.0688V19.499H23.7158V23H22.7905ZM26.6016 23L26.4478 22.3555H25.4028L25.2368 23H24.0967L25.3027 19.499H26.6113L27.7466 23H26.6016ZM25.9375 20.2607H25.9131C25.9098 20.2998 25.8984 20.3641 25.8789 20.4536C25.8594 20.5431 25.7609 20.9272 25.5835 21.606H26.2524L26.0083 20.6538C25.9741 20.5138 25.9505 20.3828 25.9375 20.2607ZM30.5884 21.9404C30.5884 22.1732 30.5257 22.3758 30.4004 22.5483C30.2767 22.7209 30.1025 22.8494 29.8779 22.9341C29.6533 23.0187 29.3831 23.061 29.0674 23.061C28.7012 23.061 28.3659 22.9992 28.0615 22.8755V21.916C28.208 22.0234 28.37 22.1105 28.5474 22.1772C28.7248 22.2424 28.89 22.2749 29.043 22.2749C29.1585 22.2749 29.248 22.2546 29.3115 22.2139C29.375 22.1715 29.4067 22.1105 29.4067 22.0308C29.4067 21.9738 29.3905 21.9242 29.3579 21.8818C29.327 21.8379 29.279 21.7972 29.2139 21.7598C29.1504 21.7223 29.0316 21.6711 28.8574 21.606C28.2943 21.3895 28.0127 21.0396 28.0127 20.5562C28.0127 20.2176 28.1413 19.9474 28.3984 19.7456C28.6556 19.5422 29.0007 19.4404 29.4336 19.4404C29.5557 19.4404 29.668 19.4453 29.7705 19.4551C29.873 19.4648 29.9658 19.4771 30.0488 19.4917C30.1335 19.5063 30.2515 19.534 30.4028 19.5747V20.4658C30.1082 20.3047 29.8185 20.2241 29.5337 20.2241C29.4165 20.2241 29.3221 20.2461 29.2505 20.29C29.1789 20.334 29.1431 20.3942 29.1431 20.4707C29.1431 20.5439 29.1715 20.605 29.2285 20.6538C29.2871 20.701 29.4084 20.7629 29.5923 20.8394C29.9552 20.9858 30.2116 21.1462 30.3613 21.3203C30.5127 21.4945 30.5884 21.7012 30.5884 21.9404Z" fill="#FD8516"/>
<defs>
<filter id="filter0_b_12_283" x="14" y="12" width="22" height="18" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImage" stdDeviation="2"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_12_283"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_12_283" result="shape"/>
</filter>
<filter id="filter1_b_12_283" x="10" y="8" width="30" height="26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImage" stdDeviation="4"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_12_283"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_12_283" result="shape"/>
</filter>
<linearGradient id="paint0_linear_12_283" x1="23" y1="28.125" x2="2.28188" y2="-0.358586" gradientUnits="userSpaceOnUse">
<stop stop-color="#F3A340"/>
<stop offset="1" stop-color="#F5D44F"/>
</linearGradient>
<linearGradient id="paint1_linear_12_283" x1="21.5" y1="6" x2="25.1601" y2="2.74145" gradientUnits="userSpaceOnUse">
<stop stop-color="#F3A340"/>
<stop offset="1" stop-color="#F5D44F"/>
</linearGradient>
<linearGradient id="paint2_linear_12_283" x1="19" y1="17" x2="32" y2="24" gradientUnits="userSpaceOnUse">
<stop stop-color="#F7F2EB" stop-opacity="0.6"/>
<stop offset="1" stop-color="#DDCAAD" stop-opacity="0.12"/>
</linearGradient>
</defs>
</svg>
<svg width="32" height="30" viewBox="0 0 32 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 4C0 1.79086 1.79086 0 4 0H20C23.3137 0 26 2.68629 26 6V26C26 28.2091 24.2091 30 22 30H4C1.79086 30 0 28.2091 0 26V4Z" fill="url(#paint0_linear_10_152)"/>
<path d="M15.2548 7.17079L10 15" stroke="white" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9.50811 7.29235L11.3041 9.88507" stroke="white" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M14.5807 14.7076L13.5838 13.2223L13.3346 12.851L12.5869 11.737" stroke="white" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>
<ellipse cx="9.22236" cy="16.25" rx="1.22222" ry="1.25" transform="rotate(-180 9.22236 16.25)" stroke="white" stroke-width="1.7" stroke-linejoin="round"/>
<circle cx="15.2501" cy="16.25" r="1.25" transform="rotate(-180 15.2501 16.25)" stroke="white" stroke-width="1.7" stroke-linejoin="round"/>
<path opacity="0.4" d="M4.97656 10.2734C4.49479 10.2734 4.11458 10.2227 3.83594 10.1211C3.55729 10.0221 3.35547 9.86589 3.23047 9.65234C3.10807 9.44141 3.04688 9.11719 3.04688 8.67969V7.97656C3.04688 7.50781 2.85286 7.27344 2.46484 7.27344V6.39844C2.85286 6.39844 3.04688 6.16146 3.04688 5.6875V5.03125C3.04688 4.57292 3.10677 4.23698 3.22656 4.02344C3.34896 3.80729 3.54818 3.64974 3.82422 3.55078C4.10286 3.44922 4.48698 3.39844 4.97656 3.39844V4.27344C4.76302 4.27344 4.60547 4.32161 4.50391 4.41797C4.40234 4.51432 4.35156 4.67839 4.35156 4.91016V5.46484C4.35156 5.81901 4.30339 6.10807 4.20703 6.33203C4.11068 6.55599 3.95312 6.72005 3.73438 6.82422V6.83984C3.95052 6.94401 4.10677 7.11198 4.20312 7.34375C4.30208 7.57552 4.35156 7.88021 4.35156 8.25781V8.75391C4.35156 8.98828 4.39974 9.15365 4.49609 9.25C4.59245 9.34896 4.7526 9.39844 4.97656 9.39844V10.2734Z" fill="white"/>
<path opacity="0.4" d="M14.4023 24.2734C14.0143 24.2734 13.8203 24.5104 13.8203 24.9844V25.6406C13.8203 26.099 13.7591 26.4349 13.6367 26.6484C13.5169 26.8646 13.3177 27.0221 13.0391 27.1211C12.763 27.2227 12.3802 27.2734 11.8906 27.2734V26.3984C12.1068 26.3984 12.2643 26.3503 12.3633 26.2539C12.4648 26.1576 12.5156 25.9935 12.5156 25.7617V25.207C12.5156 24.8555 12.5625 24.5677 12.6562 24.3438C12.7526 24.1198 12.9115 23.9544 13.1328 23.8477V23.832C12.9167 23.7253 12.7591 23.5547 12.6602 23.3203C12.5638 23.0859 12.5156 22.7839 12.5156 22.4141V21.9219C12.5156 21.6901 12.4688 21.5247 12.375 21.4258C12.2812 21.3242 12.1198 21.2734 11.8906 21.2734V20.3984C12.375 20.3984 12.7552 20.4492 13.0312 20.5508C13.3099 20.6497 13.5104 20.806 13.6328 21.0195C13.7578 21.2305 13.8203 21.5547 13.8203 21.9922V22.6953C13.8203 23.1641 14.0143 23.3984 14.4023 23.3984V24.2734Z" fill="white"/>
<path d="M20 0V0C23.3137 0 26 2.68629 26 6V6H20V0Z" fill="url(#paint1_linear_10_152)"/>
<g filter="url(#filter0_b_10_152)">
<rect x="18" y="16" width="14" height="10" rx="2" fill="#85E9D1" fill-opacity="0.44"/>
</g>
<g filter="url(#filter1_b_10_152)">
<rect x="18.1" y="16.1" width="13.8" height="9.8" rx="1.9" stroke="url(#paint2_linear_10_152)" stroke-width="0.2"/>
</g>
<path d="M21 19L23.5 21L21 23" stroke="#1CB189"/>
<rect x="24.5" y="21.5" width="4" height="1" fill="#1CB189"/>
<defs>
<filter id="filter0_b_10_152" x="14" y="12" width="22" height="18" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImage" stdDeviation="2"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_10_152"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_10_152" result="shape"/>
</filter>
<filter id="filter1_b_10_152" x="10" y="8" width="30" height="26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImage" stdDeviation="4"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_10_152"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_10_152" result="shape"/>
</filter>
<linearGradient id="paint0_linear_10_152" x1="23" y1="28.125" x2="2.28188" y2="-0.358586" gradientUnits="userSpaceOnUse">
<stop stop-color="#4AB598"/>
<stop offset="1" stop-color="#88DDC6"/>
</linearGradient>
<linearGradient id="paint1_linear_10_152" x1="21" y1="5.5" x2="25.8153" y2="1.47546" gradientUnits="userSpaceOnUse">
<stop stop-color="#4AB598"/>
<stop offset="1" stop-color="#88DDC6"/>
</linearGradient>
<linearGradient id="paint2_linear_10_152" x1="19" y1="17" x2="32" y2="24" gradientUnits="userSpaceOnUse">
<stop stop-color="#EBF7F4" stop-opacity="0.6"/>
<stop offset="1" stop-color="#ADDDD0" stop-opacity="0.12"/>
</linearGradient>
</defs>
</svg>
<svg width="34" height="28" viewBox="0 0 34 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 4C0 1.79086 1.79086 0 4 0H22C25.3137 0 28 2.68629 28 6V24C28 26.2091 26.2091 28 24 28H4C1.79086 28 0 26.2091 0 24V4Z" fill="url(#paint0_linear_12_217)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.3043 13.6296C9.58997 13.8127 8.82187 13.9042 8.00002 13.9042C7.17818 13.9042 6.41005 13.8127 5.69571 13.6296C4.98135 13.4465 4.41785 13.1762 4.00519 12.8186V13.9042C4.00519 14.1979 4.18378 14.4704 4.54096 14.7216C4.89813 14.9727 5.38361 15.1717 5.9974 15.3186C6.61119 15.4655 7.27872 15.5389 8.00001 15.5389C8.7213 15.5389 9.38883 15.4655 10.0026 15.3186C10.6164 15.1717 11.1019 14.9727 11.4591 14.7216C11.8162 14.4704 11.9948 14.1979 11.9948 13.9042V12.8186C11.5822 13.1762 11.0187 13.4466 10.3043 13.6296ZM10.2991 16.0817C9.58478 16.2648 8.81668 16.3563 7.99483 16.3563C7.17299 16.3563 6.40486 16.2648 5.69052 16.0817C4.97616 15.8986 4.41266 15.6283 4 15.2707L4.00519 16.3563C4.00519 16.65 4.18378 16.9225 4.54096 17.1737C4.89813 17.4248 5.38361 17.6238 5.9974 17.7707C6.61119 17.9176 7.27872 17.991 8.00001 17.991C8.7213 17.991 9.38364 17.9176 9.99743 17.7707C10.6112 17.6238 11.0967 17.4248 11.4539 17.1737C11.8111 16.9225 11.9896 16.65 11.9896 16.3563V15.2707C11.577 15.6283 11.0135 15.8987 10.2991 16.0817ZM10.0026 9.22031C9.38884 9.07344 8.72131 9 8.00002 9C7.27873 9 6.6112 9.07344 5.99741 9.22031C5.38362 9.36717 4.89815 9.5662 4.54097 9.81736C4.18379 10.0685 4.0052 10.341 4.0052 10.6347V11.4521C4.0052 11.7458 4.18379 12.0183 4.54097 12.2694C4.89815 12.5206 5.38362 12.7196 5.99741 12.8665C6.6112 13.0134 7.27873 13.0868 8.00002 13.0868C8.72131 13.0868 9.38884 13.0134 10.0026 12.8665C10.6164 12.7196 11.1019 12.5206 11.4591 12.2694C11.8163 12.0183 11.9948 11.7458 11.9948 11.4521V10.6347C11.9948 10.341 11.8163 10.0685 11.4591 9.81736C11.1019 9.5662 10.6164 9.36717 10.0026 9.22031ZM10.3095 21.0907C9.59516 21.2737 8.82706 21.3653 8.00521 21.3653C7.18337 21.3653 6.41524 21.2737 5.70089 21.0907C4.98654 20.9076 4.42304 20.6373 4.01038 20.2797V21.3652C4.01038 21.659 4.18897 21.9314 4.54614 22.1826C4.90332 22.4338 5.3888 22.6328 6.00259 22.7797C6.61638 22.9265 7.28391 23 8.0052 23C8.72649 23 9.39402 22.9265 10.0078 22.7797C10.6216 22.6328 11.1071 22.4338 11.4643 22.1826C11.8214 21.9314 12 21.659 12 21.3652V20.2797C11.5874 20.6373 11.0238 20.9076 10.3095 21.0907ZM10.3043 18.6386C9.58997 18.8216 8.82187 18.9132 8.00002 18.9132C7.17818 18.9132 6.41005 18.8216 5.6957 18.6386C4.98135 18.4555 4.41785 18.1852 4.00519 17.8276L4.01038 18.9131C4.01038 19.2069 4.18897 19.4793 4.54614 19.7305C4.90332 19.9817 5.3888 20.1807 6.00259 20.3276C6.61638 20.4744 7.28391 20.5479 8.0052 20.5479C8.72649 20.5479 9.38883 20.4744 10.0026 20.3276C10.6164 20.1807 11.1019 19.9817 11.4591 19.7305C11.8162 19.4793 11.9948 19.2069 11.9948 18.9131V17.8276C11.5822 18.1852 11.0187 18.4555 10.3043 18.6386Z" fill="white"/>
<path d="M19.0001 18.9354C19.823 18.9354 20.5921 18.8542 21.3073 18.6916C22.0226 18.5291 22.5868 18.289 23 17.9715V18.9354C23 19.1963 22.8212 19.4382 22.4635 19.6612C22.1059 19.8843 21.6198 20.061 21.0052 20.1914C20.3907 20.3218 19.7223 20.3871 19.0001 20.3871C18.2779 20.3871 17.6095 20.3218 16.9949 20.1914C16.3803 20.061 15.8942 19.8843 15.5366 19.6612C15.179 19.4382 15.0001 19.1963 15.0001 18.9354V17.9715C15.4133 18.289 15.9776 18.529 16.6928 18.6916C17.4081 18.8542 18.1772 18.9354 19.0001 18.9354ZM19.0001 21.5484C19.823 21.5484 20.5921 21.4671 21.3073 21.3045C22.0226 21.142 22.5868 20.902 23 20.5844V21.5484C23 21.8092 22.8212 22.0511 22.4635 22.2742C22.1059 22.4972 21.6198 22.674 21.0052 22.8044C20.3907 22.9348 19.7223 23 19.0001 23C18.2779 23 17.6095 22.9348 16.9949 22.8044C16.3803 22.674 15.8942 22.4972 15.5366 22.2742C15.179 22.0511 15.0001 21.8092 15.0001 21.5484V20.5844C15.4133 20.9019 15.9776 21.142 16.6928 21.3045C17.4081 21.4671 18.1772 21.5484 19.0001 21.5484Z" fill="white"/>
<path d="M19 14C19.7222 14 20.3906 14.0652 21.0051 14.1956C21.6197 14.3261 22.1058 14.5028 22.4635 14.7258C22.8211 14.9489 22.9999 15.1908 22.9999 15.4516V16.1775C22.9999 16.4383 22.8211 16.6802 22.4635 16.9033C22.1058 17.1263 21.6197 17.303 21.0051 17.4335C20.3906 17.5639 19.7222 17.6291 19 17.6291C18.2778 17.6291 17.6094 17.5639 16.9948 17.4335C16.3802 17.303 15.8941 17.1263 15.5365 16.9033C15.1789 16.6802 15 16.4383 15 16.1775V15.4516C15 15.1908 15.1789 14.9489 15.5365 14.7258C15.8941 14.5028 16.3802 14.3261 16.9948 14.1956C17.6094 14.0652 18.2778 14 19 14Z" fill="white"/>
<g filter="url(#filter0_b_12_217)">
<rect x="20" y="14" width="14" height="10" rx="2" fill="#C5BBFF" fill-opacity="0.44"/>
</g>
<g filter="url(#filter1_b_12_217)">
<rect x="20.1" y="14.1" width="13.8" height="9.8" rx="1.9" stroke="url(#paint1_linear_12_217)" stroke-width="0.2"/>
</g>
<path d="M27.25 17L29.25 19M29.25 19L27.25 21M29.25 19H24.25" stroke="#4F39FF"/>
<circle cx="16" cy="9" r="3" fill="#DBD8FF" fill-opacity="0.4"/>
<circle cx="16" cy="9" r="2.9" stroke="white" stroke-opacity="0.2" stroke-width="0.2"/>
<path opacity="0.4" d="M15.3164 10.6367C15.0326 10.6367 14.8262 10.5846 14.6973 10.4805C14.5684 10.3763 14.5039 10.1908 14.5039 9.92383V9.45508C14.5039 9.21549 14.4049 9.0957 14.207 9.0957V8.73633C14.4049 8.73633 14.5039 8.61198 14.5039 8.36328V7.92773C14.5039 7.65951 14.5677 7.47135 14.6953 7.36328C14.8229 7.25391 15.0299 7.19922 15.3164 7.19922V7.56445C15.1081 7.56445 15.0039 7.67773 15.0039 7.9043V8.32031C15.0039 8.63281 14.9036 8.83008 14.7031 8.91211V8.91992C14.9036 9.00065 15.0039 9.20052 15.0039 9.51953V9.91992C15.0039 10.0475 15.028 10.138 15.0762 10.1914C15.1257 10.2448 15.2057 10.2715 15.3164 10.2715V10.6367ZM17.8535 9.0957C17.6543 9.0957 17.5547 9.21745 17.5547 9.46094V9.91211C17.5547 10.1868 17.4909 10.3763 17.3633 10.4805C17.237 10.5846 17.0312 10.6367 16.7461 10.6367V10.2715C16.8555 10.2715 16.9349 10.2448 16.9844 10.1914C17.0339 10.1393 17.0586 10.0501 17.0586 9.92383V9.50781C17.0586 9.19661 17.1582 9.00195 17.3574 8.92383V8.91602C17.1582 8.83398 17.0586 8.63021 17.0586 8.30469V7.9043C17.0586 7.67773 16.9544 7.56445 16.7461 7.56445V7.19922C17.0299 7.19922 17.2357 7.25391 17.3633 7.36328C17.4909 7.47135 17.5547 7.6569 17.5547 7.91992V8.36719C17.5547 8.61328 17.6543 8.73633 17.8535 8.73633V9.0957Z" fill="white"/>
<defs>
<filter id="filter0_b_12_217" x="16" y="10" width="22" height="18" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImage" stdDeviation="2"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_12_217"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_12_217" result="shape"/>
</filter>
<filter id="filter1_b_12_217" x="12" y="6" width="30" height="26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImage" stdDeviation="4"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_12_217"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_12_217" result="shape"/>
</filter>
<linearGradient id="paint0_linear_12_217" x1="3" y1="1.5" x2="20.6116" y2="30.5677" gradientUnits="userSpaceOnUse">
<stop stop-color="#8075FA"/>
<stop offset="1" stop-color="#5141D6"/>
</linearGradient>
<linearGradient id="paint1_linear_12_217" x1="21" y1="15" x2="34" y2="22" gradientUnits="userSpaceOnUse">
<stop stop-color="#EBEBF7" stop-opacity="0.6"/>
<stop offset="1" stop-color="#AEADDD" stop-opacity="0.12"/>
</linearGradient>
</defs>
</svg>
<svg width="52" height="40" viewBox="0 0 52 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="52" height="40" rx="4" fill="#4154B3"/>
<path d="M-6.78884e-06 3.99924C-5.28388e-06 1.79011 1.79085 0 3.99999 0H48C50.2091 0 52 1.79086 52 4V9C52 9 14 9 0 9C-6.90736e-06 7.50331 -7.9072e-06 5.6409 -6.78884e-06 3.99924Z" fill="#374BAE"/>
<rect x="4" y="13" width="44" height="22" rx="2" fill="white"/>
<circle cx="5.5" cy="4.5" r="1.5" fill="#FF78B0"/>
<circle cx="11.5" cy="4.5" r="1.5" fill="#FFC694"/>
<circle cx="17.5" cy="4.5" r="1.5" fill="#BCD0D1"/>
<circle cx="13" cy="20" r="5" fill="#4154B3"/>
<path d="M5 32C5 28.6863 7.68629 26 11 26H14C17.3137 26 20 28.6863 20 32V34C20 37.3137 17.3137 40 14 40H11C7.68629 40 5 37.3137 5 34V32Z" fill="#4154B3"/>
<rect x="14" y="32.2546" width="12" height="2" rx="1" transform="rotate(-43.4625 14 32.2546)" fill="#4154B3"/>
<rect x="28" y="20" width="3" height="11" fill="#68C0E5"/>
<rect x="34" y="16" width="3" height="15" fill="#68C0E5"/>
<rect x="40" y="23" width="3" height="8" fill="#68C0E5"/>
</svg>
<svg width="52" height="40" viewBox="0 0 52 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="52" height="40" rx="4" fill="#4154B3"/>
<path d="M-6.78884e-06 3.99924C-5.28388e-06 1.79011 1.79085 0 3.99999 0H48C50.2091 0 52 1.79086 52 4V9C52 9 14 9 0 9C-6.90736e-06 7.50331 -7.9072e-06 5.6409 -6.78884e-06 3.99924Z" fill="#374BAE"/>
<rect x="4" y="13" width="25" height="10" rx="2" fill="#A3DAF8"/>
<rect x="33" y="13" width="15" height="23" rx="2" fill="white"/>
<rect x="4" y="27" width="25" height="9" rx="2" fill="#FDDE83"/>
<circle cx="5.5" cy="4.5" r="1.5" fill="#FF78B0"/>
<circle cx="11.5" cy="4.5" r="1.5" fill="#FFC694"/>
<circle cx="17.5" cy="4.5" r="1.5" fill="#BCD0D1"/>
</svg>
.. role:: raw-html(raw)
:format: html
Built-in Assessors
==================
NNI provides state-of-the-art tuning algorithms within our builtin-assessors and makes them easy to use. Below is a brief overview of NNI's current builtin Assessors.
Note: Click the **Assessor's name** to get each Assessor's installation requirements, suggested usage scenario, and a config example. A link to a detailed description of each algorithm is provided at the end of the suggested scenario for each Assessor.
Currently, we support the following Assessors:
.. list-table::
:header-rows: 1
:widths: auto
* - Assessor
- Brief Introduction of Algorithm
* - `Medianstop <#MedianStop>`__
- Medianstop is a simple early stopping rule. It stops a pending trial X at step S if the trial’s best objective value by step S is strictly worse than the median value of the running averages of all completed trials’ objectives reported up to step S. `Reference Paper <https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/46180.pdf>`__
* - `Curvefitting <#Curvefitting>`__
- Curve Fitting Assessor is an LPA (learning, predicting, assessing) algorithm. It stops a pending trial X at step S if the prediction of the final epoch's performance worse than the best final performance in the trial history. In this algorithm, we use 12 curves to fit the accuracy curve. `Reference Paper <http://aad.informatik.uni-freiburg.de/papers/15-IJCAI-Extrapolation_of_Learning_Curves.pdf>`__
Usage of Builtin Assessors
--------------------------
Usage of builtin assessors provided by the NNI SDK requires one to declare the **builtinAssessorName** and **classArgs** in the ``config.yml`` file. In this part, we will introduce the details of usage and the suggested scenarios, classArg requirements, and an example for each assessor.
Note: Please follow the provided format when writing your ``config.yml`` file.
:raw-html:`<a name="MedianStop"></a>`
Median Stop Assessor
^^^^^^^^^^^^^^^^^^^^
..
Builtin Assessor Name: **Medianstop**
**Suggested scenario**
It's applicable in a wide range of performance curves, thus, it can be used in various scenarios to speed up the tuning progress. `Detailed Description <./MedianstopAssessor.rst>`__
**classArgs requirements:**
* **optimize_mode** (*maximize or minimize, optional, default = maximize*\ ) - If 'maximize', assessor will **stop** the trial with smaller expectation. If 'minimize', assessor will **stop** the trial with larger expectation.
* **start_step** (*int, optional, default = 0*\ ) - A trial is determined to be stopped or not only after receiving start_step number of reported intermediate results.
**Usage example:**
.. code-block:: yaml
# config.yml
assessor:
builtinAssessorName: Medianstop
classArgs:
optimize_mode: maximize
start_step: 5
:raw-html:`<br>`
:raw-html:`<a name="Curvefitting"></a>`
Curve Fitting Assessor
^^^^^^^^^^^^^^^^^^^^^^
..
Builtin Assessor Name: **Curvefitting**
**Suggested scenario**
It's applicable in a wide range of performance curves, thus, it can be used in various scenarios to speed up the tuning progress. Even better, it's able to handle and assess curves with similar performance. `Detailed Description <./CurvefittingAssessor.rst>`__
**Note**\ , according to the original paper, only incremental functions are supported. Therefore this assessor can only be used to maximize optimization metrics. For example, it can be used for accuracy, but not for loss.
**classArgs requirements:**
* **epoch_num** (*int,** required***\ ) - The total number of epochs. We need to know the number of epochs to determine which points we need to predict.
* **start_step** (*int, optional, default = 6*\ ) - A trial is determined to be stopped or not only after receiving start_step number of reported intermediate results.
* **threshold** (*float, optional, default = 0.95*\ ) - The threshold that we use to decide to early stop the worst performance curve. For example: if threshold = 0.95, and the best performance in the history is 0.9, then we will stop the trial who's predicted value is lower than 0.95 * 0.9 = 0.855.
* **gap** (*int, optional, default = 1*\ ) - The gap interval between Assessor judgements. For example: if gap = 2, start_step = 6, then we will assess the result when we get 6, 8, 10, 12...intermediate results.
**Usage example:**
.. code-block:: yaml
# config.yml
assessor:
builtinAssessorName: Curvefitting
classArgs:
epoch_num: 20
start_step: 6
threshold: 0.95
gap: 1
Customize Assessor
==================
NNI supports to build an assessor by yourself for tuning demand.
If you want to implement a customized Assessor, there are three things to do:
#. Inherit the base Assessor class
#. Implement assess_trial function
#. Configure your customized Assessor in experiment YAML config file
**1. Inherit the base Assessor class**
.. code-block:: python
from nni.assessor import Assessor
class CustomizedAssessor(Assessor):
def __init__(self, ...):
...
**2. Implement assess trial function**
.. code-block:: python
from nni.assessor import Assessor, AssessResult
class CustomizedAssessor(Assessor):
def __init__(self, ...):
...
def assess_trial(self, trial_history):
"""
Determines whether a trial should be killed. Must override.
trial_history: a list of intermediate result objects.
Returns AssessResult.Good or AssessResult.Bad.
"""
# you code implement here.
...
**3. Configure your customized Assessor in experiment YAML config file**
NNI needs to locate your customized Assessor class and instantiate the class, so you need to specify the location of the customized Assessor class and pass literal values as parameters to the __init__ constructor.
.. code-block:: yaml
assessor:
codeDir: /home/abc/myassessor
classFileName: my_customized_assessor.py
className: CustomizedAssessor
# Any parameter need to pass to your Assessor class __init__ constructor
# can be specified in this optional classArgs field, for example
classArgs:
arg1: value1
Please noted in **2**. The object ``trial_history`` are exact the object that Trial send to Assessor by using SDK ``report_intermediate_result`` function.
The working directory of your assessor is ``<home>/nni-experiments/<experiment_id>/log``\ , which can be retrieved with environment variable ``NNI_LOG_DIRECTORY``\ ,
More detail example you could see:
* :githublink:`medianstop-assessor <nni/algorithms/hpo/medianstop_assessor.py>`
* :githublink:`curvefitting-assessor <nni/algorithms/hpo/curvefitting_assessor/>`
Medianstop Assessor on NNI
==========================
Median Stop
-----------
Medianstop is a simple early stopping rule mentioned in this `paper <https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/46180.pdf>`__. It stops a pending trial X after step S if the trial’s best objective value by step S is strictly worse than the median value of the running averages of all completed trials’ objectives reported up to step S.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment