diff --git a/.gitignore b/.gitignore index d0a0ebb9..d9051de6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ bower_components node_modules -dist doc .sass-cache .coverage-results diff --git a/dist/css/query-builder.dark.css b/dist/css/query-builder.dark.css new file mode 100644 index 00000000..28d8efab --- /dev/null +++ b/dist/css/query-builder.dark.css @@ -0,0 +1,173 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Copyright 2014-2022 Damien "Mistic" Sorel (http://www.strangeplanet.fr) + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ +.query-builder .rules-group-container, .query-builder .rule-container, .query-builder .rule-placeholder { + position: relative; + margin: 4px 0; + border-radius: 5px; + padding: 5px; + border: 1px solid #111; + background: rgba(40, 40, 40, 0.9); +} + +.query-builder .rule-container .rule-filter-container, +.query-builder .rule-container .rule-operator-container, +.query-builder .rule-container .rule-value-container, .query-builder .error-container, .query-builder .drag-handle { + display: inline-block; + margin: 0 5px 0 0; + vertical-align: middle; +} + +.query-builder .rules-group-container { + padding: 10px; + padding-bottom: 6px; + border: 1px solid #00164A; + background: rgba(50, 70, 80, 0.5); +} + +.query-builder .rules-group-header { + margin-bottom: 10px; +} + +.query-builder .rules-group-header .group-conditions .btn.readonly:not(.active), +.query-builder .rules-group-header .group-conditions input[name$='_cond'] { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + white-space: nowrap; +} + +.query-builder .rules-group-header .group-conditions .btn.readonly { + border-radius: 3px; +} + +.query-builder .rules-list { + list-style: none; + padding: 0 0 0 15px; + margin: 0; +} + +.query-builder .rule-value-container { + border-left: 1px solid #DDD; + padding-left: 5px; +} + +.query-builder .rule-value-container label { + margin-bottom: 0; + font-weight: normal; +} + +.query-builder .rule-value-container label.block { + display: block; +} + +.query-builder .rule-value-container select, +.query-builder .rule-value-container input[type='text'], +.query-builder .rule-value-container input[type='number'] { + padding: 1px; +} + +.query-builder .error-container { + display: none; + cursor: help; + color: #F00; +} + +.query-builder .has-error { + background-color: #322; + border-color: #800; +} + +.query-builder .has-error .error-container { + display: inline-block !important; +} + +.query-builder .rules-list > *::before, .query-builder .rules-list > *::after { + content: ''; + position: absolute; + left: -10px; + width: 10px; + height: calc(50% + 4px); + border-color: #222; + border-style: solid; +} + +.query-builder .rules-list > *::before { + top: -4px; + border-width: 0 0 2px 2px; +} + +.query-builder .rules-list > *::after { + top: 50%; + border-width: 0 0 0 2px; +} + +.query-builder .rules-list > *:first-child::before { + top: -12px; + height: calc(50% + 14px); +} + +.query-builder .rules-list > *:last-child::before { + border-radius: 0 0 0 4px; +} + +.query-builder .rules-list > *:last-child::after { + display: none; +} + +.query-builder.bt-checkbox-glyphicons .checkbox input[type='checkbox']:checked + label::after { + font-family: 'Glyphicons Halflings'; + content: '\e013'; +} + +.query-builder.bt-checkbox-glyphicons .checkbox label::after { + padding-left: 4px; + padding-top: 2px; + font-size: 9px; +} + +.query-builder .error-container + .tooltip .tooltip-inner { + color: #F22 !important; +} + +.query-builder p.filter-description { + margin: 5px 0 0 0; + background: rgba(0, 170, 255, 0.2); + border: 1px solid #346F7B; + color: #AAD1E4; + border-radius: 5px; + padding: 2.5px 5px; + font-size: .8em; +} + +.query-builder .rules-group-header [data-invert] { + margin-left: 5px; +} + +.query-builder .drag-handle { + cursor: move; + vertical-align: middle; + margin-left: 5px; +} + +.query-builder .dragging { + position: fixed; + opacity: .5; + z-index: 100; +} + +.query-builder .dragging::before, .query-builder .dragging::after { + display: none; +} + +.query-builder .rule-placeholder { + border: 1px dashed #BBB; + opacity: .7; +} diff --git a/dist/css/query-builder.dark.min.css b/dist/css/query-builder.dark.min.css new file mode 100644 index 00000000..25ac42ef --- /dev/null +++ b/dist/css/query-builder.dark.min.css @@ -0,0 +1,6 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Copyright 2014-2022 Damien "Mistic" Sorel (http://www.strangeplanet.fr) + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ +.query-builder .rule-container,.query-builder .rule-placeholder,.query-builder .rules-group-container{position:relative;margin:4px 0;border-radius:5px;padding:5px;border:1px solid #111;background:rgba(40,40,40,.9)}.query-builder .drag-handle,.query-builder .error-container,.query-builder .rule-container .rule-filter-container,.query-builder .rule-container .rule-operator-container,.query-builder .rule-container .rule-value-container{display:inline-block;margin:0 5px 0 0;vertical-align:middle}.query-builder .rules-group-container{padding:10px;padding-bottom:6px;border:1px solid #00164a;background:rgba(50,70,80,.5)}.query-builder .rules-group-header{margin-bottom:10px}.query-builder .rules-group-header .group-conditions .btn.readonly:not(.active),.query-builder .rules-group-header .group-conditions input[name$='_cond']{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.query-builder .rules-group-header .group-conditions .btn.readonly{border-radius:3px}.query-builder .rules-list{list-style:none;padding:0 0 0 15px;margin:0}.query-builder .rule-value-container{border-left:1px solid #ddd;padding-left:5px}.query-builder .rule-value-container label{margin-bottom:0;font-weight:400}.query-builder .rule-value-container label.block{display:block}.query-builder .rule-value-container input[type=number],.query-builder .rule-value-container input[type=text],.query-builder .rule-value-container select{padding:1px}.query-builder .error-container{display:none;cursor:help;color:red}.query-builder .has-error{background-color:#322;border-color:#800}.query-builder .has-error .error-container{display:inline-block!important}.query-builder .rules-list>::after,.query-builder .rules-list>::before{content:'';position:absolute;left:-10px;width:10px;height:calc(50% + 4px);border-color:#222;border-style:solid}.query-builder .rules-list>::before{top:-4px;border-width:0 0 2px 2px}.query-builder .rules-list>::after{top:50%;border-width:0 0 0 2px}.query-builder .rules-list>:first-child::before{top:-12px;height:calc(50% + 14px)}.query-builder .rules-list>:last-child::before{border-radius:0 0 0 4px}.query-builder .rules-list>:last-child::after{display:none}.query-builder.bt-checkbox-glyphicons .checkbox input[type=checkbox]:checked+label::after{font-family:'Glyphicons Halflings';content:'\e013'}.query-builder.bt-checkbox-glyphicons .checkbox label::after{padding-left:4px;padding-top:2px;font-size:9px}.query-builder .error-container+.tooltip .tooltip-inner{color:#f22!important}.query-builder p.filter-description{margin:5px 0 0 0;background:rgba(0,170,255,.2);border:1px solid #346f7b;color:#aad1e4;border-radius:5px;padding:2.5px 5px;font-size:.8em}.query-builder .rules-group-header [data-invert]{margin-left:5px}.query-builder .drag-handle{cursor:move;vertical-align:middle;margin-left:5px}.query-builder .dragging{position:fixed;opacity:.5;z-index:100}.query-builder .dragging::after,.query-builder .dragging::before{display:none}.query-builder .rule-placeholder{border:1px dashed #bbb;opacity:.7} \ No newline at end of file diff --git a/dist/css/query-builder.default.css b/dist/css/query-builder.default.css new file mode 100644 index 00000000..bd2dbc2b --- /dev/null +++ b/dist/css/query-builder.default.css @@ -0,0 +1,173 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Copyright 2014-2022 Damien "Mistic" Sorel (http://www.strangeplanet.fr) + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ +.query-builder .rules-group-container, .query-builder .rule-container, .query-builder .rule-placeholder { + position: relative; + margin: 4px 0; + border-radius: 5px; + padding: 5px; + border: 1px solid #EEE; + background: rgba(255, 255, 255, 0.9); +} + +.query-builder .rule-container .rule-filter-container, +.query-builder .rule-container .rule-operator-container, +.query-builder .rule-container .rule-value-container, .query-builder .error-container, .query-builder .drag-handle { + display: inline-block; + margin: 0 5px 0 0; + vertical-align: middle; +} + +.query-builder .rules-group-container { + padding: 10px; + padding-bottom: 6px; + border: 1px solid #DCC896; + background: rgba(250, 240, 210, 0.5); +} + +.query-builder .rules-group-header { + margin-bottom: 10px; +} + +.query-builder .rules-group-header .group-conditions .btn.readonly:not(.active), +.query-builder .rules-group-header .group-conditions input[name$='_cond'] { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + white-space: nowrap; +} + +.query-builder .rules-group-header .group-conditions .btn.readonly { + border-radius: 3px; +} + +.query-builder .rules-list { + list-style: none; + padding: 0 0 0 15px; + margin: 0; +} + +.query-builder .rule-value-container { + border-left: 1px solid #DDD; + padding-left: 5px; +} + +.query-builder .rule-value-container label { + margin-bottom: 0; + font-weight: normal; +} + +.query-builder .rule-value-container label.block { + display: block; +} + +.query-builder .rule-value-container select, +.query-builder .rule-value-container input[type='text'], +.query-builder .rule-value-container input[type='number'] { + padding: 1px; +} + +.query-builder .error-container { + display: none; + cursor: help; + color: #F00; +} + +.query-builder .has-error { + background-color: #FDD; + border-color: #F99; +} + +.query-builder .has-error .error-container { + display: inline-block !important; +} + +.query-builder .rules-list > *::before, .query-builder .rules-list > *::after { + content: ''; + position: absolute; + left: -10px; + width: 10px; + height: calc(50% + 4px); + border-color: #CCC; + border-style: solid; +} + +.query-builder .rules-list > *::before { + top: -4px; + border-width: 0 0 2px 2px; +} + +.query-builder .rules-list > *::after { + top: 50%; + border-width: 0 0 0 2px; +} + +.query-builder .rules-list > *:first-child::before { + top: -12px; + height: calc(50% + 14px); +} + +.query-builder .rules-list > *:last-child::before { + border-radius: 0 0 0 4px; +} + +.query-builder .rules-list > *:last-child::after { + display: none; +} + +.query-builder.bt-checkbox-glyphicons .checkbox input[type='checkbox']:checked + label::after { + font-family: 'Glyphicons Halflings'; + content: '\e013'; +} + +.query-builder.bt-checkbox-glyphicons .checkbox label::after { + padding-left: 4px; + padding-top: 2px; + font-size: 9px; +} + +.query-builder .error-container + .tooltip .tooltip-inner { + color: #F99 !important; +} + +.query-builder p.filter-description { + margin: 5px 0 0 0; + background: #D9EDF7; + border: 1px solid #BCE8F1; + color: #31708F; + border-radius: 5px; + padding: 2.5px 5px; + font-size: .8em; +} + +.query-builder .rules-group-header [data-invert] { + margin-left: 5px; +} + +.query-builder .drag-handle { + cursor: move; + vertical-align: middle; + margin-left: 5px; +} + +.query-builder .dragging { + position: fixed; + opacity: .5; + z-index: 100; +} + +.query-builder .dragging::before, .query-builder .dragging::after { + display: none; +} + +.query-builder .rule-placeholder { + border: 1px dashed #BBB; + opacity: .7; +} diff --git a/dist/css/query-builder.default.min.css b/dist/css/query-builder.default.min.css new file mode 100644 index 00000000..978192c0 --- /dev/null +++ b/dist/css/query-builder.default.min.css @@ -0,0 +1,6 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Copyright 2014-2022 Damien "Mistic" Sorel (http://www.strangeplanet.fr) + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ +.query-builder .rule-container,.query-builder .rule-placeholder,.query-builder .rules-group-container{position:relative;margin:4px 0;border-radius:5px;padding:5px;border:1px solid #eee;background:rgba(255,255,255,.9)}.query-builder .drag-handle,.query-builder .error-container,.query-builder .rule-container .rule-filter-container,.query-builder .rule-container .rule-operator-container,.query-builder .rule-container .rule-value-container{display:inline-block;margin:0 5px 0 0;vertical-align:middle}.query-builder .rules-group-container{padding:10px;padding-bottom:6px;border:1px solid #dcc896;background:rgba(250,240,210,.5)}.query-builder .rules-group-header{margin-bottom:10px}.query-builder .rules-group-header .group-conditions .btn.readonly:not(.active),.query-builder .rules-group-header .group-conditions input[name$='_cond']{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.query-builder .rules-group-header .group-conditions .btn.readonly{border-radius:3px}.query-builder .rules-list{list-style:none;padding:0 0 0 15px;margin:0}.query-builder .rule-value-container{border-left:1px solid #ddd;padding-left:5px}.query-builder .rule-value-container label{margin-bottom:0;font-weight:400}.query-builder .rule-value-container label.block{display:block}.query-builder .rule-value-container input[type=number],.query-builder .rule-value-container input[type=text],.query-builder .rule-value-container select{padding:1px}.query-builder .error-container{display:none;cursor:help;color:red}.query-builder .has-error{background-color:#fdd;border-color:#f99}.query-builder .has-error .error-container{display:inline-block!important}.query-builder .rules-list>::after,.query-builder .rules-list>::before{content:'';position:absolute;left:-10px;width:10px;height:calc(50% + 4px);border-color:#ccc;border-style:solid}.query-builder .rules-list>::before{top:-4px;border-width:0 0 2px 2px}.query-builder .rules-list>::after{top:50%;border-width:0 0 0 2px}.query-builder .rules-list>:first-child::before{top:-12px;height:calc(50% + 14px)}.query-builder .rules-list>:last-child::before{border-radius:0 0 0 4px}.query-builder .rules-list>:last-child::after{display:none}.query-builder.bt-checkbox-glyphicons .checkbox input[type=checkbox]:checked+label::after{font-family:'Glyphicons Halflings';content:'\e013'}.query-builder.bt-checkbox-glyphicons .checkbox label::after{padding-left:4px;padding-top:2px;font-size:9px}.query-builder .error-container+.tooltip .tooltip-inner{color:#f99!important}.query-builder p.filter-description{margin:5px 0 0 0;background:#d9edf7;border:1px solid #bce8f1;color:#31708f;border-radius:5px;padding:2.5px 5px;font-size:.8em}.query-builder .rules-group-header [data-invert]{margin-left:5px}.query-builder .drag-handle{cursor:move;vertical-align:middle;margin-left:5px}.query-builder .dragging{position:fixed;opacity:.5;z-index:100}.query-builder .dragging::after,.query-builder .dragging::before{display:none}.query-builder .rule-placeholder{border:1px dashed #bbb;opacity:.7} \ No newline at end of file diff --git a/dist/i18n/query-builder.ar.js b/dist/i18n/query-builder.ar.js new file mode 100644 index 00000000..5f9b9df5 --- /dev/null +++ b/dist/i18n/query-builder.ar.js @@ -0,0 +1,80 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Arabic (ar) + * Author: Mohamed YOUNES, https://github.com/MedYOUNES + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['ar'] = { + "__locale": "Arabic (ar)", + "__author": "Mohamed YOUNES, https://github.com/MedYOUNES", + "add_rule": "إضافة حُكم", + "add_group": "إضافة زُمْرَة", + "delete_rule": "حذف", + "delete_group": "حذف", + "conditions": { + "AND": "و", + "OR": "أو" + }, + "operators": { + "equal": "يساوي", + "not_equal": "غير مساوٍ", + "in": "في", + "not_in": "ليس في", + "less": "أقل من", + "less_or_equal": "أصغر أو مساو", + "greater": "أكبر", + "greater_or_equal": "أكبر أو مساو", + "between": "محصور بين", + "not_between": "غير محصور بين", + "begins_with": "يبدأ بـ", + "not_begins_with": "لا يبدأ بـ", + "contains": "يحتوي على", + "not_contains": "لا يحتوي على", + "ends_with": "ينتهي بـ", + "not_ends_with": "لا ينتهي بـ", + "is_empty": "فارغ", + "is_not_empty": "غير فارغ", + "is_null": "صفر", + "is_not_null": "ليس صفرا" + }, + "errors": { + "no_filter": "لم تحدد أي مرشح", + "empty_group": "الزمرة فارغة", + "radio_empty": "لم تحدد أي قيمة", + "checkbox_empty": "لم تحدد أي قيمة", + "select_empty": "لم تحدد أي قيمة", + "string_empty": "النص فارغ", + "string_exceed_min_length": "النص دون الأدنى المسموح به", + "string_exceed_max_length": "النص فوق الأقصى المسموح به", + "string_invalid_format": "تركيبة غير صحيحة", + "number_nan": "ليس عددا", + "number_not_integer": "ليس عددا صحيحا", + "number_not_double": "ليس عددا كسريا", + "number_exceed_min": "العدد أصغر من الأدنى المسموح به", + "number_exceed_max": "العدد أكبر من الأقصى المسموح به", + "number_wrong_step": "أخطأت في حساب مضاعفات العدد", + "datetime_empty": "لم تحدد التاريخ", + "datetime_invalid": "صيغة التاريخ غير صحيحة", + "datetime_exceed_min": "التاريخ دون الأدنى المسموح به", + "datetime_exceed_max": "التاريخ أكبر من الأقصى المسموح به", + "boolean_not_valid": "ليست قيمة منطقية ثنائية", + "operator_not_multiple": "العامل ليس متعدد القيَم" + }, + "invert": "قَلْبُ" +}; + +QueryBuilder.defaults({ lang_code: 'ar' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.az.js b/dist/i18n/query-builder.az.js new file mode 100644 index 00000000..a2ef7417 --- /dev/null +++ b/dist/i18n/query-builder.az.js @@ -0,0 +1,79 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Azerbaijan (az) + * Author: Megaplan, mborisv + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['az'] = { + "__locale": "Azerbaijan (az)", + "__author": "Megaplan, mborisv ", + "add_rule": "Əlavə etmək", + "add_group": "Qrup əlavə etmək", + "delete_rule": "Silmək", + "delete_group": "Silmək", + "conditions": { + "AND": "VƏ", + "OR": "VƏ YA" + }, + "operators": { + "equal": "bərabərdir", + "not_equal": "bərabər deyil", + "in": "qeyd edilmişlərdən", + "not_in": "qeyd olunmamışlardan", + "less": "daha az", + "less_or_equal": "daha az və ya bərabər", + "greater": "daha çox", + "greater_or_equal": "daha çox və ya bərabər", + "between": "arasında", + "begins_with": "başlayır", + "not_begins_with": "başlamır", + "contains": "ibarətdir", + "not_contains": "yoxdur", + "ends_with": "başa çatır", + "not_ends_with": "başa çatmır", + "is_empty": "boş sətir", + "is_not_empty": "boş olmayan sətir", + "is_null": "boşdur", + "is_not_null": "boş deyil" + }, + "errors": { + "no_filter": "Filterlər seçilməyib", + "empty_group": "Qrup boşdur", + "radio_empty": "Məna seçilməyib", + "checkbox_empty": "Məna seçilməyib", + "select_empty": "Məna seçilməyib", + "string_empty": "Doldurulmayıb", + "string_exceed_min_length": "{0} daha çox simvol olmalıdır", + "string_exceed_max_length": "{0} daha az simvol olmalıdır", + "string_invalid_format": "Yanlış format ({0})", + "number_nan": "Rəqəm deyil", + "number_not_integer": "Rəqəm deyil", + "number_not_double": "Rəqəm deyil", + "number_exceed_min": "{0} daha çox olmalıdır", + "number_exceed_max": "{0} daha az olmalıdır", + "number_wrong_step": "{0} bölünən olmalıdır", + "datetime_empty": "Doldurulmayıb", + "datetime_invalid": "Yanlış tarix formatı ({0})", + "datetime_exceed_min": "{0} sonra olmalıdır", + "datetime_exceed_max": "{0} əvvəl olmalıdır", + "boolean_not_valid": "Loqik olmayan", + "operator_not_multiple": "\"{1}\" operatoru çoxlu məna daşımır" + }, + "invert": "invert" +}; + +QueryBuilder.defaults({ lang_code: 'az' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.bg.js b/dist/i18n/query-builder.bg.js new file mode 100644 index 00000000..4be820a3 --- /dev/null +++ b/dist/i18n/query-builder.bg.js @@ -0,0 +1,79 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Bulgarian (bg) + * Author: Valentin Hristov + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['bg'] = { + "__locale": "Bulgarian (bg)", + "__author": "Valentin Hristov", + "add_rule": "Добави правило", + "add_group": "Добави група", + "delete_rule": "Изтрий", + "delete_group": "Изтрий", + "conditions": { + "AND": "И", + "OR": "ИЛИ" + }, + "operators": { + "equal": "равно", + "not_equal": "различно", + "in": "в", + "not_in": "не е в", + "less": "по-малко", + "less_or_equal": "по-малко или равно", + "greater": "по-голям", + "greater_or_equal": "по-голям или равно", + "between": "между", + "not_between": "не е между", + "begins_with": "започва с", + "not_begins_with": "не започва с", + "contains": "съдържа", + "not_contains": "не съдържа", + "ends_with": "завършва с", + "not_ends_with": "не завършва с", + "is_empty": "е празно", + "is_not_empty": "не е празно", + "is_null": "е нищо", + "is_not_null": "различно от нищо" + }, + "errors": { + "no_filter": "Не е избран филтър", + "empty_group": "Групата е празна", + "radio_empty": "Не е селектирана стойност", + "checkbox_empty": "Не е селектирана стойност", + "select_empty": "Не е селектирана стойност", + "string_empty": "Празна стойност", + "string_exceed_min_length": "Необходимо е да съдържа поне {0} символа", + "string_exceed_max_length": "Необходимо е да съдържа повече от {0} символа", + "string_invalid_format": "Невалиден формат ({0})", + "number_nan": "Не е число", + "number_not_integer": "Не е цяло число", + "number_not_double": "Не е реално число", + "number_exceed_min": "Трябва да е по-голямо от {0}", + "number_exceed_max": "Трябва да е по-малко от {0}", + "number_wrong_step": "Трябва да е кратно на {0}", + "datetime_empty": "Празна стойност", + "datetime_invalid": "Невалиден формат на дата ({0})", + "datetime_exceed_min": "Трябва да е след {0}", + "datetime_exceed_max": "Трябва да е преди {0}", + "boolean_not_valid": "Не е булева", + "operator_not_multiple": "Оператора \"{1}\" не може да приеме множество стойности" + } +}; + +QueryBuilder.defaults({ lang_code: 'bg' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.cs.js b/dist/i18n/query-builder.cs.js new file mode 100644 index 00000000..00460ee8 --- /dev/null +++ b/dist/i18n/query-builder.cs.js @@ -0,0 +1,79 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Čeština (cs) + * Author: Megaplan, mborisv + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['cs'] = { + "__locale": "Čeština (cs)", + "__author": "Megaplan, mborisv ", + "add_rule": "Přidat", + "add_group": "Přidat skupinu", + "delete_rule": "Odstranit", + "delete_group": "Odstranit skupinu", + "conditions": { + "AND": "I", + "OR": "NEBO" + }, + "operators": { + "equal": "stejně", + "not_equal": "liší se", + "in": "z uvedených", + "not_in": "ne z uvedených", + "less": "méně", + "less_or_equal": "méně nebo stejně", + "greater": "více", + "greater_or_equal": "více nebo stejně", + "between": "mezi", + "begins_with": "začíná z", + "not_begins_with": "nezačíná z", + "contains": "obsahuje", + "not_contains": "neobsahuje", + "ends_with": "končí na", + "not_ends_with": "nekončí na", + "is_empty": "prázdný řádek", + "is_not_empty": "neprázdný řádek", + "is_null": "prázdno", + "is_not_null": "plno" + }, + "errors": { + "no_filter": "není vybraný filtr", + "empty_group": "prázdná skupina", + "radio_empty": "Není udaná hodnota", + "checkbox_empty": "Není udaná hodnota", + "select_empty": "Není udaná hodnota", + "string_empty": "Nevyplněno", + "string_exceed_min_length": "Musí obsahovat více {0} symbolů", + "string_exceed_max_length": "Musí obsahovat méně {0} symbolů", + "string_invalid_format": "Nesprávný formát ({0})", + "number_nan": "Žádné číslo", + "number_not_integer": "Žádné číslo", + "number_not_double": "Žádné číslo", + "number_exceed_min": "Musí být více {0}", + "number_exceed_max": "Musí být méně {0}", + "number_wrong_step": "Musí být násobkem {0}", + "datetime_empty": "Nevyplněno", + "datetime_invalid": "Nesprávný formát datumu ({0})", + "datetime_exceed_min": "Musí být po {0}", + "datetime_exceed_max": "Musí být do {0}", + "boolean_not_valid": "Nelogické", + "operator_not_multiple": "Operátor \"{1}\" nepodporuje mnoho hodnot" + }, + "invert": "invertní" +}; + +QueryBuilder.defaults({ lang_code: 'cs' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.da.js b/dist/i18n/query-builder.da.js new file mode 100644 index 00000000..87a0601c --- /dev/null +++ b/dist/i18n/query-builder.da.js @@ -0,0 +1,56 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Danish (da) + * Author: Jna Borup Coyle, github@coyle.dk + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['da'] = { + "__locale": "Danish (da)", + "__author": "Jna Borup Coyle, github@coyle.dk", + "add_rule": "Tilføj regel", + "add_group": "Tilføj gruppe", + "delete_rule": "Slet regel", + "delete_group": "Slet gruppe", + "conditions": { + "AND": "OG", + "OR": "ELLER" + }, + "condition_and": "OG", + "condition_or": "ELLER", + "operators": { + "equal": "lig med", + "not_equal": "ikke lige med", + "in": "i", + "not_in": "ikke i", + "less": "mindre", + "less_or_equal": "mindre eller lig med", + "greater": "større", + "greater_or_equal": "større eller lig med", + "begins_with": "begynder med", + "not_begins_with": "begynder ikke med", + "contains": "indeholder", + "not_contains": "indeholder ikke", + "ends_with": "slutter med", + "not_ends_with": "slutter ikke med", + "is_empty": "er tom", + "is_not_empty": "er ikke tom", + "is_null": "er null", + "is_not_null": "er ikke null" + } +}; + +QueryBuilder.defaults({ lang_code: 'da' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.de.js b/dist/i18n/query-builder.de.js new file mode 100644 index 00000000..1d62ca72 --- /dev/null +++ b/dist/i18n/query-builder.de.js @@ -0,0 +1,76 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: German (de) + * Author: "raimu" + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['de'] = { + "__locale": "German (de)", + "__author": "\"raimu\"", + "add_rule": "neue Regel", + "add_group": "neue Gruppe", + "delete_rule": "löschen", + "delete_group": "löschen", + "conditions": { + "AND": "UND", + "OR": "ODER" + }, + "operators": { + "equal": "gleich", + "not_equal": "ungleich", + "in": "in", + "not_in": "nicht in", + "less": "kleiner", + "less_or_equal": "kleiner gleich", + "greater": "größer", + "greater_or_equal": "größer gleich", + "between": "zwischen", + "not_between": "nicht zwischen", + "begins_with": "beginnt mit", + "not_begins_with": "beginnt nicht mit", + "contains": "enthält", + "not_contains": "enthält nicht", + "ends_with": "endet mit", + "not_ends_with": "endet nicht mit", + "is_empty": "ist leer", + "is_not_empty": "ist nicht leer", + "is_null": "ist null", + "is_not_null": "ist nicht null" + }, + "errors": { + "no_filter": "Kein Filter ausgewählt", + "empty_group": "Die Gruppe ist leer", + "radio_empty": "Kein Wert ausgewählt", + "checkbox_empty": "Kein Wert ausgewählt", + "select_empty": "Kein Wert ausgewählt", + "string_empty": "Leerer Wert", + "string_exceed_min_length": "Muss mindestens {0} Zeichen enthalten", + "string_exceed_max_length": "Darf nicht mehr als {0} Zeichen enthalten", + "string_invalid_format": "Ungültiges Format ({0})", + "number_nan": "Keine Zahl", + "number_not_integer": "Keine Ganzzahl", + "number_not_double": "Keine Dezimalzahl", + "number_exceed_min": "Muss größer als {0} sein", + "number_exceed_max": "Muss kleiner als {0} sein", + "number_wrong_step": "Muss ein Vielfaches von {0} sein", + "datetime_invalid": "Ungültiges Datumsformat ({0})", + "datetime_exceed_min": "Muss nach dem {0} sein", + "datetime_exceed_max": "Muss vor dem {0} sein" + } +}; + +QueryBuilder.defaults({ lang_code: 'de' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.el.js b/dist/i18n/query-builder.el.js new file mode 100644 index 00000000..db394c9b --- /dev/null +++ b/dist/i18n/query-builder.el.js @@ -0,0 +1,80 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Greek (el) + * Author: Stelios Patsatzis, https://www.linkedin.com/in/stelios-patsatzis-89841561 + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['el'] = { + "__locale": "Greek (el)", + "__author": "Stelios Patsatzis, https://www.linkedin.com/in/stelios-patsatzis-89841561", + "add_rule": "Προσθήκη Συνθήκης", + "add_group": "Προσθήκη Ομάδας", + "delete_rule": "Διαγραφή", + "delete_group": "Διαγραφή", + "conditions": { + "AND": "Λογικό ΚΑΙ", + "OR": "Λογικό Η" + }, + "operators": { + "equal": "Ισούται με", + "not_equal": "Διάφορο από ", + "in": "Περιέχει", + "not_in": "Δεν Περιέχει", + "less": "Λιγότερο από", + "less_or_equal": "Λιγότερο ή Ίσο", + "greater": "Μεγαλύτερο από", + "greater_or_equal": "Μεγαλύτερο ή Ίσο", + "between": "Μεταξύ", + "not_between": "Εκτός", + "begins_with": "Αρχίζει με", + "not_begins_with": "Δεν αρχίζει με", + "contains": "Περιέχει", + "not_contains": "Δεν περιέχει", + "ends_with": "Τελειώνει σε", + "not_ends_with": "Δεν τελειώνει σε", + "is_empty": "Είναι άδειο", + "is_not_empty": "Δεν είναι άδειο", + "is_null": "Είναι NULL", + "is_not_null": "Δεν είναι NULL" + }, + "errors": { + "no_filter": "Χωρίς φίλτρα", + "empty_group": "Άδεια ομάδα", + "radio_empty": "Χωρίς τιμή", + "checkbox_empty": "Χωρίς τιμή", + "select_empty": "Χωρίς τιμή", + "string_empty": "Χωρίς τιμή", + "string_exceed_min_length": "Ελάχιστο όριο {0} χαρακτήρων", + "string_exceed_max_length": "Μέγιστο όριο {0} χαρακτήρων", + "string_invalid_format": "Λανθασμένη μορφή ({0})", + "number_nan": "Δεν είναι αριθμός", + "number_not_integer": "Δεν είναι ακέραιος αριθμός", + "number_not_double": "Δεν είναι πραγματικός αριθμός", + "number_exceed_min": "Πρέπει να είναι μεγαλύτερο απο {0}", + "number_exceed_max": "Πρέπει να είναι μικρότερο απο {0}", + "number_wrong_step": "Πρέπει να είναι πολλαπλάσιο του {0}", + "datetime_empty": "Χωρίς τιμή", + "datetime_invalid": "Λανθασμένη μορφή ημερομηνίας ({0})", + "datetime_exceed_min": "Νεότερο από {0}", + "datetime_exceed_max": "Παλαιότερο από {0}", + "boolean_not_valid": "Δεν είναι BOOLEAN", + "operator_not_multiple": "Η συνθήκη \"{1}\" δεν μπορεί να δεχθεί πολλαπλές τιμές" + }, + "invert": "Εναλλαγή" +}; + +QueryBuilder.defaults({ lang_code: 'el' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.en.js b/dist/i18n/query-builder.en.js new file mode 100644 index 00000000..66a5555b --- /dev/null +++ b/dist/i18n/query-builder.en.js @@ -0,0 +1,83 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: English (en) + * Author: Damien "Mistic" Sorel, http://www.strangeplanet.fr + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['en'] = { + "__locale": "English (en)", + "__author": "Damien \"Mistic\" Sorel, http://www.strangeplanet.fr", + "add_rule": "Add condition", + "add_group": "Add condition group", + "delete_rule": "Delete", + "delete_group": "Delete", + "conditions": { + "AND": "AND", + "OR": "OR" + }, + "operators": { + "equal": "equal", + "not_equal": "not equal", + "in": "in", + "not_in": "not in", + "less": "less", + "less_or_equal": "less or equal", + "greater": "greater", + "greater_or_equal": "greater or equal", + "between": "between", + "not_between": "not between", + "begins_with": "begins with", + "not_begins_with": "doesn't begin with", + "contains": "contains", + "not_contains": "doesn't contain", + "ends_with": "ends with", + "not_ends_with": "doesn't end with", + "is_empty": "is empty", + "is_not_empty": "is not empty", + "is_null": "is null", + "is_not_null": "is not null" + }, + "errors": { + "no_filter": "No filter selected", + "empty_group": "The condition group is empty", + "radio_empty": "No value selected", + "checkbox_empty": "No value selected", + "select_empty": "No value selected", + "string_empty": "Empty value", + "string_exceed_min_length": "Must contain at least {0} characters", + "string_exceed_max_length": "Must not contain more than {0} characters", + "string_invalid_format": "Invalid format ({0})", + "number_nan": "Not a number", + "number_not_integer": "Not an integer", + "number_not_double": "Not a real number", + "number_exceed_min": "Must be greater than {0}", + "number_exceed_max": "Must be lower than {0}", + "number_wrong_step": "Must be a multiple of {0}", + "number_between_invalid": "Invalid values, {0} is greater than {1}", + "datetime_empty": "Empty value", + "datetime_invalid": "Invalid date format ({0})", + "datetime_exceed_min": "Must be after {0}", + "datetime_exceed_max": "Must be before {0}", + "datetime_between_invalid": "Invalid values, {0} is greater than {1}", + "boolean_not_valid": "Not a boolean", + "operator_not_multiple": "Operator \"{1}\" cannot accept multiple values" + }, + "invert": "Invert", + "NOT": "NOT" +}; + +QueryBuilder.defaults({ lang_code: 'en' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.eo.js b/dist/i18n/query-builder.eo.js new file mode 100644 index 00000000..721c9516 --- /dev/null +++ b/dist/i18n/query-builder.eo.js @@ -0,0 +1,83 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Esperanto (eo) + * Author: Robin van der Vliet, https://robinvandervliet.com/ + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['eo'] = { + "__locale": "Esperanto (eo)", + "__author": "Robin van der Vliet, https://robinvandervliet.com/", + "add_rule": "Aldoni regulon", + "add_group": "Aldoni grupon", + "delete_rule": "Forigi", + "delete_group": "Forigi", + "conditions": { + "AND": "KAJ", + "OR": "AŬ" + }, + "operators": { + "equal": "estas egala al", + "not_equal": "ne estas egala al", + "in": "estas en", + "not_in": "ne estas en", + "less": "estas malpli ol", + "less_or_equal": "estas malpli ol aŭ egala al", + "greater": "estas pli ol", + "greater_or_equal": "estas pli ol aŭ egala al", + "between": "estas inter", + "not_between": "ne estas inter", + "begins_with": "komenciĝas per", + "not_begins_with": "ne komenciĝas per", + "contains": "enhavas", + "not_contains": "ne enhavas", + "ends_with": "finiĝas per", + "not_ends_with": "ne finiĝas per", + "is_empty": "estas malplena", + "is_not_empty": "ne estas malplena", + "is_null": "estas senvalora", + "is_not_null": "ne estas senvalora" + }, + "errors": { + "no_filter": "Neniu filtrilo elektita", + "empty_group": "La grupo estas malplena", + "radio_empty": "Neniu valoro elektita", + "checkbox_empty": "Neniu valoro elektita", + "select_empty": "Neniu valoro elektita", + "string_empty": "Malplena valoro", + "string_exceed_min_length": "Devas enhavi pli ol {0} signojn", + "string_exceed_max_length": "Devas ne enhavi pli ol {0} signojn", + "string_invalid_format": "Nevalida strukturo ({0})", + "number_nan": "Ne estas nombro", + "number_not_integer": "Ne estas entjera nombro", + "number_not_double": "Ne estas reela nombro", + "number_exceed_min": "Devas esti pli ol {0}", + "number_exceed_max": "Devas esti malpli ol {0}", + "number_wrong_step": "Devas esti oblo de {0}", + "number_between_invalid": "Nevalidaj valoroj, {0} estas pli ol {1}", + "datetime_empty": "Malplena valoro", + "datetime_invalid": "Nevalida dato ({0})", + "datetime_exceed_min": "Devas esti post {0}", + "datetime_exceed_max": "Devas esti antaŭ {0}", + "datetime_between_invalid": "Nevalidaj valoroj, {0} estas post {1}", + "boolean_not_valid": "Ne estas bulea valoro", + "operator_not_multiple": "La operacio \"{1}\" ne akceptas plurajn valorojn" + }, + "invert": "Inversigi", + "NOT": "NE" +}; + +QueryBuilder.defaults({ lang_code: 'eo' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.es.js b/dist/i18n/query-builder.es.js new file mode 100644 index 00000000..ac641ae5 --- /dev/null +++ b/dist/i18n/query-builder.es.js @@ -0,0 +1,81 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Spanish (es) + * Author: "pyarza", "kddlb" + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['es'] = { + "__locale": "Spanish (es)", + "__author": "\"pyarza\", \"kddlb\"", + "add_rule": "Añadir regla", + "add_group": "Añadir grupo", + "delete_rule": "Borrar", + "delete_group": "Borrar", + "conditions": { + "AND": "Y", + "OR": "O" + }, + "operators": { + "equal": "igual", + "not_equal": "distinto", + "in": "en", + "not_in": "no en", + "less": "menor", + "less_or_equal": "menor o igual", + "greater": "mayor", + "greater_or_equal": "mayor o igual", + "between": "entre", + "not_between": "no está entre", + "begins_with": "empieza por", + "not_begins_with": "no empieza por", + "contains": "contiene", + "not_contains": "no contiene", + "ends_with": "acaba con", + "not_ends_with": "no acaba con", + "is_empty": "está vacío", + "is_not_empty": "no está vacío", + "is_null": "es nulo", + "is_not_null": "no es nulo" + }, + "errors": { + "no_filter": "No se ha seleccionado ningún filtro", + "empty_group": "El grupo está vacío", + "radio_empty": "Ningún valor seleccionado", + "checkbox_empty": "Ningún valor seleccionado", + "select_empty": "Ningún valor seleccionado", + "string_empty": "Cadena vacía", + "string_exceed_min_length": "Debe contener al menos {0} caracteres", + "string_exceed_max_length": "No debe contener más de {0} caracteres", + "string_invalid_format": "Formato inválido ({0})", + "number_nan": "No es un número", + "number_not_integer": "No es un número entero", + "number_not_double": "No es un número real", + "number_exceed_min": "Debe ser mayor que {0}", + "number_exceed_max": "Debe ser menor que {0}", + "number_wrong_step": "Debe ser múltiplo de {0}", + "datetime_invalid": "Formato de fecha inválido ({0})", + "datetime_exceed_min": "Debe ser posterior a {0}", + "datetime_exceed_max": "Debe ser anterior a {0}", + "number_between_invalid": "Valores Inválidos, {0} es mayor que {1}", + "datetime_empty": "Campo vacio", + "datetime_between_invalid": "Valores Inválidos, {0} es mayor que {1}", + "boolean_not_valid": "No es booleano", + "operator_not_multiple": "El operador \"{1}\" no puede aceptar valores multiples" + } +}; + +QueryBuilder.defaults({ lang_code: 'es' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.fa-IR.js b/dist/i18n/query-builder.fa-IR.js new file mode 100644 index 00000000..00ac0787 --- /dev/null +++ b/dist/i18n/query-builder.fa-IR.js @@ -0,0 +1,79 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Farsi (fa-ir) + * Author: Behzad Sedighzade, behzad.sedighzade@gmail.com + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['fa-IR'] = { + "__locale": "Farsi (fa-ir)", + "__author": "Behzad Sedighzade, behzad.sedighzade@gmail.com", + "add_rule": "افزودن قاعده", + "add_group": "افزودن گروه", + "delete_rule": "حذف قاعده", + "delete_group": "حذف گروه", + "conditions": { + "AND": "و", + "OR": "یا" + }, + "operators": { + "equal": "برابر با", + "not_equal": "مخالف", + "in": "شامل مجموعه شود", + "not_in": "شامل مجموعه نشود", + "less": "کمتر از", + "less_or_equal": "کمتر یا مساوی با", + "greater": "بزرگتر از", + "greater_or_equal": "بزرگتر یا مساوی با", + "between": "مابین", + "not_between": "مابین نباشد", + "begins_with": "شروع شود با", + "not_begins_with": "شروع نشود با", + "contains": "شامل شود", + "not_contains": "شامل نشود", + "ends_with": "خاتمه یابد با", + "not_ends_with": "خاتمه نیابد با", + "is_empty": "خالی باشد", + "is_not_empty": "خالی نباشد", + "is_null": "باشد ( null ) پوچ", + "is_not_null": "نباشد( null ) پوچ " + }, + "errors": { + "no_filter": "هیچ قاعده ای انتخاب نشده است", + "empty_group": "گروه خالی است", + "radio_empty": "مقداری انتخاب نشده است", + "checkbox_empty": "مقداری انتخاب نشده است", + "select_empty": "مقداری انتخاب نشده است", + "string_empty": "مقدار متنی خالی است", + "string_exceed_min_length": "رشته حداقل باید {0} عدد حرف داشته باشد", + "string_exceed_max_length": "رشته حداکثر {0} عدد حرف می تواند قبول کند", + "string_invalid_format": "قالب رشته {0} نامعتبر ست", + "number_nan": "عدد وارد کنید", + "number_not_integer": "مقدار صحیح وارد کنید", + "number_not_double": "مقدار اعشاری وارد کنید", + "number_exceed_min": "باید از {0} بزرگتر باشد", + "number_exceed_max": "باید از {0} کمتر باشد", + "number_wrong_step": "باید مضربی از {0} باشد", + "datetime_empty": "مقدار تاریخ خالی وارد شده!", + "datetime_invalid": "قالب تاریخ ( {0} ) اشتباه است", + "datetime_exceed_min": "باید بعد از {0} باشد", + "datetime_exceed_max": "باید قبل از {0} باشد", + "boolean_not_valid": "مقدار دودویی وارد کنید", + "operator_not_multiple": "اپراتور \"{1}\" نمی تواند چند مقدار قبول کند" + } +}; + +QueryBuilder.defaults({ lang_code: 'fa-IR' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.fr.js b/dist/i18n/query-builder.fr.js new file mode 100644 index 00000000..e57b826b --- /dev/null +++ b/dist/i18n/query-builder.fr.js @@ -0,0 +1,83 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: French (fr) + * Author: Damien "Mistic" Sorel, http://www.strangeplanet.fr + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['fr'] = { + "__locale": "French (fr)", + "__author": "Damien \"Mistic\" Sorel, http://www.strangeplanet.fr", + "add_rule": "Ajouter une règle", + "add_group": "Ajouter un groupe", + "delete_rule": "Supprimer", + "delete_group": "Supprimer", + "conditions": { + "AND": "ET", + "OR": "OU" + }, + "operators": { + "equal": "est égal à", + "not_equal": "n'est pas égal à", + "in": "est compris dans", + "not_in": "n'est pas compris dans", + "less": "est inférieur à", + "less_or_equal": "est inférieur ou égal à", + "greater": "est supérieur à", + "greater_or_equal": "est supérieur ou égal à", + "between": "est entre", + "not_between": "n'est pas entre", + "begins_with": "commence par", + "not_begins_with": "ne commence pas par", + "contains": "contient", + "not_contains": "ne contient pas", + "ends_with": "finit par", + "not_ends_with": "ne finit pas par", + "is_empty": "est vide", + "is_not_empty": "n'est pas vide", + "is_null": "est nul", + "is_not_null": "n'est pas nul" + }, + "errors": { + "no_filter": "Aucun filtre sélectionné", + "empty_group": "Le groupe est vide", + "radio_empty": "Pas de valeur selectionnée", + "checkbox_empty": "Pas de valeur selectionnée", + "select_empty": "Pas de valeur selectionnée", + "string_empty": "Valeur vide", + "string_exceed_min_length": "Doit contenir au moins {0} caractères", + "string_exceed_max_length": "Ne doit pas contenir plus de {0} caractères", + "string_invalid_format": "Format invalide ({0})", + "number_nan": "N'est pas un nombre", + "number_not_integer": "N'est pas un entier", + "number_not_double": "N'est pas un nombre réel", + "number_exceed_min": "Doit être plus grand que {0}", + "number_exceed_max": "Doit être plus petit que {0}", + "number_wrong_step": "Doit être un multiple de {0}", + "number_between_invalid": "Valeurs invalides, {0} est plus grand que {1}", + "datetime_empty": "Valeur vide", + "datetime_invalid": "Fomat de date invalide ({0})", + "datetime_exceed_min": "Doit être après {0}", + "datetime_exceed_max": "Doit être avant {0}", + "datetime_between_invalid": "Valeurs invalides, {0} est plus grand que {1}", + "boolean_not_valid": "N'est pas un booléen", + "operator_not_multiple": "L'opérateur \"{1}\" ne peut utiliser plusieurs valeurs" + }, + "invert": "Inverser", + "NOT": "NON" +}; + +QueryBuilder.defaults({ lang_code: 'fr' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.he.js b/dist/i18n/query-builder.he.js new file mode 100644 index 00000000..93da2b3c --- /dev/null +++ b/dist/i18n/query-builder.he.js @@ -0,0 +1,81 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Hebrew (he) + * Author: Kfir Stri https://github.com/kfirstri + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['he'] = { + "__locale": "Hebrew (he)", + "__author": "Kfir Stri https://github.com/kfirstri", + "add_rule": "הוסף כלל", + "add_group": "הוסף קבוצה", + "delete_rule": "מחק", + "delete_group": "מחק", + "conditions": { + "AND": "וגם", + "OR": "או" + }, + "operators": { + "equal": "שווה ל", + "not_equal": "שונה מ", + "in": "חלק מ", + "not_in": "לא חלק מ", + "less": "פחות מ", + "less_or_equal": "פחות או שווה ל", + "greater": "גדול מ", + "greater_or_equal": "גדול או שווה ל", + "between": "בין", + "not_between": "לא בין", + "begins_with": "מתחיל ב", + "not_begins_with": "לא מתחיל ב", + "contains": "מכיל", + "not_contains": "לא מכיל", + "ends_with": "מסתיים ב", + "not_ends_with": "לא מסתיים ב", + "is_empty": "ריק", + "is_not_empty": "לא ריק", + "is_null": "חסר ערך", + "is_not_null": "לא חסר ערך" + }, + "errors": { + "no_filter": "לא נבחרו מסננים", + "empty_group": "הקבוצה רירקה", + "radio_empty": "לא נבחר אף ערך", + "checkbox_empty": "לא נבחר אף ערך", + "select_empty": "לא נבחר אף ערך", + "string_empty": "חסר ערך", + "string_exceed_min_length": "המחרוזת חייבת להכיל לפחות {0} תווים", + "string_exceed_max_length": "המחרוזת לא יכולה להכיל יותר מ{0} תווים", + "string_invalid_format": "המחרוזת בפורמט שגוי ({0})", + "number_nan": "זהו לא מספר", + "number_not_integer": "המספר אינו מספר שלם", + "number_not_double": "המספר אינו מספר עשרוני", + "number_exceed_min": "המספר צריך להיות גדול מ {0}", + "number_exceed_max": "המספר צריך להיות קטן מ{0}", + "number_wrong_step": "המספר צריך להיות כפולה של {0}", + "datetime_empty": "תאריך ריק", + "datetime_invalid": "פורמט תאריך שגוי ({0})", + "datetime_exceed_min": "התאריך חייב להיות אחרי {0}", + "datetime_exceed_max": "התאריך חייב להיות לפני {0}", + "boolean_not_valid": "זהו לא בוליאני", + "operator_not_multiple": "האופרטור \"{1}\" לא יכול לקבל ערכים מרובים" + }, + "invert": "הפוך שאילתא", + "NOT": "לא" +}; + +QueryBuilder.defaults({ lang_code: 'he' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.hu.js b/dist/i18n/query-builder.hu.js new file mode 100644 index 00000000..58832a66 --- /dev/null +++ b/dist/i18n/query-builder.hu.js @@ -0,0 +1,83 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Hungarian - Magyar (hu) + * Author: Szabó Attila "Tailor993", https://www.tailor993.hu + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['hu'] = { + "__locale": "Hungarian - Magyar (hu)", + "__author": "Szabó Attila \"Tailor993\", https://www.tailor993.hu", + "add_rule": "Feltétel hozzáadása", + "add_group": "Csoport hozzáadása", + "delete_rule": "Feltétel törlése", + "delete_group": "Csoport törlése", + "conditions": { + "AND": "ÉS", + "OR": "VAGY" + }, + "operators": { + "equal": "egyenlő", + "not_equal": "nem egyenlő", + "in": "bennevan", + "not_in": "nincs benne", + "less": "kisebb", + "less_or_equal": "kisebb vagy egyenlő", + "greater": "nagyobb", + "greater_or_equal": "nagyobb vagy egyenlő", + "between": "közötte", + "not_between": "nincs közötte", + "begins_with": "ezzel kezdődik", + "not_begins_with": "ezzel nem kezdődik", + "contains": "tartalmazza", + "not_contains": "nem tartalmazza", + "ends_with": "erre végződik", + "not_ends_with": "errre nem végződik", + "is_empty": "üres", + "is_not_empty": "nem üres", + "is_null": "null", + "is_not_null": "nem null" + }, + "errors": { + "no_filter": "Nincs kiválasztott feltétel", + "empty_group": "A csoport üres", + "radio_empty": "Nincs kiválasztott érték", + "checkbox_empty": "Nincs kiválasztott érték", + "select_empty": "Nincs kiválasztott érték", + "string_empty": "Üres érték", + "string_exceed_min_length": "A megadott szöveg rövidebb a várt {0} karakternél", + "string_exceed_max_length": "A megadott szöveg nem tartalmazhat többet, mint {0} karaktert", + "string_invalid_format": "Nem megfelelő formátum ({0})", + "number_nan": "Nem szám", + "number_not_integer": "Nem egész szám (integer)", + "number_not_double": "Nem valós szám", + "number_exceed_min": "Nagyobbnak kell lennie, mint {0}", + "number_exceed_max": "Kisebbnek kell lennie, mint {0}", + "number_wrong_step": "{0} többszörösének kell lennie.", + "number_between_invalid": "INem megfelelő érték, {0} nagyobb, mint {1}", + "datetime_empty": "Üres érték", + "datetime_invalid": "nem megfelelő dátum formátum ({0})", + "datetime_exceed_min": "A dátumnak későbbinek kell lennie, mint{0}", + "datetime_exceed_max": "A dátumnak korábbinak kell lennie, mint {0}", + "datetime_between_invalid": "Nem megfelelő értékek, {0} nagyobb, mint {1}", + "boolean_not_valid": "Nem igaz/hamis (boolean)", + "operator_not_multiple": "Ez a művelet: \"{1}\" nem fogadhat el több értéket" + }, + "invert": "Megfordítás (Invertálás)", + "NOT": "NEM" +}; + +QueryBuilder.defaults({ lang_code: 'hu' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.it.js b/dist/i18n/query-builder.it.js new file mode 100644 index 00000000..b3f500a3 --- /dev/null +++ b/dist/i18n/query-builder.it.js @@ -0,0 +1,81 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Italian (it) + * Author: davegraziosi, Giuseppe Lodi Rizzini + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['it'] = { + "__locale": "Italian (it)", + "__author": "davegraziosi, Giuseppe Lodi Rizzini", + "add_rule": "Aggiungi regola", + "add_group": "Aggiungi gruppo", + "delete_rule": "Elimina", + "delete_group": "Elimina", + "conditions": { + "AND": "E", + "OR": "O" + }, + "operators": { + "equal": "uguale", + "not_equal": "non uguale", + "in": "in", + "not_in": "non in", + "less": "minore", + "less_or_equal": "minore o uguale", + "greater": "maggiore", + "greater_or_equal": "maggiore o uguale", + "between": "compreso tra", + "not_between": "non compreso tra", + "begins_with": "inizia con", + "not_begins_with": "non inizia con", + "contains": "contiene", + "not_contains": "non contiene", + "ends_with": "finisce con", + "not_ends_with": "non finisce con", + "is_empty": "è vuoto", + "is_not_empty": "non è vuoto", + "is_null": "è nullo", + "is_not_null": "non è nullo" + }, + "errors": { + "no_filter": "Nessun filtro selezionato", + "empty_group": "Il gruppo è vuoto", + "radio_empty": "No value selected", + "checkbox_empty": "Nessun valore selezionato", + "select_empty": "Nessun valore selezionato", + "string_empty": "Valore vuoto", + "string_exceed_min_length": "Deve contenere almeno {0} caratteri", + "string_exceed_max_length": "Non deve contenere più di {0} caratteri", + "string_invalid_format": "Formato non valido ({0})", + "number_nan": "Non è un numero", + "number_not_integer": "Non è un intero", + "number_not_double": "Non è un numero con la virgola", + "number_exceed_min": "Deve essere maggiore di {0}", + "number_exceed_max": "Deve essere minore di {0}", + "number_wrong_step": "Deve essere multiplo di {0}", + "number_between_invalid": "Valori non validi, {0} è maggiore di {1}", + "datetime_empty": "Valore vuoto", + "datetime_invalid": "Formato data non valido ({0})", + "datetime_exceed_min": "Deve essere successivo a {0}", + "datetime_exceed_max": "Deve essere precedente a {0}", + "datetime_between_invalid": "Valori non validi, {0} è maggiore di {1}", + "boolean_not_valid": "Non è un booleano", + "operator_not_multiple": "L'Operatore {0} non può accettare valori multipli" + } +}; + +QueryBuilder.defaults({ lang_code: 'it' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.lt.js b/dist/i18n/query-builder.lt.js new file mode 100644 index 00000000..48d52a91 --- /dev/null +++ b/dist/i18n/query-builder.lt.js @@ -0,0 +1,83 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Lithuanian (lt) + * Author: Dalius Guzauskas (aka Tichij), https://lt.linkedin.com/in/daliusg + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['lt'] = { + "__locale": "Lithuanian (lt)", + "__author": "Dalius Guzauskas (aka Tichij), https://lt.linkedin.com/in/daliusg", + "add_rule": "Pridėti taisyklę", + "add_group": "Pridėti grupę", + "delete_rule": "Ištrinti", + "delete_group": "Ištrinti", + "conditions": { + "AND": "IR", + "OR": "ARBA" + }, + "operators": { + "equal": "lygu", + "not_equal": "nėra lygu", + "in": "iš nurodytų", + "not_in": "ne iš nurodytų", + "less": "mažiau", + "less_or_equal": "mažiau arba lygu", + "greater": "daugiau", + "greater_or_equal": "daugiau arba lygu", + "between": "tarp", + "not_between": "nėra tarp", + "begins_with": "prasideda", + "not_begins_with": "neprasideda", + "contains": "turi", + "not_contains": "neturi", + "ends_with": "baigiasi", + "not_ends_with": "nesibaigia", + "is_empty": "tuščia", + "is_not_empty": "ne tuščia", + "is_null": "neapibrėžta", + "is_not_null": "nėra neapibrėžta" + }, + "errors": { + "no_filter": "Nepasirinktas filtras", + "empty_group": "Grupė tuščia", + "radio_empty": "Nepasirinkta reikšmė", + "checkbox_empty": "Nepasirinkta reikšmė", + "select_empty": "Nepasirinkta reikšmė", + "string_empty": "Tuščia reikšmė", + "string_exceed_min_length": "Turi būti bent {0} simbolių", + "string_exceed_max_length": "Turi būti ne daugiau kaip {0} simbolių", + "string_invalid_format": "Klaidingas formatas ({0})", + "number_nan": "Nėra skaičius", + "number_not_integer": "Ne sveikasis skaičius", + "number_not_double": "Ne realusis skaičius", + "number_exceed_min": "Turi būti daugiau už {0}", + "number_exceed_max": "Turi būti mažiau už {0}", + "number_wrong_step": "Turi būti {0} kartotinis", + "number_between_invalid": "Klaidingos reikšmės, {0} yra daugiau už {1}", + "datetime_empty": "Tuščia reikšmė", + "datetime_invalid": "Klaidingas datos formatas ({0})", + "datetime_exceed_min": "Turi būti po {0}", + "datetime_exceed_max": "Turi būti prieš {0}", + "datetime_between_invalid": "Klaidingos reikšmės, {0} yra daugiau už {1}", + "boolean_not_valid": "Nėra loginis tipas", + "operator_not_multiple": "Operatorius \"{1}\" negali priimti kelių reikšmių" + }, + "invert": "Invertuoti", + "NOT": "NE" +}; + +QueryBuilder.defaults({ lang_code: 'lt' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.nl.js b/dist/i18n/query-builder.nl.js new file mode 100644 index 00000000..005d7fa5 --- /dev/null +++ b/dist/i18n/query-builder.nl.js @@ -0,0 +1,76 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Dutch (nl) + * Author: "Roywcm" + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['nl'] = { + "__locale": "Dutch (nl)", + "__author": "\"Roywcm\"", + "add_rule": "Nieuwe regel", + "add_group": "Nieuwe groep", + "delete_rule": "Verwijder", + "delete_group": "Verwijder", + "conditions": { + "AND": "EN", + "OR": "OF" + }, + "operators": { + "equal": "gelijk", + "not_equal": "niet gelijk", + "in": "in", + "not_in": "niet in", + "less": "minder", + "less_or_equal": "minder of gelijk", + "greater": "groter", + "greater_or_equal": "groter of gelijk", + "between": "tussen", + "not_between": "niet tussen", + "begins_with": "begint met", + "not_begins_with": "begint niet met", + "contains": "bevat", + "not_contains": "bevat niet", + "ends_with": "eindigt met", + "not_ends_with": "eindigt niet met", + "is_empty": "is leeg", + "is_not_empty": "is niet leeg", + "is_null": "is null", + "is_not_null": "is niet null" + }, + "errors": { + "no_filter": "Geen filter geselecteerd", + "empty_group": "De groep is leeg", + "radio_empty": "Geen waarde geselecteerd", + "checkbox_empty": "Geen waarde geselecteerd", + "select_empty": "Geen waarde geselecteerd", + "string_empty": "Lege waarde", + "string_exceed_min_length": "Dient minstens {0} karakters te bevatten", + "string_exceed_max_length": "Dient niet meer dan {0} karakters te bevatten", + "string_invalid_format": "Ongeldig format ({0})", + "number_nan": "Niet een nummer", + "number_not_integer": "Geen geheel getal", + "number_not_double": "Geen echt nummer", + "number_exceed_min": "Dient groter te zijn dan {0}", + "number_exceed_max": "Dient lager te zijn dan {0}", + "number_wrong_step": "Dient een veelvoud te zijn van {0}", + "datetime_invalid": "Ongeldige datumformat ({0})", + "datetime_exceed_min": "Dient na {0}", + "datetime_exceed_max": "Dient voor {0}" + } +}; + +QueryBuilder.defaults({ lang_code: 'nl' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.no.js b/dist/i18n/query-builder.no.js new file mode 100644 index 00000000..fefffea7 --- /dev/null +++ b/dist/i18n/query-builder.no.js @@ -0,0 +1,54 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Norwegian (no) + * Author: Jna Borup Coyle, github@coyle.dk + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['no'] = { + "__locale": "Norwegian (no)", + "__author": "Jna Borup Coyle, github@coyle.dk", + "add_rule": "Legg til regel", + "add_group": "Legg til gruppe", + "delete_rule": "Slett regel", + "delete_group": "Slett gruppe", + "conditions": { + "AND": "OG", + "OR": "ELLER" + }, + "operators": { + "equal": "er lik", + "not_equal": "er ikke lik", + "in": "finnes i", + "not_in": "finnes ikke i", + "less": "er mindre enn", + "less_or_equal": "er mindre eller lik", + "greater": "er større enn", + "greater_or_equal": "er større eller lik", + "begins_with": "begynner med", + "not_begins_with": "begynner ikke med", + "contains": "inneholder", + "not_contains": "inneholder ikke", + "ends_with": "slutter med", + "not_ends_with": "slutter ikke med", + "is_empty": "er tom", + "is_not_empty": "er ikke tom", + "is_null": "er null", + "is_not_null": "er ikke null" + } +}; + +QueryBuilder.defaults({ lang_code: 'no' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.pl.js b/dist/i18n/query-builder.pl.js new file mode 100644 index 00000000..112b5089 --- /dev/null +++ b/dist/i18n/query-builder.pl.js @@ -0,0 +1,80 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Polish (pl) + * Author: Artur Smolarek + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['pl'] = { + "__locale": "Polish (pl)", + "__author": "Artur Smolarek", + "add_rule": "Dodaj regułę", + "add_group": "Dodaj grupę", + "delete_rule": "Usuń", + "delete_group": "Usuń", + "conditions": { + "AND": "ORAZ", + "OR": "LUB" + }, + "operators": { + "equal": "równa się", + "not_equal": "jest różne od", + "in": "zawiera", + "not_in": "nie zawiera", + "less": "mniejsze", + "less_or_equal": "mniejsze lub równe", + "greater": "większe", + "greater_or_equal": "większe lub równe", + "between": "pomiędzy", + "not_between": "nie jest pomiędzy", + "begins_with": "rozpoczyna się od", + "not_begins_with": "nie rozpoczyna się od", + "contains": "zawiera", + "not_contains": "nie zawiera", + "ends_with": "kończy się na", + "not_ends_with": "nie kończy się na", + "is_empty": "jest puste", + "is_not_empty": "nie jest puste", + "is_null": "jest niezdefiniowane", + "is_not_null": "nie jest niezdefiniowane" + }, + "errors": { + "no_filter": "Nie wybrano żadnego filtra", + "empty_group": "Grupa jest pusta", + "radio_empty": "Nie wybrano wartości", + "checkbox_empty": "Nie wybrano wartości", + "select_empty": "Nie wybrano wartości", + "string_empty": "Nie wpisano wartości", + "string_exceed_min_length": "Minimalna długość to {0} znaków", + "string_exceed_max_length": "Maksymalna długość to {0} znaków", + "string_invalid_format": "Nieprawidłowy format ({0})", + "number_nan": "To nie jest liczba", + "number_not_integer": "To nie jest liczba całkowita", + "number_not_double": "To nie jest liczba rzeczywista", + "number_exceed_min": "Musi być większe niż {0}", + "number_exceed_max": "Musi być mniejsze niż {0}", + "number_wrong_step": "Musi być wielokrotnością {0}", + "datetime_empty": "Nie wybrano wartości", + "datetime_invalid": "Nieprawidłowy format daty ({0})", + "datetime_exceed_min": "Musi być po {0}", + "datetime_exceed_max": "Musi być przed {0}", + "boolean_not_valid": "Niepoprawna wartość logiczna", + "operator_not_multiple": "Operator \"{1}\" nie przyjmuje wielu wartości" + }, + "invert": "Odwróć" +}; + +QueryBuilder.defaults({ lang_code: 'pl' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.pt-BR.js b/dist/i18n/query-builder.pt-BR.js new file mode 100644 index 00000000..3c2df3e8 --- /dev/null +++ b/dist/i18n/query-builder.pt-BR.js @@ -0,0 +1,80 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Brazilian Portuguese (pr-BR) + * Author: Leandro Gehlen, leandrogehlen@gmail.com; Marcos Ferretti, marcosvferretti@gmail.com + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['pt-BR'] = { + "__locale": "Brazilian Portuguese (pr-BR)", + "__author": "Leandro Gehlen, leandrogehlen@gmail.com; Marcos Ferretti, marcosvferretti@gmail.com", + "add_rule": "Nova Regra", + "add_group": "Novo Grupo", + "delete_rule": "Excluir", + "delete_group": "Excluir", + "conditions": { + "AND": "E", + "OR": "OU" + }, + "operators": { + "equal": "Igual", + "not_equal": "Diferente", + "in": "Contido", + "not_in": "Não contido", + "less": "Menor", + "less_or_equal": "Menor ou igual", + "greater": "Maior", + "greater_or_equal": "Maior ou igual", + "between": "Entre", + "not_between": "Não entre", + "begins_with": "Iniciando com", + "not_begins_with": "Não iniciando com", + "contains": "Contém", + "not_contains": "Não contém", + "ends_with": "Terminando com", + "not_ends_with": "Terminando sem", + "is_empty": "É vazio", + "is_not_empty": "Não é vazio", + "is_null": "É nulo", + "is_not_null": "Não é nulo" + }, + "errors": { + "no_filter": "Nenhum filtro selecionado", + "empty_group": "O grupo está vazio", + "radio_empty": "Nenhum valor selecionado", + "checkbox_empty": "Nenhum valor selecionado", + "select_empty": "Nenhum valor selecionado", + "string_empty": "Valor vazio", + "string_exceed_min_length": "É necessário conter pelo menos {0} caracteres", + "string_exceed_max_length": "É necessário conter mais de {0} caracteres", + "string_invalid_format": "Formato inválido ({0})", + "number_nan": "Não é um número", + "number_not_integer": "Não é um número inteiro", + "number_not_double": "Não é um número real", + "number_exceed_min": "É necessário ser maior que {0}", + "number_exceed_max": "É necessário ser menor que {0}", + "number_wrong_step": "É necessário ser múltiplo de {0}", + "datetime_invalid": "Formato de data inválido ({0})", + "datetime_exceed_min": "É necessário ser superior a {0}", + "datetime_exceed_max": "É necessário ser inferior a {0}", + "datetime_empty": "Nenhuma data selecionada", + "boolean_not_valid": "Não é um valor booleano", + "operator_not_multiple": "O operador \"{1}\" não aceita valores múltiplos" + }, + "invert": "Inverter" +}; + +QueryBuilder.defaults({ lang_code: 'pt-BR' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.pt-PT.js b/dist/i18n/query-builder.pt-PT.js new file mode 100644 index 00000000..da2062a1 --- /dev/null +++ b/dist/i18n/query-builder.pt-PT.js @@ -0,0 +1,75 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Portuguese (pt-PT) + * Author: Miguel Guerreiro, migas.csi@gmail.com + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['pt-PT'] = { + "__locale": "Portuguese (pt-PT)", + "__author": "Miguel Guerreiro, migas.csi@gmail.com", + "add_rule": "Nova Regra", + "add_group": "Novo Grupo", + "delete_rule": "Excluir", + "delete_group": "Excluir", + "conditions": { + "AND": "E", + "OR": "OU" + }, + "operators": { + "equal": "Igual a", + "not_equal": "Diferente de", + "in": "Contido", + "not_in": "Não contido", + "less": "Menor que", + "less_or_equal": "Menor ou igual a", + "greater": "Maior que", + "greater_or_equal": "Maior ou igual que", + "between": "Entre", + "begins_with": "Começar por", + "not_begins_with": "Não a começar por", + "contains": "Contém", + "not_contains": "Não contém", + "ends_with": "Terminando com", + "not_ends_with": "Terminando sem", + "is_empty": "É vazio", + "is_not_empty": "Não é vazio", + "is_null": "É nulo", + "is_not_null": "Não é nulo" + }, + "errors": { + "no_filter": "Nenhum filtro selecionado", + "empty_group": "O grupo está vazio", + "radio_empty": "Nenhum valor selecionado", + "checkbox_empty": "Nenhum valor selecionado", + "select_empty": "Nenhum valor selecionado", + "string_empty": "Valor vazio", + "string_exceed_min_length": "É necessário conter pelo menos {0} caracteres", + "string_exceed_max_length": "É necessário conter mais de {0} caracteres", + "string_invalid_format": "Formato inválido ({0})", + "number_nan": "Não é um número", + "number_not_integer": "Não é um número inteiro", + "number_not_double": "Não é um número real", + "number_exceed_min": "É necessário ser maior que {0}", + "number_exceed_max": "É necessário ser menor que {0}", + "number_wrong_step": "É necessário ser múltiplo de {0}", + "datetime_invalid": "Formato de data inválido ({0})", + "datetime_exceed_min": "É necessário ser superior a {0}", + "datetime_exceed_max": "É necessário ser inferior a {0}" + } +}; + +QueryBuilder.defaults({ lang_code: 'pt-PT' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.ro.js b/dist/i18n/query-builder.ro.js new file mode 100644 index 00000000..45b06d20 --- /dev/null +++ b/dist/i18n/query-builder.ro.js @@ -0,0 +1,54 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Romanian (ro) + * Author: ArianServ + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['ro'] = { + "__locale": "Romanian (ro)", + "__author": "ArianServ", + "add_rule": "Adaugă regulă", + "add_group": "Adaugă grup", + "delete_rule": "Şterge", + "delete_group": "Şterge", + "conditions": { + "AND": "ŞI", + "OR": "SAU" + }, + "operators": { + "equal": "egal", + "not_equal": "diferit", + "in": "în", + "not_in": "nu în", + "less": "mai puţin", + "less_or_equal": "mai puţin sau egal", + "greater": "mai mare", + "greater_or_equal": "mai mare sau egal", + "begins_with": "începe cu", + "not_begins_with": "nu începe cu", + "contains": "conţine", + "not_contains": "nu conţine", + "ends_with": "se termină cu", + "not_ends_with": "nu se termină cu", + "is_empty": "este gol", + "is_not_empty": "nu este gol", + "is_null": "e nul", + "is_not_null": "nu e nul" + } +}; + +QueryBuilder.defaults({ lang_code: 'ro' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.ru.js b/dist/i18n/query-builder.ru.js new file mode 100644 index 00000000..37866a88 --- /dev/null +++ b/dist/i18n/query-builder.ru.js @@ -0,0 +1,81 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Russian (ru) + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['ru'] = { + "__locale": "Russian (ru)", + "add_rule": "Добавить", + "add_group": "Добавить группу", + "delete_rule": "Удалить", + "delete_group": "Удалить", + "conditions": { + "AND": "И", + "OR": "ИЛИ" + }, + "operators": { + "equal": "равно", + "not_equal": "не равно", + "in": "из указанных", + "not_in": "не из указанных", + "less": "меньше", + "less_or_equal": "меньше или равно", + "greater": "больше", + "greater_or_equal": "больше или равно", + "between": "между", + "not_between": "не между", + "begins_with": "начинается с", + "not_begins_with": "не начинается с", + "contains": "содержит", + "not_contains": "не содержит", + "ends_with": "оканчивается на", + "not_ends_with": "не оканчивается на", + "is_empty": "пустая строка", + "is_not_empty": "не пустая строка", + "is_null": "пусто", + "is_not_null": "не пусто" + }, + "errors": { + "no_filter": "Фильтр не выбран", + "empty_group": "Группа пуста", + "radio_empty": "Не выбрано значение", + "checkbox_empty": "Не выбрано значение", + "select_empty": "Не выбрано значение", + "string_empty": "Не заполнено", + "string_exceed_min_length": "Должен содержать больше {0} символов", + "string_exceed_max_length": "Должен содержать меньше {0} символов", + "string_invalid_format": "Неверный формат ({0})", + "number_nan": "Не число", + "number_not_integer": "Не число", + "number_not_double": "Не число", + "number_exceed_min": "Должно быть больше {0}", + "number_exceed_max": "Должно быть меньше, чем {0}", + "number_wrong_step": "Должно быть кратно {0}", + "number_between_invalid": "Недопустимые значения, {0} больше {1}", + "datetime_empty": "Не заполнено", + "datetime_invalid": "Неверный формат даты ({0})", + "datetime_exceed_min": "Должно быть, после {0}", + "datetime_exceed_max": "Должно быть, до {0}", + "datetime_between_invalid": "Недопустимые значения, {0} больше {1}", + "boolean_not_valid": "Не логическое", + "operator_not_multiple": "Оператор \"{1}\" не поддерживает много значений" + }, + "invert": "Инвертировать", + "NOT": "НЕ" +}; + +QueryBuilder.defaults({ lang_code: 'ru' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.sk.js b/dist/i18n/query-builder.sk.js new file mode 100644 index 00000000..737b119f --- /dev/null +++ b/dist/i18n/query-builder.sk.js @@ -0,0 +1,83 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Slovensky (sk) + * Author: k2s + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['sk'] = { + "__locale": "Slovensky (sk)", + "__author": "k2s", + "add_rule": "Pridať podmienku", + "add_group": "Pridať skupinu", + "delete_rule": "Zmazať", + "delete_group": "Zmazať", + "conditions": { + "AND": "A", + "OR": "ALEBO" + }, + "operators": { + "equal": "rovné", + "not_equal": "nerovné", + "in": "v", + "not_in": "nie v", + "less": "menej", + "less_or_equal": "menej alebo rovné", + "greater": "väčšie", + "greater_or_equal": "väčšie alebo rovné", + "between": "medzi", + "not_between": "nie medzi", + "begins_with": "začína na", + "not_begins_with": "nezačína na", + "contains": "obsahuje", + "not_contains": "neobsahuje", + "ends_with": "končí na", + "not_ends_with": "nekončí na", + "is_empty": "je prázdne", + "is_not_empty": "nie je prázdne", + "is_null": "je null", + "is_not_null": "nie je null" + }, + "errors": { + "no_filter": "Nie je zvolený filter", + "empty_group": "Skupina je prázdna", + "radio_empty": "Nie je označená hodnota", + "checkbox_empty": "Nie je označená hodnota", + "select_empty": "Nie je označená hodnota", + "string_empty": "Prázdna hodnota", + "string_exceed_min_length": "Musí obsahovať aspon {0} znakov", + "string_exceed_max_length": "Nesmie obsahovať viac ako {0} znakov", + "string_invalid_format": "Chybný formát ({0})", + "number_nan": "Nie je číslo", + "number_not_integer": "Nie je celé číslo", + "number_not_double": "Nie je desatinné číslo", + "number_exceed_min": "Musí byť väčšie ako {0}", + "number_exceed_max": "Musí byť menšie ako {0}", + "number_wrong_step": "Musí byť násobkom čísla {0}", + "number_between_invalid": "Chybné hodnoty, {0} je väčšie ako {1}", + "datetime_empty": "Prázdna hodnota", + "datetime_invalid": "Chybný formát dátumu ({0})", + "datetime_exceed_min": "Musí byť neskôr ako {0}", + "datetime_exceed_max": "Musí byť skôr ako {0}", + "datetime_between_invalid": "Chybné hodnoty, {0} je neskôr ako {1}", + "boolean_not_valid": "Neplatné áno/nie", + "operator_not_multiple": "Operátor '{1}' nepodporuje viacero hodnôt" + }, + "invert": "Invertný", + "NOT": "NIE" +}; + +QueryBuilder.defaults({ lang_code: 'sk' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.sq.js b/dist/i18n/query-builder.sq.js new file mode 100644 index 00000000..c20fb825 --- /dev/null +++ b/dist/i18n/query-builder.sq.js @@ -0,0 +1,78 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Albanian (sq) + * Author: Tomor Pupovci + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['sq'] = { + "__locale": "Albanian (sq)", + "__author": "Tomor Pupovci", + "add_rule": "Shto rregull", + "add_group": "Shto grup", + "delete_rule": "Fshij", + "delete_group": "Fshij", + "conditions": { + "AND": "DHE", + "OR": "OSE" + }, + "operators": { + "equal": "barabartë", + "not_equal": "e ndryshme prej", + "in": "në", + "not_in": "jo në", + "less": "më e vogël", + "less_or_equal": "më e vogël ose e barabartë me", + "greater": "më e madhe", + "greater_or_equal": "më e madhe ose e barabartë", + "between": "në mes", + "begins_with": "fillon me", + "not_begins_with": "nuk fillon me", + "contains": "përmban", + "not_contains": "nuk përmban", + "ends_with": "mbaron me", + "not_ends_with": "nuk mbaron me", + "is_empty": "është e zbrazët", + "is_not_empty": "nuk është e zbrazët", + "is_null": "është null", + "is_not_null": "nuk është null" + }, + "errors": { + "no_filter": "Nuk ka filter të zgjedhur", + "empty_group": "Grupi është i zbrazët", + "radio_empty": "Nuk ka vlerë të zgjedhur", + "checkbox_empty": "Nuk ka vlerë të zgjedhur", + "select_empty": "Nuk ka vlerë të zgjedhur", + "string_empty": "Vlerë e zbrazët", + "string_exceed_min_length": "Duhet të përmbajë së paku {0} karaktere", + "string_exceed_max_length": "Nuk duhet të përmbajë më shumë se {0} karaktere", + "string_invalid_format": "Format i pasaktë ({0})", + "number_nan": "Nuk është numër", + "number_not_integer": "Nuk është numër i plotë", + "number_not_double": "Nuk është numër me presje", + "number_exceed_min": "Duhet të jetë më i madh se {0}", + "number_exceed_max": "Duhet të jetë më i vogël se {0}", + "number_wrong_step": "Duhet të jetë shumëfish i {0}", + "datetime_empty": "Vlerë e zbrazët", + "datetime_invalid": "Format i pasaktë i datës ({0})", + "datetime_exceed_min": "Duhet të jetë pas {0}", + "datetime_exceed_max": "Duhet të jetë para {0}", + "boolean_not_valid": "Nuk është boolean", + "operator_not_multiple": "Operatori \"{1}\" nuk mund të pranojë vlera të shumëfishta" + } +}; + +QueryBuilder.defaults({ lang_code: 'sq' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.sv.js b/dist/i18n/query-builder.sv.js new file mode 100644 index 00000000..09fee8ec --- /dev/null +++ b/dist/i18n/query-builder.sv.js @@ -0,0 +1,83 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Svenska (sv) + * Author: hekin1 + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['sv'] = { + "__locale": "Svenska (sv)", + "__author": "hekin1", + "add_rule": "Lägg till regel", + "add_group": "Lägg till grupp", + "delete_rule": "Ta bort", + "delete_group": "Ta bort", + "conditions": { + "AND": "OCH", + "OR": "ELLER" + }, + "operators": { + "equal": "lika med", + "not_equal": "ej lika med", + "in": "en av", + "not_in": "ej en av", + "less": "mindre", + "less_or_equal": "mindre eller lika med", + "greater": "större", + "greater_or_equal": "större eller lika med", + "between": "mellan", + "not_between": "ej mellan", + "begins_with": "börjar med", + "not_begins_with": "börjar inte med", + "contains": "innehåller", + "not_contains": "innehåller inte", + "ends_with": "slutar med", + "not_ends_with": "slutar inte med", + "is_empty": "är tom", + "is_not_empty": "är inte tom", + "is_null": "är null", + "is_not_null": "är inte null" + }, + "errors": { + "no_filter": "Inget filter valt", + "empty_group": "Gruppen är tom", + "radio_empty": "Inget värde valt", + "checkbox_empty": "Inget värde valt", + "select_empty": "Inget värde valt", + "string_empty": "Tomt värde", + "string_exceed_min_length": "Måste innehålla minst {0} tecken", + "string_exceed_max_length": "Får ej innehålla fler än {0} tecken", + "string_invalid_format": "Felaktigt format ({0})", + "number_nan": "Inte numeriskt", + "number_not_integer": "Inte en siffra", + "number_not_double": "Inte ett decimaltal", + "number_exceed_min": "Måste vara större än {0}", + "number_exceed_max": "Måste vara lägre än {0}", + "number_wrong_step": "Måste vara en mutipel av {0}", + "number_between_invalid": "Felaktiga värden, {0} är större än {1}", + "datetime_empty": "Tomt värde", + "datetime_invalid": "Felaktigt datumformat ({0})", + "datetime_exceed_min": "Måste vara efter {0}", + "datetime_exceed_max": "Måste vara före {0}", + "datetime_between_invalid": "Felaktiga värden, {0} är större än {1}", + "boolean_not_valid": "Inte en boolean", + "operator_not_multiple": "Operatorn \"{1}\" accepterar inte flera värden" + }, + "invert": "Invertera", + "NOT": "INTE" +}; + +QueryBuilder.defaults({ lang_code: 'sv' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.sw.js b/dist/i18n/query-builder.sw.js new file mode 100644 index 00000000..04e883ee --- /dev/null +++ b/dist/i18n/query-builder.sw.js @@ -0,0 +1,83 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Swahili (sw) + * Author: Timothy Anyona + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['sw'] = { + "__locale": "Swahili (sw)", + "__author": "Timothy Anyona", + "add_rule": "Ongeza kanuni", + "add_group": "Ongeza kikundi", + "delete_rule": "Futa", + "delete_group": "Futa", + "conditions": { + "AND": "NA", + "OR": "AU" + }, + "operators": { + "equal": "ni", + "not_equal": "sio", + "in": "mojawapo ya", + "not_in": "sio mojawapo ya", + "less": "isiyozidi", + "less_or_equal": "isiyozidi au ni sawa na", + "greater": "inayozidi", + "greater_or_equal": "inayozidi au ni sawa na", + "between": "kati ya", + "not_between": "isiyo kati ya", + "begins_with": "inaanza na", + "not_begins_with": "isiyoanza na", + "contains": "ina", + "not_contains": "haina", + "ends_with": "inaisha na", + "not_ends_with": "isiyoisha na", + "is_empty": "ni tupu", + "is_not_empty": "sio tupu", + "is_null": "ni batili", + "is_not_null": "sio batili" + }, + "errors": { + "no_filter": "Chujio halijachaguliwa", + "empty_group": "Kikundi ki tupu", + "radio_empty": "Thamani haijachaguliwa", + "checkbox_empty": "Thamani haijachaguliwa", + "select_empty": "Thamani haijachaguliwa", + "string_empty": "Thamani tupu", + "string_exceed_min_length": "Lazima iwe na vibambo visiopungua {0}", + "string_exceed_max_length": "Haifai kuwa na vibambo zaidi ya {0}", + "string_invalid_format": "Fomati batili ({0})", + "number_nan": "Sio nambari", + "number_not_integer": "Sio namba kamili", + "number_not_double": "Sio namba desimali", + "number_exceed_min": "Lazima iwe zaidi ya {0}", + "number_exceed_max": "Lazima iwe chini ya {0}", + "number_wrong_step": "Lazima iwe kigawe cha {0}", + "number_between_invalid": "Thamani batili, {0} ni kubwa kuliko {1}", + "datetime_empty": "Thamani tupu", + "datetime_invalid": "Fomati tarehe batili ({0})", + "datetime_exceed_min": "Lazima iwe baada ya {0}", + "datetime_exceed_max": "Lazima iwe kabla ya {0}", + "datetime_between_invalid": "Thamani batili, {0} ni baada ya {1}", + "boolean_not_valid": "Sio buleani", + "operator_not_multiple": "Opereta \"{1}\" haikubali thamani nyingi" + }, + "invert": "Pindua", + "NOT": "SIO" +}; + +QueryBuilder.defaults({ lang_code: 'sw' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.tr.js b/dist/i18n/query-builder.tr.js new file mode 100644 index 00000000..d1db4824 --- /dev/null +++ b/dist/i18n/query-builder.tr.js @@ -0,0 +1,82 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Turkish (tr) + * Author: Aykut Alpgiray Ateş + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['tr'] = { + "__locale": "Turkish (tr)", + "__author": "Aykut Alpgiray Ateş", + "add_rule": "Kural Ekle", + "add_group": "Grup Ekle", + "delete_rule": "Sil", + "delete_group": "Sil", + "conditions": { + "AND": "Ve", + "OR": "Veya" + }, + "operators": { + "equal": "eşit", + "not_equal": "eşit değil", + "in": "içinde", + "not_in": "içinde değil", + "less": "küçük", + "less_or_equal": "küçük veya eşit", + "greater": "büyük", + "greater_or_equal": "büyük veya eşit", + "between": "arasında", + "not_between": "arasında değil", + "begins_with": "ile başlayan", + "not_begins_with": "ile başlamayan", + "contains": "içeren", + "not_contains": "içermeyen", + "ends_with": "ile biten", + "not_ends_with": "ile bitmeyen", + "is_empty": "boş ise", + "is_not_empty": "boş değil ise", + "is_null": "var ise", + "is_not_null": "yok ise" + }, + "errors": { + "no_filter": "Bir filtre seçili değil", + "empty_group": "Grup bir eleman içermiyor", + "radio_empty": "Seçim yapılmalı", + "checkbox_empty": "Seçim yapılmalı", + "select_empty": "Seçim yapılmalı", + "string_empty": "Bir metin girilmeli", + "string_exceed_min_length": "En az {0} karakter girilmeli", + "string_exceed_max_length": "En fazla {0} karakter girilebilir", + "string_invalid_format": "Uyumsuz format ({0})", + "number_nan": "Sayı değil", + "number_not_integer": "Tam sayı değil", + "number_not_double": "Ondalıklı sayı değil", + "number_exceed_min": "Sayı {0}'den/dan daha büyük olmalı", + "number_exceed_max": "Sayı {0}'den/dan daha küçük olmalı", + "number_wrong_step": "{0} veya katı olmalı", + "number_between_invalid": "Geçersiz değerler, {0} değeri {1} değerinden büyük", + "datetime_empty": "Tarih Seçilmemiş", + "datetime_invalid": "Uygun olmayan tarih formatı ({0})", + "datetime_exceed_min": "{0} Tarihinden daha sonrası olmalı.", + "datetime_exceed_max": "{0} Tarihinden daha öncesi olmalı.", + "datetime_between_invalid": "Geçersiz değerler, {0} değeri {1} değerinden büyük", + "boolean_not_valid": "Değer Doğru/Yanlış(bool) olmalı", + "operator_not_multiple": "Operatör \"{1}\" birden fazla değer kabul etmiyor" + }, + "invert": "Ters Çevir" +}; + +QueryBuilder.defaults({ lang_code: 'tr' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.ua.js b/dist/i18n/query-builder.ua.js new file mode 100644 index 00000000..2ddd3829 --- /dev/null +++ b/dist/i18n/query-builder.ua.js @@ -0,0 +1,79 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Ukrainian (ua) + * Author: Megaplan, mborisv + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['ua'] = { + "__locale": "Ukrainian (ua)", + "__author": "Megaplan, mborisv ", + "add_rule": "Додати", + "add_group": "Додати групу", + "delete_rule": "Видалити", + "delete_group": "Видалити", + "conditions": { + "AND": "І", + "OR": "АБО" + }, + "operators": { + "equal": "дорівнює", + "not_equal": "не дорівнює", + "in": "з вказаних", + "not_in": "не з вказаних", + "less": "менше", + "less_or_equal": "менше або дорівнюж", + "greater": "більше", + "greater_or_equal": "більше або дорівнює", + "between": "між", + "begins_with": "починається з", + "not_begins_with": "не починається з", + "contains": "містить", + "not_contains": "не містить", + "ends_with": "закінчується на", + "not_ends_with": "не не закінчується на", + "is_empty": "порожній рядок", + "is_not_empty": "не порожній рядок", + "is_null": "порожньо", + "is_not_null": "не порожньо" + }, + "errors": { + "no_filter": "Фільтр не вибраний", + "empty_group": "Група порожня", + "radio_empty": "Значення не вибрано", + "checkbox_empty": "Значення не вибрано", + "select_empty": "Значення не вибрано", + "string_empty": "Не заповнено", + "string_exceed_min_length": "Повинен містити більше {0} символів", + "string_exceed_max_length": "Повинен містити менше {0} символів", + "string_invalid_format": "Невірний формат ({0})", + "number_nan": "Не число", + "number_not_integer": "Не число", + "number_not_double": "Не число", + "number_exceed_min": "Повинне бути більше {0}", + "number_exceed_max": "Повинне бути менше, ніж {0}", + "number_wrong_step": "Повинне бути кратне {0}", + "datetime_empty": "Не заповнено", + "datetime_invalid": "Невірний формат дати ({0})", + "datetime_exceed_min": "Повинне бути, після {0}", + "datetime_exceed_max": "Повинне бути, до {0}", + "boolean_not_valid": "Не логічне", + "operator_not_multiple": "Оператор \"{1}\" не підтримує багато значень" + }, + "invert": "інвертувати" +}; + +QueryBuilder.defaults({ lang_code: 'ua' }); +})); \ No newline at end of file diff --git a/dist/i18n/query-builder.zh-CN.js b/dist/i18n/query-builder.zh-CN.js new file mode 100644 index 00000000..42312498 --- /dev/null +++ b/dist/i18n/query-builder.zh-CN.js @@ -0,0 +1,80 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Locale: Simplified Chinese (zh_CN) + * Author: shadowwind, shatteredwindgo@gmail.com + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ + +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'query-builder'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +"use strict"; + +var QueryBuilder = $.fn.queryBuilder; + +QueryBuilder.regional['zh-CN'] = { + "__locale": "Simplified Chinese (zh_CN)", + "__author": "shadowwind, shatteredwindgo@gmail.com", + "add_rule": "添加规则", + "add_group": "添加组", + "delete_rule": "删除", + "delete_group": "删除组", + "conditions": { + "AND": "和", + "OR": "或" + }, + "operators": { + "equal": "等于", + "not_equal": "不等于", + "in": "在...之內", + "not_in": "不在...之內", + "less": "小于", + "less_or_equal": "小于或等于", + "greater": "大于", + "greater_or_equal": "大于或等于", + "between": "在...之间", + "not_between": "不在...之间", + "begins_with": "以...开始", + "not_begins_with": "不以...开始", + "contains": "包含以下内容", + "not_contains": "不包含以下内容", + "ends_with": "以...结束", + "not_ends_with": "不以...结束", + "is_empty": "为空", + "is_not_empty": "不为空", + "is_null": "为 null", + "is_not_null": "不为 null" + }, + "errors": { + "no_filter": "没有选择过滤器", + "empty_group": "该组为空", + "radio_empty": "没有选中项", + "checkbox_empty": "没有选中项", + "select_empty": "没有选中项", + "string_empty": "没有输入值", + "string_exceed_min_length": "必须至少包含{0}个字符", + "string_exceed_max_length": "必须不超过{0}个字符", + "string_invalid_format": "无效格式({0})", + "number_nan": "值不是数字", + "number_not_integer": "不是整数", + "number_not_double": "不是浮点数", + "number_exceed_min": "必须大于{0}", + "number_exceed_max": "必须小于{0}", + "number_wrong_step": "必须是{0}的倍数", + "datetime_empty": "值为空", + "datetime_invalid": "不是有效日期({0})", + "datetime_exceed_min": "必须在{0}之后", + "datetime_exceed_max": "必须在{0}之前", + "boolean_not_valid": "不是布尔值", + "operator_not_multiple": "选项\"{1}\"无法接受多个值" + }, + "invert": "倒置" +}; + +QueryBuilder.defaults({ lang_code: 'zh-CN' }); +})); \ No newline at end of file diff --git a/dist/js/query-builder.js b/dist/js/query-builder.js new file mode 100644 index 00000000..7fe3cf6e --- /dev/null +++ b/dist/js/query-builder.js @@ -0,0 +1,6316 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Copyright 2014-2022 Damien "Mistic" Sorel (http://www.strangeplanet.fr) + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ +(function(root, factory) { + if (typeof define == 'function' && define.amd) { + define(['jquery', 'dot/doT', 'jquery-extendext'], factory); + } + else if (typeof module === 'object' && module.exports) { + module.exports = factory(require('jquery'), require('dot/doT'), require('jquery-extendext')); + } + else { + factory(root.jQuery, root.doT); + } +}(this, function($, doT) { +"use strict"; + +/** + * @typedef {object} Filter + * @memberof QueryBuilder + * @description See {@link http://querybuilder.js.org/index.html#filters} + */ + +/** + * @typedef {object} Operator + * @memberof QueryBuilder + * @description See {@link http://querybuilder.js.org/index.html#operators} + */ + +/** + * @param {jQuery} $el + * @param {object} options - see {@link http://querybuilder.js.org/#options} + * @constructor + */ +var QueryBuilder = function($el, options) { + $el[0].queryBuilder = this; + + /** + * Element container + * @member {jQuery} + * @readonly + */ + this.$el = $el; + + /** + * Configuration object + * @member {object} + * @readonly + */ + this.settings = $.extendext(true, 'replace', {}, QueryBuilder.DEFAULTS, options); + + /** + * Internal model + * @member {Model} + * @readonly + */ + this.model = new Model(); + + /** + * Internal status + * @member {object} + * @property {string} id - id of the container + * @property {boolean} generated_id - if the container id has been generated + * @property {int} group_id - current group id + * @property {int} rule_id - current rule id + * @property {boolean} has_optgroup - if filters have optgroups + * @property {boolean} has_operator_optgroup - if operators have optgroups + * @readonly + * @private + */ + this.status = { + id: null, + generated_id: false, + group_id: 0, + rule_id: 0, + has_optgroup: false, + has_operator_optgroup: false + }; + + /** + * List of filters + * @member {QueryBuilder.Filter[]} + * @readonly + */ + this.filters = this.settings.filters; + + /** + * List of icons + * @member {object.} + * @readonly + */ + this.icons = this.settings.icons; + + /** + * List of operators + * @member {QueryBuilder.Operator[]} + * @readonly + */ + this.operators = this.settings.operators; + + /** + * List of templates + * @member {object.} + * @readonly + */ + this.templates = this.settings.templates; + + /** + * Plugins configuration + * @member {object.} + * @readonly + */ + this.plugins = this.settings.plugins; + + /** + * Translations object + * @member {object} + * @readonly + */ + this.lang = null; + + // translations : english << 'lang_code' << custom + if (QueryBuilder.regional['en'] === undefined) { + Utils.error('Config', '"i18n/en.js" not loaded.'); + } + this.lang = $.extendext(true, 'replace', {}, QueryBuilder.regional['en'], QueryBuilder.regional[this.settings.lang_code], this.settings.lang); + + // "allow_groups" can be boolean or int + if (this.settings.allow_groups === false) { + this.settings.allow_groups = 0; + } + else if (this.settings.allow_groups === true) { + this.settings.allow_groups = -1; + } + + // init templates + Object.keys(this.templates).forEach(function(tpl) { + if (!this.templates[tpl]) { + this.templates[tpl] = QueryBuilder.templates[tpl]; + } + if (typeof this.templates[tpl] == 'string') { + this.templates[tpl] = doT.template(this.templates[tpl]); + } + }, this); + + // ensure we have a container id + if (!this.$el.attr('id')) { + this.$el.attr('id', 'qb_' + Math.floor(Math.random() * 99999)); + this.status.generated_id = true; + } + this.status.id = this.$el.attr('id'); + + // INIT + this.$el.addClass('query-builder form-inline'); + + this.filters = this.checkFilters(this.filters); + this.operators = this.checkOperators(this.operators); + this.bindEvents(); + this.initPlugins(); +}; + +$.extend(QueryBuilder.prototype, /** @lends QueryBuilder.prototype */ { + /** + * Triggers an event on the builder container + * @param {string} type + * @returns {$.Event} + */ + trigger: function(type) { + var event = new $.Event(this._tojQueryEvent(type), { + builder: this + }); + + this.$el.triggerHandler(event, Array.prototype.slice.call(arguments, 1)); + + return event; + }, + + /** + * Triggers an event on the builder container and returns the modified value + * @param {string} type + * @param {*} value + * @returns {*} + */ + change: function(type, value) { + var event = new $.Event(this._tojQueryEvent(type, true), { + builder: this, + value: value + }); + + this.$el.triggerHandler(event, Array.prototype.slice.call(arguments, 2)); + + return event.value; + }, + + /** + * Attaches an event listener on the builder container + * @param {string} type + * @param {function} cb + * @returns {QueryBuilder} + */ + on: function(type, cb) { + this.$el.on(this._tojQueryEvent(type), cb); + return this; + }, + + /** + * Removes an event listener from the builder container + * @param {string} type + * @param {function} [cb] + * @returns {QueryBuilder} + */ + off: function(type, cb) { + this.$el.off(this._tojQueryEvent(type), cb); + return this; + }, + + /** + * Attaches an event listener called once on the builder container + * @param {string} type + * @param {function} cb + * @returns {QueryBuilder} + */ + once: function(type, cb) { + this.$el.one(this._tojQueryEvent(type), cb); + return this; + }, + + /** + * Appends `.queryBuilder` and optionally `.filter` to the events names + * @param {string} name + * @param {boolean} [filter=false] + * @returns {string} + * @private + */ + _tojQueryEvent: function(name, filter) { + return name.split(' ').map(function(type) { + return type + '.queryBuilder' + (filter ? '.filter' : ''); + }).join(' '); + } +}); + + +/** + * Allowed types and their internal representation + * @type {object.} + * @readonly + * @private + */ +QueryBuilder.types = { + 'string': 'string', + 'integer': 'number', + 'double': 'number', + 'date': 'datetime', + 'time': 'datetime', + 'datetime': 'datetime', + 'boolean': 'boolean' +}; + +/** + * Allowed inputs + * @type {string[]} + * @readonly + * @private + */ +QueryBuilder.inputs = [ + 'text', + 'number', + 'textarea', + 'radio', + 'checkbox', + 'select' +]; + +/** + * Runtime modifiable options with `setOptions` method + * @type {string[]} + * @readonly + * @private + */ +QueryBuilder.modifiable_options = [ + 'display_errors', + 'allow_groups', + 'allow_empty', + 'default_condition', + 'default_filter' +]; + +/** + * CSS selectors for common components + * @type {object.} + * @readonly + */ +QueryBuilder.selectors = { + group_container: '.rules-group-container', + rule_container: '.rule-container', + filter_container: '.rule-filter-container', + operator_container: '.rule-operator-container', + value_container: '.rule-value-container', + error_container: '.error-container', + condition_container: '.rules-group-header .group-conditions', + + rule_header: '.rule-header', + group_header: '.rules-group-header', + group_actions: '.group-actions', + rule_actions: '.rule-actions', + + rules_list: '.rules-group-body>.rules-list', + + group_condition: '.rules-group-header [name$=_cond]', + rule_filter: '.rule-filter-container [name$=_filter]', + rule_operator: '.rule-operator-container [name$=_operator]', + rule_value: '.rule-value-container [name*=_value_]', + + add_rule: '[data-add=rule]', + delete_rule: '[data-delete=rule]', + add_group: '[data-add=group]', + delete_group: '[data-delete=group]' +}; + +/** + * Template strings (see template.js) + * @type {object.} + * @readonly + */ +QueryBuilder.templates = {}; + +/** + * Localized strings (see i18n/) + * @type {object.} + * @readonly + */ +QueryBuilder.regional = {}; + +/** + * Default operators + * @type {object.} + * @readonly + */ +QueryBuilder.OPERATORS = { + equal: { type: 'equal', nb_inputs: 1, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean'] }, + not_equal: { type: 'not_equal', nb_inputs: 1, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean'] }, + in: { type: 'in', nb_inputs: 1, multiple: true, apply_to: ['string', 'number', 'datetime'] }, + not_in: { type: 'not_in', nb_inputs: 1, multiple: true, apply_to: ['string', 'number', 'datetime'] }, + less: { type: 'less', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] }, + less_or_equal: { type: 'less_or_equal', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] }, + greater: { type: 'greater', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] }, + greater_or_equal: { type: 'greater_or_equal', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] }, + between: { type: 'between', nb_inputs: 2, multiple: false, apply_to: ['number', 'datetime'] }, + not_between: { type: 'not_between', nb_inputs: 2, multiple: false, apply_to: ['number', 'datetime'] }, + begins_with: { type: 'begins_with', nb_inputs: 1, multiple: false, apply_to: ['string'] }, + not_begins_with: { type: 'not_begins_with', nb_inputs: 1, multiple: false, apply_to: ['string'] }, + contains: { type: 'contains', nb_inputs: 1, multiple: false, apply_to: ['string'] }, + not_contains: { type: 'not_contains', nb_inputs: 1, multiple: false, apply_to: ['string'] }, + ends_with: { type: 'ends_with', nb_inputs: 1, multiple: false, apply_to: ['string'] }, + not_ends_with: { type: 'not_ends_with', nb_inputs: 1, multiple: false, apply_to: ['string'] }, + is_empty: { type: 'is_empty', nb_inputs: 0, multiple: false, apply_to: ['string'] }, + is_not_empty: { type: 'is_not_empty', nb_inputs: 0, multiple: false, apply_to: ['string'] }, + is_null: { type: 'is_null', nb_inputs: 0, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean'] }, + is_not_null: { type: 'is_not_null', nb_inputs: 0, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean'] } +}; + +/** + * Default configuration + * @type {object} + * @readonly + */ +QueryBuilder.DEFAULTS = { + filters: [], + plugins: [], + + sort_filters: false, + display_errors: true, + allow_groups: -1, + allow_empty: false, + conditions: ['AND', 'OR'], + default_condition: 'AND', + inputs_separator: ' , ', + select_placeholder: '------', + display_empty_filter: true, + default_filter: null, + optgroups: {}, + + default_rule_flags: { + filter_readonly: false, + operator_readonly: false, + value_readonly: false, + no_delete: false + }, + + default_group_flags: { + condition_readonly: false, + no_add_rule: false, + no_add_group: false, + no_delete: false + }, + + templates: { + group: null, + rule: null, + filterSelect: null, + operatorSelect: null, + ruleValueSelect: null + }, + + lang_code: 'en', + lang: {}, + + operators: [ + 'equal', + 'not_equal', + 'in', + 'not_in', + 'less', + 'less_or_equal', + 'greater', + 'greater_or_equal', + 'between', + 'not_between', + 'begins_with', + 'not_begins_with', + 'contains', + 'not_contains', + 'ends_with', + 'not_ends_with', + 'is_empty', + 'is_not_empty', + 'is_null', + 'is_not_null' + ], + + icons: { + add_group: 'glyphicon glyphicon-plus-sign', + add_rule: 'glyphicon glyphicon-plus', + remove_group: 'glyphicon glyphicon-remove', + remove_rule: 'glyphicon glyphicon-remove', + error: 'glyphicon glyphicon-warning-sign' + } +}; + + +/** + * @module plugins + */ + +/** + * Definition of available plugins + * @type {object.} + */ +QueryBuilder.plugins = {}; + +/** + * Gets or extends the default configuration + * @param {object} [options] - new configuration + * @returns {undefined|object} nothing or configuration object (copy) + */ +QueryBuilder.defaults = function(options) { + if (typeof options == 'object') { + $.extendext(true, 'replace', QueryBuilder.DEFAULTS, options); + } + else if (typeof options == 'string') { + if (typeof QueryBuilder.DEFAULTS[options] == 'object') { + return $.extend(true, {}, QueryBuilder.DEFAULTS[options]); + } + else { + return QueryBuilder.DEFAULTS[options]; + } + } + else { + return $.extend(true, {}, QueryBuilder.DEFAULTS); + } +}; + +/** + * Registers a new plugin + * @param {string} name + * @param {function} fct - init function + * @param {object} [def] - default options + */ +QueryBuilder.define = function(name, fct, def) { + QueryBuilder.plugins[name] = { + fct: fct, + def: def || {} + }; +}; + +/** + * Adds new methods to QueryBuilder prototype + * @param {object.} methods + */ +QueryBuilder.extend = function(methods) { + $.extend(QueryBuilder.prototype, methods); +}; + +/** + * Initializes plugins for an instance + * @throws ConfigError + * @private + */ +QueryBuilder.prototype.initPlugins = function() { + if (!this.plugins) { + return; + } + + if ($.isArray(this.plugins)) { + var tmp = {}; + this.plugins.forEach(function(plugin) { + tmp[plugin] = null; + }); + this.plugins = tmp; + } + + Object.keys(this.plugins).forEach(function(plugin) { + if (plugin in QueryBuilder.plugins) { + this.plugins[plugin] = $.extend(true, {}, + QueryBuilder.plugins[plugin].def, + this.plugins[plugin] || {} + ); + + QueryBuilder.plugins[plugin].fct.call(this, this.plugins[plugin]); + } + else { + Utils.error('Config', 'Unable to find plugin "{0}"', plugin); + } + }, this); +}; + +/** + * Returns the config of a plugin, if the plugin is not loaded, returns the default config. + * @param {string} name + * @param {string} [property] + * @throws ConfigError + * @returns {*} + */ +QueryBuilder.prototype.getPluginOptions = function(name, property) { + var plugin; + if (this.plugins && this.plugins[name]) { + plugin = this.plugins[name]; + } + else if (QueryBuilder.plugins[name]) { + plugin = QueryBuilder.plugins[name].def; + } + + if (plugin) { + if (property) { + return plugin[property]; + } + else { + return plugin; + } + } + else { + Utils.error('Config', 'Unable to find plugin "{0}"', name); + } +}; + + +/** + * Final initialisation of the builder + * @param {object} [rules] + * @fires QueryBuilder.afterInit + * @private + */ +QueryBuilder.prototype.init = function(rules) { + /** + * When the initilization is done, just before creating the root group + * @event afterInit + * @memberof QueryBuilder + */ + this.trigger('afterInit'); + + if (rules) { + this.setRules(rules); + delete this.settings.rules; + } + else { + this.setRoot(true); + } +}; + +/** + * Checks the configuration of each filter + * @param {QueryBuilder.Filter[]} filters + * @returns {QueryBuilder.Filter[]} + * @throws ConfigError + */ +QueryBuilder.prototype.checkFilters = function(filters) { + var definedFilters = []; + + if (!filters || filters.length === 0) { + Utils.error('Config', 'Missing filters list'); + } + + filters.forEach(function(filter, i) { + if (!filter.id) { + Utils.error('Config', 'Missing filter {0} id', i); + } + if (definedFilters.indexOf(filter.id) != -1) { + Utils.error('Config', 'Filter "{0}" already defined', filter.id); + } + definedFilters.push(filter.id); + + if (!filter.type) { + filter.type = 'string'; + } + else if (!QueryBuilder.types[filter.type]) { + Utils.error('Config', 'Invalid type "{0}"', filter.type); + } + + if (!filter.input) { + filter.input = QueryBuilder.types[filter.type] === 'number' ? 'number' : 'text'; + } + else if (typeof filter.input != 'function' && QueryBuilder.inputs.indexOf(filter.input) == -1) { + Utils.error('Config', 'Invalid input "{0}"', filter.input); + } + + if (filter.operators) { + filter.operators.forEach(function(operator) { + if (typeof operator != 'string') { + Utils.error('Config', 'Filter operators must be global operators types (string)'); + } + }); + } + + if (!filter.field) { + filter.field = filter.id; + } + if (!filter.label) { + filter.label = filter.field; + } + + if (!filter.optgroup) { + filter.optgroup = null; + } + else { + this.status.has_optgroup = true; + + // register optgroup if needed + if (!this.settings.optgroups[filter.optgroup]) { + this.settings.optgroups[filter.optgroup] = filter.optgroup; + } + } + + switch (filter.input) { + case 'radio': + case 'checkbox': + if (!filter.values || filter.values.length < 1) { + Utils.error('Config', 'Missing filter "{0}" values', filter.id); + } + break; + + case 'select': + var cleanValues = []; + filter.has_optgroup = false; + + Utils.iterateOptions(filter.values, function(value, label, optgroup) { + cleanValues.push({ + value: value, + label: label, + optgroup: optgroup || null + }); + + if (optgroup) { + filter.has_optgroup = true; + + // register optgroup if needed + if (!this.settings.optgroups[optgroup]) { + this.settings.optgroups[optgroup] = optgroup; + } + } + }.bind(this)); + + if (filter.has_optgroup) { + filter.values = Utils.groupSort(cleanValues, 'optgroup'); + } + else { + filter.values = cleanValues; + } + + if (filter.placeholder) { + if (filter.placeholder_value === undefined) { + filter.placeholder_value = -1; + } + + filter.values.forEach(function(entry) { + if (entry.value == filter.placeholder_value) { + Utils.error('Config', 'Placeholder of filter "{0}" overlaps with one of its values', filter.id); + } + }); + } + break; + } + }, this); + + if (this.settings.sort_filters) { + if (typeof this.settings.sort_filters == 'function') { + filters.sort(this.settings.sort_filters); + } + else { + var self = this; + filters.sort(function(a, b) { + return self.translate(a.label).localeCompare(self.translate(b.label)); + }); + } + } + + if (this.status.has_optgroup) { + filters = Utils.groupSort(filters, 'optgroup'); + } + + return filters; +}; + +/** + * Checks the configuration of each operator + * @param {QueryBuilder.Operator[]} operators + * @returns {QueryBuilder.Operator[]} + * @throws ConfigError + */ +QueryBuilder.prototype.checkOperators = function(operators) { + var definedOperators = []; + + operators.forEach(function(operator, i) { + if (typeof operator == 'string') { + if (!QueryBuilder.OPERATORS[operator]) { + Utils.error('Config', 'Unknown operator "{0}"', operator); + } + + operators[i] = operator = $.extendext(true, 'replace', {}, QueryBuilder.OPERATORS[operator]); + } + else { + if (!operator.type) { + Utils.error('Config', 'Missing "type" for operator {0}', i); + } + + if (QueryBuilder.OPERATORS[operator.type]) { + operators[i] = operator = $.extendext(true, 'replace', {}, QueryBuilder.OPERATORS[operator.type], operator); + } + + if (operator.nb_inputs === undefined || operator.apply_to === undefined) { + Utils.error('Config', 'Missing "nb_inputs" and/or "apply_to" for operator "{0}"', operator.type); + } + } + + if (definedOperators.indexOf(operator.type) != -1) { + Utils.error('Config', 'Operator "{0}" already defined', operator.type); + } + definedOperators.push(operator.type); + + if (!operator.optgroup) { + operator.optgroup = null; + } + else { + this.status.has_operator_optgroup = true; + + // register optgroup if needed + if (!this.settings.optgroups[operator.optgroup]) { + this.settings.optgroups[operator.optgroup] = operator.optgroup; + } + } + }, this); + + if (this.status.has_operator_optgroup) { + operators = Utils.groupSort(operators, 'optgroup'); + } + + return operators; +}; + +/** + * Adds all events listeners to the builder + * @private + */ +QueryBuilder.prototype.bindEvents = function() { + var self = this; + var Selectors = QueryBuilder.selectors; + + // group condition change + this.$el.on('change.queryBuilder', Selectors.group_condition, function() { + if ($(this).is(':checked')) { + var $group = $(this).closest(Selectors.group_container); + self.getModel($group).condition = $(this).val(); + } + }); + + // rule filter change + this.$el.on('change.queryBuilder', Selectors.rule_filter, function() { + var $rule = $(this).closest(Selectors.rule_container); + self.getModel($rule).filter = self.getFilterById($(this).val()); + }); + + // rule operator change + this.$el.on('change.queryBuilder', Selectors.rule_operator, function() { + var $rule = $(this).closest(Selectors.rule_container); + self.getModel($rule).operator = self.getOperatorByType($(this).val()); + }); + + // add rule button + this.$el.on('click.queryBuilder', Selectors.add_rule, function() { + var $group = $(this).closest(Selectors.group_container); + self.addRule(self.getModel($group)); + }); + + // delete rule button + this.$el.on('click.queryBuilder', Selectors.delete_rule, function() { + var $rule = $(this).closest(Selectors.rule_container); + self.deleteRule(self.getModel($rule)); + }); + + if (this.settings.allow_groups !== 0) { + // add group button + this.$el.on('click.queryBuilder', Selectors.add_group, function() { + var $group = $(this).closest(Selectors.group_container); + self.addGroup(self.getModel($group)); + }); + + // delete group button + this.$el.on('click.queryBuilder', Selectors.delete_group, function() { + var $group = $(this).closest(Selectors.group_container); + self.deleteGroup(self.getModel($group)); + }); + } + + // model events + this.model.on({ + 'drop': function(e, node) { + node.$el.remove(); + self.refreshGroupsConditions(); + }, + 'add': function(e, parent, node, index) { + if (index === 0) { + node.$el.prependTo(parent.$el.find('>' + QueryBuilder.selectors.rules_list)); + } + else { + node.$el.insertAfter(parent.rules[index - 1].$el); + } + self.refreshGroupsConditions(); + }, + 'move': function(e, node, group, index) { + node.$el.detach(); + + if (index === 0) { + node.$el.prependTo(group.$el.find('>' + QueryBuilder.selectors.rules_list)); + } + else { + node.$el.insertAfter(group.rules[index - 1].$el); + } + self.refreshGroupsConditions(); + }, + 'update': function(e, node, field, value, oldValue) { + if (node instanceof Rule) { + switch (field) { + case 'error': + self.updateError(node); + break; + + case 'flags': + self.applyRuleFlags(node); + break; + + case 'filter': + self.updateRuleFilter(node, oldValue); + break; + + case 'operator': + self.updateRuleOperator(node, oldValue); + break; + + case 'value': + self.updateRuleValue(node, oldValue); + break; + } + } + else { + switch (field) { + case 'error': + self.updateError(node); + break; + + case 'flags': + self.applyGroupFlags(node); + break; + + case 'condition': + self.updateGroupCondition(node, oldValue); + break; + } + } + } + }); +}; + +/** + * Creates the root group + * @param {boolean} [addRule=true] - adds a default empty rule + * @param {object} [data] - group custom data + * @param {object} [flags] - flags to apply to the group + * @returns {Group} root group + * @fires QueryBuilder.afterAddGroup + */ +QueryBuilder.prototype.setRoot = function(addRule, data, flags) { + addRule = (addRule === undefined || addRule === true); + + var group_id = this.nextGroupId(); + var $group = $($.parseHTML(this.getGroupTemplate(group_id, 1))); + + this.$el.append($group); + this.model.root = new Group(null, $group); + this.model.root.model = this.model; + + this.model.root.data = data; + this.model.root.flags = $.extend({}, this.settings.default_group_flags, flags); + this.model.root.condition = this.settings.default_condition; + + this.trigger('afterAddGroup', this.model.root); + + if (addRule) { + this.addRule(this.model.root); + } + + return this.model.root; +}; + +/** + * Adds a new group + * @param {Group} parent + * @param {boolean} [addRule=true] - adds a default empty rule + * @param {object} [data] - group custom data + * @param {object} [flags] - flags to apply to the group + * @returns {Group} + * @fires QueryBuilder.beforeAddGroup + * @fires QueryBuilder.afterAddGroup + */ +QueryBuilder.prototype.addGroup = function(parent, addRule, data, flags) { + addRule = (addRule === undefined || addRule === true); + + var level = parent.level + 1; + + /** + * Just before adding a group, can be prevented. + * @event beforeAddGroup + * @memberof QueryBuilder + * @param {Group} parent + * @param {boolean} addRule - if an empty rule will be added in the group + * @param {int} level - nesting level of the group, 1 is the root group + */ + var e = this.trigger('beforeAddGroup', parent, addRule, level); + if (e.isDefaultPrevented()) { + return null; + } + + var group_id = this.nextGroupId(); + var $group = $(this.getGroupTemplate(group_id, level)); + var model = parent.addGroup($group); + + model.data = data; + model.flags = $.extend({}, this.settings.default_group_flags, flags); + model.condition = this.settings.default_condition; + + /** + * Just after adding a group + * @event afterAddGroup + * @memberof QueryBuilder + * @param {Group} group + */ + this.trigger('afterAddGroup', model); + + /** + * After any change in the rules + * @event rulesChanged + * @memberof QueryBuilder + */ + this.trigger('rulesChanged'); + + if (addRule) { + this.addRule(model); + } + + return model; +}; + +/** + * Tries to delete a group. The group is not deleted if at least one rule is flagged `no_delete`. + * @param {Group} group + * @returns {boolean} if the group has been deleted + * @fires QueryBuilder.beforeDeleteGroup + * @fires QueryBuilder.afterDeleteGroup + */ +QueryBuilder.prototype.deleteGroup = function(group) { + if (group.isRoot()) { + return false; + } + + /** + * Just before deleting a group, can be prevented + * @event beforeDeleteGroup + * @memberof QueryBuilder + * @param {Group} parent + */ + var e = this.trigger('beforeDeleteGroup', group); + if (e.isDefaultPrevented()) { + return false; + } + + var del = true; + + group.each('reverse', function(rule) { + del &= this.deleteRule(rule); + }, function(group) { + del &= this.deleteGroup(group); + }, this); + + if (del) { + group.drop(); + + /** + * Just after deleting a group + * @event afterDeleteGroup + * @memberof QueryBuilder + */ + this.trigger('afterDeleteGroup'); + + this.trigger('rulesChanged'); + } + + return del; +}; + +/** + * Performs actions when a group's condition changes + * @param {Group} group + * @param {object} previousCondition + * @fires QueryBuilder.afterUpdateGroupCondition + * @private + */ +QueryBuilder.prototype.updateGroupCondition = function(group, previousCondition) { + group.$el.find('>' + QueryBuilder.selectors.group_condition).each(function() { + var $this = $(this); + $this.prop('checked', $this.val() === group.condition); + $this.parent().toggleClass('active', $this.val() === group.condition); + }); + + /** + * After the group condition has been modified + * @event afterUpdateGroupCondition + * @memberof QueryBuilder + * @param {Group} group + * @param {object} previousCondition + */ + this.trigger('afterUpdateGroupCondition', group, previousCondition); + + this.trigger('rulesChanged'); +}; + +/** + * Updates the visibility of conditions based on number of rules inside each group + * @private + */ +QueryBuilder.prototype.refreshGroupsConditions = function() { + (function walk(group) { + if (!group.flags || (group.flags && !group.flags.condition_readonly)) { + group.$el.find('>' + QueryBuilder.selectors.group_condition).prop('disabled', group.rules.length <= 1) + .parent().toggleClass('disabled', group.rules.length <= 1); + } + + group.each(null, function(group) { + walk(group); + }, this); + }(this.model.root)); +}; + +/** + * Adds a new rule + * @param {Group} parent + * @param {object} [data] - rule custom data + * @param {object} [flags] - flags to apply to the rule + * @returns {Rule} + * @fires QueryBuilder.beforeAddRule + * @fires QueryBuilder.afterAddRule + * @fires QueryBuilder.changer:getDefaultFilter + */ +QueryBuilder.prototype.addRule = function(parent, data, flags) { + /** + * Just before adding a rule, can be prevented + * @event beforeAddRule + * @memberof QueryBuilder + * @param {Group} parent + */ + var e = this.trigger('beforeAddRule', parent); + if (e.isDefaultPrevented()) { + return null; + } + + var rule_id = this.nextRuleId(); + var $rule = $($.parseHTML(this.getRuleTemplate(rule_id))); + var model = parent.addRule($rule); + + model.data = data; + model.flags = $.extend({}, this.settings.default_rule_flags, flags); + + /** + * Just after adding a rule + * @event afterAddRule + * @memberof QueryBuilder + * @param {Rule} rule + */ + this.trigger('afterAddRule', model); + + this.trigger('rulesChanged'); + + this.createRuleFilters(model); + + if (this.settings.default_filter || !this.settings.display_empty_filter) { + /** + * Modifies the default filter for a rule + * @event changer:getDefaultFilter + * @memberof QueryBuilder + * @param {QueryBuilder.Filter} filter + * @param {Rule} rule + * @returns {QueryBuilder.Filter} + */ + model.filter = this.change('getDefaultFilter', + this.getFilterById(this.settings.default_filter || this.filters[0].id), + model + ); + } + + return model; +}; + +/** + * Tries to delete a rule + * @param {Rule} rule + * @returns {boolean} if the rule has been deleted + * @fires QueryBuilder.beforeDeleteRule + * @fires QueryBuilder.afterDeleteRule + */ +QueryBuilder.prototype.deleteRule = function(rule) { + if (rule.flags.no_delete) { + return false; + } + + /** + * Just before deleting a rule, can be prevented + * @event beforeDeleteRule + * @memberof QueryBuilder + * @param {Rule} rule + */ + var e = this.trigger('beforeDeleteRule', rule); + if (e.isDefaultPrevented()) { + return false; + } + + rule.drop(); + + /** + * Just after deleting a rule + * @event afterDeleteRule + * @memberof QueryBuilder + */ + this.trigger('afterDeleteRule'); + + this.trigger('rulesChanged'); + + return true; +}; + +/** + * Creates the filters for a rule + * @param {Rule} rule + * @fires QueryBuilder.changer:getRuleFilters + * @fires QueryBuilder.afterCreateRuleFilters + * @private + */ +QueryBuilder.prototype.createRuleFilters = function(rule) { + /** + * Modifies the list a filters available for a rule + * @event changer:getRuleFilters + * @memberof QueryBuilder + * @param {QueryBuilder.Filter[]} filters + * @param {Rule} rule + * @returns {QueryBuilder.Filter[]} + */ + var filters = this.change('getRuleFilters', this.filters, rule); + var $filterSelect = $($.parseHTML(this.getRuleFilterSelect(rule, filters))); + + rule.$el.find(QueryBuilder.selectors.filter_container).html($filterSelect); + + /** + * After creating the dropdown for filters + * @event afterCreateRuleFilters + * @memberof QueryBuilder + * @param {Rule} rule + */ + this.trigger('afterCreateRuleFilters', rule); + + this.applyRuleFlags(rule); +}; + +/** + * Creates the operators for a rule and init the rule operator + * @param {Rule} rule + * @fires QueryBuilder.afterCreateRuleOperators + * @private + */ +QueryBuilder.prototype.createRuleOperators = function(rule) { + var $operatorContainer = rule.$el.find(QueryBuilder.selectors.operator_container).empty(); + + if (!rule.filter) { + return; + } + + var operators = this.getOperators(rule.filter); + var $operatorSelect = $($.parseHTML(this.getRuleOperatorSelect(rule, operators))); + + $operatorContainer.html($operatorSelect); + + // set the operator without triggering update event + if (rule.filter.default_operator) { + rule.__.operator = this.getOperatorByType(rule.filter.default_operator); + } + else { + rule.__.operator = operators[0]; + } + + rule.$el.find(QueryBuilder.selectors.rule_operator).val(rule.operator.type); + + /** + * After creating the dropdown for operators + * @event afterCreateRuleOperators + * @memberof QueryBuilder + * @param {Rule} rule + * @param {QueryBuilder.Operator[]} operators - allowed operators for this rule + */ + this.trigger('afterCreateRuleOperators', rule, operators); + + this.applyRuleFlags(rule); +}; + +/** + * Creates the main input for a rule + * @param {Rule} rule + * @fires QueryBuilder.afterCreateRuleInput + * @private + */ +QueryBuilder.prototype.createRuleInput = function(rule) { + var $valueContainer = rule.$el.find(QueryBuilder.selectors.value_container).empty(); + + rule.__.value = undefined; + + if (!rule.filter || !rule.operator || rule.operator.nb_inputs === 0) { + return; + } + + var self = this; + var $inputs = $(); + var filter = rule.filter; + + for (var i = 0; i < rule.operator.nb_inputs; i++) { + var $ruleInput = $($.parseHTML($.trim(this.getRuleInput(rule, i)))); + if (i > 0) $valueContainer.append(this.settings.inputs_separator); + $valueContainer.append($ruleInput); + $inputs = $inputs.add($ruleInput); + } + + $valueContainer.css('display', ''); + + $inputs.on('change ' + (filter.input_event || ''), function() { + if (!rule._updating_input) { + rule._updating_value = true; + rule.value = self.getRuleInputValue(rule); + rule._updating_value = false; + } + }); + + if (filter.plugin) { + $inputs[filter.plugin](filter.plugin_config || {}); + } + + /** + * After creating the input for a rule and initializing optional plugin + * @event afterCreateRuleInput + * @memberof QueryBuilder + * @param {Rule} rule + */ + this.trigger('afterCreateRuleInput', rule); + + if (filter.default_value !== undefined) { + rule.value = filter.default_value; + } + else { + rule._updating_value = true; + rule.value = self.getRuleInputValue(rule); + rule._updating_value = false; + } + + this.applyRuleFlags(rule); +}; + +/** + * Performs action when a rule's filter changes + * @param {Rule} rule + * @param {object} previousFilter + * @fires QueryBuilder.afterUpdateRuleFilter + * @private + */ +QueryBuilder.prototype.updateRuleFilter = function(rule, previousFilter) { + this.createRuleOperators(rule); + this.createRuleInput(rule); + + rule.$el.find(QueryBuilder.selectors.rule_filter).val(rule.filter ? rule.filter.id : '-1'); + + // clear rule data if the filter changed + if (previousFilter && rule.filter && previousFilter.id !== rule.filter.id) { + rule.data = undefined; + } + + /** + * After the filter has been updated and the operators and input re-created + * @event afterUpdateRuleFilter + * @memberof QueryBuilder + * @param {Rule} rule + * @param {object} previousFilter + */ + this.trigger('afterUpdateRuleFilter', rule, previousFilter); + + this.trigger('rulesChanged'); +}; + +/** + * Performs actions when a rule's operator changes + * @param {Rule} rule + * @param {object} previousOperator + * @fires QueryBuilder.afterUpdateRuleOperator + * @private + */ +QueryBuilder.prototype.updateRuleOperator = function(rule, previousOperator) { + var $valueContainer = rule.$el.find(QueryBuilder.selectors.value_container); + + if (!rule.operator || rule.operator.nb_inputs === 0) { + $valueContainer.hide(); + + rule.__.value = undefined; + } + else { + $valueContainer.css('display', ''); + + if ($valueContainer.is(':empty') || !previousOperator || + rule.operator.nb_inputs !== previousOperator.nb_inputs || + rule.operator.optgroup !== previousOperator.optgroup + ) { + this.createRuleInput(rule); + } + } + + if (rule.operator) { + rule.$el.find(QueryBuilder.selectors.rule_operator).val(rule.operator.type); + + // refresh value if the format changed for this operator + rule.__.value = this.getRuleInputValue(rule); + } + + /** + * After the operator has been updated and the input optionally re-created + * @event afterUpdateRuleOperator + * @memberof QueryBuilder + * @param {Rule} rule + * @param {object} previousOperator + */ + this.trigger('afterUpdateRuleOperator', rule, previousOperator); + + this.trigger('rulesChanged'); +}; + +/** + * Performs actions when rule's value changes + * @param {Rule} rule + * @param {object} previousValue + * @fires QueryBuilder.afterUpdateRuleValue + * @private + */ +QueryBuilder.prototype.updateRuleValue = function(rule, previousValue) { + if (!rule._updating_value) { + this.setRuleInputValue(rule, rule.value); + } + + /** + * After the rule value has been modified + * @event afterUpdateRuleValue + * @memberof QueryBuilder + * @param {Rule} rule + * @param {*} previousValue + */ + this.trigger('afterUpdateRuleValue', rule, previousValue); + + this.trigger('rulesChanged'); +}; + +/** + * Changes a rule's properties depending on its flags + * @param {Rule} rule + * @fires QueryBuilder.afterApplyRuleFlags + * @private + */ +QueryBuilder.prototype.applyRuleFlags = function(rule) { + var flags = rule.flags; + var Selectors = QueryBuilder.selectors; + + rule.$el.find(Selectors.rule_filter).prop('disabled', flags.filter_readonly); + rule.$el.find(Selectors.rule_operator).prop('disabled', flags.operator_readonly); + rule.$el.find(Selectors.rule_value).prop('disabled', flags.value_readonly); + + if (flags.no_delete) { + rule.$el.find(Selectors.delete_rule).remove(); + } + + /** + * After rule's flags has been applied + * @event afterApplyRuleFlags + * @memberof QueryBuilder + * @param {Rule} rule + */ + this.trigger('afterApplyRuleFlags', rule); +}; + +/** + * Changes group's properties depending on its flags + * @param {Group} group + * @fires QueryBuilder.afterApplyGroupFlags + * @private + */ +QueryBuilder.prototype.applyGroupFlags = function(group) { + var flags = group.flags; + var Selectors = QueryBuilder.selectors; + + group.$el.find('>' + Selectors.group_condition).prop('disabled', flags.condition_readonly) + .parent().toggleClass('readonly', flags.condition_readonly); + + if (flags.no_add_rule) { + group.$el.find(Selectors.add_rule).remove(); + } + if (flags.no_add_group) { + group.$el.find(Selectors.add_group).remove(); + } + if (flags.no_delete) { + group.$el.find(Selectors.delete_group).remove(); + } + + /** + * After group's flags has been applied + * @event afterApplyGroupFlags + * @memberof QueryBuilder + * @param {Group} group + */ + this.trigger('afterApplyGroupFlags', group); +}; + +/** + * Clears all errors markers + * @param {Node} [node] default is root Group + */ +QueryBuilder.prototype.clearErrors = function(node) { + node = node || this.model.root; + + if (!node) { + return; + } + + node.error = null; + + if (node instanceof Group) { + node.each(function(rule) { + rule.error = null; + }, function(group) { + this.clearErrors(group); + }, this); + } +}; + +/** + * Adds/Removes error on a Rule or Group + * @param {Node} node + * @fires QueryBuilder.changer:displayError + * @private + */ +QueryBuilder.prototype.updateError = function(node) { + if (this.settings.display_errors) { + if (node.error === null) { + node.$el.removeClass('has-error'); + } + else { + var errorMessage = this.translate('errors', node.error[0]); + errorMessage = Utils.fmt(errorMessage, node.error.slice(1)); + + /** + * Modifies an error message before display + * @event changer:displayError + * @memberof QueryBuilder + * @param {string} errorMessage - the error message (translated and formatted) + * @param {array} error - the raw error array (error code and optional arguments) + * @param {Node} node + * @returns {string} + */ + errorMessage = this.change('displayError', errorMessage, node.error, node); + + node.$el.addClass('has-error') + .find(QueryBuilder.selectors.error_container).eq(0) + .attr('title', errorMessage); + } + } +}; + +/** + * Triggers a validation error event + * @param {Node} node + * @param {string|array} error + * @param {*} value + * @fires QueryBuilder.validationError + * @private + */ +QueryBuilder.prototype.triggerValidationError = function(node, error, value) { + if (!$.isArray(error)) { + error = [error]; + } + + /** + * Fired when a validation error occurred, can be prevented + * @event validationError + * @memberof QueryBuilder + * @param {Node} node + * @param {string} error + * @param {*} value + */ + var e = this.trigger('validationError', node, error, value); + if (!e.isDefaultPrevented()) { + node.error = error; + } +}; + + +/** + * Destroys the builder + * @fires QueryBuilder.beforeDestroy + */ +QueryBuilder.prototype.destroy = function() { + /** + * Before the {@link QueryBuilder#destroy} method + * @event beforeDestroy + * @memberof QueryBuilder + */ + this.trigger('beforeDestroy'); + + if (this.status.generated_id) { + this.$el.removeAttr('id'); + } + + this.clear(); + this.model = null; + + this.$el + .off('.queryBuilder') + .removeClass('query-builder') + .removeData('queryBuilder'); + + delete this.$el[0].queryBuilder; +}; + +/** + * Clear all rules and resets the root group + * @fires QueryBuilder.beforeReset + * @fires QueryBuilder.afterReset + */ +QueryBuilder.prototype.reset = function() { + /** + * Before the {@link QueryBuilder#reset} method, can be prevented + * @event beforeReset + * @memberof QueryBuilder + */ + var e = this.trigger('beforeReset'); + if (e.isDefaultPrevented()) { + return; + } + + this.status.group_id = 1; + this.status.rule_id = 0; + + this.model.root.empty(); + + this.model.root.data = undefined; + this.model.root.flags = $.extend({}, this.settings.default_group_flags); + this.model.root.condition = this.settings.default_condition; + + this.addRule(this.model.root); + + /** + * After the {@link QueryBuilder#reset} method + * @event afterReset + * @memberof QueryBuilder + */ + this.trigger('afterReset'); + + this.trigger('rulesChanged'); +}; + +/** + * Clears all rules and removes the root group + * @fires QueryBuilder.beforeClear + * @fires QueryBuilder.afterClear + */ +QueryBuilder.prototype.clear = function() { + /** + * Before the {@link QueryBuilder#clear} method, can be prevented + * @event beforeClear + * @memberof QueryBuilder + */ + var e = this.trigger('beforeClear'); + if (e.isDefaultPrevented()) { + return; + } + + this.status.group_id = 0; + this.status.rule_id = 0; + + if (this.model.root) { + this.model.root.drop(); + this.model.root = null; + } + + /** + * After the {@link QueryBuilder#clear} method + * @event afterClear + * @memberof QueryBuilder + */ + this.trigger('afterClear'); + + this.trigger('rulesChanged'); +}; + +/** + * Modifies the builder configuration.
+ * Only options defined in QueryBuilder.modifiable_options are modifiable + * @param {object} options + */ +QueryBuilder.prototype.setOptions = function(options) { + $.each(options, function(opt, value) { + if (QueryBuilder.modifiable_options.indexOf(opt) !== -1) { + this.settings[opt] = value; + } + }.bind(this)); +}; + +/** + * Returns the model associated to a DOM object, or the root model + * @param {jQuery} [target] + * @returns {Node} + */ +QueryBuilder.prototype.getModel = function(target) { + if (!target) { + return this.model.root; + } + else if (target instanceof Node) { + return target; + } + else { + return $(target).data('queryBuilderModel'); + } +}; + +/** + * Validates the whole builder + * @param {object} [options] + * @param {boolean} [options.skip_empty=false] - skips validating rules that have no filter selected + * @returns {boolean} + * @fires QueryBuilder.changer:validate + */ +QueryBuilder.prototype.validate = function(options) { + options = $.extend({ + skip_empty: false + }, options); + + this.clearErrors(); + + var self = this; + + var valid = (function parse(group) { + var done = 0; + var errors = 0; + + group.each(function(rule) { + if (!rule.filter && options.skip_empty) { + return; + } + + if (!rule.filter) { + self.triggerValidationError(rule, 'no_filter', null); + errors++; + return; + } + + if (!rule.operator) { + self.triggerValidationError(rule, 'no_operator', null); + errors++; + return; + } + + if (rule.operator.nb_inputs !== 0) { + var valid = self.validateValue(rule, rule.value); + + if (valid !== true) { + self.triggerValidationError(rule, valid, rule.value); + errors++; + return; + } + } + + done++; + + }, function(group) { + var res = parse(group); + if (res === true) { + done++; + } + else if (res === false) { + errors++; + } + }); + + if (errors > 0) { + return false; + } + else if (done === 0 && !group.isRoot() && options.skip_empty) { + return null; + } + else if (done === 0 && (!self.settings.allow_empty || !group.isRoot())) { + self.triggerValidationError(group, 'empty_group', null); + return false; + } + + return true; + + }(this.model.root)); + + /** + * Modifies the result of the {@link QueryBuilder#validate} method + * @event changer:validate + * @memberof QueryBuilder + * @param {boolean} valid + * @returns {boolean} + */ + return this.change('validate', valid); +}; + +/** + * Gets an object representing current rules + * @param {object} [options] + * @param {boolean|string} [options.get_flags=false] - export flags, true: only changes from default flags or 'all' + * @param {boolean} [options.allow_invalid=false] - returns rules even if they are invalid + * @param {boolean} [options.skip_empty=false] - remove rules that have no filter selected + * @returns {object} + * @fires QueryBuilder.changer:ruleToJson + * @fires QueryBuilder.changer:groupToJson + * @fires QueryBuilder.changer:getRules + */ +QueryBuilder.prototype.getRules = function(options) { + options = $.extend({ + get_flags: false, + allow_invalid: false, + skip_empty: false + }, options); + + var valid = this.validate(options); + if (!valid && !options.allow_invalid) { + return null; + } + + var self = this; + + var out = (function parse(group) { + var groupData = { + condition: group.condition, + rules: [] + }; + + if (group.data) { + groupData.data = $.extendext(true, 'replace', {}, group.data); + } + + if (options.get_flags) { + var flags = self.getGroupFlags(group.flags, options.get_flags === 'all'); + if (!$.isEmptyObject(flags)) { + groupData.flags = flags; + } + } + + group.each(function(rule) { + if (!rule.filter && options.skip_empty) { + return; + } + + var value = null; + if (!rule.operator || rule.operator.nb_inputs !== 0) { + value = rule.value; + } + + var ruleData = { + id: rule.filter ? rule.filter.id : null, + field: rule.filter ? rule.filter.field : null, + type: rule.filter ? rule.filter.type : null, + input: rule.filter ? rule.filter.input : null, + operator: rule.operator ? rule.operator.type : null, + value: value + }; + + if (rule.filter && rule.filter.data || rule.data) { + ruleData.data = $.extendext(true, 'replace', {}, rule.filter ? rule.filter.data : {}, rule.data); + } + + if (options.get_flags) { + var flags = self.getRuleFlags(rule.flags, options.get_flags === 'all'); + if (!$.isEmptyObject(flags)) { + ruleData.flags = flags; + } + } + + /** + * Modifies the JSON generated from a Rule object + * @event changer:ruleToJson + * @memberof QueryBuilder + * @param {object} json + * @param {Rule} rule + * @returns {object} + */ + groupData.rules.push(self.change('ruleToJson', ruleData, rule)); + + }, function(model) { + var data = parse(model); + if (data.rules.length !== 0 || !options.skip_empty) { + groupData.rules.push(data); + } + }, this); + + /** + * Modifies the JSON generated from a Group object + * @event changer:groupToJson + * @memberof QueryBuilder + * @param {object} json + * @param {Group} group + * @returns {object} + */ + return self.change('groupToJson', groupData, group); + + }(this.model.root)); + + out.valid = valid; + + /** + * Modifies the result of the {@link QueryBuilder#getRules} method + * @event changer:getRules + * @memberof QueryBuilder + * @param {object} json + * @returns {object} + */ + return this.change('getRules', out); +}; + +/** + * Sets rules from object + * @param {object} data + * @param {object} [options] + * @param {boolean} [options.allow_invalid=false] - silent-fail if the data are invalid + * @throws RulesError, UndefinedConditionError + * @fires QueryBuilder.changer:setRules + * @fires QueryBuilder.changer:jsonToRule + * @fires QueryBuilder.changer:jsonToGroup + * @fires QueryBuilder.afterSetRules + */ +QueryBuilder.prototype.setRules = function(data, options) { + options = $.extend({ + allow_invalid: false + }, options); + + if ($.isArray(data)) { + data = { + condition: this.settings.default_condition, + rules: data + }; + } + + if (!data || !data.rules || (data.rules.length === 0 && !this.settings.allow_empty)) { + Utils.error('RulesParse', 'Incorrect data object passed'); + } + + this.clear(); + this.setRoot(false, data.data, this.parseGroupFlags(data)); + + /** + * Modifies data before the {@link QueryBuilder#setRules} method + * @event changer:setRules + * @memberof QueryBuilder + * @param {object} json + * @param {object} options + * @returns {object} + */ + data = this.change('setRules', data, options); + + var self = this; + + (function add(data, group) { + if (group === null) { + return; + } + + if (data.condition === undefined) { + data.condition = self.settings.default_condition; + } + else if (self.settings.conditions.indexOf(data.condition) == -1) { + Utils.error(!options.allow_invalid, 'UndefinedCondition', 'Invalid condition "{0}"', data.condition); + data.condition = self.settings.default_condition; + } + + group.condition = data.condition; + + data.rules.forEach(function(item) { + var model; + + if (item.rules !== undefined) { + if (self.settings.allow_groups !== -1 && self.settings.allow_groups < group.level) { + Utils.error(!options.allow_invalid, 'RulesParse', 'No more than {0} groups are allowed', self.settings.allow_groups); + self.reset(); + } + else { + model = self.addGroup(group, false, item.data, self.parseGroupFlags(item)); + if (model === null) { + return; + } + + add(item, model); + } + } + else { + if (!item.empty) { + if (item.id === undefined) { + Utils.error(!options.allow_invalid, 'RulesParse', 'Missing rule field id'); + item.empty = true; + } + if (item.operator === undefined) { + item.operator = 'equal'; + } + } + + model = self.addRule(group, item.data, self.parseRuleFlags(item)); + if (model === null) { + return; + } + + if (!item.empty) { + model.filter = self.getFilterById(item.id, !options.allow_invalid); + } + + if (model.filter) { + model.operator = self.getOperatorByType(item.operator, !options.allow_invalid); + + if (!model.operator) { + model.operator = self.getOperators(model.filter)[0]; + } + } + + if (model.operator && model.operator.nb_inputs !== 0) { + if (item.value !== undefined) { + model.value = item.value; + } + else if (model.filter.default_value !== undefined) { + model.value = model.filter.default_value; + } + } + + /** + * Modifies the Rule object generated from the JSON + * @event changer:jsonToRule + * @memberof QueryBuilder + * @param {Rule} rule + * @param {object} json + * @returns {Rule} the same rule + */ + if (self.change('jsonToRule', model, item) != model) { + Utils.error('RulesParse', 'Plugin tried to change rule reference'); + } + } + }); + + /** + * Modifies the Group object generated from the JSON + * @event changer:jsonToGroup + * @memberof QueryBuilder + * @param {Group} group + * @param {object} json + * @returns {Group} the same group + */ + if (self.change('jsonToGroup', group, data) != group) { + Utils.error('RulesParse', 'Plugin tried to change group reference'); + } + + }(data, this.model.root)); + + /** + * After the {@link QueryBuilder#setRules} method + * @event afterSetRules + * @memberof QueryBuilder + */ + this.trigger('afterSetRules'); +}; + + +/** + * Performs value validation + * @param {Rule} rule + * @param {string|string[]} value + * @returns {array|boolean} true or error array + * @fires QueryBuilder.changer:validateValue + */ +QueryBuilder.prototype.validateValue = function(rule, value) { + var validation = rule.filter.validation || {}; + var result = true; + + if (validation.callback) { + result = validation.callback.call(this, value, rule); + } + else { + result = this._validateValue(rule, value); + } + + /** + * Modifies the result of the rule validation method + * @event changer:validateValue + * @memberof QueryBuilder + * @param {array|boolean} result - true or an error array + * @param {*} value + * @param {Rule} rule + * @returns {array|boolean} + */ + return this.change('validateValue', result, value, rule); +}; + +/** + * Default validation function + * @param {Rule} rule + * @param {string|string[]} value + * @returns {array|boolean} true or error array + * @throws ConfigError + * @private + */ +QueryBuilder.prototype._validateValue = function(rule, value) { + var filter = rule.filter; + var operator = rule.operator; + var validation = filter.validation || {}; + var result = true; + var tmp, tempValue; + + if (rule.operator.nb_inputs === 1) { + value = [value]; + } + + for (var i = 0; i < operator.nb_inputs; i++) { + if (!operator.multiple && $.isArray(value[i]) && value[i].length > 1) { + result = ['operator_not_multiple', operator.type, this.translate('operators', operator.type)]; + break; + } + + switch (filter.input) { + case 'radio': + if (value[i] === undefined || value[i].length === 0) { + if (!validation.allow_empty_value) { + result = ['radio_empty']; + } + break; + } + break; + + case 'checkbox': + if (value[i] === undefined || value[i].length === 0) { + if (!validation.allow_empty_value) { + result = ['checkbox_empty']; + } + break; + } + break; + + case 'select': + if (value[i] === undefined || value[i].length === 0 || (filter.placeholder && value[i] == filter.placeholder_value)) { + if (!validation.allow_empty_value) { + result = ['select_empty']; + } + break; + } + break; + + default: + tempValue = $.isArray(value[i]) ? value[i] : [value[i]]; + + for (var j = 0; j < tempValue.length; j++) { + switch (QueryBuilder.types[filter.type]) { + case 'string': + if (tempValue[j] === undefined || tempValue[j].length === 0) { + if (!validation.allow_empty_value) { + result = ['string_empty']; + } + break; + } + if (validation.min !== undefined) { + if (tempValue[j].length < parseInt(validation.min)) { + result = [this.getValidationMessage(validation, 'min', 'string_exceed_min_length'), validation.min]; + break; + } + } + if (validation.max !== undefined) { + if (tempValue[j].length > parseInt(validation.max)) { + result = [this.getValidationMessage(validation, 'max', 'string_exceed_max_length'), validation.max]; + break; + } + } + if (validation.format) { + if (typeof validation.format == 'string') { + validation.format = new RegExp(validation.format); + } + if (!validation.format.test(tempValue[j])) { + result = [this.getValidationMessage(validation, 'format', 'string_invalid_format'), validation.format]; + break; + } + } + break; + + case 'number': + if (tempValue[j] === undefined || tempValue[j].length === 0) { + if (!validation.allow_empty_value) { + result = ['number_nan']; + } + break; + } + if (isNaN(tempValue[j])) { + result = ['number_nan']; + break; + } + if (filter.type == 'integer') { + if (parseInt(tempValue[j]) != tempValue[j]) { + result = ['number_not_integer']; + break; + } + } + else { + if (parseFloat(tempValue[j]) != tempValue[j]) { + result = ['number_not_double']; + break; + } + } + if (validation.min !== undefined) { + if (tempValue[j] < parseFloat(validation.min)) { + result = [this.getValidationMessage(validation, 'min', 'number_exceed_min'), validation.min]; + break; + } + } + if (validation.max !== undefined) { + if (tempValue[j] > parseFloat(validation.max)) { + result = [this.getValidationMessage(validation, 'max', 'number_exceed_max'), validation.max]; + break; + } + } + if (validation.step !== undefined && validation.step !== 'any') { + var v = (tempValue[j] / validation.step).toPrecision(14); + if (parseInt(v) != v) { + result = [this.getValidationMessage(validation, 'step', 'number_wrong_step'), validation.step]; + break; + } + } + break; + + case 'datetime': + if (tempValue[j] === undefined || tempValue[j].length === 0) { + if (!validation.allow_empty_value) { + result = ['datetime_empty']; + } + break; + } + + // we need MomentJS + if (validation.format) { + if (!('moment' in window)) { + Utils.error('MissingLibrary', 'MomentJS is required for Date/Time validation. Get it here http://momentjs.com'); + } + + var datetime = moment(tempValue[j], validation.format); + if (!datetime.isValid()) { + result = [this.getValidationMessage(validation, 'format', 'datetime_invalid'), validation.format]; + break; + } + else { + if (validation.min) { + if (datetime < moment(validation.min, validation.format)) { + result = [this.getValidationMessage(validation, 'min', 'datetime_exceed_min'), validation.min]; + break; + } + } + if (validation.max) { + if (datetime > moment(validation.max, validation.format)) { + result = [this.getValidationMessage(validation, 'max', 'datetime_exceed_max'), validation.max]; + break; + } + } + } + } + break; + + case 'boolean': + if (tempValue[j] === undefined || tempValue[j].length === 0) { + if (!validation.allow_empty_value) { + result = ['boolean_not_valid']; + } + break; + } + tmp = ('' + tempValue[j]).trim().toLowerCase(); + if (tmp !== 'true' && tmp !== 'false' && tmp !== '1' && tmp !== '0' && tempValue[j] !== 1 && tempValue[j] !== 0) { + result = ['boolean_not_valid']; + break; + } + } + + if (result !== true) { + break; + } + } + } + + if (result !== true) { + break; + } + } + + if ((rule.operator.type === 'between' || rule.operator.type === 'not_between') && value.length === 2) { + switch (QueryBuilder.types[filter.type]) { + case 'number': + if (value[0] > value[1]) { + result = ['number_between_invalid', value[0], value[1]]; + } + break; + + case 'datetime': + // we need MomentJS + if (validation.format) { + if (!('moment' in window)) { + Utils.error('MissingLibrary', 'MomentJS is required for Date/Time validation. Get it here http://momentjs.com'); + } + + if (moment(value[0], validation.format).isAfter(moment(value[1], validation.format))) { + result = ['datetime_between_invalid', value[0], value[1]]; + } + } + break; + } + } + + return result; +}; + +/** + * Returns an incremented group ID + * @returns {string} + * @private + */ +QueryBuilder.prototype.nextGroupId = function() { + return this.status.id + '_group_' + (this.status.group_id++); +}; + +/** + * Returns an incremented rule ID + * @returns {string} + * @private + */ +QueryBuilder.prototype.nextRuleId = function() { + return this.status.id + '_rule_' + (this.status.rule_id++); +}; + +/** + * Returns the operators for a filter + * @param {string|object} filter - filter id or filter object + * @returns {object[]} + * @fires QueryBuilder.changer:getOperators + */ +QueryBuilder.prototype.getOperators = function(filter) { + if (typeof filter == 'string') { + filter = this.getFilterById(filter); + } + + var result = []; + + for (var i = 0, l = this.operators.length; i < l; i++) { + // filter operators check + if (filter.operators) { + if (filter.operators.indexOf(this.operators[i].type) == -1) { + continue; + } + } + // type check + else if (this.operators[i].apply_to.indexOf(QueryBuilder.types[filter.type]) == -1) { + continue; + } + + result.push(this.operators[i]); + } + + // keep sort order defined for the filter + if (filter.operators) { + result.sort(function(a, b) { + return filter.operators.indexOf(a.type) - filter.operators.indexOf(b.type); + }); + } + + /** + * Modifies the operators available for a filter + * @event changer:getOperators + * @memberof QueryBuilder + * @param {QueryBuilder.Operator[]} operators + * @param {QueryBuilder.Filter} filter + * @returns {QueryBuilder.Operator[]} + */ + return this.change('getOperators', result, filter); +}; + +/** + * Returns a particular filter by its id + * @param {string} id + * @param {boolean} [doThrow=true] + * @returns {object|null} + * @throws UndefinedFilterError + */ +QueryBuilder.prototype.getFilterById = function(id, doThrow) { + if (id == '-1') { + return null; + } + + for (var i = 0, l = this.filters.length; i < l; i++) { + if (this.filters[i].id == id) { + return this.filters[i]; + } + } + + Utils.error(doThrow !== false, 'UndefinedFilter', 'Undefined filter "{0}"', id); + + return null; +}; + +/** + * Returns a particular operator by its type + * @param {string} type + * @param {boolean} [doThrow=true] + * @returns {object|null} + * @throws UndefinedOperatorError + */ +QueryBuilder.prototype.getOperatorByType = function(type, doThrow) { + if (type == '-1') { + return null; + } + + for (var i = 0, l = this.operators.length; i < l; i++) { + if (this.operators[i].type == type) { + return this.operators[i]; + } + } + + Utils.error(doThrow !== false, 'UndefinedOperator', 'Undefined operator "{0}"', type); + + return null; +}; + +/** + * Returns rule's current input value + * @param {Rule} rule + * @returns {*} + * @fires QueryBuilder.changer:getRuleValue + * @private + */ +QueryBuilder.prototype.getRuleInputValue = function(rule) { + var filter = rule.filter; + var operator = rule.operator; + var value = []; + + if (filter.valueGetter) { + value = filter.valueGetter.call(this, rule); + } + else { + var $value = rule.$el.find(QueryBuilder.selectors.value_container); + + for (var i = 0; i < operator.nb_inputs; i++) { + var name = Utils.escapeElementId(rule.id + '_value_' + i); + var tmp; + + switch (filter.input) { + case 'radio': + value.push($value.find('[name=' + name + ']:checked').val()); + break; + + case 'checkbox': + tmp = []; + // jshint loopfunc:true + $value.find('[name=' + name + ']:checked').each(function() { + tmp.push($(this).val()); + }); + // jshint loopfunc:false + value.push(tmp); + break; + + case 'select': + if (filter.multiple) { + tmp = []; + // jshint loopfunc:true + $value.find('[name=' + name + '] option:selected').each(function() { + tmp.push($(this).val()); + }); + // jshint loopfunc:false + value.push(tmp); + } + else { + value.push($value.find('[name=' + name + '] option:selected').val()); + } + break; + + default: + value.push($value.find('[name=' + name + ']').val()); + } + } + + value = value.map(function(val) { + if (operator.multiple && filter.value_separator && typeof val == 'string') { + val = val.split(filter.value_separator); + } + + if ($.isArray(val)) { + return val.map(function(subval) { + return Utils.changeType(subval, filter.type); + }); + } + else { + return Utils.changeType(val, filter.type); + } + }); + + if (operator.nb_inputs === 1) { + value = value[0]; + } + + // @deprecated + if (filter.valueParser) { + value = filter.valueParser.call(this, rule, value); + } + } + + /** + * Modifies the rule's value grabbed from the DOM + * @event changer:getRuleValue + * @memberof QueryBuilder + * @param {*} value + * @param {Rule} rule + * @returns {*} + */ + return this.change('getRuleValue', value, rule); +}; + +/** + * Sets the value of a rule's input + * @param {Rule} rule + * @param {*} value + * @private + */ +QueryBuilder.prototype.setRuleInputValue = function(rule, value) { + var filter = rule.filter; + var operator = rule.operator; + + if (!filter || !operator) { + return; + } + + rule._updating_input = true; + + if (filter.valueSetter) { + filter.valueSetter.call(this, rule, value); + } + else { + var $value = rule.$el.find(QueryBuilder.selectors.value_container); + + if (operator.nb_inputs == 1) { + value = [value]; + } + + for (var i = 0; i < operator.nb_inputs; i++) { + var name = Utils.escapeElementId(rule.id + '_value_' + i); + + switch (filter.input) { + case 'radio': + $value.find('[name=' + name + '][value="' + value[i] + '"]').prop('checked', true).trigger('change'); + break; + + case 'checkbox': + if (!$.isArray(value[i])) { + value[i] = [value[i]]; + } + // jshint loopfunc:true + value[i].forEach(function(value) { + $value.find('[name=' + name + '][value="' + value + '"]').prop('checked', true).trigger('change'); + }); + // jshint loopfunc:false + break; + + default: + if (operator.multiple && filter.value_separator && $.isArray(value[i])) { + value[i] = value[i].join(filter.value_separator); + } + $value.find('[name=' + name + ']').val(value[i]).trigger('change'); + break; + } + } + } + + rule._updating_input = false; +}; + +/** + * Parses rule flags + * @param {object} rule + * @returns {object} + * @fires QueryBuilder.changer:parseRuleFlags + * @private + */ +QueryBuilder.prototype.parseRuleFlags = function(rule) { + var flags = $.extend({}, this.settings.default_rule_flags); + + if (rule.readonly) { + $.extend(flags, { + filter_readonly: true, + operator_readonly: true, + value_readonly: true, + no_delete: true + }); + } + + if (rule.flags) { + $.extend(flags, rule.flags); + } + + /** + * Modifies the consolidated rule's flags + * @event changer:parseRuleFlags + * @memberof QueryBuilder + * @param {object} flags + * @param {object} rule - not a Rule object + * @returns {object} + */ + return this.change('parseRuleFlags', flags, rule); +}; + +/** + * Gets a copy of flags of a rule + * @param {object} flags + * @param {boolean} [all=false] - return all flags or only changes from default flags + * @returns {object} + * @private + */ +QueryBuilder.prototype.getRuleFlags = function(flags, all) { + if (all) { + return $.extend({}, flags); + } + else { + var ret = {}; + $.each(this.settings.default_rule_flags, function(key, value) { + if (flags[key] !== value) { + ret[key] = flags[key]; + } + }); + return ret; + } +}; + +/** + * Parses group flags + * @param {object} group + * @returns {object} + * @fires QueryBuilder.changer:parseGroupFlags + * @private + */ +QueryBuilder.prototype.parseGroupFlags = function(group) { + var flags = $.extend({}, this.settings.default_group_flags); + + if (group.readonly) { + $.extend(flags, { + condition_readonly: true, + no_add_rule: true, + no_add_group: true, + no_delete: true + }); + } + + if (group.flags) { + $.extend(flags, group.flags); + } + + /** + * Modifies the consolidated group's flags + * @event changer:parseGroupFlags + * @memberof QueryBuilder + * @param {object} flags + * @param {object} group - not a Group object + * @returns {object} + */ + return this.change('parseGroupFlags', flags, group); +}; + +/** + * Gets a copy of flags of a group + * @param {object} flags + * @param {boolean} [all=false] - return all flags or only changes from default flags + * @returns {object} + * @private + */ +QueryBuilder.prototype.getGroupFlags = function(flags, all) { + if (all) { + return $.extend({}, flags); + } + else { + var ret = {}; + $.each(this.settings.default_group_flags, function(key, value) { + if (flags[key] !== value) { + ret[key] = flags[key]; + } + }); + return ret; + } +}; + +/** + * Translate a label either by looking in the `lang` object or in itself if it's an object where keys are language codes + * @param {string} [category] + * @param {string|object} key + * @returns {string} + * @fires QueryBuilder.changer:translate + */ +QueryBuilder.prototype.translate = function(category, key) { + if (!key) { + key = category; + category = undefined; + } + + var translation; + if (typeof key === 'object') { + translation = key[this.settings.lang_code] || key['en']; + } + else { + translation = (category ? this.lang[category] : this.lang)[key] || key; + } + + /** + * Modifies the translated label + * @event changer:translate + * @memberof QueryBuilder + * @param {string} translation + * @param {string|object} key + * @param {string} [category] + * @returns {string} + */ + return this.change('translate', translation, key, category); +}; + +/** + * Returns a validation message + * @param {object} validation + * @param {string} type + * @param {string} def + * @returns {string} + * @private + */ +QueryBuilder.prototype.getValidationMessage = function(validation, type, def) { + return validation.messages && validation.messages[type] || def; +}; + + +QueryBuilder.templates.group = '\ +
\ +
\ +
\ + \ + {{? it.settings.allow_groups===-1 || it.settings.allow_groups>=it.level }} \ + \ + {{?}} \ + {{? it.level>1 }} \ + \ + {{?}} \ +
\ +
\ + {{~ it.conditions: condition }} \ + \ + {{~}} \ +
\ + {{? it.settings.display_errors }} \ +
\ + {{?}} \ +
\ +
\ +
\ +
\ +
'; + +QueryBuilder.templates.rule = '\ +
\ +
\ +
\ + \ +
\ +
\ + {{? it.settings.display_errors }} \ +
\ + {{?}} \ +
\ +
\ +
\ +
'; + +QueryBuilder.templates.filterSelect = '\ +{{ var optgroup = null; }} \ +'; + +QueryBuilder.templates.operatorSelect = '\ +{{? it.operators.length === 1 }} \ + \ +{{= it.translate("operators", it.operators[0].type) }} \ + \ +{{?}} \ +{{ var optgroup = null; }} \ +'; + +QueryBuilder.templates.ruleValueSelect = '\ +{{ var optgroup = null; }} \ +'; + +/** + * Returns group's HTML + * @param {string} group_id + * @param {int} level + * @returns {string} + * @fires QueryBuilder.changer:getGroupTemplate + * @private + */ +QueryBuilder.prototype.getGroupTemplate = function(group_id, level) { + var h = this.templates.group({ + builder: this, + group_id: group_id, + level: level, + conditions: this.settings.conditions, + icons: this.icons, + settings: this.settings, + translate: this.translate.bind(this) + }); + + /** + * Modifies the raw HTML of a group + * @event changer:getGroupTemplate + * @memberof QueryBuilder + * @param {string} html + * @param {int} level + * @returns {string} + */ + return this.change('getGroupTemplate', h, level); +}; + +/** + * Returns rule's HTML + * @param {string} rule_id + * @returns {string} + * @fires QueryBuilder.changer:getRuleTemplate + * @private + */ +QueryBuilder.prototype.getRuleTemplate = function(rule_id) { + var h = this.templates.rule({ + builder: this, + rule_id: rule_id, + icons: this.icons, + settings: this.settings, + translate: this.translate.bind(this) + }); + + /** + * Modifies the raw HTML of a rule + * @event changer:getRuleTemplate + * @memberof QueryBuilder + * @param {string} html + * @returns {string} + */ + return this.change('getRuleTemplate', h); +}; + +/** + * Returns rule's filter HTML + * @param {Rule} rule + * @param {object[]} filters + * @returns {string} + * @fires QueryBuilder.changer:getRuleFilterTemplate + * @private + */ +QueryBuilder.prototype.getRuleFilterSelect = function(rule, filters) { + var h = this.templates.filterSelect({ + builder: this, + rule: rule, + filters: filters, + icons: this.icons, + settings: this.settings, + translate: this.translate.bind(this) + }); + + /** + * Modifies the raw HTML of the rule's filter dropdown + * @event changer:getRuleFilterSelect + * @memberof QueryBuilder + * @param {string} html + * @param {Rule} rule + * @param {QueryBuilder.Filter[]} filters + * @returns {string} + */ + return this.change('getRuleFilterSelect', h, rule, filters); +}; + +/** + * Returns rule's operator HTML + * @param {Rule} rule + * @param {object[]} operators + * @returns {string} + * @fires QueryBuilder.changer:getRuleOperatorTemplate + * @private + */ +QueryBuilder.prototype.getRuleOperatorSelect = function(rule, operators) { + var h = this.templates.operatorSelect({ + builder: this, + rule: rule, + operators: operators, + icons: this.icons, + settings: this.settings, + translate: this.translate.bind(this) + }); + + /** + * Modifies the raw HTML of the rule's operator dropdown + * @event changer:getRuleOperatorSelect + * @memberof QueryBuilder + * @param {string} html + * @param {Rule} rule + * @param {QueryBuilder.Operator[]} operators + * @returns {string} + */ + return this.change('getRuleOperatorSelect', h, rule, operators); +}; + +/** + * Returns the rule's value select HTML + * @param {string} name + * @param {Rule} rule + * @returns {string} + * @fires QueryBuilder.changer:getRuleValueSelect + * @private + */ +QueryBuilder.prototype.getRuleValueSelect = function(name, rule) { + var h = this.templates.ruleValueSelect({ + builder: this, + name: name, + rule: rule, + icons: this.icons, + settings: this.settings, + translate: this.translate.bind(this) + }); + + /** + * Modifies the raw HTML of the rule's value dropdown (in case of a "select filter) + * @event changer:getRuleValueSelect + * @memberof QueryBuilder + * @param {string} html + * @param [string} name + * @param {Rule} rule + * @returns {string} + */ + return this.change('getRuleValueSelect', h, name, rule); +}; + +/** + * Returns the rule's value HTML + * @param {Rule} rule + * @param {int} value_id + * @returns {string} + * @fires QueryBuilder.changer:getRuleInput + * @private + */ +QueryBuilder.prototype.getRuleInput = function(rule, value_id) { + var filter = rule.filter; + var validation = rule.filter.validation || {}; + var name = rule.id + '_value_' + value_id; + var c = filter.vertical ? ' class=block' : ''; + var h = ''; + var placeholder = Array.isArray(filter.placeholder) ? filter.placeholder[value_id] : filter.placeholder; + + if (typeof filter.input == 'function') { + h = filter.input.call(this, rule, name); + } + else { + switch (filter.input) { + case 'radio': + case 'checkbox': + Utils.iterateOptions(filter.values, function(key, val) { + h += ' ' + val + ' '; + }); + break; + + case 'select': + h = this.getRuleValueSelect(name, rule); + break; + + case 'textarea': + h += '";break;case"number":l+=' "})}})},{font:"glyphicons",color:"default"}),c.define("bt-selectpicker",function(r){$.fn.selectpicker&&$.fn.selectpicker.Constructor||m.error("MissingLibrary",'Bootstrap Select is required to use "bt-selectpicker" plugin. Get it here: http://silviomoreto.github.io/bootstrap-select');var i=c.selectors;this.on("afterCreateRuleFilters",function(e,t){t.$el.find(i.rule_filter).removeClass("form-control").selectpicker(r)}),this.on("afterCreateRuleOperators",function(e,t){t.$el.find(i.rule_operator).removeClass("form-control").selectpicker(r)}),this.on("afterUpdateRuleFilter",function(e,t){t.$el.find(i.rule_filter).selectpicker("render")}),this.on("afterUpdateRuleOperator",function(e,t){t.$el.find(i.rule_operator).selectpicker("render")}),this.on("beforeDeleteRule",function(e,t){t.$el.find(i.rule_filter).selectpicker("destroy"),t.$el.find(i.rule_operator).selectpicker("destroy")})},{container:"body",style:"btn-inverse btn-xs",width:"auto",showIcon:!1}),c.define("bt-tooltip-errors",function(i){$.fn.tooltip&&$.fn.tooltip.Constructor&&$.fn.tooltip.Constructor.prototype.fixTitle||m.error("MissingLibrary",'Bootstrap Tooltip is required to use "bt-tooltip-errors" plugin. Get it here: http://getbootstrap.com');var o=this;this.on("getRuleTemplate.filter getGroupTemplate.filter",function(e){var t=$($.parseHTML(e.value));t.find(c.selectors.error_container).attr("data-toggle","tooltip"),e.value=t.prop("outerHTML")}),this.model.on("update",function(e,t,r){"error"==r&&o.settings.display_errors&&t.$el.find(c.selectors.error_container).eq(0).tooltip(i).tooltip("hide").tooltip("fixTitle")})},{placement:"right"}),c.extend({setFilters:function(e,t){var r=this;void 0===t&&(t=e,e=!1),t=this.checkFilters(t);var i=(t=this.change("setFilters",t)).map(function(e){return e.id});if(e||function e(t){t.each(function(e){e.filter&&-1===i.indexOf(e.filter.id)&&m.error("ChangeFilter",'A rule is using filter "{0}"',e.filter.id)},e)}(this.model.root),this.filters=t,function e(t){t.each(!0,function(e){e.filter&&-1===i.indexOf(e.filter.id)?(e.drop(),r.trigger("rulesChanged")):(r.createRuleFilters(e),e.$el.find(c.selectors.rule_filter).val(e.filter?e.filter.id:"-1"),r.trigger("afterUpdateRuleFilter",e))},e)}(this.model.root),this.settings.plugins&&(this.settings.plugins["unique-filter"]&&this.updateDisabledFilters(),this.settings.plugins["bt-selectpicker"]&&this.$el.find(c.selectors.rule_filter).selectpicker("render")),this.settings.default_filter)try{this.getFilterById(this.settings.default_filter)}catch(e){this.settings.default_filter=null}this.trigger("afterSetFilters",t)},addFilter:function(e,r){void 0===r||"#end"==r?r=this.filters.length:"#start"==r&&(r=0),$.isArray(e)||(e=[e]);var t=$.extend(!0,[],this.filters);parseInt(r)==r?Array.prototype.splice.apply(t,[r,0].concat(e)):this.filters.some(function(e,t){if(e.id==r)return r=t+1,!0})?Array.prototype.splice.apply(t,[r,0].concat(e)):Array.prototype.push.apply(t,e),this.setFilters(t)},removeFilter:function(t,e){var r=$.extend(!0,[],this.filters);"string"==typeof t&&(t=[t]),r=r.filter(function(e){return-1===t.indexOf(e.id)}),this.setFilters(e,r)}}),c.define("chosen-selectpicker",function(r){$.fn.chosen||m.error("MissingLibrary",'chosen is required to use "chosen-selectpicker" plugin. Get it here: https://github.com/harvesthq/chosen'),this.settings.plugins["bt-selectpicker"]&&m.error("Conflict","bt-selectpicker is already selected as the dropdown plugin. Please remove chosen-selectpicker from the plugin list");var i=c.selectors;this.on("afterCreateRuleFilters",function(e,t){t.$el.find(i.rule_filter).removeClass("form-control").chosen(r)}),this.on("afterCreateRuleOperators",function(e,t){1

'))).appendTo(t.$el):r.css("display",""),r.html(' '+i)):r.hide()}):"popover"===o.mode?($.fn.popover&&$.fn.popover.Constructor&&$.fn.popover.Constructor.prototype.fixTitle||m.error("MissingLibrary",'Bootstrap Popover is required to use "filter-description" plugin. Get it here: http://getbootstrap.com'),this.on("afterUpdateRuleFilter afterUpdateRuleOperator",function(e,t){var r=t.$el.find("button.filter-description"),i=e.builder.getFilterDescription(t.filter,t);i?(0===r.length?((r=$($.parseHTML(''))).prependTo(t.$el.find(c.selectors.rule_actions)),r.popover({placement:"left",container:"body",html:!0}),r.on("mouseout",function(){r.popover("hide")})):r.css("display",""),r.data("bs.popover").options.content=i,r.attr("aria-describedby")&&r.popover("show")):(r.hide(),r.data("bs.popover")&&r.popover("hide"))})):"bootbox"===o.mode&&("bootbox"in window||m.error("MissingLibrary",'Bootbox is required to use "filter-description" plugin. Get it here: http://bootboxjs.com'),this.on("afterUpdateRuleFilter afterUpdateRuleOperator",function(e,t){var r=t.$el.find("button.filter-description"),i=e.builder.getFilterDescription(t.filter,t);i?(0===r.length?((r=$($.parseHTML(''))).prependTo(t.$el.find(c.selectors.rule_actions)),r.on("click",function(){bootbox.alert(r.data("description"))})):r.css("display",""),r.data("description",i)):r.hide()}))},{icon:"glyphicon glyphicon-info-sign",mode:"popover"}),c.extend({getFilterDescription:function(e,t){return e?"function"==typeof e.description?e.description.call(this,t):e.description:void 0}}),c.define("invert",function(r){var i=this,o=c.selectors;this.on("afterInit",function(){i.$el.on("click.queryBuilder","[data-invert=group]",function(){var e=$(this).closest(o.group_container);i.invert(i.getModel(e),r)}),r.display_rules_button&&r.invert_rules&&i.$el.on("click.queryBuilder","[data-invert=rule]",function(){var e=$(this).closest(o.rule_container);i.invert(i.getModel(e),r)})}),r.disable_template||(this.on("getGroupTemplate.filter",function(e){var t=$($.parseHTML(e.value));t.find(o.condition_container).after('"),e.value=t.prop("outerHTML")}),r.display_rules_button&&r.invert_rules&&this.on("getRuleTemplate.filter",function(e){var t=$($.parseHTML(e.value));t.find(o.rule_actions).prepend('"),e.value=t.prop("outerHTML")}))},{icon:"glyphicon glyphicon-random",recursive:!0,invert_rules:!0,display_rules_button:!1,silent_fail:!1,disable_template:!1}),c.defaults({operatorOpposites:{equal:"not_equal",not_equal:"equal",in:"not_in",not_in:"in",less:"greater_or_equal",less_or_equal:"greater",greater:"less_or_equal",greater_or_equal:"less",between:"not_between",not_between:"between",begins_with:"not_begins_with",not_begins_with:"begins_with",contains:"not_contains",not_contains:"contains",ends_with:"not_ends_with",not_ends_with:"ends_with",is_empty:"is_not_empty",is_not_empty:"is_empty",is_null:"is_not_null",is_not_null:"is_null"},conditionOpposites:{AND:"OR",OR:"AND"}}),c.extend({invert:function(e,t){if(!(e instanceof o)){if(!this.model.root)return;t=e,e=this.model.root}if("object"!=typeof t&&(t={}),void 0===t.recursive&&(t.recursive=!0),void 0===t.invert_rules&&(t.invert_rules=!0),void 0===t.silent_fail&&(t.silent_fail=!1),void 0===t.trigger&&(t.trigger=!0),e instanceof a){if(this.settings.conditionOpposites[e.condition]?e.condition=this.settings.conditionOpposites[e.condition]:t.silent_fail||m.error("InvertCondition",'Unknown inverse of condition "{0}"',e.condition),t.recursive){var r=$.extend({},t,{trigger:!1});e.each(function(e){t.invert_rules&&this.invert(e,r)},function(e){this.invert(e,r)},this)}}else if(e instanceof l&&e.operator&&!e.filter.no_invert)if(this.settings.operatorOpposites[e.operator.type]){var i=this.settings.operatorOpposites[e.operator.type];e.filter.operators&&-1==e.filter.operators.indexOf(i)||(e.operator=this.getOperatorByType(i))}else t.silent_fail||m.error("InvertOperator",'Unknown inverse of operator "{0}"',e.operator.type);t.trigger&&(this.trigger("afterInvert",e,t),this.trigger("rulesChanged"))}}),c.defaults({mongoOperators:{equal:function(e){return e[0]},not_equal:function(e){return{$ne:e[0]}},in:function(e){return{$in:e}},not_in:function(e){return{$nin:e}},less:function(e){return{$lt:e[0]}},less_or_equal:function(e){return{$lte:e[0]}},greater:function(e){return{$gt:e[0]}},greater_or_equal:function(e){return{$gte:e[0]}},between:function(e){return{$gte:e[0],$lte:e[1]}},not_between:function(e){return{$lt:e[0],$gt:e[1]}},begins_with:function(e){return{$regex:"^"+m.escapeRegExp(e[0])}},not_begins_with:function(e){return{$regex:"^(?!"+m.escapeRegExp(e[0])+")"}},contains:function(e){return{$regex:m.escapeRegExp(e[0])}},not_contains:function(e){return{$regex:"^((?!"+m.escapeRegExp(e[0])+").)*$",$options:"s"}},ends_with:function(e){return{$regex:m.escapeRegExp(e[0])+"$"}},not_ends_with:function(e){return{$regex:"(? '+i.translate("NOT")+""),e.value=t.prop("outerHTML")}),this.on("groupToJson.filter",function(e,t){e.value.not=t.not}),this.on("jsonToGroup.filter",function(e,t){e.value.not=!!t.not}),this.on("groupToSQL.filter",function(e,t){t.not&&(e.value="NOT ( "+e.value+" )")}),this.on("parseSQLNode.filter",function(e){e.value.name&&"NOT"==e.value.name.toUpperCase()&&(e.value=e.value.arguments.value[0],-1===["AND","OR"].indexOf(e.value.operation.toUpperCase())&&(e.value=new SQLParser.nodes.Op(i.settings.default_condition,e.value,null)),e.value.not=!0)}),this.on("sqlGroupsDistinct.filter",function(e,t,r,i){r.not&&0"+c.selectors.group_not).toggleClass("active",e.not).find("i").attr("class",e.not?t.icon_checked:t.icon_unchecked),this.trigger("afterUpdateGroupNot",e),this.trigger("rulesChanged")}}),c.define("select2",function(o){$.fn.select2||m.error("MissingLibrary",'Select2 is required to use "select2" plugin.');var n=c.selectors,r=function(e,t){if(void 0!==e.filter.input&&"select"===e.filter.input){var r=Object.assign({},o);if(e&&e.filter&&e.filter.data&&e.filter.data.select2&&(r=Object.assign(e.filter.data.select2,r)),o&&o.dropdownParentSelector&&(r.dropdownParent=e.$el.find(n.rule_value).parents(o.dropdownParentSelector).first()),e&&e.data&&e.data.valueLabel){var i=$("").val(e.data.valueId).text(e.data.valueLabel);e.$el.find(n.rule_value).append(i),e.data.valueLabel=void 0,e.data.valueId=void 0}e.$el.find(n.rule_value).removeClass("form-control").select2(r),e.$el.on("select2:close",function(e){var t="scroll.select2";$(e.target).parents().off(t),$(window).off(t)})}};this.on("afterCreateRuleFilters",function(e,t){console.log(e.builder.$el.parents()),setTimeout(function(){o.dropdownParentSelector&&(o.dropdownParent=e.builder.$el.parents(o.dropdownParentSelector).first()),t.$el.find(n.rule_filter).removeClass("form-control").select2(o)},1)}),this.on("afterCreateRuleOperators",function(e,t){setTimeout(function(){o.dropdownParentSelector&&(o.dropdownParent=e.builder.$el.parents(o.dropdownParentSelector).first()),t.$el.find(n.rule_operator).removeClass("form-control").select2(o)},1)}),this.on("afterCreateRuleInput",function(e,t){r(t,e.builder)}),this.on("afterUpdateRuleFilter",function(e,t){setTimeout(function(){o.dropdownParentSelector&&(o.dropdownParent=e.builder.$el.parents(o.dropdownParentSelector).first()),t.$el.find(n.rule_filter).select2(o)},1)}),this.on("afterUpdateRuleOperator",function(e,t){o.dropdownParentSelector&&(o.dropdownParent=e.builder.$el.parents(o.dropdownParentSelector).first()),t.$el.find(n.rule_operator).select2(o)}),this.on("afterUpdateRuleInput",function(e,t){r(t,e.builder)})},{}),c.define("sortable",function(i){var o,n,l,s;"interact"in window||m.error("MissingLibrary",'interact.js is required to use "sortable" plugin. Get it here: http://interactjs.io'),void 0!==i.default_no_sortable&&(m.error(!1,"Config",'Sortable plugin : "default_no_sortable" options is deprecated, use standard "default_rule_flags" and "default_group_flags" instead'),this.settings.default_rule_flags.no_sortable=this.settings.default_group_flags.no_sortable=i.default_no_sortable),interact.dynamicDrop(!0),interact.pointerMoveTolerance(10),this.on("afterAddRule afterAddGroup",function(e,t){if(t!=o){var r=e.builder;i.inherit_no_sortable&&t.parent&&t.parent.flags.no_sortable&&(t.flags.no_sortable=!0),i.inherit_no_drop&&t.parent&&t.parent.flags.no_drop&&(t.flags.no_drop=!0),t.flags.no_sortable||interact(t.$el[0]).draggable({allowFrom:c.selectors.drag_handle,onstart:function(e){s=!1,l=r.getModel(e.target),n=l.$el.clone().appendTo(l.$el.parent()).width(l.$el.outerWidth()).addClass("dragging");var t=$($.parseHTML('
 
')).height(l.$el.outerHeight());o=l.parent.addRule(t,l.getPos()),l.$el.hide()},onmove:function(e){n[0].style.top=e.clientY-15+"px",n[0].style.left=e.clientX-15+"px"},onend:function(e){e.dropzone&&(u(l,$(e.relatedTarget),r),s=!0),n.remove(),n=void 0,o.drop(),o=void 0,l.$el.css("display",""),r.trigger("afterMove",l),r.trigger("rulesChanged")}}),t.flags.no_drop||(interact(t.$el[0]).dropzone({accept:c.selectors.rule_and_group_containers,ondragenter:function(e){u(o,$(e.target),r)},ondrop:function(e){s||u(l,$(e.target),r)}}),t instanceof a&&interact(t.$el.find(c.selectors.group_header)[0]).dropzone({accept:c.selectors.rule_and_group_containers,ondragenter:function(e){u(o,$(e.target),r)},ondrop:function(e){s||u(l,$(e.target),r)}}))}}),this.on("beforeDeleteRule beforeDeleteGroup",function(e,t){e.isDefaultPrevented()||(interact(t.$el[0]).unset(),t instanceof a&&interact(t.$el.find(c.selectors.group_header)[0]).unset())}),this.on("afterApplyRuleFlags afterApplyGroupFlags",function(e,t){t.flags.no_sortable&&t.$el.find(".drag-handle").remove()}),i.disable_template||(this.on("getGroupTemplate.filter",function(e,t){if(1'),e.value=r.prop("outerHTML")}}),this.on("getRuleTemplate.filter",function(e){var t=$($.parseHTML(e.value));t.find(c.selectors.rule_header).after('
'),e.value=t.prop("outerHTML")}))},{inherit_no_sortable:!0,inherit_no_drop:!0,icon:"glyphicon glyphicon-sort",disable_template:!1}),c.selectors.rule_and_group_containers=c.selectors.rule_container+", "+c.selectors.group_container,c.selectors.drag_handle=".drag-handle",c.defaults({default_rule_flags:{no_sortable:!1,no_drop:!1},default_group_flags:{no_sortable:!1,no_drop:!1}}),c.define("sql-support",function(e){},{boolean_as_integer:!0}),c.defaults({sqlOperators:{equal:{op:"= ?"},not_equal:{op:"!= ?"},in:{op:"IN(?)",sep:", "},not_in:{op:"NOT IN(?)",sep:", "},less:{op:"< ?"},less_or_equal:{op:"<= ?"},greater:{op:"> ?"},greater_or_equal:{op:">= ?"},between:{op:"BETWEEN ?",sep:" AND "},not_between:{op:"NOT BETWEEN ?",sep:" AND "},begins_with:{op:"LIKE ?",mod:"{0}%",escape:"%_"},not_begins_with:{op:"NOT LIKE ?",mod:"{0}%",escape:"%_"},contains:{op:"LIKE ?",mod:"%{0}%",escape:"%_"},not_contains:{op:"NOT LIKE ?",mod:"%{0}%",escape:"%_"},ends_with:{op:"LIKE ?",mod:"%{0}",escape:"%_"},not_ends_with:{op:"NOT LIKE ?",mod:"%{0}",escape:"%_"},is_empty:{op:"= ''"},is_not_empty:{op:"!= ''"},is_null:{op:"IS NULL"},is_not_null:{op:"IS NOT NULL"}},sqlRuleOperator:{"=":function(e){return{val:e,op:""===e?"is_empty":"equal"}},"!=":function(e){return{val:e,op:""===e?"is_not_empty":"not_equal"}},LIKE:function(e){return"%"==e.slice(0,1)&&"%"==e.slice(-1)?{val:e.slice(1,-1),op:"contains"}:"%"==e.slice(0,1)?{val:e.slice(1),op:"ends_with"}:"%"==e.slice(-1)?{val:e.slice(0,-1),op:"begins_with"}:void m.error("SQLParse",'Invalid value for LIKE operator "{0}"',e)},"NOT LIKE":function(e){return"%"==e.slice(0,1)&&"%"==e.slice(-1)?{val:e.slice(1,-1),op:"not_contains"}:"%"==e.slice(0,1)?{val:e.slice(1),op:"not_ends_with"}:"%"==e.slice(-1)?{val:e.slice(0,-1),op:"not_begins_with"}:void m.error("SQLParse",'Invalid value for NOT LIKE operator "{0}"',e)},IN:function(e){return{val:e,op:"in"}},"NOT IN":function(e){return{val:e,op:"not_in"}},"<":function(e){return{val:e,op:"less"}},"<=":function(e){return{val:e,op:"less_or_equal"}},">":function(e){return{val:e,op:"greater"}},">=":function(e){return{val:e,op:"greater_or_equal"}},BETWEEN:function(e){return{val:e,op:"between"}},"NOT BETWEEN":function(e){return{val:e,op:"not_between"}},IS:function(e){return null!==e&&m.error("SQLParse","Invalid value for IS operator"),{val:null,op:"is_null"}},"IS NOT":function(e){return null!==e&&m.error("SQLParse","Invalid value for IS operator"),{val:null,op:"is_not_null"}}},sqlStatements:{question_mark:function(){var r=[];return{add:function(e,t){return r.push(t),"?"},run:function(){return r}}},numbered:function(r){(!r||1"==l&&(l="!=");var s=_.settings.sqlRuleOperator[l];void 0===s&&m.error("UndefinedSQLOperator",'Invalid SQL operation "{0}".',t.operation);var a,u=s.call(this,n,t.operation);"values"in t.left?a=t.left.values.join("."):"value"in t.left?a=t.left.value:m.error("SQLParse","Cannot find field name in {0}",JSON.stringify(t.left));var p=u.val,d=_.settings.sqlOperators[u.op];if(!h&&d&&d.escape){var c=d.escape.split("").map(function(e){return"\\\\"+e}).join("|");p=p.replace(new RegExp("("+c+")","g"),function(e){return e[1]})}var f=_.getSQLFieldID(a,n),g=_.change("sqlToRule",{id:f,field:a,operator:u.op,value:p},t);v.rules.push(g)}}(i,0),o},setRulesFromSQL:function(e,t){this.setRules(this.getRulesFromSQL(e,t))},getSQLFieldID:function(t,e){var r=this.filters.filter(function(e){return e.field.toLowerCase()===t.toLowerCase()});return 1===r.length?r[0].id:this.change("getSQLFieldID",t,e)}}),c.define("unique-filter",function(){this.status.used_filters={},this.on("afterUpdateRuleFilter",this.updateDisabledFilters),this.on("afterDeleteRule",this.updateDisabledFilters),this.on("afterCreateRuleFilters",this.applyDisabledFilters),this.on("afterReset",this.clearDisabledFilters),this.on("afterClear",this.clearDisabledFilters),this.on("getDefaultFilter.filter",function(t,r){var i=t.builder;(i.updateDisabledFilters(),t.value.id in i.status.used_filters)&&(i.filters.some(function(e){if(!(e.id in i.status.used_filters)||0<","<=",">",">=","BETWEEN","NOT BETWEEN","IS","IS NOT","sqlStatements","question_mark","params","run","numbered","char","named","indexes","sqlRuleStatement","esc","sql","regex1","regex2","getSQL","nl","sqlFn","getRulesFromSQL","parsed","where","curr","flatten","next","right","sqlrl","JSON","stringify","finalValue","searchChars","getSQLFieldID","setRulesFromSQL","used_filters","applyDisabledFilters","clearDisabledFilters","unique","filterId","groups","__locale","__author","no_filter","empty_group","radio_empty","checkbox_empty","select_empty","string_empty","string_exceed_min_length","string_exceed_max_length","string_invalid_format","number_nan","number_not_integer","number_not_double","number_exceed_min","number_exceed_max","number_wrong_step","number_between_invalid","datetime_empty","datetime_invalid","datetime_exceed_min","datetime_exceed_max","datetime_between_invalid","boolean_not_valid","operator_not_multiple","NOT"],"mappings":"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","file":"query-builder.min.js"} \ No newline at end of file diff --git a/dist/js/query-builder.standalone.js b/dist/js/query-builder.standalone.js new file mode 100644 index 00000000..7b8029da --- /dev/null +++ b/dist/js/query-builder.standalone.js @@ -0,0 +1,6617 @@ +/*! + * jQuery.extendext 1.0.0 + * + * Copyright 2014-2019 Damien "Mistic" Sorel (http://www.strangeplanet.fr) + * Licensed under MIT (http://opensource.org/licenses/MIT) + * + * Based on jQuery.extend by jQuery Foundation, Inc. and other contributors + */ + +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + define('jquery-extendext', ['jquery'], factory); + } + else if (typeof module === 'object' && module.exports) { + module.exports = factory(require('jquery')); + } + else { + factory(root.jQuery); + } +}(this, function ($) { + "use strict"; + + $.extendext = function () { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false, + arrayMode = 'default'; + + // Handle a deep copy situation + if (typeof target === "boolean") { + deep = target; + + // Skip the boolean and the target + target = arguments[i++] || {}; + } + + // Handle array mode parameter + if (typeof target === "string") { + arrayMode = target.toLowerCase(); + if (arrayMode !== 'concat' && arrayMode !== 'replace' && arrayMode !== 'extend') { + arrayMode = 'default'; + } + + // Skip the string param + target = arguments[i++] || {}; + } + + // Handle case when target is a string or something (possible in deep copy) + if (typeof target !== "object" && !$.isFunction(target)) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if (i === length) { + target = this; + i--; + } + + for (; i < length; i++) { + // Only deal with non-null/undefined values + if ((options = arguments[i]) !== null) { + // Special operations for arrays + if ($.isArray(options) && arrayMode !== 'default') { + clone = target && $.isArray(target) ? target : []; + + switch (arrayMode) { + case 'concat': + target = clone.concat($.extend(deep, [], options)); + break; + + case 'replace': + target = $.extend(deep, [], options); + break; + + case 'extend': + options.forEach(function (e, i) { + if (typeof e === 'object') { + var type = $.isArray(e) ? [] : {}; + clone[i] = $.extendext(deep, arrayMode, clone[i] || type, e); + + } else if (clone.indexOf(e) === -1) { + clone.push(e); + } + }); + + target = clone; + break; + } + + } else { + // Extend the base object + for (name in options) { + copy = options[name]; + + // Prevent never-ending loop + if (name === '__proto__' || target === copy) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if (deep && copy && ( $.isPlainObject(copy) || + (copyIsArray = $.isArray(copy)) )) { + src = target[name]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !$.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[name] = $.extendext(deep, arrayMode, clone, copy); + + // Don't bring in undefined values + } else if (copy !== undefined) { + target[name] = copy; + } + } + } + } + } + + // Return the modified object + return target; + }; +})); + + +// doT.js +// 2011-2014, Laura Doktorova, https://github.com/olado/doT +// Licensed under the MIT license. + +(function () { + "use strict"; + + var doT = { + name: "doT", + version: "1.1.1", + templateSettings: { + evaluate: /\{\{([\s\S]+?(\}?)+)\}\}/g, + interpolate: /\{\{=([\s\S]+?)\}\}/g, + encode: /\{\{!([\s\S]+?)\}\}/g, + use: /\{\{#([\s\S]+?)\}\}/g, + useParams: /(^|[^\w$])def(?:\.|\[[\'\"])([\w$\.]+)(?:[\'\"]\])?\s*\:\s*([\w$\.]+|\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})/g, + define: /\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g, + defineParams:/^\s*([\w$]+):([\s\S]+)/, + conditional: /\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g, + iterate: /\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/g, + varname: "it", + strip: true, + append: true, + selfcontained: false, + doNotSkipEncoded: false + }, + template: undefined, //fn, compile template + compile: undefined, //fn, for express + log: true + }, _globals; + + doT.encodeHTMLSource = function(doNotSkipEncoded) { + var encodeHTMLRules = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'", "/": "/" }, + matchHTML = doNotSkipEncoded ? /[&<>"'\/]/g : /&(?!#?\w+;)|<|>|"|'|\//g; + return function(code) { + return code ? code.toString().replace(matchHTML, function(m) {return encodeHTMLRules[m] || m;}) : ""; + }; + }; + + _globals = (function(){ return this || (0,eval)("this"); }()); + + /* istanbul ignore else */ + if (typeof module !== "undefined" && module.exports) { + module.exports = doT; + } else if (typeof define === "function" && define.amd) { + define('doT', function(){return doT;}); + } else { + _globals.doT = doT; + } + + var startend = { + append: { start: "'+(", end: ")+'", startencode: "'+encodeHTML(" }, + split: { start: "';out+=(", end: ");out+='", startencode: "';out+=encodeHTML(" } + }, skip = /$^/; + + function resolveDefs(c, block, def) { + return ((typeof block === "string") ? block : block.toString()) + .replace(c.define || skip, function(m, code, assign, value) { + if (code.indexOf("def.") === 0) { + code = code.substring(4); + } + if (!(code in def)) { + if (assign === ":") { + if (c.defineParams) value.replace(c.defineParams, function(m, param, v) { + def[code] = {arg: param, text: v}; + }); + if (!(code in def)) def[code]= value; + } else { + new Function("def", "def['"+code+"']=" + value)(def); + } + } + return ""; + }) + .replace(c.use || skip, function(m, code) { + if (c.useParams) code = code.replace(c.useParams, function(m, s, d, param) { + if (def[d] && def[d].arg && param) { + var rw = (d+":"+param).replace(/'|\\/g, "_"); + def.__exp = def.__exp || {}; + def.__exp[rw] = def[d].text.replace(new RegExp("(^|[^\\w$])" + def[d].arg + "([^\\w$])", "g"), "$1" + param + "$2"); + return s + "def.__exp['"+rw+"']"; + } + }); + var v = new Function("def", "return " + code)(def); + return v ? resolveDefs(c, v, def) : v; + }); + } + + function unescape(code) { + return code.replace(/\\('|\\)/g, "$1").replace(/[\r\t\n]/g, " "); + } + + doT.template = function(tmpl, c, def) { + c = c || doT.templateSettings; + var cse = c.append ? startend.append : startend.split, needhtmlencode, sid = 0, indv, + str = (c.use || c.define) ? resolveDefs(c, tmpl, def || {}) : tmpl; + + str = ("var out='" + (c.strip ? str.replace(/(^|\r|\n)\t* +| +\t*(\r|\n|$)/g," ") + .replace(/\r|\n|\t|\/\*[\s\S]*?\*\//g,""): str) + .replace(/'|\\/g, "\\$&") + .replace(c.interpolate || skip, function(m, code) { + return cse.start + unescape(code) + cse.end; + }) + .replace(c.encode || skip, function(m, code) { + needhtmlencode = true; + return cse.startencode + unescape(code) + cse.end; + }) + .replace(c.conditional || skip, function(m, elsecase, code) { + return elsecase ? + (code ? "';}else if(" + unescape(code) + "){out+='" : "';}else{out+='") : + (code ? "';if(" + unescape(code) + "){out+='" : "';}out+='"); + }) + .replace(c.iterate || skip, function(m, iterate, vname, iname) { + if (!iterate) return "';} } out+='"; + sid+=1; indv=iname || "i"+sid; iterate=unescape(iterate); + return "';var arr"+sid+"="+iterate+";if(arr"+sid+"){var "+vname+","+indv+"=-1,l"+sid+"=arr"+sid+".length-1;while("+indv+"} + * @readonly + */ + this.icons = this.settings.icons; + + /** + * List of operators + * @member {QueryBuilder.Operator[]} + * @readonly + */ + this.operators = this.settings.operators; + + /** + * List of templates + * @member {object.} + * @readonly + */ + this.templates = this.settings.templates; + + /** + * Plugins configuration + * @member {object.} + * @readonly + */ + this.plugins = this.settings.plugins; + + /** + * Translations object + * @member {object} + * @readonly + */ + this.lang = null; + + // translations : english << 'lang_code' << custom + if (QueryBuilder.regional['en'] === undefined) { + Utils.error('Config', '"i18n/en.js" not loaded.'); + } + this.lang = $.extendext(true, 'replace', {}, QueryBuilder.regional['en'], QueryBuilder.regional[this.settings.lang_code], this.settings.lang); + + // "allow_groups" can be boolean or int + if (this.settings.allow_groups === false) { + this.settings.allow_groups = 0; + } + else if (this.settings.allow_groups === true) { + this.settings.allow_groups = -1; + } + + // init templates + Object.keys(this.templates).forEach(function(tpl) { + if (!this.templates[tpl]) { + this.templates[tpl] = QueryBuilder.templates[tpl]; + } + if (typeof this.templates[tpl] == 'string') { + this.templates[tpl] = doT.template(this.templates[tpl]); + } + }, this); + + // ensure we have a container id + if (!this.$el.attr('id')) { + this.$el.attr('id', 'qb_' + Math.floor(Math.random() * 99999)); + this.status.generated_id = true; + } + this.status.id = this.$el.attr('id'); + + // INIT + this.$el.addClass('query-builder form-inline'); + + this.filters = this.checkFilters(this.filters); + this.operators = this.checkOperators(this.operators); + this.bindEvents(); + this.initPlugins(); +}; + +$.extend(QueryBuilder.prototype, /** @lends QueryBuilder.prototype */ { + /** + * Triggers an event on the builder container + * @param {string} type + * @returns {$.Event} + */ + trigger: function(type) { + var event = new $.Event(this._tojQueryEvent(type), { + builder: this + }); + + this.$el.triggerHandler(event, Array.prototype.slice.call(arguments, 1)); + + return event; + }, + + /** + * Triggers an event on the builder container and returns the modified value + * @param {string} type + * @param {*} value + * @returns {*} + */ + change: function(type, value) { + var event = new $.Event(this._tojQueryEvent(type, true), { + builder: this, + value: value + }); + + this.$el.triggerHandler(event, Array.prototype.slice.call(arguments, 2)); + + return event.value; + }, + + /** + * Attaches an event listener on the builder container + * @param {string} type + * @param {function} cb + * @returns {QueryBuilder} + */ + on: function(type, cb) { + this.$el.on(this._tojQueryEvent(type), cb); + return this; + }, + + /** + * Removes an event listener from the builder container + * @param {string} type + * @param {function} [cb] + * @returns {QueryBuilder} + */ + off: function(type, cb) { + this.$el.off(this._tojQueryEvent(type), cb); + return this; + }, + + /** + * Attaches an event listener called once on the builder container + * @param {string} type + * @param {function} cb + * @returns {QueryBuilder} + */ + once: function(type, cb) { + this.$el.one(this._tojQueryEvent(type), cb); + return this; + }, + + /** + * Appends `.queryBuilder` and optionally `.filter` to the events names + * @param {string} name + * @param {boolean} [filter=false] + * @returns {string} + * @private + */ + _tojQueryEvent: function(name, filter) { + return name.split(' ').map(function(type) { + return type + '.queryBuilder' + (filter ? '.filter' : ''); + }).join(' '); + } +}); + + +/** + * Allowed types and their internal representation + * @type {object.} + * @readonly + * @private + */ +QueryBuilder.types = { + 'string': 'string', + 'integer': 'number', + 'double': 'number', + 'date': 'datetime', + 'time': 'datetime', + 'datetime': 'datetime', + 'boolean': 'boolean' +}; + +/** + * Allowed inputs + * @type {string[]} + * @readonly + * @private + */ +QueryBuilder.inputs = [ + 'text', + 'number', + 'textarea', + 'radio', + 'checkbox', + 'select' +]; + +/** + * Runtime modifiable options with `setOptions` method + * @type {string[]} + * @readonly + * @private + */ +QueryBuilder.modifiable_options = [ + 'display_errors', + 'allow_groups', + 'allow_empty', + 'default_condition', + 'default_filter' +]; + +/** + * CSS selectors for common components + * @type {object.} + * @readonly + */ +QueryBuilder.selectors = { + group_container: '.rules-group-container', + rule_container: '.rule-container', + filter_container: '.rule-filter-container', + operator_container: '.rule-operator-container', + value_container: '.rule-value-container', + error_container: '.error-container', + condition_container: '.rules-group-header .group-conditions', + + rule_header: '.rule-header', + group_header: '.rules-group-header', + group_actions: '.group-actions', + rule_actions: '.rule-actions', + + rules_list: '.rules-group-body>.rules-list', + + group_condition: '.rules-group-header [name$=_cond]', + rule_filter: '.rule-filter-container [name$=_filter]', + rule_operator: '.rule-operator-container [name$=_operator]', + rule_value: '.rule-value-container [name*=_value_]', + + add_rule: '[data-add=rule]', + delete_rule: '[data-delete=rule]', + add_group: '[data-add=group]', + delete_group: '[data-delete=group]' +}; + +/** + * Template strings (see template.js) + * @type {object.} + * @readonly + */ +QueryBuilder.templates = {}; + +/** + * Localized strings (see i18n/) + * @type {object.} + * @readonly + */ +QueryBuilder.regional = {}; + +/** + * Default operators + * @type {object.} + * @readonly + */ +QueryBuilder.OPERATORS = { + equal: { type: 'equal', nb_inputs: 1, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean'] }, + not_equal: { type: 'not_equal', nb_inputs: 1, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean'] }, + in: { type: 'in', nb_inputs: 1, multiple: true, apply_to: ['string', 'number', 'datetime'] }, + not_in: { type: 'not_in', nb_inputs: 1, multiple: true, apply_to: ['string', 'number', 'datetime'] }, + less: { type: 'less', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] }, + less_or_equal: { type: 'less_or_equal', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] }, + greater: { type: 'greater', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] }, + greater_or_equal: { type: 'greater_or_equal', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] }, + between: { type: 'between', nb_inputs: 2, multiple: false, apply_to: ['number', 'datetime'] }, + not_between: { type: 'not_between', nb_inputs: 2, multiple: false, apply_to: ['number', 'datetime'] }, + begins_with: { type: 'begins_with', nb_inputs: 1, multiple: false, apply_to: ['string'] }, + not_begins_with: { type: 'not_begins_with', nb_inputs: 1, multiple: false, apply_to: ['string'] }, + contains: { type: 'contains', nb_inputs: 1, multiple: false, apply_to: ['string'] }, + not_contains: { type: 'not_contains', nb_inputs: 1, multiple: false, apply_to: ['string'] }, + ends_with: { type: 'ends_with', nb_inputs: 1, multiple: false, apply_to: ['string'] }, + not_ends_with: { type: 'not_ends_with', nb_inputs: 1, multiple: false, apply_to: ['string'] }, + is_empty: { type: 'is_empty', nb_inputs: 0, multiple: false, apply_to: ['string'] }, + is_not_empty: { type: 'is_not_empty', nb_inputs: 0, multiple: false, apply_to: ['string'] }, + is_null: { type: 'is_null', nb_inputs: 0, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean'] }, + is_not_null: { type: 'is_not_null', nb_inputs: 0, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean'] } +}; + +/** + * Default configuration + * @type {object} + * @readonly + */ +QueryBuilder.DEFAULTS = { + filters: [], + plugins: [], + + sort_filters: false, + display_errors: true, + allow_groups: -1, + allow_empty: false, + conditions: ['AND', 'OR'], + default_condition: 'AND', + inputs_separator: ' , ', + select_placeholder: '------', + display_empty_filter: true, + default_filter: null, + optgroups: {}, + + default_rule_flags: { + filter_readonly: false, + operator_readonly: false, + value_readonly: false, + no_delete: false + }, + + default_group_flags: { + condition_readonly: false, + no_add_rule: false, + no_add_group: false, + no_delete: false + }, + + templates: { + group: null, + rule: null, + filterSelect: null, + operatorSelect: null, + ruleValueSelect: null + }, + + lang_code: 'en', + lang: {}, + + operators: [ + 'equal', + 'not_equal', + 'in', + 'not_in', + 'less', + 'less_or_equal', + 'greater', + 'greater_or_equal', + 'between', + 'not_between', + 'begins_with', + 'not_begins_with', + 'contains', + 'not_contains', + 'ends_with', + 'not_ends_with', + 'is_empty', + 'is_not_empty', + 'is_null', + 'is_not_null' + ], + + icons: { + add_group: 'glyphicon glyphicon-plus-sign', + add_rule: 'glyphicon glyphicon-plus', + remove_group: 'glyphicon glyphicon-remove', + remove_rule: 'glyphicon glyphicon-remove', + error: 'glyphicon glyphicon-warning-sign' + } +}; + + +/** + * @module plugins + */ + +/** + * Definition of available plugins + * @type {object.} + */ +QueryBuilder.plugins = {}; + +/** + * Gets or extends the default configuration + * @param {object} [options] - new configuration + * @returns {undefined|object} nothing or configuration object (copy) + */ +QueryBuilder.defaults = function(options) { + if (typeof options == 'object') { + $.extendext(true, 'replace', QueryBuilder.DEFAULTS, options); + } + else if (typeof options == 'string') { + if (typeof QueryBuilder.DEFAULTS[options] == 'object') { + return $.extend(true, {}, QueryBuilder.DEFAULTS[options]); + } + else { + return QueryBuilder.DEFAULTS[options]; + } + } + else { + return $.extend(true, {}, QueryBuilder.DEFAULTS); + } +}; + +/** + * Registers a new plugin + * @param {string} name + * @param {function} fct - init function + * @param {object} [def] - default options + */ +QueryBuilder.define = function(name, fct, def) { + QueryBuilder.plugins[name] = { + fct: fct, + def: def || {} + }; +}; + +/** + * Adds new methods to QueryBuilder prototype + * @param {object.} methods + */ +QueryBuilder.extend = function(methods) { + $.extend(QueryBuilder.prototype, methods); +}; + +/** + * Initializes plugins for an instance + * @throws ConfigError + * @private + */ +QueryBuilder.prototype.initPlugins = function() { + if (!this.plugins) { + return; + } + + if ($.isArray(this.plugins)) { + var tmp = {}; + this.plugins.forEach(function(plugin) { + tmp[plugin] = null; + }); + this.plugins = tmp; + } + + Object.keys(this.plugins).forEach(function(plugin) { + if (plugin in QueryBuilder.plugins) { + this.plugins[plugin] = $.extend(true, {}, + QueryBuilder.plugins[plugin].def, + this.plugins[plugin] || {} + ); + + QueryBuilder.plugins[plugin].fct.call(this, this.plugins[plugin]); + } + else { + Utils.error('Config', 'Unable to find plugin "{0}"', plugin); + } + }, this); +}; + +/** + * Returns the config of a plugin, if the plugin is not loaded, returns the default config. + * @param {string} name + * @param {string} [property] + * @throws ConfigError + * @returns {*} + */ +QueryBuilder.prototype.getPluginOptions = function(name, property) { + var plugin; + if (this.plugins && this.plugins[name]) { + plugin = this.plugins[name]; + } + else if (QueryBuilder.plugins[name]) { + plugin = QueryBuilder.plugins[name].def; + } + + if (plugin) { + if (property) { + return plugin[property]; + } + else { + return plugin; + } + } + else { + Utils.error('Config', 'Unable to find plugin "{0}"', name); + } +}; + + +/** + * Final initialisation of the builder + * @param {object} [rules] + * @fires QueryBuilder.afterInit + * @private + */ +QueryBuilder.prototype.init = function(rules) { + /** + * When the initilization is done, just before creating the root group + * @event afterInit + * @memberof QueryBuilder + */ + this.trigger('afterInit'); + + if (rules) { + this.setRules(rules); + delete this.settings.rules; + } + else { + this.setRoot(true); + } +}; + +/** + * Checks the configuration of each filter + * @param {QueryBuilder.Filter[]} filters + * @returns {QueryBuilder.Filter[]} + * @throws ConfigError + */ +QueryBuilder.prototype.checkFilters = function(filters) { + var definedFilters = []; + + if (!filters || filters.length === 0) { + Utils.error('Config', 'Missing filters list'); + } + + filters.forEach(function(filter, i) { + if (!filter.id) { + Utils.error('Config', 'Missing filter {0} id', i); + } + if (definedFilters.indexOf(filter.id) != -1) { + Utils.error('Config', 'Filter "{0}" already defined', filter.id); + } + definedFilters.push(filter.id); + + if (!filter.type) { + filter.type = 'string'; + } + else if (!QueryBuilder.types[filter.type]) { + Utils.error('Config', 'Invalid type "{0}"', filter.type); + } + + if (!filter.input) { + filter.input = QueryBuilder.types[filter.type] === 'number' ? 'number' : 'text'; + } + else if (typeof filter.input != 'function' && QueryBuilder.inputs.indexOf(filter.input) == -1) { + Utils.error('Config', 'Invalid input "{0}"', filter.input); + } + + if (filter.operators) { + filter.operators.forEach(function(operator) { + if (typeof operator != 'string') { + Utils.error('Config', 'Filter operators must be global operators types (string)'); + } + }); + } + + if (!filter.field) { + filter.field = filter.id; + } + if (!filter.label) { + filter.label = filter.field; + } + + if (!filter.optgroup) { + filter.optgroup = null; + } + else { + this.status.has_optgroup = true; + + // register optgroup if needed + if (!this.settings.optgroups[filter.optgroup]) { + this.settings.optgroups[filter.optgroup] = filter.optgroup; + } + } + + switch (filter.input) { + case 'radio': + case 'checkbox': + if (!filter.values || filter.values.length < 1) { + Utils.error('Config', 'Missing filter "{0}" values', filter.id); + } + break; + + case 'select': + var cleanValues = []; + filter.has_optgroup = false; + + Utils.iterateOptions(filter.values, function(value, label, optgroup) { + cleanValues.push({ + value: value, + label: label, + optgroup: optgroup || null + }); + + if (optgroup) { + filter.has_optgroup = true; + + // register optgroup if needed + if (!this.settings.optgroups[optgroup]) { + this.settings.optgroups[optgroup] = optgroup; + } + } + }.bind(this)); + + if (filter.has_optgroup) { + filter.values = Utils.groupSort(cleanValues, 'optgroup'); + } + else { + filter.values = cleanValues; + } + + if (filter.placeholder) { + if (filter.placeholder_value === undefined) { + filter.placeholder_value = -1; + } + + filter.values.forEach(function(entry) { + if (entry.value == filter.placeholder_value) { + Utils.error('Config', 'Placeholder of filter "{0}" overlaps with one of its values', filter.id); + } + }); + } + break; + } + }, this); + + if (this.settings.sort_filters) { + if (typeof this.settings.sort_filters == 'function') { + filters.sort(this.settings.sort_filters); + } + else { + var self = this; + filters.sort(function(a, b) { + return self.translate(a.label).localeCompare(self.translate(b.label)); + }); + } + } + + if (this.status.has_optgroup) { + filters = Utils.groupSort(filters, 'optgroup'); + } + + return filters; +}; + +/** + * Checks the configuration of each operator + * @param {QueryBuilder.Operator[]} operators + * @returns {QueryBuilder.Operator[]} + * @throws ConfigError + */ +QueryBuilder.prototype.checkOperators = function(operators) { + var definedOperators = []; + + operators.forEach(function(operator, i) { + if (typeof operator == 'string') { + if (!QueryBuilder.OPERATORS[operator]) { + Utils.error('Config', 'Unknown operator "{0}"', operator); + } + + operators[i] = operator = $.extendext(true, 'replace', {}, QueryBuilder.OPERATORS[operator]); + } + else { + if (!operator.type) { + Utils.error('Config', 'Missing "type" for operator {0}', i); + } + + if (QueryBuilder.OPERATORS[operator.type]) { + operators[i] = operator = $.extendext(true, 'replace', {}, QueryBuilder.OPERATORS[operator.type], operator); + } + + if (operator.nb_inputs === undefined || operator.apply_to === undefined) { + Utils.error('Config', 'Missing "nb_inputs" and/or "apply_to" for operator "{0}"', operator.type); + } + } + + if (definedOperators.indexOf(operator.type) != -1) { + Utils.error('Config', 'Operator "{0}" already defined', operator.type); + } + definedOperators.push(operator.type); + + if (!operator.optgroup) { + operator.optgroup = null; + } + else { + this.status.has_operator_optgroup = true; + + // register optgroup if needed + if (!this.settings.optgroups[operator.optgroup]) { + this.settings.optgroups[operator.optgroup] = operator.optgroup; + } + } + }, this); + + if (this.status.has_operator_optgroup) { + operators = Utils.groupSort(operators, 'optgroup'); + } + + return operators; +}; + +/** + * Adds all events listeners to the builder + * @private + */ +QueryBuilder.prototype.bindEvents = function() { + var self = this; + var Selectors = QueryBuilder.selectors; + + // group condition change + this.$el.on('change.queryBuilder', Selectors.group_condition, function() { + if ($(this).is(':checked')) { + var $group = $(this).closest(Selectors.group_container); + self.getModel($group).condition = $(this).val(); + } + }); + + // rule filter change + this.$el.on('change.queryBuilder', Selectors.rule_filter, function() { + var $rule = $(this).closest(Selectors.rule_container); + self.getModel($rule).filter = self.getFilterById($(this).val()); + }); + + // rule operator change + this.$el.on('change.queryBuilder', Selectors.rule_operator, function() { + var $rule = $(this).closest(Selectors.rule_container); + self.getModel($rule).operator = self.getOperatorByType($(this).val()); + }); + + // add rule button + this.$el.on('click.queryBuilder', Selectors.add_rule, function() { + var $group = $(this).closest(Selectors.group_container); + self.addRule(self.getModel($group)); + }); + + // delete rule button + this.$el.on('click.queryBuilder', Selectors.delete_rule, function() { + var $rule = $(this).closest(Selectors.rule_container); + self.deleteRule(self.getModel($rule)); + }); + + if (this.settings.allow_groups !== 0) { + // add group button + this.$el.on('click.queryBuilder', Selectors.add_group, function() { + var $group = $(this).closest(Selectors.group_container); + self.addGroup(self.getModel($group)); + }); + + // delete group button + this.$el.on('click.queryBuilder', Selectors.delete_group, function() { + var $group = $(this).closest(Selectors.group_container); + self.deleteGroup(self.getModel($group)); + }); + } + + // model events + this.model.on({ + 'drop': function(e, node) { + node.$el.remove(); + self.refreshGroupsConditions(); + }, + 'add': function(e, parent, node, index) { + if (index === 0) { + node.$el.prependTo(parent.$el.find('>' + QueryBuilder.selectors.rules_list)); + } + else { + node.$el.insertAfter(parent.rules[index - 1].$el); + } + self.refreshGroupsConditions(); + }, + 'move': function(e, node, group, index) { + node.$el.detach(); + + if (index === 0) { + node.$el.prependTo(group.$el.find('>' + QueryBuilder.selectors.rules_list)); + } + else { + node.$el.insertAfter(group.rules[index - 1].$el); + } + self.refreshGroupsConditions(); + }, + 'update': function(e, node, field, value, oldValue) { + if (node instanceof Rule) { + switch (field) { + case 'error': + self.updateError(node); + break; + + case 'flags': + self.applyRuleFlags(node); + break; + + case 'filter': + self.updateRuleFilter(node, oldValue); + break; + + case 'operator': + self.updateRuleOperator(node, oldValue); + break; + + case 'value': + self.updateRuleValue(node, oldValue); + break; + } + } + else { + switch (field) { + case 'error': + self.updateError(node); + break; + + case 'flags': + self.applyGroupFlags(node); + break; + + case 'condition': + self.updateGroupCondition(node, oldValue); + break; + } + } + } + }); +}; + +/** + * Creates the root group + * @param {boolean} [addRule=true] - adds a default empty rule + * @param {object} [data] - group custom data + * @param {object} [flags] - flags to apply to the group + * @returns {Group} root group + * @fires QueryBuilder.afterAddGroup + */ +QueryBuilder.prototype.setRoot = function(addRule, data, flags) { + addRule = (addRule === undefined || addRule === true); + + var group_id = this.nextGroupId(); + var $group = $($.parseHTML(this.getGroupTemplate(group_id, 1))); + + this.$el.append($group); + this.model.root = new Group(null, $group); + this.model.root.model = this.model; + + this.model.root.data = data; + this.model.root.flags = $.extend({}, this.settings.default_group_flags, flags); + this.model.root.condition = this.settings.default_condition; + + this.trigger('afterAddGroup', this.model.root); + + if (addRule) { + this.addRule(this.model.root); + } + + return this.model.root; +}; + +/** + * Adds a new group + * @param {Group} parent + * @param {boolean} [addRule=true] - adds a default empty rule + * @param {object} [data] - group custom data + * @param {object} [flags] - flags to apply to the group + * @returns {Group} + * @fires QueryBuilder.beforeAddGroup + * @fires QueryBuilder.afterAddGroup + */ +QueryBuilder.prototype.addGroup = function(parent, addRule, data, flags) { + addRule = (addRule === undefined || addRule === true); + + var level = parent.level + 1; + + /** + * Just before adding a group, can be prevented. + * @event beforeAddGroup + * @memberof QueryBuilder + * @param {Group} parent + * @param {boolean} addRule - if an empty rule will be added in the group + * @param {int} level - nesting level of the group, 1 is the root group + */ + var e = this.trigger('beforeAddGroup', parent, addRule, level); + if (e.isDefaultPrevented()) { + return null; + } + + var group_id = this.nextGroupId(); + var $group = $(this.getGroupTemplate(group_id, level)); + var model = parent.addGroup($group); + + model.data = data; + model.flags = $.extend({}, this.settings.default_group_flags, flags); + model.condition = this.settings.default_condition; + + /** + * Just after adding a group + * @event afterAddGroup + * @memberof QueryBuilder + * @param {Group} group + */ + this.trigger('afterAddGroup', model); + + /** + * After any change in the rules + * @event rulesChanged + * @memberof QueryBuilder + */ + this.trigger('rulesChanged'); + + if (addRule) { + this.addRule(model); + } + + return model; +}; + +/** + * Tries to delete a group. The group is not deleted if at least one rule is flagged `no_delete`. + * @param {Group} group + * @returns {boolean} if the group has been deleted + * @fires QueryBuilder.beforeDeleteGroup + * @fires QueryBuilder.afterDeleteGroup + */ +QueryBuilder.prototype.deleteGroup = function(group) { + if (group.isRoot()) { + return false; + } + + /** + * Just before deleting a group, can be prevented + * @event beforeDeleteGroup + * @memberof QueryBuilder + * @param {Group} parent + */ + var e = this.trigger('beforeDeleteGroup', group); + if (e.isDefaultPrevented()) { + return false; + } + + var del = true; + + group.each('reverse', function(rule) { + del &= this.deleteRule(rule); + }, function(group) { + del &= this.deleteGroup(group); + }, this); + + if (del) { + group.drop(); + + /** + * Just after deleting a group + * @event afterDeleteGroup + * @memberof QueryBuilder + */ + this.trigger('afterDeleteGroup'); + + this.trigger('rulesChanged'); + } + + return del; +}; + +/** + * Performs actions when a group's condition changes + * @param {Group} group + * @param {object} previousCondition + * @fires QueryBuilder.afterUpdateGroupCondition + * @private + */ +QueryBuilder.prototype.updateGroupCondition = function(group, previousCondition) { + group.$el.find('>' + QueryBuilder.selectors.group_condition).each(function() { + var $this = $(this); + $this.prop('checked', $this.val() === group.condition); + $this.parent().toggleClass('active', $this.val() === group.condition); + }); + + /** + * After the group condition has been modified + * @event afterUpdateGroupCondition + * @memberof QueryBuilder + * @param {Group} group + * @param {object} previousCondition + */ + this.trigger('afterUpdateGroupCondition', group, previousCondition); + + this.trigger('rulesChanged'); +}; + +/** + * Updates the visibility of conditions based on number of rules inside each group + * @private + */ +QueryBuilder.prototype.refreshGroupsConditions = function() { + (function walk(group) { + if (!group.flags || (group.flags && !group.flags.condition_readonly)) { + group.$el.find('>' + QueryBuilder.selectors.group_condition).prop('disabled', group.rules.length <= 1) + .parent().toggleClass('disabled', group.rules.length <= 1); + } + + group.each(null, function(group) { + walk(group); + }, this); + }(this.model.root)); +}; + +/** + * Adds a new rule + * @param {Group} parent + * @param {object} [data] - rule custom data + * @param {object} [flags] - flags to apply to the rule + * @returns {Rule} + * @fires QueryBuilder.beforeAddRule + * @fires QueryBuilder.afterAddRule + * @fires QueryBuilder.changer:getDefaultFilter + */ +QueryBuilder.prototype.addRule = function(parent, data, flags) { + /** + * Just before adding a rule, can be prevented + * @event beforeAddRule + * @memberof QueryBuilder + * @param {Group} parent + */ + var e = this.trigger('beforeAddRule', parent); + if (e.isDefaultPrevented()) { + return null; + } + + var rule_id = this.nextRuleId(); + var $rule = $($.parseHTML(this.getRuleTemplate(rule_id))); + var model = parent.addRule($rule); + + model.data = data; + model.flags = $.extend({}, this.settings.default_rule_flags, flags); + + /** + * Just after adding a rule + * @event afterAddRule + * @memberof QueryBuilder + * @param {Rule} rule + */ + this.trigger('afterAddRule', model); + + this.trigger('rulesChanged'); + + this.createRuleFilters(model); + + if (this.settings.default_filter || !this.settings.display_empty_filter) { + /** + * Modifies the default filter for a rule + * @event changer:getDefaultFilter + * @memberof QueryBuilder + * @param {QueryBuilder.Filter} filter + * @param {Rule} rule + * @returns {QueryBuilder.Filter} + */ + model.filter = this.change('getDefaultFilter', + this.getFilterById(this.settings.default_filter || this.filters[0].id), + model + ); + } + + return model; +}; + +/** + * Tries to delete a rule + * @param {Rule} rule + * @returns {boolean} if the rule has been deleted + * @fires QueryBuilder.beforeDeleteRule + * @fires QueryBuilder.afterDeleteRule + */ +QueryBuilder.prototype.deleteRule = function(rule) { + if (rule.flags.no_delete) { + return false; + } + + /** + * Just before deleting a rule, can be prevented + * @event beforeDeleteRule + * @memberof QueryBuilder + * @param {Rule} rule + */ + var e = this.trigger('beforeDeleteRule', rule); + if (e.isDefaultPrevented()) { + return false; + } + + rule.drop(); + + /** + * Just after deleting a rule + * @event afterDeleteRule + * @memberof QueryBuilder + */ + this.trigger('afterDeleteRule'); + + this.trigger('rulesChanged'); + + return true; +}; + +/** + * Creates the filters for a rule + * @param {Rule} rule + * @fires QueryBuilder.changer:getRuleFilters + * @fires QueryBuilder.afterCreateRuleFilters + * @private + */ +QueryBuilder.prototype.createRuleFilters = function(rule) { + /** + * Modifies the list a filters available for a rule + * @event changer:getRuleFilters + * @memberof QueryBuilder + * @param {QueryBuilder.Filter[]} filters + * @param {Rule} rule + * @returns {QueryBuilder.Filter[]} + */ + var filters = this.change('getRuleFilters', this.filters, rule); + var $filterSelect = $($.parseHTML(this.getRuleFilterSelect(rule, filters))); + + rule.$el.find(QueryBuilder.selectors.filter_container).html($filterSelect); + + /** + * After creating the dropdown for filters + * @event afterCreateRuleFilters + * @memberof QueryBuilder + * @param {Rule} rule + */ + this.trigger('afterCreateRuleFilters', rule); + + this.applyRuleFlags(rule); +}; + +/** + * Creates the operators for a rule and init the rule operator + * @param {Rule} rule + * @fires QueryBuilder.afterCreateRuleOperators + * @private + */ +QueryBuilder.prototype.createRuleOperators = function(rule) { + var $operatorContainer = rule.$el.find(QueryBuilder.selectors.operator_container).empty(); + + if (!rule.filter) { + return; + } + + var operators = this.getOperators(rule.filter); + var $operatorSelect = $($.parseHTML(this.getRuleOperatorSelect(rule, operators))); + + $operatorContainer.html($operatorSelect); + + // set the operator without triggering update event + if (rule.filter.default_operator) { + rule.__.operator = this.getOperatorByType(rule.filter.default_operator); + } + else { + rule.__.operator = operators[0]; + } + + rule.$el.find(QueryBuilder.selectors.rule_operator).val(rule.operator.type); + + /** + * After creating the dropdown for operators + * @event afterCreateRuleOperators + * @memberof QueryBuilder + * @param {Rule} rule + * @param {QueryBuilder.Operator[]} operators - allowed operators for this rule + */ + this.trigger('afterCreateRuleOperators', rule, operators); + + this.applyRuleFlags(rule); +}; + +/** + * Creates the main input for a rule + * @param {Rule} rule + * @fires QueryBuilder.afterCreateRuleInput + * @private + */ +QueryBuilder.prototype.createRuleInput = function(rule) { + var $valueContainer = rule.$el.find(QueryBuilder.selectors.value_container).empty(); + + rule.__.value = undefined; + + if (!rule.filter || !rule.operator || rule.operator.nb_inputs === 0) { + return; + } + + var self = this; + var $inputs = $(); + var filter = rule.filter; + + for (var i = 0; i < rule.operator.nb_inputs; i++) { + var $ruleInput = $($.parseHTML($.trim(this.getRuleInput(rule, i)))); + if (i > 0) $valueContainer.append(this.settings.inputs_separator); + $valueContainer.append($ruleInput); + $inputs = $inputs.add($ruleInput); + } + + $valueContainer.css('display', ''); + + $inputs.on('change ' + (filter.input_event || ''), function() { + if (!rule._updating_input) { + rule._updating_value = true; + rule.value = self.getRuleInputValue(rule); + rule._updating_value = false; + } + }); + + if (filter.plugin) { + $inputs[filter.plugin](filter.plugin_config || {}); + } + + /** + * After creating the input for a rule and initializing optional plugin + * @event afterCreateRuleInput + * @memberof QueryBuilder + * @param {Rule} rule + */ + this.trigger('afterCreateRuleInput', rule); + + if (filter.default_value !== undefined) { + rule.value = filter.default_value; + } + else { + rule._updating_value = true; + rule.value = self.getRuleInputValue(rule); + rule._updating_value = false; + } + + this.applyRuleFlags(rule); +}; + +/** + * Performs action when a rule's filter changes + * @param {Rule} rule + * @param {object} previousFilter + * @fires QueryBuilder.afterUpdateRuleFilter + * @private + */ +QueryBuilder.prototype.updateRuleFilter = function(rule, previousFilter) { + this.createRuleOperators(rule); + this.createRuleInput(rule); + + rule.$el.find(QueryBuilder.selectors.rule_filter).val(rule.filter ? rule.filter.id : '-1'); + + // clear rule data if the filter changed + if (previousFilter && rule.filter && previousFilter.id !== rule.filter.id) { + rule.data = undefined; + } + + /** + * After the filter has been updated and the operators and input re-created + * @event afterUpdateRuleFilter + * @memberof QueryBuilder + * @param {Rule} rule + * @param {object} previousFilter + */ + this.trigger('afterUpdateRuleFilter', rule, previousFilter); + + this.trigger('rulesChanged'); +}; + +/** + * Performs actions when a rule's operator changes + * @param {Rule} rule + * @param {object} previousOperator + * @fires QueryBuilder.afterUpdateRuleOperator + * @private + */ +QueryBuilder.prototype.updateRuleOperator = function(rule, previousOperator) { + var $valueContainer = rule.$el.find(QueryBuilder.selectors.value_container); + + if (!rule.operator || rule.operator.nb_inputs === 0) { + $valueContainer.hide(); + + rule.__.value = undefined; + } + else { + $valueContainer.css('display', ''); + + if ($valueContainer.is(':empty') || !previousOperator || + rule.operator.nb_inputs !== previousOperator.nb_inputs || + rule.operator.optgroup !== previousOperator.optgroup + ) { + this.createRuleInput(rule); + } + } + + if (rule.operator) { + rule.$el.find(QueryBuilder.selectors.rule_operator).val(rule.operator.type); + + // refresh value if the format changed for this operator + rule.__.value = this.getRuleInputValue(rule); + } + + /** + * After the operator has been updated and the input optionally re-created + * @event afterUpdateRuleOperator + * @memberof QueryBuilder + * @param {Rule} rule + * @param {object} previousOperator + */ + this.trigger('afterUpdateRuleOperator', rule, previousOperator); + + this.trigger('rulesChanged'); +}; + +/** + * Performs actions when rule's value changes + * @param {Rule} rule + * @param {object} previousValue + * @fires QueryBuilder.afterUpdateRuleValue + * @private + */ +QueryBuilder.prototype.updateRuleValue = function(rule, previousValue) { + if (!rule._updating_value) { + this.setRuleInputValue(rule, rule.value); + } + + /** + * After the rule value has been modified + * @event afterUpdateRuleValue + * @memberof QueryBuilder + * @param {Rule} rule + * @param {*} previousValue + */ + this.trigger('afterUpdateRuleValue', rule, previousValue); + + this.trigger('rulesChanged'); +}; + +/** + * Changes a rule's properties depending on its flags + * @param {Rule} rule + * @fires QueryBuilder.afterApplyRuleFlags + * @private + */ +QueryBuilder.prototype.applyRuleFlags = function(rule) { + var flags = rule.flags; + var Selectors = QueryBuilder.selectors; + + rule.$el.find(Selectors.rule_filter).prop('disabled', flags.filter_readonly); + rule.$el.find(Selectors.rule_operator).prop('disabled', flags.operator_readonly); + rule.$el.find(Selectors.rule_value).prop('disabled', flags.value_readonly); + + if (flags.no_delete) { + rule.$el.find(Selectors.delete_rule).remove(); + } + + /** + * After rule's flags has been applied + * @event afterApplyRuleFlags + * @memberof QueryBuilder + * @param {Rule} rule + */ + this.trigger('afterApplyRuleFlags', rule); +}; + +/** + * Changes group's properties depending on its flags + * @param {Group} group + * @fires QueryBuilder.afterApplyGroupFlags + * @private + */ +QueryBuilder.prototype.applyGroupFlags = function(group) { + var flags = group.flags; + var Selectors = QueryBuilder.selectors; + + group.$el.find('>' + Selectors.group_condition).prop('disabled', flags.condition_readonly) + .parent().toggleClass('readonly', flags.condition_readonly); + + if (flags.no_add_rule) { + group.$el.find(Selectors.add_rule).remove(); + } + if (flags.no_add_group) { + group.$el.find(Selectors.add_group).remove(); + } + if (flags.no_delete) { + group.$el.find(Selectors.delete_group).remove(); + } + + /** + * After group's flags has been applied + * @event afterApplyGroupFlags + * @memberof QueryBuilder + * @param {Group} group + */ + this.trigger('afterApplyGroupFlags', group); +}; + +/** + * Clears all errors markers + * @param {Node} [node] default is root Group + */ +QueryBuilder.prototype.clearErrors = function(node) { + node = node || this.model.root; + + if (!node) { + return; + } + + node.error = null; + + if (node instanceof Group) { + node.each(function(rule) { + rule.error = null; + }, function(group) { + this.clearErrors(group); + }, this); + } +}; + +/** + * Adds/Removes error on a Rule or Group + * @param {Node} node + * @fires QueryBuilder.changer:displayError + * @private + */ +QueryBuilder.prototype.updateError = function(node) { + if (this.settings.display_errors) { + if (node.error === null) { + node.$el.removeClass('has-error'); + } + else { + var errorMessage = this.translate('errors', node.error[0]); + errorMessage = Utils.fmt(errorMessage, node.error.slice(1)); + + /** + * Modifies an error message before display + * @event changer:displayError + * @memberof QueryBuilder + * @param {string} errorMessage - the error message (translated and formatted) + * @param {array} error - the raw error array (error code and optional arguments) + * @param {Node} node + * @returns {string} + */ + errorMessage = this.change('displayError', errorMessage, node.error, node); + + node.$el.addClass('has-error') + .find(QueryBuilder.selectors.error_container).eq(0) + .attr('title', errorMessage); + } + } +}; + +/** + * Triggers a validation error event + * @param {Node} node + * @param {string|array} error + * @param {*} value + * @fires QueryBuilder.validationError + * @private + */ +QueryBuilder.prototype.triggerValidationError = function(node, error, value) { + if (!$.isArray(error)) { + error = [error]; + } + + /** + * Fired when a validation error occurred, can be prevented + * @event validationError + * @memberof QueryBuilder + * @param {Node} node + * @param {string} error + * @param {*} value + */ + var e = this.trigger('validationError', node, error, value); + if (!e.isDefaultPrevented()) { + node.error = error; + } +}; + + +/** + * Destroys the builder + * @fires QueryBuilder.beforeDestroy + */ +QueryBuilder.prototype.destroy = function() { + /** + * Before the {@link QueryBuilder#destroy} method + * @event beforeDestroy + * @memberof QueryBuilder + */ + this.trigger('beforeDestroy'); + + if (this.status.generated_id) { + this.$el.removeAttr('id'); + } + + this.clear(); + this.model = null; + + this.$el + .off('.queryBuilder') + .removeClass('query-builder') + .removeData('queryBuilder'); + + delete this.$el[0].queryBuilder; +}; + +/** + * Clear all rules and resets the root group + * @fires QueryBuilder.beforeReset + * @fires QueryBuilder.afterReset + */ +QueryBuilder.prototype.reset = function() { + /** + * Before the {@link QueryBuilder#reset} method, can be prevented + * @event beforeReset + * @memberof QueryBuilder + */ + var e = this.trigger('beforeReset'); + if (e.isDefaultPrevented()) { + return; + } + + this.status.group_id = 1; + this.status.rule_id = 0; + + this.model.root.empty(); + + this.model.root.data = undefined; + this.model.root.flags = $.extend({}, this.settings.default_group_flags); + this.model.root.condition = this.settings.default_condition; + + this.addRule(this.model.root); + + /** + * After the {@link QueryBuilder#reset} method + * @event afterReset + * @memberof QueryBuilder + */ + this.trigger('afterReset'); + + this.trigger('rulesChanged'); +}; + +/** + * Clears all rules and removes the root group + * @fires QueryBuilder.beforeClear + * @fires QueryBuilder.afterClear + */ +QueryBuilder.prototype.clear = function() { + /** + * Before the {@link QueryBuilder#clear} method, can be prevented + * @event beforeClear + * @memberof QueryBuilder + */ + var e = this.trigger('beforeClear'); + if (e.isDefaultPrevented()) { + return; + } + + this.status.group_id = 0; + this.status.rule_id = 0; + + if (this.model.root) { + this.model.root.drop(); + this.model.root = null; + } + + /** + * After the {@link QueryBuilder#clear} method + * @event afterClear + * @memberof QueryBuilder + */ + this.trigger('afterClear'); + + this.trigger('rulesChanged'); +}; + +/** + * Modifies the builder configuration.
+ * Only options defined in QueryBuilder.modifiable_options are modifiable + * @param {object} options + */ +QueryBuilder.prototype.setOptions = function(options) { + $.each(options, function(opt, value) { + if (QueryBuilder.modifiable_options.indexOf(opt) !== -1) { + this.settings[opt] = value; + } + }.bind(this)); +}; + +/** + * Returns the model associated to a DOM object, or the root model + * @param {jQuery} [target] + * @returns {Node} + */ +QueryBuilder.prototype.getModel = function(target) { + if (!target) { + return this.model.root; + } + else if (target instanceof Node) { + return target; + } + else { + return $(target).data('queryBuilderModel'); + } +}; + +/** + * Validates the whole builder + * @param {object} [options] + * @param {boolean} [options.skip_empty=false] - skips validating rules that have no filter selected + * @returns {boolean} + * @fires QueryBuilder.changer:validate + */ +QueryBuilder.prototype.validate = function(options) { + options = $.extend({ + skip_empty: false + }, options); + + this.clearErrors(); + + var self = this; + + var valid = (function parse(group) { + var done = 0; + var errors = 0; + + group.each(function(rule) { + if (!rule.filter && options.skip_empty) { + return; + } + + if (!rule.filter) { + self.triggerValidationError(rule, 'no_filter', null); + errors++; + return; + } + + if (!rule.operator) { + self.triggerValidationError(rule, 'no_operator', null); + errors++; + return; + } + + if (rule.operator.nb_inputs !== 0) { + var valid = self.validateValue(rule, rule.value); + + if (valid !== true) { + self.triggerValidationError(rule, valid, rule.value); + errors++; + return; + } + } + + done++; + + }, function(group) { + var res = parse(group); + if (res === true) { + done++; + } + else if (res === false) { + errors++; + } + }); + + if (errors > 0) { + return false; + } + else if (done === 0 && !group.isRoot() && options.skip_empty) { + return null; + } + else if (done === 0 && (!self.settings.allow_empty || !group.isRoot())) { + self.triggerValidationError(group, 'empty_group', null); + return false; + } + + return true; + + }(this.model.root)); + + /** + * Modifies the result of the {@link QueryBuilder#validate} method + * @event changer:validate + * @memberof QueryBuilder + * @param {boolean} valid + * @returns {boolean} + */ + return this.change('validate', valid); +}; + +/** + * Gets an object representing current rules + * @param {object} [options] + * @param {boolean|string} [options.get_flags=false] - export flags, true: only changes from default flags or 'all' + * @param {boolean} [options.allow_invalid=false] - returns rules even if they are invalid + * @param {boolean} [options.skip_empty=false] - remove rules that have no filter selected + * @returns {object} + * @fires QueryBuilder.changer:ruleToJson + * @fires QueryBuilder.changer:groupToJson + * @fires QueryBuilder.changer:getRules + */ +QueryBuilder.prototype.getRules = function(options) { + options = $.extend({ + get_flags: false, + allow_invalid: false, + skip_empty: false + }, options); + + var valid = this.validate(options); + if (!valid && !options.allow_invalid) { + return null; + } + + var self = this; + + var out = (function parse(group) { + var groupData = { + condition: group.condition, + rules: [] + }; + + if (group.data) { + groupData.data = $.extendext(true, 'replace', {}, group.data); + } + + if (options.get_flags) { + var flags = self.getGroupFlags(group.flags, options.get_flags === 'all'); + if (!$.isEmptyObject(flags)) { + groupData.flags = flags; + } + } + + group.each(function(rule) { + if (!rule.filter && options.skip_empty) { + return; + } + + var value = null; + if (!rule.operator || rule.operator.nb_inputs !== 0) { + value = rule.value; + } + + var ruleData = { + id: rule.filter ? rule.filter.id : null, + field: rule.filter ? rule.filter.field : null, + type: rule.filter ? rule.filter.type : null, + input: rule.filter ? rule.filter.input : null, + operator: rule.operator ? rule.operator.type : null, + value: value + }; + + if (rule.filter && rule.filter.data || rule.data) { + ruleData.data = $.extendext(true, 'replace', {}, rule.filter ? rule.filter.data : {}, rule.data); + } + + if (options.get_flags) { + var flags = self.getRuleFlags(rule.flags, options.get_flags === 'all'); + if (!$.isEmptyObject(flags)) { + ruleData.flags = flags; + } + } + + /** + * Modifies the JSON generated from a Rule object + * @event changer:ruleToJson + * @memberof QueryBuilder + * @param {object} json + * @param {Rule} rule + * @returns {object} + */ + groupData.rules.push(self.change('ruleToJson', ruleData, rule)); + + }, function(model) { + var data = parse(model); + if (data.rules.length !== 0 || !options.skip_empty) { + groupData.rules.push(data); + } + }, this); + + /** + * Modifies the JSON generated from a Group object + * @event changer:groupToJson + * @memberof QueryBuilder + * @param {object} json + * @param {Group} group + * @returns {object} + */ + return self.change('groupToJson', groupData, group); + + }(this.model.root)); + + out.valid = valid; + + /** + * Modifies the result of the {@link QueryBuilder#getRules} method + * @event changer:getRules + * @memberof QueryBuilder + * @param {object} json + * @returns {object} + */ + return this.change('getRules', out); +}; + +/** + * Sets rules from object + * @param {object} data + * @param {object} [options] + * @param {boolean} [options.allow_invalid=false] - silent-fail if the data are invalid + * @throws RulesError, UndefinedConditionError + * @fires QueryBuilder.changer:setRules + * @fires QueryBuilder.changer:jsonToRule + * @fires QueryBuilder.changer:jsonToGroup + * @fires QueryBuilder.afterSetRules + */ +QueryBuilder.prototype.setRules = function(data, options) { + options = $.extend({ + allow_invalid: false + }, options); + + if ($.isArray(data)) { + data = { + condition: this.settings.default_condition, + rules: data + }; + } + + if (!data || !data.rules || (data.rules.length === 0 && !this.settings.allow_empty)) { + Utils.error('RulesParse', 'Incorrect data object passed'); + } + + this.clear(); + this.setRoot(false, data.data, this.parseGroupFlags(data)); + + /** + * Modifies data before the {@link QueryBuilder#setRules} method + * @event changer:setRules + * @memberof QueryBuilder + * @param {object} json + * @param {object} options + * @returns {object} + */ + data = this.change('setRules', data, options); + + var self = this; + + (function add(data, group) { + if (group === null) { + return; + } + + if (data.condition === undefined) { + data.condition = self.settings.default_condition; + } + else if (self.settings.conditions.indexOf(data.condition) == -1) { + Utils.error(!options.allow_invalid, 'UndefinedCondition', 'Invalid condition "{0}"', data.condition); + data.condition = self.settings.default_condition; + } + + group.condition = data.condition; + + data.rules.forEach(function(item) { + var model; + + if (item.rules !== undefined) { + if (self.settings.allow_groups !== -1 && self.settings.allow_groups < group.level) { + Utils.error(!options.allow_invalid, 'RulesParse', 'No more than {0} groups are allowed', self.settings.allow_groups); + self.reset(); + } + else { + model = self.addGroup(group, false, item.data, self.parseGroupFlags(item)); + if (model === null) { + return; + } + + add(item, model); + } + } + else { + if (!item.empty) { + if (item.id === undefined) { + Utils.error(!options.allow_invalid, 'RulesParse', 'Missing rule field id'); + item.empty = true; + } + if (item.operator === undefined) { + item.operator = 'equal'; + } + } + + model = self.addRule(group, item.data, self.parseRuleFlags(item)); + if (model === null) { + return; + } + + if (!item.empty) { + model.filter = self.getFilterById(item.id, !options.allow_invalid); + } + + if (model.filter) { + model.operator = self.getOperatorByType(item.operator, !options.allow_invalid); + + if (!model.operator) { + model.operator = self.getOperators(model.filter)[0]; + } + } + + if (model.operator && model.operator.nb_inputs !== 0) { + if (item.value !== undefined) { + model.value = item.value; + } + else if (model.filter.default_value !== undefined) { + model.value = model.filter.default_value; + } + } + + /** + * Modifies the Rule object generated from the JSON + * @event changer:jsonToRule + * @memberof QueryBuilder + * @param {Rule} rule + * @param {object} json + * @returns {Rule} the same rule + */ + if (self.change('jsonToRule', model, item) != model) { + Utils.error('RulesParse', 'Plugin tried to change rule reference'); + } + } + }); + + /** + * Modifies the Group object generated from the JSON + * @event changer:jsonToGroup + * @memberof QueryBuilder + * @param {Group} group + * @param {object} json + * @returns {Group} the same group + */ + if (self.change('jsonToGroup', group, data) != group) { + Utils.error('RulesParse', 'Plugin tried to change group reference'); + } + + }(data, this.model.root)); + + /** + * After the {@link QueryBuilder#setRules} method + * @event afterSetRules + * @memberof QueryBuilder + */ + this.trigger('afterSetRules'); +}; + + +/** + * Performs value validation + * @param {Rule} rule + * @param {string|string[]} value + * @returns {array|boolean} true or error array + * @fires QueryBuilder.changer:validateValue + */ +QueryBuilder.prototype.validateValue = function(rule, value) { + var validation = rule.filter.validation || {}; + var result = true; + + if (validation.callback) { + result = validation.callback.call(this, value, rule); + } + else { + result = this._validateValue(rule, value); + } + + /** + * Modifies the result of the rule validation method + * @event changer:validateValue + * @memberof QueryBuilder + * @param {array|boolean} result - true or an error array + * @param {*} value + * @param {Rule} rule + * @returns {array|boolean} + */ + return this.change('validateValue', result, value, rule); +}; + +/** + * Default validation function + * @param {Rule} rule + * @param {string|string[]} value + * @returns {array|boolean} true or error array + * @throws ConfigError + * @private + */ +QueryBuilder.prototype._validateValue = function(rule, value) { + var filter = rule.filter; + var operator = rule.operator; + var validation = filter.validation || {}; + var result = true; + var tmp, tempValue; + + if (rule.operator.nb_inputs === 1) { + value = [value]; + } + + for (var i = 0; i < operator.nb_inputs; i++) { + if (!operator.multiple && $.isArray(value[i]) && value[i].length > 1) { + result = ['operator_not_multiple', operator.type, this.translate('operators', operator.type)]; + break; + } + + switch (filter.input) { + case 'radio': + if (value[i] === undefined || value[i].length === 0) { + if (!validation.allow_empty_value) { + result = ['radio_empty']; + } + break; + } + break; + + case 'checkbox': + if (value[i] === undefined || value[i].length === 0) { + if (!validation.allow_empty_value) { + result = ['checkbox_empty']; + } + break; + } + break; + + case 'select': + if (value[i] === undefined || value[i].length === 0 || (filter.placeholder && value[i] == filter.placeholder_value)) { + if (!validation.allow_empty_value) { + result = ['select_empty']; + } + break; + } + break; + + default: + tempValue = $.isArray(value[i]) ? value[i] : [value[i]]; + + for (var j = 0; j < tempValue.length; j++) { + switch (QueryBuilder.types[filter.type]) { + case 'string': + if (tempValue[j] === undefined || tempValue[j].length === 0) { + if (!validation.allow_empty_value) { + result = ['string_empty']; + } + break; + } + if (validation.min !== undefined) { + if (tempValue[j].length < parseInt(validation.min)) { + result = [this.getValidationMessage(validation, 'min', 'string_exceed_min_length'), validation.min]; + break; + } + } + if (validation.max !== undefined) { + if (tempValue[j].length > parseInt(validation.max)) { + result = [this.getValidationMessage(validation, 'max', 'string_exceed_max_length'), validation.max]; + break; + } + } + if (validation.format) { + if (typeof validation.format == 'string') { + validation.format = new RegExp(validation.format); + } + if (!validation.format.test(tempValue[j])) { + result = [this.getValidationMessage(validation, 'format', 'string_invalid_format'), validation.format]; + break; + } + } + break; + + case 'number': + if (tempValue[j] === undefined || tempValue[j].length === 0) { + if (!validation.allow_empty_value) { + result = ['number_nan']; + } + break; + } + if (isNaN(tempValue[j])) { + result = ['number_nan']; + break; + } + if (filter.type == 'integer') { + if (parseInt(tempValue[j]) != tempValue[j]) { + result = ['number_not_integer']; + break; + } + } + else { + if (parseFloat(tempValue[j]) != tempValue[j]) { + result = ['number_not_double']; + break; + } + } + if (validation.min !== undefined) { + if (tempValue[j] < parseFloat(validation.min)) { + result = [this.getValidationMessage(validation, 'min', 'number_exceed_min'), validation.min]; + break; + } + } + if (validation.max !== undefined) { + if (tempValue[j] > parseFloat(validation.max)) { + result = [this.getValidationMessage(validation, 'max', 'number_exceed_max'), validation.max]; + break; + } + } + if (validation.step !== undefined && validation.step !== 'any') { + var v = (tempValue[j] / validation.step).toPrecision(14); + if (parseInt(v) != v) { + result = [this.getValidationMessage(validation, 'step', 'number_wrong_step'), validation.step]; + break; + } + } + break; + + case 'datetime': + if (tempValue[j] === undefined || tempValue[j].length === 0) { + if (!validation.allow_empty_value) { + result = ['datetime_empty']; + } + break; + } + + // we need MomentJS + if (validation.format) { + if (!('moment' in window)) { + Utils.error('MissingLibrary', 'MomentJS is required for Date/Time validation. Get it here http://momentjs.com'); + } + + var datetime = moment(tempValue[j], validation.format); + if (!datetime.isValid()) { + result = [this.getValidationMessage(validation, 'format', 'datetime_invalid'), validation.format]; + break; + } + else { + if (validation.min) { + if (datetime < moment(validation.min, validation.format)) { + result = [this.getValidationMessage(validation, 'min', 'datetime_exceed_min'), validation.min]; + break; + } + } + if (validation.max) { + if (datetime > moment(validation.max, validation.format)) { + result = [this.getValidationMessage(validation, 'max', 'datetime_exceed_max'), validation.max]; + break; + } + } + } + } + break; + + case 'boolean': + if (tempValue[j] === undefined || tempValue[j].length === 0) { + if (!validation.allow_empty_value) { + result = ['boolean_not_valid']; + } + break; + } + tmp = ('' + tempValue[j]).trim().toLowerCase(); + if (tmp !== 'true' && tmp !== 'false' && tmp !== '1' && tmp !== '0' && tempValue[j] !== 1 && tempValue[j] !== 0) { + result = ['boolean_not_valid']; + break; + } + } + + if (result !== true) { + break; + } + } + } + + if (result !== true) { + break; + } + } + + if ((rule.operator.type === 'between' || rule.operator.type === 'not_between') && value.length === 2) { + switch (QueryBuilder.types[filter.type]) { + case 'number': + if (value[0] > value[1]) { + result = ['number_between_invalid', value[0], value[1]]; + } + break; + + case 'datetime': + // we need MomentJS + if (validation.format) { + if (!('moment' in window)) { + Utils.error('MissingLibrary', 'MomentJS is required for Date/Time validation. Get it here http://momentjs.com'); + } + + if (moment(value[0], validation.format).isAfter(moment(value[1], validation.format))) { + result = ['datetime_between_invalid', value[0], value[1]]; + } + } + break; + } + } + + return result; +}; + +/** + * Returns an incremented group ID + * @returns {string} + * @private + */ +QueryBuilder.prototype.nextGroupId = function() { + return this.status.id + '_group_' + (this.status.group_id++); +}; + +/** + * Returns an incremented rule ID + * @returns {string} + * @private + */ +QueryBuilder.prototype.nextRuleId = function() { + return this.status.id + '_rule_' + (this.status.rule_id++); +}; + +/** + * Returns the operators for a filter + * @param {string|object} filter - filter id or filter object + * @returns {object[]} + * @fires QueryBuilder.changer:getOperators + */ +QueryBuilder.prototype.getOperators = function(filter) { + if (typeof filter == 'string') { + filter = this.getFilterById(filter); + } + + var result = []; + + for (var i = 0, l = this.operators.length; i < l; i++) { + // filter operators check + if (filter.operators) { + if (filter.operators.indexOf(this.operators[i].type) == -1) { + continue; + } + } + // type check + else if (this.operators[i].apply_to.indexOf(QueryBuilder.types[filter.type]) == -1) { + continue; + } + + result.push(this.operators[i]); + } + + // keep sort order defined for the filter + if (filter.operators) { + result.sort(function(a, b) { + return filter.operators.indexOf(a.type) - filter.operators.indexOf(b.type); + }); + } + + /** + * Modifies the operators available for a filter + * @event changer:getOperators + * @memberof QueryBuilder + * @param {QueryBuilder.Operator[]} operators + * @param {QueryBuilder.Filter} filter + * @returns {QueryBuilder.Operator[]} + */ + return this.change('getOperators', result, filter); +}; + +/** + * Returns a particular filter by its id + * @param {string} id + * @param {boolean} [doThrow=true] + * @returns {object|null} + * @throws UndefinedFilterError + */ +QueryBuilder.prototype.getFilterById = function(id, doThrow) { + if (id == '-1') { + return null; + } + + for (var i = 0, l = this.filters.length; i < l; i++) { + if (this.filters[i].id == id) { + return this.filters[i]; + } + } + + Utils.error(doThrow !== false, 'UndefinedFilter', 'Undefined filter "{0}"', id); + + return null; +}; + +/** + * Returns a particular operator by its type + * @param {string} type + * @param {boolean} [doThrow=true] + * @returns {object|null} + * @throws UndefinedOperatorError + */ +QueryBuilder.prototype.getOperatorByType = function(type, doThrow) { + if (type == '-1') { + return null; + } + + for (var i = 0, l = this.operators.length; i < l; i++) { + if (this.operators[i].type == type) { + return this.operators[i]; + } + } + + Utils.error(doThrow !== false, 'UndefinedOperator', 'Undefined operator "{0}"', type); + + return null; +}; + +/** + * Returns rule's current input value + * @param {Rule} rule + * @returns {*} + * @fires QueryBuilder.changer:getRuleValue + * @private + */ +QueryBuilder.prototype.getRuleInputValue = function(rule) { + var filter = rule.filter; + var operator = rule.operator; + var value = []; + + if (filter.valueGetter) { + value = filter.valueGetter.call(this, rule); + } + else { + var $value = rule.$el.find(QueryBuilder.selectors.value_container); + + for (var i = 0; i < operator.nb_inputs; i++) { + var name = Utils.escapeElementId(rule.id + '_value_' + i); + var tmp; + + switch (filter.input) { + case 'radio': + value.push($value.find('[name=' + name + ']:checked').val()); + break; + + case 'checkbox': + tmp = []; + // jshint loopfunc:true + $value.find('[name=' + name + ']:checked').each(function() { + tmp.push($(this).val()); + }); + // jshint loopfunc:false + value.push(tmp); + break; + + case 'select': + if (filter.multiple) { + tmp = []; + // jshint loopfunc:true + $value.find('[name=' + name + '] option:selected').each(function() { + tmp.push($(this).val()); + }); + // jshint loopfunc:false + value.push(tmp); + } + else { + value.push($value.find('[name=' + name + '] option:selected').val()); + } + break; + + default: + value.push($value.find('[name=' + name + ']').val()); + } + } + + value = value.map(function(val) { + if (operator.multiple && filter.value_separator && typeof val == 'string') { + val = val.split(filter.value_separator); + } + + if ($.isArray(val)) { + return val.map(function(subval) { + return Utils.changeType(subval, filter.type); + }); + } + else { + return Utils.changeType(val, filter.type); + } + }); + + if (operator.nb_inputs === 1) { + value = value[0]; + } + + // @deprecated + if (filter.valueParser) { + value = filter.valueParser.call(this, rule, value); + } + } + + /** + * Modifies the rule's value grabbed from the DOM + * @event changer:getRuleValue + * @memberof QueryBuilder + * @param {*} value + * @param {Rule} rule + * @returns {*} + */ + return this.change('getRuleValue', value, rule); +}; + +/** + * Sets the value of a rule's input + * @param {Rule} rule + * @param {*} value + * @private + */ +QueryBuilder.prototype.setRuleInputValue = function(rule, value) { + var filter = rule.filter; + var operator = rule.operator; + + if (!filter || !operator) { + return; + } + + rule._updating_input = true; + + if (filter.valueSetter) { + filter.valueSetter.call(this, rule, value); + } + else { + var $value = rule.$el.find(QueryBuilder.selectors.value_container); + + if (operator.nb_inputs == 1) { + value = [value]; + } + + for (var i = 0; i < operator.nb_inputs; i++) { + var name = Utils.escapeElementId(rule.id + '_value_' + i); + + switch (filter.input) { + case 'radio': + $value.find('[name=' + name + '][value="' + value[i] + '"]').prop('checked', true).trigger('change'); + break; + + case 'checkbox': + if (!$.isArray(value[i])) { + value[i] = [value[i]]; + } + // jshint loopfunc:true + value[i].forEach(function(value) { + $value.find('[name=' + name + '][value="' + value + '"]').prop('checked', true).trigger('change'); + }); + // jshint loopfunc:false + break; + + default: + if (operator.multiple && filter.value_separator && $.isArray(value[i])) { + value[i] = value[i].join(filter.value_separator); + } + $value.find('[name=' + name + ']').val(value[i]).trigger('change'); + break; + } + } + } + + rule._updating_input = false; +}; + +/** + * Parses rule flags + * @param {object} rule + * @returns {object} + * @fires QueryBuilder.changer:parseRuleFlags + * @private + */ +QueryBuilder.prototype.parseRuleFlags = function(rule) { + var flags = $.extend({}, this.settings.default_rule_flags); + + if (rule.readonly) { + $.extend(flags, { + filter_readonly: true, + operator_readonly: true, + value_readonly: true, + no_delete: true + }); + } + + if (rule.flags) { + $.extend(flags, rule.flags); + } + + /** + * Modifies the consolidated rule's flags + * @event changer:parseRuleFlags + * @memberof QueryBuilder + * @param {object} flags + * @param {object} rule - not a Rule object + * @returns {object} + */ + return this.change('parseRuleFlags', flags, rule); +}; + +/** + * Gets a copy of flags of a rule + * @param {object} flags + * @param {boolean} [all=false] - return all flags or only changes from default flags + * @returns {object} + * @private + */ +QueryBuilder.prototype.getRuleFlags = function(flags, all) { + if (all) { + return $.extend({}, flags); + } + else { + var ret = {}; + $.each(this.settings.default_rule_flags, function(key, value) { + if (flags[key] !== value) { + ret[key] = flags[key]; + } + }); + return ret; + } +}; + +/** + * Parses group flags + * @param {object} group + * @returns {object} + * @fires QueryBuilder.changer:parseGroupFlags + * @private + */ +QueryBuilder.prototype.parseGroupFlags = function(group) { + var flags = $.extend({}, this.settings.default_group_flags); + + if (group.readonly) { + $.extend(flags, { + condition_readonly: true, + no_add_rule: true, + no_add_group: true, + no_delete: true + }); + } + + if (group.flags) { + $.extend(flags, group.flags); + } + + /** + * Modifies the consolidated group's flags + * @event changer:parseGroupFlags + * @memberof QueryBuilder + * @param {object} flags + * @param {object} group - not a Group object + * @returns {object} + */ + return this.change('parseGroupFlags', flags, group); +}; + +/** + * Gets a copy of flags of a group + * @param {object} flags + * @param {boolean} [all=false] - return all flags or only changes from default flags + * @returns {object} + * @private + */ +QueryBuilder.prototype.getGroupFlags = function(flags, all) { + if (all) { + return $.extend({}, flags); + } + else { + var ret = {}; + $.each(this.settings.default_group_flags, function(key, value) { + if (flags[key] !== value) { + ret[key] = flags[key]; + } + }); + return ret; + } +}; + +/** + * Translate a label either by looking in the `lang` object or in itself if it's an object where keys are language codes + * @param {string} [category] + * @param {string|object} key + * @returns {string} + * @fires QueryBuilder.changer:translate + */ +QueryBuilder.prototype.translate = function(category, key) { + if (!key) { + key = category; + category = undefined; + } + + var translation; + if (typeof key === 'object') { + translation = key[this.settings.lang_code] || key['en']; + } + else { + translation = (category ? this.lang[category] : this.lang)[key] || key; + } + + /** + * Modifies the translated label + * @event changer:translate + * @memberof QueryBuilder + * @param {string} translation + * @param {string|object} key + * @param {string} [category] + * @returns {string} + */ + return this.change('translate', translation, key, category); +}; + +/** + * Returns a validation message + * @param {object} validation + * @param {string} type + * @param {string} def + * @returns {string} + * @private + */ +QueryBuilder.prototype.getValidationMessage = function(validation, type, def) { + return validation.messages && validation.messages[type] || def; +}; + + +QueryBuilder.templates.group = '\ +
\ +
\ +
\ + \ + {{? it.settings.allow_groups===-1 || it.settings.allow_groups>=it.level }} \ + \ + {{?}} \ + {{? it.level>1 }} \ + \ + {{?}} \ +
\ +
\ + {{~ it.conditions: condition }} \ + \ + {{~}} \ +
\ + {{? it.settings.display_errors }} \ +
\ + {{?}} \ +
\ +
\ +
\ +
\ +
'; + +QueryBuilder.templates.rule = '\ +
\ +
\ +
\ + \ +
\ +
\ + {{? it.settings.display_errors }} \ +
\ + {{?}} \ +
\ +
\ +
\ +
'; + +QueryBuilder.templates.filterSelect = '\ +{{ var optgroup = null; }} \ +'; + +QueryBuilder.templates.operatorSelect = '\ +{{? it.operators.length === 1 }} \ + \ +{{= it.translate("operators", it.operators[0].type) }} \ + \ +{{?}} \ +{{ var optgroup = null; }} \ +'; + +QueryBuilder.templates.ruleValueSelect = '\ +{{ var optgroup = null; }} \ +'; + +/** + * Returns group's HTML + * @param {string} group_id + * @param {int} level + * @returns {string} + * @fires QueryBuilder.changer:getGroupTemplate + * @private + */ +QueryBuilder.prototype.getGroupTemplate = function(group_id, level) { + var h = this.templates.group({ + builder: this, + group_id: group_id, + level: level, + conditions: this.settings.conditions, + icons: this.icons, + settings: this.settings, + translate: this.translate.bind(this) + }); + + /** + * Modifies the raw HTML of a group + * @event changer:getGroupTemplate + * @memberof QueryBuilder + * @param {string} html + * @param {int} level + * @returns {string} + */ + return this.change('getGroupTemplate', h, level); +}; + +/** + * Returns rule's HTML + * @param {string} rule_id + * @returns {string} + * @fires QueryBuilder.changer:getRuleTemplate + * @private + */ +QueryBuilder.prototype.getRuleTemplate = function(rule_id) { + var h = this.templates.rule({ + builder: this, + rule_id: rule_id, + icons: this.icons, + settings: this.settings, + translate: this.translate.bind(this) + }); + + /** + * Modifies the raw HTML of a rule + * @event changer:getRuleTemplate + * @memberof QueryBuilder + * @param {string} html + * @returns {string} + */ + return this.change('getRuleTemplate', h); +}; + +/** + * Returns rule's filter HTML + * @param {Rule} rule + * @param {object[]} filters + * @returns {string} + * @fires QueryBuilder.changer:getRuleFilterTemplate + * @private + */ +QueryBuilder.prototype.getRuleFilterSelect = function(rule, filters) { + var h = this.templates.filterSelect({ + builder: this, + rule: rule, + filters: filters, + icons: this.icons, + settings: this.settings, + translate: this.translate.bind(this) + }); + + /** + * Modifies the raw HTML of the rule's filter dropdown + * @event changer:getRuleFilterSelect + * @memberof QueryBuilder + * @param {string} html + * @param {Rule} rule + * @param {QueryBuilder.Filter[]} filters + * @returns {string} + */ + return this.change('getRuleFilterSelect', h, rule, filters); +}; + +/** + * Returns rule's operator HTML + * @param {Rule} rule + * @param {object[]} operators + * @returns {string} + * @fires QueryBuilder.changer:getRuleOperatorTemplate + * @private + */ +QueryBuilder.prototype.getRuleOperatorSelect = function(rule, operators) { + var h = this.templates.operatorSelect({ + builder: this, + rule: rule, + operators: operators, + icons: this.icons, + settings: this.settings, + translate: this.translate.bind(this) + }); + + /** + * Modifies the raw HTML of the rule's operator dropdown + * @event changer:getRuleOperatorSelect + * @memberof QueryBuilder + * @param {string} html + * @param {Rule} rule + * @param {QueryBuilder.Operator[]} operators + * @returns {string} + */ + return this.change('getRuleOperatorSelect', h, rule, operators); +}; + +/** + * Returns the rule's value select HTML + * @param {string} name + * @param {Rule} rule + * @returns {string} + * @fires QueryBuilder.changer:getRuleValueSelect + * @private + */ +QueryBuilder.prototype.getRuleValueSelect = function(name, rule) { + var h = this.templates.ruleValueSelect({ + builder: this, + name: name, + rule: rule, + icons: this.icons, + settings: this.settings, + translate: this.translate.bind(this) + }); + + /** + * Modifies the raw HTML of the rule's value dropdown (in case of a "select filter) + * @event changer:getRuleValueSelect + * @memberof QueryBuilder + * @param {string} html + * @param [string} name + * @param {Rule} rule + * @returns {string} + */ + return this.change('getRuleValueSelect', h, name, rule); +}; + +/** + * Returns the rule's value HTML + * @param {Rule} rule + * @param {int} value_id + * @returns {string} + * @fires QueryBuilder.changer:getRuleInput + * @private + */ +QueryBuilder.prototype.getRuleInput = function(rule, value_id) { + var filter = rule.filter; + var validation = rule.filter.validation || {}; + var name = rule.id + '_value_' + value_id; + var c = filter.vertical ? ' class=block' : ''; + var h = ''; + var placeholder = Array.isArray(filter.placeholder) ? filter.placeholder[value_id] : filter.placeholder; + + if (typeof filter.input == 'function') { + h = filter.input.call(this, rule, name); + } + else { + switch (filter.input) { + case 'radio': + case 'checkbox': + Utils.iterateOptions(filter.values, function(key, val) { + h += ' ' + val + ' '; + }); + break; + + case 'select': + h = this.getRuleValueSelect(name, rule); + break; + + case 'textarea': + h += '";break;case"number":l+=' "})}})},{font:"glyphicons",color:"default"}),c.define("bt-selectpicker",function(r){$.fn.selectpicker&&$.fn.selectpicker.Constructor||m.error("MissingLibrary",'Bootstrap Select is required to use "bt-selectpicker" plugin. Get it here: http://silviomoreto.github.io/bootstrap-select');var n=c.selectors;this.on("afterCreateRuleFilters",function(e,t){t.$el.find(n.rule_filter).removeClass("form-control").selectpicker(r)}),this.on("afterCreateRuleOperators",function(e,t){t.$el.find(n.rule_operator).removeClass("form-control").selectpicker(r)}),this.on("afterUpdateRuleFilter",function(e,t){t.$el.find(n.rule_filter).selectpicker("render")}),this.on("afterUpdateRuleOperator",function(e,t){t.$el.find(n.rule_operator).selectpicker("render")}),this.on("beforeDeleteRule",function(e,t){t.$el.find(n.rule_filter).selectpicker("destroy"),t.$el.find(n.rule_operator).selectpicker("destroy")})},{container:"body",style:"btn-inverse btn-xs",width:"auto",showIcon:!1}),c.define("bt-tooltip-errors",function(n){$.fn.tooltip&&$.fn.tooltip.Constructor&&$.fn.tooltip.Constructor.prototype.fixTitle||m.error("MissingLibrary",'Bootstrap Tooltip is required to use "bt-tooltip-errors" plugin. Get it here: http://getbootstrap.com');var i=this;this.on("getRuleTemplate.filter getGroupTemplate.filter",function(e){var t=$($.parseHTML(e.value));t.find(c.selectors.error_container).attr("data-toggle","tooltip"),e.value=t.prop("outerHTML")}),this.model.on("update",function(e,t,r){"error"==r&&i.settings.display_errors&&t.$el.find(c.selectors.error_container).eq(0).tooltip(n).tooltip("hide").tooltip("fixTitle")})},{placement:"right"}),c.extend({setFilters:function(e,t){var r=this;void 0===t&&(t=e,e=!1),t=this.checkFilters(t);var n=(t=this.change("setFilters",t)).map(function(e){return e.id});if(e||function e(t){t.each(function(e){e.filter&&-1===n.indexOf(e.filter.id)&&m.error("ChangeFilter",'A rule is using filter "{0}"',e.filter.id)},e)}(this.model.root),this.filters=t,function e(t){t.each(!0,function(e){e.filter&&-1===n.indexOf(e.filter.id)?(e.drop(),r.trigger("rulesChanged")):(r.createRuleFilters(e),e.$el.find(c.selectors.rule_filter).val(e.filter?e.filter.id:"-1"),r.trigger("afterUpdateRuleFilter",e))},e)}(this.model.root),this.settings.plugins&&(this.settings.plugins["unique-filter"]&&this.updateDisabledFilters(),this.settings.plugins["bt-selectpicker"]&&this.$el.find(c.selectors.rule_filter).selectpicker("render")),this.settings.default_filter)try{this.getFilterById(this.settings.default_filter)}catch(e){this.settings.default_filter=null}this.trigger("afterSetFilters",t)},addFilter:function(e,r){void 0===r||"#end"==r?r=this.filters.length:"#start"==r&&(r=0),$.isArray(e)||(e=[e]);var t=$.extend(!0,[],this.filters);parseInt(r)==r?Array.prototype.splice.apply(t,[r,0].concat(e)):this.filters.some(function(e,t){if(e.id==r)return r=t+1,!0})?Array.prototype.splice.apply(t,[r,0].concat(e)):Array.prototype.push.apply(t,e),this.setFilters(t)},removeFilter:function(t,e){var r=$.extend(!0,[],this.filters);"string"==typeof t&&(t=[t]),r=r.filter(function(e){return-1===t.indexOf(e.id)}),this.setFilters(e,r)}}),c.define("chosen-selectpicker",function(r){$.fn.chosen||m.error("MissingLibrary",'chosen is required to use "chosen-selectpicker" plugin. Get it here: https://github.com/harvesthq/chosen'),this.settings.plugins["bt-selectpicker"]&&m.error("Conflict","bt-selectpicker is already selected as the dropdown plugin. Please remove chosen-selectpicker from the plugin list");var n=c.selectors;this.on("afterCreateRuleFilters",function(e,t){t.$el.find(n.rule_filter).removeClass("form-control").chosen(r)}),this.on("afterCreateRuleOperators",function(e,t){1

'))).appendTo(t.$el):r.css("display",""),r.html(' '+n)):r.hide()}):"popover"===i.mode?($.fn.popover&&$.fn.popover.Constructor&&$.fn.popover.Constructor.prototype.fixTitle||m.error("MissingLibrary",'Bootstrap Popover is required to use "filter-description" plugin. Get it here: http://getbootstrap.com'),this.on("afterUpdateRuleFilter afterUpdateRuleOperator",function(e,t){var r=t.$el.find("button.filter-description"),n=e.builder.getFilterDescription(t.filter,t);n?(0===r.length?((r=$($.parseHTML(''))).prependTo(t.$el.find(c.selectors.rule_actions)),r.popover({placement:"left",container:"body",html:!0}),r.on("mouseout",function(){r.popover("hide")})):r.css("display",""),r.data("bs.popover").options.content=n,r.attr("aria-describedby")&&r.popover("show")):(r.hide(),r.data("bs.popover")&&r.popover("hide"))})):"bootbox"===i.mode&&("bootbox"in window||m.error("MissingLibrary",'Bootbox is required to use "filter-description" plugin. Get it here: http://bootboxjs.com'),this.on("afterUpdateRuleFilter afterUpdateRuleOperator",function(e,t){var r=t.$el.find("button.filter-description"),n=e.builder.getFilterDescription(t.filter,t);n?(0===r.length?((r=$($.parseHTML(''))).prependTo(t.$el.find(c.selectors.rule_actions)),r.on("click",function(){bootbox.alert(r.data("description"))})):r.css("display",""),r.data("description",n)):r.hide()}))},{icon:"glyphicon glyphicon-info-sign",mode:"popover"}),c.extend({getFilterDescription:function(e,t){return e?"function"==typeof e.description?e.description.call(this,t):e.description:void 0}}),c.define("invert",function(r){var n=this,i=c.selectors;this.on("afterInit",function(){n.$el.on("click.queryBuilder","[data-invert=group]",function(){var e=$(this).closest(i.group_container);n.invert(n.getModel(e),r)}),r.display_rules_button&&r.invert_rules&&n.$el.on("click.queryBuilder","[data-invert=rule]",function(){var e=$(this).closest(i.rule_container);n.invert(n.getModel(e),r)})}),r.disable_template||(this.on("getGroupTemplate.filter",function(e){var t=$($.parseHTML(e.value));t.find(i.condition_container).after('"),e.value=t.prop("outerHTML")}),r.display_rules_button&&r.invert_rules&&this.on("getRuleTemplate.filter",function(e){var t=$($.parseHTML(e.value));t.find(i.rule_actions).prepend('"),e.value=t.prop("outerHTML")}))},{icon:"glyphicon glyphicon-random",recursive:!0,invert_rules:!0,display_rules_button:!1,silent_fail:!1,disable_template:!1}),c.defaults({operatorOpposites:{equal:"not_equal",not_equal:"equal",in:"not_in",not_in:"in",less:"greater_or_equal",less_or_equal:"greater",greater:"less_or_equal",greater_or_equal:"less",between:"not_between",not_between:"between",begins_with:"not_begins_with",not_begins_with:"begins_with",contains:"not_contains",not_contains:"contains",ends_with:"not_ends_with",not_ends_with:"ends_with",is_empty:"is_not_empty",is_not_empty:"is_empty",is_null:"is_not_null",is_not_null:"is_null"},conditionOpposites:{AND:"OR",OR:"AND"}}),c.extend({invert:function(e,t){if(!(e instanceof i)){if(!this.model.root)return;t=e,e=this.model.root}if("object"!=typeof t&&(t={}),void 0===t.recursive&&(t.recursive=!0),void 0===t.invert_rules&&(t.invert_rules=!0),void 0===t.silent_fail&&(t.silent_fail=!1),void 0===t.trigger&&(t.trigger=!0),e instanceof a){if(this.settings.conditionOpposites[e.condition]?e.condition=this.settings.conditionOpposites[e.condition]:t.silent_fail||m.error("InvertCondition",'Unknown inverse of condition "{0}"',e.condition),t.recursive){var r=$.extend({},t,{trigger:!1});e.each(function(e){t.invert_rules&&this.invert(e,r)},function(e){this.invert(e,r)},this)}}else if(e instanceof l&&e.operator&&!e.filter.no_invert)if(this.settings.operatorOpposites[e.operator.type]){var n=this.settings.operatorOpposites[e.operator.type];e.filter.operators&&-1==e.filter.operators.indexOf(n)||(e.operator=this.getOperatorByType(n))}else t.silent_fail||m.error("InvertOperator",'Unknown inverse of operator "{0}"',e.operator.type);t.trigger&&(this.trigger("afterInvert",e,t),this.trigger("rulesChanged"))}}),c.defaults({mongoOperators:{equal:function(e){return e[0]},not_equal:function(e){return{$ne:e[0]}},in:function(e){return{$in:e}},not_in:function(e){return{$nin:e}},less:function(e){return{$lt:e[0]}},less_or_equal:function(e){return{$lte:e[0]}},greater:function(e){return{$gt:e[0]}},greater_or_equal:function(e){return{$gte:e[0]}},between:function(e){return{$gte:e[0],$lte:e[1]}},not_between:function(e){return{$lt:e[0],$gt:e[1]}},begins_with:function(e){return{$regex:"^"+m.escapeRegExp(e[0])}},not_begins_with:function(e){return{$regex:"^(?!"+m.escapeRegExp(e[0])+")"}},contains:function(e){return{$regex:m.escapeRegExp(e[0])}},not_contains:function(e){return{$regex:"^((?!"+m.escapeRegExp(e[0])+").)*$",$options:"s"}},ends_with:function(e){return{$regex:m.escapeRegExp(e[0])+"$"}},not_ends_with:function(e){return{$regex:"(? '+n.translate("NOT")+""),e.value=t.prop("outerHTML")}),this.on("groupToJson.filter",function(e,t){e.value.not=t.not}),this.on("jsonToGroup.filter",function(e,t){e.value.not=!!t.not}),this.on("groupToSQL.filter",function(e,t){t.not&&(e.value="NOT ( "+e.value+" )")}),this.on("parseSQLNode.filter",function(e){e.value.name&&"NOT"==e.value.name.toUpperCase()&&(e.value=e.value.arguments.value[0],-1===["AND","OR"].indexOf(e.value.operation.toUpperCase())&&(e.value=new SQLParser.nodes.Op(n.settings.default_condition,e.value,null)),e.value.not=!0)}),this.on("sqlGroupsDistinct.filter",function(e,t,r,n){r.not&&0"+c.selectors.group_not).toggleClass("active",e.not).find("i").attr("class",e.not?t.icon_checked:t.icon_unchecked),this.trigger("afterUpdateGroupNot",e),this.trigger("rulesChanged")}}),c.define("select2",function(i){$.fn.select2||m.error("MissingLibrary",'Select2 is required to use "select2" plugin.');var o=c.selectors,r=function(e,t){if(void 0!==e.filter.input&&"select"===e.filter.input){var r=Object.assign({},i);if(e&&e.filter&&e.filter.data&&e.filter.data.select2&&(r=Object.assign(e.filter.data.select2,r)),i&&i.dropdownParentSelector&&(r.dropdownParent=e.$el.find(o.rule_value).parents(i.dropdownParentSelector).first()),e&&e.data&&e.data.valueLabel){var n=$("").val(e.data.valueId).text(e.data.valueLabel);e.$el.find(o.rule_value).append(n),e.data.valueLabel=void 0,e.data.valueId=void 0}e.$el.find(o.rule_value).removeClass("form-control").select2(r),e.$el.on("select2:close",function(e){var t="scroll.select2";$(e.target).parents().off(t),$(window).off(t)})}};this.on("afterCreateRuleFilters",function(e,t){console.log(e.builder.$el.parents()),setTimeout(function(){i.dropdownParentSelector&&(i.dropdownParent=e.builder.$el.parents(i.dropdownParentSelector).first()),t.$el.find(o.rule_filter).removeClass("form-control").select2(i)},1)}),this.on("afterCreateRuleOperators",function(e,t){setTimeout(function(){i.dropdownParentSelector&&(i.dropdownParent=e.builder.$el.parents(i.dropdownParentSelector).first()),t.$el.find(o.rule_operator).removeClass("form-control").select2(i)},1)}),this.on("afterCreateRuleInput",function(e,t){r(t,e.builder)}),this.on("afterUpdateRuleFilter",function(e,t){setTimeout(function(){i.dropdownParentSelector&&(i.dropdownParent=e.builder.$el.parents(i.dropdownParentSelector).first()),t.$el.find(o.rule_filter).select2(i)},1)}),this.on("afterUpdateRuleOperator",function(e,t){i.dropdownParentSelector&&(i.dropdownParent=e.builder.$el.parents(i.dropdownParentSelector).first()),t.$el.find(o.rule_operator).select2(i)}),this.on("afterUpdateRuleInput",function(e,t){r(t,e.builder)})},{}),c.define("sortable",function(n){var i,o,l,s;"interact"in window||m.error("MissingLibrary",'interact.js is required to use "sortable" plugin. Get it here: http://interactjs.io'),void 0!==n.default_no_sortable&&(m.error(!1,"Config",'Sortable plugin : "default_no_sortable" options is deprecated, use standard "default_rule_flags" and "default_group_flags" instead'),this.settings.default_rule_flags.no_sortable=this.settings.default_group_flags.no_sortable=n.default_no_sortable),interact.dynamicDrop(!0),interact.pointerMoveTolerance(10),this.on("afterAddRule afterAddGroup",function(e,t){if(t!=i){var r=e.builder;n.inherit_no_sortable&&t.parent&&t.parent.flags.no_sortable&&(t.flags.no_sortable=!0),n.inherit_no_drop&&t.parent&&t.parent.flags.no_drop&&(t.flags.no_drop=!0),t.flags.no_sortable||interact(t.$el[0]).draggable({allowFrom:c.selectors.drag_handle,onstart:function(e){s=!1,l=r.getModel(e.target),o=l.$el.clone().appendTo(l.$el.parent()).width(l.$el.outerWidth()).addClass("dragging");var t=$($.parseHTML('
 
')).height(l.$el.outerHeight());i=l.parent.addRule(t,l.getPos()),l.$el.hide()},onmove:function(e){o[0].style.top=e.clientY-15+"px",o[0].style.left=e.clientX-15+"px"},onend:function(e){e.dropzone&&(u(l,$(e.relatedTarget),r),s=!0),o.remove(),o=void 0,i.drop(),i=void 0,l.$el.css("display",""),r.trigger("afterMove",l),r.trigger("rulesChanged")}}),t.flags.no_drop||(interact(t.$el[0]).dropzone({accept:c.selectors.rule_and_group_containers,ondragenter:function(e){u(i,$(e.target),r)},ondrop:function(e){s||u(l,$(e.target),r)}}),t instanceof a&&interact(t.$el.find(c.selectors.group_header)[0]).dropzone({accept:c.selectors.rule_and_group_containers,ondragenter:function(e){u(i,$(e.target),r)},ondrop:function(e){s||u(l,$(e.target),r)}}))}}),this.on("beforeDeleteRule beforeDeleteGroup",function(e,t){e.isDefaultPrevented()||(interact(t.$el[0]).unset(),t instanceof a&&interact(t.$el.find(c.selectors.group_header)[0]).unset())}),this.on("afterApplyRuleFlags afterApplyGroupFlags",function(e,t){t.flags.no_sortable&&t.$el.find(".drag-handle").remove()}),n.disable_template||(this.on("getGroupTemplate.filter",function(e,t){if(1'),e.value=r.prop("outerHTML")}}),this.on("getRuleTemplate.filter",function(e){var t=$($.parseHTML(e.value));t.find(c.selectors.rule_header).after('
'),e.value=t.prop("outerHTML")}))},{inherit_no_sortable:!0,inherit_no_drop:!0,icon:"glyphicon glyphicon-sort",disable_template:!1}),c.selectors.rule_and_group_containers=c.selectors.rule_container+", "+c.selectors.group_container,c.selectors.drag_handle=".drag-handle",c.defaults({default_rule_flags:{no_sortable:!1,no_drop:!1},default_group_flags:{no_sortable:!1,no_drop:!1}}),c.define("sql-support",function(e){},{boolean_as_integer:!0}),c.defaults({sqlOperators:{equal:{op:"= ?"},not_equal:{op:"!= ?"},in:{op:"IN(?)",sep:", "},not_in:{op:"NOT IN(?)",sep:", "},less:{op:"< ?"},less_or_equal:{op:"<= ?"},greater:{op:"> ?"},greater_or_equal:{op:">= ?"},between:{op:"BETWEEN ?",sep:" AND "},not_between:{op:"NOT BETWEEN ?",sep:" AND "},begins_with:{op:"LIKE ?",mod:"{0}%",escape:"%_"},not_begins_with:{op:"NOT LIKE ?",mod:"{0}%",escape:"%_"},contains:{op:"LIKE ?",mod:"%{0}%",escape:"%_"},not_contains:{op:"NOT LIKE ?",mod:"%{0}%",escape:"%_"},ends_with:{op:"LIKE ?",mod:"%{0}",escape:"%_"},not_ends_with:{op:"NOT LIKE ?",mod:"%{0}",escape:"%_"},is_empty:{op:"= ''"},is_not_empty:{op:"!= ''"},is_null:{op:"IS NULL"},is_not_null:{op:"IS NOT NULL"}},sqlRuleOperator:{"=":function(e){return{val:e,op:""===e?"is_empty":"equal"}},"!=":function(e){return{val:e,op:""===e?"is_not_empty":"not_equal"}},LIKE:function(e){return"%"==e.slice(0,1)&&"%"==e.slice(-1)?{val:e.slice(1,-1),op:"contains"}:"%"==e.slice(0,1)?{val:e.slice(1),op:"ends_with"}:"%"==e.slice(-1)?{val:e.slice(0,-1),op:"begins_with"}:void m.error("SQLParse",'Invalid value for LIKE operator "{0}"',e)},"NOT LIKE":function(e){return"%"==e.slice(0,1)&&"%"==e.slice(-1)?{val:e.slice(1,-1),op:"not_contains"}:"%"==e.slice(0,1)?{val:e.slice(1),op:"not_ends_with"}:"%"==e.slice(-1)?{val:e.slice(0,-1),op:"not_begins_with"}:void m.error("SQLParse",'Invalid value for NOT LIKE operator "{0}"',e)},IN:function(e){return{val:e,op:"in"}},"NOT IN":function(e){return{val:e,op:"not_in"}},"<":function(e){return{val:e,op:"less"}},"<=":function(e){return{val:e,op:"less_or_equal"}},">":function(e){return{val:e,op:"greater"}},">=":function(e){return{val:e,op:"greater_or_equal"}},BETWEEN:function(e){return{val:e,op:"between"}},"NOT BETWEEN":function(e){return{val:e,op:"not_between"}},IS:function(e){return null!==e&&m.error("SQLParse","Invalid value for IS operator"),{val:null,op:"is_null"}},"IS NOT":function(e){return null!==e&&m.error("SQLParse","Invalid value for IS operator"),{val:null,op:"is_not_null"}}},sqlStatements:{question_mark:function(){var r=[];return{add:function(e,t){return r.push(t),"?"},run:function(){return r}}},numbered:function(r){(!r||1"==l&&(l="!=");var s=_.settings.sqlRuleOperator[l];void 0===s&&m.error("UndefinedSQLOperator",'Invalid SQL operation "{0}".',t.operation);var a,u=s.call(this,o,t.operation);"values"in t.left?a=t.left.values.join("."):"value"in t.left?a=t.left.value:m.error("SQLParse","Cannot find field name in {0}",JSON.stringify(t.left));var p=u.val,d=_.settings.sqlOperators[u.op];if(!h&&d&&d.escape){var c=d.escape.split("").map(function(e){return"\\\\"+e}).join("|");p=p.replace(new RegExp("("+c+")","g"),function(e){return e[1]})}var f=_.getSQLFieldID(a,o),g=_.change("sqlToRule",{id:f,field:a,operator:u.op,value:p},t);v.rules.push(g)}}(n,0),i},setRulesFromSQL:function(e,t){this.setRules(this.getRulesFromSQL(e,t))},getSQLFieldID:function(t,e){var r=this.filters.filter(function(e){return e.field.toLowerCase()===t.toLowerCase()});return 1===r.length?r[0].id:this.change("getSQLFieldID",t,e)}}),c.define("unique-filter",function(){this.status.used_filters={},this.on("afterUpdateRuleFilter",this.updateDisabledFilters),this.on("afterDeleteRule",this.updateDisabledFilters),this.on("afterCreateRuleFilters",this.applyDisabledFilters),this.on("afterReset",this.clearDisabledFilters),this.on("afterClear",this.clearDisabledFilters),this.on("getDefaultFilter.filter",function(t,r){var n=t.builder;(n.updateDisabledFilters(),t.value.id in n.status.used_filters)&&(n.filters.some(function(e){if(!(e.id in n.status.used_filters)||0<",">","\"","'","/","matchHTML","code","toString","replace","m","eval","startend","start","end","startencode","split","skip","unescape","tmpl","c","def","needhtmlencode","indv","cse","sid","str","resolveDefs","block","assign","value","substring","param","v","arg","text","Function","s","d","rw","__exp","RegExp","elsecase","vname","iname","_encodeHTML","console","QueryBuilder","$el","queryBuilder","settings","DEFAULTS","model","Model","status","id","generated_id","group_id","rule_id","has_optgroup","has_operator_optgroup","filters","icons","operators","templates","plugins","lang","regional","Utils","error","lang_code","allow_groups","Object","keys","tpl","attr","Math","floor","random","addClass","checkFilters","checkOperators","bindEvents","initPlugins","prototype","trigger","event","Event","_tojQueryEvent","builder","triggerHandler","slice","call","change","on","cb","off","once","one","filter","map","join","types","string","integer","double","date","time","datetime","boolean","inputs","modifiable_options","selectors","group_container","rule_container","filter_container","operator_container","value_container","error_container","condition_container","rule_header","group_header","group_actions","rule_actions","rules_list","group_condition","rule_filter","rule_operator","rule_value","add_rule","delete_rule","add_group","delete_group","OPERATORS","equal","nb_inputs","multiple","apply_to","not_equal","in","not_in","less","less_or_equal","greater","greater_or_equal","between","not_between","begins_with","not_begins_with","contains","not_contains","ends_with","not_ends_with","is_empty","is_not_empty","is_null","is_not_null","sort_filters","display_errors","allow_empty","conditions","default_condition","inputs_separator","select_placeholder","display_empty_filter","default_filter","optgroups","default_rule_flags","filter_readonly","operator_readonly","value_readonly","no_delete","default_group_flags","condition_readonly","no_add_rule","no_add_group","group","rule","filterSelect","operatorSelect","ruleValueSelect","remove_group","remove_rule","defaults","fct","methods","tmp","plugin","getPluginOptions","property","init","rules","setRules","setRoot","definedFilters","input","operator","field","label","optgroup","values","cleanValues","iterateOptions","bind","groupSort","placeholder","placeholder_value","entry","sort","self","a","b","translate","localeCompare","definedOperators","Selectors","is","$group","closest","getModel","condition","val","$rule","getFilterById","getOperatorByType","addRule","deleteRule","addGroup","deleteGroup","drop","node","remove","refreshGroupsConditions","add","parent","index","prependTo","find","insertAfter","move","detach","update","oldValue","Rule","updateError","applyRuleFlags","updateRuleFilter","updateRuleOperator","updateRuleValue","applyGroupFlags","updateGroupCondition","data","flags","nextGroupId","parseHTML","getGroupTemplate","Group","level","isDefaultPrevented","isRoot","del","each","previousCondition","$this","prop","toggleClass","walk","nextRuleId","getRuleTemplate","createRuleFilters","$filterSelect","getRuleFilterSelect","html","createRuleOperators","$operatorContainer","empty","getOperators","$operatorSelect","getRuleOperatorSelect","default_operator","__","createRuleInput","$valueContainer","$inputs","$ruleInput","trim","getRuleInput","css","input_event","_updating_input","_updating_value","getRuleInputValue","plugin_config","default_value","previousFilter","previousOperator","hide","previousValue","setRuleInputValue","clearErrors","removeClass","errorMessage","fmt","eq","triggerValidationError","destroy","removeAttr","clear","removeData","reset","setOptions","opt","Node","validate","skip_empty","valid","parse","done","errors","validateValue","res","getRules","get_flags","allow_invalid","out","groupData","getGroupFlags","isEmptyObject","ruleData","getRuleFlags","parseGroupFlags","item","parseRuleFlags","validation","result","callback","_validateValue","tempValue","allow_empty_value","j","min","parseInt","getValidationMessage","max","format","test","isNaN","parseFloat","step","toPrecision","window","moment","isValid","isAfter","l","doThrow","valueGetter","$value","escapeElementId","value_separator","subval","changeType","valueParser","valueSetter","readonly","all","ret","key","category","translation","messages","h","getRuleValueSelect","value_id","vertical","size","rows","utils","args","message","err","Error","escapeString","additionalEscape","escaped","escapeRegExp","$0","$1","$2","items","newItems","idx","lastIndexOf","splice","defineModelProperties","obj","fields","defineProperty","enumerable","get","set","apply","getPos","getNodePos","removeNode","moveAfter","moveAtBegin","moveAtEnd","insertNode","create","constructor","reverse","cbRule","cbGroup","context","stop","recursive","moveSortableToTarget","method","getStmtConfig","stmt","config","match","fn","option","font","colors","color","_def_","style","selectpicker","Constructor","container","width","showIcon","tooltip","fixTitle","$h","placement","setFilters","deleteOrphans","filtersIds","checkOrphans","updateBuilder","updateDisabledFilters","addFilter","newFilters","position","some","removeFilter","filterIds","chosen","mode","$p","description","getFilterDescription","appendTo","icon","popover","$b","content","bootbox","alert","invert","display_rules_button","invert_rules","disable_template","after","prepend","silent_fail","operatorOpposites","conditionOpposites","AND","OR","tempOpts","no_invert","mongoOperators","$ne","$in","$nin","$lt","$lte","$gt","$gte","$regex","$options","mongoRuleOperators","$eq","op","getMongo","toUpperCase","parts","mdb","ope","ruleExpression","groupExpression","getRulesFromMongo","query","getMongoCondition","topKey","getMongoOperator","mdbrl","opVal","getMongoDBFieldID","setRulesFromMongo","matchingFilters","knownKeys","not","updateGroupNot","icon_unchecked","json","operation","SQLParser","nodes","Op","$nor","icon_checked","group_not","select2","applySelect2Options","rule_options","dropdownParentSelector","dropdownParent","parents","first","valueLabel","valueId","evt","setTimeout","ghost","moved","default_no_sortable","no_sortable","interact","dynamicDrop","pointerMoveTolerance","inherit_no_sortable","inherit_no_drop","no_drop","draggable","allowFrom","drag_handle","onstart","outerWidth","ph","height","outerHeight","onmove","top","clientY","left","clientX","onend","dropzone","relatedTarget","accept","rule_and_group_containers","ondragenter","ondrop","unset","boolean_as_integer","sqlOperators","sep","mod","escape","sqlRuleOperator","=","!=","LIKE","NOT LIKE","IN","NOT IN","<=",">=","BETWEEN","NOT BETWEEN","IS","IS NOT","sqlStatements","question_mark","params","run","numbered","char","named","indexes","sqlRuleStatement","esc","sql","regex1","regex2","getSQL","nl","sqlFn","getRulesFromSQL","parsed","where","curr","flatten","next","right","sqlrl","JSON","stringify","finalValue","searchChars","getSQLFieldID","setRulesFromSQL","used_filters","applyDisabledFilters","clearDisabledFilters","unique","filterId","groups","__locale","__author","no_filter","empty_group","radio_empty","checkbox_empty","select_empty","string_empty","string_exceed_min_length","string_exceed_max_length","string_invalid_format","number_nan","number_not_integer","number_not_double","number_exceed_min","number_exceed_max","number_wrong_step","number_between_invalid","datetime_empty","datetime_invalid","datetime_exceed_min","datetime_exceed_max","datetime_between_invalid","boolean_not_valid","operator_not_multiple","NOT"],"mappings":";;;;;;CASC,SAAUA,EAAMC,GACS,mBAAXC,QAAyBA,OAAOC,IACvCD,OAAO,mBAAoB,CAAC,UAAWD,GAEhB,iBAAXG,QAAuBA,OAAOC,QAC1CD,OAAOC,QAAUJ,EAAQK,QAAQ,WAGjCL,EAAQD,EAAKO,QARrB,CAUEC,KAAM,SAAUC,GACd,aAEAA,EAAEC,UAAY,WACV,IAAIC,EAASC,EAAMC,EAAKC,EAAMC,EAAaC,EACvCC,EAASC,UAAU,IAAM,GACzBC,EAAI,EACJC,EAASF,UAAUE,OACnBC,GAAO,EACPC,EAAY,UAgChB,IA7BsB,kBAAXL,IACPI,EAAOJ,EAGPA,EAASC,UAAUC,MAAQ,IAIT,iBAAXF,IAEW,YADlBK,EAAYL,EAAOM,gBACyB,YAAdD,GAAyC,WAAdA,IACrDA,EAAY,WAIhBL,EAASC,UAAUC,MAAQ,IAIT,iBAAXF,GAAwBR,EAAEe,WAAWP,KAC5CA,EAAS,IAITE,IAAMC,IACNH,EAAST,KACTW,KAGGA,EAAIC,EAAQD,IAEf,GAAiC,QAA5BR,EAAUO,UAAUC,IAErB,GAAIV,EAAEgB,QAAQd,IAA0B,YAAdW,EAGtB,OAFAN,EAAQC,GAAUR,EAAEgB,QAAQR,GAAUA,EAAS,GAEvCK,GACR,IAAK,SACDL,EAASD,EAAMU,OAAOjB,EAAEkB,OAAON,EAAM,GAAIV,IACzC,MAEJ,IAAK,UACDM,EAASR,EAAEkB,OAAON,EAAM,GAAIV,GAC5B,MAEJ,IAAK,SACDA,EAAQiB,QAAQ,SAAUC,EAAGV,GACzB,GAAiB,iBAANU,EAAgB,CACvB,IAAIC,EAAOrB,EAAEgB,QAAQI,GAAK,GAAK,GAC/Bb,EAAMG,GAAKV,EAAEC,UAAUW,EAAMC,EAAWN,EAAMG,IAAMW,EAAMD,QAE7B,IAAtBb,EAAMe,QAAQF,IACrBb,EAAMgB,KAAKH,KAInBZ,EAASD,OAMb,IAAKJ,KAAQD,EACTG,EAAOH,EAAQC,GAGF,cAATA,GAAwBK,IAAWH,IAKnCO,GAAQP,IAAUL,EAAEwB,cAAcnB,KACjCC,EAAcN,EAAEgB,QAAQX,MACzBD,EAAMI,EAAOL,GAITI,EADCD,IAAgBmB,MAAMT,QAASZ,GACxB,GACCE,GAAgBN,EAAEwB,cAAepB,GAGlCA,EAFA,GAIZE,GAAc,EAGdE,EAAOL,GAAQH,EAAEC,UAAUW,EAAMC,EAAWN,EAAOF,SAGnCqB,IAATrB,IACPG,EAAOL,GAAQE,IAQnC,OAAOG,KASd,WACA,aAEA,IAsBGmB,EAtBCC,EAAM,CACTzB,KAAM,MACN0B,QAAS,QACTC,iBAAkB,CACjBC,SAAa,4BACbC,YAAa,uBACbC,OAAa,uBACbC,IAAa,uBACbC,UAAa,0GACb1C,OAAa,+CACb2C,aAAa,yBACbC,YAAa,mCACbC,QAAa,2EACbC,QAAS,KACTC,OAAQ,EACRC,QAAS,EACTC,eAAe,EACfC,kBAAkB,GAEnBC,cAAUlB,EACVmB,aAAUnB,EACVoB,KAAK,GAGNlB,EAAImB,iBAAmB,SAASJ,GAC/B,IAAIK,EAAkB,CAAEC,IAAK,QAASC,IAAK,QAASC,IAAK,QAASC,IAAK,QAASC,IAAK,QAASC,IAAK,SAClGC,EAAYZ,EAAmB,aAAe,0BAC/C,OAAO,SAASa,GACf,OAAOA,EAAOA,EAAKC,WAAWC,QAAQH,EAAW,SAASI,GAAI,OAAOX,EAAgBW,IAAMA,IAAO,KAIpGhC,EAAY,WAAY,OAAO5B,OAAQ,EAAG6D,MAAM,QAArC,GAGW,oBAAXjE,QAA0BA,OAAOC,QAC3CD,OAAOC,QAAUgC,EACW,mBAAXnC,QAAyBA,OAAOC,IACjDD,OAAO,MAAO,WAAW,OAAOmC,IAEhCD,EAASC,IAAMA,EAGhB,IAAIiC,EAAW,CACdpB,OAAQ,CAAEqB,MAAO,MAAYC,IAAK,MAAYC,YAAa,iBAC3DC,MAAQ,CAAEH,MAAO,WAAYC,IAAK,WAAYC,YAAa,uBACzDE,EAAO,KAkCV,SAASC,EAASX,GACjB,OAAOA,EAAKE,QAAQ,YAAa,MAAMA,QAAQ,YAAa,KAG7D9B,EAAIgB,SAAW,SAASwB,EAAMC,EAAGC,GAEhC,IAAuDC,EAAyBC,EAA5EC,GADJJ,EAAIA,GAAKzC,EAAIE,kBACDW,OAASoB,EAASpB,OAASoB,EAASI,MAAuBS,EAAM,EAC5EC,EAAQN,EAAEnC,KAAOmC,EAAE5E,OAvCrB,SAASmF,EAAYP,EAAGQ,EAAOP,GAC9B,OAA0B,iBAAVO,EAAsBA,EAAQA,EAAMpB,YACnDC,QAAQW,EAAE5E,QAAUyE,EAAM,SAASP,EAAGH,EAAMsB,EAAQC,GAcpD,OAb6B,IAAzBvB,EAAKlC,QAAQ,UAChBkC,EAAOA,EAAKwB,UAAU,IAEjBxB,KAAQc,IACE,MAAXQ,GACCT,EAAEjC,cAAc2C,EAAMrB,QAAQW,EAAEjC,aAAc,SAASuB,EAAGsB,EAAOC,GACpEZ,EAAId,GAAQ,CAAC2B,IAAKF,EAAOG,KAAMF,KAE1B1B,KAAQc,IAAMA,EAAId,GAAOuB,IAE/B,IAAIM,SAAS,MAAO,QAAQ7B,EAAK,MAAQuB,EAAzC,CAAgDT,IAG3C,KAEPZ,QAAQW,EAAEnC,KAAOgC,EAAM,SAASP,EAAGH,GAC/Ba,EAAElC,YAAWqB,EAAOA,EAAKE,QAAQW,EAAElC,UAAW,SAASwB,EAAG2B,EAAGC,EAAGN,GACnE,GAAIX,EAAIiB,IAAMjB,EAAIiB,GAAGJ,KAAOF,EAAO,CAClC,IAAIO,GAAMD,EAAE,IAAIN,GAAOvB,QAAQ,QAAS,KAGxC,OAFAY,EAAImB,MAAQnB,EAAImB,OAAS,GACzBnB,EAAImB,MAAMD,GAAMlB,EAAIiB,GAAGH,KAAK1B,QAAQ,IAAIgC,OAAO,cAAgBpB,EAAIiB,GAAGJ,IAAM,YAAa,KAAM,KAAOF,EAAQ,MACvGK,EAAI,cAAcE,EAAG,SAG9B,IAAIN,EAAI,IAAIG,SAAS,MAAO,UAAY7B,EAAhC,CAAsCc,GAC9C,OAAOY,EAAIN,EAAYP,EAAGa,EAAGZ,GAAOY,IAWPN,CAAYP,EAAGD,EAAME,GAAO,IAAMF,EAEhEO,GAAO,aAAeN,EAAE7B,MAAQmC,EAAIjB,QAAQ,iCAAiC,KACzEA,QAAQ,6BAA6B,IAAKiB,GAC5CjB,QAAQ,QAAS,QACjBA,QAAQW,EAAErC,aAAekC,EAAM,SAASP,EAAGH,GAC3C,OAAOiB,EAAIX,MAAQK,EAASX,GAAQiB,EAAIV,MAExCL,QAAQW,EAAEpC,QAAUiC,EAAM,SAASP,EAAGH,GAEtC,OADAe,GAAiB,EACVE,EAAIT,YAAcG,EAASX,GAAQiB,EAAIV,MAE9CL,QAAQW,EAAEhC,aAAe6B,EAAM,SAASP,EAAGgC,EAAUnC,GACrD,OAAOmC,EACLnC,EAAO,cAAgBW,EAASX,GAAQ,WAAa,iBACrDA,EAAO,QAAUW,EAASX,GAAQ,WAAa,cAEjDE,QAAQW,EAAE/B,SAAW4B,EAAM,SAASP,EAAGrB,EAASsD,EAAOC,GACvD,OAAKvD,GACLoC,GAAK,EAAGF,EAAKqB,GAAS,IAAInB,EAAKpC,EAAQ6B,EAAS7B,GACzC,YAAYoC,EAAI,IAAIpC,EAAQ,UAAUoC,EAAI,SAASkB,EAAM,IAAIpB,EAAK,QAAQE,EAAI,OAAOA,EAAI,mBAAmBF,EAAK,KAAKE,EAAI,KAC/HkB,EAAM,OAAOlB,EAAI,IAAIF,EAAK,eAHP,iBAKrBd,QAAQW,EAAEtC,UAAYmC,EAAM,SAASP,EAAGH,GACxC,MAAO,KAAOW,EAASX,GAAQ,WAE9B,iBACDE,QAAQ,MAAO,OAAOA,QAAQ,MAAO,OAAOA,QAAQ,MAAO,OAC3DA,QAAQ,2BAA4B,MAAMA,QAAQ,QAAS,IAGzDa,IACEF,EAAE3B,gBAAiBf,GAAaA,EAASmE,cAAanE,EAASmE,YAAclE,EAAImB,iBAAiBsB,EAAE1B,mBACzGgC,EAAM,wEACH/C,EAAImB,iBAAiBU,WAAa,KAAOY,EAAE1B,kBAAoB,IAAM,MACrEgC,GAEJ,IACC,OAAO,IAAIU,SAAShB,EAAE9B,QAASoC,GAC9B,MAAOvD,GAGR,KADuB,oBAAZ2E,SAAyBA,QAAQjD,IAAI,yCAA2C6B,GACrFvD,IAIRQ,EAAIiB,QAAU,SAASuB,EAAME,GAC5B,OAAO1C,EAAIgB,SAASwB,EAAM,KAAME,IAzIlC,GAmJC,SAAS/E,EAAMC,GACS,mBAAVC,QAAwBA,OAAOC,IACtCD,OAAO,gBAAiB,CAAC,SAAU,UAAW,oBAAqBD,GAE5C,iBAAXG,QAAuBA,OAAOC,QAC1CD,OAAOC,QAAUJ,EAAQK,QAAQ,UAAWA,QAAQ,WAAYA,QAAQ,qBAGxEL,EAAQD,EAAKO,OAAQP,EAAKqC,KARlC,CAUE7B,KAAM,SAASC,EAAG4B,GACpB,aAmBA,IAAIoE,EAAe,SAASC,EAAK/F,IAC7B+F,EAAI,GAAGC,aAAenG,MAOjBkG,IAAMA,EAOXlG,KAAKoG,SAAWnG,EAAEC,WAAU,EAAM,UAAW,GAAI+F,EAAaI,SAAUlG,GAOxEH,KAAKsG,MAAQ,IAAIC,EAcjBvG,KAAKwG,OAAS,CACVC,GAAI,KACJC,cAAc,EACdC,SAAU,EACVC,QAAS,EACTC,cAAc,EACdC,uBAAuB,GAQ3B9G,KAAK+G,QAAU/G,KAAKoG,SAASW,QAO7B/G,KAAKgH,MAAQhH,KAAKoG,SAASY,MAO3BhH,KAAKiH,UAAYjH,KAAKoG,SAASa,UAO/BjH,KAAKkH,UAAYlH,KAAKoG,SAASc,UAO/BlH,KAAKmH,QAAUnH,KAAKoG,SAASe,QAO7BnH,KAAKoH,KAAO,UAGwBzF,IAAhCsE,EAAaoB,SAAa,IAC1BC,EAAMC,MAAM,SAAU,4BAE1BvH,KAAKoH,KAAOnH,EAAEC,WAAU,EAAM,UAAW,GAAI+F,EAAaoB,SAAa,GAAGpB,EAAaoB,SAASrH,KAAKoG,SAASoB,WAAYxH,KAAKoG,SAASgB,OAGrG,IAA/BpH,KAAKoG,SAASqB,aACdzH,KAAKoG,SAASqB,aAAe,GAEO,IAA/BzH,KAAKoG,SAASqB,eACnBzH,KAAKoG,SAASqB,cAAgB,GAIlCC,OAAOC,KAAK3H,KAAKkH,WAAW9F,QAAQ,SAASwG,GACpC5H,KAAKkH,UAAUU,KAChB5H,KAAKkH,UAAUU,GAAO3B,EAAaiB,UAAUU,IAEf,iBAAvB5H,KAAKkH,UAAUU,KACtB5H,KAAKkH,UAAUU,GAAO/F,EAAIgB,SAAS7C,KAAKkH,UAAUU,MAEvD5H,MAGEA,KAAKkG,IAAI2B,KAAK,QACf7H,KAAKkG,IAAI2B,KAAK,KAAM,MAAQC,KAAKC,MAAsB,MAAhBD,KAAKE,WAC5ChI,KAAKwG,OAAOE,cAAe,GAE/B1G,KAAKwG,OAAOC,GAAKzG,KAAKkG,IAAI2B,KAAK,MAG/B7H,KAAKkG,IAAI+B,SAAS,6BAElBjI,KAAK+G,QAAU/G,KAAKkI,aAAalI,KAAK+G,SACtC/G,KAAKiH,UAAYjH,KAAKmI,eAAenI,KAAKiH,WAC1CjH,KAAKoI,aACLpI,KAAKqI,eAGTpI,EAAEkB,OAAO8E,EAAaqC,UAAgD,CAMlEC,QAAS,SAASjH,GACd,IAAIkH,EAAQ,IAAIvI,EAAEwI,MAAMzI,KAAK0I,eAAepH,GAAO,CAC/CqH,QAAS3I,OAKb,OAFAA,KAAKkG,IAAI0C,eAAeJ,EAAO9G,MAAM4G,UAAUO,MAAMC,KAAKpI,UAAW,IAE9D8H,GASXO,OAAQ,SAASzH,EAAM0D,GACnB,IAAIwD,EAAQ,IAAIvI,EAAEwI,MAAMzI,KAAK0I,eAAepH,GAAM,GAAO,CACrDqH,QAAS3I,KACTgF,MAAOA,IAKX,OAFAhF,KAAKkG,IAAI0C,eAAeJ,EAAO9G,MAAM4G,UAAUO,MAAMC,KAAKpI,UAAW,IAE9D8H,EAAMxD,OASjBgE,GAAI,SAAS1H,EAAM2H,GAEf,OADAjJ,KAAKkG,IAAI8C,GAAGhJ,KAAK0I,eAAepH,GAAO2H,GAChCjJ,MASXkJ,IAAK,SAAS5H,EAAM2H,GAEhB,OADAjJ,KAAKkG,IAAIgD,IAAIlJ,KAAK0I,eAAepH,GAAO2H,GACjCjJ,MASXmJ,KAAM,SAAS7H,EAAM2H,GAEjB,OADAjJ,KAAKkG,IAAIkD,IAAIpJ,KAAK0I,eAAepH,GAAO2H,GACjCjJ,MAUX0I,eAAgB,SAAStI,EAAMiJ,GAC3B,OAAOjJ,EAAK8D,MAAM,KAAKoF,IAAI,SAAShI,GAChC,OAAOA,EAAO,iBAAmB+H,EAAS,UAAY,MACvDE,KAAK,QAWhBtD,EAAauD,MAAQ,CACjBC,OAAY,SACZC,QAAY,SACZC,OAAY,SACZC,KAAY,WACZC,KAAY,WACZC,SAAY,WACZC,QAAY,WAShB9D,EAAa+D,OAAS,CAClB,OACA,SACA,WACA,QACA,WACA,UASJ/D,EAAagE,mBAAqB,CAC9B,iBACA,eACA,cACA,oBACA,kBAQJhE,EAAaiE,UAAY,CACrBC,gBAAsB,yBACtBC,eAAsB,kBACtBC,iBAAsB,yBACtBC,mBAAsB,2BACtBC,gBAAsB,wBACtBC,gBAAsB,mBACtBC,oBAAsB,wCAEtBC,YAAsB,eACtBC,aAAsB,sBACtBC,cAAsB,iBACtBC,aAAsB,gBAEtBC,WAAsB,gCAEtBC,gBAAsB,oCACtBC,YAAsB,yCACtBC,cAAsB,6CACtBC,WAAsB,wCAEtBC,SAAsB,kBACtBC,YAAsB,qBACtBC,UAAsB,mBACtBC,aAAsB,uBAQ1BrF,EAAaiB,UAAY,GAOzBjB,EAAaoB,SAAW,GAOxBpB,EAAasF,UAAY,CACrBC,MAAkB,CAAElK,KAAM,QAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,SAAU,SAAU,WAAY,YACxHC,UAAkB,CAAEtK,KAAM,YAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,SAAU,SAAU,WAAY,YACxHE,GAAkB,CAAEvK,KAAM,KAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,SAAU,SAAU,aAC5GG,OAAkB,CAAExK,KAAM,SAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,SAAU,SAAU,aAC5GI,KAAkB,CAAEzK,KAAM,OAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,SAAU,aAClGK,cAAkB,CAAE1K,KAAM,gBAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,SAAU,aAClGM,QAAkB,CAAE3K,KAAM,UAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,SAAU,aAClGO,iBAAkB,CAAE5K,KAAM,mBAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,SAAU,aAClGQ,QAAkB,CAAE7K,KAAM,UAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,SAAU,aAClGS,YAAkB,CAAE9K,KAAM,cAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,SAAU,aAClGU,YAAkB,CAAE/K,KAAM,cAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,WACxFW,gBAAkB,CAAEhL,KAAM,kBAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,WACxFY,SAAkB,CAAEjL,KAAM,WAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,WACxFa,aAAkB,CAAElL,KAAM,eAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,WACxFc,UAAkB,CAAEnL,KAAM,YAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,WACxFe,cAAkB,CAAEpL,KAAM,gBAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,WACxFgB,SAAkB,CAAErL,KAAM,WAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,WACxFiB,aAAkB,CAAEtL,KAAM,eAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,WACxFkB,QAAkB,CAAEvL,KAAM,UAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,SAAU,SAAU,WAAY,YACxHmB,YAAkB,CAAExL,KAAM,cAAoBmK,UAAW,EAAGC,UAAU,EAAOC,SAAU,CAAC,SAAU,SAAU,WAAY,aAQ5H1F,EAAaI,SAAW,CACpBU,QAAS,GACTI,QAAS,GAET4F,cAAc,EACdC,gBAAgB,EAChBvF,cAAe,EACfwF,aAAa,EACbC,WAAY,CAAC,MAAO,MACpBC,kBAAmB,MACnBC,iBAAkB,MAClBC,mBAAoB,SACpBC,sBAAsB,EACtBC,eAAgB,KAChBC,UAAW,GAEXC,mBAAoB,CAChBC,iBAAiB,EACjBC,mBAAmB,EACnBC,gBAAgB,EAChBC,WAAW,GAGfC,oBAAqB,CACjBC,oBAAoB,EACpBC,aAAa,EACbC,cAAc,EACdJ,WAAW,GAGf3G,UAAW,CACPgH,MAAO,KACPC,KAAM,KACNC,aAAc,KACdC,eAAgB,KAChBC,gBAAiB,MAGrB9G,UAAW,KACXJ,KAAM,GAENH,UAAW,CACP,QACA,YACA,KACA,SACA,OACA,gBACA,UACA,mBACA,UACA,cACA,cACA,kBACA,WACA,eACA,YACA,gBACA,WACA,eACA,UACA,eAGJD,MAAO,CACHqE,UAAc,gCACdF,SAAc,2BACdoD,aAAc,6BACdC,YAAc,6BACdjH,MAAc,qCAatBtB,EAAakB,QAAU,GAOvBlB,EAAawI,SAAW,SAAStO,GAC7B,GAAsB,iBAAXA,EAGN,MAAsB,iBAAXA,EACiC,iBAAlC8F,EAAaI,SAASlG,GACtBF,EAAEkB,QAAO,EAAM,GAAI8E,EAAaI,SAASlG,IAGzC8F,EAAaI,SAASlG,GAI1BF,EAAEkB,QAAO,EAAM,GAAI8E,EAAaI,UAXvCpG,EAAEC,WAAU,EAAM,UAAW+F,EAAaI,SAAUlG,IAqB5D8F,EAAavG,OAAS,SAASU,EAAMsO,EAAKnK,GACtC0B,EAAakB,QAAQ/G,GAAQ,CACzBsO,IAAKA,EACLnK,IAAKA,GAAO,KAQpB0B,EAAa9E,OAAS,SAASwN,GAC3B1O,EAAEkB,OAAO8E,EAAaqC,UAAWqG,IAQrC1I,EAAaqC,UAAUD,YAAc,WACjC,GAAKrI,KAAKmH,QAAV,CAIA,GAAIlH,EAAEgB,QAAQjB,KAAKmH,SAAU,CACzB,IAAIyH,EAAM,GACV5O,KAAKmH,QAAQ/F,QAAQ,SAASyN,GAC1BD,EAAIC,GAAU,OAElB7O,KAAKmH,QAAUyH,EAGnBlH,OAAOC,KAAK3H,KAAKmH,SAAS/F,QAAQ,SAASyN,GACnCA,KAAU5I,EAAakB,SACvBnH,KAAKmH,QAAQ0H,GAAU5O,EAAEkB,QAAO,EAAM,GAClC8E,EAAakB,QAAQ0H,GAAQtK,IAC7BvE,KAAKmH,QAAQ0H,IAAW,IAG5B5I,EAAakB,QAAQ0H,GAAQH,IAAI5F,KAAK9I,KAAMA,KAAKmH,QAAQ0H,KAGzDvH,EAAMC,MAAM,SAAU,8BAA+BsH,IAE1D7O,QAUPiG,EAAaqC,UAAUwG,iBAAmB,SAAS1O,EAAM2O,GACrD,IAAIF,EAQJ,GAPI7O,KAAKmH,SAAWnH,KAAKmH,QAAQ/G,GAC7ByO,EAAS7O,KAAKmH,QAAQ/G,GAEjB6F,EAAakB,QAAQ/G,KAC1ByO,EAAS5I,EAAakB,QAAQ/G,GAAMmE,KAGpCsK,EACA,OAAIE,EACOF,EAAOE,GAGPF,EAIXvH,EAAMC,MAAM,SAAU,8BAA+BnH,IAW7D6F,EAAaqC,UAAU0G,KAAO,SAASC,GAMnCjP,KAAKuI,QAAQ,aAET0G,GACAjP,KAAKkP,SAASD,UACPjP,KAAKoG,SAAS6I,OAGrBjP,KAAKmP,SAAQ,IAUrBlJ,EAAaqC,UAAUJ,aAAe,SAASnB,GAC3C,IAAIqI,EAAiB,GA2GrB,GAzGKrI,GAA8B,IAAnBA,EAAQnG,QACpB0G,EAAMC,MAAM,SAAU,wBAG1BR,EAAQ3F,QAAQ,SAASiI,EAAQ1I,GAkD7B,OAjDK0I,EAAO5C,IACRa,EAAMC,MAAM,SAAU,wBAAyB5G,IAET,GAAtCyO,EAAe7N,QAAQ8H,EAAO5C,KAC9Ba,EAAMC,MAAM,SAAU,+BAAgC8B,EAAO5C,IAEjE2I,EAAe5N,KAAK6H,EAAO5C,IAEtB4C,EAAO/H,KAGF2E,EAAauD,MAAMH,EAAO/H,OAChCgG,EAAMC,MAAM,SAAU,qBAAsB8B,EAAO/H,MAHnD+H,EAAO/H,KAAO,SAMb+H,EAAOgG,MAGoB,mBAAhBhG,EAAOgG,QAAqE,GAA9CpJ,EAAa+D,OAAOzI,QAAQ8H,EAAOgG,QAC7E/H,EAAMC,MAAM,SAAU,sBAAuB8B,EAAOgG,OAHpDhG,EAAOgG,MAA4C,WAApCpJ,EAAauD,MAAMH,EAAO/H,MAAqB,SAAW,OAMzE+H,EAAOpC,WACPoC,EAAOpC,UAAU7F,QAAQ,SAASkO,GACP,iBAAZA,GACPhI,EAAMC,MAAM,SAAU,8DAK7B8B,EAAOkG,QACRlG,EAAOkG,MAAQlG,EAAO5C,IAErB4C,EAAOmG,QACRnG,EAAOmG,MAAQnG,EAAOkG,OAGrBlG,EAAOoG,UAIRzP,KAAKwG,OAAOK,cAAe,EAGtB7G,KAAKoG,SAASoH,UAAUnE,EAAOoG,YAChCzP,KAAKoG,SAASoH,UAAUnE,EAAOoG,UAAYpG,EAAOoG,WAPtDpG,EAAOoG,SAAW,KAWdpG,EAAOgG,OACX,IAAK,QACL,IAAK,aACIhG,EAAOqG,QAAUrG,EAAOqG,OAAO9O,OAAS,IACzC0G,EAAMC,MAAM,SAAU,8BAA+B8B,EAAO5C,IAEhE,MAEJ,IAAK,SACD,IAAIkJ,EAAc,GAClBtG,EAAOxC,cAAe,EAEtBS,EAAMsI,eAAevG,EAAOqG,OAAQ,SAAS1K,EAAOwK,EAAOC,GACvDE,EAAYnO,KAAK,CACbwD,MAAOA,EACPwK,MAAOA,EACPC,SAAUA,GAAY,OAGtBA,IACApG,EAAOxC,cAAe,EAGjB7G,KAAKoG,SAASoH,UAAUiC,KACzBzP,KAAKoG,SAASoH,UAAUiC,GAAYA,KAG9CI,KAAK7P,OAEHqJ,EAAOxC,aACPwC,EAAOqG,OAASpI,EAAMwI,UAAUH,EAAa,YAG7CtG,EAAOqG,OAASC,EAGhBtG,EAAO0G,mBAC0BpO,IAA7B0H,EAAO2G,oBACP3G,EAAO2G,mBAAqB,GAGhC3G,EAAOqG,OAAOtO,QAAQ,SAAS6O,GACvBA,EAAMjL,OAASqE,EAAO2G,mBACtB1I,EAAMC,MAAM,SAAU,8DAA+D8B,EAAO5C,SAMjHzG,MAECA,KAAKoG,SAAS2G,aACd,GAAyC,mBAA9B/M,KAAKoG,SAAS2G,aACrBhG,EAAQmJ,KAAKlQ,KAAKoG,SAAS2G,kBAE1B,CACD,IAAIoD,EAAOnQ,KACX+G,EAAQmJ,KAAK,SAASE,EAAGC,GACrB,OAAOF,EAAKG,UAAUF,EAAEZ,OAAOe,cAAcJ,EAAKG,UAAUD,EAAEb,UAS1E,OAJIxP,KAAKwG,OAAOK,eACZE,EAAUO,EAAMwI,UAAU/I,EAAS,aAGhCA,GASXd,EAAaqC,UAAUH,eAAiB,SAASlB,GAC7C,IAAIuJ,EAAmB,GA8CvB,OA5CAvJ,EAAU7F,QAAQ,SAASkO,EAAU3O,GACV,iBAAZ2O,GACFrJ,EAAasF,UAAU+D,IACxBhI,EAAMC,MAAM,SAAU,yBAA0B+H,GAGpDrI,EAAUtG,GAAK2O,EAAWrP,EAAEC,WAAU,EAAM,UAAW,GAAI+F,EAAasF,UAAU+D,MAG7EA,EAAShO,MACVgG,EAAMC,MAAM,SAAU,kCAAmC5G,GAGzDsF,EAAasF,UAAU+D,EAAShO,QAChC2F,EAAUtG,GAAK2O,EAAWrP,EAAEC,WAAU,EAAM,UAAW,GAAI+F,EAAasF,UAAU+D,EAAShO,MAAOgO,SAG3E3N,IAAvB2N,EAAS7D,gBAAiD9J,IAAtB2N,EAAS3D,UAC7CrE,EAAMC,MAAM,SAAU,2DAA4D+H,EAAShO,QAInD,GAA5CkP,EAAiBjP,QAAQ+N,EAAShO,OAClCgG,EAAMC,MAAM,SAAU,iCAAkC+H,EAAShO,MAErEkP,EAAiBhP,KAAK8N,EAAShO,MAE1BgO,EAASG,UAIVzP,KAAKwG,OAAOM,uBAAwB,EAG/B9G,KAAKoG,SAASoH,UAAU8B,EAASG,YAClCzP,KAAKoG,SAASoH,UAAU8B,EAASG,UAAYH,EAASG,WAP1DH,EAASG,SAAW,MAUzBzP,MAECA,KAAKwG,OAAOM,wBACZG,EAAYK,EAAMwI,UAAU7I,EAAW,aAGpCA,GAOXhB,EAAaqC,UAAUF,WAAa,WAChC,IAAI+H,EAAOnQ,KACPyQ,EAAYxK,EAAaiE,UAG7BlK,KAAKkG,IAAI8C,GAAG,sBAAuByH,EAAU1F,gBAAiB,WAC1D,GAAI9K,EAAED,MAAM0Q,GAAG,YAAa,CACxB,IAAIC,EAAS1Q,EAAED,MAAM4Q,QAAQH,EAAUtG,iBACvCgG,EAAKU,SAASF,GAAQG,UAAY7Q,EAAED,MAAM+Q,SAKlD/Q,KAAKkG,IAAI8C,GAAG,sBAAuByH,EAAUzF,YAAa,WACtD,IAAIgG,EAAQ/Q,EAAED,MAAM4Q,QAAQH,EAAUrG,gBACtC+F,EAAKU,SAASG,GAAO3H,OAAS8G,EAAKc,cAAchR,EAAED,MAAM+Q,SAI7D/Q,KAAKkG,IAAI8C,GAAG,sBAAuByH,EAAUxF,cAAe,WACxD,IAAI+F,EAAQ/Q,EAAED,MAAM4Q,QAAQH,EAAUrG,gBACtC+F,EAAKU,SAASG,GAAO1B,SAAWa,EAAKe,kBAAkBjR,EAAED,MAAM+Q,SAInE/Q,KAAKkG,IAAI8C,GAAG,qBAAsByH,EAAUtF,SAAU,WAClD,IAAIwF,EAAS1Q,EAAED,MAAM4Q,QAAQH,EAAUtG,iBACvCgG,EAAKgB,QAAQhB,EAAKU,SAASF,MAI/B3Q,KAAKkG,IAAI8C,GAAG,qBAAsByH,EAAUrF,YAAa,WACrD,IAAI4F,EAAQ/Q,EAAED,MAAM4Q,QAAQH,EAAUrG,gBACtC+F,EAAKiB,WAAWjB,EAAKU,SAASG,MAGC,IAA/BhR,KAAKoG,SAASqB,eAEdzH,KAAKkG,IAAI8C,GAAG,qBAAsByH,EAAUpF,UAAW,WACnD,IAAIsF,EAAS1Q,EAAED,MAAM4Q,QAAQH,EAAUtG,iBACvCgG,EAAKkB,SAASlB,EAAKU,SAASF,MAIhC3Q,KAAKkG,IAAI8C,GAAG,qBAAsByH,EAAUnF,aAAc,WACtD,IAAIqF,EAAS1Q,EAAED,MAAM4Q,QAAQH,EAAUtG,iBACvCgG,EAAKmB,YAAYnB,EAAKU,SAASF,OAKvC3Q,KAAKsG,MAAM0C,GAAG,CACVuI,KAAQ,SAASlQ,EAAGmQ,GAChBA,EAAKtL,IAAIuL,SACTtB,EAAKuB,2BAETC,IAAO,SAAStQ,EAAGuQ,EAAQJ,EAAMK,GACf,IAAVA,EACAL,EAAKtL,IAAI4L,UAAUF,EAAO1L,IAAI6L,KAAK,IAAM9L,EAAaiE,UAAUY,aAGhE0G,EAAKtL,IAAI8L,YAAYJ,EAAO3C,MAAM4C,EAAQ,GAAG3L,KAEjDiK,EAAKuB,2BAETO,KAAQ,SAAS5Q,EAAGmQ,EAAMtD,EAAO2D,GAC7BL,EAAKtL,IAAIgM,SAEK,IAAVL,EACAL,EAAKtL,IAAI4L,UAAU5D,EAAMhI,IAAI6L,KAAK,IAAM9L,EAAaiE,UAAUY,aAG/D0G,EAAKtL,IAAI8L,YAAY9D,EAAMe,MAAM4C,EAAQ,GAAG3L,KAEhDiK,EAAKuB,2BAETS,OAAU,SAAS9Q,EAAGmQ,EAAMjC,EAAOvK,EAAOoN,GACtC,GAAIZ,aAAgBa,EAChB,OAAQ9C,GACJ,IAAK,QACDY,EAAKmC,YAAYd,GACjB,MAEJ,IAAK,QACDrB,EAAKoC,eAAef,GACpB,MAEJ,IAAK,SACDrB,EAAKqC,iBAAiBhB,EAAMY,GAC5B,MAEJ,IAAK,WACDjC,EAAKsC,mBAAmBjB,EAAMY,GAC9B,MAEJ,IAAK,QACDjC,EAAKuC,gBAAgBlB,EAAMY,QAKnC,OAAQ7C,GACJ,IAAK,QACDY,EAAKmC,YAAYd,GACjB,MAEJ,IAAK,QACDrB,EAAKwC,gBAAgBnB,GACrB,MAEJ,IAAK,YACDrB,EAAKyC,qBAAqBpB,EAAMY,QAgBxDnM,EAAaqC,UAAU6G,QAAU,SAASgC,EAAS0B,EAAMC,GACrD3B,OAAuBxP,IAAZwP,IAAqC,IAAZA,EAEpC,IAAIxK,EAAW3G,KAAK+S,cAChBpC,EAAS1Q,EAAEA,EAAE+S,UAAUhT,KAAKiT,iBAAiBtM,EAAU,KAgB3D,OAdA3G,KAAKkG,IAAIxD,OAAOiO,GAChB3Q,KAAKsG,MAAM9G,KAAO,IAAI0T,EAAM,KAAMvC,GAClC3Q,KAAKsG,MAAM9G,KAAK8G,MAAQtG,KAAKsG,MAE7BtG,KAAKsG,MAAM9G,KAAKqT,KAAOA,EACvB7S,KAAKsG,MAAM9G,KAAKsT,MAAQ7S,EAAEkB,OAAO,GAAInB,KAAKoG,SAAS0H,oBAAqBgF,GACxE9S,KAAKsG,MAAM9G,KAAKsR,UAAY9Q,KAAKoG,SAAS+G,kBAE1CnN,KAAKuI,QAAQ,gBAAiBvI,KAAKsG,MAAM9G,MAErC2R,GACAnR,KAAKmR,QAAQnR,KAAKsG,MAAM9G,MAGrBQ,KAAKsG,MAAM9G,MAatByG,EAAaqC,UAAU+I,SAAW,SAASO,EAAQT,EAAS0B,EAAMC,GAC9D3B,OAAuBxP,IAAZwP,IAAqC,IAAZA,EAEpC,IAAIgC,EAAQvB,EAAOuB,MAAQ,EAW3B,GADQnT,KAAKuI,QAAQ,iBAAkBqJ,EAAQT,EAASgC,GAClDC,qBACF,OAAO,KAGX,IAAIzM,EAAW3G,KAAK+S,cAChBpC,EAAS1Q,EAAED,KAAKiT,iBAAiBtM,EAAUwM,IAC3C7M,EAAQsL,EAAOP,SAASV,GAyB5B,OAvBArK,EAAMuM,KAAOA,EACbvM,EAAMwM,MAAQ7S,EAAEkB,OAAO,GAAInB,KAAKoG,SAAS0H,oBAAqBgF,GAC9DxM,EAAMwK,UAAY9Q,KAAKoG,SAAS+G,kBAQhCnN,KAAKuI,QAAQ,gBAAiBjC,GAO9BtG,KAAKuI,QAAQ,gBAET4I,GACAnR,KAAKmR,QAAQ7K,GAGVA,GAUXL,EAAaqC,UAAUgJ,YAAc,SAASpD,GAC1C,GAAIA,EAAMmF,SACN,OAAO,EAUX,GADQrT,KAAKuI,QAAQ,oBAAqB2F,GACpCkF,qBACF,OAAO,EAGX,IAAIE,GAAM,EAqBV,OAnBApF,EAAMqF,KAAK,UAAW,SAASpF,GAC3BmF,GAAOtT,KAAKoR,WAAWjD,IACxB,SAASD,GACRoF,GAAOtT,KAAKsR,YAAYpD,IACzBlO,MAECsT,IACApF,EAAMqD,OAONvR,KAAKuI,QAAQ,oBAEbvI,KAAKuI,QAAQ,iBAGV+K,GAUXrN,EAAaqC,UAAUsK,qBAAuB,SAAS1E,EAAOsF,GAC1DtF,EAAMhI,IAAI6L,KAAK,IAAM9L,EAAaiE,UAAUa,iBAAiBwI,KAAK,WAC9D,IAAIE,EAAQxT,EAAED,MACdyT,EAAMC,KAAK,UAAWD,EAAM1C,QAAU7C,EAAM4C,WAC5C2C,EAAM7B,SAAS+B,YAAY,SAAUF,EAAM1C,QAAU7C,EAAM4C,aAU/D9Q,KAAKuI,QAAQ,4BAA6B2F,EAAOsF,GAEjDxT,KAAKuI,QAAQ,iBAOjBtC,EAAaqC,UAAUoJ,wBAA0B,YAC5C,SAASkC,EAAK1F,KACNA,EAAM4E,OAAU5E,EAAM4E,QAAU5E,EAAM4E,MAAM/E,qBAC7CG,EAAMhI,IAAI6L,KAAK,IAAM9L,EAAaiE,UAAUa,iBAAiB2I,KAAK,WAAYxF,EAAMe,MAAMrO,QAAU,GAC/FgR,SAAS+B,YAAY,WAAYzF,EAAMe,MAAMrO,QAAU,GAGhEsN,EAAMqF,KAAK,KAAM,SAASrF,GACtB0F,EAAK1F,IACNlO,MARP,CASEA,KAAKsG,MAAM9G,OAajByG,EAAaqC,UAAU6I,QAAU,SAASS,EAAQiB,EAAMC,GAQpD,GADQ9S,KAAKuI,QAAQ,gBAAiBqJ,GAChCwB,qBACF,OAAO,KAGX,IAAIxM,EAAU5G,KAAK6T,aACf7C,EAAQ/Q,EAAEA,EAAE+S,UAAUhT,KAAK8T,gBAAgBlN,KAC3CN,EAAQsL,EAAOT,QAAQH,GAgC3B,OA9BA1K,EAAMuM,KAAOA,EACbvM,EAAMwM,MAAQ7S,EAAEkB,OAAO,GAAInB,KAAKoG,SAASqH,mBAAoBqF,GAQ7D9S,KAAKuI,QAAQ,eAAgBjC,GAE7BtG,KAAKuI,QAAQ,gBAEbvI,KAAK+T,kBAAkBzN,IAEnBtG,KAAKoG,SAASmH,gBAAmBvN,KAAKoG,SAASkH,uBAS/ChH,EAAM+C,OAASrJ,KAAK+I,OAAO,mBACvB/I,KAAKiR,cAAcjR,KAAKoG,SAASmH,gBAAkBvN,KAAK+G,QAAQ,GAAGN,IACnEH,IAIDA,GAUXL,EAAaqC,UAAU8I,WAAa,SAASjD,GACzC,OAAIA,EAAK2E,MAAMjF,aAUP7N,KAAKuI,QAAQ,mBAAoB4F,GACnCiF,uBAINjF,EAAKoD,OAOLvR,KAAKuI,QAAQ,mBAEbvI,KAAKuI,QAAQ,iBAEN,KAUXtC,EAAaqC,UAAUyL,kBAAoB,SAAS5F,GAShD,IAAIpH,EAAU/G,KAAK+I,OAAO,iBAAkB/I,KAAK+G,QAASoH,GACtD6F,EAAgB/T,EAAEA,EAAE+S,UAAUhT,KAAKiU,oBAAoB9F,EAAMpH,KAEjEoH,EAAKjI,IAAI6L,KAAK9L,EAAaiE,UAAUG,kBAAkB6J,KAAKF,GAQ5DhU,KAAKuI,QAAQ,yBAA0B4F,GAEvCnO,KAAKuS,eAAepE,IASxBlI,EAAaqC,UAAU6L,oBAAsB,SAAShG,GAClD,IAAIiG,EAAqBjG,EAAKjI,IAAI6L,KAAK9L,EAAaiE,UAAUI,oBAAoB+J,QAElF,GAAKlG,EAAK9E,OAAV,CAIA,IAAIpC,EAAYjH,KAAKsU,aAAanG,EAAK9E,QACnCkL,EAAkBtU,EAAEA,EAAE+S,UAAUhT,KAAKwU,sBAAsBrG,EAAMlH,KAErEmN,EAAmBF,KAAKK,GAGpBpG,EAAK9E,OAAOoL,iBACZtG,EAAKuG,GAAGpF,SAAWtP,KAAKkR,kBAAkB/C,EAAK9E,OAAOoL,kBAGtDtG,EAAKuG,GAAGpF,SAAWrI,EAAU,GAGjCkH,EAAKjI,IAAI6L,KAAK9L,EAAaiE,UAAUe,eAAe8F,IAAI5C,EAAKmB,SAAShO,MAStEtB,KAAKuI,QAAQ,2BAA4B4F,EAAMlH,GAE/CjH,KAAKuS,eAAepE,KASxBlI,EAAaqC,UAAUqM,gBAAkB,SAASxG,GAC9C,IAAIyG,EAAkBzG,EAAKjI,IAAI6L,KAAK9L,EAAaiE,UAAUK,iBAAiB8J,QAI5E,GAFAlG,EAAKuG,GAAG1P,WAAQrD,EAEXwM,EAAK9E,QAAW8E,EAAKmB,UAAwC,IAA5BnB,EAAKmB,SAAS7D,UAApD,CAQA,IAJA,IAAI0E,EAAOnQ,KACP6U,EAAU5U,IACVoJ,EAAS8E,EAAK9E,OAET1I,EAAI,EAAGA,EAAIwN,EAAKmB,SAAS7D,UAAW9K,IAAK,CAC9C,IAAImU,EAAa7U,EAAEA,EAAE+S,UAAU/S,EAAE8U,KAAK/U,KAAKgV,aAAa7G,EAAMxN,MACtD,EAAJA,GAAOiU,EAAgBlS,OAAO1C,KAAKoG,SAASgH,kBAChDwH,EAAgBlS,OAAOoS,GACvBD,EAAUA,EAAQlD,IAAImD,GAG1BF,EAAgBK,IAAI,UAAW,IAE/BJ,EAAQ7L,GAAG,WAAaK,EAAO6L,aAAe,IAAK,WAC1C/G,EAAKgH,kBACNhH,EAAKiH,iBAAkB,EACvBjH,EAAKnJ,MAAQmL,EAAKkF,kBAAkBlH,GACpCA,EAAKiH,iBAAkB,KAI3B/L,EAAOwF,QACPgG,EAAQxL,EAAOwF,QAAQxF,EAAOiM,eAAiB,IASnDtV,KAAKuI,QAAQ,uBAAwB4F,QAERxM,IAAzB0H,EAAOkM,cACPpH,EAAKnJ,MAAQqE,EAAOkM,eAGpBpH,EAAKiH,iBAAkB,EACvBjH,EAAKnJ,MAAQmL,EAAKkF,kBAAkBlH,GACpCA,EAAKiH,iBAAkB,GAG3BpV,KAAKuS,eAAepE,KAUxBlI,EAAaqC,UAAUkK,iBAAmB,SAASrE,EAAMqH,GACrDxV,KAAKmU,oBAAoBhG,GACzBnO,KAAK2U,gBAAgBxG,GAErBA,EAAKjI,IAAI6L,KAAK9L,EAAaiE,UAAUc,aAAa+F,IAAI5C,EAAK9E,OAAS8E,EAAK9E,OAAO5C,GAAK,MAGjF+O,GAAkBrH,EAAK9E,QAAUmM,EAAe/O,KAAO0H,EAAK9E,OAAO5C,KACnE0H,EAAK0E,UAAOlR,GAUhB3B,KAAKuI,QAAQ,wBAAyB4F,EAAMqH,GAE5CxV,KAAKuI,QAAQ,iBAUjBtC,EAAaqC,UAAUmK,mBAAqB,SAAStE,EAAMsH,GACvD,IAAIb,EAAkBzG,EAAKjI,IAAI6L,KAAK9L,EAAaiE,UAAUK,iBAEtD4D,EAAKmB,UAAwC,IAA5BnB,EAAKmB,SAAS7D,WAMhCmJ,EAAgBK,IAAI,UAAW,KAE3BL,EAAgBlE,GAAG,WAAc+E,GACjCtH,EAAKmB,SAAS7D,YAAcgK,EAAiBhK,WAC7C0C,EAAKmB,SAASG,WAAagG,EAAiBhG,UAE5CzP,KAAK2U,gBAAgBxG,KAXzByG,EAAgBc,OAEhBvH,EAAKuG,GAAG1P,WAAQrD,GAahBwM,EAAKmB,WACLnB,EAAKjI,IAAI6L,KAAK9L,EAAaiE,UAAUe,eAAe8F,IAAI5C,EAAKmB,SAAShO,MAGtE6M,EAAKuG,GAAG1P,MAAQhF,KAAKqV,kBAAkBlH,IAU3CnO,KAAKuI,QAAQ,0BAA2B4F,EAAMsH,GAE9CzV,KAAKuI,QAAQ,iBAUjBtC,EAAaqC,UAAUoK,gBAAkB,SAASvE,EAAMwH,GAC/CxH,EAAKiH,iBACNpV,KAAK4V,kBAAkBzH,EAAMA,EAAKnJ,OAUtChF,KAAKuI,QAAQ,uBAAwB4F,EAAMwH,GAE3C3V,KAAKuI,QAAQ,iBASjBtC,EAAaqC,UAAUiK,eAAiB,SAASpE,GAC7C,IAAI2E,EAAQ3E,EAAK2E,MACbrC,EAAYxK,EAAaiE,UAE7BiE,EAAKjI,IAAI6L,KAAKtB,EAAUzF,aAAa0I,KAAK,WAAYZ,EAAMpF,iBAC5DS,EAAKjI,IAAI6L,KAAKtB,EAAUxF,eAAeyI,KAAK,WAAYZ,EAAMnF,mBAC9DQ,EAAKjI,IAAI6L,KAAKtB,EAAUvF,YAAYwI,KAAK,WAAYZ,EAAMlF,gBAEvDkF,EAAMjF,WACNM,EAAKjI,IAAI6L,KAAKtB,EAAUrF,aAAaqG,SASzCzR,KAAKuI,QAAQ,sBAAuB4F,IASxClI,EAAaqC,UAAUqK,gBAAkB,SAASzE,GAC9C,IAAI4E,EAAQ5E,EAAM4E,MACdrC,EAAYxK,EAAaiE,UAE7BgE,EAAMhI,IAAI6L,KAAK,IAAMtB,EAAU1F,iBAAiB2I,KAAK,WAAYZ,EAAM/E,oBAClE6D,SAAS+B,YAAY,WAAYb,EAAM/E,oBAExC+E,EAAM9E,aACNE,EAAMhI,IAAI6L,KAAKtB,EAAUtF,UAAUsG,SAEnCqB,EAAM7E,cACNC,EAAMhI,IAAI6L,KAAKtB,EAAUpF,WAAWoG,SAEpCqB,EAAMjF,WACNK,EAAMhI,IAAI6L,KAAKtB,EAAUnF,cAAcmG,SAS3CzR,KAAKuI,QAAQ,uBAAwB2F,IAOzCjI,EAAaqC,UAAUuN,YAAc,SAASrE,IAC1CA,EAAOA,GAAQxR,KAAKsG,MAAM9G,QAM1BgS,EAAKjK,MAAQ,KAETiK,aAAgB0B,GAChB1B,EAAK+B,KAAK,SAASpF,GACfA,EAAK5G,MAAQ,MACd,SAAS2G,GACRlO,KAAK6V,YAAY3H,IAClBlO,QAUXiG,EAAaqC,UAAUgK,YAAc,SAASd,GAC1C,GAAIxR,KAAKoG,SAAS4G,eACd,GAAmB,OAAfwE,EAAKjK,MACLiK,EAAKtL,IAAI4P,YAAY,iBAEpB,CACD,IAAIC,EAAe/V,KAAKsQ,UAAU,SAAUkB,EAAKjK,MAAM,IACvDwO,EAAezO,EAAM0O,IAAID,EAAcvE,EAAKjK,MAAMsB,MAAM,IAWxDkN,EAAe/V,KAAK+I,OAAO,eAAgBgN,EAAcvE,EAAKjK,MAAOiK,GAErEA,EAAKtL,IAAI+B,SAAS,aACb8J,KAAK9L,EAAaiE,UAAUM,iBAAiByL,GAAG,GAChDpO,KAAK,QAASkO,KAa/B9P,EAAaqC,UAAU4N,uBAAyB,SAAS1E,EAAMjK,EAAOvC,GAC7D/E,EAAEgB,QAAQsG,KACXA,EAAQ,CAACA,IAWLvH,KAAKuI,QAAQ,kBAAmBiJ,EAAMjK,EAAOvC,GAC9CoO,uBACH5B,EAAKjK,MAAQA,IASrBtB,EAAaqC,UAAU6N,QAAU,WAM7BnW,KAAKuI,QAAQ,iBAETvI,KAAKwG,OAAOE,cACZ1G,KAAKkG,IAAIkQ,WAAW,MAGxBpW,KAAKqW,QACLrW,KAAKsG,MAAQ,KAEbtG,KAAKkG,IACAgD,IAAI,iBACJ4M,YAAY,iBACZQ,WAAW,uBAETtW,KAAKkG,IAAI,GAAGC,cAQvBF,EAAaqC,UAAUiO,MAAQ,WAMnBvW,KAAKuI,QAAQ,eACf6K,uBAINpT,KAAKwG,OAAOG,SAAW,EACvB3G,KAAKwG,OAAOI,QAAU,EAEtB5G,KAAKsG,MAAM9G,KAAK6U,QAEhBrU,KAAKsG,MAAM9G,KAAKqT,UAAOlR,EACvB3B,KAAKsG,MAAM9G,KAAKsT,MAAQ7S,EAAEkB,OAAO,GAAInB,KAAKoG,SAAS0H,qBACnD9N,KAAKsG,MAAM9G,KAAKsR,UAAY9Q,KAAKoG,SAAS+G,kBAE1CnN,KAAKmR,QAAQnR,KAAKsG,MAAM9G,MAOxBQ,KAAKuI,QAAQ,cAEbvI,KAAKuI,QAAQ,kBAQjBtC,EAAaqC,UAAU+N,MAAQ,WAMnBrW,KAAKuI,QAAQ,eACf6K,uBAINpT,KAAKwG,OAAOG,SAAW,EACvB3G,KAAKwG,OAAOI,QAAU,EAElB5G,KAAKsG,MAAM9G,OACXQ,KAAKsG,MAAM9G,KAAK+R,OAChBvR,KAAKsG,MAAM9G,KAAO,MAQtBQ,KAAKuI,QAAQ,cAEbvI,KAAKuI,QAAQ,kBAQjBtC,EAAaqC,UAAUkO,WAAa,SAASrW,GACzCF,EAAEsT,KAAKpT,EAAS,SAASsW,EAAKzR,IAC4B,IAAlDiB,EAAagE,mBAAmB1I,QAAQkV,KACxCzW,KAAKoG,SAASqQ,GAAOzR,IAE3B6K,KAAK7P,QAQXiG,EAAaqC,UAAUuI,SAAW,SAASpQ,GACvC,OAAKA,EAGIA,aAAkBiW,EAChBjW,EAGAR,EAAEQ,GAAQoS,KAAK,qBANf7S,KAAKsG,MAAM9G,MAiB1ByG,EAAaqC,UAAUqO,SAAW,SAASxW,GACvCA,EAAUF,EAAEkB,OAAO,CACfyV,YAAY,GACbzW,GAEHH,KAAK6V,cAEL,IAAI1F,EAAOnQ,KAEP6W,EAAS,SAASC,EAAM5I,GACxB,IAAI6I,EAAO,EACPC,EAAS,EAyCb,OAvCA9I,EAAMqF,KAAK,SAASpF,GAChB,GAAKA,EAAK9E,SAAUlJ,EAAQyW,WAA5B,CAIA,IAAKzI,EAAK9E,OAGN,OAFA8G,EAAK+F,uBAAuB/H,EAAM,YAAa,WAC/C6I,IAIJ,IAAK7I,EAAKmB,SAGN,OAFAa,EAAK+F,uBAAuB/H,EAAM,cAAe,WACjD6I,IAIJ,GAAgC,IAA5B7I,EAAKmB,SAAS7D,UAAiB,CAC/B,IAAIoL,EAAQ1G,EAAK8G,cAAc9I,EAAMA,EAAKnJ,OAE1C,IAAc,IAAV6R,EAGA,OAFA1G,EAAK+F,uBAAuB/H,EAAM0I,EAAO1I,EAAKnJ,YAC9CgS,IAKRD,MAED,SAAS7I,GACR,IAAIgJ,EAAMJ,EAAM5I,IACJ,IAARgJ,EACAH,KAEa,IAARG,GACLF,QAIK,EAATA,KAGc,IAATD,IAAe7I,EAAMmF,UAAYlT,EAAQyW,WACvC,QAEO,IAATG,GAAgB5G,EAAK/J,SAAS6G,aAAgBiB,EAAMmF,YACzDlD,EAAK+F,uBAAuBhI,EAAO,cAAe,OAC3C,IAnDH,CAwDVlO,KAAKsG,MAAM9G,MASb,OAAOQ,KAAK+I,OAAO,WAAY8N,IAcnC5Q,EAAaqC,UAAU6O,SAAW,SAAShX,GACvCA,EAAUF,EAAEkB,OAAO,CACfiW,WAAW,EACXC,eAAe,EACfT,YAAY,GACbzW,GAEH,IAAI0W,EAAQ7W,KAAK2W,SAASxW,GAC1B,IAAK0W,IAAU1W,EAAQkX,cACnB,OAAO,KAGX,IAAIlH,EAAOnQ,KAEPsX,EAAO,SAASR,EAAM5I,GACtB,IAAIqJ,EAAY,CACZzG,UAAW5C,EAAM4C,UACjB7B,MAAO,IAOX,GAJIf,EAAM2E,OACN0E,EAAU1E,KAAO5S,EAAEC,WAAU,EAAM,UAAW,GAAIgO,EAAM2E,OAGxD1S,EAAQiX,UAAW,CACnB,IAAItE,EAAQ3C,EAAKqH,cAActJ,EAAM4E,MAA6B,QAAtB3S,EAAQiX,WAC/CnX,EAAEwX,cAAc3E,KACjByE,EAAUzE,MAAQA,GA2D1B,OAvDA5E,EAAMqF,KAAK,SAASpF,GAChB,GAAKA,EAAK9E,SAAUlJ,EAAQyW,WAA5B,CAIA,IAAI5R,EAAQ,KACPmJ,EAAKmB,UAAwC,IAA5BnB,EAAKmB,SAAS7D,YAChCzG,EAAQmJ,EAAKnJ,OAGjB,IAAI0S,EAAW,CACXjR,GAAI0H,EAAK9E,OAAS8E,EAAK9E,OAAO5C,GAAK,KACnC8I,MAAOpB,EAAK9E,OAAS8E,EAAK9E,OAAOkG,MAAQ,KACzCjO,KAAM6M,EAAK9E,OAAS8E,EAAK9E,OAAO/H,KAAO,KACvC+N,MAAOlB,EAAK9E,OAAS8E,EAAK9E,OAAOgG,MAAQ,KACzCC,SAAUnB,EAAKmB,SAAWnB,EAAKmB,SAAShO,KAAO,KAC/C0D,MAAOA,GAOX,IAJImJ,EAAK9E,QAAU8E,EAAK9E,OAAOwJ,MAAQ1E,EAAK0E,QACxC6E,EAAS7E,KAAO5S,EAAEC,WAAU,EAAM,UAAW,GAAIiO,EAAK9E,OAAS8E,EAAK9E,OAAOwJ,KAAO,GAAI1E,EAAK0E,OAG3F1S,EAAQiX,UAAW,CACnB,IAAItE,EAAQ3C,EAAKwH,aAAaxJ,EAAK2E,MAA6B,QAAtB3S,EAAQiX,WAC7CnX,EAAEwX,cAAc3E,KACjB4E,EAAS5E,MAAQA,GAYzByE,EAAUtI,MAAMzN,KAAK2O,EAAKpH,OAAO,aAAc2O,EAAUvJ,MAE1D,SAAS7H,GACR,IAAIuM,EAAOiE,EAAMxQ,GACS,IAAtBuM,EAAK5D,MAAMrO,QAAiBT,EAAQyW,YACpCW,EAAUtI,MAAMzN,KAAKqR,IAE1B7S,MAUImQ,EAAKpH,OAAO,cAAewO,EAAWrJ,GAxEvC,CA0ERlO,KAAKsG,MAAM9G,MAWb,OATA8X,EAAIT,MAAQA,EASL7W,KAAK+I,OAAO,WAAYuO,IAcnCrR,EAAaqC,UAAU4G,SAAW,SAAS2D,EAAM1S,GAC7CA,EAAUF,EAAEkB,OAAO,CACfkW,eAAe,GAChBlX,GAECF,EAAEgB,QAAQ4R,KACVA,EAAO,CACH/B,UAAW9Q,KAAKoG,SAAS+G,kBACzB8B,MAAO4D,IAIVA,GAASA,EAAK5D,QAAgC,IAAtB4D,EAAK5D,MAAMrO,QAAiBZ,KAAKoG,SAAS6G,cACnE3F,EAAMC,MAAM,aAAc,gCAG9BvH,KAAKqW,QACLrW,KAAKmP,SAAQ,EAAO0D,EAAKA,KAAM7S,KAAK4X,gBAAgB/E,IAUpDA,EAAO7S,KAAK+I,OAAO,WAAY8J,EAAM1S,GAErC,IAAIgQ,EAAOnQ,MAEV,SAAS2R,EAAIkB,EAAM3E,GACF,OAAVA,SAImBvM,IAAnBkR,EAAK/B,UACL+B,EAAK/B,UAAYX,EAAK/J,SAAS+G,mBAE2B,GAArDgD,EAAK/J,SAAS8G,WAAW3L,QAAQsR,EAAK/B,aAC3CxJ,EAAMC,OAAOpH,EAAQkX,cAAe,qBAAsB,0BAA2BxE,EAAK/B,WAC1F+B,EAAK/B,UAAYX,EAAK/J,SAAS+G,mBAGnCe,EAAM4C,UAAY+B,EAAK/B,UAEvB+B,EAAK5D,MAAM7N,QAAQ,SAASyW,GACxB,IAAIvR,EAEJ,QAAmB3E,IAAfkW,EAAK5I,MACL,IAAoC,IAAhCkB,EAAK/J,SAASqB,cAAuB0I,EAAK/J,SAASqB,aAAeyG,EAAMiF,MACxE7L,EAAMC,OAAOpH,EAAQkX,cAAe,aAAc,sCAAuClH,EAAK/J,SAASqB,cACvG0I,EAAKoG,YAEJ,CAED,GAAc,QADdjQ,EAAQ6J,EAAKkB,SAASnD,GAAO,EAAO2J,EAAKhF,KAAM1C,EAAKyH,gBAAgBC,KAEhE,OAGJlG,EAAIkG,EAAMvR,OAGb,CAYD,GAXKuR,EAAKxD,aACU1S,IAAZkW,EAAKpR,KACLa,EAAMC,OAAOpH,EAAQkX,cAAe,aAAc,yBAClDQ,EAAKxD,OAAQ,QAEK1S,IAAlBkW,EAAKvI,WACLuI,EAAKvI,SAAW,UAKV,QADdhJ,EAAQ6J,EAAKgB,QAAQjD,EAAO2J,EAAKhF,KAAM1C,EAAK2H,eAAeD,KAEvD,OAGCA,EAAKxD,QACN/N,EAAM+C,OAAS8G,EAAKc,cAAc4G,EAAKpR,IAAKtG,EAAQkX,gBAGpD/Q,EAAM+C,SACN/C,EAAMgJ,SAAWa,EAAKe,kBAAkB2G,EAAKvI,UAAWnP,EAAQkX,eAE3D/Q,EAAMgJ,WACPhJ,EAAMgJ,SAAWa,EAAKmE,aAAahO,EAAM+C,QAAQ,KAIrD/C,EAAMgJ,UAAyC,IAA7BhJ,EAAMgJ,SAAS7D,iBACd9J,IAAfkW,EAAK7S,MACLsB,EAAMtB,MAAQ6S,EAAK7S,WAEiBrD,IAA/B2E,EAAM+C,OAAOkM,gBAClBjP,EAAMtB,MAAQsB,EAAM+C,OAAOkM,gBAY/BpF,EAAKpH,OAAO,aAAczC,EAAOuR,IAASvR,GAC1CgB,EAAMC,MAAM,aAAc,4CAalC4I,EAAKpH,OAAO,cAAemF,EAAO2E,IAAS3E,GAC3C5G,EAAMC,MAAM,aAAc,2CA5FlC,CA+FEsL,EAAM7S,KAAKsG,MAAM9G,MAOnBQ,KAAKuI,QAAQ,kBAWjBtC,EAAaqC,UAAU2O,cAAgB,SAAS9I,EAAMnJ,GAClD,IAAI+S,EAAa5J,EAAK9E,OAAO0O,YAAc,GACvCC,GAAS,EAkBb,OAfIA,EADAD,EAAWE,SACFF,EAAWE,SAASnP,KAAK9I,KAAMgF,EAAOmJ,GAGtCnO,KAAKkY,eAAe/J,EAAMnJ,GAYhChF,KAAK+I,OAAO,gBAAiBiP,EAAQhT,EAAOmJ,IAWvDlI,EAAaqC,UAAU4P,eAAiB,SAAS/J,EAAMnJ,GACnD,IAII4J,EAAKuJ,EAJL9O,EAAS8E,EAAK9E,OACdiG,EAAWnB,EAAKmB,SAChByI,EAAa1O,EAAO0O,YAAc,GAClCC,GAAS,EAGmB,IAA5B7J,EAAKmB,SAAS7D,YACdzG,EAAQ,CAACA,IAGb,IAAK,IAAIrE,EAAI,EAAGA,EAAI2O,EAAS7D,UAAW9K,IAAK,CACzC,IAAK2O,EAAS5D,UAAYzL,EAAEgB,QAAQ+D,EAAMrE,KAAyB,EAAlBqE,EAAMrE,GAAGC,OAAY,CAClEoX,EAAS,CAAC,wBAAyB1I,EAAShO,KAAMtB,KAAKsQ,UAAU,YAAahB,EAAShO,OACvF,MAGJ,OAAQ+H,EAAOgG,OACX,IAAK,QACD,QAAiB1N,IAAbqD,EAAMrE,IAAwC,IAApBqE,EAAMrE,GAAGC,OAMvC,MALSmX,EAAWK,oBACZJ,EAAS,CAAC,gBAEd,MAIR,IAAK,WACD,QAAiBrW,IAAbqD,EAAMrE,IAAwC,IAApBqE,EAAMrE,GAAGC,OAMvC,MALSmX,EAAWK,oBACZJ,EAAS,CAAC,mBAEd,MAIR,IAAK,SACD,QAAiBrW,IAAbqD,EAAMrE,IAAwC,IAApBqE,EAAMrE,GAAGC,QAAiByI,EAAO0G,aAAe/K,EAAMrE,IAAM0I,EAAO2G,kBAAoB,CAC5G+H,EAAWK,oBACZJ,EAAS,CAAC,iBAEd,MAEJ,MAEJ,QACIG,EAAYlY,EAAEgB,QAAQ+D,EAAMrE,IAAMqE,EAAMrE,GAAK,CAACqE,EAAMrE,IAEpD,IAAK,IAAI0X,EAAI,EAAGA,EAAIF,EAAUvX,OAAQyX,IAAK,CACvC,OAAQpS,EAAauD,MAAMH,EAAO/H,OAC9B,IAAK,SACD,QAAqBK,IAAjBwW,EAAUE,IAA4C,IAAxBF,EAAUE,GAAGzX,OAAc,CACpDmX,EAAWK,oBACZJ,EAAS,CAAC,iBAEd,MAEJ,QAAuBrW,IAAnBoW,EAAWO,KACPH,EAAUE,GAAGzX,OAAS2X,SAASR,EAAWO,KAAM,CAChDN,EAAS,CAAChY,KAAKwY,qBAAqBT,EAAY,MAAO,4BAA6BA,EAAWO,KAC/F,MAGR,QAAuB3W,IAAnBoW,EAAWU,KACPN,EAAUE,GAAGzX,OAAS2X,SAASR,EAAWU,KAAM,CAChDT,EAAS,CAAChY,KAAKwY,qBAAqBT,EAAY,MAAO,4BAA6BA,EAAWU,KAC/F,MAGR,IAAIV,EAAWW,SACqB,iBAArBX,EAAWW,SAClBX,EAAWW,OAAS,IAAI/S,OAAOoS,EAAWW,SAEzCX,EAAWW,OAAOC,KAAKR,EAAUE,KAK1C,MAJQL,EAAS,CAAChY,KAAKwY,qBAAqBT,EAAY,SAAU,yBAA0BA,EAAWW,QAC/F,MAKZ,IAAK,SACD,QAAqB/W,IAAjBwW,EAAUE,IAA4C,IAAxBF,EAAUE,GAAGzX,OAAc,CACpDmX,EAAWK,oBACZJ,EAAS,CAAC,eAEd,MAEJ,GAAIY,MAAMT,EAAUE,IAAK,CACrBL,EAAS,CAAC,cACV,MAEJ,GAAmB,WAAf3O,EAAO/H,MACP,GAAIiX,SAASJ,EAAUE,KAAOF,EAAUE,GAAI,CACxCL,EAAS,CAAC,sBACV,YAIJ,GAAIa,WAAWV,EAAUE,KAAOF,EAAUE,GAAI,CAC1CL,EAAS,CAAC,qBACV,MAGR,QAAuBrW,IAAnBoW,EAAWO,KACPH,EAAUE,GAAKQ,WAAWd,EAAWO,KAAM,CAC3CN,EAAS,CAAChY,KAAKwY,qBAAqBT,EAAY,MAAO,qBAAsBA,EAAWO,KACxF,MAGR,QAAuB3W,IAAnBoW,EAAWU,KACPN,EAAUE,GAAKQ,WAAWd,EAAWU,KAAM,CAC3CT,EAAS,CAAChY,KAAKwY,qBAAqBT,EAAY,MAAO,qBAAsBA,EAAWU,KACxF,MAGR,QAAwB9W,IAApBoW,EAAWe,MAA0C,QAApBf,EAAWe,KAAgB,CAC5D,IAAI3T,GAAKgT,EAAUE,GAAKN,EAAWe,MAAMC,YAAY,IACrD,GAAIR,SAASpT,IAAMA,EAAG,CAClB6S,EAAS,CAAChY,KAAKwY,qBAAqBT,EAAY,OAAQ,qBAAsBA,EAAWe,MACzF,OAGR,MAEJ,IAAK,WACD,QAAqBnX,IAAjBwW,EAAUE,IAA4C,IAAxBF,EAAUE,GAAGzX,OAAc,CACpDmX,EAAWK,oBACZJ,EAAS,CAAC,mBAEd,MAIJ,GAAID,EAAWW,OAAQ,CACb,WAAYM,QACd1R,EAAMC,MAAM,iBAAkB,kFAGlC,IAAIuC,EAAWmP,OAAOd,EAAUE,GAAIN,EAAWW,QAC/C,IAAK5O,EAASoP,UAAW,CACrBlB,EAAS,CAAChY,KAAKwY,qBAAqBT,EAAY,SAAU,oBAAqBA,EAAWW,QAC1F,MAGA,GAAIX,EAAWO,KACPxO,EAAWmP,OAAOlB,EAAWO,IAAKP,EAAWW,QAAS,CACtDV,EAAS,CAAChY,KAAKwY,qBAAqBT,EAAY,MAAO,uBAAwBA,EAAWO,KAC1F,MAGR,GAAIP,EAAWU,KACP3O,EAAWmP,OAAOlB,EAAWU,IAAKV,EAAWW,QAAS,CACtDV,EAAS,CAAChY,KAAKwY,qBAAqBT,EAAY,MAAO,uBAAwBA,EAAWU,KAC1F,OAKhB,MAEJ,IAAK,UACD,QAAqB9W,IAAjBwW,EAAUE,IAA4C,IAAxBF,EAAUE,GAAGzX,OAAc,CACpDmX,EAAWK,oBACZJ,EAAS,CAAC,sBAEd,MAGJ,GAAY,UADZpJ,GAAO,GAAKuJ,EAAUE,IAAItD,OAAOhU,gBACH,UAAR6N,GAA2B,MAARA,GAAuB,MAARA,GAAgC,IAAjBuJ,EAAUE,IAA6B,IAAjBF,EAAUE,GAAU,CAC7GL,EAAS,CAAC,qBACV,OAIZ,IAAe,IAAXA,EACA,OAKhB,IAAe,IAAXA,EACA,MAIR,IAA4B,YAAvB7J,EAAKmB,SAAShO,MAA6C,gBAAvB6M,EAAKmB,SAAShO,OAA4C,IAAjB0D,EAAMpE,OACpF,OAAQqF,EAAauD,MAAMH,EAAO/H,OAC9B,IAAK,SACG0D,EAAM,GAAKA,EAAM,KACjBgT,EAAS,CAAC,yBAA0BhT,EAAM,GAAIA,EAAM,KAExD,MAEJ,IAAK,WAEG+S,EAAWW,SACL,WAAYM,QACd1R,EAAMC,MAAM,iBAAkB,kFAG9B0R,OAAOjU,EAAM,GAAI+S,EAAWW,QAAQS,QAAQF,OAAOjU,EAAM,GAAI+S,EAAWW,WACxEV,EAAS,CAAC,2BAA4BhT,EAAM,GAAIA,EAAM,MAO1E,OAAOgT,GAQX/R,EAAaqC,UAAUyK,YAAc,WACjC,OAAO/S,KAAKwG,OAAOC,GAAK,UAAazG,KAAKwG,OAAOG,YAQrDV,EAAaqC,UAAUuL,WAAa,WAChC,OAAO7T,KAAKwG,OAAOC,GAAK,SAAYzG,KAAKwG,OAAOI,WASpDX,EAAaqC,UAAUgM,aAAe,SAASjL,GACtB,iBAAVA,IACPA,EAASrJ,KAAKiR,cAAc5H,IAKhC,IAFA,IAAI2O,EAAS,GAEJrX,EAAI,EAAGyY,EAAIpZ,KAAKiH,UAAUrG,OAAQD,EAAIyY,EAAGzY,IAAK,CAEnD,GAAI0I,EAAOpC,WACP,IAAyD,GAArDoC,EAAOpC,UAAU1F,QAAQvB,KAAKiH,UAAUtG,GAAGW,MAC3C,cAIH,IAA4E,GAAxEtB,KAAKiH,UAAUtG,GAAGgL,SAASpK,QAAQ0E,EAAauD,MAAMH,EAAO/H,OAClE,SAGJ0W,EAAOxW,KAAKxB,KAAKiH,UAAUtG,IAkB/B,OAdI0I,EAAOpC,WACP+Q,EAAO9H,KAAK,SAASE,EAAGC,GACpB,OAAOhH,EAAOpC,UAAU1F,QAAQ6O,EAAE9O,MAAQ+H,EAAOpC,UAAU1F,QAAQ8O,EAAE/O,QAYtEtB,KAAK+I,OAAO,eAAgBiP,EAAQ3O,IAU/CpD,EAAaqC,UAAU2I,cAAgB,SAASxK,EAAI4S,GAChD,GAAU,MAAN5S,EACA,OAAO,KAGX,IAAK,IAAI9F,EAAI,EAAGyY,EAAIpZ,KAAK+G,QAAQnG,OAAQD,EAAIyY,EAAGzY,IAC5C,GAAIX,KAAK+G,QAAQpG,GAAG8F,IAAMA,EACtB,OAAOzG,KAAK+G,QAAQpG,GAM5B,OAFA2G,EAAMC,OAAkB,IAAZ8R,EAAmB,kBAAmB,yBAA0B5S,GAErE,MAUXR,EAAaqC,UAAU4I,kBAAoB,SAAS5P,EAAM+X,GACtD,GAAY,MAAR/X,EACA,OAAO,KAGX,IAAK,IAAIX,EAAI,EAAGyY,EAAIpZ,KAAKiH,UAAUrG,OAAQD,EAAIyY,EAAGzY,IAC9C,GAAIX,KAAKiH,UAAUtG,GAAGW,MAAQA,EAC1B,OAAOtB,KAAKiH,UAAUtG,GAM9B,OAFA2G,EAAMC,OAAkB,IAAZ8R,EAAmB,oBAAqB,2BAA4B/X,GAEzE,MAUX2E,EAAaqC,UAAU+M,kBAAoB,SAASlH,GAChD,IAAI9E,EAAS8E,EAAK9E,OACdiG,EAAWnB,EAAKmB,SAChBtK,EAAQ,GAEZ,GAAIqE,EAAOiQ,YACPtU,EAAQqE,EAAOiQ,YAAYxQ,KAAK9I,KAAMmO,OAErC,CAGD,IAFA,IAAIoL,EAASpL,EAAKjI,IAAI6L,KAAK9L,EAAaiE,UAAUK,iBAEzC5J,EAAI,EAAGA,EAAI2O,EAAS7D,UAAW9K,IAAK,CACzC,IACIiO,EADAxO,EAAOkH,EAAMkS,gBAAgBrL,EAAK1H,GAAK,UAAY9F,GAGvD,OAAQ0I,EAAOgG,OACX,IAAK,QACDrK,EAAMxD,KAAK+X,EAAOxH,KAAK,SAAW3R,EAAO,aAAa2Q,OACtD,MAEJ,IAAK,WACDnC,EAAM,GAEN2K,EAAOxH,KAAK,SAAW3R,EAAO,aAAamT,KAAK,WAC5C3E,EAAIpN,KAAKvB,EAAED,MAAM+Q,SAGrB/L,EAAMxD,KAAKoN,GACX,MAEJ,IAAK,SACGvF,EAAOqC,UACPkD,EAAM,GAEN2K,EAAOxH,KAAK,SAAW3R,EAAO,qBAAqBmT,KAAK,WACpD3E,EAAIpN,KAAKvB,EAAED,MAAM+Q,SAGrB/L,EAAMxD,KAAKoN,IAGX5J,EAAMxD,KAAK+X,EAAOxH,KAAK,SAAW3R,EAAO,qBAAqB2Q,OAElE,MAEJ,QACI/L,EAAMxD,KAAK+X,EAAOxH,KAAK,SAAW3R,EAAO,KAAK2Q,QAI1D/L,EAAQA,EAAMsE,IAAI,SAASyH,GAKvB,OAJIzB,EAAS5D,UAAYrC,EAAOoQ,iBAAiC,iBAAP1I,IACtDA,EAAMA,EAAI7M,MAAMmF,EAAOoQ,kBAGvBxZ,EAAEgB,QAAQ8P,GACHA,EAAIzH,IAAI,SAASoQ,GACpB,OAAOpS,EAAMqS,WAAWD,EAAQrQ,EAAO/H,QAIpCgG,EAAMqS,WAAW5I,EAAK1H,EAAO/H,QAIjB,IAAvBgO,EAAS7D,YACTzG,EAAQA,EAAM,IAIdqE,EAAOuQ,cACP5U,EAAQqE,EAAOuQ,YAAY9Q,KAAK9I,KAAMmO,EAAMnJ,IAYpD,OAAOhF,KAAK+I,OAAO,eAAgB/D,EAAOmJ,IAS9ClI,EAAaqC,UAAUsN,kBAAoB,SAASzH,EAAMnJ,GACtD,IAAIqE,EAAS8E,EAAK9E,OACdiG,EAAWnB,EAAKmB,SAEpB,GAAKjG,GAAWiG,EAAhB,CAMA,GAFAnB,EAAKgH,iBAAkB,EAEnB9L,EAAOwQ,YACPxQ,EAAOwQ,YAAY/Q,KAAK9I,KAAMmO,EAAMnJ,OAEnC,CACD,IAAIuU,EAASpL,EAAKjI,IAAI6L,KAAK9L,EAAaiE,UAAUK,iBAExB,GAAtB+E,EAAS7D,YACTzG,EAAQ,CAACA,IAGb,IAAK,IAAIrE,EAAI,EAAGA,EAAI2O,EAAS7D,UAAW9K,IAAK,CACzC,IAAIP,EAAOkH,EAAMkS,gBAAgBrL,EAAK1H,GAAK,UAAY9F,GAEvD,OAAQ0I,EAAOgG,OACX,IAAK,QACDkK,EAAOxH,KAAK,SAAW3R,EAAO,YAAc4E,EAAMrE,GAAK,MAAM+S,KAAK,WAAW,GAAMnL,QAAQ,UAC3F,MAEJ,IAAK,WACItI,EAAEgB,QAAQ+D,EAAMrE,MACjBqE,EAAMrE,GAAK,CAACqE,EAAMrE,KAGtBqE,EAAMrE,GAAGS,QAAQ,SAAS4D,GACtBuU,EAAOxH,KAAK,SAAW3R,EAAO,YAAc4E,EAAQ,MAAM0O,KAAK,WAAW,GAAMnL,QAAQ,YAG5F,MAEJ,QACQ+G,EAAS5D,UAAYrC,EAAOoQ,iBAAmBxZ,EAAEgB,QAAQ+D,EAAMrE,MAC/DqE,EAAMrE,GAAKqE,EAAMrE,GAAG4I,KAAKF,EAAOoQ,kBAEpCF,EAAOxH,KAAK,SAAW3R,EAAO,KAAK2Q,IAAI/L,EAAMrE,IAAI4H,QAAQ,YAMzE4F,EAAKgH,iBAAkB,IAU3BlP,EAAaqC,UAAUwP,eAAiB,SAAS3J,GAC7C,IAAI2E,EAAQ7S,EAAEkB,OAAO,GAAInB,KAAKoG,SAASqH,oBAuBvC,OArBIU,EAAK2L,UACL7Z,EAAEkB,OAAO2R,EAAO,CACZpF,iBAAiB,EACjBC,mBAAmB,EACnBC,gBAAgB,EAChBC,WAAW,IAIfM,EAAK2E,OACL7S,EAAEkB,OAAO2R,EAAO3E,EAAK2E,OAWlB9S,KAAK+I,OAAO,iBAAkB+J,EAAO3E,IAUhDlI,EAAaqC,UAAUqP,aAAe,SAAS7E,EAAOiH,GAClD,GAAIA,EACA,OAAO9Z,EAAEkB,OAAO,GAAI2R,GAGpB,IAAIkH,EAAM,GAMV,OALA/Z,EAAEsT,KAAKvT,KAAKoG,SAASqH,mBAAoB,SAASwM,EAAKjV,GAC/C8N,EAAMmH,KAASjV,IACfgV,EAAIC,GAAOnH,EAAMmH,MAGlBD,GAWf/T,EAAaqC,UAAUsP,gBAAkB,SAAS1J,GAC9C,IAAI4E,EAAQ7S,EAAEkB,OAAO,GAAInB,KAAKoG,SAAS0H,qBAuBvC,OArBII,EAAM4L,UACN7Z,EAAEkB,OAAO2R,EAAO,CACZ/E,oBAAoB,EACpBC,aAAa,EACbC,cAAc,EACdJ,WAAW,IAIfK,EAAM4E,OACN7S,EAAEkB,OAAO2R,EAAO5E,EAAM4E,OAWnB9S,KAAK+I,OAAO,kBAAmB+J,EAAO5E,IAUjDjI,EAAaqC,UAAUkP,cAAgB,SAAS1E,EAAOiH,GACnD,GAAIA,EACA,OAAO9Z,EAAEkB,OAAO,GAAI2R,GAGpB,IAAIkH,EAAM,GAMV,OALA/Z,EAAEsT,KAAKvT,KAAKoG,SAAS0H,oBAAqB,SAASmM,EAAKjV,GAChD8N,EAAMmH,KAASjV,IACfgV,EAAIC,GAAOnH,EAAMmH,MAGlBD,GAWf/T,EAAaqC,UAAUgI,UAAY,SAAS4J,EAAUD,GAMlD,IAAIE,EAiBJ,OAtBKF,IACDA,EAAMC,EACNA,OAAWvY,GAKXwY,EADe,iBAARF,EACOA,EAAIja,KAAKoG,SAASoB,YAAcyS,EAAQ,IAGvCC,EAAWla,KAAKoH,KAAK8S,GAAYla,KAAKoH,MAAM6S,IAAQA,EAYhEja,KAAK+I,OAAO,YAAaoR,EAAaF,EAAKC,IAWtDjU,EAAaqC,UAAUkQ,qBAAuB,SAAST,EAAYzW,EAAMiD,GACrE,OAAOwT,EAAWqC,UAAYrC,EAAWqC,SAAS9Y,IAASiD,GAI/D0B,EAAaiB,UAAUgH,MAAQ,y0CAkC/BjI,EAAaiB,UAAUiH,KAAO,olBAiB9BlI,EAAaiB,UAAUkH,aAAe,gqBAkBtCnI,EAAaiB,UAAUmH,eAAiB,+tBAoBxCpI,EAAaiB,UAAUoH,gBAAkB,srBA0BzCrI,EAAaqC,UAAU2K,iBAAmB,SAAStM,EAAUwM,GACzD,IAAIkH,EAAIra,KAAKkH,UAAUgH,MAAM,CACzBvF,QAAS3I,KACT2G,SAAUA,EACVwM,MAAOA,EACPjG,WAAYlN,KAAKoG,SAAS8G,WAC1BlG,MAAOhH,KAAKgH,MACZZ,SAAUpG,KAAKoG,SACfkK,UAAWtQ,KAAKsQ,UAAUT,KAAK7P,QAWnC,OAAOA,KAAK+I,OAAO,mBAAoBsR,EAAGlH,IAU9ClN,EAAaqC,UAAUwL,gBAAkB,SAASlN,GAC9C,IAAIyT,EAAIra,KAAKkH,UAAUiH,KAAK,CACxBxF,QAAS3I,KACT4G,QAASA,EACTI,MAAOhH,KAAKgH,MACZZ,SAAUpG,KAAKoG,SACfkK,UAAWtQ,KAAKsQ,UAAUT,KAAK7P,QAUnC,OAAOA,KAAK+I,OAAO,kBAAmBsR,IAW1CpU,EAAaqC,UAAU2L,oBAAsB,SAAS9F,EAAMpH,GACxD,IAAIsT,EAAIra,KAAKkH,UAAUkH,aAAa,CAChCzF,QAAS3I,KACTmO,KAAMA,EACNpH,QAASA,EACTC,MAAOhH,KAAKgH,MACZZ,SAAUpG,KAAKoG,SACfkK,UAAWtQ,KAAKsQ,UAAUT,KAAK7P,QAYnC,OAAOA,KAAK+I,OAAO,sBAAuBsR,EAAGlM,EAAMpH,IAWvDd,EAAaqC,UAAUkM,sBAAwB,SAASrG,EAAMlH,GAC1D,IAAIoT,EAAIra,KAAKkH,UAAUmH,eAAe,CAClC1F,QAAS3I,KACTmO,KAAMA,EACNlH,UAAWA,EACXD,MAAOhH,KAAKgH,MACZZ,SAAUpG,KAAKoG,SACfkK,UAAWtQ,KAAKsQ,UAAUT,KAAK7P,QAYnC,OAAOA,KAAK+I,OAAO,wBAAyBsR,EAAGlM,EAAMlH,IAWzDhB,EAAaqC,UAAUgS,mBAAqB,SAASla,EAAM+N,GACvD,IAAIkM,EAAIra,KAAKkH,UAAUoH,gBAAgB,CACnC3F,QAAS3I,KACTI,KAAMA,EACN+N,KAAMA,EACNnH,MAAOhH,KAAKgH,MACZZ,SAAUpG,KAAKoG,SACfkK,UAAWtQ,KAAKsQ,UAAUT,KAAK7P,QAYnC,OAAOA,KAAK+I,OAAO,qBAAsBsR,EAAGja,EAAM+N,IAWtDlI,EAAaqC,UAAU0M,aAAe,SAAS7G,EAAMoM,GACjD,IAAIlR,EAAS8E,EAAK9E,OACd0O,EAAa5J,EAAK9E,OAAO0O,YAAc,GACvC3X,EAAO+N,EAAK1H,GAAK,UAAY8T,EAC7BjW,EAAI+E,EAAOmR,SAAW,eAAiB,GACvCH,EAAI,GACJtK,EAAcrO,MAAMT,QAAQoI,EAAO0G,aAAe1G,EAAO0G,YAAYwK,GAAYlR,EAAO0G,YAE5F,GAA2B,mBAAhB1G,EAAOgG,MACdgL,EAAIhR,EAAOgG,MAAMvG,KAAK9I,KAAMmO,EAAM/N,QAGlC,OAAQiJ,EAAOgG,OACX,IAAK,QACL,IAAK,WACD/H,EAAMsI,eAAevG,EAAOqG,OAAQ,SAASuK,EAAKlJ,GAC9CsJ,GAAK,SAAW/V,EAAI,iBAAmB+E,EAAOgG,MAAQ,WAAajP,EAAO,YAAc6Z,EAAM,MAAQlJ,EAAM,cAEhH,MAEJ,IAAK,SACDsJ,EAAIra,KAAKsa,mBAAmBla,EAAM+N,GAClC,MAEJ,IAAK,WACDkM,GAAK,wCAA0Cja,EAAO,IAClDiJ,EAAOoR,OAAMJ,GAAK,UAAYhR,EAAOoR,KAAO,KAC5CpR,EAAOqR,OAAML,GAAK,UAAYhR,EAAOqR,KAAO,UACzB/Y,IAAnBoW,EAAWO,MAAmB+B,GAAK,eAAiBtC,EAAWO,IAAM,UAClD3W,IAAnBoW,EAAWU,MAAmB4B,GAAK,eAAiBtC,EAAWU,IAAM,KACrE1I,IAAasK,GAAK,iBAAmBtK,EAAc,KACvDsK,GAAK,eACL,MAEJ,IAAK,SACDA,GAAK,mDAAqDja,EAAO,SACzCuB,IAApBoW,EAAWe,OAAoBuB,GAAK,UAAYtC,EAAWe,KAAO,UAC/CnX,IAAnBoW,EAAWO,MAAmB+B,GAAK,SAAWtC,EAAWO,IAAM,UAC5C3W,IAAnBoW,EAAWU,MAAmB4B,GAAK,SAAWtC,EAAWU,IAAM,KAC/D1I,IAAasK,GAAK,iBAAmBtK,EAAc,KACnD1G,EAAOoR,OAAMJ,GAAK,UAAYhR,EAAOoR,KAAO,KAChDJ,GAAK,IACL,MAEJ,QACIA,GAAK,iDAAmDja,EAAO,IAC3D2P,IAAasK,GAAK,iBAAmBtK,EAAc,KACnC,WAAhB1G,EAAO/H,WAAwCK,IAAnBoW,EAAWO,MAAmB+B,GAAK,eAAiBtC,EAAWO,IAAM,KACjF,WAAhBjP,EAAO/H,WAAwCK,IAAnBoW,EAAWU,MAAmB4B,GAAK,eAAiBtC,EAAWU,IAAM,KACjGpP,EAAOoR,OAAMJ,GAAK,UAAYhR,EAAOoR,KAAO,KAChDJ,GAAK,IAajB,OAAOra,KAAK+I,OAAO,eAAgBsR,EAAGlM,EAAM/N,IAOhD,IAAIkH,EAAQ,GAuRZ,SAASf,IAKLvG,KAAKR,KAAO,KAQZQ,KAAKC,EAAIA,EAAED,OA7RfiG,EAAa0U,MAAQrT,GA4BfsI,eAAiB,SAASzP,EAASyH,GACjCzH,IACIF,EAAEgB,QAAQd,GACVA,EAAQiB,QAAQ,SAAS6O,GACjBhQ,EAAEwB,cAAcwO,GAEZ,UAAWA,EACXrI,EAAIqI,EAAMjL,MAAOiL,EAAMT,OAASS,EAAMjL,MAAOiL,EAAMR,UAInDxP,EAAEsT,KAAKtD,EAAO,SAASgK,EAAKlJ,GAExB,OADAnJ,EAAIqS,EAAKlJ,IACF,IAMfnJ,EAAIqI,EAAOA,KAMnBhQ,EAAEsT,KAAKpT,EAAS,SAAS8Z,EAAKlJ,GAC1BnJ,EAAIqS,EAAKlJ,OAYzBzJ,EAAM0O,IAAM,SAASpR,EAAKgW,GAKtB,OAJKlZ,MAAMT,QAAQ2Z,KACfA,EAAOlZ,MAAM4G,UAAUO,MAAMC,KAAKpI,UAAW,IAG1CkE,EAAIjB,QAAQ,cAAe,SAASC,EAAGjD,GAC1C,OAAOia,EAAKrC,SAAS5X,OAW7B2G,EAAMC,MAAQ,WACV,IAAI5G,EAAI,EACJ0Y,EAAkC,kBAAjB3Y,UAAUC,IAAmBD,UAAUC,KACxDW,EAAOZ,UAAUC,KACjBka,EAAUna,UAAUC,KACpBia,EAAOlZ,MAAMT,QAAQP,UAAUC,IAAMD,UAAUC,GAAKe,MAAM4G,UAAUO,MAAMC,KAAKpI,UAAWC,GAE9F,GAAI0Y,EAAS,CACT,IAAIyB,EAAM,IAAIC,MAAMzT,EAAM0O,IAAI6E,EAASD,IAGvC,MAFAE,EAAI1a,KAAOkB,EAAO,QAClBwZ,EAAIF,KAAOA,EACLE,EAGN9U,QAAQuB,MAAMjG,EAAO,UAAYgG,EAAM0O,IAAI6E,EAASD,KAU5DtT,EAAMqS,WAAa,SAAS3U,EAAO1D,GAC/B,GAAc,KAAV0D,QAA0BrD,IAAVqD,EAIpB,OAAQ1D,GAEJ,IAAK,UACD,MAAqB,iBAAV0D,GAAuB,UAAU2T,KAAK3T,GAG1CuT,SAASvT,GAFLA,EAGf,IAAK,SACD,MAAqB,iBAAVA,GAAuB,gBAAgB2T,KAAK3T,GAGhD6T,WAAW7T,GAFPA,EAGf,IAAK,UACD,MAAqB,iBAAVA,GAAuB,yBAAyB2T,KAAK3T,IAG/C,IAAVA,GAA4B,IAAVA,GAAuC,SAAxBA,EAAMjE,eAAsC,MAAViE,EAF/DA,EAGf,QAAS,OAAOA,IAWxBsC,EAAM0T,aAAe,SAAShW,EAAOiW,GACjC,GAAoB,iBAATjW,EACP,OAAOA,EAGX,IAAIkW,EAAUlW,EACTrB,QAAQ,oBAAqB,SAAS4B,GACnC,OAAQA,GAEJ,IAAK,KAAM,MAAO,MAClB,IAAK,KAAM,MAAO,MAClB,IAAK,KAAM,MAAO,MAClB,IAAK,KAAM,MAAO,MAClB,IAAK,IAAM,MAAO,KAClB,QAAW,MAAO,KAAOA,KAKhC5B,QAAQ,MAAO,OACfA,QAAQ,QAAS,OAStB,OAPIsX,IACAC,EAAUA,EACLvX,QAAQ,IAAIgC,OAAO,IAAMsV,EAAmB,IAAK,KAAM,SAAS1V,GAC7D,MAAO,KAAOA,KAInB2V,GAQX5T,EAAM6T,aAAe,SAASvW,GAC1B,OAAOA,EAAIjB,QAAQ,sCAAuC,SAQ9D2D,EAAMkS,gBAAkB,SAAS5U,GAK7B,OAAO,EAAQA,EAAIjB,QAAQ,oBACnB,SAAUyX,EAAIC,EAAIC,GAAO,OAAOD,EAAKD,EAAK,KAAOE,IAAS1W,GAStE0C,EAAMwI,UAAY,SAASyL,EAAOtB,GAC9B,IAAIzM,EAAY,GACZgO,EAAW,GAuBf,OArBAD,EAAMna,QAAQ,SAASyW,GACnB,IAAI4D,EAEA5D,EAAKoC,IAGO,IAFZwB,EAAMjO,EAAUkO,YAAY7D,EAAKoC,KAG7BwB,EAAMjO,EAAU5M,OAGhB6a,IAIJA,EAAMjO,EAAU5M,OAGpB4M,EAAUmO,OAAOF,EAAK,EAAG5D,EAAKoC,IAC9BuB,EAASG,OAAOF,EAAK,EAAG5D,KAGrB2D,GAUXlU,EAAMsU,sBAAwB,SAASC,EAAKC,GACxCA,EAAO1a,QAAQ,SAASmO,GACpB7H,OAAOqU,eAAeF,EAAIvT,UAAWiH,EAAO,CACxCyM,YAAY,EACZC,IAAK,WACD,OAAOjc,KAAK0U,GAAGnF,IAEnB2M,IAAK,SAASlX,GACV,IAAI2Q,EAAoC,OAAnB3V,KAAK0U,GAAGnF,IAA4C,iBAAlBvP,KAAK0U,GAAGnF,GAC3DtP,EAAEkB,OAAO,GAAInB,KAAK0U,GAAGnF,IACrBvP,KAAK0U,GAAGnF,GAEZvP,KAAK0U,GAAGnF,GAASvK,EAEE,OAAfhF,KAAKsG,OAULtG,KAAKsG,MAAMiC,QAAQ,SAAUvI,KAAMuP,EAAOvK,EAAO2Q,SA4BrE1V,EAAEkB,OAAOoF,EAAM+B,UAAyC,CAMpDC,QAAS,SAASjH,GACd,IAAIkH,EAAQ,IAAIvI,EAAEwI,MAAMnH,GAExB,OADAtB,KAAKC,EAAE2I,eAAeJ,EAAO9G,MAAM4G,UAAUO,MAAMC,KAAKpI,UAAW,IAC5D8H,GASXQ,GAAI,WAEA,OADAhJ,KAAKC,EAAE+I,GAAGmT,MAAMnc,KAAKC,EAAGyB,MAAM4G,UAAUO,MAAMC,KAAKpI,YAC5CV,MASXkJ,IAAK,WAED,OADAlJ,KAAKC,EAAEiJ,IAAIiT,MAAMnc,KAAKC,EAAGyB,MAAM4G,UAAUO,MAAMC,KAAKpI,YAC7CV,MASXmJ,KAAM,WAEF,OADAnJ,KAAKC,EAAEmJ,IAAI+S,MAAMnc,KAAKC,EAAGyB,MAAM4G,UAAUO,MAAMC,KAAKpI,YAC7CV,QAWf,IAAI0W,EAAO,SAAS9E,EAAQ1L,GACxB,KAAMlG,gBAAgB0W,GAClB,OAAO,IAAIA,EAAK9E,EAAQ1L,GAG5BwB,OAAOqU,eAAe/b,KAAM,KAAM,CAAEgF,MAAO,KAE3CkB,EAAI2M,KAAK,oBAAqB7S,MAS9BA,KAAK0U,GAAGvB,MAAQ,EAQhBnT,KAAK0U,GAAGnN,MAAQ,KAShBvH,KAAK0U,GAAG5B,MAAQ,GAQhB9S,KAAK0U,GAAG7B,UAAOlR,EAMf3B,KAAKkG,IAAMA,EAMXlG,KAAKyG,GAAKP,EAAI,GAAGO,GAMjBzG,KAAKsG,MAAQ,KAMbtG,KAAK4R,OAASA,GAGlBtK,EAAMsU,sBAAsBlF,EAAM,CAAC,QAAS,QAAS,OAAQ,UAE7DhP,OAAOqU,eAAerF,EAAKpO,UAAW,SAAU,CAC5C0T,YAAY,EACZC,IAAK,WACD,OAAOjc,KAAK0U,GAAG9C,QAEnBsK,IAAK,SAASlX,GACVhF,KAAK0U,GAAG9C,OAAS5M,EACjBhF,KAAKmT,MAAkB,OAAVnO,EAAiB,EAAIA,EAAMmO,MAAQ,EAChDnT,KAAKsG,MAAkB,OAAVtB,EAAiB,KAAOA,EAAMsB,SAQnDoQ,EAAKpO,UAAU+K,OAAS,WACpB,OAAuB,IAAfrT,KAAKmT,OAOjBuD,EAAKpO,UAAU8T,OAAS,WACpB,OAAIpc,KAAKqT,UACG,EAGDrT,KAAK4R,OAAOyK,WAAWrc,OAQtC0W,EAAKpO,UAAUiJ,KAAO,WAClB,IAAIjL,EAAQtG,KAAKsG,MAEXtG,KAAK4R,QACP5R,KAAK4R,OAAO0K,WAAWtc,MAG3BA,KAAKkG,IAAIoQ,WAAW,qBAEN,OAAVhQ,GAOAA,EAAMiC,QAAQ,OAAQvI,OAS9B0W,EAAKpO,UAAUiU,UAAY,SAAS9b,GAC3BT,KAAKqT,UACNrT,KAAKiS,KAAKxR,EAAOmR,OAAQnR,EAAO2b,SAAW,IASnD1F,EAAKpO,UAAUkU,YAAc,SAAS/b,GAC7BT,KAAKqT,gBACS1R,IAAXlB,IACAA,EAAST,KAAK4R,QAGlB5R,KAAKiS,KAAKxR,EAAQ,KAS1BiW,EAAKpO,UAAUmU,UAAY,SAAShc,GAC3BT,KAAKqT,gBACS1R,IAAXlB,IACAA,EAAST,KAAK4R,QAGlB5R,KAAKiS,KAAKxR,EAA4B,IAApBA,EAAOG,SAAiB,EAAIH,EAAOG,SAAW,KAUxE8V,EAAKpO,UAAU2J,KAAO,SAASxR,EAAQoR,GAC9B7R,KAAKqT,WACgB,iBAAX5S,IACPoR,EAAQpR,EACRA,EAAST,KAAK4R,QAGlB5R,KAAK4R,OAAO0K,WAAWtc,MACvBS,EAAOic,WAAW1c,KAAM6R,GAAO,GAEZ,OAAf7R,KAAKsG,OASLtG,KAAKsG,MAAMiC,QAAQ,OAAQvI,KAAMS,EAAQoR,KAarD,IAAIqB,EAAQ,SAAStB,EAAQ1L,GACzB,KAAMlG,gBAAgBkT,GAClB,OAAO,IAAIA,EAAMtB,EAAQ1L,GAG7BwQ,EAAK5N,KAAK9I,KAAM4R,EAAQ1L,GAMxBlG,KAAKiP,MAAQ,GAQbjP,KAAK0U,GAAG5D,UAAY,MAGxBoC,EAAM5K,UAAYZ,OAAOiV,OAAOjG,EAAKpO,WACrC4K,EAAM5K,UAAUsU,YAAc1J,EAE9B5L,EAAMsU,sBAAsB1I,EAAO,CAAC,cAKpCA,EAAM5K,UAAU+L,MAAQ,WACpBrU,KAAKuT,KAAK,UAAW,SAASpF,GAC1BA,EAAKoD,QACN,SAASrD,GACRA,EAAMqD,UAOd2B,EAAM5K,UAAUiJ,KAAO,WACnBvR,KAAKqU,QACLqC,EAAKpO,UAAUiJ,KAAKzI,KAAK9I,OAO7BkT,EAAM5K,UAAU1H,OAAS,WACrB,OAAOZ,KAAKiP,MAAMrO,QAWtBsS,EAAM5K,UAAUoU,WAAa,SAASlL,EAAMK,EAAOtJ,GAoB/C,YAnBc5G,IAAVkQ,IACAA,EAAQ7R,KAAKY,UAGjBZ,KAAKiP,MAAM0M,OAAO9J,EAAO,EAAGL,GAC5BA,EAAKI,OAAS5R,KAEVuI,GAA0B,OAAfvI,KAAKsG,OAShBtG,KAAKsG,MAAMiC,QAAQ,MAAOvI,KAAMwR,EAAMK,GAGnCL,GAUX0B,EAAM5K,UAAU+I,SAAW,SAASnL,EAAK2L,GACrC,OAAO7R,KAAK0c,WAAW,IAAIxJ,EAAMlT,KAAMkG,GAAM2L,GAAO,IAUxDqB,EAAM5K,UAAU6I,QAAU,SAASjL,EAAK2L,GACpC,OAAO7R,KAAK0c,WAAW,IAAIrK,EAAKrS,KAAMkG,GAAM2L,GAAO,IAOvDqB,EAAM5K,UAAUgU,WAAa,SAAS9K,GAClC,IAAIK,EAAQ7R,KAAKqc,WAAW7K,IACb,IAAXK,IACAL,EAAKI,OAAS,KACd5R,KAAKiP,MAAM0M,OAAO9J,EAAO,KASjCqB,EAAM5K,UAAU+T,WAAa,SAAS7K,GAClC,OAAOxR,KAAKiP,MAAM1N,QAAQiQ,IAiB9B0B,EAAM5K,UAAUiL,KAAO,SAASsJ,EAASC,EAAQC,EAASC,GAC/B,kBAAZH,GAA4C,iBAAZA,IACvCG,EAAUD,EACVA,EAAUD,EACVA,EAASD,EACTA,GAAU,GAEdG,OAAsBrb,IAAZqb,EAAwB,KAAOA,EAUzC,IARA,IAAIrc,EAAIkc,EAAU7c,KAAKiP,MAAMrO,OAAS,EAAI,EACtCwY,EAAIyD,EAAU,EAAI7c,KAAKiP,MAAMrO,OAAS,EACtC0D,EAAIuY,GAAW,EAAI,EAInBI,GAAO,GAFAJ,EAAezD,GAALzY,EAASA,GAAKyY,KAK3BpZ,KAAKiP,MAAMtO,aAAcuS,EACnB6J,IACFE,GAAgD,IAAzCF,EAAQjU,KAAKkU,EAAShd,KAAKiP,MAAMtO,KAGrCmc,IACPG,GAA+C,IAAxCH,EAAOhU,KAAKkU,EAAShd,KAAKiP,MAAMtO,MAGvCsc,GAVOtc,GAAK2D,GAepB,OAAQ2Y,GASZ/J,EAAM5K,UAAUiE,SAAW,SAASiF,EAAM0L,GACtC,OAA+B,IAA3Bld,KAAKqc,WAAW7K,MAGV0L,IAKEld,KAAKuT,KAAK,WACd,OAAO,GACR,SAASrF,GACR,OAAQA,EAAM3B,SAASiF,GAAM,MAazC,IAAIa,EAAO,SAAST,EAAQ1L,GACxB,KAAMlG,gBAAgBqS,GAClB,OAAO,IAAIA,EAAKT,EAAQ1L,GAG5BwQ,EAAK5N,KAAK9I,KAAM4R,EAAQ1L,GAExBlG,KAAKoV,iBAAkB,EACvBpV,KAAKmV,iBAAkB,EAQvBnV,KAAK0U,GAAGrL,OAAS,KAQjBrJ,KAAK0U,GAAGpF,SAAW,KAQnBtP,KAAK0U,GAAG1P,WAAQrD,GA8lDpB,SAASwb,EAAqB3L,EAAM/Q,EAAQkI,GACxC,IAAIiJ,EAAQwL,EACR3M,EAAYxK,EAAaiE,WAG7B0H,EAASnR,EAAOmQ,QAAQH,EAAUrG,iBACvBxJ,SACPwc,EAAS,aAIRA,IACDxL,EAASnR,EAAOmQ,QAAQH,EAAU9F,eACvB/J,SACPgR,EAASnR,EAAOmQ,QAAQH,EAAUtG,iBAClCiT,EAAS,eAKZA,IACDxL,EAASnR,EAAOmQ,QAAQH,EAAUtG,kBACvBvJ,SACPwc,EAAS,aAIbA,IACA5L,EAAK4L,GAAQzU,EAAQkI,SAASe,IAG1BjJ,GAAW6I,aAAgBa,GAC3B1J,EAAQiN,kBAAkBpE,EAAMA,EAAKxM,QAiqBjD,SAASqY,EAAcC,GACnB,IAAIC,EAASD,EAAKE,MAAM,8CAExB,OADKD,IAAQA,EAAS,CAAC,KAAM,qBAAiB5b,IACvC4b,EA8LX,OA79EAlL,EAAK/J,UAAYZ,OAAOiV,OAAOjG,EAAKpO,WACpC+J,EAAK/J,UAAUsU,YAAcvK,EAE7B/K,EAAMsU,sBAAsBvJ,EAAM,CAAC,SAAU,WAAY,UAMzDA,EAAK/J,UAAU+K,OAAS,WACpB,OAAO,GASXpN,EAAaiN,MAAQA,EAOrBjN,EAAaoM,KAAOA,EAoBpBpS,EAAEwd,GAAGtX,aAAe,SAASuX,GACL,IAAhB1d,KAAKY,QACL0G,EAAMC,MAAM,SAAU,qBAER,EAAdvH,KAAKY,QACL0G,EAAMC,MAAM,SAAU,2CAG1B,IAAIsL,EAAO7S,KAAK6S,KAAK,gBACjB1S,EAA4B,iBAAVud,GAAsBA,GAAW,GAEvD,IAAK7K,GAAkB,WAAV6K,EACT,OAAO1d,KAEX,IAAK6S,EAAM,CACP,IAAIlK,EAAU,IAAI1C,EAAajG,KAAMG,GACrCH,KAAK6S,KAAK,eAAgBlK,GAC1BA,EAAQqG,KAAK7O,EAAQ8O,OAEzB,MAAqB,iBAAVyO,EACA7K,EAAK6K,GAAQvB,MAAMtJ,EAAMnR,MAAM4G,UAAUO,MAAMC,KAAKpI,UAAW,IAGnEV,MAQXC,EAAEwd,GAAGtX,aAAayW,YAAc3W,EAOhChG,EAAEwd,GAAGtX,aAAasI,SAAWxI,EAAawI,SAO1CxO,EAAEwd,GAAGtX,aAAahF,OAAS8E,EAAa9E,OAOxClB,EAAEwd,GAAGtX,aAAazG,OAASuG,EAAavG,OAOxCO,EAAEwd,GAAGtX,aAAakB,SAAWpB,EAAaoB,SAW1CpB,EAAavG,OAAO,cAAe,SAASS,GACpB,cAAhBA,EAAQwd,MACR3d,KAAKkG,IAAI+B,SAAS,0BAGtBjI,KAAKgJ,GAAG,sBAAuB,SAASqR,EAAGlM,EAAM/N,GAC7C,IAAIiJ,EAAS8E,EAAK9E,OAElB,IAAsB,UAAjBA,EAAOgG,OAAsC,aAAjBhG,EAAOgG,SAA0BhG,EAAOwF,OAAQ,CAC7EwL,EAAErV,MAAQ,GAELqE,EAAOuU,SACRvU,EAAOuU,OAAS,IAEhBvU,EAAOwU,QACPxU,EAAOuU,OAAOE,MAAQzU,EAAOwU,OAGjC,IAAIE,EAAQ1U,EAAOmR,SAAW,yBAA2B,GACrD7Z,EAAI,EAER2G,EAAMsI,eAAevG,EAAOqG,OAAQ,SAASuK,EAAKlJ,GAC9C,IAAI8M,EAAQxU,EAAOuU,OAAO3D,IAAQ5Q,EAAOuU,OAAOE,OAAS3d,EAAQ0d,MAC7DpX,EAAKrG,EAAO,IAAOO,IAEvB0Z,EAAErV,OAAQ,OAClB+Y,EAAQ,WAAa1U,EAAOgG,MAAQ,IAAMhG,EAAOgG,MAAQ,IAAMwO,EAAQ,qBAC5DxU,EAAOgG,MAAQ,WAAajP,EAAO,SAAWqG,EAAK,YAAcwT,EAAM,oBACxExT,EAAK,KAAOsK,EAAM,wBAKjC,CACC4M,KAAM,aACNE,MAAO,YAeX5X,EAAavG,OAAO,kBAAmB,SAASS,GACvCF,EAAEwd,GAAGO,cAAiB/d,EAAEwd,GAAGO,aAAaC,aACzC3W,EAAMC,MAAM,iBAAkB,6HAGlC,IAAIkJ,EAAYxK,EAAaiE,UAG7BlK,KAAKgJ,GAAG,yBAA0B,SAAS3H,EAAG8M,GAC1CA,EAAKjI,IAAI6L,KAAKtB,EAAUzF,aAAa8K,YAAY,gBAAgBkI,aAAa7d,KAGlFH,KAAKgJ,GAAG,2BAA4B,SAAS3H,EAAG8M,GAC5CA,EAAKjI,IAAI6L,KAAKtB,EAAUxF,eAAe6K,YAAY,gBAAgBkI,aAAa7d,KAIpFH,KAAKgJ,GAAG,wBAAyB,SAAS3H,EAAG8M,GACzCA,EAAKjI,IAAI6L,KAAKtB,EAAUzF,aAAagT,aAAa,YAGtDhe,KAAKgJ,GAAG,0BAA2B,SAAS3H,EAAG8M,GAC3CA,EAAKjI,IAAI6L,KAAKtB,EAAUxF,eAAe+S,aAAa,YAGxDhe,KAAKgJ,GAAG,mBAAoB,SAAS3H,EAAG8M,GACpCA,EAAKjI,IAAI6L,KAAKtB,EAAUzF,aAAagT,aAAa,WAClD7P,EAAKjI,IAAI6L,KAAKtB,EAAUxF,eAAe+S,aAAa,cAEzD,CACCE,UAAW,OACXH,MAAO,qBACPI,MAAO,OACPC,UAAU,IAYdnY,EAAavG,OAAO,oBAAqB,SAASS,GACzCF,EAAEwd,GAAGY,SAAYpe,EAAEwd,GAAGY,QAAQJ,aAAgBhe,EAAEwd,GAAGY,QAAQJ,YAAY3V,UAAUgW,UAClFhX,EAAMC,MAAM,iBAAkB,yGAGlC,IAAI4I,EAAOnQ,KAGXA,KAAKgJ,GAAG,iDAAkD,SAASqR,GAC/D,IAAIkE,EAAKte,EAAEA,EAAE+S,UAAUqH,EAAErV,QACzBuZ,EAAGxM,KAAK9L,EAAaiE,UAAUM,iBAAiB3C,KAAK,cAAe,WACpEwS,EAAErV,MAAQuZ,EAAG7K,KAAK,eAItB1T,KAAKsG,MAAM0C,GAAG,SAAU,SAAS3H,EAAGmQ,EAAMjC,GACzB,SAATA,GAAoBY,EAAK/J,SAAS4G,gBAClCwE,EAAKtL,IAAI6L,KAAK9L,EAAaiE,UAAUM,iBAAiByL,GAAG,GACpDoI,QAAQle,GACRke,QAAQ,QACRA,QAAQ,eAGtB,CACCG,UAAW,UAUfvY,EAAa9E,OAA4D,CASrEsd,WAAY,SAASC,EAAe3X,GAChC,IAAIoJ,EAAOnQ,UAEK2B,IAAZoF,IACAA,EAAU2X,EACVA,GAAgB,GAGpB3X,EAAU/G,KAAKkI,aAAanB,GAW5B,IAAI4X,GAFJ5X,EAAU/G,KAAK+I,OAAO,aAAchC,IAEXuC,IAAI,SAASD,GAClC,OAAOA,EAAO5C,KAmDlB,GA/CKiY,GACA,SAASE,EAAapN,GACnBA,EAAK+B,KACD,SAASpF,GACDA,EAAK9E,SAAkD,IAAxCsV,EAAWpd,QAAQ4M,EAAK9E,OAAO5C,KAC9Ca,EAAMC,MAAM,eAAgB,+BAAgC4G,EAAK9E,OAAO5C,KAGhFmY,GAPR,CASE5e,KAAKsG,MAAM9G,MAIjBQ,KAAK+G,QAAUA,EAGd,SAAS8X,EAAcrN,GACpBA,EAAK+B,MAAK,EACN,SAASpF,GACDA,EAAK9E,SAAkD,IAAxCsV,EAAWpd,QAAQ4M,EAAK9E,OAAO5C,KAC9C0H,EAAKoD,OAELpB,EAAK5H,QAAQ,kBAGb4H,EAAK4D,kBAAkB5F,GAEvBA,EAAKjI,IAAI6L,KAAK9L,EAAaiE,UAAUc,aAAa+F,IAAI5C,EAAK9E,OAAS8E,EAAK9E,OAAO5C,GAAK,MACrF0J,EAAK5H,QAAQ,wBAAyB4F,KAG9C0Q,GAfR,CAiBE7e,KAAKsG,MAAM9G,MAGTQ,KAAKoG,SAASe,UACVnH,KAAKoG,SAASe,QAAQ,kBACtBnH,KAAK8e,wBAEL9e,KAAKoG,SAASe,QAAQ,oBACtBnH,KAAKkG,IAAI6L,KAAK9L,EAAaiE,UAAUc,aAAagT,aAAa,WAKnEhe,KAAKoG,SAASmH,eACd,IACIvN,KAAKiR,cAAcjR,KAAKoG,SAASmH,gBAErC,MAAOlM,GACHrB,KAAKoG,SAASmH,eAAiB,KAUvCvN,KAAKuI,QAAQ,kBAAmBxB,IAWpCgY,UAAW,SAASC,EAAYC,QACXtd,IAAbsd,GAAsC,QAAZA,EAC1BA,EAAWjf,KAAK+G,QAAQnG,OAEP,UAAZqe,IACLA,EAAW,GAGVhf,EAAEgB,QAAQ+d,KACXA,EAAa,CAACA,IAGlB,IAAIjY,EAAU9G,EAAEkB,QAAO,EAAM,GAAInB,KAAK+G,SAGlCwR,SAAS0G,IAAaA,EACtBvd,MAAM4G,UAAUqT,OAAOQ,MAAMpV,EAAS,CAACkY,EAAU,GAAG/d,OAAO8d,IAIvDhf,KAAK+G,QAAQmY,KAAK,SAAS7V,EAAQwI,GAC/B,GAAIxI,EAAO5C,IAAMwY,EAEb,OADAA,EAAWpN,EAAQ,GACZ,IAIfnQ,MAAM4G,UAAUqT,OAAOQ,MAAMpV,EAAS,CAACkY,EAAU,GAAG/d,OAAO8d,IAI3Dtd,MAAM4G,UAAU9G,KAAK2a,MAAMpV,EAASiY,GAI5Chf,KAAKye,WAAW1X,IAWpBoY,aAAc,SAASC,EAAWV,GAC9B,IAAI3X,EAAU9G,EAAEkB,QAAO,EAAM,GAAInB,KAAK+G,SACb,iBAAdqY,IACPA,EAAY,CAACA,IAGjBrY,EAAUA,EAAQsC,OAAO,SAASA,GAC9B,OAAyC,IAAlC+V,EAAU7d,QAAQ8H,EAAO5C,MAGpCzG,KAAKye,WAAWC,EAAe3X,MAYvCd,EAAavG,OAAO,sBAAuB,SAASS,GAE3CF,EAAEwd,GAAG4B,QACN/X,EAAMC,MAAM,iBAAkB,4GAG9BvH,KAAKoG,SAASe,QAAQ,oBACtBG,EAAMC,MAAM,WAAY,sHAG5B,IAAIkJ,EAAYxK,EAAaiE,UAG7BlK,KAAKgJ,GAAG,yBAA0B,SAAS3H,EAAG8M,GAC1CA,EAAKjI,IAAI6L,KAAKtB,EAAUzF,aAAa8K,YAAY,gBAAgBuJ,OAAOlf,KAG5EH,KAAKgJ,GAAG,2BAA4B,SAAS3H,EAAG8M,GACK,EAA7C9M,EAAEsH,QAAQ2L,aAAanG,EAAK9E,QAAQzI,QACpCuN,EAAKjI,IAAI6L,KAAKtB,EAAUxF,eAAe6K,YAAY,gBAAgBuJ,OAAOlf,KAKlFH,KAAKgJ,GAAG,wBAAyB,SAAS3H,EAAG8M,GACzCA,EAAKjI,IAAI6L,KAAKtB,EAAUzF,aAAazC,QAAQ,oBAGjDvI,KAAKgJ,GAAG,0BAA2B,SAAS3H,EAAG8M,GAC3CA,EAAKjI,IAAI6L,KAAKtB,EAAUxF,eAAe1C,QAAQ,oBAGnDvI,KAAKgJ,GAAG,mBAAoB,SAAS3H,EAAG8M,GACpCA,EAAKjI,IAAI6L,KAAKtB,EAAUzF,aAAaqU,OAAO,WAC5ClR,EAAKjI,IAAI6L,KAAKtB,EAAUxF,eAAeoU,OAAO,eActDpZ,EAAavG,OAAO,qBAAsB,SAASS,GAE1B,WAAjBA,EAAQmf,KACRtf,KAAKgJ,GAAG,gDAAiD,SAAS3H,EAAG8M,GACjE,IAAIoR,EAAKpR,EAAKjI,IAAI6L,KAAK,wBACnByN,EAAcne,EAAEsH,QAAQ8W,qBAAqBtR,EAAK9E,OAAQ8E,GAEzDqR,GAIiB,IAAdD,EAAG3e,QACH2e,EAAKtf,EAAEA,EAAE+S,UAAU,wCAChB0M,SAASvR,EAAKjI,KAGjBqZ,EAAGtK,IAAI,UAAW,IAGtBsK,EAAGrL,KAAK,aAAe/T,EAAQwf,KAAO,UAAYH,IAXlDD,EAAG7J,SAgBW,YAAjBvV,EAAQmf,MACRrf,EAAEwd,GAAGmC,SAAY3f,EAAEwd,GAAGmC,QAAQ3B,aAAgBhe,EAAEwd,GAAGmC,QAAQ3B,YAAY3V,UAAUgW,UAClFhX,EAAMC,MAAM,iBAAkB,0GAGlCvH,KAAKgJ,GAAG,gDAAiD,SAAS3H,EAAG8M,GACjE,IAAI0R,EAAK1R,EAAKjI,IAAI6L,KAAK,6BACnByN,EAAcne,EAAEsH,QAAQ8W,qBAAqBtR,EAAK9E,OAAQ8E,GAEzDqR,GAQiB,IAAdK,EAAGjf,SACHif,EAAK5f,EAAEA,EAAE+S,UAAU,wGAA0G7S,EAAQwf,KAAO,qBACzI7N,UAAU3D,EAAKjI,IAAI6L,KAAK9L,EAAaiE,UAAUW,eAElDgV,EAAGD,QAAQ,CACPpB,UAAW,OACXN,UAAW,OACXhK,MAAM,IAGV2L,EAAG7W,GAAG,WAAY,WACd6W,EAAGD,QAAQ,WAIfC,EAAG5K,IAAI,UAAW,IAGtB4K,EAAGhN,KAAK,cAAc1S,QAAQ2f,QAAUN,EAEpCK,EAAGhY,KAAK,qBACRgY,EAAGD,QAAQ,UA5BfC,EAAGnK,OAECmK,EAAGhN,KAAK,eACRgN,EAAGD,QAAQ,YA+BD,YAAjBzf,EAAQmf,OACP,YAAatG,QACf1R,EAAMC,MAAM,iBAAkB,6FAGlCvH,KAAKgJ,GAAG,gDAAiD,SAAS3H,EAAG8M,GACjE,IAAI0R,EAAK1R,EAAKjI,IAAI6L,KAAK,6BACnByN,EAAcne,EAAEsH,QAAQ8W,qBAAqBtR,EAAK9E,OAAQ8E,GAEzDqR,GAIiB,IAAdK,EAAGjf,SACHif,EAAK5f,EAAEA,EAAE+S,UAAU,wGAA0G7S,EAAQwf,KAAO,qBACzI7N,UAAU3D,EAAKjI,IAAI6L,KAAK9L,EAAaiE,UAAUW,eAElDgV,EAAG7W,GAAG,QAAS,WACX+W,QAAQC,MAAMH,EAAGhN,KAAK,mBAI1BgN,EAAG5K,IAAI,UAAW,IAGtB4K,EAAGhN,KAAK,cAAe2M,IAfvBK,EAAGnK,WAmBhB,CACCiK,KAAM,gCACNL,KAAM,YAGVrZ,EAAa9E,OAAgE,CAQzEse,qBAAsB,SAASpW,EAAQ8E,GACnC,OAAK9E,EAGiC,mBAAtBA,EAAOmW,YACZnW,EAAOmW,YAAY1W,KAAK9I,KAAMmO,GAG9B9E,EAAOmW,iBANd,KAuBZvZ,EAAavG,OAAO,SAAU,SAASS,GACnC,IAAIgQ,EAAOnQ,KACPyQ,EAAYxK,EAAaiE,UAG7BlK,KAAKgJ,GAAG,YAAa,WACjBmH,EAAKjK,IAAI8C,GAAG,qBAAsB,sBAAuB,WACrD,IAAI2H,EAAS1Q,EAAED,MAAM4Q,QAAQH,EAAUtG,iBACvCgG,EAAK8P,OAAO9P,EAAKU,SAASF,GAASxQ,KAGnCA,EAAQ+f,sBAAwB/f,EAAQggB,cACxChQ,EAAKjK,IAAI8C,GAAG,qBAAsB,qBAAsB,WACpD,IAAIgI,EAAQ/Q,EAAED,MAAM4Q,QAAQH,EAAUrG,gBACtC+F,EAAK8P,OAAO9P,EAAKU,SAASG,GAAQ7Q,OAMzCA,EAAQigB,mBACTpgB,KAAKgJ,GAAG,0BAA2B,SAASqR,GACxC,IAAIkE,EAAKte,EAAEA,EAAE+S,UAAUqH,EAAErV,QACzBuZ,EAAGxM,KAAKtB,EAAUhG,qBAAqB4V,MACnC,sFACelgB,EAAQwf,KAAO,UAAYxP,EAAKG,UAAU,UACzD,aAEJ+J,EAAErV,MAAQuZ,EAAG7K,KAAK,eAGlBvT,EAAQ+f,sBAAwB/f,EAAQggB,cACxCngB,KAAKgJ,GAAG,yBAA0B,SAASqR,GACvC,IAAIkE,EAAKte,EAAEA,EAAE+S,UAAUqH,EAAErV,QACzBuZ,EAAGxM,KAAKtB,EAAU5F,cAAcyV,QAC5B,qFACengB,EAAQwf,KAAO,UAAYxP,EAAKG,UAAU,UACzD,aAEJ+J,EAAErV,MAAQuZ,EAAG7K,KAAK,iBAI/B,CACCiM,KAAM,6BACNzC,WAAW,EACXiD,cAAc,EACdD,sBAAsB,EACtBK,aAAa,EACbH,kBAAkB,IAGtBna,EAAawI,SAAS,CAClB+R,kBAAmB,CACfhV,MAAoB,YACpBI,UAAoB,QACpBC,GAAoB,SACpBC,OAAoB,KACpBC,KAAoB,mBACpBC,cAAoB,UACpBC,QAAoB,gBACpBC,iBAAoB,OACpBC,QAAoB,cACpBC,YAAoB,UACpBC,YAAoB,kBACpBC,gBAAoB,cACpBC,SAAoB,eACpBC,aAAoB,WACpBC,UAAoB,gBACpBC,cAAoB,YACpBC,SAAoB,eACpBC,aAAoB,WACpBC,QAAoB,cACpBC,YAAoB,WAGxB2T,mBAAoB,CAChBC,IAAO,KACPC,GAAM,SAId1a,EAAa9E,OAAqD,CAQ9D8e,OAAQ,SAASzO,EAAMrR,GACnB,KAAMqR,aAAgBkF,GAAO,CACzB,IAAK1W,KAAKsG,MAAM9G,KAAM,OACtBW,EAAUqR,EACVA,EAAOxR,KAAKsG,MAAM9G,KAStB,GANsB,iBAAXW,IAAqBA,EAAU,SAChBwB,IAAtBxB,EAAQ+c,YAAyB/c,EAAQ+c,WAAY,QAC5Bvb,IAAzBxB,EAAQggB,eAA4BhgB,EAAQggB,cAAe,QACnCxe,IAAxBxB,EAAQogB,cAA2BpgB,EAAQogB,aAAc,QACrC5e,IAApBxB,EAAQoI,UAAuBpI,EAAQoI,SAAU,GAEjDiJ,aAAgB0B,GAUhB,GARIlT,KAAKoG,SAASqa,mBAAmBjP,EAAKV,WACtCU,EAAKV,UAAY9Q,KAAKoG,SAASqa,mBAAmBjP,EAAKV,WAEjD3Q,EAAQogB,aACdjZ,EAAMC,MAAM,kBAAmB,qCAAsCiK,EAAKV,WAI1E3Q,EAAQ+c,UAAW,CACnB,IAAI0D,EAAW3gB,EAAEkB,OAAO,GAAIhB,EAAS,CAAEoI,SAAS,IAChDiJ,EAAK+B,KAAK,SAASpF,GACXhO,EAAQggB,cACRngB,KAAKigB,OAAO9R,EAAMyS,IAEvB,SAAS1S,GACRlO,KAAKigB,OAAO/R,EAAO0S,IACpB5gB,YAGN,GAAIwR,aAAgBa,GACjBb,EAAKlC,WAAakC,EAAKnI,OAAOwX,UAE9B,GAAI7gB,KAAKoG,SAASoa,kBAAkBhP,EAAKlC,SAAShO,MAAO,CACrD,IAAI2e,EAASjgB,KAAKoG,SAASoa,kBAAkBhP,EAAKlC,SAAShO,MAEtDkQ,EAAKnI,OAAOpC,YAAuD,GAA1CuK,EAAKnI,OAAOpC,UAAU1F,QAAQ0e,KACxDzO,EAAKlC,SAAWtP,KAAKkR,kBAAkB+O,SAGrC9f,EAAQogB,aACdjZ,EAAMC,MAAM,iBAAkB,oCAAqCiK,EAAKlC,SAAShO,MAKzFnB,EAAQoI,UAQRvI,KAAKuI,QAAQ,cAAeiJ,EAAMrR,GAElCH,KAAKuI,QAAQ,oBAYzBtC,EAAawI,SAAS,CAClBqS,eAAgB,CAEZtV,MAAkB,SAASrG,GAAK,OAAOA,EAAE,IACzCyG,UAAkB,SAASzG,GAAK,MAAO,CAAE4b,IAAO5b,EAAE,KAClD0G,GAAkB,SAAS1G,GAAK,MAAO,CAAE6b,IAAO7b,IAChD2G,OAAkB,SAAS3G,GAAK,MAAO,CAAE8b,KAAQ9b,IACjD4G,KAAkB,SAAS5G,GAAK,MAAO,CAAE+b,IAAO/b,EAAE,KAClD6G,cAAkB,SAAS7G,GAAK,MAAO,CAAEgc,KAAQhc,EAAE,KACnD8G,QAAkB,SAAS9G,GAAK,MAAO,CAAEic,IAAOjc,EAAE,KAClD+G,iBAAkB,SAAS/G,GAAK,MAAO,CAAEkc,KAAQlc,EAAE,KACnDgH,QAAkB,SAAShH,GAAK,MAAO,CAAEkc,KAAQlc,EAAE,GAAIgc,KAAQhc,EAAE,KACjEiH,YAAkB,SAASjH,GAAK,MAAO,CAAE+b,IAAO/b,EAAE,GAAIic,IAAOjc,EAAE,KAC/DkH,YAAkB,SAASlH,GAAK,MAAO,CAAEmc,OAAU,IAAMha,EAAM6T,aAAahW,EAAE,MAC9EmH,gBAAkB,SAASnH,GAAK,MAAO,CAAEmc,OAAU,OAASha,EAAM6T,aAAahW,EAAE,IAAM,MACvFoH,SAAkB,SAASpH,GAAK,MAAO,CAAEmc,OAAUha,EAAM6T,aAAahW,EAAE,MACxEqH,aAAkB,SAASrH,GAAK,MAAO,CAAEmc,OAAU,QAAUha,EAAM6T,aAAahW,EAAE,IAAM,QAASoc,SAAY,MAC7G9U,UAAkB,SAAStH,GAAK,MAAO,CAAEmc,OAAUha,EAAM6T,aAAahW,EAAE,IAAM,MAC9EuH,cAAkB,SAASvH,GAAK,MAAO,CAAEmc,OAAU,OAASha,EAAM6T,aAAahW,EAAE,IAAM,OACvFwH,SAAkB,SAASxH,GAAK,MAAO,IACvCyH,aAAkB,SAASzH,GAAK,MAAO,CAAE4b,IAAO,KAChDlU,QAAkB,SAAS1H,GAAK,OAAO,MACvC2H,YAAkB,SAAS3H,GAAK,MAAO,CAAE4b,IAAO,QAIpDS,mBAAoB,CAChBC,IAAK,SAAStc,GACV,MAAO,CACH4L,IAAO5L,EACPuc,GAAY,OAANvc,EAAa,UAAmB,KAANA,EAAW,WAAa,UAGhE4b,IAAK,SAAS5b,GAEV,MAAO,CACH4L,IAFJ5L,EAAIA,EAAE4b,IAGFW,GAAY,OAANvc,EAAa,cAAuB,KAANA,EAAW,eAAiB,cAGxEmc,OAAQ,SAASnc,GAEb,MAAqB,SADrBA,EAAIA,EAAEmc,QACAzY,MAAM,EAAG,IAA+B,KAAf1D,EAAE0D,OAAO,GAC7B,CAAEkI,IAAO5L,EAAE0D,MAAM,GAAI,GAAI6Y,GAAM,mBAEhB,SAAjBvc,EAAE0D,MAAM,EAAG,IAAgC,SAAf1D,EAAE0D,OAAO,GACnC,CAAEkI,IAAO5L,EAAE0D,MAAM,GAAI,GAAI6Y,GAAM,gBAEhB,QAAjBvc,EAAE0D,MAAM,EAAG,IAA+B,MAAf1D,EAAE0D,OAAO,GAClC,CAAEkI,IAAO5L,EAAE0D,MAAM,GAAI,GAAI6Y,GAAM,iBAElB,KAAfvc,EAAE0D,OAAO,GACP,CAAEkI,IAAO5L,EAAE0D,MAAM,GAAI,GAAI6Y,GAAM,aAEhB,KAAjBvc,EAAE0D,MAAM,EAAG,GACT,CAAEkI,IAAO5L,EAAE0D,MAAM,GAAI6Y,GAAM,eAG3B,CAAE3Q,IAAO5L,EAAGuc,GAAM,aAGjCvV,QAAS,SAAShH,GACd,MAAO,CAAE4L,IAAO,CAAC5L,EAAEkc,KAAMlc,EAAEgc,MAAOO,GAAM,YAE5CtV,YAAa,SAASjH,GAClB,MAAO,CAAE4L,IAAO,CAAC5L,EAAE+b,IAAK/b,EAAEic,KAAMM,GAAM,gBAE1CV,IAAK,SAAS7b,GACV,MAAO,CAAE4L,IAAO5L,EAAE6b,IAAKU,GAAM,OAEjCT,KAAM,SAAS9b,GACX,MAAO,CAAE4L,IAAO5L,EAAE8b,KAAMS,GAAM,WAElCR,IAAK,SAAS/b,GACV,MAAO,CAAE4L,IAAO5L,EAAE+b,IAAKQ,GAAM,SAEjCP,KAAM,SAAShc,GACX,MAAO,CAAE4L,IAAO5L,EAAEgc,KAAMO,GAAM,kBAElCN,IAAK,SAASjc,GACV,MAAO,CAAE4L,IAAO5L,EAAEic,IAAKM,GAAM,YAEjCL,KAAM,SAASlc,GACX,MAAO,CAAE4L,IAAO5L,EAAEkc,KAAMK,GAAM,wBAK1Czb,EAAa9E,OAA6D,CAUtEwgB,SAAU,SAAS9O,GAGf,KAFAA,OAAiBlR,IAATkR,EAAsB7S,KAAKmX,WAAatE,GAG5C,OAAO,KAGX,IAAI1C,EAAOnQ,KAEX,OAAQ,SAAS8W,EAAM5I,GAQnB,GAPKA,EAAM4C,YACP5C,EAAM4C,UAAYX,EAAK/J,SAAS+G,oBAE0B,IAA1D,CAAC,MAAO,MAAM5L,QAAQ2M,EAAM4C,UAAU8Q,gBACtCta,EAAMC,MAAM,0BAA2B,qDAAsD2G,EAAM4C,YAGlG5C,EAAMe,MACP,MAAO,GAGX,IAAI4S,EAAQ,GAEZ3T,EAAMe,MAAM7N,QAAQ,SAAS+M,GACzB,GAAIA,EAAKc,OAA6B,EAApBd,EAAKc,MAAMrO,OACzBihB,EAAMrgB,KAAKsV,EAAM3I,QAEhB,CACD,IAAI2T,EAAM3R,EAAK/J,SAAS0a,eAAe3S,EAAKmB,UACxCyS,EAAM5R,EAAKe,kBAAkB/C,EAAKmB,eAE1B3N,IAARmgB,GACAxa,EAAMC,MAAM,yBAA0B,+CAAgD4G,EAAKmB,UAGzE,IAAlByS,EAAItW,YACE0C,EAAKnJ,iBAAiBtD,QACxByM,EAAKnJ,MAAQ,CAACmJ,EAAKnJ,SAY3B,IAEIgd,EAAiB,GACrBA,EAHY7R,EAAKpH,OAAO,kBAAmBoF,EAAKoB,MAAOpB,IAG/B2T,EAAIhZ,KAAKqH,EAAMhC,EAAKnJ,OAY5C6c,EAAMrgB,KAAK2O,EAAKpH,OAAO,cAAeiZ,EAAgB7T,EAAMA,EAAKnJ,MAAO8c,OAIhF,IAAIG,EAAkB,GAWtB,OAVAA,EAAgB,IAAM/T,EAAM4C,UAAU/P,eAAiB8gB,EAUhD1R,EAAKpH,OAAO,eAAgBkZ,EAAiB/T,GAtEjD,CAuEL2E,IAaNqP,kBAAmB,SAASC,GACxB,GAAIA,MAAAA,EACA,OAAO,KAGX,IAAIhS,EAAOnQ,KAYX,GAAI,UAHJmiB,EAAQhS,EAAKpH,OAAO,iBAAkBoZ,KAGd,cAAeA,EACnC,OAAOA,EAIX,GAAI,OAAQA,GAAS,aAAcA,GAAS,UAAWA,EACnD,MAAO,CACHrR,UAAW9Q,KAAKoG,SAAS+G,kBACzB8B,MAAO,CAACkT,IAIhB,IAAIlI,EAAM9J,EAAKiS,kBAAkBD,GAKjC,OAJKlI,GACD3S,EAAMC,MAAM,aAAc,gCAGtB,SAASuP,EAAMjE,EAAMwP,GACzB,IAAIpT,EAAQ4D,EAAKwP,GACbR,EAAQ,GAmEZ,OAjEA5S,EAAM7N,QAAQ,SAASyR,GAKnB,GAAI,UAHJA,EAAO1C,EAAKpH,OAAO,iBAAkB8J,KAGd,cAAeA,EAClCgP,EAAMrgB,KAAKqR,QAKf,GAAI,OAAQA,GAAQ,aAAcA,GAAQ,UAAWA,EACjDgP,EAAMrgB,KAAKqR,OADf,CAKA,IAAIoH,EAAM9J,EAAKiS,kBAAkBvP,GACjC,GAAIoH,EACA4H,EAAMrgB,KAAKsV,EAAMjE,EAAMoH,QAEtB,CACD,IAAI1K,EAAQ7H,OAAOC,KAAKkL,GAAM,GAC1B7N,EAAQ6N,EAAKtD,GAEbD,EAAWa,EAAKmS,iBAAiBtd,QACpBrD,IAAb2N,GACAhI,EAAMC,MAAM,aAAc,gCAG9B,IAAIgb,EAAQpS,EAAK/J,SAASob,mBAAmBlS,QAC/B3N,IAAV4gB,GACAjb,EAAMC,MAAM,yBAA0B,iDAAkD+H,GAG5F,IAAIkT,EAAQD,EAAMzZ,KAAKqH,EAAMnL,GAEzByB,EAAK0J,EAAKsS,kBAAkBlT,EAAOvK,GAUnCmJ,EAAOgC,EAAKpH,OAAO,cAAe,CAClCtC,GAAIA,EACJ8I,MAAOA,EACPD,SAAUkT,EAAMd,GAChB1c,MAAOwd,EAAMzR,KACd8B,GAEHgP,EAAMrgB,KAAK2M,OAYZgC,EAAKpH,OAAO,eAAgB,CAC/B+H,UAAWuR,EAAO1e,QAAQ,IAAK,IAAIie,cACnC3S,MAAO4S,GACRhP,GAxEA,CAyELsP,EAAOlI,IAObyI,kBAAmB,SAASP,GACxBniB,KAAKkP,SAASlP,KAAKkiB,kBAAkBC,KAYzCM,kBAAmB,SAASlT,EAAOvK,GAC/B,IAAI2d,EAAkB3iB,KAAK+G,QAAQsC,OAAO,SAASA,GAC/C,OAAOA,EAAOkG,QAAUA,IAmB5B,OAf+B,IAA3BoT,EAAgB/hB,OACX+hB,EAAgB,GAAGlc,GAWnBzG,KAAK+I,OAAO,oBAAqBwG,EAAOvK,IAYrDsd,iBAAkB,SAASzP,GACvB,GAAa,OAATA,GAAiC,iBAATA,EAiBxB,MAAO,MAhBP,QAAkBlR,IAAdkR,EAAKwO,WAAoC1f,IAAdkR,EAAKsO,KAChC,MAAO,UAEX,QAAiBxf,IAAbkR,EAAKqO,UAAkCvf,IAAbkR,EAAKuO,IAC/B,MAAO,cAGX,IAAIwB,EAAYlb,OAAOC,KAAKkL,GAAMxJ,OAAO,SAAS4Q,GAC9C,QAASja,KAAKoG,SAASob,mBAAmBvH,IAC5CpK,KAAK7P,OAEP,OAAyB,IAArB4iB,EAAUhiB,OACHgiB,EAAU,QADrB,GAgBRR,kBAAmB,SAASvP,GAGxB,IAFA,IAAIlL,EAAOD,OAAOC,KAAKkL,GAEdlS,EAAI,EAAGyY,EAAIzR,EAAK/G,OAAQD,EAAIyY,EAAGzY,IACpC,GAA8B,QAA1BgH,EAAKhH,GAAGI,eAAqD,SAA1B4G,EAAKhH,GAAGI,cAC3C,OAAO4G,EAAKhH,MAe5BsF,EAAavG,OAAO,YAAa,SAASS,GACtC,IAAIgQ,EAAOnQ,KAGXA,KAAKgJ,GAAG,YAAa,WACjBmH,EAAKjK,IAAI8C,GAAG,qBAAsB,mBAAoB,WAClD,IAAI2H,EAAS1Q,EAAED,MAAM4Q,QAAQ3K,EAAaiE,UAAUC,iBAChD+D,EAAQiC,EAAKU,SAASF,GAC1BzC,EAAM2U,KAAO3U,EAAM2U,MAGvB1S,EAAK7J,MAAM0C,GAAG,SAAU,SAAS3H,EAAGmQ,EAAMjC,GAClCiC,aAAgB0B,GAAmB,QAAV3D,GACzBY,EAAK2S,eAAetR,OAMhCxR,KAAKgJ,GAAG,gBAAiB,SAAS3H,EAAG6M,GACjCA,EAAMwG,GAAGmO,KAAM,IAId1iB,EAAQigB,kBACTpgB,KAAKgJ,GAAG,0BAA2B,SAASqR,GACxC,IAAIkE,EAAKte,EAAEA,EAAE+S,UAAUqH,EAAErV,QACzBuZ,EAAGxM,KAAK9L,EAAaiE,UAAUO,qBAAqB6V,QAChD,mFACengB,EAAQ4iB,eAAiB,UAAY5S,EAAKG,UAAU,OACnE,aAEJ+J,EAAErV,MAAQuZ,EAAG7K,KAAK,eAK1B1T,KAAKgJ,GAAG,qBAAsB,SAAS3H,EAAG6M,GACtC7M,EAAE2D,MAAM6d,IAAM3U,EAAM2U,MAIxB7iB,KAAKgJ,GAAG,qBAAsB,SAAS3H,EAAG2hB,GACtC3hB,EAAE2D,MAAM6d,MAAQG,EAAKH,MAIzB7iB,KAAKgJ,GAAG,oBAAqB,SAAS3H,EAAG6M,GACjCA,EAAM2U,MACNxhB,EAAE2D,MAAQ,SAAW3D,EAAE2D,MAAQ,QAKvChF,KAAKgJ,GAAG,sBAAuB,SAAS3H,GAChCA,EAAE2D,MAAM5E,MAAsC,OAA9BiB,EAAE2D,MAAM5E,KAAKwhB,gBAC7BvgB,EAAE2D,MAAQ3D,EAAE2D,MAAMtE,UAAUsE,MAAM,IAG8B,IAA5D,CAAC,MAAO,MAAMzD,QAAQF,EAAE2D,MAAMie,UAAUrB,iBACxCvgB,EAAE2D,MAAQ,IAAIke,UAAUC,MAAMC,GAC1BjT,EAAK/J,SAAS+G,kBACd9L,EAAE2D,MACF,OAIR3D,EAAE2D,MAAM6d,KAAM,KAKtB7iB,KAAKgJ,GAAG,2BAA4B,SAAS3H,EAAG6M,EAAO2E,EAAMlS,GACrDkS,EAAKgQ,KAAW,EAAJliB,IACZU,EAAE2D,OAAQ,KAKlBhF,KAAKgJ,GAAG,oBAAqB,SAAS3H,EAAGwR,GACrCxR,EAAE2D,MAAM6d,MAAQhQ,EAAKgQ,MAIzB7iB,KAAKgJ,GAAG,sBAAuB,SAAS3H,EAAG6M,GACvC,IAAI+L,EAAM,IAAM/L,EAAM4C,UAAU/P,cAC5BmN,EAAM2U,KAAOxhB,EAAE2D,MAAMiV,KACrB5Y,EAAE2D,MAAQ,CAAEqe,KAAQ,CAAChiB,EAAE2D,WAK/BhF,KAAKgJ,GAAG,wBAAyB,SAAS3H,GACtC,IAAIsG,EAAOD,OAAOC,KAAKtG,EAAE2D,OAEV,QAAX2C,EAAK,KACLtG,EAAE2D,MAAQ3D,EAAE2D,MAAM2C,EAAK,IAAI,GAC3BtG,EAAE2D,MAAM6d,KAAM,KAKtB7iB,KAAKgJ,GAAG,sBAAuB,SAAS3H,EAAGwR,GACvCxR,EAAE2D,MAAM6d,MAAQhQ,EAAKgQ,OAE1B,CACCE,eAAgB,gCAChBO,aAAc,4BACdlD,kBAAkB,IAUtB9Y,EAAMsU,sBAAsB1I,EAAO,CAAC,QAEpCjN,EAAaiE,UAAUqZ,UAAYtd,EAAaiE,UAAUS,aAAe,oBAEzE1E,EAAa9E,OAAuD,CAOhE2hB,eAAgB,SAAS5U,GACrB,IAAI/N,EAAUH,KAAKmH,QAAQ,aAC3B+G,EAAMhI,IAAI6L,KAAK,IAAM9L,EAAaiE,UAAUqZ,WACvC5P,YAAY,SAAUzF,EAAM2U,KAC5B9Q,KAAK,KAAKlK,KAAK,QAASqG,EAAM2U,IAAM1iB,EAAQmjB,aAAenjB,EAAQ4iB,gBAQxE/iB,KAAKuI,QAAQ,sBAAuB2F,GAEpClO,KAAKuI,QAAQ,mBAgBrBtC,EAAavG,OAAO,UAAW,SAASS,GAC/BF,EAAEwd,GAAG+F,SACNlc,EAAMC,MAAM,iBAAkB,gDAGlC,IAAIkJ,EAAYxK,EAAaiE,UAEzBuZ,EAAsB,SAAStV,EAAMxF,GACrC,QAA0BhH,IAAtBwM,EAAK9E,OAAOgG,OAA6C,WAAtBlB,EAAK9E,OAAOgG,MAAnD,CAGA,IAAIqU,EAAehc,OAAO3C,OAAO,GAAI5E,GASrC,GARIgO,GAAQA,EAAK9E,QAAU8E,EAAK9E,OAAOwJ,MAAQ1E,EAAK9E,OAAOwJ,KAAK2Q,UAC5DE,EAAehc,OAAO3C,OAAOoJ,EAAK9E,OAAOwJ,KAAK2Q,QAASE,IAGvDvjB,GAAWA,EAAQwjB,yBACnBD,EAAaE,eAAiBzV,EAAKjI,IAAI6L,KAAKtB,EAAUvF,YAAY2Y,QAAQ1jB,EAAQwjB,wBAAwBG,SAG1G3V,GAAQA,EAAK0E,MAAQ1E,EAAK0E,KAAKkR,WAAY,CAC3C,IAAIrG,EAASzd,EAAE,qBAAqB8Q,IAAI5C,EAAK0E,KAAKmR,SAAS3e,KAAK8I,EAAK0E,KAAKkR,YAC1E5V,EAAKjI,IAAI6L,KAAKtB,EAAUvF,YAAYxI,OAAOgb,GAC3CvP,EAAK0E,KAAKkR,gBAAapiB,EACvBwM,EAAK0E,KAAKmR,aAAUriB,EAGxBwM,EAAKjI,IAAI6L,KAAKtB,EAAUvF,YAAY4K,YAAY,gBAAgB0N,QAAQE,GACxEvV,EAAKjI,IAAI8C,GAAG,gBAAiB,SAAS3H,GAClC,IAAI4iB,EAAM,iBACVhkB,EAAEoB,EAAEZ,QAAQojB,UAAU3a,IAAI+a,GAC1BhkB,EAAE+Y,QAAQ9P,IAAI+a,OAKtBjkB,KAAKgJ,GAAG,yBAA0B,SAAS3H,EAAG8M,GAC1CnI,QAAQjD,IAAI1B,EAAEsH,QAAQzC,IAAI2d,WAC1BK,WAAW,WACH/jB,EAAQwjB,yBACRxjB,EAAQyjB,eAAiBviB,EAAEsH,QAAQzC,IAAI2d,QAAQ1jB,EAAQwjB,wBAAwBG,SAEnF3V,EAAKjI,IAAI6L,KAAKtB,EAAUzF,aAAa8K,YAAY,gBAAgB0N,QAAQrjB,IAM1E,KAGPH,KAAKgJ,GAAG,2BAA4B,SAAS3H,EAAG8M,GAC5C+V,WAAW,WACH/jB,EAAQwjB,yBACRxjB,EAAQyjB,eAAiBviB,EAAEsH,QAAQzC,IAAI2d,QAAQ1jB,EAAQwjB,wBAAwBG,SAEnF3V,EAAKjI,IAAI6L,KAAKtB,EAAUxF,eAAe6K,YAAY,gBAAgB0N,QAAQrjB,IAM5E,KAEPH,KAAKgJ,GAAG,uBAAwB,SAAS3H,EAAG8M,GACxCsV,EAAoBtV,EAAM9M,EAAEsH,WAIhC3I,KAAKgJ,GAAG,wBAAyB,SAAS3H,EAAG8M,GACzC+V,WAAW,WACH/jB,EAAQwjB,yBACRxjB,EAAQyjB,eAAiBviB,EAAEsH,QAAQzC,IAAI2d,QAAQ1jB,EAAQwjB,wBAAwBG,SAEnF3V,EAAKjI,IAAI6L,KAAKtB,EAAUzF,aAAawY,QAAQrjB,IAM9C,KAGPH,KAAKgJ,GAAG,0BAA2B,SAAS3H,EAAG8M,GACvChO,EAAQwjB,yBACRxjB,EAAQyjB,eAAiBviB,EAAEsH,QAAQzC,IAAI2d,QAAQ1jB,EAAQwjB,wBAAwBG,SAEnF3V,EAAKjI,IAAI6L,KAAKtB,EAAUxF,eAAeuY,QAAQrjB,KAQnDH,KAAKgJ,GAAG,uBAAwB,SAAS3H,EAAG8M,GACxCsV,EAAoBtV,EAAM9M,EAAEsH,YAGjC,IAaH1C,EAAavG,OAAO,WAAY,SAASS,GAgBrC,IAAI4P,EACAoU,EACA9jB,EACA+jB,EAlBE,aAAcpL,QAChB1R,EAAMC,MAAM,iBAAkB,4FAGE5F,IAAhCxB,EAAQkkB,sBACR/c,EAAMC,OAAM,EAAO,SAAU,sIAC7BvH,KAAKoG,SAASqH,mBAAmB6W,YAActkB,KAAKoG,SAAS0H,oBAAoBwW,YAAcnkB,EAAQkkB,qBAI3GE,SAASC,aAAY,GAGrBD,SAASE,qBAAqB,IAQ9BzkB,KAAKgJ,GAAG,6BAA8B,SAAS3H,EAAGmQ,GAC9C,GAAIA,GAAQzB,EAAZ,CAIA,IAAII,EAAO9O,EAAEsH,QAGTxI,EAAQukB,qBAAuBlT,EAAKI,QAAUJ,EAAKI,OAAOkB,MAAMwR,cAChE9S,EAAKsB,MAAMwR,aAAc,GAEzBnkB,EAAQwkB,iBAAmBnT,EAAKI,QAAUJ,EAAKI,OAAOkB,MAAM8R,UAC5DpT,EAAKsB,MAAM8R,SAAU,GAIpBpT,EAAKsB,MAAMwR,aACZC,SAAS/S,EAAKtL,IAAI,IACb2e,UAAU,CACPC,UAAW7e,EAAaiE,UAAU6a,YAClCC,QAAS,SAASxc,GACd4b,GAAQ,EAGR/jB,EAAM8P,EAAKU,SAASrI,EAAM/H,QAG1B0jB,EAAQ9jB,EAAI6F,IAAI1F,QACXkf,SAASrf,EAAI6F,IAAI0L,UACjBuM,MAAM9d,EAAI6F,IAAI+e,cACdhd,SAAS,YAGd,IAAIid,EAAKjlB,EAAEA,EAAE+S,UAAU,+CAClBmS,OAAO9kB,EAAI6F,IAAIkf,eAEpBrV,EAAc1P,EAAIuR,OAAOT,QAAQ+T,EAAI7kB,EAAI+b,UAGzC/b,EAAI6F,IAAIwP,QAEZ2P,OAAQ,SAAS7c,GAEb2b,EAAM,GAAGpG,MAAMuH,IAAM9c,EAAM+c,QAAU,GAAK,KAC1CpB,EAAM,GAAGpG,MAAMyH,KAAOhd,EAAMid,QAAU,GAAK,MAE/CC,MAAO,SAASld,GAERA,EAAMmd,WACNxI,EAAqB9c,EAAKJ,EAAEuI,EAAMod,eAAgBzV,GAClDiU,GAAQ,GAIZD,EAAM1S,SACN0S,OAAQxiB,EAGRoO,EAAYwB,OACZxB,OAAcpO,EAGdtB,EAAI6F,IAAI+O,IAAI,UAAW,IAQvB9E,EAAK5H,QAAQ,YAAalI,GAE1B8P,EAAK5H,QAAQ,mBAKxBiJ,EAAKsB,MAAM8R,UAEZL,SAAS/S,EAAKtL,IAAI,IACbyf,SAAS,CACNE,OAAQ5f,EAAaiE,UAAU4b,0BAC/BC,YAAa,SAASvd,GAClB2U,EAAqBpN,EAAa9P,EAAEuI,EAAM/H,QAAS0P,IAEvD6V,OAAQ,SAASxd,GACR4b,GACDjH,EAAqB9c,EAAKJ,EAAEuI,EAAM/H,QAAS0P,MAMvDqB,aAAgB0B,GAChBqR,SAAS/S,EAAKtL,IAAI6L,KAAK9L,EAAaiE,UAAUS,cAAc,IACvDgb,SAAS,CACNE,OAAQ5f,EAAaiE,UAAU4b,0BAC/BC,YAAa,SAASvd,GAClB2U,EAAqBpN,EAAa9P,EAAEuI,EAAM/H,QAAS0P,IAEvD6V,OAAQ,SAASxd,GACR4b,GACDjH,EAAqB9c,EAAKJ,EAAEuI,EAAM/H,QAAS0P,UASvEnQ,KAAKgJ,GAAG,qCAAsC,SAAS3H,EAAGmQ,GACjDnQ,EAAE+R,uBACHmR,SAAS/S,EAAKtL,IAAI,IAAI+f,QAElBzU,aAAgB0B,GAChBqR,SAAS/S,EAAKtL,IAAI6L,KAAK9L,EAAaiE,UAAUS,cAAc,IAAIsb,WAM5EjmB,KAAKgJ,GAAG,2CAA4C,SAAS3H,EAAGmQ,GACxDA,EAAKsB,MAAMwR,aACX9S,EAAKtL,IAAI6L,KAAK,gBAAgBN,WAKjCtR,EAAQigB,mBACTpgB,KAAKgJ,GAAG,0BAA2B,SAASqR,EAAGlH,GAC3C,GAAY,EAARA,EAAW,CACX,IAAIoL,EAAKte,EAAEA,EAAE+S,UAAUqH,EAAErV,QACzBuZ,EAAGxM,KAAK9L,EAAaiE,UAAUO,qBAAqB4V,MAAM,sCAAwClgB,EAAQwf,KAAO,gBACjHtF,EAAErV,MAAQuZ,EAAG7K,KAAK,gBAI1B1T,KAAKgJ,GAAG,yBAA0B,SAASqR,GACvC,IAAIkE,EAAKte,EAAEA,EAAE+S,UAAUqH,EAAErV,QACzBuZ,EAAGxM,KAAK9L,EAAaiE,UAAUQ,aAAa2V,MAAM,sCAAwClgB,EAAQwf,KAAO,gBACzGtF,EAAErV,MAAQuZ,EAAG7K,KAAK,iBAG3B,CACCgR,qBAAqB,EACrBC,iBAAiB,EACjBhF,KAAM,2BACNS,kBAAkB,IAGtBna,EAAaiE,UAAU4b,0BAA4B7f,EAAaiE,UAAUE,eAAiB,KAAOnE,EAAaiE,UAAUC,gBACzHlE,EAAaiE,UAAU6a,YAAc,eAErC9e,EAAawI,SAAS,CAClBhB,mBAAoB,CAChB6W,aAAa,EACbM,SAAS,GAEb9W,oBAAqB,CACjBwW,aAAa,EACbM,SAAS,KAyDjB3e,EAAavG,OAAO,cAAe,SAASS,KAEzC,CACC+lB,oBAAoB,IAGxBjgB,EAAawI,SAAS,CAElB0X,aAAc,CACV3a,MAAO,CAAEkW,GAAI,OACb9V,UAAW,CAAE8V,GAAI,QACjB7V,GAAI,CAAE6V,GAAI,QAAS0E,IAAK,MACxBta,OAAQ,CAAE4V,GAAI,YAAa0E,IAAK,MAChCra,KAAM,CAAE2V,GAAI,OACZ1V,cAAe,CAAE0V,GAAI,QACrBzV,QAAS,CAAEyV,GAAI,OACfxV,iBAAkB,CAAEwV,GAAI,QACxBvV,QAAS,CAAEuV,GAAI,YAAa0E,IAAK,SACjCha,YAAa,CAAEsV,GAAI,gBAAiB0E,IAAK,SACzC/Z,YAAa,CAAEqV,GAAI,SAAU2E,IAAK,OAAQC,OAAQ,MAClDha,gBAAiB,CAAEoV,GAAI,aAAc2E,IAAK,OAAQC,OAAQ,MAC1D/Z,SAAU,CAAEmV,GAAI,SAAU2E,IAAK,QAASC,OAAQ,MAChD9Z,aAAc,CAAEkV,GAAI,aAAc2E,IAAK,QAASC,OAAQ,MACxD7Z,UAAW,CAAEiV,GAAI,SAAU2E,IAAK,OAAQC,OAAQ,MAChD5Z,cAAe,CAAEgV,GAAI,aAAc2E,IAAK,OAAQC,OAAQ,MACxD3Z,SAAU,CAAE+U,GAAI,QAChB9U,aAAc,CAAE8U,GAAI,SACpB7U,QAAS,CAAE6U,GAAI,WACf5U,YAAa,CAAE4U,GAAI,gBAIvB6E,gBAAiB,CACbC,IAAK,SAASrhB,GACV,MAAO,CACH4L,IAAK5L,EACLuc,GAAU,KAANvc,EAAW,WAAa,UAGpCshB,KAAM,SAASthB,GACX,MAAO,CACH4L,IAAK5L,EACLuc,GAAU,KAANvc,EAAW,eAAiB,cAGxCuhB,KAAQ,SAASvhB,GACb,MAAqB,KAAjBA,EAAE0D,MAAM,EAAG,IAA4B,KAAf1D,EAAE0D,OAAO,GAC1B,CACHkI,IAAK5L,EAAE0D,MAAM,GAAI,GACjB6Y,GAAI,YAGc,KAAjBvc,EAAE0D,MAAM,EAAG,GACT,CACHkI,IAAK5L,EAAE0D,MAAM,GACb6Y,GAAI,aAGY,KAAfvc,EAAE0D,OAAO,GACP,CACHkI,IAAK5L,EAAE0D,MAAM,GAAI,GACjB6Y,GAAI,oBAIRpa,EAAMC,MAAM,WAAY,wCAAyCpC,IAGzEwhB,WAAY,SAASxhB,GACjB,MAAqB,KAAjBA,EAAE0D,MAAM,EAAG,IAA4B,KAAf1D,EAAE0D,OAAO,GAC1B,CACHkI,IAAK5L,EAAE0D,MAAM,GAAI,GACjB6Y,GAAI,gBAGc,KAAjBvc,EAAE0D,MAAM,EAAG,GACT,CACHkI,IAAK5L,EAAE0D,MAAM,GACb6Y,GAAI,iBAGY,KAAfvc,EAAE0D,OAAO,GACP,CACHkI,IAAK5L,EAAE0D,MAAM,GAAI,GACjB6Y,GAAI,wBAIRpa,EAAMC,MAAM,WAAY,4CAA6CpC,IAG7EyhB,GAAM,SAASzhB,GACX,MAAO,CAAE4L,IAAK5L,EAAGuc,GAAI,OAEzBmF,SAAU,SAAS1hB,GACf,MAAO,CAAE4L,IAAK5L,EAAGuc,GAAI,WAEzBve,IAAK,SAASgC,GACV,MAAO,CAAE4L,IAAK5L,EAAGuc,GAAI,SAEzBoF,KAAM,SAAS3hB,GACX,MAAO,CAAE4L,IAAK5L,EAAGuc,GAAI,kBAEzBte,IAAK,SAAS+B,GACV,MAAO,CAAE4L,IAAK5L,EAAGuc,GAAI,YAEzBqF,KAAM,SAAS5hB,GACX,MAAO,CAAE4L,IAAK5L,EAAGuc,GAAI,qBAEzBsF,QAAW,SAAS7hB,GAChB,MAAO,CAAE4L,IAAK5L,EAAGuc,GAAI,YAEzBuF,cAAe,SAAS9hB,GACpB,MAAO,CAAE4L,IAAK5L,EAAGuc,GAAI,gBAEzBwF,GAAM,SAAS/hB,GAIX,OAHU,OAANA,GACAmC,EAAMC,MAAM,WAAY,iCAErB,CAAEwJ,IAAK,KAAM2Q,GAAI,YAE5ByF,SAAU,SAAShiB,GAIf,OAHU,OAANA,GACAmC,EAAMC,MAAM,WAAY,iCAErB,CAAEwJ,IAAK,KAAM2Q,GAAI,iBAKhC0F,cAAe,CACXC,cAAiB,WACb,IAAIC,EAAS,GACb,MAAO,CACH3V,IAAK,SAASxD,EAAMnJ,GAEhB,OADAsiB,EAAO9lB,KAAKwD,GACL,KAEXuiB,IAAK,WACD,OAAOD,KAKnBE,SAAY,SAASC,KACZA,GAAsB,EAAdA,EAAK7mB,UAAY6mB,EAAO,KACrC,IAAI5V,EAAQ,EACRyV,EAAS,GACb,MAAO,CACH3V,IAAK,SAASxD,EAAMnJ,GAGhB,OAFAsiB,EAAO9lB,KAAKwD,GAELyiB,KADP5V,GAGJ0V,IAAK,WACD,OAAOD,KAKnBI,MAAS,SAASD,KACTA,GAAsB,EAAdA,EAAK7mB,UAAY6mB,EAAO,KACrC,IAAIE,EAAU,GACVL,EAAS,GACb,MAAO,CACH3V,IAAK,SAASxD,EAAMnJ,GACX2iB,EAAQxZ,EAAKoB,SAAQoY,EAAQxZ,EAAKoB,OAAS,GAChD,IAAI0K,EAAM9L,EAAKoB,MAAQ,IAAOoY,EAAQxZ,EAAKoB,SAE3C,OADA+X,EAAOrN,GAAOjV,EACPyiB,EAAOxN,GAElBsN,IAAK,WACD,OAAOD,MAOvBM,iBAAkB,CACdP,cAAiB,SAAS3X,GACtB,IAAImC,EAAQ,EACZ,MAAO,CACHiF,MAAO,SAAS3R,GACZ,MAAY,KAALA,EAAWuK,EAAOmC,KAAW1M,GAExC0iB,IAAK,SAASC,GACV,OAAOA,EAAInkB,QAAQ,MAAO,UAKtC6jB,SAAY,SAAS9X,EAAQ+X,KACpBA,GAAsB,EAAdA,EAAK7mB,UAAY6mB,EAAO,KACrC,IAAIM,EAAS,IAAIpiB,OAAO,MAAQ8hB,EAAO,WACnCO,EAAS,IAAIriB,OAAO,KAAO8hB,EAAO,WAAY,KAClD,MAAO,CACH3Q,MAAO,SAAS3R,GACZ,OAAO4iB,EAAOpP,KAAKxT,GAAKuK,EAAOvK,EAAE0D,MAAM,GAAK,GAAK1D,GAErD0iB,IAAK,SAASC,GACV,OAAOA,EAAInkB,QAAQqkB,EAAQ,KAAgB,KAARP,EAAc,KAAOA,GAAQ,UAK5EC,MAAS,SAAShY,EAAQ+X,KACjBA,GAAsB,EAAdA,EAAK7mB,UAAY6mB,EAAO,KACrC,IAAIM,EAAS,IAAIpiB,OAAO,MAAQ8hB,GAC5BO,EAAS,IAAIriB,OAAO,KAAO8hB,EAAO,IAAM/f,OAAOC,KAAK+H,GAAQnG,KAAK,KAAO,OAAQ,KACpF,MAAO,CACHuN,MAAO,SAAS3R,GACZ,OAAO4iB,EAAOpP,KAAKxT,GAAKuK,EAAOvK,EAAE0D,MAAM,IAAM1D,GAEjD0iB,IAAK,SAASC,GACV,OAAOA,EAAInkB,QAAQqkB,EAAQ,KAAgB,KAARP,EAAc,KAAOA,GAAQ,aAcpFxhB,EAAa9E,OAAyD,CAYlE8mB,OAAQ,SAAS3K,EAAM4K,EAAIrV,GAGvB,KAFAA,OAAiBlR,IAATkR,EAAsB7S,KAAKmX,WAAatE,GAG5C,OAAO,KAGXqV,EAAOA,EAAK,KAAO,IACnB,IAAIhC,EAAqBlmB,KAAK8O,iBAAiB,cAAe,sBAK9D,IAHa,IAATwO,IACAA,EAAO,iBAEQ,iBAARA,EAAkB,CACzB,IAAIC,EAASF,EAAcC,GAC3BA,EAAOtd,KAAKoG,SAASghB,cAAc7J,EAAO,IAAIA,EAAO,IAGzD,IAAIpN,EAAOnQ,KAEP8nB,EAAO,SAAShR,EAAM5I,GAQtB,GAPKA,EAAM4C,YACP5C,EAAM4C,UAAYX,EAAK/J,SAAS+G,oBAE0B,IAA1D,CAAC,MAAO,MAAM5L,QAAQ2M,EAAM4C,UAAU8Q,gBACtCta,EAAMC,MAAM,wBAAyB,iDAAkD2G,EAAM4C,YAG5F5C,EAAMe,MACP,MAAO,GAGX,IAAI4S,EAAQ,GAEZ3T,EAAMe,MAAM7N,QAAQ,SAAS+M,GACzB,GAAIA,EAAKc,OAA6B,EAApBd,EAAKc,MAAMrO,OACzBihB,EAAMrgB,KAAK,IAAM0mB,EAAKpR,EAAM3I,GAAQ+Z,EAAK,IAAMA,OAE9C,CACD,IAAIJ,EAAM3X,EAAK/J,SAAS+f,aAAahY,EAAKmB,UACtCyS,EAAM5R,EAAKe,kBAAkB/C,EAAKmB,UAClCtK,EAAQ,QAEArD,IAARmmB,GACAxgB,EAAMC,MAAM,uBAAwB,2CAA4C4G,EAAKmB,UAGnE,IAAlByS,EAAItW,YACE0C,EAAKnJ,iBAAiBtD,QACxByM,EAAKnJ,MAAQ,CAACmJ,EAAKnJ,QAGvBmJ,EAAKnJ,MAAM5D,QAAQ,SAAS+D,EAAGxE,GACnB,EAAJA,IACAqE,GAAS8iB,EAAI1B,KAGA,WAAbjY,EAAK7M,MAAqB4kB,EAC1B/gB,EAAIA,EAAI,EAAI,EAENmY,GAAsB,YAAdnP,EAAK7M,MAAoC,WAAd6M,EAAK7M,MAAmC,YAAd6M,EAAK7M,OACxE6D,EAAImC,EAAM0T,aAAa7V,EAAG2iB,EAAIxB,SAG9BwB,EAAIzB,MACJlhB,EAAImC,EAAM0O,IAAI8R,EAAIzB,IAAKlhB,IAGvBmY,EACAtY,GAASsY,EAAK3L,IAAIxD,EAAMhJ,IAGR,iBAALA,IACPA,EAAI,IAAOA,EAAI,KAGnBH,GAASG,MAKrB,IAAIgjB,EAAQ,SAAShjB,GACjB,OAAO2iB,EAAIpG,GAAG/d,QAAQ,IAAK,WACvB,OAAOwB,KAcX6c,EAFQ7R,EAAKpH,OAAO,cAAeoF,EAAKoB,MAAOpB,GAEtB,IAAMga,EAAMnjB,GAYzC6c,EAAMrgB,KAAK2O,EAAKpH,OAAO,YAAaiZ,EAAgB7T,EAAMnJ,EAAOmjB,OAIzE,IAAIlG,EAAkBJ,EAAMtY,KAAK,IAAM2E,EAAM4C,UAAYoX,GAUzD,OAAO/X,EAAKpH,OAAO,aAAckZ,EAAiB/T,GAvG5C,CAwGR2E,GAEF,OAAIyK,EACO,CACHwK,IAAKA,EACLR,OAAQhK,EAAKiK,OAIV,CACHO,IAAKA,IAgBjBM,gBAAiB,SAASjG,EAAO7E,GACvB,cAAetE,QACjB1R,EAAMC,MAAM,iBAAkB,mGAGlC,IAAI4I,EAAOnQ,KAOX,GALoB,iBAATmiB,IACPA,EAAQ,CAAE2F,IAAK3F,KAGN,IAAT7E,IAAeA,EAAO,iBACP,iBAARA,EAAkB,CACzB,IAAIC,EAASF,EAAcC,GAC3BA,EAAOtd,KAAKoG,SAASwhB,iBAAiBrK,EAAO,IAAI4E,EAAMmF,OAAQ/J,EAAO,IAGtED,IACA6E,EAAM2F,IAAMxK,EAAKuK,IAAI1F,EAAM2F,MAGmB,IAA9C3F,EAAM2F,IAAIlG,cAAcrgB,QAAQ,YAChC4gB,EAAM2F,IAAM,6BAA+B3F,EAAM2F,KAGrD,IAAIO,EAASnF,UAAUpM,MAAMqL,EAAM2F,KAE9BO,EAAOC,OACRhhB,EAAMC,MAAM,WAAY,yBAU5B,IAAIsL,EAAO1C,EAAKpH,OAAO,eAAgBsf,EAAOC,MAAMpb,YAGpD,GAAI,UAAW2F,GAAQ,cAAeA,EAClC,OAAOA,EAIX,GAAI,OAAQA,GAAQ,aAAcA,GAAQ,UAAWA,EACjD,MAAO,CACH/B,UAAW9Q,KAAKoG,SAAS+G,kBACzB8B,MAAO,CAAC4D,IAKhB,IAAIyE,EAAMnH,EAAKpH,OAAO,aAAc,CAChC+H,UAAW9Q,KAAKoG,SAAS+G,kBACzB8B,MAAO,IACR4D,GAGC0V,EAAOjR,EA6JX,OA3JC,SAASkR,EAAQ3V,EAAMlS,GACpB,GAAa,OAATkS,EAQJ,GAAI,UAHJA,EAAO1C,EAAKpH,OAAO,eAAgB8J,KAGZ,cAAeA,EAClC0V,EAAKtZ,MAAMzN,KAAKqR,QAKpB,GAAI,OAAQA,GAAQ,aAAcA,GAAQ,UAAWA,EACjD0V,EAAKtZ,MAAMzN,KAAKqR,QAUpB,GALM,SAAUA,GAAW,UAAWA,GAAW,cAAeA,GAC5DvL,EAAMC,MAAM,WAAY,iCAIiC,IAAzD,CAAC,MAAO,MAAMhG,QAAQsR,EAAKoQ,UAAUrB,eAAuB,CAe5D,GAFkBzR,EAAKpH,OAAO,oBAAyB,EAAJpI,GAAS4nB,EAAKzX,WAAa+B,EAAKoQ,UAAUrB,cAAe2G,EAAM1V,EAAMlS,GAEvG,CASb,IAAIuN,EAAQiC,EAAKpH,OAAO,aAAc,CAClC+H,UAAWX,EAAK/J,SAAS+G,kBACzB8B,MAAO,IACR4D,GAEH0V,EAAKtZ,MAAMzN,KAAK0M,GAChBqa,EAAOra,EAGXqa,EAAKzX,UAAY+B,EAAKoQ,UAAUrB,cAChCjhB,IAGA,IAAI8nB,EAAOF,EACXC,EAAQ3V,EAAK2S,KAAM7kB,GAEnB4nB,EAAOE,EACPD,EAAQ3V,EAAK6V,MAAO/nB,OAGnB,CAMD,IAAIqE,EALA/E,EAAEwB,cAAcoR,EAAK6V,MAAM1jB,QAC3BsC,EAAMC,MAAM,WAAY,sCAAuCsL,EAAK2S,KAAKxgB,OAMzEA,EADA/E,EAAEgB,QAAQ4R,EAAK6V,MAAM1jB,OACb6N,EAAK6V,MAAM1jB,MAAMsE,IAAI,SAASnE,GAClC,OAAOA,EAAEH,QAIL6N,EAAK6V,MAAM1jB,MAInBsY,IAEItY,EADA/E,EAAEgB,QAAQ+D,GACFA,EAAMsE,IAAIgU,EAAKxG,OAGfwG,EAAKxG,MAAM9R,IAK3B,IAAIsK,EAAWuD,EAAKoQ,UAAUrB,cACd,MAAZtS,IACAA,EAAW,MAGf,IAAIqZ,EAAQxY,EAAK/J,SAASmgB,gBAAgBjX,QAC5B3N,IAAVgnB,GACArhB,EAAMC,MAAM,uBAAwB,+BAAgCsL,EAAKoQ,WAG7E,IAGI1T,EAHAiT,EAAQmG,EAAM7f,KAAK9I,KAAMgF,EAAO6N,EAAKoQ,WAIrC,WAAYpQ,EAAK2S,KACjBjW,EAAQsD,EAAK2S,KAAK9V,OAAOnG,KAAK,KAEzB,UAAWsJ,EAAK2S,KACrBjW,EAAQsD,EAAK2S,KAAKxgB,MAGlBsC,EAAMC,MAAM,WAAY,gCAAiCqhB,KAAKC,UAAUhW,EAAK2S,OAIjF,IAAIsD,EAAatG,EAAMzR,IACnB+W,EAAM3X,EAAK/J,SAAS+f,aAAa3D,EAAMd,IAC3C,IAAKpE,GAAQwK,GAAOA,EAAIxB,OAAQ,CAC5B,IAAIyC,EAAcjB,EAAIxB,OAAOpiB,MAAM,IAAIoF,IAAI,SAAShF,GAChD,MAAO,OAASA,IACjBiF,KAAK,KACRuf,EAAaA,EACRnlB,QAAQ,IAAIgC,OAAO,IAAMojB,EAAc,IAAK,KAAM,SAASxjB,GACxD,OAAOA,EAAE,KAIrB,IAAIkB,EAAK0J,EAAK6Y,cAAczZ,EAAOvK,GAU/BmJ,EAAOgC,EAAKpH,OAAO,YAAa,CAChCtC,GAAIA,EACJ8I,MAAOA,EACPD,SAAUkT,EAAMd,GAChB1c,MAAO8jB,GACRjW,GAEH0V,EAAKtZ,MAAMzN,KAAK2M,IAvJxB,CAyJE0E,EAAM,GAEDyE,GAOX2R,gBAAiB,SAAS9G,EAAO7E,GAC7Btd,KAAKkP,SAASlP,KAAKooB,gBAAgBjG,EAAO7E,KAY9C0L,cAAe,SAASzZ,EAAOvK,GAC3B,IAAI2d,EAAkB3iB,KAAK+G,QAAQsC,OAAO,SAASA,GAC/C,OAAOA,EAAOkG,MAAMxO,gBAAkBwO,EAAMxO,gBAmBhD,OAf+B,IAA3B4hB,EAAgB/hB,OACX+hB,EAAgB,GAAGlc,GAWnBzG,KAAK+I,OAAO,gBAAiBwG,EAAOvK,MA0BrDiB,EAAavG,OAAO,gBAAiB,WACjCM,KAAKwG,OAAO0iB,aAAe,GAE3BlpB,KAAKgJ,GAAG,wBAAyBhJ,KAAK8e,uBACtC9e,KAAKgJ,GAAG,kBAAmBhJ,KAAK8e,uBAChC9e,KAAKgJ,GAAG,yBAA0BhJ,KAAKmpB,sBACvCnpB,KAAKgJ,GAAG,aAAchJ,KAAKopB,sBAC3BppB,KAAKgJ,GAAG,aAAchJ,KAAKopB,sBAG3BppB,KAAKgJ,GAAG,0BAA2B,SAAS3H,EAAGiF,GAC3C,IAAI6J,EAAO9O,EAAEsH,SAEbwH,EAAK2O,wBAEDzd,EAAE2D,MAAMyB,MAAM0J,EAAK3J,OAAO0iB,gBACd/Y,EAAKpJ,QAAQmY,KAAK,SAAS7V,GACnC,KAAMA,EAAO5C,MAAM0J,EAAK3J,OAAO0iB,eAA8D,EAA7C/Y,EAAK3J,OAAO0iB,aAAa7f,EAAO5C,IAAI7F,SAA6E,IAA/DuP,EAAK3J,OAAO0iB,aAAa7f,EAAO5C,IAAIlF,QAAQ+E,EAAMsL,QAEhJ,OADAvQ,EAAE2D,MAAQqE,GACH,MAKX/B,EAAMC,OAAM,EAAO,eAAgB,wCACnClG,EAAE2D,WAAQrD,QAM1BsE,EAAa9E,OAA2D,CAMpE2d,sBAAuB,SAASzd,GAC5B,IAAI8O,EAAO9O,EAAIA,EAAEsH,QAAU3I,KAE3BmQ,EAAK3J,OAAO0iB,aAAe,GAEtB/Y,EAAK7J,SAKT,SAASsN,EAAK1F,GACXA,EAAMqF,KAAK,SAASpF,GACZA,EAAK9E,QAAU8E,EAAK9E,OAAOggB,SACtBlZ,EAAK3J,OAAO0iB,aAAa/a,EAAK9E,OAAO5C,MACtC0J,EAAK3J,OAAO0iB,aAAa/a,EAAK9E,OAAO5C,IAAM,IAErB,SAAtB0H,EAAK9E,OAAOggB,QACZlZ,EAAK3J,OAAO0iB,aAAa/a,EAAK9E,OAAO5C,IAAIjF,KAAK2M,EAAKyD,UAG5D,SAAS1D,GACR0F,EAAK1F,KAXb,CAaEiC,EAAK7J,MAAM9G,MAEb2Q,EAAKgZ,qBAAqB9nB,KAQ9B+nB,qBAAsB,SAAS/nB,GAC3B,IAAI8O,EAAO9O,EAAIA,EAAEsH,QAAU3I,KAE3BmQ,EAAK3J,OAAO0iB,aAAe,GAE3B/Y,EAAKgZ,qBAAqB9nB,IAQ9B8nB,qBAAsB,SAAS9nB,GAC3B,IAAI8O,EAAO9O,EAAIA,EAAEsH,QAAU3I,KAG3BmQ,EAAKjK,IAAI6L,KAAK9L,EAAaiE,UAAUG,iBAAmB,WAAWqJ,KAAK,YAAY,GAGpFzT,EAAEsT,KAAKpD,EAAK3J,OAAO0iB,aAAc,SAASI,EAAUC,GAC1B,IAAlBA,EAAO3oB,OACPuP,EAAKjK,IAAI6L,KAAK9L,EAAaiE,UAAUG,iBAAmB,kBAAoBif,EAAW,qBAAqB5V,KAAK,YAAY,GAG7H6V,EAAOnoB,QAAQ,SAAS8M,GACpBA,EAAMqF,KAAK,SAASpF,GAChBA,EAAKjI,IAAI6L,KAAK9L,EAAaiE,UAAUG,iBAAmB,kBAAoBif,EAAW,qBAAqB5V,KAAK,YAAY,SAOzIvD,EAAK/J,SAASe,SAAWgJ,EAAK/J,SAASe,QAAQ,oBAC/CgJ,EAAKjK,IAAI6L,KAAK9L,EAAaiE,UAAUc,aAAagT,aAAa,aAa3E/X,EAAaoB,SAAa,GAAI,CAC5BmiB,SAAY,eACZC,SAAY,qDACZte,SAAY,gBACZE,UAAa,sBACbD,YAAe,SACfE,aAAgB,SAChB4B,WAAc,CACZwT,IAAO,MACPC,GAAM,MAER1Z,UAAa,CACXuE,MAAS,QACTI,UAAa,YACbC,GAAM,KACNC,OAAU,SACVC,KAAQ,OACRC,cAAiB,gBACjBC,QAAW,UACXC,iBAAoB,mBACpBC,QAAW,UACXC,YAAe,cACfC,YAAe,cACfC,gBAAmB,qBACnBC,SAAY,WACZC,aAAgB,kBAChBC,UAAa,YACbC,cAAiB,mBACjBC,SAAY,WACZC,aAAgB,eAChBC,QAAW,UACXC,YAAe,eAEjBkK,OAAU,CACR0S,UAAa,qBACbC,YAAe,+BACfC,YAAe,oBACfC,eAAkB,oBAClBC,aAAgB,oBAChBC,aAAgB,cAChBC,yBAA4B,uCAC5BC,yBAA4B,4CAC5BC,sBAAyB,uBACzBC,WAAc,eACdC,mBAAsB,iBACtBC,kBAAqB,oBACrBC,kBAAqB,2BACrBC,kBAAqB,yBACrBC,kBAAqB,4BACrBC,uBAA0B,0CAC1BC,eAAkB,cAClBC,iBAAoB,4BACpBC,oBAAuB,oBACvBC,oBAAuB,qBACvBC,yBAA4B,0CAC5BC,kBAAqB,gBACrBC,sBAAyB,gDAE3B/K,OAAU,SACVgL,IAAO,OAGThlB,EAAawI,SAAS,CAAEjH,UAAW,OAC5BvB","file":"query-builder.standalone.min.js"} \ No newline at end of file diff --git a/dist/scss/dark.scss b/dist/scss/dark.scss new file mode 100644 index 00000000..cf8bb786 --- /dev/null +++ b/dist/scss/dark.scss @@ -0,0 +1,19 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Copyright 2014-2022 Damien "Mistic" Sorel (http://www.strangeplanet.fr) + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ +$theme-name: dark; + +$group-background-color: rgba(50, 70, 80, .5); +$group-border-color: #00164A; + +$rule-background-color: rgba(40, 40, 40, .9); +$rule-border-color: #111; + +$error-border-color: #800; +$error-background-color: #322; + +$ticks-color: #222; + +@import 'default'; diff --git a/dist/scss/default.scss b/dist/scss/default.scss new file mode 100644 index 00000000..a3797f88 --- /dev/null +++ b/dist/scss/default.scss @@ -0,0 +1,186 @@ +/*! + * jQuery QueryBuilder 2.6.2 + * Copyright 2014-2022 Damien "Mistic" Sorel (http://www.strangeplanet.fr) + * Licensed under MIT (https://opensource.org/licenses/MIT) + */ +$theme-name: default !default; + +// common +$item-vertical-spacing: 4px !default; +$item-border-radius: 5px !default; + +// groups +$group-background-color: rgba(250, 240, 210, .5) !default; +$group-border-color: #DCC896 !default; +$group-border: 1px solid $group-border-color !default; +$group-padding: 10px !default; + +// rules +$rule-background-color: rgba(255, 255, 255, .9) !default; +$rule-border-color: #EEE !default; +$rule-border: 1px solid $rule-border-color !default; +$rule-padding: 5px !default; +// scss-lint:disable ColorVariable +$rule-value-separator: 1px solid #DDD !default; + +// errors +$error-icon-color: #F00 !default; +$error-border-color: #F99 !default; +$error-background-color: #FDD !default; + +// ticks +$ticks-width: 2px !default; +$ticks-color: #CCC !default; +$ticks-position: 5px, 10px !default; + + +// ABSTRACTS +%base-container { + position: relative; + margin: $item-vertical-spacing 0; + border-radius: $item-border-radius; + padding: $rule-padding; + border: $rule-border; + background: $rule-background-color; +} + +%rule-component { + display: inline-block; + margin: 0 5px 0 0; + vertical-align: middle; +} + +.query-builder { + + // GROUPS + .rules-group-container { + @extend %base-container; + + padding: $group-padding; + padding-bottom: #{$group-padding - $item-vertical-spacing}; + border: $group-border; + background: $group-background-color; + } + + .rules-group-header { + margin-bottom: $group-padding; + + .group-conditions { + .btn.readonly:not(.active), + input[name$='_cond'] { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + white-space: nowrap; + } + + .btn.readonly { + border-radius: 3px; + } + } + } + + .rules-list { + list-style: none; + padding: 0 0 0 #{nth($ticks-position, 1) + nth($ticks-position, 2)}; + margin: 0; + } + + // RULES + .rule-container { + @extend %base-container; + + .rule-filter-container, + .rule-operator-container, + .rule-value-container { + @extend %rule-component; + } + } + + .rule-value-container { + border-left: $rule-value-separator; + padding-left: 5px; + + label { + margin-bottom: 0; + font-weight: normal; + + &.block { + display: block; + } + } + + select, + input[type='text'], + input[type='number'] { + padding: 1px; + } + } + + // ERRORS + .error-container { + @extend %rule-component; + display: none; + cursor: help; + color: $error-icon-color; + } + + .has-error { + background-color: $error-background-color; + border-color: $error-border-color; + + .error-container { + display: inline-block !important; + } + } + + // TICKS + .rules-list>* { + &::before, + &::after { + content: ''; + position: absolute; + left: #{-1 * nth($ticks-position, 2)}; + width: nth($ticks-position, 2); + height: calc(50% + #{$item-vertical-spacing}); + border-color: $ticks-color; + border-style: solid; + } + + &::before { + top: #{-2 * $ticks-width}; + border-width: 0 0 $ticks-width $ticks-width; + } + + &::after { + top: 50%; + border-width: 0 0 0 $ticks-width; + } + + &:first-child::before { + top: #{-$group-padding - $ticks-width}; + height: calc(50% + #{$group-padding + $item-vertical-spacing}); + } + + &:last-child::before { + border-radius: 0 0 0 #{2 * $ticks-width}; + } + + &:last-child::after { + display: none; + } + } +} + +// import +@import "plugins/_bt-checkbox"; +@import "plugins/_bt-tooltip-errors"; +@import "plugins/_filter-description"; +@import "plugins/_invert"; +@import "plugins/_sortable"; +// endimport diff --git a/dist/scss/plugins/_bt-checkbox.scss b/dist/scss/plugins/_bt-checkbox.scss new file mode 100644 index 00000000..324f610f --- /dev/null +++ b/dist/scss/plugins/_bt-checkbox.scss @@ -0,0 +1,12 @@ +.query-builder.bt-checkbox-glyphicons { + .checkbox input[type='checkbox']:checked + label::after { + font-family: 'Glyphicons Halflings'; + content: '\e013'; + } + + .checkbox label::after { + padding-left: 4px; + padding-top: 2px; + font-size: 9px; + } +} diff --git a/dist/scss/plugins/_bt-tooltip-errors.scss b/dist/scss/plugins/_bt-tooltip-errors.scss new file mode 100644 index 00000000..21323e5f --- /dev/null +++ b/dist/scss/plugins/_bt-tooltip-errors.scss @@ -0,0 +1,9 @@ +$error-tooltip-color: #F99; + +@if $theme-name == 'dark' { + $error-tooltip-color: #F22; +} + +.query-builder .error-container + .tooltip .tooltip-inner { + color: $error-tooltip-color !important; +} diff --git a/dist/scss/plugins/_filter-description.scss b/dist/scss/plugins/_filter-description.scss new file mode 100644 index 00000000..80a2af71 --- /dev/null +++ b/dist/scss/plugins/_filter-description.scss @@ -0,0 +1,21 @@ +$description-background-color: #D9EDF7; +$description-border-color: #BCE8F1; +$description-text-color: #31708F; + +@if $theme-name == 'dark' { + $description-background-color: rgba(0, 170, 255, .2); + $description-text-color: #AAD1E4; + $description-border-color: #346F7B; +} + +$description-border: 1px solid $description-border-color; + +.query-builder p.filter-description { + margin: $rule-padding 0 0 0; + background: $description-background-color; + border: $description-border; + color: $description-text-color; + border-radius: $item-border-radius; + padding: #{$rule-padding / 2} $rule-padding; + font-size: .8em; +} diff --git a/dist/scss/plugins/_invert.scss b/dist/scss/plugins/_invert.scss new file mode 100644 index 00000000..5eb0458b --- /dev/null +++ b/dist/scss/plugins/_invert.scss @@ -0,0 +1,5 @@ +.query-builder { + .rules-group-header [data-invert] { + margin-left: 5px; + } +} diff --git a/dist/scss/plugins/_sortable.scss b/dist/scss/plugins/_sortable.scss new file mode 100644 index 00000000..ac902fe1 --- /dev/null +++ b/dist/scss/plugins/_sortable.scss @@ -0,0 +1,28 @@ +$placeholder-border-color: #BBB; +$placeholder-border: 1px dashed $placeholder-border-color; + +.query-builder { + .drag-handle { + @extend %rule-component; + cursor: move; + vertical-align: middle; + margin-left: 5px; + } + + .dragging { + position: fixed; + opacity: .5; + z-index: 100; + + &::before, + &::after { + display: none; + } + } + + .rule-placeholder { + @extend %base-container; + border: $placeholder-border; + opacity: .7; + } +} diff --git a/dist/scss/plugins/bt-tooltip-errors.scss b/dist/scss/plugins/bt-tooltip-errors.scss new file mode 100644 index 00000000..21323e5f --- /dev/null +++ b/dist/scss/plugins/bt-tooltip-errors.scss @@ -0,0 +1,9 @@ +$error-tooltip-color: #F99; + +@if $theme-name == 'dark' { + $error-tooltip-color: #F22; +} + +.query-builder .error-container + .tooltip .tooltip-inner { + color: $error-tooltip-color !important; +} diff --git a/dist/scss/plugins/filter-description.scss b/dist/scss/plugins/filter-description.scss new file mode 100644 index 00000000..80a2af71 --- /dev/null +++ b/dist/scss/plugins/filter-description.scss @@ -0,0 +1,21 @@ +$description-background-color: #D9EDF7; +$description-border-color: #BCE8F1; +$description-text-color: #31708F; + +@if $theme-name == 'dark' { + $description-background-color: rgba(0, 170, 255, .2); + $description-text-color: #AAD1E4; + $description-border-color: #346F7B; +} + +$description-border: 1px solid $description-border-color; + +.query-builder p.filter-description { + margin: $rule-padding 0 0 0; + background: $description-background-color; + border: $description-border; + color: $description-text-color; + border-radius: $item-border-radius; + padding: #{$rule-padding / 2} $rule-padding; + font-size: .8em; +} diff --git a/dist/scss/plugins/invert.scss b/dist/scss/plugins/invert.scss new file mode 100644 index 00000000..5eb0458b --- /dev/null +++ b/dist/scss/plugins/invert.scss @@ -0,0 +1,5 @@ +.query-builder { + .rules-group-header [data-invert] { + margin-left: 5px; + } +} diff --git a/dist/scss/plugins/sortable.scss b/dist/scss/plugins/sortable.scss new file mode 100644 index 00000000..cf57c795 --- /dev/null +++ b/dist/scss/plugins/sortable.scss @@ -0,0 +1,27 @@ +$placeholder-border-color: #BBB; +$placeholder-border: 1px dashed $placeholder-border-color; + +.query-builder { + .drag-handle { + @extend %rule-component; + cursor: move; + vertical-align: middle; + margin-left: 5px; + } + + .dragging { + position: fixed; + opacity: .5; + z-index: 100; + + &::before, &::after { + display: none; + } + } + + .rule-placeholder { + @extend %base-container; + border: $placeholder-border; + opacity: .7; + } +} diff --git a/package.json b/package.json index 926ae20f..f52d15d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jQuery-QueryBuilder", - "version": "2.5.0", + "version": "2.6.2", "author": { "name": "Damien \"Mistic\" Sorel", "email": "contact@git.strangeplanet.fr", diff --git a/src/i18n/en.json b/src/i18n/en.json index 15bbb139..6c2d823b 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -2,8 +2,8 @@ "__locale": "English (en)", "__author": "Damien \"Mistic\" Sorel, http://www.strangeplanet.fr", - "add_rule": "Add rule", - "add_group": "Add group", + "add_rule": "Add condition", + "add_group": "Add condition group", "delete_rule": "Delete", "delete_group": "Delete", @@ -37,7 +37,7 @@ "errors": { "no_filter": "No filter selected", - "empty_group": "The group is empty", + "empty_group": "The condition group is empty", "radio_empty": "No value selected", "checkbox_empty": "No value selected", "select_empty": "No value selected", diff --git a/src/plugins/select2/plugin.js b/src/plugins/select2/plugin.js new file mode 100644 index 00000000..ae0b1386 --- /dev/null +++ b/src/plugins/select2/plugin.js @@ -0,0 +1,110 @@ +/** + * @class Select2 + * @memberof module:plugins + * @description Applies Select2 on filters and operators combo-boxes. + * @param {object} [options] + * @param {string} [options.container='body'] + * @param {string} [options.style='btn-inverse btn-xs'] + * @param {int|string} [options.width='auto'] + * @param {boolean} [options.showIcon=false] + * @throws MissingLibraryError + */ +QueryBuilder.define('select2', function(options) { + if (!$.fn.select2) { + Utils.error('MissingLibrary', 'Select2 is required to use "select2" plugin.'); + } + + var Selectors = QueryBuilder.selectors; + + var applySelect2Options = function(rule, builder) { + if (rule.filter.input === undefined || rule.filter.input !== 'select') { + return; + } + var rule_options = Object.assign({}, options); + if (rule && rule.filter && rule.filter.data && rule.filter.data.select2) { + rule_options = Object.assign(rule.filter.data.select2, rule_options); + } + + if (options && options.dropdownParentSelector) { + rule_options.dropdownParent = rule.$el.find(Selectors.rule_value).parents(options.dropdownParentSelector).first(); + } + + if (rule && rule.data && rule.data.valueLabel) { + var option = $('').val(rule.data.valueId).text(rule.data.valueLabel); + rule.$el.find(Selectors.rule_value).append(option); + rule.data.valueLabel = undefined; + rule.data.valueId = undefined; + } + + rule.$el.find(Selectors.rule_value).removeClass('form-control').select2(rule_options); + rule.$el.on('select2:close', function(e) { + var evt = "scroll.select2" + $(e.target).parents().off(evt) + $(window).off(evt) + }); + }; + + // init selectpicker + this.on('afterCreateRuleFilters', function(e, rule) { + setTimeout(function() { + if (options.dropdownParentSelector) { + options.dropdownParent = e.builder.$el.parents(options.dropdownParentSelector).first(); + } + rule.$el.find(Selectors.rule_filter).removeClass('form-control').select2(options); + /*rule.$el.on('select2:close', function(e) { + var evt = "scroll.select2" + $(e.target).parents().off(evt) + $(window).off(evt) + });*/ + }, 1); + + }); + this.on('afterCreateRuleOperators', function(e, rule) { + setTimeout(function() { + if (options.dropdownParentSelector) { + options.dropdownParent = e.builder.$el.parents(options.dropdownParentSelector).first(); + } + rule.$el.find(Selectors.rule_operator).removeClass('form-control').select2(options); + /*rule.$el.on('select2:close', function (e) { + var evt = "scroll.select2" + $(e.target).parents().off(evt) + $(window).off(evt) + });*/ + }, 1); + }); + this.on('afterCreateRuleInput', function(e, rule) { + applySelect2Options(rule, e.builder); + }); + + // update selectpicker on change + this.on('afterUpdateRuleFilter', function(e, rule) { + setTimeout(function() { + if (options.dropdownParentSelector) { + options.dropdownParent = e.builder.$el.parents(options.dropdownParentSelector).first(); + } + rule.$el.find(Selectors.rule_filter).select2(options); + /*rule.$el.on('select2:close', function (e) { + var evt = "scroll.select2" + $(e.target).parents().off(evt) + $(window).off(evt) + });*/ + }, 1); + }); + + this.on('afterUpdateRuleOperator', function(e, rule) { + if (options.dropdownParentSelector) { + options.dropdownParent = e.builder.$el.parents(options.dropdownParentSelector).first(); + } + rule.$el.find(Selectors.rule_operator).select2(options); + /*rule.$el.on('select2:close', function(e) { + var evt = "scroll.select2" + $(e.target).parents().off(evt) + $(window).off(evt) + });*/ + }); + + this.on('afterUpdateRuleInput', function(e, rule) { + applySelect2Options(rule, e.builder); + }); + +}, {});