|  | @@ -299,6 +299,8 @@
 | 
											
												
													
														|  |                                                  <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualBlockedDomains"}}' v-model="manualBlockedDomains"></setting-list-item>
 |  |                                                  <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualBlockedDomains"}}' v-model="manualBlockedDomains"></setting-list-item>
 | 
											
												
													
														|  |                                                  <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualDirectIPs"}}' v-model="manualDirectIPs"></setting-list-item>
 |  |                                                  <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualDirectIPs"}}' v-model="manualDirectIPs"></setting-list-item>
 | 
											
												
													
														|  |                                                  <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualDirectDomains"}}' v-model="manualDirectDomains"></setting-list-item>
 |  |                                                  <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualDirectDomains"}}' v-model="manualDirectDomains"></setting-list-item>
 | 
											
												
													
														|  | 
 |  | +                                                <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualIPv4Domains"}}' v-model="manualIPv4Domains"></setting-list-item>
 | 
											
												
													
														|  | 
 |  | +                                                <setting-list-item type="textarea" title='{{ i18n "pages.settings.templates.manualWARPDomains"}}' v-model="manualWARPDomains"></setting-list-item>
 | 
											
												
													
														|  |                                              </a-collapse-panel>
 |  |                                              </a-collapse-panel>
 | 
											
												
													
														|  |                                          </a-collapse>
 |  |                                          </a-collapse>
 | 
											
												
													
														|  |                                      </a-tab-pane>
 |  |                                      </a-tab-pane>
 | 
											
										
											
												
													
														|  | @@ -617,30 +619,30 @@
 | 
											
												
													
														|  |          computed: {
 |  |          computed: {
 | 
											
												
													
														|  |              templateSettings: {
 |  |              templateSettings: {
 | 
											
												
													
														|  |                  get: function () { return this.allSetting.xrayTemplateConfig ? JSON.parse(this.allSetting.xrayTemplateConfig) : null; },
 |  |                  get: function () { return this.allSetting.xrayTemplateConfig ? JSON.parse(this.allSetting.xrayTemplateConfig) : null; },
 | 
											
												
													
														|  | -                set: function (newValue) { this.allSetting.xrayTemplateConfig = JSON.stringify(newValue, null, 2) },
 |  | 
 | 
											
												
													
														|  | 
 |  | +                set: function (newValue) { this.allSetting.xrayTemplateConfig = JSON.stringify(newValue, null, 2); },
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  |              inboundSettings: {
 |  |              inboundSettings: {
 | 
											
												
													
														|  |                  get: function () { return this.templateSettings ? JSON.stringify(this.templateSettings.inbounds, null, 2) : null; },
 |  |                  get: function () { return this.templateSettings ? JSON.stringify(this.templateSettings.inbounds, null, 2) : null; },
 | 
											
												
													
														|  |                  set: function (newValue) {
 |  |                  set: function (newValue) {
 | 
											
												
													
														|  |                      newTemplateSettings = this.templateSettings;
 |  |                      newTemplateSettings = this.templateSettings;
 | 
											
												
													
														|  | -                    newTemplateSettings.inbounds = JSON.parse(newValue)
 |  | 
 | 
											
												
													
														|  | -                    this.templateSettings = newTemplateSettings
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    newTemplateSettings.inbounds = JSON.parse(newValue);
 | 
											
												
													
														|  | 
 |  | +                    this.templateSettings = newTemplateSettings;
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  |              outboundSettings: {
 |  |              outboundSettings: {
 | 
											
												
													
														|  |                  get: function () { return this.templateSettings ? JSON.stringify(this.templateSettings.outbounds, null, 2) : null; },
 |  |                  get: function () { return this.templateSettings ? JSON.stringify(this.templateSettings.outbounds, null, 2) : null; },
 | 
											
												
													
														|  |                  set: function (newValue) {
 |  |                  set: function (newValue) {
 | 
											
												
													
														|  |                      newTemplateSettings = this.templateSettings;
 |  |                      newTemplateSettings = this.templateSettings;
 | 
											
												
													
														|  | -                    newTemplateSettings.outbounds = JSON.parse(newValue)
 |  | 
 | 
											
												
													
														|  | -                    this.templateSettings = newTemplateSettings
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    newTemplateSettings.outbounds = JSON.parse(newValue);
 | 
											
												
													
														|  | 
 |  | +                    this.templateSettings = newTemplateSettings;
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  |              routingRuleSettings: {
 |  |              routingRuleSettings: {
 | 
											
												
													
														|  |                  get: function () { return this.templateSettings ? JSON.stringify(this.templateSettings.routing.rules, null, 2) : null; },
 |  |                  get: function () { return this.templateSettings ? JSON.stringify(this.templateSettings.routing.rules, null, 2) : null; },
 | 
											
												
													
														|  |                  set: function (newValue) {
 |  |                  set: function (newValue) {
 | 
											
												
													
														|  |                      newTemplateSettings = this.templateSettings;
 |  |                      newTemplateSettings = this.templateSettings;
 | 
											
												
													
														|  | -                    newTemplateSettings.routing.rules = JSON.parse(newValue)
 |  | 
 | 
											
												
													
														|  | -                    this.templateSettings = newTemplateSettings
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    newTemplateSettings.routing.rules = JSON.parse(newValue);
 | 
											
												
													
														|  | 
 |  | +                    this.templateSettings = newTemplateSettings;
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  |              freedomStrategy: {
 |  |              freedomStrategy: {
 | 
											
										
											
												
													
														|  | @@ -715,6 +717,24 @@
 | 
											
												
													
														|  |                      this.syncRulesWithOutbound("direct", this.directSettings);
 |  |                      this.syncRulesWithOutbound("direct", this.directSettings);
 | 
											
												
													
														|  |                  }
 |  |                  }
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  | 
 |  | +            ipv4Domains: {
 | 
											
												
													
														|  | 
 |  | +                get: function () {
 | 
											
												
													
														|  | 
 |  | +                    return this.templateRuleGetter({ outboundTag: "IPv4", property: "domain" });
 | 
											
												
													
														|  | 
 |  | +                },
 | 
											
												
													
														|  | 
 |  | +                set: function (newValue) {
 | 
											
												
													
														|  | 
 |  | +                    this.templateRuleSetter({ outboundTag: "IPv4", property: "domain", data: newValue });
 | 
											
												
													
														|  | 
 |  | +                    this.syncRulesWithOutbound("IPv4", this.ipv4Settings);
 | 
											
												
													
														|  | 
 |  | +                }
 | 
											
												
													
														|  | 
 |  | +            },
 | 
											
												
													
														|  | 
 |  | +            warpDomains: {
 | 
											
												
													
														|  | 
 |  | +                get: function () {
 | 
											
												
													
														|  | 
 |  | +                    return this.templateRuleGetter({ outboundTag: "WARP", property: "domain" });
 | 
											
												
													
														|  | 
 |  | +                },
 | 
											
												
													
														|  | 
 |  | +                set: function (newValue) {
 | 
											
												
													
														|  | 
 |  | +                    this.templateRuleSetter({ outboundTag: "WARP", property: "domain", data: newValue });
 | 
											
												
													
														|  | 
 |  | +                    this.syncRulesWithOutbound("WARP", this.warpSettings);
 | 
											
												
													
														|  | 
 |  | +                }
 | 
											
												
													
														|  | 
 |  | +            },
 | 
											
												
													
														|  |              manualBlockedIPs: {
 |  |              manualBlockedIPs: {
 | 
											
												
													
														|  |                  get: function () { return JSON.stringify(this.blockedIPs, null, 2); },
 |  |                  get: function () { return JSON.stringify(this.blockedIPs, null, 2); },
 | 
											
												
													
														|  |                  set: debounce(function (value) { this.blockedIPs = JSON.parse(value); }, 1000)
 |  |                  set: debounce(function (value) { this.blockedIPs = JSON.parse(value); }, 1000)
 | 
											
										
											
												
													
														|  | @@ -731,6 +751,14 @@
 | 
											
												
													
														|  |                  get: function () { return JSON.stringify(this.directDomains, null, 2); },
 |  |                  get: function () { return JSON.stringify(this.directDomains, null, 2); },
 | 
											
												
													
														|  |                  set: debounce(function (value) { this.directDomains = JSON.parse(value); }, 1000)
 |  |                  set: debounce(function (value) { this.directDomains = JSON.parse(value); }, 1000)
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  | 
 |  | +            manualIPv4Domains: {
 | 
											
												
													
														|  | 
 |  | +                get: function () { return JSON.stringify(this.ipv4Domains, null, 2); },
 | 
											
												
													
														|  | 
 |  | +                set: debounce(function (value) { this.ipv4Domains = JSON.parse(value); }, 1000)
 | 
											
												
													
														|  | 
 |  | +            },
 | 
											
												
													
														|  | 
 |  | +            manualWARPDomains: {
 | 
											
												
													
														|  | 
 |  | +                get: function () { return JSON.stringify(this.warpDomains, null, 2); },
 | 
											
												
													
														|  | 
 |  | +                set: debounce(function (value) { this.warpDomains = JSON.parse(value); }, 1000)
 | 
											
												
													
														|  | 
 |  | +            },
 | 
											
												
													
														|  |              torrentSettings: {
 |  |              torrentSettings: {
 | 
											
												
													
														|  |                  get: function () {
 |  |                  get: function () {
 | 
											
												
													
														|  |                      return doAllItemsExist(this.settingsData.protocols.bittorrent, this.blockedProtocols);
 |  |                      return doAllItemsExist(this.settingsData.protocols.bittorrent, this.blockedProtocols);
 | 
											
										
											
												
													
														|  | @@ -796,40 +824,26 @@
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  |              GoogleIPv4Settings: {
 |  |              GoogleIPv4Settings: {
 | 
											
												
													
														|  |                  get: function () {
 |  |                  get: function () {
 | 
											
												
													
														|  | -                    return doAllItemsExist(this.settingsData.domains.google, this.templateRuleGetter({ outboundTag: "IPv4", property: "domain" }));
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    return doAllItemsExist(this.settingsData.domains.google, this.ipv4Domains);
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |                  set: function (newValue) {
 |  |                  set: function (newValue) {
 | 
											
												
													
														|  | -                    oldData = this.templateRuleGetter({ outboundTag: "IPv4", property: "domain" });
 |  | 
 | 
											
												
													
														|  |                      if (newValue) {
 |  |                      if (newValue) {
 | 
											
												
													
														|  | -                        oldData = [...oldData, ...this.settingsData.domains.google];
 |  | 
 | 
											
												
													
														|  | 
 |  | +                        this.ipv4Domains = [...this.ipv4Domains, ...this.settingsData.domains.google];
 | 
											
												
													
														|  |                      } else {
 |  |                      } else {
 | 
											
												
													
														|  | -                        oldData = oldData.filter(data => !this.settingsData.domains.google.includes(data))
 |  | 
 | 
											
												
													
														|  | 
 |  | +                        this.ipv4Domains = this.ipv4Domains.filter(data => !this.settingsData.domains.google.includes(data));
 | 
											
												
													
														|  |                      }
 |  |                      }
 | 
											
												
													
														|  | -                    this.templateRuleSetter({
 |  | 
 | 
											
												
													
														|  | -                        outboundTag: "IPv4",
 |  | 
 | 
											
												
													
														|  | -                        property: "domain",
 |  | 
 | 
											
												
													
														|  | -                        data: oldData
 |  | 
 | 
											
												
													
														|  | -                    });
 |  | 
 | 
											
												
													
														|  | -                    this.syncRulesWithOutbound("IPv4", this.ipv4Settings);
 |  | 
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  |              NetflixIPv4Settings: {
 |  |              NetflixIPv4Settings: {
 | 
											
												
													
														|  |                  get: function () {
 |  |                  get: function () {
 | 
											
												
													
														|  | -                    return doAllItemsExist(this.settingsData.domains.netflix, this.templateRuleGetter({ outboundTag: "IPv4", property: "domain" }));
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    return doAllItemsExist(this.settingsData.domains.netflix, this.ipv4Domains);
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |                  set: function (newValue) {
 |  |                  set: function (newValue) {
 | 
											
												
													
														|  | -                    oldData = this.templateRuleGetter({ outboundTag: "IPv4", property: "domain" });
 |  | 
 | 
											
												
													
														|  |                      if (newValue) {
 |  |                      if (newValue) {
 | 
											
												
													
														|  | -                        oldData = [...oldData, ...this.settingsData.domains.netflix];
 |  | 
 | 
											
												
													
														|  | 
 |  | +                        this.ipv4Domains = [...this.ipv4Domains, ...this.settingsData.domains.netflix];
 | 
											
												
													
														|  |                      } else {
 |  |                      } else {
 | 
											
												
													
														|  | -                        oldData = oldData.filter(data => !this.settingsData.domains.netflix.includes(data))
 |  | 
 | 
											
												
													
														|  | 
 |  | +                        this.ipv4Domains = this.ipv4Domains.filter(data => !this.settingsData.domains.netflix.includes(data));
 | 
											
												
													
														|  |                      }
 |  |                      }
 | 
											
												
													
														|  | -                    this.templateRuleSetter({
 |  | 
 | 
											
												
													
														|  | -                        outboundTag: "IPv4",
 |  | 
 | 
											
												
													
														|  | -                        property: "domain",
 |  | 
 | 
											
												
													
														|  | -                        data: oldData
 |  | 
 | 
											
												
													
														|  | -                    });
 |  | 
 | 
											
												
													
														|  | -                    this.syncRulesWithOutbound("IPv4", this.ipv4Settings);
 |  | 
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  |              IRIpSettings: {
 |  |              IRIpSettings: {
 | 
											
										
											
												
													
														|  | @@ -978,78 +992,50 @@
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  |              GoogleWARPSettings: {
 |  |              GoogleWARPSettings: {
 | 
											
												
													
														|  |                  get: function () {
 |  |                  get: function () {
 | 
											
												
													
														|  | -                    return doAllItemsExist(this.settingsData.domains.google, this.templateRuleGetter({ outboundTag: "WARP", property: "domain" }));
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    return doAllItemsExist(this.settingsData.domains.google, this.warpDomains);
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |                  set: function (newValue) {
 |  |                  set: function (newValue) {
 | 
											
												
													
														|  | -                    oldData = this.templateRuleGetter({ outboundTag: "WARP", property: "domain" });
 |  | 
 | 
											
												
													
														|  |                      if (newValue) {
 |  |                      if (newValue) {
 | 
											
												
													
														|  | -                        oldData = [...oldData, ...this.settingsData.domains.google];
 |  | 
 | 
											
												
													
														|  | 
 |  | +                        this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.google];
 | 
											
												
													
														|  |                      } else {
 |  |                      } else {
 | 
											
												
													
														|  | -                        oldData = oldData.filter(data => !this.settingsData.domains.google.includes(data))
 |  | 
 | 
											
												
													
														|  | 
 |  | +                        this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.google.includes(data));
 | 
											
												
													
														|  |                      }
 |  |                      }
 | 
											
												
													
														|  | -                    this.templateRuleSetter({
 |  | 
 | 
											
												
													
														|  | -                    outboundTag: "WARP",
 |  | 
 | 
											
												
													
														|  | -                    property: "domain",
 |  | 
 | 
											
												
													
														|  | -                    data: oldData
 |  | 
 | 
											
												
													
														|  | -                    });
 |  | 
 | 
											
												
													
														|  | -                    this.syncRulesWithOutbound("WARP", this.warpSettings);
 |  | 
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  |              OpenAIWARPSettings: {
 |  |              OpenAIWARPSettings: {
 | 
											
												
													
														|  |                  get: function () {
 |  |                  get: function () {
 | 
											
												
													
														|  | -                    return doAllItemsExist(this.settingsData.domains.openai, this.templateRuleGetter({ outboundTag: "WARP", property: "domain" }));
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    return doAllItemsExist(this.settingsData.domains.openai, this.warpDomains);
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |                  set: function (newValue) {
 |  |                  set: function (newValue) {
 | 
											
												
													
														|  | -                    oldData = this.templateRuleGetter({ outboundTag: "WARP", property: "domain" });
 |  | 
 | 
											
												
													
														|  |                      if (newValue) {
 |  |                      if (newValue) {
 | 
											
												
													
														|  | -                        oldData = [...oldData, ...this.settingsData.domains.openai];
 |  | 
 | 
											
												
													
														|  | 
 |  | +                        this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.openai];
 | 
											
												
													
														|  |                      } else {
 |  |                      } else {
 | 
											
												
													
														|  | -                        oldData = oldData.filter(data => !this.settingsData.domains.openai.includes(data))
 |  | 
 | 
											
												
													
														|  | 
 |  | +                        this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.openai.includes(data));
 | 
											
												
													
														|  |                      }
 |  |                      }
 | 
											
												
													
														|  | -                    this.templateRuleSetter({
 |  | 
 | 
											
												
													
														|  | -                    outboundTag: "WARP",
 |  | 
 | 
											
												
													
														|  | -                    property: "domain",
 |  | 
 | 
											
												
													
														|  | -                    data: oldData
 |  | 
 | 
											
												
													
														|  | -                    });
 |  | 
 | 
											
												
													
														|  | -                    this.syncRulesWithOutbound("WARP", this.warpSettings);
 |  | 
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  |              NetflixWARPSettings: {
 |  |              NetflixWARPSettings: {
 | 
											
												
													
														|  |                  get: function () {
 |  |                  get: function () {
 | 
											
												
													
														|  | -                    return doAllItemsExist(this.settingsData.domains.netflix, this.templateRuleGetter({ outboundTag: "WARP", property: "domain" }));
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    return doAllItemsExist(this.settingsData.domains.netflix, this.warpDomains);
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |                  set: function (newValue) {
 |  |                  set: function (newValue) {
 | 
											
												
													
														|  | -                    oldData = this.templateRuleGetter({ outboundTag: "WARP", property: "domain" });
 |  | 
 | 
											
												
													
														|  |                      if (newValue) {
 |  |                      if (newValue) {
 | 
											
												
													
														|  | -                        oldData = [...oldData, ...this.settingsData.domains.netflix];
 |  | 
 | 
											
												
													
														|  | 
 |  | +                        this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.netflix];
 | 
											
												
													
														|  |                      } else {
 |  |                      } else {
 | 
											
												
													
														|  | -                        oldData = oldData.filter(data => !this.settingsData.domains.netflix.includes(data))
 |  | 
 | 
											
												
													
														|  | 
 |  | +                        this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.netflix.includes(data));
 | 
											
												
													
														|  |                      }
 |  |                      }
 | 
											
												
													
														|  | -                    this.templateRuleSetter({
 |  | 
 | 
											
												
													
														|  | -                    outboundTag: "WARP",
 |  | 
 | 
											
												
													
														|  | -                    property: "domain",
 |  | 
 | 
											
												
													
														|  | -                    data: oldData
 |  | 
 | 
											
												
													
														|  | -                    });
 |  | 
 | 
											
												
													
														|  | -                    this.syncRulesWithOutbound("WARP", this.warpSettings);
 |  | 
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  |              SpotifyWARPSettings: {
 |  |              SpotifyWARPSettings: {
 | 
											
												
													
														|  |                  get: function () {
 |  |                  get: function () {
 | 
											
												
													
														|  | -                    return doAllItemsExist(this.settingsData.domains.spotify, this.templateRuleGetter({ outboundTag: "WARP", property: "domain" }));
 |  | 
 | 
											
												
													
														|  | 
 |  | +                    return doAllItemsExist(this.settingsData.domains.spotify, this.warpDomains);
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |                  set: function (newValue) {
 |  |                  set: function (newValue) {
 | 
											
												
													
														|  | -                    oldData = this.templateRuleGetter({ outboundTag: "WARP", property: "domain" });
 |  | 
 | 
											
												
													
														|  |                      if (newValue) {
 |  |                      if (newValue) {
 | 
											
												
													
														|  | -                        oldData = [...oldData, ...this.settingsData.domains.spotify];
 |  | 
 | 
											
												
													
														|  | 
 |  | +                        this.warpDomains = [...this.warpDomains, ...this.settingsData.domains.spotify];
 | 
											
												
													
														|  |                      } else {
 |  |                      } else {
 | 
											
												
													
														|  | -                        oldData = oldData.filter(data => !this.settingsData.domains.spotify.includes(data))
 |  | 
 | 
											
												
													
														|  | 
 |  | +                        this.warpDomains = this.warpDomains.filter(data => !this.settingsData.domains.spotify.includes(data));
 | 
											
												
													
														|  |                      }
 |  |                      }
 | 
											
												
													
														|  | -                    this.templateRuleSetter({
 |  | 
 | 
											
												
													
														|  | -                    outboundTag: "WARP",
 |  | 
 | 
											
												
													
														|  | -                    property: "domain",
 |  | 
 | 
											
												
													
														|  | -                    data: oldData
 |  | 
 | 
											
												
													
														|  | -                    });
 |  | 
 | 
											
												
													
														|  | -                    this.syncRulesWithOutbound("WARP", this.warpSettings);
 |  | 
 | 
											
												
													
														|  |                  },
 |  |                  },
 | 
											
												
													
														|  |              },
 |  |              },
 | 
											
												
													
														|  |          },
 |  |          },
 |