Update On Thu Aug 1 20:31:18 CEST 2024
1
.github/update.log
vendored
@@ -720,3 +720,4 @@ Update On Sun Jul 28 20:32:24 CEST 2024
|
|||||||
Update On Mon Jul 29 20:33:10 CEST 2024
|
Update On Mon Jul 29 20:33:10 CEST 2024
|
||||||
Update On Tue Jul 30 20:33:50 CEST 2024
|
Update On Tue Jul 30 20:33:50 CEST 2024
|
||||||
Update On Wed Jul 31 20:30:50 CEST 2024
|
Update On Wed Jul 31 20:30:50 CEST 2024
|
||||||
|
Update On Thu Aug 1 20:31:07 CEST 2024
|
||||||
|
56
clash-nyanpasu/backend/Cargo.lock
generated
@@ -744,7 +744,7 @@ dependencies = [
|
|||||||
"bitflags 2.6.0",
|
"bitflags 2.6.0",
|
||||||
"boa_interner",
|
"boa_interner",
|
||||||
"boa_macros",
|
"boa_macros",
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"rustc-hash 2.0.0",
|
"rustc-hash 2.0.0",
|
||||||
]
|
]
|
||||||
@@ -770,7 +770,7 @@ dependencies = [
|
|||||||
"fast-float",
|
"fast-float",
|
||||||
"hashbrown 0.14.5",
|
"hashbrown 0.14.5",
|
||||||
"icu_normalizer",
|
"icu_normalizer",
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"intrusive-collections",
|
"intrusive-collections",
|
||||||
"itertools 0.13.0",
|
"itertools 0.13.0",
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
@@ -816,7 +816,7 @@ dependencies = [
|
|||||||
"boa_gc",
|
"boa_gc",
|
||||||
"boa_macros",
|
"boa_macros",
|
||||||
"hashbrown 0.14.5",
|
"hashbrown 0.14.5",
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"phf 0.11.2",
|
"phf 0.11.2",
|
||||||
"rustc-hash 2.0.0",
|
"rustc-hash 2.0.0",
|
||||||
@@ -1145,9 +1145,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.5.11"
|
version = "4.5.13"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "35723e6a11662c2afb578bcf0b88bf6ea8e21282a953428f240574fcc3a2b5b3"
|
checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap_builder",
|
"clap_builder",
|
||||||
"clap_derive",
|
"clap_derive",
|
||||||
@@ -1155,9 +1155,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_builder"
|
name = "clap_builder"
|
||||||
version = "4.5.11"
|
version = "4.5.13"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "49eb96cbfa7cfa35017b7cd548c75b14c3118c98b423041d70562665e07fb0fa"
|
checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anstream",
|
"anstream",
|
||||||
"anstyle",
|
"anstyle",
|
||||||
@@ -1167,9 +1167,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_derive"
|
name = "clap_derive"
|
||||||
version = "4.5.11"
|
version = "4.5.13"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5d029b67f89d30bbb547c89fd5161293c0aec155fc691d7924b64550662db93e"
|
checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"heck 0.5.0",
|
"heck 0.5.0",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
@@ -1219,7 +1219,7 @@ dependencies = [
|
|||||||
"hex",
|
"hex",
|
||||||
"humansize",
|
"humansize",
|
||||||
"image 0.25.2",
|
"image 0.25.2",
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"log",
|
"log",
|
||||||
"md-5",
|
"md-5",
|
||||||
"mlua",
|
"mlua",
|
||||||
@@ -1277,7 +1277,7 @@ dependencies = [
|
|||||||
"windows-sys 0.59.0",
|
"windows-sys 0.59.0",
|
||||||
"winreg 0.52.0",
|
"winreg 0.52.0",
|
||||||
"wry",
|
"wry",
|
||||||
"zip 2.1.5",
|
"zip 2.1.6",
|
||||||
"zip-extensions",
|
"zip-extensions",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -2844,7 +2844,7 @@ dependencies = [
|
|||||||
"futures-sink",
|
"futures-sink",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"http 0.2.12",
|
"http 0.2.12",
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"slab",
|
"slab",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
@@ -2863,7 +2863,7 @@ dependencies = [
|
|||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-sink",
|
"futures-sink",
|
||||||
"http 1.1.0",
|
"http 1.1.0",
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"slab",
|
"slab",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
@@ -3413,9 +3413,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "2.2.6"
|
version = "2.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
|
checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"equivalent",
|
"equivalent",
|
||||||
"hashbrown 0.14.5",
|
"hashbrown 0.14.5",
|
||||||
@@ -3891,7 +3891,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4"
|
checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"windows-targets 0.52.6",
|
"windows-targets 0.48.5",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -5062,7 +5062,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
|
checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"fixedbitset",
|
"fixedbitset",
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -5265,7 +5265,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016"
|
checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"quick-xml 0.32.0",
|
"quick-xml 0.32.0",
|
||||||
"serde",
|
"serde",
|
||||||
"time",
|
"time",
|
||||||
@@ -6220,7 +6220,7 @@ version = "1.0.121"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609"
|
checksum = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"itoa 1.0.11",
|
"itoa 1.0.11",
|
||||||
"memchr",
|
"memchr",
|
||||||
"ryu",
|
"ryu",
|
||||||
@@ -6279,7 +6279,7 @@ dependencies = [
|
|||||||
"chrono",
|
"chrono",
|
||||||
"hex",
|
"hex",
|
||||||
"indexmap 1.9.3",
|
"indexmap 1.9.3",
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
@@ -6317,7 +6317,7 @@ version = "0.9.34+deprecated"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
|
checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"itoa 1.0.11",
|
"itoa 1.0.11",
|
||||||
"ryu",
|
"ryu",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -7527,7 +7527,7 @@ version = "0.19.15"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
|
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_spanned",
|
"serde_spanned",
|
||||||
"toml_datetime",
|
"toml_datetime",
|
||||||
@@ -7540,7 +7540,7 @@ version = "0.21.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
|
checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"toml_datetime",
|
"toml_datetime",
|
||||||
"winnow 0.5.40",
|
"winnow 0.5.40",
|
||||||
]
|
]
|
||||||
@@ -7551,7 +7551,7 @@ version = "0.22.17"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8d9f8729f5aea9562aac1cc0441f5d6de3cff1ee0c5d67293eeca5eb36ee7c16"
|
checksum = "8d9f8729f5aea9562aac1cc0441f5d6de3cff1ee0c5d67293eeca5eb36ee7c16"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_spanned",
|
"serde_spanned",
|
||||||
"toml_datetime",
|
"toml_datetime",
|
||||||
@@ -9306,9 +9306,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zip"
|
name = "zip"
|
||||||
version = "2.1.5"
|
version = "2.1.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b895748a3ebcb69b9d38dcfdf21760859a4b0d0b0015277640c2ef4c69640e6f"
|
checksum = "40dd8c92efc296286ce1fbd16657c5dbefff44f1b4ca01cc5f517d8b7b3d3e2e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aes",
|
"aes",
|
||||||
"arbitrary",
|
"arbitrary",
|
||||||
@@ -9320,7 +9320,7 @@ dependencies = [
|
|||||||
"displaydoc",
|
"displaydoc",
|
||||||
"flate2",
|
"flate2",
|
||||||
"hmac",
|
"hmac",
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.3.0",
|
||||||
"lzma-rs",
|
"lzma-rs",
|
||||||
"memchr",
|
"memchr",
|
||||||
"pbkdf2",
|
"pbkdf2",
|
||||||
@@ -9339,7 +9339,7 @@ version = "0.8.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "386508a00aae1d8218b9252a41f59bba739ccee3f8e420bb90bcb1c30d960d4a"
|
checksum = "386508a00aae1d8218b9252a41f59bba739ccee3f8e420bb90bcb1c30d960d4a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"zip 2.1.5",
|
"zip 2.1.6",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@@ -10,7 +10,7 @@ pub use self::clash_strategy::{ClashStrategy, ExternalControllerPortStrategy};
|
|||||||
pub use logging::LoggingLevel;
|
pub use logging::LoggingLevel;
|
||||||
|
|
||||||
// TODO: when support sing-box, remove this struct
|
// TODO: when support sing-box, remove this struct
|
||||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
|
||||||
pub enum ClashCore {
|
pub enum ClashCore {
|
||||||
#[serde(rename = "clash", alias = "clash-premium")]
|
#[serde(rename = "clash", alias = "clash-premium")]
|
||||||
ClashPremium,
|
ClashPremium,
|
||||||
@@ -88,6 +88,15 @@ impl TryFrom<&nyanpasu_utils::core::CoreType> for ClashCore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Default)]
|
||||||
|
#[serde(rename_all = "snake_case")]
|
||||||
|
pub enum ProxiesSelectorMode {
|
||||||
|
Hidden,
|
||||||
|
#[default]
|
||||||
|
Normal,
|
||||||
|
Submenu,
|
||||||
|
}
|
||||||
|
|
||||||
/// ### `verge.yaml` schema
|
/// ### `verge.yaml` schema
|
||||||
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
|
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
|
||||||
pub struct IVerge {
|
pub struct IVerge {
|
||||||
@@ -198,7 +207,7 @@ pub struct IVerge {
|
|||||||
pub clash_strategy: Option<ClashStrategy>,
|
pub clash_strategy: Option<ClashStrategy>,
|
||||||
|
|
||||||
/// 是否启用代理托盘选择
|
/// 是否启用代理托盘选择
|
||||||
pub clash_tray_selector: Option<bool>,
|
pub clash_tray_selector: Option<ProxiesSelectorMode>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
|
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
|
||||||
@@ -292,7 +301,7 @@ impl IVerge {
|
|||||||
// auto_log_clean: Some(60 * 24 * 7), // 7 days 自动清理日记
|
// auto_log_clean: Some(60 * 24 * 7), // 7 days 自动清理日记
|
||||||
max_log_files: Some(7), // 7 days
|
max_log_files: Some(7), // 7 days
|
||||||
enable_auto_check_update: Some(true),
|
enable_auto_check_update: Some(true),
|
||||||
clash_tray_selector: Some(true),
|
clash_tray_selector: Some(ProxiesSelectorMode::default()),
|
||||||
enable_service_mode: Some(false),
|
enable_service_mode: Some(false),
|
||||||
..Self::default()
|
..Self::default()
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
config::Config,
|
config::Config,
|
||||||
enhance::ScriptType,
|
enhance::ScriptType,
|
||||||
utils::{dirs, help, tmpl},
|
utils::{dirs, help},
|
||||||
};
|
};
|
||||||
use anyhow::{bail, Context, Result};
|
use anyhow::{bail, Context, Result};
|
||||||
use reqwest::StatusCode;
|
use reqwest::StatusCode;
|
||||||
@@ -150,12 +150,12 @@ impl ProfileItem {
|
|||||||
Some(ProfileItemType::Merge) => {
|
Some(ProfileItemType::Merge) => {
|
||||||
let name = item.name.unwrap_or("Merge".into());
|
let name = item.name.unwrap_or("Merge".into());
|
||||||
let desc = item.desc.unwrap_or("".into());
|
let desc = item.desc.unwrap_or("".into());
|
||||||
ProfileItem::from_merge(name, desc)
|
ProfileItem::from_merge(name, desc, file_data)
|
||||||
}
|
}
|
||||||
Some(ProfileItemType::Script(script_type)) => {
|
Some(ProfileItemType::Script(script_type)) => {
|
||||||
let name = item.name.unwrap_or("Script".into());
|
let name = item.name.unwrap_or("Script".into());
|
||||||
let desc = item.desc.unwrap_or("".into());
|
let desc = item.desc.unwrap_or("".into());
|
||||||
ProfileItem::from_script(name, desc, script_type)
|
ProfileItem::from_script(name, desc, script_type, file_data)
|
||||||
}
|
}
|
||||||
None => bail!("could not find the item type"),
|
None => bail!("could not find the item type"),
|
||||||
}
|
}
|
||||||
@@ -178,7 +178,7 @@ impl ProfileItem {
|
|||||||
desc: Some(desc),
|
desc: Some(desc),
|
||||||
file: Some(file),
|
file: Some(file),
|
||||||
updated: Some(chrono::Local::now().timestamp() as usize),
|
updated: Some(chrono::Local::now().timestamp() as usize),
|
||||||
file_data: Some(file_data.unwrap_or(tmpl::ITEM_LOCAL.into())),
|
file_data,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -347,7 +347,11 @@ impl ProfileItem {
|
|||||||
|
|
||||||
/// ## Merge type (enhance)
|
/// ## Merge type (enhance)
|
||||||
/// create the enhanced item by using `merge` rule
|
/// create the enhanced item by using `merge` rule
|
||||||
pub fn from_merge(name: String, desc: String) -> Result<ProfileItem> {
|
pub fn from_merge(
|
||||||
|
name: String,
|
||||||
|
desc: String,
|
||||||
|
file_data: Option<String>,
|
||||||
|
) -> Result<ProfileItem> {
|
||||||
let uid = help::get_uid("m");
|
let uid = help::get_uid("m");
|
||||||
let file = format!("{uid}.yaml");
|
let file = format!("{uid}.yaml");
|
||||||
|
|
||||||
@@ -358,14 +362,19 @@ impl ProfileItem {
|
|||||||
desc: Some(desc),
|
desc: Some(desc),
|
||||||
file: Some(file),
|
file: Some(file),
|
||||||
updated: Some(chrono::Local::now().timestamp() as usize),
|
updated: Some(chrono::Local::now().timestamp() as usize),
|
||||||
file_data: Some(tmpl::ITEM_MERGE.into()),
|
file_data,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ## Script type (enhance)
|
/// ## Script type (enhance)
|
||||||
/// create the enhanced item by using javascript quick.js
|
/// create the enhanced item by using javascript quick.js
|
||||||
pub fn from_script(name: String, desc: String, script_type: ScriptType) -> Result<ProfileItem> {
|
pub fn from_script(
|
||||||
|
name: String,
|
||||||
|
desc: String,
|
||||||
|
script_type: ScriptType,
|
||||||
|
file_data: Option<String>,
|
||||||
|
) -> Result<ProfileItem> {
|
||||||
let uid = help::get_uid("s");
|
let uid = help::get_uid("s");
|
||||||
let file = match script_type {
|
let file = match script_type {
|
||||||
ScriptType::JavaScript => format!("{uid}.js"), // js ext
|
ScriptType::JavaScript => format!("{uid}.js"), // js ext
|
||||||
@@ -379,7 +388,7 @@ impl ProfileItem {
|
|||||||
desc: Some(desc),
|
desc: Some(desc),
|
||||||
file: Some(file),
|
file: Some(file),
|
||||||
updated: Some(chrono::Local::now().timestamp() as usize),
|
updated: Some(chrono::Local::now().timestamp() as usize),
|
||||||
file_data: Some(tmpl::ITEM_SCRIPT.into()),
|
file_data,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
|
use indexmap::IndexMap;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_yaml::Mapping;
|
use serde_yaml::Mapping;
|
||||||
use std::collections::HashMap;
|
|
||||||
|
|
||||||
use crate::enhance::Logs;
|
use crate::enhance::Logs;
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@ pub struct IRuntime {
|
|||||||
// 记录在配置中(包括merge和script生成的)出现过的keys
|
// 记录在配置中(包括merge和script生成的)出现过的keys
|
||||||
// 这些keys不一定都生效
|
// 这些keys不一定都生效
|
||||||
pub exists_keys: Vec<String>,
|
pub exists_keys: Vec<String>,
|
||||||
pub chain_logs: HashMap<String, Logs>,
|
pub chain_logs: IndexMap<String, Logs>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl IRuntime {
|
impl IRuntime {
|
||||||
|
@@ -103,6 +103,10 @@ pub trait Migration<'a>: DynClone {
|
|||||||
fn migrate(&self) -> std::io::Result<()> {
|
fn migrate(&self) -> std::io::Result<()> {
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn discard(&self) -> std::io::Result<()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
clone_trait_object!(Migration<'_>);
|
clone_trait_object!(Migration<'_>);
|
||||||
@@ -268,7 +272,18 @@ impl Runner<'_> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
eprintln!("Migration {} failed: {}", name, e);
|
eprintln!(
|
||||||
|
"Migration {} failed: {}; trying to discard changes",
|
||||||
|
name, e
|
||||||
|
);
|
||||||
|
match migration.discard() {
|
||||||
|
Ok(_) => {
|
||||||
|
eprintln!("Migration {} discarded.", name);
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
eprintln!("Migration {} discard failed: {}", name, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
store.set_state(Cow::Owned(name.to_string()), MigrationState::Failed);
|
store.set_state(Cow::Owned(name.to_string()), MigrationState::Failed);
|
||||||
Err(e)
|
Err(e)
|
||||||
}
|
}
|
||||||
|
@@ -1,11 +1,15 @@
|
|||||||
|
use std::borrow::Cow;
|
||||||
|
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
|
use serde_yaml::Mapping;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
config::RUNTIME_CONFIG,
|
config::RUNTIME_CONFIG,
|
||||||
core::migration::{DynMigration, Migration},
|
core::migration::{DynMigration, Migration},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub static UNITS: Lazy<Vec<DynMigration>> = Lazy::new(|| vec![MigrateAppHomeDir.into()]);
|
pub static UNITS: Lazy<Vec<DynMigration>> =
|
||||||
|
Lazy::new(|| vec![MigrateAppHomeDir.into(), MigrateProxiesSelectorMode.into()]);
|
||||||
|
|
||||||
pub static VERSION: Lazy<semver::Version> = Lazy::new(|| semver::Version::parse("1.6.0").unwrap());
|
pub static VERSION: Lazy<semver::Version> = Lazy::new(|| semver::Version::parse("1.6.0").unwrap());
|
||||||
|
|
||||||
@@ -109,4 +113,142 @@ impl<'a> Migration<'a> for MigrateAppHomeDir {
|
|||||||
println!("Migration completed");
|
println!("Migration completed");
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
|
fn discard(&self) -> std::io::Result<()> {
|
||||||
|
let home_dir = crate::utils::dirs::app_home_dir().unwrap();
|
||||||
|
let app_config_dir = crate::utils::dirs::app_config_dir().unwrap();
|
||||||
|
let app_data_dir = crate::utils::dirs::app_data_dir().unwrap();
|
||||||
|
if !home_dir.exists() {
|
||||||
|
std::fs::create_dir_all(&home_dir)
|
||||||
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
|
||||||
|
}
|
||||||
|
let file_opts = fs_extra::file::CopyOptions::default().skip_exist(true);
|
||||||
|
let dir_opts = fs_extra::dir::CopyOptions::default()
|
||||||
|
.skip_exist(true)
|
||||||
|
.content_only(true);
|
||||||
|
if home_dir != app_config_dir {
|
||||||
|
// move profiles.yaml
|
||||||
|
let path = app_config_dir.join("profiles.yaml");
|
||||||
|
if path.exists() {
|
||||||
|
println!("Moving profiles.yaml to home dir");
|
||||||
|
fs_extra::file::move_file(path, home_dir.join("profiles.yaml"), &file_opts)
|
||||||
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
|
||||||
|
}
|
||||||
|
// move profiles dir
|
||||||
|
let path = crate::utils::dirs::app_profiles_dir().unwrap();
|
||||||
|
if path.exists() {
|
||||||
|
println!("Moving profiles dir to home dir");
|
||||||
|
fs_extra::dir::move_dir(path, home_dir.join("profiles"), &dir_opts)
|
||||||
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
|
||||||
|
}
|
||||||
|
// move other files and dirs to home dir
|
||||||
|
println!("Moving other files and dirs to home dir");
|
||||||
|
fs_extra::dir::move_dir(app_data_dir, &home_dir, &dir_opts)
|
||||||
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
|
||||||
|
}
|
||||||
|
// move nyanpasu config
|
||||||
|
let path = app_config_dir.join(crate::utils::dirs::NYANPASU_CONFIG);
|
||||||
|
if path.exists() {
|
||||||
|
println!("Moving verge.yaml to home dir");
|
||||||
|
fs_extra::file::move_file(path, home_dir.join("verge.yaml"), &file_opts)
|
||||||
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
|
||||||
|
}
|
||||||
|
// move clash guard overrides
|
||||||
|
let path = crate::utils::dirs::clash_guard_overrides_path().unwrap();
|
||||||
|
if path.exists() {
|
||||||
|
println!("Moving config.yaml to home dir");
|
||||||
|
fs_extra::file::move_file(path, home_dir.join("config.yaml"), &file_opts)
|
||||||
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
|
||||||
|
}
|
||||||
|
// move clash runtime config
|
||||||
|
let path = app_config_dir.join(RUNTIME_CONFIG);
|
||||||
|
if path.exists() {
|
||||||
|
println!("Moving clash-verge.yaml to home dir");
|
||||||
|
fs_extra::file::move_file(path, home_dir.join("clash-verge.yaml"), &file_opts)
|
||||||
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
|
||||||
|
}
|
||||||
|
println!("Migration discarded");
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct MigrateProxiesSelectorMode;
|
||||||
|
impl<'a> Migration<'a> for MigrateProxiesSelectorMode {
|
||||||
|
fn version(&self) -> &'a semver::Version {
|
||||||
|
&VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
fn name(&self) -> std::borrow::Cow<'a, str> {
|
||||||
|
Cow::Borrowed("Migrate Proxies Selector Mode")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn migrate(&self) -> std::io::Result<()> {
|
||||||
|
let config_path = crate::utils::dirs::nyanpasu_config_path().unwrap();
|
||||||
|
if !config_path.exists() {
|
||||||
|
println!("Config file not found, skipping migration");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
println!("parse config file...");
|
||||||
|
let config = std::fs::read_to_string(&config_path)
|
||||||
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
|
||||||
|
let mut config: Mapping = serde_yaml::from_str(&config)
|
||||||
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
|
||||||
|
let mode = config.get_mut("clash_tray_selector");
|
||||||
|
match mode {
|
||||||
|
None => {
|
||||||
|
println!("clash_tray_selector not found, skipping migration");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
Some(mode) => {
|
||||||
|
if mode.is_bool() {
|
||||||
|
println!("detected old mode, migrating...");
|
||||||
|
let value = mode.as_bool().unwrap();
|
||||||
|
let value = if value { "normal" } else { "hidden" };
|
||||||
|
*mode = serde_yaml::Value::from(value);
|
||||||
|
println!("write config file...");
|
||||||
|
let config = serde_yaml::to_string(&config)
|
||||||
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
|
||||||
|
std::fs::write(&config_path, config)?;
|
||||||
|
}
|
||||||
|
println!("Migration completed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn discard(&self) -> std::io::Result<()> {
|
||||||
|
let config_path = crate::utils::dirs::nyanpasu_config_path().unwrap();
|
||||||
|
if !config_path.exists() {
|
||||||
|
println!("Config file not found, skipping migration");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
println!("parse config file...");
|
||||||
|
let config = std::fs::read_to_string(&config_path)
|
||||||
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
|
||||||
|
let mut config: Mapping = serde_yaml::from_str(&config)
|
||||||
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
|
||||||
|
let mode = config.get_mut("clash_tray_selector");
|
||||||
|
match mode {
|
||||||
|
None => {
|
||||||
|
println!("clash_tray_selector not found, skipping migration");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
Some(mode) => {
|
||||||
|
if mode.is_string() {
|
||||||
|
println!("detected new mode, migrating...");
|
||||||
|
let value = mode.as_str().unwrap();
|
||||||
|
let value = value == "normal";
|
||||||
|
*mode = serde_yaml::Value::from(value);
|
||||||
|
println!("write config file...");
|
||||||
|
let config = serde_yaml::to_string(&config)
|
||||||
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?;
|
||||||
|
std::fs::write(&config_path, config)?;
|
||||||
|
}
|
||||||
|
println!("Migration discarded");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
config::Config,
|
config::{nyanpasu::ProxiesSelectorMode, Config},
|
||||||
core::{
|
core::{
|
||||||
clash::proxies::{Proxies, ProxiesGuard, ProxiesGuardExt},
|
clash::proxies::{Proxies, ProxiesGuard, ProxiesGuardExt},
|
||||||
handle::Handle,
|
handle::Handle,
|
||||||
@@ -162,8 +162,11 @@ pub async fn proxies_updated_receiver() {
|
|||||||
}
|
}
|
||||||
Handle::mutate_proxies();
|
Handle::mutate_proxies();
|
||||||
{
|
{
|
||||||
let is_tray_selector_enabled =
|
let is_tray_selector_enabled = Config::verge()
|
||||||
Config::verge().latest().clash_tray_selector.unwrap_or(true);
|
.latest()
|
||||||
|
.clash_tray_selector
|
||||||
|
.unwrap_or_default()
|
||||||
|
!= ProxiesSelectorMode::Hidden;
|
||||||
if !is_tray_selector_enabled {
|
if !is_tray_selector_enabled {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -209,8 +212,12 @@ pub fn setup_proxies() {
|
|||||||
|
|
||||||
mod platform_impl {
|
mod platform_impl {
|
||||||
use super::{ProxySelectAction, TrayProxyItem};
|
use super::{ProxySelectAction, TrayProxyItem};
|
||||||
use crate::core::{clash::proxies::ProxiesGuard, handle::Handle};
|
use crate::{
|
||||||
|
config::nyanpasu::ProxiesSelectorMode,
|
||||||
|
core::{clash::proxies::ProxiesGuard, handle::Handle},
|
||||||
|
};
|
||||||
use base64::{engine::general_purpose::STANDARD as base64_standard, Engine as _};
|
use base64::{engine::general_purpose::STANDARD as base64_standard, Engine as _};
|
||||||
|
use rust_i18n::t;
|
||||||
use tauri::{CustomMenuItem, SystemTrayMenu, SystemTrayMenuItem, SystemTraySubmenu};
|
use tauri::{CustomMenuItem, SystemTrayMenu, SystemTrayMenuItem, SystemTraySubmenu};
|
||||||
use tracing::warn;
|
use tracing::warn;
|
||||||
|
|
||||||
@@ -256,20 +263,30 @@ mod platform_impl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn setup_tray(menu: &mut SystemTrayMenu) -> SystemTrayMenu {
|
pub fn setup_tray(menu: &mut SystemTrayMenu) -> SystemTrayMenu {
|
||||||
let mut menu = menu.to_owned();
|
let mut parent_menu = menu.to_owned();
|
||||||
let is_tray_selector_enabled = crate::config::Config::verge()
|
let selector_mode = crate::config::Config::verge()
|
||||||
.latest()
|
.latest()
|
||||||
.clash_tray_selector
|
.clash_tray_selector
|
||||||
.unwrap_or(true);
|
.unwrap_or_default();
|
||||||
if !is_tray_selector_enabled {
|
let mut menu = match selector_mode {
|
||||||
return menu;
|
ProxiesSelectorMode::Hidden => return parent_menu,
|
||||||
}
|
ProxiesSelectorMode::Normal => {
|
||||||
// TODO: support submenu
|
parent_menu = parent_menu.add_native_item(SystemTrayMenuItem::Separator);
|
||||||
menu = menu.add_native_item(SystemTrayMenuItem::Separator);
|
parent_menu.clone()
|
||||||
|
}
|
||||||
|
ProxiesSelectorMode::Submenu => SystemTrayMenu::new(),
|
||||||
|
};
|
||||||
let proxies = ProxiesGuard::global().read().inner().to_owned();
|
let proxies = ProxiesGuard::global().read().inner().to_owned();
|
||||||
let mode = crate::utils::config::get_current_clash_mode();
|
let mode = crate::utils::config::get_current_clash_mode();
|
||||||
let tray_proxies = super::to_tray_proxies(mode.as_str(), &proxies);
|
let tray_proxies = super::to_tray_proxies(mode.as_str(), &proxies);
|
||||||
generate_selectors(&menu, &tray_proxies)
|
menu = generate_selectors(&menu, &tray_proxies);
|
||||||
|
if selector_mode == ProxiesSelectorMode::Submenu {
|
||||||
|
parent_menu =
|
||||||
|
parent_menu.add_submenu(SystemTraySubmenu::new(t!("tray.select_proxies"), menu));
|
||||||
|
parent_menu
|
||||||
|
} else {
|
||||||
|
menu
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_selected_proxies(actions: &[ProxySelectAction]) {
|
pub fn update_selected_proxies(actions: &[ProxySelectAction]) {
|
||||||
|
@@ -8,13 +8,14 @@ mod utils;
|
|||||||
pub use self::chain::ScriptType;
|
pub use self::chain::ScriptType;
|
||||||
use self::{chain::*, field::*, merge::*, script::*, tun::*};
|
use self::{chain::*, field::*, merge::*, script::*, tun::*};
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
|
use indexmap::IndexMap;
|
||||||
use serde_yaml::Mapping;
|
use serde_yaml::Mapping;
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::HashSet;
|
||||||
pub use utils::{Logs, LogsExt};
|
pub use utils::{Logs, LogsExt};
|
||||||
|
|
||||||
/// Enhance mode
|
/// Enhance mode
|
||||||
/// 返回最终配置、该配置包含的键、和script执行的结果
|
/// 返回最终配置、该配置包含的键、和script执行的结果
|
||||||
pub async fn enhance() -> (Mapping, Vec<String>, HashMap<String, Logs>) {
|
pub async fn enhance() -> (Mapping, Vec<String>, IndexMap<String, Logs>) {
|
||||||
// config.yaml 的配置
|
// config.yaml 的配置
|
||||||
let clash_config = { Config::clash().latest().0.clone() };
|
let clash_config = { Config::clash().latest().0.clone() };
|
||||||
|
|
||||||
@@ -61,7 +62,7 @@ pub async fn enhance() -> (Mapping, Vec<String>, HashMap<String, Logs>) {
|
|||||||
(current_mapping, profile_spec_chains, valid)
|
(current_mapping, profile_spec_chains, valid)
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut result_map = HashMap::new(); // 保存脚本日志
|
let mut result_map = IndexMap::new(); // 保存脚本日志
|
||||||
let mut exists_keys = use_keys(&config); // 保存出现过的keys
|
let mut exists_keys = use_keys(&config); // 保存出现过的keys
|
||||||
|
|
||||||
let valid = use_valid_fields(valid);
|
let valid = use_valid_fields(valid);
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
use serde_yaml::{Mapping, Value};
|
use serde_yaml::{Mapping, Value};
|
||||||
|
|
||||||
|
use crate::config::{nyanpasu::ClashCore, Config};
|
||||||
|
|
||||||
macro_rules! revise {
|
macro_rules! revise {
|
||||||
($map: expr, $key: expr, $val: expr) => {
|
($map: expr, $key: expr, $val: expr) => {
|
||||||
let ret_key = Value::String($key.into());
|
let ret_key = Value::String($key.into());
|
||||||
@@ -31,10 +33,21 @@ pub fn use_tun(mut config: Mapping, enable: bool) -> Mapping {
|
|||||||
|
|
||||||
revise!(tun_val, "enable", enable);
|
revise!(tun_val, "enable", enable);
|
||||||
if enable {
|
if enable {
|
||||||
append!(tun_val, "stack", "gvisor");
|
let core = {
|
||||||
append!(tun_val, "dns-hijack", vec!["any:53"]);
|
*Config::verge()
|
||||||
append!(tun_val, "auto-route", true);
|
.latest()
|
||||||
append!(tun_val, "auto-detect-interface", true);
|
.clash_core
|
||||||
|
.as_ref()
|
||||||
|
.unwrap_or(&ClashCore::default())
|
||||||
|
};
|
||||||
|
if core == ClashCore::ClashRs {
|
||||||
|
append!(tun_val, "device-id", "dev://utun1989");
|
||||||
|
} else {
|
||||||
|
append!(tun_val, "stack", "gvisor");
|
||||||
|
append!(tun_val, "dns-hijack", vec!["any:53"]);
|
||||||
|
append!(tun_val, "auto-route", true);
|
||||||
|
append!(tun_val, "auto-detect-interface", true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
revise!(config, "tun", tun_val);
|
revise!(config, "tun", tun_val);
|
||||||
|
@@ -13,9 +13,10 @@ use crate::{
|
|||||||
};
|
};
|
||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
use chrono::Local;
|
use chrono::Local;
|
||||||
|
use indexmap::IndexMap;
|
||||||
use log::debug;
|
use log::debug;
|
||||||
use serde_yaml::Mapping;
|
use serde_yaml::Mapping;
|
||||||
use std::collections::{HashMap, VecDeque};
|
use std::collections::VecDeque;
|
||||||
use sysproxy::Sysproxy;
|
use sysproxy::Sysproxy;
|
||||||
|
|
||||||
use tauri::api::dialog::FileDialogBuilder;
|
use tauri::api::dialog::FileDialogBuilder;
|
||||||
@@ -173,7 +174,7 @@ pub fn get_runtime_exists() -> CmdResult<Vec<String>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub fn get_runtime_logs() -> CmdResult<HashMap<String, Logs>> {
|
pub fn get_runtime_logs() -> CmdResult<IndexMap<String, Logs>> {
|
||||||
Ok(Config::runtime().latest().chain_logs.clone())
|
Ok(Config::runtime().latest().chain_logs.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -5,7 +5,6 @@ pub mod dirs;
|
|||||||
pub mod help;
|
pub mod help;
|
||||||
pub mod init;
|
pub mod init;
|
||||||
pub mod resolve;
|
pub mod resolve;
|
||||||
pub mod tmpl;
|
|
||||||
// mod winhelp;
|
// mod winhelp;
|
||||||
pub mod downloader;
|
pub mod downloader;
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
|
@@ -1,35 +0,0 @@
|
|||||||
//! Some config file template
|
|
||||||
/// template for new a profile item
|
|
||||||
pub const ITEM_LOCAL: &str = "# Profile Template for clash verge
|
|
||||||
|
|
||||||
proxies:
|
|
||||||
|
|
||||||
proxy-groups:
|
|
||||||
|
|
||||||
rules:
|
|
||||||
";
|
|
||||||
|
|
||||||
/// enhanced profile
|
|
||||||
pub const ITEM_MERGE: &str = "# Merge Template for clash verge
|
|
||||||
# The `Merge` format used to enhance profile
|
|
||||||
|
|
||||||
prepend-rules:
|
|
||||||
|
|
||||||
prepend-proxies:
|
|
||||||
|
|
||||||
prepend-proxy-groups:
|
|
||||||
|
|
||||||
append-rules:
|
|
||||||
|
|
||||||
append-proxies:
|
|
||||||
|
|
||||||
append-proxy-groups:
|
|
||||||
";
|
|
||||||
|
|
||||||
/// enhanced profile
|
|
||||||
pub const ITEM_SCRIPT: &str = "// Define the `main` function
|
|
||||||
|
|
||||||
function main(params) {
|
|
||||||
return params;
|
|
||||||
}
|
|
||||||
";
|
|
@@ -41,7 +41,7 @@ export interface VergeConfig {
|
|||||||
enable_clash_fields?: boolean;
|
enable_clash_fields?: boolean;
|
||||||
enable_builtin_enhanced?: boolean;
|
enable_builtin_enhanced?: boolean;
|
||||||
proxy_layout_column?: number;
|
proxy_layout_column?: number;
|
||||||
clash_tray_selector?: boolean;
|
clash_tray_selector?: "normal" | "hidden" | "submenu";
|
||||||
clash_strategy?: {
|
clash_strategy?: {
|
||||||
external_controller_port_strategy: "fixed" | "random" | "allow_fallback";
|
external_controller_port_strategy: "fixed" | "random" | "allow_fallback";
|
||||||
};
|
};
|
||||||
@@ -75,11 +75,53 @@ export namespace Profile {
|
|||||||
items?: Item[];
|
items?: Item[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ScriptType = "javascript" | "lua";
|
export const Template = {
|
||||||
|
merge: `# Clash Nyanpasu Merge Template (YAML)
|
||||||
|
# Documentation on https://nyanpasu.elaina.moe/
|
||||||
|
# Set the default merge strategy to recursive merge.
|
||||||
|
# Enable the old mode with the override__ prefix.
|
||||||
|
# Use the filter__ prefix to filter lists (removing unwanted content).
|
||||||
|
# All prefixes should support accessing maps or lists with a.b.c syntax.
|
||||||
|
`,
|
||||||
|
javascript: `// Clash Nyanpasu JavaScript Template
|
||||||
|
// Documentation on https://nyanpasu.elaina.moe/
|
||||||
|
|
||||||
|
/** @type {config} */
|
||||||
|
export default function (profile) {
|
||||||
|
return profile;
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
luascript: `-- Clash Nyanpasu Lua Script Template
|
||||||
|
-- Documentation on https://nyanpasu.elaina.moe/
|
||||||
|
|
||||||
|
return config;
|
||||||
|
`,
|
||||||
|
profile: `# Clash Nyanpasu Profile Template
|
||||||
|
# Documentation on https://nyanpasu.elaina.moe/
|
||||||
|
|
||||||
|
proxies:
|
||||||
|
|
||||||
|
proxy-groups:
|
||||||
|
|
||||||
|
rules:
|
||||||
|
`,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const Type = {
|
||||||
|
Local: "local",
|
||||||
|
Remote: "remote",
|
||||||
|
Merge: "merge",
|
||||||
|
JavaScript: {
|
||||||
|
script: "javascript",
|
||||||
|
},
|
||||||
|
LuaScript: {
|
||||||
|
script: "lua",
|
||||||
|
},
|
||||||
|
} as const;
|
||||||
|
|
||||||
export interface Item {
|
export interface Item {
|
||||||
uid: string;
|
uid: string;
|
||||||
type?: "local" | "remote" | "merge" | { script: ScriptType };
|
type?: (typeof Type)[keyof typeof Type];
|
||||||
name?: string;
|
name?: string;
|
||||||
desc?: string;
|
desc?: string;
|
||||||
file?: string;
|
file?: string;
|
||||||
|
@@ -56,7 +56,7 @@
|
|||||||
"@vitejs/plugin-react-swc": "3.7.0",
|
"@vitejs/plugin-react-swc": "3.7.0",
|
||||||
"clsx": "2.1.1",
|
"clsx": "2.1.1",
|
||||||
"sass": "1.77.8",
|
"sass": "1.77.8",
|
||||||
"shiki": "1.12.0",
|
"shiki": "1.12.1",
|
||||||
"tailwindcss-textshadow": "2.1.3",
|
"tailwindcss-textshadow": "2.1.3",
|
||||||
"vite": "5.3.5",
|
"vite": "5.3.5",
|
||||||
"vite-plugin-monaco-editor": "1.1.3",
|
"vite-plugin-monaco-editor": "1.1.3",
|
||||||
|
@@ -0,0 +1,105 @@
|
|||||||
|
import { memo, useState, useTransition } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { Menu as MenuIcon } from "@mui/icons-material";
|
||||||
|
import { LoadingButton } from "@mui/lab";
|
||||||
|
import { alpha, ListItemButton, Menu, MenuItem, useTheme } from "@mui/material";
|
||||||
|
import { Profile, useClash } from "@nyanpasu/interface";
|
||||||
|
import { cleanDeepClickEvent } from "@nyanpasu/ui";
|
||||||
|
|
||||||
|
export const ChainItem = memo(function ChainItem({
|
||||||
|
item,
|
||||||
|
selected,
|
||||||
|
onClick,
|
||||||
|
onChainEdit,
|
||||||
|
}: {
|
||||||
|
item: Profile.Item;
|
||||||
|
selected?: boolean;
|
||||||
|
onClick: () => Promise<void>;
|
||||||
|
onChainEdit: () => void;
|
||||||
|
}) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const { palette } = useTheme();
|
||||||
|
|
||||||
|
const { deleteProfile } = useClash();
|
||||||
|
|
||||||
|
const [isPending, startTransition] = useTransition();
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
startTransition(onClick);
|
||||||
|
};
|
||||||
|
|
||||||
|
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
|
||||||
|
|
||||||
|
const menuMapping = {
|
||||||
|
Apply: () => handleClick(),
|
||||||
|
"Edit Info": () => onChainEdit(),
|
||||||
|
Delete: () => deleteProfile(item.uid),
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleMenuClick = (func: () => void) => {
|
||||||
|
setAnchorEl(null);
|
||||||
|
func();
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<ListItemButton
|
||||||
|
className="!mb-2 !mt-2 !flex !justify-between gap-2"
|
||||||
|
sx={{
|
||||||
|
backgroundColor: selected
|
||||||
|
? alpha(palette.primary.main, 0.3)
|
||||||
|
: alpha(palette.secondary.main, 0.1),
|
||||||
|
borderRadius: 4,
|
||||||
|
|
||||||
|
"&:hover": {
|
||||||
|
backgroundColor: selected
|
||||||
|
? alpha(palette.primary.main, 0.5)
|
||||||
|
: undefined,
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
onClick={handleClick}
|
||||||
|
disabled={isPending}
|
||||||
|
>
|
||||||
|
<div className="truncate py-1">
|
||||||
|
<span>{item.name}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<LoadingButton
|
||||||
|
size="small"
|
||||||
|
color="primary"
|
||||||
|
className="!size-8 !min-w-0"
|
||||||
|
onClick={(e) => {
|
||||||
|
cleanDeepClickEvent(e);
|
||||||
|
setAnchorEl(e.currentTarget);
|
||||||
|
}}
|
||||||
|
loading={isPending}
|
||||||
|
>
|
||||||
|
<MenuIcon />
|
||||||
|
</LoadingButton>
|
||||||
|
</ListItemButton>
|
||||||
|
|
||||||
|
<Menu
|
||||||
|
anchorEl={anchorEl}
|
||||||
|
open={Boolean(anchorEl)}
|
||||||
|
onClose={() => setAnchorEl(null)}
|
||||||
|
>
|
||||||
|
{Object.entries(menuMapping).map(([key, func], index) => {
|
||||||
|
return (
|
||||||
|
<MenuItem
|
||||||
|
key={index}
|
||||||
|
onClick={(e) => {
|
||||||
|
cleanDeepClickEvent(e);
|
||||||
|
handleMenuClick(func);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{t(key)}
|
||||||
|
</MenuItem>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</Menu>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
export default ChainItem;
|
@@ -0,0 +1,25 @@
|
|||||||
|
import { alpha, useTheme } from "@mui/material";
|
||||||
|
import { Profile } from "@nyanpasu/interface";
|
||||||
|
import { getLanguage } from "../utils";
|
||||||
|
|
||||||
|
export const LanguageChip = ({ type }: { type: Profile.Item["type"] }) => {
|
||||||
|
const { palette } = useTheme();
|
||||||
|
|
||||||
|
const lang = getLanguage(type, true);
|
||||||
|
|
||||||
|
return (
|
||||||
|
lang && (
|
||||||
|
<div
|
||||||
|
className="my-auto rounded-full px-2 py-0.5 text-center text-sm font-bold"
|
||||||
|
style={{
|
||||||
|
backgroundColor: alpha(palette.primary.main, 0.1),
|
||||||
|
color: palette.primary.main,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{lang}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default LanguageChip;
|
@@ -1,127 +1,79 @@
|
|||||||
import { useLockFn } from "ahooks";
|
import { useLockFn } from "ahooks";
|
||||||
import { memo } from "react";
|
import { useAtomValue } from "jotai";
|
||||||
import { Add, Edit } from "@mui/icons-material";
|
import { Add } from "@mui/icons-material";
|
||||||
import {
|
import { alpha, ListItemButton, useTheme } from "@mui/material";
|
||||||
alpha,
|
|
||||||
IconButton,
|
|
||||||
ListItemButton,
|
|
||||||
ListItemIcon,
|
|
||||||
ListItemText,
|
|
||||||
useTheme,
|
|
||||||
} from "@mui/material";
|
|
||||||
import { Profile, useClash } from "@nyanpasu/interface";
|
import { Profile, useClash } from "@nyanpasu/interface";
|
||||||
import { filterProfiles } from "../utils";
|
import { filterProfiles } from "../utils";
|
||||||
|
import ChainItem from "./chain-item";
|
||||||
const ChainItem = memo(function ChainItem({
|
import { atomChainsSelected, atomGlobalChainCurrent } from "./store";
|
||||||
name,
|
|
||||||
desc,
|
|
||||||
selected,
|
|
||||||
onClick,
|
|
||||||
onChainEdit,
|
|
||||||
}: {
|
|
||||||
name?: string;
|
|
||||||
desc?: string;
|
|
||||||
selected?: boolean;
|
|
||||||
onClick: () => void;
|
|
||||||
onChainEdit: () => void;
|
|
||||||
}) {
|
|
||||||
const { palette } = useTheme();
|
|
||||||
|
|
||||||
return (
|
|
||||||
<ListItemButton
|
|
||||||
className="!mb-2 !mt-2"
|
|
||||||
sx={{
|
|
||||||
backgroundColor: selected
|
|
||||||
? alpha(palette.primary.main, 0.3)
|
|
||||||
: alpha(palette.secondary.main, 0.1),
|
|
||||||
borderRadius: 4,
|
|
||||||
|
|
||||||
"&:hover": {
|
|
||||||
backgroundColor: selected
|
|
||||||
? alpha(palette.primary.main, 0.5)
|
|
||||||
: undefined,
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
onClick={onClick}
|
|
||||||
>
|
|
||||||
<ListItemText primary={name} secondary={desc} />
|
|
||||||
|
|
||||||
<IconButton
|
|
||||||
edge="end"
|
|
||||||
color="primary"
|
|
||||||
onClick={(e) => {
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
onChainEdit();
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Edit />
|
|
||||||
</IconButton>
|
|
||||||
</ListItemButton>
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
export interface SideChainProps {
|
export interface SideChainProps {
|
||||||
global?: boolean;
|
|
||||||
profile?: Profile.Item;
|
|
||||||
onChainEdit: (item?: Profile.Item) => void | Promise<void>;
|
onChainEdit: (item?: Profile.Item) => void | Promise<void>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const SideChain = ({ global, profile, onChainEdit }: SideChainProps) => {
|
export const SideChain = ({ onChainEdit }: SideChainProps) => {
|
||||||
const { palette } = useTheme();
|
const { palette } = useTheme();
|
||||||
|
|
||||||
const { getProfiles, setProfilesConfig, setProfiles } = useClash();
|
const isGlobalChainCurrent = useAtomValue(atomGlobalChainCurrent);
|
||||||
|
|
||||||
|
const currnetProfile = useAtomValue(atomChainsSelected);
|
||||||
|
|
||||||
|
const {
|
||||||
|
getProfiles,
|
||||||
|
setProfilesConfig,
|
||||||
|
setProfiles,
|
||||||
|
getRuntimeLogs: { mutate: mutateRuntimeLogs },
|
||||||
|
} = useClash();
|
||||||
|
|
||||||
const { scripts } = filterProfiles(getProfiles.data?.items);
|
const { scripts } = filterProfiles(getProfiles.data?.items);
|
||||||
|
|
||||||
const handleChainClick = useLockFn(async (uid: string) => {
|
const handleChainClick = useLockFn(async (uid: string) => {
|
||||||
const chains = global
|
const chains = isGlobalChainCurrent
|
||||||
? (getProfiles.data?.chain ?? [])
|
? (getProfiles.data?.chain ?? [])
|
||||||
: (profile?.chains ?? []);
|
: (currnetProfile?.chains ?? []);
|
||||||
|
|
||||||
const updatedChains = chains.includes(uid)
|
const updatedChains = chains.includes(uid)
|
||||||
? chains.filter((chain) => chain !== uid)
|
? chains.filter((chain) => chain !== uid)
|
||||||
: [...chains, uid];
|
: [...chains, uid];
|
||||||
|
|
||||||
if (global) {
|
if (isGlobalChainCurrent) {
|
||||||
await setProfilesConfig({ chain: updatedChains });
|
await setProfilesConfig({ chain: updatedChains });
|
||||||
} else {
|
} else {
|
||||||
await setProfiles(uid, { chains: updatedChains });
|
await setProfiles(uid, { chains: updatedChains });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mutateRuntimeLogs();
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="h-full overflow-auto !pl-2 !pr-2">
|
<div className="h-full overflow-auto !pl-2 !pr-2">
|
||||||
{scripts?.map((item, index) => {
|
{scripts?.map((item, index) => {
|
||||||
const selected = global
|
const selected = isGlobalChainCurrent
|
||||||
? getProfiles.data?.chain?.includes(item.uid)
|
? getProfiles.data?.chain?.includes(item.uid)
|
||||||
: profile?.chains?.includes(item.uid);
|
: currnetProfile?.chains?.includes(item.uid);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ChainItem
|
<ChainItem
|
||||||
key={index}
|
key={index}
|
||||||
name={item.name}
|
item={item}
|
||||||
desc={item.desc}
|
|
||||||
selected={selected}
|
selected={selected}
|
||||||
onClick={() => handleChainClick(item.uid)}
|
onClick={async () => await handleChainClick(item.uid)}
|
||||||
onChainEdit={() => onChainEdit(item)}
|
onChainEdit={() => onChainEdit(item)}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|
||||||
<ListItemButton
|
<ListItemButton
|
||||||
className="!mb-2 !mt-2"
|
className="!mb-2 !mt-2 flex justify-center gap-2"
|
||||||
sx={{
|
sx={{
|
||||||
backgroundColor: alpha(palette.secondary.main, 0.1),
|
backgroundColor: alpha(palette.secondary.main, 0.1),
|
||||||
borderRadius: 4,
|
borderRadius: 4,
|
||||||
}}
|
}}
|
||||||
onClick={() => onChainEdit()}
|
onClick={() => onChainEdit()}
|
||||||
>
|
>
|
||||||
<ListItemIcon>
|
<Add color="primary" />
|
||||||
<Add color="primary" />
|
|
||||||
</ListItemIcon>
|
|
||||||
|
|
||||||
<ListItemText primary="New Chain" />
|
<div className="py-1">New Chain</div>
|
||||||
</ListItemButton>
|
</ListItemButton>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
import { atom } from "jotai";
|
||||||
|
import type { Profile } from "@nyanpasu/interface";
|
||||||
|
|
||||||
|
export const atomGlobalChainCurrent = atom<boolean>(false);
|
||||||
|
|
||||||
|
export const atomChainsSelected = atom<Profile.Item>();
|
@@ -107,10 +107,18 @@ export const ProfileItem = memo(function ProfileItem({
|
|||||||
|
|
||||||
await deleteConnections();
|
await deleteConnections();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
useMessage(`Error setting profile: \n ${JSON.stringify(err)}`, {
|
const is_fetch_error = err instanceof Error && err.name === "FetchError";
|
||||||
title: t("Error"),
|
useMessage(
|
||||||
type: "error",
|
is_fetch_error
|
||||||
});
|
? t("FetchError", {
|
||||||
|
content: t("Subscription"),
|
||||||
|
})
|
||||||
|
: `Error setting profile: \n ${err instanceof Error ? err.message : String(err)}`,
|
||||||
|
{
|
||||||
|
title: t("Error"),
|
||||||
|
type: "error",
|
||||||
|
},
|
||||||
|
);
|
||||||
} finally {
|
} finally {
|
||||||
setLoading({ card: false });
|
setLoading({ card: false });
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { useAsyncEffect, useLockFn, useUpdateEffect } from "ahooks";
|
import { useAsyncEffect, useUpdateEffect } from "ahooks";
|
||||||
import { useAtomValue } from "jotai";
|
import { useAtomValue } from "jotai";
|
||||||
import { forwardRef, useImperativeHandle, useRef } from "react";
|
import { forwardRef, useImperativeHandle, useRef } from "react";
|
||||||
import { monaco } from "@/services/monaco";
|
import { monaco } from "@/services/monaco";
|
||||||
@@ -23,12 +23,16 @@ export const ProfileMonacoView = forwardRef(function ProfileMonacoView(
|
|||||||
|
|
||||||
const monacoRef = useRef<HTMLDivElement>(null);
|
const monacoRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
|
const monacoeditorRef = useRef<typeof monaco | null>(null);
|
||||||
|
|
||||||
const instanceRef = useRef<monaco.editor.IStandaloneCodeEditor | null>(null);
|
const instanceRef = useRef<monaco.editor.IStandaloneCodeEditor | null>(null);
|
||||||
|
|
||||||
useAsyncEffect(async () => {
|
useAsyncEffect(async () => {
|
||||||
if (open) {
|
if (open) {
|
||||||
const { monaco } = await import("@/services/monaco");
|
const { monaco } = await import("@/services/monaco");
|
||||||
|
|
||||||
|
monacoeditorRef.current = monaco;
|
||||||
|
|
||||||
if (!monacoRef.current) {
|
if (!monacoRef.current) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -49,21 +53,25 @@ export const ProfileMonacoView = forwardRef(function ProfileMonacoView(
|
|||||||
getValue: () => instanceRef.current?.getValue(),
|
getValue: () => instanceRef.current?.getValue(),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const changeLanguage = useLockFn(async () => {
|
useUpdateEffect(() => {
|
||||||
const { monaco } = await import("@/services/monaco");
|
const model = instanceRef.current?.getModel();
|
||||||
|
|
||||||
const text = instanceRef.current?.getModel();
|
if (!model || !language) {
|
||||||
|
|
||||||
if (!text || !language) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
monaco.editor.setModelLanguage(text, language);
|
monacoeditorRef.current?.editor.setModelLanguage(model, language);
|
||||||
});
|
}, [language]);
|
||||||
|
|
||||||
useUpdateEffect(() => {
|
useUpdateEffect(() => {
|
||||||
changeLanguage();
|
const model = instanceRef.current?.getModel();
|
||||||
}, [language]);
|
|
||||||
|
if (!model || !value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
model.setValue(value);
|
||||||
|
}, [value]);
|
||||||
|
|
||||||
return <div ref={monacoRef} className={className} />;
|
return <div ref={monacoRef} className={className} />;
|
||||||
});
|
});
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { Allotment } from "allotment";
|
import { Allotment } from "allotment";
|
||||||
import "allotment/dist/style.css";
|
import "allotment/dist/style.css";
|
||||||
|
import { useAtomValue } from "jotai";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { Close } from "@mui/icons-material";
|
import { Close } from "@mui/icons-material";
|
||||||
@@ -7,23 +8,26 @@ import { IconButton } from "@mui/material";
|
|||||||
import { Profile } from "@nyanpasu/interface";
|
import { Profile } from "@nyanpasu/interface";
|
||||||
import { SideChain } from "./modules/side-chain";
|
import { SideChain } from "./modules/side-chain";
|
||||||
import { SideLog } from "./modules/side-log";
|
import { SideLog } from "./modules/side-log";
|
||||||
|
import { atomChainsSelected, atomGlobalChainCurrent } from "./modules/store";
|
||||||
import { ScriptDialog } from "./script-dialog";
|
import { ScriptDialog } from "./script-dialog";
|
||||||
|
|
||||||
export interface ProfileSideProps {
|
export interface ProfileSideProps {
|
||||||
profile?: Profile.Item;
|
|
||||||
global?: boolean;
|
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ProfileSide = ({ profile, global, onClose }: ProfileSideProps) => {
|
export const ProfileSide = ({ onClose }: ProfileSideProps) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
|
|
||||||
const [item, setItem] = useState<Profile.Item>();
|
const [item, setItem] = useState<Profile.Item>();
|
||||||
|
|
||||||
const handleEditChain = async (item?: Profile.Item) => {
|
const isGlobalChainCurrent = useAtomValue(atomGlobalChainCurrent);
|
||||||
setItem(item);
|
|
||||||
|
const currentProfile = useAtomValue(atomChainsSelected);
|
||||||
|
|
||||||
|
const handleEditChain = async (_item?: Profile.Item) => {
|
||||||
|
setItem(_item);
|
||||||
setOpen(true);
|
setOpen(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -34,7 +38,9 @@ export const ProfileSide = ({ profile, global, onClose }: ProfileSideProps) => {
|
|||||||
<div className="text-xl font-bold">{t("Proxy Chains")}</div>
|
<div className="text-xl font-bold">{t("Proxy Chains")}</div>
|
||||||
|
|
||||||
<div className="truncate">
|
<div className="truncate">
|
||||||
{global ? t("Global Proxy Chains") : profile?.name}
|
{isGlobalChainCurrent
|
||||||
|
? t("Global Proxy Chains")
|
||||||
|
: currentProfile?.name}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -46,11 +52,7 @@ export const ProfileSide = ({ profile, global, onClose }: ProfileSideProps) => {
|
|||||||
<div style={{ height: "calc(100% - 84px)" }}>
|
<div style={{ height: "calc(100% - 84px)" }}>
|
||||||
<Allotment vertical defaultSizes={[1, 0]}>
|
<Allotment vertical defaultSizes={[1, 0]}>
|
||||||
<Allotment.Pane snap>
|
<Allotment.Pane snap>
|
||||||
<SideChain
|
<SideChain onChainEdit={handleEditChain} />
|
||||||
global={global}
|
|
||||||
profile={profile}
|
|
||||||
onChainEdit={handleEditChain}
|
|
||||||
/>
|
|
||||||
</Allotment.Pane>
|
</Allotment.Pane>
|
||||||
|
|
||||||
<Allotment.Pane minSize={40}>
|
<Allotment.Pane minSize={40}>
|
||||||
@@ -61,7 +63,7 @@ export const ProfileSide = ({ profile, global, onClose }: ProfileSideProps) => {
|
|||||||
|
|
||||||
<ScriptDialog
|
<ScriptDialog
|
||||||
open={open}
|
open={open}
|
||||||
item={item}
|
profile={item}
|
||||||
onClose={() => {
|
onClose={() => {
|
||||||
setOpen(false);
|
setOpen(false);
|
||||||
setItem(undefined);
|
setItem(undefined);
|
||||||
|
@@ -1,22 +1,60 @@
|
|||||||
import { useAsyncEffect, useReactive } from "ahooks";
|
import { useAsyncEffect, useReactive } from "ahooks";
|
||||||
import { isEqual } from "lodash-es";
|
import { useEffect, useRef, useState } from "react";
|
||||||
import { useRef } from "react";
|
|
||||||
import { SelectElement, TextFieldElement, useForm } from "react-hook-form-mui";
|
import { SelectElement, TextFieldElement, useForm } from "react-hook-form-mui";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { Divider } from "@mui/material";
|
import { Divider } from "@mui/material";
|
||||||
import { Profile, useClash } from "@nyanpasu/interface";
|
import { Profile, useClash } from "@nyanpasu/interface";
|
||||||
import { BaseDialog, BaseDialogProps } from "@nyanpasu/ui";
|
import { BaseDialog, BaseDialogProps } from "@nyanpasu/ui";
|
||||||
|
import LanguageChip from "./modules/language-chip";
|
||||||
import { ProfileMonacoView, ProfileMonacoViewRef } from "./profile-monaco-view";
|
import { ProfileMonacoView, ProfileMonacoViewRef } from "./profile-monaco-view";
|
||||||
|
import { getLanguage } from "./utils";
|
||||||
|
|
||||||
|
const formCommonProps = {
|
||||||
|
autoComplete: "off",
|
||||||
|
autoCorrect: "off",
|
||||||
|
fullWidth: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
const optionTypeMapping = [
|
||||||
|
{
|
||||||
|
id: "js",
|
||||||
|
value: Profile.Type.JavaScript,
|
||||||
|
language: "javascript",
|
||||||
|
label: "JavaScript",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "lua",
|
||||||
|
value: Profile.Type.LuaScript,
|
||||||
|
language: "lua",
|
||||||
|
label: "LuaScript",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "merge",
|
||||||
|
value: Profile.Type.Merge,
|
||||||
|
language: "yaml",
|
||||||
|
label: "Merge",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const convertTypeMapping = (data: Profile.Item) => {
|
||||||
|
optionTypeMapping.forEach((option) => {
|
||||||
|
if (option.id === data.type) {
|
||||||
|
data.type = option.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
};
|
||||||
|
|
||||||
export interface ScriptDialogProps extends Omit<BaseDialogProps, "title"> {
|
export interface ScriptDialogProps extends Omit<BaseDialogProps, "title"> {
|
||||||
open: boolean;
|
open: boolean;
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
item?: Profile.Item;
|
profile?: Profile.Item;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ScriptDialog = ({
|
export const ScriptDialog = ({
|
||||||
open,
|
open,
|
||||||
item,
|
profile,
|
||||||
onClose,
|
onClose,
|
||||||
...props
|
...props
|
||||||
}: ScriptDialogProps) => {
|
}: ScriptDialogProps) => {
|
||||||
@@ -25,121 +63,120 @@ export const ScriptDialog = ({
|
|||||||
const { getProfileFile, setProfileFile, createProfile, setProfiles } =
|
const { getProfileFile, setProfileFile, createProfile, setProfiles } =
|
||||||
useClash();
|
useClash();
|
||||||
|
|
||||||
const optionTypeMapping = [
|
const form = useForm<Profile.Item>();
|
||||||
{
|
|
||||||
id: "js",
|
|
||||||
value: { script: "javascript" },
|
|
||||||
language: "javascript",
|
|
||||||
label: t("JavaScript"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "lua",
|
|
||||||
value: { script: "lua" },
|
|
||||||
language: "lua",
|
|
||||||
label: t("LuaScript"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "merge",
|
|
||||||
value: "merge",
|
|
||||||
language: "yaml",
|
|
||||||
label: t("Merge"),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
const preprocessing = () => {
|
const isEdit = Boolean(profile);
|
||||||
const result = optionTypeMapping.find((option) =>
|
|
||||||
isEqual(option.value, item?.type),
|
|
||||||
);
|
|
||||||
|
|
||||||
return { ...item, type: result?.id } as Profile.Item;
|
useEffect(() => {
|
||||||
};
|
if (isEdit) {
|
||||||
|
form.reset(profile);
|
||||||
|
} else {
|
||||||
|
form.reset({
|
||||||
|
type: "merge",
|
||||||
|
chains: [],
|
||||||
|
name: "New Script",
|
||||||
|
desc: "",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [isEdit]);
|
||||||
|
|
||||||
const { control, watch, handleSubmit, reset } = useForm<Profile.Item>({
|
const [openMonaco, setOpenMonaco] = useState(false);
|
||||||
defaultValues: item
|
|
||||||
? preprocessing()
|
|
||||||
: {
|
|
||||||
type: "merge",
|
|
||||||
chains: [],
|
|
||||||
name: "New Script",
|
|
||||||
desc: "",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const profileMonacoViewRef = useRef<ProfileMonacoViewRef>(null);
|
const profileMonacoViewRef = useRef<ProfileMonacoViewRef>(null);
|
||||||
|
|
||||||
const editor = useReactive({
|
const editor = useReactive<{
|
||||||
value: "",
|
value: string;
|
||||||
language: "javascript",
|
language: string;
|
||||||
|
rawType: Profile.Item["type"];
|
||||||
|
}>({
|
||||||
|
value: Profile.Template.merge,
|
||||||
|
language: "yaml",
|
||||||
|
rawType: "merge",
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleTypeChange = () => {
|
const onSubmit = form.handleSubmit(async (data) => {
|
||||||
const language = optionTypeMapping.find((option) =>
|
convertTypeMapping(data);
|
||||||
isEqual(option.id, watch("type")),
|
|
||||||
)?.language;
|
|
||||||
|
|
||||||
if (language) {
|
const editorValue = profileMonacoViewRef.current?.getValue();
|
||||||
editor.language = language;
|
|
||||||
|
if (!editorValue) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
const isEdit = Boolean(item);
|
|
||||||
|
|
||||||
const commonProps = {
|
|
||||||
autoComplete: "off",
|
|
||||||
autoCorrect: "off",
|
|
||||||
fullWidth: true,
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSubmit = handleSubmit(async (form) => {
|
|
||||||
const value = profileMonacoViewRef.current?.getValue() || "";
|
|
||||||
|
|
||||||
const type = optionTypeMapping.find((option) =>
|
|
||||||
isEqual(option.id, form.type),
|
|
||||||
)?.value;
|
|
||||||
|
|
||||||
const data = {
|
|
||||||
...form,
|
|
||||||
type,
|
|
||||||
} as Profile.Item;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (isEdit) {
|
if (isEdit) {
|
||||||
await setProfiles(data.uid, data);
|
await setProfiles(data.uid, data);
|
||||||
|
|
||||||
await setProfileFile(data.uid, value);
|
await setProfileFile(data.uid, editorValue);
|
||||||
} else {
|
} else {
|
||||||
await createProfile(data, value);
|
await createProfile(data, editorValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(() => reset(), 300);
|
|
||||||
|
|
||||||
onClose();
|
|
||||||
} finally {
|
} finally {
|
||||||
|
onClose();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
useAsyncEffect(async () => {
|
useAsyncEffect(async () => {
|
||||||
editor.value = await getProfileFile(item?.uid);
|
if (isEdit) {
|
||||||
|
editor.value = await getProfileFile(profile?.uid);
|
||||||
if (item) {
|
editor.language = getLanguage(profile?.type)!;
|
||||||
reset(item);
|
|
||||||
} else {
|
} else {
|
||||||
reset();
|
editor.value = Profile.Template.merge;
|
||||||
|
editor.language = "yaml";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setOpenMonaco(open);
|
||||||
}, [open]);
|
}, [open]);
|
||||||
|
|
||||||
|
const handleTypeChange = () => {
|
||||||
|
const data = form.getValues();
|
||||||
|
|
||||||
|
editor.rawType = convertTypeMapping(data).type;
|
||||||
|
|
||||||
|
const lang = getLanguage(editor.rawType);
|
||||||
|
|
||||||
|
if (!lang) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
editor.language = lang;
|
||||||
|
|
||||||
|
switch (lang) {
|
||||||
|
case "yaml": {
|
||||||
|
editor.value = Profile.Template.merge;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case "lua": {
|
||||||
|
editor.value = Profile.Template.luascript;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case "javascript": {
|
||||||
|
editor.value = Profile.Template.javascript;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<BaseDialog
|
<BaseDialog
|
||||||
title={isEdit ? "Edit Script" : "New Script"}
|
title={
|
||||||
|
<div className="flex gap-2">
|
||||||
|
<span>{isEdit ? "Edit Script" : "New Script"}</span>
|
||||||
|
|
||||||
|
<LanguageChip type={isEdit ? profile?.type : editor.rawType} />
|
||||||
|
</div>
|
||||||
|
}
|
||||||
open={open}
|
open={open}
|
||||||
onClose={() => onClose()}
|
onClose={() => onClose()}
|
||||||
onOk={onSubmit}
|
onOk={onSubmit}
|
||||||
divider
|
divider
|
||||||
contentStyle={{
|
contentStyle={{
|
||||||
height: "80vh",
|
overflow: "hidden",
|
||||||
width: "90vw",
|
|
||||||
padding: 0,
|
padding: 0,
|
||||||
}}
|
}}
|
||||||
|
full
|
||||||
{...props}
|
{...props}
|
||||||
>
|
>
|
||||||
<div className="flex h-full">
|
<div className="flex h-full">
|
||||||
@@ -149,8 +186,8 @@ export const ScriptDialog = ({
|
|||||||
<SelectElement
|
<SelectElement
|
||||||
label={t("Type")}
|
label={t("Type")}
|
||||||
name="type"
|
name="type"
|
||||||
control={control}
|
control={form.control}
|
||||||
{...commonProps}
|
{...formCommonProps}
|
||||||
size="small"
|
size="small"
|
||||||
required
|
required
|
||||||
options={optionTypeMapping}
|
options={optionTypeMapping}
|
||||||
@@ -161,8 +198,8 @@ export const ScriptDialog = ({
|
|||||||
<TextFieldElement
|
<TextFieldElement
|
||||||
label={t("Name")}
|
label={t("Name")}
|
||||||
name="name"
|
name="name"
|
||||||
control={control}
|
control={form.control}
|
||||||
{...commonProps}
|
{...formCommonProps}
|
||||||
size="small"
|
size="small"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
@@ -170,8 +207,8 @@ export const ScriptDialog = ({
|
|||||||
<TextFieldElement
|
<TextFieldElement
|
||||||
label={t("Descriptions")}
|
label={t("Descriptions")}
|
||||||
name="desc"
|
name="desc"
|
||||||
control={control}
|
control={form.control}
|
||||||
{...commonProps}
|
{...formCommonProps}
|
||||||
size="small"
|
size="small"
|
||||||
multiline
|
multiline
|
||||||
/>
|
/>
|
||||||
@@ -183,7 +220,7 @@ export const ScriptDialog = ({
|
|||||||
<ProfileMonacoView
|
<ProfileMonacoView
|
||||||
className="w-full"
|
className="w-full"
|
||||||
ref={profileMonacoViewRef}
|
ref={profileMonacoViewRef}
|
||||||
open={open}
|
open={openMonaco}
|
||||||
value={editor.value}
|
value={editor.value}
|
||||||
language={editor.language}
|
language={editor.language}
|
||||||
/>
|
/>
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
import { isEqual } from "lodash-es";
|
||||||
import { Profile } from "@nyanpasu/interface";
|
import { Profile } from "@nyanpasu/interface";
|
||||||
|
|
||||||
export const filterProfiles = (items?: Profile.Item[]) => {
|
export const filterProfiles = (items?: Profile.Item[]) => {
|
||||||
@@ -21,12 +22,12 @@ export const filterProfiles = (items?: Profile.Item[]) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const profiles = getItems(["local", "remote"]);
|
const profiles = getItems([Profile.Type.Local, Profile.Type.Remote]);
|
||||||
|
|
||||||
const scripts = getItems([
|
const scripts = getItems([
|
||||||
"merge",
|
Profile.Type.Merge,
|
||||||
{ script: "javascript" },
|
Profile.Type.JavaScript,
|
||||||
{ script: "lua" },
|
Profile.Type.LuaScript,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -34,3 +35,25 @@ export const filterProfiles = (items?: Profile.Item[]) => {
|
|||||||
scripts,
|
scripts,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const getLanguage = (type: Profile.Item["type"], snake?: boolean) => {
|
||||||
|
switch (true) {
|
||||||
|
case isEqual(type, Profile.Type.JavaScript):
|
||||||
|
case isEqual(type, Profile.Type.JavaScript.script): {
|
||||||
|
return snake ? "JavaScript" : "javascript";
|
||||||
|
}
|
||||||
|
|
||||||
|
case isEqual(type, Profile.Type.LuaScript):
|
||||||
|
case isEqual(type, Profile.Type.LuaScript.script): {
|
||||||
|
return snake ? "Lua" : "lua";
|
||||||
|
}
|
||||||
|
|
||||||
|
case isEqual(type, Profile.Type.Merge): {
|
||||||
|
return snake ? "YAML" : "yaml";
|
||||||
|
}
|
||||||
|
|
||||||
|
default: {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
@@ -20,6 +20,12 @@ export const SettingNyanpasuMisc = () => {
|
|||||||
silent: "Silent",
|
silent: "Silent",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const trayProxiesSelectorMode = {
|
||||||
|
normal: t("Normal"),
|
||||||
|
hidden: t("Hidden"),
|
||||||
|
submenu: t("Submenu"),
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<BaseCard label={t("Nyanpasu Setting")}>
|
<BaseCard label={t("Nyanpasu Setting")}>
|
||||||
<List disablePadding>
|
<List disablePadding>
|
||||||
@@ -32,6 +38,17 @@ export const SettingNyanpasuMisc = () => {
|
|||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<MenuItem
|
||||||
|
label={t("Tray Proxies Selector")}
|
||||||
|
options={trayProxiesSelectorMode}
|
||||||
|
selected={nyanpasuConfig?.clash_tray_selector || "normal"}
|
||||||
|
onSelected={(value) =>
|
||||||
|
setNyanpasuConfig({
|
||||||
|
clash_tray_selector: value as "normal" | "hidden" | "submenu",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
|
||||||
<SwitchItem
|
<SwitchItem
|
||||||
label={t("Auto Close Connections")}
|
label={t("Auto Close Connections")}
|
||||||
{...createBooleanProps("auto_close_connection")}
|
{...createBooleanProps("auto_close_connection")}
|
||||||
@@ -42,11 +59,6 @@ export const SettingNyanpasuMisc = () => {
|
|||||||
{...createBooleanProps("enable_builtin_enhanced")}
|
{...createBooleanProps("enable_builtin_enhanced")}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<SwitchItem
|
|
||||||
label={t("Enable Tray Proxies Selector")}
|
|
||||||
{...createBooleanProps("clash_tray_selector")}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<SwitchItem
|
<SwitchItem
|
||||||
label={t("Lighten up Animation Effects")}
|
label={t("Lighten up Animation Effects")}
|
||||||
{...createBooleanProps("lighten_animation_effects")}
|
{...createBooleanProps("lighten_animation_effects")}
|
||||||
|
@@ -156,8 +156,13 @@
|
|||||||
"Last Update": "Last Updated: {{fromNow}}",
|
"Last Update": "Last Updated: {{fromNow}}",
|
||||||
"Update Rules Providers Success": "Update Rules Providers Success",
|
"Update Rules Providers Success": "Update Rules Providers Success",
|
||||||
"Portable Update Error": "Portable Update is not supported, please download the latest version from the official website.",
|
"Portable Update Error": "Portable Update is not supported, please download the latest version from the official website.",
|
||||||
"Enable Tray Proxies Selector": "Enable Tray Proxies Selector",
|
"Tray Proxies Selector": "Tray Proxies Selector",
|
||||||
|
"Hidden": "Hidden",
|
||||||
|
"Normal": "Normal",
|
||||||
|
"Submenu": "Submenu",
|
||||||
"Proxy Set proxies": "{{rule}} proxies",
|
"Proxy Set proxies": "{{rule}} proxies",
|
||||||
"Update Proxies Providers All": "Update Rules Proxies All",
|
"Update Proxies Providers All": "Update Rules Proxies All",
|
||||||
"Lighten up Animation Effects": "Lighten up Animation Effects"
|
"Lighten up Animation Effects": "Lighten up Animation Effects",
|
||||||
|
"Subscription": "Subscription",
|
||||||
|
"FetchError": "Failed to fetch {{content}} due to network issue. Please check your network connection and try again later."
|
||||||
}
|
}
|
||||||
|
@@ -142,5 +142,10 @@
|
|||||||
"Update Rules Providers Success": "Провайдеры правил успешно обновлены",
|
"Update Rules Providers Success": "Провайдеры правил успешно обновлены",
|
||||||
|
|
||||||
"Portable Update Error": "Обновление портативной версии не поддерживается",
|
"Portable Update Error": "Обновление портативной версии не поддерживается",
|
||||||
"Enable Tray Proxies Selector": "Включить выбор прокси в трее"
|
"Tray Proxies Selector": "Выбор прокси в трее",
|
||||||
|
"Hidden": "Скрыть",
|
||||||
|
"Normal": "Обычный",
|
||||||
|
"Submenu": "Подменю",
|
||||||
|
"Subscription": "подписка",
|
||||||
|
"FetchError": "Из-за проблем с сетью содержимое {{content}} невозможно получить. Пожалуйста, проверьте сетевое соединение или повторите попытку позже."
|
||||||
}
|
}
|
||||||
|
@@ -158,8 +158,13 @@
|
|||||||
"Last Update": "{{fromNow}}更新",
|
"Last Update": "{{fromNow}}更新",
|
||||||
"Update Rules Providers Success": "更新规则集成功",
|
"Update Rules Providers Success": "更新规则集成功",
|
||||||
"Portable Update Error": "便携版无法自动更新,请到 Github 下载最新版本",
|
"Portable Update Error": "便携版无法自动更新,请到 Github 下载最新版本",
|
||||||
"Enable Tray Proxies Selector": "开启托盘代理选择",
|
"Tray Proxies Selector": "托盘代理选择",
|
||||||
|
"Hidden": "隐藏",
|
||||||
|
"Normal": "开启",
|
||||||
|
"Submenu": "子菜单",
|
||||||
"Proxy Set proxies": "{{rule}} 个节点",
|
"Proxy Set proxies": "{{rule}} 个节点",
|
||||||
"Update Proxies Providers All": "全部更新",
|
"Update Proxies Providers All": "全部更新",
|
||||||
"Lighten up Animation Effects": "减轻动画效果"
|
"Lighten up Animation Effects": "减轻动画效果",
|
||||||
|
"Subscription": "订阅",
|
||||||
|
"FetchError": "由于网络问题,无法获取{{content}}内容。请检查网络连接或稍后再试。"
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,9 @@
|
|||||||
import { useState } from "react";
|
import { useAtom } from "jotai";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import {
|
||||||
|
atomChainsSelected,
|
||||||
|
atomGlobalChainCurrent,
|
||||||
|
} from "@/components/profiles/modules/store";
|
||||||
import NewProfileButton from "@/components/profiles/new-profile-button";
|
import NewProfileButton from "@/components/profiles/new-profile-button";
|
||||||
import ProfileItem from "@/components/profiles/profile-item";
|
import ProfileItem from "@/components/profiles/profile-item";
|
||||||
import ProfileSide from "@/components/profiles/profile-side";
|
import ProfileSide from "@/components/profiles/profile-side";
|
||||||
@@ -18,15 +22,15 @@ export const ProfilePage = () => {
|
|||||||
|
|
||||||
const { profiles } = filterProfiles(getProfiles.data?.items);
|
const { profiles } = filterProfiles(getProfiles.data?.items);
|
||||||
|
|
||||||
const [globalChain, setGlobalChain] = useState(false);
|
const [globalChain, setGlobalChain] = useAtom(atomGlobalChainCurrent);
|
||||||
|
|
||||||
|
const [chainsSelected, setChainsSelected] = useAtom(atomChainsSelected);
|
||||||
|
|
||||||
const handleGlobalChainClick = () => {
|
const handleGlobalChainClick = () => {
|
||||||
setChainsSelected(undefined);
|
setChainsSelected(undefined);
|
||||||
setGlobalChain(!globalChain);
|
setGlobalChain(!globalChain);
|
||||||
};
|
};
|
||||||
|
|
||||||
const [chainsSelected, setChainsSelected] = useState<Profile.Item>();
|
|
||||||
|
|
||||||
const onClickChains = (profile: Profile.Item) => {
|
const onClickChains = (profile: Profile.Item) => {
|
||||||
setGlobalChain(false);
|
setGlobalChain(false);
|
||||||
|
|
||||||
@@ -61,11 +65,7 @@ export const ProfilePage = () => {
|
|||||||
sideClassName="!overflow-visible"
|
sideClassName="!overflow-visible"
|
||||||
side={
|
side={
|
||||||
(globalChain || chainsSelected) && (
|
(globalChain || chainsSelected) && (
|
||||||
<ProfileSide
|
<ProfileSide onClose={handleSideClose} />
|
||||||
profile={chainsSelected}
|
|
||||||
global={globalChain}
|
|
||||||
onClose={handleSideClose}
|
|
||||||
/>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
|
@@ -29,6 +29,10 @@ export const containsSearchTerm = (obj: any, term: string): boolean => {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function formatError(err: unknown): string {
|
||||||
|
return `Error: ${err instanceof Error ? err.message : String(err)}`;
|
||||||
|
}
|
||||||
|
|
||||||
export function formatEnvInfos(envs: EnvInfos) {
|
export function formatEnvInfos(envs: EnvInfos) {
|
||||||
let result = "----------- System -----------\n";
|
let result = "----------- System -----------\n";
|
||||||
result += `OS: ${envs.os}\n`;
|
result += `OS: ${envs.os}\n`;
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
"ps": "Copy Env (PS)",
|
"ps": "Copy Env (PS)",
|
||||||
"sh": "Copy Env (sh)"
|
"sh": "Copy Env (sh)"
|
||||||
},
|
},
|
||||||
|
"select_proxies": "Select Proxies",
|
||||||
"dashboard": "Dashboard",
|
"dashboard": "Dashboard",
|
||||||
"direct_mode": "Direct Mode",
|
"direct_mode": "Direct Mode",
|
||||||
"global_mode": "Global Mode",
|
"global_mode": "Global Mode",
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
"ps": "复制环境变量(PS)",
|
"ps": "复制环境变量(PS)",
|
||||||
"sh": "复制环境变量(sh)"
|
"sh": "复制环境变量(sh)"
|
||||||
},
|
},
|
||||||
|
"select_proxies": "选择代理",
|
||||||
"dashboard": "打开面板",
|
"dashboard": "打开面板",
|
||||||
"direct_mode": "直连模式",
|
"direct_mode": "直连模式",
|
||||||
"global_mode": "全局模式",
|
"global_mode": "全局模式",
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
"manifest_version": 1,
|
"manifest_version": 1,
|
||||||
"latest": {
|
"latest": {
|
||||||
"mihomo": "v1.18.7",
|
"mihomo": "v1.18.7",
|
||||||
"mihomo_alpha": "alpha-117cdd8",
|
"mihomo_alpha": "alpha-e7e1400",
|
||||||
"clash_rs": "v0.1.20",
|
"clash_rs": "v0.1.20",
|
||||||
"clash_premium": "2023-09-05-gdcc8d87"
|
"clash_premium": "2023-09-05-gdcc8d87"
|
||||||
},
|
},
|
||||||
@@ -36,5 +36,5 @@
|
|||||||
"darwin-x64": "clash-darwin-amd64-n{}.gz"
|
"darwin-x64": "clash-darwin-amd64-n{}.gz"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"updated_at": "2024-07-29T22:20:59.937Z"
|
"updated_at": "2024-07-31T22:20:11.102Z"
|
||||||
}
|
}
|
||||||
|
@@ -88,7 +88,7 @@
|
|||||||
"stylelint-order": "6.0.4",
|
"stylelint-order": "6.0.4",
|
||||||
"stylelint-scss": "6.4.1",
|
"stylelint-scss": "6.4.1",
|
||||||
"tailwindcss": "3.4.7",
|
"tailwindcss": "3.4.7",
|
||||||
"tsx": "4.16.2",
|
"tsx": "4.16.5",
|
||||||
"typescript": "5.5.4"
|
"typescript": "5.5.4"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@9.6.0",
|
"packageManager": "pnpm@9.6.0",
|
||||||
|
42
clash-nyanpasu/pnpm-lock.yaml
generated
@@ -140,8 +140,8 @@ importers:
|
|||||||
specifier: 3.4.7
|
specifier: 3.4.7
|
||||||
version: 3.4.7
|
version: 3.4.7
|
||||||
tsx:
|
tsx:
|
||||||
specifier: 4.16.2
|
specifier: 4.16.5
|
||||||
version: 4.16.2
|
version: 4.16.5
|
||||||
typescript:
|
typescript:
|
||||||
specifier: 5.5.4
|
specifier: 5.5.4
|
||||||
version: 5.5.4
|
version: 5.5.4
|
||||||
@@ -307,8 +307,8 @@ importers:
|
|||||||
specifier: 1.77.8
|
specifier: 1.77.8
|
||||||
version: 1.77.8
|
version: 1.77.8
|
||||||
shiki:
|
shiki:
|
||||||
specifier: 1.12.0
|
specifier: 1.12.1
|
||||||
version: 1.12.0
|
version: 1.12.1
|
||||||
tailwindcss-textshadow:
|
tailwindcss-textshadow:
|
||||||
specifier: 2.1.3
|
specifier: 2.1.3
|
||||||
version: 2.1.3
|
version: 2.1.3
|
||||||
@@ -441,8 +441,8 @@ importers:
|
|||||||
specifier: 2.23.2
|
specifier: 2.23.2
|
||||||
version: 2.23.2
|
version: 2.23.2
|
||||||
undici:
|
undici:
|
||||||
specifier: 6.19.4
|
specifier: 6.19.5
|
||||||
version: 6.19.4
|
version: 6.19.5
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
@@ -1669,8 +1669,8 @@ packages:
|
|||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@shikijs/core@1.12.0':
|
'@shikijs/core@1.12.1':
|
||||||
resolution: {integrity: sha512-mc1cLbm6UQ8RxLc0dZES7v5rkH+99LxQp/ZvTqV3NLyYsO/fD6JhEflP1H5b2SDq9gI0+0G36AVZWxvounfR9w==}
|
resolution: {integrity: sha512-biCz/mnkMktImI6hMfMX3H9kOeqsInxWEyCHbSlL8C/2TR1FqfmGxTLRNwYCKsyCyxWLbB8rEqXRVZuyxuLFmA==}
|
||||||
|
|
||||||
'@sindresorhus/is@4.6.0':
|
'@sindresorhus/is@4.6.0':
|
||||||
resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
|
resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
|
||||||
@@ -5289,8 +5289,8 @@ packages:
|
|||||||
shell-quote@1.8.1:
|
shell-quote@1.8.1:
|
||||||
resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==}
|
resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==}
|
||||||
|
|
||||||
shiki@1.12.0:
|
shiki@1.12.1:
|
||||||
resolution: {integrity: sha512-BuAxWOm5JhRcbSOl7XCei8wGjgJJonnV0oipUupPY58iULxUGyHhW5CF+9FRMuM1pcJ5cGEJGll1LusX6FwpPA==}
|
resolution: {integrity: sha512-nwmjbHKnOYYAe1aaQyEBHvQymJgfm86ZSS7fT8OaPRr4sbAcBNz7PbfAikMEFSDQ6se2j2zobkXvVKcBOm0ysg==}
|
||||||
|
|
||||||
side-channel@1.0.6:
|
side-channel@1.0.6:
|
||||||
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
|
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
|
||||||
@@ -5644,8 +5644,8 @@ packages:
|
|||||||
tslib@2.6.2:
|
tslib@2.6.2:
|
||||||
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
|
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
|
||||||
|
|
||||||
tsx@4.16.2:
|
tsx@4.16.5:
|
||||||
resolution: {integrity: sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==}
|
resolution: {integrity: sha512-ArsiAQHEW2iGaqZ8fTA1nX0a+lN5mNTyuGRRO6OW3H/Yno1y9/t1f9YOI1Cfoqz63VAthn++ZYcbDP7jPflc+A==}
|
||||||
engines: {node: '>=18.0.0'}
|
engines: {node: '>=18.0.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -5716,8 +5716,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==}
|
resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==}
|
||||||
engines: {node: '>=14.0'}
|
engines: {node: '>=14.0'}
|
||||||
|
|
||||||
undici@6.19.4:
|
undici@6.19.5:
|
||||||
resolution: {integrity: sha512-i3uaEUwNdkRq2qtTRRJb13moW5HWqviu7Vl7oYRYz++uPtGHJj+x7TGjcEuwS5Mt2P4nA0U9dhIX3DdB6JGY0g==}
|
resolution: {integrity: sha512-LryC15SWzqQsREHIOUybavaIHF5IoL0dJ9aWWxL/PgT1KfqAW5225FZpDUFlt9xiDMS2/S7DOKhFWA7RLksWdg==}
|
||||||
engines: {node: '>=18.17'}
|
engines: {node: '>=18.17'}
|
||||||
|
|
||||||
unicorn-magic@0.1.0:
|
unicorn-magic@0.1.0:
|
||||||
@@ -6892,8 +6892,8 @@ snapshots:
|
|||||||
'@babel/runtime': 7.24.8
|
'@babel/runtime': 7.24.8
|
||||||
'@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
'@mui/base': 5.0.0-beta.40(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||||
'@mui/material': 5.16.6(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
'@mui/material': 5.16.6(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-df783f9ea1-20240708(react@19.0.0-rc-df783f9ea1-20240708))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||||
'@mui/system': 5.16.5(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
'@mui/system': 5.16.6(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1))(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||||
'@mui/utils': 5.16.5(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
'@mui/utils': 5.16.6(react@19.0.0-rc-df783f9ea1-20240708)(types-react@19.0.0-rc.1)
|
||||||
'@types/react-transition-group': 4.4.10
|
'@types/react-transition-group': 4.4.10
|
||||||
clsx: 2.1.1
|
clsx: 2.1.1
|
||||||
prop-types: 15.8.1
|
prop-types: 15.8.1
|
||||||
@@ -7217,7 +7217,7 @@ snapshots:
|
|||||||
'@rollup/rollup-win32-x64-msvc@4.17.2':
|
'@rollup/rollup-win32-x64-msvc@4.17.2':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@shikijs/core@1.12.0':
|
'@shikijs/core@1.12.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/hast': 3.0.4
|
'@types/hast': 3.0.4
|
||||||
|
|
||||||
@@ -11138,9 +11138,9 @@ snapshots:
|
|||||||
|
|
||||||
shell-quote@1.8.1: {}
|
shell-quote@1.8.1: {}
|
||||||
|
|
||||||
shiki@1.12.0:
|
shiki@1.12.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@shikijs/core': 1.12.0
|
'@shikijs/core': 1.12.1
|
||||||
'@types/hast': 3.0.4
|
'@types/hast': 3.0.4
|
||||||
|
|
||||||
side-channel@1.0.6:
|
side-channel@1.0.6:
|
||||||
@@ -11604,7 +11604,7 @@ snapshots:
|
|||||||
|
|
||||||
tslib@2.6.2: {}
|
tslib@2.6.2: {}
|
||||||
|
|
||||||
tsx@4.16.2:
|
tsx@4.16.5:
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild: 0.21.5
|
esbuild: 0.21.5
|
||||||
get-tsconfig: 4.7.5
|
get-tsconfig: 4.7.5
|
||||||
@@ -11708,7 +11708,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@fastify/busboy': 2.1.1
|
'@fastify/busboy': 2.1.1
|
||||||
|
|
||||||
undici@6.19.4: {}
|
undici@6.19.5: {}
|
||||||
|
|
||||||
unicorn-magic@0.1.0: {}
|
unicorn-magic@0.1.0: {}
|
||||||
|
|
||||||
|
@@ -20,6 +20,6 @@
|
|||||||
"picocolors": "1.0.1",
|
"picocolors": "1.0.1",
|
||||||
"tar": "7.4.3",
|
"tar": "7.4.3",
|
||||||
"telegram": "2.23.2",
|
"telegram": "2.23.2",
|
||||||
"undici": "6.19.4"
|
"undici": "6.19.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
gost/.github/workflows/buildx.yaml
vendored
@@ -19,7 +19,7 @@ jobs:
|
|||||||
echo ::set-output name=version::snapshot
|
echo ::set-output name=version::snapshot
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo ::set-output name=docker_platforms::linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/386,linux/s390x
|
echo ::set-output name=docker_platforms::linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/386,linux/s390x,linux/riscv64
|
||||||
echo ::set-output name=docker_image::${{ secrets.DOCKER_USERNAME }}/${{ github.event.repository.name }}
|
echo ::set-output name=docker_image::${{ secrets.DOCKER_USERNAME }}/${{ github.event.repository.name }}
|
||||||
|
|
||||||
# https://github.com/crazy-max/ghaction-docker-buildx
|
# https://github.com/crazy-max/ghaction-docker-buildx
|
||||||
|
@@ -106,6 +106,7 @@ func parseUsers(authFile string) (users []*url.Userinfo, err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
defer file.Close()
|
||||||
scanner := bufio.NewScanner(file)
|
scanner := bufio.NewScanner(file)
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
line := strings.TrimSpace(scanner.Text())
|
line := strings.TrimSpace(scanner.Text())
|
||||||
@@ -175,7 +176,7 @@ func parseIP(s string, port string) (ips []string) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
defer file.Close()
|
||||||
scanner := bufio.NewScanner(file)
|
scanner := bufio.NewScanner(file)
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
line := strings.TrimSpace(scanner.Text())
|
line := strings.TrimSpace(scanner.Text())
|
||||||
|
@@ -382,8 +382,8 @@ define KernelPackage/phy-aquantia
|
|||||||
TITLE:=Aquantia Ethernet PHYs
|
TITLE:=Aquantia Ethernet PHYs
|
||||||
DEPENDS:=+kmod-libphy +kmod-hwmon-core +kmod-lib-crc-ccitt
|
DEPENDS:=+kmod-libphy +kmod-hwmon-core +kmod-lib-crc-ccitt
|
||||||
KCONFIG:=CONFIG_AQUANTIA_PHY
|
KCONFIG:=CONFIG_AQUANTIA_PHY
|
||||||
FILES:=$(LINUX_DIR)/drivers/net/phy/aquantia.ko@lt6.6 \
|
FILES:=$(LINUX_DIR)/drivers/net/phy/aquantia.ko@lt6.1 \
|
||||||
$(LINUX_DIR)/drivers/net/phy/aquantia/aquantia.ko@ge6.6
|
$(LINUX_DIR)/drivers/net/phy/aquantia/aquantia.ko@ge6.1
|
||||||
AUTOLOAD:=$(call AutoLoad,18,aquantia,1)
|
AUTOLOAD:=$(call AutoLoad,18,aquantia,1)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
@@ -731,8 +731,7 @@ define KernelPackage/r8169
|
|||||||
DEPENDS:=@PCI_SUPPORT +kmod-mii +r8169-firmware +kmod-phy-realtek +!LINUX_5_4:kmod-mdio-devres
|
DEPENDS:=@PCI_SUPPORT +kmod-mii +r8169-firmware +kmod-phy-realtek +!LINUX_5_4:kmod-mdio-devres
|
||||||
KCONFIG:= \
|
KCONFIG:= \
|
||||||
CONFIG_R8169 \
|
CONFIG_R8169 \
|
||||||
CONFIG_R8169_NAPI=y \
|
CONFIG_R8169_LEDS=y@ge6.6
|
||||||
CONFIG_R8169_VLAN=n
|
|
||||||
FILES:=$(LINUX_DIR)/drivers/net/ethernet/realtek/r8169.ko
|
FILES:=$(LINUX_DIR)/drivers/net/ethernet/realtek/r8169.ko
|
||||||
AUTOLOAD:=$(call AutoProbe,r8169)
|
AUTOLOAD:=$(call AutoProbe,r8169)
|
||||||
endef
|
endef
|
||||||
|
58
lede/package/lean/leigod-acc/Makefile
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2015-2016 OpenWrt.org
|
||||||
|
#
|
||||||
|
# This is free software, licensed under the GNU General Public License v3.
|
||||||
|
#
|
||||||
|
|
||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
|
PKG_NAME:=leigod-acc
|
||||||
|
PKG_VERSION:=1.3.0.30
|
||||||
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
||||||
|
define Package/$(PKG_NAME)
|
||||||
|
SECTION:=net
|
||||||
|
CATEGORY:=Network
|
||||||
|
TITLE:=Powerful Leigod Game Accelerater
|
||||||
|
DEPENDS:=@(x86_64||arm||mipsel||aarch64)
|
||||||
|
URL:=https://www.leigod.com/
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/$(PKG_NAME)/description
|
||||||
|
leigod-acc is a powerful game accelerater
|
||||||
|
endef
|
||||||
|
|
||||||
|
ifeq ($(ARCH),x86_64)
|
||||||
|
acc-arch:=amd64
|
||||||
|
endif
|
||||||
|
ifeq ($(ARCH),mipsel)
|
||||||
|
acc-arch:=mipsle
|
||||||
|
endif
|
||||||
|
ifeq ($(ARCH),arm)
|
||||||
|
acc-arch:=arm
|
||||||
|
endif
|
||||||
|
ifeq ($(ARCH),aarch64)
|
||||||
|
acc-arch:=arm64
|
||||||
|
endif
|
||||||
|
|
||||||
|
define Build/Prepare
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/Configure
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Build/Compile
|
||||||
|
endef
|
||||||
|
|
||||||
|
define Package/$(PKG_NAME)/install
|
||||||
|
$(INSTALL_DIR) $(1)/usr/sbin/leigod
|
||||||
|
$(INSTALL_BIN) ./files/acc-gw.linux.$(acc-arch) $(1)/usr/sbin/leigod/acc-gw.linux.$(acc-arch)
|
||||||
|
$(INSTALL_BIN) ./files/leigod_uninstall.sh $(1)/usr/sbin/leigod/leigod_uninstall.sh
|
||||||
|
$(INSTALL_BIN) ./files/plugin_common.sh $(1)/usr/sbin/leigod/plugin_common.sh
|
||||||
|
$(INSTALL_BIN) ./files/update_plugin $(1)/usr/sbin/leigod/update_plugin
|
||||||
|
$(INSTALL_DATA) ./files/version $(1)/usr/sbin/leigod/version
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(eval $(call BuildPackage,$(PKG_NAME)))
|
BIN
lede/package/lean/leigod-acc/files/acc-gw.linux.amd64
Normal file
BIN
lede/package/lean/leigod-acc/files/acc-gw.linux.arm
Normal file
BIN
lede/package/lean/leigod-acc/files/acc-gw.linux.arm64
Normal file
BIN
lede/package/lean/leigod-acc/files/acc-gw.linux.mipsle
Normal file
24
lede/package/lean/leigod-acc/files/leigod_uninstall.sh
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# this script is use to install leigod plugin
|
||||||
|
ver_name="version"
|
||||||
|
init_file_name="acc"
|
||||||
|
binary_prefix="acc-gw.linux"
|
||||||
|
common_file_name="plugin_common.sh"
|
||||||
|
download_base_url="http://119.3.40.126/router_plugin"
|
||||||
|
|
||||||
|
# include common file
|
||||||
|
. ${common_file_name}
|
||||||
|
|
||||||
|
# preinstall_check
|
||||||
|
# check and set env
|
||||||
|
preinstall_check
|
||||||
|
|
||||||
|
if [ ${is_openwrt} ]; then
|
||||||
|
echo "remove openwrt config"
|
||||||
|
remove_openwrt_series_config
|
||||||
|
remove_openwrt_series_init
|
||||||
|
fi
|
||||||
|
|
||||||
|
# remove_binary remove binary
|
||||||
|
remove_binary
|
502
lede/package/lean/leigod-acc/files/plugin_common.sh
Normal file
@@ -0,0 +1,502 @@
|
|||||||
|
# this script is use to install leigod plugin
|
||||||
|
# sbin_dir="/usr/sbin/leigod"
|
||||||
|
ver_name="version"
|
||||||
|
init_file_name="acc"
|
||||||
|
binary_prefix="acc-gw.linux"
|
||||||
|
common_file_name="plugin_common.sh"
|
||||||
|
uninstall_file_name="leigod_uninstall.sh"
|
||||||
|
download_base_url="http://119.3.40.126/router_plugin"
|
||||||
|
|
||||||
|
# get_device_os
|
||||||
|
# current support os: Linux
|
||||||
|
get_device_os() {
|
||||||
|
os=$(uname)
|
||||||
|
if [ $? == "0" ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
echo "os cant be get"
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
# get_device_arch,
|
||||||
|
# current support arch: arm64 arm x86_64 mips
|
||||||
|
get_device_arch() {
|
||||||
|
arch=$(uname -m)
|
||||||
|
if [ $? == "0" ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
echo "arch cant be get"
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
# get_xiaomi_name check if is xiaomi
|
||||||
|
get_xiaomi_name() {
|
||||||
|
local name=$(uci get misc.hardware.displayName)
|
||||||
|
if [[ $? == "0" && ${name} != "" ]]; then
|
||||||
|
echo "router is xiaomi series, name: ${name}"
|
||||||
|
sbin_dir="/userdisk/appdata/leigod"
|
||||||
|
init_dir="/userdisk/appdata/leigod"
|
||||||
|
is_xiaomi=true
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
local name=$(uci get misc.hardware.model)
|
||||||
|
if [[ $? == "0" && ${name} != "" ]]; then
|
||||||
|
echo "router is xiaomi series, name: ${name}"
|
||||||
|
sbin_dir="/userdisk/appdata/leigod"
|
||||||
|
init_dir="/userdisk/appdata/leigod"
|
||||||
|
is_xiaomi=true
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
local name=$(uci get misc.hardware.model)
|
||||||
|
if [[ $? == "0" && ${name} != "" ]]; then
|
||||||
|
echo "router is xiaomi series, name: ${name}"
|
||||||
|
sbin_dir="/userdisk/appdata/leigod"
|
||||||
|
init_dir="/userdisk/appdata/leigod"
|
||||||
|
is_xiaomi=true
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
echo "router is not xiaomi, use general openwrt"
|
||||||
|
sbin_dir="/usr/sbin/leigod"
|
||||||
|
init_dir="/etc/init.d"
|
||||||
|
# stop openwrt service first
|
||||||
|
echo "stop openwrt acc service first, in casue install failed"
|
||||||
|
/etc/init.d/acc stop
|
||||||
|
sleep 1
|
||||||
|
show_openwrt_suggestion
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# get_asus_name get asus name
|
||||||
|
get_merlin_party() {
|
||||||
|
if [[ -d "/koolshare" ]]; then
|
||||||
|
echo "router is merlin series, name: $(nvram get build_name)"
|
||||||
|
nvram set 3rd-party=merlin
|
||||||
|
is_merlin=true
|
||||||
|
sbin_dir="/koolshare/leigod/acc"
|
||||||
|
init_dir="/koolshare/init.d"
|
||||||
|
echo "message"
|
||||||
|
return 0
|
||||||
|
elif [[ -d "/jffs/softcenter" ]]; then
|
||||||
|
echo "router is swrt series, name: $(nvram get build_name)"
|
||||||
|
is_swrt=true
|
||||||
|
nvram set 3rd-party=swrt
|
||||||
|
sbin_dir="/jffs/softcenter/leigod/acc"
|
||||||
|
init_dir="/jffs/softcenter/init.d"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
# check merlin
|
||||||
|
echo "route is not merlin, use general asus"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# get_device_firmware get device firmware
|
||||||
|
# current support firmware: openwrt merlin
|
||||||
|
get_device_firmware() {
|
||||||
|
# openwrt file exist
|
||||||
|
if [ -f "/etc/openwrt_release" ]; then
|
||||||
|
echo "firmware is openwrt series"
|
||||||
|
is_openwrt=true
|
||||||
|
get_xiaomi_name
|
||||||
|
elif [[ -f "/etc/image_version" ]] || [[ -d "/koolshare" ]] || [[ -d "/jffs/softcenter" ]]; then
|
||||||
|
echo "firmware is asus series"
|
||||||
|
is_asus=true
|
||||||
|
echo "stop asus acc service first, in casue install failed"
|
||||||
|
PIDS=$(ps | grep acc | grep -v grep | awk '{print $1}')
|
||||||
|
# check if process exist
|
||||||
|
get_merlin_party
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# install_openwrt_package install openwrt
|
||||||
|
install_binary() {
|
||||||
|
# create sbin dir
|
||||||
|
mkdir -p ${sbin_dir}
|
||||||
|
# create name
|
||||||
|
local acc_name=${binary_prefix}.${arch}
|
||||||
|
local download_bin_url=${download_base_url}/${acc_name}
|
||||||
|
echo "install ${acc_name} to ${sbin_dir}"
|
||||||
|
# download file
|
||||||
|
curl -s -o ${sbin_dir}/${acc_name} ${download_bin_url}
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "download and install binary failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
echo "install binary success"
|
||||||
|
chmod +x ${sbin_dir}/${acc_name}
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "add binary permission failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
echo "add acc binary permission success"
|
||||||
|
# download common file
|
||||||
|
local download_common_url=${download_base_url}/${common_file_name}
|
||||||
|
curl -s -o ${sbin_dir}/${common_file_name} ${download_common_url}
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "download and install common file failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# remote uninstall_file_name
|
||||||
|
local remote_uninstall_file_name=${download_base_url}/"plugin_uninstall.sh"
|
||||||
|
curl -s -o ${sbin_dir}/${uninstall_file_name} ${remote_uninstall_file_name}
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "download and install uninstall file failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
echo "add uninstall permission success"
|
||||||
|
local ver_file=${sbin_dir}/${ver_name}
|
||||||
|
touch ${ver_file}
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "create version file failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
# add version to file
|
||||||
|
echo "version=1.3.0.30" > ${ver_file}
|
||||||
|
echo "add version file success"
|
||||||
|
}
|
||||||
|
|
||||||
|
# remove_binary remove binary
|
||||||
|
remove_binary() {
|
||||||
|
rm -r ${sbin_dir}
|
||||||
|
}
|
||||||
|
|
||||||
|
# install xiaomi monitor
|
||||||
|
install_xiaomi_monitor() {
|
||||||
|
local cron_path="/etc/crontabs/root"
|
||||||
|
local monitor_file_name="plugin_monitor.sh"
|
||||||
|
local download_monitor_url=${download_base_url}/${monitor_file_name}
|
||||||
|
curl -o ${sbin_dir}/${monitor_file_name} ${download_monitor_url}
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "download monitor file failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
chmod +x ${sbin_dir}/${monitor_file_name}
|
||||||
|
# download
|
||||||
|
echo "download monitor file success"
|
||||||
|
echo "*/1 * * * * ${sbin_dir}/${monitor_file_name}" >> ${cron_path}
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "add monitor to cron failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
echo "add monitor to cron success"
|
||||||
|
}
|
||||||
|
|
||||||
|
# install_openwrt_series_config save openwrt config
|
||||||
|
install_openwrt_series_config() {
|
||||||
|
# create accelerator config
|
||||||
|
touch /etc/config/accelerator
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "make acc config file failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
if [ ${install_env} == "test" ]; then
|
||||||
|
# use uci to add config
|
||||||
|
uci set accelerator.base=system
|
||||||
|
uci set accelerator.bind=bind
|
||||||
|
uci set accelerator.device=hardware
|
||||||
|
uci set accelerator.Phone=acceleration
|
||||||
|
uci set accelerator.PC=acceleration
|
||||||
|
uci set accelerator.Game=acceleration
|
||||||
|
uci set accelerator.Unknown=acceleration
|
||||||
|
uci set accelerator.base.url='https://test-opapi.nn.com/speed/router/plug/check'
|
||||||
|
uci set accelerator.base.heart='https://test-opapi.nn.com/speed/router/heartbeat'
|
||||||
|
uci set accelerator.base.base_url='https://test-opapi.nn.com/speed'
|
||||||
|
uci commit accelerator
|
||||||
|
elif [ ${install_env} == "test1" ]; then
|
||||||
|
# use uci to add config
|
||||||
|
uci set accelerator.base=system
|
||||||
|
uci set accelerator.bind=bind
|
||||||
|
uci set accelerator.device=hardware
|
||||||
|
uci set accelerator.Phone=acceleration
|
||||||
|
uci set accelerator.PC=acceleration
|
||||||
|
uci set accelerator.Game=acceleration
|
||||||
|
uci set accelerator.Unknown=acceleration
|
||||||
|
uci set accelerator.base.url='https://test1-opapi.nn.com/speed/router/plug/check'
|
||||||
|
uci set accelerator.base.heart='https://test1-opapi.nn.com/speed/router/heartbeat'
|
||||||
|
uci set accelerator.base.base_url='https://test1-opapi.nn.com/speed'
|
||||||
|
uci commit accelerator
|
||||||
|
else
|
||||||
|
# use uci to add config
|
||||||
|
uci set accelerator.base=system
|
||||||
|
uci set accelerator.bind=bind
|
||||||
|
uci set accelerator.device=hardware
|
||||||
|
uci set accelerator.Phone=acceleration
|
||||||
|
uci set accelerator.PC=acceleration
|
||||||
|
uci set accelerator.Game=acceleration
|
||||||
|
uci set accelerator.Unknown=acceleration
|
||||||
|
uci set accelerator.base.url='https://opapi.nn.com/speed/router/plug/check'
|
||||||
|
uci set accelerator.base.heart='https://opapi.nn.com/speed/router/heartbeat'
|
||||||
|
uci set accelerator.base.base_url='https://opapi.nn.com/speed'
|
||||||
|
uci commit accelerator
|
||||||
|
fi
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "create openwrt config unit failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
echo "create openwrt config unit success"
|
||||||
|
}
|
||||||
|
|
||||||
|
# install_openwrt_series_luasrc install openwrt lua src
|
||||||
|
install_openwrt_series_luasrc() {
|
||||||
|
lua_base="/usr/lib/lua/luci"
|
||||||
|
# download index file
|
||||||
|
curl --create-dirs -o ${lua_base}/controller/acc.lua ${download_base_url}/openwrt/controller/acc.lua
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "download acc.lua failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
# download service view file
|
||||||
|
curl --create-dirs -o ${lua_base}/model/cbi/leigod/service.lua ${download_base_url}/openwrt/model/cbi/leigod/service.lua
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "download service.lua failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
# download device view file
|
||||||
|
curl --create-dirs -o ${lua_base}/model/cbi/leigod/device.lua ${download_base_url}/openwrt/model/cbi/leigod/device.lua
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "download device.lua failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
# download notice view file
|
||||||
|
curl --create-dirs -o ${lua_base}/model/cbi/leigod/notice.lua ${download_base_url}/openwrt/model/cbi/leigod/notice.lua
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "download notice.lua failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
# download service view file
|
||||||
|
curl --create-dirs -o ${lua_base}/view/leigod/notice.htm ${download_base_url}/openwrt/view/leigod/notice.htm
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "download notice.htm failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
# download service view file
|
||||||
|
curl --create-dirs -o ${lua_base}/view/leigod/service.htm ${download_base_url}/openwrt/view/leigod/service.htm
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "download service.htm failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
# download service translate file
|
||||||
|
curl --create-dirs -o ${lua_base}/i18n/acc.zh-cn.lmo ${download_base_url}/openwrt/po/zh-cn/acc.zh-cn.lmo
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "download acc.zh-cn.lmo failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
echo "download lua src success"
|
||||||
|
}
|
||||||
|
|
||||||
|
install_openwrt_series_web() {
|
||||||
|
local luci_base="/usr/lib/lua/luci"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# remove_openwrt_series_config remove openwrt config
|
||||||
|
remove_openwrt_series_config() {
|
||||||
|
rm /etc/config/accelerator
|
||||||
|
}
|
||||||
|
|
||||||
|
# install asus series config
|
||||||
|
install_asus_series_config() {
|
||||||
|
mkdir -p ${sbin_dir}/config
|
||||||
|
if [ ${install_env} == "test" ]; then
|
||||||
|
# install test asus config
|
||||||
|
echo "
|
||||||
|
[base]
|
||||||
|
url="https://test-opapi.nn.com/speed/router/plug/check"
|
||||||
|
channel="2"
|
||||||
|
appid="nnMobile_d0k3duup"
|
||||||
|
heart="https://test-opapi.nn.com/speed/router/heartbeat"
|
||||||
|
base_url="https://test-opapi.nn.com/speed"
|
||||||
|
|
||||||
|
[update]
|
||||||
|
domain="https://test-opapi.nn.com/nn-version/version/plug/upgrade"
|
||||||
|
|
||||||
|
[device]
|
||||||
|
" > ${sbin_dir}/config/accelerator
|
||||||
|
elif [ ${install_env} == "test1" ]; then
|
||||||
|
# install test1 asus config
|
||||||
|
echo "
|
||||||
|
[base]
|
||||||
|
url="https://test1-opapi.nn.com/speed/router/plug/check"
|
||||||
|
channel="2"
|
||||||
|
appid="nnMobile_d0k3duup"
|
||||||
|
heart="https://test1-opapi.nn.com/speed/router/heartbeat"
|
||||||
|
base_url="https://test1-opapi.nn.com/speed"
|
||||||
|
|
||||||
|
[update]
|
||||||
|
domain="https://test1-opapi.nn.com/nn-version/version/plug/upgrade"
|
||||||
|
|
||||||
|
[device]
|
||||||
|
" > ${sbin_dir}/config/accelerator
|
||||||
|
else
|
||||||
|
# install formel asus config
|
||||||
|
echo "
|
||||||
|
[base]
|
||||||
|
url="https://opapi.nn.com/speed/router/plug/check"
|
||||||
|
channel="2"
|
||||||
|
appid="nnMobile_d0k3duup"
|
||||||
|
heart="https://opapi.nn.com/speed/router/heartbeat"
|
||||||
|
base_url="https://opapi.nn.com/speed"
|
||||||
|
|
||||||
|
[update]
|
||||||
|
domain="https://opapi.nn.com/nn-version/version/plug/upgrade"
|
||||||
|
|
||||||
|
[device]
|
||||||
|
" > ${sbin_dir}/config/accelerator
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "create asus series config success"
|
||||||
|
}
|
||||||
|
|
||||||
|
# remove_asus_series_config remove asus config
|
||||||
|
remove_asus_series_config() {
|
||||||
|
rm -r ${init_dir}
|
||||||
|
}
|
||||||
|
|
||||||
|
# install_openwrt_init install openwrt to init
|
||||||
|
install_openwrt_series_init() {
|
||||||
|
local remote_init_name="openwrt_init.sh"
|
||||||
|
local download_init_url=${download_base_url}/${remote_init_name}
|
||||||
|
# download init file
|
||||||
|
curl -o ${init_dir}/${init_file_name} ${download_init_url}
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "download init file failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
echo "download init file success"
|
||||||
|
# add permission to file
|
||||||
|
chmod +x ${init_dir}/${init_file_name}
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "add init permission failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
echo "add init file permission success"
|
||||||
|
${init_dir}/${init_file_name} enable
|
||||||
|
echo "set accelerator autostart success"
|
||||||
|
${init_dir}/${init_file_name} start
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "start accelerator failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
echo "start accelerator success"
|
||||||
|
}
|
||||||
|
|
||||||
|
# remove_openwrt_series_init remove openwrt init
|
||||||
|
remove_openwrt_series_init() {
|
||||||
|
${init_dir}/${init_file_name} disable
|
||||||
|
${init_dir}/${init_file_name} stop
|
||||||
|
rm ${init_dir}/${init_file_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
# install merlin init
|
||||||
|
install_merlin_init() {
|
||||||
|
local remote_init_name="asus_init.sh"
|
||||||
|
local download_init_url=${download_base_url}/${remote_init_name}
|
||||||
|
# download init file
|
||||||
|
curl -o ${sbin_dir}/${init_file_name} ${download_init_url}
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "download init file failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
# add permission
|
||||||
|
chmod +x ${sbin_dir}/${init_file_name}
|
||||||
|
# create link
|
||||||
|
local link_init_name="S99LeigodAcc.sh"
|
||||||
|
local link_init_file=${init_dir}/${link_init_name}
|
||||||
|
ln -sf ${sbin_dir}/${init_file_name} ${link_init_file}
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "create merlin init link failed"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
echo "create merlin link file success"
|
||||||
|
${link_init_file} start
|
||||||
|
echo "acc start success"
|
||||||
|
}
|
||||||
|
|
||||||
|
# show_openwrt_suggestion show openwrt install suggest
|
||||||
|
show_openwrt_suggestion() {
|
||||||
|
echo "
|
||||||
|
雷神OpenWrt插件安装建议:
|
||||||
|
|
||||||
|
当前雷神路由器支持两种加速模式,
|
||||||
|
1. tproxy加速模式(速度更快, CPU占用率更低)
|
||||||
|
2. tun加速模式(需要依赖少, 安装灵活)
|
||||||
|
|
||||||
|
需要您根据以上的加速模式, 安装对应的依赖库,
|
||||||
|
如下列出两种模式对应的安装依赖:
|
||||||
|
1. TProxy模式: libpcap iptables kmod-ipt-nat iptables-mod-tproxy kmod-ipt-tproxy kmod-netem(可选) tc-full(可选) kmod-ipt-ipset ipset curl
|
||||||
|
2. Tun模式: libpcap iptables kmod-tun kmod-ipt-nat kmod-ipt-ipset ipset curl
|
||||||
|
|
||||||
|
如何安装依赖:
|
||||||
|
1. 升级依赖: opkg update
|
||||||
|
2. 安装依赖: opkg install xxx
|
||||||
|
|
||||||
|
为了安装方便, 请选择一个模式, 复制以下命令到终端运行:
|
||||||
|
Tproxy模式:
|
||||||
|
opkg update
|
||||||
|
opkg install libpcap iptables kmod-ipt-nat iptables-mod-tproxy kmod-ipt-tproxy kmod-netem tc-full kmod-ipt-ipset ipset
|
||||||
|
|
||||||
|
Tun模式:
|
||||||
|
opkg update
|
||||||
|
opkg install libpcap iptables kmod-tun kmod-ipt-nat kmod-ipt-ipset ipset curl
|
||||||
|
|
||||||
|
关于steamdeck的支持说明
|
||||||
|
steamdeck设备请选择加速电脑游戏
|
||||||
|
|
||||||
|
关于手机设备的支持:
|
||||||
|
1. 安卓支持说明
|
||||||
|
当前代理仅支持ipv4代理, 请更改dhcp配置,更改完配置请重启路由器,
|
||||||
|
配置路径在 /etc/config/dhcp
|
||||||
|
config dhcp 'lan'
|
||||||
|
... 此处是一些其他配置
|
||||||
|
ra 'disable'
|
||||||
|
dhcpv6 'disable'
|
||||||
|
list ra_flags 'none'
|
||||||
|
... 此处是一些其他配置
|
||||||
|
|
||||||
|
2. 关于ios设备的支持说明
|
||||||
|
ios设备, 安装完插件后, 为了精准识别, 请在ios上选择忘记wifi, 然后重新连接即可
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
|
# preinstall_check check env
|
||||||
|
preinstall_check() {
|
||||||
|
# check os
|
||||||
|
get_device_os
|
||||||
|
if [ ${os} != "Linux" ]; then
|
||||||
|
echo "current os not support, os: ${os}"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
# check arch
|
||||||
|
get_device_arch
|
||||||
|
if [[ ${arch} != "x86_64" && ${arch} != "aarch64" && ${arch} != "arm" && ${arch} != "mips" && ${arch} != "armv7l" ]];then
|
||||||
|
echo "current arch not support, arch: ${arch}"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
# fix arch
|
||||||
|
if [ ${arch} == "x86_64" ]; then
|
||||||
|
echo "match x86_64 -> amd64"
|
||||||
|
arch="amd64"
|
||||||
|
elif [ ${arch} == "aarch64" ]; then
|
||||||
|
echo "match aarch64 -> arm64"
|
||||||
|
arch="arm64"
|
||||||
|
elif [ ${arch} == "mips" ]; then
|
||||||
|
echo "match mips -> mipsle"
|
||||||
|
arch="mipsle"
|
||||||
|
elif [ ${arch} == "armv7l" ]; then
|
||||||
|
arch="arm"
|
||||||
|
fi
|
||||||
|
# support plugin
|
||||||
|
echo "current system support plugin, system: ${os}-${arch}"
|
||||||
|
get_device_firmware
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# show_install_success show install has been installed
|
||||||
|
show_install_success() {
|
||||||
|
echo "install success"
|
||||||
|
echo "雷神路由器插件安装已完成"
|
||||||
|
echo "请加群632342113体验"
|
||||||
|
}
|
||||||
|
|
175
lede/package/lean/leigod-acc/files/update_plugin
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
#!/usr/bin/lua
|
||||||
|
|
||||||
|
local util = require "luci.util"
|
||||||
|
local string = require "string"
|
||||||
|
local io = require "io"
|
||||||
|
local json = require "luci.jsonc"
|
||||||
|
local uci = require "luci.model.uci".cursor()
|
||||||
|
local client = require "luci.httpclient"
|
||||||
|
local helper = require "luci.helper"
|
||||||
|
|
||||||
|
-- get cloud version
|
||||||
|
function get_cloud_version()
|
||||||
|
-- get cloud url
|
||||||
|
local url = uci:get("easyupdate", "main", "domain")
|
||||||
|
-- get request channel
|
||||||
|
local channel = uci:get("easyupdate", "main", "channel")
|
||||||
|
-- appid
|
||||||
|
local appid = uci:get("easyupdate", "main", "appid")
|
||||||
|
-- read brand and model from file
|
||||||
|
local brand, model = helper.get_board_info()
|
||||||
|
-- platfrom
|
||||||
|
local platform = 11
|
||||||
|
-- create http request options
|
||||||
|
local options = {}
|
||||||
|
-- create http request method
|
||||||
|
options.method = "POST"
|
||||||
|
-- create http request headers
|
||||||
|
options.headers = {}
|
||||||
|
options.headers['appId'] = appid
|
||||||
|
options.headers['reqChannel'] = channel
|
||||||
|
options.headers['Content-Type'] = 'application/json'
|
||||||
|
-- create http request body
|
||||||
|
local body = {
|
||||||
|
--
|
||||||
|
['appId'] = 'spRouterPlugin_fhem2shgq9s5',
|
||||||
|
['brand'] = brand,
|
||||||
|
['model'] = model,
|
||||||
|
['platform'] = platform,
|
||||||
|
}
|
||||||
|
-- marshal to json
|
||||||
|
local buf = util.serialize_json(body)
|
||||||
|
options.body = buf
|
||||||
|
-- begin to query
|
||||||
|
local status, _, buffer, _ = client.request_raw(url, options)
|
||||||
|
-- check if query success
|
||||||
|
if not status then
|
||||||
|
io.write("status is nil \n")
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
-- check if request success
|
||||||
|
if status ~= 200 and status ~=206 then
|
||||||
|
io.write("status is not success, status: " .. status .. "\n")
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
-- begin to parse response
|
||||||
|
local info = json.parse(buffer)
|
||||||
|
-- get ret data
|
||||||
|
local data = info['retData']
|
||||||
|
-- check if data is nil
|
||||||
|
if data == nil then
|
||||||
|
io.write("response ret data is nil \n")
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
-- store url in config
|
||||||
|
local fw_url = data['url']
|
||||||
|
local version = data['versionName']
|
||||||
|
io.write("fw_url: " .. fw_url .. ", version: " .. version .. "\n")
|
||||||
|
-- get version success
|
||||||
|
return version, fw_url
|
||||||
|
end
|
||||||
|
|
||||||
|
-- get local version
|
||||||
|
function get_local_version()
|
||||||
|
-- run command to get acc version
|
||||||
|
local cmd = 'opkg info acc'
|
||||||
|
local buf = util.exec(cmd)
|
||||||
|
-- check exec result
|
||||||
|
if buf == nil then
|
||||||
|
io.write("exec command failed \n")
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
io.write("buf: " .. buf .. "\n")
|
||||||
|
-- read line
|
||||||
|
for line in string.gmatch(buf, "[^\r\n]+") do
|
||||||
|
io.write("read line: " .. line .. "\n")
|
||||||
|
line = string.gsub(line, " ", "")
|
||||||
|
local valueSl = string.gmatch(line, "[^:]+")
|
||||||
|
local key = valueSl()
|
||||||
|
local value = valueSl()
|
||||||
|
if key == "Version" then
|
||||||
|
io.write("get local version: " .. value .. "\n")
|
||||||
|
return value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
io.write("local version cant found \n")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- get file base name
|
||||||
|
function get_file_base_name(filepath)
|
||||||
|
local name = string.gmatch(filepath, "([^/]+)$")
|
||||||
|
io.write("get file base name: " .. name .. "\n")
|
||||||
|
return name
|
||||||
|
end
|
||||||
|
|
||||||
|
-- download cloud version
|
||||||
|
function download_cloud_app(url, name)
|
||||||
|
io.write("download app, url: " .. url .. ", name: " .. name .. "\n")
|
||||||
|
-- run download
|
||||||
|
local cmd = 'curl -s -o /tmp/' .. name ..' -w %{http_code}' .. ' ' .. url
|
||||||
|
-- exec download
|
||||||
|
local code = util.exec(cmd)
|
||||||
|
if code ~= "200" then
|
||||||
|
io.write("download cloud app failed, code: " .. code .. "\n")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
io.write("download cloud app success \n")
|
||||||
|
return code
|
||||||
|
end
|
||||||
|
|
||||||
|
-- install package name in tmp dir
|
||||||
|
function install_package(name)
|
||||||
|
io.write("install package, package name: " .. name .. "\n")
|
||||||
|
local cmd = "opkg install " .. "/tmp/" .. name .. " " .. "--force-overwrite"
|
||||||
|
local code = util.exec(cmd)
|
||||||
|
io.write("install package finish, package name: " .. name .. "\n")
|
||||||
|
return code
|
||||||
|
end
|
||||||
|
|
||||||
|
-- remove pkg
|
||||||
|
function remove_pkg(name)
|
||||||
|
io.write("remove package, package name: " .. name .. "\n")
|
||||||
|
local cmd = "rm -rf " .. "/tmp/" .. name
|
||||||
|
local code = util.exec(cmd)
|
||||||
|
io.write("remove package finish, package name: " .. name .. "\n")
|
||||||
|
return code
|
||||||
|
end
|
||||||
|
|
||||||
|
-- check network state
|
||||||
|
io.write("check network state \n")
|
||||||
|
while true do
|
||||||
|
local state_code = helper.get_network_state()
|
||||||
|
if state_code == 200 then
|
||||||
|
io.write("network available \n")
|
||||||
|
break
|
||||||
|
end
|
||||||
|
if state_code ~= nil then
|
||||||
|
io.write("network is not available, code: " .. state_code .. "\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
io.write("network success")
|
||||||
|
|
||||||
|
-- exec command
|
||||||
|
local local_version = get_local_version()
|
||||||
|
local cloud_version, url = get_cloud_version()
|
||||||
|
-- check if need update
|
||||||
|
if local_version >= cloud_version then
|
||||||
|
io.write("local version is new, dont need update, local ver: " .. local_version ..
|
||||||
|
", cloud version:" .. cloud_version .. "\n")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- need update
|
||||||
|
io.write("local version is lower, need update, local version: " .. local_version ..
|
||||||
|
", cloud version: " .. cloud_version .. "\n")
|
||||||
|
|
||||||
|
-- download url
|
||||||
|
local name = "acc.ipk"
|
||||||
|
local result = download_cloud_app(url, name)
|
||||||
|
if not result then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- install package
|
||||||
|
install_package(name)
|
||||||
|
remove_pkg(name)
|
1
lede/package/lean/leigod-acc/files/version
Normal file
@@ -0,0 +1 @@
|
|||||||
|
version=1.3.0.30
|
18
lede/package/lean/luci-app-leigod-acc/Makefile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
|
||||||
|
#
|
||||||
|
# This is free software, licensed under the Apache License, Version 2.0 .
|
||||||
|
#
|
||||||
|
|
||||||
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
|
LUCI_TITLE:=Luci for Leigod Game Accelerater
|
||||||
|
LUCI_PKGARCH:=all
|
||||||
|
LUCI_DEPENDS:=+libpcap +iptables +kmod-ipt-nat +iptables-mod-tproxy +kmod-ipt-tproxy +kmod-tun +kmod-netem +tc-full +kmod-ipt-ipset +ipset +curl +miniupnpd +conntrack +conntrackd +leigod-acc
|
||||||
|
PKG_VERSION:=1
|
||||||
|
PKG_RELEASE:=2
|
||||||
|
|
||||||
|
include $(TOPDIR)/feeds/luci/luci.mk
|
||||||
|
|
||||||
|
# call BuildPackage - OpenWrt buildroot signature
|
||||||
|
|
@@ -0,0 +1,74 @@
|
|||||||
|
module("luci.controller.acc", package.seeall)
|
||||||
|
|
||||||
|
function index()
|
||||||
|
require("luci.i18n")
|
||||||
|
entry({ "admin", "services", "acc" }, alias("admin", "services", "acc", "service"), translate("Leigod Acc"), 50)
|
||||||
|
entry({ "admin", "services", "acc", "service" }, cbi("leigod/service"), translate("Leigod Service"), 30).i18n = "acc"
|
||||||
|
entry({ "admin", "services", "acc", "device" }, cbi("leigod/device"), translate("Leigod Device"), 50).i18n = "acc"
|
||||||
|
entry({ "admin", "services", "acc", "notice" }, cbi("leigod/notice"), translate("Leigod Notice"), 80).i18n = "acc"
|
||||||
|
entry({ "admin", "services", "acc", "status" }, call("get_acc_status")).leaf = true
|
||||||
|
entry({ "admin", "services", "acc", "start_acc_service" }, call("start_acc_service"))
|
||||||
|
entry({ "admin", "services", "acc", "stop_acc_service" }, call("stop_acc_service"))
|
||||||
|
end
|
||||||
|
|
||||||
|
-- get_acc_status get acc status
|
||||||
|
function get_acc_status()
|
||||||
|
-- util module
|
||||||
|
local util = require "luci.util"
|
||||||
|
local uci = require "luci.model.uci".cursor()
|
||||||
|
local translate = luci.i18n.translate
|
||||||
|
-- init result
|
||||||
|
local resp = {}
|
||||||
|
-- init state
|
||||||
|
resp.service = translate("Acc Service Disabled")
|
||||||
|
resp.state = {}
|
||||||
|
-- check if exist
|
||||||
|
local exist = util.exec("ps | grep acc-gw | grep -v grep")
|
||||||
|
-- check if program is running
|
||||||
|
if exist ~= "" then
|
||||||
|
resp.service = translate("Acc Service Enabled")
|
||||||
|
end
|
||||||
|
-- get uci
|
||||||
|
local results = uci:get_all("accelerator")
|
||||||
|
for _, typ in pairs({ "Phone", "PC", "Game", "Unknown" }) do
|
||||||
|
local state = uci:get("accelerator", typ, "state")
|
||||||
|
-- check state
|
||||||
|
local state_text = "None"
|
||||||
|
if state == nil or state == '0' then
|
||||||
|
elseif state == '1' then
|
||||||
|
state_text = translate("Acc Catalog Started")
|
||||||
|
elseif state == '2' then
|
||||||
|
state_text = translate("Acc Catalog Stopped")
|
||||||
|
elseif state == '3' then
|
||||||
|
state_text = translate("Acc Catalog Paused")
|
||||||
|
end
|
||||||
|
-- store text
|
||||||
|
resp.state[translate(typ .. "_Catalog")] = state_text
|
||||||
|
end
|
||||||
|
luci.http.prepare_content("application/json")
|
||||||
|
luci.http.write_json(resp)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- start_acc_service
|
||||||
|
function start_acc_service()
|
||||||
|
-- util module
|
||||||
|
local util = require "luci.util"
|
||||||
|
util.exec("/etc/init.d/acc enable")
|
||||||
|
util.exec("/etc/init.d/acc restart")
|
||||||
|
local resp = {}
|
||||||
|
resp.result = "OK"
|
||||||
|
luci.http.prepare_content("application/json")
|
||||||
|
luci.http.write_json(resp)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- start_acc_service
|
||||||
|
function stop_acc_service()
|
||||||
|
-- util module
|
||||||
|
local util = require "luci.util"
|
||||||
|
util.exec("/etc/init.d/acc stop")
|
||||||
|
util.exec("/etc/init.d/acc disable")
|
||||||
|
local resp = {}
|
||||||
|
resp.result = "OK"
|
||||||
|
luci.http.prepare_content("application/json")
|
||||||
|
luci.http.write_json(resp)
|
||||||
|
end
|
@@ -0,0 +1,157 @@
|
|||||||
|
local uci = require "luci.model.uci".cursor()
|
||||||
|
local util = require "luci.util"
|
||||||
|
local fs = require "nixio.fs"
|
||||||
|
local pairs = pairs
|
||||||
|
local io = io
|
||||||
|
|
||||||
|
-- config
|
||||||
|
m = Map("accelerator")
|
||||||
|
m.title = translate("Leigod Device Config")
|
||||||
|
m.description = translate("Control Device Config")
|
||||||
|
|
||||||
|
-- get neigh info
|
||||||
|
neigh = m:section(NamedSection, "base", "system", translate("Neigh Device"))
|
||||||
|
neigh_tab = neigh:option(ListValue, "neigh", translate("acc interface"))
|
||||||
|
local sys_dir = util.exec("ls /sys/class/net")
|
||||||
|
if sys_dir ~= nil then
|
||||||
|
neigh_tab:value("br-lan")
|
||||||
|
for ifc in string.gmatch(sys_dir, "[^\n]+") do
|
||||||
|
neigh_tab:value(ifc)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- range all device
|
||||||
|
device = m:section(NamedSection, "device", "hardware", translate("Device Info"))
|
||||||
|
device:tab("none_catalog", translate("None_Catalog"))
|
||||||
|
device:tab("phone_catalog", translate("Phone_Catalog"))
|
||||||
|
device:tab("pc_catalog", translate("PC_Catalog"))
|
||||||
|
device:tab("game_catalog", translate("Game_Catalog"))
|
||||||
|
device:tab("vr_catalog", translate("VR_Catalog"))
|
||||||
|
device:tab("unknown_catalog", translate("Unknown_Catalog"))
|
||||||
|
|
||||||
|
|
||||||
|
local dhcp_map = {}
|
||||||
|
-- check dhcp file
|
||||||
|
if fs.access("/tmp/dhcp.leases") then
|
||||||
|
for line in io.lines("/tmp/dhcp.leases") do
|
||||||
|
-- check if read empty line
|
||||||
|
if line == "" then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
-- split line
|
||||||
|
local valueSl = string.gmatch(line, "[^ ]+")
|
||||||
|
-- read time
|
||||||
|
valueSl()
|
||||||
|
-- read mac
|
||||||
|
local mac = valueSl()
|
||||||
|
-- get ip
|
||||||
|
local ip = valueSl()
|
||||||
|
-- get host name
|
||||||
|
local hostname = valueSl()
|
||||||
|
-- key
|
||||||
|
local key = string.gsub(mac, ":", "")
|
||||||
|
-- store key
|
||||||
|
dhcp_map[key] = {
|
||||||
|
["key"] = key,
|
||||||
|
["mac"] = mac,
|
||||||
|
["ip"] = ip,
|
||||||
|
["name"] = hostname
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ifc = uci:get("accelerator", "base", "neigh")
|
||||||
|
if ifc == nil then
|
||||||
|
ifc = "br-lan"
|
||||||
|
end
|
||||||
|
|
||||||
|
local arp_map = {}
|
||||||
|
-- check if arp exist
|
||||||
|
if fs.access("/proc/net/arp") then
|
||||||
|
-- read all item from arp
|
||||||
|
for line in io.lines("/proc/net/arp") do
|
||||||
|
-- check if line is not exist
|
||||||
|
if line == "" then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
-- split item
|
||||||
|
local valueSl = string.gmatch(line, "[^ ]+")
|
||||||
|
-- get ip
|
||||||
|
local ip = valueSl()
|
||||||
|
-- get type
|
||||||
|
valueSl()
|
||||||
|
-- get flag
|
||||||
|
local flag = valueSl()
|
||||||
|
-- get mac
|
||||||
|
local mac = valueSl()
|
||||||
|
-- get mask
|
||||||
|
valueSl()
|
||||||
|
-- get device
|
||||||
|
local dev = valueSl()
|
||||||
|
-- get key
|
||||||
|
local key = string.gsub(mac, ":", "")
|
||||||
|
-- check if device and flag state
|
||||||
|
if dev == ifc and flag == "0x2" then
|
||||||
|
-- get current name
|
||||||
|
local name = mac
|
||||||
|
if dhcp_map[key] ~= nil and dhcp_map[key] ~= "*" then
|
||||||
|
name = dhcp_map[key].name
|
||||||
|
end
|
||||||
|
arp_map[key] = {
|
||||||
|
["key"] = key,
|
||||||
|
["mac"] = mac,
|
||||||
|
["ip"] = ip,
|
||||||
|
["name"] = name
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- get device config
|
||||||
|
for key, item in pairs(arp_map) do
|
||||||
|
local typ = uci:get("accelerator", "device", key)
|
||||||
|
-- get device catalog from type
|
||||||
|
local catalog = "none_catalog"
|
||||||
|
-- default to unknown device
|
||||||
|
if typ == nil then
|
||||||
|
typ = 9
|
||||||
|
else
|
||||||
|
typ = tonumber(typ)
|
||||||
|
end
|
||||||
|
|
||||||
|
if typ == nil then
|
||||||
|
catalog = "unknown_catalog"
|
||||||
|
elseif typ >= 1 and typ <= 3 then
|
||||||
|
catalog = "game_catalog"
|
||||||
|
elseif typ >= 4 and typ <= 6 then
|
||||||
|
catalog = "pc_catalog"
|
||||||
|
elseif typ >= 7 and typ <= 8 then
|
||||||
|
catalog = "phone_catalog"
|
||||||
|
elseif typ >= 20 and typ <= 21 then
|
||||||
|
catalog = "vr_catalog"
|
||||||
|
else
|
||||||
|
catalog = "unknown_catalog"
|
||||||
|
end
|
||||||
|
-- device type
|
||||||
|
device_typ = device:taboption(catalog, ListValue, key, item.name)
|
||||||
|
device_typ:value("0", "None")
|
||||||
|
device_typ:value("1", "XBox")
|
||||||
|
device_typ:value("2", "Switch")
|
||||||
|
device_typ:value("3", "Play Station")
|
||||||
|
device_typ:value("4", "Steam Deck")
|
||||||
|
device_typ:value("5", "Windows")
|
||||||
|
device_typ:value("6", "MacBook")
|
||||||
|
device_typ:value("7", "Android")
|
||||||
|
device_typ:value("8", "iPhone")
|
||||||
|
device_typ:value("20", "Oculus")
|
||||||
|
device_typ:value("21", "HTC Vive")
|
||||||
|
device_typ:value("22", "Pico")
|
||||||
|
device_typ:value("9", "Unknown")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- set
|
||||||
|
device.write = function()
|
||||||
|
util.exec("/etc/init.d/acc restart")
|
||||||
|
end
|
||||||
|
|
||||||
|
return m
|
@@ -0,0 +1,10 @@
|
|||||||
|
local uci = require "luci.model.uci".cursor()
|
||||||
|
|
||||||
|
-- config
|
||||||
|
m = Map("accelerator")
|
||||||
|
m.title = translate("Leigod Notice")
|
||||||
|
m.description = translate("Leigod Accelerator Usage")
|
||||||
|
|
||||||
|
m:section(SimpleSection).template = "leigod/notice"
|
||||||
|
|
||||||
|
return m
|
@@ -0,0 +1,10 @@
|
|||||||
|
local uci = require "luci.model.uci".cursor()
|
||||||
|
|
||||||
|
-- config
|
||||||
|
m = Map("accelerator")
|
||||||
|
m.title = translate("Leigod Accelerator Config")
|
||||||
|
m.description = translate("Control Accelerator Config")
|
||||||
|
|
||||||
|
m:section(SimpleSection).template = "leigod/service"
|
||||||
|
|
||||||
|
return m
|
@@ -0,0 +1,74 @@
|
|||||||
|
<fieldset>
|
||||||
|
<legend><%:Declare%></legend>
|
||||||
|
此插件为 LEDE/QWRT 官方合作版插件, 需要配合雷神手机APP使用
|
||||||
|
</p>
|
||||||
|
<legend><%:Upgrade Info%></legend>
|
||||||
|
<p>
|
||||||
|
2024-8-1 <br>
|
||||||
|
支持LEDE/QWRT性能优化 <br>
|
||||||
|
2024-7-25 <br>
|
||||||
|
支持非桥接模式下的旁路由 <br>
|
||||||
|
2024-6-5 <br>
|
||||||
|
扩充ipset容量, 以支持大容量代理ip库 <br>
|
||||||
|
2024-1-22 <br>
|
||||||
|
新增自动选择低延迟线路 <br>
|
||||||
|
新增下载不限速(switch除外) <br>
|
||||||
|
设备名为*时, 显示mac地址 <br>
|
||||||
|
<hr/>
|
||||||
|
2023-11-28 <br>
|
||||||
|
新增对mips设备的支持 <br>
|
||||||
|
新增对旁路由的支持 <br>
|
||||||
|
解决翻译异常的问题 <br>
|
||||||
|
设备管理页面可以显示未识别设备 <br>
|
||||||
|
</p>
|
||||||
|
<legend><%:Install Dependence%></legend>
|
||||||
|
<p>
|
||||||
|
插件运行需要借助一些依赖才能运行, 一般第三方固件默认已经集成了大部分的依赖, <br>
|
||||||
|
如果使用的是openwrt官方的固件, 则需要确保依赖安装好了, 以下列出依赖包和注意事项 <br>
|
||||||
|
libpcap <br>
|
||||||
|
iptables <br>
|
||||||
|
kmod-ipt-nat <br>
|
||||||
|
iptables-mod-tproxy <br>
|
||||||
|
kmod-ipt-tproxy <br>
|
||||||
|
kmod-netem(非必须, 针对于一些icmp测速的游戏使用, 只影响界面显示, 实际游戏效果不影响) <br>
|
||||||
|
tc-full(非必须, 同kmod-netem) <br>
|
||||||
|
kmod-ipt-ipset <br>
|
||||||
|
ipset <br>
|
||||||
|
curl(谨慎更新, 某些三方固件升级curl, 会导致curl出现问题) <br>
|
||||||
|
</p>
|
||||||
|
<legend><%:Bridge Mode%></legend>
|
||||||
|
<p>
|
||||||
|
加速插件无法探知当前插件应该使用什么模式, <br>
|
||||||
|
当前默认使用网桥作为流量转发的设备, <br>
|
||||||
|
如果使用旁路由模式或者docker时, 此时默认设备不是网桥, <br>
|
||||||
|
此时需要手动调整接口, <br>
|
||||||
|
改变接口的地址在 设备管理->路由设备, 选择对应的设备 <br>
|
||||||
|
</p>
|
||||||
|
<legend><%:Acc Mode%></legend>
|
||||||
|
<p>
|
||||||
|
当前雷神路由器支持两种加速模式, tproxy 和 tun <br>
|
||||||
|
当前默认采用的是tproxy模式, 原因在于tproxy有更好的性能<br>
|
||||||
|
tun模式暂时屏蔽, 后续luci会完善一键切换模式
|
||||||
|
</p>
|
||||||
|
<legend><%:Acc Usage%></legend>
|
||||||
|
<p>
|
||||||
|
当前雷神加速插件是根据设备类型进行加速的, 也就是说, 如果加速了相应的类型后, 理论上只要连接该路由器的设备都将获得加速效果<br>
|
||||||
|
当前支持的设备类型有以下几种: <br>
|
||||||
|
手机: Android iPhone <br>
|
||||||
|
电脑: Windows MacOS SteamDeck <br>
|
||||||
|
主机: XBox Switch PlayStation <br>
|
||||||
|
未识别: Others <br>
|
||||||
|
可以在设备管理中, 插件自己的设备是否被成功识别成对应的设备, 如果不是, 可以选择对应的设备, 这样设备就能成功加速了 <br>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
一些特殊的说明: <br>
|
||||||
|
关于ios设备, 最好是在安装插件之前, 先忘记网络, 等安装完插件后, 再重新连接网络 <br>
|
||||||
|
关于android设备, 需要关闭dhcpv6后, 手机重连网络, 以下给出一个 /etc/config/dhcp 的配置 <br>
|
||||||
|
config dhcp 'lan' <br>
|
||||||
|
... 此处是一些其他配置 <br>
|
||||||
|
ra 'disable' <br>
|
||||||
|
dhcpv6 'disable' <br>
|
||||||
|
list ra_flags 'none' <br>
|
||||||
|
... 此处是一些其他配置 <br>
|
||||||
|
</p>
|
||||||
|
</fieldset>
|
@@ -0,0 +1,61 @@
|
|||||||
|
<!-- acc service state -->
|
||||||
|
<fieldset class="cbi-section">
|
||||||
|
<table class="cbi-section-table" id="acc_service_state_table">
|
||||||
|
<tr class="cbi-section-table-title">
|
||||||
|
<th class="cbi-section-table-cell"><%:Acc_Service_Name%></th>
|
||||||
|
<th class="cbi-section-table-cell"><%:Acc_Service_Status%></th>
|
||||||
|
<th class="cbi-section-table-cell"><%:Acc_Service_Operate%></th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><%:Acc_Service%></td>
|
||||||
|
<td id="acc_service_state_cell"><%:Acc_Service_Status%></td>
|
||||||
|
<td id="acc_service_state_button"><%:Acc_Service_Operate%></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<!-- acc catalog state -->
|
||||||
|
<fieldset class="cbi-section">
|
||||||
|
<legend><%:Acc Catalog State%></legend>
|
||||||
|
<table class="cbi-section-table" id="acc_catalog_state_table">
|
||||||
|
<tr class="cbi-section-table-title">
|
||||||
|
<th class="cbi-section-table-cell"><%:Acc_Catalog%></th>
|
||||||
|
<th class="cbi-section-table-cell"><%:Acc_Catalog_Status%></th>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript">//<![CDATA[
|
||||||
|
// start acc service
|
||||||
|
function start_acc_service() {
|
||||||
|
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "acc", "start_acc_service")%>', null, function(x) {});
|
||||||
|
}
|
||||||
|
// start acc service
|
||||||
|
function stop_acc_service() {
|
||||||
|
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "acc", "stop_acc_service")%>', null, function(x) {});
|
||||||
|
}
|
||||||
|
|
||||||
|
XHR.poll(5, '<%=url('admin/services/acc/status')%>', null, function(x, st) {
|
||||||
|
var service_cell = document.getElementById("acc_service_state_cell");
|
||||||
|
var button_cell = document.getElementById("acc_service_state_button");
|
||||||
|
if (st && service_cell && button_cell) {
|
||||||
|
service_cell.innerHTML = st["service"];
|
||||||
|
if (st["service"] == "Acc Service Enabled" || st["service"] == "已启动" || st["service"] == "加速服务已启动")
|
||||||
|
button_cell.innerHTML = '<input type="button" class="btn cbi-button cbi-button-apply" value="<%:Stop Acc Service%>" onclick="return stop_acc_service()"/>';
|
||||||
|
else
|
||||||
|
button_cell.innerHTML = '<input type="button" class="btn cbi-button cbi-button-apply" value="<%:Start Acc Service%>" onclick="return start_acc_service()"/>';
|
||||||
|
}
|
||||||
|
var catalog_table = document.getElementById("acc_catalog_state_table");
|
||||||
|
if (st && catalog_table) {
|
||||||
|
while(catalog_table.rows.length > 1)
|
||||||
|
catalog_table.deleteRow(1);
|
||||||
|
var status_map = st["state"];
|
||||||
|
for (var typ in status_map) {
|
||||||
|
var tr = catalog_table.insertRow(-1);
|
||||||
|
tr.insertCell(-1).innerHTML = typ;
|
||||||
|
tr.insertCell(-1).innerHTML = status_map[typ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//]]></script>
|
123
lede/package/lean/luci-app-leigod-acc/po/zh-cn/leigo-acc.po
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
|
||||||
|
msgid "Leigod Acc"
|
||||||
|
msgstr "雷神加速器"
|
||||||
|
|
||||||
|
msgid "Leigod Service"
|
||||||
|
msgstr "服务控制"
|
||||||
|
|
||||||
|
msgid "Leigod Device"
|
||||||
|
msgstr "设备管理"
|
||||||
|
|
||||||
|
msgid "Leigod Notice"
|
||||||
|
msgstr "加速公告"
|
||||||
|
|
||||||
|
msgid "Leigod Accelerator Config"
|
||||||
|
msgstr "加速器配置"
|
||||||
|
|
||||||
|
msgid "Control Accelerator Config"
|
||||||
|
msgstr "控制加速配置选项"
|
||||||
|
|
||||||
|
msgid "Acc_Service_Name"
|
||||||
|
msgstr "服务名称"
|
||||||
|
|
||||||
|
msgid "Acc_Service_Status"
|
||||||
|
msgstr "启动状态"
|
||||||
|
|
||||||
|
msgid "Acc_Service_Operate"
|
||||||
|
msgstr "加速设置"
|
||||||
|
|
||||||
|
msgid "Acc Catalog State"
|
||||||
|
msgstr "加速状态"
|
||||||
|
|
||||||
|
msgid "Acc_Catalog"
|
||||||
|
msgstr "加速设备"
|
||||||
|
|
||||||
|
msgid "Acc_Catalog_Status"
|
||||||
|
msgstr "加速状态"
|
||||||
|
|
||||||
|
msgid "Declare"
|
||||||
|
msgstr "说明"
|
||||||
|
|
||||||
|
msgid "Upgrade Info"
|
||||||
|
msgstr "更新内容"
|
||||||
|
|
||||||
|
msgid "Install Dependence"
|
||||||
|
msgstr "安装依赖"
|
||||||
|
|
||||||
|
msgid "Bridge Mode"
|
||||||
|
msgstr "旁路由模式"
|
||||||
|
|
||||||
|
msgid "Acc Mode"
|
||||||
|
msgstr "加速模式"
|
||||||
|
|
||||||
|
msgid "Acc Usage"
|
||||||
|
msgstr "使用说明"
|
||||||
|
|
||||||
|
msgid "Leigod Accelerator Usage"
|
||||||
|
msgstr "雷神加速插件使用"
|
||||||
|
|
||||||
|
msgid "Leigod Device Config"
|
||||||
|
msgstr "设备管理配置"
|
||||||
|
|
||||||
|
msgid "Control Device Config"
|
||||||
|
msgstr "控制和改变设备类型"
|
||||||
|
|
||||||
|
msgid "Neigh Device"
|
||||||
|
msgstr "路由设置"
|
||||||
|
|
||||||
|
msgid "acc interface"
|
||||||
|
msgstr "代理接口"
|
||||||
|
|
||||||
|
msgid "Device Info"
|
||||||
|
msgstr "设备信息"
|
||||||
|
|
||||||
|
msgid "None_Catalog"
|
||||||
|
msgstr "未分类设备"
|
||||||
|
|
||||||
|
msgid "Phone_Catalog"
|
||||||
|
msgstr "手机设备"
|
||||||
|
|
||||||
|
msgid "None_Catalog"
|
||||||
|
msgstr "未分类设备"
|
||||||
|
|
||||||
|
msgid "None"
|
||||||
|
msgstr "无数据"
|
||||||
|
|
||||||
|
msgid "PC_Catalog"
|
||||||
|
msgstr "PC 设备"
|
||||||
|
|
||||||
|
msgid "Game_Catalog"
|
||||||
|
msgstr "游戏机"
|
||||||
|
|
||||||
|
msgid "VR_Catalog"
|
||||||
|
msgstr "VR 设备"
|
||||||
|
|
||||||
|
msgid "Unknown_Catalog"
|
||||||
|
msgstr "未识别设备"
|
||||||
|
|
||||||
|
msgid "acc_service"
|
||||||
|
msgstr "雷神加速器服务"
|
||||||
|
|
||||||
|
msgid "Acc_Service"
|
||||||
|
msgstr "雷神加速器服务"
|
||||||
|
|
||||||
|
msgid "Stop Acc Service"
|
||||||
|
msgstr "停止加速服务"
|
||||||
|
|
||||||
|
msgid "Start Acc Service"
|
||||||
|
msgstr "启动加速服务"
|
||||||
|
|
||||||
|
msgid "Acc Service Disabled"
|
||||||
|
msgstr "加速服务已被禁用"
|
||||||
|
|
||||||
|
msgid "Acc Service Enabled"
|
||||||
|
msgstr "已启动"
|
||||||
|
|
||||||
|
msgid "Acc Catalog Started"
|
||||||
|
msgstr "该设备类别加速已启用"
|
||||||
|
|
||||||
|
msgid "Acc Catalog Stopped"
|
||||||
|
msgstr "该设备类别加速已停止"
|
||||||
|
|
||||||
|
msgid "Acc Catalog Paused"
|
||||||
|
msgstr "该设备类别加速已暂停"
|
@@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
config system 'base'
|
||||||
|
option url 'https://opapi.nn.com/speed/router/plug/check'
|
||||||
|
option heart 'https://opapi.nn.com/speed/router/heartbeat'
|
||||||
|
option base_url 'https://opapi.nn.com/speed'
|
||||||
|
|
||||||
|
config bind 'bind'
|
||||||
|
|
||||||
|
config hardware 'device'
|
||||||
|
|
||||||
|
config acceleration 'Phone'
|
||||||
|
|
||||||
|
config acceleration 'PC'
|
||||||
|
|
||||||
|
config acceleration 'Game'
|
||||||
|
|
||||||
|
config acceleration 'Unknown'
|
||||||
|
|
162
lede/package/lean/luci-app-leigod-acc/root/etc/init.d/acc
Executable file
@@ -0,0 +1,162 @@
|
|||||||
|
#!/bin/sh /etc/rc.common
|
||||||
|
|
||||||
|
# start prio
|
||||||
|
START=50
|
||||||
|
# use proc to start service
|
||||||
|
USE_PROCD=1
|
||||||
|
# package name
|
||||||
|
PACKAGE_NAME="acc.ipk"
|
||||||
|
# binary dir
|
||||||
|
sbin_dir="/usr/sbin/leigod"
|
||||||
|
# binary name
|
||||||
|
binary_prefix="acc-gw.linux"
|
||||||
|
|
||||||
|
|
||||||
|
# download acceleration binary
|
||||||
|
download_acc_binary() {
|
||||||
|
echo "begin to download file... ..."
|
||||||
|
# create download
|
||||||
|
local url="http://119.3.40.126/${PACKAGE_NAME}"
|
||||||
|
echo "download path: ${url}"
|
||||||
|
local path="/tmp/${PACKAGE_NAME}"
|
||||||
|
local code=$(curl --connect-timeout 2 -L -s -k -o "${path}" -w "%{http_code}" "${url}")
|
||||||
|
for i in $(seq 1 2)
|
||||||
|
do
|
||||||
|
if [ "$?" != "0" -o "${code}" != "200" -o ! -f "${path}" ]; then
|
||||||
|
echo "download failed: ${code}"
|
||||||
|
rm -f ${path}
|
||||||
|
sleep 5
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "download success"
|
||||||
|
break
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "download file success... ..."
|
||||||
|
}
|
||||||
|
|
||||||
|
# mkdir acc dir
|
||||||
|
mk_acc_dir() {
|
||||||
|
echo "begin to mkdir... ..."
|
||||||
|
# should make sure dir exist
|
||||||
|
local cmd="mkdir -p ${BINARY_DIR}"
|
||||||
|
echo "exec mkdir dir: ${cmd}"
|
||||||
|
local code=`$cmd`
|
||||||
|
echo "mkdir success... ..."
|
||||||
|
}
|
||||||
|
|
||||||
|
# decompress file
|
||||||
|
decompress_file() {
|
||||||
|
echo "begin to decompress file... ..."
|
||||||
|
# compress file path
|
||||||
|
local path="/tmp/${PACKAGE_NAME}"
|
||||||
|
# decompress command
|
||||||
|
local cmd="tar -zxvf ${path} -C ${BINARY_DIR}"
|
||||||
|
local code=`${cmd}`
|
||||||
|
echo "decompress file success... ..."
|
||||||
|
}
|
||||||
|
|
||||||
|
# install ipk
|
||||||
|
install_package() {
|
||||||
|
echo "begin to overwrite package"
|
||||||
|
# local cmd = "opkg install /tmp/${PACKAGE_NAME} --force-overwrite"
|
||||||
|
# `$cmd`
|
||||||
|
echo "overwrite finish, begin to start"
|
||||||
|
}
|
||||||
|
|
||||||
|
# main
|
||||||
|
prepare_env() {
|
||||||
|
# mkdir
|
||||||
|
mk_acc_dir
|
||||||
|
# download file
|
||||||
|
download_acc_binary
|
||||||
|
# decompress file
|
||||||
|
install_package
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
prepare_env
|
||||||
|
}
|
||||||
|
|
||||||
|
# get_device_arch,
|
||||||
|
# current support arch: arm64 arm x86_64 mips
|
||||||
|
get_device_arch() {
|
||||||
|
arch=$(uname -m)
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "arch cant be get"
|
||||||
|
return -1
|
||||||
|
fi
|
||||||
|
# fix arch
|
||||||
|
if [ ${arch} == "x86_64" ]; then
|
||||||
|
echo "match x86_64 -> amd64"
|
||||||
|
arch="amd64"
|
||||||
|
elif [ ${arch} == "aarch64" ]; then
|
||||||
|
echo "match aarch64 -> arm64"
|
||||||
|
arch="arm64"
|
||||||
|
elif [ ${arch} == "mips" ]; then
|
||||||
|
echo "match mips -> mipsle"
|
||||||
|
arch="mipsle"
|
||||||
|
elif [ ${arch} == "armv7l" ]; then
|
||||||
|
echo "match armv7l -> arm"
|
||||||
|
arch="arm"
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# get_xiaomi_name check if is xiaomi
|
||||||
|
get_xiaomi_name() {
|
||||||
|
local name=$(uci get misc.hardware.displayName)
|
||||||
|
if [[ $? == "0" && ${name} != "" ]]; then
|
||||||
|
echo "router is xiaomi series, name: ${name}"
|
||||||
|
sbin_dir="/userdisk/appdata/leigod"
|
||||||
|
init_dir="/userdisk/appdata/leigod"
|
||||||
|
args="--mode tun"
|
||||||
|
is_xiaomi=true
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
local name=$(uci get misc.hardware.model)
|
||||||
|
if [[ $? == "0" && ${name} != "" ]]; then
|
||||||
|
echo "router is xiaomi series, name: ${name}"
|
||||||
|
sbin_dir="/userdisk/appdata/leigod"
|
||||||
|
init_dir="/userdisk/appdata/leigod"
|
||||||
|
args="--mode tun"
|
||||||
|
is_xiaomi=true
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
echo "router is not xiaomi, use general openwrt"
|
||||||
|
sbin_dir="/usr/sbin/leigod"
|
||||||
|
init_dir="/etc/init.d"
|
||||||
|
show_openwrt_suggestion
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# run service as daemon
|
||||||
|
start_service_daemon() {
|
||||||
|
# open once instance
|
||||||
|
procd_open_instance
|
||||||
|
# run binary
|
||||||
|
local cmd="${sbin_dir}/${binary_prefix}.${arch} ${args}"
|
||||||
|
echo "start service: ${cmd}"
|
||||||
|
procd_set_param command ${cmd}
|
||||||
|
# auto start when failed
|
||||||
|
procd_set_param respawn
|
||||||
|
# close instance
|
||||||
|
procd_close_instance
|
||||||
|
# start check update
|
||||||
|
# update_plugin &
|
||||||
|
# start led light
|
||||||
|
# /etc/init.d/internetled start
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# proc start service
|
||||||
|
start_service() {
|
||||||
|
# prepare env
|
||||||
|
# prepare_env
|
||||||
|
# run service as daemon
|
||||||
|
get_device_arch
|
||||||
|
get_xiaomi_name
|
||||||
|
start_service_daemon
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# check if file exist
|
||||||
|
if [ ! -f /etc/config/accelerator ]; then
|
||||||
|
echo "file not exist, should create..."
|
||||||
|
touch /etc/config/accelerator
|
||||||
|
uci set accelerator.base=system
|
||||||
|
uci set accelerator.device=hardware
|
||||||
|
uci set accelerator.Phone=acceleration
|
||||||
|
uci set accelerator.PC=acceleration
|
||||||
|
uci set accelerator.Game=acceleration
|
||||||
|
uci set accelerator.Unknown=acceleration
|
||||||
|
uci commit accelerator
|
||||||
|
fi
|
||||||
|
|
||||||
|
uci set accelerator.base.url='https://opapi.nn.com/speed/router/plug/check'
|
||||||
|
uci set accelerator.base.heart='https://opapi.nn.com/speed/router/heartbeat'
|
||||||
|
uci set accelerator.base.base_url='https://opapi.nn.com/speed'
|
||||||
|
uci commit accelerator
|
||||||
|
|
||||||
|
echo "Fistboot Disable "
|
||||||
|
|
||||||
|
/etc/init.d/acc stop
|
||||||
|
/etc/init.d/acc disable
|
@@ -16,14 +16,16 @@
|
|||||||
package congestion
|
package congestion
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/enfein/mieru/pkg/mathext"
|
"github.com/enfein/mieru/pkg/mathext"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
InfiniteBandwidth int64 = math.MaxInt64
|
infiniteBandwidth int64 = math.MaxInt64
|
||||||
)
|
)
|
||||||
|
|
||||||
// BandwidthSample contains a single data point of network bandwidth.
|
// BandwidthSample contains a single data point of network bandwidth.
|
||||||
@@ -41,6 +43,10 @@ type BandwidthSample struct {
|
|||||||
isAppLimited bool
|
isAppLimited bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (bs BandwidthSample) String() string {
|
||||||
|
return fmt.Sprintf("BandwidthSample{bandwidth=%v, rtt=%v, isAppLimited=%v}", bs.bandwidth, bs.rtt.Truncate(time.Microsecond), bs.isAppLimited)
|
||||||
|
}
|
||||||
|
|
||||||
// BandwidthSamplerInterface is an interface common to any class that can
|
// BandwidthSamplerInterface is an interface common to any class that can
|
||||||
// provide bandwidth samples from the information per individual acknowledged packet.
|
// provide bandwidth samples from the information per individual acknowledged packet.
|
||||||
type BandwidthSamplerInterface interface {
|
type BandwidthSamplerInterface interface {
|
||||||
@@ -109,7 +115,7 @@ func NewConnectionStateOnSentPacketFromSampler(sendTime time.Time, size int64, s
|
|||||||
totalBytesSentAtLastAckedPacket: sampler.totalBytesSentAtLastAckedPacket,
|
totalBytesSentAtLastAckedPacket: sampler.totalBytesSentAtLastAckedPacket,
|
||||||
lastAckedPacketSentTime: sampler.lastAckedPacketSentTime,
|
lastAckedPacketSentTime: sampler.lastAckedPacketSentTime,
|
||||||
lastAckedPacketAckTime: sampler.lastAckedPacketAckTime,
|
lastAckedPacketAckTime: sampler.lastAckedPacketAckTime,
|
||||||
totalBytesAckedAtTheLastAckedPacket: sampler.totalBytesSentAtLastAckedPacket,
|
totalBytesAckedAtTheLastAckedPacket: sampler.totalBytesAcked,
|
||||||
isAppLimited: sampler.isAppLimited,
|
isAppLimited: sampler.isAppLimited,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -197,6 +203,7 @@ func NewConnectionStateOnSentPacketFromSampler(sendTime time.Time, size int64, s
|
|||||||
// Note that while the scenario above is not the only scenario when the
|
// Note that while the scenario above is not the only scenario when the
|
||||||
// connection is app-limited, the approach works in other cases too.
|
// connection is app-limited, the approach works in other cases too.
|
||||||
type BandwidthSampler struct {
|
type BandwidthSampler struct {
|
||||||
|
mu sync.Mutex
|
||||||
totalBytesSent int64
|
totalBytesSent int64
|
||||||
totalBytesAcked int64
|
totalBytesAcked int64
|
||||||
totalBytesSentAtLastAckedPacket int64
|
totalBytesSentAtLastAckedPacket int64
|
||||||
@@ -217,6 +224,9 @@ func NewBandwidthSampler() BandwidthSamplerInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (bs *BandwidthSampler) OnPacketSent(sentTime time.Time, packetNumber int64, bytes int64, bytesInFlight int64, hasRetransmittableData bool) {
|
func (bs *BandwidthSampler) OnPacketSent(sentTime time.Time, packetNumber int64, bytes int64, bytesInFlight int64, hasRetransmittableData bool) {
|
||||||
|
bs.mu.Lock()
|
||||||
|
defer bs.mu.Unlock()
|
||||||
|
|
||||||
bs.lastSentPacket = packetNumber
|
bs.lastSentPacket = packetNumber
|
||||||
if !hasRetransmittableData {
|
if !hasRetransmittableData {
|
||||||
return
|
return
|
||||||
@@ -242,6 +252,9 @@ func (bs *BandwidthSampler) OnPacketSent(sentTime time.Time, packetNumber int64,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (bs *BandwidthSampler) OnPacketAcknowledged(ackTime time.Time, packetNumber int64) BandwidthSample {
|
func (bs *BandwidthSampler) OnPacketAcknowledged(ackTime time.Time, packetNumber int64) BandwidthSample {
|
||||||
|
bs.mu.Lock()
|
||||||
|
defer bs.mu.Unlock()
|
||||||
|
|
||||||
sentPacket := bs.connectionStateMap.GetEntry(packetNumber)
|
sentPacket := bs.connectionStateMap.GetEntry(packetNumber)
|
||||||
if sentPacket == nil {
|
if sentPacket == nil {
|
||||||
return BandwidthSample{}
|
return BandwidthSample{}
|
||||||
@@ -253,29 +266,44 @@ func (bs *BandwidthSampler) OnPacketAcknowledged(ackTime time.Time, packetNumber
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (bs *BandwidthSampler) OnPacketLost(packetNumber int64) {
|
func (bs *BandwidthSampler) OnPacketLost(packetNumber int64) {
|
||||||
|
bs.mu.Lock()
|
||||||
|
defer bs.mu.Unlock()
|
||||||
|
|
||||||
bs.connectionStateMap.Remove(packetNumber)
|
bs.connectionStateMap.Remove(packetNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bs *BandwidthSampler) OnAppLimited() {
|
func (bs *BandwidthSampler) OnAppLimited() {
|
||||||
|
bs.mu.Lock()
|
||||||
|
defer bs.mu.Unlock()
|
||||||
|
|
||||||
bs.isAppLimited = true
|
bs.isAppLimited = true
|
||||||
bs.endOfAppLimitedPhase = bs.lastSentPacket
|
bs.endOfAppLimitedPhase = bs.lastSentPacket
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bs *BandwidthSampler) RemoveObsoletePackets(leastUnacked int64) {
|
func (bs *BandwidthSampler) RemoveObsoletePackets(leastUnacked int64) {
|
||||||
|
bs.mu.Lock()
|
||||||
|
defer bs.mu.Unlock()
|
||||||
|
|
||||||
for !bs.connectionStateMap.IsEmpty() && bs.connectionStateMap.FirstPacket() < leastUnacked {
|
for !bs.connectionStateMap.IsEmpty() && bs.connectionStateMap.FirstPacket() < leastUnacked {
|
||||||
bs.connectionStateMap.Remove(bs.connectionStateMap.FirstPacket())
|
bs.connectionStateMap.Remove(bs.connectionStateMap.FirstPacket())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bs *BandwidthSampler) TotalBytesAcked() int64 {
|
func (bs *BandwidthSampler) TotalBytesAcked() int64 {
|
||||||
|
bs.mu.Lock()
|
||||||
|
defer bs.mu.Unlock()
|
||||||
return bs.totalBytesAcked
|
return bs.totalBytesAcked
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bs *BandwidthSampler) IsAppLimited() bool {
|
func (bs *BandwidthSampler) IsAppLimited() bool {
|
||||||
|
bs.mu.Lock()
|
||||||
|
defer bs.mu.Unlock()
|
||||||
return bs.isAppLimited
|
return bs.isAppLimited
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bs *BandwidthSampler) EndOfAppLimitedPhase() int64 {
|
func (bs *BandwidthSampler) EndOfAppLimitedPhase() int64 {
|
||||||
|
bs.mu.Lock()
|
||||||
|
defer bs.mu.Unlock()
|
||||||
return bs.endOfAppLimitedPhase
|
return bs.endOfAppLimitedPhase
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -300,9 +328,9 @@ func (bs *BandwidthSampler) onPacketAcknowledgedInner(ackTime time.Time, packetN
|
|||||||
|
|
||||||
// Infinite rate indicates that the sampler is supposed to discard the
|
// Infinite rate indicates that the sampler is supposed to discard the
|
||||||
// current send rate sample and use only the ack rate.
|
// current send rate sample and use only the ack rate.
|
||||||
sendRate := InfiniteBandwidth
|
sendRate := infiniteBandwidth
|
||||||
if sentPacket.sentTime.After(sentPacket.lastAckedPacketSentTime) {
|
if sentPacket.sentTime.After(sentPacket.lastAckedPacketSentTime) {
|
||||||
sendRate = bandwidthFromBytesAndTimeDelta(sentPacket.totalBytesSent-sentPacket.totalBytesSentAtLastAckedPacket, sentPacket.sentTime.Sub(sentPacket.lastAckedPacketSentTime))
|
sendRate = BandwidthFromBytesAndTimeDelta(sentPacket.totalBytesSent-sentPacket.totalBytesSentAtLastAckedPacket, sentPacket.sentTime.Sub(sentPacket.lastAckedPacketSentTime))
|
||||||
}
|
}
|
||||||
|
|
||||||
// During the slope calculation, ensure that ack time of the current packet is
|
// During the slope calculation, ensure that ack time of the current packet is
|
||||||
@@ -311,7 +339,7 @@ func (bs *BandwidthSampler) onPacketAcknowledgedInner(ackTime time.Time, packetN
|
|||||||
if !ackTime.After(sentPacket.lastAckedPacketAckTime) {
|
if !ackTime.After(sentPacket.lastAckedPacketAckTime) {
|
||||||
return BandwidthSample{}
|
return BandwidthSample{}
|
||||||
}
|
}
|
||||||
ackRate := bandwidthFromBytesAndTimeDelta(bs.totalBytesAcked-sentPacket.totalBytesAckedAtTheLastAckedPacket, ackTime.Sub(sentPacket.lastAckedPacketAckTime))
|
ackRate := BandwidthFromBytesAndTimeDelta(bs.totalBytesAcked-sentPacket.totalBytesAckedAtTheLastAckedPacket, ackTime.Sub(sentPacket.lastAckedPacketAckTime))
|
||||||
|
|
||||||
sample := BandwidthSample{
|
sample := BandwidthSample{
|
||||||
bandwidth: mathext.Min(sendRate, ackRate),
|
bandwidth: mathext.Min(sendRate, ackRate),
|
||||||
@@ -321,7 +349,7 @@ func (bs *BandwidthSampler) onPacketAcknowledgedInner(ackTime time.Time, packetN
|
|||||||
return sample
|
return sample
|
||||||
}
|
}
|
||||||
|
|
||||||
func bandwidthFromBytesAndTimeDelta(bytes int64, duration time.Duration) int64 {
|
func BandwidthFromBytesAndTimeDelta(bytes int64, duration time.Duration) int64 {
|
||||||
if duration <= 0 {
|
if duration <= 0 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
@@ -17,8 +17,10 @@ package congestion
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
mrand "math/rand"
|
mrand "math/rand"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/enfein/mieru/pkg/log"
|
||||||
"github.com/enfein/mieru/pkg/mathext"
|
"github.com/enfein/mieru/pkg/mathext"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -114,17 +116,22 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type AckedPacketInfo struct {
|
type AckedPacketInfo struct {
|
||||||
packetNumber int64
|
PacketNumber int64
|
||||||
bytesAcked int64
|
BytesAcked int64
|
||||||
receiveTimestamp time.Time
|
ReceiveTimestamp time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
type LostPacketInfo struct {
|
type LostPacketInfo struct {
|
||||||
packetNumber int64
|
PacketNumber int64
|
||||||
bytesLost int64
|
BytesLost int64
|
||||||
}
|
}
|
||||||
|
|
||||||
type BBRSender struct {
|
type BBRSender struct {
|
||||||
|
mu sync.Mutex
|
||||||
|
|
||||||
|
// Additional context of this BBRSender. Used in the log.
|
||||||
|
logContext string
|
||||||
|
|
||||||
rttStats *RTTStats
|
rttStats *RTTStats
|
||||||
|
|
||||||
// Replaces unacked_packets_->bytes_in_flight().
|
// Replaces unacked_packets_->bytes_in_flight().
|
||||||
@@ -283,8 +290,9 @@ type BBRSender struct {
|
|||||||
minRTTSinceLastProbeRTT time.Duration
|
minRTTSinceLastProbeRTT time.Duration
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewBBRSender() *BBRSender {
|
func NewBBRSender(logContext string) *BBRSender {
|
||||||
return &BBRSender{
|
return &BBRSender{
|
||||||
|
logContext: logContext,
|
||||||
rttStats: NewRTTStats(),
|
rttStats: NewRTTStats(),
|
||||||
mode: modeStartUp,
|
mode: modeStartUp,
|
||||||
sampler: NewBandwidthSampler(),
|
sampler: NewBandwidthSampler(),
|
||||||
@@ -318,6 +326,9 @@ func (b *BBRSender) InSlowStart() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *BBRSender) OnPacketSent(sentTime time.Time, bytesInFlight int64, packetNumber int64, bytes int64, hasRetransmittableData bool) {
|
func (b *BBRSender) OnPacketSent(sentTime time.Time, bytesInFlight int64, packetNumber int64, bytes int64, hasRetransmittableData bool) {
|
||||||
|
b.mu.Lock()
|
||||||
|
defer b.mu.Unlock()
|
||||||
|
|
||||||
b.lastSentPacket = packetNumber
|
b.lastSentPacket = packetNumber
|
||||||
b.bytesInFlight = bytesInFlight
|
b.bytesInFlight = bytesInFlight
|
||||||
|
|
||||||
@@ -333,12 +344,14 @@ func (b *BBRSender) OnPacketSent(sentTime time.Time, bytesInFlight int64, packet
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *BBRSender) CanSend(bytesInFlight int64) bool {
|
func (b *BBRSender) CanSend(bytesInFlight int64) bool {
|
||||||
|
b.mu.Lock()
|
||||||
|
defer b.mu.Unlock()
|
||||||
return bytesInFlight < b.GetCongestionWindow()
|
return bytesInFlight < b.GetCongestionWindow()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *BBRSender) PacingRate(bytesInFlight int64) int64 {
|
func (b *BBRSender) PacingRate(bytesInFlight int64) int64 {
|
||||||
if b.pacingRate <= 0 {
|
if b.pacingRate <= 0 {
|
||||||
return int64(highGain * float64(bandwidthFromBytesAndTimeDelta(b.initialCongestionWindow, b.GetMinRTT())))
|
return int64(highGain * float64(BandwidthFromBytesAndTimeDelta(b.initialCongestionWindow, b.GetMinRTT())))
|
||||||
}
|
}
|
||||||
return b.pacingRate
|
return b.pacingRate
|
||||||
}
|
}
|
||||||
@@ -359,10 +372,6 @@ func (b *BBRSender) GetCongestionWindow() int64 {
|
|||||||
return b.congestionWindow
|
return b.congestionWindow
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *BBRSender) GetSlowStartThreshold() int64 {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *BBRSender) InRecovery() bool {
|
func (b *BBRSender) InRecovery() bool {
|
||||||
return b.recoveryState != stateNotInRecovery
|
return b.recoveryState != stateNotInRecovery
|
||||||
}
|
}
|
||||||
@@ -381,16 +390,19 @@ func (b *BBRSender) AdjustNetworkParameters(bandwidth int64, rtt time.Duration)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *BBRSender) OnCongestionEvent(priorInFlight int64, eventTime time.Time, ackedPackets []AckedPacketInfo, lostPackets []LostPacketInfo) {
|
func (b *BBRSender) OnCongestionEvent(priorInFlight int64, eventTime time.Time, ackedPackets []AckedPacketInfo, lostPackets []LostPacketInfo) {
|
||||||
|
b.mu.Lock()
|
||||||
|
defer b.mu.Unlock()
|
||||||
|
|
||||||
totalBytesAckedBefore := b.sampler.TotalBytesAcked()
|
totalBytesAckedBefore := b.sampler.TotalBytesAcked()
|
||||||
isRoundStart := false
|
isRoundStart := false
|
||||||
isMinRTTExpired := false
|
isMinRTTExpired := false
|
||||||
|
|
||||||
b.bytesInFlight = priorInFlight
|
b.bytesInFlight = priorInFlight
|
||||||
for _, p := range ackedPackets {
|
for _, p := range ackedPackets {
|
||||||
b.bytesInFlight -= p.bytesAcked
|
b.bytesInFlight -= p.BytesAcked
|
||||||
}
|
}
|
||||||
for _, p := range lostPackets {
|
for _, p := range lostPackets {
|
||||||
b.bytesInFlight -= p.bytesLost
|
b.bytesInFlight -= p.BytesLost
|
||||||
}
|
}
|
||||||
b.bytesInFlight = mathext.Max(b.bytesInFlight, 0)
|
b.bytesInFlight = mathext.Max(b.bytesInFlight, 0)
|
||||||
|
|
||||||
@@ -398,7 +410,7 @@ func (b *BBRSender) OnCongestionEvent(priorInFlight int64, eventTime time.Time,
|
|||||||
|
|
||||||
// Input the new data into the BBR model of the connection.
|
// Input the new data into the BBR model of the connection.
|
||||||
if len(ackedPackets) > 0 {
|
if len(ackedPackets) > 0 {
|
||||||
lastAckedPacket := ackedPackets[len(ackedPackets)-1].packetNumber
|
lastAckedPacket := ackedPackets[len(ackedPackets)-1].PacketNumber
|
||||||
isRoundStart = b.UpdateRoundTripCounter(lastAckedPacket)
|
isRoundStart = b.UpdateRoundTripCounter(lastAckedPacket)
|
||||||
isMinRTTExpired = b.UpdateBandwidthAndMinRTT(eventTime, ackedPackets)
|
isMinRTTExpired = b.UpdateBandwidthAndMinRTT(eventTime, ackedPackets)
|
||||||
b.UpdateRecoveryState(lastAckedPacket, len(lostPackets) > 0, isRoundStart)
|
b.UpdateRecoveryState(lastAckedPacket, len(lostPackets) > 0, isRoundStart)
|
||||||
@@ -433,7 +445,7 @@ func (b *BBRSender) OnCongestionEvent(priorInFlight int64, eventTime time.Time,
|
|||||||
bytesAcked := b.sampler.TotalBytesAcked() - totalBytesAckedBefore
|
bytesAcked := b.sampler.TotalBytesAcked() - totalBytesAckedBefore
|
||||||
var bytesLost int64
|
var bytesLost int64
|
||||||
for _, lost := range lostPackets {
|
for _, lost := range lostPackets {
|
||||||
bytesLost += lost.bytesLost
|
bytesLost += lost.BytesLost
|
||||||
}
|
}
|
||||||
|
|
||||||
// After the model is updated, recalculate the pacing rate and congestion
|
// After the model is updated, recalculate the pacing rate and congestion
|
||||||
@@ -449,9 +461,9 @@ func (b *BBRSender) OnCongestionEvent(priorInFlight int64, eventTime time.Time,
|
|||||||
// no more than 2 packets.
|
// no more than 2 packets.
|
||||||
var leastUnacked int64
|
var leastUnacked int64
|
||||||
if len(ackedPackets) > 0 {
|
if len(ackedPackets) > 0 {
|
||||||
leastUnacked = ackedPackets[len(ackedPackets)-1].packetNumber - 2
|
leastUnacked = ackedPackets[len(ackedPackets)-1].PacketNumber - 2
|
||||||
} else if len(lostPackets) > 0 {
|
} else if len(lostPackets) > 0 {
|
||||||
leastUnacked = lostPackets[len(lostPackets)-1].packetNumber + 1
|
leastUnacked = lostPackets[len(lostPackets)-1].PacketNumber + 1
|
||||||
}
|
}
|
||||||
b.sampler.RemoveObsoletePackets(leastUnacked)
|
b.sampler.RemoveObsoletePackets(leastUnacked)
|
||||||
}
|
}
|
||||||
@@ -505,7 +517,7 @@ func (b *BBRSender) EnterProbeBandwidthMode(now time.Time) {
|
|||||||
|
|
||||||
func (b *BBRSender) DiscardLostPackets(lostPackets []LostPacketInfo) {
|
func (b *BBRSender) DiscardLostPackets(lostPackets []LostPacketInfo) {
|
||||||
for _, lost := range lostPackets {
|
for _, lost := range lostPackets {
|
||||||
b.sampler.OnPacketLost(lost.packetNumber)
|
b.sampler.OnPacketLost(lost.PacketNumber)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -521,7 +533,14 @@ func (b *BBRSender) UpdateRoundTripCounter(lastAckedPacket int64) bool {
|
|||||||
func (b *BBRSender) UpdateBandwidthAndMinRTT(now time.Time, ackedPackets []AckedPacketInfo) bool {
|
func (b *BBRSender) UpdateBandwidthAndMinRTT(now time.Time, ackedPackets []AckedPacketInfo) bool {
|
||||||
sampleMinRTT := infDuration
|
sampleMinRTT := infDuration
|
||||||
for _, acked := range ackedPackets {
|
for _, acked := range ackedPackets {
|
||||||
bandwidthSample := b.sampler.OnPacketAcknowledged(now, acked.packetNumber)
|
bandwidthSample := b.sampler.OnPacketAcknowledged(now, acked.PacketNumber)
|
||||||
|
if log.IsLevelEnabled(log.TraceLevel) {
|
||||||
|
log.Tracef("[BBRSender %s] Acknowledged packet %d produced %v", b.logContext, acked.PacketNumber, bandwidthSample)
|
||||||
|
}
|
||||||
|
if bandwidthSample.bandwidth < 0 {
|
||||||
|
log.Debugf("[BBRSender %s] Acknowledged packet %d produced negative bandwidth %d B/s. Sample is dropped.", b.logContext, acked.PacketNumber, bandwidthSample.bandwidth)
|
||||||
|
continue
|
||||||
|
}
|
||||||
b.lastSampleIsAppLimited = bandwidthSample.isAppLimited
|
b.lastSampleIsAppLimited = bandwidthSample.isAppLimited
|
||||||
if bandwidthSample.rtt > 0 {
|
if bandwidthSample.rtt > 0 {
|
||||||
sampleMinRTT = mathext.Min(sampleMinRTT, bandwidthSample.rtt)
|
sampleMinRTT = mathext.Min(sampleMinRTT, bandwidthSample.rtt)
|
||||||
@@ -739,7 +758,7 @@ func (b *BBRSender) CalculatePacingRate() {
|
|||||||
// Pace at the rate of initial window / RTT as soon as RTT measurements are
|
// Pace at the rate of initial window / RTT as soon as RTT measurements are
|
||||||
// available.
|
// available.
|
||||||
if b.pacingRate <= 0 && b.rttStats.MinRTT() > 0 {
|
if b.pacingRate <= 0 && b.rttStats.MinRTT() > 0 {
|
||||||
b.pacingRate = bandwidthFromBytesAndTimeDelta(b.initialCongestionWindow, b.rttStats.MinRTT())
|
b.pacingRate = BandwidthFromBytesAndTimeDelta(b.initialCongestionWindow, b.rttStats.MinRTT())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Slow the pacing rate in STARTUP once loss has ever been detected.
|
// Slow the pacing rate in STARTUP once loss has ever been detected.
|
||||||
|
148
mieru/pkg/congestion/bbr_sender_test.go
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
// Copyright (C) 2024 mieru authors
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
package congestion_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/binary"
|
||||||
|
"io"
|
||||||
|
"sync"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/enfein/mieru/pkg/congestion"
|
||||||
|
"github.com/enfein/mieru/pkg/log"
|
||||||
|
"github.com/enfein/mieru/pkg/testtool"
|
||||||
|
)
|
||||||
|
|
||||||
|
type sender struct {
|
||||||
|
ctx context.Context
|
||||||
|
rwc io.ReadWriteCloser
|
||||||
|
nextSend int64
|
||||||
|
nextAck int64
|
||||||
|
bbr *congestion.BBRSender
|
||||||
|
}
|
||||||
|
|
||||||
|
type receiver struct {
|
||||||
|
ctx context.Context
|
||||||
|
rwc io.ReadWriteCloser
|
||||||
|
ackSend uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *sender) Run(t *testing.T) {
|
||||||
|
t.Helper()
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
wg.Add(2)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
loop:
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-s.ctx.Done():
|
||||||
|
wg.Done()
|
||||||
|
break loop
|
||||||
|
default:
|
||||||
|
b := make([]byte, 8)
|
||||||
|
inFlight := (s.nextSend - s.nextAck) * 8
|
||||||
|
if s.bbr.CanSend(inFlight) {
|
||||||
|
binary.BigEndian.PutUint64(b, uint64(s.nextSend))
|
||||||
|
s.rwc.Write(b)
|
||||||
|
s.bbr.OnPacketSent(time.Now(), inFlight, s.nextSend, 8, true)
|
||||||
|
s.nextSend++
|
||||||
|
} else {
|
||||||
|
time.Sleep(time.Millisecond)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
loop:
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-s.ctx.Done():
|
||||||
|
wg.Done()
|
||||||
|
break loop
|
||||||
|
default:
|
||||||
|
b := make([]byte, 8)
|
||||||
|
inFlight := (s.nextSend - s.nextAck) * 8
|
||||||
|
if _, err := io.ReadFull(s.rwc, b); err != nil {
|
||||||
|
t.Logf("error read ack: %v", err)
|
||||||
|
time.Sleep(time.Millisecond)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
now := time.Now()
|
||||||
|
s.nextAck = int64(binary.BigEndian.Uint64(b))
|
||||||
|
s.bbr.OnCongestionEvent(inFlight, now, []congestion.AckedPacketInfo{{
|
||||||
|
PacketNumber: s.nextAck - 1,
|
||||||
|
BytesAcked: 8,
|
||||||
|
ReceiveTimestamp: now,
|
||||||
|
}}, nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
wg.Wait()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *receiver) Start(t *testing.T) {
|
||||||
|
t.Helper()
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-r.ctx.Done():
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
b := make([]byte, 8)
|
||||||
|
if _, err := io.ReadFull(r.rwc, b); err != nil {
|
||||||
|
t.Logf("error read data: %v", err)
|
||||||
|
time.Sleep(time.Millisecond)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
r.ackSend = binary.BigEndian.Uint64(b)
|
||||||
|
binary.BigEndian.PutUint64(b, r.ackSend+1)
|
||||||
|
if _, err := r.rwc.Write(b); err != nil {
|
||||||
|
t.Logf("error write ack: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBBRSender(t *testing.T) {
|
||||||
|
log.SetOutputToTest(t)
|
||||||
|
log.SetLevel("DEBUG")
|
||||||
|
|
||||||
|
e1, e2 := testtool.BufPipe()
|
||||||
|
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second))
|
||||||
|
defer cancel()
|
||||||
|
s := &sender{
|
||||||
|
ctx: ctx,
|
||||||
|
rwc: e1,
|
||||||
|
bbr: congestion.NewBBRSender("Test"),
|
||||||
|
}
|
||||||
|
r := &receiver{
|
||||||
|
ctx: ctx,
|
||||||
|
rwc: e2,
|
||||||
|
}
|
||||||
|
r.Start(t)
|
||||||
|
s.Run(t)
|
||||||
|
t.Logf("nextSend: %v", s.nextSend)
|
||||||
|
t.Logf("nextAck: %v", s.nextAck)
|
||||||
|
t.Logf("ackSend: %v", r.ackSend)
|
||||||
|
t.Logf("Estimated bandwidth: %d B/s", s.bbr.BandwidthEstimate())
|
||||||
|
}
|
@@ -15,7 +15,11 @@
|
|||||||
|
|
||||||
package congestion
|
package congestion
|
||||||
|
|
||||||
import "github.com/enfein/mieru/pkg/deque"
|
import (
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/enfein/mieru/pkg/deque"
|
||||||
|
)
|
||||||
|
|
||||||
// PacketNumberIndexedQueue is a queue of mostly continuous numbered entries
|
// PacketNumberIndexedQueue is a queue of mostly continuous numbered entries
|
||||||
// which supports the following operations:
|
// which supports the following operations:
|
||||||
@@ -39,6 +43,7 @@ import "github.com/enfein/mieru/pkg/deque"
|
|||||||
// Because of that, it is not a general-purpose container and should not be used
|
// Because of that, it is not a general-purpose container and should not be used
|
||||||
// as one.
|
// as one.
|
||||||
type PacketNumberIndexedQueue[T any] struct {
|
type PacketNumberIndexedQueue[T any] struct {
|
||||||
|
mu sync.Mutex
|
||||||
entries *deque.Deque[EntryWrapper[T]]
|
entries *deque.Deque[EntryWrapper[T]]
|
||||||
numberOfPresentEntries int
|
numberOfPresentEntries int
|
||||||
firstPacket int64
|
firstPacket int64
|
||||||
@@ -48,7 +53,7 @@ func NewPacketNumberIndexedQueue[T any]() *PacketNumberIndexedQueue[T] {
|
|||||||
return &PacketNumberIndexedQueue[T]{
|
return &PacketNumberIndexedQueue[T]{
|
||||||
entries: deque.New[EntryWrapper[T]](0),
|
entries: deque.New[EntryWrapper[T]](0),
|
||||||
numberOfPresentEntries: 0,
|
numberOfPresentEntries: 0,
|
||||||
firstPacket: 0,
|
firstPacket: -1,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,8 +67,11 @@ type EntryWrapper[T any] struct {
|
|||||||
// Returns the pointer to the entry in case of success, or nil if the entry
|
// Returns the pointer to the entry in case of success, or nil if the entry
|
||||||
// does not exist.
|
// does not exist.
|
||||||
func (p *PacketNumberIndexedQueue[T]) GetEntry(packetNumber int64) *T {
|
func (p *PacketNumberIndexedQueue[T]) GetEntry(packetNumber int64) *T {
|
||||||
entry := p.getEntryWrapper(packetNumber)
|
p.mu.Lock()
|
||||||
if entry == nil {
|
defer p.mu.Unlock()
|
||||||
|
|
||||||
|
entry, idx := p.getEntryWrapper(packetNumber)
|
||||||
|
if idx < 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return &entry.data
|
return &entry.data
|
||||||
@@ -74,7 +82,10 @@ func (p *PacketNumberIndexedQueue[T]) GetEntry(packetNumber int64) *T {
|
|||||||
// true if the element has been inserted successfully, false if it was already
|
// true if the element has been inserted successfully, false if it was already
|
||||||
// in the queue or inserted out of order.
|
// in the queue or inserted out of order.
|
||||||
func (p *PacketNumberIndexedQueue[T]) Emplace(packetNumber int64, args T) bool {
|
func (p *PacketNumberIndexedQueue[T]) Emplace(packetNumber int64, args T) bool {
|
||||||
if p.IsEmpty() {
|
p.mu.Lock()
|
||||||
|
defer p.mu.Unlock()
|
||||||
|
|
||||||
|
if p.numberOfPresentEntries == 0 {
|
||||||
p.entries.PushBack(EntryWrapper[T]{data: args, present: true})
|
p.entries.PushBack(EntryWrapper[T]{data: args, present: true})
|
||||||
p.numberOfPresentEntries = 1
|
p.numberOfPresentEntries = 1
|
||||||
p.firstPacket = packetNumber
|
p.firstPacket = packetNumber
|
||||||
@@ -100,11 +111,15 @@ func (p *PacketNumberIndexedQueue[T]) Emplace(packetNumber int64, args T) bool {
|
|||||||
// Remove removes data associated with packetNumber and frees the slots in the
|
// Remove removes data associated with packetNumber and frees the slots in the
|
||||||
// queue as necessary.
|
// queue as necessary.
|
||||||
func (p *PacketNumberIndexedQueue[T]) Remove(packetNumber int64) bool {
|
func (p *PacketNumberIndexedQueue[T]) Remove(packetNumber int64) bool {
|
||||||
entry := p.getEntryWrapper(packetNumber)
|
p.mu.Lock()
|
||||||
if entry == nil {
|
defer p.mu.Unlock()
|
||||||
|
|
||||||
|
entry, idx := p.getEntryWrapper(packetNumber)
|
||||||
|
if idx < 0 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
entry.present = false
|
entry.present = false
|
||||||
|
p.entries.Set(idx, entry)
|
||||||
p.numberOfPresentEntries--
|
p.numberOfPresentEntries--
|
||||||
|
|
||||||
if packetNumber == p.firstPacket {
|
if packetNumber == p.firstPacket {
|
||||||
@@ -113,50 +128,54 @@ func (p *PacketNumberIndexedQueue[T]) Remove(packetNumber int64) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *PacketNumberIndexedQueue[T]) IsEmpty() bool {
|
||||||
|
p.mu.Lock()
|
||||||
|
defer p.mu.Unlock()
|
||||||
|
return p.numberOfPresentEntries == 0
|
||||||
|
}
|
||||||
|
|
||||||
func (p *PacketNumberIndexedQueue[T]) FirstPacket() int64 {
|
func (p *PacketNumberIndexedQueue[T]) FirstPacket() int64 {
|
||||||
return p.firstPacket
|
return p.firstPacket
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PacketNumberIndexedQueue[T]) LastPacket() int64 {
|
func (p *PacketNumberIndexedQueue[T]) LastPacket() int64 {
|
||||||
if p.IsEmpty() {
|
if p.numberOfPresentEntries == 0 {
|
||||||
return 0
|
return -1
|
||||||
}
|
}
|
||||||
return p.firstPacket + int64(p.entries.Len()) - 1
|
return p.firstPacket + int64(p.entries.Len()) - 1
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PacketNumberIndexedQueue[T]) EntrySlotsUsed() int {
|
func (p *PacketNumberIndexedQueue[T]) entrySlotsUsed() int {
|
||||||
return p.entries.Len()
|
return p.entries.Len()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PacketNumberIndexedQueue[T]) IsEmpty() bool {
|
// cleanup cleans up unused slots in the front.
|
||||||
return p.numberOfPresentEntries == 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// cleanup cleans up unused slots in the front after removing an element.
|
|
||||||
func (p *PacketNumberIndexedQueue[T]) cleanup() {
|
func (p *PacketNumberIndexedQueue[T]) cleanup() {
|
||||||
for p.entries.Len() > 0 && !p.entries.Front().present {
|
for p.entries.Len() > 0 && !p.entries.Front().present {
|
||||||
p.entries.PopFront()
|
p.entries.PopFront()
|
||||||
p.firstPacket++
|
p.firstPacket++
|
||||||
}
|
}
|
||||||
if p.entries.Len() == 0 {
|
if p.entries.Len() == 0 {
|
||||||
p.firstPacket = 0
|
p.firstPacket = -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PacketNumberIndexedQueue[T]) getEntryWrapper(packetNumber int64) *EntryWrapper[T] {
|
// getEntryWrapper returns a copy of the wrapper and the index in the deque.
|
||||||
|
// If not found, index -1 is returned.
|
||||||
|
func (p *PacketNumberIndexedQueue[T]) getEntryWrapper(packetNumber int64) (EntryWrapper[T], int) {
|
||||||
if packetNumber < p.firstPacket {
|
if packetNumber < p.firstPacket {
|
||||||
return nil
|
return EntryWrapper[T]{}, -1
|
||||||
}
|
}
|
||||||
|
|
||||||
offset := packetNumber - p.firstPacket
|
offset := packetNumber - p.firstPacket
|
||||||
if offset >= int64(p.entries.Len()) {
|
if offset >= int64(p.entries.Len()) {
|
||||||
return nil
|
return EntryWrapper[T]{}, -1
|
||||||
}
|
}
|
||||||
|
|
||||||
entry := p.entries.At(int(offset))
|
entry := p.entries.At(int(offset))
|
||||||
if !entry.present {
|
if !entry.present {
|
||||||
return nil
|
return EntryWrapper[T]{}, -1
|
||||||
}
|
}
|
||||||
|
|
||||||
return &entry
|
return entry, int(offset)
|
||||||
}
|
}
|
||||||
|
@@ -29,7 +29,7 @@ func TestPacketNumberIndexedQueue(t *testing.T) {
|
|||||||
for i := 0; i < total; i++ {
|
for i := 0; i < total; i++ {
|
||||||
clockTime := time.Now().UnixMilli()
|
clockTime := time.Now().UnixMilli()
|
||||||
packets[i] = clockTime
|
packets[i] = clockTime
|
||||||
time.Sleep(10 * time.Millisecond)
|
time.Sleep(5 * time.Millisecond)
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < total; i++ {
|
for i := 0; i < total; i++ {
|
||||||
@@ -58,15 +58,18 @@ func TestPacketNumberIndexedQueue(t *testing.T) {
|
|||||||
if queue.LastPacket() != packets[total-1] {
|
if queue.LastPacket() != packets[total-1] {
|
||||||
t.Errorf("Got unexpected last packet %v, want %v", queue.LastPacket(), packets[total-1])
|
t.Errorf("Got unexpected last packet %v, want %v", queue.LastPacket(), packets[total-1])
|
||||||
}
|
}
|
||||||
if queue.EntrySlotsUsed() <= total {
|
if queue.entrySlotsUsed() <= total {
|
||||||
t.Errorf("Queue has %d slots, want more than %d", queue.EntrySlotsUsed(), total)
|
t.Errorf("Queue has %d slots, want more than %d", queue.entrySlotsUsed(), total)
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := total - 1; i >= 0; i-- {
|
for i := 0; i < total; i++ {
|
||||||
if ok := queue.Remove(packets[i]); !ok {
|
if ok := queue.Remove(packets[i]); !ok {
|
||||||
t.Fatalf("Remove() failed on packet %d", i)
|
t.Fatalf("Remove() failed on packet %d", i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ok := queue.Remove(packets[0]); ok {
|
||||||
|
t.Errorf("Remove() is successful with removed packet")
|
||||||
|
}
|
||||||
if !queue.IsEmpty() {
|
if !queue.IsEmpty() {
|
||||||
t.Errorf("Queue is not empty after removing all the packets")
|
t.Errorf("Queue is not empty after removing all the packets")
|
||||||
}
|
}
|
||||||
|
69
mieru/pkg/congestion/windowed_filter_test.go
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
// Copyright (C) 2024 mieru authors
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
package congestion
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMinFilter(t *testing.T) {
|
||||||
|
filter := NewWindowedFilter(5, 0, MinFilter[int])
|
||||||
|
for i := 1; i <= 10; i++ {
|
||||||
|
filter.Update(i, int64(i))
|
||||||
|
}
|
||||||
|
best := filter.GetBest()
|
||||||
|
second := filter.GetSecondBest()
|
||||||
|
third := filter.GetThirdBest()
|
||||||
|
t.Logf("MinFilter: %d %d %d", best, second, third)
|
||||||
|
if best >= second {
|
||||||
|
t.Errorf("with MinFilter, got best >= second")
|
||||||
|
}
|
||||||
|
if best >= third {
|
||||||
|
t.Errorf("with MinFilter, got best >= third")
|
||||||
|
}
|
||||||
|
if second >= third {
|
||||||
|
t.Errorf("with MinFilter, got second >= third")
|
||||||
|
}
|
||||||
|
filter.Reset(0, time.Now().UnixNano())
|
||||||
|
if filter.GetBest() != 0 || filter.GetSecondBest() != 0 || filter.GetThirdBest() != 0 {
|
||||||
|
t.Errorf("got non-zero after Reset()")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMaxFilter(t *testing.T) {
|
||||||
|
filter := NewWindowedFilter(5, 0, MaxFilter[int])
|
||||||
|
for i := 10; i >= 1; i-- {
|
||||||
|
filter.Update(i, int64(11-i))
|
||||||
|
}
|
||||||
|
best := filter.GetBest()
|
||||||
|
second := filter.GetSecondBest()
|
||||||
|
third := filter.GetThirdBest()
|
||||||
|
t.Logf("MaxFilter: %d %d %d", best, second, third)
|
||||||
|
if best <= second {
|
||||||
|
t.Errorf("with MaxFilter, got best <= second")
|
||||||
|
}
|
||||||
|
if best <= third {
|
||||||
|
t.Errorf("with MaxFilter, got best <= third")
|
||||||
|
}
|
||||||
|
if second <= third {
|
||||||
|
t.Errorf("with MaxFilter, got second <= third")
|
||||||
|
}
|
||||||
|
filter.Reset(0, time.Now().UnixNano())
|
||||||
|
if filter.GetBest() != 0 || filter.GetSecondBest() != 0 || filter.GetThirdBest() != 0 {
|
||||||
|
t.Errorf("got non-zero after Reset()")
|
||||||
|
}
|
||||||
|
}
|
@@ -19,20 +19,26 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
// BufPipe is like net.Pipe() but with an internal buffer.
|
// BufPipe is like net.Pipe() but with an internal buffer.
|
||||||
func BufPipe() (io.ReadWriteCloser, io.ReadWriteCloser) {
|
func BufPipe() (io.ReadWriteCloser, io.ReadWriteCloser) {
|
||||||
var buf1, buf2 bytes.Buffer
|
var buf1, buf2 bytes.Buffer
|
||||||
|
var lock1, lock2 sync.Mutex
|
||||||
ep1 := &ioEndpoint{
|
ep1 := &ioEndpoint{
|
||||||
direction: forward,
|
direction: forward,
|
||||||
buf1: &buf1,
|
buf1: &buf1,
|
||||||
buf2: &buf2,
|
buf2: &buf2,
|
||||||
|
lock1: &lock1,
|
||||||
|
lock2: &lock2,
|
||||||
}
|
}
|
||||||
ep2 := &ioEndpoint{
|
ep2 := &ioEndpoint{
|
||||||
direction: backward,
|
direction: backward,
|
||||||
buf1: &buf1,
|
buf1: &buf1,
|
||||||
buf2: &buf2,
|
buf2: &buf2,
|
||||||
|
lock1: &lock1,
|
||||||
|
lock2: &lock2,
|
||||||
}
|
}
|
||||||
return ep1, ep2
|
return ep1, ep2
|
||||||
}
|
}
|
||||||
@@ -48,6 +54,8 @@ type ioEndpoint struct {
|
|||||||
direction ioDirection
|
direction ioDirection
|
||||||
buf1 *bytes.Buffer // forward writes to here
|
buf1 *bytes.Buffer // forward writes to here
|
||||||
buf2 *bytes.Buffer // backward writes to here
|
buf2 *bytes.Buffer // backward writes to here
|
||||||
|
lock1 *sync.Mutex // lock of buf1
|
||||||
|
lock2 *sync.Mutex // lock of buf2
|
||||||
closed bool
|
closed bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,9 +64,13 @@ func (e *ioEndpoint) Read(b []byte) (n int, err error) {
|
|||||||
return 0, io.EOF
|
return 0, io.EOF
|
||||||
}
|
}
|
||||||
if e.direction == forward {
|
if e.direction == forward {
|
||||||
|
e.lock2.Lock()
|
||||||
n, err = e.buf2.Read(b)
|
n, err = e.buf2.Read(b)
|
||||||
|
e.lock2.Unlock()
|
||||||
} else {
|
} else {
|
||||||
|
e.lock1.Lock()
|
||||||
n, err = e.buf1.Read(b)
|
n, err = e.buf1.Read(b)
|
||||||
|
e.lock1.Unlock()
|
||||||
}
|
}
|
||||||
if errors.Is(err, io.EOF) {
|
if errors.Is(err, io.EOF) {
|
||||||
err = nil
|
err = nil
|
||||||
@@ -66,14 +78,20 @@ func (e *ioEndpoint) Read(b []byte) (n int, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *ioEndpoint) Write(b []byte) (int, error) {
|
func (e *ioEndpoint) Write(b []byte) (n int, err error) {
|
||||||
if e.closed {
|
if e.closed {
|
||||||
return 0, io.ErrClosedPipe
|
return 0, io.ErrClosedPipe
|
||||||
}
|
}
|
||||||
if e.direction == forward {
|
if e.direction == forward {
|
||||||
return e.buf1.Write(b)
|
e.lock1.Lock()
|
||||||
|
n, err = e.buf1.Write(b)
|
||||||
|
e.lock1.Unlock()
|
||||||
|
} else {
|
||||||
|
e.lock2.Lock()
|
||||||
|
n, err = e.buf2.Write(b)
|
||||||
|
e.lock2.Unlock()
|
||||||
}
|
}
|
||||||
return e.buf2.Write(b)
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *ioEndpoint) Close() error {
|
func (e *ioEndpoint) Close() error {
|
||||||
|
@@ -11,7 +11,7 @@ import subprocess
|
|||||||
# This constant comes from the oldest glibc version in
|
# This constant comes from the oldest glibc version in
|
||||||
# //chrome/installer/linux/debian/dist_package_versions.json and
|
# //chrome/installer/linux/debian/dist_package_versions.json and
|
||||||
# //chrome/installer/linux/rpm/dist_package_provides.json
|
# //chrome/installer/linux/rpm/dist_package_provides.json
|
||||||
MAX_ALLOWED_GLIBC_VERSION = [2, 28]
|
MAX_ALLOWED_GLIBC_VERSION = [2, 26]
|
||||||
|
|
||||||
VERSION_PATTERN = re.compile("GLIBC_([0-9\.]+)")
|
VERSION_PATTERN = re.compile("GLIBC_([0-9\.]+)")
|
||||||
SECTION_PATTERN = re.compile(r"^ *\[ *[0-9]+\] +(\S+) +\S+ + ([0-9a-f]+) .*$")
|
SECTION_PATTERN = re.compile(r"^ *\[ *[0-9]+\] +(\S+) +\S+ + ([0-9a-f]+) .*$")
|
||||||
|
@@ -303,9 +303,17 @@ def hacks_and_patches(install_root: str, script_dir: str, arch: str) -> None:
|
|||||||
os.remove(qtchooser_conf)
|
os.remove(qtchooser_conf)
|
||||||
|
|
||||||
# __GLIBC_MINOR__ is used as a feature test macro. Replace it with the
|
# __GLIBC_MINOR__ is used as a feature test macro. Replace it with the
|
||||||
# earliest supported version of glibc (2.28).
|
# earliest supported version of glibc (2.26).
|
||||||
features_h = os.path.join(install_root, "usr", "include", "features.h")
|
features_h = os.path.join(install_root, "usr", "include", "features.h")
|
||||||
replace_in_file(features_h, r"(#define\s+__GLIBC_MINOR__)", r"\1 28 //")
|
replace_in_file(features_h, r"(#define\s+__GLIBC_MINOR__)", r"\1 26 //")
|
||||||
|
|
||||||
|
# fcntl64() was introduced in glibc 2.28. Make sure to use fcntl() instead.
|
||||||
|
fcntl_h = os.path.join(install_root, "usr", "include", "fcntl.h")
|
||||||
|
replace_in_file(
|
||||||
|
fcntl_h,
|
||||||
|
r"#ifndef __USE_FILE_OFFSET64(\nextern int fcntl)",
|
||||||
|
r"#if 1\1",
|
||||||
|
)
|
||||||
|
|
||||||
# Do not use pthread_cond_clockwait as it was introduced in glibc 2.30.
|
# Do not use pthread_cond_clockwait as it was introduced in glibc 2.30.
|
||||||
cppconfig_h = os.path.join(
|
cppconfig_h = os.path.join(
|
||||||
|
@@ -8,12 +8,12 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=ddns-go
|
PKG_NAME:=ddns-go
|
||||||
PKG_VERSION:=6.6.6
|
PKG_VERSION:=6.6.7
|
||||||
PKG_RELEASE:=1
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
PKG_SOURCE_URL:=https://codeload.github.com/jeessy2/ddns-go/tar.gz/v$(PKG_VERSION)?
|
PKG_SOURCE_URL:=https://codeload.github.com/jeessy2/ddns-go/tar.gz/v$(PKG_VERSION)?
|
||||||
PKG_HASH:=95367d8680c27a78024be339aaad77d73cda05e7005b8d9c342182e4f97c7bcc
|
PKG_HASH:=a2b8625ec499cfa822924bf4109b74b362438c92a7c632b7574817de8deee744
|
||||||
|
|
||||||
PKG_LICENSE:=MIT
|
PKG_LICENSE:=MIT
|
||||||
PKG_LICENSE_FILES:=LICENSE
|
PKG_LICENSE_FILES:=LICENSE
|
||||||
|
@@ -432,11 +432,11 @@ return view.extend({
|
|||||||
ss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]);
|
ss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]);
|
||||||
ss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss);
|
ss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss);
|
||||||
|
|
||||||
ss.tab('field_other', _('Other Fields'));
|
ss.tab('field_other', _('Other fields'));
|
||||||
ss.tab('field_host', _('Host Fields'));
|
ss.tab('field_host', _('Host fields'));
|
||||||
ss.tab('field_port', _('Port Fields'));
|
ss.tab('field_port', _('Port fields'));
|
||||||
ss.tab('field_source_ip', _('SRC-IP Fields'));
|
ss.tab('field_source_ip', _('SRC-IP fields'));
|
||||||
ss.tab('field_source_port', _('SRC-Port Fields'));
|
ss.tab('field_source_port', _('SRC-Port fields'));
|
||||||
|
|
||||||
so = ss.taboption('field_other', form.Value, 'label', _('Label'));
|
so = ss.taboption('field_other', form.Value, 'label', _('Label'));
|
||||||
so.load = L.bind(hp.loadDefaultLabel, this, data[0]);
|
so.load = L.bind(hp.loadDefaultLabel, this, data[0]);
|
||||||
@@ -764,11 +764,11 @@ return view.extend({
|
|||||||
ss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]);
|
ss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]);
|
||||||
ss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss);
|
ss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss);
|
||||||
|
|
||||||
ss.tab('field_other', _('Other Fields'));
|
ss.tab('field_other', _('Other fields'));
|
||||||
ss.tab('field_host', _('Host Fields'));
|
ss.tab('field_host', _('Host fields'));
|
||||||
ss.tab('field_port', _('Port Fields'));
|
ss.tab('field_port', _('Port fields'));
|
||||||
ss.tab('field_source_ip', _('SRC-IP Fields'));
|
ss.tab('field_source_ip', _('SRC-IP fields'));
|
||||||
ss.tab('field_source_port', _('SRC-Port Fields'));
|
ss.tab('field_source_port', _('SRC-Port fields'));
|
||||||
|
|
||||||
so = ss.taboption('field_other', form.Value, 'label', _('Label'));
|
so = ss.taboption('field_other', form.Value, 'label', _('Label'));
|
||||||
so.load = L.bind(hp.loadDefaultLabel, this, data[0]);
|
so.load = L.bind(hp.loadDefaultLabel, this, data[0]);
|
||||||
|
@@ -869,7 +869,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:436
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:436
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:768
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:768
|
||||||
msgid "Host Fields"
|
msgid "Host fields"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/node.js:709
|
#: htdocs/luci-static/resources/view/homeproxy/node.js:709
|
||||||
@@ -1391,7 +1391,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:435
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:435
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:767
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:767
|
||||||
msgid "Other Fields"
|
msgid "Other fields"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:389
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:389
|
||||||
@@ -1488,7 +1488,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:437
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:437
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:769
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:769
|
||||||
msgid "Port Fields"
|
msgid "Port fields"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:537
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:537
|
||||||
@@ -1756,12 +1756,12 @@ msgstr ""
|
|||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:438
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:438
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:770
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:770
|
||||||
msgid "SRC-IP Fields"
|
msgid "SRC-IP fields"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:439
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:439
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:771
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:771
|
||||||
msgid "SRC-Port Fields"
|
msgid "SRC-Port fields"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/node.js:515
|
#: htdocs/luci-static/resources/view/homeproxy/node.js:515
|
||||||
|
@@ -890,7 +890,7 @@ msgstr "主机名"
|
|||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:436
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:436
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:768
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:768
|
||||||
msgid "Host Fields"
|
msgid "Host fields"
|
||||||
msgstr "主机字段"
|
msgstr "主机字段"
|
||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/node.js:709
|
#: htdocs/luci-static/resources/view/homeproxy/node.js:709
|
||||||
@@ -1419,7 +1419,7 @@ msgstr "仅代理中国大陆"
|
|||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:435
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:435
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:767
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:767
|
||||||
msgid "Other Fields"
|
msgid "Other fields"
|
||||||
msgstr "其他字段"
|
msgstr "其他字段"
|
||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:389
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:389
|
||||||
@@ -1516,7 +1516,7 @@ msgstr "端口 %s 已存在!"
|
|||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:437
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:437
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:769
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:769
|
||||||
msgid "Port Fields"
|
msgid "Port fields"
|
||||||
msgstr "端口字段"
|
msgstr "端口字段"
|
||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:537
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:537
|
||||||
@@ -1784,13 +1784,13 @@ msgstr "规则集 URL"
|
|||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:438
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:438
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:770
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:770
|
||||||
msgid "SRC-IP Fields"
|
msgid "SRC-IP fields"
|
||||||
msgstr "源 IP 字段"
|
msgstr "源 IP 字段"
|
||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:439
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:439
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/client.js:771
|
#: htdocs/luci-static/resources/view/homeproxy/client.js:771
|
||||||
msgid "SRC-Port Fields"
|
msgid "SRC-Port fields"
|
||||||
msgstr "源端口 字段"
|
msgstr "源端口字段"
|
||||||
|
|
||||||
#: htdocs/luci-static/resources/view/homeproxy/node.js:515
|
#: htdocs/luci-static/resources/view/homeproxy/node.js:515
|
||||||
msgid "SSH"
|
msgid "SSH"
|
||||||
|
@@ -926,6 +926,16 @@ run_redir() {
|
|||||||
_args="${_args} udp_redir_port=${UDP_REDIR_PORT}"
|
_args="${_args} udp_redir_port=${UDP_REDIR_PORT}"
|
||||||
config_file=$(echo $config_file | sed "s/TCP/TCP_UDP/g")
|
config_file=$(echo $config_file | sed "s/TCP/TCP_UDP/g")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local protocol=$(config_n_get $node protocol)
|
||||||
|
local default_node=$(config_n_get $node default_node)
|
||||||
|
local v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)
|
||||||
|
[ "${DNS_MODE}" != "sing-box" ] && [ "${DNS_MODE}" != "udp" ] && [ "$protocol" = "_shunt" ] && [ "$default_node" = "_direct" ] && {
|
||||||
|
DNS_MODE="sing-box"
|
||||||
|
v2ray_dns_mode="tcp"
|
||||||
|
echolog "* 当前TCP节点采用Sing-Box分流且默认节点为直连,远程DNS过滤模式将默认使用Sing-Box(TCP),防止环回!"
|
||||||
|
}
|
||||||
|
|
||||||
[ "${DNS_MODE}" = "sing-box" ] && {
|
[ "${DNS_MODE}" = "sing-box" ] && {
|
||||||
resolve_dns=1
|
resolve_dns=1
|
||||||
config_file=$(echo $config_file | sed "s/.json/_DNS.json/g")
|
config_file=$(echo $config_file | sed "s/.json/_DNS.json/g")
|
||||||
@@ -934,11 +944,8 @@ run_redir() {
|
|||||||
[ "${DNS_CACHE}" == "0" ] && _args="${_args} dns_cache=0"
|
[ "${DNS_CACHE}" == "0" ] && _args="${_args} dns_cache=0"
|
||||||
resolve_dns_port=${dns_listen_port}
|
resolve_dns_port=${dns_listen_port}
|
||||||
_args="${_args} dns_listen_port=${resolve_dns_port}"
|
_args="${_args} dns_listen_port=${resolve_dns_port}"
|
||||||
|
|
||||||
local local_dns=$(echo "${LOCAL_DNS}" | sed "s/,/\n/g" | head -n1)
|
local local_dns=$(echo "${LOCAL_DNS}" | sed "s/,/\n/g" | head -n1)
|
||||||
_args="${_args} direct_dns_udp_server=${local_dns}"
|
_args="${_args} direct_dns_udp_server=${local_dns}"
|
||||||
|
|
||||||
local v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)
|
|
||||||
_args="${_args} remote_dns_protocol=${v2ray_dns_mode}"
|
_args="${_args} remote_dns_protocol=${v2ray_dns_mode}"
|
||||||
case "$v2ray_dns_mode" in
|
case "$v2ray_dns_mode" in
|
||||||
tcp)
|
tcp)
|
||||||
@@ -981,6 +988,16 @@ run_redir() {
|
|||||||
_args="${_args} udp_redir_port=${UDP_REDIR_PORT}"
|
_args="${_args} udp_redir_port=${UDP_REDIR_PORT}"
|
||||||
config_file=$(echo $config_file | sed "s/TCP/TCP_UDP/g")
|
config_file=$(echo $config_file | sed "s/TCP/TCP_UDP/g")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local protocol=$(config_n_get $node protocol)
|
||||||
|
local default_node=$(config_n_get $node default_node)
|
||||||
|
local v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)
|
||||||
|
[ "${DNS_MODE}" != "xray" ] && [ "${DNS_MODE}" != "udp" ] && [ "$protocol" = "_shunt" ] && [ "$default_node" = "_direct" ] && {
|
||||||
|
DNS_MODE="xray"
|
||||||
|
v2ray_dns_mode="tcp"
|
||||||
|
echolog "* 当前TCP节点采用Xray分流且默认节点为直连,远程DNS过滤模式将默认使用Xray(TCP),防止环回!"
|
||||||
|
}
|
||||||
|
|
||||||
[ "${DNS_MODE}" = "xray" ] && {
|
[ "${DNS_MODE}" = "xray" ] && {
|
||||||
resolve_dns=1
|
resolve_dns=1
|
||||||
config_file=$(echo $config_file | sed "s/.json/_DNS.json/g")
|
config_file=$(echo $config_file | sed "s/.json/_DNS.json/g")
|
||||||
@@ -992,7 +1009,6 @@ run_redir() {
|
|||||||
resolve_dns_port=${dns_listen_port}
|
resolve_dns_port=${dns_listen_port}
|
||||||
_args="${_args} dns_listen_port=${resolve_dns_port}"
|
_args="${_args} dns_listen_port=${resolve_dns_port}"
|
||||||
_args="${_args} remote_dns_tcp_server=${REMOTE_DNS}"
|
_args="${_args} remote_dns_tcp_server=${REMOTE_DNS}"
|
||||||
local v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)
|
|
||||||
if [ "$v2ray_dns_mode" = "tcp+doh" ]; then
|
if [ "$v2ray_dns_mode" = "tcp+doh" ]; then
|
||||||
remote_dns_doh=$(config_t_get global remote_dns_doh "https://1.1.1.1/dns-query")
|
remote_dns_doh=$(config_t_get global remote_dns_doh "https://1.1.1.1/dns-query")
|
||||||
_args="${_args} remote_dns_doh=${remote_dns_doh}"
|
_args="${_args} remote_dns_doh=${remote_dns_doh}"
|
||||||
|
@@ -18,16 +18,12 @@ namespace Ryujinx.Audio.Renderer.Server.Performance
|
|||||||
|
|
||||||
if (version == 2)
|
if (version == 2)
|
||||||
{
|
{
|
||||||
return (ulong)PerformanceManagerGeneric<PerformanceFrameHeaderVersion2,
|
return (ulong)PerformanceManagerGeneric<PerformanceFrameHeaderVersion2, PerformanceEntryVersion2, PerformanceDetailVersion2>.GetRequiredBufferSizeForPerformanceMetricsPerFrame(ref parameter);
|
||||||
PerformanceEntryVersion2,
|
|
||||||
PerformanceDetailVersion2>.GetRequiredBufferSizeForPerformanceMetricsPerFrame(ref parameter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (version == 1)
|
if (version == 1)
|
||||||
{
|
{
|
||||||
return (ulong)PerformanceManagerGeneric<PerformanceFrameHeaderVersion1,
|
return (ulong)PerformanceManagerGeneric<PerformanceFrameHeaderVersion1, PerformanceEntryVersion1, PerformanceDetailVersion1>.GetRequiredBufferSizeForPerformanceMetricsPerFrame(ref parameter);
|
||||||
PerformanceEntryVersion1,
|
|
||||||
PerformanceDetailVersion1>.GetRequiredBufferSizeForPerformanceMetricsPerFrame(ref parameter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new NotImplementedException($"Unknown Performance metrics data format version {version}");
|
throw new NotImplementedException($"Unknown Performance metrics data format version {version}");
|
||||||
|
@@ -234,7 +234,7 @@ namespace Ryujinx.Audio.Renderer.Server.Performance
|
|||||||
{
|
{
|
||||||
performanceEntry = null;
|
performanceEntry = null;
|
||||||
|
|
||||||
if (_entryDetailIndex > MaxFrameDetailCount)
|
if (_entryDetailIndex >= MaxFrameDetailCount)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -245,7 +245,7 @@ namespace Ryujinx.Audio.Renderer.Server.Performance
|
|||||||
EntryCountOffset = (uint)CurrentHeader.GetEntryCountOffset(),
|
EntryCountOffset = (uint)CurrentHeader.GetEntryCountOffset(),
|
||||||
};
|
};
|
||||||
|
|
||||||
uint baseEntryOffset = (uint)(Unsafe.SizeOf<THeader>() + GetEntriesSize() + Unsafe.SizeOf<IPerformanceDetailEntry>() * _entryDetailIndex);
|
uint baseEntryOffset = (uint)(Unsafe.SizeOf<THeader>() + GetEntriesSize() + Unsafe.SizeOf<TEntryDetail>() * _entryDetailIndex);
|
||||||
|
|
||||||
ref TEntryDetail entryDetail = ref EntriesDetail[_entryDetailIndex];
|
ref TEntryDetail entryDetail = ref EntriesDetail[_entryDetailIndex];
|
||||||
|
|
||||||
|
@@ -9,5 +9,6 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu.Types
|
|||||||
public byte Sm0TpcIndex;
|
public byte Sm0TpcIndex;
|
||||||
public byte Sm1GpcIndex;
|
public byte Sm1GpcIndex;
|
||||||
public byte Sm1TpcIndex;
|
public byte Sm1TpcIndex;
|
||||||
|
public uint Reserved;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 8.7 KiB |
@@ -1,95 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
|
||||||
<path style="fill:#FF4B55;" d="M473.655,423.724H38.346c-21.177,0-38.345-17.167-38.345-38.345V126.622 c0-21.177,17.167-38.345,38.345-38.345h435.309c21.177,0,38.345,17.167,38.345,38.345V385.38 C512,406.557,494.833,423.724,473.655,423.724z"/>
|
|
||||||
<path style="fill:#41479B;" d="M0.001,126.622v120.582c0.017,4.861,3.961,8.797,8.826,8.797h238.344 c4.875,0,8.828-3.953,8.828-8.828V97.104c0-4.874-3.95-8.825-8.823-8.828H38.346C17.169,88.277,0.001,105.444,0.001,126.622z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M150.069,141.849V88.277h-44.138v53.573L26.845,90.035c-9.234,2.9-16.954,9.203-21.711,17.434 l65.022,42.601H0.001v44.138h70.153L0.001,240.169v7.033c0.017,4.861,3.961,8.797,8.826,8.797H24.16l81.77-53.572V256h44.138 v-53.573L231.838,256h15.333c4.875,0,8.828-3.953,8.828-8.828v-7.002l-70.155-45.963h70.155V150.07h-70.155l70.155-45.964v-7.002 c0-4.874-3.95-8.825-8.823-8.828h-15.338L150.069,141.849z"/>
|
|
||||||
<g>
|
|
||||||
<polygon style="fill:#FF4B55;" points="255.999,158.897 141.241,158.897 141.241,88.277 114.758,88.277 114.758,158.897 0,158.897 0,185.38 114.758,185.38 114.758,256.001 141.241,256.001 141.241,185.38 255.999,185.38 "/>
|
|
||||||
<path style="fill:#FF4B55;" d="M8.228,102.903l72.661,47.166h16.214l-82.495-53.55C12.239,98.39,10.098,100.533,8.228,102.903z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M166.283,150.07l88.374-57.366c-1.536-2.599-4.246-4.427-7.485-4.427h-1.909l-95.194,61.793H166.283 z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M89.474,194.208L1.269,251.462c1.519,2.663,4.273,4.537,7.559,4.537h1.665l95.195-61.793H89.474 V194.208z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M255.859,247.866l-82.666-53.658H156.98l93.873,60.934 C253.666,253.837,255.594,251.102,255.859,247.866z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#F5F5F5;" d="M320.945,174.03c-1.741,0-3.153,1.411-3.153,3.153v116.65c0,9.458,6.305,40.985,66.207,50.443 c59.902-9.458,66.207-40.985,66.207-50.443v-116.65c0-1.741-1.411-3.153-3.153-3.153L320.945,174.03L320.945,174.03z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M383.999,344.276c50.004-7.895,62.651-31.16,65.469-44.138H318.531 C321.348,313.115,333.995,336.38,383.999,344.276z"/>
|
|
||||||
<path style="fill:#82AFFF;" d="M424.984,240.237c0,0,3.153-3.153,0-9.458l-40.985-1.834l-40.985,1.834c-3.153,6.305,0,9.458,0,9.458 c-3.153,3.153-3.153,6.305-3.153,6.305h6.305l6.831,11.297l31.001,17.078L415,257.84l6.831-11.297h6.305 C428.137,246.542,428.137,243.389,424.984,240.237z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M415.002,257.839c0,0-1.971-4.335-7.225-3.809c0,0-2.89-3.809-7.751-2.759 c0,0-5.649-3.284-8.932,2.759c0,0-10.444-1.062-11.002,6.891c0,0,16.256,24.504,16.651,24.767 c0.394,0.263,19.442,0.131,19.442,0.131l8.802-9.711l-8.671-12.489L415.002,257.839z"/>
|
|
||||||
<path style="fill:#F0C850;" d="M384.394,265.589c0,0-13.79-22.528-15.764-24.434c-1.905-1.839-5.649-3.546-9.459-0.394 c0,0-11.428-0.919-9.853,7.751l3.284,13.137c0,0-2.89,9.064-4.204,9.984c-1.313,0.919-6.174,3.415-6.174,3.415l2.759,10.903 l36.781-1.839L384.394,265.589z"/>
|
|
||||||
<path style="fill:#965032;" d="M400.288,255.738l-0.043,0.019l-1.017-2.401c-0.082-0.194-0.238-0.348-0.434-0.425 s-0.413-0.074-0.609,0.012l-6.842,3.017l-8.138-13.322c0.361-0.31,0.518-0.817,0.348-1.289c-0.22-0.616-0.897-0.936-1.512-0.717 l-1.814,0.649L379,237.655c-0.14-0.413-0.585-0.628-0.999-0.495c-0.413,0.141-0.634,0.588-0.494,1.001l1.236,3.654l-1.939,0.694 c-0.615,0.222-0.935,0.899-0.714,1.512c0.172,0.483,0.628,0.786,1.113,0.786c0.068,0,0.138-0.023,0.207-0.035l2.682,16.153 l-1.73,0.762c-0.377,0.167-0.564,0.597-0.424,0.985l0.981,2.732c0.024,0.46,0.022,1.236-0.135,2.218l-11.006-18.879 c0.462-0.289,0.693-0.851,0.502-1.383c-0.222-0.616-0.893-0.939-1.512-0.717l-1.814,0.649l-1.227-3.626 c-0.139-0.413-0.587-0.634-0.999-0.495c-0.413,0.141-0.634,0.588-0.494,1.001l1.236,3.654l-1.939,0.694 c-0.615,0.222-0.935,0.899-0.714,1.512c0.158,0.441,0.559,0.701,0.995,0.748l4.777,29.814c-0.617,0.259-1.222,0.522-1.901,0.764 c0,0-2.233,10.641-0.525,11.166c1.708,0.525,19.31,5.911,19.31,5.911s24.302-11.56,24.828-11.822 c0.525-0.263,1.577-7.882,1.577-7.882L400.288,255.738z M398.797,256.378l-2.035,0.874l-0.674-1.663l1.999-0.882L398.797,256.378z M386.497,259.818l1.673-0.737l0.643,1.585l-1.771,0.761L386.497,259.818z M385.588,262.05l-1.978,0.85l-0.622-1.534l2.062-0.909 L385.588,262.05z M390.26,260.045l-0.649-1.6l1.788-0.788l0.655,1.618L390.26,260.045z M392.84,257.021l1.806-0.797l0.669,1.649 l-1.814,0.779L392.84,257.021z M381.736,243.255l8.152,13.346l-3.897,1.718l-5.005-14.796L381.736,243.255z M378.922,244.262 l0.578-0.207l5.042,14.904l-2.963,1.306L378.922,244.262z M381.546,262.001l0.617,1.521l-1.945,0.835l-0.548-1.528L381.546,262.001z M366.295,249.325l11.938,20.479c-0.601,1.737-1.735,3.753-3.723,5.732l-8.797-26.004L366.295,249.325z M363.348,250.38l0.882-0.316 l9.009,26.632c-1.366,1.133-3.065,2.228-5.156,3.231L363.348,250.38z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M427.842,226c-0.837-1.33-3.524-0.76-3.524-0.76s-0.767-1.534-2.794-1.682 c-2.027-0.148-2.399,1.657-2.399,1.657s-0.38-0.282-2.613-0.216s-1.773,3.744-1.773,3.744s-0.854,0-3.744-0.919 c-2.89-0.92-4.794-0.263-4.794-0.263c-0.131-1.511-0.919-2.627-0.919-2.627c-2.43,0.985-4.335-0.131-4.794-0.985 c-0.46-0.854,0.723-2.167,0.723-3.284s-1.544-1.067-2.086-2.052s0-1.527,1.429-2.167s2.759-3.005,1.871-4.926 s-3.448-1.577-3.448-1.577c0.887,0.148,1.625,1.823,0.198,2.167s-2.709-4.877-2.709-4.877c3.3,2.217,5.715,0.887,6.404-1.035 c0.69-1.922-1.133-3.251-1.133-3.251c-1.429,2.315-3.892,0.296-2.561-1.182c1.33-1.478,1.444-3.957,1.444-3.957 c-2.956,1.446-4.794-0.394-4.794-0.394c3.875-2.692,2.759-6.503,2.759-6.503c-1.444-0.657-4.532-0.131-4.532-0.131 c0.657-1.314,0.525-3.679,0.525-3.679c-1.642-0.263-3.481,0.788-3.481,0.788c0.525-1.838-0.198-5.057-0.198-5.057 c-1.182,0.198-3.415,0.854-3.415,0.854c-0.919-2.102-3.481-3.35-3.481-3.35s-2.561,1.248-3.481,3.35c0,0-2.233-0.657-3.415-0.854 c0,0-0.723,3.219-0.198,5.057c0,0-1.839-1.05-3.481-0.788c0,0-0.131,2.365,0.525,3.679c0,0-3.087-0.525-4.532,0.131 c0,0-1.117,3.809,2.759,6.503c0,0-1.839,1.839-4.794,0.394c0,0,0.115,2.479,1.444,3.957c1.33,1.478-1.133,3.498-2.561,1.182 c0,0-1.823,1.33-1.133,3.251s3.104,3.251,6.404,1.035c0,0-1.281,5.221-2.709,4.877s-0.69-2.019,0.198-2.167 c0,0-2.561-0.345-3.448,1.577c-0.887,1.921,0.444,4.286,1.871,4.926c1.429,0.64,1.971,1.182,1.429,2.167 c-0.542,0.985-2.086,0.936-2.086,2.052s1.182,2.43,0.723,3.284c-0.46,0.854-2.365,1.971-4.794,0.985c0,0-0.788,1.117-0.919,2.627 c0,0-1.905-0.657-4.794,0.263c-2.89,0.919-3.744,0.919-3.744,0.919s0.46-3.678-1.773-3.744s-2.613,0.216-2.613,0.216 s-0.371-1.805-2.399-1.657c-2.027,0.149-2.794,1.682-2.794,1.682s-2.687-0.569-3.524,0.76c-0.837,1.33-0.936,3.35,0.64,4.188 c1.577,0.838,5.763,4.335,5.763,4.335l5.911,2.561l20.69-9.163l10.837,2.857l10.837-2.857l20.69,9.163l5.911-2.561 c0,0,4.188-3.498,5.763-4.335C428.778,229.35,428.68,227.331,427.842,226z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M377.546,192.612c0,0,0.223,2.782,4.34,2.04C381.885,194.652,381.775,191.759,377.546,192.612z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M362.313,302.503c0,0-2.956-0.098-6.009,2.167c-3.054,2.266-4.401,0.657-7.455,0.657 s-3.777,3.186-3.777,3.186s-5.911,1.478-3.546,5.813c1.495,2.742,3.576,2.684,4.908,2.272c-0.067,1.842,0.352,3.866,2.481,4.231 c4.04,0.69,5.813-1.478,4.926-4.828c0,0,0.492,3.448,3.153,3.35c2.66-0.098,4.434-1.577,4.138-5.123s4.434-1.379,8.078-6.601 L362.313,302.503z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#82AFFF;" d="M345.039,315.179c0,0-1.839,2.43-1.313,4.794c0,0-3.94-1.248-1.839-7.094 C341.886,312.88,344.58,312.158,345.039,315.179z"/>
|
|
||||||
<path style="fill:#82AFFF;" d="M351.229,318.365c0,0-1.084,3.054,0.394,5.763c0,0-4.926-0.148-3.94-6.207 C347.683,317.922,349.259,316.296,351.229,318.365z"/>
|
|
||||||
<path style="fill:#82AFFF;" d="M356.156,318.069c0,0,0.887,2.561,0,5.025c0,0,4.04-0.246,3.35-6.059 C359.505,317.034,357.338,316.246,356.156,318.069z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#FF4B55;" d="M352.56,259.153c-0.373-3.038-19.409-4.828-18.227,11.166c0,0-2.112-0.039-3.15,1.928 s-3.264,1.484-3.932,0.779c0,0,0.148,3.561,4.562,3.412c0,0-1.397,1.1-1.199,2.708s1.359,3.635,1.286,5.02 s-1.385,3.314-1.385,3.314s3.388-1.162,3.61-3.585s-0.321-4.451,0.346-5.687c0,0-0.321,1.706,1.187,3.858 c1.508,2.152,1.582,4.772,0.964,6.404c0,0,3.758-1.855,3.041-5.44s-1.484-3.264-1.138-5.267c0,0,3.907,3.981,3.24,7.369 c0,0,1.249-1.496,1.138-4.314s-2.068-4.715-2.068-4.715S353.84,269.596,352.56,259.153z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M405.686,302.503c0,0,2.956-0.098,6.009,2.167c3.054,2.266,4.401,0.657,7.455,0.657 s3.777,3.186,3.777,3.186s5.911,1.478,3.546,5.813c-1.495,2.742-3.576,2.684-4.908,2.272c0.067,1.842-0.352,3.866-2.481,4.231 c-4.04,0.69-5.813-1.478-4.926-4.828c0,0-0.492,3.448-3.153,3.35c-2.66-0.098-4.434-1.577-4.138-5.123s-4.434-1.379-8.078-6.601 L405.686,302.503z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#82AFFF;" d="M422.961,315.179c0,0,1.839,2.43,1.313,4.794c0,0,3.94-1.248,1.839-7.094 C426.113,312.88,423.42,312.158,422.961,315.179z"/>
|
|
||||||
<path style="fill:#82AFFF;" d="M416.769,318.365c0,0,1.084,3.054-0.394,5.763c0,0,4.926-0.148,3.94-6.207 C420.317,317.922,418.74,316.296,416.769,318.365z"/>
|
|
||||||
<path style="fill:#82AFFF;" d="M411.844,318.069c0,0-0.887,2.561,0,5.025c0,0-4.04-0.246-3.35-6.059 C408.493,317.034,410.662,316.246,411.844,318.069z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#FF4B55;" d="M415.44,259.153c0.373-3.038,19.409-4.828,18.227,11.166c0,0,2.112-0.039,3.15,1.928 s3.264,1.484,3.932,0.779c0,0-0.148,3.561-4.562,3.412c0,0,1.397,1.1,1.199,2.708s-1.361,3.635-1.286,5.02 c0.074,1.385,1.385,3.314,1.385,3.314s-3.388-1.162-3.61-3.585s0.321-4.451-0.346-5.687c0,0,0.321,1.706-1.187,3.858 c-1.508,2.152-1.582,4.772-0.964,6.404c0,0-3.758-1.855-3.041-5.44s1.484-3.264,1.138-5.267c0,0-3.907,3.981-3.24,7.369 c0,0-1.249-1.496-1.138-4.314c0.111-2.819,2.068-4.715,2.068-4.715S414.159,269.596,415.44,259.153z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M423.227,231.894c-0.724-0.487-1.703-0.284-2.185,0.447c-0.997,1.505-2.311,2.386-4.014,2.691 c-5.641,0.979-13.773-4.575-16.135-6.312c-3.423-2.516-7.651-2.953-10.458-1.224c-1.12,0.371-4.544,1.45-6.434,1.45 c-1.89,0-5.314-1.08-6.434-1.45c-2.807-1.729-7.036-1.292-10.458,1.224c-2.361,1.737-10.494,7.29-16.135,6.312 c-1.704-0.305-3.017-1.185-4.014-2.691c-0.482-0.729-1.461-0.932-2.185-0.447c-0.726,0.48-0.925,1.46-0.445,2.183 c1.478,2.236,3.527,3.599,6.091,4.057c0.648,0.117,1.31,0.169,1.984,0.169c6.016,0,12.823-4.292,16.568-7.041 c2.785-2.045,5.907-2.041,7.313-0.856c0.355,0.301,0.759,0.776,0.662,1.333c-0.052,0.305-0.253,0.579-0.587,0.81 c0.081-0.483-0.066-0.998-0.439-1.373c-0.616-0.616-1.613-0.616-2.229,0c-0.802,0.798-0.889,2.093-0.214,3.147 c0.679,1.056,2.142,1.828,3.88,1.185c0.883-0.329,1.589-0.958,2.078-1.728c2.396-0.697,4.565-0.702,4.565-0.702 s2.169,0.004,4.565,0.702c0.489,0.77,1.195,1.399,2.078,1.728c1.738,0.643,3.2-0.129,3.88-1.185 c0.675-1.053,0.588-2.349-0.214-3.147c-0.616-0.616-1.613-0.616-2.229,0c-0.373,0.375-0.519,0.889-0.439,1.373 c-0.334-0.231-0.534-0.505-0.587-0.81c-0.097-0.557,0.307-1.032,0.662-1.333c1.406-1.185,4.527-1.188,7.313,0.856 c3.745,2.75,10.552,7.041,16.568,7.041c0.674,0,1.336-0.052,1.984-0.169c2.564-0.459,4.613-1.823,6.091-4.057 C424.152,233.352,423.954,232.374,423.227,231.894z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#82AFFF;" d="M343.83,233.635c0,0-0.259-3.523-0.371-4.673s-2.262-2.003-3.079-0.853 C339.564,229.257,339.343,231.372,343.83,233.635z"/>
|
|
||||||
<path style="fill:#82AFFF;" d="M344.591,232.503c0,0,3.104-2.513,2.709-3.842c-0.394-1.33-1.231-2.019-2.266-1.625 C343.998,227.429,343.507,229.842,344.591,232.503z"/>
|
|
||||||
<path style="fill:#82AFFF;" d="M350.65,230.532c0.446-0.446,0.591-2.611-0.64-2.857c-1.231-0.246-2.857,1.675-2.759,4.04 C347.251,231.715,349.812,231.369,350.65,230.532z"/>
|
|
||||||
<path style="fill:#82AFFF;" d="M349.369,231.763c-1.429,0.457-2.808,1.675-2.808,1.675s2.561,1.871,4.335,1.281 C352.67,234.128,351.833,230.976,349.369,231.763z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#F5F5F5;" d="M390.453,192.612c0,0-0.223,2.782-4.34,2.04C386.113,194.652,386.225,191.759,390.453,192.612z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#82AFFF;" d="M424.169,233.635c0,0,0.259-3.523,0.371-4.673c0.111-1.15,2.262-2.003,3.079-0.853 C428.435,229.259,428.657,231.372,424.169,233.635z"/>
|
|
||||||
<path style="fill:#82AFFF;" d="M423.409,232.503c0,0-3.104-2.513-2.709-3.842c0.394-1.33,1.231-2.019,2.266-1.625 C424.001,227.429,424.492,229.842,423.409,232.503z"/>
|
|
||||||
<path style="fill:#82AFFF;" d="M417.35,230.532c-0.446-0.446-0.591-2.611,0.64-2.857c1.231-0.246,2.857,1.675,2.759,4.04 C420.748,231.715,418.187,231.369,417.35,230.532z"/>
|
|
||||||
<path style="fill:#82AFFF;" d="M418.63,231.763c1.429,0.457,2.808,1.675,2.808,1.675s-2.561,1.871-4.335,1.281 C415.329,234.128,416.167,230.976,418.63,231.763z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#464655;" d="M382.369,199.169l1.25,1.25c0.21,0.21,0.551,0.21,0.76,0l1.25-1.25 c0.339-0.339,0.099-0.918-0.381-0.918h-2.5C382.27,198.251,382.031,198.83,382.369,199.169z"/>
|
|
||||||
<path style="fill:#464655;" d="M381.715,204.294c-0.927,0-1.729-0.332-2.274-0.946c-0.564-0.638-0.803-1.515-0.661-2.408 c0.051-0.299,0.351-0.48,0.632-0.456c0.301,0.05,0.505,0.332,0.457,0.634c-0.09,0.564,0.054,1.108,0.397,1.496 c0.354,0.397,0.895,0.581,1.559,0.573c1.386-0.055,1.618-1.41,1.628-1.465l-0.007-2.473c0-0.305,0.246-0.551,0.551-0.551 s0.551,0.246,0.551,0.551v2.559c-0.134,0.884-0.856,2.408-2.68,2.482C381.819,204.294,381.766,204.294,381.715,204.294z"/>
|
|
||||||
<path style="fill:#464655;" d="M386.284,204.294c-0.051,0-0.103,0-0.156-0.003c-1.824-0.074-2.546-1.598-2.674-2.396l-0.007-2.645 c0-0.305,0.246-0.551,0.551-0.551s0.551,0.246,0.551,0.551v2.559c0.019,0.055,0.277,1.327,1.621,1.379 c0.683,0.012,1.204-0.169,1.559-0.573c0.343-0.388,0.488-0.932,0.397-1.496c-0.047-0.301,0.156-0.585,0.457-0.634 c0.288-0.036,0.584,0.154,0.632,0.456c0.143,0.893-0.097,1.77-0.66,2.408C388.012,203.962,387.211,204.294,386.284,204.294z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#F5F5F5;" d="M402.916,284.375c0,0-3.94-6.305-8.538-2.102c-4.598,4.204-6.305,9.327-11.56,8.932 c-2.883-0.216-4.356-1.533-5.121-2.684c1.396-1.149,2.386-2.894,1.312-5.461c-2.365-5.649-11.034-3.94-13.399,2.233 c0,0,2.759-9.064-6.831-6.042c0,0-1.182-6.305-6.699-4.598c-3,0.929-4.11,2.775-4.522,4.279c-1.161-0.27-2.652-0.262-4.017,0.843 l6.962,18.785l10.509,0.131l2.365,3.546l13.793,8.67l2.496,5.255h8.67c0,0,0.657-5.386,5.255-6.962 c4.598-1.577,12.085-4.861,12.874-7.751c0.788-2.89,0.788-2.89,0.788-2.89l8.407,0.131c0.919-0.657,7.094-10.772,7.094-10.772 l2.866-13.027C424.037,274.665,405.931,272.315,402.916,284.375z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M425.641,274.785l-0.024,0.109c0.073,0.01,0.156,0.023,0.156,0.023L425.641,274.785z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#FFE15A;" d="M368.424,304.516c-3.406-1.373-4.622-3.297-5.043-4.322c-0.391-0.948-0.314-1.62-0.207-1.866 c0.217-0.502,0.48-0.822,0.725-0.884c0.231-0.055,0.523,0.077,0.576,0.11c0.11,0.126,0.169,0.526,0.063,0.625 c-0.634,0.597-0.663,1.594-0.067,2.229c0.599,0.634,1.593,0.662,2.229,0.067c0.648-0.609,1.02-1.462,1.045-2.401 c0.03-1.006-0.339-2.01-0.982-2.688c-0.646-0.683-1.971-1.305-3.383-1.053c-0.291,0.051-0.619,0.17-0.954,0.332 c0.221-2.184-0.621-3.302-1.239-3.753c-1.039-0.755-2.518-0.772-3.763-0.043c-1.273,0.748-1.961,2.057-1.793,3.411 c0.108,0.865,0.975,1.383,1.821,1.266c0.864-0.105,1.543-0.997,1.437-1.859c0.179-0.163,0.414-0.218,0.406-0.256 c0.003,0.003,0.211,0.348-0.04,1.46c-0.393,1.742-1.314,2.814-2.74,3.19c-1.775,0.49-4.049-0.258-5.393-1.734 c-1.869-2.057-5.781-12.971-8.107-20.241c9.971-4.729,11.196-12.586,11.007-16.964c-0.288-6.669-4.278-13.492-8.715-14.899 c-1.746-0.551-4.361-0.665-6.259,0.314c-1.075,0.561-1.821,1.419-2.157,2.487c-0.685,2.179,0.686,3.981,2.326,4.569 c1.698,0.609,3.412-0.124,4.071-1.746c0.327-0.807-0.03-1.73-0.836-2.057c-0.811-0.335-1.694,0.058-2.019,0.862 c-0.066,0.036-0.285-0.046-0.448-0.231c-0.118-0.136-0.143-0.268-0.085-0.449c0.052-0.167,0.171-0.413,0.605-0.638 c1.03-0.538,2.752-0.456,3.852-0.108c2.539,0.803,6.246,5.77,6.516,12.029c0.161,3.741-0.974,10.598-10.388,14.505 c-0.755,0.314-1.144,1.149-0.9,1.928c0.615,1.967,6.098,19.341,9.204,22.755c1.671,1.838,4.196,2.906,6.611,2.906 c0.654,0,1.301-0.077,1.92-0.241c1.053-0.279,1.932-0.822,2.697-1.504c0.076,0.578,0.21,1.17,0.454,1.762 c0.609,1.484,2.3,4.243,7.02,6.145c9.547,3.83,10.454,6.391,10.402,7.318c-0.029,0.508-0.32,0.772-0.557,0.905 c-0.103,0.058-0.205,0.095-0.292,0.117c0.352-0.483,0.416-1.145,0.105-1.703c-0.425-0.76-1.383-1.032-2.144-0.607 c-1.073,0.6-1.821,2.014-1.18,3.559c0.5,1.201,1.671,1.928,3.023,1.928c0.217,0,0.439-0.019,0.663-0.059 c1.963-0.332,3.413-1.961,3.529-3.959C381.31,310.253,374.103,306.794,368.424,304.516z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M399.575,304.516c3.406-1.373,4.622-3.297,5.043-4.322c0.391-0.948,0.314-1.62,0.207-1.866 c-0.217-0.502-0.48-0.822-0.725-0.884c-0.231-0.055-0.523,0.077-0.576,0.11c-0.11,0.126-0.169,0.526-0.063,0.625 c0.635,0.597,0.663,1.594,0.067,2.229c-0.599,0.634-1.593,0.662-2.229,0.067c-0.648-0.609-1.02-1.462-1.045-2.401 c-0.029-1.006,0.339-2.01,0.982-2.688c0.646-0.683,1.971-1.305,3.383-1.053c0.291,0.051,0.619,0.17,0.954,0.332 c-0.221-2.184,0.621-3.302,1.239-3.753c1.039-0.755,2.518-0.772,3.763-0.043c1.273,0.748,1.961,2.057,1.793,3.411 c-0.108,0.865-0.975,1.383-1.821,1.266c-0.864-0.105-1.543-0.997-1.437-1.859c-0.179-0.163-0.414-0.218-0.406-0.256 c-0.003,0.003-0.211,0.348,0.04,1.46c0.393,1.742,1.314,2.814,2.74,3.19c1.775,0.49,4.049-0.258,5.393-1.734 c1.869-2.057,5.781-12.971,8.107-20.241c-9.971-4.729-11.196-12.586-11.007-16.964c0.288-6.669,4.278-13.492,8.715-14.899 c1.746-0.551,4.361-0.665,6.259,0.314c1.075,0.561,1.821,1.419,2.157,2.487c0.685,2.179-0.686,3.981-2.326,4.569 c-1.698,0.609-3.412-0.124-4.071-1.746c-0.327-0.807,0.03-1.73,0.836-2.057c0.811-0.335,1.694,0.058,2.019,0.862 c0.066,0.036,0.285-0.046,0.448-0.231c0.118-0.136,0.143-0.268,0.085-0.449c-0.052-0.167-0.171-0.413-0.605-0.638 c-1.03-0.538-2.752-0.456-3.852-0.108c-2.539,0.803-6.246,5.77-6.516,12.029c-0.161,3.741,0.974,10.598,10.388,14.505 c0.755,0.314,1.144,1.149,0.9,1.928c-0.615,1.967-6.098,19.341-9.204,22.755c-1.671,1.838-4.196,2.906-6.611,2.906 c-0.654,0-1.301-0.077-1.92-0.241c-1.053-0.279-1.932-0.822-2.697-1.504c-0.076,0.578-0.21,1.17-0.454,1.762 c-0.609,1.484-2.3,4.243-7.02,6.145c-9.547,3.83-10.454,6.391-10.402,7.318c0.03,0.508,0.32,0.772,0.557,0.905 c0.103,0.058,0.205,0.095,0.292,0.117c-0.352-0.483-0.416-1.145-0.105-1.703c0.425-0.76,1.383-1.032,2.144-0.607 c1.073,0.6,1.821,2.014,1.18,3.559c-0.5,1.201-1.671,1.928-3.023,1.928c-0.217,0-0.439-0.019-0.663-0.059 c-1.963-0.332-3.413-1.961-3.529-3.959C386.688,310.253,393.896,306.794,399.575,304.516z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 10 KiB |
@@ -1,193 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
|
||||||
<path style="fill:#FF4B55;" d="M511.808,123.616c-1.472-19.776-18.112-35.328-38.208-35.328H38.272 c-20.096,0-36.608,15.488-38.208,35.328H0v264.832h0.128c1.472,19.776,18.048,35.264,38.144,35.264H473.6 c20.224,0,36.672-15.616,38.208-35.328H512V123.616H511.808z"/>
|
|
||||||
<rect y="123.62" style="fill:#41479B;" width="512" height="264.83"/>
|
|
||||||
<circle style="fill:#F5F5F5;" cx="256" cy="256.03" r="114.82"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#82AFFF;" d="M233.984,316.32l-17.728,3.008c-2.176,0.384-4.288-1.28-4.288-3.584v-6.72h22.016L233.984,316.32 L233.984,316.32z"/>
|
|
||||||
<path style="fill:#82AFFF;" d="M277.888,316.32l17.728,3.008c2.176,0.384,4.288-1.28,4.288-3.584v-6.72h-22.016V316.32 L277.888,316.32z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#965032;" d="M252.288,197.216h-1.472c-1.792,0-3.52-1.024-4.288-2.688l-2.688-5.376l2.496-1.216l2.688,5.376 c0.384,0.704,1.088,1.088,1.92,1.088h1.472v2.816L252.288,197.216L252.288,197.216z"/>
|
|
||||||
|
|
||||||
<rect x="219.945" y="195.396" transform="matrix(-0.4472 -0.8944 0.8944 -0.4472 149.6537 485.9717)" style="fill:#965032;" width="10.112" height="2.688"/>
|
|
||||||
<path style="fill:#965032;" d="M260.992,239.52l-7.488-7.488c-1.6-1.6-2.624-3.904-2.624-6.208v-2.496 c0-0.896-0.192-1.92-0.576-2.688l-1.92-3.712c-0.384-0.832-1.216-1.28-1.984-1.28h-6.528c-1.92,0-3.584-1.088-4.48-2.816 l-2.624-5.312l2.496-1.216l2.624,5.312c0.384,0.832,1.216,1.28,1.984,1.28h6.528c1.92,0,3.584,1.088,4.48,2.816l1.92,3.712 c0.576,1.216,0.896,2.624,0.896,3.904v2.496c0,1.6,0.576,3.072,1.792,4.224l2.816,2.816v-12.8c0-3.52-1.216-6.912-3.392-9.6 c-2.624-3.2-4.032-7.232-4.032-11.328v-10.624h2.688v10.624c0,3.52,1.216,6.912,3.392,9.6c2.624,3.2,4.032,7.232,4.032,11.328 L260.992,239.52L260.992,239.52z"/>
|
|
||||||
<path style="fill:#965032;" d="M254.4,232.416h-4.096c-2.496,0-4.8-1.6-5.696-3.904l-1.024-2.816l2.624-1.024l1.024,2.816 c0.512,1.28,1.728,2.112,3.072,2.112h4.096V232.416L254.4,232.416z"/>
|
|
||||||
|
|
||||||
<rect x="257.922" y="183.324" transform="matrix(-0.915 -0.4035 0.4035 -0.915 414.7991 492.3181)" style="fill:#965032;" width="2.688" height="38.271"/>
|
|
||||||
<polygon style="fill:#965032;" points="272,215.648 258.688,215.648 258.688,212.832 269.184,212.832 269.184,199.52 272,199.52 "/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#73AF00;" d="M246.784,228.832h-11.008c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h11.008c3.008,0,5.504,2.496,5.504,5.504l0,0C252.288,226.464,249.792,228.832,246.784,228.832z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M272.384,228.832h-11.008c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h11.008c3.008,0,5.504,2.496,5.504,5.504l0,0C277.888,226.464,275.52,228.832,272.384,228.832z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M283.392,217.824H268.8c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h14.592c3.008,0,5.504,2.496,5.504,5.504l0,0C288.896,215.456,286.4,217.824,283.392,217.824z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M287.104,203.232h-25.6c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504h25.6 c3.008,0,5.504,2.496,5.504,5.504l0,0C292.608,200.736,290.112,203.232,287.104,203.232z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M272.384,188.64h-7.296c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h7.296c3.008,0,5.504,2.496,5.504,5.504l0,0C277.888,186.144,275.52,188.64,272.384,188.64z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M224.832,195.936h-3.712c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h3.712c3.008,0,5.504,2.496,5.504,5.504l0,0C230.272,193.44,227.904,195.936,224.832,195.936z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M250.496,192.224h-11.008c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h11.008c3.008,0,5.504,2.496,5.504,5.504l0,0C255.872,189.856,253.504,192.224,250.496,192.224z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M246.784,210.528h-22.016c-3.008,0-5.504-2.496-5.504-5.504l0,0c0-3.008,2.496-5.504,5.504-5.504 h22.016c3.008,0,5.504,2.496,5.504,5.504l0,0C252.288,208.16,249.792,210.528,246.784,210.528z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M310.912,287.136H201.024c-4.032,0-7.296,3.328-7.296,7.296s3.328,7.296,7.296,7.296h29.312 c0,4.032,3.328,7.296,7.296,7.296h36.608c4.032,0,7.296-3.328,7.296-7.296h29.312c4.032,0,7.296-3.328,7.296-7.296 C318.208,290.336,314.88,287.136,310.912,287.136z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#BE7855;" d="M328.896,222.112c-0.32-0.512-1.728,0.128-2.624-0.192c-11.072-4.096-25.92-11.584-35.584-16.704 l-1.92-3.072l-18.368-8.896c-1.216-0.576-2.624-0.128-3.2,1.024l-0.896,1.6c-0.704,1.216-0.192,2.816,1.024,3.392l17.472,9.088 l4.992-0.384l19.2,9.92c0,0,13.12,6.72,13.824,7.232s1.088,3.2,2.432,3.008C326.08,227.808,330.112,224.544,328.896,222.112z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#FFBE3C;" d="M207.616,292.512c0,0,1.216,5.376,0.128,6.016c-1.088,0.576-7.232,0.576-7.104-0.704 c0.192-1.28,1.024-5.888,1.024-5.888L207.616,292.512z"/>
|
|
||||||
<path style="fill:#FFBE3C;" d="M217.728,289.632c0,0-1.024,4.032,1.024,4.224s13.184,0.128,13.504-0.192 c0.32-0.32,0.704-1.088,0.704-1.088l-10.432-2.88h-4.8L217.728,289.632L217.728,289.632z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#EAF3F5;" d="M206.272,239.264c0,0-2.688,6.528-3.712,28.928c-0.32,6.016,0.512,4.608-2.496,23.808l3.52,1.792 c1.024,0.512,2.304,0.512,3.328-0.128l3.392-2.112c0,0-1.728-21.504,3.776-33.92c0,0,2.88,5.312,2.88,9.28 s-0.192,22.976-0.192,22.976s6.4,1.088,9.28,0.832c0,0-1.792-41.408-3.712-51.072L206.272,239.264z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#965032;" d="M206.912,236.512c0,0-1.088,0.832-0.512,2.688c0,0,8.384,3.584,16.192,0.512 c0,0,0.896-1.28-0.192-2.816L206.912,236.512z"/>
|
|
||||||
<path style="fill:#965032;" d="M195.712,216.736c-4.8,1.792-12.032,6.208-11.52,9.728s2.88,2.688,3.712,1.792 s3.008-3.584,3.712-4.096c0.704-0.512,11.904-6.272,11.904-6.272l29.824-15.296c0,0,0.192-1.472-1.472-2.688 C231.68,199.84,213.504,210.016,195.712,216.736z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#FFBE3C;" d="M209.728,199.456l-0.192,1.28c0,0-0.512,8.128,2.176,10.176c0,0,0.576,1.728-0.32,2.496 c-0.896,0.832-9.984,5.376-9.984,5.376s-2.304,4.928-2.304,7.616c0,0-2.176-0.896-1.984-1.92c0.192-1.088,1.472-3.904,1.088-5.312 s-1.92-1.024-1.92-1.024s-0.704,0.832,0.512,1.28l-0.384,1.728l-4.928,2.88l1.088,1.28c0,0,0.128,10.112,6.016,11.392 c0,0,3.072,0.192,6.912-6.912c0,0,1.984,3.52,1.28,6.592c0,0,6.528,3.52,15.424,0.512l0.128-6.208c0,0,1.408,9.472,6.08,8.576 c0,0,12.992-4.992,10.816-6.912c-4.992-4.416-11.072-0.704-11.072-0.704c-0.32-6.4-0.832-14.72-1.728-15.616 c-1.408-1.472-5.632-0.704-6.4-2.624c-0.832-1.92-0.576-5.312,0.32-9.216s-3.712-6.592-3.712-6.592L209.728,199.456z"/>
|
|
||||||
<path style="fill:#464655;" d="M209.6,200.736c0,0,4.672,1.216,8.32-0.32l1.6,4.032h0.896c0,0,2.176-7.296-0.704-7.296 c0,0,0-2.432-5.12-2.304C210.176,194.912,208.576,197.856,209.6,200.736z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#965032;" d="M304.896,292.512c0,0-1.216,5.376-0.128,6.016c1.088,0.576,7.232,0.576,7.104-0.704 c-0.192-1.28-1.024-5.888-1.024-5.888L304.896,292.512z"/>
|
|
||||||
<path style="fill:#965032;" d="M294.784,289.632c0,0,1.024,4.032-1.024,4.224c-2.048,0.192-13.184,0.128-13.504-0.192 c-0.32-0.32-0.704-1.088-0.704-1.088l10.368-2.88h4.864L294.784,289.632L294.784,289.632z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#EAF3F5;" d="M306.112,239.264c0,0,2.688,6.528,3.712,28.928c0.32,6.016-0.512,4.608,2.496,23.808l-3.52,1.792 c-1.024,0.512-2.304,0.512-3.328-0.128l-3.392-2.112c0,0,1.728-21.504-3.776-33.92c0,0-2.88,5.312-2.88,9.28 s0.192,22.976,0.192,22.976s-6.4,1.088-9.28,0.832c0,0,1.792-41.408,3.712-51.072L306.112,239.264z"/>
|
|
||||||
<path style="fill:#BE7855;" d="M305.6,236.512c0,0,1.088,0.832,0.512,2.688c0,0-8.384,3.584-16.192,0.512 c0,0-0.896-1.28,0.192-2.816L305.6,236.512z"/>
|
|
||||||
<path style="fill:#965032;" d="M302.784,199.456l0.192,1.28c0,0,0.512,8.128-2.176,10.176c0,0-0.576,1.728,0.32,2.496 c0.896,0.832,9.984,5.376,9.984,5.376s2.304,4.928,2.304,7.616c0,0,2.176-0.896,1.984-1.92c-0.192-1.088-1.472-3.904-1.088-5.312 c0.384-1.408,1.92-1.024,1.92-1.024s0.704,0.832-0.512,1.28l0.384,1.728l4.928,2.88l-1.088,1.28c0,0-0.128,10.112-6.016,11.392 c0,0-3.072,0.192-6.912-6.912c0,0-1.984,3.52-1.28,6.592c0,0-6.528,3.52-15.424,0.512l-0.128-6.208c0,0-1.408,9.472-6.08,8.576 c0,0-12.992-4.992-10.816-6.912c4.992-4.416,11.072-0.704,11.072-0.704c0.32-6.4,0.832-14.72,1.728-15.616 c1.408-1.472,5.632-0.704,6.4-2.624c0.832-1.92,0.576-5.312-0.32-9.216s3.712-6.592,3.712-6.592L302.784,199.456z"/>
|
|
||||||
<path style="fill:#464655;" d="M302.912,200.736c0,0-4.672,1.216-8.32-0.32l-1.6,4.032h-0.896c0,0-2.176-7.296,0.704-7.296 c0,0,0-2.432,5.12-2.304C302.272,194.912,303.872,197.856,302.912,200.736z"/>
|
|
||||||
<path style="fill:#EAF3F5;" d="M224.512,203.744c-0.384-0.896,0.32-1.216,0.32-1.216s4.608-2.496,5.184-2.496 c0.896,0.128,1.984,1.6,1.984,3.008c0,1.28,1.728,4.8,5.312,5.696c0,0-4.48,6.08-10.688,5.184 C226.496,213.92,226.88,209.824,224.512,203.744z"/>
|
|
||||||
<path style="fill:#82AFFF;" d="M230.976,232.16c-1.408,0-2.496,1.216-2.496,2.624v30.272c0,7.296,3.392,33.024,27.52,40.32 c24-7.296,27.52-33.024,27.52-40.32v-30.272c0-1.472-1.088-2.624-2.496-2.624H230.976L230.976,232.16z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M283.392,265.12v-30.272c0-1.472-1.088-2.624-2.496-2.624h-25.024v25.6L280,281.952 C282.688,274.848,283.392,268.32,283.392,265.12z"/>
|
|
||||||
<path style="fill:#EAF3F5;" d="M228.48,265.12v-30.272c0-1.472,1.088-2.624,2.496-2.624H256v25.6l-24.128,24.128 C229.12,274.848,228.48,268.32,228.48,265.12z"/>
|
|
||||||
<polygon style="fill:#8C5A28;" points="239.68,281.12 246.08,287.84 263.808,287.84 267.52,283.04 263.232,284.832 248.896,284.832 "/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M246.592,272.416l-1.024,9.792l-4.416-1.728C241.216,280.544,243.2,275.808,246.592,272.416z"/>
|
|
||||||
<g>
|
|
||||||
<rect x="255.3" y="268.64" style="fill:#8C5A28;" width="0.704" height="16.704"/>
|
|
||||||
<rect x="261.31" y="270.05" style="fill:#8C5A28;" width="0.704" height="15.232"/>
|
|
||||||
<rect x="249.28" y="270.05" style="fill:#8C5A28;" width="0.704" height="15.232"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#F5F5F5;" d="M257.792,283.616h-4.416c-0.32,0-0.512-0.192-0.512-0.512v-2.368c0-0.32,0.192-0.512,0.512-0.512 h4.416c0.32,0,0.512,0.192,0.512,0.512v2.368C258.432,283.424,258.112,283.616,257.792,283.616z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M257.792,279.008h-4.416c-0.32,0-0.512-0.192-0.512-0.512V276c0-0.32,0.192-0.512,0.512-0.512h4.416 c0.32,0,0.512,0.192,0.512,0.512v2.432C258.432,278.752,258.112,279.008,257.792,279.008z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M257.792,274.656h-4.416c-0.32,0-0.512-0.192-0.512-0.512v-2.368c0-0.32,0.192-0.512,0.512-0.512 h4.416c0.32,0,0.512,0.192,0.512,0.512v2.368C258.432,274.464,258.112,274.656,257.792,274.656z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M263.488,283.616h-3.712c-0.32,0-0.512-0.192-0.512-0.512v-2.368c0-0.32,0.192-0.512,0.512-0.512 h3.712c0.32,0,0.512,0.192,0.512,0.512v2.368C264,283.424,263.808,283.616,263.488,283.616z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M263.488,279.328h-3.712c-0.32,0-0.512-0.192-0.512-0.512v-1.92c0-0.32,0.192-0.512,0.512-0.512 h3.712c0.32,0,0.512,0.192,0.512,0.512v1.92C264,279.136,263.808,279.328,263.488,279.328z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M263.488,275.104h-3.712c-0.32,0-0.512-0.192-0.512-0.512v-1.408c0-0.32,0.192-0.512,0.512-0.512 h3.712c0.32,0,0.512,0.192,0.512,0.512v1.408C264,274.848,263.808,275.104,263.488,275.104z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M251.392,283.616h-3.712c-0.32,0-0.512-0.192-0.512-0.512v-2.368c0-0.32,0.192-0.512,0.512-0.512 h3.712c0.32,0,0.512,0.192,0.512,0.512v2.368C252.032,283.424,251.712,283.616,251.392,283.616z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M251.392,279.328h-3.712c-0.32,0-0.512-0.192-0.512-0.512v-1.92c0-0.32,0.192-0.512,0.512-0.512 h3.712c0.32,0,0.512,0.192,0.512,0.512v1.92C252.032,279.136,251.712,279.328,251.392,279.328z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M251.392,275.104h-3.712c-0.32,0-0.512-0.192-0.512-0.512v-1.408c0-0.32,0.192-0.512,0.512-0.512 h3.712c0.32,0,0.512,0.192,0.512,0.512v1.408C252.032,274.848,251.712,275.104,251.392,275.104z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<polygon style="fill:#FF4B55;" points="261.312,270.048 261.312,272.032 258.432,271.008 "/>
|
|
||||||
<polygon style="fill:#FF4B55;" points="249.28,270.048 249.28,272.032 246.4,271.008 "/>
|
|
||||||
<polygon style="fill:#FF4B55;" points="255.296,268.64 255.296,270.56 252.416,269.536 "/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#4173CD;" d="M277.696,287.136h-43.584c0.576,1.216,1.408,2.496,2.176,3.712h39.296 C276.416,289.504,277.12,288.352,277.696,287.136z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M275.584,290.72h-39.296l0,0c1.728,2.624,3.904,5.12,6.4,7.296h26.432 C271.68,295.84,273.792,293.344,275.584,290.72L275.584,290.72z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M242.688,298.016c3.52,3.072,7.808,5.696,13.184,7.296c5.376-1.6,9.728-4.224,13.184-7.296H242.688z"/>
|
|
||||||
<path style="fill:#BE7855;" d="M251.2,259.936c0,0-0.32,0.128-0.576,0.128c-0.192-0.128-0.704-0.128-0.384-1.024 c0.128-0.384,0.384-1.024,0.192-1.216s-0.32-0.384-0.512-0.576c-0.384-0.384-0.832-0.896-1.28-1.472 c-1.024-1.088-2.112-2.304-3.392-3.52c-0.704-0.576-1.28-1.216-1.984-1.92c-0.704-0.576-1.408-1.28-2.176-1.92 c-0.384-0.192-1.024-0.384-1.472-0.512c-0.512-0.192-0.832-0.576-1.088-0.896c-0.704-0.576-1.408-1.28-1.984-1.92 c-1.28-1.216-2.496-2.368-3.52-3.392s-1.792-1.792-2.304-2.432c-0.512-0.576-0.512-1.472,0.128-1.984l1.6-1.6 c0.576-0.512,1.472-0.512,1.984,0c0.576,0.576,1.408,1.408,2.432,2.368c1.024,0.96,2.112,2.304,3.328,3.584 c0.576,0.704,1.216,1.408,1.792,2.112c0.32,0.384,0.704,0.704,0.832,1.216c0.192,0.512,0.32,1.088,0.512,1.472 c0.512,0.832,1.216,1.472,1.792,2.176s1.216,1.408,1.792,2.112c1.216,1.408,2.304,2.624,3.392,3.584 c0.512,0.512,1.024,0.896,1.408,1.28c0.192,0.192,0.384,0.384,0.576,0.576c0.128,0.192,0.704-0.128,1.216-0.192 c0.896-0.192,0.896,0.192,0.896,0.384c0,0.32-0.128,0.576-0.128,0.576L251.2,259.936z"/>
|
|
||||||
<path style="fill:#965032;" d="M233.28,262.816c-0.32,0-0.576-0.128-0.832-0.32c-0.576-0.512-0.704-1.28-0.32-1.92l12.992-17.728 c0.384-0.576,1.28-0.704,1.92-0.32c0.576,0.512,0.704,1.28,0.32,1.92l-12.992,17.728 C234.112,262.624,233.728,262.816,233.28,262.816z"/>
|
|
||||||
<polygon style="fill:#F5F5F5;" points="243.712,241.76 250.496,246.24 253.376,242.208 247.104,237.152 "/>
|
|
||||||
<path style="fill:#965032;" d="M261.824,240.032l17.408,21.504c0,0,2.432,0.128,2.112-1.792l-17.984-21.12L261.824,240.032z"/>
|
|
||||||
<path style="fill:#EAF3F5;" d="M257.92,243.04c0,0,4.928-0.896,6.912-3.904l2.816,3.328c0,0-4.608,3.2-4.992,6.72 C262.592,249.056,258.88,248.032,257.92,243.04z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#965032;" d="M276.672,240.864c-0.32,0-0.576-0.192-0.832-0.512c-0.512-0.896-0.576-1.792-0.32-2.496 c0.512-1.024,1.472-1.28,1.728-1.408c0.512-0.128,1.024,0.192,1.088,0.576c0.128,0.512-0.192,1.024-0.576,1.088 c-0.128,0-0.384,0.192-0.512,0.384s0,0.576,0.192,1.024c0.192,0.384,0.128,1.024-0.384,1.216 C276.992,240.864,276.8,240.864,276.672,240.864z"/>
|
|
||||||
<path style="fill:#965032;" d="M262.4,254.112c0-0.32-0.192-0.576-0.512-0.832c-0.896-0.512-1.792-0.576-2.496-0.32 c-1.024,0.512-1.28,1.472-1.408,1.728c-0.128,0.512,0.192,1.024,0.576,1.088c0.512,0.128,1.024-0.192,1.088-0.576 c0-0.128,0.192-0.384,0.384-0.512c0.192-0.128,0.576,0,1.024,0.192c0.384,0.192,1.024,0.128,1.216-0.384 C262.4,254.432,262.4,254.24,262.4,254.112z"/>
|
|
||||||
</g>
|
|
||||||
<polygon style="fill:#EAF3F5;" points="277.312,238.816 260.928,254.944 264.704,259.232 280.768,243.104 "/>
|
|
||||||
<path style="fill:#FFBE3C;" d="M194.112,215.712c1.088-0.32,2.112,1.216,1.088,2.304s-3.904,3.008-4.672,2.816 C188.928,220.512,187.776,217.12,194.112,215.712z"/>
|
|
||||||
<path style="fill:#965032;" d="M318.272,217.248c-1.024-0.32-1.92,1.216-1.024,2.304c0.896,1.088,3.584,3.008,4.416,2.816 C323.2,222.048,324.096,218.72,318.272,217.248z"/>
|
|
||||||
<path style="fill:#464655;" d="M280.896,232.16c1.408,0,2.496,1.216,2.496,2.624v30.272c0,7.296-3.392,33.024-27.52,40.32 c-24-7.296-27.52-33.024-27.52-40.32v-30.272c0-1.472,1.088-2.624,2.496-2.624H280.896 M280.896,230.304h-49.92 c-2.432,0-4.288,1.984-4.288,4.48v30.272c0,1.728,0.192,11.008,4.928,20.928c4.992,10.624,13.184,17.92,23.872,21.12l0.512,0.192 l0.512-0.192c10.688-3.2,18.88-10.496,23.872-21.12c4.672-9.92,4.928-19.2,4.928-20.928v-30.272 C285.184,232.352,283.328,230.304,280.896,230.304L280.896,230.304z"/>
|
|
||||||
<path style="fill:#EAF3F5;" d="M299.904,305.824c-7.808-2.624-16.128-1.408-24,3.776c-10.112,6.72-16.704,6.72-19.904,6.72 c-3.2,0-9.92,0-19.904-6.72c-7.872-5.184-16.192-6.528-24-3.776v7.808c4.928-2.304,11.776-3.328,19.904,2.112 c11.904,7.872,20.416,7.872,24,7.872c3.584,0,12.096,0,24-7.872c8.128-5.376,14.976-4.416,19.904-2.112V305.824z"/>
|
|
||||||
<path style="fill:#965032;" d="M255.872,347.552c-51.52,0-93.376-41.92-93.376-93.376s41.92-93.376,93.376-93.376 s93.44,41.856,93.44,93.312S307.392,347.552,255.872,347.552z M255.872,164.448c-49.472,0-89.728,40.192-89.728,89.728 s40.192,89.728,89.728,89.728s89.728-40.256,89.728-89.792S305.408,164.448,255.872,164.448z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#73AF00;" d="M153.792,261.92c0,0-0.384-11.392,10.624-11.392c0,0,0.192,4.48-3.712,6.528 C157.504,258.528,153.792,261.92,153.792,261.92z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M174.976,261.92c0,0,0.384-11.392-10.624-11.392c0,0-0.192,4.48,3.712,6.528 C171.392,258.528,174.976,261.92,174.976,261.92z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M358.016,250.464c0,0,0.384,11.392-10.624,11.392c0,0-0.192-4.48,3.712-6.528 C354.304,253.856,358.016,250.464,358.016,250.464z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M336.832,250.464c0,0-0.384,11.392,10.624,11.392c0,0,0.192-4.48-3.712-6.528 C340.416,253.856,336.832,250.464,336.832,250.464z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M261.632,358.304c0,0-11.392,0.384-11.392-10.624c0,0,4.48-0.192,6.528,3.712 C258.304,354.656,261.632,358.304,261.632,358.304z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M261.632,337.056c0,0-11.392-0.384-11.392,10.624c0,0,4.48,0.192,6.528-3.712 C258.304,340.704,261.632,337.056,261.632,337.056z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M250.176,154.144c0,0,11.392-0.384,11.392,10.624c0,0-4.48,0.192-6.528-3.712 C253.504,157.728,250.176,154.144,250.176,154.144z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M250.176,175.328c0,0,11.392,0.384,11.392-10.624c0,0-4.48-0.192-6.528,3.712 C253.504,171.616,250.176,175.328,250.176,175.328z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M187.776,332.448c0,0-8.384-7.808-0.576-15.616c0,0,3.328,3.008,1.92,7.232 C188.032,327.456,187.776,332.448,187.776,332.448z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M202.816,317.408c0,0-7.808-8.384-15.616-0.576c0,0,3.008,3.328,7.232,1.92 C197.824,317.664,202.816,317.408,202.816,317.408z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M324.096,179.936c0,0,8.384,7.808,0.576,15.616c0,0-3.328-3.008-1.92-7.232 C323.776,184.928,324.096,179.936,324.096,179.936z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M309.12,194.912c0,0,7.808,8.384,15.616,0.576c0,0-3.008-3.328-7.232-1.92 C313.984,194.72,309.12,194.912,309.12,194.912z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M332.096,324.32c0,0-7.808,8.384-15.616,0.576c0,0,3.008-3.328,7.232-1.92 C327.232,324.128,332.096,324.32,332.096,324.32z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M317.12,309.344c0,0-8.384,7.808-0.576,15.616c0,0,3.328-3.008,1.92-7.232 C317.376,314.336,317.12,309.344,317.12,309.344z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M179.712,188.064c0,0,7.808-8.384,15.616-0.576c0,0-3.008,3.328-7.232,1.92 C184.576,188.256,179.712,188.064,179.712,188.064z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M194.688,203.04c0,0,8.384-7.808,0.576-15.616c0,0-3.328,3.008-1.92,7.232 C194.496,198.112,194.688,203.04,194.688,203.04z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M163.776,300.512c0,0-4.672-10.432,5.376-14.592c0,0,1.92,4.096-1.024,7.424 C165.888,296.032,163.776,300.512,163.776,300.512z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M183.424,292.448c0,0-4.032-10.688-14.208-6.528c0,0,1.472,4.224,5.888,4.608 C178.688,290.72,183.424,292.448,183.424,292.448z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M348.032,211.808c0,0,4.672,10.432-5.376,14.592c0,0-1.92-4.096,1.024-7.424 C345.92,216.352,348.032,211.808,348.032,211.808z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M328.384,219.936c0,0,4.032,10.688,14.208,6.528c0,0-1.472-4.224-5.888-4.608 C333.12,221.664,328.384,219.936,328.384,219.936z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M300.288,348.32c0,0-10.368,4.672-14.592-5.376c0,0,4.096-1.92,7.424,1.024 C295.808,346.208,300.288,348.32,300.288,348.32z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M292.096,328.736c0,0-10.688,4.032-6.528,14.208c0,0,4.224-1.472,4.608-5.888 C290.432,333.408,292.096,328.736,292.096,328.736z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M211.584,164.064c0,0,10.432-4.672,14.592,5.376c0,0-4.096,1.92-7.424-1.024 C216.128,166.112,211.584,164.064,211.584,164.064z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M219.712,183.648c0,0,10.688-4.032,6.528-14.208c0,0-4.224,1.472-4.608,5.888 C221.376,179.04,219.712,183.648,219.712,183.648z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M222.08,352.736c0,0-10.688-4.032-6.528-14.208c0,0,4.224,1.472,4.608,5.888 C220.416,348.064,222.08,352.736,222.08,352.736z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M230.208,333.152c0,0-10.432-4.672-14.592,5.376c0,0,4.096,1.92,7.424-1.024 C225.728,335.264,230.208,333.152,230.208,333.152z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M289.728,159.712c0,0,10.688,4.032,6.528,14.208c0,0-4.224-1.472-4.608-5.888 C291.392,164.32,289.728,159.712,289.728,159.712z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M281.6,179.232c0,0,10.432,4.672,14.592-5.376c0,0-4.096-1.92-7.424,1.024 C286.08,177.248,281.6,179.232,281.6,179.232z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M352.384,289.952c0,0-4.032,10.688-14.208,6.528c0,0,1.472-4.224,5.888-4.608 C347.776,291.616,352.384,289.952,352.384,289.952z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M332.8,281.824c0,0-4.672,10.432,5.376,14.592c0,0,1.92-4.096-1.024-7.424 C334.912,286.304,332.8,281.824,332.8,281.824z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M159.424,222.432c0,0,4.032-10.688,14.208-6.528c0,0-1.472,4.224-5.888,4.608 C164.096,220.704,159.424,222.432,159.424,222.432z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M179.008,230.56c0,0,4.672-10.432-5.376-14.592c0,0-1.92,4.096,1.024,7.424 C176.896,226.016,179.008,230.56,179.008,230.56z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M156.928,281.76c0,0-2.624-11.072,8.192-13.312c0,0,1.088,4.416-2.432,7.104 C159.808,277.728,156.928,281.76,156.928,281.76z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M177.728,277.664c0,0-1.92-11.328-12.608-9.216c0,0,0.704,4.48,4.928,5.632 C173.504,275.04,177.728,277.664,177.728,277.664z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M354.88,230.624c0,0,2.624,11.072-8.192,13.312c0,0-1.088-4.416,2.368-7.104 C352,234.656,354.88,230.624,354.88,230.624z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M334.08,234.848c0,0,1.92,11.328,12.608,9.216c0,0-0.704-4.48-4.928-5.632 C338.432,237.408,334.08,234.848,334.08,234.848z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M281.408,355.232c0,0-11.072,2.624-13.312-8.192c0,0,4.416-1.088,7.104,2.432 C277.376,352.224,281.408,355.232,281.408,355.232z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M277.312,334.432c0,0-11.328,1.92-9.216,12.608c0,0,4.48-0.704,5.632-4.928 C274.688,338.656,277.312,334.432,277.312,334.432z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M230.4,157.216c0,0,11.072-2.624,13.312,8.192c0,0-4.416,1.088-7.104-2.432 C234.432,160.16,230.4,157.216,230.4,157.216z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M234.496,178.016c0,0,11.328-1.92,9.216-12.608c0,0-4.48,0.704-5.632,4.928 C237.12,173.728,234.496,178.016,234.496,178.016z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M203.904,344.224c0,0-9.728-6.016-3.584-15.232c0,0,3.904,2.304,3.328,6.72 C203.2,339.36,203.904,344.224,203.904,344.224z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M215.68,326.624c0,0-9.28-6.72-15.424,2.496c0,0,3.584,2.688,7.488,0.512 C210.88,327.84,215.68,326.624,215.68,326.624z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M307.904,168.16c0,0,9.728,6.016,3.584,15.232c0,0-3.904-2.304-3.328-6.72 C308.608,173.024,307.904,168.16,307.904,168.16z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M296.128,185.76c0,0,9.28,6.72,15.424-2.496c0,0-3.584-2.688-7.488-0.512 C300.928,184.608,296.128,185.76,296.128,185.76z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M344,308.128c0,0-6.016,9.728-15.232,3.584c0,0,2.304-3.904,6.72-3.328 C339.072,308.96,344,308.128,344,308.128z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M326.272,296.352c0,0-6.72,9.28,2.496,15.424c0,0,2.688-3.584,0.512-7.488 C327.488,301.216,326.272,296.352,326.272,296.352z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M167.808,204.256c0,0,6.016-9.728,15.232-3.584c0,0-2.304,3.904-6.72,3.328 C172.672,203.424,167.808,204.256,167.808,204.256z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M185.472,216.032c0,0,6.72-9.28-2.496-15.424c0,0-2.688,3.584-0.512,7.488 C184.32,211.232,185.472,216.032,185.472,216.032z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M174.208,317.664c0,0-6.72-9.28,2.496-15.424c0,0,2.688,3.584,0.512,7.488 C175.424,312.8,174.208,317.664,174.208,317.664z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M191.808,305.952c0,0-6.016-9.728-15.232-3.584c0,0,2.304,3.904,6.72,3.328 C186.88,305.12,191.808,305.952,191.808,305.952z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M337.6,194.72c0,0,6.72,9.28-2.496,15.424c0,0-2.688-3.584-0.512-7.488 C336.384,199.52,337.6,194.72,337.6,194.72z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M320,206.56c0,0,6.016,9.728,15.232,3.584c0,0-2.304-3.904-6.72-3.328 C324.928,207.264,320,206.56,320,206.56z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M317.376,337.952c0,0-9.28,6.72-15.424-2.496c0,0,3.584-2.688,7.488-0.512 C312.576,336.736,317.376,337.952,317.376,337.952z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M305.6,320.224c0,0-9.728,6.016-3.584,15.232c0,0,3.904-2.304,3.328-6.72 C304.768,325.152,305.6,320.224,305.6,320.224z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M194.432,174.56c0,0,9.28-6.72,15.424,2.496c0,0-3.584,2.688-7.488,0.512 C199.296,175.648,194.432,174.56,194.432,174.56z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M206.208,192.16c0,0,9.728-6.016,3.584-15.232c0,0-3.904,2.304-3.328,6.72 C206.976,187.232,206.208,192.16,206.208,192.16z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M241.6,357.408c0,0-11.328-1.92-9.216-12.608c0,0,4.48,0.704,5.632,4.928 C238.976,353.248,241.6,357.408,241.6,357.408z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M245.696,336.608c0,0-11.072-2.624-13.312,8.192c0,0,4.416,1.088,7.104-2.368 C241.728,339.552,245.696,336.608,245.696,336.608z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M270.208,154.912c0,0,11.328,1.92,9.216,12.608c0,0-4.48-0.704-5.632-4.928 C272.768,159.264,270.208,154.912,270.208,154.912z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M266.112,175.712c0,0,11.072,2.624,13.312-8.192c0,0-4.416-1.088-7.104,2.432 C270.08,172.832,266.112,175.712,266.112,175.712z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M357.184,270.56c0,0-1.92,11.328-12.608,9.216c0,0,0.704-4.48,4.928-5.632 C352.896,273.056,357.184,270.56,357.184,270.56z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M336.384,266.336c0,0-2.624,11.072,8.192,13.312c0,0,1.088-4.416-2.432-7.104 C339.328,270.304,336.384,266.336,336.384,266.336z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M154.688,241.952c0,0,1.92-11.328,12.608-9.216c0,0-0.704,4.48-4.928,5.632 C158.912,239.328,154.688,241.952,154.688,241.952z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M175.488,246.048c0,0,2.624-11.072-8.192-13.312c0,0-1.088,4.416,2.432,7.104 C172.48,242.016,175.488,246.048,175.488,246.048z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 8.1 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 9.7 KiB |
Before Width: | Height: | Size: 35 KiB |
@@ -1,81 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve">
|
|
||||||
<path style="fill:#73AF00;" d="M473.655,88.276H38.345C17.167,88.276,0,105.444,0,126.621v73.471h512v-73.471 C512,105.444,494.833,88.276,473.655,88.276z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M0,385.38c0,21.177,17.167,38.345,38.345,38.345h435.31c21.177,0,38.345-17.167,38.345-38.345 v-73.471H0V385.38z"/>
|
|
||||||
<g>
|
|
||||||
<rect y="200.089" style="fill:#F5F5F5;" width="512" height="111.81"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M1.388,194.176h0.078c0.767,0,1.389-0.621,1.389-1.388v-3.008c0-0.767,0.621-1.388,1.389-1.388 h5.827c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.388,1.389,1.388h11.502c0.767,0,1.388-0.621,1.388-1.388v-5.939 c0-0.767-0.621-1.388-1.388-1.388h-5.79c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.621,1.388,1.388,1.388h2.935 c0.767,0,1.389,0.621,1.389,1.388v0.151c0,0.767-0.621,1.388-1.389,1.388h-5.792c-0.767,0-1.389-0.621-1.389-1.388v-3.081 c0-0.767-0.622-1.388-1.389-1.388H1.388c-0.767,0-1.388,0.621-1.388,1.388v5.939C0,193.553,0.621,194.176,1.388,194.176z M7.137,194.176h0.079c0.767,0,1.388-0.621,1.388-1.388v-0.079c0-0.767-0.621-1.388-1.388-1.388H7.137 c-0.767,0-1.389,0.622-1.389,1.388v0.079C5.748,193.553,6.37,194.176,7.137,194.176z M1.388,182.531h34.423 c0.767,0,1.389-0.621,1.389-1.388v-0.152c0-0.767-0.621-1.388-1.389-1.388H1.388c-0.767,0-1.388,0.621-1.388,1.388v0.152 C0,181.91,0.621,182.531,1.388,182.531z M35.811,194.176h-5.79c-0.767,0-1.389-0.621-1.389-1.388v-5.939 c0-0.767,0.621-1.388,1.389-1.388h8.647c0.767,0,1.389-0.622,1.389-1.388v-3.081c0-0.767,0.621-1.388,1.388-1.388h0.077 c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.388,1.388h0.079c0.767,0,1.388-0.621,1.388-1.388v-8.94 c0-0.767,0.621-1.388,1.388-1.388h0.077c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.388,1.388h0.115 c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.621-1.388,1.388-1.388h0.042c0.767,0,1.388,0.621,1.388,1.388v11.797 c0,0.767-0.621,1.388-1.388,1.388H41.447c-0.767,0-1.388-0.621-1.388-1.388v-3.008c0-0.767-0.621-1.388-1.389-1.388h-5.79 c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.621,1.388,1.389,1.388h2.933c0.767,0,1.389,0.622,1.389,1.388v0.079 C37.201,193.553,36.578,194.176,35.811,194.176z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M58.618,194.176h0.115c0.767,0,1.389-0.621,1.389-1.388v-3.008c0-0.767,0.621-1.388,1.388-1.388 h5.754c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.388,1.388,1.388h11.502c0.767,0,1.388-0.621,1.388-1.388v-5.939 c0-0.767-0.621-1.388-1.388-1.388h-5.79c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.621,1.388,1.389,1.388h2.935 c0.767,0,1.388,0.621,1.388,1.388v0.151c0,0.767-0.621,1.388-1.388,1.388h-5.792c-0.767,0-1.388-0.621-1.388-1.388v-3.081 c0-0.767-0.621-1.388-1.388-1.388H58.618c-0.767,0-1.388,0.621-1.388,1.388v5.939C57.23,193.553,57.852,194.176,58.618,194.176z M64.331,194.176h0.078c0.767,0,1.388-0.621,1.388-1.388v-0.079c0-0.767-0.621-1.388-1.388-1.388h-0.078 c-0.767,0-1.388,0.622-1.388,1.388v0.079C62.943,193.553,63.564,194.176,64.331,194.176z M58.618,182.531h34.387 c0.767,0,1.389-0.621,1.389-1.388v-0.152c0-0.767-0.621-1.388-1.389-1.388H58.618c-0.767,0-1.388,0.621-1.388,1.388v0.152 C57.23,181.91,57.852,182.531,58.618,182.531z M93.006,194.176h-5.827c-0.767,0-1.389-0.621-1.389-1.388v-5.939 c0-0.767,0.621-1.388,1.389-1.388h8.648c0.767,0,1.388-0.622,1.388-1.388v-3.081c0-0.767,0.621-1.388,1.389-1.388h0.115 c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.621,1.388,1.389,1.388h0.115c0.767,0,1.389-0.621,1.389-1.388v-8.94 c0-0.767,0.621-1.388,1.389-1.388h0.042c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.621,1.388,1.389,1.388h0.115 c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.621-1.388,1.388-1.388h0.078c0.767,0,1.388,0.621,1.388,1.388v11.797 c0,0.767-0.621,1.388-1.388,1.388H98.604c-0.767,0-1.389-0.621-1.389-1.388v-3.008c0-0.767-0.621-1.388-1.388-1.388h-5.754 c-0.767,0-1.388,0.621-1.388,1.388v0.151c0,0.767,0.621,1.388,1.388,1.388h2.935c0.767,0,1.389,0.622,1.389,1.388v0.079 C94.394,193.553,93.773,194.176,93.006,194.176z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M115.814,194.176h0.077c0.767,0,1.388-0.621,1.388-1.388v-3.008c0-0.767,0.621-1.388,1.388-1.388 h5.792c0.767,0,1.388,0.621,1.388,1.388v3.008c0,0.767,0.622,1.388,1.389,1.388h11.538c0.767,0,1.389-0.621,1.389-1.388v-5.939 c0-0.767-0.621-1.388-1.389-1.388h-5.79c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.621,1.388,1.389,1.388h2.935 c0.767,0,1.389,0.621,1.389,1.388v0.151c0,0.767-0.621,1.388-1.389,1.388h-5.827c-0.767,0-1.388-0.621-1.388-1.388v-3.081 c0-0.767-0.621-1.388-1.388-1.388h-11.502c-0.767,0-1.388,0.621-1.388,1.388v5.939 C114.424,193.553,115.047,194.176,115.814,194.176z M121.526,194.176h0.078c0.767,0,1.388-0.621,1.388-1.388v-0.079 c0-0.767-0.621-1.388-1.388-1.388h-0.078c-0.767,0-1.388,0.622-1.388,1.388v0.079C120.137,193.553,120.759,194.176,121.526,194.176 z M115.814,182.531h34.424c0.767,0,1.389-0.621,1.389-1.388v-0.152c0-0.767-0.621-1.388-1.389-1.388h-34.424 c-0.767,0-1.388,0.621-1.388,1.388v0.152C114.424,181.91,115.047,182.531,115.814,182.531z M150.238,194.176h-5.827 c-0.767,0-1.389-0.621-1.389-1.388v-5.939c0-0.767,0.621-1.388,1.389-1.388h8.646c0.767,0,1.388-0.622,1.388-1.388v-3.081 c0-0.767,0.622-1.388,1.389-1.388h0.079c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.622,1.388,1.389,1.388h0.115 c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.621-1.388,1.388-1.388h0.116c0.767,0,1.388,0.621,1.388,1.388v8.94 c0,0.767,0.622,1.388,1.388,1.388h0.042c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.621-1.388,1.388-1.388h0.078 c0.767,0,1.388,0.621,1.388,1.388v11.797c0,0.767-0.622,1.388-1.388,1.388h-11.54c-0.767,0-1.389-0.621-1.389-1.388v-3.008 c0-0.767-0.621-1.388-1.388-1.388h-5.79c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.621,1.388,1.389,1.388h2.973 c0.767,0,1.389,0.622,1.389,1.388v0.079C151.627,193.553,151.005,194.176,150.238,194.176z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M173.007,194.176h0.077c0.767,0,1.388-0.621,1.388-1.388v-3.008c0-0.767,0.622-1.388,1.388-1.388 h5.79c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.388,1.389,1.388h11.54c0.767,0,1.388-0.621,1.388-1.388v-5.939 c0-0.767-0.621-1.388-1.388-1.388h-5.827c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.622,1.388,1.389,1.388h2.935 c0.767,0,1.388,0.621,1.388,1.388v0.151c0,0.767-0.621,1.388-1.388,1.388h-5.79c-0.767,0-1.388-0.621-1.388-1.388v-3.081 c0-0.767-0.622-1.388-1.389-1.388h-11.502c-0.767,0-1.389,0.621-1.389,1.388v5.939 C171.619,193.553,172.241,194.176,173.007,194.176z M178.72,194.176h0.077c0.767,0,1.388-0.621,1.388-1.388v-0.079 c0-0.767-0.621-1.388-1.388-1.388h-0.077c-0.767,0-1.389,0.622-1.389,1.388v0.079C177.331,193.553,177.953,194.176,178.72,194.176z M173.007,182.531h34.387c0.767,0,1.388-0.621,1.388-1.388v-0.152c0-0.767-0.621-1.388-1.388-1.388h-34.387 c-0.767,0-1.389,0.621-1.389,1.388v0.152C171.619,181.91,172.241,182.531,173.007,182.531z M207.395,194.176h-5.827 c-0.767,0-1.388-0.621-1.388-1.388v-5.939c0-0.767,0.621-1.388,1.388-1.388h8.721c0.767,0,1.389-0.622,1.389-1.388v-3.081 c0-0.767,0.621-1.388,1.388-1.388h0.078c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.621,1.388,1.388,1.388h0.042 c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.621-1.388,1.388-1.388h0.116c0.767,0,1.388,0.621,1.388,1.388v8.94 c0,0.767,0.621,1.388,1.388,1.388h0.079c0.767,0,1.388-0.621,1.388-1.388v-8.94c0-0.767,0.622-1.388,1.389-1.388h0.077 c0.767,0,1.388,0.621,1.388,1.388v11.797c0,0.767-0.621,1.388-1.388,1.388h-11.501c-0.767,0-1.388-0.621-1.388-1.388v-3.008 c0-0.767-0.621-1.388-1.389-1.388h-5.827c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.622,1.388,1.389,1.388h2.935 c0.767,0,1.388,0.622,1.388,1.388v0.079C208.783,193.553,208.162,194.176,207.395,194.176z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M230.2,194.176h0.079c0.767,0,1.388-0.621,1.388-1.388v-3.008c0-0.767,0.621-1.388,1.388-1.388h5.79 c0.767,0,1.388,0.621,1.388,1.388v3.008c0,0.767,0.622,1.388,1.389,1.388h11.54c0.767,0,1.388-0.621,1.388-1.388v-5.939 c0-0.767-0.621-1.388-1.388-1.388h-5.827c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.622,1.388,1.389,1.388h2.97 c0.767,0,1.388,0.621,1.388,1.388v0.151c0,0.767-0.622,1.388-1.388,1.388h-5.79c-0.767,0-1.388-0.621-1.388-1.388v-3.081 c0-0.767-0.621-1.388-1.389-1.388h-11.54c-0.767,0-1.389,0.621-1.389,1.388v5.939C228.812,193.553,229.433,194.176,230.2,194.176z M235.95,194.176h0.042c0.767,0,1.389-0.621,1.389-1.388v-0.079c0-0.767-0.622-1.388-1.389-1.388h-0.042 c-0.767,0-1.388,0.622-1.388,1.388v0.079C234.561,193.553,235.183,194.176,235.95,194.176z M230.2,182.531h34.425 c0.767,0,1.388-0.621,1.388-1.388v-0.152c0-0.767-0.622-1.388-1.388-1.388H230.2c-0.767,0-1.389,0.621-1.389,1.388v0.152 C228.812,181.91,229.433,182.531,230.2,182.531z M264.626,194.176h-5.827c-0.767,0-1.388-0.621-1.388-1.388v-5.939 c0-0.767,0.621-1.388,1.388-1.388h8.684c0.767,0,1.388-0.622,1.388-1.388v-3.081c0-0.767,0.622-1.388,1.389-1.388h0.077 c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.622,1.388,1.388,1.388h0.079c0.767,0,1.388-0.621,1.388-1.388v-8.94 c0-0.767,0.622-1.388,1.389-1.388h0.077c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.622,1.388,1.388,1.388h0.077 c0.767,0,1.388-0.621,1.388-1.388v-8.94c0-0.767,0.622-1.388,1.389-1.388h0.079c0.767,0,1.389,0.621,1.389,1.388v11.797 c0,0.767-0.622,1.388-1.389,1.388h-11.502c-0.767,0-1.389-0.621-1.389-1.388v-3.008c0-0.767-0.621-1.388-1.388-1.388h-5.827 c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.622,1.388,1.389,1.388h2.97c0.767,0,1.388,0.622,1.388,1.388v0.079 C266.014,193.553,265.393,194.176,264.626,194.176z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M287.395,194.176h0.079c0.767,0,1.389-0.621,1.389-1.388v-3.008c0-0.767,0.621-1.388,1.389-1.388 h5.79c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.622,1.388,1.388,1.388h11.54c0.767,0,1.389-0.621,1.389-1.388v-5.939 c0-0.767-0.621-1.388-1.389-1.388h-5.792c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.621,1.388,1.388,1.388h2.9 c0.767,0,1.389,0.621,1.389,1.388v0.151c0,0.767-0.622,1.388-1.389,1.388h-5.754c-0.767,0-1.389-0.621-1.389-1.388v-3.081 c0-0.767-0.621-1.388-1.388-1.388h-11.54c-0.767,0-1.389,0.621-1.389,1.388v5.939C286.006,193.553,286.628,194.176,287.395,194.176 z M293.144,194.176h0.042c0.767,0,1.389-0.621,1.389-1.388v-0.079c0-0.767-0.622-1.388-1.389-1.388h-0.042 c-0.767,0-1.388,0.622-1.388,1.388v0.079C291.756,193.553,292.377,194.176,293.144,194.176z M287.395,182.531h34.425 c0.767,0,1.388-0.621,1.388-1.388v-0.152c0-0.767-0.622-1.388-1.388-1.388h-34.425c-0.767,0-1.389,0.621-1.389,1.388v0.152 C286.006,181.91,286.628,182.531,287.395,182.531z M321.82,194.176h-5.79c-0.767,0-1.388-0.621-1.388-1.388v-5.939 c0-0.767,0.621-1.388,1.388-1.388h8.646c0.767,0,1.388-0.622,1.388-1.388v-3.081c0-0.767,0.622-1.388,1.389-1.388h0.079 c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.621,1.388,1.389,1.388h0.077c0.767,0,1.389-0.621,1.389-1.388v-8.94 c0-0.767,0.621-1.388,1.389-1.388h0.079c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.388,1.388h0.078 c0.767,0,1.388-0.621,1.388-1.388v-8.94c0-0.767,0.622-1.388,1.389-1.388h0.079c0.767,0,1.389,0.621,1.389,1.388v11.797 c0,0.767-0.622,1.388-1.389,1.388h-11.505c-0.767,0-1.389-0.621-1.389-1.388v-3.008c0-0.767-0.621-1.388-1.388-1.388h-5.826 c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.622,1.388,1.389,1.388h2.97c0.767,0,1.388,0.622,1.388,1.388v0.079 C323.209,193.553,322.586,194.176,321.82,194.176z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M344.589,194.176h0.079c0.767,0,1.389-0.621,1.389-1.388v-3.008c0-0.767,0.621-1.388,1.388-1.388 h5.826c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.388,1.388,1.388h11.505c0.767,0,1.388-0.621,1.388-1.388v-5.939 c0-0.767-0.621-1.388-1.388-1.388h-5.792c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.621,1.388,1.389,1.388h2.973 c0.767,0,1.388,0.621,1.388,1.388v0.151c0,0.767-0.621,1.388-1.388,1.388h-5.865c-0.767,0-1.388-0.621-1.388-1.388v-3.081 c0-0.767-0.622-1.388-1.389-1.388H344.59c-0.767,0-1.389,0.621-1.389,1.388v5.939C343.2,193.553,343.822,194.176,344.589,194.176z M350.302,194.176h0.116c0.767,0,1.388-0.621,1.388-1.388v-0.079c0-0.767-0.621-1.388-1.388-1.388h-0.116 c-0.767,0-1.388,0.622-1.388,1.388v0.079C348.913,193.553,349.535,194.176,350.302,194.176z M344.589,182.531h34.424 c0.767,0,1.389-0.621,1.389-1.388v-0.152c0-0.767-0.621-1.388-1.389-1.388h-34.424c-0.767,0-1.389,0.621-1.389,1.388v0.152 C343.2,181.91,343.822,182.531,344.589,182.531z M379.015,194.176h-5.79c-0.767,0-1.389-0.621-1.389-1.388v-5.939 c0-0.767,0.621-1.388,1.389-1.388h8.646c0.767,0,1.389-0.622,1.389-1.388v-3.081c0-0.767,0.621-1.388,1.389-1.388h0.079 c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.388,1.388h0.077c0.767,0,1.389-0.621,1.389-1.388v-8.94 c0-0.767,0.622-1.388,1.389-1.388h0.079c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.389,1.388h0.115 c0.767,0,1.388-0.621,1.388-1.388v-8.94c0-0.767,0.622-1.388,1.389-1.388h0.04c0.767,0,1.389,0.621,1.389,1.388v11.797 c0,0.767-0.622,1.388-1.389,1.388h-11.502c-0.767,0-1.389-0.621-1.389-1.388v-3.008c0-0.767-0.621-1.388-1.389-1.388h-5.754 c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.621,1.388,1.389,1.388h2.899c0.767,0,1.389,0.622,1.389,1.388v0.079 C380.403,193.553,379.782,194.176,379.015,194.176z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M401.82,194.176h0.042c0.767,0,1.389-0.621,1.389-1.388v-3.008c0-0.767,0.621-1.388,1.389-1.388 h5.792c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.388,1.388,1.388h11.538c0.767,0,1.389-0.621,1.389-1.388v-5.939 c0-0.767-0.622-1.388-1.389-1.388h-5.752c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.622,1.388,1.389,1.388h2.933 c0.767,0,1.389,0.621,1.389,1.388v0.151c0,0.767-0.621,1.388-1.389,1.388h-5.825c-0.767,0-1.389-0.621-1.389-1.388v-3.081 c0-0.767-0.621-1.388-1.389-1.388H401.82c-0.767,0-1.389,0.621-1.389,1.388v5.939C400.43,193.553,401.053,194.176,401.82,194.176z M407.532,194.176h0.079c0.767,0,1.388-0.621,1.388-1.388v-0.079c0-0.767-0.621-1.388-1.388-1.388h-0.079 c-0.767,0-1.388,0.622-1.388,1.388v0.079C406.143,193.553,406.764,194.176,407.532,194.176z M401.82,182.531h34.462 c0.767,0,1.389-0.621,1.389-1.388v-0.152c0-0.767-0.621-1.388-1.389-1.388H401.82c-0.767,0-1.389,0.621-1.389,1.388v0.152 C400.43,181.91,401.053,182.531,401.82,182.531z M436.281,194.176h-5.865c-0.767,0-1.389-0.621-1.389-1.388v-5.939 c0-0.767,0.622-1.388,1.389-1.388h8.647c0.767,0,1.389-0.622,1.389-1.388v-3.081c0-0.767,0.622-1.388,1.389-1.388h0.115 c0.767,0,1.388,0.621,1.388,1.388v8.94c0,0.767,0.622,1.388,1.389,1.388h0.077c0.767,0,1.389-0.621,1.389-1.388v-8.94 c0-0.767,0.621-1.388,1.388-1.388h0.042c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.389,1.388h0.115 c0.767,0,1.388-0.621,1.388-1.388v-8.94c0-0.767,0.621-1.388,1.389-1.388h0.079c0.767,0,1.389,0.621,1.389,1.388v11.797 c0,0.767-0.621,1.388-1.389,1.388h-11.54c-0.767,0-1.389-0.621-1.389-1.388v-3.008c0-0.767-0.621-1.388-1.389-1.388h-5.79 c-0.767,0-1.389,0.621-1.389,1.388v0.151c0,0.767,0.621,1.388,1.389,1.388h3.008c0.767,0,1.389,0.622,1.389,1.388v0.079 C437.671,193.553,437.048,194.176,436.281,194.176z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M459.013,194.176h0.079c0.767,0,1.389-0.621,1.389-1.388v-3.008c0-0.767,0.621-1.388,1.389-1.388 h5.79c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.388,1.389,1.388h11.54c0.767,0,1.389-0.621,1.389-1.388v-5.939 c0-0.767-0.621-1.388-1.389-1.388h-5.754c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.622,1.388,1.388,1.388h2.935 c0.767,0,1.388,0.621,1.388,1.388v0.151c0,0.767-0.622,1.388-1.388,1.388h-5.865c-0.767,0-1.389-0.621-1.389-1.388v-3.081 c0-0.767-0.621-1.388-1.388-1.388h-11.502c-0.767,0-1.389,0.621-1.389,1.388v5.939 C457.625,193.553,458.247,194.176,459.013,194.176z M464.726,194.176h0.079c0.767,0,1.389-0.621,1.389-1.388v-0.079 c0-0.767-0.621-1.388-1.389-1.388h-0.079c-0.767,0-1.388,0.622-1.388,1.388v0.079C463.338,193.553,463.959,194.176,464.726,194.176 z M459.013,182.531h34.388c0.767,0,1.389-0.621,1.389-1.388v-0.152c0-0.767-0.621-1.388-1.389-1.388h-34.388 c-0.767,0-1.389,0.621-1.389,1.388v0.152C457.625,181.91,458.247,182.531,459.013,182.531z M493.401,194.176h-5.79 c-0.767,0-1.389-0.621-1.389-1.388v-5.939c0-0.767,0.621-1.388,1.389-1.388h8.721c0.767,0,1.389-0.622,1.389-1.388v-3.081 c0-0.767,0.621-1.388,1.388-1.388h0.004c0.767,0,1.389,0.621,1.389,1.388v8.94c0,0.767,0.621,1.388,1.388,1.388h0.152 c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.621-1.388,1.389-1.388h0.004c0.767,0,1.389,0.621,1.389,1.388v8.94 c0,0.767,0.622,1.388,1.389,1.388h0.079c0.767,0,1.389-0.621,1.389-1.388v-8.94c0-0.767,0.622-1.388,1.389-1.388h0.151 c0.767,0,1.389,0.621,1.389,1.388v11.797c0,0.767-0.622,1.388-1.389,1.388h-11.502c-0.767,0-1.388-0.621-1.388-1.388v-3.008 c0-0.767-0.622-1.388-1.389-1.388h-5.864c-0.767,0-1.388,0.621-1.388,1.388v0.151c0,0.767,0.621,1.388,1.388,1.388h2.933 c0.767,0,1.389,0.622,1.389,1.388v0.079C494.79,193.553,494.168,194.176,493.401,194.176z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M1.388,203.035h22.963c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388 H1.388C0.621,197.178,0,197.8,0,198.566v3.081C0,202.414,0.621,203.035,1.388,203.035z M30.022,203.035h22.927 c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388H30.022c-0.767,0-1.389,0.622-1.389,1.388v3.081 C28.632,202.414,29.255,203.035,30.022,203.035z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M58.618,203.035h22.927c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388 H58.618c-0.767,0-1.388,0.622-1.388,1.388v3.081C57.23,202.414,57.852,203.035,58.618,203.035z M87.179,203.035h23 c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388h-23c-0.767,0-1.389,0.622-1.389,1.388v3.081 C85.79,202.414,86.412,203.035,87.179,203.035z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M115.814,203.035h22.963c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.621-1.388-1.389-1.388 h-22.963c-0.767,0-1.388,0.622-1.388,1.388v3.081C114.424,202.414,115.047,203.035,115.814,203.035z M144.41,203.035h22.963 c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.622-1.388-1.388-1.388H144.41c-0.767,0-1.389,0.622-1.389,1.388v3.081 C143.021,202.414,143.644,203.035,144.41,203.035z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M173.007,203.035h22.963c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388 h-22.963c-0.767,0-1.389,0.622-1.389,1.388v3.081C171.619,202.414,172.241,203.035,173.007,203.035z M201.568,203.035h23 c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388h-23c-0.767,0-1.388,0.622-1.388,1.388v3.081 C200.179,202.414,200.8,203.035,201.568,203.035z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M230.2,203.035h22.965c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388 H230.2c-0.767,0-1.389,0.622-1.389,1.388v3.081C228.812,202.414,229.433,203.035,230.2,203.035z M258.797,203.035h22.965 c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.622-1.388-1.389-1.388h-22.965c-0.767,0-1.388,0.622-1.388,1.388v3.081 C257.409,202.414,258.03,203.035,258.797,203.035z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M287.395,203.035h22.965c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.621-1.388-1.389-1.388 h-22.965c-0.767,0-1.389,0.622-1.389,1.388v3.081C286.006,202.414,286.628,203.035,287.395,203.035z M316.03,203.035h22.927 c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.622-1.388-1.389-1.388H316.03c-0.767,0-1.388,0.622-1.388,1.388v3.081 C314.641,202.414,315.263,203.035,316.03,203.035z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M344.589,203.035h22.965c0.767,0,1.388-0.621,1.388-1.388v-3.081c0-0.767-0.621-1.388-1.388-1.388 h-22.965c-0.767,0-1.389,0.622-1.389,1.388v3.081C343.2,202.414,343.822,203.035,344.589,203.035z M373.224,203.035h22.925 c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.622-1.388-1.389-1.388h-22.925c-0.767,0-1.389,0.622-1.389,1.388v3.081 C371.836,202.414,372.457,203.035,373.224,203.035z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M401.82,203.035h22.927c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.622-1.388-1.389-1.388 H401.82c-0.767,0-1.389,0.622-1.389,1.388v3.081C400.43,202.414,401.053,203.035,401.82,203.035z M430.417,203.035h22.965 c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.621-1.388-1.389-1.388h-22.965c-0.767,0-1.389,0.622-1.389,1.388v3.081 C429.027,202.414,429.65,203.035,430.417,203.035z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M459.013,203.035h22.965c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.621-1.388-1.389-1.388 h-22.965c-0.767,0-1.389,0.622-1.389,1.388v3.081C457.625,202.414,458.247,203.035,459.013,203.035z M487.612,203.035h23 c0.767,0,1.389-0.621,1.389-1.388v-3.081c0-0.767-0.622-1.388-1.389-1.388h-23c-0.767,0-1.389,0.622-1.389,1.388v3.081 C486.222,202.414,486.844,203.035,487.612,203.035z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M510.611,317.826h-0.077c-0.767,0-1.388,0.621-1.388,1.388v3.008c0,0.767-0.622,1.389-1.389,1.389 h-5.827c-0.767,0-1.389-0.622-1.389-1.389v-3.008c0-0.767-0.621-1.388-1.389-1.388H487.65c-0.767,0-1.388,0.621-1.388,1.388v5.939 c0,0.767,0.621,1.389,1.388,1.389h5.79c0.767,0,1.388-0.622,1.388-1.389v-0.152c0-0.767-0.621-1.388-1.388-1.388h-2.935 c-0.767,0-1.389-0.622-1.389-1.389v-0.151c0-0.767,0.622-1.388,1.389-1.388h5.792c0.767,0,1.388,0.621,1.388,1.388v3.081 c0,0.767,0.622,1.389,1.389,1.389h11.538c0.767,0,1.389-0.622,1.389-1.389v-5.939C512,318.448,511.378,317.826,510.611,317.826z M504.863,317.826h-0.079c-0.767,0-1.389,0.621-1.389,1.388v0.079c0,0.767,0.621,1.389,1.389,1.389h0.079 c0.767,0,1.389-0.622,1.389-1.389v-0.079C506.252,318.448,505.63,317.826,504.863,317.826z M510.611,329.47h-34.423 c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.622,1.388,1.389,1.388h34.423c0.767,0,1.389-0.622,1.389-1.388v-0.153 C512,330.092,511.378,329.47,510.611,329.47z M476.189,317.826h5.79c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.621,1.389-1.389,1.389h-8.647c-0.767,0-1.388,0.621-1.388,1.388v3.081c0,0.767-0.622,1.388-1.389,1.388h-0.077 c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.388-1.388h-0.079c-0.767,0-1.389,0.621-1.389,1.388v8.94 c0,0.767-0.622,1.388-1.388,1.388h-0.078c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.389-1.388h-0.115 c-0.767,0-1.389,0.621-1.389,1.388v8.94c0,0.767-0.621,1.388-1.389,1.388h-0.042c-0.767,0-1.388-0.622-1.388-1.388v-11.797 c0-0.767,0.621-1.388,1.388-1.388h11.502c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.388,1.389h5.79 c0.767,0,1.388-0.622,1.388-1.389v-0.151c0-0.767-0.621-1.388-1.388-1.388h-2.933c-0.767,0-1.389-0.622-1.389-1.389v-0.079 C474.799,318.448,475.422,317.826,476.189,317.826z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M453.382,317.826h-0.115c-0.767,0-1.388,0.621-1.388,1.388v3.008c0,0.767-0.622,1.389-1.389,1.389 h-5.754c-0.767,0-1.389-0.622-1.389-1.389v-3.008c0-0.767-0.621-1.388-1.388-1.388h-11.502c-0.767,0-1.389,0.621-1.389,1.388v5.939 c0,0.767,0.622,1.389,1.389,1.389h5.79c0.767,0,1.389-0.622,1.389-1.389v-0.152c0-0.767-0.622-1.388-1.389-1.388h-2.935 c-0.767,0-1.388-0.622-1.388-1.389v-0.151c0-0.767,0.621-1.388,1.388-1.388h5.792c0.767,0,1.388,0.621,1.388,1.388v3.081 c0,0.767,0.622,1.389,1.389,1.389h11.502c0.767,0,1.389-0.622,1.389-1.389v-5.939C454.77,318.448,454.148,317.826,453.382,317.826z M447.669,317.826h-0.077c-0.767,0-1.389,0.621-1.389,1.388v0.079c0,0.767,0.622,1.389,1.389,1.389h0.077 c0.767,0,1.389-0.622,1.389-1.389v-0.079C449.057,318.448,448.436,317.826,447.669,317.826z M453.382,329.47h-34.387 c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.622,1.388,1.389,1.388h34.387c0.767,0,1.389-0.622,1.389-1.388v-0.153 C454.77,330.092,454.148,329.47,453.382,329.47z M418.994,317.826h5.827c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.622,1.389-1.389,1.389h-8.647c-0.767,0-1.389,0.621-1.389,1.388v3.081c0,0.767-0.621,1.388-1.389,1.388h-0.115 c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388h-0.115c-0.767,0-1.389,0.621-1.389,1.388v8.94 c0,0.767-0.621,1.388-1.388,1.388h-0.042c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388h-0.115 c-0.767,0-1.389,0.621-1.389,1.388v8.94c0,0.767-0.621,1.388-1.388,1.388h-0.078c-0.767,0-1.388-0.622-1.388-1.388v-11.797 c0-0.767,0.622-1.388,1.388-1.388h11.575c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.389,1.389h5.754 c0.767,0,1.389-0.622,1.389-1.389v-0.151c0-0.767-0.621-1.388-1.389-1.388h-2.935c-0.767,0-1.389-0.622-1.389-1.389v-0.079 C417.605,318.448,418.227,317.826,418.994,317.826z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M396.186,317.826h-0.077c-0.767,0-1.389,0.621-1.389,1.388v3.008c0,0.767-0.621,1.389-1.388,1.389 h-5.792c-0.767,0-1.389-0.622-1.389-1.389v-3.008c0-0.767-0.622-1.388-1.389-1.388h-11.538c-0.767,0-1.389,0.621-1.389,1.388v5.939 c0,0.767,0.621,1.389,1.389,1.389h5.79c0.767,0,1.389-0.622,1.389-1.389v-0.152c0-0.767-0.621-1.388-1.389-1.388h-2.935 c-0.767,0-1.389-0.622-1.389-1.389v-0.151c0-0.767,0.622-1.388,1.389-1.388h5.827c0.767,0,1.389,0.621,1.389,1.388v3.081 c0,0.767,0.621,1.389,1.388,1.389h11.502c0.767,0,1.389-0.622,1.389-1.389v-5.939C397.576,318.448,396.953,317.826,396.186,317.826 z M390.474,317.826h-0.077c-0.767,0-1.389,0.621-1.389,1.388v0.079c0,0.767,0.622,1.389,1.389,1.389h0.077 c0.767,0,1.388-0.622,1.388-1.389v-0.079C391.863,318.448,391.242,317.826,390.474,317.826z M396.186,329.47h-34.424 c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.621,1.388,1.389,1.388h34.424c0.767,0,1.389-0.622,1.389-1.388v-0.153 C397.576,330.092,396.953,329.47,396.186,329.47z M361.762,317.826h5.827c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.622,1.389-1.389,1.389h-8.646c-0.767,0-1.388,0.621-1.388,1.388v3.081c0,0.767-0.622,1.388-1.389,1.388h-0.079 c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388h-0.115c-0.767,0-1.389,0.621-1.389,1.388v8.94 c0,0.767-0.621,1.388-1.388,1.388h-0.116c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388h-0.042 c-0.767,0-1.389,0.621-1.389,1.388v8.94c0,0.767-0.621,1.388-1.389,1.388h-0.077c-0.767,0-1.388-0.622-1.388-1.388v-11.797 c0-0.767,0.621-1.388,1.388-1.388h11.54c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.388,1.389h5.79 c0.767,0,1.388-0.622,1.388-1.389v-0.151c0-0.767-0.621-1.388-1.388-1.388h-2.973c-0.767,0-1.389-0.622-1.389-1.389v-0.079 C360.373,318.448,360.995,317.826,361.762,317.826z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M338.993,317.826h-0.077c-0.767,0-1.389,0.621-1.389,1.388v3.008c0,0.767-0.622,1.389-1.388,1.389 h-5.79c-0.767,0-1.388-0.622-1.388-1.389v-3.008c0-0.767-0.622-1.388-1.389-1.388h-11.54c-0.767,0-1.388,0.621-1.388,1.388v5.939 c0,0.767,0.621,1.389,1.388,1.389h5.827c0.767,0,1.389-0.622,1.389-1.389v-0.152c0-0.767-0.622-1.388-1.389-1.388h-2.935 c-0.767,0-1.388-0.622-1.388-1.389v-0.151c0-0.767,0.621-1.388,1.388-1.388h5.79c0.767,0,1.388,0.621,1.388,1.388v3.081 c0,0.767,0.622,1.389,1.389,1.389h11.502c0.767,0,1.389-0.622,1.389-1.389v-5.939C340.381,318.448,339.759,317.826,338.993,317.826 z M333.28,317.826h-0.077c-0.767,0-1.388,0.621-1.388,1.388v0.079c0,0.767,0.622,1.389,1.388,1.389h0.077 c0.767,0,1.389-0.622,1.389-1.389v-0.079C334.668,318.448,334.047,317.826,333.28,317.826z M338.993,329.47h-34.388 c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.621,1.388,1.388,1.388h34.388c0.767,0,1.389-0.622,1.389-1.388v-0.153 C340.381,330.092,339.759,329.47,338.993,329.47z M304.605,317.826h5.827c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.622,1.389-1.389,1.389h-8.721c-0.767,0-1.389,0.621-1.389,1.388v3.081c0,0.767-0.621,1.388-1.388,1.388h-0.077 c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388h-0.042c-0.767,0-1.389,0.621-1.389,1.388v8.94 c0,0.767-0.621,1.388-1.389,1.388h-0.115c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388h-0.079 c-0.767,0-1.388,0.621-1.388,1.388v8.94c0,0.767-0.622,1.388-1.389,1.388h-0.077c-0.767,0-1.389-0.622-1.389-1.388v-11.797 c0-0.767,0.622-1.388,1.389-1.388h11.502c0.767,0,1.388,0.621,1.388,1.388v3.008c0,0.767,0.622,1.389,1.389,1.389h5.827 c0.767,0,1.389-0.622,1.389-1.389v-0.151c0-0.767-0.621-1.388-1.389-1.388h-2.935c-0.767,0-1.388-0.622-1.388-1.389v-0.079 C303.217,318.448,303.838,317.826,304.605,317.826z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M281.8,317.826h-0.079c-0.767,0-1.388,0.621-1.388,1.388v3.008c0,0.767-0.621,1.389-1.388,1.389 h-5.79c-0.767,0-1.388-0.622-1.388-1.389v-3.008c0-0.767-0.622-1.388-1.389-1.388h-11.54c-0.767,0-1.388,0.621-1.388,1.388v5.939 c0,0.767,0.621,1.389,1.388,1.389h5.827c0.767,0,1.389-0.622,1.389-1.389v-0.152c0-0.767-0.622-1.388-1.389-1.388h-2.97 c-0.767,0-1.388-0.622-1.388-1.389v-0.151c0-0.767,0.622-1.388,1.388-1.388h5.79c0.767,0,1.388,0.621,1.388,1.388v3.081 c0,0.767,0.622,1.389,1.389,1.389h11.54c0.767,0,1.389-0.622,1.389-1.389v-5.939C283.188,318.448,282.567,317.826,281.8,317.826z M276.05,317.826h-0.042c-0.767,0-1.389,0.621-1.389,1.388v0.079c0,0.767,0.621,1.389,1.389,1.389h0.042 c0.767,0,1.388-0.622,1.388-1.389v-0.079C277.439,318.448,276.817,317.826,276.05,317.826z M281.8,329.47h-34.424 c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.622,1.388,1.388,1.388H281.8c0.767,0,1.389-0.622,1.389-1.388v-0.153 C283.188,330.092,282.567,329.47,281.8,329.47z M247.374,317.826h5.827c0.767,0,1.388,0.621,1.388,1.388v5.939 c0,0.767-0.621,1.389-1.388,1.389h-8.684c-0.767,0-1.388,0.621-1.388,1.388v3.081c0,0.767-0.621,1.388-1.389,1.388h-0.077 c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.388-1.388h-0.079c-0.767,0-1.388,0.621-1.388,1.388v8.94 c0,0.767-0.622,1.388-1.389,1.388h-0.077c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.622-1.388-1.388-1.388h-0.078 c-0.767,0-1.388,0.621-1.388,1.388v8.94c0,0.767-0.621,1.388-1.389,1.388h-0.079c-0.767,0-1.389-0.622-1.389-1.388v-11.797 c0-0.767,0.621-1.388,1.389-1.388h11.502c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.388,1.389h5.827 c0.767,0,1.389-0.622,1.389-1.389v-0.151c0-0.767-0.622-1.388-1.389-1.388h-2.97c-0.767,0-1.388-0.622-1.388-1.389v-0.079 C245.986,318.448,246.607,317.826,247.374,317.826z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M224.605,317.826h-0.079c-0.767,0-1.389,0.621-1.389,1.388v3.008c0,0.767-0.621,1.389-1.388,1.389 h-5.79c-0.767,0-1.388-0.622-1.388-1.389v-3.008c0-0.767-0.622-1.388-1.388-1.388h-11.54c-0.767,0-1.388,0.621-1.388,1.388v5.939 c0,0.767,0.621,1.389,1.388,1.389h5.792c0.767,0,1.388-0.622,1.388-1.389v-0.152c0-0.767-0.621-1.388-1.388-1.388h-2.899 c-0.767,0-1.389-0.622-1.389-1.389v-0.151c0-0.767,0.622-1.388,1.389-1.388h5.754c0.767,0,1.389,0.621,1.389,1.388v3.081 c0,0.767,0.621,1.389,1.388,1.389h11.54c0.767,0,1.389-0.622,1.389-1.389v-5.939C225.994,318.448,225.372,317.826,224.605,317.826z M218.856,317.826h-0.042c-0.767,0-1.389,0.621-1.389,1.388v0.079c0,0.767,0.622,1.389,1.389,1.389h0.042 c0.767,0,1.388-0.622,1.388-1.389v-0.079C220.244,318.448,219.623,317.826,218.856,317.826z M224.605,329.47H190.18 c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.621,1.388,1.388,1.388h34.424c0.767,0,1.389-0.622,1.389-1.388v-0.153 C225.994,330.092,225.372,329.47,224.605,329.47z M190.18,317.826h5.79c0.767,0,1.388,0.621,1.388,1.388v5.939 c0,0.767-0.621,1.389-1.388,1.389h-8.646c-0.767,0-1.388,0.621-1.388,1.388v3.081c0,0.767-0.621,1.388-1.389,1.388h-0.079 c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.621-1.388-1.388-1.388h-0.078c-0.767,0-1.388,0.621-1.388,1.388v8.94 c0,0.767-0.621,1.388-1.389,1.388h-0.079c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.388-1.388h-0.077 c-0.767,0-1.388,0.621-1.388,1.388v8.94c0,0.767-0.622,1.388-1.389,1.388h-0.079c-0.767,0-1.389-0.622-1.389-1.388v-11.797 c0-0.767,0.622-1.388,1.389-1.388h11.505c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.388,1.389h5.825 c0.767,0,1.389-0.622,1.389-1.389v-0.151c0-0.767-0.621-1.388-1.389-1.388h-2.97c-0.767,0-1.388-0.622-1.388-1.389v-0.079 C188.791,318.448,189.414,317.826,190.18,317.826z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M167.411,317.826h-0.079c-0.767,0-1.389,0.621-1.389,1.388v3.008c0,0.767-0.621,1.389-1.388,1.389 h-5.826c-0.767,0-1.389-0.622-1.389-1.389v-3.008c0-0.767-0.621-1.388-1.388-1.388h-11.505c-0.767,0-1.389,0.621-1.389,1.388v5.939 c0,0.767,0.621,1.389,1.389,1.389h5.792c0.767,0,1.389-0.622,1.389-1.389v-0.152c0-0.767-0.621-1.388-1.389-1.388h-2.973 c-0.767,0-1.389-0.622-1.389-1.389v-0.151c0-0.767,0.621-1.388,1.389-1.388h5.865c0.767,0,1.388,0.621,1.388,1.388v3.081 c0,0.767,0.622,1.389,1.389,1.389h11.502c0.767,0,1.389-0.622,1.389-1.389v-5.939C168.8,318.448,168.178,317.826,167.411,317.826z M161.698,317.826h-0.116c-0.767,0-1.388,0.621-1.388,1.388v0.079c0,0.767,0.621,1.389,1.388,1.389h0.116 c0.767,0,1.388-0.622,1.388-1.389v-0.079C163.087,318.448,162.465,317.826,161.698,317.826z M167.411,329.47h-34.424 c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.621,1.388,1.389,1.388h34.424c0.767,0,1.389-0.622,1.389-1.388v-0.153 C168.8,330.092,168.178,329.47,167.411,329.47z M132.985,317.826h5.79c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.621,1.389-1.389,1.389h-8.646c-0.767,0-1.388,0.621-1.388,1.388v3.081c0,0.767-0.621,1.388-1.389,1.388h-0.079 c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.388-1.388h-0.078c-0.767,0-1.388,0.621-1.388,1.388v8.94 c0,0.767-0.621,1.388-1.389,1.388h-0.079c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.389-1.388h-0.115 c-0.767,0-1.388,0.621-1.388,1.388v8.94c0,0.767-0.621,1.388-1.388,1.388h-0.04c-0.767,0-1.389-0.622-1.389-1.388v-11.797 c0-0.767,0.621-1.388,1.389-1.388h11.502c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.388,1.389h5.754 c0.767,0,1.389-0.622,1.389-1.389v-0.151c0-0.767-0.621-1.388-1.389-1.388h-2.899c-0.767,0-1.389-0.622-1.389-1.389v-0.079 C131.597,318.448,132.218,317.826,132.985,317.826z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M110.18,317.826h-0.042c-0.767,0-1.389,0.621-1.389,1.388v3.008c0,0.767-0.621,1.389-1.388,1.389 h-5.792c-0.767,0-1.388-0.622-1.388-1.389v-3.008c0-0.767-0.621-1.388-1.388-1.388H87.254c-0.767,0-1.388,0.621-1.388,1.388v5.939 c0,0.767,0.621,1.389,1.388,1.389h5.752c0.767,0,1.389-0.622,1.389-1.389v-0.152c0-0.767-0.621-1.388-1.389-1.388h-2.933 c-0.767,0-1.388-0.622-1.388-1.389v-0.151c0-0.767,0.621-1.388,1.388-1.388H95.9c0.767,0,1.389,0.621,1.389,1.388v3.081 c0,0.767,0.621,1.389,1.388,1.389h11.505c0.767,0,1.389-0.622,1.389-1.389v-5.939C111.57,318.448,110.947,317.826,110.18,317.826z M104.468,317.826h-0.079c-0.767,0-1.389,0.621-1.389,1.388v0.079c0,0.767,0.621,1.389,1.389,1.389h0.079 c0.767,0,1.388-0.622,1.388-1.389v-0.079C105.857,318.448,105.235,317.826,104.468,317.826z M110.18,329.47H75.719 c-0.767,0-1.388,0.621-1.388,1.388v0.153c0,0.767,0.621,1.388,1.388,1.388h34.462c0.767,0,1.389-0.622,1.389-1.388v-0.153 C111.57,330.092,110.947,329.47,110.18,329.47z M75.719,317.826h5.865c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.621,1.389-1.389,1.389h-8.648c-0.767,0-1.388,0.621-1.388,1.388v3.081c0,0.767-0.621,1.388-1.389,1.388h-0.115 c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.621-1.388-1.389-1.388H67.19c-0.767,0-1.389,0.621-1.389,1.388v8.94 c0,0.767-0.621,1.388-1.388,1.388H64.37c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.388-1.388h-0.115 c-0.767,0-1.389,0.621-1.389,1.388v8.94c0,0.767-0.621,1.388-1.388,1.388h-0.079c-0.767,0-1.388-0.622-1.388-1.388v-11.797 c0-0.767,0.621-1.388,1.388-1.388h11.54c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.388,1.389h5.79 c0.767,0,1.388-0.622,1.388-1.389v-0.151c0-0.767-0.621-1.388-1.388-1.388H75.72c-0.767,0-1.388-0.622-1.388-1.389v-0.079 C74.329,318.448,74.952,317.826,75.719,317.826z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M52.986,317.826h-0.079c-0.767,0-1.388,0.621-1.388,1.388v3.008c0,0.767-0.621,1.389-1.389,1.389 h-5.79c-0.767,0-1.389-0.622-1.389-1.389v-3.008c0-0.767-0.621-1.388-1.388-1.388H30.022c-0.767,0-1.389,0.621-1.389,1.388v5.939 c0,0.767,0.621,1.389,1.389,1.389h5.754c0.767,0,1.388-0.622,1.388-1.389v-0.152c0-0.767-0.621-1.388-1.388-1.388h-2.935 c-0.767,0-1.389-0.622-1.389-1.389v-0.151c0-0.767,0.622-1.388,1.389-1.388h5.865c0.767,0,1.389,0.621,1.389,1.388v3.081 c0,0.767,0.621,1.389,1.388,1.389h11.502c0.767,0,1.388-0.622,1.388-1.389v-5.939C54.375,318.448,53.753,317.826,52.986,317.826z M47.274,317.826h-0.079c-0.767,0-1.388,0.621-1.388,1.388v0.079c0,0.767,0.621,1.389,1.388,1.389h0.079 c0.767,0,1.388-0.622,1.388-1.389v-0.079C48.662,318.448,48.041,317.826,47.274,317.826z M52.986,329.47H18.599 c-0.767,0-1.389,0.621-1.389,1.388v0.153c0,0.767,0.622,1.388,1.389,1.388h34.387c0.767,0,1.388-0.622,1.388-1.388v-0.153 C54.375,330.092,53.753,329.47,52.986,329.47z M18.599,317.826h5.79c0.767,0,1.389,0.621,1.389,1.388v5.939 c0,0.767-0.621,1.389-1.389,1.389H15.67c-0.767,0-1.389,0.621-1.389,1.388v3.081c0,0.767-0.621,1.388-1.389,1.388h-0.004 c-0.767,0-1.389-0.622-1.389-1.388v-8.94c0-0.767-0.621-1.388-1.389-1.388H9.956c-0.767,0-1.389,0.621-1.389,1.388v8.94 c0,0.767-0.621,1.388-1.389,1.388H7.175c-0.767,0-1.388-0.622-1.388-1.388v-8.94c0-0.767-0.622-1.388-1.389-1.388H4.317 c-0.767,0-1.389,0.621-1.389,1.388v8.94c0,0.767-0.621,1.388-1.388,1.388H1.388c-0.767,0-1.388-0.622-1.388-1.388v-11.797 c0-0.767,0.621-1.388,1.388-1.388H12.89c0.767,0,1.389,0.621,1.389,1.388v3.008c0,0.767,0.621,1.389,1.389,1.389h5.864 c0.767,0,1.388-0.622,1.388-1.389v-0.151c0-0.767-0.621-1.388-1.388-1.388H18.6c-0.767,0-1.389-0.622-1.389-1.389v-0.079 C17.21,318.448,17.832,317.826,18.599,317.826z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M510.611,308.966h-22.963c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388 h22.963c0.767,0,1.389-0.621,1.389-1.388v-3.081C512,309.588,511.378,308.966,510.611,308.966z M481.978,308.966h-22.927 c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388h22.927c0.767,0,1.389-0.621,1.389-1.388v-3.081 C483.367,309.588,482.745,308.966,481.978,308.966z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M453.382,308.966h-22.927c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.622,1.388,1.389,1.388 h22.927c0.767,0,1.389-0.621,1.389-1.388v-3.081C454.77,309.588,454.148,308.966,453.382,308.966z M424.821,308.966h-23 c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.622,1.388,1.388,1.388h23c0.767,0,1.389-0.621,1.389-1.388v-3.081 C426.21,309.588,425.588,308.966,424.821,308.966z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M396.186,308.966h-22.963c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.621,1.388,1.389,1.388 h22.963c0.767,0,1.389-0.621,1.389-1.388v-3.081C397.576,309.588,396.953,308.966,396.186,308.966z M367.59,308.966h-22.963 c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388h22.963c0.767,0,1.389-0.621,1.389-1.388v-3.081 C368.979,309.588,368.356,308.966,367.59,308.966z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M338.993,308.966H316.03c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388 h22.963c0.767,0,1.389-0.621,1.389-1.388v-3.081C340.381,309.588,339.759,308.966,338.993,308.966z M310.432,308.966h-23 c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.622,1.388,1.389,1.388h23c0.767,0,1.389-0.621,1.389-1.388v-3.081 C311.821,309.588,311.2,308.966,310.432,308.966z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M281.8,308.966h-22.965c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388 H281.8c0.767,0,1.389-0.621,1.389-1.388v-3.081C283.188,309.588,282.567,308.966,281.8,308.966z M253.203,308.966h-22.965 c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.621,1.388,1.389,1.388h22.965c0.767,0,1.388-0.621,1.388-1.388v-3.081 C254.591,309.588,253.97,308.966,253.203,308.966z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M224.605,308.966H201.64c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388 h22.965c0.767,0,1.389-0.621,1.389-1.388v-3.081C225.994,309.588,225.372,308.966,224.605,308.966z M195.97,308.966h-22.927 c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.622,1.388,1.389,1.388h22.927c0.767,0,1.388-0.621,1.388-1.388v-3.081 C197.359,309.588,196.737,308.966,195.97,308.966z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M167.411,308.966h-22.965c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.621,1.388,1.389,1.388 h22.965c0.767,0,1.389-0.621,1.389-1.388v-3.081C168.8,309.588,168.178,308.966,167.411,308.966z M138.776,308.966h-22.925 c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.621,1.388,1.389,1.388h22.925c0.767,0,1.389-0.621,1.389-1.388v-3.081 C140.164,309.588,139.543,308.966,138.776,308.966z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M110.18,308.966H87.254c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388 h22.927c0.767,0,1.389-0.621,1.389-1.388v-3.081C111.57,309.588,110.947,308.966,110.18,308.966z M81.583,308.966H58.618 c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388h22.965c0.767,0,1.389-0.621,1.389-1.388v-3.081 C82.972,309.588,82.35,308.966,81.583,308.966z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M52.986,308.966H30.022c-0.767,0-1.389,0.622-1.389,1.389v3.081c0,0.767,0.621,1.388,1.389,1.388 h22.965c0.767,0,1.388-0.621,1.388-1.388v-3.081C54.375,309.588,53.753,308.966,52.986,308.966z M24.388,308.966h-23 c-0.767,0-1.388,0.622-1.388,1.389v3.081c0,0.767,0.621,1.388,1.388,1.388h23c0.767,0,1.389-0.621,1.389-1.388v-3.081 C25.778,309.588,25.156,308.966,24.388,308.966z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#FF4B55;" d="M248.698,214.275c2.62,0.698,5.414-0.071,7.334-2.026c2.898,2.934,7.647,3.004,10.649,0.141 c1.956-1.886,2.759-4.75,2.06-7.334c-2.548,4.121-7.925,5.448-12.046,2.863c-0.21-0.141-0.489-0.28-0.663-0.419 c-3.875,2.863-9.357,2.095-12.291-1.745c-0.106-0.211-0.314-0.49-0.454-0.698C242.239,209.107,244.683,213.296,248.698,214.275z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M264.966,295.855c9.386-5.153,17.219-13.272,21.514-23.966c7.314-18.33,2.708-39.02-11.283-52.44 c-0.481-0.461-1.212,0.156-0.863,0.724c13.799,22.503,8.363,52.074-12.99,68.278l1.021-65.367c0.014-0.887-0.382-1.732-1.071-2.291 l-3.473-2.807c-1.064-0.86-2.584-0.855-3.642,0.01l-3.422,2.797c-0.683,0.558-1.073,1.398-1.059,2.28l0.992,65.414 c-21.356-16.195-26.804-45.794-13.026-68.312c0.348-0.568-0.383-1.185-0.863-0.723c-13.964,13.42-18.599,34.109-11.286,52.438 c4.295,10.692,12.127,18.812,21.516,23.965c-5.975,2.047-12.255,3.134-18.605,2.952c-0.671-0.019-0.806,0.925-0.163,1.119 c8.068,2.449,16.366,2.617,24.168,0.868l3.063,5.943c0.212,0.41,0.799,0.412,1.012,0.001l3.084-5.941 c7.802,1.746,16.103,1.575,24.177-0.874c0.642-0.194,0.508-1.138-0.163-1.119C277.246,298.988,270.951,297.902,264.966,295.855z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M303.171,235.086c-4.804-8.975-12.782-15.778-22.28-19.111c-0.595-0.209-1.059,0.577-0.573,0.978 c20.966,17.271,25.169,48.032,8.954,70.302c-0.839,1.118-1.747,2.305-2.62,3.281C306.559,279.852,313.927,254.99,303.171,235.086z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M222.755,287.255c-16.213-22.27-12.044-53.03,8.918-70.301c0.487-0.401,0.022-1.186-0.573-0.978 c-9.485,3.334-17.408,10.135-22.243,19.11c-10.824,19.904-3.386,44.765,16.552,55.449 C224.467,289.559,223.559,288.373,222.755,287.255z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 9.8 KiB |
@@ -1,131 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
|
||||||
<path style="fill:#41479B;" d="M473.655,423.75H38.345C17.167,423.75,0,406.582,0,385.405V126.646 c0-21.177,17.167-38.345,38.345-38.345h435.31c21.177,0,38.345,17.167,38.345,38.345v258.759 C512,406.582,494.833,423.75,473.655,423.75z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M8.828,255.975h15.334l81.77-53.574v53.574h44.138v-53.574l81.77,53.574h15.334 c4.875,0,8.828-3.953,8.828-8.828v-7.002l-70.155-45.963H256v-44.138h-70.155L256,104.081v-7.002c0-4.559-3.456-8.309-7.891-8.777 h-16.348l-81.693,53.523V88.301H105.93v53.523L26.894,90.041c-9.242,2.888-16.973,9.186-21.741,17.415l65.002,42.588H0v44.138 h70.155L0,240.145v7.002C0,252.022,3.953,255.975,8.828,255.975z"/>
|
|
||||||
<g>
|
|
||||||
<polygon style="fill:#FF4B55;" points="256,158.871 141.241,158.871 141.241,88.25 114.759,88.25 114.759,158.871 0,158.871 0,185.354 114.759,185.354 114.759,255.975 141.241,255.975 141.241,185.354 256,185.354 "/>
|
|
||||||
<path style="fill:#FF4B55;" d="M8.254,102.894l72.636,47.149h16.214L14.643,96.516C12.271,98.385,10.126,100.525,8.254,102.894z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M166.283,150.044l88.374-57.366c-1.536-2.599-4.246-4.427-7.485-4.427h-1.909l-95.194,61.793 H166.283z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M89.474,194.182L1.269,251.437c1.519,2.663,4.273,4.537,7.559,4.537h1.665l95.196-61.793H89.474 V194.182z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M255.86,247.841l-82.666-53.658H156.98l93.874,60.935 C253.666,253.812,255.595,251.076,255.86,247.841z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#FFE15A;" d="M383.828,172.193c0,0-3.691-14.766-14.766-22.15c0,0,11.074,18.457,11.074,33.224L383.828,172.193z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M366.754,156.158c0,0,7.73,4.729,11.882,12.459l-3.346,7.73 C375.292,176.345,372.523,165.387,366.754,156.158z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M358.218,157.888c0,0,13.382,4.153,19.726,12.806l-3.807,5.768 C374.137,176.461,369.062,166.656,358.218,157.888z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M356.257,164.579c0,0,14.074,2.191,20.419,8.883l-1.615,6.345 C375.061,179.807,367.331,170.578,356.257,164.579z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M356.718,169.194c0,0,13.612,1.385,19.842,8.536c6.229,7.153-2.307,4.96-2.307,4.96 S367.101,174.5,356.718,169.194z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M383.828,172.193c0,0,3.691-14.766,14.766-22.15c0,0-11.074,18.457-11.074,33.224L383.828,172.193z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M400.901,156.158c0,0-7.73,4.729-11.882,12.459l3.346,7.73 C392.365,176.345,395.134,165.387,400.901,156.158z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M409.438,157.888c0,0-13.382,4.153-19.726,12.806l3.807,5.768 C393.518,176.461,398.594,166.656,409.438,157.888z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M411.4,164.579c0,0-14.074,2.191-20.419,8.883l1.615,6.345 C392.596,179.807,400.324,170.578,411.4,164.579z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M410.937,169.194c0,0-13.612,1.385-19.842,8.536c-6.229,7.153,2.307,4.96,2.307,4.96 S400.555,174.5,410.937,169.194z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M383.828,150.044c0,0-3.691,7.767,0,11.651C387.52,157.811,383.828,150.044,383.828,150.044z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M380.15,151.972c0,0-0.495,8.586,4.386,10.794C386.495,157.779,380.15,151.972,380.15,151.972z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M387.506,151.972c0,0,0.495,8.586-4.386,10.794C381.161,157.779,387.506,151.972,387.506,151.972z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M388.715,156.925c0,0-3.221,7.975-8.578,7.884C380.498,159.463,388.715,156.925,388.715,156.925z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M378.941,156.925c0,0,3.221,7.975,8.578,7.884C387.158,159.463,378.941,156.925,378.941,156.925z"/>
|
|
||||||
</g>
|
|
||||||
<ellipse style="fill:#FFD255;" cx="383.82" cy="175.89" rx="11.08" ry="14.766"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#73AF00;" d="M358.526,190.958l-2.538-3.923c0,0-7.383,1.769-9.152-3.768l-2.846-0.231 c0,0,0.384-3.768,3.691-4.307c0,0,1.999-2.461,5.537-1.999c3.538,0.461,5.384,3.46,7.422,4.23c2.038,0.769,2.269,3.307,2.269,3.307 l15.535,15.919c0,0-4.46,5.692-8.46,7.537S351.296,200.572,358.526,190.958z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M408.977,193.88c0,0,6.461,4.384,6.691,16.497h-10.729c0,0,0.116-8.191-1.961-12.574L408.977,193.88 z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M407.593,194.343c0,0,8.075,2.654,13.036-3.691l-8.422-1.153L407.593,194.343z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M405.17,185.46l8.2,2.764c1.034,0.349,1.399,1.629,0.674,2.445 c-3.111,3.505-12.397,11.903-27.37,11.903c-19.496,0-24.533-12.267-24.764-13.19c-0.231-0.922-1.269-8.422-1.269-8.422l8.306-0.922 L405.17,185.46z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<polygon style="fill:#FF4B55;" points="325.44,298.403 346.913,298.403 335.838,319.854 324.764,305.088 "/>
|
|
||||||
<polygon style="fill:#FF4B55;" points="442.216,298.403 420.744,298.403 431.818,319.854 442.892,305.088 "/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#FFD25A;" d="M325.351,334.621c-10.593,0-18.699-5.685-19.117-5.981l8.536-12.052 c0.071,0.046,7.223,4.906,14.516,2.697c7.38-2.228,12.225-10.937,14.991-17.856l13.71,5.486 c-5.816,14.542-14.112,23.479-24.651,26.569C330.58,334.293,327.893,334.621,325.351,334.621z"/>
|
|
||||||
<path style="fill:#FFD25A;" d="M442.305,334.621c10.593,0,18.699-5.685,19.117-5.981l-8.536-12.052 c-0.071,0.046-7.223,4.906-14.516,2.697c-7.38-2.228-12.225-10.937-14.991-17.856l-13.71,5.486 c5.816,14.542,14.112,23.479,24.651,26.569C437.076,334.293,439.764,334.621,442.305,334.621z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#FF4B55;" d="M431.818,257.098h-95.98v-35.47c0-4.875,3.953-8.828,8.828-8.828h78.325 c4.875,0,8.828,3.953,8.828,8.828L431.818,257.098L431.818,257.098z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#FFE15A;" d="M362.025,238.641l-1.153-7.383c-5.422-0.231-8.536-6.575-8.536-6.575l-4.384,2.422 C352.565,238.179,362.025,238.641,362.025,238.641z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M419.82,231.027c1.615-1.23,5.153-1.692,5.153-1.692c-2.538-2.615-5.306-0.769-5.306-0.769 c2.307-2.153,1-5.229,1-5.229c0,1-1.615,1.692-1.615,1.692c0.077-1.999-1.999-3.923-1.999-3.923l-1.077,1.769 c-0.692-1.692-3.153-2.999-3.153-2.999l-1,4.153c-2.307-1.999-6.383-1.846-6.383-1.846l0.769,1.923 c-2.461,0.076-9.152,1.461-13.075,1.922s-7.075-0.615-7.075-2.383c0-1.482,3.428-1.665,4.911-1.687 c1.049,0.234,2.368,0.612,4.222,1.169c3.46,1.038,5.487-0.466,5.487-0.466c-1.212-0.461-1.346-1-1.346-1 c2.595-1.5,5.03-1.13,5.03-1.13c-0.865-1.903-4.615-1.788-4.615-1.788c0.981-0.519,1.73-2.134,1.73-2.134 c-0.231,0.231-2.362,0.754-5.272,1.144c-2.19,0.295-4.247,1.96-5.097,2.73c-2.31-0.177-8.342-0.25-7.281,3.933 c1.308,5.153,11.69,3.307,18.073,2.307s9.69-0.153,11.074,0.692c1.385,0.846-0.589,3.712-7.075,2.538 c-5.605-1.014-8.692-1.043-10.387-0.865c-1.879,0.12-3.481,0.626-4.61,0.865c-2.538,0.538-12.306,3.999-14.151-1 c-1.846-5-10.844,8.152-10.844,8.152l0.703,0.836l-2.395-0.567c-3.23,4.326-12.92,5.653-12.92,5.653s-1.442-2.595-2.654-2.942 c-1.212-0.346-1.73,1.557-1.73,1.557s-1.442,0.057-1.557,1.385c-0.116,1.326,1.038,1.442,1.038,1.442s-1.385,2.019,0.922,2.595 c0,0-0.173,2.826,3.23,0.865c10.11,1.274,17.482-3.917,20.674-6.749c2.087,0.134,5.339,0.067,7.839-1.23 c3.999-2.077,8.614-4.692,11.305-3.691c0,0,2.154,6.614-6.306,6.767c0,0-1.251-1.582-2.51-1.582c-0.543,0-1.108,0.652-0.934,1.238 c0,0-1.476-0.087-1.737,0.782c-0.213,0.708,0.303,1.519,1.389,1.389c0,0-0.738,1.086,0,1.737s1.651,0,1.651,0 s-0.391,1.346,0.521,1.476c0.78,0.111,1.813-1.163,2.109-1.55c1.354,0.211,10.591,1.276,12.586-8.413c0,0,4.615,1.999,9.152,1.615 s8.999,0.308,8.614,2.538c-0.503,1.617-1.495,1.51-1.495,1.51c-1.086-0.435-2.91-0.391-3.17,1.173 c-0.26,1.564,1.867,1.607,1.867,1.607c0.608,1.433,2.345,0.825,2.345,0.825c1.519,1.086,2.519-0.087,2.519-0.087 c0.652,0.565,1.324,0.67,1.954,0.13c0.608-0.521,0.267-3.996,0.209-5.236c-0.096-2.063-0.385-7.459-3.384-7.537 c-2.999-0.077-6.845,1.692-12.151-2.769c-0.277-0.233-0.547-0.381-0.821-0.579c2.511,0.233,4.31,0.914,6.051,1.194 C411.207,232.873,418.206,232.257,419.82,231.027z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M347.95,227.104c0,0-1.471,0.04-2.191-0.173c-1.235-0.364-1.385-2.307-0.057-2.654 c0,0-1.597-1.085-0.865-2.307c0.586-0.978,2.079-0.975,2.598-0.398c0,0-0.487-1.609,0.921-2.14c1.12-0.423,2.019,0.865,2.019,2.538 c0,0,1.674-1.362,2.538-0.461c0.602,0.628,0.429,1.453-0.577,3.172C351.309,226.436,347.95,227.104,347.95,227.104z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#41479B;" d="M346.131,226.393c0,0-0.781,1.346-3.04,0.521c0,0,1.954-0.913,2.215-1.694L346.131,226.393z"/>
|
|
||||||
<path style="fill:#41479B;" d="M345.305,222.441c0,0-1.216-0.781-2.562-0.738c0,0,1.997-1.476,3.691-0.173L345.305,222.441z"/>
|
|
||||||
<path style="fill:#41479B;" d="M348.129,220.356c0,0,0.391-1.433-0.391-2.215c0,0,1.607,0.695,1.824,1.997L348.129,220.356z"/>
|
|
||||||
<path style="fill:#41479B;" d="M351.69,221.833c0,0,0.781-1.737,0.087-2.562c0,0,2.084,1.216,1.216,3.214L351.69,221.833z"/>
|
|
||||||
<path style="fill:#41479B;" d="M347.62,241.134c0,0-0.836-1.711-1.914-1.705c0,0,2.268-0.825,3.249,1.12L347.62,241.134z"/>
|
|
||||||
<path style="fill:#41479B;" d="M345.793,243.315c0,0-1.491-1.186-2.462-0.716c0,0,1.693-1.72,3.414-0.386L345.793,243.315z"/>
|
|
||||||
<path style="fill:#41479B;" d="M346.84,246.391c0,0-1.905-0.021-2.383,0.946c0,0,0.28-2.397,2.458-2.4L346.84,246.391z"/>
|
|
||||||
<path style="fill:#41479B;" d="M348.582,248.37c0,0-0.781,1.346-3.04,0.521c0,0,1.954-0.913,2.215-1.694L348.582,248.37z"/>
|
|
||||||
<path style="fill:#41479B;" d="M382.909,247.686c0,0-0.64,1.102-2.49,0.427c0,0,1.502-0.536,1.715-1.177L382.909,247.686z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#FFD255;" d="M363.372,223.874c0,0-4.154,7.075-3.155,17.304c0,0,12.247-1.788,17.554-14.016 c0,0,1.293-0.523,1.797-1.779c0.429-1.068,0.394-2.827-1.663-2.817c0,0,0.616-1.23,1.365-1.519c0,0-1.326-0.519-2.884-0.173 c0,0,1.212-1.212,1.212-2.769c0,0-1.846,1.212-2.999,1.326c0,0-0.116-1.903,0.346-2.134c0,0-2.422,0.231-3.634,1.5 c0,0-0.808-1.096-0.75-2.25c0,0-2.25,0.981-3.115,2.422c0,0-0.692-0.75-0.634-1.5c0,0-1.615,1.961-1.961,2.999 c0,0-1.522-0.418-2.191,0.808C362.176,222.163,362.286,223.136,363.372,223.874z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#41479B;" d="M381.063,242.535c0,0-0.492-0.927-1.969-1.129c0,0,1.882-0.868,3.069,0.376L381.063,242.535z"/>
|
|
||||||
<path style="fill:#41479B;" d="M411.595,246.052c0,0-1.079,0.341-1.585,1.867c0,0-0.553-2.167,1.001-3.182L411.595,246.052z"/>
|
|
||||||
<path style="fill:#41479B;" d="M413.859,246.849c0,0-1.022,0.993-0.973,2.601c0,0-1.261-1.847-0.149-3.332L413.859,246.849z"/>
|
|
||||||
<path style="fill:#41479B;" d="M418.745,246.762c0,0-0.309,1.052,0.625,2.174c0,0-1.933-0.615-1.97-2.298L418.745,246.762z"/>
|
|
||||||
<path style="fill:#41479B;" d="M416.449,247.171c0,0-0.82,0.78-0.602,2.374c0,0-1.525-1.34-0.575-2.934L416.449,247.171z"/>
|
|
||||||
<path style="fill:#41479B;" d="M379.489,244.431c0,0-0.988-0.354-2.216,0.49c0,0,0.807-1.909,2.522-1.788L379.489,244.431z"/>
|
|
||||||
<path style="fill:#41479B;" d="M380.839,246.531c0,0-1.015-0.266-2.165,0.682c0,0,0.177-1.842,1.897-1.87L380.839,246.531z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#F5F5F5;" d="M431.818,263.047c-8.006,0-8.006,7.221-16.011,7.221s-8.006-7.221-16.011-7.221 c-8,0-8,7.221-16,7.221c-7.993,0-7.993-7.221-15.986-7.221s-7.992,7.221-15.983,7.221c-7.994,0-7.994-7.221-15.989-7.221v-13.332 c7.994,0,7.994,7.221,15.989,7.221c7.992,0,7.992-7.221,15.983-7.221c7.993,0,7.993,7.221,15.986,7.221c8,0,8-7.221,16-7.221 c8.006,0,8.006,7.221,16.011,7.221s8.006-7.221,16.011-7.221V263.047z"/>
|
|
||||||
<path style="fill:#41479B;" d="M415.807,270.269c-8.006,0-8.006-7.221-16.011-7.221c-8,0-8,7.221-16,7.221 c-7.993,0-7.993-7.221-15.986-7.221s-7.992,7.221-15.983,7.221c-7.978,0-8-7.186-15.944-7.217c0.11,3.192,0.477,7.93,1.412,13.497 c6.494,0.86,7.085,7.051,14.531,7.051c7.992,0,7.992-7.222,15.983-7.222c7.993,0,7.993,7.222,15.986,7.222c8,0,8-7.222,16-7.222 c8.006,0,8.006,7.222,16.011,7.222c7.457,0,8.05-6.193,14.553-7.051c0.936-5.567,1.302-10.305,1.412-13.497 C423.818,263.083,423.796,270.269,415.807,270.269z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M415.807,283.601c-8.006,0-8.006-7.222-16.011-7.222c-8,0-8,7.222-16,7.222 c-7.993,0-7.993-7.222-15.986-7.222s-7.992,7.222-15.983,7.222c-7.446,0-8.038-6.191-14.531-7.051 c0.742,4.412,1.848,9.331,3.479,14.418c3.599,2.066,5.166,5.965,11.052,5.965c7.992,0,7.992-7.221,15.983-7.221 c7.993,0,7.993,7.221,15.986,7.221c8,0,8-7.221,16-7.221c8.006,0,8.006,7.221,16.011,7.221c5.899,0,7.465-3.907,11.076-5.971 c1.63-5.085,2.735-10.003,3.478-14.412C423.857,277.408,423.264,283.601,415.807,283.601z"/>
|
|
||||||
<path style="fill:#41479B;" d="M415.807,296.932c-8.006,0-8.006-7.221-16.011-7.221c-8,0-8,7.221-16,7.221 c-7.993,0-7.993-7.221-15.986-7.221s-7.992,7.221-15.983,7.221c-5.885,0-7.453-3.9-11.052-5.965 c2.031,6.338,4.884,12.911,8.866,19.041c0.671,0.138,1.363,0.256,2.186,0.256c7.992,0,7.992-7.222,15.983-7.222 c7.993,0,7.993,7.222,15.986,7.222c8,0,8-7.222,16-7.222c8.006,0,8.006,7.222,16.011,7.222c0.832,0,1.533-0.118,2.21-0.258 c3.982-6.132,6.835-12.706,8.866-19.044C423.273,293.025,421.706,296.932,415.807,296.932z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M415.807,310.264c-8.006,0-8.006-7.222-16.011-7.222c-8,0-8,7.222-16,7.222 c-7.993,0-7.993-7.222-15.986-7.222s-7.992,7.222-15.983,7.222c-0.823,0-1.515-0.118-2.186-0.256 c2.53,3.895,5.526,7.599,9.054,10.951c2.444-2.065,4.386-4.585,9.116-4.585c7.993,0,7.993,7.221,15.986,7.221c8,0,8-7.221,16-7.221 c4.749,0,6.691,2.532,9.149,4.6c3.535-3.357,6.537-7.066,9.071-10.968C417.34,310.146,416.639,310.264,415.807,310.264z"/>
|
|
||||||
<path style="fill:#41479B;" d="M408.945,320.974c-2.457-2.068-4.399-4.6-9.149-4.6c-8,0-8,7.221-16,7.221 c-7.993,0-7.993-7.221-15.986-7.221c-4.73,0-6.671,2.52-9.116,4.585c6.43,6.11,14.628,11.034,25.133,13.661 C394.324,331.997,402.517,327.078,408.945,320.974z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#F5F5F5;" d="M399.796,249.715c-8,0-8,7.221-16,7.221c-7.993,0-7.993-7.221-15.986-7.221 s-7.992,7.221-15.983,7.221c-7.994,0-7.994-7.221-15.989-7.221c0,4.555,0,8.511,0,11.074c0,0.625,0.014,1.395,0.044,2.262 c7.944,0.031,7.967,7.217,15.944,7.217c7.992,0,7.992-7.221,15.983-7.221c7.993,0,7.993,7.221,15.986,7.221c8,0,8-7.221,16-7.221 c8.006,0,8.006,7.221,16.011,7.221c7.989,0,8.011-7.186,15.967-7.217c0.03-0.868,0.044-1.638,0.044-2.262c0-2.563,0-6.52,0-11.074 c-8.006,0-8.006,7.221-16.011,7.221C407.801,256.937,407.801,249.715,399.796,249.715z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M428.127,212.8c2.039,0,3.691,1.653,3.691,3.691v33.224v7.383c0,1.399,0,2.678,0,3.691 c0,0.625-0.014,1.395-0.044,2.262c-0.11,3.192-0.477,7.93-1.412,13.497c-0.742,4.409-1.848,9.327-3.478,14.412 c-2.031,6.339-4.884,12.914-8.866,19.044c-2.535,3.903-5.537,7.613-9.071,10.968c-6.428,6.103-14.621,11.022-25.117,13.646 c-10.505-2.626-18.703-7.551-25.133-13.661c-3.528-3.352-6.524-7.055-9.054-10.951c-3.982-6.131-6.835-12.703-8.866-19.041 c-1.631-5.087-2.738-10.007-3.479-14.418c-0.936-5.567-1.302-10.305-1.412-13.497c-0.03-0.868-0.044-1.638-0.044-2.262 c0-1.013,0-2.293,0-3.691v-7.383V216.49c0-2.039,1.653-3.691,3.691-3.691h88.596 M428.127,210.031H339.53 c-3.562,0-6.461,2.898-6.461,6.461v33.224v7.383v3.691c0,0.651,0.014,1.453,0.046,2.358c0.105,3.014,0.441,7.863,1.449,13.86 c0.858,5.106,2.061,10.086,3.573,14.804c2.34,7.299,5.429,13.929,9.181,19.704c2.763,4.253,5.949,8.106,9.468,11.451 c7.342,6.977,16.214,11.801,26.369,14.34l0.672,0.168l0.671-0.168c10.147-2.537,19.013-7.357,26.353-14.325 c3.528-3.35,6.72-7.208,9.487-11.468c3.753-5.777,6.841-12.407,9.181-19.709c1.512-4.714,2.713-9.693,3.572-14.797 c1.009-5.997,1.345-10.848,1.449-13.86c0.031-0.905,0.046-1.707,0.046-2.358v-3.691v-7.383v-33.224 C434.586,212.929,431.689,210.031,428.127,210.031L428.127,210.031z"/>
|
|
||||||
</g>
|
|
||||||
<polygon style="fill:#73AF00;" points="383.828,312.296 373.698,319.345 377.272,307.532 367.438,300.077 379.775,299.827 383.828,288.169 387.881,299.827 400.217,300.077 390.385,307.532 393.959,319.345 "/>
|
|
||||||
<path style="fill:#FFE15A;" d="M383.828,290.447l3.517,10.115l10.708,0.218l-8.535,6.47l3.102,10.251l-8.791-6.116l-8.791,6.116 l3.102-10.251l-8.534-6.47l10.708-0.218L383.828,290.447 M383.828,285.892l-1.412,4.064l-3.175,9.133l-9.667,0.198l-4.301,0.087 l3.428,2.6l7.704,5.842l-2.799,9.255l-1.246,4.118l3.532-2.457l7.936-5.523l7.936,5.523l3.532,2.457l-1.246-4.118l-2.799-9.255 l7.704-5.842l3.428-2.6l-4.301-0.087l-9.667-0.198l-3.175-9.133L383.828,285.892L383.828,285.892z"/>
|
|
||||||
<polygon style="fill:#73AF00;" points="361.581,283.502 351.451,290.551 355.025,278.739 345.191,271.284 357.528,271.032 361.581,259.374 365.633,271.032 377.971,271.284 368.137,278.739 371.711,290.551 "/>
|
|
||||||
<path style="fill:#FFE15A;" d="M361.581,261.653l3.517,10.115l10.708,0.218l-8.534,6.47l3.102,10.251l-8.791-6.116l-8.791,6.116 l3.102-10.251l-8.534-6.47l10.708-0.218L361.581,261.653 M361.581,257.098l-1.412,4.064l-3.175,9.133l-9.667,0.198l-4.301,0.087 l3.428,2.6l7.704,5.842l-2.799,9.255l-1.246,4.118l3.532-2.457l7.936-5.523l7.936,5.523l3.532,2.457l-1.246-4.118l-2.799-9.255 l7.704-5.842l3.428-2.6l-4.301-0.087l-9.667-0.198l-3.175-9.133L361.581,257.098L361.581,257.098z"/>
|
|
||||||
<polygon style="fill:#73AF00;" points="405.879,283.502 395.75,290.551 399.322,278.739 389.49,271.284 401.826,271.032 405.879,259.374 409.932,271.032 422.269,271.284 412.436,278.739 416.009,290.551 "/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#FFE15A;" d="M405.879,261.653l3.517,10.115l10.707,0.218l-8.534,6.47l3.102,10.251l-8.791-6.116l-8.791,6.116 l3.102-10.251l-8.534-6.47l10.708-0.218L405.879,261.653 M405.879,257.098l-1.412,4.064l-3.175,9.133l-9.667,0.198l-4.301,0.087 l3.428,2.6l7.704,5.842l-2.799,9.255l-1.246,4.118l3.532-2.457l7.936-5.523l7.936,5.523l3.532,2.457l-1.246-4.118l-2.799-9.255 l7.704-5.842l3.428-2.6l-4.301-0.087l-9.667-0.198l-3.175-9.133L405.879,257.098L405.879,257.098z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M442.216,298.403c-9.161,23.326-31.85,39.908-58.388,39.908s-49.227-16.583-58.388-39.908 l-13.738,5.375c11.317,28.814,39.345,49.3,72.126,49.3s60.809-20.486,72.126-49.3L442.216,298.403z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<polygon style="fill:#F5F5F5;" points="391.211,212.8 380.137,212.8 376.445,201.725 387.52,201.725 "/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M409.668,212.8h-7.383l-2.461-7.383h3.37c2.397,0,4.524,1.534,5.282,3.807L409.668,212.8z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M369.062,212.8h-7.383l-0.842-2.525c-0.797-2.39,0.982-4.858,3.502-4.858h2.261L369.062,212.8z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#41479B;" d="M402.285,212.8h-11.074l-3.691-11.074h8.414c1.589,0,2.999,1.016,3.502,2.525L402.285,212.8z"/>
|
|
||||||
<path style="fill:#41479B;" d="M380.137,212.8h-11.074l-2.494-7.48c-0.589-1.768,0.727-3.594,2.591-3.594h7.286L380.137,212.8z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#509664;" d="M410.937,187.19c-2.884,4.153-10.959,9.113-24.11,9.113c-10.836,0-17.805-6.543-20.132-9.123 c-0.567-0.628-0.863-1.431-0.863-2.278v-2.518c0-1.084,0.562-2.07,1.498-2.614c2.344-1.364,7.762-3.54,18.458-3.54 C399.055,176.231,410.937,187.19,410.937,187.19z"/>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 10 KiB |
@@ -1,113 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
|
||||||
<path style="fill:#41479B;" d="M473.655,423.724H38.345C17.167,423.724,0,406.557,0,385.379V126.621 c0-21.177,17.167-38.345,38.345-38.345h435.31c21.177,0,38.345,17.167,38.345,38.345V385.38 C512,406.557,494.833,423.724,473.655,423.724z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M8.828,256h15.334l81.77-53.574V256h44.138v-53.574L231.839,256h15.334 c4.875,0,8.828-3.953,8.828-8.828v-7.002l-70.154-45.963H256v-44.138h-70.155L256,104.106v-7.002c0-4.875-3.95-8.826-8.825-8.828 h-15.337l-81.769,53.574V88.276h-44.138v53.574L26.844,90.034c-2.287,0.718-4.482,1.647-6.562,2.761 c-0.02,0.011-0.041,0.021-0.062,0.032c-0.471,0.253-0.936,0.52-1.395,0.792c-0.056,0.033-0.114,0.064-0.17,0.097 c-0.445,0.267-0.882,0.546-1.314,0.83c-0.066,0.044-0.135,0.085-0.201,0.129c-0.431,0.287-0.854,0.585-1.273,0.889 c-0.062,0.045-0.126,0.088-0.188,0.134c-0.423,0.31-0.836,0.631-1.246,0.958c-0.053,0.043-0.108,0.084-0.161,0.127 c-0.414,0.334-0.82,0.68-1.22,1.031c-0.043,0.039-0.088,0.075-0.131,0.115c-0.405,0.36-0.801,0.728-1.191,1.103 c-0.034,0.033-0.07,0.066-0.105,0.099c-0.395,0.385-0.781,0.778-1.16,1.178c-0.025,0.026-0.051,0.053-0.076,0.081 c-0.384,0.409-0.76,0.828-1.127,1.255c-0.017,0.02-0.033,0.039-0.05,0.058c-0.372,0.435-0.735,0.877-1.087,1.33 c-0.009,0.011-0.019,0.023-0.028,0.035c-0.356,0.458-0.704,0.924-1.039,1.398c-0.004,0.007-0.01,0.013-0.014,0.021 c-0.34,0.479-0.669,0.966-0.985,1.461c-0.001,0.001-0.002,0.003-0.003,0.004c-0.32,0.499-0.628,1.005-0.925,1.518l65.024,42.599H0 v44.138h70.154L0,240.17v7.008C0.003,252.051,3.954,256,8.828,256z"/>
|
|
||||||
<g>
|
|
||||||
<polygon style="fill:#FF4B55;" points="256,158.897 141.241,158.897 141.241,88.276 114.759,88.276 114.759,158.897 0,158.897 0,185.379 114.759,185.379 114.759,256 141.241,256 141.241,185.379 256,185.379 "/>
|
|
||||||
<path style="fill:#FF4B55;" d="M8.228,102.903l72.661,47.166h16.214l-82.496-53.55C12.238,98.389,10.098,100.533,8.228,102.903z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M166.283,150.069l88.374-57.366c-1.536-2.599-4.246-4.427-7.485-4.427h-1.909l-95.194,61.793 H166.283z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M89.474,194.207L1.269,251.463C2.79,254.125,5.542,256,8.828,256h1.665l95.196-61.793H89.474z"/>
|
|
||||||
<path style="fill:#FF4B55;" d="M255.86,247.866l-82.666-53.66H156.98l93.874,60.935 C253.666,253.837,255.595,251.102,255.86,247.866z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#73AF00;" d="M387.207,177.365c-0.199,0-0.402-0.063-0.575-0.193c-0.138-0.106-13.838-10.783-5.769-28.879 c0.214-0.48,0.777-0.692,1.259-0.482c0.48,0.216,0.695,0.777,0.482,1.259c-7.443,16.687,4.662,26.19,5.181,26.586 c0.418,0.318,0.499,0.915,0.18,1.333C387.777,177.235,387.495,177.365,387.207,177.365z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M379.316,161.734c-0.038,0-0.074-0.002-0.111-0.006c-0.523-0.062-0.896-0.534-0.836-1.056 c0.396-3.422,1.683-5.81,3.828-7.096c3.449-2.073,7.761-0.417,7.941-0.344c0.489,0.192,0.729,0.742,0.537,1.231 c-0.192,0.489-0.746,0.733-1.231,0.541c-0.038-0.014-3.638-1.382-6.276,0.209c-1.604,0.969-2.583,2.879-2.905,5.679 C380.205,161.377,379.791,161.734,379.316,161.734z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M381.902,149.46c-0.082-0.21-2.141-5.098-11.447-3.018c-10.539,2.361-10.661,16.264-10.661,16.403 c0,0.478,0.355,0.884,0.831,0.945c0.041,0.006,0.082,0.008,0.121,0.008c0.428,0,0.811-0.288,0.92-0.711 c3.928-14.962,18.557-12.449,19.178-12.34c0.352,0.063,0.69-0.067,0.907-0.331C381.973,150.147,382.031,149.781,381.902,149.46z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M379.71,157.21c0,0-6.348-4.046-8.967,1.111c-2.618,5.158-0.634,10.712,0.397,12.934 c0,0,3.784-4.183,7.38-4.761c4.444-0.714,5.555-6.269,2.46-9.046C377.282,154.131,379.71,157.21,379.71,157.21z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M386.645,147.731c-0.09,5.554,3.005,6.282,3.005,6.282 C391.651,148.914,386.645,147.731,386.645,147.731z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M385.676,159.396c0.042-5.27,3.616-5.863,3.616-5.863 C391.458,158.433,385.676,159.396,385.676,159.396z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#FF4B55;" d="M406.292,155.147c0,0-5.054-0.747-6.993-1.663c-1.613-0.761-3.719-2.599-6.444-2.24 c-2.083,0-3.772,1.688-3.772,3.772c0,2.083,1.431,4.579,8.917,4.025c3.629-0.269,6.721,1.389,6.721,1.389 C404.246,158.446,406.292,155.147,406.292,155.147z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M401.047,156.801c0,0-7.752,0.537-9.454-0.717c-1.571-1.158-1.161-3.002,0.448-3.181 C394.461,152.633,401.047,156.801,401.047,156.801z"/>
|
|
||||||
<path style="fill:#B49B91;" d="M416.131,165.581l-17.14,10.712l-1.964-1.905l9.402-9.106l2.201,0.893l2.143-2.857l-5.118-2.678 c0,0-13.569,12.794-25.113,13.866c-3.884,0.361-7.842,0.107-10.929-1.164l-6.925,9.972l14.52,12.378l21.305-0.833l17.615-23.924 l3.094,1.428l2.618-3.094L416.131,165.581z"/>
|
|
||||||
<path style="fill:#9B8278;" d="M368.365,194.424c-4.768,0-8.648-3.88-8.648-8.646c0-4.768,3.88-8.648,8.648-8.648 c4.767,0,8.646,3.88,8.646,8.648C377.012,190.545,373.132,194.424,368.365,194.424z M368.365,179.987 c-3.193,0-5.791,2.598-5.791,5.791s2.598,5.79,5.791,5.79s5.79-2.596,5.79-5.79S371.559,179.987,368.365,179.987z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#73AF00;" d="M404.387,202.439c0,0,1.587-1.032,3.174-5.871l-3.253,0.476c0,0,0.634-2.698-0.079-4.682 l-3.65,2.857c0,0-1.666-3.491-2.38-3.967c0,0-2.539,3.571-3.967,4.046c0,0-1.428-5.158-2.857-6.189l-2.46,3.491l-3.65-2.857 c0,0,0,2.46-0.079,3.016c-0.079,0.555-4.761-4.919-4.761-4.919s-2.063,0.873-4.84,5.316l-3.491-3.571l-1.428,4.682l-4.84-1.27 l0.793,2.777l-4.205-0.318c0,0,0.714,4.126,2.777,5.555L404.387,202.439z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M362.333,220.094c0,0-13.092,16.663-37.849,14.759l26.899,3.69l13.806-13.092L362.333,220.094z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#FFE15A;" d="M319.604,232.353c2.618,1.905,18.806,6.547,30.47,0.952c0,0,0.238,2.738-1.071,4.285 c0,0,8.569-3.452,13.212-9.879s-9.641,13.806-9.641,13.806l-21.9,4.046l-8.927-7.38L319.604,232.353z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M317.882,172.349c-2.908,0.244-6.053,1.995-7.662,4.122c-0.876-0.372-2.823-0.537-4.436,0.537 c-2.148,1.432-6.118,6.604-9.45,5.236c0,0-0.298,4.879,4.879,4.702c0,0-1.31,2.024-1.071,5.237 c0.238,3.213-2.083,5.356-2.083,5.356s10.474,1.487,10.891-6.665c0.051-0.996,0.102-1.874,0.15-2.657 c5.466,2.952,7.617-1.215,7.617-1.215s-3.285-3.103,0.059-7.52c3.343-4.418,12.533,5.996,12.533,5.996 C329.489,181.311,329.115,171.405,317.882,172.349z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#73AF00;" d="M358.365,199.82c0,0-3.015,2.063-12.378,0.159c0,0,2.063-4.602,1.111-7.3 c0,0-2.539,2.38-8.728,4.761s-13.806,9.998-16.029,14.918c0,0,13.92-32.088,2.738-35.35c-3.836-1.119-7.135,0.695-8.302,2.474 c0.564,0.666,1.106,1.615,1.161,2.882c0.119,2.738-2.618,21.186-6.665,33.921c0,0-1.191-4.404-3.094-6.547 c-1.903-2.143-3.332-5.594-3.332-5.594s-3.213,2.143-2.738,6.07c0,0-1.785-1.428-5.237-0.476s-4.761-1.31-4.761-1.31 s-2.857,7.617,5.594,11.545c0,0-2.261,1.071-3.332,1.905c-1.071,0.833-2.738,0.833-2.738,0.833s2.976,5.475,9.283,6.07 c6.308,0.595,9.207,2.393,11.188,5.633c6.428,10.514,18.727,18.488,38.802,6.189c0,0-28.565,8.887-29.835-9.363 c-1.111-15.965,16.345-19.202,18.091-15.711s-0.159,6.507-0.159,6.507s9.522-2.221,4.919-10.951 C343.924,211.087,353.287,212.516,358.365,199.82z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M450.052,232.353c-2.618,1.905-19.162,9.046-30.589-2.38 c-11.426-11.426-15.882-28.582-15.235-26.662h-11.426l3.809,34.279l42.372,7.975l8.927-7.38L450.052,232.353z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M451.774,172.349c2.908,0.244,6.053,1.995,7.662,4.122c0.876-0.372,2.823-0.537,4.436,0.537 c2.148,1.432,6.118,6.604,9.45,5.236c0,0,0.298,4.879-4.879,4.702c0,0,1.31,2.024,1.071,5.237 c-0.238,3.213,2.083,5.356,2.083,5.356s-10.474,1.487-10.891-6.665c-0.051-0.996-0.102-1.874-0.15-2.657 c-5.466,2.952-7.617-1.215-7.617-1.215s3.284-3.103-0.059-7.52c-3.343-4.418-12.533,5.996-12.533,5.996 C440.168,181.311,440.542,171.405,451.774,172.349z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#FFE15A;" d="M411.29,199.82c0,0,3.015,2.063,12.378,0.159c0,0-2.063-4.602-1.111-7.3c0,0,2.539,2.38,8.728,4.761 s13.806,9.998,16.029,14.918c0,0-13.92-32.088-2.738-35.35c3.836-1.119,7.135,0.695,8.302,2.474 c-0.564,0.666-1.106,1.615-1.161,2.882c-0.119,2.738,2.618,21.186,6.665,33.921c0,0,1.191-4.404,3.094-6.547 s3.332-5.594,3.332-5.594s3.213,2.143,2.738,6.07c0,0,1.785-1.428,5.237-0.476s4.761-1.31,4.761-1.31s2.857,7.617-5.594,11.545 c0,0,2.261,1.071,3.332,1.905c1.071,0.833,2.738,0.833,2.738,0.833s-2.976,5.475-9.283,6.07c-6.308,0.595-9.207,2.393-11.188,5.633 c-6.428,10.514-18.727,18.488-38.802,6.189c0,0,28.565,8.887,29.835-9.363c1.111-15.965-16.345-19.202-18.091-15.711 s0.159,6.507,0.159,6.507s-9.522-2.221-4.919-10.951C425.732,211.087,416.369,212.516,411.29,199.82z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#73AF00;" d="M403.197,226.482c4.682,6.824,11.188,13.013,30.073,18.884s23.933,6.744,33.829,14.749 c0,0,1.88,1.985,2.6,5.167c0.845,3.738-4.919,14.52-4.919,14.52s0.555-2.539-2.936-7.458s-24.122-13.806-34.913-16.504 c-10.792-2.698-29.439-15.215-24.28-24.598L403.197,226.482z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M467.082,260.086c0.008,0.01,0.011,0.02,0.019,0.03c-0.012-0.013-0.022-0.026-0.034-0.039 L467.082,260.086z"/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#FFE15A;" d="M466.605,283.295c0,0,0.476,3.452-2.38,6.428c-2.857,2.976-4.879,5.118-4.761,7.617 c0,0-4.285-3.094-3.571-9.998c0,0-5.594,4.642-14.045,0.119c0,0,0.833-8.45,11.784-9.522c0,0-4.285-3.332,1.31-8.45 c0,0,0.65,2.289,5.713,3.452c4.404,1.012,12.239-4.511,6.445-12.824C477.079,271.393,471.961,279.129,466.605,283.295z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M399.111,220.213c0,0,2.413,3.945,8.689,7.776c7.538,4.602,8.213,6.744,8.213,6.744l-5.118-0.119 c0,0,6.547,3.571,8.332,8.094c0,0-2.738,0.476-5.832-0.358c0,0,2.499,2.261,1.31,9.522h-12.736L399.111,220.213z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#73AF00;" d="M373.759,252.825v-30.47c0,0-10.342,17.693-19.275,30.47H373.759z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M364.863,221.72c-2.539,4.602-10.474,19.758-29.359,25.63c-18.886,5.871-22.337,4.761-32.234,12.765 c0,0-1.88,1.985-2.6,5.167c-0.845,3.738,4.919,14.52,4.919,14.52s-0.555-2.539,2.936-7.458s24.006-14.324,34.913-16.504 c15.085-3.016,28.733-19.202,26.511-29.676C367.729,215.69,364.863,221.72,364.863,221.72z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#73AF00;" d="M303.288,260.086c-0.008,0.01-0.011,0.02-0.019,0.03c0.012-0.013,0.022-0.026,0.034-0.039 L303.288,260.086z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M303.765,283.295c0,0-0.476,3.452,2.38,6.428c2.857,2.976,4.879,5.118,4.761,7.617 c0,0,4.285-3.094,3.571-9.998c0,0,5.594,4.642,14.045,0.119c0,0-0.833-8.45-11.784-9.522c0,0,4.285-3.332-1.309-8.45 c0,0-0.65,2.289-5.713,3.452c-4.404,1.012-12.239-4.511-6.445-12.824C293.291,271.393,298.409,279.129,303.765,283.295z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#FFE15A;" d="M330.118,334.078c0,0,2.698,12.14,2.857,24.678c0,0,11.823,0.397,17.536-8.49 c0,0-11.426-5.951-17.536-17.457L330.118,334.078z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M327.578,307.258c-0.476-5.713,2.063-20.155,13.647-30.628l0.284-12.826c0,0-3.451,0.359-6.511,3.038 l-6.547,10.145l-6.07,22.972L327.578,307.258z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M327.895,311.384c0,0,0,12.22,5.078,21.425l-2.857,1.269c0,0-10.236-8.054-12.378-24.598 c0,0-9.165,6.07-12.537-6.348c0,0,9.839,3.968,13.013-5.078c2.863-8.162,5.758-23.02,16.783-31.212 c-5.241,8.055-13.133,28.673-7.023,35.974c1.618,1.933,6.269,3.571,11.359,1.397C339.001,308.273,337.065,314.477,327.895,311.384z"/>
|
|
||||||
<path style="fill:#FFCE5A;" d="M329.378,336.245l-1.672-3.072c-0.292-0.537-0.094-1.21,0.444-1.503l3.051-1.658 c0.537-0.292,1.209-0.094,1.502,0.444l1.672,3.072c0.292,0.537,0.094,1.21-0.444,1.503l-3.051,1.658 C330.343,336.981,329.671,336.782,329.378,336.245z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#FFE15A;" d="M432.636,334.078c0,0-2.698,12.14-2.857,24.678c0,0-11.823,0.397-17.536-8.49 c0,0,11.426-5.951,17.536-17.457L432.636,334.078z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M435.175,307.258c0.476-5.713-2.063-20.155-13.647-30.628l-0.284-12.826 c0,0,3.451,0.359,6.511,3.038l6.547,10.145l6.07,22.972L435.175,307.258z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#73AF00;" d="M423.42,304.212c5.09,2.174,9.741,0.536,11.359-1.397c6.11-7.3-1.782-27.918-7.023-35.974 c11.026,8.192,13.919,23.05,16.783,31.212c3.174,9.046,13.013,5.078,13.013,5.078c-3.372,12.418-12.537,6.348-12.537,6.348 c-2.143,16.544-12.378,24.598-12.378,24.598l-2.857-1.269c5.078-9.205,5.078-21.425,5.078-21.425 C425.688,314.477,423.752,308.273,423.42,304.212z"/>
|
|
||||||
<path style="fill:#FFCE5A;" d="M433.375,336.245l1.672-3.072c0.292-0.537,0.094-1.21-0.444-1.503l-3.051-1.658 c-0.537-0.292-1.209-0.094-1.502,0.444l-1.672,3.072c-0.292,0.537-0.094,1.21,0.444,1.503l3.051,1.658 C432.41,336.981,433.082,336.782,433.375,336.245z"/>
|
|
||||||
<path style="fill:#4173CD;" d="M343.289,249.016c-2.103,0-3.809,1.705-3.809,3.809v41.896c0,11.426,3.809,53.322,41.896,68.557 c38.088-15.235,41.896-57.131,41.896-68.557v-41.896c0-2.103-1.705-3.809-3.809-3.809H343.289z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M379.068,249.016l-36.121,69.231c0.904,3.202,2.031,6.516,3.446,9.864l34.984-67.053l34.984,67.053 c1.415-3.349,2.542-6.663,3.446-9.864l-36.121-69.231H379.068L379.068,249.016z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M416.36,328.111l-34.984-67.053l-34.984,67.053l0,0c5.762,13.639,16.188,27.649,34.984,35.167 C400.172,355.761,410.599,341.75,416.36,328.111L416.36,328.111z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M395.54,332.451l2.304,1.105c-0.966,1.428-2.977,3.738-6.823,5.831 c-2.905,1.581-5.713,3.452-7.741,4.886V312.84l9.522-0.979v-3.809l-9.522-0.979v-4.734c0-1.052-0.853-1.905-1.905-1.905 c-0.897,0-1.614,0.633-1.816,1.469c-0.633-0.454-1.367-0.777-2.202-0.777c-2.131,0-3.866,1.735-3.866,3.866 c0,1.003,0.407,1.9,1.037,2.589l-4.578,0.471v3.809l9.522,0.979v31.433c-2.027-1.433-4.835-3.305-7.741-4.886 c-3.847-2.092-5.857-4.403-6.823-5.831l2.304-1.105l-8.689-11.069v15.235l2.929-1.405c1.159,1.867,3.608,4.881,8.46,7.519 c4.059,2.209,7.998,5.079,9.559,6.254l1.905,1.476l1.905-1.476c1.561-1.175,5.501-4.045,9.559-6.254 c4.852-2.638,7.302-5.652,8.46-7.519l2.929,1.405v-15.235L395.54,332.451z M377.357,306.955c-1.082,0-1.962-0.879-1.962-1.962 s0.879-1.962,1.962-1.962s1.962,0.879,1.962,1.962S378.44,306.955,377.357,306.955z"/>
|
|
||||||
<path style="fill:#F5F5F5;" d="M384.319,298.53h-5.885c-1.53,0-2.771-1.24-2.771-2.771v-9.694c0-1.53,1.24-2.771,2.771-2.771h5.885 c1.53,0,2.771,1.24,2.771,2.771v9.694C387.09,297.29,385.849,298.53,384.319,298.53z"/>
|
|
||||||
<path style="fill:#B49B91;" d="M408.038,249.016c-7.617-11.426-7.617-34.279-7.617-34.279s0-15.235-19.043-15.235 c-9.647,0-14.398,3.91-16.746,7.767c-9.14,3.672-13.724,11.276-13.724,11.276c3.896,1.949,7.339,2.877,10.463,3.115 c6.209,7.389,8.275,14.524,8.824,19.656c-3.576,3.652-5.559,12.46-0.243,19.125c0,0,11.267-2.618,20.779-11.426h17.306v0.001 H408.038z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#9B8278;" d="M390.729,249.016h14.215C404.228,241.994,397.325,243.125,390.729,249.016z"/>
|
|
||||||
<path style="fill:#9B8278;" d="M404.589,241.826c-4.163-11.818-4.169-27.089-4.169-27.089s-0.001-0.248-0.04-0.675 c-4.959-0.673-10.035-0.308-19.956,3.532c-10.563,4.088-15.734,4.205-19.055,4.067c6.209,7.389,8.275,14.524,8.824,19.656 l0.153,8.096c0,0,5.951,0.873,19.043-6.666C395.921,238.988,401.457,238.666,404.589,241.826z"/>
|
|
||||||
<path style="fill:#9B8278;" d="M384.312,213.071c7.725-1.931,12.654-1.732,15.83-0.605c-0.851-4.243-4.349-12.964-18.765-12.964 c-9.647,0-14.398,3.91-16.746,7.767l-5.789,8.103C358.841,215.373,366.082,217.629,384.312,213.071z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#FFE15A;" d="M368.79,197.837c0.75,0.748,2.988,6.144,2.527,6.946c-0.297,0.515-6.257,1.997-7.223,1.241 c-0.862-0.674-1.87-6.486-1.293-7.157C363.324,198.261,368.163,197.213,368.79,197.837z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M376.454,197.549c0.692,0.793,2.26,6.068,1.639,6.741c-0.399,0.433-7.042,0.957-7.965,0.127 c-0.822-0.74-1.004-6.227-0.278-6.761C370.506,197.171,375.876,196.887,376.454,197.549z"/>
|
|
||||||
<path style="fill:#FFE15A;" d="M383.706,197.348c0.717,0.747,2.353,5.707,1.711,6.337c-0.413,0.405-7.284,0.882-8.241,0.099 c-0.853-0.698-1.054-5.852-0.305-6.353C377.553,196.979,383.108,196.725,383.706,197.348z"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#73AF00;" d="M391.078,197.694c0.634,0.815,1.831,6.019,1.165,6.623c-0.428,0.387-7.09,0.405-7.951-0.465 c-0.768-0.776-0.568-6.08,0.193-6.542C385.172,196.892,390.548,197.013,391.078,197.694z"/>
|
|
||||||
<path style="fill:#73AF00;" d="M406.29,200.847c0.491,0.909,0.444,5.743-0.313,6.228c-0.487,0.311-6.485-0.758-7.191-1.758 c-0.63-0.892,0.444-6.09,1.271-6.421C400.803,198.598,405.88,200.088,406.29,200.847z"/>
|
|
||||||
</g>
|
|
||||||
<path style="fill:#FFE15A;" d="M399.299,198.786c0.601,0.828,1.059,5.681,0.334,6.194c-0.466,0.33-7.33-0.234-8.162-1.131 c-0.743-0.801-0.2-5.803,0.614-6.175C392.822,197.336,398.797,198.095,399.299,198.786z"/>
|
|
||||||
<circle style="fill:#9B8278;" cx="368.36" cy="185.78" r="2.59"/>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 11 KiB |