Compare commits
9 Commits
dev_v3.13.
...
dev_v3.13.
| Author | SHA1 | Date |
|---|---|---|
|
|
25893f5697 | 1 year ago |
|
|
ee0b5b6e43 | 1 year ago |
|
|
e518bf5a0f | 1 year ago |
|
|
77dcc95bac | 1 year ago |
|
|
9090adc0d4 | 1 year ago |
|
|
b1bf7032e5 | 1 year ago |
|
|
622726608e | 1 year ago |
|
|
fd5adff527 | 1 year ago |
|
|
a144d5fafe | 1 year ago |
|
After Width: | Height: | Size: 520 B |
|
After Width: | Height: | Size: 428 B |
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Capa_1" version="1.1" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Generator: Adobe Illustrator 29.2.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 116) -->
|
||||
<defs>
|
||||
<style>
|
||||
.st0 {
|
||||
fill: #d12127;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<path class="st0"
|
||||
d="M8.5,119.5c2.3,0,4.4-.9,6-2.5s2.5-3.8,2.5-6V25.6c0-4.7,3.8-8.5,8.5-8.5h85.3c4.7,0,8.5-3.8,8.5-8.5s-3.8-8.5-8.5-8.5H25.6C11.5,0,0,11.5,0,25.6v85.3c0,2.3.9,4.4,2.5,6,1.6,1.6,3.8,2.5,6,2.5Z" />
|
||||
<path class="st0"
|
||||
d="M486.4,0h-85.3c-4.7,0-8.5,3.8-8.5,8.5s3.8,8.5,8.5,8.5h85.3c4.7,0,8.5,3.8,8.5,8.5v85.3c0,4.7,3.8,8.5,8.5,8.5s8.5-3.8,8.5-8.5V25.6c0-14.1-11.5-25.6-25.6-25.6Z" />
|
||||
<path class="st0"
|
||||
d="M503.5,392.5c-2.3,0-4.4.9-6,2.5-1.6,1.6-2.5,3.8-2.5,6v85.3c0,4.7-3.8,8.5-8.5,8.5h-85.3c-4.7,0-8.5,3.8-8.5,8.5s3.8,8.5,8.5,8.5h85.3c14.1,0,25.6-11.5,25.6-25.6v-85.3c0-2.3-.9-4.4-2.5-6-1.6-1.6-3.8-2.5-6-2.5Z" />
|
||||
<path class="st0"
|
||||
d="M110.9,494.9H25.6c-4.7,0-8.5-3.8-8.5-8.5v-85.3c0-4.7-3.8-8.5-8.5-8.5s-8.5,3.8-8.5,8.5v85.3c0,14.1,11.5,25.6,25.6,25.6h85.3c4.7,0,8.5-3.8,8.5-8.5s-3.8-8.5-8.5-8.5Z" />
|
||||
<path
|
||||
d="M503.5,162.1h-86.4c-.5-16.5-4-32.7-10.1-48-17.5-35.6-69.2-88.5-139.6-88.5h-22.7c-70.5,0-122.1,52.9-139.6,88.5-6.1,15.3-9.6,31.6-10.1,48H8.5c-4.7,0-8.5,3.8-8.5,8.5s3.8,8.5,8.5,8.5h85.5c-.2,6.3-.2,12.4-.2,18.4-1.6-.5-3.1-.9-4.8-1.1-8.2-1-16.4,1.8-22.1,7.7-6.7,8.6-9.1,19.8-6.5,30.4,2.2,11.5,5.4,22.7,9.6,33.6l1.4,4.2c1,2.9,1.9,6,2.7,9.1,1.9,8.6,5.2,16.7,9.9,24.1,3.7,5.7,9.8,9.4,16.6,10.1.4,0,.8,0,1.3,0s.8,0,1.2-.1c.6,7.8.9,14.8.9,19.9,0,29.2,27.5,64.9,43.7,81.4,9.4,9.1,19.2,17.7,29.5,25.7,9.8,7.7,19.2,15.8,28.2,24.5,10.1,11.2,24.1,18,39.1,19.3h22.7c15-1.2,29-8.1,39.1-19.3,9-8.6,18.4-16.8,28.2-24.5,10.3-8.1,20.2-16.6,29.6-25.8,16.2-16.5,43.7-52.2,43.7-81.3s.4-12.1.9-19.9c.4,0,.8.1,1.2.1s.9,0,1.3,0c6.8-.7,12.8-4.4,16.6-10.1,4.7-7.4,8-15.5,9.9-24.1.9-3.1,1.7-6.2,2.7-9.1l1.5-4.2c4.1-10.9,7.4-22.1,9.6-33.6,2.6-10.6.3-21.8-6.5-30.4-5.7-5.9-13.9-8.7-22.1-7.7-1.6.2-3.2.6-4.7,1.1,0-5.9,0-12.1-.2-18.4h85.5c4.7,0,8.5-3.8,8.5-8.5s-3.8-8.5-8.5-8.5ZM98.1,295.6c-3.4-5.8-5.9-12.1-7.3-18.7-1-3.5-1.9-6.9-3.1-10.1l-1.5-4.2c-3.8-10-6.8-20.3-8.9-30.9-1.5-5.2-.9-10.7,1.7-15.4,2.1-2.2,5.1-3.2,8.1-2.9,2.7.4,5.2,1.6,7.1,3.4.6,15.3,1.5,26.3,1.7,27.7,0,.4,3.4,28.1,5.8,54.1-1.6-.5-2.9-1.6-3.7-3ZM111.6,210.9c-.1-.2-.3-.3-.4-.5-.3-9.8-.3-20.6,0-31.3h16.8v27.8l-16.4,4.1s0-.1,0-.1ZM136.5,375.3c-8.5-11.7-13.8-25.4-15.3-39.7,0-7.9-.8-19.7-1.9-32.3,0-.5,0-1-.1-1.5-1.8-20.5-4.3-42.5-5.6-52.9l22.8,27.4v99.1ZM117.8,227.1l19.2-4.8,60.4,7.5,5.8,34.7h-54.2l-31.2-37.4ZM145.1,206.1v-26.9h28.8l16.2,32.5-45-5.6ZM193,179.2h42.5l-28.3,28.5-14.2-28.5ZM153.6,291.9l48.2,42.1-18.3,24.4h-29.9v-66.5ZM165.3,409.9c-1.8-1.7-3.6-3.4-5.3-5-2-2.1-4.2-4.4-6.4-7v-22.5h29.9l16.2,21.6-34.4,12.9ZM217.8,455.1c-9.4-9.1-19.3-17.7-29.6-25.8-2.7-2.2-5.5-4.5-8.2-6.7l29.5-11,31.8,57.2c-9-2.1-17.2-6.9-23.5-13.7ZM247.5,444.9l-19.6-35.3h19.6v35.3ZM247.5,392.5h-29.9l-19.2-25.6,19.2-25.6h29.9v51.2ZM247.5,324.3h-30.9l-48.8-42.7h43.3l36.3,14.5v28.1h0ZM247.5,277.7l-26.5-10.6-7-42.1,33.5-33.7v86.4h0ZM112.1,162.1c.4-13.9,3.2-27.6,8.3-40.5,15-30.5,62.1-79,124.3-79h22.7c62.2,0,109.3,48.4,124.3,79,5,12.9,7.8,26.6,8.3,40.5H112.1ZM366.9,179.2v26.9l-45,5.6,16.2-32.5h28.8ZM264.5,324.3v-28.1l36.3-14.5h43.3l-48.8,42.7h-30.9ZM313.6,366.9l-19.2,25.6h-29.9v-51.2h29.9l19.2,25.6ZM264.5,277.7v-86.4l33.5,33.7-7,42.1-26.5,10.6ZM276.5,179.2h42.5l-14.2,28.5-28.3-28.5ZM264.5,444.9v-35.3h19.6l-19.6,35.3ZM323.8,429.4h0c-10.3,8.1-20.2,16.7-29.6,25.8-6.3,6.8-14.5,11.6-23.5,13.7l31.8-57.2,29.5,11c-2.7,2.2-5.5,4.5-8.2,6.7ZM358.4,398c-2.2,2.5-4.4,4.9-6.4,6.9-1.6,1.7-3.4,3.4-5.3,5l-34.4-12.9,16.2-21.6h29.9v22.5ZM358.4,358.4h-29.9l-18.3-24.4,48.2-42.1v66.5h0ZM362.9,264.5h-54.2l5.8-34.7,60.4-7.5,19.2,4.8-31.2,37.4ZM392.8,301.7c0,.5-.1,1-.1,1.5-1.1,12.6-1.9,24.4-1.9,32.3-1.5,14.4-6.8,28.1-15.3,39.7v-99.1l22.8-27.4c-1.3,10.6-3.8,32.5-5.6,52.9ZM400.8,210.5c-.1.2-.3.3-.4.5,0,0,0,.1,0,.1l-16.4-4.1v-27.8h16.8c.3,10.7.3,21.4,0,31.3ZM424.8,213.4h0c3-.4,6,.7,8.1,2.8,2.6,4.7,3.2,10.3,1.7,15.5-2.1,10.5-5,20.8-8.9,30.8l-1.5,4.2c-1.1,3.3-2.1,6.7-3,10.1-1.4,6.6-3.8,12.9-7.3,18.7-.8,1.4-2.2,2.5-3.8,3,2.4-26.1,5.8-53.8,5.9-54.4.1-1.3,1.1-12.2,1.6-27.4,2-1.8,4.4-3,7.1-3.4Z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.2 KiB |
@ -0,0 +1,23 @@
|
||||
<svg height="31" viewBox="0 0 31 31" width="31" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="route" transform="translate(0 0)">
|
||||
<path d="M365.505,13.407a.908.908,0,0,0,1.641,0l3.284-6.914a4.544,4.544,0,1,0-8.209,0Zm.82-9.774a.908.908,0,1,1-.908.908A.908.908,0,0,1,366.326,3.633Z" data-name="Path 5246"
|
||||
fill="#da4a54"
|
||||
id="Path_5246" transform="translate(-339.874)" />
|
||||
<circle cx="1.5" cy="1.5" data-name="Ellipse 225" fill="#2e303a" id="Ellipse_225"
|
||||
r="1.5" transform="translate(16 24)" />
|
||||
<path d="M176.087,206.357a2.27,2.27,0,0,1,0-4.541h9.366L184.59,200h-8.5a4.087,4.087,0,0,0,0,8.174h5.11a3.644,3.644,0,0,1,0-1.816Z" data-name="Path 5247"
|
||||
fill="#2e303a"
|
||||
id="Path_5247" transform="translate(-161.586 -187.891)" />
|
||||
<circle cx="2" cy="2" data-name="Ellipse 226" fill="#2e303a" id="Ellipse_226"
|
||||
r="2" transform="translate(21 17)" />
|
||||
<path d="M351.059,305h-.206a3.644,3.644,0,0,1,0,1.816h.206a2.331,2.331,0,0,1,0,4.662H345.1a3.645,3.645,0,0,1,0,1.816h5.958a4.147,4.147,0,0,0,0-8.295Z" data-name="Path 5248"
|
||||
fill="#2e303a"
|
||||
id="Path_5248" transform="translate(-324.206 -286.533)" />
|
||||
<path d="M167.02,412l.795,1.816h2.952a3.644,3.644,0,0,1,0-1.816Z" data-name="Path 5249"
|
||||
fill="#2e303a"
|
||||
id="Path_5249" transform="translate(-156.907 -387.055)" />
|
||||
<path d="M5.982,322.476a.908.908,0,0,0-1.664,0L.08,332.164a.908.908,0,0,0,1.283,1.153l3.788-2.164,3.788,2.164a.908.908,0,0,0,1.283-1.153Z" data-name="Path 5250"
|
||||
fill="#2e303a"
|
||||
id="Path_5250" transform="translate(0 -302.44)" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 5.0 KiB |
@ -0,0 +1 @@
|
||||
<svg id="Icon" viewBox="0 0 60 60" xmlns="http://www.w3.org/2000/svg"><circle cx="30" cy="30" fill="#e3ebf0" r="29"/><path d="m19.41 19.41c-2.32 2.3-3.89 5.37-4.3 8.79-.13 1.02-.96 1.8-1.99 1.8h-6.03c-1.16 0-2.1-.99-2-2.15.52-6.03 3.19-11.47 7.24-15.52l1.67-.33 5 4z" fill="#54afa4"/><path d="m30 5 1 2v6l-1 2c-4.13 0-7.88 1.68-10.59 4.41l-7.08-7.08c4.53-4.53 10.78-7.33 17.67-7.33z" fill="#68cec5"/><path d="m47.67 12.33.322 1.671-4.992 4.999-2.4.41h-.01c-2.71-2.73-6.45-4.41-10.59-4.41v-10c6.89 0 13.14 2.8 17.67 7.33z" fill="#f9d84b"/><path d="m54.91 27.85c.1 1.16-.84 2.15-2 2.15h-6.03c-1.03 0-1.86-.78-1.99-1.8-.41-3.41-1.97-6.48-4.29-8.79l7.07-7.08c4.05 4.05 6.72 9.49 7.24 15.52z" fill="#f9536b"/><path d="m44.851 16.308c-2.578 3.935-7.307 10.699-12.38 15.772-1.42 1.42-3.831 1.242-4.99-.543-.846-1.284-.585-2.985.501-4.071 5.073-5.052 11.795-9.75 15.71-12.317.762-.511 1.66.397 1.159 1.159z" fill="#4d5c7a"/><g fill="#262626"><path d="m52.907 31c.842 0 1.652-.356 2.223-.979.563-.613.846-1.437.774-2.26-.52-6.072-3.192-11.804-7.527-16.139-4.916-4.916-11.442-7.623-18.377-7.623-13.385 0-24.764 10.437-25.904 23.76-.071.824.212 1.648.774 2.262.571.622 1.381.979 2.223.979h6.031c1.514 0 2.793-1.152 2.977-2.68.843-7.023 6.818-12.32 13.899-12.32 2.708 0 5.28.763 7.52 2.206-3.316 2.42-7.096 5.418-10.244 8.554-1.446 1.445-1.711 3.686-.633 5.321.705 1.088 1.837 1.788 3.105 1.922.149.016.299.023.447.023 1.115 0 2.183-.439 2.982-1.239 3.162-3.161 6.182-6.966 8.615-10.302 1.131 1.762 1.858 3.753 2.107 5.835.182 1.527 1.461 2.68 2.976 2.68h6.031zm-23.907-24.951v7.998c-3.642.227-6.984 1.666-9.583 3.957l-5.631-5.631c4.07-3.741 9.413-6.078 15.213-6.324zm-14.886 22.034c-.063.532-.48.918-.99.918h-6.031c-.283 0-.557-.12-.749-.33-.188-.205-.279-.468-.256-.739.466-5.437 2.784-10.349 6.287-14.142l5.637 5.637c-2.083 2.357-3.498 5.333-3.898 8.656zm16.886-14.041v-8.018c5.694.233 11.038 2.45 15.239 6.323l-1.715 1.715c-.465-.098-.958-.032-1.38.251-1.065.698-2.409 1.603-3.9 2.656-2.437-1.744-5.254-2.746-8.243-2.928zm.764 17.332c-.479.478-1.13.709-1.807.641-.675-.071-1.256-.434-1.641-1.026-.562-.854-.405-2.036.372-2.812 4.791-4.772 11.129-9.254 14.887-11.751-2.5 3.767-7.006 10.143-11.812 14.948zm14.123-3.29c-.317-2.644-1.303-5.16-2.852-7.329 1.05-1.489 1.953-2.831 2.651-3.896.279-.425.344-.916.249-1.379l1.704-1.704c3.593 3.905 5.822 8.885 6.273 14.157.023.271-.067.532-.256.737-.192.21-.466.33-.749.33h-6.031c-.51 0-.927-.385-.989-.917z"/><path d="m30 0c-6.367 0-12.448 1.969-17.587 5.693-.447.324-.547.949-.223 1.396s.948.548 1.396.223c4.795-3.476 10.471-5.312 16.413-5.312 15.439 0 28 12.561 28 28s-12.561 28-28 28-27.999-12.561-27.999-28c0-7.737 3.086-14.938 8.689-20.276.4-.381.416-1.014.034-1.413-.381-.402-1.015-.415-1.413-.034-6.003 5.718-9.31 13.433-9.31 21.723 0 16.542 13.458 30 30 30s30-13.458 30-30-13.458-30-30-30z"/><path d="m33 50c.553 0 1-.447 1-1v-10c0-.464-.319-.866-.771-.974-.45-.106-.917.111-1.124.526l-2.105 4.211-2.105-4.211c-.207-.415-.677-.632-1.124-.526-.451.107-.771.51-.771.974v10c0 .553.447 1 1 1s1-.447 1-1v-5.764l1.105 2.211c.34.678 1.449.678 1.789 0l1.105-2.211v5.764c0 .553.447 1 1 1z"/><path d="m44 40c.553 0 1-.447 1-1s-.447-1-1-1h-6c-.553 0-1 .447-1 1s.447 1 1 1h2v8h-2c-.553 0-1 .447-1 1s.447 1 1 1h6c.553 0 1-.447 1-1s-.447-1-1-1h-2v-8z"/><path d="m23 41.5c0-1.93-1.57-3.5-3.5-3.5h-3.5c-.553 0-1 .447-1 1v10c0 .553.447 1 1 1h3.5c1.93 0 3.5-1.57 3.5-3.5 0-.98-.407-1.864-1.058-2.5.651-.636 1.058-1.52 1.058-2.5zm-2 5c0 .827-.673 1.5-1.5 1.5h-2.5v-3h2.5c.827 0 1.5.673 1.5 1.5zm-4-3.5v-3h2.5c.827 0 1.5.673 1.5 1.5s-.673 1.5-1.5 1.5z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 6.5 KiB |
|
After Width: | Height: | Size: 9.9 KiB |
@ -0,0 +1 @@
|
||||
<svg id="Layer_3" enable-background="new 0 0 64 64" height="512" viewBox="0 0 64 64" width="512" xmlns="http://www.w3.org/2000/svg"><g><path d="m62 22.04c0 2.92-.42 5.82-1.24 8.59-.82 2.78-2.04 5.43-3.63 7.89-4.02 6.22-9.57 11.29-16.12 14.74l-9.01 4.74-9.01-4.74c-6.55-3.45-12.1-8.52-16.12-14.74-.73-1.14-1.39-2.31-1.96-3.52h11.16l.93-1 6 13 5-18 4 6h9.55c.7 1.19 1.97 2 3.45 2 2.21 0 4-1.79 4-4s-1.79-4-4-4c-1.48 0-2.75.81-3.45 2h-7.55l-7-12-5 17-5-10-3.07 5h-10.57c-.05-.12-.08-.25-.12-.37-.82-2.77-1.24-5.67-1.24-8.59 0-2.66.62-5.28 1.81-7.65 1.29-2.57 3.24-4.67 5.59-6.12 2.36-1.46 5.1-2.27 7.98-2.27 3.18 0 6.2 1 8.7 2.74 2.49 1.75 4.46 4.25 5.55 7.25l.37 1.01.37-1.01c1.09-3 3.06-5.5 5.55-7.25 2.5-1.74 5.52-2.74 8.7-2.74 2.88 0 5.62.81 7.98 2.27 2.35 1.45 4.3 3.55 5.59 6.12 1.19 2.37 1.81 4.99 1.81 7.65z" fill="#ea3647"/><path d="m54.6 8.27c-2.36-1.46-5.1-2.27-7.98-2.27-3.18 0-6.2 1-8.7 2.74-2.49 1.75-4.46 4.25-5.55 7.25l-.37 1.01-.37-1.01c-1.09-3-3.06-5.5-5.55-7.25-2.5-1.74-5.52-2.74-8.7-2.74-.041 0-.081.004-.122.004-1.452 3.72-2.258 7.762-2.258 11.996 0 3.177.452 6.249 1.29 9.156l.71-1.156 5 10 5-17 7 12h7.55c.7-1.19 1.97-2 3.45-2 2.21 0 4 1.79 4 4s-1.79 4-4 4c-1.48 0-2.75-.81-3.45-2h-9.55l-4-6-3.404 12.255c5.315 5.347 12.449 8.885 20.397 9.603 4.822-3.246 8.962-7.425 12.137-12.338 1.59-2.46 2.81-5.11 3.63-7.89.82-2.77 1.24-5.67 1.24-8.59 0-2.66-.62-5.28-1.81-7.65-1.29-2.57-3.24-4.67-5.59-6.12z" fill="#fd505b"/><path d="m44.941 11.534c.574-2.063 6.032-2.742 10.097 1.296s3.39 9.503 1.284 10.087-4.416-2.006-6.887-4.505c-2.47-2.5-5.068-4.815-4.494-6.878z" fill="#ff9aa5"/><path d="m55.126 7.419c-2.558-1.582-5.499-2.419-8.506-2.419-3.321 0-6.527 1.01-9.275 2.922-2.323 1.633-4.15 3.811-5.345 6.354-1.195-2.545-3.022-4.723-5.349-6.356-2.744-1.91-5.95-2.92-9.271-2.92-3.007 0-5.948.837-8.505 2.419-2.544 1.569-4.604 3.825-5.959 6.522-1.254 2.497-1.916 5.298-1.916 8.099 0 3.018.431 6.003 1.292 8.906l.029.097c.034.116.07.234.118.347.157.37.52.61.921.61h10.57c.348 0 .67-.181.853-.477l2.128-3.467 4.195 8.391c.185.368.565.592.983.549.409-.036.755-.319.87-.714l4.346-14.774 5.831 9.996c.179.308.509.496.864.496h7.55c.354 0 .683-.188.862-.493.555-.944 1.523-1.507 2.588-1.507 1.654 0 3 1.346 3 3s-1.346 3-3 3c-1.065 0-2.033-.563-2.588-1.507-.18-.305-.508-.493-.862-.493h-9.015l-3.703-5.555c-.217-.325-.601-.499-.99-.433-.386.062-.7.343-.806.72l-4.271 15.374-4.857-10.525c-.14-.303-.421-.516-.751-.568-.321-.054-.663.062-.89.307l-.632.68h-10.725c-.343 0-.661.175-.845.465-.184.289-.206.651-.06.962.563 1.196 1.244 2.419 2.024 3.636 4.098 6.341 9.801 11.557 16.494 15.082l9.01 4.74c.147.077.307.115.467.115s.32-.038.466-.115l9.01-4.74c6.693-3.525 12.396-8.741 16.494-15.082 1.644-2.543 2.905-5.285 3.749-8.148.85-2.872 1.281-5.857 1.281-8.875 0-2.801-.662-5.602-1.916-8.099-1.355-2.697-3.415-4.953-5.958-6.522zm4.675 22.929c-.79 2.68-1.972 5.247-3.511 7.629-3.911 6.054-9.356 11.032-15.746 14.398l-8.544 4.495-8.544-4.495c-6.39-3.366-11.835-8.345-15.744-14.396-.423-.66-.816-1.322-1.173-1.979h9.531c.236 0 .464-.084.644-.234l5.378 11.653c.176.38.556.608.989.578.418-.034.771-.325.883-.729l4.415-15.896 2.789 4.184c.186.277.498.444.832.444h9.017c.947 1.263 2.397 2 3.983 2 2.757 0 5-2.243 5-5s-2.243-5-5-5c-1.586 0-3.036.737-3.983 2h-6.442l-6.71-11.504c-.201-.345-.582-.54-.985-.489-.396.049-.726.328-.838.711l-4.283 14.562-3.863-7.727c-.162-.325-.488-.536-.851-.552-.364-.031-.706.166-.896.476l-2.779 4.523h-9.271c-.73-2.58-1.099-5.256-1.099-7.96 0-2.491.589-4.981 1.703-7.202 1.188-2.365 2.994-4.343 5.224-5.718 2.241-1.387 4.818-2.12 7.453-2.12 2.911 0 5.722.886 8.125 2.559 2.394 1.682 4.187 4.023 5.187 6.775l.37 1.01c.143.394.518.656.938.656s.795-.262.938-.656l.371-1.012c.999-2.75 2.792-5.092 5.182-6.771 2.407-1.675 5.218-2.561 8.129-2.561 2.635 0 5.212.733 7.454 2.12 2.229 1.375 4.035 3.353 5.223 5.718 1.114 2.221 1.703 4.711 1.703 7.202 0 2.825-.403 5.619-1.199 8.308z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 7.4 KiB |
@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve" width="512" height="512">
|
||||
<g>
|
||||
<g>
|
||||
<path style="fill:#D77F4A;" d="M448.268,193.522c0-6.286-2.632-11.957-6.855-15.972c-2.615-2.486-3.009-6.596-0.766-9.422 			c2.985-3.76,4.768-8.516,4.768-13.69c0-7.532-3.779-14.18-9.545-18.154c-2.55-1.758-3.507-5.012-2.611-7.976 			c0.61-2.017,0.939-4.156,0.939-6.372c0-12.171-9.867-22.038-22.038-22.038c-0.271,0-0.071-6.017-0.74-9.253 			c-1.918-9.281-9.745-16.43-19.169-17.43c-1.211-0.128-2.405-0.159-3.575-0.098c-4.869,0.254-8.772-3.822-8.748-8.698 			c0-0.048,0-0.096,0-0.144c0-15.711-12.736-28.447-28.447-28.447c-0.174,0-5.572-18.923-21.496-16.566 			c-2.241,0.332-4.449,0.35-6.501,0.998c-4.71,1.488-9.938,0.436-13.691-2.776c-3.767-3.224-8.658-5.172-14.005-5.172 			c-4.18,0-8.08,1.19-11.383,3.249c-3.962,2.47-8.786,3.357-13.275,2.075c-1.881-0.537-3.868-0.825-5.922-0.825 			c-2.476,0-4.854,0.418-7.068,1.187c-4.807,1.67-10.112,0.693-14.313-2.179c-3.457-2.363-7.638-3.745-12.142-3.745 			c-4.802,0-9.235,1.571-12.817,4.225c-4.543,3.367-10.438,4.225-15.632,1.989c-2.968-1.278-6.239-1.986-9.676-1.986 			c-8.8,0-16.516,4.636-20.841,11.599c-2.887,4.648-7.74,7.748-13.208,7.944c-0.279,0.01-0.558,0.024-0.839,0.042 			c-14.402,0.942-26.008,12.822-26.575,27.244c-0.019,0.481-0.026,0.959-0.021,1.434c0.049,4.851-4.092,8.753-8.939,8.542 			c-1.105-0.048-2.231-0.015-3.372,0.105c-9.425,0.994-17.256,8.14-19.18,17.42c-0.672,3.24-0.472,9.263-0.743,9.263 			c-12.171,0-22.038,9.867-22.038,22.038c0,2.216,0.328,4.355,0.938,6.372c0.897,2.965-0.061,6.219-2.611,7.976 			c-5.765,3.974-9.545,10.622-9.545,18.154c0,5.174,1.783,9.93,4.768,13.69c2.243,2.826,1.849,6.936-0.766,9.422 			c-4.222,4.014-6.855,9.685-6.855,15.972c0,8.699,5.041,16.216,12.36,19.798c3.401,1.664,4.745,5.766,3.32,9.274 			c-1.279,3.149-1.851,6.66-1.517,10.338c0.922,10.154,8.945,18.467,19.054,19.791c2.827,0.37,5.555,0.183,8.114-0.439 			c-0.017,0.35-0.027,0.702-0.027,1.057c0,12.171,9.867,22.038,22.038,22.038c5.29,0,10.144-1.866,13.943-4.973 			c3.148,8.325,11.189,14.246,20.616,14.246c12.171,0,176.557,0,188.729,0c9.427,0,17.468-5.921,20.616-14.246 			c3.798,3.107,8.652,4.973,13.942,4.973c12.171,0,22.038-9.867,22.038-22.038c0-0.354-0.01-0.706-0.027-1.057 			c2.57,0.625,5.311,0.811,8.15,0.434c10.11-1.341,18.119-9.671,19.022-19.829c0.325-3.661-0.246-7.155-1.519-10.29 			c-1.425-3.51-0.084-7.614,3.318-9.279C443.227,209.738,448.268,202.22,448.268,193.522z"/>
|
||||
<path style="fill:#FFD15B;" d="M411.446,372.3c-64.616,2.692-95.255-14.6-95.255-14.6l-60.121-11.895l0.003-0.428l-1.084,0.214 			l-1.084-0.214l0.003,0.428l-60.121,11.895c0,0-30.64,17.293-95.255,14.6L68.204,499.925h186.784H442.13L411.446,372.3z"/>
|
||||
<path style="fill:#FFCEBF;" d="M291.728,291.481L291.728,291.481l-73.48,0v0c0,24.283-8.675,47.767-24.462,66.218l1.927,2.216 			c4.985,5.734,11.021,10.48,17.819,13.873c25.887,12.92,56.359,13.044,82.306,0.439c7.961-3.867,14.902-9.554,20.352-16.528v0 			C300.403,339.248,291.728,315.764,291.728,291.481z"/>
|
||||
<path style="fill:#D77F4A;" d="M137.497,142.363c3.02,23.928,10.565,42.042,10.565,42.042l215.877,0 			c0,0,9.996-14.52,19.282-37.554"/>
|
||||
<ellipse style="fill:#FFCEBF;" cx="256" cy="197.248" rx="108.427" ry="135.37"/>
|
||||
<path style="fill:#FFBBAA;" d="M313.264,82.287c19.269,24.435,31.163,57.962,31.163,94.961c0,74.763-48.545,135.37-108.427,135.37 			c-21.024,0-40.646-7.478-57.264-20.409c19.667,24.94,47.017,40.409,77.264,40.409c59.883,0,108.427-60.607,108.427-135.37 			C364.427,148.733,343.981,106.187,313.264,82.287z"/>
|
||||
<path style="fill:#D77F4A;" d="M256,56.149c-56.413,0-107.939,58.157-107.939,128.256l0,0c0,0,31.222-60.851,53.686-44.804 			c21.226,15.161,38.065,15.919,54.252,15.919c16.187,0,33.026-0.758,54.252-15.919c22.465-16.046,53.686,44.804,53.686,44.804l0,0 			C364.427,114.305,312.413,56.149,256,56.149z"/>
|
||||
<path style="fill:#FFE177;" d="M169.835,248.2l-27.1-10.507l-27.1-10.507c0,0-81.573,129.986-99.523,176.281 			s-7.257,79.017,26.618,92.151c33.874,13.134,63.831-3.827,81.781-50.122S169.835,248.2,169.835,248.2z"/>
|
||||
<path style="fill:#FFCEBF;" d="M124.683,230.694l-1.69-33.678c-0.815-16.248,5.815-31.983,18.013-42.748l46.186-40.76 			c2.712-2.394,6.358-3.438,9.926-2.843l0,0c5.794,0.966,10.04,5.979,10.04,11.852v4.179c0,3.777-1.262,7.446-3.585,10.424 			l-21.125,29.884c-11.073,15.664-17.019,34.376-17.019,53.559v25.929L124.683,230.694z"/>
|
||||
<path style="fill:#FFE177;" d="M342.165,248.2l27.1-10.507l27.1-10.507c0,0,81.573,129.986,99.523,176.281 			s7.257,79.017-26.618,92.151c-33.874,13.134-63.831-3.827-81.781-50.122C369.539,399.201,342.165,248.2,342.165,248.2z"/>
|
||||
<path style="fill:#FFD15B;" d="M495.887,403.467c-17.95-46.295-99.523-176.281-99.523-176.281l-24.167,9.37 			c18.974,30.625,78.653,128.128,93.69,166.911c17.95,46.295,7.257,79.017-26.617,92.151c-2.073,0.804-4.131,1.491-6.173,2.07 			c11.214,3.55,23.415,2.877,36.173-2.07C503.144,482.484,513.837,449.762,495.887,403.467z"/>
|
||||
<path style="fill:#FFCEBF;" d="M387.317,230.694l1.69-33.678c0.815-16.248-5.815-31.983-18.013-42.748l-46.186-40.76 			c-2.712-2.394-6.358-3.438-9.926-2.843l0,0c-5.794,0.966-10.04,5.979-10.04,11.852v4.179c0,3.777,1.262,7.446,3.585,10.424 			l21.125,29.884c11.073,15.664,17.019,34.376,17.019,53.559v25.929L387.317,230.694z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 			M415.086,252.718c10.11-1.341,18.119-9.671,19.022-19.829c0.325-3.661-0.246-7.155-1.519-10.29 			c-1.425-3.51-0.084-7.614,3.318-9.279c7.319-3.582,12.36-11.1,12.36-19.798c0-6.286-2.632-11.957-6.855-15.972 			c-2.615-2.486-3.009-6.596-0.766-9.422c2.985-3.76,4.768-8.516,4.768-13.69c0-7.532-3.779-14.18-9.545-18.154 			c-2.55-1.758-3.507-5.012-2.611-7.976c0.61-2.017,0.939-4.156,0.939-6.372c0-12.171-9.867-22.038-22.038-22.038 			c-0.271,0-0.071-6.017-0.74-9.253c-1.918-9.281-9.745-16.43-19.169-17.43c-1.211-0.128-2.405-0.159-3.575-0.098 			c-4.869,0.254-8.772-3.822-8.748-8.698c0-0.048,0-0.096,0-0.144c0-15.711-12.736-28.447-28.447-28.447 			c-0.174,0-5.572-18.923-21.496-16.566c-2.241,0.332-4.449,0.35-6.501,0.998c-4.71,1.488-9.938,0.436-13.691-2.776 			c-3.767-3.224-8.658-5.172-14.005-5.172c-4.18,0-8.08,1.19-11.383,3.249c-3.962,2.47-8.786,3.357-13.275,2.075 			c-1.881-0.537-3.868-0.825-5.922-0.825c-2.476,0-4.854,0.418-7.068,1.187c-4.807,1.67-10.112,0.693-14.313-2.179 			c-3.457-2.363-7.638-3.745-12.142-3.745c-4.802,0-9.235,1.571-12.817,4.225c-4.543,3.367-10.438,4.225-15.632,1.989 			c-2.968-1.278-6.239-1.986-9.676-1.986c-8.8,0-16.516,4.636-20.841,11.599c-2.887,4.648-7.74,7.748-13.208,7.944 			c-0.279,0.01-0.558,0.024-0.839,0.042c-14.402,0.942-26.008,12.822-26.575,27.244c-0.019,0.481-0.026,0.959-0.021,1.434 			c0.049,4.851-4.092,8.753-8.939,8.542c-1.105-0.048-2.231-0.015-3.372,0.105c-9.425,0.994-17.256,8.14-19.18,17.42 			c-0.672,3.24-0.472,9.263-0.743,9.263c-12.171,0-22.038,9.867-22.038,22.038c0,2.216,0.328,4.355,0.938,6.372 			c0.897,2.965-0.061,6.219-2.611,7.976c-5.765,3.974-9.545,10.622-9.545,18.154c0,5.174,1.783,9.93,4.768,13.69 			c2.243,2.826,1.849,6.936-0.766,9.422c-4.222,4.014-6.855,9.685-6.855,15.972c0,8.699,5.041,16.216,12.36,19.798 			c3.401,1.664,4.745,5.766,3.32,9.274c-1.279,3.149-1.851,6.66-1.517,10.338c0.922,10.154,8.945,18.467,19.054,19.791"/>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 			M201.748,139.601c21.226,15.161,38.065,15.919,54.252,15.919c16.187,0,33.026-0.758,54.252-15.919"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="35.204" y1="223.363" x2="35.204" y2="227.85"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="35.204" y1="261.166" x2="35.204" y2="256.678"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="53.103" y1="242.264" x2="48.615" y2="242.264"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="17.306" y1="242.264" x2="21.794" y2="242.264"/>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 			M363.942,370.537c-32.235-4.08-47.751-12.838-47.751-12.838"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="374.066" y1="499.925" x2="442.13" y2="499.925"/>
|
||||
|
||||
<polyline style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" points=" 			68.204,499.925 254.988,499.925 340.066,499.925 		"/>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 			M193.786,357.699c0,0-15.865,8.954-48.838,12.973"/>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 			M212.237,325.956c-4.145,11.522-10.365,22.293-18.45,31.743l1.927,2.216c4.985,5.734,11.021,10.48,17.819,13.873 			c25.887,12.92,56.359,13.044,82.306,0.439c7.961-3.867,14.902-9.554,20.352-16.528v0c-8.202-9.586-14.484-20.53-18.627-32.239"/>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 			M345.91,272.934c-19.485,36.009-52.483,59.683-89.91,59.683c-37.853,0-71.176-24.217-90.571-60.919"/>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 			M61.79,316.421c-19.28,33.219-38.119,67.552-45.678,87.046c-17.95,46.295-7.257,79.017,26.618,92.151 			c33.874,13.134,63.831-3.827,81.781-50.122S169.835,248.2,169.835,248.2l-27.1-10.507l-27.1-10.507 			c0,0-16.714,26.634-36.675,60.083"/>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 			M32.38,16.905l7.925,23.552c1.414,4.203,6.751,5.46,9.892,2.329l8.161-8.135c3.103-3.093,8.368-1.911,9.851,2.212l8.999,25.015"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="473.796" y1="233.363" x2="473.796" y2="237.85"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="473.796" y1="271.166" x2="473.796" y2="266.678"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="455.897" y1="252.264" x2="460.385" y2="252.264"/>
|
||||
|
||||
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="491.694" y1="252.264" x2="487.206" y2="252.264"/>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 			M483.621,16.905l-7.925,23.552c-1.414,4.203-6.751,5.46-9.892,2.329l-8.161-8.135c-3.103-3.093-8.368-1.911-9.851,2.212 			l-8.999,25.015"/>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 			M124.683,230.694l-1.69-33.678c-0.815-16.248,5.815-31.983,18.013-42.748l46.186-40.76c2.712-2.394,6.358-3.438,9.926-2.843l0,0 			c5.794,0.966,10.04,5.979,10.04,11.852v4.179c0,3.777-1.262,7.446-3.585,10.424l-21.125,29.884 			c-11.073,15.664-17.019,34.376-17.019,53.559v25.929L124.683,230.694z"/>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 			M450.21,316.421c19.28,33.219,38.119,67.552,45.678,87.046c17.95,46.295,7.257,79.017-26.618,92.151 			c-33.874,13.134-63.831-3.827-81.781-50.122c-17.95-46.295-45.324-197.296-45.324-197.296l27.1-10.507l27.1-10.507 			c0,0,16.714,26.634,36.675,60.083"/>
|
||||
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d=" 			M387.317,230.694l1.69-33.678c0.815-16.248-5.815-31.983-18.013-42.748l-46.186-40.76c-2.712-2.394-6.358-3.438-9.926-2.843l0,0 			c-5.794,0.966-10.04,5.979-10.04,11.852v4.179c0,3.777,1.262,7.446,3.585,10.424l21.125,29.884 			c11.073,15.664,17.019,34.376,17.019,53.559v25.929L387.317,230.694z"/>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 13 KiB |
@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
id="svg696"
|
||||
xml:space="preserve"
|
||||
width="682.66669"
|
||||
height="682.66669"
|
||||
viewBox="0 0 682.66669 682.66669"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs700"><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath710"><path
|
||||
d="M 0,512 H 512 V 0 H 0 Z"
|
||||
id="path708" /></clipPath></defs><g
|
||||
id="g702"
|
||||
transform="matrix(1.3333333,0,0,-1.3333333,0,682.66667)"><g
|
||||
id="g704"><g
|
||||
id="g706"
|
||||
clip-path="url(#clipPath710)"><g
|
||||
id="g712"
|
||||
transform="translate(9.0435,355.2871)"><path
|
||||
d="m 0,0 c 0.338,7.053 1.429,13.958 3.178,20.649 0.142,0.541 0.287,1.08 0.437,1.618 3.918,14.057 10.739,27.135 19.571,38.611 21.46,27.886 54.8,46.31 87.238,46.31 37.457,0 69.076,-22.555 83.697,-35.027 4.971,-4.241 12.285,-4.164 17.183,0.161 14.161,12.505 44.933,34.866 83.904,34.866 52.616,0 107.611,-48.482 110.423,-107.188 0.878,-18.368 -1.675,-34.297 -6.411,-48.745 -3.814,-11.637 -9.041,-22.316 -15.057,-32.515 -19.996,-33.905 -115.745,-106.958 -157.552,-142.348 -13.836,-11.712 -34.105,-11.709 -47.936,0.009 C 136.981,-188.276 41.584,-115.437 21.468,-81.26 12.443,-65.927 5.214,-49.612 1.863,-30.601 0.196,-21.138 -0.527,-11.02 0,0"
|
||||
style="fill:#ff7d97;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path714" /></g><g
|
||||
id="g716"
|
||||
transform="translate(262.0469,153.4565)"><path
|
||||
d="m 0,0 c -9.998,-8.147 -19.031,-15.546 -26.392,-21.777 -13.837,-11.713 -34.105,-11.709 -47.937,0.009 -41.693,35.323 -137.09,108.162 -157.206,142.338 -9.025,15.333 -16.255,31.649 -19.605,50.66 -0.343,1.947 -0.647,3.922 -0.907,5.927"
|
||||
style="fill:none;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path718" /></g><g
|
||||
id="g720"
|
||||
transform="translate(34.6689,419.2329)"><path
|
||||
d="m 0,0 c 21.497,26.161 53.565,43.242 84.798,43.242 37.458,0 69.076,-22.555 83.697,-35.027 4.971,-4.241 12.286,-4.164 17.184,0.161 14.161,12.505 44.932,34.866 83.903,34.866 52.616,0 107.611,-48.482 110.424,-107.188 0.878,-18.367 -1.676,-34.297 -6.411,-48.745 -1.877,-5.726 -4.096,-11.221 -6.583,-16.54"
|
||||
style="fill:none;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path722" /></g><g
|
||||
id="g724"
|
||||
transform="translate(12.3311,376.3408)"><path
|
||||
d="M 0,0 V 0"
|
||||
style="fill:none;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path726" /></g><g
|
||||
id="g728"
|
||||
transform="translate(502,169.7637)"><path
|
||||
d="m 0,0 c 0,-66.406 -53.399,-120.239 -119.271,-120.239 -65.872,0 -119.271,53.833 -119.271,120.239 0,66.406 53.399,120.239 119.271,120.239 C -53.399,120.239 0,66.406 0,0"
|
||||
style="fill:#faf7f5;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path730" /></g><g
|
||||
id="g732"
|
||||
transform="translate(502,169.7637)"><path
|
||||
d="m 0,0 c 0,-66.406 -53.399,-120.239 -119.271,-120.239 -65.872,0 -119.271,53.833 -119.271,120.239 0,66.406 53.399,120.239 119.271,120.239 C -53.399,120.239 0,66.406 0,0 Z"
|
||||
style="fill:none;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path734" /></g><g
|
||||
id="g736"
|
||||
transform="translate(430.6279,194.124)"><path
|
||||
d="m 0,0 h -23.744 v 23.952 c 0,6.765 -5.44,12.248 -12.15,12.248 h -24.01 c -6.71,0 -12.15,-5.483 -12.15,-12.248 V 0 h -23.744 c -6.71,0 -12.149,-5.483 -12.149,-12.248 v -24.225 c 0,-6.764 5.439,-12.247 12.149,-12.247 h 23.744 v -23.953 c 0,-6.764 5.44,-12.247 12.15,-12.247 h 24.01 c 6.71,0 12.15,5.483 12.15,12.247 V -48.72 H 0 c 6.71,0 12.149,5.483 12.149,12.247 v 24.225 C 12.149,-5.483 6.71,0 0,0"
|
||||
style="fill:#ff9eb1;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path738" /></g><g
|
||||
id="g740"
|
||||
transform="translate(430.6279,194.124)"><path
|
||||
d="m 0,0 h -23.744 v 23.952 c 0,6.765 -5.44,12.248 -12.15,12.248 h -24.01 c -6.71,0 -12.15,-5.483 -12.15,-12.248 V 0 h -23.744 c -6.71,0 -12.149,-5.483 -12.149,-12.248 v -24.225 c 0,-6.764 5.439,-12.247 12.149,-12.247 h 23.744 v -23.953 c 0,-6.764 5.44,-12.247 12.15,-12.247 h 24.01 c 6.71,0 12.15,5.483 12.15,12.247 V -48.72 H 0 c 6.71,0 12.149,5.483 12.149,12.247 v 24.225 C 12.149,-5.483 6.71,0 0,0 Z"
|
||||
style="fill:none;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path742" /></g></g></g></g></svg>
|
||||
|
After Width: | Height: | Size: 5.0 KiB |
@ -0,0 +1,28 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class BackHomeButton extends StatelessWidget {
|
||||
final void Function() onPressed;
|
||||
final Size deviceSize;
|
||||
|
||||
const BackHomeButton({
|
||||
Key? key,
|
||||
required this.onPressed,
|
||||
required this.deviceSize,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Align(
|
||||
alignment: Alignment.topLeft,
|
||||
child: Container(
|
||||
margin: EdgeInsets.fromLTRB(15, deviceSize.height * 0.05, 0, 0),
|
||||
child: IconButton(
|
||||
icon: const Icon(Icons.arrow_back),
|
||||
color: Colors.white,
|
||||
iconSize: 25,
|
||||
onPressed: onPressed,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,87 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:vital_sign_camera/vital_sign_camera.dart';
|
||||
|
||||
class BoundingBoxWidget extends StatelessWidget {
|
||||
final Size deviceSize;
|
||||
final NormalizedFaceBox? facebox;
|
||||
final VideoFrameInfo? videoFrameInfo;
|
||||
|
||||
const BoundingBoxWidget({
|
||||
Key? key,
|
||||
required this.deviceSize,
|
||||
required this.facebox,
|
||||
required this.videoFrameInfo,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (facebox == null || videoFrameInfo == null) {
|
||||
return Container();
|
||||
}
|
||||
|
||||
// Get a map with left, top, width, and height of the bounding box for the face
|
||||
Map boundingBox = computeBoundingBox();
|
||||
|
||||
return Positioned(
|
||||
left: boundingBox['left'],
|
||||
top: boundingBox['top'],
|
||||
child: Container(
|
||||
width: boundingBox['width'],
|
||||
height: boundingBox['height'],
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: Colors.red,
|
||||
width: 2,
|
||||
)),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// Helper function to compute the left, top, width, and height of the bounding box
|
||||
Map computeBoundingBox() {
|
||||
double width = videoFrameInfo!.width;
|
||||
double height = videoFrameInfo!.height;
|
||||
double windowWidth = deviceSize.width;
|
||||
double windowHeight = deviceSize.height;
|
||||
|
||||
double screenAspectRatio = deviceSize.aspectRatio;
|
||||
double frameAspectRatio = width / height;
|
||||
|
||||
int xTransform = 1;
|
||||
if (Platform.isAndroid) {
|
||||
xTransform = -1;
|
||||
}
|
||||
|
||||
double scale = 1;
|
||||
if (screenAspectRatio < frameAspectRatio) {
|
||||
scale = windowHeight / height;
|
||||
} else {
|
||||
scale = windowWidth / width;
|
||||
}
|
||||
|
||||
Map scaledFrameBounds = {
|
||||
'x': (windowWidth - scale * width) / 2,
|
||||
'y': (windowHeight - scale * height) / 2,
|
||||
'width': scale * width,
|
||||
'height': scale * height,
|
||||
};
|
||||
|
||||
double x = facebox!.xCenter - facebox!.width / 2;
|
||||
double y = facebox!.yCenter - facebox!.height / 2;
|
||||
|
||||
if (xTransform < 0) {
|
||||
x = 1 - x - facebox!.width;
|
||||
}
|
||||
|
||||
Map result = {
|
||||
'left': scaledFrameBounds['x'] + x * scaledFrameBounds['width'],
|
||||
'top': scaledFrameBounds['y'] + y * scaledFrameBounds['height'],
|
||||
'width': facebox!.width * scaledFrameBounds['width'],
|
||||
'height': facebox!.height * scaledFrameBounds['height'],
|
||||
};
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class Button extends StatelessWidget {
|
||||
final void Function() onPressed;
|
||||
final Size deviceSize;
|
||||
final String title;
|
||||
final Alignment alignment;
|
||||
final EdgeInsets margin;
|
||||
|
||||
const Button({
|
||||
Key? key,
|
||||
required this.onPressed,
|
||||
required this.deviceSize,
|
||||
required this.title,
|
||||
required this.alignment,
|
||||
required this.margin,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Align(
|
||||
alignment: alignment,
|
||||
child: Container(
|
||||
margin: margin,
|
||||
child: ElevatedButton(
|
||||
onPressed: onPressed,
|
||||
child: Text(
|
||||
title,
|
||||
style: const TextStyle(fontSize: 18),
|
||||
),
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class Error extends StatelessWidget {
|
||||
final dynamic error;
|
||||
final int? errorCode;
|
||||
|
||||
const Error({
|
||||
Key? key,
|
||||
this.error,
|
||||
this.errorCode,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Center(
|
||||
child: Text(
|
||||
"$error $errorCode",
|
||||
style: const TextStyle(color: Colors.white),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,222 @@
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:vital_sign_camera/vital_sign_camera.dart';
|
||||
// import 'vital_sign_widget.dart';
|
||||
//
|
||||
// class HealthResultWidget extends StatelessWidget {
|
||||
// final Size deviceSize;
|
||||
// final void Function() onTap;
|
||||
// final Health? healthResult;
|
||||
//
|
||||
// late final VitalSign? _vitalSign;
|
||||
// late final HolisticAnalysis? _holisticAnalysis;
|
||||
// late final CardiovascularRisks? _cardiovascularRisks;
|
||||
// late final CovidRisk? _covidRisk;
|
||||
// late final ScanParameters? _scanParameters;
|
||||
//
|
||||
// HealthResultWidget({
|
||||
// Key? key,
|
||||
// required this.deviceSize,
|
||||
// required this.onTap,
|
||||
// required this.healthResult,
|
||||
// }) : super(key: key) {
|
||||
// _vitalSign = healthResult?.vitalSigns;
|
||||
// _holisticAnalysis = healthResult?.holisticHealth;
|
||||
// _cardiovascularRisks = healthResult?.risks?.cardiovascularRisks;
|
||||
// _covidRisk = healthResult?.risks?.covidRisk;
|
||||
// _scanParameters = healthResult?.scanParameters;
|
||||
// }
|
||||
//
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return Positioned(
|
||||
// top: deviceSize.height * 0.07,
|
||||
// left: deviceSize.width * 0.05,
|
||||
// child: GestureDetector(
|
||||
// onTap: onTap,
|
||||
// child: SizedBox(
|
||||
// width: deviceSize.width * 0.9,
|
||||
// child: Container(
|
||||
// color: Colors.black38,
|
||||
// child: Padding(
|
||||
// padding: const EdgeInsets.all(15),
|
||||
// child: Column(
|
||||
// crossAxisAlignment: CrossAxisAlignment.start,
|
||||
// children: [
|
||||
// Container(
|
||||
// margin: const EdgeInsets.fromLTRB(0, 0, 0, 10),
|
||||
// child: const Text(
|
||||
// "Vital Signs",
|
||||
// style: TextStyle(
|
||||
// fontSize: 15,
|
||||
// color: Colors.amber,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "Heart Rate",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.vitalSigns.heartRate)),
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "SPO2",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.vitalSigns.spo2)),
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "IBI",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.vitalSigns.ibi)),
|
||||
// if (_vitalSign?.stress != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "Stress",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.vitalSigns.stress)),
|
||||
// if (_vitalSign?.respiratoryRate != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "Respiratory Rate",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult
|
||||
// ?.vitalSigns.respiratoryRate)),
|
||||
// if (_vitalSign?.hrvRmssd != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "HRV RMSSD",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.vitalSigns.hrvRmssd)),
|
||||
// if (_vitalSign?.hrvSdnn != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "HRV SDNN",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.vitalSigns.hrvSdnn)),
|
||||
// if (_vitalSign?.temperature != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "Temperature",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.vitalSigns.temperature)),
|
||||
// if (_vitalSign?.bloodPressure != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "Blood Pressure",
|
||||
// vitalSignValue:
|
||||
// healthResult?.vitalSigns.bloodPressure ??
|
||||
// ""),
|
||||
// if (_vitalSign?.bloodPressureSystolic != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "Blood Pressure Systolic",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult
|
||||
// ?.vitalSigns.bloodPressureSystolic)),
|
||||
// if (_vitalSign?.bloodPressureDiastolic != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "Blood Pressure Diastolic",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult
|
||||
// ?.vitalSigns.bloodPressureDiastolic)),
|
||||
// if (_holisticAnalysis != null)
|
||||
// Container(
|
||||
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
|
||||
// child: const Text(
|
||||
// "Holistic Analysis",
|
||||
// style: TextStyle(
|
||||
// fontSize: 15,
|
||||
// color: Colors.amber,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// if (_holisticAnalysis != null &&
|
||||
// _holisticAnalysis?.bmi != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "BMI",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.holisticHealth?.bmi)),
|
||||
// if (_holisticAnalysis != null &&
|
||||
// _holisticAnalysis?.generalWellness != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "General Wellness",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult
|
||||
// ?.holisticHealth?.generalWellness)),
|
||||
// if (_cardiovascularRisks != null)
|
||||
// Container(
|
||||
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
|
||||
// child: const Text(
|
||||
// "Cardiovascular Risks",
|
||||
// style: TextStyle(
|
||||
// fontSize: 15,
|
||||
// color: Colors.amber,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// if (_cardiovascularRisks != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "General",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.risks?.cardiovascularRisks
|
||||
// ?.generalRisk)),
|
||||
// if (_cardiovascularRisks != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "Congestive Heart Failure",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.risks?.cardiovascularRisks
|
||||
// ?.congestiveHeartFailure)),
|
||||
// if (_cardiovascularRisks != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "Coronary Heart Disease",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.risks?.cardiovascularRisks
|
||||
// ?.coronaryHeartDisease)),
|
||||
// if (_cardiovascularRisks != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "Intermittent Claudication",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.risks?.cardiovascularRisks
|
||||
// ?.intermittentClaudication)),
|
||||
// if (_cardiovascularRisks != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "Stroke",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.risks?.cardiovascularRisks
|
||||
// ?.stroke)),
|
||||
// if (_covidRisk != null)
|
||||
// Container(
|
||||
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
|
||||
// child: const Text(
|
||||
// "Covid Risks",
|
||||
// style: TextStyle(
|
||||
// fontSize: 15,
|
||||
// color: Colors.amber,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// if (_covidRisk != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "Risk",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult
|
||||
// ?.risks?.covidRisk?.covidRisk)),
|
||||
// if (_scanParameters != null)
|
||||
// Container(
|
||||
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
|
||||
// child: const Text(
|
||||
// "Scan Parameters",
|
||||
// style: TextStyle(
|
||||
// fontSize: 15,
|
||||
// color: Colors.amber,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// if (_scanParameters != null)
|
||||
// VitalSignWidget(
|
||||
// vitalSignName: "Signal Quality",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult
|
||||
// ?.scanParameters?.signalQuality)),
|
||||
// ])))),
|
||||
// ));
|
||||
// }
|
||||
//
|
||||
// String formatValueToTwoDp(double? value) {
|
||||
// return (value != null) ? value.toStringAsFixed(2) : "";
|
||||
// }
|
||||
// }
|
||||
@ -0,0 +1,37 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class ScanCondition extends StatelessWidget {
|
||||
final String scanConditionName;
|
||||
final bool isConditionSatisfied;
|
||||
|
||||
const ScanCondition({
|
||||
Key? key,
|
||||
required this.scanConditionName, // condition
|
||||
required this.isConditionSatisfied, // status
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.fromLTRB(0, 5, 0, 0),
|
||||
child: Row(
|
||||
children: [
|
||||
(isConditionSatisfied)
|
||||
? Image.asset('assets/images/checkmark.png', width: 14)
|
||||
: Image.asset('assets/images/crossmark.png', width: 14),
|
||||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(5, 0, 0, 0),
|
||||
child: Text(
|
||||
scanConditionName,
|
||||
style: const TextStyle(
|
||||
fontSize: 14,
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,95 @@
|
||||
import 'package:diplomaticquarterapp/theme/colors.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:vital_sign_camera/vital_sign_camera.dart';
|
||||
|
||||
import 'scan_condition.dart';
|
||||
|
||||
class ScanConditionChecklist extends StatelessWidget {
|
||||
final ScanConditions conditions; // ScanCondition
|
||||
|
||||
const ScanConditionChecklist({
|
||||
Key? key,
|
||||
required this.deviceSize,
|
||||
required this.conditions, // ScanCondition
|
||||
}) : super(key: key);
|
||||
|
||||
final Size deviceSize;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SizedBox(
|
||||
height: deviceSize.width * 0.4,
|
||||
child: Material(
|
||||
color:Colors.white,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
TranslationBase.of(context).scanningConditions,
|
||||
style: TextStyle(
|
||||
fontSize: 15,
|
||||
color: CustomColors.accentColor,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(0, 10, 0, 0),
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
children: [
|
||||
ScanCondition(
|
||||
scanConditionName:
|
||||
TranslationBase.of(context).lighting,
|
||||
isConditionSatisfied: conditions.lighting,
|
||||
),
|
||||
ScanCondition(
|
||||
scanConditionName:
|
||||
TranslationBase.of(context).distance,
|
||||
isConditionSatisfied: conditions.distance,
|
||||
),
|
||||
ScanCondition(
|
||||
scanConditionName:
|
||||
TranslationBase.of(context).centered,
|
||||
isConditionSatisfied: conditions.centered,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
Expanded(
|
||||
child: Column(
|
||||
children: [
|
||||
ScanCondition(
|
||||
scanConditionName:
|
||||
TranslationBase.of(context).movement,
|
||||
isConditionSatisfied: conditions.movement,
|
||||
),
|
||||
ScanCondition(
|
||||
scanConditionName:
|
||||
TranslationBase.of(context).frameRate,
|
||||
isConditionSatisfied: conditions.frameRate,
|
||||
),
|
||||
ScanCondition(
|
||||
scanConditionName:
|
||||
TranslationBase.of(context).serverReady,
|
||||
isConditionSatisfied: conditions.serverReady,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,57 @@
|
||||
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:vital_sign_camera/vital_sign_camera.dart';
|
||||
|
||||
class ScanStatus extends StatelessWidget {
|
||||
final GetHealthStage? stage;
|
||||
final double? remainingTime;
|
||||
|
||||
const ScanStatus({
|
||||
Key? key,
|
||||
required this.stage,
|
||||
required this.remainingTime,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
getRemainingTime(),
|
||||
style: const TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.white,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
getScanStage(context),
|
||||
style: const TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.white,
|
||||
),
|
||||
),
|
||||
Container(height: 100),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
String getScanStage(context) {
|
||||
if (stage == GetHealthStage.waitingData) {
|
||||
return TranslationBase.of(context).waitingData;
|
||||
} else if (stage == GetHealthStage.collectingData) {
|
||||
return TranslationBase.of(context).collectingData;
|
||||
} else if (stage == GetHealthStage.analyzingData) {
|
||||
return TranslationBase.of(context).analyzingData;
|
||||
}
|
||||
return ''; // idle
|
||||
}
|
||||
|
||||
String getRemainingTime() {
|
||||
return (remainingTime != null && remainingTime != double.infinity)
|
||||
? remainingTime!.toStringAsFixed(0)
|
||||
: "";
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,39 @@
|
||||
import 'package:diplomaticquarterapp/theme/colors.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class StartButton extends StatelessWidget {
|
||||
final void Function() onPressed;
|
||||
final bool disabled;
|
||||
|
||||
const StartButton({
|
||||
Key? key,
|
||||
required this.onPressed,
|
||||
required this.disabled,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Align(
|
||||
alignment: Alignment.bottomRight,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(right: 16.0, bottom: 32),
|
||||
child: ElevatedButton(
|
||||
onPressed: (disabled) ? () {} : onPressed,
|
||||
style: ElevatedButton.styleFrom(
|
||||
fixedSize: const Size(100, 70),
|
||||
shape: const CircleBorder(),
|
||||
backgroundColor: (disabled) ? Colors.grey : CustomColors.accentColor,
|
||||
elevation: 8,
|
||||
),
|
||||
child: Text(
|
||||
TranslationBase.of(context).start,
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,354 @@
|
||||
import 'package:diplomaticquarterapp/theme/colors.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
|
||||
class VitalSignWidget extends StatelessWidget {
|
||||
final String vitalSignName;
|
||||
final String vitalSignValue;
|
||||
final String vectorUrl;
|
||||
final dynamic condition;
|
||||
final Map<String, dynamic>? lookupValues;
|
||||
final Map<String, dynamic>? bloodPressureValues;
|
||||
final Color? textColor;
|
||||
|
||||
const VitalSignWidget({
|
||||
Key? key,
|
||||
required this.vitalSignName,
|
||||
required this.vitalSignValue,
|
||||
this.textColor,
|
||||
required this.condition,
|
||||
required this.vectorUrl,
|
||||
this.lookupValues,
|
||||
this.bloodPressureValues,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Card(
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
color: Colors.white,
|
||||
elevation: 2,
|
||||
shadowColor: CustomColors.lightGreyColor,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(12.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
SvgPicture.asset(vectorUrl, width: 36.0, height: 36.0),
|
||||
SizedBox(
|
||||
width: 16,
|
||||
),
|
||||
Text(
|
||||
vitalSignName,
|
||||
textAlign: TextAlign.start,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: textColor ?? Colors.white,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
"$vitalSignValue ${condition.unit}",
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
color: textColor ?? Colors.white,
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 8,
|
||||
),
|
||||
if (lookupValues != null)
|
||||
Status(
|
||||
status:
|
||||
"${TranslationBase.of(context).getValue(condition.current?.quantitativeInterpretation ?? '')}",
|
||||
originalData:
|
||||
condition.current?.quantitativeInterpretation ?? '',
|
||||
)
|
||||
// Text(
|
||||
// "${TranslationBase.of(context).getValue(condition.current?.quantitativeInterpretation ?? '')}",
|
||||
// style: TextStyle(
|
||||
// fontSize: 14,
|
||||
// color: textColor ?? Colors.white,
|
||||
// fontWeight: FontWeight.w500,
|
||||
// ),
|
||||
// ),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
// SizedBox(
|
||||
// height: 30,
|
||||
// child: Row(mainAxisSize: MainAxisSize.max, children: [
|
||||
if (lookupValues != null)
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: ListView.separated(
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
separatorBuilder: (_, __) => SizedBox(
|
||||
width: 8,
|
||||
),
|
||||
shrinkWrap: true,
|
||||
itemCount: lookupValues?.length ?? 0,
|
||||
itemBuilder: (_, index) {
|
||||
var key = lookupValues?.keys.elementAt(index);
|
||||
return RangeWidget(
|
||||
title: key ?? '',
|
||||
values: lookupValues?[key] ?? [],
|
||||
isSelected: false,
|
||||
);
|
||||
}),
|
||||
),
|
||||
|
||||
if (bloodPressureValues != null)
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: ListView.separated(
|
||||
separatorBuilder: (_, __) => SizedBox(
|
||||
width: 8,
|
||||
),
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
shrinkWrap: true,
|
||||
itemCount: bloodPressureValues?.length ?? 0,
|
||||
itemBuilder: (_, index) {
|
||||
var key = bloodPressureValues?.keys.elementAt(index);
|
||||
print(
|
||||
'the ssize is ${(bloodPressureValues?[key]?.length ?? 1) * 40} ');
|
||||
// return RangeWidget(
|
||||
// title: key??'',
|
||||
// values: lookupValues?[key]??[],isSelected: false,
|
||||
// );
|
||||
return Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
TranslationBase.of(context)
|
||||
.getValue(key ?? ''),
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
color: Colors.black, fontSize: 16),
|
||||
),
|
||||
Status(
|
||||
status:
|
||||
"${TranslationBase.of(context).getValue(condition.getValue(key)?.quantitativeInterpretation ?? '')}",
|
||||
originalData: condition
|
||||
.getValue(key)
|
||||
?.quantitativeInterpretation ??
|
||||
'',
|
||||
)
|
||||
],
|
||||
),
|
||||
SizedBox(height: 8),
|
||||
SizedBox(
|
||||
height: 220,
|
||||
child: ListView.separated(
|
||||
separatorBuilder: (_, __) => SizedBox(
|
||||
width: 8,
|
||||
),
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
shrinkWrap: true,
|
||||
itemCount:
|
||||
bloodPressureValues?[key]?.length ?? 0,
|
||||
itemBuilder: (_, index) {
|
||||
var title = bloodPressureValues?[key]
|
||||
?.keys
|
||||
.elementAt(index);
|
||||
|
||||
return RangeWidget(
|
||||
title: title ?? '',
|
||||
values: bloodPressureValues?[key]
|
||||
?[title] ??
|
||||
[],
|
||||
isSelected: false,
|
||||
);
|
||||
}))
|
||||
],
|
||||
);
|
||||
}),
|
||||
),
|
||||
// ]),
|
||||
// ),
|
||||
SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
// Row(
|
||||
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
// children: [
|
||||
// Text(
|
||||
// TranslationBase.of(context).getValue(
|
||||
// condition.condition?.first.interpretation ?? ''),
|
||||
// style: TextStyle(
|
||||
// fontSize: 14,
|
||||
// color: textColor ?? Colors.white,
|
||||
// fontWeight: FontWeight.w500,
|
||||
// ),
|
||||
// ),
|
||||
// Text(
|
||||
// TranslationBase.of(context).getValue(
|
||||
// condition.condition?.last.interpretation ?? ''),
|
||||
// style: TextStyle(
|
||||
// fontSize: 14,
|
||||
// color: textColor ?? Colors.white,
|
||||
// fontWeight: FontWeight.w500,
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// SizedBox(
|
||||
// height: 8,
|
||||
// ),
|
||||
]),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class RangeWidget extends StatelessWidget {
|
||||
final String title;
|
||||
final List<String> values;
|
||||
final bool isSelected;
|
||||
|
||||
const RangeWidget(
|
||||
{super.key,
|
||||
required this.title,
|
||||
required this.isSelected,
|
||||
required this.values});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Row(
|
||||
children: [
|
||||
SizedBox(
|
||||
height: 30,
|
||||
child: Material(
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadiusDirectional.only(
|
||||
topStart: Radius.circular(8),
|
||||
bottomStart: Radius.circular(8),
|
||||
),
|
||||
),
|
||||
// color: Color(0xFF359846),
|
||||
color: CustomColors.lightGreyColor,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 4.0, bottom: 4, right: 8, left: 8),
|
||||
child: Text(
|
||||
TranslationBase.of(context).getValue(title),
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(color: Colors.black, fontSize: 12),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Material(
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadiusDirectional.only(
|
||||
topEnd: Radius.circular(8),
|
||||
bottomEnd: Radius.circular(8),
|
||||
),
|
||||
),
|
||||
// color: Color(0xFF359846),
|
||||
color: getColor(title),
|
||||
child: SizedBox(
|
||||
height: 30,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Row(
|
||||
children: List.generate(
|
||||
values.length,
|
||||
(index) => Row(
|
||||
children: [
|
||||
Text(
|
||||
values[index],
|
||||
textAlign: TextAlign.center,
|
||||
style:
|
||||
TextStyle(color: Colors.white, fontSize: 12),
|
||||
),
|
||||
SizedBox(
|
||||
width: 8,
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
)),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
getColor(title) {
|
||||
switch (title) {
|
||||
case "excellent":
|
||||
return Color(0xFF275b45);
|
||||
case "good":
|
||||
return Color(0xFF507a3d);
|
||||
case "poor":
|
||||
return Color(0xFFa86452);
|
||||
case "atRisk":
|
||||
return Color(0xFFa2494b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Status extends StatelessWidget {
|
||||
final String status;
|
||||
final String originalData;
|
||||
|
||||
const Status({super.key, required this.status, required this.originalData});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Material(
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(3),
|
||||
),
|
||||
// color: Color(0xFF359846),
|
||||
color: (originalData.toLowerCase() == 'good' ||
|
||||
originalData.toLowerCase() == 'excellent' ||
|
||||
originalData.toLowerCase() == 'normal')
|
||||
? Color(0xFFD8E8DB)
|
||||
: (originalData.toLowerCase() == 'poor' ||
|
||||
originalData.toLowerCase() == 'low')
|
||||
? Color(0xFFD3D37E)
|
||||
: Color(0x98d02127),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6),
|
||||
child: Text(status,
|
||||
style: TextStyle(
|
||||
color: (originalData.toLowerCase() == 'good' ||
|
||||
originalData.toLowerCase() == 'excellent' ||
|
||||
originalData.toLowerCase() == 'normal')
|
||||
? Color(0xFF359846)
|
||||
: (originalData.toLowerCase() == 'poor' ||
|
||||
originalData.toLowerCase() == 'low')
|
||||
? Colors.white
|
||||
: Colors.white,
|
||||
fontSize: 8,
|
||||
fontWeight: FontWeight.w600,
|
||||
)),
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,550 @@
|
||||
var vital = {
|
||||
"HR": {
|
||||
"unit": "bpm",
|
||||
"values": [
|
||||
{
|
||||
"min": 0,
|
||||
"max": 60,
|
||||
"interpretation": "atRisk",
|
||||
"quantitativeInterpretation": "low",
|
||||
"title": "< 60"
|
||||
},
|
||||
{
|
||||
"min": 80,
|
||||
"max": 100,
|
||||
"interpretation": "poor",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "80-100"
|
||||
},
|
||||
{
|
||||
"min": 60,
|
||||
"max": 80,
|
||||
"interpretation": "excellent",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "60-80"
|
||||
},
|
||||
{
|
||||
"min": 100,
|
||||
"max": 0,
|
||||
"interpretation": "atRisk",
|
||||
"quantitativeInterpretation": "high",
|
||||
"title": "≥ 100"
|
||||
},
|
||||
|
||||
]
|
||||
},"hrvv": {
|
||||
"unit": "ms",
|
||||
"values":[
|
||||
{
|
||||
"min": 0,
|
||||
"max": 10.8,
|
||||
"interpretation": "atRisk",
|
||||
"quantitativeInterpretation": "low",
|
||||
"title": "< 10.8"
|
||||
},
|
||||
{
|
||||
"min": 10.8,
|
||||
"max": 35.0,
|
||||
"interpretation": "poor",
|
||||
"quantitativeInterpretation": "low",
|
||||
"title": "10.8-16.4"
|
||||
},
|
||||
{
|
||||
"min": 35.0,
|
||||
"max": 51.5,
|
||||
"interpretation": "good",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "35.0-51.5"
|
||||
},
|
||||
{
|
||||
"min": 51.5,
|
||||
"max": 0,
|
||||
"interpretation": "excellent",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "≥ 51.5"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Sp02": {
|
||||
"unit": "%",
|
||||
"values": [
|
||||
{
|
||||
"min": 0,
|
||||
"max": 90,
|
||||
"interpretation": "atRisk",
|
||||
"quantitativeInterpretation": "low",
|
||||
"title": "≥ 90"
|
||||
},
|
||||
{
|
||||
"min": 90,
|
||||
"max": 95,
|
||||
"interpretation": "poor",
|
||||
"quantitativeInterpretation": "possiblyLow",
|
||||
"title": "90-95"
|
||||
},
|
||||
{
|
||||
"min": 95,
|
||||
"max": 97,
|
||||
"interpretation": "good",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "95-97"
|
||||
},
|
||||
{
|
||||
"min": 97,
|
||||
"max": 100,
|
||||
"interpretation": "excellent",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"isMaxIncluded": true,
|
||||
"title": "97-100"
|
||||
}
|
||||
]
|
||||
},
|
||||
"blood_pressure": {
|
||||
"unit": "mmHg",
|
||||
"values": [
|
||||
{
|
||||
"systolic-lng": {
|
||||
"min": 0,
|
||||
"max": 90,
|
||||
"interpretation": "atRisk",
|
||||
"quantitativeInterpretation": "low",
|
||||
"title": "0-90",
|
||||
"heading": "systolic-lng"
|
||||
},
|
||||
"diastolic-lng": {
|
||||
"min": 0,
|
||||
"max": 60,
|
||||
"interpretation": "atRisk",
|
||||
"quantitativeInterpretation": "low",
|
||||
"title": "0-60",
|
||||
"heading": "diastolic-lng"
|
||||
}
|
||||
},
|
||||
{
|
||||
"systolic-lng": {
|
||||
"min": 90,
|
||||
"max": 120,
|
||||
"interpretation": "excellent",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "90-120",
|
||||
"heading": "systolic-lng"
|
||||
},
|
||||
"diastolic-lng": {
|
||||
"min": 60,
|
||||
"max": 70,
|
||||
"interpretation": "excellent",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "60-70",
|
||||
"heading": "diastolic-lng"
|
||||
}
|
||||
},
|
||||
{
|
||||
"systolic-lng": {
|
||||
"min": 120,
|
||||
"max": 130,
|
||||
"interpretation": "good",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "120-130",
|
||||
"heading": "systolic-lng"
|
||||
},
|
||||
"diastolic-lng": {
|
||||
"min": 70,
|
||||
"max": 80,
|
||||
"interpretation": "good",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "70-80",
|
||||
"heading": "diastolic-lng"
|
||||
}
|
||||
},
|
||||
{
|
||||
"systolic-lng": {
|
||||
"min": 130,
|
||||
"max": 140,
|
||||
"interpretation": "poor",
|
||||
"quantitativeInterpretation": "slightlyHigh",
|
||||
"title": "130-140",
|
||||
"heading": "systolic-lng"
|
||||
},
|
||||
"diastolic-lng": {
|
||||
"min": 80,
|
||||
"max": 90,
|
||||
"interpretation": "poor",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "80-90",
|
||||
"heading": "diastolic-lng"
|
||||
}
|
||||
},
|
||||
{
|
||||
"systolic-lng": {
|
||||
"min": 140,
|
||||
"max": 0,
|
||||
"interpretation": "atRisk",
|
||||
"quantitativeInterpretation": "high",
|
||||
"title": "140-200",
|
||||
"heading": "systolic-lng"
|
||||
},
|
||||
"diastolic-lng": {
|
||||
"min": 90,
|
||||
"max": 200,
|
||||
"interpretation": "atRisk",
|
||||
"quantitativeInterpretation": "high",
|
||||
"title": "≥ 90",
|
||||
"heading": "diastolic-lng"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"bmi": {
|
||||
"unit": "",
|
||||
"values": [
|
||||
{
|
||||
"min": 0,
|
||||
"max": 18.5,
|
||||
"interpretation": "poor",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "< 18.5"
|
||||
},
|
||||
{
|
||||
"min": 18.5,
|
||||
"max": 25,
|
||||
"interpretation": "excellent",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "25-30"
|
||||
},{
|
||||
"min": 25,
|
||||
"max": 30,
|
||||
"interpretation": "poor",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "25-30"
|
||||
},
|
||||
{
|
||||
"min": 30,
|
||||
"max": 40,
|
||||
"interpretation": "atRisk",
|
||||
"quantitativeInterpretation": "high",
|
||||
"title": "30-40"
|
||||
},
|
||||
{
|
||||
"min": 40,
|
||||
"max": 0,
|
||||
"interpretation": "atRisk",
|
||||
"quantitativeInterpretation": "high",
|
||||
"title": "≥40"
|
||||
},
|
||||
]
|
||||
},
|
||||
"respiratoryRate": {
|
||||
"unit": "bpm",
|
||||
"values": [
|
||||
{
|
||||
"min": 0,
|
||||
"max": 12,
|
||||
"interpretation": "poor",
|
||||
"quantitativeInterpretation": "low",
|
||||
"title": "< 12"
|
||||
},
|
||||
{
|
||||
"min": 12,
|
||||
"max": 20,
|
||||
"interpretation": "excellent",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "25-30"
|
||||
},
|
||||
{
|
||||
"min": 20,
|
||||
"max": 0,
|
||||
"interpretation": "poor",
|
||||
"quantitativeInterpretation": "high",
|
||||
"title": "≥ 20"
|
||||
},
|
||||
]
|
||||
},
|
||||
"cvd": {
|
||||
"unit": "%",
|
||||
"values": [
|
||||
{
|
||||
"min": 0,
|
||||
"max": 1,
|
||||
"interpretation": "excellent",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "< 1"
|
||||
},
|
||||
{
|
||||
"min": 1,
|
||||
"max": 10,
|
||||
"interpretation": "Average",
|
||||
"quantitativeInterpretation": "slightlyHigh",
|
||||
"title": "1-10"
|
||||
},
|
||||
{
|
||||
"min": 10,
|
||||
"max": 20,
|
||||
"interpretation": "poor",
|
||||
"quantitativeInterpretation": "moderatelyHigh",
|
||||
"title": "10-20"
|
||||
},
|
||||
{
|
||||
"min": 20,
|
||||
"max": 0,
|
||||
"interpretation": "atRisk",
|
||||
"quantitativeInterpretation": " high",
|
||||
"title": "≥ 20"
|
||||
},
|
||||
]
|
||||
},
|
||||
"generalWellness": {
|
||||
"unit": "",
|
||||
"values": [
|
||||
{
|
||||
"min": 0,
|
||||
"max": 40,
|
||||
"interpretation": "poor",
|
||||
"quantitativeInterpretation": "low",
|
||||
"title": "< 40"
|
||||
},
|
||||
{
|
||||
"min": 40,
|
||||
"max": 80,
|
||||
"interpretation": "good",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "40-80"
|
||||
},
|
||||
{
|
||||
"min": 80,
|
||||
"max": 100,
|
||||
"interpretation": "excellent",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "80-100",
|
||||
"isMaxIncluded": true
|
||||
},
|
||||
]
|
||||
},
|
||||
"stressLevel": {
|
||||
"unit": "",
|
||||
"values": [
|
||||
{
|
||||
"min": 0,
|
||||
"max": 2,
|
||||
"interpretation": "excellent",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "0-2"
|
||||
},
|
||||
{
|
||||
"min": 2,
|
||||
"max": 3,
|
||||
"interpretation": "good",
|
||||
"quantitativeInterpretation": "normal",
|
||||
"title": "2-3"
|
||||
},
|
||||
{
|
||||
"min": 3,
|
||||
"max": 0,
|
||||
"interpretation": "poor",
|
||||
"quantitativeInterpretation": "high",
|
||||
"title": "80-100",
|
||||
},
|
||||
]
|
||||
},
|
||||
};
|
||||
|
||||
var vitalValues = {
|
||||
"HR": {
|
||||
"excellent": ["60-80"],
|
||||
"poor": ["80-100"],
|
||||
"atRisk": ["< 60", "≥ 100"]
|
||||
},
|
||||
"hrvv": {
|
||||
"excellent": ["≥ 51.5"],
|
||||
"good": ["35.0-51.5"],
|
||||
"poor": ["10.8-16.4"],
|
||||
"atRisk": ["< 10.8"]
|
||||
},
|
||||
"Sp02": {
|
||||
"excellent": ["97-100"],
|
||||
"good": ["95-97"],
|
||||
"poor": ["90-95"],
|
||||
"atRisk": ["≥ 90"]
|
||||
},
|
||||
"blood_pressure": {
|
||||
"systolic-lng": {
|
||||
"excellent": ["90-120"],
|
||||
"good": ["120-130"],
|
||||
"poor": ["130-140"],
|
||||
"atRisk": ["0-90", "140-200"]
|
||||
},
|
||||
"diastolic-lng": {
|
||||
"excellent": ["60-70"],
|
||||
"good": ["70-80"],
|
||||
"poor": ["80-90"],
|
||||
"atRisk": ["0-60", "≥ 90"]
|
||||
}
|
||||
},
|
||||
// "bmi": {
|
||||
// "unit": "",
|
||||
// "values": [
|
||||
// {
|
||||
// "min": 0,
|
||||
// "max": 18.5,
|
||||
// "interpretation": "poor",
|
||||
// "quantitativeInterpretation": "normal",
|
||||
// "title": "< 18.5"
|
||||
// },
|
||||
// {
|
||||
// "min": 18.5,
|
||||
// "max": 25,
|
||||
// "interpretation": "excellent",
|
||||
// "quantitativeInterpretation": "normal",
|
||||
// "title": "25-30"
|
||||
// },{
|
||||
// "min": 25,
|
||||
// "max": 30,
|
||||
// "interpretation": "poor",
|
||||
// "quantitativeInterpretation": "normal",
|
||||
// "title": "25-30"
|
||||
// },
|
||||
// {
|
||||
// "min": 30,
|
||||
// "max": 40,
|
||||
// "interpretation": "atRisk",
|
||||
// "quantitativeInterpretation": "high",
|
||||
// "title": "30-40"
|
||||
// },
|
||||
// {
|
||||
// "min": 40,
|
||||
// "max": 0,
|
||||
// "interpretation": "atRisk",
|
||||
// "quantitativeInterpretation": "high",
|
||||
// "title": "≥40"
|
||||
// },
|
||||
// ]
|
||||
"bmi": {
|
||||
"excellent": ["18.5-25"],
|
||||
"poor": ["< 18.5", "25-30"],
|
||||
"atRisk": ["30-40", "≥40"],
|
||||
},
|
||||
"respiratoryRate": {
|
||||
"excellent": ["25-30"],
|
||||
"poor": ["< 12", "≥ 20"]
|
||||
},
|
||||
"cvd": {
|
||||
"excellent": ["< 1"],
|
||||
"Average": ["1-10"],
|
||||
"poor": ["10-20"],
|
||||
"atRisk": ["≥ 20"]
|
||||
},
|
||||
"generalWellness": {
|
||||
"excellent": ["80-100"],
|
||||
"good": ["40-80"],
|
||||
"poor": ["< 40"]
|
||||
},
|
||||
"stressLevel": {
|
||||
"excellent": ["0-2"],
|
||||
"good": ["2-3"],
|
||||
"poor": ["80-100"]
|
||||
}
|
||||
};
|
||||
|
||||
class RangeConditionWithTitle {
|
||||
String? unit;
|
||||
List<RangeCondition>? condition;
|
||||
|
||||
RangeCondition? current;
|
||||
RangeConditionWithTitle({this.unit, this.condition});
|
||||
|
||||
RangeConditionWithTitle.fromJson(Map<String, dynamic> json, String formatValueToTwoDp) {
|
||||
this.unit = json['unit'];
|
||||
var conditions = json['values'] as List?;
|
||||
this.condition =
|
||||
conditions?.map((item) => RangeCondition.fromJson(item,formatValueToTwoDp)).toList();
|
||||
print("the value is $formatValueToTwoDp");
|
||||
current = condition?.where((element)=>element.isSelected == true).first;
|
||||
}
|
||||
}
|
||||
|
||||
class RangeConditionForBloodPressure {
|
||||
String? unit;
|
||||
List<BloodPressure>? condition;
|
||||
|
||||
BloodPressure? systolic;
|
||||
BloodPressure? diastolic;
|
||||
|
||||
RangeCondition? getValue(String key) {
|
||||
switch (key) {
|
||||
case 'systolic-lng':
|
||||
return systolic?.systolic;
|
||||
|
||||
case 'diastolic-lng':
|
||||
return diastolic?.diastolic;
|
||||
}
|
||||
}
|
||||
|
||||
RangeConditionForBloodPressure({this.unit, this.condition});
|
||||
|
||||
RangeConditionForBloodPressure.fromJson(
|
||||
Map<String, dynamic> json, String formatValueToTwoDp) {
|
||||
this.unit = json['unit'];
|
||||
var conditions = json['values'] as List?;
|
||||
this.condition = conditions
|
||||
?.map((item) => BloodPressure.fromJson(item, formatValueToTwoDp))
|
||||
.toList();
|
||||
print("the value is $formatValueToTwoDp");
|
||||
systolic = condition
|
||||
?.where((element) => element.systolic?.isSelected == true)
|
||||
.first;
|
||||
diastolic = condition
|
||||
?.where((element) => element.diastolic?.isSelected == true)
|
||||
.first;
|
||||
}
|
||||
}
|
||||
|
||||
class BloodPressure {
|
||||
RangeCondition? systolic;
|
||||
RangeCondition? diastolic;
|
||||
|
||||
BloodPressure.fromJson(Map<String, dynamic> json, String selectedValue) {
|
||||
systolic = RangeCondition.fromJson(
|
||||
json['systolic-lng'], selectedValue.split("/")[0]);
|
||||
diastolic = RangeCondition.fromJson(
|
||||
json['diastolic-lng'], selectedValue.split("/")[1]);
|
||||
}
|
||||
}
|
||||
|
||||
class RangeCondition {
|
||||
String? heading;
|
||||
double? min;
|
||||
double? max;
|
||||
bool? isMaxIncluded;
|
||||
String? interpretation;
|
||||
String? quantitativeInterpretation;
|
||||
String? title;
|
||||
bool? isSelected;
|
||||
|
||||
RangeCondition(this.min, this.max, this.interpretation,
|
||||
this.quantitativeInterpretation, this.isMaxIncluded);
|
||||
|
||||
RangeCondition.fromJson(Map<String, dynamic> json, String selectedValue) {
|
||||
min = json['min'].toDouble();
|
||||
max = json['max'].toDouble();
|
||||
interpretation = json['interpretation'];
|
||||
quantitativeInterpretation = json['quantitativeInterpretation'];
|
||||
isMaxIncluded = json['isMaxIncluded'];
|
||||
title = json['title'];
|
||||
isSelected = isInRange(selectedValue);
|
||||
heading = json['heading'];
|
||||
}
|
||||
|
||||
bool isInRange(String data) {
|
||||
|
||||
double value = 0.0;
|
||||
if(data.contains('/')){
|
||||
value = double.parse(data.split("/")[0])/double.parse(data.split("/")[1]);
|
||||
print("the blood pressure is ${value}");
|
||||
}else{
|
||||
value = double.parse(data);
|
||||
}
|
||||
if (max == 0 && min != 0) return value >= min!;
|
||||
if (min == 0 && max != 0) return value < max!;
|
||||
if (isMaxIncluded == true) return value >= min! && value <= max!;
|
||||
return value >= min! && value < max!;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,332 @@
|
||||
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||
import 'package:diplomaticquarterapp/vital_signs/data/vitals_benchmark.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:vital_sign_camera/vital_sign_camera.dart';
|
||||
|
||||
import 'components/vital_sign_widget.dart';
|
||||
|
||||
class ResultScreen extends StatelessWidget {
|
||||
final Health? healthResult;
|
||||
|
||||
late final VitalSign? _vitalSign;
|
||||
late final HolisticAnalysis? _holisticAnalysis;
|
||||
late final CardiovascularRisks? _cardiovascularRisks;
|
||||
late final CovidRisk? _covidRisk;
|
||||
late final ScanParameters? _scanParameters;
|
||||
|
||||
ResultScreen({
|
||||
Key? key,
|
||||
required this.healthResult,
|
||||
}) : super(key: key) {
|
||||
_vitalSign = healthResult?.vitalSigns;
|
||||
_holisticAnalysis = healthResult?.holisticHealth;
|
||||
_cardiovascularRisks = healthResult?.risks?.cardiovascularRisks;
|
||||
_covidRisk = healthResult?.risks?.covidRisk;
|
||||
_scanParameters = healthResult?.scanParameters;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final deviceSize = MediaQuery.of(context).size;
|
||||
const textColor = Color.fromARGB(255, 0, 0, 0);
|
||||
|
||||
print('the age is ${healthResult?.vitalSigns?.facialSkinAge}');
|
||||
return AppScaffold(
|
||||
isShowAppBar: true,
|
||||
appBarTitle: TranslationBase.of(context).result,
|
||||
showNewAppBar: true,
|
||||
showNewAppBarTitle: true,
|
||||
overrideUserLogin: true,
|
||||
backgroundColor: Color(0xffF8F8F8),
|
||||
body: Padding(
|
||||
padding: const EdgeInsets.all(15),
|
||||
child: ListView(
|
||||
shrinkWrap: true,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (_holisticAnalysis != null &&
|
||||
_holisticAnalysis?.generalWellness != null)
|
||||
VitalSignWidget(
|
||||
textColor: textColor,
|
||||
lookupValues: vitalValues['generalWellness']!,
|
||||
vitalSignName:
|
||||
TranslationBase.of(context).generalWellness,
|
||||
condition: RangeConditionWithTitle.fromJson(
|
||||
vital['generalWellness']!,
|
||||
formatValueToTwoDp(
|
||||
healthResult?.holisticHealth?.generalWellness)),
|
||||
vitalSignValue: formatValueToTwoDp(
|
||||
healthResult?.holisticHealth?.generalWellness),
|
||||
vectorUrl: 'assets/images/svg/wellness.svg',
|
||||
),//wellness
|
||||
if (_vitalSign?.stress != null)
|
||||
VitalSignWidget(
|
||||
textColor: textColor,
|
||||
vitalSignName: TranslationBase.of(context).stress,
|
||||
condition: RangeConditionWithTitle.fromJson(
|
||||
vital['stressLevel']!,
|
||||
formatValueToTwoDp(
|
||||
healthResult?.vitalSigns.stress)),
|
||||
lookupValues: vitalValues['stressLevel']!,
|
||||
vitalSignValue:
|
||||
formatValueToTwoDp(healthResult?.vitalSigns.stress),
|
||||
vectorUrl: 'assets/images/svg/stress.svg',
|
||||
),
|
||||
VitalSignWidget(
|
||||
textColor: textColor,
|
||||
vitalSignName: TranslationBase.of(context).pulseTitle,
|
||||
condition: RangeConditionWithTitle.fromJson(
|
||||
vital['HR']!,
|
||||
formatValueToTwoDp(
|
||||
healthResult?.vitalSigns.heartRate)),
|
||||
lookupValues: vitalValues['HR']!,
|
||||
vitalSignValue: formatValueToTwoDp(
|
||||
healthResult?.vitalSigns.heartRate),
|
||||
vectorUrl: 'assets/images/svg/heartrate.svg',
|
||||
),
|
||||
//heart rate
|
||||
if (_vitalSign?.bloodPressure != null)
|
||||
VitalSignWidget(
|
||||
textColor: textColor,
|
||||
vitalSignName: "Blood Pressure",
|
||||
condition: RangeConditionForBloodPressure.fromJson(
|
||||
vital['blood_pressure']!,
|
||||
healthResult?.vitalSigns.bloodPressure ?? ""),
|
||||
bloodPressureValues: vitalValues['blood_pressure']!,
|
||||
vitalSignValue:
|
||||
healthResult?.vitalSigns.bloodPressure ?? "",
|
||||
vectorUrl: 'assets/images/svg/bloodpressure.svg',
|
||||
),
|
||||
if (_vitalSign?.hrvSdnn != null)
|
||||
VitalSignWidget(
|
||||
vectorUrl: 'assets/images/svg/heartrate.svg',
|
||||
textColor: textColor,
|
||||
vitalSignName: "HRV SDNN",
|
||||
lookupValues: vitalValues['hrvv']!,
|
||||
condition: RangeConditionWithTitle.fromJson(
|
||||
vital['hrvv']!,
|
||||
formatValueToTwoDp(
|
||||
healthResult?.vitalSigns.hrvSdnn)),
|
||||
vitalSignValue: formatValueToTwoDp(
|
||||
healthResult?.vitalSigns.hrvSdnn)),
|
||||
|
||||
//oxygen
|
||||
VitalSignWidget(
|
||||
textColor: textColor,
|
||||
lookupValues: vitalValues['Sp02']!,
|
||||
vitalSignName:
|
||||
TranslationBase.of(context).oxygenSaturation,
|
||||
condition: RangeConditionWithTitle.fromJson(
|
||||
vital['Sp02']!,
|
||||
formatValueToTwoDp(healthResult?.vitalSigns.spo2)),
|
||||
vitalSignValue:
|
||||
formatValueToTwoDp(healthResult?.vitalSigns.spo2),
|
||||
vectorUrl: 'assets/images/svg/oxygen.svg',
|
||||
),
|
||||
if (_vitalSign?.respiratoryRate != null)
|
||||
VitalSignWidget(
|
||||
textColor: textColor,
|
||||
lookupValues: vitalValues['respiratoryRate']!,
|
||||
vitalSignName:
|
||||
TranslationBase.of(context).respiratoryRate,
|
||||
condition: RangeConditionWithTitle.fromJson(
|
||||
vital['respiratoryRate']!,
|
||||
formatValueToTwoDp(
|
||||
healthResult?.vitalSigns.respiratoryRate)),
|
||||
vitalSignValue: formatValueToTwoDp(
|
||||
healthResult?.vitalSigns.respiratoryRate),
|
||||
vectorUrl: 'assets/images/svg/breathing.svg',
|
||||
),
|
||||
if (_holisticAnalysis != null &&
|
||||
_holisticAnalysis?.bmi != null)
|
||||
VitalSignWidget(
|
||||
textColor: textColor,
|
||||
lookupValues: vitalValues['bmi']!,
|
||||
vitalSignName: TranslationBase.of(context).BMI,
|
||||
condition: RangeConditionWithTitle.fromJson(
|
||||
vital['bmi']!,
|
||||
formatValueToTwoDp(
|
||||
healthResult?.holisticHealth?.bmi)),
|
||||
vitalSignValue: formatValueToTwoDp(
|
||||
healthResult?.holisticHealth?.bmi),
|
||||
vectorUrl: 'assets/images/svg/bmi.svg',
|
||||
),
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "IBI",
|
||||
// condition: RangeConditionWithTitle.fromJson(vital['HR']!),
|
||||
// vitalSignValue:
|
||||
// formatValueToTwoDp(healthResult?.vitalSigns.ibi)),
|
||||
|
||||
|
||||
// if (_vitalSign?.hrvRmssd != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "HRV RMSSD",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.vitalSigns.hrvRmssd)),
|
||||
|
||||
// if (_vitalSign?.temperature != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "Temperature",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.vitalSigns.temperature)),
|
||||
|
||||
// if (_vitalSign?.bloodPressureSystolic != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "Blood Pressure Systolic",
|
||||
// vitalSignValue: formatValueToTwoDp(healthResult
|
||||
// ?.vitalSigns.bloodPressureSystolic)),
|
||||
// if (_vitalSign?.bloodPressureDiastolic != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "Blood Pressure Diastolic",
|
||||
// vitalSignValue: formatValueToTwoDp(healthResult
|
||||
// ?.vitalSigns.bloodPressureDiastolic)),
|
||||
// if (_holisticAnalysis != null)
|
||||
// Container(
|
||||
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
|
||||
// child: const Text(
|
||||
// "Holistic Analysis",
|
||||
// style: TextStyle(
|
||||
// fontSize: 15,
|
||||
// color: Colors.amber,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
|
||||
|
||||
// if (_holisticAnalysis != null &&
|
||||
// _holisticAnalysis?.absi != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "ABSI",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.holisticHealth?.absi)),
|
||||
// if (_holisticAnalysis != null &&
|
||||
// _holisticAnalysis?.cardiacWorkload != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "Cardiac Workload",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.holisticHealth?.cardiacWorkload)),
|
||||
// if (_holisticAnalysis != null &&
|
||||
// _holisticAnalysis?.pulseRespiratoryQuotient != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "Pulse Respiratory Quotient",
|
||||
// vitalSignValue: formatValueToTwoDp(healthResult
|
||||
// ?.holisticHealth?.pulseRespiratoryQuotient)),
|
||||
// if (_holisticAnalysis != null &&
|
||||
// _holisticAnalysis?.waistToHeightRatio != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "Waist to Height Ratio",
|
||||
// vitalSignValue: formatValueToTwoDp(healthResult
|
||||
// ?.holisticHealth?.waistToHeightRatio)),
|
||||
// if (_cardiovascularRisks != null)
|
||||
// Container(
|
||||
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
|
||||
// child: const Text(
|
||||
// "Cardiovascular Risks",
|
||||
// style: TextStyle(
|
||||
// fontSize: 15,
|
||||
// color: Colors.amber,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// if (_cardiovascularRisks != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: TranslationBase.of(context).cvd,
|
||||
// condition: RangeConditionWithTitle.fromJson(vital['cvd']!, formatValueToTwoDp(healthResult
|
||||
// ?.risks?.cardiovascularRisks?.generalRisk)),
|
||||
// vitalSignValue: formatValueToTwoDp(healthResult
|
||||
// ?.risks?.cardiovascularRisks?.generalRisk),
|
||||
// vectorUrl: 'assets/images/svg/heartrate.svg',),
|
||||
// if (_cardiovascularRisks != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "Congestive Heart Failure",
|
||||
// vitalSignValue: formatValueToTwoDp(healthResult
|
||||
// ?.risks
|
||||
// ?.cardiovascularRisks
|
||||
// ?.congestiveHeartFailure)),
|
||||
// if (_cardiovascularRisks != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "Coronary Heart Disease",
|
||||
// vitalSignValue: formatValueToTwoDp(healthResult
|
||||
// ?.risks
|
||||
// ?.cardiovascularRisks
|
||||
// ?.coronaryHeartDisease)),
|
||||
// if (_cardiovascularRisks != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "Intermittent Claudication",
|
||||
// vitalSignValue: formatValueToTwoDp(healthResult
|
||||
// ?.risks
|
||||
// ?.cardiovascularRisks
|
||||
// ?.intermittentClaudication)),
|
||||
// if (_cardiovascularRisks != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "Stroke",
|
||||
// vitalSignValue: formatValueToTwoDp(healthResult
|
||||
// ?.risks?.cardiovascularRisks?.stroke)),
|
||||
// if (_covidRisk != null)
|
||||
// Container(
|
||||
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
|
||||
// child: const Text(
|
||||
// "Covid Risks",
|
||||
// style: TextStyle(
|
||||
// fontSize: 15,
|
||||
// color: Colors.amber,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// if (_covidRisk != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "Risk",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.risks?.covidRisk?.covidRisk)),
|
||||
// if (_scanParameters != null)
|
||||
// Container(
|
||||
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
|
||||
// child: const Text(
|
||||
// "Scan Parameters",
|
||||
// style: TextStyle(
|
||||
// fontSize: 15,
|
||||
// color: Colors.amber,
|
||||
// fontWeight: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// if (_scanParameters != null)
|
||||
// VitalSignWidget(
|
||||
// textColor: textColor,
|
||||
// vitalSignName: "Signal Quality",
|
||||
// vitalSignValue: formatValueToTwoDp(
|
||||
// healthResult?.scanParameters?.signalQuality)),
|
||||
]),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
String formatValueToTwoDp(double? value) {
|
||||
return (value != null) ? value.toStringAsFixed(2) : "";
|
||||
}
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
TODO: Add your license here.
|
||||
@ -0,0 +1,4 @@
|
||||
include: package:flutter_lints/flutter.yaml
|
||||
|
||||
# Additional information about this file can be found at
|
||||
# https://dart.dev/guides/language/analysis-options
|
||||
@ -1,89 +1,89 @@
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
|
||||
@ -0,0 +1 @@
|
||||
rootProject.name = 'vital_sign_camera'
|
||||
@ -0,0 +1,23 @@
|
||||
package ai.panoptic.vital_sign_camera
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import io.flutter.plugin.common.BinaryMessenger
|
||||
import io.flutter.plugin.common.StandardMessageCodec
|
||||
import io.flutter.plugin.platform.PlatformView
|
||||
import io.flutter.plugin.platform.PlatformViewFactory
|
||||
|
||||
class VitalSignCameraFactory(private val messenger: BinaryMessenger, private val lifecycle: Lifecycle) :
|
||||
PlatformViewFactory(StandardMessageCodec.INSTANCE) {
|
||||
|
||||
val TAG = "VitalSignCameraFactory"
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.O)
|
||||
override fun create(context: Context, id: Int, o: Any?): PlatformView {
|
||||
val props = o as Map<String, Any>
|
||||
return FlutterVitalSignCamera(context, messenger, id, props, lifecycle)
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,38 @@
|
||||
.idea/
|
||||
.vagrant/
|
||||
.sconsign.dblite
|
||||
.svn/
|
||||
|
||||
.DS_Store
|
||||
*.swp
|
||||
profile
|
||||
|
||||
DerivedData/
|
||||
build/
|
||||
GeneratedPluginRegistrant.h
|
||||
GeneratedPluginRegistrant.m
|
||||
|
||||
.generated/
|
||||
|
||||
*.pbxuser
|
||||
*.mode1v3
|
||||
*.mode2v3
|
||||
*.perspectivev3
|
||||
|
||||
!default.pbxuser
|
||||
!default.mode1v3
|
||||
!default.mode2v3
|
||||
!default.perspectivev3
|
||||
|
||||
xcuserdata
|
||||
|
||||
*.moved-aside
|
||||
|
||||
*.pyc
|
||||
*sync/
|
||||
Icon?
|
||||
.tags*
|
||||
|
||||
/Flutter/Generated.xcconfig
|
||||
/Flutter/ephemeral/
|
||||
/Flutter/flutter_export_environment.sh
|
||||
@ -0,0 +1,289 @@
|
||||
//
|
||||
// FlutterVitalSignCamera.swift
|
||||
// vital_sign_camera
|
||||
//
|
||||
// Created by Eddie Lau on 24/1/2023.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Flutter
|
||||
import UIKit
|
||||
import PromiseKit
|
||||
import VitalSignEngineCore
|
||||
class FlutterVitalSignCamera: NSObject, FlutterPlatformView {
|
||||
|
||||
private var camera: VitalSignCamera
|
||||
private var methodChannel: FlutterMethodChannel
|
||||
private var eventSink: FlutterEventSink?
|
||||
|
||||
func view() -> UIView {
|
||||
return camera
|
||||
}
|
||||
|
||||
init(
|
||||
frame: CGRect,
|
||||
viewIdentifier viewId: Int64,
|
||||
arguments args: Any?,
|
||||
binaryMessenger messenger: FlutterBinaryMessenger
|
||||
) {
|
||||
methodChannel = FlutterMethodChannel(name: "ai.panoptic/channel/flutter_vital_sign_camera_\(viewId)", binaryMessenger: messenger)
|
||||
camera = VitalSignCamera(frame: frame)
|
||||
|
||||
super.init()
|
||||
camera.faceDetector = MLKitFaceDetector()
|
||||
camera.configure(args: args, onVideoFrameProcessed: onVideoFrameProcessed)
|
||||
methodChannel.setMethodCallHandler(onMethodCall)
|
||||
|
||||
let channel = FlutterEventChannel(name: "ai.panoptic/channel/flutter_vital_sign_camera_processed_frame_event_\(viewId)", binaryMessenger: messenger)
|
||||
channel.setStreamHandler(self)
|
||||
|
||||
}
|
||||
|
||||
func onMethodCall(call: FlutterMethodCall, result: @escaping FlutterResult) {
|
||||
switch(call.method){
|
||||
case "startScanning":
|
||||
NSLog("FlutterVitalSignCamera: startScanning")
|
||||
camera.startScanning().done {
|
||||
result(nil)
|
||||
}.catch { error in
|
||||
result(FlutterError(code: "\(error.code)", message: error.message, details: nil))
|
||||
}
|
||||
case "stopScanning":
|
||||
NSLog("FlutterVitalSignCamera: stopScanning")
|
||||
camera.stopScanning().done {
|
||||
result(nil)
|
||||
}.catch { error in
|
||||
result(FlutterError(code: "\(error.code)", message: error.message, details: nil))
|
||||
}
|
||||
case "configure":
|
||||
NSLog("FlutterVitalSignCamera: configure \(call.arguments ?? "nil")")
|
||||
camera.configure(args: call.arguments, onVideoFrameProcessed: onVideoFrameProcessed)
|
||||
default:
|
||||
result(FlutterMethodNotImplemented)
|
||||
}
|
||||
}
|
||||
|
||||
func onVideoFrameProcessed(result: ProcessResult) {
|
||||
let flutterMap = result.dictionary.flutterMap
|
||||
guard let eventSink = eventSink else {
|
||||
return
|
||||
}
|
||||
eventSink(flutterMap)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension FlutterVitalSignCamera: FlutterStreamHandler {
|
||||
|
||||
func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
|
||||
eventSink = events
|
||||
return nil
|
||||
}
|
||||
|
||||
func onCancel(withArguments arguments: Any?) -> FlutterError? {
|
||||
eventSink = nil
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
extension VitalSignCamera {
|
||||
|
||||
func configure(args:Any?, onVideoFrameProcessed:@escaping (ProcessResult)->Void) {
|
||||
if let args = args as? [String:Any] {
|
||||
configure(dict: args, onVideoFrameProcessed: onVideoFrameProcessed)
|
||||
} else {
|
||||
NSLog("Error: Invalid props: \(args ?? "nil")")
|
||||
}
|
||||
}
|
||||
|
||||
func configure(dict:Dictionary<String,Any>, onVideoFrameProcessed:@escaping (ProcessResult)->Void) {
|
||||
|
||||
var device:CameraDevice?
|
||||
if let id = dict["id"] as? String {
|
||||
device = VitalSignCamera.availableCameraDevices().first { $0.id == id }
|
||||
}
|
||||
|
||||
var isActive = false
|
||||
if let isActiveNumber = dict["isActive"] as? NSNumber {
|
||||
isActive = isActiveNumber.boolValue
|
||||
}
|
||||
|
||||
guard let userInfoDict = dict["userInfo"] as? Dictionary<String,Any>,
|
||||
let userInfo = UserInfo(flutterMap: userInfoDict) else {
|
||||
NSLog("Error: Invalid userInfo: \(dict["userInfo"] ?? "nil")")
|
||||
return
|
||||
}
|
||||
|
||||
guard let configDict = dict["config"] as? NSDictionary,
|
||||
let config = VitalSignEngineConfig(flutterMap: configDict) else {
|
||||
NSLog("Error: Invalid config: \(dict["config"] ?? "nil")")
|
||||
return
|
||||
}
|
||||
|
||||
let previewLayerGravity:PreviewLayerGravity = {
|
||||
if let previewLayerGravityNum = dict["previewLayerGravity"] as? NSNumber,
|
||||
let previewLayerGravity = PreviewLayerGravity(number: previewLayerGravityNum) {
|
||||
return previewLayerGravity
|
||||
}
|
||||
return PreviewLayerGravity.resizeAspectFill
|
||||
}()
|
||||
|
||||
configure { camera in
|
||||
camera.device = device
|
||||
camera.isActive = isActive
|
||||
camera.userInfo = userInfo
|
||||
camera.config = config
|
||||
camera.previewLayerGravity = previewLayerGravity
|
||||
camera.onVideoFrameProcessed = onVideoFrameProcessed
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension UserInfo {
|
||||
|
||||
init?(flutterMap:Dictionary<String,Any>) {
|
||||
|
||||
guard let genderObj = flutterMap["gender"] as? NSNumber else {
|
||||
NSLog("Error: Invalid gender: \(flutterMap["gender"] ?? "nil")")
|
||||
return nil
|
||||
}
|
||||
|
||||
guard let gender = Gender(rawValue: genderObj.intValue) else {
|
||||
NSLog("Error: Invalid gender: \(flutterMap["gender"] ?? "nil")")
|
||||
return nil
|
||||
}
|
||||
|
||||
guard let ageObj = flutterMap["age"] as? NSNumber else {
|
||||
NSLog("Error: Invalid age: \(flutterMap["age"] ?? "nil")")
|
||||
return nil
|
||||
}
|
||||
|
||||
let age = ageObj.doubleValue
|
||||
guard let userIdObj = flutterMap["userId"] as? NSString else {
|
||||
NSLog("Error: Invalid userId: \(flutterMap["userId"] ?? "nil")")
|
||||
return nil
|
||||
}
|
||||
|
||||
self.init(
|
||||
gender: gender,
|
||||
age: age,
|
||||
weight: (flutterMap["weight"] as? NSNumber)?.doubleValue,
|
||||
height: (flutterMap["height"] as? NSNumber)?.doubleValue,
|
||||
smoking: (flutterMap["smoker"] as? NSNumber)?.boolValue,
|
||||
hypertension: Hypertension(hasHypertension: (flutterMap["hypertension"] as? NSNumber)?.boolValue),
|
||||
bpMedication: (flutterMap["bpMedication"] as? NSNumber)?.boolValue,
|
||||
diabetic: Diabetic(hasDiabetic: (flutterMap["diabetic"] as? NSNumber)?.boolValue),
|
||||
waistCircumference: (flutterMap["waistCircumference"] as? NSNumber)?.doubleValue,
|
||||
appUserId: flutterMap["appUserId"] as? String,
|
||||
userId: userIdObj as String
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension Diabetic {
|
||||
init?(hasDiabetic:Bool?) {
|
||||
guard let hasDiabetic = hasDiabetic else {
|
||||
return nil
|
||||
}
|
||||
if (hasDiabetic) {
|
||||
self = .type1
|
||||
} else {
|
||||
self = .no
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension Hypertension {
|
||||
init?(hasHypertension:Bool?) {
|
||||
guard let hasHypertension = hasHypertension else {
|
||||
return nil
|
||||
}
|
||||
if (hasHypertension) {
|
||||
self = .stage1
|
||||
} else {
|
||||
self = .no
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension VitalSignEngineConfig {
|
||||
|
||||
init?(flutterMap: NSDictionary) {
|
||||
|
||||
/*
|
||||
public var errorExpirationTime: TimeInterval?
|
||||
|
||||
*/
|
||||
|
||||
guard let map = flutterMap as? [String:Any] else {
|
||||
NSLog("Error: Invalid config: \(flutterMap)")
|
||||
return nil
|
||||
}
|
||||
|
||||
let serverIdObj = map["serverId"] as? NSNumber
|
||||
let serverId = serverIdObj != nil ? ServerId(rawValue: serverIdObj!.intValue) : nil
|
||||
let dataCollectionDuration = map["dataCollectionDuration"] as? NSNumber
|
||||
let dataSendingDuration = map["dataSendingDuration"] as? NSNumber
|
||||
let dataSendingRate = map["dataSendingRate"] as? NSNumber
|
||||
let dataWindowDuration = map["dataWindowDuration"] as? NSNumber
|
||||
let apiKey = map["apiKey"] as? NSString
|
||||
let faceLostTimeout = map["faceLostTimeout"] as? NSNumber
|
||||
let errorExpirationTime = map["errorExpirationTime"] as? NSNumber
|
||||
|
||||
self.init(
|
||||
serverId: serverId,
|
||||
dataCollectionDuration: dataCollectionDuration?.doubleValue,
|
||||
dataSendingDuration: dataSendingDuration?.doubleValue,
|
||||
dataSendingRate: dataSendingRate?.doubleValue,
|
||||
dataWindowDuration: dataWindowDuration?.doubleValue,
|
||||
apiKey: apiKey as String?,
|
||||
faceLostTimeout: faceLostTimeout?.doubleValue,
|
||||
errorExpirationTime: errorExpirationTime?.doubleValue
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension PreviewLayerGravity {
|
||||
init?(number: NSNumber) {
|
||||
if (number.intValue == 0) {
|
||||
self = .resizeAspectFill
|
||||
} else if (number.intValue == 1) {
|
||||
self = .resizeAspect
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func toFlutterValue(value:Any) -> Any {
|
||||
if let boolValue = value as? Bool {
|
||||
return NSNumber(value: boolValue)
|
||||
} else if let doubleValue = value as? Double {
|
||||
return NSNumber(value: doubleValue)
|
||||
} else if let intValue = value as? Int {
|
||||
return NSNumber(value: intValue)
|
||||
} else if let int32Value = value as? Int32 {
|
||||
return NSNumber(value: int32Value)
|
||||
} else if let stringValue = value as? String {
|
||||
return stringValue
|
||||
} else if let map = value as? [String:Any] {
|
||||
return map.flutterMap
|
||||
} else if let array = value as? [Any] {
|
||||
return array.map { toFlutterValue(value: $0) }
|
||||
} else {
|
||||
return value
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension Dictionary<String,Any> {
|
||||
var flutterMap:[String:Any] {
|
||||
var map = [String:Any]()
|
||||
keys.forEach { key in
|
||||
map[key] = toFlutterValue(value: self[key]!)
|
||||
}
|
||||
return map
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>AvailableLibraries</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>BinaryPath</key>
|
||||
<string>VitalSignEngineCore.framework/VitalSignEngineCore</string>
|
||||
<key>DebugSymbolsPath</key>
|
||||
<string>dSYMs</string>
|
||||
<key>LibraryIdentifier</key>
|
||||
<string>ios-arm64</string>
|
||||
<key>LibraryPath</key>
|
||||
<string>VitalSignEngineCore.framework</string>
|
||||
<key>SupportedArchitectures</key>
|
||||
<array>
|
||||
<string>arm64</string>
|
||||
</array>
|
||||
<key>SupportedPlatform</key>
|
||||
<string>ios</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>BinaryPath</key>
|
||||
<string>VitalSignEngineCore.framework/VitalSignEngineCore</string>
|
||||
<key>DebugSymbolsPath</key>
|
||||
<string>dSYMs</string>
|
||||
<key>LibraryIdentifier</key>
|
||||
<string>ios-x86_64-simulator</string>
|
||||
<key>LibraryPath</key>
|
||||
<string>VitalSignEngineCore.framework</string>
|
||||
<key>SupportedArchitectures</key>
|
||||
<array>
|
||||
<string>x86_64</string>
|
||||
</array>
|
||||
<key>SupportedPlatform</key>
|
||||
<string>ios</string>
|
||||
<key>SupportedPlatformVariant</key>
|
||||
<string>simulator</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>XFWK</string>
|
||||
<key>XCFrameworkFormatVersion</key>
|
||||
<string>1.0</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -0,0 +1,521 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>files</key>
|
||||
<dict>
|
||||
<key>Base.lproj/Settings.storyboardc/2rd-HR-hIS-view-RZ6-1m-lpj.nib</key>
|
||||
<data>
|
||||
DlX1ov7q5g11ecY5Aps+/droo8M=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/33y-Fu-8eO-view-QTb-QW-4kt.nib</key>
|
||||
<data>
|
||||
MQc4ycI9hcuSqtrFyBDkFp9SbdQ=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/5qf-l9-Bpt-view-lhE-xR-CfP.nib</key>
|
||||
<data>
|
||||
8UOg8TxqBGqy9eTwPLDRx+n5ROk=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/AVI-Sr-bRj-view-fsz-RU-5qo.nib</key>
|
||||
<data>
|
||||
8L7XYRvTiiuCNRy9uCevQiK+c8g=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/Info.plist</key>
|
||||
<data>
|
||||
o+0ubj7CZACC4YUDlutmD/FOssc=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/UINavigationController-siC-xZ-ohv.nib</key>
|
||||
<data>
|
||||
HbItXk+fdFNmjnnjvSNER2qNalA=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-2rd-HR-hIS.nib</key>
|
||||
<data>
|
||||
cH78RC3lRwc9lqvY6NO6dh+LDuI=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-33y-Fu-8eO.nib</key>
|
||||
<data>
|
||||
Wv0FmElDgVwxyHfQg0dVh5gOZz4=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-5qf-l9-Bpt.nib</key>
|
||||
<data>
|
||||
05hXWFPNBMFvKa/QGHHX7jeZk1k=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-AVI-Sr-bRj.nib</key>
|
||||
<data>
|
||||
IQ6Q3fPzcXh4Ac7Vh4y+m3QDdaM=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-X40-UA-27w.nib</key>
|
||||
<data>
|
||||
KFMokAoeV647g58ePqRaYhWv60k=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-lvC-jH-Oee.nib</key>
|
||||
<data>
|
||||
926RX3dTGWx7FV7VBfKdGbgntUo=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-rrE-mW-kkd.nib</key>
|
||||
<data>
|
||||
4fXkddGY7hX2bm9jUdLPg++CW08=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/X40-UA-27w-view-dHV-IZ-101.nib</key>
|
||||
<data>
|
||||
xd6IKfbmTjrgUvv8kp3L5qnralc=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/lvC-jH-Oee-view-hFr-Eu-EPX.nib</key>
|
||||
<data>
|
||||
HIJ/PFe3xcSy3UuJJ7nNI3JEUxk=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/rrE-mW-kkd-view-jSQ-O0-3rP.nib</key>
|
||||
<data>
|
||||
IWe3izwkk2psNBBJ2sowS1eXTC8=
|
||||
</data>
|
||||
<key>Base.lproj/Settings.storyboardc/vU1-Um-10o-view-kVG-Zg-msn.nib</key>
|
||||
<data>
|
||||
XNHpbWcnqGvpxMnbT7KRhBn/5P0=
|
||||
</data>
|
||||
<key>Headers/VitalSignEngineCore-Swift.h</key>
|
||||
<data>
|
||||
Cgeyaqzpktx52m7dkRc2BOpHj+M=
|
||||
</data>
|
||||
<key>Info.plist</key>
|
||||
<data>
|
||||
Wehu7kSuoAeDcfbNuPsXlFJHyKk=
|
||||
</data>
|
||||
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.abi.json</key>
|
||||
<data>
|
||||
EOEHbSNtPKXpxewOjRgS5UAeO/c=
|
||||
</data>
|
||||
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface</key>
|
||||
<data>
|
||||
7tbL4/vTEf4dq/odGgDY7QuhO7o=
|
||||
</data>
|
||||
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.swiftdoc</key>
|
||||
<data>
|
||||
1YeE1UoLmWikKYm7aJTfKyuOPss=
|
||||
</data>
|
||||
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.swiftinterface</key>
|
||||
<data>
|
||||
7tbL4/vTEf4dq/odGgDY7QuhO7o=
|
||||
</data>
|
||||
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.swiftmodule</key>
|
||||
<data>
|
||||
Hyxie32rmUNCm6rfCxmPAtzrWS4=
|
||||
</data>
|
||||
<key>Modules/module.modulemap</key>
|
||||
<data>
|
||||
H4W7X/Ori5z0/DLyBmRIHfsqoW0=
|
||||
</data>
|
||||
<key>en.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
JjW5goFEk4rLGwgbsFdIb77963c=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>en.lproj/Settings.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
ghu5nCE2WhVAqtKLmh6ZSNXGUNs=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>video_for_simulator.mov</key>
|
||||
<data>
|
||||
xGCn3pZccdHuxEpMT9Ty6IpQswY=
|
||||
</data>
|
||||
<key>zh-HK.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
vbGclobSSiQAaj11PDC+uOY/uhc=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-HK.lproj/Settings.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
/nrp+p8TQubWuI19v2cfbXG3bTQ=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-Hans.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
pa8dPk7vY6e0ezzEr4Km2znkYXo=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-Hans.lproj/Settings.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
r18wFxW+CzxwkANdgWZz/Wrsn2w=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-Hant.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
vbGclobSSiQAaj11PDC+uOY/uhc=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-Hant.lproj/Settings.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
/nrp+p8TQubWuI19v2cfbXG3bTQ=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>files2</key>
|
||||
<dict>
|
||||
<key>Base.lproj/Settings.storyboardc/2rd-HR-hIS-view-RZ6-1m-lpj.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
6UqeKX29VyBukl1h73a2B5lqSMXM7SLm27q9Epqfl0o=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/33y-Fu-8eO-view-QTb-QW-4kt.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
4WUQzfqysn2notPjP+iMtC1kGv5i1TlZxDDjMw762sc=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/5qf-l9-Bpt-view-lhE-xR-CfP.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
3tsNb1TynPV4jP8eLNY7oYUXQ8XufStmGoClUxeut+k=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/AVI-Sr-bRj-view-fsz-RU-5qo.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
rKgWJy6gY5JR2wqvGEW97XuWhWpdY18oUYtY26YnDAM=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/Info.plist</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
Lfs3i8pilnv7p97l6teqeiPulahMyvKir++zGdfNFi8=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/UINavigationController-siC-xZ-ohv.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
AeXV1+FMVpr7sjaaPIa85qZRjiLnFcu2OapvfkSbmFQ=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-2rd-HR-hIS.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
BmbkkpoOPGavqEaX2s8IRznQuJG3ZRrpToUjkf2OW2g=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-33y-Fu-8eO.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
r2L54zbeqH31x5rt/9Og/Gxrh/v5I0EQIzzgs8F5XvM=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-5qf-l9-Bpt.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
0SDimIQWuI3TVkE5SZzdcvlrWwCku/b1IyI98vZSI6I=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-AVI-Sr-bRj.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
DgMA3jMJ7qfESjpw1zSsIB/xWgn1XiBe/INXFT1IFis=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-X40-UA-27w.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
XWf9vby9yh//gBzBJxbNWPzBlxzW09djTCRmLwJdSek=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-lvC-jH-Oee.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
iWiODb3GEr4QVCx7KGeP0W4pg874oyE/BA2BeLovNAc=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/UITableViewController-rrE-mW-kkd.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
4EEDOg2plUzrQgohBWf0L9xYpKgiv6KN69VmPWnFKmQ=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/X40-UA-27w-view-dHV-IZ-101.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
ylq1U3Tmk9jt5epbca2+mjKmPhVroBEYoSVbrY0Eivo=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/lvC-jH-Oee-view-hFr-Eu-EPX.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
ZX8HTCH1jPmC0/XnzN2JgeJIt1KFIrBQZ0+nTG98d9Q=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/rrE-mW-kkd-view-jSQ-O0-3rP.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
lWMbq05IoCg8jRapjGtpO8sVO4KK7lP+ZoZ4F5zLGdA=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Base.lproj/Settings.storyboardc/vU1-Um-10o-view-kVG-Zg-msn.nib</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
D7MDZLZ3dgPYif/8jzhw/0X8xxK0zQi5BTPEcvsLbB8=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Headers/VitalSignEngineCore-Swift.h</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
D/Qqm2iuCa8pyzYDySM8sXDTEci5eFMqmAjll+u8JKk=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.abi.json</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
mNR8nzjlC5AOrKrIADM7eVAyIciXEDWgeLkIeAgXhRw=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
MvRvSG8uFeTMX7EMytrfYIsjE3Uq/ItOK4PKwV9zhOI=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.swiftdoc</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
X2642qYx/sxLipHl7q9eUkTcz0ffENvmLZYHfyfY2Do=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.swiftinterface</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
MvRvSG8uFeTMX7EMytrfYIsjE3Uq/ItOK4PKwV9zhOI=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.swiftmodule</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
JkRKqR9nqkfWCsoIpQU/cSSs0o1jo9ZpJQSzejaYOKE=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Modules/module.modulemap</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
nMoAubewPDJNJjqZL6PZBElC7M8p3Tk0uDkB8+Slh8Y=
|
||||
</data>
|
||||
</dict>
|
||||
<key>en.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
QrXMgghjBTXRSvFMUnrNKKviu2bVwCvCIw6x/0NxJ+4=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>en.lproj/Settings.strings</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
kf4wZrE3eIFcKMHGteXjvdaAjVq66HQb3TOI/5X4fuc=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>video_for_simulator.mov</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
TutAEU/GGl/BP67ffkZKsoWD1iC/xCkbElVgv+BGyZU=
|
||||
</data>
|
||||
</dict>
|
||||
<key>zh-HK.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
DcL8ikA0bN+9lI7/salx04eGeosijL5biwSBVr+8H78=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-HK.lproj/Settings.strings</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
56y8muLdb8wQl7DMNwERIWBwLRpsbWoC1xgk3NPufEo=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-Hans.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
TKPfabZnaOrV3VA1XqjR6SqsWZvTcMUyUzZBQ6goBb8=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-Hans.lproj/Settings.strings</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
0A5Y7ZjUhASI3ZW0gLqoZNubDsKQNcbexBJcHOsC/FQ=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-Hant.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
DcL8ikA0bN+9lI7/salx04eGeosijL5biwSBVr+8H78=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>zh-Hant.lproj/Settings.strings</key>
|
||||
<dict>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
56y8muLdb8wQl7DMNwERIWBwLRpsbWoC1xgk3NPufEo=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>rules</key>
|
||||
<dict>
|
||||
<key>^.*</key>
|
||||
<true/>
|
||||
<key>^.*\.lproj/</key>
|
||||
<dict>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1000</real>
|
||||
</dict>
|
||||
<key>^.*\.lproj/locversion.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1100</real>
|
||||
</dict>
|
||||
<key>^Base\.lproj/</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>1010</real>
|
||||
</dict>
|
||||
<key>^version.plist$</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>rules2</key>
|
||||
<dict>
|
||||
<key>.*\.dSYM($|/)</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>11</real>
|
||||
</dict>
|
||||
<key>^(.*/)?\.DS_Store$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>2000</real>
|
||||
</dict>
|
||||
<key>^.*</key>
|
||||
<true/>
|
||||
<key>^.*\.lproj/</key>
|
||||
<dict>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1000</real>
|
||||
</dict>
|
||||
<key>^.*\.lproj/locversion.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1100</real>
|
||||
</dict>
|
||||
<key>^Base\.lproj/</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>1010</real>
|
||||
</dict>
|
||||
<key>^Info\.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^PkgInfo$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^embedded\.provisionprofile$</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^version\.plist$</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.apple.xcode.dsym.ai.panoptic.VitalSignObjCFramework</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>dSYM</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -0,0 +1,86 @@
|
||||
---
|
||||
triple: 'arm64-apple-darwin'
|
||||
binary-path: '/Users/eddie/Library/Developer/Xcode/DerivedData/VitalSignEngine-fpcalwthewvozcfkzzhwpfgjeekq/Build/Intermediates.noindex/ArchiveIntermediates/VitalSignObjCFramework/InstallationBuildProductsLocation/Library/Frameworks/VitalSignObjCFramework.framework/VitalSignObjCFramework'
|
||||
relocations:
|
||||
- { offsetInCU: 0x33, offset: 0x33, size: 0x8, addend: 0x0, symName: _VitalSignObjCFrameworkVersionString, symObjAddr: 0x0, symBinAddr: 0x129D0, symSize: 0x0 }
|
||||
- { offsetInCU: 0x67, offset: 0x67, size: 0x8, addend: 0x0, symName: _VitalSignObjCFrameworkVersionNumber, symObjAddr: 0x40, symBinAddr: 0x12A10, symSize: 0x0 }
|
||||
- { offsetInCU: 0x183D9, offset: 0x18455, size: 0x8, addend: 0x0, symName: '-[SkinDetector initWithStrength:]', symObjAddr: 0x0, symBinAddr: 0x8000, symSize: 0xA8 }
|
||||
- { offsetInCU: 0x18420, offset: 0x1849C, size: 0x8, addend: 0x0, symName: '-[SkinDetector reset]', symObjAddr: 0xA8, symBinAddr: 0x80A8, symSize: 0x8 }
|
||||
- { offsetInCU: 0x18453, offset: 0x184CF, size: 0x8, addend: 0x0, symName: '-[SkinDetector thresholdComputed]', symObjAddr: 0xB0, symBinAddr: 0x80B0, symSize: 0x20 }
|
||||
- { offsetInCU: 0x185D9, offset: 0x18655, size: 0x8, addend: 0x0, symName: '-[SkinDetector computeThreshold:fast:rough:]', symObjAddr: 0xD0, symBinAddr: 0x80D0, symSize: 0x12C }
|
||||
- { offsetInCU: 0x19146, offset: 0x191C2, size: 0x8, addend: 0x0, symName: __ZN2cv3MatD1Ev, symObjAddr: 0x1FC, symBinAddr: 0x81FC, symSize: 0x94 }
|
||||
- { offsetInCU: 0x191C8, offset: 0x19244, size: 0x8, addend: 0x0, symName: '-[SkinDetector getSkin:filtKernSize:error:]', symObjAddr: 0x290, symBinAddr: 0x8290, symSize: 0x2C8 }
|
||||
- { offsetInCU: 0x1957E, offset: 0x195FA, size: 0x8, addend: 0x0, symName: '-[SkinDetector strength]', symObjAddr: 0x558, symBinAddr: 0x8558, symSize: 0x8 }
|
||||
- { offsetInCU: 0x195B3, offset: 0x1962F, size: 0x8, addend: 0x0, symName: '-[SkinDetector setStrength:]', symObjAddr: 0x560, symBinAddr: 0x8560, symSize: 0x8 }
|
||||
- { offsetInCU: 0x213E, offset: 0x1B8CC, size: 0x8, addend: 0x0, symName: __ZNSt3__119piecewise_constructE, symObjAddr: 0x6654, symBinAddr: 0x12A54, symSize: 0x0 }
|
||||
- { offsetInCU: 0xD2BA, offset: 0x26A48, size: 0x8, addend: 0x0, symName: __ZNSt3__111__introsortINS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_Lb0EEEvT1_SA_T0_NS_15iterator_traitsISA_E15difference_typeEb, symObjAddr: 0x325C, symBinAddr: 0xB82C, symSize: 0x438 }
|
||||
- { offsetInCU: 0xE5FE, offset: 0x27D8C, size: 0x8, addend: 0x0, symName: __ZNSt3__126__insertion_sort_unguardedB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_SA_T0_, symObjAddr: 0x3918, symBinAddr: 0xBEE8, symSize: 0x218 }
|
||||
- { offsetInCU: 0xF5DF, offset: 0x28D6D, size: 0x8, addend: 0x0, symName: __ZNSt3__111__sift_downB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_OT0_NS_15iterator_traitsISA_E15difference_typeESA_, symObjAddr: 0x55A0, symBinAddr: 0xDB70, symSize: 0x418 }
|
||||
- { offsetInCU: 0x11158, offset: 0x2A8E6, size: 0x8, addend: 0x0, symName: __ZNSt3__117__floyd_sift_downB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EET1_SA_OT0_NS_15iterator_traitsISA_E15difference_typeE, symObjAddr: 0x5AC8, symBinAddr: 0xE098, symSize: 0x16C }
|
||||
- { offsetInCU: 0x11925, offset: 0x2B0B3, size: 0x8, addend: 0x0, symName: __ZNSt3__131__partition_with_equals_on_leftB8ue170006INS_17_ClassicAlgPolicyEPNS_6vectorIdNS_9allocatorIdEEEERPFbS5_S5_EEET0_SA_SA_T1_, symObjAddr: 0x3F9C, symBinAddr: 0xC56C, symSize: 0x4E4 }
|
||||
- { offsetInCU: 0x1433B, offset: 0x2DAC9, size: 0x8, addend: 0x0, symName: __ZNSt3__132__partition_with_equals_on_rightB8ue170006INS_17_ClassicAlgPolicyEPNS_6vectorIdNS_9allocatorIdEEEERPFbS5_S5_EEENS_4pairIT0_bEESB_SB_T1_, symObjAddr: 0x4480, symBinAddr: 0xCA50, symSize: 0x460 }
|
||||
- { offsetInCU: 0x16724, offset: 0x2FEB2, size: 0x8, addend: 0x0, symName: __ZNSt3__127__insertion_sort_incompleteB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEbT1_SA_T0_, symObjAddr: 0x48E0, symBinAddr: 0xCEB0, symSize: 0x420 }
|
||||
- { offsetInCU: 0x1B2C4, offset: 0x34A52, size: 0x8, addend: 0x0, symName: __ZNSt3__119__allocate_at_leastB8ue170006INS_9allocatorIdEEEENS_19__allocation_resultINS_16allocator_traitsIT_E7pointerEEERS5_m, symObjAddr: 0x2F70, symBinAddr: 0xB540, symSize: 0x34 }
|
||||
- { offsetInCU: 0x1B356, offset: 0x34AE4, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorINS0_IdNS_9allocatorIdEEEENS1_IS3_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS4_EE, symObjAddr: 0x2FA4, symBinAddr: 0xB574, symSize: 0x74 }
|
||||
- { offsetInCU: 0x1B399, offset: 0x34B27, size: 0x8, addend: 0x0, symName: __ZNSt3__119__allocate_at_leastB8ue170006INS_9allocatorINS_6vectorIdNS1_IdEEEEEEEENS_19__allocation_resultINS_16allocator_traitsIT_E7pointerEEERS8_m, symObjAddr: 0x302C, symBinAddr: 0xB5FC, symSize: 0x44 }
|
||||
- { offsetInCU: 0x1B441, offset: 0x34BCF, size: 0x8, addend: 0x0, symName: __ZNSt3__142__uninitialized_allocator_move_if_noexceptB8ue170006INS_9allocatorINS_6vectorIdNS1_IdEEEEEENS_16reverse_iteratorIPS4_EES8_S8_EET2_RT_T0_T1_S9_, symObjAddr: 0x3070, symBinAddr: 0xB640, symSize: 0xA8 }
|
||||
- { offsetInCU: 0x1B8CB, offset: 0x35059, size: 0x8, addend: 0x0, symName: __ZNSt3__120__throw_length_errorB8ue170006EPKc, symObjAddr: 0x2A38, symBinAddr: 0xB008, symSize: 0x50 }
|
||||
- { offsetInCU: 0x1B980, offset: 0x3510E, size: 0x8, addend: 0x0, symName: __ZNSt3__127__tree_balance_after_insertB8ue170006IPNS_16__tree_node_baseIPvEEEEvT_S5_, symObjAddr: 0x2D04, symBinAddr: 0xB2D4, symSize: 0x198 }
|
||||
- { offsetInCU: 0x1BDA3, offset: 0x35531, size: 0x8, addend: 0x0, symName: __ZNSt3__142__uninitialized_allocator_move_if_noexceptB8ue170006INS_9allocatorINS_6vectorIdNS1_IdEEEEEENS_16reverse_iteratorIPS4_EES8_S8_EET2_RT_T0_T1_S9_, symObjAddr: 0x3070, symBinAddr: 0xB640, symSize: 0xA8 }
|
||||
- { offsetInCU: 0x1C2CF, offset: 0x35A5D, size: 0x8, addend: 0x0, symName: __ZNSt3__17__sort3B8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEjT1_SA_SA_T0_, symObjAddr: 0x3B30, symBinAddr: 0xC100, symSize: 0x46C }
|
||||
- { offsetInCU: 0x1E639, offset: 0x37DC7, size: 0x8, addend: 0x0, symName: __ZNSt3__17__sort4B8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_SA_SA_SA_T0_, symObjAddr: 0x4D00, symBinAddr: 0xD2D0, symSize: 0x2C0 }
|
||||
- { offsetInCU: 0x1FBB9, offset: 0x39347, size: 0x8, addend: 0x0, symName: __ZNSt3__17__sort5B8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_SA_SA_SA_SA_T0_, symObjAddr: 0x4FC0, symBinAddr: 0xD590, symSize: 0x398 }
|
||||
- { offsetInCU: 0x21854, offset: 0x3AFE2, size: 0x8, addend: 0x0, symName: __ZNSt3__116__insertion_sortB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_SA_T0_, symObjAddr: 0x3694, symBinAddr: 0xBC64, symSize: 0x284 }
|
||||
- { offsetInCU: 0x228B8, offset: 0x3C046, size: 0x8, addend: 0x0, symName: __ZNSt3__119__partial_sort_implB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_S9_EET1_SA_SA_T2_OT0_, symObjAddr: 0x53A8, symBinAddr: 0xD978, symSize: 0x1F8 }
|
||||
- { offsetInCU: 0x23398, offset: 0x3CB26, size: 0x8, addend: 0x0, symName: __ZNSt3__110__pop_heapB8ue170006INS_17_ClassicAlgPolicyEPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_S9_RT0_NS_15iterator_traitsIS9_E15difference_typeE, symObjAddr: 0x59B8, symBinAddr: 0xDF88, symSize: 0x110 }
|
||||
- { offsetInCU: 0x23927, offset: 0x3D0B5, size: 0x8, addend: 0x0, symName: __ZNSt3__19__sift_upB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_SA_OT0_NS_15iterator_traitsISA_E15difference_typeE, symObjAddr: 0x5C34, symBinAddr: 0xE204, symSize: 0x220 }
|
||||
- { offsetInCU: 0x25026, offset: 0x3E7B4, size: 0x8, addend: 0x0, symName: __ZSt28__throw_bad_array_new_lengthB8ue170006v, symObjAddr: 0x2AAC, symBinAddr: 0xB07C, symSize: 0x28 }
|
||||
- { offsetInCU: 0x2757E, offset: 0x40D0C, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorINS0_IdNS_9allocatorIdEEEENS1_IS3_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS4_EE, symObjAddr: 0x2FA4, symBinAddr: 0xB574, symSize: 0x74 }
|
||||
- { offsetInCU: 0x297A3, offset: 0x42F31, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC2Ed, symObjAddr: 0x0, symBinAddr: 0x8670, symSize: 0x18 }
|
||||
- { offsetInCU: 0x297CF, offset: 0x42F5D, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC2Ed, symObjAddr: 0x0, symBinAddr: 0x8670, symSize: 0x18 }
|
||||
- { offsetInCU: 0x297EE, offset: 0x42F7C, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC2Ed, symObjAddr: 0x0, symBinAddr: 0x8670, symSize: 0x18 }
|
||||
- { offsetInCU: 0x2983B, offset: 0x42FC9, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC1Ed, symObjAddr: 0x18, symBinAddr: 0x8688, symSize: 0x18 }
|
||||
- { offsetInCU: 0x29877, offset: 0x43005, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC1Ed, symObjAddr: 0x18, symBinAddr: 0x8688, symSize: 0x18 }
|
||||
- { offsetInCU: 0x2989D, offset: 0x4302B, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC1Ed, symObjAddr: 0x18, symBinAddr: 0x8688, symSize: 0x18 }
|
||||
- { offsetInCU: 0x298BC, offset: 0x4304A, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC1Ed, symObjAddr: 0x18, symBinAddr: 0x8688, symSize: 0x18 }
|
||||
- { offsetInCU: 0x2B595, offset: 0x44D23, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetector17compute_thresholdERN2cv3MatEbb, symObjAddr: 0x30, symBinAddr: 0x86A0, symSize: 0x2464 }
|
||||
- { offsetInCU: 0x3528D, offset: 0x4EA1B, size: 0x8, addend: 0x0, symName: __ZNSt3__16__treeINS_12__value_typeIidEENS_19__map_value_compareIiS2_NS_4lessIiEELb1EEENS_9allocatorIS2_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSE_IJEEEEEENS_4pairINS_15__tree_iteratorIS2_PNS_11__tree_nodeIS2_PvEElEEbEERKT_DpOT0_, symObjAddr: 0x2BF0, symBinAddr: 0xB1C0, symSize: 0xC0 }
|
||||
- { offsetInCU: 0x355DF, offset: 0x4ED6D, size: 0x8, addend: 0x0, symName: __ZNSt3__16__treeINS_12__value_typeIidEENS_19__map_value_compareIiS2_NS_4lessIiEELb1EEENS_9allocatorIS2_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJOiEEENSE_IJEEEEEENS_4pairINS_15__tree_iteratorIS2_PNS_11__tree_nodeIS2_PvEElEEbEERKT_DpOT0_, symObjAddr: 0x2E9C, symBinAddr: 0xB46C, symSize: 0xC0 }
|
||||
- { offsetInCU: 0x35931, offset: 0x4F0BF, size: 0x8, addend: 0x0, symName: __ZL13vector_extendIdEvRNSt3__16vectorIT_NS0_9allocatorIS2_EEEES6_, symObjAddr: 0x2AD4, symBinAddr: 0xB0A4, symSize: 0x100 }
|
||||
- { offsetInCU: 0x35DBC, offset: 0x4F54A, size: 0x8, addend: 0x0, symName: __ZL13compare_tupleNSt3__16vectorIdNS_9allocatorIdEEEES3_, symObjAddr: 0x2BD4, symBinAddr: 0xB1A4, symSize: 0x1C }
|
||||
- { offsetInCU: 0x35DD9, offset: 0x4F567, size: 0x8, addend: 0x0, symName: __ZNSt3__114__split_bufferINS_6vectorIdNS_9allocatorIdEEEERNS2_IS4_EEED2Ev, symObjAddr: 0x3190, symBinAddr: 0xB760, symSize: 0x34 }
|
||||
- { offsetInCU: 0x35EF5, offset: 0x4F683, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorIdNS_9allocatorIdEEE16__init_with_sizeB8ue170006IPdS5_EEvT_T0_m, symObjAddr: 0x5E54, symBinAddr: 0xE424, symSize: 0x78 }
|
||||
- { offsetInCU: 0x3635B, offset: 0x4FAE9, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorINS0_IdNS_9allocatorIdEEEENS1_IS3_EEE16__destroy_vectorclB8ue170006Ev, symObjAddr: 0x5ECC, symBinAddr: 0xE49C, symSize: 0x40 }
|
||||
- { offsetInCU: 0x36449, offset: 0x4FBD7, size: 0x8, addend: 0x0, symName: __ZNSt3__16__treeINS_12__value_typeIidEENS_19__map_value_compareIiS2_NS_4lessIiEELb1EEENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE, symObjAddr: 0x5F60, symBinAddr: 0xE530, symSize: 0x40 }
|
||||
- { offsetInCU: 0x36594, offset: 0x4FD22, size: 0x8, addend: 0x0, symName: __ZNKSt3__16vectorIdNS_9allocatorIdEEE20__throw_length_errorB8ue170006Ev, symObjAddr: 0x2F5C, symBinAddr: 0xB52C, symSize: 0x14 }
|
||||
- { offsetInCU: 0x365BE, offset: 0x4FD4C, size: 0x8, addend: 0x0, symName: __ZNSt3__119__allocate_at_leastB8ue170006INS_9allocatorIdEEEENS_19__allocation_resultINS_16allocator_traitsIT_E7pointerEEERS5_m, symObjAddr: 0x2F70, symBinAddr: 0xB540, symSize: 0x34 }
|
||||
- { offsetInCU: 0x365C9, offset: 0x4FD57, size: 0x8, addend: 0x0, symName: __ZNKSt3__16vectorINS0_IdNS_9allocatorIdEEEENS1_IS3_EEE20__throw_length_errorB8ue170006Ev, symObjAddr: 0x3018, symBinAddr: 0xB5E8, symSize: 0x14 }
|
||||
- { offsetInCU: 0x365F3, offset: 0x4FD81, size: 0x8, addend: 0x0, symName: __ZNSt3__119__allocate_at_leastB8ue170006INS_9allocatorINS_6vectorIdNS1_IdEEEEEEEENS_19__allocation_resultINS_16allocator_traitsIT_E7pointerEEERS8_m, symObjAddr: 0x302C, symBinAddr: 0xB5FC, symSize: 0x44 }
|
||||
- { offsetInCU: 0x365FE, offset: 0x4FD8C, size: 0x8, addend: 0x0, symName: __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2B8ue170006ILi0EEEPKc, symObjAddr: 0x2984, symBinAddr: 0xAF54, symSize: 0xA0 }
|
||||
- { offsetInCU: 0x3699E, offset: 0x5012C, size: 0x8, addend: 0x0, symName: __ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE20__throw_length_errorB8ue170006Ev, symObjAddr: 0x2A24, symBinAddr: 0xAFF4, symSize: 0x14 }
|
||||
- { offsetInCU: 0x36A66, offset: 0x501F4, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetector8get_skinERN2cv3MatEdS3_, symObjAddr: 0x2528, symBinAddr: 0xAB04, symSize: 0x430 }
|
||||
- { offsetInCU: 0x3770C, offset: 0x50E9A, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetector5resetEv, symObjAddr: 0x2958, symBinAddr: 0xAF34, symSize: 0x8 }
|
||||
- { offsetInCU: 0x37734, offset: 0x50EC2, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetector18threshold_computedEv, symObjAddr: 0x2960, symBinAddr: 0xAF3C, symSize: 0x18 }
|
||||
- { offsetInCU: 0x37942, offset: 0x510D0, size: 0x8, addend: 0x0, symName: __ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE20__throw_length_errorB8ue170006Ev, symObjAddr: 0x2A24, symBinAddr: 0xAFF4, symSize: 0x14 }
|
||||
- { offsetInCU: 0x3796C, offset: 0x510FA, size: 0x8, addend: 0x0, symName: __ZNSt3__120__throw_length_errorB8ue170006EPKc, symObjAddr: 0x2A38, symBinAddr: 0xB008, symSize: 0x50 }
|
||||
- { offsetInCU: 0x37977, offset: 0x51105, size: 0x8, addend: 0x0, symName: __ZNSt12length_errorC1B8ue170006EPKc, symObjAddr: 0x2A88, symBinAddr: 0xB058, symSize: 0x24 }
|
||||
- { offsetInCU: 0x37A03, offset: 0x51191, size: 0x8, addend: 0x0, symName: __ZL13compare_tupleNSt3__16vectorIdNS_9allocatorIdEEEES3_, symObjAddr: 0x2BD4, symBinAddr: 0xB1A4, symSize: 0x1C }
|
||||
- { offsetInCU: 0x37A43, offset: 0x511D1, size: 0x8, addend: 0x0, symName: __ZL13compare_tupleNSt3__16vectorIdNS_9allocatorIdEEEES3_, symObjAddr: 0x2BD4, symBinAddr: 0xB1A4, symSize: 0x1C }
|
||||
- { offsetInCU: 0x37D43, offset: 0x514D1, size: 0x8, addend: 0x0, symName: __ZNSt3__16__treeINS_12__value_typeIidEENS_19__map_value_compareIiS2_NS_4lessIiEELb1EEENS_9allocatorIS2_EEE16__insert_node_atEPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERSE_SE_, symObjAddr: 0x2CB0, symBinAddr: 0xB280, symSize: 0x54 }
|
||||
- { offsetInCU: 0x38092, offset: 0x51820, size: 0x8, addend: 0x0, symName: __ZNSt3__128__exception_guard_exceptionsINS_29_AllocatorDestroyRangeReverseINS_9allocatorINS_6vectorIdNS2_IdEEEEEENS_16reverse_iteratorIPS5_EEEEED2B8ue170006Ev, symObjAddr: 0x3118, symBinAddr: 0xB6E8, symSize: 0x34 }
|
||||
- { offsetInCU: 0x380D3, offset: 0x51861, size: 0x8, addend: 0x0, symName: __ZNKSt3__129_AllocatorDestroyRangeReverseINS_9allocatorINS_6vectorIdNS1_IdEEEEEENS_16reverse_iteratorIPS4_EEEclB8ue170006Ev, symObjAddr: 0x314C, symBinAddr: 0xB71C, symSize: 0x44 }
|
||||
- { offsetInCU: 0x383CF, offset: 0x51B5D, size: 0x8, addend: 0x0, symName: __ZNSt3__114__split_bufferINS_6vectorIdNS_9allocatorIdEEEERNS2_IS4_EEE17__destruct_at_endB8ue170006EPS4_, symObjAddr: 0x31C4, symBinAddr: 0xB794, symSize: 0x58 }
|
||||
- { offsetInCU: 0x385EB, offset: 0x51D79, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorIdNS_9allocatorIdEEE11__vallocateB8ue170006Em, symObjAddr: 0x321C, symBinAddr: 0xB7EC, symSize: 0x40 }
|
||||
- { offsetInCU: 0x38659, offset: 0x51DE7, size: 0x8, addend: 0x0, symName: __ZNSt3__111__introsortINS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_Lb0EEEvT1_SA_T0_NS_15iterator_traitsISA_E15difference_typeEb, symObjAddr: 0x325C, symBinAddr: 0xB82C, symSize: 0x438 }
|
||||
- { offsetInCU: 0x38766, offset: 0x51EF4, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorIdNS_9allocatorIdEEE13__move_assignERS3_NS_17integral_constantIbLb1EEE, symObjAddr: 0x5358, symBinAddr: 0xD928, symSize: 0x50 }
|
||||
- { offsetInCU: 0x38A71, offset: 0x521FF, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorINS0_IdNS_9allocatorIdEEEENS1_IS3_EEE7__clearB8ue170006Ev, symObjAddr: 0x5F0C, symBinAddr: 0xE4DC, symSize: 0x54 }
|
||||
- { offsetInCU: 0x8C4F, offset: 0x5B144, size: 0x8, addend: 0x0, symName: __Z11quickselectPdii, symObjAddr: 0x0, symBinAddr: 0xE66C, symSize: 0x7C }
|
||||
- { offsetInCU: 0x8CF9, offset: 0x5B1EE, size: 0x8, addend: 0x0, symName: __Z9partitionPdii, symObjAddr: 0x7C, symBinAddr: 0xE6E8, symSize: 0x60 }
|
||||
- { offsetInCU: 0x8DF5, offset: 0x5B2EA, size: 0x8, addend: 0x0, symName: __Z4swapPdS_, symObjAddr: 0xDC, symBinAddr: 0xE748, symSize: 0x14 }
|
||||
- { offsetInCU: 0x910A, offset: 0x5B5FF, size: 0x8, addend: 0x0, symName: '+[CVHelper crop:withRect:]', symObjAddr: 0xF0, symBinAddr: 0xE75C, symSize: 0x2CC }
|
||||
- { offsetInCU: 0x9B19, offset: 0x5C00E, size: 0x8, addend: 0x0, symName: '+[CVHelper rgbMean:]', symObjAddr: 0x450, symBinAddr: 0xEA28, symSize: 0xA5C }
|
||||
- { offsetInCU: 0xAF51, offset: 0x5D446, size: 0x8, addend: 0x0, symName: '+[CVHelper brightness:]', symObjAddr: 0xEAC, symBinAddr: 0xF484, symSize: 0xAC0 }
|
||||
- { offsetInCU: 0xC21E, offset: 0x5E713, size: 0x8, addend: 0x0, symName: '+[CVHelper resizeToRgbUsing:of:]', symObjAddr: 0x196C, symBinAddr: 0xFF44, symSize: 0xC58 }
|
||||
- { offsetInCU: 0xD852, offset: 0x5FD47, size: 0x8, addend: 0x0, symName: '+[CVHelper resizeToYuvUsing:of:]', symObjAddr: 0x25C4, symBinAddr: 0x10B9C, symSize: 0xBD8 }
|
||||
- { offsetInCU: 0xEEF0, offset: 0x613E5, size: 0x8, addend: 0x0, symName: '+[CVHelper resizeToRgbFloatUsing:of:]', symObjAddr: 0x319C, symBinAddr: 0x11774, symSize: 0xC58 }
|
||||
...
|
||||
@ -0,0 +1,17 @@
|
||||
//
|
||||
// VitalSignObjCFramework.h
|
||||
// VitalSignObjCFramework
|
||||
//
|
||||
// Created by Eddie Lau on 8/6/2023.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
//! Project version number for VitalSignObjCFramework.
|
||||
FOUNDATION_EXPORT double VitalSignObjCFrameworkVersionNumber;
|
||||
|
||||
//! Project version string for VitalSignObjCFramework.
|
||||
FOUNDATION_EXPORT const unsigned char VitalSignObjCFrameworkVersionString[];
|
||||
|
||||
// In this header, you should import all the public headers of your framework using statements like #import <VitalSignObjCFramework/PublicHeader.h>
|
||||
|
||||
@ -0,0 +1,38 @@
|
||||
#
|
||||
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
|
||||
# Run `pod lib lint vital_sign_camera.podspec` to validate before publishing.
|
||||
#
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'vital_sign_camera'
|
||||
s.version = '0.0.1'
|
||||
s.summary = 'A new Flutter plugin project.'
|
||||
s.description = <<-DESC
|
||||
A new Flutter plugin project.
|
||||
DESC
|
||||
s.homepage = 'http://example.com'
|
||||
s.license = { :file => '../LICENSE' }
|
||||
s.author = { 'Your Company' => 'email@example.com' }
|
||||
s.source = { :path => '.' }
|
||||
s.source_files = 'Classes/**/*'
|
||||
s.dependency 'Flutter'
|
||||
s.platform = :ios, '9.0'
|
||||
|
||||
# Flutter.framework does not contain a i386 slice.
|
||||
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
|
||||
s.swift_version = '5.0'
|
||||
|
||||
s.ios.deployment_target = '12.0'
|
||||
s.dependency 'OpenCV-Dynamic-Framework', '4.3.0.1'
|
||||
s.dependency 'PromiseKit', '~> 8'
|
||||
s.dependency "GoogleMLKit/FaceDetection"
|
||||
s.dependency 'ZIPFoundation', '~> 0.9'
|
||||
|
||||
if ENV['LOCAL_CORE_DEVELOPMENT'] == '1' then
|
||||
s.pod_target_xcconfig = {
|
||||
"SWIFT_INCLUDE_PATHS" => '"${PODS_CONFIGURATION_BUILD_DIR}/VitalSignEngineCore"'
|
||||
}
|
||||
else
|
||||
s.vendored_frameworks = ['frameworks/VitalSignEngineCore.xcframework','frameworks/VitalSignObjCFramework.xcframework']
|
||||
end
|
||||
|
||||
end
|
||||
@ -0,0 +1,19 @@
|
||||
/// Represents the pixel format of a `Frame`.
|
||||
/// * `v420`: 420 YpCbCr 8 Bi-Planar Video Range
|
||||
/// * `f420`: 420 YpCbCr 8 Bi-Planar Full Range
|
||||
/// * `x420`: 420 YpCbCr 10 Bi-Planar Video Range
|
||||
enum PixelFormat { f420, v420, x420 }
|
||||
|
||||
PixelFormat pixelFormatFromString(String string) {
|
||||
switch (string) {
|
||||
case '420f':
|
||||
return PixelFormat.f420;
|
||||
case '420v':
|
||||
return PixelFormat.v420;
|
||||
case 'x420':
|
||||
return PixelFormat.x420;
|
||||
default:
|
||||
// ignore: fixme
|
||||
return PixelFormat.f420;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,138 @@
|
||||
/// The vital signs result of a scan.
|
||||
class VitalSign {
|
||||
final double heartRate;
|
||||
final double spo2;
|
||||
final double ibi;
|
||||
final double? stress;
|
||||
final double? stressScore;
|
||||
final double? respiratoryRate;
|
||||
final double? hrvSdnn;
|
||||
final double? hrvRmssd;
|
||||
final double? temperature;
|
||||
final String? bloodPressure;
|
||||
final double? bloodPressureSystolic;
|
||||
final double? bloodPressureDiastolic;
|
||||
final double? facialSkinAge;
|
||||
final double? bloodAlcohol;
|
||||
final double? bloodSugar;
|
||||
final String? version;
|
||||
|
||||
const VitalSign(
|
||||
this.heartRate,
|
||||
this.spo2,
|
||||
this.ibi,
|
||||
this.stress,
|
||||
this.stressScore,
|
||||
this.respiratoryRate,
|
||||
this.hrvSdnn,
|
||||
this.hrvRmssd,
|
||||
this.temperature,
|
||||
this.bloodPressure,
|
||||
this.bloodPressureSystolic,
|
||||
this.bloodPressureDiastolic,
|
||||
this.facialSkinAge,
|
||||
this.bloodAlcohol,
|
||||
this.bloodSugar,
|
||||
this.version);
|
||||
|
||||
factory VitalSign.fromMap(Map map) {
|
||||
return VitalSign(
|
||||
map['heartRate'],
|
||||
map['spo2'],
|
||||
map['ibi'],
|
||||
map['stress'],
|
||||
map['stressScore'],
|
||||
map['respiratoryRate'],
|
||||
map['hrvSdnn'],
|
||||
map['hrvRmssd'],
|
||||
map['temperature'],
|
||||
map['bloodPressure'],
|
||||
map['bloodPressureSystolic'],
|
||||
map['bloodPressureDiastolic'],
|
||||
map['facialSkinAge'],
|
||||
map['bloodAlcohol'],
|
||||
map['bloodSugar'],
|
||||
map['version']);
|
||||
}
|
||||
}
|
||||
|
||||
/// The cardiovascular risks result of a scan.
|
||||
class CardiovascularRisks {
|
||||
final double generalRisk;
|
||||
final double coronaryHeartDisease;
|
||||
final double congestiveHeartFailure;
|
||||
final double intermittentClaudication;
|
||||
final double stroke;
|
||||
|
||||
const CardiovascularRisks(this.generalRisk, this.coronaryHeartDisease,
|
||||
this.congestiveHeartFailure, this.intermittentClaudication, this.stroke);
|
||||
|
||||
factory CardiovascularRisks.fromMap(Map map) {
|
||||
return CardiovascularRisks(
|
||||
map['generalRisk'],
|
||||
map['coronaryHeartDisease'],
|
||||
map['congestiveHeartFailure'],
|
||||
map['intermittentClaudication'],
|
||||
map['stroke']);
|
||||
}
|
||||
}
|
||||
|
||||
/// The covid risk result of a scan.
|
||||
class CovidRisk {
|
||||
final double covidRisk;
|
||||
|
||||
const CovidRisk(this.covidRisk);
|
||||
|
||||
factory CovidRisk.fromMap(Map map) {
|
||||
return CovidRisk(map['covidRisk']);
|
||||
}
|
||||
}
|
||||
|
||||
/// The health risks result of a scan.
|
||||
class HealthRisks {
|
||||
final CardiovascularRisks? cardiovascularRisks;
|
||||
final CovidRisk? covidRisk;
|
||||
final String version;
|
||||
|
||||
const HealthRisks(this.cardiovascularRisks, this.covidRisk, this.version);
|
||||
|
||||
factory HealthRisks.fromMap(Map map) {
|
||||
return HealthRisks(
|
||||
map['cardiovascularRisks'] != null
|
||||
? CardiovascularRisks.fromMap(map['cardiovascularRisks'])
|
||||
: null,
|
||||
map['covidRisk'] != null ? CovidRisk.fromMap(map['covidRisk']) : null,
|
||||
map['version']);
|
||||
}
|
||||
}
|
||||
|
||||
/// The holistic analysis result of a scan.
|
||||
class HolisticAnalysis {
|
||||
final double? generalWellness;
|
||||
final double? bmi;
|
||||
final double? absi;
|
||||
final double? cardiacWorkload;
|
||||
final double? pulseRespiratoryQuotient;
|
||||
final double? waistToHeightRatio;
|
||||
final String? version;
|
||||
|
||||
const HolisticAnalysis(
|
||||
this.generalWellness,
|
||||
this.bmi,
|
||||
this.absi,
|
||||
this.cardiacWorkload,
|
||||
this.pulseRespiratoryQuotient,
|
||||
this.waistToHeightRatio,
|
||||
this.version);
|
||||
|
||||
factory HolisticAnalysis.fromMap(Map map) {
|
||||
return HolisticAnalysis(
|
||||
map['generalWellness'],
|
||||
map['bmi'],
|
||||
map['absi'],
|
||||
map['cardiacWorkload'],
|
||||
map['pulseRespiratoryQuotient'],
|
||||
map['waistToHeightRatio'],
|
||||
map['version']);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,42 @@
|
||||
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
|
||||
import 'camera_permission.dart';
|
||||
|
||||
import 'camera_device.dart';
|
||||
import 'vital_sign_camera_method_channel.dart';
|
||||
|
||||
abstract class VitalSignCameraPlatform extends PlatformInterface {
|
||||
/// Constructs a VitalSignCameraPlatform.
|
||||
VitalSignCameraPlatform() : super(token: _token);
|
||||
|
||||
static final Object _token = Object();
|
||||
|
||||
static VitalSignCameraPlatform _instance = MethodChannelVitalSignCamera();
|
||||
|
||||
/// The default instance of [VitalSignCameraPlatform] to use.
|
||||
///
|
||||
/// Defaults to [MethodChannelVitalSignCamera].
|
||||
static VitalSignCameraPlatform get instance => _instance;
|
||||
|
||||
/// Platform-specific implementations should set this with their own
|
||||
/// platform-specific class that extends [VitalSignCameraPlatform] when
|
||||
/// they register themselves.
|
||||
static set instance(VitalSignCameraPlatform instance) {
|
||||
PlatformInterface.verifyToken(instance, _token);
|
||||
_instance = instance;
|
||||
}
|
||||
|
||||
Future<List<CameraDevice>> availableCameraDevices() {
|
||||
throw UnimplementedError(
|
||||
'availableCameraDevices() has not been implemented.');
|
||||
}
|
||||
|
||||
Future<CameraPermissionStatus> requestCameraPermission() {
|
||||
throw UnimplementedError(
|
||||
'availableCameraDevices() has not been implemented.');
|
||||
}
|
||||
|
||||
Future<CameraPermissionStatus> getCameraPermissionStatus() {
|
||||
throw UnimplementedError(
|
||||
'getCameraPermissionStatus() has not been implemented.');
|
||||
}
|
||||
}
|
||||