active_attack 0.1.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +50 -0
  4. data/Rakefile +32 -0
  5. data/app/assets/config/active_attack_manifest.js +2 -0
  6. data/app/assets/images/active_attack/logo.png +0 -0
  7. data/app/assets/javascripts/active_attack/application.js +8 -0
  8. data/app/assets/javascripts/active_attack/controllers/campaign_controller.es6 +23 -0
  9. data/app/assets/javascripts/active_attack/controllers/matrix_controller.es6 +23 -0
  10. data/app/assets/javascripts/active_attack/controllers/playbooks_controller.es6 +28 -0
  11. data/app/assets/javascripts/active_attack/initializers/stimulus.coffee +2 -0
  12. data/app/assets/stylesheets/active_attack/application.css +15 -0
  13. data/app/assets/stylesheets/active_attack/data_sources.css +4 -0
  14. data/app/assets/stylesheets/active_attack/detections.css +4 -0
  15. data/app/assets/stylesheets/active_attack/difficulty_for_adversaries.css +4 -0
  16. data/app/assets/stylesheets/active_attack/matrices.css +4 -0
  17. data/app/assets/stylesheets/active_attack/permissions_requireds.css +4 -0
  18. data/app/assets/stylesheets/active_attack/platforms.css +4 -0
  19. data/app/assets/stylesheets/active_attack/playbooks.css +400 -0
  20. data/app/assets/stylesheets/active_attack/tactics.css +4 -0
  21. data/app/assets/stylesheets/active_attack/versions.css +4 -0
  22. data/app/controllers/active_attack/application_controller.rb +5 -0
  23. data/app/controllers/active_attack/matrices_controller.rb +82 -0
  24. data/app/controllers/active_attack/playbooks_controller.rb +89 -0
  25. data/app/controllers/active_attack/tactics_controller.rb +62 -0
  26. data/app/helpers/active_attack/application_helper.rb +4 -0
  27. data/app/helpers/active_attack/playbooks_helper.rb +21 -0
  28. data/app/helpers/active_attack/tactics_helper.rb +4 -0
  29. data/app/jobs/active_attack/application_job.rb +4 -0
  30. data/app/mailers/active_attack/application_mailer.rb +6 -0
  31. data/app/models/active_attack/active_attack.rb +7 -0
  32. data/app/models/active_attack/application_record.rb +5 -0
  33. data/app/models/active_attack/build.rb +6 -0
  34. data/app/models/active_attack/data_source.rb +15 -0
  35. data/app/models/active_attack/detection.rb +14 -0
  36. data/app/models/active_attack/difficulty_for_adversary.rb +10 -0
  37. data/app/models/active_attack/matrix.rb +82 -0
  38. data/app/models/active_attack/permissions_required.rb +14 -0
  39. data/app/models/active_attack/platform.rb +16 -0
  40. data/app/models/active_attack/playbook.rb +177 -0
  41. data/app/models/active_attack/tactic.rb +61 -0
  42. data/app/models/active_attack/version.rb +14 -0
  43. data/app/overrides/models/active_stix/active_stix_override.rb +7 -0
  44. data/app/overrides/models/active_stix/attack_pattern_override.rb +75 -0
  45. data/app/overrides/models/active_stix/bundle_override.rb +18 -0
  46. data/app/overrides/models/active_stix/malware_override.rb +40 -0
  47. data/app/overrides/models/active_stix/report_override.rb +18 -0
  48. data/app/overrides/models/active_stix/tool_override.rb +36 -0
  49. data/app/views/active_attack/matrices/_form.html.erb +27 -0
  50. data/app/views/active_attack/matrices/_stix_attack_matrix.json.jbuilder +2 -0
  51. data/app/views/active_attack/matrices/edit.html.erb +6 -0
  52. data/app/views/active_attack/matrices/index.html.erb +16 -0
  53. data/app/views/active_attack/matrices/index.json.jbuilder +1 -0
  54. data/app/views/active_attack/matrices/new.html.erb +5 -0
  55. data/app/views/active_attack/matrices/show.html.erb +33 -0
  56. data/app/views/active_attack/matrices/show.json.jbuilder +1 -0
  57. data/app/views/active_attack/playbooks/_attack_playbook.json.jbuilder +2 -0
  58. data/app/views/active_attack/playbooks/_form.html.erb +32 -0
  59. data/app/views/active_attack/playbooks/edit.html.erb +6 -0
  60. data/app/views/active_attack/playbooks/index.html.erb +38 -0
  61. data/app/views/active_attack/playbooks/index.json.jbuilder +1 -0
  62. data/app/views/active_attack/playbooks/new.html.erb +5 -0
  63. data/app/views/active_attack/playbooks/show.html.erb +70 -0
  64. data/app/views/active_attack/playbooks/show.json.jbuilder +1 -0
  65. data/app/views/active_attack/tactics/_form.html.erb +42 -0
  66. data/app/views/active_attack/tactics/edit.html.erb +6 -0
  67. data/app/views/active_attack/tactics/index.html.erb +35 -0
  68. data/app/views/active_attack/tactics/new.html.erb +5 -0
  69. data/app/views/active_attack/tactics/show.html.erb +29 -0
  70. data/app/views/layouts/active_attack/application.html.erb +15 -0
  71. data/config/routes.rb +11 -0
  72. data/db/migrate/20191211202017_create_active_attack_data_sources.rb +10 -0
  73. data/db/migrate/20191211202101_create_active_attack_detections.rb +10 -0
  74. data/db/migrate/20191211202127_create_active_attack_difficulty_for_adversaries.rb +10 -0
  75. data/db/migrate/20191211202210_create_active_attack_matrices.rb +10 -0
  76. data/db/migrate/20191211202241_create_active_attack_permissions_requireds.rb +9 -0
  77. data/db/migrate/20191211202303_create_active_attack_platforms.rb +10 -0
  78. data/db/migrate/20191211202358_create_active_attack_playbooks.rb +11 -0
  79. data/db/migrate/20191211202448_create_active_attack_versions.rb +10 -0
  80. data/db/migrate/20191212205423_create_active_attack_tactics.rb +14 -0
  81. data/db/migrate/20200405004308_create_active_attack_builds.rb +10 -0
  82. data/db/migrate/20200405005101_add_buildable_type_to_builds.rb +5 -0
  83. data/db/migrate/20200405040306_add_stix_id_to_active_attack_matrices.rb +5 -0
  84. data/db/migrate/20200405040455_add_attributes_to_active_attack_matrices.rb +6 -0
  85. data/db/migrate/20200405041534_add_matrix_ref_to_active_attack_tactics.rb +5 -0
  86. data/db/migrate/20200405041824_add_created_by_ref_to_active_attack_matrices.rb +5 -0
  87. data/db/migrate/20200410170440_add_threat_actor_to_active_attack_playbooks.rb +5 -0
  88. data/lib/active_attack.rb +6 -0
  89. data/lib/active_attack/engine.rb +25 -0
  90. data/lib/active_attack/version.rb +3 -0
  91. data/lib/enterprise-attack.json +145354 -0
  92. data/lib/tasks/active_attack_tasks.rake +4 -0
  93. metadata +238 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 46fe12fa14d51d865e4a9f3a92f2b154d15da007edaa4cc904b1932d73dd035c
