import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.*;
class Ideone
{
{
//System.out.println(rightPad("PERMISSION", 35) + rightPad("PERMISSION EXPRESSION", 35) + "RESULT");
// ALL TRUE
magicFunction( "A.B.C", "A.B.C.D");
magicFunction( "A.B.C.D", "A.B.C.D");
magicFunction( "A.B.C.D", "A.B.*");
magicFunction( "A.B.C.D", "A.B.?.D");
magicFunction( "A.B.C.D", "A.B.C.[D,E,F]");
magicFunction( "A.B.C.E", "A.B.C.[D,E,F]");
magicFunction( "A.B.C.F", "A.<A,C>.C.[D,E,F]");
magicFunction( "A.B.C.D", "A.B.C.<A,B,C>");
magicFunction( "A.B.C.E", "A.B.C.<A,B,C>");
magicFunction( "A.B.C.F", "A.[B].C.<A,B,C>");
// ALL FALSE
magicFunction( "A.B.C", "A.B");
magicFunction( "A.B.C.D", "A.B.?.E");
magicFunction( "A.B.C.D", "A.D.*");
magicFunction( "A.B.C.D", "A.B.?");
magicFunction( "A.B.C.Q", "A.?.C.[D,E,F]");
magicFunction( "A.B.C.W", "A.?.C.[D,E,F]");
magicFunction( "A.B.C.E", "A.<B,D,E>.?.[D,E,F]");
magicFunction( "A.B.C.A", "A.B.C.<A,B,C>");
magicFunction( "A.B.C.B", "A.B.C.<A,B,C>");
magicFunction( "A.B.C.C", "A.[D].C.<A,B,C>");
}
public static boolean magicFunction
(String permission,
String permissionExpression
) { return magicFunctionImplementation(permission, permissionExpression);
}
public static boolean magicFunctionImplementation
(String permission,
String permissionExpression
) { boolean res = false;
String rx
= permissionExpression.
replace(".",
"\\.") .replace("*", ".*")
.replace("?", ".")
.replaceAll("\\[([^\\]\\[]*)]", "($1)")
.replaceAll("<([^<>]+)>", "(?:(?!$1)[^.])*")
.replace(",", "|");
if (permissionExpression.contains(permission)) {
res = true;
} else {
res = permission.matches(rx);
}
return res;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCS8vU3lzdGVtLm91dC5wcmludGxuKHJpZ2h0UGFkKCJQRVJNSVNTSU9OIiwgMzUpICsgcmlnaHRQYWQoIlBFUk1JU1NJT04gRVhQUkVTU0lPTiIsIDM1KSArICJSRVNVTFQiKTsKCiAgICAgICAgLy8gQUxMIFRSVUUKICAgICAgICBtYWdpY0Z1bmN0aW9uKCAgICJBLkIuQyIsICAgICJBLkIuQy5EIik7CiAgICAgICAgbWFnaWNGdW5jdGlvbiggICAiQS5CLkMuRCIsICAiQS5CLkMuRCIpOwogICAgICAgIG1hZ2ljRnVuY3Rpb24oICAgIkEuQi5DLkQiLCAgIkEuQi4qIik7CiAgICAgICAgbWFnaWNGdW5jdGlvbiggICAiQS5CLkMuRCIsICAiQS5CLj8uRCIpOwogICAgICAgIG1hZ2ljRnVuY3Rpb24oICAgIkEuQi5DLkQiLCAgIkEuQi5DLltELEUsRl0iKTsKICAgICAgICBtYWdpY0Z1bmN0aW9uKCAgICJBLkIuQy5FIiwgICJBLkIuQy5bRCxFLEZdIik7CiAgICAgICAgbWFnaWNGdW5jdGlvbiggICAiQS5CLkMuRiIsICAiQS48QSxDPi5DLltELEUsRl0iKTsKICAgICAgICBtYWdpY0Z1bmN0aW9uKCAgICJBLkIuQy5EIiwgICJBLkIuQy48QSxCLEM+Iik7CiAgICAgICAgbWFnaWNGdW5jdGlvbiggICAiQS5CLkMuRSIsICAiQS5CLkMuPEEsQixDPiIpOwogICAgICAgIG1hZ2ljRnVuY3Rpb24oICAgIkEuQi5DLkYiLCAgIkEuW0JdLkMuPEEsQixDPiIpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKCiAgICAgICAgLy8gQUxMIEZBTFNFCiAgICAgICAgbWFnaWNGdW5jdGlvbiggICJBLkIuQyIsICAgICJBLkIiKTsKICAgICAgICBtYWdpY0Z1bmN0aW9uKCAgIkEuQi5DLkQiLCAgIkEuQi4/LkUiKTsKICAgICAgICBtYWdpY0Z1bmN0aW9uKCAgIkEuQi5DLkQiLCAgIkEuRC4qIik7CiAgICAgICAgbWFnaWNGdW5jdGlvbiggICJBLkIuQy5EIiwgICJBLkIuPyIpOwogICAgICAgIG1hZ2ljRnVuY3Rpb24oICAiQS5CLkMuUSIsICAiQS4/LkMuW0QsRSxGXSIpOwogICAgICAgIG1hZ2ljRnVuY3Rpb24oICAiQS5CLkMuVyIsICAiQS4/LkMuW0QsRSxGXSIpOwogICAgICAgIG1hZ2ljRnVuY3Rpb24oICAiQS5CLkMuRSIsICAiQS48QixELEU+Lj8uW0QsRSxGXSIpOwogICAgICAgIG1hZ2ljRnVuY3Rpb24oICAiQS5CLkMuQSIsICAiQS5CLkMuPEEsQixDPiIpOwogICAgICAgIG1hZ2ljRnVuY3Rpb24oICAiQS5CLkMuQiIsICAiQS5CLkMuPEEsQixDPiIpOwogICAgICAgIG1hZ2ljRnVuY3Rpb24oICAiQS5CLkMuQyIsICAiQS5bRF0uQy48QSxCLEM+Iik7Cgl9CglwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWFnaWNGdW5jdGlvbihTdHJpbmcgcGVybWlzc2lvbiwgU3RyaW5nIHBlcm1pc3Npb25FeHByZXNzaW9uKSB7CiAgICAgICAgcmV0dXJuIG1hZ2ljRnVuY3Rpb25JbXBsZW1lbnRhdGlvbihwZXJtaXNzaW9uLCBwZXJtaXNzaW9uRXhwcmVzc2lvbik7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBib29sZWFuIG1hZ2ljRnVuY3Rpb25JbXBsZW1lbnRhdGlvbihTdHJpbmcgcGVybWlzc2lvbiwgU3RyaW5nIHBlcm1pc3Npb25FeHByZXNzaW9uKSB7CiAgICAJYm9vbGVhbiByZXMgPSBmYWxzZTsKICAgIAlTdHJpbmcgcnggPSBwZXJtaXNzaW9uRXhwcmVzc2lvbi5yZXBsYWNlKCIuIiwgIlxcLiIpCiAgICAJCQkucmVwbGFjZSgiKiIsICIuKiIpCiAgICAJCQkucmVwbGFjZSgiPyIsICIuIikKICAgIAkJCS5yZXBsYWNlQWxsKCJcXFsoW15cXF1cXFtdKildIiwgIigkMSkiKQogICAgCQkJLnJlcGxhY2VBbGwoIjwoW148Pl0rKT4iLCAiKD86KD8hJDEpW14uXSkqIikKICAgIAkJCS5yZXBsYWNlKCIsIiwgInwiKTsKICAgIAlTeXN0ZW0ub3V0LnByaW50bG4ocngpOwogICAgCWlmIChwZXJtaXNzaW9uRXhwcmVzc2lvbi5jb250YWlucyhwZXJtaXNzaW9uKSkgewogICAgCQlyZXMgPSB0cnVlOwogICAgCX0gZWxzZSB7CiAgICAJCXJlcyA9IHBlcm1pc3Npb24ubWF0Y2hlcyhyeCk7CiAgICAJfQogICAgCVN5c3RlbS5vdXQucHJpbnRsbihyZXMpOwogICAgICAgIHJldHVybiByZXM7CiAgICB9Cgp9