4
+ data.tar.gz: bce4df5c83d87c5a550b2351ab55e9af977a1b29ac8b053502fff82abc29245a
5
+ SHA512:
6
+ metadata.gz: a6eac4ae2ca3600368dcdf78243fc0b9d4c2f3228698d17cc8f40f8af3ad550bfba301f7070093a4fc1f282ed8fcc42d9dce827b507128b60409416297d3c7cd
7
+ data.tar.gz: 7b823866e18e921fcc0aabe02f847b0dd298e6bb947ff3aad7c25595272ae70d10fa11f8ca81308b202c077a1eb6f5c6da2a2e3a0052e95220293fadf8c7bac5
@@ -0,0 +1,20 @@
1
+ Copyright 2019 Adam Dalton
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,50 @@
1
+ # ActiveAttack
2
+ Short description and motivation.
3
+
4
+ ## Usage
5
+ How to use my plugin.
6
+
7
+ ## Installation
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'active_attack'
12
+ ```
13
+
14
+ Add this line to your routes.rb
15
+
16
+ And then execute:
17
+ ```bash
18
+ $ bundle
19
+ ```
20
+
21
+ ```ruby
22
+ mount ActiveAttack::Engine, at: "/attack"
23
+ ```
24
+
25
+ run
26
+
27
+ ```ruby
28
+ $ rails railties:install:migrations
29
+ ```
30
+
31
+ In `application.css`
32
+
33
+ ```ruby
34
+ *= require active_attack/playbooks
35
+ ```
36
+
37
+ ```ruby
38
+ $ rails railties:install:migrations
39
+ ```
40
+
41
+ Or install it yourself as:
42
+ ```bash
43
+ $ gem install active_attack
44
+ ```
45
+
46
+ ## Contributing
47
+ Contribution directions go here.
48
+
49
+ ## License
50
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,32 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'ActiveAttack'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+ load 'rails/tasks/statistics.rake'
21
+
22
+ require 'bundler/gem_tasks'
23
+
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'test'
28
+ t.pattern = 'test/**/*_test.rb'
29
+ t.verbose = false
30
+ end
31
+
32
+ task default: :test
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts/active_attack .js
2
+ //= link_directory ../stylesheets/active_attack .css
@@ -0,0 +1,8 @@
1
+ // Playbooks Javascript
2
+ //
3
+ //= require jquery
4
+ //= require bootstrap
5
+ //= require_tree ./initializers
6
+ //= require_tree ./controllers
7
+
8
+
@@ -0,0 +1,23 @@
1
+ stimulus.register("campaign", class extends Stimulus.Controller {
2
+ // https://discourse.stimulusjs.org/t/syntax-error-when-using-targets/23/5
3
+ // static targets = [ "name", "output" ]
4
+
5
+
6
+ static get targets() {
7
+ return ["description", "campaign"]
8
+ }
9
+
10
+ view() {
11
+ event.preventDefault()
12
+ this.descriptionTargets.forEach((el, i) => {
13
+ console.log('selected field => name')
14
+
15
+ if (el.id == "campaign-" + event.currentTarget.getAttribute("index")) {
16
+ el.classList.remove("filter--notUsed")
17
+ } else {
18
+ el.classList.add("filter--notUsed")
19
+ }
20
+ })
21
+ }
22
+
23
+ })
@@ -0,0 +1,23 @@
1
+ stimulus.register("matrix", class extends Stimulus.Controller {
2
+ // https://discourse.stimulusjs.org/t/syntax-error-when-using-targets/23/5
3
+ // static targets = [ "name", "output" ]
4
+
5
+
6
+ static get targets() {
7
+ return ["attackPattern", "row"]
8
+ }
9
+
10
+ playbook() {
11
+ this.attackPatternTargets.forEach((el, i) => {
12
+ if(!el.classList.contains("used")){
13
+ el.classList.toggle("filter--notUsed")
14
+ }
15
+ })
16
+
17
+ this.rowTargets.forEach((el, i) => {
18
+ if (el.querySelectorAll("div span.notused").length == el.children.length) {
19
+ el.classList.toggle("filter--notUsed")
20
+ }
21
+ })
22
+ }
23
+ })
@@ -0,0 +1,28 @@
1
+ stimulus.register("playbooks", class extends Stimulus.Controller {
2
+ // https://discourse.stimulusjs.org/t/syntax-error-when-using-targets/23/5
3
+ // static targets = [ "name", "output" ]
4
+
5
+
6
+ static get targets() {
7
+ return [ "attackPattern", "campaign", "row" ]
8
+ }
9
+
10
+ updateMatrix() {
11
+ let campaign = event.currentTarget.id
12
+
13
+ this.rowTargets.forEach((el, i) => {
14
+ el.classList.remove("filter--notUsed")
15
+ })
16
+
17
+ this.attackPatternTargets.forEach((el, i) => {
18
+ el.classList.remove("filter--notUsed")
19
+ if(el.classList.contains(campaign)){
20
+ el.classList.add("used")
21
+ el.classList.remove("notused")
22
+ } else {
23
+ el.classList.add("notused")
24
+ el.classList.remove("used")
25
+ }
26
+ })
27
+ }
28
+ })
@@ -0,0 +1,2 @@
1
+ # initializers/stimulus.coffee
2
+ window.stimulus = Stimulus.Application.start() unless 'stimulus' of window
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,400 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
5
+
6
+ .filter--notUsed {
7
+ display: none;
8
+ }
9
+
10
+ body {
11
+ background-color: #14181c;
12
+ font-family: 'Rajdhani', sans-serif;
13
+ font-size: 16px;
14
+ margin-left: 0;
15
+ margin-top: 0;
16
+ margin-bottom: 0;
17
+ overflow-y: scroll;
18
+ }
19
+
20
+ sup {
21
+ font-size: 8px;
22
+
23
+ }
24
+
25
+ th, td {
26
+ text-align: left;
27
+ border-bottom: 1px solid #2b323b;
28
+ padding: 10px;
29
+ }
30
+
31
+ .indicators {
32
+ font-size: 16px;
33
+ font-family: 'Inconsolata', monospace;
34
+ }
35
+
36
+ .used {
37
+ color: #F70000;
38
+ }
39
+
40
+ table {
41
+ width: 100%;
42
+ }
43
+
44
+ .info {
45
+ display: grid;
46
+ background-color: #ef9124;
47
+ color: #fff;
48
+ grid-template-columns: repeat(4, 1fr);
49
+ grid-template-rows: 40px;
50
+ grid-template-areas: "left middle middle2 right";
51
+ justify-items: center;
52
+ align-items: center;
53
+ border-radius: 5px;
54
+
55
+ }
56
+
57
+ .left span, .right span, .middle span, .middle2 span {
58
+ font-family: 'Jura', sans-serif;
59
+ font-weight: 600;
60
+ }
61
+
62
+ .description {
63
+ grid-area: description;
64
+ background-color: #2b323b;
65
+ margin-top: 10px;
66
+ font-size: 100%;
67
+ padding: 20px;
68
+ border-radius: 5px;
69
+ overflow-y: scroll;
70
+ -webkit-overflow-scrolling: touch;
71
+
72
+ }
73
+
74
+ .timeline {
75
+ grid-area: timeline;
76
+ background-color: #2b323b;
77
+ margin-top: 10px;
78
+ padding: 20px;
79
+ border-radius: 5px;
80
+
81
+ }
82
+
83
+ .sidebar {
84
+ grid-area: sidebar;
85
+ grid-template-columns: auto;
86
+ background-color: #2b323b;
87
+ padding-left: 20px;
88
+ padding-right: 20px;
89
+ padding-top: 20px;
90
+ min-height: calc(100vh - 90px);
91
+
92
+ }
93
+
94
+ .sidebar span {
95
+ color: #95989a;
96
+ font-size: 16px;
97
+ /*padding-left: 12px;*/
98
+ padding-right: 12px;
99
+ }
100
+
101
+ .sidebar .btn {
102
+ padding: 0 5px;
103
+ /*text-align: center;*/
104
+ text-align: left;
105
+ }
106
+
107
+ .header {
108
+ grid-area: header;
109
+ background-color: #2b323b;
110
+ max-width: 100%;
111
+ font-size: 30px;
112
+ color: #95989a;
113
+ border-radius: 0px 0px 5px 5px;
114
+ padding-left: 10px;
115
+ padding-top: 8px;
116
+ }
117
+
118
+ .sidebar img {
119
+ width: 100%;
120
+ padding-bottom: 20px;
121
+ }
122
+
123
+ .header span {
124
+ font-size: 42px;
125
+ font-family: 'Jura', sans-serif;
126
+ }
127
+
128
+ .wrapper {
129
+ display: grid;
130
+ /*grid-template-columns: 200px 1fr;*/
131
+ grid-template-columns: min-content;
132
+ grid-template-areas: "sidebar header" "sidebar inside" "sidebar info" "sidebar bottomheader" "sidebar phasescontainer" "footer ...";
133
+ color: #fff;
134
+ grid-template-rows: 70px 350px 40px 50px 1fr 70px;
135
+ grid-column-gap: 10px;
136
+
137
+ }
138
+
139
+ .inside {
140
+ display: grid;
141
+ grid-template-columns: 65% auto;
142
+ grid-template-rows: 1fr;
143
+ grid-template-areas: "description timeline";
144
+ grid-gap: 10px;
145
+ margin-bottom: 10px;
146
+ }
147
+
148
+ .bottomheader {
149
+ display: grid;
150
+ grid-template-columns: repeat(7, 1fr);
151
+ grid-template-rows: 50px;
152
+ grid-template-areas: "recon weaponization delivery exploit install command objective";
153
+ grid-gap: 10px;
154
+ margin-bottom: 10px;
155
+ }
156
+
157
+ .recon, .delivery, .exploit, .install, .command, .objective, .weaponization {
158
+ color: #95989a;
159
+ padding: 20px 10px 10px;
160
+ font-family: 'Jura', sans-serif;
161
+ }
162
+
163
+ .phasescontainer {
164
+ display: grid;
165
+ grid-template-columns: repeat(7, 1fr);
166
+ grid-auto-rows: 125px;
167
+ grid-gap: 12px;
168
+ margin-top: 10px;
169
+ }
170
+
171
+ .phases {
172
+ background-color: #2b323b;
173
+ padding: 10px;
174
+ border-radius: 5px;
175
+ overflow: hidden;
176
+ position: relative;
177
+ }
178
+
179
+ .phases div {
180
+ min-width: 0.75rem;
181
+ min-height: 0.75rem;
182
+ padding: .5rem;
183
+ line-height: 0.75rem;
184
+ text-align: center;
185
+ border-radius: 500rem;
186
+ background-color: #ef9124;
187
+ border-color: white;
188
+ position: absolute;
189
+ bottom: 10px;
190
+ right: 10px;
191
+ }
192
+
193
+ .indicator-list {
194
+ display: none;
195
+ /*position: fixed;*/
196
+ z-index: 1;
197
+ /*left: 0;*/
198
+ /*top: 0;*/
199
+ width: 50%;
200
+ height: 800px;
201
+ overflow: auto;
202
+ background-color: #14181c;
203
+ /*background-color: rgba(0, 0, 0, 0.4);*/
204
+ margin: 15% auto;
205
+ padding: 20px;
206
+ color: white;
207
+ border-radius: 5px;
208
+ border: 1px solid #EF9124;
209
+
210
+ left: 50% !important;
211
+ top: 50% !important;
212
+ margin-top: 0;
213
+ position: absolute;
214
+ transform: translate(-50%, -50%) !important;
215
+ }
216
+
217
+ .indicator-list-inner {
218
+ list-style: none;
219
+ margin: 0;
220
+ padding: 0;
221
+ }
222
+
223
+ .indicator-list-entry {
224
+ margin: 0;
225
+ padding: 0;
226
+ }
227
+
228
+ .phases:hover {
229
+ background: #ef9124;
230
+ }
231
+
232
+ .phasesblank {
233
+ background-color: #14181c;
234
+ }
235
+
236
+ .box {
237
+ color: #fff;
238
+ font-size: 100%;
239
+ }
240
+
241
+ .footer {
242
+ grid-area: footer;
243
+ color: #95989a;
244
+ padding-left: 10px;
245
+ padding-top: 30px;
246
+ font-size: 10px;
247
+ background-color: #2b323b;
248
+
249
+ }
250
+
251
+ .btn {
252
+ color: #ffffff;
253
+ font-size: 24px;
254
+ background: #2b323b;
255
+ height: 40px;
256
+ width: 100%;
257
+ text-decoration: none;
258
+ vertical-align: middle;
259
+ line-height: 40px;
260
+ font-family: 'Jura', sans-serif;
261
+ display: inline-block;
262
+ border-radius: 5px;
263
+ padding-left: 10px;
264
+ /*padding-right: 10px;*/
265
+ margin-bottom: 4px;
266
+ }
267
+
268
+ .btn-report {
269
+ font-size: 16px;
270
+ margin-bottom: 6px;
271
+ }
272
+
273
+ .btn:hover {
274
+ color: #000000;
275
+ background: #ef9124;
276
+ text-decoration: none;
277
+ }
278
+
279
+ .activebtn:hover {
280
+ color: #ffffff;
281
+ }
282
+
283
+ .activebtn {
284
+ color: #ffffff;
285
+ background: #ef9124;
286
+ text-decoration: none;
287
+ }
288
+
289
+ a:link {
290
+ color: #95989a;
291
+ text-decoration: none;
292
+ }
293
+
294
+ /* visited link */
295
+ a:visited {
296
+ color: #95989a;
297
+ text-decoration: none;
298
+ }
299
+
300
+ /* mouse over link */
301
+ a:hover {
302
+ color: white;
303
+ text-decoration: none;
304
+ }
305
+
306
+ a:active {
307
+ color: white;
308
+ text-decoration: none;
309
+ }
310
+
311
+ .modal {
312
+ display: none;
313
+ position: fixed;
314
+ z-index: 1;
315
+ left: 0;
316
+ top: 0;
317
+ width: 100%;
318
+ height: 100%;
319
+ overflow: auto;
320
+ background-color: black;
321
+ background-color: rgba(0, 0, 0, 0.4);
322
+ }
323
+
324
+ .modal-content {
325
+ background-color: #14181c;
326
+ margin: 15% auto;
327
+ padding: 20px;
328
+ color: white;
329
+ width: 80%;
330
+ border-radius: 5px;
331
+ border: 1px solid #EF9124;
332
+ }
333
+
334
+ .close {
335
+ color: #aaa;
336
+ float: right;
337
+ font-size: 28px;
338
+ font-weight: bold;
339
+ }
340
+
341
+ .close:hover,
342
+ .close:focus {
343
+ color: black;
344
+ text-decoration: none;
345
+ cursor: pointer;
346
+ }
347
+
348
+
349
+ /*Demo*/
350
+ .popover.tour {
351
+ width: 350px;
352
+ background-color: #FFFFFF;
353
+ align-items: center;
354
+ /*border-width: 2px;*/
355
+ /*border-color:#EF9124;*/
356
+ }
357
+
358
+ .popover-title {
359
+ text-align: center;
360
+ margin-left: 14px;
361
+ margin-right: 14px;
362
+ max-width: 350px;
363
+ color: #EF9124;
364
+ }
365
+
366
+ .popover-content {
367
+ text-align: center;
368
+ margin-left: 14px;
369
+ margin-right: 14px;
370
+ max-width: 350px;
371
+ color: #000000;
372
+ }
373
+
374
+ .popover-btn-tour-control {
375
+ height: 40px;
376
+ width: 80px;
377
+ align-items: center;
378
+ }
379
+
380
+ .btn-tour-control:hover {
381
+ background: #ef9124;
382
+ text-decoration: none;
383
+ }
384
+
385
+ .popover.bs-popover-right .arrow::after, .popover.bs-popover-auto[x-placement^="right"] .arrow::after {
386
+ border-right-color: #FFFFFF;
387
+ }
388
+
389
+ .popover.bs-popover-left .arrow::after, .popover.bs-popover-auto[x-placement^="left"] .arrow::after {
390
+ border-left-color: #FFFFFF;
391
+
392
+ }
393
+
394
+ .popover[class*="tour-"].orphan {
395
+ left: 50% !important;
396
+ top: 50% !important;
397
+ margin-top: 0;
398
+ position: absolute;
399
+ transform: translate(-50%, -50%) !important;
400
+ }